From 2e4fa9b674ace74e5c351e21b2431f3b9b85cd54 Mon Sep 17 00:00:00 2001 From: Tree Xie Date: Thu, 9 Dec 2021 20:20:33 +0800 Subject: [PATCH 001/251] Initial commit --- .gitignore | 15 +++++++++++++++ LICENSE | 21 +++++++++++++++++++++ README.md | 1 + 3 files changed, 37 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..66fd13c --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f31a165 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Tree Xie + +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/README.md b/README.md new file mode 100644 index 0000000..55e5760 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# go-chart \ No newline at end of file From deb77f57618f86815923b350e68d78ce86ec89c1 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 11 Dec 2021 22:00:47 +0800 Subject: [PATCH 002/251] feat: init commit --- .gitignore | 1 + axis.go | 100 +++++++++++++++++++++++++++++++++++++++++++++++ charts.go | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++ series.go | 64 ++++++++++++++++++++++++++++++ theme.go | 67 ++++++++++++++++++++++++++++++++ 5 files changed, 344 insertions(+) create mode 100644 axis.go create mode 100644 charts.go create mode 100644 series.go create mode 100644 theme.go diff --git a/.gitignore b/.gitignore index 66fd13c..cb43a6a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ # Dependency directories (remove the comment below to include it) # vendor/ +*.png \ No newline at end of file diff --git a/axis.go b/axis.go new file mode 100644 index 0000000..50e9f22 --- /dev/null +++ b/axis.go @@ -0,0 +1,100 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +type ( + // AxisData string + XAxis struct { + // 'value' 数值轴,适用于连续数据。 + // 'category' 类目轴,适用于离散的类目数据。为该类型时类目数据可自动从 series.data 或 dataset.source 中取,或者可通过 xAxis.data 设置类目数据。 + // 'time' 时间轴,适用于连续的时序数据,与数值轴相比时间轴带有时间的格式化,在刻度计算上也有所不同,例如会根据跨度的范围来决定使用月,星期,日还是小时范围的刻度。 + // 'log' 对数轴。适用于对数数据。 + Type string + Data []string + } +) + +const axisStrokeWidth = 1 + +func GetXAxisAndValues(xAxis XAxis, theme string) (chart.XAxis, []float64) { + xValues := make([]float64, len(xAxis.Data)) + ticks := make([]chart.Tick, len(xAxis.Data)) + for index, key := range xAxis.Data { + f := float64(index) + xValues[index] = f + ticks[index] = chart.Tick{ + Value: f, + Label: key, + } + } + // TODO + if theme == ThemeDark { + return chart.XAxis{ + Ticks: ticks, + }, xValues + } + return chart.XAxis{ + Ticks: ticks, + Style: chart.Style{ + FontColor: AxisColorLight, + StrokeColor: AxisColorLight, + StrokeWidth: axisStrokeWidth, + }, + }, xValues +} + +func GetYAxis(theme string) chart.YAxis { + // TODO + if theme == ThemeDark { + return chart.YAxis{} + } + strokeColor := drawing.Color{ + R: 224, + G: 230, + B: 241, + A: 255, + } + return chart.YAxis{ + + AxisType: chart.YAxisSecondary, + GridMajorStyle: chart.Style{ + StrokeColor: strokeColor, + StrokeWidth: axisStrokeWidth, + }, + GridMinorStyle: chart.Style{ + StrokeColor: strokeColor, + StrokeWidth: axisStrokeWidth, + }, + Style: chart.Style{ + FontColor: AxisColorLight, + // alpha 0,隐藏 + StrokeColor: hiddenColor, + StrokeWidth: axisStrokeWidth, + }, + } +} diff --git a/charts.go b/charts.go new file mode 100644 index 0000000..89fe750 --- /dev/null +++ b/charts.go @@ -0,0 +1,112 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "bytes" + + "github.com/wcharczuk/go-chart/v2" +) + +type ( + Title struct { + Text string + } + Legend struct { + Data []string + } + Option struct { + Width int + Height int + Theme string + XAxis XAxis + // YAxis Axis + Series []Series + Title Title + Legend Legend + } +) + +const ( + ThemeLight = "light" + ThemeDark = "dark" +) + +func render(c *chart.Chart, rp chart.RendererProvider) ([]byte, error) { + buf := bytes.Buffer{} + err := c.Render(rp, &buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func ToPNG(c *chart.Chart) ([]byte, error) { + return render(c, chart.PNG) +} + +func ToSVG(c *chart.Chart) ([]byte, error) { + return render(c, chart.SVG) +} + +func New(opt Option) *chart.Chart { + xAxis, xValues := GetXAxisAndValues(opt.XAxis, opt.Theme) + + legendSize := len(opt.Legend.Data) + for index, item := range opt.Series { + if len(item.XValues) == 0 { + opt.Series[index].XValues = xValues + } + if index < legendSize && opt.Series[index].Name == "" { + opt.Series[index].Name = opt.Legend.Data[index] + } + } + + c := &chart.Chart{ + Title: opt.Title.Text, + Width: opt.Width, + Height: opt.Height, + XAxis: xAxis, + YAxis: GetYAxis(opt.Theme), + Series: GetSeries(opt.Series, opt.Theme), + } + if legendSize != 0 { + c.Elements = []chart.Renderable{ + chart.LegendThin(c, chart.Style{ + FillColor: hiddenColor, + // FillColor: drawing.ColorWhite, + // FontColor: DefaultTextColor, + FontSize: 8.0, + StrokeColor: hiddenColor, + // StrokeWidth: DefaultAxisLineWidth, + // Padding: Box{ + // Top: 2, + // Left: 7, + // Right: 7, + // Bottom: 5, + // }, + }), + } + } + return c +} diff --git a/series.go b/series.go new file mode 100644 index 0000000..c3c0385 --- /dev/null +++ b/series.go @@ -0,0 +1,64 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +type Series struct { + Type string + Name string + Data []float64 + XValues []float64 +} + +const lineStrokeWidth = 2 +const dotWith = 2 + +func getSeriesColor(theme string, index int) drawing.Color { + // TODO + if theme == ThemeDark { + } + return SeriesColorsLight[index%len(SeriesColorsLight)] +} + +func GetSeries(series []Series, theme string) []chart.Series { + arr := make([]chart.Series, len(series)) + for index, item := range series { + // TODO 判断类型 + arr[index] = chart.ContinuousSeries{ + Name: item.Name, + XValues: item.XValues, + Style: chart.Style{ + StrokeWidth: lineStrokeWidth, + StrokeColor: getSeriesColor(theme, index), + DotColor: getSeriesColor(theme, index), + DotWidth: dotWith, + }, + YValues: item.Data, + } + } + return arr +} diff --git a/theme.go b/theme.go new file mode 100644 index 0000000..4d86a64 --- /dev/null +++ b/theme.go @@ -0,0 +1,67 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import "github.com/wcharczuk/go-chart/v2/drawing" + +var hiddenColor = drawing.Color{R: 110, G: 112, B: 121, A: 0} + +var AxisColorLight = drawing.Color{ + R: 110, + G: 112, + B: 121, + A: 255, +} + +var SeriesColorsLight = []drawing.Color{ + { + R: 84, + G: 112, + B: 198, + A: 255, + }, + { + R: 145, + G: 204, + B: 117, + A: 255, + }, + { + R: 250, + G: 200, + B: 88, + A: 255, + }, + { + R: 238, + G: 102, + B: 102, + A: 255, + }, + { + R: 115, + G: 192, + B: 222, + A: 255, + }, +} From 40b7eb3ee2bbd84c655d6530f0106418190a67af Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 12 Dec 2021 12:17:13 +0800 Subject: [PATCH 003/251] refactor: support customize legend function --- axis.go | 9 ++- charts.go | 18 +---- legend.go | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 207 insertions(+), 16 deletions(-) create mode 100644 legend.go diff --git a/axis.go b/axis.go index 50e9f22..db32e70 100644 --- a/axis.go +++ b/axis.go @@ -23,6 +23,7 @@ package charts import ( + "github.com/dustin/go-humanize" "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" ) @@ -80,7 +81,13 @@ func GetYAxis(theme string) chart.YAxis { A: 255, } return chart.YAxis{ - + ValueFormatter: func(v interface{}) string { + value, ok := v.(float64) + if !ok { + return "" + } + return humanize.Commaf(value) + }, AxisType: chart.YAxisSecondary, GridMajorStyle: chart.Style{ StrokeColor: strokeColor, diff --git a/charts.go b/charts.go index 89fe750..9476b6d 100644 --- a/charts.go +++ b/charts.go @@ -68,7 +68,6 @@ func ToPNG(c *chart.Chart) ([]byte, error) { func ToSVG(c *chart.Chart) ([]byte, error) { return render(c, chart.SVG) } - func New(opt Option) *chart.Chart { xAxis, xValues := GetXAxisAndValues(opt.XAxis, opt.Theme) @@ -90,22 +89,11 @@ func New(opt Option) *chart.Chart { YAxis: GetYAxis(opt.Theme), Series: GetSeries(opt.Series, opt.Theme), } + // 设置secondary的样式 + c.YAxisSecondary.Style = c.YAxis.Style if legendSize != 0 { c.Elements = []chart.Renderable{ - chart.LegendThin(c, chart.Style{ - FillColor: hiddenColor, - // FillColor: drawing.ColorWhite, - // FontColor: DefaultTextColor, - FontSize: 8.0, - StrokeColor: hiddenColor, - // StrokeWidth: DefaultAxisLineWidth, - // Padding: Box{ - // Top: 2, - // Left: 7, - // Right: 7, - // Bottom: 5, - // }, - }), + DefaultLegend(c), } } return c diff --git a/legend.go b/legend.go new file mode 100644 index 0000000..fc0a0bd --- /dev/null +++ b/legend.go @@ -0,0 +1,196 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" +) + +type LegendOption struct { + Style chart.Style + Align string + TextPosition string + Theme string + IconDraw LegendIconDraw +} + +type LegendIconDrawOption struct { + Box chart.Box + Style chart.Style + Index int + Theme string +} + +const ( + LegendAlignLeft = "left" + LegendAlignCenter = "center" + LegendAlignRight = "right" +) + +const ( + LegendTextPositionRight = "right" +) + +type LegendIconDraw func(r chart.Renderer, opt LegendIconDrawOption) + +func DefaultLegendIconDraw(r chart.Renderer, opt LegendIconDrawOption) { + if opt.Box.IsZero() { + return + } + r.SetStrokeColor(opt.Style.GetStrokeColor()) + stokeWidth := opt.Style.GetStrokeWidth() + r.SetStrokeWidth(stokeWidth) + height := opt.Box.Bottom - opt.Box.Top + ly := (height / 2) + 1 + r.MoveTo(opt.Box.Left, ly) + r.LineTo(opt.Box.Right, ly) + r.Stroke() + r.SetFillColor(chart.ColorWhite) + r.Circle(5, (opt.Box.Left+opt.Box.Right)/2, ly) + r.FillStroke() +} + +func DefaultLegend(c *chart.Chart) chart.Renderable { + return LegendCustomize(c, LegendOption{ + TextPosition: LegendTextPositionRight, + IconDraw: DefaultLegendIconDraw, + }) +} + +func LegendCustomize(c *chart.Chart, opt LegendOption) chart.Renderable { + return func(r chart.Renderer, cb chart.Box, chartDefaults chart.Style) { + legendDefaults := chart.Style{ + FontColor: chart.DefaultTextColor, + FontSize: 8.0, + StrokeColor: chart.DefaultAxisColor, + } + + legendStyle := opt.Style.InheritFrom(chartDefaults.InheritFrom(legendDefaults)) + + r.SetFont(legendStyle.GetFont()) + r.SetFontColor(legendStyle.GetFontColor()) + r.SetFontSize(legendStyle.GetFontSize()) + + var labels []string + var lines []chart.Style + for _, s := range c.Series { + if !s.GetStyle().Hidden { + if _, isAnnotationSeries := s.(chart.AnnotationSeries); !isAnnotationSeries { + labels = append(labels, s.GetName()) + lines = append(lines, s.GetStyle()) + } + } + } + + var textHeight int + var textWidth int + var textBox chart.Box + labelWidth := 0 + for x := 0; x < len(labels); x++ { + if len(labels[x]) > 0 { + textBox = r.MeasureText(labels[x]) + labelWidth += textBox.Width() + textHeight = chart.MaxInt(textBox.Height(), textHeight) + textWidth = chart.MaxInt(textBox.Width(), textWidth) + } + } + + legendBoxHeight := textHeight + legendStyle.Padding.Top + legendStyle.Padding.Bottom + chartPadding := cb.Top + legendYMargin := (chartPadding - legendBoxHeight) >> 1 + + lineLengthMinimum := 25 + + labelWidth += lineLengthMinimum * len(labels) + + left := 0 + switch opt.Align { + case LegendAlignLeft: + left = 0 + case LegendAlignRight: + left = cb.Width() - labelWidth + default: + left = (cb.Width() - labelWidth) / 2 + } + + legendBox := chart.Box{ + Left: left, + Right: left + labelWidth, + Top: 0, + Bottom: 0 + legendBoxHeight, + } + + chart.Draw.Box(r, legendBox, legendDefaults) + + r.SetFont(legendStyle.GetFont()) + r.SetFontColor(legendStyle.GetFontColor()) + r.SetFontSize(legendStyle.GetFontSize()) + + lineTextGap := 5 + + startX := legendBox.Left + legendStyle.Padding.Left + ty := legendYMargin + legendStyle.Padding.Top + textHeight + var label string + var x int + iconDraw := opt.IconDraw + if iconDraw == nil { + iconDraw = DefaultLegendIconDraw + } + for index := range labels { + label = labels[index] + if len(label) > 0 { + x = startX + + // 如果文本靠左显示 + if opt.TextPosition != LegendTextPositionRight { + textBox = r.MeasureText(label) + r.Text(label, x, ty) + x = startX + textBox.Width() + lineTextGap + } + + // 图标 + iconDraw(r, LegendIconDrawOption{ + Theme: opt.Theme, + Index: index, + Style: lines[index], + Box: chart.Box{ + Left: x, + Top: ty, + Right: x + lineLengthMinimum, + Bottom: ty + textHeight, + }, + }) + x += (lineLengthMinimum + lineTextGap) + + // 如果文本靠右显示 + if opt.TextPosition == LegendTextPositionRight { + textBox = r.MeasureText(label) + r.Text(label, x, ty) + } + + // 计算下一个legend的位置 + startX += textBox.Width() + chart.DefaultMinimumTickHorizontalSpacing + lineTextGap + lineLengthMinimum + } + } + } +} From 402141c4841831b04d41a1ed94d2375b2c9d63d0 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 12 Dec 2021 20:21:16 +0800 Subject: [PATCH 004/251] feat: add bar series render --- bar_series.go | 59 ++++++++++++++++++++++++ base_series.go | 121 +++++++++++++++++++++++++++++++++++++++++++++++++ series.go | 38 ++++++++++++---- 3 files changed, 208 insertions(+), 10 deletions(-) create mode 100644 bar_series.go create mode 100644 base_series.go diff --git a/bar_series.go b/bar_series.go new file mode 100644 index 0000000..847fbe4 --- /dev/null +++ b/bar_series.go @@ -0,0 +1,59 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import "github.com/wcharczuk/go-chart/v2" + +type BarSeries struct { + BaseSeries +} + +func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, defaults chart.Style) { + if bs.Len() == 0 { + return + } + style := bs.Style.InheritFrom(defaults) + style.FillColor = style.StrokeColor + if !style.ShouldDrawStroke() { + return + } + + cb := canvasBox.Bottom + cl := canvasBox.Left + + for i := 0; i < bs.Len(); i++ { + vx, vy := bs.GetValues(i) + + x := cl + xrange.Translate(vx) + y := cb - yrange.Translate(vy) + + chart.Draw.Box(r, chart.Box{ + Left: x, + Top: y, + // TODO 计算宽度 + Right: x + 10, + Bottom: canvasBox.Bottom - 1, + }, style) + } + +} diff --git a/base_series.go b/base_series.go new file mode 100644 index 0000000..86e0659 --- /dev/null +++ b/base_series.go @@ -0,0 +1,121 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "fmt" + + "github.com/wcharczuk/go-chart/v2" +) + +// Interface Assertions. +var ( + _ chart.Series = (*BaseSeries)(nil) + _ chart.FirstValuesProvider = (*BaseSeries)(nil) + _ chart.LastValuesProvider = (*BaseSeries)(nil) +) + +// BaseSeries represents a line on a chart. +type BaseSeries struct { + Name string + Style chart.Style + + YAxis chart.YAxisType + + XValueFormatter chart.ValueFormatter + YValueFormatter chart.ValueFormatter + + XValues []float64 + YValues []float64 +} + +// GetName returns the name of the time series. +func (cs BaseSeries) GetName() string { + return cs.Name +} + +// GetStyle returns the line style. +func (cs BaseSeries) GetStyle() chart.Style { + return cs.Style +} + +// Len returns the number of elements in the series. +func (cs BaseSeries) Len() int { + return len(cs.XValues) +} + +// GetValues gets the x,y values at a given index. +func (cs BaseSeries) GetValues(index int) (float64, float64) { + return cs.XValues[index], cs.YValues[index] +} + +// GetFirstValues gets the first x,y values. +func (cs BaseSeries) GetFirstValues() (float64, float64) { + return cs.XValues[0], cs.YValues[0] +} + +// GetLastValues gets the last x,y values. +func (cs BaseSeries) GetLastValues() (float64, float64) { + return cs.XValues[len(cs.XValues)-1], cs.YValues[len(cs.YValues)-1] +} + +// GetValueFormatters returns value formatter defaults for the series. +func (cs BaseSeries) GetValueFormatters() (x, y chart.ValueFormatter) { + if cs.XValueFormatter != nil { + x = cs.XValueFormatter + } else { + x = chart.FloatValueFormatter + } + if cs.YValueFormatter != nil { + y = cs.YValueFormatter + } else { + y = chart.FloatValueFormatter + } + return +} + +// GetYAxis returns which YAxis the series draws on. +func (cs BaseSeries) GetYAxis() chart.YAxisType { + return cs.YAxis +} + +// Render renders the series. +func (cs BaseSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, defaults chart.Style) { + fmt.Println("should be override the function") +} + +// Validate validates the series. +func (cs BaseSeries) Validate() error { + if len(cs.XValues) == 0 { + return fmt.Errorf("continuous series; must have xvalues set") + } + + if len(cs.YValues) == 0 { + return fmt.Errorf("continuous series; must have yvalues set") + } + + if len(cs.XValues) != len(cs.YValues) { + return fmt.Errorf("continuous series; must have same length xvalues as yvalues") + } + return nil +} diff --git a/series.go b/series.go index c3c0385..bc05d06 100644 --- a/series.go +++ b/series.go @@ -37,6 +37,11 @@ type Series struct { const lineStrokeWidth = 2 const dotWith = 2 +const ( + SeriesBar = "bar" + SeriesLine = "line" +) + func getSeriesColor(theme string, index int) drawing.Color { // TODO if theme == ThemeDark { @@ -47,17 +52,30 @@ func getSeriesColor(theme string, index int) drawing.Color { func GetSeries(series []Series, theme string) []chart.Series { arr := make([]chart.Series, len(series)) for index, item := range series { + style := chart.Style{ + StrokeWidth: lineStrokeWidth, + StrokeColor: getSeriesColor(theme, index), + DotColor: getSeriesColor(theme, index), + DotWidth: dotWith, + } // TODO 判断类型 - arr[index] = chart.ContinuousSeries{ - Name: item.Name, - XValues: item.XValues, - Style: chart.Style{ - StrokeWidth: lineStrokeWidth, - StrokeColor: getSeriesColor(theme, index), - DotColor: getSeriesColor(theme, index), - DotWidth: dotWith, - }, - YValues: item.Data, + switch item.Type { + case SeriesBar: + arr[index] = BarSeries{ + BaseSeries: BaseSeries{ + Name: item.Name, + XValues: item.XValues, + Style: style, + YValues: item.Data, + }, + } + default: + arr[index] = chart.ContinuousSeries{ + Name: item.Name, + XValues: item.XValues, + Style: style, + YValues: item.Data, + } } } return arr From f3009b965f63b3b9f670c75d5bc9d24f0e908206 Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 13 Dec 2021 23:46:10 +0800 Subject: [PATCH 005/251] feat: support between ticks --- axis.go | 19 +++++++++++++----- bar_series.go | 33 +++++++++++++++++++++++++------- base_series.go | 17 ++++++++++++++--- charts.go | 7 +++++-- line_series.go | 40 ++++++++++++++++++++++++++++++++++++++ range.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ series.go | 36 ++++++++++++++++++++++------------ 7 files changed, 175 insertions(+), 29 deletions(-) create mode 100644 line_series.go create mode 100644 range.go diff --git a/axis.go b/axis.go index db32e70..5937ef0 100644 --- a/axis.go +++ b/axis.go @@ -42,10 +42,18 @@ type ( const axisStrokeWidth = 1 -func GetXAxisAndValues(xAxis XAxis, theme string) (chart.XAxis, []float64) { - xValues := make([]float64, len(xAxis.Data)) - ticks := make([]chart.Tick, len(xAxis.Data)) - for index, key := range xAxis.Data { +func GetXAxisAndValues(xAxis XAxis, tickPosition chart.TickPosition, theme string) (chart.XAxis, []float64) { + data := xAxis.Data + // 如果居中,则需要多添加一个值 + if tickPosition == chart.TickPositionBetweenTicks { + data = append([]string{ + "", + }, data...) + } + + xValues := make([]float64, len(data)) + ticks := make([]chart.Tick, len(data)) + for index, key := range data { f := float64(index) xValues[index] = f ticks[index] = chart.Tick{ @@ -60,7 +68,8 @@ func GetXAxisAndValues(xAxis XAxis, theme string) (chart.XAxis, []float64) { }, xValues } return chart.XAxis{ - Ticks: ticks, + Ticks: ticks, + TickPosition: tickPosition, Style: chart.Style{ FontColor: AxisColorLight, StrokeColor: AxisColorLight, diff --git a/bar_series.go b/bar_series.go index 847fbe4..9e965b9 100644 --- a/bar_series.go +++ b/bar_series.go @@ -22,14 +22,26 @@ package charts -import "github.com/wcharczuk/go-chart/v2" +import ( + "github.com/wcharczuk/go-chart/v2" +) + +const defaultBarMargin = 10 type BarSeries struct { BaseSeries + Count int + Index int + // 间隔 + Margin int + // 偏移量 + Offset int + // 宽度 + BarWidth int } func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, defaults chart.Style) { - if bs.Len() == 0 { + if bs.Len() == 0 || bs.Count <= 0 { return } style := bs.Style.InheritFrom(defaults) @@ -40,18 +52,25 @@ func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange cb := canvasBox.Bottom cl := canvasBox.Left + margin := bs.Margin + if margin <= 0 { + margin = defaultBarMargin + } + barWidth := bs.BarWidth + if barWidth <= 0 { + barWidth = canvasBox.Width() / (bs.Len() * bs.Count) + } for i := 0; i < bs.Len(); i++ { vx, vy := bs.GetValues(i) - x := cl + xrange.Translate(vx) + x := cl + xrange.Translate(vx) + bs.Index*(margin+barWidth) + bs.Offset y := cb - yrange.Translate(vy) chart.Draw.Box(r, chart.Box{ - Left: x, - Top: y, - // TODO 计算宽度 - Right: x + 10, + Left: x, + Top: y, + Right: x + barWidth, Bottom: canvasBox.Bottom - 1, }, style) } diff --git a/base_series.go b/base_series.go index 86e0659..673c0a6 100644 --- a/base_series.go +++ b/base_series.go @@ -37,8 +37,9 @@ var ( // BaseSeries represents a line on a chart. type BaseSeries struct { - Name string - Style chart.Style + Name string + Style chart.Style + TickPosition chart.TickPosition YAxis chart.YAxisType @@ -61,16 +62,26 @@ func (cs BaseSeries) GetStyle() chart.Style { // Len returns the number of elements in the series. func (cs BaseSeries) Len() int { - return len(cs.XValues) + offset := 0 + if cs.TickPosition == chart.TickPositionBetweenTicks { + offset = -1 + } + return len(cs.XValues) + offset } // GetValues gets the x,y values at a given index. func (cs BaseSeries) GetValues(index int) (float64, float64) { + if cs.TickPosition == chart.TickPositionBetweenTicks { + index++ + } return cs.XValues[index], cs.YValues[index] } // GetFirstValues gets the first x,y values. func (cs BaseSeries) GetFirstValues() (float64, float64) { + if cs.TickPosition == chart.TickPositionBetweenTicks { + return cs.XValues[1], cs.YValues[1] + } return cs.XValues[0], cs.YValues[0] } diff --git a/charts.go b/charts.go index 9476b6d..5d0e0c4 100644 --- a/charts.go +++ b/charts.go @@ -69,7 +69,10 @@ func ToSVG(c *chart.Chart) ([]byte, error) { return render(c, chart.SVG) } func New(opt Option) *chart.Chart { - xAxis, xValues := GetXAxisAndValues(opt.XAxis, opt.Theme) + tickPosition := chart.TickPositionBetweenTicks + // tickPosition = chart.TickPositionUnset + + xAxis, xValues := GetXAxisAndValues(opt.XAxis, tickPosition, opt.Theme) legendSize := len(opt.Legend.Data) for index, item := range opt.Series { @@ -87,7 +90,7 @@ func New(opt Option) *chart.Chart { Height: opt.Height, XAxis: xAxis, YAxis: GetYAxis(opt.Theme), - Series: GetSeries(opt.Series, opt.Theme), + Series: GetSeries(opt.Series, tickPosition, opt.Theme), } // 设置secondary的样式 c.YAxisSecondary.Style = c.YAxis.Style diff --git a/line_series.go b/line_series.go new file mode 100644 index 0000000..5b7c9fd --- /dev/null +++ b/line_series.go @@ -0,0 +1,40 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" +) + +type LineSeries struct { + BaseSeries +} + +func (bs LineSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, defaults chart.Style) { + style := bs.Style.InheritFrom(defaults) + // 如果是居中,画线时重新调整 + if bs.TickPosition == chart.TickPositionBetweenTicks { + xrange = wrapRange(xrange, bs.TickPosition) + } + chart.Draw.LineSeries(r, canvasBox, xrange, yrange, style, bs) +} diff --git a/range.go b/range.go new file mode 100644 index 0000000..b062e51 --- /dev/null +++ b/range.go @@ -0,0 +1,52 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" +) + +type Range struct { + TickPosition chart.TickPosition + chart.ContinuousRange +} + +func wrapRange(r chart.Range, tickPosition chart.TickPosition) chart.Range { + xr, ok := r.(*chart.ContinuousRange) + if !ok { + return r + } + return &Range{ + TickPosition: tickPosition, + ContinuousRange: *xr, + } +} + +// Translate maps a given value into the ContinuousRange space. +func (r Range) Translate(value float64) int { + v := r.ContinuousRange.Translate(value) + if r.TickPosition == chart.TickPositionBetweenTicks { + v -= int(float64(r.Domain) / (r.GetDelta() * 2)) + } + return v +} diff --git a/series.go b/series.go index bc05d06..f0caf36 100644 --- a/series.go +++ b/series.go @@ -49,8 +49,15 @@ func getSeriesColor(theme string, index int) drawing.Color { return SeriesColorsLight[index%len(SeriesColorsLight)] } -func GetSeries(series []Series, theme string) []chart.Series { +func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) []chart.Series { arr := make([]chart.Series, len(series)) + barCount := 0 + barIndex := 0 + for _, item := range series { + if item.Type == SeriesBar { + barCount++ + } + } for index, item := range series { style := chart.Style{ StrokeWidth: lineStrokeWidth, @@ -58,23 +65,28 @@ func GetSeries(series []Series, theme string) []chart.Series { DotColor: getSeriesColor(theme, index), DotWidth: dotWith, } + item.Data = append([]float64{ + 0.0, + }, item.Data...) + baseSeries := BaseSeries{ + Name: item.Name, + XValues: item.XValues, + Style: style, + YValues: item.Data, + TickPosition: tickPosition, + } // TODO 判断类型 switch item.Type { case SeriesBar: arr[index] = BarSeries{ - BaseSeries: BaseSeries{ - Name: item.Name, - XValues: item.XValues, - Style: style, - YValues: item.Data, - }, + Count: barCount, + Index: barIndex, + BaseSeries: baseSeries, } + barIndex++ default: - arr[index] = chart.ContinuousSeries{ - Name: item.Name, - XValues: item.XValues, - Style: style, - YValues: item.Data, + arr[index] = LineSeries{ + BaseSeries: baseSeries, } } } From be19cd728ac8252ac8abf9b068149600bf34a648 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 14 Dec 2021 23:26:34 +0800 Subject: [PATCH 006/251] refactor: adjust bar series --- bar_series.go | 29 ++++++++++++++++++++++++----- base_series.go | 5 +++-- charts.go | 25 ++++++++++++++++++++----- series.go | 14 +++++++++----- 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/bar_series.go b/bar_series.go index 9e965b9..a2274f7 100644 --- a/bar_series.go +++ b/bar_series.go @@ -52,19 +52,39 @@ func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange cb := canvasBox.Bottom cl := canvasBox.Left + + columnWidth := canvasBox.Width() / bs.Len() + // 块间隔 + columnMargin := columnWidth / 10 + minColumnMargin := 2 + if columnMargin < minColumnMargin { + columnMargin = minColumnMargin + } margin := bs.Margin if margin <= 0 { margin = defaultBarMargin } - barWidth := bs.BarWidth - if barWidth <= 0 { - barWidth = canvasBox.Width() / (bs.Len() * bs.Count) + // 如果margin大于column margin + if margin > columnMargin { + margin = columnMargin + } + + allBarMarginWidth := (bs.Count - 1) * margin + barWidth := ((columnWidth - 2*columnMargin) - allBarMarginWidth) / bs.Count + if bs.BarWidth > 0 && bs.BarWidth < barWidth { + barWidth = bs.BarWidth + // 重新计息columnMargin + columnMargin = (columnWidth - allBarMarginWidth - (bs.Count * barWidth)) / 2 } for i := 0; i < bs.Len(); i++ { vx, vy := bs.GetValues(i) - x := cl + xrange.Translate(vx) + bs.Index*(margin+barWidth) + bs.Offset + x := cl + xrange.Translate(vx) + // 由于bar是居中展示,因此需要往前移一个显示块 + x += (-columnWidth + columnMargin) + // 计算是第几个bar,位置右偏 + x += bs.Index * (margin + barWidth) y := cb - yrange.Translate(vy) chart.Draw.Box(r, chart.Box{ @@ -74,5 +94,4 @@ func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange Bottom: canvasBox.Bottom - 1, }, style) } - } diff --git a/base_series.go b/base_series.go index 673c0a6..ac49d21 100644 --- a/base_series.go +++ b/base_series.go @@ -79,10 +79,11 @@ func (cs BaseSeries) GetValues(index int) (float64, float64) { // GetFirstValues gets the first x,y values. func (cs BaseSeries) GetFirstValues() (float64, float64) { + index := 0 if cs.TickPosition == chart.TickPositionBetweenTicks { - return cs.XValues[1], cs.YValues[1] + index++ } - return cs.XValues[0], cs.YValues[0] + return cs.XValues[index], cs.YValues[index] } // GetLastValues gets the last x,y values. diff --git a/charts.go b/charts.go index 5d0e0c4..e0d2925 100644 --- a/charts.go +++ b/charts.go @@ -41,9 +41,24 @@ type ( Theme string XAxis XAxis // YAxis Axis - Series []Series - Title Title - Legend Legend + Series []Series + Title Title + Legend Legend + TickPosition chart.TickPosition + } + ECharOption struct { + Title struct { + Text string + TextStyle struct { + Color string + FontFamily string + } + } + XAxis struct { + Type string + BoundaryGap bool + Data []string + } } ) @@ -69,8 +84,7 @@ func ToSVG(c *chart.Chart) ([]byte, error) { return render(c, chart.SVG) } func New(opt Option) *chart.Chart { - tickPosition := chart.TickPositionBetweenTicks - // tickPosition = chart.TickPositionUnset + tickPosition := opt.TickPosition xAxis, xValues := GetXAxisAndValues(opt.XAxis, tickPosition, opt.Theme) @@ -92,6 +106,7 @@ func New(opt Option) *chart.Chart { YAxis: GetYAxis(opt.Theme), Series: GetSeries(opt.Series, tickPosition, opt.Theme), } + // TODO 校验xAxis与yAxis的数量是否一致 // 设置secondary的样式 c.YAxisSecondary.Style = c.YAxis.Style if legendSize != 0 { diff --git a/series.go b/series.go index f0caf36..538f929 100644 --- a/series.go +++ b/series.go @@ -62,12 +62,16 @@ func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) [ style := chart.Style{ StrokeWidth: lineStrokeWidth, StrokeColor: getSeriesColor(theme, index), - DotColor: getSeriesColor(theme, index), - DotWidth: dotWith, + // TODO 调整为通过dot with color 生成 + DotColor: getSeriesColor(theme, index), + DotWidth: dotWith, + } + // 如果居中,需要多增加一个点 + if tickPosition == chart.TickPositionBetweenTicks { + item.Data = append([]float64{ + 0.0, + }, item.Data...) } - item.Data = append([]float64{ - 0.0, - }, item.Data...) baseSeries := BaseSeries{ Name: item.Name, XValues: item.XValues, From 4d8086a2836230d500e173a382aa99e56724d194 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 15 Dec 2021 23:41:27 +0800 Subject: [PATCH 007/251] refactor: support pie chart --- axis.go | 38 +++++++++++++++++---- bar_series.go | 26 +++++++++++++-- charts.go | 91 ++++++++++++++++++++++++++++++++++++++------------- series.go | 44 ++++++++++++++++--------- theme.go | 44 ++++++++++++++++++++++++- 5 files changed, 195 insertions(+), 48 deletions(-) diff --git a/axis.go b/axis.go index 5937ef0..775747b 100644 --- a/axis.go +++ b/axis.go @@ -35,8 +35,9 @@ type ( // 'category' 类目轴,适用于离散的类目数据。为该类型时类目数据可自动从 series.data 或 dataset.source 中取,或者可通过 xAxis.data 设置类目数据。 // 'time' 时间轴,适用于连续的时序数据,与数值轴相比时间轴带有时间的格式化,在刻度计算上也有所不同,例如会根据跨度的范围来决定使用月,星期,日还是小时范围的刻度。 // 'log' 对数轴。适用于对数数据。 - Type string - Data []string + Type string + Data []string + SplitNumber int } ) @@ -44,6 +45,7 @@ const axisStrokeWidth = 1 func GetXAxisAndValues(xAxis XAxis, tickPosition chart.TickPosition, theme string) (chart.XAxis, []float64) { data := xAxis.Data + originalSize := len(data) // 如果居中,则需要多添加一个值 if tickPosition == chart.TickPositionBetweenTicks { data = append([]string{ @@ -51,14 +53,36 @@ func GetXAxisAndValues(xAxis XAxis, tickPosition chart.TickPosition, theme strin }, data...) } - xValues := make([]float64, len(data)) - ticks := make([]chart.Tick, len(data)) + size := len(data) + + xValues := make([]float64, size) + ticks := make([]chart.Tick, 0) + + maxTicks := xAxis.SplitNumber + if maxTicks == 0 { + maxTicks = 10 + } + + // 计息最多每个unit至少放多个 + minUnitSize := originalSize / maxTicks + if originalSize%maxTicks != 0 { + minUnitSize++ + } + unitSize := minUnitSize + for i := minUnitSize; i < 2*minUnitSize; i++ { + if originalSize%i == 0 { + unitSize = i + } + } + for index, key := range data { f := float64(index) xValues[index] = f - ticks[index] = chart.Tick{ - Value: f, - Label: key, + if index%unitSize == 0 || index == size-1 { + ticks = append(ticks, chart.Tick{ + Value: f, + Label: key, + }) } } // TODO diff --git a/bar_series.go b/bar_series.go index a2274f7..72f4cb1 100644 --- a/bar_series.go +++ b/bar_series.go @@ -28,6 +28,12 @@ import ( const defaultBarMargin = 10 +type BarSeriesCustomStyle struct { + PointIndex int + Index int + Style chart.Style +} + type BarSeries struct { BaseSeries Count int @@ -37,7 +43,17 @@ type BarSeries struct { // 偏移量 Offset int // 宽度 - BarWidth int + BarWidth int + CustomStyles []BarSeriesCustomStyle +} + +func (bs BarSeries) GetBarStyle(index, pointIndex int) chart.Style { + for _, item := range bs.CustomStyles { + if item.Index == index && item.PointIndex == pointIndex { + return item.Style + } + } + return chart.Style{} } func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, defaults chart.Style) { @@ -79,6 +95,12 @@ func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange for i := 0; i < bs.Len(); i++ { vx, vy := bs.GetValues(i) + customStyle := bs.GetBarStyle(bs.Index, i) + cloneStyle := style + if !customStyle.IsZero() { + cloneStyle.FillColor = customStyle.FillColor + cloneStyle.StrokeColor = customStyle.StrokeColor + } x := cl + xrange.Translate(vx) // 由于bar是居中展示,因此需要往前移一个显示块 @@ -92,6 +114,6 @@ func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange Top: y, Right: x + barWidth, Bottom: canvasBox.Bottom - 1, - }, style) + }, cloneStyle) } } diff --git a/charts.go b/charts.go index e0d2925..e396d73 100644 --- a/charts.go +++ b/charts.go @@ -24,10 +24,17 @@ package charts import ( "bytes" + "errors" + "io" "github.com/wcharczuk/go-chart/v2" ) +const ( + ThemeLight = "light" + ThemeDark = "dark" +) + type ( Title struct { Text string @@ -46,28 +53,43 @@ type ( Legend Legend TickPosition chart.TickPosition } - ECharOption struct { - Title struct { - Text string - TextStyle struct { - Color string - FontFamily string - } - } - XAxis struct { - Type string - BoundaryGap bool - Data []string +) + +type Chart interface { + Render(rp chart.RendererProvider, w io.Writer) error +} + +type ECharOption struct { + Title struct { + Text string + TextStyle struct { + Color string + FontFamily string } } -) + XAxis struct { + Type string + BoundaryGap *bool + SplitNumber int + Data []string + } +} -const ( - ThemeLight = "light" - ThemeDark = "dark" -) +func (o *Option) validate() error { + xAxisCount := len(o.XAxis.Data) + if len(o.Series) == 0 { + return errors.New("series can not be empty") + } -func render(c *chart.Chart, rp chart.RendererProvider) ([]byte, error) { + for _, item := range o.Series { + if len(item.Data) != xAxisCount { + return errors.New("series and xAxis is not matched") + } + } + return nil +} + +func render(c Chart, rp chart.RendererProvider) ([]byte, error) { buf := bytes.Buffer{} err := c.Render(rp, &buf) if err != nil { @@ -76,14 +98,18 @@ func render(c *chart.Chart, rp chart.RendererProvider) ([]byte, error) { return buf.Bytes(), nil } -func ToPNG(c *chart.Chart) ([]byte, error) { +func ToPNG(c Chart) ([]byte, error) { return render(c, chart.PNG) } -func ToSVG(c *chart.Chart) ([]byte, error) { +func ToSVG(c Chart) ([]byte, error) { return render(c, chart.SVG) } -func New(opt Option) *chart.Chart { +func New(opt Option) (Chart, error) { + err := opt.validate() + if err != nil { + return nil, err + } tickPosition := opt.TickPosition xAxis, xValues := GetXAxisAndValues(opt.XAxis, tickPosition, opt.Theme) @@ -97,6 +123,25 @@ func New(opt Option) *chart.Chart { opt.Series[index].Name = opt.Legend.Data[index] } } + if opt.Series[0].Type == SeriesPie { + values := make(chart.Values, len(opt.Series)) + for index, item := range opt.Series { + values[index] = chart.Value{ + Value: item.Data[0].Value, + Label: item.Name, + } + } + c := &chart.PieChart{ + Title: opt.Title.Text, + Width: opt.Width, + Height: opt.Height, + Values: values, + ColorPalette: &ThemeColorPalette{ + Theme: opt.Theme, + }, + } + return c, nil + } c := &chart.Chart{ Title: opt.Title.Text, @@ -106,7 +151,7 @@ func New(opt Option) *chart.Chart { YAxis: GetYAxis(opt.Theme), Series: GetSeries(opt.Series, tickPosition, opt.Theme), } - // TODO 校验xAxis与yAxis的数量是否一致 + // 设置secondary的样式 c.YAxisSecondary.Style = c.YAxis.Style if legendSize != 0 { @@ -114,5 +159,5 @@ func New(opt Option) *chart.Chart { DefaultLegend(c), } } - return c + return c, nil } diff --git a/series.go b/series.go index 538f929..09a6c54 100644 --- a/series.go +++ b/series.go @@ -24,13 +24,16 @@ package charts import ( "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" ) +type SeriesData struct { + Value float64 + Style chart.Style +} type Series struct { Type string Name string - Data []float64 + Data []SeriesData XValues []float64 } @@ -40,15 +43,9 @@ const dotWith = 2 const ( SeriesBar = "bar" SeriesLine = "line" + SeriesPie = "pie" ) -func getSeriesColor(theme string, index int) drawing.Color { - // TODO - if theme == ThemeDark { - } - return SeriesColorsLight[index%len(SeriesColorsLight)] -} - func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) []chart.Series { arr := make([]chart.Series, len(series)) barCount := 0 @@ -58,34 +55,51 @@ func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) [ barCount++ } } + for index, item := range series { style := chart.Style{ StrokeWidth: lineStrokeWidth, StrokeColor: getSeriesColor(theme, index), + // FillColor: getSeriesColor(theme, index), // TODO 调整为通过dot with color 生成 DotColor: getSeriesColor(theme, index), DotWidth: dotWith, } // 如果居中,需要多增加一个点 if tickPosition == chart.TickPositionBetweenTicks { - item.Data = append([]float64{ - 0.0, + item.Data = append([]SeriesData{ + { + Value: 0.0, + }, }, item.Data...) } + yValues := make([]float64, len(item.Data)) + barCustomStyles := make([]BarSeriesCustomStyle, 0) + for i, item := range item.Data { + yValues[i] = item.Value + if !item.Style.IsZero() { + barCustomStyles = append(barCustomStyles, BarSeriesCustomStyle{ + PointIndex: i, + Index: barIndex, + Style: item.Style, + }) + } + } baseSeries := BaseSeries{ Name: item.Name, XValues: item.XValues, Style: style, - YValues: item.Data, + YValues: yValues, TickPosition: tickPosition, } // TODO 判断类型 switch item.Type { case SeriesBar: arr[index] = BarSeries{ - Count: barCount, - Index: barIndex, - BaseSeries: baseSeries, + Count: barCount, + Index: barIndex, + BaseSeries: baseSeries, + CustomStyles: barCustomStyles, } barIndex++ default: diff --git a/theme.go b/theme.go index 4d86a64..1962a3f 100644 --- a/theme.go +++ b/theme.go @@ -22,7 +22,10 @@ package charts -import "github.com/wcharczuk/go-chart/v2/drawing" +import ( + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) var hiddenColor = drawing.Color{R: 110, G: 112, B: 121, A: 0} @@ -65,3 +68,42 @@ var SeriesColorsLight = []drawing.Color{ A: 255, }, } + +type ThemeColorPalette struct { + Theme string +} + +func (tp ThemeColorPalette) BackgroundColor() drawing.Color { + return chart.DefaultBackgroundColor +} + +func (tp ThemeColorPalette) BackgroundStrokeColor() drawing.Color { + return chart.DefaultBackgroundStrokeColor +} + +func (tp ThemeColorPalette) CanvasColor() drawing.Color { + return chart.DefaultCanvasColor +} + +func (tp ThemeColorPalette) CanvasStrokeColor() drawing.Color { + return chart.DefaultCanvasStrokeColor +} + +func (tp ThemeColorPalette) AxisStrokeColor() drawing.Color { + return chart.DefaultAxisColor +} + +func (tp ThemeColorPalette) TextColor() drawing.Color { + return chart.DefaultTextColor +} + +func (tp ThemeColorPalette) GetSeriesColor(index int) drawing.Color { + return getSeriesColor(tp.Theme, index) +} + +func getSeriesColor(theme string, index int) drawing.Color { + // TODO + if theme == ThemeDark { + } + return SeriesColorsLight[index%len(SeriesColorsLight)] +} From 8f7587561fc99f028bc8c160fee288201768434e Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 16 Dec 2021 23:00:31 +0800 Subject: [PATCH 008/251] refactor: support echarts options --- axis.go | 26 ++++++++ charts.go | 98 +++++++++++++++--------------- echarts.go | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 13 ++++ go.sum | 9 +++ series.go | 15 ++++- theme.go | 13 ++++ 7 files changed, 294 insertions(+), 51 deletions(-) create mode 100644 echarts.go create mode 100644 go.mod create mode 100644 go.sum diff --git a/axis.go b/axis.go index 775747b..04229e8 100644 --- a/axis.go +++ b/axis.go @@ -102,6 +102,32 @@ func GetXAxisAndValues(xAxis XAxis, tickPosition chart.TickPosition, theme strin }, xValues } +func GetSecondaryYAxis(theme string) chart.YAxis { + // TODO + if theme == ThemeDark { + return chart.YAxis{} + } + // strokeColor := drawing.Color{ + // R: 224, + // G: 230, + // B: 241, + // A: 255, + // } + return chart.YAxis{ + ValueFormatter: func(v interface{}) string { + value, ok := v.(float64) + if !ok { + return "" + } + return humanize.Commaf(value) + }, + AxisType: chart.YAxisPrimary, + GridMajorStyle: chart.Hidden(), + GridMinorStyle: chart.Hidden(), + Style: chart.Hidden(), + } +} + func GetYAxis(theme string) chart.YAxis { // TODO if theme == ThemeDark { diff --git a/charts.go b/charts.go index e396d73..69af23e 100644 --- a/charts.go +++ b/charts.go @@ -35,19 +35,25 @@ const ( ThemeDark = "dark" ) +const ( + DefaultChartWidth = 800 + DefaultChartHeight = 400 +) + type ( Title struct { - Text string + Text string + Style chart.Style } Legend struct { Data []string } - Option struct { - Width int - Height int - Theme string - XAxis XAxis - // YAxis Axis + Options struct { + Width int + Height int + Theme string + XAxis XAxis + YAxisList []chart.YAxis Series []Series Title Title Legend Legend @@ -55,27 +61,11 @@ type ( } ) -type Chart interface { +type Graph interface { Render(rp chart.RendererProvider, w io.Writer) error } -type ECharOption struct { - Title struct { - Text string - TextStyle struct { - Color string - FontFamily string - } - } - XAxis struct { - Type string - BoundaryGap *bool - SplitNumber int - Data []string - } -} - -func (o *Option) validate() error { +func (o *Options) validate() error { xAxisCount := len(o.XAxis.Data) if len(o.Series) == 0 { return errors.New("series can not be empty") @@ -89,28 +79,36 @@ func (o *Option) validate() error { return nil } -func render(c Chart, rp chart.RendererProvider) ([]byte, error) { +func render(g Graph, rp chart.RendererProvider) ([]byte, error) { buf := bytes.Buffer{} - err := c.Render(rp, &buf) + err := g.Render(rp, &buf) if err != nil { return nil, err } return buf.Bytes(), nil } -func ToPNG(c Chart) ([]byte, error) { - return render(c, chart.PNG) +func ToPNG(g Graph) ([]byte, error) { + return render(g, chart.PNG) } -func ToSVG(c Chart) ([]byte, error) { - return render(c, chart.SVG) +func ToSVG(g Graph) ([]byte, error) { + return render(g, chart.SVG) } -func New(opt Option) (Chart, error) { +func New(opt Options) (Graph, error) { err := opt.validate() if err != nil { return nil, err } tickPosition := opt.TickPosition + width := opt.Width + if width <= 0 { + width = DefaultChartWidth + } + height := opt.Height + if height <= 0 { + height = DefaultChartHeight + } xAxis, xValues := GetXAxisAndValues(opt.XAxis, tickPosition, opt.Theme) @@ -131,33 +129,35 @@ func New(opt Option) (Chart, error) { Label: item.Name, } } - c := &chart.PieChart{ - Title: opt.Title.Text, - Width: opt.Width, - Height: opt.Height, - Values: values, + g := &chart.PieChart{ + Title: opt.Title.Text, + TitleStyle: opt.Title.Style, + Width: width, + Height: height, + Values: values, ColorPalette: &ThemeColorPalette{ Theme: opt.Theme, }, } - return c, nil + return g, nil } - c := &chart.Chart{ - Title: opt.Title.Text, - Width: opt.Width, - Height: opt.Height, - XAxis: xAxis, - YAxis: GetYAxis(opt.Theme), - Series: GetSeries(opt.Series, tickPosition, opt.Theme), + g := &chart.Chart{ + Title: opt.Title.Text, + TitleStyle: opt.Title.Style, + Width: width, + Height: height, + XAxis: xAxis, + YAxis: GetYAxis(opt.Theme), + YAxisSecondary: GetSecondaryYAxis(opt.Theme), + Series: GetSeries(opt.Series, tickPosition, opt.Theme), } // 设置secondary的样式 - c.YAxisSecondary.Style = c.YAxis.Style if legendSize != 0 { - c.Elements = []chart.Renderable{ - DefaultLegend(c), + g.Elements = []chart.Renderable{ + DefaultLegend(g), } } - return c, nil + return g, nil } diff --git a/echarts.go b/echarts.go new file mode 100644 index 0000000..28c73db --- /dev/null +++ b/echarts.go @@ -0,0 +1,171 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "bytes" + "encoding/json" + "regexp" + "strconv" + + "github.com/wcharczuk/go-chart/v2" +) + +type EChartStyle struct { + Color string `json:"color"` +} +type ECharsSeriesData struct { + Value float64 `json:"value"` + ItemStyle EChartStyle `json:"itemStyle"` +} +type _ECharsSeriesData ECharsSeriesData + +func (es *ECharsSeriesData) UnmarshalJSON(data []byte) error { + data = bytes.TrimSpace(data) + if len(data) == 0 { + return nil + } + if regexp.MustCompile(`^\d+`).Match(data) { + v, err := strconv.ParseFloat(string(data), 64) + if err != nil { + return err + } + es.Value = v + return nil + } + v := _ECharsSeriesData{} + err := json.Unmarshal(data, &v) + if err != nil { + return err + } + es.Value = v.Value + es.ItemStyle = v.ItemStyle + return nil +} + +type EChartsYAxis struct { + Data []struct { + Min int `json:"min"` + Max int `json:"max"` + Interval int `json:"interval"` + AxisLabel struct { + Formatter string `json:"formatter"` + } `json:"axisLabel"` + } `json:"data"` +} + +func (ey *EChartsYAxis) UnmarshalJSON(data []byte) error { + data = bytes.TrimSpace(data) + if len(data) == 0 { + return nil + } + if data[0] != '[' { + data = []byte("[" + string(data) + "]") + } + return json.Unmarshal(data, &ey.Data) +} + +type ECharsOptions struct { + Title struct { + Text string `json:"text"` + TextStyle struct { + Color string `json:"color"` + FontFamily string `json:"fontFamily"` + } `json:"textStyle"` + } `json:"title"` + XAxis struct { + Type string `json:"type"` + BoundaryGap *bool `json:"boundaryGap"` + SplitNumber int `json:"splitNumber"` + Data []string `json:"data"` + } `json:"xAxis"` + YAxis EChartsYAxis `json:"yAxis"` + Legend struct { + Data []string `json:"data"` + } `json:"legend"` + Series []struct { + Data []ECharsSeriesData `json:"data"` + Type string `json:"type"` + } `json:"series"` +} + +func (e *ECharsOptions) ToOptions() Options { + o := Options{} + o.Title = Title{ + Text: e.Title.Text, + } + + o.XAxis = XAxis{ + Type: e.XAxis.Type, + Data: e.XAxis.Data, + SplitNumber: e.XAxis.SplitNumber, + } + + o.Legend = Legend{ + Data: e.Legend.Data, + } + + // TODO 生成yAxis + + tickPosition := chart.TickPositionUnset + series := make([]Series, len(e.Series)) + for index, item := range e.Series { + // bar默认tick居中 + if item.Type == SeriesBar { + tickPosition = chart.TickPositionBetweenTicks + } + data := make([]SeriesData, len(item.Data)) + for j, itemData := range item.Data { + sd := SeriesData{ + Value: itemData.Value, + } + if itemData.ItemStyle.Color != "" { + c := parseColor(itemData.ItemStyle.Color) + sd.Style.FillColor = c + sd.Style.StrokeColor = c + } + data[j] = sd + } + series[index] = Series{ + Data: data, + Type: item.Type, + } + } + o.Series = series + + if e.XAxis.BoundaryGap == nil || *e.XAxis.BoundaryGap { + tickPosition = chart.TickPositionBetweenTicks + } + o.TickPosition = tickPosition + return o +} + +func ParseECharsOptions(options string) (Options, error) { + e := ECharsOptions{} + err := json.Unmarshal([]byte(options), &e) + if err != nil { + return Options{}, err + } + + return e.ToOptions(), nil +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..185a2c5 --- /dev/null +++ b/go.mod @@ -0,0 +1,13 @@ +module github.com/vicanso/echarts + +go 1.17 + +require ( + github.com/dustin/go-humanize v1.0.0 + github.com/wcharczuk/go-chart/v2 v2.1.0 +) + +require ( + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b3869e0 --- /dev/null +++ b/go.sum @@ -0,0 +1,9 @@ +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= +github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/series.go b/series.go index 09a6c54..c697959 100644 --- a/series.go +++ b/series.go @@ -30,6 +30,7 @@ type SeriesData struct { Value float64 Style chart.Style } + type Series struct { Type string Name string @@ -46,6 +47,15 @@ const ( SeriesPie = "pie" ) +func NewSeriesDataListFromFloat(values []float64) []SeriesData { + dataList := make([]SeriesData, len(values)) + for index, value := range values { + dataList[index] = SeriesData{ + Value: value, + } + } + return dataList +} func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) []chart.Series { arr := make([]chart.Series, len(series)) barCount := 0 @@ -60,11 +70,11 @@ func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) [ style := chart.Style{ StrokeWidth: lineStrokeWidth, StrokeColor: getSeriesColor(theme, index), - // FillColor: getSeriesColor(theme, index), // TODO 调整为通过dot with color 生成 DotColor: getSeriesColor(theme, index), DotWidth: dotWith, } + pointIndexOffset := 0 // 如果居中,需要多增加一个点 if tickPosition == chart.TickPositionBetweenTicks { item.Data = append([]SeriesData{ @@ -72,6 +82,7 @@ func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) [ Value: 0.0, }, }, item.Data...) + pointIndexOffset = -1 } yValues := make([]float64, len(item.Data)) barCustomStyles := make([]BarSeriesCustomStyle, 0) @@ -79,7 +90,7 @@ func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) [ yValues[i] = item.Value if !item.Style.IsZero() { barCustomStyles = append(barCustomStyles, BarSeriesCustomStyle{ - PointIndex: i, + PointIndex: i + pointIndexOffset, Index: barIndex, Style: item.Style, }) diff --git a/theme.go b/theme.go index 1962a3f..d67bf9e 100644 --- a/theme.go +++ b/theme.go @@ -23,6 +23,8 @@ package charts import ( + "strings" + "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" ) @@ -107,3 +109,14 @@ func getSeriesColor(theme string, index int) drawing.Color { } return SeriesColorsLight[index%len(SeriesColorsLight)] } + +func parseColor(color string) drawing.Color { + if color == "" { + return drawing.Color{} + } + if strings.HasPrefix(color, "#") { + return drawing.ColorFromHex(color[1:]) + } + // TODO + return drawing.Color{} +} From ead48fef8efe28f4dfd3f653f2cf54b666384270 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 18 Dec 2021 07:59:37 +0800 Subject: [PATCH 009/251] refactor: support dark theme --- axis.go | 95 +++++++------ charts.go | 50 ++++--- echarts.go | 95 +++++++++---- examples/main.go | 337 +++++++++++++++++++++++++++++++++++++++++++++++ legend.go | 11 +- series.go | 2 + theme.go | 73 +++++++++- 7 files changed, 568 insertions(+), 95 deletions(-) create mode 100644 examples/main.go diff --git a/axis.go b/axis.go index 04229e8..6f9452b 100644 --- a/axis.go +++ b/axis.go @@ -25,7 +25,6 @@ package charts import ( "github.com/dustin/go-humanize" "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" ) type ( @@ -41,6 +40,10 @@ type ( } ) +type YAxisOption struct { + Formater chart.ValueFormatter +} + const axisStrokeWidth = 1 func GetXAxisAndValues(xAxis XAxis, tickPosition chart.TickPosition, theme string) (chart.XAxis, []float64) { @@ -85,24 +88,29 @@ func GetXAxisAndValues(xAxis XAxis, tickPosition chart.TickPosition, theme strin }) } } - // TODO - if theme == ThemeDark { - return chart.XAxis{ - Ticks: ticks, - }, xValues - } return chart.XAxis{ Ticks: ticks, TickPosition: tickPosition, Style: chart.Style{ - FontColor: AxisColorLight, - StrokeColor: AxisColorLight, + FontColor: getAxisColor(theme), + StrokeColor: getAxisColor(theme), StrokeWidth: axisStrokeWidth, }, }, xValues } -func GetSecondaryYAxis(theme string) chart.YAxis { +func defaultFloatFormater(v interface{}) string { + value, ok := v.(float64) + if !ok { + return "" + } + if value >= 10 { + return humanize.CommafWithDigits(value, 0) + } + return humanize.CommafWithDigits(value, 2) +} + +func GetSecondaryYAxis(theme string, option *YAxisOption) chart.YAxis { // TODO if theme == ThemeDark { return chart.YAxis{} @@ -113,41 +121,46 @@ func GetSecondaryYAxis(theme string) chart.YAxis { // B: 241, // A: 255, // } - return chart.YAxis{ - ValueFormatter: func(v interface{}) string { - value, ok := v.(float64) - if !ok { - return "" - } - return humanize.Commaf(value) - }, - AxisType: chart.YAxisPrimary, - GridMajorStyle: chart.Hidden(), - GridMinorStyle: chart.Hidden(), - Style: chart.Hidden(), + formater := defaultFloatFormater + if option != nil { + if option.Formater != nil { + formater = option.Formater + } } + hidden := chart.Hidden() + return chart.YAxis{ + ValueFormatter: formater, + AxisType: chart.YAxisPrimary, + GridMajorStyle: hidden, + GridMinorStyle: hidden, + Style: chart.Style{ + FontColor: getAxisColor(theme), + // alpha 0,隐藏 + StrokeColor: hiddenColor, + StrokeWidth: axisStrokeWidth, + }, + } + // c := chart.Hidden() + // return chart.YAxis{ + // ValueFormatter: defaultFloatFormater, + // AxisType: chart.YAxisPrimary, + // GridMajorStyle: c, + // GridMinorStyle: c, + // Style: c, + // } } -func GetYAxis(theme string) chart.YAxis { - // TODO - if theme == ThemeDark { - return chart.YAxis{} - } - strokeColor := drawing.Color{ - R: 224, - G: 230, - B: 241, - A: 255, +func GetYAxis(theme string, option *YAxisOption) chart.YAxis { + strokeColor := getGridColor(theme) + formater := defaultFloatFormater + if option != nil { + if option.Formater != nil { + formater = option.Formater + } } return chart.YAxis{ - ValueFormatter: func(v interface{}) string { - value, ok := v.(float64) - if !ok { - return "" - } - return humanize.Commaf(value) - }, - AxisType: chart.YAxisSecondary, + ValueFormatter: formater, + AxisType: chart.YAxisSecondary, GridMajorStyle: chart.Style{ StrokeColor: strokeColor, StrokeWidth: axisStrokeWidth, @@ -157,7 +170,7 @@ func GetYAxis(theme string) chart.YAxis { StrokeWidth: axisStrokeWidth, }, Style: chart.Style{ - FontColor: AxisColorLight, + FontColor: getAxisColor(theme), // alpha 0,隐藏 StrokeColor: hiddenColor, StrokeWidth: axisStrokeWidth, diff --git a/charts.go b/charts.go index 69af23e..e7bda2e 100644 --- a/charts.go +++ b/charts.go @@ -53,7 +53,7 @@ type ( Height int Theme string XAxis XAxis - YAxisList []chart.YAxis + YAxisOptions []*YAxisOption Series []Series Title Title Legend Legend @@ -72,7 +72,7 @@ func (o *Options) validate() error { } for _, item := range o.Series { - if len(item.Data) != xAxisCount { + if item.Type != SeriesPie && len(item.Data) != xAxisCount { return errors.New("series and xAxis is not matched") } } @@ -109,18 +109,6 @@ func New(opt Options) (Graph, error) { if height <= 0 { height = DefaultChartHeight } - - xAxis, xValues := GetXAxisAndValues(opt.XAxis, tickPosition, opt.Theme) - - legendSize := len(opt.Legend.Data) - for index, item := range opt.Series { - if len(item.XValues) == 0 { - opt.Series[index].XValues = xValues - } - if index < legendSize && opt.Series[index].Name == "" { - opt.Series[index].Name = opt.Legend.Data[index] - } - } if opt.Series[0].Type == SeriesPie { values := make(chart.Values, len(opt.Series)) for index, item := range opt.Series { @@ -142,21 +130,49 @@ func New(opt Options) (Graph, error) { return g, nil } + xAxis, xValues := GetXAxisAndValues(opt.XAxis, tickPosition, opt.Theme) + + legendSize := len(opt.Legend.Data) + for index, item := range opt.Series { + if len(item.XValues) == 0 { + opt.Series[index].XValues = xValues + } + if index < legendSize && opt.Series[index].Name == "" { + opt.Series[index].Name = opt.Legend.Data[index] + } + } + + var yAxisOption *YAxisOption + if len(opt.YAxisOptions) != 0 { + yAxisOption = opt.YAxisOptions[0] + } + var secondaryYAxisOption *YAxisOption + if len(opt.YAxisOptions) > 1 { + secondaryYAxisOption = opt.YAxisOptions[1] + } + g := &chart.Chart{ + ColorPalette: &ThemeColorPalette{ + Theme: opt.Theme, + }, Title: opt.Title.Text, TitleStyle: opt.Title.Style, Width: width, Height: height, XAxis: xAxis, - YAxis: GetYAxis(opt.Theme), - YAxisSecondary: GetSecondaryYAxis(opt.Theme), + YAxis: GetYAxis(opt.Theme, yAxisOption), + YAxisSecondary: GetSecondaryYAxis(opt.Theme, secondaryYAxisOption), Series: GetSeries(opt.Series, tickPosition, opt.Theme), } // 设置secondary的样式 if legendSize != 0 { g.Elements = []chart.Renderable{ - DefaultLegend(g), + LegendCustomize(g, LegendOption{ + Theme: opt.Theme, + TextPosition: LegendTextPositionRight, + IconDraw: DefaultLegendIconDraw, + }), } } return g, nil diff --git a/echarts.go b/echarts.go index 28c73db..6361837 100644 --- a/echarts.go +++ b/echarts.go @@ -27,6 +27,7 @@ import ( "encoding/json" "regexp" "strconv" + "strings" "github.com/wcharczuk/go-chart/v2" ) @@ -36,6 +37,7 @@ type EChartStyle struct { } type ECharsSeriesData struct { Value float64 `json:"value"` + Name string `json:"name"` ItemStyle EChartStyle `json:"itemStyle"` } type _ECharsSeriesData ECharsSeriesData @@ -58,6 +60,7 @@ func (es *ECharsSeriesData) UnmarshalJSON(data []byte) error { if err != nil { return err } + es.Name = v.Name es.Value = v.Value es.ItemStyle = v.ItemStyle return nil @@ -86,6 +89,7 @@ func (ey *EChartsYAxis) UnmarshalJSON(data []byte) error { } type ECharsOptions struct { + Theme string `json:"theme"` Title struct { Text string `json:"text"` TextStyle struct { @@ -104,30 +108,34 @@ type ECharsOptions struct { Data []string `json:"data"` } `json:"legend"` Series []struct { - Data []ECharsSeriesData `json:"data"` - Type string `json:"type"` + Data []ECharsSeriesData `json:"data"` + Type string `json:"type"` + YAxisIndex int `json:"yAxisIndex"` } `json:"series"` } -func (e *ECharsOptions) ToOptions() Options { - o := Options{} - o.Title = Title{ - Text: e.Title.Text, - } - - o.XAxis = XAxis{ - Type: e.XAxis.Type, - Data: e.XAxis.Data, - SplitNumber: e.XAxis.SplitNumber, - } - - o.Legend = Legend{ - Data: e.Legend.Data, - } - - // TODO 生成yAxis - +func convertEChartsSeries(e *ECharsOptions) ([]Series, chart.TickPosition) { tickPosition := chart.TickPositionUnset + + if len(e.Series) == 0 { + return nil, tickPosition + } + seriesType := e.Series[0].Type + if seriesType == SeriesPie { + series := make([]Series, len(e.Series[0].Data)) + for index, item := range e.Series[0].Data { + series[index] = Series{ + Data: []SeriesData{ + { + Value: item.Value, + }, + }, + Type: seriesType, + Name: item.Name, + } + } + return series, tickPosition + } series := make([]Series, len(e.Series)) for index, item := range e.Series { // bar默认tick居中 @@ -146,11 +154,54 @@ func (e *ECharsOptions) ToOptions() Options { } data[j] = sd } + yAxisType := chart.YAxisPrimary + if item.YAxisIndex != 0 { + yAxisType = chart.YAxisSecondary + } series[index] = Series{ - Data: data, - Type: item.Type, + YAxis: yAxisType, + Data: data, + Type: item.Type, } } + return series, tickPosition +} + +func (e *ECharsOptions) ToOptions() Options { + o := Options{ + Theme: e.Theme, + } + o.Title = Title{ + Text: e.Title.Text, + } + + o.XAxis = XAxis{ + Type: e.XAxis.Type, + Data: e.XAxis.Data, + SplitNumber: e.XAxis.SplitNumber, + } + + o.Legend = Legend{ + Data: e.Legend.Data, + } + if len(e.YAxis.Data) != 0 { + yAxisOptions := make([]*YAxisOption, len(e.YAxis.Data)) + for index, item := range e.YAxis.Data { + opt := &YAxisOption{} + template := item.AxisLabel.Formatter + if template != "" { + opt.Formater = func(v interface{}) string { + str := defaultFloatFormater(v) + return strings.ReplaceAll(template, "{value}", str) + } + } + yAxisOptions[index] = opt + } + o.YAxisOptions = yAxisOptions + } + + series, tickPosition := convertEChartsSeries(e) + o.Series = series if e.XAxis.BoundaryGap == nil || *e.XAxis.BoundaryGap { diff --git a/examples/main.go b/examples/main.go new file mode 100644 index 0000000..3d3d5d8 --- /dev/null +++ b/examples/main.go @@ -0,0 +1,337 @@ +package main + +import ( + "bytes" + "net/http" + + charts "github.com/vicanso/echarts" +) + +var html = ` + + + + + + + + go-echarts + + + {{body}} + + +` + +var chartOptions = []map[string]string{ + { + "title": "折线图", + "option": `{ + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "data": [150, 230, 224, 218, 135, 147, 260], + "type": "line" + } + ] +}`, + }, + { + "title": "多折线图", + "option": `{ + "title": { + "text": "Multi Line" + }, + "legend": { + "data": ["Email", "Union Ads", "Video Ads", "Direct", "Search Engine"] + }, + "xAxis": { + "type": "category", + "boundaryGap": false, + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "type": "line", + "data": [120, 132, 101, 134, 90, 230, 210] + }, + { + "data": [220, 182, 191, 234, 290, 330, 310] + }, + { + "data": [150, 232, 201, 154, 190, 330, 410] + }, + { + "data": [320, 332, 301, 334, 390, 330, 320] + }, + { + "data": [820, 932, 901, 934, 1290, 1330, 1320] + } + ] +}`, + }, + { + "title": "柱状图", + "option": `{ + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "data": [120, 200, 150, 80, 70, 110, 130], + "type": "bar" + } + ] +}`, + }, + { + "title": "柱状图(自定义颜色)", + "option": `{ + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "data": [ + 120, + { + "value": 200, + "itemStyle": { + "color": "#a90000" + } + }, + 150, + 80, + 70, + 110, + 130 + ], + "type": "bar" + } + ] +}`, + }, + { + "title": "多柱状图", + "option": `{ + "title": { + "text": "Rainfall vs Evaporation" + }, + "legend": { + "data": ["Rainfall", "Evaporation"] + }, + "xAxis": { + "type": "category", + "splitNumber": 12, + "data": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + }, + "series": [ + { + "name": "Rainfall", + "type": "bar", + "data": [2, 4.9, 7, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20, 6.4, 3.3] + }, + { + "name": "Evaporation", + "type": "bar", + "data": [2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6, 2.3] + } + ] +}`, + }, + { + "title": "折柱混合", + "option": `{ + "legend": { + "data": [ + "Evaporation", + "Precipitation", + "Temperature" + ] + }, + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "yAxis": [ + { + "type": "value", + "name": "Precipitation", + "min": 0, + "max": 250, + "interval": 50, + "axisLabel": { + "formatter": "{value} ml" + } + }, + { + "type": "value", + "name": "Temperature", + "min": 0, + "max": 25, + "interval": 5, + "axisLabel": { + "formatter": "{value} °C" + } + } + ], + "series": [ + { + "name": "Evaporation", + "type": "bar", + "data": [2, 4.9, 7, 23.2, 25.6, 76.7, 135.6] + }, + { + "name": "Precipitation", + "type": "bar", + "data": [2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6] + }, + { + "name": "Temperature", + "type": "line", + "yAxisIndex": 1, + "data": [2, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3] + } + ] +}`, + }, + { + "title": "降雨量", + "option": `{ + "title": { + "text": "降雨量" + }, + "legend": { + "data": ["GZ", "SH"] + }, + "xAxis": { + "type": "category", + "splitNumber": 12, + "data": ["01-01","01-02","01-03","01-04","01-05","01-06","01-07","01-08","01-09","01-10","01-11","01-12","01-13","01-14","01-15","01-16","01-17","01-18","01-19","01-20","01-21","01-22","01-23","01-24","01-25","01-26","01-27","01-28","01-29","01-30","01-31"] + }, + "yAxis": { + "axisLabel": { + "formatter": "{value} mm" + } + }, + "series": [ + { + "type": "bar", + "data": [928,821,889,600,547,783,197,853,430,346,63,465,309,334,141,538,792,58,922,807,298,243,744,885,812,231,330,220,984,221,429] + }, + { + "type": "bar", + "data": [749,201,296,579,255,159,902,246,149,158,507,776,186,79,390,222,601,367,221,411,714,620,966,73,203,631,833,610,487,677,596] + } + ] +}`, + }, + { + "title": "饼图", + "option": `{ + "title": { + "text": "Referer of a Website" + }, + "series": [ + { + "name": "Access From", + "type": "pie", + "radius": "50%", + "data": [ + { + "value": 1048, + "name": "Search Engine" + }, + { + "value": 735, + "name": "Direct" + }, + { + "value": 580, + "name": "Email" + }, + { + "value": 484, + "name": "Union Ads" + }, + { + "value": 300, + "name": "Video Ads" + } + ] + } + ] +}`, + }, +} + +func render(theme string) ([]byte, error) { + data := bytes.Buffer{} + for _, m := range chartOptions { + if m["title"] != "折柱混合" { + continue + } + chartHTML := []byte(`
+

{{title}}

+
{{option}}
+ {{svg}} +
`) + o, err := charts.ParseECharsOptions(m["option"]) + o.Theme = theme + if err != nil { + return nil, err + } + g, err := charts.New(o) + if err != nil { + return nil, err + } + buf, err := charts.ToSVG(g) + if err != nil { + return nil, err + } + buf = bytes.ReplaceAll(chartHTML, []byte("{{svg}}"), buf) + buf = bytes.ReplaceAll(buf, []byte("{{title}}"), []byte(m["title"])) + buf = bytes.ReplaceAll(buf, []byte("{{option}}"), []byte(m["option"])) + data.Write(buf) + } + return data.Bytes(), nil +} + +func indexHandler(w http.ResponseWriter, r *http.Request) { + + buf, err := render(r.URL.Query().Get("theme")) + if err != nil { + w.WriteHeader(400) + w.Write([]byte(err.Error())) + return + } + + data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), buf) + w.Header().Set("Content-Type", "text/html") + w.Write(data) +} + +func main() { + http.HandleFunc("/", indexHandler) + http.ListenAndServe(":3012", nil) +} diff --git a/legend.go b/legend.go index fc0a0bd..e5cc823 100644 --- a/legend.go +++ b/legend.go @@ -65,22 +65,15 @@ func DefaultLegendIconDraw(r chart.Renderer, opt LegendIconDrawOption) { r.MoveTo(opt.Box.Left, ly) r.LineTo(opt.Box.Right, ly) r.Stroke() - r.SetFillColor(chart.ColorWhite) + r.SetFillColor(getBackgroundColor(opt.Theme)) r.Circle(5, (opt.Box.Left+opt.Box.Right)/2, ly) r.FillStroke() } -func DefaultLegend(c *chart.Chart) chart.Renderable { - return LegendCustomize(c, LegendOption{ - TextPosition: LegendTextPositionRight, - IconDraw: DefaultLegendIconDraw, - }) -} - func LegendCustomize(c *chart.Chart, opt LegendOption) chart.Renderable { return func(r chart.Renderer, cb chart.Box, chartDefaults chart.Style) { legendDefaults := chart.Style{ - FontColor: chart.DefaultTextColor, + FontColor: getTextColor(opt.Theme), FontSize: 8.0, StrokeColor: chart.DefaultAxisColor, } diff --git a/series.go b/series.go index c697959..867051b 100644 --- a/series.go +++ b/series.go @@ -36,6 +36,7 @@ type Series struct { Name string Data []SeriesData XValues []float64 + YAxis chart.YAxisType } const lineStrokeWidth = 2 @@ -102,6 +103,7 @@ func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) [ Style: style, YValues: yValues, TickPosition: tickPosition, + YAxis: item.YAxis, } // TODO 判断类型 switch item.Type { diff --git a/theme.go b/theme.go index d67bf9e..efbdf4a 100644 --- a/theme.go +++ b/theme.go @@ -37,6 +37,50 @@ var AxisColorLight = drawing.Color{ B: 121, A: 255, } +var AxisColorDark = drawing.Color{ + R: 185, + G: 184, + B: 206, + A: 255, +} + +var BackgroundColorDark = drawing.Color{ + R: 16, + G: 12, + B: 42, + A: 255, +} + +var TextColorDark = drawing.Color{ + R: 204, + G: 204, + B: 204, + A: 255, +} + +func getAxisColor(theme string) drawing.Color { + if theme == ThemeDark { + return AxisColorDark + } + return AxisColorLight +} + +func getGridColor(theme string) drawing.Color { + if theme == ThemeDark { + return drawing.Color{ + R: 72, + G: 71, + B: 83, + A: 255, + } + } + return drawing.Color{ + R: 224, + G: 230, + B: 241, + A: 255, + } +} var SeriesColorsLight = []drawing.Color{ { @@ -71,12 +115,26 @@ var SeriesColorsLight = []drawing.Color{ }, } +func getBackgroundColor(theme string) drawing.Color { + if theme == ThemeDark { + return BackgroundColorDark + } + return chart.DefaultBackgroundColor +} + +func getTextColor(theme string) drawing.Color { + if theme == ThemeDark { + return TextColorDark + } + return chart.DefaultTextColor +} + type ThemeColorPalette struct { Theme string } func (tp ThemeColorPalette) BackgroundColor() drawing.Color { - return chart.DefaultBackgroundColor + return getBackgroundColor(tp.Theme) } func (tp ThemeColorPalette) BackgroundStrokeColor() drawing.Color { @@ -84,6 +142,9 @@ func (tp ThemeColorPalette) BackgroundStrokeColor() drawing.Color { } func (tp ThemeColorPalette) CanvasColor() drawing.Color { + if tp.Theme == ThemeDark { + return BackgroundColorDark + } return chart.DefaultCanvasColor } @@ -92,11 +153,14 @@ func (tp ThemeColorPalette) CanvasStrokeColor() drawing.Color { } func (tp ThemeColorPalette) AxisStrokeColor() drawing.Color { + if tp.Theme == ThemeDark { + return BackgroundColorDark + } return chart.DefaultAxisColor } func (tp ThemeColorPalette) TextColor() drawing.Color { - return chart.DefaultTextColor + return getTextColor(tp.Theme) } func (tp ThemeColorPalette) GetSeriesColor(index int) drawing.Color { @@ -104,9 +168,6 @@ func (tp ThemeColorPalette) GetSeriesColor(index int) drawing.Color { } func getSeriesColor(theme string, index int) drawing.Color { - // TODO - if theme == ThemeDark { - } return SeriesColorsLight[index%len(SeriesColorsLight)] } @@ -117,6 +178,6 @@ func parseColor(color string) drawing.Color { if strings.HasPrefix(color, "#") { return drawing.ColorFromHex(color[1:]) } - // TODO + // TODO rgba return drawing.Color{} } From 23e2eca0c64a242d42509538d28945624ea8bcaf Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 18 Dec 2021 09:49:44 +0800 Subject: [PATCH 010/251] feat: support multi y axis --- axis.go | 72 +++++++++++++++++++++--------------------------- charts.go | 15 ++++++---- echarts.go | 10 ++----- examples/main.go | 3 -- range.go | 8 ++++++ series.go | 15 ++++++---- 6 files changed, 62 insertions(+), 61 deletions(-) diff --git a/axis.go b/axis.go index 6f9452b..48f92a3 100644 --- a/axis.go +++ b/axis.go @@ -42,6 +42,7 @@ type ( type YAxisOption struct { Formater chart.ValueFormatter + Disabled bool } const axisStrokeWidth = 1 @@ -111,46 +112,6 @@ func defaultFloatFormater(v interface{}) string { } func GetSecondaryYAxis(theme string, option *YAxisOption) chart.YAxis { - // TODO - if theme == ThemeDark { - return chart.YAxis{} - } - // strokeColor := drawing.Color{ - // R: 224, - // G: 230, - // B: 241, - // A: 255, - // } - formater := defaultFloatFormater - if option != nil { - if option.Formater != nil { - formater = option.Formater - } - } - hidden := chart.Hidden() - return chart.YAxis{ - ValueFormatter: formater, - AxisType: chart.YAxisPrimary, - GridMajorStyle: hidden, - GridMinorStyle: hidden, - Style: chart.Style{ - FontColor: getAxisColor(theme), - // alpha 0,隐藏 - StrokeColor: hiddenColor, - StrokeWidth: axisStrokeWidth, - }, - } - // c := chart.Hidden() - // return chart.YAxis{ - // ValueFormatter: defaultFloatFormater, - // AxisType: chart.YAxisPrimary, - // GridMajorStyle: c, - // GridMinorStyle: c, - // Style: c, - // } -} - -func GetYAxis(theme string, option *YAxisOption) chart.YAxis { strokeColor := getGridColor(theme) formater := defaultFloatFormater if option != nil { @@ -177,3 +138,34 @@ func GetYAxis(theme string, option *YAxisOption) chart.YAxis { }, } } + +func GetYAxis(theme string, option *YAxisOption) chart.YAxis { + // strokeColor := getGridColor(theme) + formater := defaultFloatFormater + disabled := false + if option != nil { + if option.Formater != nil { + formater = option.Formater + } + disabled = option.Disabled + } + hidden := chart.Hidden() + + yAxis := chart.YAxis{ + ValueFormatter: formater, + AxisType: chart.YAxisPrimary, + GridMajorStyle: hidden, + GridMinorStyle: hidden, + Style: chart.Style{ + FontColor: getAxisColor(theme), + // alpha 0,隐藏 + StrokeColor: hiddenColor, + StrokeWidth: axisStrokeWidth, + }, + } + if disabled { + yAxis.Range = &HiddenRange{} + yAxis.Style.Hidden = true + } + return yAxis +} diff --git a/charts.go b/charts.go index e7bda2e..0ed8ec4 100644 --- a/charts.go +++ b/charts.go @@ -58,6 +58,7 @@ type ( Title Title Legend Legend TickPosition chart.TickPosition + Log chart.Logger } ) @@ -142,16 +143,20 @@ func New(opt Options) (Graph, error) { } } - var yAxisOption *YAxisOption - if len(opt.YAxisOptions) != 0 { - yAxisOption = opt.YAxisOptions[0] - } var secondaryYAxisOption *YAxisOption + if len(opt.YAxisOptions) != 0 { + secondaryYAxisOption = opt.YAxisOptions[0] + } + + yAxisOption := &YAxisOption{ + Disabled: true, + } if len(opt.YAxisOptions) > 1 { - secondaryYAxisOption = opt.YAxisOptions[1] + yAxisOption = opt.YAxisOptions[1] } g := &chart.Chart{ + Log: opt.Log, ColorPalette: &ThemeColorPalette{ Theme: opt.Theme, }, diff --git a/echarts.go b/echarts.go index 6361837..0db130c 100644 --- a/echarts.go +++ b/echarts.go @@ -154,14 +154,10 @@ func convertEChartsSeries(e *ECharsOptions) ([]Series, chart.TickPosition) { } data[j] = sd } - yAxisType := chart.YAxisPrimary - if item.YAxisIndex != 0 { - yAxisType = chart.YAxisSecondary - } series[index] = Series{ - YAxis: yAxisType, - Data: data, - Type: item.Type, + YAxisIndex: item.YAxisIndex, + Data: data, + Type: item.Type, } } return series, tickPosition diff --git a/examples/main.go b/examples/main.go index 3d3d5d8..49d797f 100644 --- a/examples/main.go +++ b/examples/main.go @@ -288,9 +288,6 @@ var chartOptions = []map[string]string{ func render(theme string) ([]byte, error) { data := bytes.Buffer{} for _, m := range chartOptions { - if m["title"] != "折柱混合" { - continue - } chartHTML := []byte(`

{{title}}

{{option}}
diff --git a/range.go b/range.go index b062e51..f1869da 100644 --- a/range.go +++ b/range.go @@ -50,3 +50,11 @@ func (r Range) Translate(value float64) int { } return v } + +type HiddenRange struct { + chart.ContinuousRange +} + +func (r HiddenRange) GetDelta() float64 { + return 0 +} diff --git a/series.go b/series.go index 867051b..67d8c4d 100644 --- a/series.go +++ b/series.go @@ -32,11 +32,11 @@ type SeriesData struct { } type Series struct { - Type string - Name string - Data []SeriesData - XValues []float64 - YAxis chart.YAxisType + Type string + Name string + Data []SeriesData + XValues []float64 + YAxisIndex int } const lineStrokeWidth = 2 @@ -103,7 +103,10 @@ func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) [ Style: style, YValues: yValues, TickPosition: tickPosition, - YAxis: item.YAxis, + YAxis: chart.YAxisSecondary, + } + if item.YAxisIndex != 0 { + baseSeries.YAxis = chart.YAxisPrimary } // TODO 判断类型 switch item.Type { From c0170bf2508ef710010ae608c15f0cae90ef7db0 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 18 Dec 2021 11:22:53 +0800 Subject: [PATCH 011/251] refactor: support more echarts options --- axis.go | 39 ++++++++----- charts.go | 6 +- echarts.go | 144 +++++++++++++++++++++++++++++++++++++++-------- examples/main.go | 18 ++++++ legend.go | 12 ++-- 5 files changed, 176 insertions(+), 43 deletions(-) diff --git a/axis.go b/axis.go index 48f92a3..0947111 100644 --- a/axis.go +++ b/axis.go @@ -43,6 +43,8 @@ type ( type YAxisOption struct { Formater chart.ValueFormatter Disabled bool + Min *float64 + Max *float64 } const axisStrokeWidth = 1 @@ -113,14 +115,9 @@ func defaultFloatFormater(v interface{}) string { func GetSecondaryYAxis(theme string, option *YAxisOption) chart.YAxis { strokeColor := getGridColor(theme) - formater := defaultFloatFormater - if option != nil { - if option.Formater != nil { - formater = option.Formater - } - } - return chart.YAxis{ - ValueFormatter: formater, + yAxis := chart.YAxis{ + Range: &chart.ContinuousRange{}, + ValueFormatter: defaultFloatFormater, AxisType: chart.YAxisSecondary, GridMajorStyle: chart.Style{ StrokeColor: strokeColor, @@ -137,22 +134,35 @@ func GetSecondaryYAxis(theme string, option *YAxisOption) chart.YAxis { StrokeWidth: axisStrokeWidth, }, } + setYAxis(&yAxis, option) + return yAxis +} + +func setYAxis(yAxis *chart.YAxis, option *YAxisOption) { + if option == nil { + return + } + if option.Formater != nil { + yAxis.ValueFormatter = option.Formater + } + if option.Max != nil { + yAxis.Range.SetMax(*option.Max) + } + if option.Min != nil { + yAxis.Range.SetMin(*option.Min) + } } func GetYAxis(theme string, option *YAxisOption) chart.YAxis { - // strokeColor := getGridColor(theme) - formater := defaultFloatFormater disabled := false if option != nil { - if option.Formater != nil { - formater = option.Formater - } disabled = option.Disabled } hidden := chart.Hidden() yAxis := chart.YAxis{ - ValueFormatter: formater, + Range: &chart.ContinuousRange{}, + ValueFormatter: defaultFloatFormater, AxisType: chart.YAxisPrimary, GridMajorStyle: hidden, GridMinorStyle: hidden, @@ -167,5 +177,6 @@ func GetYAxis(theme string, option *YAxisOption) chart.YAxis { yAxis.Range = &HiddenRange{} yAxis.Style.Hidden = true } + setYAxis(&yAxis, option) return yAxis } diff --git a/charts.go b/charts.go index 0ed8ec4..7cabd7f 100644 --- a/charts.go +++ b/charts.go @@ -46,7 +46,9 @@ type ( Style chart.Style } Legend struct { - Data []string + Data []string + Align string + Padding chart.Box } Options struct { Width int @@ -177,6 +179,8 @@ func New(opt Options) (Graph, error) { Theme: opt.Theme, TextPosition: LegendTextPositionRight, IconDraw: DefaultLegendIconDraw, + Align: opt.Legend.Align, + Padding: opt.Legend.Padding, }), } } diff --git a/echarts.go b/echarts.go index 0db130c..d8625af 100644 --- a/echarts.go +++ b/echarts.go @@ -42,6 +42,17 @@ type ECharsSeriesData struct { } type _ECharsSeriesData ECharsSeriesData +func convertToArray(data []byte) []byte { + data = bytes.TrimSpace(data) + if len(data) == 0 { + return nil + } + if data[0] != '[' { + data = []byte("[" + string(data) + "]") + } + return data +} + func (es *ECharsSeriesData) UnmarshalJSON(data []byte) error { data = bytes.TrimSpace(data) if len(data) == 0 { @@ -66,11 +77,57 @@ func (es *ECharsSeriesData) UnmarshalJSON(data []byte) error { return nil } +type EChartsPadding struct { + box chart.Box +} + +func (ep *EChartsPadding) UnmarshalJSON(data []byte) error { + data = convertToArray(data) + if len(data) == 0 { + return nil + } + arr := make([]int, 0) + err := json.Unmarshal(data, &arr) + if err != nil { + return err + } + if len(arr) == 0 { + return nil + } + switch len(arr) { + case 1: + ep.box = chart.Box{ + Left: arr[0], + Top: arr[0], + Bottom: arr[0], + Right: arr[0], + } + case 2: + ep.box = chart.Box{ + Top: arr[0], + Bottom: arr[0], + Left: arr[1], + Right: arr[1], + } + default: + result := make([]int, 4) + copy(result, arr) + // 上右下左 + ep.box = chart.Box{ + Top: arr[0], + Right: arr[1], + Bottom: arr[2], + Left: arr[3], + } + } + return nil +} + type EChartsYAxis struct { Data []struct { - Min int `json:"min"` - Max int `json:"max"` - Interval int `json:"interval"` + Min *float64 `json:"min"` + Max *float64 `json:"max"` + Interval int `json:"interval"` AxisLabel struct { Formatter string `json:"formatter"` } `json:"axisLabel"` @@ -78,34 +135,50 @@ type EChartsYAxis struct { } func (ey *EChartsYAxis) UnmarshalJSON(data []byte) error { - data = bytes.TrimSpace(data) + data = convertToArray(data) if len(data) == 0 { return nil } - if data[0] != '[' { - data = []byte("[" + string(data) + "]") - } return json.Unmarshal(data, &ey.Data) } +type EChartsXAxis struct { + Data []struct { + Type string `json:"type"` + BoundaryGap *bool `json:"boundaryGap"` + SplitNumber int `json:"splitNumber"` + Data []string `json:"data"` + } +} + +func (ex *EChartsXAxis) UnmarshalJSON(data []byte) error { + data = convertToArray(data) + if len(data) == 0 { + return nil + } + return json.Unmarshal(data, &ex.Data) +} + type ECharsOptions struct { Theme string `json:"theme"` Title struct { - Text string `json:"text"` + Text string `json:"text"` + // 暂不支持(go-chart默认title只能居中) + TextAlign string `json:"textAlign"` TextStyle struct { - Color string `json:"color"` - FontFamily string `json:"fontFamily"` + Color string `json:"color"` + // TODO 字体支持 + FontFamily string `json:"fontFamily"` + FontSize float64 `json:"fontSize"` + Height float64 `json:"height"` } `json:"textStyle"` } `json:"title"` - XAxis struct { - Type string `json:"type"` - BoundaryGap *bool `json:"boundaryGap"` - SplitNumber int `json:"splitNumber"` - Data []string `json:"data"` - } `json:"xAxis"` + XAxis EChartsXAxis `json:"xAxis"` YAxis EChartsYAxis `json:"yAxis"` Legend struct { - Data []string `json:"data"` + Data []string `json:"data"` + Align string `json:"align"` + Padding EChartsPadding `json:"padding"` } `json:"legend"` Series []struct { Data []ECharsSeriesData `json:"data"` @@ -167,23 +240,46 @@ func (e *ECharsOptions) ToOptions() Options { o := Options{ Theme: e.Theme, } + titleTextStyle := e.Title.TextStyle o.Title = Title{ Text: e.Title.Text, + Style: chart.Style{ + FontColor: parseColor(titleTextStyle.Color), + FontSize: titleTextStyle.FontSize, + }, } - o.XAxis = XAxis{ - Type: e.XAxis.Type, - Data: e.XAxis.Data, - SplitNumber: e.XAxis.SplitNumber, + if titleTextStyle.FontSize != 0 && titleTextStyle.Height > titleTextStyle.FontSize { + padding := int(titleTextStyle.Height-titleTextStyle.FontSize) / 2 + o.Title.Style.Padding.Top = padding + o.Title.Style.Padding.Bottom = padding + } + + boundaryGap := false + if len(e.XAxis.Data) != 0 { + xAxis := e.XAxis.Data[0] + o.XAxis = XAxis{ + Type: xAxis.Type, + Data: xAxis.Data, + SplitNumber: xAxis.SplitNumber, + } + if xAxis.BoundaryGap == nil || *xAxis.BoundaryGap { + boundaryGap = true + } } o.Legend = Legend{ - Data: e.Legend.Data, + Data: e.Legend.Data, + Align: e.Legend.Align, + Padding: e.Legend.Padding.box, } if len(e.YAxis.Data) != 0 { yAxisOptions := make([]*YAxisOption, len(e.YAxis.Data)) for index, item := range e.YAxis.Data { - opt := &YAxisOption{} + opt := &YAxisOption{ + Max: item.Max, + Min: item.Min, + } template := item.AxisLabel.Formatter if template != "" { opt.Formater = func(v interface{}) string { @@ -200,7 +296,7 @@ func (e *ECharsOptions) ToOptions() Options { o.Series = series - if e.XAxis.BoundaryGap == nil || *e.XAxis.BoundaryGap { + if boundaryGap { tickPosition = chart.TickPositionBetweenTicks } o.TickPosition = tickPosition diff --git a/examples/main.go b/examples/main.go index 49d797f..c07b49d 100644 --- a/examples/main.go +++ b/examples/main.go @@ -42,6 +42,19 @@ var chartOptions = []map[string]string{ { "title": "折线图", "option": `{ + "title": { + "text": "line", + "textAlign": "left", + "textStyle": { + "color": "#333", + "fontSize": 24, + "height": 40 + } + }, + "yAxis": { + "min": 0, + "max": 300 + }, "xAxis": { "type": "category", "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] @@ -61,6 +74,8 @@ var chartOptions = []map[string]string{ "text": "Multi Line" }, "legend": { + "align": "left", + "padding": [5, 0, 0, 50], "data": ["Email", "Union Ads", "Video Ads", "Direct", "Search Engine"] }, "xAxis": { @@ -288,6 +303,9 @@ var chartOptions = []map[string]string{ func render(theme string) ([]byte, error) { data := bytes.Buffer{} for _, m := range chartOptions { + // if m["title"] != "多柱状图" { + // continue + // } chartHTML := []byte(`

{{title}}

{{option}}
diff --git a/legend.go b/legend.go index e5cc823..a9f73d1 100644 --- a/legend.go +++ b/legend.go @@ -28,6 +28,7 @@ import ( type LegendOption struct { Style chart.Style + Padding chart.Box Align string TextPosition string Theme string @@ -61,7 +62,7 @@ func DefaultLegendIconDraw(r chart.Renderer, opt LegendIconDrawOption) { stokeWidth := opt.Style.GetStrokeWidth() r.SetStrokeWidth(stokeWidth) height := opt.Box.Bottom - opt.Box.Top - ly := (height / 2) + 1 + ly := opt.Box.Top - (height / 2) + 2 r.MoveTo(opt.Box.Left, ly) r.LineTo(opt.Box.Right, ly) r.Stroke() @@ -126,11 +127,14 @@ func LegendCustomize(c *chart.Chart, opt LegendOption) chart.Renderable { left = (cb.Width() - labelWidth) / 2 } + left += opt.Padding.Left + top := opt.Padding.Top + legendBox := chart.Box{ Left: left, Right: left + labelWidth, - Top: 0, - Bottom: 0 + legendBoxHeight, + Top: top, + Bottom: top + legendBoxHeight, } chart.Draw.Box(r, legendBox, legendDefaults) @@ -142,7 +146,7 @@ func LegendCustomize(c *chart.Chart, opt LegendOption) chart.Renderable { lineTextGap := 5 startX := legendBox.Left + legendStyle.Padding.Left - ty := legendYMargin + legendStyle.Padding.Top + textHeight + ty := top + legendYMargin + legendStyle.Padding.Top + textHeight var label string var x int iconDraw := opt.IconDraw From 9db6bcab1b039d3889df6c2ca175be9b400346b5 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 18 Dec 2021 12:01:16 +0800 Subject: [PATCH 012/251] feat: support padding option for chart --- charts.go | 14 +++++++++++--- echarts.go | 9 ++++++--- theme.go | 8 ++++++++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/charts.go b/charts.go index 7cabd7f..1657e6d 100644 --- a/charts.go +++ b/charts.go @@ -51,6 +51,7 @@ type ( Padding chart.Box } Options struct { + Padding chart.Box Width int Height int Theme string @@ -112,6 +113,9 @@ func New(opt Options) (Graph, error) { if height <= 0 { height = DefaultChartHeight } + bg := chart.Style{ + Padding: opt.Padding, + } if opt.Series[0].Type == SeriesPie { values := make(chart.Values, len(opt.Series)) for index, item := range opt.Series { @@ -121,13 +125,16 @@ func New(opt Options) (Graph, error) { } } g := &chart.PieChart{ + Background: bg, Title: opt.Title.Text, TitleStyle: opt.Title.Style, Width: width, Height: height, Values: values, - ColorPalette: &ThemeColorPalette{ - Theme: opt.Theme, + ColorPalette: &PieThemeColorPalette{ + ThemeColorPalette: ThemeColorPalette{ + Theme: opt.Theme, + }, }, } return g, nil @@ -158,7 +165,8 @@ func New(opt Options) (Graph, error) { } g := &chart.Chart{ - Log: opt.Log, + Log: opt.Log, + Background: bg, ColorPalette: &ThemeColorPalette{ Theme: opt.Theme, }, diff --git a/echarts.go b/echarts.go index d8625af..a7ce31b 100644 --- a/echarts.go +++ b/echarts.go @@ -160,8 +160,9 @@ func (ex *EChartsXAxis) UnmarshalJSON(data []byte) error { } type ECharsOptions struct { - Theme string `json:"theme"` - Title struct { + Theme string `json:"theme"` + Padding EChartsPadding `json:"padding"` + Title struct { Text string `json:"text"` // 暂不支持(go-chart默认title只能居中) TextAlign string `json:"textAlign"` @@ -238,8 +239,10 @@ func convertEChartsSeries(e *ECharsOptions) ([]Series, chart.TickPosition) { func (e *ECharsOptions) ToOptions() Options { o := Options{ - Theme: e.Theme, + Theme: e.Theme, + Padding: e.Padding.box, } + titleTextStyle := e.Title.TextStyle o.Title = Title{ Text: e.Title.Text, diff --git a/theme.go b/theme.go index efbdf4a..2c561ad 100644 --- a/theme.go +++ b/theme.go @@ -133,6 +133,14 @@ type ThemeColorPalette struct { Theme string } +type PieThemeColorPalette struct { + ThemeColorPalette +} + +func (tp PieThemeColorPalette) TextColor() drawing.Color { + return getTextColor("") +} + func (tp ThemeColorPalette) BackgroundColor() drawing.Color { return getBackgroundColor(tp.Theme) } From bf25dad1417cef4e61278f3a14735b5937f3aa0c Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 18 Dec 2021 20:09:02 +0800 Subject: [PATCH 013/251] test: add test for axis --- Makefile | 20 ++++++ axis.go | 29 +++++---- axis_test.go | 172 +++++++++++++++++++++++++++++++++++++++++++++++++++ echarts.go | 1 - go.mod | 4 ++ go.sum | 11 ++++ theme.go | 2 +- 7 files changed, 226 insertions(+), 13 deletions(-) create mode 100644 Makefile create mode 100644 axis_test.go diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7b718c4 --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +export GO111MODULE = on + +.PHONY: default test test-cover dev hooks + + +# for test +test: + go test -race -cover ./... + +test-cover: + go test -race -coverprofile=test.out ./... && go tool cover --html=test.out + +bench: + go test --benchmem -bench=. ./... + +lint: + golangci-lint run + +hooks: + cp hooks/* .git/hooks/ \ No newline at end of file diff --git a/axis.go b/axis.go index 0947111..5b2be9e 100644 --- a/axis.go +++ b/axis.go @@ -30,25 +30,27 @@ import ( type ( // AxisData string XAxis struct { - // 'value' 数值轴,适用于连续数据。 - // 'category' 类目轴,适用于离散的类目数据。为该类型时类目数据可自动从 series.data 或 dataset.source 中取,或者可通过 xAxis.data 设置类目数据。 - // 'time' 时间轴,适用于连续的时序数据,与数值轴相比时间轴带有时间的格式化,在刻度计算上也有所不同,例如会根据跨度的范围来决定使用月,星期,日还是小时范围的刻度。 - // 'log' 对数轴。适用于对数数据。 - Type string - Data []string + // data value of axis + Data []string + // number of segments SplitNumber int } ) type YAxisOption struct { + // formater of axis Formater chart.ValueFormatter + // disabled axis Disabled bool - Min *float64 - Max *float64 + // min value of axis + Min *float64 + // max value of axis + Max *float64 } const axisStrokeWidth = 1 +// GetXAxisAndValues returns x axis by theme, and the values of axis. func GetXAxisAndValues(xAxis XAxis, tickPosition chart.TickPosition, theme string) (chart.XAxis, []float64) { data := xAxis.Data originalSize := len(data) @@ -75,6 +77,7 @@ func GetXAxisAndValues(xAxis XAxis, tickPosition chart.TickPosition, theme strin minUnitSize++ } unitSize := minUnitSize + // 尽可能选择一格展示更多的块 for i := minUnitSize; i < 2*minUnitSize; i++ { if originalSize%i == 0 { unitSize = i @@ -107,12 +110,14 @@ func defaultFloatFormater(v interface{}) string { if !ok { return "" } + // 大于10的则直接取整展示 if value >= 10 { return humanize.CommafWithDigits(value, 0) } return humanize.CommafWithDigits(value, 2) } +// GetSecondaryYAxis returns the secondary y axis by theme func GetSecondaryYAxis(theme string, option *YAxisOption) chart.YAxis { strokeColor := getGridColor(theme) yAxis := chart.YAxis{ @@ -134,11 +139,11 @@ func GetSecondaryYAxis(theme string, option *YAxisOption) chart.YAxis { StrokeWidth: axisStrokeWidth, }, } - setYAxis(&yAxis, option) + setYAxisOption(&yAxis, option) return yAxis } -func setYAxis(yAxis *chart.YAxis, option *YAxisOption) { +func setYAxisOption(yAxis *chart.YAxis, option *YAxisOption) { if option == nil { return } @@ -153,6 +158,7 @@ func setYAxis(yAxis *chart.YAxis, option *YAxisOption) { } } +// GetYAxis returns the primary y axis by theme func GetYAxis(theme string, option *YAxisOption) chart.YAxis { disabled := false if option != nil { @@ -173,10 +179,11 @@ func GetYAxis(theme string, option *YAxisOption) chart.YAxis { StrokeWidth: axisStrokeWidth, }, } + // 如果禁用,则默认为隐藏,并设置range if disabled { yAxis.Range = &HiddenRange{} yAxis.Style.Hidden = true } - setYAxis(&yAxis, option) + setYAxisOption(&yAxis, option) return yAxis } diff --git a/axis_test.go b/axis_test.go new file mode 100644 index 0000000..8396e8a --- /dev/null +++ b/axis_test.go @@ -0,0 +1,172 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "strconv" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestGetXAxisAndValues(t *testing.T) { + assert := assert.New(t) + + genLabels := func(count int) []string { + arr := make([]string, count) + for i := 0; i < count; i++ { + arr[i] = strconv.Itoa(i) + } + return arr + } + genValues := func(count int, betweenTicks bool) []float64 { + if betweenTicks { + count++ + } + arr := make([]float64, count) + for i := 0; i < count; i++ { + arr[i] = float64(i) + } + return arr + } + genTicks := func(count int, betweenTicks bool) []chart.Tick { + arr := make([]chart.Tick, 0) + offset := 0 + if betweenTicks { + offset = 1 + arr = append(arr, chart.Tick{}) + } + for i := 0; i < count; i++ { + arr = append(arr, chart.Tick{ + Value: float64(i + offset), + Label: strconv.Itoa(i), + }) + } + return arr + } + + tests := []struct { + xAxis XAxis + tickPosition chart.TickPosition + theme string + result chart.XAxis + values []float64 + }{ + { + xAxis: XAxis{ + Data: genLabels(5), + }, + values: genValues(5, false), + result: chart.XAxis{ + Ticks: genTicks(5, false), + }, + }, + // 居中 + { + xAxis: XAxis{ + Data: genLabels(5), + }, + tickPosition: chart.TickPositionBetweenTicks, + // 居中因此value多一个 + values: genValues(5, true), + result: chart.XAxis{ + Ticks: genTicks(5, true), + }, + }, + { + xAxis: XAxis{ + Data: genLabels(20), + }, + // 居中因此value多一个 + values: genValues(20, false), + result: chart.XAxis{ + Ticks: []chart.Tick{ + {Value: 0, Label: "0"}, {Value: 2, Label: "2"}, {Value: 4, Label: "4"}, {Value: 6, Label: "6"}, {Value: 8, Label: "8"}, {Value: 10, Label: "10"}, {Value: 12, Label: "12"}, {Value: 14, Label: "14"}, {Value: 16, Label: "16"}, {Value: 18, Label: "18"}, {Value: 19, Label: "19"}}, + }, + }, + } + + for _, tt := range tests { + xAxis, values := GetXAxisAndValues(tt.xAxis, tt.tickPosition, tt.theme) + + assert.Equal(tt.result.Ticks, xAxis.Ticks) + assert.Equal(tt.tickPosition, xAxis.TickPosition) + assert.Equal(tt.values, values) + } +} + +func TestDefaultFloatFormater(t *testing.T) { + assert := assert.New(t) + + assert.Equal("", defaultFloatFormater(1)) + + assert.Equal("0.1", defaultFloatFormater(0.1)) + assert.Equal("0.12", defaultFloatFormater(0.123)) + assert.Equal("10", defaultFloatFormater(10.1)) +} + +func TestSetYAxisOption(t *testing.T) { + assert := assert.New(t) + min := 10.0 + max := 20.0 + opt := &YAxisOption{ + Formater: func(v interface{}) string { + return "" + }, + Min: &min, + Max: &max, + } + yAxis := &chart.YAxis{ + Range: &chart.ContinuousRange{}, + } + setYAxisOption(yAxis, opt) + + assert.NotEmpty(yAxis.ValueFormatter) + assert.Equal(max, yAxis.Range.GetMax()) + assert.Equal(min, yAxis.Range.GetMin()) +} + +func TestGetYAxis(t *testing.T) { + assert := assert.New(t) + + yAxis := GetYAxis(ThemeDark, nil) + + assert.True(yAxis.GridMajorStyle.Hidden) + assert.True(yAxis.GridMajorStyle.Hidden) + assert.False(yAxis.Style.Hidden) + + yAxis = GetYAxis(ThemeDark, &YAxisOption{ + Disabled: true, + }) + + assert.True(yAxis.GridMajorStyle.Hidden) + assert.True(yAxis.GridMajorStyle.Hidden) + assert.True(yAxis.Style.Hidden) + + // secondary yAxis + yAxis = GetSecondaryYAxis(ThemeDark, nil) + assert.False(yAxis.GridMajorStyle.Hidden) + assert.False(yAxis.GridMajorStyle.Hidden) + assert.True(yAxis.Style.StrokeColor.IsZero()) +} diff --git a/echarts.go b/echarts.go index a7ce31b..b0cbe8a 100644 --- a/echarts.go +++ b/echarts.go @@ -262,7 +262,6 @@ func (e *ECharsOptions) ToOptions() Options { if len(e.XAxis.Data) != 0 { xAxis := e.XAxis.Data[0] o.XAxis = XAxis{ - Type: xAxis.Type, Data: xAxis.Data, SplitNumber: xAxis.SplitNumber, } diff --git a/go.mod b/go.mod index 185a2c5..0f43724 100644 --- a/go.mod +++ b/go.mod @@ -4,10 +4,14 @@ go 1.17 require ( github.com/dustin/go-humanize v1.0.0 + github.com/stretchr/testify v1.7.0 github.com/wcharczuk/go-chart/v2 v2.1.0 ) require ( + github.com/davecgh/go-spew v1.1.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect ) diff --git a/go.sum b/go.sum index b3869e0..c0579a4 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,20 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/theme.go b/theme.go index 2c561ad..a86b282 100644 --- a/theme.go +++ b/theme.go @@ -29,7 +29,7 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) -var hiddenColor = drawing.Color{R: 110, G: 112, B: 121, A: 0} +var hiddenColor = drawing.Color{R: 0, G: 0, B: 0, A: 0} var AxisColorLight = drawing.Color{ R: 110, From acc758cb9a3f8e324f0425fe248b37a98d1d0163 Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 20 Dec 2021 23:16:31 +0800 Subject: [PATCH 014/251] test: add test for bar series --- .gitignore | 3 +- bar_series.go | 52 +++++++++----- bar_series_test.go | 165 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+), 18 deletions(-) create mode 100644 bar_series_test.go diff --git a/.gitignore b/.gitignore index cb43a6a..2ac8a25 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,5 @@ # Dependency directories (remove the comment below to include it) # vendor/ -*.png \ No newline at end of file +*.png +*.svg \ No newline at end of file diff --git a/bar_series.go b/bar_series.go index 72f4cb1..b730099 100644 --- a/bar_series.go +++ b/bar_series.go @@ -47,29 +47,26 @@ type BarSeries struct { CustomStyles []BarSeriesCustomStyle } +type barSeriesWidthValues struct { + columnWidth int + columnMargin int + margin int + barWidth int +} + func (bs BarSeries) GetBarStyle(index, pointIndex int) chart.Style { + // 指定样式 for _, item := range bs.CustomStyles { if item.Index == index && item.PointIndex == pointIndex { return item.Style } } + // 其它非指定样式 return chart.Style{} } -func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, defaults chart.Style) { - if bs.Len() == 0 || bs.Count <= 0 { - return - } - style := bs.Style.InheritFrom(defaults) - style.FillColor = style.StrokeColor - if !style.ShouldDrawStroke() { - return - } - - cb := canvasBox.Bottom - cl := canvasBox.Left - - columnWidth := canvasBox.Width() / bs.Len() +func (bs BarSeries) getWidthValues(width int) barSeriesWidthValues { + columnWidth := width / bs.Len() // 块间隔 columnMargin := columnWidth / 10 minColumnMargin := 2 @@ -92,6 +89,27 @@ func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange // 重新计息columnMargin columnMargin = (columnWidth - allBarMarginWidth - (bs.Count * barWidth)) / 2 } + return barSeriesWidthValues{ + columnWidth: columnWidth, + columnMargin: columnMargin, + margin: margin, + barWidth: barWidth, + } +} + +func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, defaults chart.Style) { + if bs.Len() == 0 || bs.Count <= 0 { + return + } + style := bs.Style.InheritFrom(defaults) + style.FillColor = style.StrokeColor + if !style.ShouldDrawStroke() { + return + } + + cb := canvasBox.Bottom + cl := canvasBox.Left + widthValues := bs.getWidthValues(canvasBox.Width()) for i := 0; i < bs.Len(); i++ { vx, vy := bs.GetValues(i) @@ -104,15 +122,15 @@ func (bs BarSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange x := cl + xrange.Translate(vx) // 由于bar是居中展示,因此需要往前移一个显示块 - x += (-columnWidth + columnMargin) + x += (-widthValues.columnWidth + widthValues.columnMargin) // 计算是第几个bar,位置右偏 - x += bs.Index * (margin + barWidth) + x += bs.Index * (widthValues.margin + widthValues.barWidth) y := cb - yrange.Translate(vy) chart.Draw.Box(r, chart.Box{ Left: x, Top: y, - Right: x + barWidth, + Right: x + widthValues.barWidth, Bottom: canvasBox.Bottom - 1, }, cloneStyle) } diff --git a/bar_series_test.go b/bar_series_test.go new file mode 100644 index 0000000..6343c06 --- /dev/null +++ b/bar_series_test.go @@ -0,0 +1,165 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestBarSeries(t *testing.T) { + assert := assert.New(t) + + customStyle := chart.Style{ + StrokeColor: drawing.ColorBlue, + } + bs := BarSeries{ + CustomStyles: []BarSeriesCustomStyle{ + { + PointIndex: 1, + Style: customStyle, + }, + }, + } + + assert.Equal(customStyle, bs.GetBarStyle(0, 1)) + + assert.True(bs.GetBarStyle(1, 0).IsZero()) +} + +func TestBarSeriesGetWidthValues(t *testing.T) { + assert := assert.New(t) + + bs := BarSeries{ + Count: 1, + BaseSeries: BaseSeries{ + XValues: []float64{ + 1, + 2, + 3, + }, + }, + } + widthValues := bs.getWidthValues(300) + assert.Equal(barSeriesWidthValues{ + columnWidth: 100, + columnMargin: 10, + margin: 10, + barWidth: 80, + }, widthValues) + + bs.Margin = 5 + widthValues = bs.getWidthValues(300) + assert.Equal(barSeriesWidthValues{ + columnWidth: 100, + columnMargin: 10, + margin: 5, + barWidth: 80, + }, widthValues) + + bs.BarWidth = 60 + widthValues = bs.getWidthValues(300) + assert.Equal(barSeriesWidthValues{ + columnWidth: 100, + columnMargin: 20, + margin: 5, + barWidth: 60, + }, widthValues) + +} + +func TestBarSeriesRender(t *testing.T) { + assert := assert.New(t) + + width := 800 + height := 400 + + r, err := chart.SVG(width, height) + assert.Nil(err) + + bs := BarSeries{ + Count: 1, + CustomStyles: []BarSeriesCustomStyle{ + { + Index: 0, + PointIndex: 1, + Style: chart.Style{ + StrokeColor: SeriesColorsLight[1], + }, + }, + }, + BaseSeries: BaseSeries{ + TickPosition: chart.TickPositionBetweenTicks, + Style: chart.Style{ + StrokeColor: SeriesColorsLight[0], + StrokeWidth: 1, + }, + XValues: []float64{ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + }, + YValues: []float64{ + // 第一个点为占位点 + 0, + 120, + 200, + 150, + 80, + 70, + 110, + 130, + }, + }, + } + xrange := &chart.ContinuousRange{ + Min: 0, + Max: 7, + Domain: 753, + } + yrange := &chart.ContinuousRange{ + Min: 70, + Max: 200, + Domain: 362, + } + bs.Render(r, chart.Box{ + Top: 11, + Left: 42, + Right: 795, + Bottom: 373, + }, xrange, yrange, chart.Style{}) + + buffer := bytes.Buffer{} + err = r.Save(&buffer) + assert.Nil(err) + assert.Equal("\\n", buffer.String()) +} From a128a2513c2296802f943b2920da410a32abe381 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 21 Dec 2021 23:43:36 +0800 Subject: [PATCH 015/251] test: add series and legend test --- bar_series_test.go | 3 +- base_series.go | 54 ++++++++--------- base_series_test.go | 94 +++++++++++++++++++++++++++++ charts.go | 111 ++++++++++++++++++++-------------- charts_test.go | 143 ++++++++++++++++++++++++++++++++++++++++++++ legend.go | 8 +-- legend_test.go | 62 +++++++++++++++++++ 7 files changed, 398 insertions(+), 77 deletions(-) create mode 100644 base_series_test.go create mode 100644 charts_test.go create mode 100644 legend_test.go diff --git a/bar_series_test.go b/bar_series_test.go index 6343c06..8703367 100644 --- a/bar_series_test.go +++ b/bar_series_test.go @@ -72,6 +72,7 @@ func TestBarSeriesGetWidthValues(t *testing.T) { barWidth: 80, }, widthValues) + // 指定margin bs.Margin = 5 widthValues = bs.getWidthValues(300) assert.Equal(barSeriesWidthValues{ @@ -81,6 +82,7 @@ func TestBarSeriesGetWidthValues(t *testing.T) { barWidth: 80, }, widthValues) + // 指定bar的宽度 bs.BarWidth = 60 widthValues = bs.getWidthValues(300) assert.Equal(barSeriesWidthValues{ @@ -89,7 +91,6 @@ func TestBarSeriesGetWidthValues(t *testing.T) { margin: 5, barWidth: 60, }, widthValues) - } func TestBarSeriesRender(t *testing.T) { diff --git a/base_series.go b/base_series.go index ac49d21..e17b4b9 100644 --- a/base_series.go +++ b/base_series.go @@ -51,55 +51,55 @@ type BaseSeries struct { } // GetName returns the name of the time series. -func (cs BaseSeries) GetName() string { - return cs.Name +func (bs BaseSeries) GetName() string { + return bs.Name } // GetStyle returns the line style. -func (cs BaseSeries) GetStyle() chart.Style { - return cs.Style +func (bs BaseSeries) GetStyle() chart.Style { + return bs.Style } // Len returns the number of elements in the series. -func (cs BaseSeries) Len() int { +func (bs BaseSeries) Len() int { offset := 0 - if cs.TickPosition == chart.TickPositionBetweenTicks { + if bs.TickPosition == chart.TickPositionBetweenTicks { offset = -1 } - return len(cs.XValues) + offset + return len(bs.XValues) + offset } // GetValues gets the x,y values at a given index. -func (cs BaseSeries) GetValues(index int) (float64, float64) { - if cs.TickPosition == chart.TickPositionBetweenTicks { +func (bs BaseSeries) GetValues(index int) (float64, float64) { + if bs.TickPosition == chart.TickPositionBetweenTicks { index++ } - return cs.XValues[index], cs.YValues[index] + return bs.XValues[index], bs.YValues[index] } // GetFirstValues gets the first x,y values. -func (cs BaseSeries) GetFirstValues() (float64, float64) { +func (bs BaseSeries) GetFirstValues() (float64, float64) { index := 0 - if cs.TickPosition == chart.TickPositionBetweenTicks { + if bs.TickPosition == chart.TickPositionBetweenTicks { index++ } - return cs.XValues[index], cs.YValues[index] + return bs.XValues[index], bs.YValues[index] } // GetLastValues gets the last x,y values. -func (cs BaseSeries) GetLastValues() (float64, float64) { - return cs.XValues[len(cs.XValues)-1], cs.YValues[len(cs.YValues)-1] +func (bs BaseSeries) GetLastValues() (float64, float64) { + return bs.XValues[len(bs.XValues)-1], bs.YValues[len(bs.YValues)-1] } // GetValueFormatters returns value formatter defaults for the series. -func (cs BaseSeries) GetValueFormatters() (x, y chart.ValueFormatter) { - if cs.XValueFormatter != nil { - x = cs.XValueFormatter +func (bs BaseSeries) GetValueFormatters() (x, y chart.ValueFormatter) { + if bs.XValueFormatter != nil { + x = bs.XValueFormatter } else { x = chart.FloatValueFormatter } - if cs.YValueFormatter != nil { - y = cs.YValueFormatter + if bs.YValueFormatter != nil { + y = bs.YValueFormatter } else { y = chart.FloatValueFormatter } @@ -107,26 +107,26 @@ func (cs BaseSeries) GetValueFormatters() (x, y chart.ValueFormatter) { } // GetYAxis returns which YAxis the series draws on. -func (cs BaseSeries) GetYAxis() chart.YAxisType { - return cs.YAxis +func (bs BaseSeries) GetYAxis() chart.YAxisType { + return bs.YAxis } // Render renders the series. -func (cs BaseSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, defaults chart.Style) { +func (bs BaseSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, defaults chart.Style) { fmt.Println("should be override the function") } // Validate validates the series. -func (cs BaseSeries) Validate() error { - if len(cs.XValues) == 0 { +func (bs BaseSeries) Validate() error { + if len(bs.XValues) == 0 { return fmt.Errorf("continuous series; must have xvalues set") } - if len(cs.YValues) == 0 { + if len(bs.YValues) == 0 { return fmt.Errorf("continuous series; must have yvalues set") } - if len(cs.XValues) != len(cs.YValues) { + if len(bs.XValues) != len(bs.YValues) { return fmt.Errorf("continuous series; must have same length xvalues as yvalues") } return nil diff --git a/base_series_test.go b/base_series_test.go new file mode 100644 index 0000000..0c9b5d1 --- /dev/null +++ b/base_series_test.go @@ -0,0 +1,94 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "reflect" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestBaseSeries(t *testing.T) { + assert := assert.New(t) + + bs := BaseSeries{ + XValues: []float64{ + 1, + 2, + 3, + }, + YValues: []float64{ + 10, + 20, + 30, + }, + } + assert.Equal(3, bs.Len()) + bs.TickPosition = chart.TickPositionBetweenTicks + assert.Equal(2, bs.Len()) + + bs.TickPosition = chart.TickPositionUnset + x, y := bs.GetValues(1) + assert.Equal(float64(2), x) + assert.Equal(float64(20), y) + bs.TickPosition = chart.TickPositionBetweenTicks + x, y = bs.GetValues(1) + assert.Equal(float64(3), x) + assert.Equal(float64(30), y) + + bs.TickPosition = chart.TickPositionUnset + x, y = bs.GetFirstValues() + assert.Equal(float64(1), x) + assert.Equal(float64(10), y) + bs.TickPosition = chart.TickPositionBetweenTicks + x, y = bs.GetFirstValues() + assert.Equal(float64(2), x) + assert.Equal(float64(20), y) + + bs.TickPosition = chart.TickPositionUnset + x, y = bs.GetLastValues() + assert.Equal(float64(3), x) + assert.Equal(float64(30), y) + bs.TickPosition = chart.TickPositionBetweenTicks + x, y = bs.GetLastValues() + assert.Equal(float64(3), x) + assert.Equal(float64(30), y) + + xFormater, yFormater := bs.GetValueFormatters() + assert.Equal(reflect.ValueOf(chart.FloatValueFormatter).Pointer(), reflect.ValueOf(xFormater).Pointer()) + assert.Equal(reflect.ValueOf(chart.FloatValueFormatter).Pointer(), reflect.ValueOf(yFormater).Pointer()) + formater := func(v interface{}) string { + return "" + } + bs.XValueFormatter = formater + bs.YValueFormatter = formater + xFormater, yFormater = bs.GetValueFormatters() + assert.Equal(reflect.ValueOf(formater).Pointer(), reflect.ValueOf(xFormater).Pointer()) + assert.Equal(reflect.ValueOf(formater).Pointer(), reflect.ValueOf(yFormater).Pointer()) + + assert.Equal(chart.YAxisPrimary, bs.GetYAxis()) + + assert.Nil(bs.Validate()) +} diff --git a/charts.go b/charts.go index 1657e6d..cdc4b76 100644 --- a/charts.go +++ b/charts.go @@ -70,10 +70,10 @@ type Graph interface { } func (o *Options) validate() error { - xAxisCount := len(o.XAxis.Data) if len(o.Series) == 0 { return errors.New("series can not be empty") } + xAxisCount := len(o.XAxis.Data) for _, item := range o.Series { if item.Type != SeriesPie && len(item.Data) != xAxisCount { @@ -83,6 +83,29 @@ func (o *Options) validate() error { return nil } +func (o *Options) getWidth() int { + width := o.Width + if width <= 0 { + width = DefaultChartWidth + } + return width +} + +func (o *Options) getHeight() int { + height := o.Height + if height <= 0 { + height = DefaultChartHeight + } + return height +} + +func (o *Options) getBackground() chart.Style { + bg := chart.Style{ + Padding: o.Padding, + } + return bg +} + func render(g Graph, rp chart.RendererProvider) ([]byte, error) { buf := bytes.Buffer{} err := g.Render(rp, &buf) @@ -99,46 +122,32 @@ func ToPNG(g Graph) ([]byte, error) { func ToSVG(g Graph) ([]byte, error) { return render(g, chart.SVG) } -func New(opt Options) (Graph, error) { - err := opt.validate() - if err != nil { - return nil, err - } - tickPosition := opt.TickPosition - width := opt.Width - if width <= 0 { - width = DefaultChartWidth - } - height := opt.Height - if height <= 0 { - height = DefaultChartHeight - } - bg := chart.Style{ - Padding: opt.Padding, - } - if opt.Series[0].Type == SeriesPie { - values := make(chart.Values, len(opt.Series)) - for index, item := range opt.Series { - values[index] = chart.Value{ - Value: item.Data[0].Value, - Label: item.Name, - } + +func newPieChart(opt Options) *chart.PieChart { + values := make(chart.Values, len(opt.Series)) + for index, item := range opt.Series { + values[index] = chart.Value{ + Value: item.Data[0].Value, + Label: item.Name, } - g := &chart.PieChart{ - Background: bg, - Title: opt.Title.Text, - TitleStyle: opt.Title.Style, - Width: width, - Height: height, - Values: values, - ColorPalette: &PieThemeColorPalette{ - ThemeColorPalette: ThemeColorPalette{ - Theme: opt.Theme, - }, + } + return &chart.PieChart{ + Background: opt.getBackground(), + Title: opt.Title.Text, + TitleStyle: opt.Title.Style, + Width: opt.getWidth(), + Height: opt.getHeight(), + Values: values, + ColorPalette: &PieThemeColorPalette{ + ThemeColorPalette: ThemeColorPalette{ + Theme: opt.Theme, }, - } - return g, nil + }, } +} + +func newChart(opt Options) *chart.Chart { + tickPosition := opt.TickPosition xAxis, xValues := GetXAxisAndValues(opt.XAxis, tickPosition, opt.Theme) @@ -164,16 +173,16 @@ func New(opt Options) (Graph, error) { yAxisOption = opt.YAxisOptions[1] } - g := &chart.Chart{ + c := &chart.Chart{ Log: opt.Log, - Background: bg, + Background: opt.getBackground(), ColorPalette: &ThemeColorPalette{ Theme: opt.Theme, }, Title: opt.Title.Text, TitleStyle: opt.Title.Style, - Width: width, - Height: height, + Width: opt.getWidth(), + Height: opt.getHeight(), XAxis: xAxis, YAxis: GetYAxis(opt.Theme, yAxisOption), YAxisSecondary: GetSecondaryYAxis(opt.Theme, secondaryYAxisOption), @@ -182,8 +191,8 @@ func New(opt Options) (Graph, error) { // 设置secondary的样式 if legendSize != 0 { - g.Elements = []chart.Renderable{ - LegendCustomize(g, LegendOption{ + c.Elements = []chart.Renderable{ + LegendCustomize(c.Series, LegendOption{ Theme: opt.Theme, TextPosition: LegendTextPositionRight, IconDraw: DefaultLegendIconDraw, @@ -192,5 +201,17 @@ func New(opt Options) (Graph, error) { }), } } - return g, nil + return c +} + +func New(opt Options) (Graph, error) { + err := opt.validate() + if err != nil { + return nil, err + } + if opt.Series[0].Type == SeriesPie { + return newPieChart(opt), nil + } + + return newChart(opt), nil } diff --git a/charts_test.go b/charts_test.go new file mode 100644 index 0000000..3173868 --- /dev/null +++ b/charts_test.go @@ -0,0 +1,143 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestChartsOptions(t *testing.T) { + assert := assert.New(t) + + o := Options{} + + assert.Equal(errors.New("series can not be empty"), o.validate()) + + o.Series = []Series{ + { + Data: []SeriesData{ + { + Value: 1, + }, + }, + }, + } + assert.Equal(errors.New("series and xAxis is not matched"), o.validate()) + o.XAxis.Data = []string{ + "1", + } + assert.Nil(o.validate()) + + assert.Equal(DefaultChartWidth, o.getWidth()) + o.Width = 10 + assert.Equal(10, o.getWidth()) + + assert.Equal(DefaultChartHeight, o.getHeight()) + o.Height = 10 + assert.Equal(10, o.getHeight()) + + padding := chart.NewBox(10, 10, 10, 10) + o.Padding = padding + assert.Equal(padding, o.getBackground().Padding) +} + +func TestNewPieChart(t *testing.T) { + assert := assert.New(t) + + data := []Series{ + { + Data: []SeriesData{ + { + Value: 10, + }, + }, + Name: "chrome", + }, + { + Data: []SeriesData{ + { + Value: 2, + }, + }, + Name: "edge", + }, + } + pie := newPieChart(Options{ + Series: data, + }) + for index, item := range pie.Values { + assert.Equal(data[index].Name, item.Label) + assert.Equal(data[index].Data[0].Value, item.Value) + } +} + +func TestNewChart(t *testing.T) { + assert := assert.New(t) + + data := []Series{ + { + Data: []SeriesData{ + { + Value: 10, + }, + { + Value: 20, + }, + }, + Name: "chrome", + }, + { + Data: []SeriesData{ + { + Value: 2, + }, + { + Value: 3, + }, + }, + Name: "edge", + }, + } + + c := newChart(Options{ + Series: data, + }) + assert.Empty(c.Elements) + for index, series := range c.Series { + assert.Equal(data[index].Name, series.GetName()) + } + + c = newChart(Options{ + Legend: Legend{ + Data: []string{ + "chrome", + "edge", + }, + }, + }) + assert.Equal(1, len(c.Elements)) +} diff --git a/legend.go b/legend.go index a9f73d1..b519e3e 100644 --- a/legend.go +++ b/legend.go @@ -59,8 +59,8 @@ func DefaultLegendIconDraw(r chart.Renderer, opt LegendIconDrawOption) { return } r.SetStrokeColor(opt.Style.GetStrokeColor()) - stokeWidth := opt.Style.GetStrokeWidth() - r.SetStrokeWidth(stokeWidth) + strokeWidth := opt.Style.GetStrokeWidth() + r.SetStrokeWidth(strokeWidth) height := opt.Box.Bottom - opt.Box.Top ly := opt.Box.Top - (height / 2) + 2 r.MoveTo(opt.Box.Left, ly) @@ -71,7 +71,7 @@ func DefaultLegendIconDraw(r chart.Renderer, opt LegendIconDrawOption) { r.FillStroke() } -func LegendCustomize(c *chart.Chart, opt LegendOption) chart.Renderable { +func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { return func(r chart.Renderer, cb chart.Box, chartDefaults chart.Style) { legendDefaults := chart.Style{ FontColor: getTextColor(opt.Theme), @@ -87,7 +87,7 @@ func LegendCustomize(c *chart.Chart, opt LegendOption) chart.Renderable { var labels []string var lines []chart.Style - for _, s := range c.Series { + for _, s := range series { if !s.GetStyle().Hidden { if _, isAnnotationSeries := s.(chart.AnnotationSeries); !isAnnotationSeries { labels = append(labels, s.GetName()) diff --git a/legend_test.go b/legend_test.go new file mode 100644 index 0000000..6685243 --- /dev/null +++ b/legend_test.go @@ -0,0 +1,62 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestLegendCustomize(t *testing.T) { + assert := assert.New(t) + + series := GetSeries([]Series{ + { + Name: "chrome", + }, + { + Name: "edge", + }, + }, chart.TickPositionBetweenTicks, "") + r, err := chart.SVG(800, 600) + assert.Nil(err) + fn := LegendCustomize(series, LegendOption{ + TextPosition: LegendTextPositionRight, + IconDraw: DefaultLegendIconDraw, + Align: LegendAlignLeft, + Padding: chart.Box{ + Left: 100, + Top: 100, + }, + }) + fn(r, chart.NewBox(11, 47, 784, 373), chart.Style{ + Font: chart.StyleTextDefaults().Font, + }) + buf := bytes.Buffer{} + err = r.Save(&buf) + assert.Nil(err) + assert.Equal("\\nchromeedge", buf.String()) +} From c289ba7cde228605acb7bf8029564d9e62c12f81 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 23 Dec 2021 23:20:20 +0800 Subject: [PATCH 016/251] test: add test for legend, series and theme --- echarts.go | 11 +- echarts_test.go | 381 ++++++++++++++++++++++++++++++++++++++++++++ legend.go | 2 + legend_test.go | 51 ++++-- line_series.go | 17 +- line_series_test.go | 46 ++++++ range_test.go | 54 +++++++ series.go | 1 - series_test.go | 125 +++++++++++++++ theme.go | 61 +++++-- theme_test.go | 122 ++++++++++++++ 11 files changed, 828 insertions(+), 43 deletions(-) create mode 100644 echarts_test.go create mode 100644 line_series_test.go create mode 100644 range_test.go create mode 100644 series_test.go create mode 100644 theme_test.go diff --git a/echarts.go b/echarts.go index b0cbe8a..02cede2 100644 --- a/echarts.go +++ b/echarts.go @@ -112,12 +112,15 @@ func (ep *EChartsPadding) UnmarshalJSON(data []byte) error { default: result := make([]int, 4) copy(result, arr) + if len(arr) == 3 { + result[3] = result[1] + } // 上右下左 ep.box = chart.Box{ - Top: arr[0], - Right: arr[1], - Bottom: arr[2], - Left: arr[3], + Top: result[0], + Right: result[1], + Bottom: result[2], + Left: result[3], } } return nil diff --git a/echarts_test.go b/echarts_test.go new file mode 100644 index 0000000..99bf414 --- /dev/null +++ b/echarts_test.go @@ -0,0 +1,381 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestConvertToArray(t *testing.T) { + assert := assert.New(t) + + assert.Nil(convertToArray([]byte(" "))) + + assert.Equal([]byte("[{}]"), convertToArray([]byte("{}"))) + assert.Equal([]byte("[{}]"), convertToArray([]byte("[{}]"))) +} + +func TestECharsSeriesData(t *testing.T) { + assert := assert.New(t) + + es := ECharsSeriesData{} + err := es.UnmarshalJSON([]byte(" ")) + assert.Nil(err) + assert.Equal(ECharsSeriesData{}, es) + + es = ECharsSeriesData{} + err = es.UnmarshalJSON([]byte("12.1")) + assert.Nil(err) + assert.Equal(ECharsSeriesData{ + Value: 12.1, + }, es) + + es = ECharsSeriesData{} + err = es.UnmarshalJSON([]byte(`{ + "value": 12.1, + "name": "test", + "itemStyle": { + "color": "#333" + } + }`)) + assert.Nil(err) + assert.Equal(ECharsSeriesData{ + Value: 12.1, + Name: "test", + ItemStyle: EChartStyle{ + Color: "#333", + }, + }, es) +} + +func TestEChartsPadding(t *testing.T) { + assert := assert.New(t) + + ep := EChartsPadding{} + err := ep.UnmarshalJSON([]byte(" ")) + assert.Nil(err) + assert.Equal(EChartsPadding{}, ep) + + ep = EChartsPadding{} + err = ep.UnmarshalJSON([]byte("1")) + assert.Nil(err) + assert.Equal(EChartsPadding{ + box: chart.Box{ + Top: 1, + Left: 1, + Right: 1, + Bottom: 1, + }, + }, ep) + + ep = EChartsPadding{} + err = ep.UnmarshalJSON([]byte("[1, 2]")) + assert.Nil(err) + assert.Equal(EChartsPadding{ + box: chart.Box{ + Top: 1, + Left: 2, + Right: 2, + Bottom: 1, + }, + }, ep) + + ep = EChartsPadding{} + err = ep.UnmarshalJSON([]byte("[1, 2, 3]")) + assert.Nil(err) + assert.Equal(EChartsPadding{ + box: chart.Box{ + Top: 1, + Right: 2, + Bottom: 3, + Left: 2, + }, + }, ep) + + ep = EChartsPadding{} + err = ep.UnmarshalJSON([]byte("[1, 2, 3, 4]")) + assert.Nil(err) + assert.Equal(EChartsPadding{ + box: chart.Box{ + Top: 1, + Right: 2, + Bottom: 3, + Left: 4, + }, + }, ep) +} + +func TestConvertEChartsSeries(t *testing.T) { + assert := assert.New(t) + + seriesList, tickPosition := convertEChartsSeries(&ECharsOptions{}) + assert.Empty(seriesList) + assert.Equal(chart.TickPositionUnset, tickPosition) + + e := ECharsOptions{} + err := json.Unmarshal([]byte(`{ + "title": { + "text": "Referer of a Website" + }, + "series": [ + { + "name": "Access From", + "type": "pie", + "radius": "50%", + "data": [ + { + "value": 1048, + "name": "Search Engine" + }, + { + "value": 735, + "name": "Direct" + } + ] + } + ] + }`), &e) + assert.Nil(err) + seriesList, tickPosition = convertEChartsSeries(&e) + assert.Equal(chart.TickPositionUnset, tickPosition) + assert.Equal([]Series{ + { + Data: []SeriesData{ + { + Value: 1048, + }, + }, + Type: SeriesPie, + Name: "Search Engine", + }, + { + Data: []SeriesData{ + { + Value: 735, + }, + }, + Type: SeriesPie, + Name: "Direct", + }, + }, seriesList) + + err = json.Unmarshal([]byte(`{ + "series": [ + { + "name": "Evaporation", + "type": "bar", + "data": [2, { + "value": 4.9, + "itemStyle": { + "color": "#a90000" + } + }, 7, 23.2, 25.6, 76.7, 135.6] + }, + { + "name": "Precipitation", + "type": "bar", + "data": [2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6] + }, + { + "name": "Temperature", + "type": "line", + "yAxisIndex": 1, + "data": [2, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3] + } + ] + }`), &e) + assert.Nil(err) + bar1Data := NewSeriesDataListFromFloat([]float64{ + 2, 4.9, 7, 23.2, 25.6, 76.7, 135.6, + }) + bar1Data[1].Style.FillColor = parseColor("#a90000") + bar1Data[1].Style.StrokeColor = bar1Data[1].Style.FillColor + + seriesList, tickPosition = convertEChartsSeries(&e) + assert.Equal(chart.TickPositionBetweenTicks, tickPosition) + assert.Equal([]Series{ + { + Data: bar1Data, + Type: SeriesBar, + }, + { + Data: NewSeriesDataListFromFloat([]float64{ + 2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6, + }), + Type: SeriesBar, + }, + { + Data: NewSeriesDataListFromFloat([]float64{ + 2, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, + }), + Type: SeriesLine, + YAxisIndex: 1, + }, + }, seriesList) + +} + +func TestParseECharsOptions(t *testing.T) { + + assert := assert.New(t) + options, err := ParseECharsOptions(`{ + "theme": "dark", + "padding": [5, 10], + "title": { + "text": "Multi Line", + "textAlign": "left", + "textStyle": { + "color": "#333", + "fontSize": 24, + "height": 40 + } + }, + "legend": { + "align": "left", + "padding": [5, 0, 0, 50], + "data": ["Email", "Union Ads", "Video Ads", "Direct", "Search Engine"] + }, + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], + "splitNumber": 10 + }, + "yAxis": [ + { + "min": 0, + "max": 250 + }, + { + "min": 0, + "max": 25 + } + ], + "series": [ + { + "name": "Evaporation", + "type": "bar", + "data": [2, { + "value": 4.9, + "itemStyle": { + "color": "#a90000" + } + }, 7, 23.2, 25.6, 76.7, 135.6] + }, + { + "name": "Precipitation", + "type": "bar", + "data": [2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6] + }, + { + "name": "Temperature", + "type": "line", + "yAxisIndex": 1, + "data": [2, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3] + } + ] + }`) + + assert.Nil(err) + + min1 := float64(0) + max1 := float64(250) + min2 := float64(0) + max2 := float64(25) + + bar1Data := NewSeriesDataListFromFloat([]float64{ + 2, 4.9, 7, 23.2, 25.6, 76.7, 135.6, + }) + bar1Data[1].Style.FillColor = parseColor("#a90000") + bar1Data[1].Style.StrokeColor = bar1Data[1].Style.FillColor + + assert.Equal(Options{ + Theme: ThemeDark, + Padding: chart.Box{ + Top: 5, + Bottom: 5, + Left: 10, + Right: 10, + }, + Title: Title{ + Text: "Multi Line", + Style: chart.Style{ + FontColor: parseColor("#333"), + FontSize: 24, + Padding: chart.Box{ + Top: 8, + Bottom: 8, + }, + }, + }, + Legend: Legend{ + Data: []string{ + "Email", "Union Ads", "Video Ads", "Direct", "Search Engine", + }, + Align: "left", + Padding: chart.Box{ + Top: 5, + Right: 0, + Bottom: 0, + Left: 50, + }, + }, + XAxis: XAxis{ + Data: []string{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}, + SplitNumber: 10, + }, + TickPosition: chart.TickPositionBetweenTicks, + YAxisOptions: []*YAxisOption{ + { + Min: &min1, + Max: &max1, + }, + { + Min: &min2, + Max: &max2, + }, + }, + Series: []Series{ + { + Data: bar1Data, + Type: SeriesBar, + }, + { + Data: NewSeriesDataListFromFloat([]float64{ + 2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6, + }), + Type: SeriesBar, + }, + { + Data: NewSeriesDataListFromFloat([]float64{ + 2, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, + }), + Type: SeriesLine, + YAxisIndex: 1, + }, + }, + }, options) +} diff --git a/legend.go b/legend.go index b519e3e..b019868 100644 --- a/legend.go +++ b/legend.go @@ -87,6 +87,7 @@ func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { var labels []string var lines []chart.Style + // 计算label和lines for _, s := range series { if !s.GetStyle().Hidden { if _, isAnnotationSeries := s.(chart.AnnotationSeries); !isAnnotationSeries { @@ -100,6 +101,7 @@ func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { var textWidth int var textBox chart.Box labelWidth := 0 + // 计算文本宽度与高度(取最大值) for x := 0; x < len(labels); x++ { if len(labels[x]) > 0 { textBox = r.MeasureText(labels[x]) diff --git a/legend_test.go b/legend_test.go index 6685243..d2af129 100644 --- a/legend_test.go +++ b/legend_test.go @@ -41,22 +41,39 @@ func TestLegendCustomize(t *testing.T) { Name: "edge", }, }, chart.TickPositionBetweenTicks, "") - r, err := chart.SVG(800, 600) - assert.Nil(err) - fn := LegendCustomize(series, LegendOption{ - TextPosition: LegendTextPositionRight, - IconDraw: DefaultLegendIconDraw, - Align: LegendAlignLeft, - Padding: chart.Box{ - Left: 100, - Top: 100, + + tests := []struct { + textPosition string + svg string + }{ + { + textPosition: LegendTextPositionRight, + svg: "\\nchromeedge", }, - }) - fn(r, chart.NewBox(11, 47, 784, 373), chart.Style{ - Font: chart.StyleTextDefaults().Font, - }) - buf := bytes.Buffer{} - err = r.Save(&buf) - assert.Nil(err) - assert.Equal("\\nchromeedge", buf.String()) + { + textPosition: LegendAlignLeft, + svg: "\\nchromeedge", + }, + } + + for _, tt := range tests { + r, err := chart.SVG(800, 600) + assert.Nil(err) + fn := LegendCustomize(series, LegendOption{ + TextPosition: tt.textPosition, + IconDraw: DefaultLegendIconDraw, + Align: LegendAlignLeft, + Padding: chart.Box{ + Left: 100, + Top: 100, + }, + }) + fn(r, chart.NewBox(11, 47, 784, 373), chart.Style{ + Font: chart.StyleTextDefaults().Font, + }) + buf := bytes.Buffer{} + err = r.Save(&buf) + assert.Nil(err) + assert.Equal(tt.svg, buf.String()) + } } diff --git a/line_series.go b/line_series.go index 5b7c9fd..f3686ad 100644 --- a/line_series.go +++ b/line_series.go @@ -30,11 +30,16 @@ type LineSeries struct { BaseSeries } -func (bs LineSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, defaults chart.Style) { - style := bs.Style.InheritFrom(defaults) - // 如果是居中,画线时重新调整 - if bs.TickPosition == chart.TickPositionBetweenTicks { - xrange = wrapRange(xrange, bs.TickPosition) +func (ls LineSeries) getXRange(xrange chart.Range) chart.Range { + if ls.TickPosition != chart.TickPositionBetweenTicks { + return xrange } - chart.Draw.LineSeries(r, canvasBox, xrange, yrange, style, bs) + // 如果是居中,画线时重新调整 + return wrapRange(xrange, ls.TickPosition) +} + +func (ls LineSeries) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, defaults chart.Style) { + style := ls.Style.InheritFrom(defaults) + xrange = ls.getXRange(xrange) + chart.Draw.LineSeries(r, canvasBox, xrange, yrange, style, ls) } diff --git a/line_series_test.go b/line_series_test.go new file mode 100644 index 0000000..27c9371 --- /dev/null +++ b/line_series_test.go @@ -0,0 +1,46 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestLineSeries(t *testing.T) { + assert := assert.New(t) + + ls := LineSeries{} + + originalRange := &chart.ContinuousRange{} + xrange := ls.getXRange(originalRange) + assert.Equal(originalRange, xrange) + + ls.TickPosition = chart.TickPositionBetweenTicks + xrange = ls.getXRange(originalRange) + value, ok := xrange.(*Range) + assert.True(ok) + assert.Equal(originalRange, &value.ContinuousRange) +} diff --git a/range_test.go b/range_test.go new file mode 100644 index 0000000..3e80568 --- /dev/null +++ b/range_test.go @@ -0,0 +1,54 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestRange(t *testing.T) { + assert := assert.New(t) + + r := Range{ + ContinuousRange: chart.ContinuousRange{ + Min: 0, + Max: 5, + Domain: 500, + }, + } + + assert.Equal(100, r.Translate(1)) + + r.TickPosition = chart.TickPositionBetweenTicks + assert.Equal(50, r.Translate(1)) +} + +func TestHiddenRange(t *testing.T) { + assert := assert.New(t) + r := HiddenRange{} + + assert.Equal(float64(0), r.GetDelta()) +} diff --git a/series.go b/series.go index 67d8c4d..37e6c71 100644 --- a/series.go +++ b/series.go @@ -108,7 +108,6 @@ func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) [ if item.YAxisIndex != 0 { baseSeries.YAxis = chart.YAxisPrimary } - // TODO 判断类型 switch item.Type { case SeriesBar: arr[index] = BarSeries{ diff --git a/series_test.go b/series_test.go new file mode 100644 index 0000000..5016aab --- /dev/null +++ b/series_test.go @@ -0,0 +1,125 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestNewSeriesDataListFromFloat(t *testing.T) { + assert := assert.New(t) + + assert.Equal([]SeriesData{ + { + Value: 1, + }, + { + Value: 2, + }, + }, NewSeriesDataListFromFloat([]float64{ + 1, + 2, + })) +} + +func TestGetSeries(t *testing.T) { + assert := assert.New(t) + + xValues := []float64{ + 1, + 2, + 3, + 4, + 5, + } + + barData := NewSeriesDataListFromFloat([]float64{ + 10, + 20, + 30, + 40, + 50, + }) + barData[1].Style = chart.Style{ + FillColor: AxisColorDark, + } + seriesList := GetSeries([]Series{ + { + Type: SeriesBar, + Data: barData, + XValues: xValues, + YAxisIndex: 1, + }, + { + Data: NewSeriesDataListFromFloat([]float64{ + 11, + 21, + 31, + 41, + 51, + }), + XValues: xValues, + }, + }, chart.TickPositionBetweenTicks, "") + + assert.Equal(seriesList[0].GetYAxis(), chart.YAxisPrimary) + assert.Equal(seriesList[1].GetYAxis(), chart.YAxisSecondary) + + barSeries, ok := seriesList[0].(BarSeries) + assert.True(ok) + // 居中前置多插入一个点 + assert.Equal([]float64{ + 0, + 10, + 20, + 30, + 40, + 50, + }, barSeries.YValues) + assert.Equal(xValues, barSeries.XValues) + assert.Equal(1, barSeries.Count) + assert.Equal(0, barSeries.Index) + assert.Equal([]BarSeriesCustomStyle{ + { + PointIndex: 1, + Index: 0, + Style: barData[1].Style, + }, + }, barSeries.CustomStyles) + + lineSeries, ok := seriesList[1].(LineSeries) + assert.True(ok) + // 居中前置多插入一个点 + assert.Equal([]float64{ + 0, + 11, + 21, + 31, + 41, + 51, + }, lineSeries.YValues) + assert.Equal(xValues, lineSeries.XValues) +} diff --git a/theme.go b/theme.go index a86b282..051e099 100644 --- a/theme.go +++ b/theme.go @@ -23,6 +23,8 @@ package charts import ( + "regexp" + "strconv" "strings" "github.com/wcharczuk/go-chart/v2" @@ -44,6 +46,20 @@ var AxisColorDark = drawing.Color{ A: 255, } +var GridColorDark = drawing.Color{ + R: 72, + G: 71, + B: 83, + A: 255, +} + +var GridColorLight = drawing.Color{ + R: 224, + G: 230, + B: 241, + A: 255, +} + var BackgroundColorDark = drawing.Color{ R: 16, G: 12, @@ -67,19 +83,9 @@ func getAxisColor(theme string) drawing.Color { func getGridColor(theme string) drawing.Color { if theme == ThemeDark { - return drawing.Color{ - R: 72, - G: 71, - B: 83, - A: 255, - } - } - return drawing.Color{ - R: 224, - G: 230, - B: 241, - A: 255, + return GridColorDark } + return GridColorLight } var SeriesColorsLight = []drawing.Color{ @@ -180,12 +186,37 @@ func getSeriesColor(theme string, index int) drawing.Color { } func parseColor(color string) drawing.Color { + c := drawing.Color{} if color == "" { - return drawing.Color{} + return c } if strings.HasPrefix(color, "#") { return drawing.ColorFromHex(color[1:]) } - // TODO rgba - return drawing.Color{} + reg := regexp.MustCompile(`\((\S+)\)`) + result := reg.FindAllStringSubmatch(color, 1) + if len(result) == 0 || len(result[0]) != 2 { + return c + } + arr := strings.Split(result[0][1], ",") + if len(arr) < 3 { + return c + } + // 设置默认为255 + c.A = 255 + for index, v := range arr { + value, _ := strconv.Atoi(strings.TrimSpace(v)) + ui8 := uint8(value) + switch index { + case 0: + c.R = ui8 + case 1: + c.G = ui8 + case 2: + c.B = ui8 + default: + c.A = ui8 + } + } + return c } diff --git a/theme_test.go b/theme_test.go new file mode 100644 index 0000000..a25a2db --- /dev/null +++ b/theme_test.go @@ -0,0 +1,122 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestThemeColors(t *testing.T) { + assert := assert.New(t) + + assert.Equal(AxisColorDark, getAxisColor(ThemeDark)) + assert.Equal(AxisColorLight, getAxisColor("")) + + assert.Equal(GridColorDark, getGridColor(ThemeDark)) + assert.Equal(GridColorLight, getGridColor("")) + + assert.Equal(BackgroundColorDark, getBackgroundColor(ThemeDark)) + assert.Equal(chart.DefaultBackgroundColor, getBackgroundColor("")) + + assert.Equal(TextColorDark, getTextColor(ThemeDark)) + assert.Equal(chart.DefaultTextColor, getTextColor("")) +} + +func TestThemeColorPalette(t *testing.T) { + assert := assert.New(t) + + dark := ThemeColorPalette{ + Theme: ThemeDark, + } + assert.Equal(BackgroundColorDark, dark.BackgroundColor()) + assert.Equal(chart.DefaultBackgroundStrokeColor, dark.BackgroundStrokeColor()) + assert.Equal(BackgroundColorDark, dark.CanvasColor()) + assert.Equal(chart.DefaultCanvasStrokeColor, dark.CanvasStrokeColor()) + assert.Equal(BackgroundColorDark, dark.AxisStrokeColor()) + assert.Equal(TextColorDark, dark.TextColor()) + // series 使用统一的color + assert.Equal(SeriesColorsLight[0], dark.GetSeriesColor(0)) + + light := ThemeColorPalette{} + assert.Equal(chart.DefaultBackgroundColor, light.BackgroundColor()) + assert.Equal(chart.DefaultBackgroundStrokeColor, light.BackgroundStrokeColor()) + assert.Equal(chart.DefaultCanvasColor, light.CanvasColor()) + assert.Equal(chart.DefaultCanvasStrokeColor, light.CanvasStrokeColor()) + assert.Equal(chart.DefaultAxisColor, light.AxisStrokeColor()) + assert.Equal(chart.DefaultTextColor, light.TextColor()) + // series 使用统一的color + assert.Equal(SeriesColorsLight[0], light.GetSeriesColor(0)) +} + +func TestPieThemeColorPalette(t *testing.T) { + assert := assert.New(t) + p := PieThemeColorPalette{} + + // pie无认哪种theme,文本的颜色都一样 + assert.Equal(chart.DefaultTextColor, p.TextColor()) + p.Theme = ThemeDark + assert.Equal(chart.DefaultTextColor, p.TextColor()) +} + +func TestParseColor(t *testing.T) { + assert := assert.New(t) + + c := parseColor("") + assert.True(c.IsZero()) + + c = parseColor("#333") + assert.Equal(drawing.Color{ + R: 51, + G: 51, + B: 51, + A: 255, + }, c) + + c = parseColor("#313233") + assert.Equal(drawing.Color{ + R: 49, + G: 50, + B: 51, + A: 255, + }, c) + + c = parseColor("rgb(31,32,33)") + assert.Equal(drawing.Color{ + R: 31, + G: 32, + B: 33, + A: 255, + }, c) + + c = parseColor("rgba(50,51,52,250)") + assert.Equal(drawing.Color{ + R: 50, + G: 51, + B: 52, + A: 250, + }, c) +} From 6aad7b6067fad7a758110f63c02e0326fe30a9c3 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Dec 2021 09:29:39 +0800 Subject: [PATCH 017/251] refactor: add examples --- README.md | 48 ++++++++++++++- assets/go-echarts.jpg | Bin 0 -> 117115 bytes axis.go | 16 +++-- echarts.go | 36 +++++++++++ echarts_test.go | 18 ++++++ examples/basic/main.go | 28 +++++++++ examples/{ => charts}/main.go | 109 +++++++++++++++++++++++----------- go.mod | 6 +- go.sum | 11 +++- series.go | 5 ++ 10 files changed, 231 insertions(+), 46 deletions(-) create mode 100644 assets/go-echarts.jpg create mode 100644 examples/basic/main.go rename examples/{ => charts}/main.go (79%) diff --git a/README.md b/README.md index 55e5760..270a338 100644 --- a/README.md +++ b/README.md @@ -1 +1,47 @@ -# go-chart \ No newline at end of file +# go-echarts + +![Alt](https://repobeats.axiom.co/api/embed/9071915842d72a909465be75eb6c12ffb7de2dcf.svg "Repobeats analytics image") + +[go-chart](https://github.com/wcharczuk/go-chart)是golang常用的可视化图表库,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可。go-echarts则是结合两者的方式,兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图: + +![](./assets/go-echarts.jpg) + +## 支持图表类型 + +暂仅支持三种的图表类型:`line`, `bar` 以及 `pie` + + +## 示例 + +`go-echarts`兼容了`echarts`的参数配置,可简单的使用json形式的配置字符串则可快速生成图表。 + +```go +package main + +import ( + "os" + + charts "github.com/vicanso/echarts" +) + +func main() { + buf, err := charts.RenderEChartsToPNG(`{ + "title": { + "text": "Line" + }, + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "data": [150, 230, 224, 218, 135, 147, 260] + } + ] + }`) + if err != nil { + panic(err) + } + os.WriteFile("output.png", buf, 0600) +} +``` \ No newline at end of file diff --git a/assets/go-echarts.jpg b/assets/go-echarts.jpg new file mode 100644 index 0000000000000000000000000000000000000000..85032e588bd7f51c0c6f2722e8814c5632447726 GIT binary patch literal 117115 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

6KkA{N5mw1Syvig2AICy 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 {yylwSV-M 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 BB0m5C literal 0 HcmV?d00001 diff --git a/axis.go b/axis.go index 5b2be9e..42569a3 100644 --- a/axis.go +++ b/axis.go @@ -50,6 +50,16 @@ type YAxisOption struct { const axisStrokeWidth = 1 +func maxInt(values ...int) int { + result := 0 + for _, v := range values { + if v > result { + result = v + } + } + return result +} + // GetXAxisAndValues returns x axis by theme, and the values of axis. func GetXAxisAndValues(xAxis XAxis, tickPosition chart.TickPosition, theme string) (chart.XAxis, []float64) { data := xAxis.Data @@ -66,10 +76,8 @@ func GetXAxisAndValues(xAxis XAxis, tickPosition chart.TickPosition, theme strin xValues := make([]float64, size) ticks := make([]chart.Tick, 0) - maxTicks := xAxis.SplitNumber - if maxTicks == 0 { - maxTicks = 10 - } + // tick width + maxTicks := maxInt(xAxis.SplitNumber, 10) // 计息最多每个unit至少放多个 minUnitSize := originalSize / maxTicks diff --git a/echarts.go b/echarts.go index 02cede2..672a21a 100644 --- a/echarts.go +++ b/echarts.go @@ -188,6 +188,7 @@ type ECharsOptions struct { Data []ECharsSeriesData `json:"data"` Type string `json:"type"` YAxisIndex int `json:"yAxisIndex"` + ItemStyle EChartStyle `json:"itemStyle"` } `json:"series"` } @@ -201,7 +202,15 @@ func convertEChartsSeries(e *ECharsOptions) ([]Series, chart.TickPosition) { if seriesType == SeriesPie { series := make([]Series, len(e.Series[0].Data)) for index, item := range e.Series[0].Data { + style := chart.Style{} + if item.ItemStyle.Color != "" { + c := parseColor(item.ItemStyle.Color) + style.FillColor = c + style.StrokeColor = c + } + series[index] = Series{ + Style: style, Data: []SeriesData{ { Value: item.Value, @@ -219,6 +228,12 @@ func convertEChartsSeries(e *ECharsOptions) ([]Series, chart.TickPosition) { if item.Type == SeriesBar { tickPosition = chart.TickPositionBetweenTicks } + style := chart.Style{} + if item.ItemStyle.Color != "" { + c := parseColor(item.ItemStyle.Color) + style.FillColor = c + style.StrokeColor = c + } data := make([]SeriesData, len(item.Data)) for j, itemData := range item.Data { sd := SeriesData{ @@ -232,6 +247,7 @@ func convertEChartsSeries(e *ECharsOptions) ([]Series, chart.TickPosition) { data[j] = sd } series[index] = Series{ + Style: style, YAxisIndex: item.YAxisIndex, Data: data, Type: item.Type, @@ -317,3 +333,23 @@ func ParseECharsOptions(options string) (Options, error) { return e.ToOptions(), nil } + +func echartsRender(options string, rp chart.RendererProvider) ([]byte, error) { + o, err := ParseECharsOptions(options) + if err != nil { + return nil, err + } + g, err := New(o) + if err != nil { + return nil, err + } + return render(g, rp) +} + +func RenderEChartsToPNG(options string) ([]byte, error) { + return echartsRender(options, chart.PNG) +} + +func RenderEChartsToSVG(options string) ([]byte, error) { + return echartsRender(options, chart.SVG) +} diff --git a/echarts_test.go b/echarts_test.go index 99bf414..b06da53 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -28,6 +28,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" ) func TestConvertToArray(t *testing.T) { @@ -288,6 +289,9 @@ func TestParseECharsOptions(t *testing.T) { { "name": "Precipitation", "type": "bar", + "itemStyle": { + "color": "#0052d9" + }, "data": [2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6] }, { @@ -368,6 +372,20 @@ func TestParseECharsOptions(t *testing.T) { 2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6, }), Type: SeriesBar, + Style: chart.Style{ + StrokeColor: drawing.Color{ + R: 0, + G: 82, + B: 217, + A: 255, + }, + FillColor: drawing.Color{ + R: 0, + G: 82, + B: 217, + A: 255, + }, + }, }, { Data: NewSeriesDataListFromFloat([]float64{ diff --git a/examples/basic/main.go b/examples/basic/main.go new file mode 100644 index 0000000..906f32c --- /dev/null +++ b/examples/basic/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "os" + + charts "github.com/vicanso/echarts" +) + +func main() { + buf, err := charts.RenderEChartsToPNG(`{ + "title": { + "text": "Line" + }, + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "data": [150, 230, 224, 218, 135, 147, 260] + } + ] + }`) + if err != nil { + panic(err) + } + os.WriteFile("output.png", buf, 0600) +} diff --git a/examples/main.go b/examples/charts/main.go similarity index 79% rename from examples/main.go rename to examples/charts/main.go index c07b49d..4cf72e2 100644 --- a/examples/main.go +++ b/examples/charts/main.go @@ -9,32 +9,44 @@ import ( var html = ` - - - - - - - go-echarts - - - {{body}} - + + + + + + + go-echarts + + +

+ ` @@ -43,10 +55,9 @@ var chartOptions = []map[string]string{ "title": "折线图", "option": `{ "title": { - "text": "line", + "text": "Line", "textAlign": "left", "textStyle": { - "color": "#333", "fontSize": 24, "height": 40 } @@ -214,6 +225,9 @@ var chartOptions = []map[string]string{ { "name": "Evaporation", "type": "bar", + "itemStyle": { + "color": "#0052d9" + }, "data": [2, 4.9, 7, 23.2, 25.6, 76.7, 135.6] }, { @@ -241,7 +255,7 @@ var chartOptions = []map[string]string{ }, "xAxis": { "type": "category", - "splitNumber": 12, + "splitNumber": 6, "data": ["01-01","01-02","01-03","01-04","01-05","01-06","01-07","01-08","01-09","01-10","01-11","01-12","01-13","01-14","01-15","01-16","01-17","01-18","01-19","01-20","01-21","01-22","01-23","01-24","01-25","01-26","01-27","01-28","01-29","01-30","01-31"] }, "yAxis": { @@ -300,19 +314,35 @@ var chartOptions = []map[string]string{ }, } -func render(theme string) ([]byte, error) { +type renderOptions struct { + theme string + width int + height int + onlyCharts bool +} + +func render(opts renderOptions) ([]byte, error) { data := bytes.Buffer{} for _, m := range chartOptions { - // if m["title"] != "多柱状图" { - // continue - // } chartHTML := []byte(`

{{title}}

{{option}}
{{svg}}
`) + if opts.onlyCharts { + chartHTML = []byte(`
+ {{svg}} +
`) + } o, err := charts.ParseECharsOptions(m["option"]) - o.Theme = theme + if opts.width > 0 { + o.Width = opts.width + } + if opts.height > 0 { + o.Height = opts.height + } + + o.Theme = opts.theme if err != nil { return nil, err } @@ -333,8 +363,17 @@ func render(theme string) ([]byte, error) { } func indexHandler(w http.ResponseWriter, r *http.Request) { + query := r.URL.Query() + opts := renderOptions{ + theme: query.Get("theme"), + } + if query.Get("view") == "grid" { + opts.width = 400 + opts.height = 200 + opts.onlyCharts = true + } - buf, err := render(r.URL.Query().Get("theme")) + buf, err := render(opts) if err != nil { w.WriteHeader(400) w.Write([]byte(err.Error())) diff --git a/go.mod b/go.mod index 0f43724..6ea9001 100644 --- a/go.mod +++ b/go.mod @@ -9,9 +9,9 @@ require ( ) require ( - github.com/davecgh/go-spew v1.1.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect - gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect + golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/go.sum b/go.sum index c0579a4..51e8735 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,6 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= @@ -11,10 +12,14 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= -golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/series.go b/series.go index 37e6c71..36e57bd 100644 --- a/series.go +++ b/series.go @@ -37,6 +37,7 @@ type Series struct { Data []SeriesData XValues []float64 YAxisIndex int + Style chart.Style } const lineStrokeWidth = 2 @@ -75,6 +76,10 @@ func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) [ DotColor: getSeriesColor(theme, index), DotWidth: dotWith, } + if !item.Style.StrokeColor.IsZero() { + style.StrokeColor = item.Style.StrokeColor + style.DotColor = item.Style.StrokeColor + } pointIndexOffset := 0 // 如果居中,需要多增加一个点 if tickPosition == chart.TickPositionBetweenTicks { From 3406bd75a1b3ee84afe00cc81d824631a1c12cef Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Dec 2021 09:35:54 +0800 Subject: [PATCH 018/251] docs: update images --- README.md | 2 +- assets/go-echarts.jpg | Bin 117115 -> 0 bytes assets/go-echarts.png | Bin 0 -> 271936 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 assets/go-echarts.jpg create mode 100644 assets/go-echarts.png diff --git a/README.md b/README.md index 270a338..93db83e 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [go-chart](https://github.com/wcharczuk/go-chart)是golang常用的可视化图表库,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可。go-echarts则是结合两者的方式,兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图: -![](./assets/go-echarts.jpg) +![](./assets/go-echarts.png) ## 支持图表类型 diff --git a/assets/go-echarts.jpg b/assets/go-echarts.jpg deleted file mode 100644 index 85032e588bd7f51c0c6f2722e8814c5632447726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117115 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 diff --git a/go.mod b/go.mod index b83ca6c..b21ce18 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/vicanso/go-echarts +module github.com/vicanso/go-charts go 1.17 From ebc566fc9d366e410f1a437b9af3a57fbb9ce0cd Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Dec 2021 21:00:02 +0800 Subject: [PATCH 025/251] feat: init commit --- .gitignore | 17 + LICENSE | 21 + go.mod | 22 ++ go.sum | 45 +++ main.go | 53 +++ web/index.css | 50 +++ web/index.html | 22 ++ web/index.js | 14 + web/javascript.js | 959 ++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 1203 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 web/index.css create mode 100644 web/index.html create mode 100644 web/index.js create mode 100644 web/javascript.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2ac8a25 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ +*.png +*.svg \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f31a165 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Tree Xie + +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/go.mod b/go.mod new file mode 100644 index 0000000..97efd89 --- /dev/null +++ b/go.mod @@ -0,0 +1,22 @@ +module github.com/vicanso/go-charts-web + +go 1.17 + +require ( + github.com/vicanso/elton v1.8.1 + github.com/vicanso/go-charts v0.0.2-0.20211225121531-18af884865f4 +) + +require ( + github.com/andybalholm/brotli v1.0.4 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/tidwall/gjson v1.12.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/vicanso/hes v0.4.1 // indirect + github.com/vicanso/intranet-ip v0.0.1 // indirect + github.com/vicanso/keygrip v1.2.1 // indirect + github.com/wcharczuk/go-chart/v2 v2.1.0 // indirect + golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c4dc551 --- /dev/null +++ b/go.sum @@ -0,0 +1,45 @@ +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tidwall/gjson v1.12.0 h1:61wEp/qfvFnqKH/WCI3M8HuRut+mHT6Mr82QrFmM2SY= +github.com/tidwall/gjson v1.12.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/vicanso/elton v1.8.1 h1:axrPozxBaTn9qqCJJ+aSGK+/Y8oLuEm0uXM5wm/glIs= +github.com/vicanso/elton v1.8.1/go.mod h1:BWQknlDpKtw2L5oer3mtBJo/vpBUYUHAjZL3yFV1+ak= +github.com/vicanso/go-charts v0.0.2-0.20211225121531-18af884865f4 h1:wNuYxF/3fHIyokCxymsCwKWXjMgGC3wm2CH9rI407uA= +github.com/vicanso/go-charts v0.0.2-0.20211225121531-18af884865f4/go.mod h1:Kylthw+IZk7hDvhrj4CTN+DAsLzG01y91FOOElGv7vk= +github.com/vicanso/hes v0.4.1 h1:lq27wDXAljoROtYbFDTL5gY51SdeY+9L0ohEiRadwTU= +github.com/vicanso/hes v0.4.1/go.mod h1:B0l1NIQM/nYw7owAd+hyHuNnAD8Nsx0T6duhVxmXUBY= +github.com/vicanso/intranet-ip v0.0.1 h1:cYS+mExFsKqewWSuHtFwAqw/CO66GsheB/P1BPmSTx0= +github.com/vicanso/intranet-ip v0.0.1/go.mod h1:bqQ6VUhxdz0ipSb1kzd6aoZStlp+pB7CTlVmVhgLAxA= +github.com/vicanso/keygrip v1.2.1 h1:876fXDwGJqxdi4JxZ1lNGBxYswyLZotrs7AA2QWcLeY= +github.com/vicanso/keygrip v1.2.1/go.mod h1:tfB5az1yqold78zotkzNugk3sV+QW5m71CFz3zg9eeo= +github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= +github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go new file mode 100644 index 0000000..1078c02 --- /dev/null +++ b/main.go @@ -0,0 +1,53 @@ +package main + +import ( + "bytes" + "embed" + "time" + + "github.com/vicanso/elton" + "github.com/vicanso/elton/middleware" + "github.com/vicanso/go-charts" +) + +//go:embed web +var webFS embed.FS + +func main() { + e := elton.New() + + e.Use(middleware.NewDefaultError()) + e.Use(middleware.NewDefaultBodyParser()) + + assetFS := middleware.NewEmbedStaticFS(webFS, "web") + e.GET("/static/*", middleware.NewStaticServe(assetFS, middleware.StaticServeConfig{ + // 缓存服务器缓存一个小时 + SMaxAge: 5 * time.Minute, + DenyQueryString: true, + DisableLastModified: true, + EnableStrongETag: true, + })) + + e.GET("/", func(c *elton.Context) error { + buf, err := webFS.ReadFile("web/index.html") + if err != nil { + return err + } + c.SetContentTypeByExt(".html") + c.BodyBuffer = bytes.NewBuffer(buf) + return nil + }) + e.POST("/", func(c *elton.Context) error { + buf, err := charts.RenderEChartsToSVG(string(c.RequestBody)) + if err != nil { + return err + } + c.BodyBuffer = bytes.NewBuffer(buf) + return nil + }) + + err := e.ListenAndServe(":3000") + if err != nil { + panic(err) + } +} diff --git a/web/index.css b/web/index.css new file mode 100644 index 0000000..c5eaab3 --- /dev/null +++ b/web/index.css @@ -0,0 +1,50 @@ +body { + font-family: BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif; + height: 100vh; + background-color: #242424; +} +.header { + height: 60px; + line-height: 60px; + color: #fff; + font-size: 16px; + background-color: #383838; + text-indent: 2em; +} +.codeWrapper { + position: fixed; + left: 0; + right: 50%; + top: 60px; + bottom: 50px; + background-color: #d6dbe3; +} +.previewWrapper { + position: fixed; + left: 50%; + right: 0; + top: 60px; + bottom: 50px; +} +.run { + display: block; + position: fixed; + left: 0; + right: 0; + bottom: 0; + height: 50px; + line-height: 50px; + background-color: #0052D9; + color: #fff; + text-align: center; + font-size: 16px; + text-decoration: none; +} +.run:active, .run:visited { + color: #fff; +} + +svg { + display: block; + margin: 30px auto; +} \ No newline at end of file diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..8cd9749 --- /dev/null +++ b/web/index.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + +
Go Charts
+
+
+
+
+
运行 + + + \ No newline at end of file diff --git a/web/index.js b/web/index.js new file mode 100644 index 0000000..9e5e65a --- /dev/null +++ b/web/index.js @@ -0,0 +1,14 @@ +var height = document.body.clientHeight- 110; +var editor = CodeMirror.fromTextArea(document.getElementById("codeInput"), { + lineNumbers: true, + lineWrapping: true, + mode: "javascript" +}); +editor.setSize("100%", height); + +function run() { + var option = editor.getValue(); + axios.post("/", JSON.parse(option)).then(function(resp) { + document.getElementById("svg").innerHTML = resp; + }); +} \ No newline at end of file diff --git a/web/javascript.js b/web/javascript.js new file mode 100644 index 0000000..09ba4c3 --- /dev/null +++ b/web/javascript.js @@ -0,0 +1,959 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); + })(function(CodeMirror) { + "use strict"; + + CodeMirror.defineMode("javascript", function(config, parserConfig) { + var indentUnit = config.indentUnit; + var statementIndent = parserConfig.statementIndent; + var jsonldMode = parserConfig.jsonld; + var jsonMode = parserConfig.json || jsonldMode; + var trackScope = parserConfig.trackScope !== false + var isTS = parserConfig.typescript; + var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; + + // Tokenizer + + var keywords = function(){ + function kw(type) {return {type: type, style: "keyword"};} + var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c"), D = kw("keyword d"); + var operator = kw("operator"), atom = {type: "atom", style: "atom"}; + + return { + "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B, + "return": D, "break": D, "continue": D, "new": kw("new"), "delete": C, "void": C, "throw": C, + "debugger": kw("debugger"), "var": kw("var"), "const": kw("var"), "let": kw("var"), + "function": kw("function"), "catch": kw("catch"), + "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"), + "in": operator, "typeof": operator, "instanceof": operator, + "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom, + "this": kw("this"), "class": kw("class"), "super": kw("atom"), + "yield": C, "export": kw("export"), "import": kw("import"), "extends": C, + "await": C + }; + }(); + + var isOperatorChar = /[+\-*&%=<>!?|~^@]/; + var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; + + function readRegexp(stream) { + var escaped = false, next, inSet = false; + while ((next = stream.next()) != null) { + if (!escaped) { + if (next == "/" && !inSet) return; + if (next == "[") inSet = true; + else if (inSet && next == "]") inSet = false; + } + escaped = !escaped && next == "\\"; + } + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + function ret(tp, style, cont) { + type = tp; content = cont; + return style; + } + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "." && stream.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/)) { + return ret("number", "number"); + } else if (ch == "." && stream.match("..")) { + return ret("spread", "meta"); + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch); + } else if (ch == "=" && stream.eat(">")) { + return ret("=>", "operator"); + } else if (ch == "0" && stream.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) { + return ret("number", "number"); + } else if (/\d/.test(ch)) { + stream.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/); + return ret("number", "number"); + } else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (expressionAllowed(stream, state, 1)) { + readRegexp(stream); + stream.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/); + return ret("regexp", "string-2"); + } else { + stream.eat("="); + return ret("operator", "operator", stream.current()); + } + } else if (ch == "`") { + state.tokenize = tokenQuasi; + return tokenQuasi(stream, state); + } else if (ch == "#" && stream.peek() == "!") { + stream.skipToEnd(); + return ret("meta", "meta"); + } else if (ch == "#" && stream.eatWhile(wordRE)) { + return ret("variable", "property") + } else if (ch == "<" && stream.match("!--") || + (ch == "-" && stream.match("->") && !/\S/.test(stream.string.slice(0, stream.start)))) { + stream.skipToEnd() + return ret("comment", "comment") + } else if (isOperatorChar.test(ch)) { + if (ch != ">" || !state.lexical || state.lexical.type != ">") { + if (stream.eat("=")) { + if (ch == "!" || ch == "=") stream.eat("=") + } else if (/[<>*+\-|&?]/.test(ch)) { + stream.eat(ch) + if (ch == ">") stream.eat(ch) + } + } + if (ch == "?" && stream.eat(".")) return ret(".") + return ret("operator", "operator", stream.current()); + } else if (wordRE.test(ch)) { + stream.eatWhile(wordRE); + var word = stream.current() + if (state.lastType != ".") { + if (keywords.propertyIsEnumerable(word)) { + var kw = keywords[word] + return ret(kw.type, kw.style, word) + } + if (word == "async" && stream.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, false)) + return ret("async", "keyword", word) + } + return ret("variable", "variable", word) + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, next; + if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)){ + state.tokenize = tokenBase; + return ret("jsonld-keyword", "meta"); + } + while ((next = stream.next()) != null) { + if (next == quote && !escaped) break; + escaped = !escaped && next == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = (ch == "*"); + } + return ret("comment", "comment"); + } + + function tokenQuasi(stream, state) { + var escaped = false, next; + while ((next = stream.next()) != null) { + if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && next == "\\"; + } + return ret("quasi", "string-2", stream.current()); + } + + var brackets = "([{}])"; + // This is a crude lookahead trick to try and notice that we're + // parsing the argument patterns for a fat-arrow function before we + // actually hit the arrow token. It only works if the arrow is on + // the same line as the arguments and there's no strange noise + // (comments) in between. Fallback is to only notice when we hit the + // arrow, and not declare the arguments as locals for the arrow + // body. + function findFatArrow(stream, state) { + if (state.fatArrowAt) state.fatArrowAt = null; + var arrow = stream.string.indexOf("=>", stream.start); + if (arrow < 0) return; + + if (isTS) { // Try to skip TypeScript return type declarations after the arguments + var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow)) + if (m) arrow = m.index + } + + var depth = 0, sawSomething = false; + for (var pos = arrow - 1; pos >= 0; --pos) { + var ch = stream.string.charAt(pos); + var bracket = brackets.indexOf(ch); + if (bracket >= 0 && bracket < 3) { + if (!depth) { ++pos; break; } + if (--depth == 0) { if (ch == "(") sawSomething = true; break; } + } else if (bracket >= 3 && bracket < 6) { + ++depth; + } else if (wordRE.test(ch)) { + sawSomething = true; + } else if (/["'\/`]/.test(ch)) { + for (;; --pos) { + if (pos == 0) return + var next = stream.string.charAt(pos - 1) + if (next == ch && stream.string.charAt(pos - 2) != "\\") { pos--; break } + } + } else if (sawSomething && !depth) { + ++pos; + break; + } + } + if (sawSomething && !depth) state.fatArrowAt = pos; + } + + // Parser + + var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, + "regexp": true, "this": true, "import": true, "jsonld-keyword": true}; + + function JSLexical(indented, column, type, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + + function inScope(state, varname) { + if (!trackScope) return false + for (var v = state.localVars; v; v = v.next) + if (v.name == varname) return true; + for (var cx = state.context; cx; cx = cx.prev) { + for (var v = cx.vars; v; v = v.next) + if (v.name == varname) return true; + } + } + + function parseJS(state, style, type, content, stream) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc; cx.style = style; + + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = true; + + while(true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; + if (combinator(type, content)) { + while(cc.length && cc[cc.length - 1].lex) + cc.pop()(); + if (cx.marked) return cx.marked; + if (type == "variable" && inScope(state, content)) return "variable-2"; + return style; + } + } + } + + // Combinator utils + + var cx = {state: null, column: null, marked: null, cc: null}; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function inList(name, list) { + for (var v = list; v; v = v.next) if (v.name == name) return true + return false; + } + function register(varname) { + var state = cx.state; + cx.marked = "def"; + if (!trackScope) return + if (state.context) { + if (state.lexical.info == "var" && state.context && state.context.block) { + // FIXME function decls are also not block scoped + var newContext = registerVarScoped(varname, state.context) + if (newContext != null) { + state.context = newContext + return + } + } else if (!inList(varname, state.localVars)) { + state.localVars = new Var(varname, state.localVars) + return + } + } + // Fall through means this is global + if (parserConfig.globalVars && !inList(varname, state.globalVars)) + state.globalVars = new Var(varname, state.globalVars) + } + function registerVarScoped(varname, context) { + if (!context) { + return null + } else if (context.block) { + var inner = registerVarScoped(varname, context.prev) + if (!inner) return null + if (inner == context.prev) return context + return new Context(inner, context.vars, true) + } else if (inList(varname, context.vars)) { + return context + } else { + return new Context(context.prev, new Var(varname, context.vars), false) + } + } + + function isModifier(name) { + return name == "public" || name == "private" || name == "protected" || name == "abstract" || name == "readonly" + } + + // Combinators + + function Context(prev, vars, block) { this.prev = prev; this.vars = vars; this.block = block } + function Var(name, next) { this.name = name; this.next = next } + + var defaultVars = new Var("this", new Var("arguments", null)) + function pushcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, false) + cx.state.localVars = defaultVars + } + function pushblockcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, true) + cx.state.localVars = null + } + function popcontext() { + cx.state.localVars = cx.state.context.vars + cx.state.context = cx.state.context.prev + } + popcontext.lex = true + function pushlex(type, info) { + var result = function() { + var state = cx.state, indent = state.indented; + if (state.lexical.type == "stat") indent = state.lexical.indented; + else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) + indent = outer.indented; + state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") + state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + + function expect(wanted) { + function exp(type) { + if (type == wanted) return cont(); + else if (wanted == ";" || type == "}" || type == ")" || type == "]") return pass(); + else return cont(exp); + }; + return exp; + } + + function statement(type, value) { + if (type == "var") return cont(pushlex("vardef", value), vardef, expect(";"), poplex); + if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); + if (type == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type == "keyword d") return cx.stream.match(/^\s*$/, false) ? cont() : cont(pushlex("stat"), maybeexpression, expect(";"), poplex); + if (type == "debugger") return cont(expect(";")); + if (type == "{") return cont(pushlex("}"), pushblockcontext, block, poplex, popcontext); + if (type == ";") return cont(); + if (type == "if") { + if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) + cx.state.cc.pop()(); + return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse); + } + if (type == "function") return cont(functiondef); + if (type == "for") return cont(pushlex("form"), pushblockcontext, forspec, statement, popcontext, poplex); + if (type == "class" || (isTS && value == "interface")) { + cx.marked = "keyword" + return cont(pushlex("form", type == "class" ? type : value), className, poplex) + } + if (type == "variable") { + if (isTS && value == "declare") { + cx.marked = "keyword" + return cont(statement) + } else if (isTS && (value == "module" || value == "enum" || value == "type") && cx.stream.match(/^\s*\w/, false)) { + cx.marked = "keyword" + if (value == "enum") return cont(enumdef); + else if (value == "type") return cont(typename, expect("operator"), typeexpr, expect(";")); + else return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex) + } else if (isTS && value == "namespace") { + cx.marked = "keyword" + return cont(pushlex("form"), expression, statement, poplex) + } else if (isTS && value == "abstract") { + cx.marked = "keyword" + return cont(statement) + } else { + return cont(pushlex("stat"), maybelabel); + } + } + if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), pushblockcontext, + block, poplex, poplex, popcontext); + if (type == "case") return cont(expression, expect(":")); + if (type == "default") return cont(expect(":")); + if (type == "catch") return cont(pushlex("form"), pushcontext, maybeCatchBinding, statement, poplex, popcontext); + if (type == "export") return cont(pushlex("stat"), afterExport, poplex); + if (type == "import") return cont(pushlex("stat"), afterImport, poplex); + if (type == "async") return cont(statement) + if (value == "@") return cont(expression, statement) + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function maybeCatchBinding(type) { + if (type == "(") return cont(funarg, expect(")")) + } + function expression(type, value) { + return expressionInner(type, value, false); + } + function expressionNoComma(type, value) { + return expressionInner(type, value, true); + } + function parenExpr(type) { + if (type != "(") return pass() + return cont(pushlex(")"), maybeexpression, expect(")"), poplex) + } + function expressionInner(type, value, noComma) { + if (cx.state.fatArrowAt == cx.stream.start) { + var body = noComma ? arrowBodyNoComma : arrowBody; + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext); + else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); + } + + var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; + if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); + if (type == "function") return cont(functiondef, maybeop); + if (type == "class" || (isTS && value == "interface")) { cx.marked = "keyword"; return cont(pushlex("form"), classExpression, poplex); } + if (type == "keyword c" || type == "async") return cont(noComma ? expressionNoComma : expression); + if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); + if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); + if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); + if (type == "{") return contCommasep(objprop, "}", null, maybeop); + if (type == "quasi") return pass(quasi, maybeop); + if (type == "new") return cont(maybeTarget(noComma)); + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + + function maybeoperatorComma(type, value) { + if (type == ",") return cont(maybeexpression); + return maybeoperatorNoComma(type, value, false); + } + function maybeoperatorNoComma(type, value, noComma) { + var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; + var expr = noComma == false ? expression : expressionNoComma; + if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); + if (type == "operator") { + if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me); + if (isTS && value == "<" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/, false)) + return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me); + if (value == "?") return cont(expression, expect(":"), expr); + return cont(expr); + } + if (type == "quasi") { return pass(quasi, me); } + if (type == ";") return; + if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); + if (type == ".") return cont(property, me); + if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); + if (isTS && value == "as") { cx.marked = "keyword"; return cont(typeexpr, me) } + if (type == "regexp") { + cx.state.lastType = cx.marked = "operator" + cx.stream.backUp(cx.stream.pos - cx.stream.start - 1) + return cont(expr) + } + } + function quasi(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasi); + return cont(maybeexpression, continueQuasi); + } + function continueQuasi(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasi); + } + } + function arrowBody(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expression); + } + function arrowBodyNoComma(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expressionNoComma); + } + function maybeTarget(noComma) { + return function(type) { + if (type == ".") return cont(noComma ? targetNoComma : target); + else if (type == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma) + else return pass(noComma ? expressionNoComma : expression); + }; + } + function target(_, value) { + if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorComma); } + } + function targetNoComma(_, value) { + if (value == "target") { cx.marked = "keyword"; return cont(maybeoperatorNoComma); } + } + function maybelabel(type) { + if (type == ":") return cont(poplex, statement); + return pass(maybeoperatorComma, expect(";"), poplex); + } + function property(type) { + if (type == "variable") {cx.marked = "property"; return cont();} + } + function objprop(type, value) { + if (type == "async") { + cx.marked = "property"; + return cont(objprop); + } else if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + if (value == "get" || value == "set") return cont(getterSetter); + var m // Work around fat-arrow-detection complication for detecting typescript typed arrow params + if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false))) + cx.state.fatArrowAt = cx.stream.pos + m[0].length + return cont(afterprop); + } else if (type == "number" || type == "string") { + cx.marked = jsonldMode ? "property" : (cx.style + " property"); + return cont(afterprop); + } else if (type == "jsonld-keyword") { + return cont(afterprop); + } else if (isTS && isModifier(value)) { + cx.marked = "keyword" + return cont(objprop) + } else if (type == "[") { + return cont(expression, maybetype, expect("]"), afterprop); + } else if (type == "spread") { + return cont(expressionNoComma, afterprop); + } else if (value == "*") { + cx.marked = "keyword"; + return cont(objprop); + } else if (type == ":") { + return pass(afterprop) + } + } + function getterSetter(type) { + if (type != "variable") return pass(afterprop); + cx.marked = "property"; + return cont(functiondef); + } + function afterprop(type) { + if (type == ":") return cont(expressionNoComma); + if (type == "(") return pass(functiondef); + } + function commasep(what, end, sep) { + function proceed(type, value) { + if (sep ? sep.indexOf(type) > -1 : type == ",") { + var lex = cx.state.lexical; + if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; + return cont(function(type, value) { + if (type == end || value == end) return pass() + return pass(what) + }, proceed); + } + if (type == end || value == end) return cont(); + if (sep && sep.indexOf(";") > -1) return pass(what) + return cont(expect(end)); + } + return function(type, value) { + if (type == end || value == end) return cont(); + return pass(what, proceed); + }; + } + function contCommasep(what, end, info) { + for (var i = 3; i < arguments.length; i++) + cx.cc.push(arguments[i]); + return cont(pushlex(end, info), commasep(what, end), poplex); + } + function block(type) { + if (type == "}") return cont(); + return pass(statement, block); + } + function maybetype(type, value) { + if (isTS) { + if (type == ":") return cont(typeexpr); + if (value == "?") return cont(maybetype); + } + } + function maybetypeOrIn(type, value) { + if (isTS && (type == ":" || value == "in")) return cont(typeexpr) + } + function mayberettype(type) { + if (isTS && type == ":") { + if (cx.stream.match(/^\s*\w+\s+is\b/, false)) return cont(expression, isKW, typeexpr) + else return cont(typeexpr) + } + } + function isKW(_, value) { + if (value == "is") { + cx.marked = "keyword" + return cont() + } + } + function typeexpr(type, value) { + if (value == "keyof" || value == "typeof" || value == "infer" || value == "readonly") { + cx.marked = "keyword" + return cont(value == "typeof" ? expressionNoComma : typeexpr) + } + if (type == "variable" || value == "void") { + cx.marked = "type" + return cont(afterType) + } + if (value == "|" || value == "&") return cont(typeexpr) + if (type == "string" || type == "number" || type == "atom") return cont(afterType); + if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType) + if (type == "{") return cont(pushlex("}"), typeprops, poplex, afterType) + if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType) + if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr) + if (type == "quasi") { return pass(quasiType, afterType); } + } + function maybeReturnType(type) { + if (type == "=>") return cont(typeexpr) + } + function typeprops(type) { + if (type.match(/[\}\)\]]/)) return cont() + if (type == "," || type == ";") return cont(typeprops) + return pass(typeprop, typeprops) + } + function typeprop(type, value) { + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property" + return cont(typeprop) + } else if (value == "?" || type == "number" || type == "string") { + return cont(typeprop) + } else if (type == ":") { + return cont(typeexpr) + } else if (type == "[") { + return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop) + } else if (type == "(") { + return pass(functiondecl, typeprop) + } else if (!type.match(/[;\}\)\],]/)) { + return cont() + } + } + function quasiType(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasiType); + return cont(typeexpr, continueQuasiType); + } + function continueQuasiType(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasiType); + } + } + function typearg(type, value) { + if (type == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg) + if (type == ":") return cont(typeexpr) + if (type == "spread") return cont(typearg) + return pass(typeexpr) + } + function afterType(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) + if (value == "|" || type == "." || value == "&") return cont(typeexpr) + if (type == "[") return cont(typeexpr, expect("]"), afterType) + if (value == "extends" || value == "implements") { cx.marked = "keyword"; return cont(typeexpr) } + if (value == "?") return cont(typeexpr, expect(":"), typeexpr) + } + function maybeTypeArgs(_, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType) + } + function typeparam() { + return pass(typeexpr, maybeTypeDefault) + } + function maybeTypeDefault(_, value) { + if (value == "=") return cont(typeexpr) + } + function vardef(_, value) { + if (value == "enum") {cx.marked = "keyword"; return cont(enumdef)} + return pass(pattern, maybetype, maybeAssign, vardefCont); + } + function pattern(type, value) { + if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(pattern) } + if (type == "variable") { register(value); return cont(); } + if (type == "spread") return cont(pattern); + if (type == "[") return contCommasep(eltpattern, "]"); + if (type == "{") return contCommasep(proppattern, "}"); + } + function proppattern(type, value) { + if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { + register(value); + return cont(maybeAssign); + } + if (type == "variable") cx.marked = "property"; + if (type == "spread") return cont(pattern); + if (type == "}") return pass(); + if (type == "[") return cont(expression, expect(']'), expect(':'), proppattern); + return cont(expect(":"), pattern, maybeAssign); + } + function eltpattern() { + return pass(pattern, maybeAssign) + } + function maybeAssign(_type, value) { + if (value == "=") return cont(expressionNoComma); + } + function vardefCont(type) { + if (type == ",") return cont(vardef); + } + function maybeelse(type, value) { + if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); + } + function forspec(type, value) { + if (value == "await") return cont(forspec); + if (type == "(") return cont(pushlex(")"), forspec1, poplex); + } + function forspec1(type) { + if (type == "var") return cont(vardef, forspec2); + if (type == "variable") return cont(forspec2); + return pass(forspec2) + } + function forspec2(type, value) { + if (type == ")") return cont() + if (type == ";") return cont(forspec2) + if (value == "in" || value == "of") { cx.marked = "keyword"; return cont(expression, forspec2) } + return pass(expression, forspec2) + } + function functiondef(type, value) { + if (value == "*") {cx.marked = "keyword"; return cont(functiondef);} + if (type == "variable") {register(value); return cont(functiondef);} + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, statement, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondef) + } + function functiondecl(type, value) { + if (value == "*") {cx.marked = "keyword"; return cont(functiondecl);} + if (type == "variable") {register(value); return cont(functiondecl);} + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondecl) + } + function typename(type, value) { + if (type == "keyword" || type == "variable") { + cx.marked = "type" + return cont(typename) + } else if (value == "<") { + return cont(pushlex(">"), commasep(typeparam, ">"), poplex) + } + } + function funarg(type, value) { + if (value == "@") cont(expression, funarg) + if (type == "spread") return cont(funarg); + if (isTS && isModifier(value)) { cx.marked = "keyword"; return cont(funarg); } + if (isTS && type == "this") return cont(maybetype, maybeAssign) + return pass(pattern, maybetype, maybeAssign); + } + function classExpression(type, value) { + // Class expressions may have an optional name. + if (type == "variable") return className(type, value); + return classNameAfter(type, value); + } + function className(type, value) { + if (type == "variable") {register(value); return cont(classNameAfter);} + } + function classNameAfter(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, classNameAfter) + if (value == "extends" || value == "implements" || (isTS && type == ",")) { + if (value == "implements") cx.marked = "keyword"; + return cont(isTS ? typeexpr : expression, classNameAfter); + } + if (type == "{") return cont(pushlex("}"), classBody, poplex); + } + function classBody(type, value) { + if (type == "async" || + (type == "variable" && + (value == "static" || value == "get" || value == "set" || (isTS && isModifier(value))) && + cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false))) { + cx.marked = "keyword"; + return cont(classBody); + } + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + return cont(classfield, classBody); + } + if (type == "number" || type == "string") return cont(classfield, classBody); + if (type == "[") + return cont(expression, maybetype, expect("]"), classfield, classBody) + if (value == "*") { + cx.marked = "keyword"; + return cont(classBody); + } + if (isTS && type == "(") return pass(functiondecl, classBody) + if (type == ";" || type == ",") return cont(classBody); + if (type == "}") return cont(); + if (value == "@") return cont(expression, classBody) + } + function classfield(type, value) { + if (value == "!") return cont(classfield) + if (value == "?") return cont(classfield) + if (type == ":") return cont(typeexpr, maybeAssign) + if (value == "=") return cont(expressionNoComma) + var context = cx.state.lexical.prev, isInterface = context && context.info == "interface" + return pass(isInterface ? functiondecl : functiondef) + } + function afterExport(type, value) { + if (value == "*") { cx.marked = "keyword"; return cont(maybeFrom, expect(";")); } + if (value == "default") { cx.marked = "keyword"; return cont(expression, expect(";")); } + if (type == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";")); + return pass(statement); + } + function exportField(type, value) { + if (value == "as") { cx.marked = "keyword"; return cont(expect("variable")); } + if (type == "variable") return pass(expressionNoComma, exportField); + } + function afterImport(type) { + if (type == "string") return cont(); + if (type == "(") return pass(expression); + if (type == ".") return pass(maybeoperatorComma); + return pass(importSpec, maybeMoreImports, maybeFrom); + } + function importSpec(type, value) { + if (type == "{") return contCommasep(importSpec, "}"); + if (type == "variable") register(value); + if (value == "*") cx.marked = "keyword"; + return cont(maybeAs); + } + function maybeMoreImports(type) { + if (type == ",") return cont(importSpec, maybeMoreImports) + } + function maybeAs(_type, value) { + if (value == "as") { cx.marked = "keyword"; return cont(importSpec); } + } + function maybeFrom(_type, value) { + if (value == "from") { cx.marked = "keyword"; return cont(expression); } + } + function arrayLiteral(type) { + if (type == "]") return cont(); + return pass(commasep(expressionNoComma, "]")); + } + function enumdef() { + return pass(pushlex("form"), pattern, expect("{"), pushlex("}"), commasep(enummember, "}"), poplex, poplex) + } + function enummember() { + return pass(pattern, maybeAssign); + } + + function isContinuedStatement(state, textAfter) { + return state.lastType == "operator" || state.lastType == "," || + isOperatorChar.test(textAfter.charAt(0)) || + /[,.]/.test(textAfter.charAt(0)); + } + + function expressionAllowed(stream, state, backUp) { + return state.tokenize == tokenBase && + /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) || + (state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0)))) + } + + // Interface + + return { + startState: function(basecolumn) { + var state = { + tokenize: tokenBase, + lastType: "sof", + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + context: parserConfig.localVars && new Context(null, null, false), + indented: basecolumn || 0 + }; + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") + state.globalVars = parserConfig.globalVars; + return state; + }, + + token: function(stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) + state.lexical.align = false; + state.indented = stream.indentation(); + findFatArrow(stream, state); + } + if (state.tokenize != tokenComment && stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; + return parseJS(state, style, type, content, stream); + }, + + indent: function(state, textAfter) { + if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass; + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical, top + // Kludge to prevent 'maybelse' from blocking lexical scope pops + if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { + var c = state.cc[i]; + if (c == poplex) lexical = lexical.prev; + else if (c != maybeelse && c != popcontext) break; + } + while ((lexical.type == "stat" || lexical.type == "form") && + (firstChar == "}" || ((top = state.cc[state.cc.length - 1]) && + (top == maybeoperatorComma || top == maybeoperatorNoComma) && + !/^[,\.=+\-*:?[\(]/.test(textAfter)))) + lexical = lexical.prev; + if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") + lexical = lexical.prev; + var type = lexical.type, closing = firstChar == type; + + if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info.length + 1 : 0); + else if (type == "form" && firstChar == "{") return lexical.indented; + else if (type == "form") return lexical.indented + indentUnit; + else if (type == "stat") + return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0); + else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) + return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit); + else if (lexical.align) return lexical.column + (closing ? 0 : 1); + else return lexical.indented + (closing ? 0 : indentUnit); + }, + + electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, + blockCommentStart: jsonMode ? null : "/*", + blockCommentEnd: jsonMode ? null : "*/", + blockCommentContinue: jsonMode ? null : " * ", + lineComment: jsonMode ? null : "//", + fold: "brace", + closeBrackets: "()[]{}''\"\"``", + + helperType: jsonMode ? "json" : "javascript", + jsonldMode: jsonldMode, + jsonMode: jsonMode, + + expressionAllowed: expressionAllowed, + + skipExpression: function(state) { + parseJS(state, "atom", "atom", "true", new CodeMirror.StringStream("", 2, null)) + } + }; + }); + +// CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); + + CodeMirror.defineMIME("text/javascript", "javascript"); + CodeMirror.defineMIME("text/ecmascript", "javascript"); + CodeMirror.defineMIME("application/javascript", "javascript"); + CodeMirror.defineMIME("application/x-javascript", "javascript"); + CodeMirror.defineMIME("application/ecmascript", "javascript"); + CodeMirror.defineMIME("application/json", { name: "javascript", json: true }); + CodeMirror.defineMIME("application/x-json", { name: "javascript", json: true }); + CodeMirror.defineMIME("application/manifest+json", { name: "javascript", json: true }) + CodeMirror.defineMIME("application/ld+json", { name: "javascript", jsonld: true }); + CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true }); + CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true }); + + }); \ No newline at end of file From fea5649efb630ae33e054448345afd131b0f4f2c Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 26 Dec 2021 09:02:24 +0800 Subject: [PATCH 026/251] refactor: adjust charts preview --- web/index.css | 19 +++++++++++++++++-- web/index.html | 7 ++++++- web/index.js | 17 ++++++++++++++++- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/web/index.css b/web/index.css index c5eaab3..98a8b4e 100644 --- a/web/index.css +++ b/web/index.css @@ -26,6 +26,17 @@ body { top: 60px; bottom: 50px; } +.optionTips { + position: absolute; + top: 3px; + right: 10px; +} +.previewTips { + position: absolute; + top: 3px; + left: 10px; + color: #fff; +} .run { display: block; position: fixed; @@ -43,8 +54,12 @@ body { .run:active, .run:visited { color: #fff; } - +#svg { + position: absolute; + top: 50%; + margin-top: -200px; +} svg { display: block; - margin: 30px auto; + margin: auto; } \ No newline at end of file diff --git a/web/index.html b/web/index.html index 8cd9749..54b0ee8 100644 --- a/web/index.html +++ b/web/index.html @@ -12,11 +12,16 @@
Go Charts
-
+
+ +
ECharts配置
+
+
图表SVG效果
运行 + \ No newline at end of file diff --git a/web/index.js b/web/index.js index 9e5e65a..a823c88 100644 --- a/web/index.js +++ b/web/index.js @@ -8,7 +8,22 @@ editor.setSize("100%", height); function run() { var option = editor.getValue(); - axios.post("/", JSON.parse(option)).then(function(resp) { + var data = null; + try { + if (option.indexOf("option = ") !== -1) { + var fn = new Function("var " + option + ";return option;"); + data = fn(); + } else { + data = JSON.parse(option); + } + } catch (err) { + alert(err.message); + return; + } + + axios.post("/", data).then(function(resp) { document.getElementById("svg").innerHTML = resp; + }).catch(function(err) { + alert(err.message); }); } \ No newline at end of file From 5a437f48d6d90fdb36d8e07abb16a1cb46c00411 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 26 Dec 2021 09:41:44 +0800 Subject: [PATCH 027/251] feat: enhance set min and max for y axis --- axis.go | 27 +++++++++++++++++++-------- axis_test.go | 2 +- range.go | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/axis.go b/axis.go index 42569a3..c632815 100644 --- a/axis.go +++ b/axis.go @@ -23,6 +23,8 @@ package charts import ( + "math" + "github.com/dustin/go-humanize" "github.com/wcharczuk/go-chart/v2" ) @@ -125,11 +127,26 @@ func defaultFloatFormater(v interface{}) string { return humanize.CommafWithDigits(value, 2) } +func newYContinuousRange(option *YAxisOption) *YContinuousRange { + m := YContinuousRange{} + m.Min = -math.MaxFloat64 + m.Max = math.MaxFloat64 + if option != nil { + if option.Min != nil { + m.Min = *option.Min + } + if option.Max != nil { + m.Max = *option.Max + } + } + return &m +} + // GetSecondaryYAxis returns the secondary y axis by theme func GetSecondaryYAxis(theme string, option *YAxisOption) chart.YAxis { strokeColor := getGridColor(theme) yAxis := chart.YAxis{ - Range: &chart.ContinuousRange{}, + Range: newYContinuousRange(option), ValueFormatter: defaultFloatFormater, AxisType: chart.YAxisSecondary, GridMajorStyle: chart.Style{ @@ -158,12 +175,6 @@ func setYAxisOption(yAxis *chart.YAxis, option *YAxisOption) { if option.Formater != nil { yAxis.ValueFormatter = option.Formater } - if option.Max != nil { - yAxis.Range.SetMax(*option.Max) - } - if option.Min != nil { - yAxis.Range.SetMin(*option.Min) - } } // GetYAxis returns the primary y axis by theme @@ -175,7 +186,7 @@ func GetYAxis(theme string, option *YAxisOption) chart.YAxis { hidden := chart.Hidden() yAxis := chart.YAxis{ - Range: &chart.ContinuousRange{}, + Range: newYContinuousRange(option), ValueFormatter: defaultFloatFormater, AxisType: chart.YAxisPrimary, GridMajorStyle: hidden, diff --git a/axis_test.go b/axis_test.go index 8396e8a..cc50864 100644 --- a/axis_test.go +++ b/axis_test.go @@ -138,7 +138,7 @@ func TestSetYAxisOption(t *testing.T) { Max: &max, } yAxis := &chart.YAxis{ - Range: &chart.ContinuousRange{}, + Range: newYContinuousRange(opt), } setYAxisOption(yAxis, opt) diff --git a/range.go b/range.go index f1869da..4e00c60 100644 --- a/range.go +++ b/range.go @@ -23,6 +23,8 @@ package charts import ( + "math" + "github.com/wcharczuk/go-chart/v2" ) @@ -58,3 +60,34 @@ type HiddenRange struct { func (r HiddenRange) GetDelta() float64 { return 0 } + +// Y轴使用的continuous range +// min 与max只允许设置一次 +// 如果是计算得出的max,增加20%的值并取整 +type YContinuousRange struct { + chart.ContinuousRange +} + +func (m YContinuousRange) IsZero() bool { + // 默认返回true,允许修改 + return true +} + +func (m *YContinuousRange) SetMin(min float64) { + // 如果已修改,则忽略 + if m.Min != -math.MaxFloat64 { + return + } + m.Min = min +} + +func (m *YContinuousRange) SetMax(max float64) { + // 如果已修改,则忽略 + if m.Max != math.MaxFloat64 { + return + } + // 此处为计算得来的最大值,放大20% + v := int(max * 1.2) + // TODO 是否要取整十整百 + m.Max = float64(v) +} From 6d53559d49cf54a481823ae184f1f7df58a07a55 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 26 Dec 2021 09:48:21 +0800 Subject: [PATCH 028/251] docs: update images --- assets/go-echarts.png | Bin 271936 -> 267314 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/go-echarts.png b/assets/go-echarts.png index c7ef555759baeb594e1971879e90e47a446e2f9f..9865cd296e03626b8773a917808be5194ddc25ba 100644 GIT binary patch literal 267314 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%0D8a+d$5dAE8xXHAz?mT}*pl<`5T9X27 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 Nwmhf%iS~2qzW|;(klz3R literal 271936 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%0DxPnQdySwyh9&u^o!eY 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 From d863eff7dec541e7bfbc8249ead934dbb104d1ed Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 26 Dec 2021 10:42:16 +0800 Subject: [PATCH 029/251] chore: auto build docker image for web --- .github/workflows/build.yml | 35 +++++++++++++++++++++++++++++++++++ Dockerfile | 23 +++++++++++++++++++++++ Makefile | 9 +++++++++ entrypoint.sh | 8 ++++++++ go.mod | 2 +- go.sum | 4 ++-- main.go | 14 +++++++++++++- 7 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 Dockerfile create mode 100644 Makefile create mode 100755 entrypoint.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..004b73a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,35 @@ +name: build on tag + +on: + push: + branches: [ web ] + pull_request: + branches: [ web ] + +jobs: + docker: + runs-on: ubuntu-latest + name: Build + steps: + - name: Check out code into the Go module directory + uses: actions/checkout@v2 + - name: Set output + id: vars + run: echo ::set-output name=tag::${GITHUB_REF#refs/*/} + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} + - name: Build and push + id: docker_build + uses: docker/build-push-action@v2 + with: + push: true + tags: ${{ secrets.DOCKER_HUB_USERNAME }}/go- + - name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d7baa6a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ + +FROM golang:1.17-alpine as builder + +ADD ./ /go-charts + +RUN apk update \ + && apk add docker git gcc make \ + && cd /go-charts \ + && make build + +FROM alpine + +EXPOSE 7001 + +COPY --from=builder /go-charts/go-charts /usr/local/bin/go-charts +COPY --from=builder /go-charts/entrypoint.sh /entrypoint.sh + + +CMD ["go-charts"] + +ENTRYPOINT ["/entrypoint.sh"] + +HEALTHCHECK --timeout=10s --interval=10s CMD [ "wget", "http://127.0.0.1:7001/ping", "-q", "-O", "-"] \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..22af142 --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +export GO111MODULE = on + +.PHONY: default test test-cover dev build + +build: + go build -tags netgo -o go-charts + +release: + go mod tidy diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..ad8111b --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/sh +set -e + +if [ "${1:0:1}" = '-' ]; then + set -- go-charts "$@" +fi + +exec "$@" \ No newline at end of file diff --git a/go.mod b/go.mod index 97efd89..8138b37 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/vicanso/elton v1.8.1 - github.com/vicanso/go-charts v0.0.2-0.20211225121531-18af884865f4 + github.com/vicanso/go-charts v0.0.2-0.20211226014821-6d53559d49cf ) require ( diff --git a/go.sum b/go.sum index c4dc551..8c48ab3 100644 --- a/go.sum +++ b/go.sum @@ -22,8 +22,8 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/vicanso/elton v1.8.1 h1:axrPozxBaTn9qqCJJ+aSGK+/Y8oLuEm0uXM5wm/glIs= github.com/vicanso/elton v1.8.1/go.mod h1:BWQknlDpKtw2L5oer3mtBJo/vpBUYUHAjZL3yFV1+ak= -github.com/vicanso/go-charts v0.0.2-0.20211225121531-18af884865f4 h1:wNuYxF/3fHIyokCxymsCwKWXjMgGC3wm2CH9rI407uA= -github.com/vicanso/go-charts v0.0.2-0.20211225121531-18af884865f4/go.mod h1:Kylthw+IZk7hDvhrj4CTN+DAsLzG01y91FOOElGv7vk= +github.com/vicanso/go-charts v0.0.2-0.20211226014821-6d53559d49cf h1:4+ykVNLlgrXTENY0HkKEQsWUppWeKi9dtSAG0uZKgTU= +github.com/vicanso/go-charts v0.0.2-0.20211226014821-6d53559d49cf/go.mod h1:Kylthw+IZk7hDvhrj4CTN+DAsLzG01y91FOOElGv7vk= github.com/vicanso/hes v0.4.1 h1:lq27wDXAljoROtYbFDTL5gY51SdeY+9L0ohEiRadwTU= github.com/vicanso/hes v0.4.1/go.mod h1:B0l1NIQM/nYw7owAd+hyHuNnAD8Nsx0T6duhVxmXUBY= github.com/vicanso/intranet-ip v0.0.1 h1:cYS+mExFsKqewWSuHtFwAqw/CO66GsheB/P1BPmSTx0= diff --git a/main.go b/main.go index 1078c02..22eb584 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "bytes" "embed" + "fmt" "time" "github.com/vicanso/elton" @@ -16,6 +17,12 @@ var webFS embed.FS func main() { e := elton.New() + e.Use(middleware.NewLogger(middleware.LoggerConfig{ + Format: middleware.LoggerCombined, + OnLog: func(s string, _ *elton.Context) { + fmt.Println(s) + }, + })) e.Use(middleware.NewDefaultError()) e.Use(middleware.NewDefaultBodyParser()) @@ -28,6 +35,11 @@ func main() { EnableStrongETag: true, })) + e.GET("/ping", func(c *elton.Context) error { + c.BodyBuffer = bytes.NewBufferString("pong") + return nil + }) + e.GET("/", func(c *elton.Context) error { buf, err := webFS.ReadFile("web/index.html") if err != nil { @@ -46,7 +58,7 @@ func main() { return nil }) - err := e.ListenAndServe(":3000") + err := e.ListenAndServe(":7001") if err != nil { panic(err) } From 9842c794029a036a8ea57d01546787e906e96ab6 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 26 Dec 2021 10:44:44 +0800 Subject: [PATCH 030/251] fix: fix docker image tag --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 004b73a..890e4ea 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,6 +30,6 @@ jobs: uses: docker/build-push-action@v2 with: push: true - tags: ${{ secrets.DOCKER_HUB_USERNAME }}/go- + tags: ${{ secrets.DOCKER_HUB_USERNAME }}/go-charts - name: Image digest run: echo ${{ steps.docker_build.outputs.digest }} From 8fc03c4a72c54044926a8ca3ab4f717172a65118 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 26 Dec 2021 12:05:44 +0800 Subject: [PATCH 031/251] refactor: add init option for chart --- web/index.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/web/index.js b/web/index.js index a823c88..e82c2a3 100644 --- a/web/index.js +++ b/web/index.js @@ -5,6 +5,21 @@ var editor = CodeMirror.fromTextArea(document.getElementById("codeInput"), { mode: "javascript" }); editor.setSize("100%", height); +editor.setValue(`option = { + xAxis: { + type: 'category', + data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] + }, + yAxis: { + type: 'value' + }, + series: [ + { + data: [150, 230, 224, 218, 135, 147, 260], + type: 'line' + } + ] +};`); function run() { var option = editor.getValue(); From 6ff0499839ed8d942736eba5af0f2e4b374406f5 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 26 Dec 2021 15:49:48 +0800 Subject: [PATCH 032/251] docs: update document --- README.md | 2 +- assets/{go-echarts.png => go-charts.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename assets/{go-echarts.png => go-charts.png} (100%) diff --git a/README.md b/README.md index 2486162..6869529 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ `go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可,`go-charts`兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图(黑夜模式): -![](./assets/go-charts.png) +![go-charts](./assets/go-charts.png) ## 支持图表类型 diff --git a/assets/go-echarts.png b/assets/go-charts.png similarity index 100% rename from assets/go-echarts.png rename to assets/go-charts.png From 43c87ef6c5a8137c8f23af4d8fc1c13fefd47239 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 26 Dec 2021 15:53:16 +0800 Subject: [PATCH 033/251] refactor: set width 100% --- web/index.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/index.css b/web/index.css index 98a8b4e..e5f5994 100644 --- a/web/index.css +++ b/web/index.css @@ -56,6 +56,8 @@ body { } #svg { position: absolute; + left: 0; + right: 0; top: 50%; margin-top: -200px; } From 8c7222a7ce490db43612bdb05386f4813d32ea79 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 26 Dec 2021 16:09:42 +0800 Subject: [PATCH 034/251] docs: update documents --- README.md | 15 ++++++++++++++- echarts_test.go | 24 +++++++++++++++++++++++- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6869529..3688cec 100644 --- a/README.md +++ b/README.md @@ -79,4 +79,17 @@ func main() { - `series.itemStyle.color` 该数据项展示时使用的颜色 - `series.data` 数据项对应的数据数组,支持以下形式的数据: - `数值` 常用形式,数组数据为浮点数组,如[1.1, 2,3, 5.2] - - `结构体` pie图表或bar图表中指定样式使用,如[{"value": 1048, "name": "Search Engine"},{"value": 735,"name": "Direct"}] \ No newline at end of file + - `结构体` pie图表或bar图表中指定样式使用,如[{"value": 1048, "name": "Search Engine"},{"value": 735,"name": "Direct"}] + +## 性能 + +简单的图表生成PNG在20ms左右,而SVG的性能则更快,足已满足大量图表的生成需求。 + +```bash +goos: darwin +goarch: amd64 +pkg: github.com/vicanso/go-charts +cpu: Intel(R) Core(TM) i5-8257U CPU @ 1.40GHz +BenchmarkEChartsRenderPNG-8 60 17765045 ns/op 2492854 B/op 1007 allocs/op +BenchmarkEChartsRenderSVG-8 282 4303042 ns/op 32622688 B/op 2983 allocs/op +``` \ No newline at end of file diff --git a/echarts_test.go b/echarts_test.go index 9639ac1..0702591 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -398,7 +398,7 @@ func TestParseECharsOptions(t *testing.T) { }, options) } -func BenchmarkEChartsRender(b *testing.B) { +func BenchmarkEChartsRenderPNG(b *testing.B) { for i := 0; i < b.N; i++ { _, err := RenderEChartsToPNG(`{ "title": { @@ -419,3 +419,25 @@ func BenchmarkEChartsRender(b *testing.B) { } } } + +func BenchmarkEChartsRenderSVG(b *testing.B) { + for i := 0; i < b.N; i++ { + _, err := RenderEChartsToSVG(`{ + "title": { + "text": "Line" + }, + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "data": [150, 230, 224, 218, 135, 147, 260] + } + ] + }`) + if err != nil { + panic(err) + } + } +} From 2758e7818d2fb3bfeabf151fa0805c98fc9e8cb4 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 26 Dec 2021 16:13:20 +0800 Subject: [PATCH 035/251] docs: update documents --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3688cec..e121535 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,9 @@ func main() { ## 性能 -简单的图表生成PNG在20ms左右,而SVG的性能则更快,足已满足大量图表的生成需求。 + + +简单的图表生成PNG在20ms左右,而SVG的性能则更快,性能上比起使用`chrome headless`加载`echarts`图表展示页面,截图生成的方式大幅度提升,基本能满足简单的图表生成需求。 ```bash goos: darwin From 297cbabcec0e7ebf79ba3ff473e0f60674549e95 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 26 Dec 2021 16:14:56 +0800 Subject: [PATCH 036/251] docs: update documents --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e121535..0b36a49 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-charts/blob/master/LICENSE) [![Build Status](https://github.com/vicanso/go-charts/workflows/Test/badge.svg)](https://github.com/vicanso/go-charts/actions) -`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可,`go-charts`兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图(黑夜模式): +`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,无其它模块的依赖纯golang的实现,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可,`go-charts`兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图(黑夜模式): ![go-charts](./assets/go-charts.png) From 2772798122db690839980358611619eff670ccb1 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 28 Dec 2021 23:37:15 +0800 Subject: [PATCH 037/251] feat: support font setting for charts --- charts.go | 31 +++++++++++++++++++++++++++++++ charts_test.go | 13 +++++++++++++ echarts.go | 7 +++++-- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/charts.go b/charts.go index f5fcb1f..3cef373 100644 --- a/charts.go +++ b/charts.go @@ -26,7 +26,9 @@ import ( "bytes" "errors" "io" + "sync" + "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" ) @@ -66,9 +68,36 @@ type ( Legend Legend TickPosition chart.TickPosition Log chart.Logger + Font *truetype.Font } ) +var fonts = sync.Map{} +var ErrFontNotExists = errors.New("font is not exists") + +// InstallFont installs the font for charts +func InstallFont(fontFamily string, data []byte) error { + font, err := truetype.Parse(data) + if err != nil { + return err + } + fonts.Store(fontFamily, font) + return nil +} + +// GetFont returns the font of font family +func GetFont(fontFamily string) (*truetype.Font, error) { + value, ok := fonts.Load(fontFamily) + if !ok { + return nil, ErrFontNotExists + } + f, ok := value.(*truetype.Font) + if !ok { + return nil, ErrFontNotExists + } + return f, nil +} + type Graph interface { Render(rp chart.RendererProvider, w io.Writer) error } @@ -136,6 +165,7 @@ func newPieChart(opt Options) *chart.PieChart { } } return &chart.PieChart{ + Font: opt.Font, Background: opt.getBackground(), Title: opt.Title.Text, TitleStyle: opt.Title.Style, @@ -178,6 +208,7 @@ func newChart(opt Options) *chart.Chart { } c := &chart.Chart{ + Font: opt.Font, Log: opt.Log, Background: opt.getBackground(), ColorPalette: &ThemeColorPalette{ diff --git a/charts_test.go b/charts_test.go index 3173868..98a7288 100644 --- a/charts_test.go +++ b/charts_test.go @@ -28,8 +28,21 @@ import ( "github.com/stretchr/testify/assert" "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/roboto" ) +func TestFont(t *testing.T) { + assert := assert.New(t) + + fontFamily := "roboto" + err := InstallFont(fontFamily, roboto.Roboto) + assert.Nil(err) + + font, err := GetFont(fontFamily) + assert.Nil(err) + assert.NotNil(font) +} + func TestChartsOptions(t *testing.T) { assert := assert.New(t) diff --git a/echarts.go b/echarts.go index bd5a950..a55da5a 100644 --- a/echarts.go +++ b/echarts.go @@ -184,8 +184,7 @@ type ECharsOptions struct { // 暂不支持(go-chart默认title只能居中) TextAlign string `json:"textAlign"` TextStyle struct { - Color string `json:"color"` - // TODO 字体支持 + Color string `json:"color"` FontFamily string `json:"fontFamily"` FontSize float64 `json:"fontSize"` Height float64 `json:"height"` @@ -288,6 +287,10 @@ func (e *ECharsOptions) ToOptions() Options { FontSize: titleTextStyle.FontSize, }, } + if e.Title.TextStyle.FontFamily != "" { + // 如果获取字体失败忽略 + o.Font, _ = GetFont(e.Title.TextStyle.FontFamily) + } if titleTextStyle.FontSize != 0 && titleTextStyle.Height > titleTextStyle.FontSize { padding := int(titleTextStyle.Height-titleTextStyle.FontSize) / 2 From 06c326bdc308f8839cf41e689dc897737faaea44 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 29 Dec 2021 23:18:41 +0800 Subject: [PATCH 038/251] feat: support customize title --- README.md | 2 + axis_test.go | 2 +- charts.go | 63 +++++++++++++++++++-------- echarts.go | 14 +++--- examples/charts/main.go | 7 ++- legend.go | 20 ++++----- legend_test.go | 8 ++-- theme.go | 2 +- title.go | 96 +++++++++++++++++++++++++++++++++++++++++ 9 files changed, 170 insertions(+), 44 deletions(-) create mode 100644 title.go diff --git a/README.md b/README.md index 0b36a49..382a2f2 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,11 @@ func main() { - `padding:[5, 10, 5, 10]` 分别设置`上右下左`边距 - `title` 图表标题,包括标题内容、高度、颜色等 - `title.text` 标题内容 + - `title.left` 标题与容器左侧的距离,可设置为`left`, `right`, `center`, `20%` 以及 `20` 这样的具体数值 - `title.textStyle.color` 标题文字颜色 - `title.textStyle.fontSize` 标题文字字体大小 - `title.textStyle.height` 标题高度 + - `title.textStyle.fontFamily` 标题文字的字体系列,需要注意此配置是会影响整个图表的字体 - `xAxis` 直角坐标系grid中的x轴,由于go-charts仅支持单一个x轴,因此若参数为数组多个x轴,只使用第一个配置 - `xAxis.boundaryGap` 坐标轴两边留白策略,仅支持三种设置方式`null`, `true`或者`false`。`null`或`true`时则数据点展示在两个刻度中间 - `xAxis.splitNumber` 坐标轴的分割段数,需要注意的是这个分割段数只是个预估值,最后实际显示的段数会在这个基础上根据分割后坐标轴刻度显示的易读程度作调整 diff --git a/axis_test.go b/axis_test.go index cc50864..43779e9 100644 --- a/axis_test.go +++ b/axis_test.go @@ -168,5 +168,5 @@ func TestGetYAxis(t *testing.T) { yAxis = GetSecondaryYAxis(ThemeDark, nil) assert.False(yAxis.GridMajorStyle.Hidden) assert.False(yAxis.GridMajorStyle.Hidden) - assert.True(yAxis.Style.StrokeColor.IsZero()) + assert.True(yAxis.Style.StrokeColor.IsTransparent()) } diff --git a/charts.go b/charts.go index 3cef373..9216606 100644 --- a/charts.go +++ b/charts.go @@ -30,6 +30,7 @@ import ( "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" ) const ( @@ -46,6 +47,8 @@ type ( Title struct { Text string Style chart.Style + Font *truetype.Font + Left string } Legend struct { Data []string @@ -156,6 +159,17 @@ func ToSVG(g Graph) ([]byte, error) { return render(g, chart.SVG) } +func newTitleRenderable(title Title, font *truetype.Font, textColor drawing.Color) chart.Renderable { + if title.Text == "" || title.Style.Hidden { + return nil + } + title.Font = font + if title.Style.FontColor.IsZero() { + title.Style.FontColor = textColor + } + return NewTitleCustomize(title) +} + func newPieChart(opt Options) *chart.PieChart { values := make(chart.Values, len(opt.Series)) for index, item := range opt.Series { @@ -164,11 +178,9 @@ func newPieChart(opt Options) *chart.PieChart { Label: item.Name, } } - return &chart.PieChart{ + p := &chart.PieChart{ Font: opt.Font, Background: opt.getBackground(), - Title: opt.Title.Text, - TitleStyle: opt.Title.Style, Width: opt.getWidth(), Height: opt.getHeight(), Values: values, @@ -178,6 +190,17 @@ func newPieChart(opt Options) *chart.PieChart { }, }, } + // pie 图表默认设置为居中 + if opt.Title.Left == "" { + opt.Title.Left = "center" + } + titleRender := newTitleRenderable(opt.Title, p.GetFont(), p.GetColorPalette().TextColor()) + if titleRender != nil { + p.Elements = []chart.Renderable{ + titleRender, + } + } + return p } func newChart(opt Options) *chart.Chart { @@ -214,8 +237,6 @@ func newChart(opt Options) *chart.Chart { ColorPalette: &ThemeColorPalette{ Theme: opt.Theme, }, - Title: opt.Title.Text, - TitleStyle: opt.Title.Style, Width: opt.getWidth(), Height: opt.getHeight(), XAxis: xAxis, @@ -224,20 +245,26 @@ func newChart(opt Options) *chart.Chart { Series: GetSeries(opt.Series, tickPosition, opt.Theme), } - // 设置secondary的样式 + elements := make([]chart.Renderable, 0) + if legendSize != 0 { - c.Elements = []chart.Renderable{ - LegendCustomize(c.Series, LegendOption{ - Theme: opt.Theme, - IconDraw: DefaultLegendIconDraw, - Align: opt.Legend.Align, - Padding: opt.Legend.Padding, - Left: opt.Legend.Left, - Right: opt.Legend.Right, - Top: opt.Legend.Top, - Bottom: opt.Legend.Bottom, - }), - } + elements = append(elements, NewLegendCustomize(c.Series, LegendOption{ + Theme: opt.Theme, + IconDraw: DefaultLegendIconDraw, + Align: opt.Legend.Align, + Padding: opt.Legend.Padding, + Left: opt.Legend.Left, + Right: opt.Legend.Right, + Top: opt.Legend.Top, + Bottom: opt.Legend.Bottom, + })) + } + titleRender := newTitleRenderable(opt.Title, c.GetFont(), c.GetColorPalette().TextColor()) + if titleRender != nil { + elements = append(elements, titleRender) + } + if len(elements) != 0 { + c.Elements = elements } return c } diff --git a/echarts.go b/echarts.go index a55da5a..cc4ad2f 100644 --- a/echarts.go +++ b/echarts.go @@ -82,9 +82,9 @@ type EChartsPadding struct { box chart.Box } -type LegendPostion string +type Position string -func (lp *LegendPostion) UnmarshalJSON(data []byte) error { +func (lp *Position) UnmarshalJSON(data []byte) error { if len(data) == 0 { return nil } @@ -180,9 +180,8 @@ type ECharsOptions struct { Theme string `json:"theme"` Padding EChartsPadding `json:"padding"` Title struct { - Text string `json:"text"` - // 暂不支持(go-chart默认title只能居中) - TextAlign string `json:"textAlign"` + Text string `json:"text"` + Left Position `json:"left"` TextStyle struct { Color string `json:"color"` FontFamily string `json:"fontFamily"` @@ -196,8 +195,8 @@ type ECharsOptions struct { Data []string `json:"data"` Align string `json:"align"` Padding EChartsPadding `json:"padding"` - Left LegendPostion `json:"left"` - Right LegendPostion `json:"right"` + Left Position `json:"left"` + Right Position `json:"right"` // Top string `json:"top"` // Bottom string `json:"bottom"` } `json:"legend"` @@ -282,6 +281,7 @@ func (e *ECharsOptions) ToOptions() Options { titleTextStyle := e.Title.TextStyle o.Title = Title{ Text: e.Title.Text, + Left: string(e.Title.Left), Style: chart.Style{ FontColor: parseColor(titleTextStyle.Color), FontSize: titleTextStyle.FontSize, diff --git a/examples/charts/main.go b/examples/charts/main.go index 4000b44..fde8f5f 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -55,8 +55,8 @@ var chartOptions = []map[string]string{ "title": "折线图", "option": `{ "title": { - "text": "Line", - "textAlign": "left", + "text": "Line\nHello World", + "left": "right", "textStyle": { "fontSize": 24, "height": 40 @@ -363,6 +363,9 @@ func render(opts renderOptions) ([]byte, error) { } func indexHandler(w http.ResponseWriter, r *http.Request) { + if r.RequestURI != "/" { + return + } query := r.URL.Query() opts := renderOptions{ theme: query.Get("theme"), diff --git a/legend.go b/legend.go index bf968fe..bc9cd39 100644 --- a/legend.go +++ b/legend.go @@ -83,8 +83,8 @@ func covertPercent(value string) float64 { return float64(v) / 100 } -func getLegendLeft(width, legendBoxWidth int, opt LegendOption) int { - left := (width - legendBoxWidth) / 2 +func getLegendLeft(canvasWidth, legendBoxWidth int, opt LegendOption) int { + left := (canvasWidth - legendBoxWidth) / 2 leftValue := opt.Left if leftValue == "auto" || leftValue == "center" { leftValue = "" @@ -106,7 +106,7 @@ func getLegendLeft(width, legendBoxWidth int, opt LegendOption) int { if leftValue != "" { percent := covertPercent(leftValue) if percent >= 0 { - return int(float64(width) * percent) + return int(float64(canvasWidth) * percent) } v, _ := strconv.Atoi(leftValue) return v @@ -114,10 +114,10 @@ func getLegendLeft(width, legendBoxWidth int, opt LegendOption) int { if rightValue != "" { percent := covertPercent(rightValue) if percent >= 0 { - return width - legendBoxWidth - int(float64(width)*percent) + return canvasWidth - legendBoxWidth - int(float64(canvasWidth)*percent) } v, _ := strconv.Atoi(rightValue) - return width - legendBoxWidth - v + return canvasWidth - legendBoxWidth - v } return left } @@ -127,7 +127,7 @@ func getLegendTop(height, legendBoxHeight int, opt LegendOption) int { return 0 } -func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { +func NewLegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { return func(r chart.Renderer, cb chart.Box, chartDefaults chart.Style) { legendDefaults := chart.Style{ FontColor: getTextColor(opt.Theme), @@ -154,7 +154,6 @@ func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { } var textHeight int - var textWidth int var textBox chart.Box labelWidth := 0 // 计算文本宽度与高度(取最大值) @@ -163,7 +162,6 @@ func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { textBox = r.MeasureText(labels[x]) labelWidth += textBox.Width() textHeight = chart.MaxInt(textBox.Height(), textHeight) - textWidth = chart.MaxInt(textBox.Width(), textWidth) } } @@ -175,15 +173,15 @@ func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { lineTextGap := 5 iconAllWidth := iconWidth * len(labels) - spaceAllWidth := chart.DefaultMinimumTickHorizontalSpacing * (len(labels) - 1) + spaceAllWidth := (chart.DefaultMinimumTickHorizontalSpacing + lineTextGap) * (len(labels) - 1) legendBoxWidth := labelWidth + iconAllWidth + spaceAllWidth left := getLegendLeft(cb.Width(), legendBoxWidth, opt) top := getLegendTop(cb.Height(), legendBoxHeight, opt) - left += opt.Padding.Left - top += opt.Padding.Top + left += (opt.Padding.Left + cb.Left) + top += (opt.Padding.Top + cb.Top) legendBox := chart.Box{ Left: left, diff --git a/legend_test.go b/legend_test.go index 5bfacf8..66d3e47 100644 --- a/legend_test.go +++ b/legend_test.go @@ -30,7 +30,7 @@ import ( "github.com/wcharczuk/go-chart/v2" ) -func TestLegendCustomize(t *testing.T) { +func TestNewLegendCustomize(t *testing.T) { assert := assert.New(t) series := GetSeries([]Series{ @@ -48,18 +48,18 @@ func TestLegendCustomize(t *testing.T) { }{ { align: LegendAlignLeft, - svg: "\\nchromeedge", + svg: "\\nchromeedge", }, { align: LegendAlignRight, - svg: "\\nchromeedge", + svg: "\\nchromeedge", }, } for _, tt := range tests { r, err := chart.SVG(800, 600) assert.Nil(err) - fn := LegendCustomize(series, LegendOption{ + fn := NewLegendCustomize(series, LegendOption{ Align: tt.align, IconDraw: DefaultLegendIconDraw, Padding: chart.Box{ diff --git a/theme.go b/theme.go index 051e099..63e000a 100644 --- a/theme.go +++ b/theme.go @@ -31,7 +31,7 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) -var hiddenColor = drawing.Color{R: 0, G: 0, B: 0, A: 0} +var hiddenColor = drawing.Color{R: 255, G: 255, B: 255, A: 0} var AxisColorLight = drawing.Color{ R: 110, diff --git a/title.go b/title.go new file mode 100644 index 0000000..654711c --- /dev/null +++ b/title.go @@ -0,0 +1,96 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "strconv" + "strings" + + "github.com/wcharczuk/go-chart/v2" +) + +type titleMeasureOption struct { + width int + height int + text string +} + +func NewTitleCustomize(title Title) chart.Renderable { + return func(r chart.Renderer, cb chart.Box, chartDefaults chart.Style) { + if len(title.Text) == 0 || title.Style.Hidden { + return + } + if title.Font != nil { + r.SetFont(title.Font) + } + r.SetFontColor(title.Style.FontColor) + titleFontSize := title.Style.GetFontSize(chart.DefaultTitleFontSize) + r.SetFontSize(titleFontSize) + + arr := strings.Split(title.Text, "\n") + textWidth := 0 + textHeight := 0 + measureOptions := make([]titleMeasureOption, len(arr)) + for index, str := range arr { + textBox := r.MeasureText(str) + + w := textBox.Width() + h := textBox.Height() + if w > textWidth { + textWidth = w + } + if h > textHeight { + textHeight = h + } + measureOptions[index] = titleMeasureOption{ + text: str, + width: w, + height: h, + } + } + + titleX := 0 + switch title.Left { + case "right": + titleX = cb.Left + cb.Width() - textWidth + case "center": + titleX = cb.Left + cb.Width()>>1 - (textWidth >> 1) + default: + if strings.HasSuffix(title.Left, "%") { + value, _ := strconv.Atoi(strings.ReplaceAll(title.Left, "%", "")) + titleX = cb.Left + cb.Width()*value/100 + } else { + value, _ := strconv.Atoi(title.Left) + titleX = cb.Left + value + } + } + + titleY := cb.Top + title.Style.Padding.GetTop(chart.DefaultTitleTop) + (textHeight >> 1) + + for _, item := range measureOptions { + x := titleX + (textWidth-item.width)>>1 + r.Text(item.text, x, titleY) + titleY += textHeight + } + } +} From 25e9984ad80090b61e60f2b03bde7bb37fc3b80a Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 1 Jan 2022 20:11:51 +0800 Subject: [PATCH 039/251] feat: support customize title --- charts.go | 5 ++- echarts_test.go | 12 ++++++ examples/charts/main.go | 2 +- legend.go | 6 +-- legend_test.go | 35 +++++++++++++++++ range_test.go | 23 +++++++++++ title.go | 6 ++- title_test.go | 85 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 title_test.go diff --git a/charts.go b/charts.go index 9216606..595f569 100644 --- a/charts.go +++ b/charts.go @@ -194,7 +194,10 @@ func newPieChart(opt Options) *chart.PieChart { if opt.Title.Left == "" { opt.Title.Left = "center" } - titleRender := newTitleRenderable(opt.Title, p.GetFont(), p.GetColorPalette().TextColor()) + themeColorPalette := &ThemeColorPalette{ + Theme: opt.Theme, + } + titleRender := newTitleRenderable(opt.Title, p.GetFont(), themeColorPalette.TextColor()) if titleRender != nil { p.Elements = []chart.Renderable{ titleRender, diff --git a/echarts_test.go b/echarts_test.go index 0702591..6dcc4d0 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -398,6 +398,18 @@ func TestParseECharsOptions(t *testing.T) { }, options) } +func TestUnmarshalJSON(t *testing.T) { + assert := assert.New(t) + var lp Position + err := lp.UnmarshalJSON([]byte("123")) + assert.Nil(err) + assert.Equal("123", string(lp)) + + err = lp.UnmarshalJSON([]byte(`"234"`)) + assert.Nil(err) + assert.Equal("234", string(lp)) +} + func BenchmarkEChartsRenderPNG(b *testing.B) { for i := 0; i < b.N; i++ { _, err := RenderEChartsToPNG(`{ diff --git a/examples/charts/main.go b/examples/charts/main.go index fde8f5f..1828a52 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -363,7 +363,7 @@ func render(opts renderOptions) ([]byte, error) { } func indexHandler(w http.ResponseWriter, r *http.Request) { - if r.RequestURI != "/" { + if r.URL.Path != "/" { return } query := r.URL.Query() diff --git a/legend.go b/legend.go index bc9cd39..c85564f 100644 --- a/legend.go +++ b/legend.go @@ -72,7 +72,7 @@ func DefaultLegendIconDraw(r chart.Renderer, opt LegendIconDrawOption) { r.FillStroke() } -func covertPercent(value string) float64 { +func convertPercent(value string) float64 { if !strings.HasSuffix(value, "%") { return -1 } @@ -104,7 +104,7 @@ func getLegendLeft(canvasWidth, legendBoxWidth int, opt LegendOption) int { return left } if leftValue != "" { - percent := covertPercent(leftValue) + percent := convertPercent(leftValue) if percent >= 0 { return int(float64(canvasWidth) * percent) } @@ -112,7 +112,7 @@ func getLegendLeft(canvasWidth, legendBoxWidth int, opt LegendOption) int { return v } if rightValue != "" { - percent := covertPercent(rightValue) + percent := convertPercent(rightValue) if percent >= 0 { return canvasWidth - legendBoxWidth - int(float64(canvasWidth)*percent) } diff --git a/legend_test.go b/legend_test.go index 66d3e47..8f21210 100644 --- a/legend_test.go +++ b/legend_test.go @@ -76,3 +76,38 @@ func TestNewLegendCustomize(t *testing.T) { assert.Equal(tt.svg, buf.String()) } } + +func TestConvertPercent(t *testing.T) { + assert := assert.New(t) + + assert.Equal(-1.0, convertPercent("12")) + + assert.Equal(0.12, convertPercent("12%")) +} + +func TestGetLegendLeft(t *testing.T) { + assert := assert.New(t) + + assert.Equal(150, getLegendLeft(500, 200, LegendOption{})) + + assert.Equal(0, getLegendLeft(500, 200, LegendOption{ + Left: "left", + })) + assert.Equal(100, getLegendLeft(500, 200, LegendOption{ + Left: "20%", + })) + assert.Equal(20, getLegendLeft(500, 200, LegendOption{ + Left: "20", + })) + + assert.Equal(300, getLegendLeft(500, 200, LegendOption{ + Right: "right", + })) + assert.Equal(200, getLegendLeft(500, 200, LegendOption{ + Right: "20%", + })) + assert.Equal(280, getLegendLeft(500, 200, LegendOption{ + Right: "20", + })) + +} diff --git a/range_test.go b/range_test.go index 3e80568..33937bf 100644 --- a/range_test.go +++ b/range_test.go @@ -23,6 +23,7 @@ package charts import ( + "math" "testing" "github.com/stretchr/testify/assert" @@ -52,3 +53,25 @@ func TestHiddenRange(t *testing.T) { assert.Equal(float64(0), r.GetDelta()) } + +func TestYContinuousRange(t *testing.T) { + assert := assert.New(t) + r := YContinuousRange{} + r.Min = -math.MaxFloat64 + r.Max = math.MaxFloat64 + + assert.True(r.IsZero()) + + r.SetMin(1.0) + assert.Equal(1.0, r.GetMin()) + // 再次设置无效 + r.SetMin(2.0) + assert.Equal(1.0, r.GetMin()) + + r.SetMax(5.0) + // *1.2 + assert.Equal(6.0, r.GetMax()) + // 再次设置无效 + r.SetMax(10.0) + assert.Equal(6.0, r.GetMax()) +} diff --git a/title.go b/title.go index 654711c..3d75b5d 100644 --- a/title.go +++ b/title.go @@ -40,9 +40,11 @@ func NewTitleCustomize(title Title) chart.Renderable { if len(title.Text) == 0 || title.Style.Hidden { return } - if title.Font != nil { - r.SetFont(title.Font) + font := title.Font + if font == nil { + font, _ = chart.GetDefaultFont() } + r.SetFont(font) r.SetFontColor(title.Style.FontColor) titleFontSize := title.Style.GetFontSize(chart.DefaultTitleFontSize) r.SetFontSize(titleFontSize) diff --git a/title_test.go b/title_test.go new file mode 100644 index 0000000..0fe8256 --- /dev/null +++ b/title_test.go @@ -0,0 +1,85 @@ +// MIT License + +// Copyright (c) 2021 Tree Xie + +// 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. + +package charts + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestTitleCustomize(t *testing.T) { + assert := assert.New(t) + tests := []struct { + title Title + svg string + }{ + // 单行标题 + { + title: Title{ + Text: "Hello World!", + Style: chart.Style{ + FontColor: drawing.ColorBlack, + }, + }, + svg: "\\nHello World!", + }, + // 多行标题,靠右 + { + title: Title{ + Text: "Hello World!\nHello World", + Style: chart.Style{ + FontColor: drawing.ColorBlack, + }, + Left: "right", + }, + svg: "\\nHello World!Hello World", + }, + // 标题居中 + { + title: Title{ + Text: "Hello World!", + Style: chart.Style{ + FontColor: drawing.ColorBlack, + }, + Left: "center", + }, + svg: "\\nHello World!", + }, + } + for _, tt := range tests { + r, err := chart.SVG(800, 600) + assert.Nil(err) + fn := NewTitleCustomize(tt.title) + fn(r, chart.NewBox(50, 50, 600, 400), chart.Style{ + Font: chart.StyleTextDefaults().Font, + }) + buf := bytes.Buffer{} + err = r.Save(&buf) + assert.Nil(err) + assert.Equal(tt.svg, buf.String()) + } +} From 72896d1c3f54e6d0e9372f52c792ef87dcefd9c3 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 2 Jan 2022 09:45:12 +0800 Subject: [PATCH 040/251] feat: support top setting for title --- README.md | 3 +- charts.go | 8 +- echarts.go | 2 + examples/demo/main.go | 365 ++++++++++++++++++++++++++++++++++++++++++ title.go | 5 + 5 files changed, 379 insertions(+), 4 deletions(-) create mode 100644 examples/demo/main.go diff --git a/README.md b/README.md index 382a2f2..c387af2 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ func main() { - `title` 图表标题,包括标题内容、高度、颜色等 - `title.text` 标题内容 - `title.left` 标题与容器左侧的距离,可设置为`left`, `right`, `center`, `20%` 以及 `20` 这样的具体数值 + - `title.top` 标题与容器顶部的距离,暂仅支持具体数值,如`20` - `title.textStyle.color` 标题文字颜色 - `title.textStyle.fontSize` 标题文字字体大小 - `title.textStyle.height` 标题高度 @@ -87,7 +88,7 @@ func main() { -简单的图表生成PNG在20ms左右,而SVG的性能则更快,性能上比起使用`chrome headless`加载`echarts`图表展示页面,截图生成的方式大幅度提升,基本能满足简单的图表生成需求。 +简单的图表生成PNG在20ms左右,而SVG的性能则更快,性能上比起使用`chrome headless`加载`echarts`图表展示页面再截图生成的方式大幅度提升,满足简单的图表生成需求。 ```bash goos: darwin diff --git a/charts.go b/charts.go index 595f569..17b5975 100644 --- a/charts.go +++ b/charts.go @@ -49,6 +49,7 @@ type ( Style chart.Style Font *truetype.Font Left string + Top string } Legend struct { Data []string @@ -194,10 +195,11 @@ func newPieChart(opt Options) *chart.PieChart { if opt.Title.Left == "" { opt.Title.Left = "center" } - themeColorPalette := &ThemeColorPalette{ - Theme: opt.Theme, + titleColor := drawing.ColorBlack + if opt.Theme == ThemeDark { + titleColor = drawing.ColorWhite } - titleRender := newTitleRenderable(opt.Title, p.GetFont(), themeColorPalette.TextColor()) + titleRender := newTitleRenderable(opt.Title, p.GetFont(), titleColor) if titleRender != nil { p.Elements = []chart.Renderable{ titleRender, diff --git a/echarts.go b/echarts.go index cc4ad2f..bf88206 100644 --- a/echarts.go +++ b/echarts.go @@ -182,6 +182,7 @@ type ECharsOptions struct { Title struct { Text string `json:"text"` Left Position `json:"left"` + Top Position `json:"top"` TextStyle struct { Color string `json:"color"` FontFamily string `json:"fontFamily"` @@ -282,6 +283,7 @@ func (e *ECharsOptions) ToOptions() Options { o.Title = Title{ Text: e.Title.Text, Left: string(e.Title.Left), + Top: string(e.Title.Top), Style: chart.Style{ FontColor: parseColor(titleTextStyle.Color), FontSize: titleTextStyle.FontSize, diff --git a/examples/demo/main.go b/examples/demo/main.go new file mode 100644 index 0000000..9c77078 --- /dev/null +++ b/examples/demo/main.go @@ -0,0 +1,365 @@ +package main + +import ( + "bytes" + "net/http" + + charts "github.com/vicanso/go-charts" +) + +var html = ` + + + + + + + + go-charts + + +
{{body}}
+ + +` + +var chartOptions = []map[string]string{ + { + "option": `{ + "title": { + "text": "Line", + "left": "center" + }, + "yAxis": { + "min": 0, + "max": 300 + }, + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "data": [150, 230, 224, 218, 135, 147, 260], + "type": "line" + } + ] +}`, + }, + { + "option": `{ + "legend": { + "align": "left", + "left": 0, + "data": ["Email", "Union Ads", "Video Ads", "Direct", "Search Engine"] + }, + "xAxis": { + "type": "category", + "boundaryGap": false, + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "type": "line", + "data": [120, 132, 101, 134, 90, 230, 210] + }, + { + "data": [220, 182, 191, 234, 290, 330, 310] + }, + { + "data": [150, 232, 201, 154, 190, 330, 410] + }, + { + "data": [320, 332, 301, 334, 390, 330, 320] + }, + { + "data": [820, 932, 901, 934, 1290, 1330, 1320] + } + ] +}`, + }, + { + "title": "柱状图(自定义颜色)", + "option": `{ + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "data": [ + 120, + { + "value": 200, + "itemStyle": { + "color": "#a90000" + } + }, + 150, + 80, + 70, + 110, + 130 + ], + "type": "bar" + } + ] +}`, + }, + { + "title": "多柱状图", + "option": `{ + "title": { + "text": "Rainfall vs Evaporation", + "top": 10 + }, + "legend": { + "data": ["Rainfall", "Evaporation"] + }, + "xAxis": { + "type": "category", + "splitNumber": 12, + "data": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + }, + "series": [ + { + "name": "Rainfall", + "type": "bar", + "data": [2, 4.9, 7, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20, 6.4, 3.3] + }, + { + "name": "Evaporation", + "type": "bar", + "data": [2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6, 2.3] + } + ] +}`, + }, + { + "title": "折柱混合", + "option": `{ + "legend": { + "data": [ + "Evaporation", + "Precipitation", + "Temperature" + ] + }, + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "yAxis": [ + { + "type": "value", + "name": "Precipitation", + "min": 0, + "max": 250, + "interval": 50, + "axisLabel": { + "formatter": "{value} ml" + } + }, + { + "type": "value", + "name": "Temperature", + "min": 0, + "max": 25, + "interval": 5, + "axisLabel": { + "formatter": "{value} °C" + } + } + ], + "series": [ + { + "name": "Evaporation", + "type": "bar", + "itemStyle": { + "color": "#0052d9" + }, + "data": [2, 4.9, 7, 23.2, 25.6, 76.7, 135.6] + }, + { + "name": "Precipitation", + "type": "bar", + "data": [2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6] + }, + { + "name": "Temperature", + "type": "line", + "yAxisIndex": 1, + "data": [2, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3] + } + ] +}`, + }, + { + "title": "降雨量", + "option": `{ + "title": { + "text": "Rainfall", + "left": "right" + }, + "legend": { + "data": ["GZ", "SH"] + }, + "xAxis": { + "type": "category", + "splitNumber": 6, + "data": ["01-01","01-02","01-03","01-04","01-05","01-06","01-07","01-08","01-09","01-10","01-11","01-12","01-13","01-14","01-15","01-16","01-17","01-18","01-19","01-20","01-21","01-22","01-23","01-24","01-25","01-26","01-27","01-28","01-29","01-30","01-31"] + }, + "yAxis": { + "axisLabel": { + "formatter": "{value} mm" + } + }, + "series": [ + { + "type": "bar", + "data": [928,821,889,600,547,783,197,853,430,346,63,465,309,334,141,538,792,58,922,807,298,243,744,885,812,231,330,220,984,221,429] + }, + { + "type": "bar", + "data": [749,201,296,579,255,159,902,246,149,158,507,776,186,79,390,222,601,367,221,411,714,620,966,73,203,631,833,610,487,677,596] + } + ] +}`, + }, + { + "title": "饼图", + "option": `{ + "title": { + "text": "Referer of a Website" + }, + "series": [ + { + "name": "Access From", + "type": "pie", + "radius": "50%", + "data": [ + { + "value": 1048, + "name": "Search Engine" + }, + { + "value": 735, + "name": "Direct" + }, + { + "value": 580, + "name": "Email" + }, + { + "value": 484, + "name": "Union Ads" + }, + { + "value": 300, + "name": "Video Ads" + } + ] + } + ] +}`, + }, +} + +type renderOptions struct { + theme string + width int + height int + onlyCharts bool +} + +func render(opts renderOptions) ([]byte, error) { + data := bytes.Buffer{} + for _, m := range chartOptions { + chartHTML := []byte(`
+ {{svg}} +
`) + o, err := charts.ParseECharsOptions(m["option"]) + if err != nil { + return nil, err + } + if opts.width > 0 { + o.Width = opts.width + } + if opts.height > 0 { + o.Height = opts.height + } + + for _, theme := range []string{ + charts.ThemeDark, + charts.ThemeLight, + } { + o.Theme = theme + g, err := charts.New(o) + if err != nil { + return nil, err + } + buf, err := charts.ToSVG(g) + if err != nil { + return nil, err + } + buf = bytes.ReplaceAll(chartHTML, []byte("{{svg}}"), buf) + data.Write(buf) + } + } + return data.Bytes(), nil +} + +func indexHandler(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/" { + return + } + query := r.URL.Query() + opts := renderOptions{ + theme: query.Get("theme"), + width: 400, + height: 200, + onlyCharts: true, + } + buf, err := render(opts) + if err != nil { + w.WriteHeader(400) + w.Write([]byte(err.Error())) + return + } + + data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), buf) + w.Header().Set("Content-Type", "text/html") + w.Write(data) +} + +func main() { + http.HandleFunc("/", indexHandler) + http.ListenAndServe(":3012", nil) +} diff --git a/title.go b/title.go index 3d75b5d..228b2c0 100644 --- a/title.go +++ b/title.go @@ -88,6 +88,11 @@ func NewTitleCustomize(title Title) chart.Renderable { } titleY := cb.Top + title.Style.Padding.GetTop(chart.DefaultTitleTop) + (textHeight >> 1) + // TOP 暂只支持数值 + if title.Top != "" { + value, _ := strconv.Atoi(title.Top) + titleY += value + } for _, item := range measureOptions { x := titleX + (textWidth-item.width)>>1 From bf6eb24aff3a6a371cb24f1c3e0b7b14a87672f6 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 2 Jan 2022 09:48:04 +0800 Subject: [PATCH 041/251] chore: update go modules --- go.mod | 4 ++-- go.sum | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 8138b37..ed3b24a 100644 --- a/go.mod +++ b/go.mod @@ -4,14 +4,14 @@ go 1.17 require ( github.com/vicanso/elton v1.8.1 - github.com/vicanso/go-charts v0.0.2-0.20211226014821-6d53559d49cf + github.com/vicanso/go-charts v0.0.3-0.20220102014512-72896d1c3f54 ) require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/tidwall/gjson v1.12.0 // indirect + github.com/tidwall/gjson v1.12.1 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/vicanso/hes v0.4.1 // indirect diff --git a/go.sum b/go.sum index 8c48ab3..6f9acb1 100644 --- a/go.sum +++ b/go.sum @@ -14,16 +14,17 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tidwall/gjson v1.12.0 h1:61wEp/qfvFnqKH/WCI3M8HuRut+mHT6Mr82QrFmM2SY= github.com/tidwall/gjson v1.12.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.12.1 h1:ikuZsLdhr8Ws0IdROXUS1Gi4v9Z4pGqpX/CvJkxvfpo= +github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/vicanso/elton v1.8.1 h1:axrPozxBaTn9qqCJJ+aSGK+/Y8oLuEm0uXM5wm/glIs= github.com/vicanso/elton v1.8.1/go.mod h1:BWQknlDpKtw2L5oer3mtBJo/vpBUYUHAjZL3yFV1+ak= -github.com/vicanso/go-charts v0.0.2-0.20211226014821-6d53559d49cf h1:4+ykVNLlgrXTENY0HkKEQsWUppWeKi9dtSAG0uZKgTU= -github.com/vicanso/go-charts v0.0.2-0.20211226014821-6d53559d49cf/go.mod h1:Kylthw+IZk7hDvhrj4CTN+DAsLzG01y91FOOElGv7vk= +github.com/vicanso/go-charts v0.0.3-0.20220102014512-72896d1c3f54 h1:Ij1XVU2Ov6661PtxSdYwyjXha7TC8z0Dm01bYzj2ZNs= +github.com/vicanso/go-charts v0.0.3-0.20220102014512-72896d1c3f54/go.mod h1:Kylthw+IZk7hDvhrj4CTN+DAsLzG01y91FOOElGv7vk= github.com/vicanso/hes v0.4.1 h1:lq27wDXAljoROtYbFDTL5gY51SdeY+9L0ohEiRadwTU= github.com/vicanso/hes v0.4.1/go.mod h1:B0l1NIQM/nYw7owAd+hyHuNnAD8Nsx0T6duhVxmXUBY= github.com/vicanso/intranet-ip v0.0.1 h1:cYS+mExFsKqewWSuHtFwAqw/CO66GsheB/P1BPmSTx0= From 42e48ca3b7196be88dc5587f6bb221d5747346a1 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 2 Jan 2022 09:59:27 +0800 Subject: [PATCH 042/251] docs: update readme --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c387af2..fcd156c 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,6 @@ func main() { ## 性能 - 简单的图表生成PNG在20ms左右,而SVG的性能则更快,性能上比起使用`chrome headless`加载`echarts`图表展示页面再截图生成的方式大幅度提升,满足简单的图表生成需求。 ```bash @@ -97,4 +96,9 @@ pkg: github.com/vicanso/go-charts cpu: Intel(R) Core(TM) i5-8257U CPU @ 1.40GHz BenchmarkEChartsRenderPNG-8 60 17765045 ns/op 2492854 B/op 1007 allocs/op BenchmarkEChartsRenderSVG-8 282 4303042 ns/op 32622688 B/op 2983 allocs/op -``` \ No newline at end of file +``` + +## 中文字符 + +默认使用的字符为`Roboto`为英文字体库,因此如果需要显示中文字符需要增加中文字体库,`InstallFont`函数可添加对应的字体库,成功添加之后则指定`title.textStyle.fontFamily`即可。 +在浏览器中使用`svg`时,如果指定的`fontFamily`不支持中文字符,展示的中文并不会乱码,但是会导致在计算字符宽度等错误。 From 1bded8e75121426b72051132f3efa2d93473ee14 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 2 Jan 2022 10:02:20 +0800 Subject: [PATCH 043/251] refactor: adjust access log --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 22eb584..8b52a14 100644 --- a/main.go +++ b/main.go @@ -18,7 +18,7 @@ func main() { e := elton.New() e.Use(middleware.NewLogger(middleware.LoggerConfig{ - Format: middleware.LoggerCombined, + Format: `{real-ip} {when-iso} "{method} {uri} {proto}" {status} {size-human} "{userAgent}"`, OnLog: func(s string, _ *elton.Context) { fmt.Println(s) }, From dfdcbd9534eef4bb6f91df116a6d4433e52598d6 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 2 Jan 2022 10:13:32 +0800 Subject: [PATCH 044/251] docs: update screenshot --- README.md | 2 +- assets/go-charts.png | Bin 267314 -> 302307 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fcd156c..41af8f6 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-charts/blob/master/LICENSE) [![Build Status](https://github.com/vicanso/go-charts/workflows/Test/badge.svg)](https://github.com/vicanso/go-charts/actions) -`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,无其它模块的依赖纯golang的实现,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可,`go-charts`兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图(黑夜模式): +`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,无其它模块的依赖纯golang的实现,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可,`go-charts`兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图(两种模式): ![go-charts](./assets/go-charts.png) diff --git a/assets/go-charts.png b/assets/go-charts.png index 9865cd296e03626b8773a917808be5194ddc25ba..12e6e9d78f0a5cb9af2b5ea69a67eb852c010039 100644 GIT binary patch literal 302307 zcmb@uWmwc(`!s&inNkIx1n+zKR0|Qq^T3iJK%9BMtB$4`EF+bmLH1fMuTN6|B)qT_r2WLkW=ZFWpa@cG} z_3()B!yW#5H|od3-EYbS+HS~K^{UaZo0aAptr6Y0d*ouQWfuFKK}H5SIwtI*I@9VN z>pPb^lE1=w=O6I}ZL@E@`*-$_vTWbYGK3ZXD0q-c7#{EZazW}R3l+?Py_$8e=Tp2w zFQL?@*4N}LwmqM-B!wg>)OnH*0=~2}ud?;&)O01RF7e%4J&G~?IYjpQW{B3ue+aPi z7{A{me}1-^p(Q;4oo*LhJEM1GT4MeXVSIzg;;X(Wk{p#%7?YZ`7un>HcG&75BKiIg z`=1>CK19hPx5E2*u6LPLs2G7~hccdpnG)ge8*S$oYBQOx^I8PI zK6QZ0^uwiYnt5-ct`l`O{>ucjnED%dcpnCCniic;*X8@zU7c{RB5tkoJHGp!eQN@! z1?!!(wi5;hJ1zRZ8}6B+uHel(MsiZ(;BW9c6|3{b_$T2|M*NkU`{Y*gDMaD)>I&xj zz9iIVF77qKcRC5_hplfOmfD-*YDdvq$CBw*vPy_!(`%QNGtot6i09;FM2_y-ikQ!i zB`I*5DUG?fz~**f&V8G;&cgj3$(tk1oArHH`O5OQ3Bb!YjUK)1V?LB+8>20-PuZ)LlN)`-@<|T=iD?jG!LLYf&l>m9FV8k85zXH#IbXw)z!$0^CQGM z>D)o3wl=k@ib}}m&yU1zfddm^!_0cMoHmA!F|MTJvlaBI4LQqfx>w{q1%J+PSg*K= zc+ZJY(>8aS>R#%kmmT+1kn{y~l2HpjcxIe%i`G(HT$~QYoXVoH-av(r8#8QInqZX9>)T-d&s1ymWaw`q+;o&_6o zlw6WZ`D*{l%r8+)4e+0JIc-*tRd4V()EITY`fl9R z7K2A_H-i`KbG9{o8d4e?%n@nAwmXd#)v(?Ao(1ewvuLJVw^C=^{i2PnZ3r!ia`@Pt zcE8t;Gczrp&NiCtyBeM^1$PIq>8str((OABthD@2Yt7&1SW-OG+N$c>oX)yRmL{q( zsv_1aeS*j1t86MAdTrYegu=YAJ`9Is#4T($uA&0AU%hhkXS1~2^=Av&rVuePy-0St zeHG(WL-m5jhKZRua#;@?qEn|4?EVC=wYBwL?hRld{LLJ2UP;A%>&R_=L41Obc`nu` zIJztSGmJLz0v?$eB~=JE!${4G$qk;o+%>B!_VVe5^Kx!$U0><(k)qv4fy37xMgOWg z)FC-N%H(`1TJ1@W0Ng`ze8G3Ww0K$akFCriQT`}SRQ&-Cwydn|g9iq8*$`X8be8Ko z4zlCNtRf$t@Bq;;8X`xE75JWf)~Rr;G8y}IV=+KKgv5@hvbyFJOLwwj;C%9^`znhqA z%2xCs=i9!ol2={rZn$`Jiip=KZk$b5ztZQOboHMX+^jz`GE5LDevpt(PEO7MeY>D= zu8ccC3d{H~$!|S+HAbtK7mcs`h~}wlOos?23=F$FqsF=$->rRRYMPxG4FlSs5Pa|$ zrBxJLn_&vn)AaKeX5aG+N#LzDp!mM24CZ>TUP0eWqp0#U<+cD=|?~v|DFKOp4=c8_A*dWi9FssaJ`Ro0+MkhNG}SpivLxab-j*Mr- zBHkSW?&D(8xs^6k+A1n4dU|?&Jw-V|;r=x0V=(}zkOXGqS z)frI_27jt%|HOHv-YhU_bm5Y^ni}xp#Z88-&%P;IDk=*g zA)wN~jc51!>q9R;{EaYJ%|%#?ad(x6?aj)%cU&gD-;C!E8oms*VkW1+#}?gK4~r;| zW;;-?^UNk2QIm}CCDvirsa79!T=e8Kj59;P@8w>n1i7BVsVA==5)pX7wq~296z+P> zHOO6Y4GQegqmWxy8aD`Ob(iw1tE)3I=r|8P{5e1cV90bE?=S@D7a25|T?=0J5p;dy z8;14;#OK$tK7Ta}62WnR64*vXZ*ELTRwX+DA9^TVXO-g?y4FhPGbqGKB(H zqOarR61|Jy?~8}M8ISzB_u68s*tP7wBUX#B7rV`z?|e>iW?I_YK9p&bH5VtRDO*{Y zlRrYwX7!glS=z?^M~~K+X=rH|MPV_isi|8&-abCLY#1HJNcBS!^@%2fK0zVD^7BKE zL5Q_8mCdtPCp}W05~1bFJc-AiO&(z|gPG1(y1rDLZBBKMjD ztCHq9Vsb?Ac=%aFgLh>G?V@E%-eQF{-_B=bug#<{G(VBgzH^r0#fxu~G(RE(APWHv zC)6*_L@xSa(g0o;P}N~|s*EUq=FZ{)l*wX_}`??rrdn&{DwMAFEN z4$dq_7dtFwQTC@Y5R;I=WT9+crW!NvwL&%0z+kKdF$fzOK+tIE&Ic_&lS!zF39M%SJzKo3ZI!Urrs}l6H z6mQ~a;sEIAj0|A0?iG(<;YA+<_rCOReD*4_Y;n9IZkI+ARlVKk^`=t_GTk#?cq_|3 zX3ub6A|(JAm8F7WRSBG|32gC|O&qS;0dS%QOEo=w+R$w|_dRr0D#fJOJ)~-8C zXSv*F@}(29cpYcOmdw0Hx*_UGv&Dbbm-_tqb0h>7{HcD|cmDu5i9>&ix%q1JkO(a; z*9$t7(XW^~0z_$9S+`|;;yDxZM#NQX_wV0uCZ^nb={N4e?!qwA^3aGBn*eI7wd+0I zEceHP7a8;h2BSFA$8RF~`VL2w7ZRtlvp$GPjfzecS^+rKK0c0RMyB!2f5h&ll zfC`i3Jtyt(M~aLaA$9g$xByHJzeB^ewOmXEd*<*MW3KOBm9@DwzQ3}CtmESf(H zb!uvqg+uL8+2@^p|c+mk$qD}qOl z7$?Zd$e48rww5}hn%btP^&k+4wY7EV;Q08sUiG{0TU@rVwtUSZJZcdk*DbC6#7B=F z^~7^AJbpY6ESACo11MfR;2x~YcM{~pAe-H7T{kN=)p!#gQEu*|ov|99O$CT;*}>HS zZ*N67)p5NpI~)$T*03+s){kipMaxaerK#v3^`zQ*jD5lY2PY&lGP1b%nV6VZXpym@ z;r_vLH~99}mW{c&d8p&Sz`*|gJ`+3p%DY==*)lsJm#baRXY3!-(UrS!6&78D=#Si) zt0DA8OjUaxdv-r<;9s~dRQw^P%^ddj_M!H_#>ZbUFsxc%8R_UG)YR0pRTi6lQ zJ%HwiQ4r(`8)3`s~d zSzk5Mn#L{YlzHZ7Xiv=LK_FZ*iG>Pv)|$I&t`fy*X}XcId6dWeJO3l9C=N}{u~IpQ zQzTM4A?BhGD22{eNLaYr%w%F>f{;NWy1b{OW4`*Y63me(rwvl}RWUkADKm_$0< zn>X1*$hXGfXBAaeGjHS~eYeMVx*VkFP&Y9iqayv4`uh4HUim~U8lQ9xs^7gD{53kN zG5u?1=EB+@jhH%NU6%K*3sYW)wLQ<2XMFYkiLFCI^QKb$) z>|1UpUFS>$h1*|;;^-uNBnm|#E2^-uu^;fA?Css(_1T;Mu=M>ah=a>0qi|}`*lEg6 zhriNk+UxdcZ*-iMb<|9sdg8V}E2?)Ag6K;%zY2#Xn(Pst?BQU%-;#D15cM&Gyw1~lBZrT3BkXM#I&EQrG*Bc=B!hA{woU7-8mS? zYN4Z(Q#Tfj&f1+)*z;&y)X>oI2~y8d_3)6>%{HdI$n&oI)? zZmzNSzx#$#9$yhdEv@dIUhZ|bd6NEjnOCoV`{KX=Zfq1q)p{I0{kt_#{}$=HSh>d1 zX&bkXqjVE_*M5Kh*NVRobZl+|v4uxq;A+}!jZ zUlL_TO_rI5yYH?KWp`h-ehvu%k%PtB{_Wdee=QKS6~G#71}w867VBKrv6bty+4+v1 z3$;`JwT?}x0LX_A9~K${0|S>~Q!y->E!!aO_x?Y=K2nsF3 zZBYzt^VPHuuG7#(&R%|6+RM_dxa@4;smu%v?c?KG(=WKWqZhA3mX-s2EPkj_H`&#< zE}t@qSp=1*EN|LWT@z_8QcLMrq*_*%F_9CYO5dsZ?%lf?9V;NA-*{FU7rirYY(IiO zXNh$#N@X;_!N2D3b%Q{CI5)q!sk;x?l#!7U7x!O^53h6EWv@H%ads}JJ0;_>QUhk# zPWf`)Ogy2%>BwU0>p^YCKpC zs?FMtS_LcXQbboFCnQwdZ@Dokm6cR|M>=ZU=&Ux1uD6l8w>kGCJzbRvy@k$F({4Ig z&v=Qk+x8^Uqet%NC$?^G2oQmyF9H@97x~vPZU*^0=nm_}JEwa9tV3gFPcD7)>t6Am z@A1^<)!ZkXtNB}NvP#M;zR$()fW%jW4O3B7#l3g$a>Sk`CHsz2YYl0{NkvKgkDeYUR-kboK4>RR;$LEun5Z)29`&sUkiC?t5=fVN0Whx>1plFGewpB&PzsZEbib zdHsRm6R1yC3~JZE>y77XL_-j$@Y+hR?hTS#iWCT)-RgAP5RqX_wDn>zM-~(m{QC9F zWph+pS64AvV5Fd|Fpqg((kXJE_V@-mW{Qh1RZ5`&5k}7IcT?zcYXM)QzbEGQ zE@;kREdA3i{G8Q29JE-F&0EvPD`S$H31|5amsOw1UN;LK&!0>cg`#!G+?DHFd0e6 zv?!uNe@bdW?1%Q-)(Go&6F)#7Vm+#uRpDIy77oVm|?_i=eg>4 zQM_i*!^cpv&$2!NB`yqPZkIA% zyMAnYcKz#3o`}+t3GVZ{5-jSN#q_@qU(PXKVZJPC1zTb1l`=lM{&dh{%A@`9t&;}s z%u|cMN5?uLE0z?hRT)aiev=wDzy}XL^CR8edzDwB&H;sV%?obtmk#; z&)?rmLm&Oa9_&<7h z6!SDkzU399Mn|9@-61L%CPEb6`_n&zag%}m??a1qA%gpBvSMz*4}7)mpqrtOSKSTX zJP7YqKr%4x2mSq6svTwp*1~{#>J#1Q^Fz)Q^uiu1AXd8DoCHZFIrOu~PadY?4v300yk|4~Lx z&bK`r<=O2tvyr*!-r=Vm!%uTyHM*EQELI;sF*5MlWLR4f(vj=qmLFM+7u(0=VbI#- ze4PFwUFH@>WlPRE$=fo^e`Y35#&ZMXE8%R051B1F4S6El?1PvC_99tzklTq=iHOcHaS)lCo-&pyn&%dJ2lln4f*c+Y2mZvSTvp#dq(OewTINqS>}K=34Q+fuSZa zg(pe`i7yJ$Y-QnslQ5@%#M;RFi%eidQOwOUE`^tJ_-VP7XsPAltK&`UvApk+1NRA7 zByndl7rGtCL_+e+C?A=N#WaC)SsRyivNVUE)9c^$bOK92ZOoeTx72*{6@*9{+3?3= ze;9Fcf@Em2`tXgxDWY}4Oy0!EQ9+&kF3?ycuz~gXnpm!*f#E96ZQjiMQ6YJsa}hCK z1lNr1TZbNt$o@TTO=c(sulFcXx{Syj;+=~(ZV1v+ZPmHP{L!20p}Dr|?d3MMgVn*% z27v?$RdF@EV=2n}5R9puZ<_lbpREKkH`Vp@TO-<{xhMoS4i~H}HYQj)rMw|qNA4@t zyPc7R_=TEMUn+14ktOlV3rd?K1ag&&a7+3jVtjU0UjGK~)+ADr#^yzw5*ud1Og zJ><{ANTYbM<$Z*>{cbk7E_^WG{ncHVlA+C{_n(*Di_1?T`CT3!y%2$sqN#kDp&Mvr z&w1FaQgPL;v+kG{OPY`KUMQbqh8|J~9DiKjO8ZP56yI}?f^)#@*SGXqT30J_yN&Nv zD)QDTR#i;4>XKC!w$nK!1~U*Z)YqG?N@W}NJ7!jdCRT*QbJL*=#xx7zrHGeO`=*6X z;qk-%&-v7DKQJ)mn0=t$_jt8f(TJaegPFar<1Fdu=_)W9LHya<)6h+#y@UC9|81$1 zpR>pA@GMMVX$e>5IUSz!S3A3Qi?hM(LhQ@y(RnuV&IQR_-%)1a6=J90*!L@^vr9yX5Ak<;PkitoP1#E@JbK6ViD)_N_S#FG*;i;kE(^AskEq9H|mE zapYiwJV4%1Je*W8!;qrBQxu)7`Zeinz4I{Ka9~~Y^=19QK~8^&s8CAb9C?|E^>D!m zL2L*MT(VpF@FT;|yQx)|ji6kK6;nJ(`GTn4TbMo``Vk~f7@&9 z+$?#@b?Y4OD!u<}uP|o8=vtk4;TQ!t_mm6SRP9WM85=G+&yFU{u1JSx_ys;eNkJ$X zf-BKU*H!p=@e2)DBeCfd)XmJ*rck~}c#8v!E&$mJnrcI$OEBra;Lqpp&M)gis%BH} zxqHkXrSj{xE9Wbf5EO{K|ZGsrDWI3O&&2j`Tz^G`C5In#uBfohp;3&2psbJDTqp+0@zZRiuraC6j(pQ6SN@=#JP zU$%BYWos?q35d=8+HUrpqd66IRQ4_*Gux!T;|%*CYd~Mw{|w3wkjNJOe7=V=J(+Uz z0I>`Q$77uS{Q;M6v(JROQB!F#L%*mBurD=?iaSMd-n~_uCfcU?%0*#ji%-wkroNS{ zR;*<_FHEc~G`mutl+-K7e z-x1}M%V|5+Cv4`bl=vqr-J_fLseB?Sw?&$2l`A3vmgCq*%luWKtuJ%u`%aVaus*fdQT%1j!^)&)D31ZjK=Pu+q zV_z43r*FzOcx6w*dVcsjF3Jal^Wm$DKdJqV+>?XdZ{^))GB+Al-8MuT#Nze=5FGt6 z^5>~M=5SGwezsXvYE2J?Vw*Utn~oh!Wylf4gEZi2Y11alOZFm2@#+0`cB~Njw+g>S zze1Fb*cY7u_Q6!-vX{s@o%41Y6tzqpJH+a4Uh=i!wKCWP^Ba_Z^_g2*-8H{g6hnwi^fP6R%%Hidi zw$S7Aa1olFTCt}|mgB`7F{devtJcj4RGusX&LtbeK9ZV+w`b1TcEQ$q?7rsY6=T|j$U&=X%z3dGKrH6AgMb>33t)r}q!HW&k-6#s&2nkXx=k zTrNJ`2XW4o($}>^aNuwO5)wD#v9|;8q@EEvqXPtWDB`PX&=&RlM%Sv2R$jH+)}f~Y zI*8BOPPDbWYa(?R8{u;^{(ZcQ@Vc3t0CUa*;3yFH{E|PrVEa>Lp0Qf3!p7i`PI^C$ zypPxRZ*rF}$;VPVe8ummIpICUmY0!IPF*py1x5JDp1=QeS^xTG>`99_=9&G@_U+sWzL?=H?y zQ(k80Fox7m-S`C)Rq~Bh2&|Yu^rF)VJ54-S}zb9 ze=as;PEq}wx>#K>^}4j*=PY_3NAhu24@b^LFtGzIizg?iQVuXJ z7~cw4oJA8yw9}MJDR;bw_Oy#jplvqmXLpvlBA$`Wk`^GM2TQ#+n@ z;&F~U;nYgEEtha>QMj1H$0c(!>M(&sk$zafZ0jrpb-{~};?KH8VOdCCD-bWq_y)2; zS0SwhphxPejA2|)P)cO7ihllFAG3S7`r`=SmtEzA`}ro+W+nN2mpv#0Y2dZJ9_PIG zripsTArY^oz|o`p-H@MlK5ZKZE+r3#)@8dHXh0=ND7Bt`P3C9}^#npFnq5&L24}Gr zbV+4D71`wf^`TUa!20rs4hTedaGeu)$;V53_jsAp1@ja^i$;Ubb_$q32w}sdm4&JC zo9~}XVd{F|CVLuIyU-Wx*jo{{L^Ltmfv(JefKSzAIkg1Zf`hT@qi9ZisDj>5cco}j)#dEN^E%>~ zlG-basrz9M)f~2xuNoOHs!o3+QcTdXIoi7JM4RrE)A-Z`71U`uGO{tYJp%CIVXT-= z1@*+wAuW(;M?8B6*6K1=-;d~s@q!9;EnMK)pF!gear?z}5_$7E&>BEdRosd3ylKx6 zYKiv$=x;-D2C|Kq+9IS~t4>g5$+_>U1M6KkE9r2a%pTXV#z!3aTe`qw=j> z{zVv+98O{%T&hjZZ|L#u^yAwmj`zE-4*r?#{>^k9Q6^JvX~;Ep0{8gAifk^_l}iWE z4-{bKHpYV>3jp+&?A4=2@-zNgwUj0OFn4muV zyF)+o2Xv5+W6j!nSWqGUn%lYS9vqQQMhj&-BC`0OrE#h+M$ZrOjaQ>ilFzI&uN+(< zKAbBVMDT!s)@Xvfr;TF|NWM_HKeV>vol(KVbP(P1QyTjsOTJCu1 zSCSfU?dPeZhLxWH;CGx(=s-ts!hPt62a2;34oA7w-Qn5~9Ytf$Ez$-VS3AGauFg74 z6CR3ir82)#rxg;=pC$lJFlDr=AmrR@>7rJ!>LD_D{;`bQ8!^ATjzbjNqWS*}rdyVM z08500Ca#6l{Q`!yIl3*Q4XlSrM!sLSVY8&VTM^=d0PQ*ETQS`vsb83e`k0uX^CvRD z8i9{Y={b;SRbCjbNYMbfM{6clJfq<5D|60zR}VTU%zloXS8^vNZ*JkZiRBM1IJvBu z%#CjM|^fdio79USFjTdXJ%;S;?xy zdhK4|%UNPAe%U>W{>-nGmG_feA{G*TQyY-dV6#dJwlnZ5!y%O1jJ#QGVriNX2XU71 zg5JiZ-sUD{t(G#Wnx{+9?!(m6Z2@hx^(x8I7;`=?yi0;W;Qmx(#OYuIdQ=E9YBeut z{qaXPqTmf?SAW(m#TIkuo*&}cjE2KDqUfArD(={)u`*trP%Sa?yVM<(XR+qAocz&! zA_51-{vDk@qxJCPe&&|9bETBNM=g48)GQ4j<9Lc`zYOMg6_N37N`+k}06l(B%A55H zTVnYv75M#T?)SQA!bka^@@BF=DINoZMZ;?)*}fR4!8qu{D-;U{tEtGFzsM-0X&y(-=10C1A zt5dz6oT>l|jV*m|1SdI?bR?@w@l?=$+4(8B|3T^!Iimd`F_9`dIEkrO;PM66OOuy?j^0us`gG?tV z*;?jIK??&f)M)#Wk~Bz}+N{__sr^98pfiwjj}enpJGGq+D=K;RaCFY=e1{Og?boNe zto3$^GX!-lbCS(jr#$wi;-*RtwljS;YbKC=?LzyV(Hvz_WExPBM@awSYQ7g`ME-ZRJ48C2tooqp%f$kw zN-AUT7;6*y0C9Aid^fwXKbrrEjyjvTsrVRWms z5;R&{a$0DdysGl6uy+0qgvXncJ<{K!?j1<3h;Nb48Q7KfaZ=qn1?jz$RrU?->XG}5 zJANjvUz(}Iv9Uj+Wwy(8NQsC}7p>#9{L()$G4T}GZ+6tyw!ke0IZ zjhF4xP*U-~l;1=q6g8X?<1A9w6+$g7)TTKu?$P^F;acUp9@i3Os4A3kueQ~_>@Bh zy~nS9K*ZnsX3R^#K2=zsj1(2JTTax=*tb`loA#pmf_A4?jZKgN=Stu zLd^)7nJp+u;T0_Gb)qnIC&8B^Z0P0Tm$6=sN(xSkNTe{x^0hws?IgPF+V#o5%U_Sn zw=0nSbM*A?OL|Rxug0bFF}gj8*7#o*+?`Uc8+gf{-$8(mmUz`%WZs_=0?5mNkJ#ON z;kCUwJ*~(>$?IK`Nq5D}&MvaFvfmmDNV}wOSpLaoZ;bYqIn|TTVojTNhd}B1xAD*K zBR?7`X=w>rAJ0|gDC(1@Aej?O)pU>}C54Twv6CB1B26Y{MLV=lb=YEh$0z6Al}5)s z&an&^0b7c&Fc$9*wRM$6;@0vt<4Y&BEUNc$qM(05QBiYc|u&LZ3LOjj4;8ZnQm)OCY>k0}jPZXV@7do04jV#IQkLR$`3 zua3GkJFD!1I?QZ5C=ii6v%YKJiXAeW19hv!j8a7e-7bG@E&qoM-TS!i(K~u}_REcm zMAvQ&9P*;M>Q;B1zKPvqy@O-tMfR%quVUt9rSq1S+#JGL7?;{?zq*a?vQ;?izt|jA zw?kHRjLO{2px8o46JJGU>VOG6;QVKXbUlW*13KP<#P2q3cH+vqYWFTX_vmH4TSx6( zI#xNPowMIpIP&i0E)M|`901SCR{Oi8aXM98>6}_FHu;=w?w;?fNshRjY?Ty4y3$ay z<@xp;BF1$VeLtRlCWq?p)zST$Gv9LTHcTa1;2OPJA-7WLgpWngk_5cW^GG*{)Cb(Y0R7rY7@F3zdy>p`*mf43MrY(a zqr^8KK8*P#Z}K=!4^IJZpkIRn>q}`MoTpyjBv)}ABg52ul0#;8 zv`X7QJ&p3Go~js#lGF*q4A8%Y`K1U<;AfLyMx21gPtPU=2%)ZQx(lfEJ6V31@o@YB z3;&AsFNX^TR=mg2@cTH-e(FO{+M?vMlUPS+&Gad(c*DEWy!C74S3mU+5=4b5Mfqk@ z1VVr>mc`e#*iCGd)(I(k;=CGZUTX*J2!$y(EKxHPX@(oXl)=%0L(iRJj^490g+KZ3 zM$bk|OMSPl?@SM=O#Nj47!&p6jzoR(`a8|(b`smhs}~~4U2jK@cGAmRb*VmiwJgQJ zKm6`gyR!@uY*DNEdYo0XTR*s*5Itejc>?+uDFQC~ck=`)N5ElQcfFBg zMx|(GdF=lWv;0yAV$=N`4Bj2rIs(kfiefKuHlCUOX8!pd{*8c8t~Y=?k&yeS$`q_h z|AU9joR>k`6`G)c;Gr;+(0(Y4s)a6UfEx@E5%_ddAt51@qjtm}^Nx+Sms^iP9$QST9y>(x%2}cKuTv(dxKFLE3msGlpqS*`S zX%0z_d;5(EAmb}|Badc4C#m$%>1474Q*l<6xaKbG(t)kG%zXE*u0OS6O1(kl{+}nR z{tab?lz?2#?@IR)Sz^HEBGY|VF%qDUiI=o!hV7vP_xfx?Bvbf%lL_a?TY!rq@dh)q zc}!nDDNW)1azdXJSi3)6EGTc4c(1O zist3TZl@|F69Pui)n-743ZsTKebvFEzR&BpldLdfu0-5Y>bh>pw$9ps$*)3Oz*=X? z@h~+MjCyi|RRSU4q6nY;ZJa7TY@G3+xdw)9 zpwEs?MY!ZuTp6*LVX@GcXe`V=1C`Up=vn~abx>PRQ8=4bNjnM4n_h%m5dxKvU*bj$ z?g$TdvqkP=^~B>5EHoPLQd|fe z6UKbNUX*ZD$PJ3B7V0|Jlh$5(j?yXF!q+~iuz-((oa$W?Z$n=M$mg+JI#yMSMYo%r zdw_d8=+!|`>Ek!fj05y5aVno>{A5k!C4XU&lwIvhrd7>n@h7P3G1M5J%wqk?&Z|HT zgX_Mj){W7;@4TQD47-{$>N;(cKT{=M#(~xMr^L}iRyqE8NDTG3$EMqfCcl+-w~r}~ z6I}_FWMs57AC@Dfo`bthSam4WEm9RtV$iS!jD`@HHo*O|a#wFmF&YaoO{e%Jg1!FK zA0v!XeKRnH~43-PxZ4 zm?A$lKEIlp6kRVg={F;XMmU5mt6YNSa)J*6AmLP^1cQtKxkBh+?Ae*^4jkW?%ghH& z?MyJD`M9fG3^;`RJ$G2+cPe%cj=T!mol5AK1pQ4S@11(J?;bDdpb&4fDxJfMEgPA z8wVBXbhi2t4IdjYPVvoD?!5XcNl#aQUq_%|hSgv1CZM6?Od+UWFxxOOGJfOojW0HV zN=jxGn7X=#z1v+f62xp9ifJnB;O^AyRKVBxd;`hxkeIlxx?M(KIOeMw^DWVE(7tI| z)tyg%Xhj2q$DyyHB^SjHQ8t<-YSb>Yfh!G(yi_~W4sVka^wC#!9Djmaj@z@eS1C^` zFTWNKENZ3wJlU4+JNX}{$HhqPn;yEvhbY{7(Lwp01Yy0n~ zS_&U&s1Tas!ZZqWI0_D3j&=Tw_4J?~+o4uJ>+diO4bBn~6H5wv(=F+N0)?(oI$T&$Q&HQy+Q>QZ$L3-;~+8uW1wW} zx+xmFR*fIo{zZkb1`l=*Qyvw&C#QMtHX+A7{KdO|SDI{`ZBpZ;mwa^Kh4(mQ(6K*- zD|Exv{F(l5E8N+~JMme(d;)p$X{?__WkGk5-k8-ko$b1oMv4_cAXCmK@)Hw0V8nao z;-yRs1Wwi70+mC?eBDF%a=<*IN^MRBWc-{~IbwYd>+Ab-5H=_G;wNMtAzzo%{m_R=}t(<;mkdml{=y|>FLa@F`)%hi=_`sgujh`q`w9_;db zP}%mVO@}p!&piFq-bt5tgn75b0+%}oKe6%cY!*<6COO?qcP}sO}N~+y$_3sh#;kS0DV5+ zHS@^}Fld*{dwMS(5*>G3Ei8juRM8JLnsY6{D9L6TVx_%fdE%D7AfiP2o?7nT+Msa- z)CT%@ux_I;h(D$D3y!jL@7xY2RtIb$q9)1Eb5gD9kRs%*_7sch4AGcZDAK?1K3^@o z?8su$`+m&tU1jre*L|6h#zQU8GP(V^dvjP35EOz1kDGe&4H|nhIWa{2#{I)VBZm<2 zLNGhWUvon3PGgX5Q0iyJJVC@9x(!({3~SaU#|N~jX*MvGEYeN%QXud(TbRyCZLCSG zp2JPvn##M7X7;=4wG(h%7|I1ijK8Zzt!i^o(zGOdZvSkjb^^VlUyAZcU}Mf=fpCkKsH3TDR@FroKX5$BLkov*;>Q6l+ozhu$io0%;0|N3uR0z&DB?( z;Q2YAY>Dt@qBv4WW5pl}27|#!yET%dz|vn;QG3j~-j{&Rp{Jzv1~fE_2e&58BbG{M zEBa}=K5Fe-t+B^AqZvxz!L1PMJp4pgW!IH^@mo_l5$xzO_3h=O%(%!RKhQl_A%6dP z)!#QVgDYiE@dxW3+ma7^QZq?If<^I!cbf2wBwhYZO8=1E0+g6y#RwZufDwR{T z?tGMwcr4ZR@hazXH>f3BzT4Fdeawf^x3URaW;}-L=YI(@Mc+;JQP9 z;k6bS2X(KCuO=V`LVawR{TQV};`qp4{23IRR>Uo=*D2@C;?xpgpw!-AYG@P8LAM8K z01Xrjz!j&HHEV=CyY5f6>6uFO%~sA?mYYq-~Hfx}&Hu2$7|f zjPI$}+X!PeUIo*=ADo{K%s~79qDQZ_VZ`0@rS8acwL4b=Vq`}IsZ_VvgsX*Pfo38A zg`|xQi^WAMM%PA}K=GejUj=8)R|I#02@s=THrqtin9ce4YeEWxh%l&0x)x5ffb1TE zxl;7cOyPHwrmv!P|84#a+G-DA-Nr3c=!UdNmdDPV>(TB(sv(pePq0{I)Tuy*KbT# zMrVG`w_czTp`XmtQ9`%2Uw9YM%dzh=ptQ;Eyu9&ZD~fTw9wZ9oSmwT1(00!jXH>n3 z1uJ&EbRVsX(@U$f&`~8855Ov_Se2_S2Gh#u%&tj&H|^YK

WZLN?sds9p*lLkwnm#>8p=jLNnGE~GP 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 MAunF^O7GME1HwJWu>b%7 literal 267314 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%0D8a+d$5dAE8xXHAz?mT}*pl<`5T9X27 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 Nwmhf%iS~2qzW|;(klz3R From a577d30eb82ecfd8d6cbf6fab195e972fadac6c4 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 2 Jan 2022 10:18:45 +0800 Subject: [PATCH 045/251] docs: update screenshot --- assets/go-charts.png | Bin 302307 -> 302986 bytes examples/demo/main.go | 3 +++ 2 files changed, 3 insertions(+) diff --git a/assets/go-charts.png b/assets/go-charts.png index 12e6e9d78f0a5cb9af2b5ea69a67eb852c010039..e2681d305cd64b9d9c5c2c32cf654097e2d77e7c 100644 GIT binary patch literal 302986 zcmb5W1yt10*Dj2KCK+I!k3bKtAvGh>jM@Rp2_X& z;1%2()5lm?*St;Nyit&P^M>Y=t+kP0`Zq@9&y~x>3w?Mk!|W2uj#Nd8)-F z#&aflIB$vl*3Gwb8b;rEcW&+MXIXxlW(+Nf%)g&Z9QNJ*)tp2jD;3g)qlRt!cg}aI zUSf%W7CjtR%HPsi;zI8zlz9?&ee&B_mf3qWGg~#67x;n~4&a7`gOA1U2dRI(NrY?0 zlzyGu=435HU2+iC*e1GgLT}5wz~U95e@(?C93qM)KT9f5`IfL9Np~mZw8ch5{Bs{i zU%p_^QStl>`Okm2KV?>)58ryWC*@jS&=UH&!Sc^sO#!pp&qab~XoL2wb?MidVyRel z$^G1mpTB6))Gc)vl!p!C(7Y*?p2EWM`)LwUg7Vm$8sx9^bkp2By;kR8t21L^#{iDy z&L>F?J1i`YCzwCioHIoo!Hc)_WF+2#zrok>n_5q-n~8B!Z(o0K9$!y9hRPjZULrj| z7l(Mv#75GINwG+!F&U+Wd$5|f$FXUY4vm%=2DK|Ob;M=L(ndTbN==KD)tSoafr{rms#C(Qf)edyl;|NWu=S>XS8<^PMd0`j$F>a$~f#2KS% z%7?nFHELZMhY!yM%DB-nm6lU=mEadp^PK0t;$XXt2U27EfP{v zq-XMli157DG%xF#zO=NNq9T#L36LO1Y!!qtxLfT`Kk71k>r?~JPyjLh zX$$s#EM{zsUuT-puzN{>&0(hDbT+-sP>bZ@Lr9JLlnYXCeOn{@ze%6RH@(fje z7Z@As<@_-E(j|>}-V`YL=^0DclpCSe@21}PY+BHQyBc7VOoH|ymTXNpi2@R94vOVyfpL^KYYL2qzO1cH4 z&BRBJ)T|R>Zqz=gPjNwgpz7+*IO>)CsISO~k)ffrB$cQjw8aPh7$F$^If7 ze&E#ea96EovG^#ZC^IKVGRCe&*oDRX7)U=R_<)p@I|C!n;$5Wo#H0Fpgmi_IB01Ad zl{~dgqKe<&%jHJ7OdGkR<_EK_aii*1Q6o8uvhU=Vol+M=DH$_0CgRQ;3mZJdxiYRy zg!4|LWpExun|@*@D+BlS@bfL@#+c7|vEJ+`FKemCoR9|bZwqj!f`XD#`_o=li};{5AWBX*r8sj*^ZCTYTc96iAFd&M3s+6~B;tl4PS6|JpT zztRm_i`i(52@ZZQr9ZY`+-9>wPft&JofA*g*LNzSEI6=+b6sHGEs2%~XoN`@eZUhx zgxVFLc$)FS_k_1m{L+r-%QZz9EY)x#tR#u?MFrLKN^u@|qM-a8QAZ}?C%u59OoM8u<0s}hzMuGG@Tc$<7#fUP{ayw7GQuw>(n*c0zo-Ps5rfuQ5&spk8b zhzREOU7=6W|DNuN<{5GyFUg!ZT;CzKE&Ta8CuEJV^AJ}nlp3je=;L)u?!jSCkzKB$ z?Be#XSF>%dv9U4nE{#dYIJd_A?Uy4DEF9<8cQelk<#fVKZx$e zCgyc@J&E;5wTR%%&YUn@^T)pR)?)`s@wGeKvq8o^lQE0XZ}wWpM2=H2k13+YY5Jf^^AE~I)4wjY-}29*`qN{{l%8PlU5!8C2w4U5 znwT@pGdzxM`f9i%pA3(VHt;xOvKVX7w;m&9c={CAO+NY9j-GRt5& zAb`Tfwv5q4j0bNu6_L`98#vd^J}Box>XrGqk-u@|i4NtGYf3<@8FSTzYU)9iN6XzR zIsfOR-P^~Ve#%JZ@>)%+Dk&*xYisxXM*PJg^r??U+>DKmZXdy8o#5i!LeL*hRc;wc zV(?If>FoYMAu(g&o!2T&0uV#IX-}JOL_aT{cg&N5rJC9C?l&MrynW~$AR+xoEYJjm&6<7kNN zUGS(^E{$N}JrDP<;9D^7QS4N$*`n3X4QfMHmvhZGvIDje^QyYBNrfuFuQ>7!{XHK{ z^nQ#k>eAg5|1X~c%F{dUbm&qml#y{$b3`2N49?+*bgJ&Mu&_jy?H}xsI?@ZB?(yyH ziZEX&zMqWBZsfT9OyfHQo}c19iyD27=fkwh*F|P{RAcp$ZCz!h4+L*`Imf9t^}&I- zv}PyC@eiPIAVCwm@oo0y-ifEC)m9}t2ShOU6VJTQ0TJxGDnR{8O7|Z+KuugW-BU6aXP>nBKoC0h|MU(_ZDmFCj^faC zy)k|5c-a8)rd{11>SML}OW}bX5FN$Z=}r1j;-i}t!&;+Ch?rLFOUc>tjq$%-n!MHn zGS0nrFx}v6qP);hJk^ac4}~l<39rjDRhiiQsQO-9V>PoNe`yjJ{n-|Ch}CB8(^@WW z(c4G-Jqe}iqgS}MUT5ZY&-PBUs0V|^OzBa0QD#cYM-XBf&AGX_4B1Od?Yxh)|NQ;! z{5WOx-h&4Vv~*9N%!?x7NF;LITI#F+ZG#+VV$t+wOY8^2qtDI;R<*KJ^}_ON;b@&iT|It_$yrocAIn zg8~Efs6``$_jVR?k(YJaHSXO|R!2(yq?p6PqM~OfzuwR;mjEw64tlC_1@a+lBi0^= z>n=7nJ9!JJl33{7noi6XpBZ*OkR>9d5<>S{8=9N5x+Tvx`6+8*g|}_X2wBT0#2DO3 z+O1ZsjH$^lmiB`IWC$W}*DiLCMO&^754?1LwjIO{Vpj}==PuD5=B@QM6he0cfFxJKXUhnO2WJM z?$=s$@Xqpw>G2H9ddSO=3--)tA6k-+^b38Wc{O0W+@l<_>Zt!LL=ycD?Sr8z^NU>u zV?vz80C0(u_L!Es+9>bnoCQtz);wuPqRvrl5eG@S(;3+8aW#|v2s`dJx&wzhMJ?QC=Ygt?5C;{!MT_C zLO~iv1WOchu^qhJK0M5-z>sVOc;3M8p5Qhny4T7{999^>T$mg6acIHXr{W8FqxaDyPh%*)>RVYACMPE+CMFu0u5WDgCW}H3zgIwkKd9jlP(0!>i$==^2L~JVB#=FNgkBkB zBzS>I4bsGXp^Ks${ey!t6-Oi86TpOmD-(%HNF0~fCTm=3!$J*@FHPc?1pEkGW|(6E zL4mXK4(Atk&i-hO`Z-@ci^D9z2+VmYBPmtjW6#RV>3$C11RaI4uoAFIdgz#HqW6sP!kP>#z8cHE@ z(c)S7hP=M7ugLR26^Ky)mGJTkl|;8}KL7{UJc~l=t&J2w&z42p(I1VB4iVFx)6)$p zDWAOvFy@i7FpJulpzVsad}PKemz{ka9k548^^&FD^tn))oNRf?=v|v5BM=#z(IS1VGN#q>M##cA|+kG&FR$I6EF49bH&h2oDbzy+FSi z_}Si`1HRTpD;?HGO2$S)$oZxlJmRCGh#x+5_}iCSvezgiB=qv{)vh`zU;wL&)|Iqb z)hr@ku%2oiZ0IwamUcKuY^)}B7TzYIa918sDo?-GMj5eFUGYJ1<7fwR>~~uGhToE zLvQ0%pe5XJs0t28W*1SQCG>I=zy-!TBJXu}cW;*>nNMD)ac|%a{J-6#TXe z=GO42s3#rBPSd+r(&JLV-o1TWX4!vgZq3tVRa~_b(_P!_R#1>7Lxrn>sBq;+e)BnY z?wE?8aC!?|8A#MY{74jbhAywfB_JT-JKWv9zg6#f*|3lr?&IULc%~OdB^)_P*iFV+qF5mGmYKp>D7H?@3q+UZk(rJiR~BM2xb zOiEfB*N^JT^2ZtxJ&D1cE_oy&ZZX6#sgZ44r-_Y<1L``5y$UqFYE$;7{}#9oY&@Y7 zs2ec8$oyH1aWq|emzS5L>HGWpDO|4(&=3y^+~pv-2?2amaHh?9g8zRc11NRLe>N~Y zJbWh7*wn+gH(xlNZDm2 zuVr82n=r{M%sn`tRZ~=qc-m2Oy4BIuHQxt93kH-nBOeOp)Qcpyh10rU%ug68Z; z^mZQL`{?c2x%zkS-cd+gZM+e&g^Rp?cB91&_~BU?Qfu(m)I{YlvBlK;_<7*)7-&C8 zZ{(Dakl2~7w4S+`--?NiJ(~55MvjPFl}c1ww#_dafYpG=0ly3a=;pe&#IAAbzkNGY z@T&AOiweUH-EA|-`pM~9d=YIkO1cd={kkX1GRPt||6497*TqWZ(xP8VxzPEpf8 z9Jn|7`kvX$-F3=u%aL#Y5nI3`BmF%LsCfD zLcxZqhdqT4sbRx8SzM0$Y#rRx!bjA(%F40>7U&|W$OYD?Pcy989YO`uKH@lNy~))tX5!L-1Z@?x~j_gk{ob07LhX+X6At4;Ao*eo3>C&L$!vmfPjdn&?Y}Z zPBylMsvEZ_{omW!29eF)6KJFz>R?|IH+T%f%Ul>C@`4>?R`B~6No+69usb;IfOh5O z5!idGa)~7$*GR(bjBj*aG`60Lf9fN`F25T?81JB!7W2y%0|m!`9kAEb)PMy*I>e?^ zr@q@2{Fuk=^l;<#>(`Z5Qv$XN?E{%IT^Ega?%biU$NF-kp|>lvn*h!7yUOQ^UBKMY znPY|@K|DpCShnm9-TS_$;%HBw!?XwZ7Jy2b!bZf<(1#~a(mf9*0+(~IeXy~5o8@6? zk#+SBz{u9x{I1B=UlH{Zv>LyK?NrCCc(kd>;&J)4m{d3;rXU9*3O-U=S{i^jtHxO# zMJT0U>+G%Y*#(ll^5XANT6Zz(a3XtPe_Y#$*!JgKG67*e^6U*&txyXmo9Apn7Jf|- zIrX;CNqG#&R!6IwO3$FXIk90$h4gKY74v;Owo$j#Ne+Ku4hP<{K30lkJmccxI?)T| zH5+2;5G`}s(%Hf5f;zKua>`FSPgGb!&5uFE^f*0)U&>gGmjR*@ppQ>usIS(ORb0V9pNI?mkUm(%U&g)tLb= z>@7@1bKz!eVlkU@7=S5s(}y*Y4fAwXcCW?2U1rQPuwL=st~)q1*Dt-%fXi(~d$pWP zv4fz@j(?}SS-6i!5%^ApXQ%x>27Cy7AanL2>iy2B#qYFdtbTn&1gUaX&jY!ZF~pLH zXtDhkzH7WZeq>1DdkcA9({cINqIg&3Qzik^mE<-y+^CRlqv}bI9RZ1}-vD7deZ)un z4Ab*c9Z}=F88TAP%Jd5^7Tiu`DNy|0Hi|VcgDiws1siN2YnwVMycK z{P%+PR8OcND+JT|H>m?bB*(&f5FPI{*sNb#fRoJh%a0DDk!I;qjlFAg{VGTz9P*(- zhATznJV>hlO%m1}V-?_%{9PW97@%S50_D=66*PBAKYXRxj$IR9DKtzRU?SkeZP|5V zwQ$9f;xU74L7M<-_a}6HzW9#L#Yk|A%JrhfOW%to5lA=EDk%7`6*kDLs2Jk2&3fw)wNOe>!Tu zG->j!d6NZ=2`LPgaN{$}N4Qf*{ZrM~=pz?iyha0kZa;^kNM&32mj3;#J++t`%+r%Y z@V~>VRZexKkDp`60M;woPxc`(;7s{_r-HgZbcRX&6UAWbb$oNwstOMy^BN=ll>&~9 z*HRhhipLiF9vGfy{M#9kWt0qL4qz*`!xxL>a z0TfVu+LRx5eDz%a%YK3K7dWynS;2-9{-E+(ure=)FtC6{lf1A%^4=~qI;1-b;s0Lp zBxgT4?#fO*(@vTkgD%aBA&l`qwsZe&UqqvNFT&Y^jfsdjRr}m3Exf3>oI1$(veG(C_2R1V#y^7H$(sv z6p41)CTg0j=lbDE)o$HTf&bpry@&C%RPmORmsL4A-?s4-r#Dip%uN#3MH8oJH^eDW2IQJgMuwR6k5$Gq#xnJll+*ec=V5vIV+0fb4s^cJXY0l_C7^mS|- zGJcSMygiN9J7Z2)qE1Jf=2rpC-6Qsr)`oQxJG6d znnnF)BWI2h5a4utH24^t0la7FhJ3Tyk~xvePUm~HPhfT`d>J6O7sIjnD*NhWQ-jyZ zsOp9vkENA1vO%uk@#+J7qGG+FA+4tkY)&h}NVAbI+ju`7fc-(q<7L%JY=%Tv+_&Sw zmXGGRh@pnaE_6aN^ld)?WMBPjQgdCq0YRL3MwGXa3Of%FPxeAId+PX|ZGV1#-iGfv zfoiibM_lC99@=~ujGJ!Q`xdjo7WabNOaY+=GKXAty1AoKMg0Wyc%JY_OE^3BEa?a4 z=CyYBbY%A(G9;Vc=D1srr_iK5ja67L_ZFTMsZ~S0!x6;(%x}4ae~Wt$54WQo3#%b$ z%}J>RHJvzpN2TI{H&mS-^mvB!#J5wVmO~`m$nVai3p(4$r^Dmwmz`F5%OTl{1>*#k z17*FGRiv-RXj&Gfq7#>&gbnlw=&z?iGS^lr%z5tp9 zFmg21Ij>o^pF0uGi$1OIk-7|rs>731Z((h32)QKDH>4F#9y2jk0;a9_JRefO_osst zHh{H8PHE<3+2>t)ZW+3&<@z_S=J1*Q=8yS4DLdO*IbQaOyQY)PMX)I<9#6%^kFk`20dqY@~~?nz{rxFc9b{1ves5`I+w645{%cT(LLG?uYGbaAXnrP^i|- zKzc%ISj?9wGgJVi%-EdlB>;<5fWS}InzH6S{N5wAcjk*|2RY+Ik9bN%22gquTVKe_ z?k3cj^r{Re45>O8bd4;9#6KF!OK*Ap?(JgVN3_lkc2P*6%0o_!$VAhIFr9MNiiFud z+8I){Mx|bDIg!6ddhsab*r_m5E7y;ebhgp@>Mdd279`$d1^(Jq%&y&qZ4-4#RQql= zOSZd;fcM^v9T6^x=b`7IX{Bg` zb1pCPc&>avTJo|c;lmer3lm2WE7u5$b}EmLyZHu9Qv1NcoCXFshc{;4Ib>323Z zK7~`wO#2(xH{MUy=NCq8>d^> zt?Li&xL0p|n2Yg}SGDkbVSRocAm@}18^?z)zI4?^2dgLsRSKzBGCH0XXZ!UuY}ZG+ z)3fo=F`Vy|hIKF}m)OGIi#tBy>h562Fsj>r3XGMHl7jDGi3UzFCIxVs15e3h@P_6* zsxTA%Z9k`BgTqVZux|X8A2~8)(wE{?N^(Qf>Cv>JN4{$q+0;IXIXR-A+ljAC;G>?~ zfQ9tO%-_p=@sCZo4l`!`Z+Q5gr2+?aI?sGuZ+wyK&jyx-5fa1&7 z?>#%0nrlPlCX2+>R`gt(S-#}uxQT@(>4CUG%x-Otkq&up<2`I5Sk-4=M+6BLg?7|P zL#MJ7_0LHPy2pP6f7lSn4LY2>oHD8IYCn-QoH8-x-x~p5dTaFLk-E$3_gZs8^}&Lz z`(Q8SA&`c{`%9j*0I0Ik;poUTL1#Q3+Ow}eeulJ{5$#ELcZ}Ptn=W2RkMU!7asadfnOB2V}b#KXu*LN*yy!b?yEB1HxFo_Tq;_ zt!}qw+zYeGO4w9Vxmk`K6`h_2InSm!|6a_xtDb>J70ko3Qw)tQ-Fv)d{j@0{{XzuWl|fe>#sC)vSE)!mbZdN8)XTn4c)WY zfXQMx4r;NH-ODkRRV(RL&o)B&;-9{-<}Y&an-Me%R@>q))taFnzcF%1w(AFslR;lT zPPSgX+N(&E`je@r$MynNRB?82e%N2aiFEU&Ea8ud0NaeVjsa!JwI`baaFti_CZ3ni zYE%KCLs<|vJp9s)2tIvHU(VmU+p2#&7u}AwYZ8@XC z=0v8(h}ods=3Kk!mlSVZQZ_~2NxlT z5?Z(2ZnnG8n(&uz?jy7dQsc#U#N~Kwm&-+o1F{5xoG{D5{vU?qds*GVk6-j*{I?tW zfq$9kp(KR6Qt3#+X^9GOF$Ea#$#C~6KXD|YWEdTuc)4n6Wg(`jzJDr1%go4Gzbmvi zc`jMk)uS$flCJG9IrD?aIo5C+Z`5aMQRR<4tOd3kM%+t~EF<8tqVlJp@>hhZ6IE6l zgMqMokCaF9(euibZ&i0+rH(F;F>dbirC0d@s<=2^gLK^DUI-g-T85bQo85ym&uH=t zt)Wn+4j*rhiOf5c7Lap zYtReV?v)`+X}=zQO(%50yS&%3aff+OXtrE;p{U(={-odl_06)$hRm!*$NnT4+1toh z)g7H3Geuj)Rr6t*kEmkX6TW)VAXENAT9=#E#*UH=rh}#Ns&Zi!c}p1XJS5t2ByHQbfk~m#^tk7eJl=x{z%g&PncbMI zCI#SHK_t?&+L(h;nYfWN+KHTx_Zfwa!lVOEsPJ%+E;Y-ZuwoC&mj|S6j(;sCawmp3 z#_ehkAOm@qtJ7Y*2j!!>FX#Sze$M!wF)1$^eu`8KBKzf)t^MfbW?4i??62*5*QHGX zhBdc+yBKzz5gp49d52ALl`kwOn^Sb^bwDIQ$Jp)|yl>uBS>bv;Dd>6tmA%q}3p}#c zz&yBWzE_vQ``%Evjg4QfOat;zBmAn->2CF=Y_9YC-*q3`OlMSrI zdbFrF*{&1txI6(Rz=eB+*I&5xqPRW{kQK?Hes_NyrFydVN!zYF))@nSU<`Z#n;;D z4fTemq%<=abZdL4P3|O4>ZyM^KRr%*m7SCGk~N!V5u!7fx9+z?-Kal+c$aaEgXFi_ zSp;!OFqFQ^wY6aU!X(0c|M##{8)rzkP@HmMSrRp`sYWwfY;6#)sCxZ;Z%dcs#mtLntUF;+ z?`2R*;2y0Y)SdhQC;?jEoe5B$3FWxT`)=1`Bt4niFqdxR>|MFlh86zfzr28`2GRjTyJ6vROIAR%x$wT~QDqU~lBDiKR9~lZ zncPe_?}i`7nH2QCT4hT%;2tF}o#nGUAdNLxevnbu>z0&o&P2;Pr|Y_%IE2SHlZ5N) zu&|B?fU1JReXfMtaVG|+6g3Gre_IWg>Jjzqz0QcQETK^oGe;Shyo?K*^Y1YM+14_4 zdXFAz#FiX<`K&s>#ueldu}(aYWO__~zKXhqJT&Bq1S^{Blm; zUfT$y8?kScdjU)Epfv@4G!ZH?RdrOnS0RDND?Wh;d|dl<(##65?Vm?9F4wm*!yo(; zGz`Z2bjE-M(yB~yHak*~IhOKzi=jIh6G}iFNIy{rLE(jWhv7NI{+8vYd9l9a3b}O) zK@x>RZOvoD<{!D@2#vYTl-x@HD+x=tKBO(kY-`>OV*M4y$XH3kBfRy_R?b3fB++jL zK>U}=>7<7J)$QtxDaH%U70>h`K-VHFP$)a zeHkfCHrRgRAFv^{Q!QZf6}sja^WjcjYZH?IK82gK`<`_v2}3j}9#p;(S-}QD>E{a2-%6O?gXSui6q(+ z_@boT6aZW%JeFb*oC4*Y0aebuS{g-{Va~F#FPFkbbLpJm%)sveh>rq^f*xQ3_mj7m z3+uDMIWlFN?Z+`62hK(4=DadnWuLp*%8~|BtvTg-3FJe}xkX2oW+s#JT8wPyUlZcG z`v6mHNcgGnuIhdai^%X%ve8e_D8=Op_&AzBVK$YmNb-SA@Te#%p|w630>t{xt`#37 zZ;L7Cscya10HOW(rR|~5f(-lih*szIKp)R-@($B=n>jMWYxGZeX=U6a5fj8(>L1>N z_bL#m3_sW4+$@aYwysbv&*I7n@0xY00QtMDyU1Ex?Qp?VNN0+zI?_sh&otH``v^-b z*%$wS3DkC($Xe*>C&Gjudd8mfGCpOCE7yNTTTKQx5*B^$E>gQ0*44qD!j(c{VBkSj z|4iG_wO7aPXrophV+4!V#oIN)`@UABp5*vR>oaw5X87xtatFb#*TiSd#^qn&#_8f7 z;5fgWi&MoUj)H1@!MLUZ2JN`GM3;d4tQRElMQn3YbiH^tu$L~Pew+40%$1IVhKK{p zwQEc_K)4A{991PqeZE7Dv4qYkrTPh%&gu#ZZw+7ZJ12kNDk&YxZ!MN-Y|7jIL>bzTOt?JHNy%~s0cO9fYl?GRtV84&kRuBEcMJS0)W|J$J?n>R zB)#~QNj`9ytEmk>pJLK5QYl}1%HoAV>;>f=ayO8-&r-y@!D+pWRLbv7NiCk zzd1cx*&5_-SQIWT5y{HPAbA)8XL?$>RZsq$^TXs|C55|~#;Xn{Ha17m`o%`?6hy)d__tpf&w}O%?C@oHD}- zQjPd5hmT8VOIrO1Z^`o6!>P$;%i@23i2eF*N8&~;nh2$Vobn3_wsoCmMZaPZH{LtWo#y!rx6;fctX*qRpi1u_CSm}(vu~=mYgYxNy*}&Q zyq2?I_V;&0!lCBPhMbqgk7V0UJLRSTSL3rBNiJbBK_Bd|aNDfYJMNSWS66!?&J*HK zO~3Drb5=wzKwDZ`PKE0mMhCVmu)Iut{xtiDw>PX3*-e|blkn-pO z35h&(=ZJkZD(0P#CtOy8h5c-GbmSF@jHRtG*O0qruhpBjF^eO@NJuI!1TX#PjGEq&9R9b@YI_*2dNj;>1VtUDd*;h)DNt zz+5CWidb?03s_h{J)csq6$qM4t(!pU#iHvh^SHjofla}al4yf64=J~6oJ5xv^A_SO z#SFPC>OxQ2A8(C$s*hIvcG>9GO0|(sN)mQ@eYm^K8EL?7Jwp)NO;dZ%nO{U?wsV*~ zG)V0>IRb+0aMtV@o8NoCdtiS~Q2F^a{Ew~4kA(#%(fd$^_K*pht^6?+vz40LBL#Vr z+vW{kdG{pw1vjGEF6d>-ACIhPrpHMeKh&RX1LJvf?|z9-u-&Vut##|Na*kfq1~cCs znr1)ZJEv2ZIDg#DT^tnPsXcr?p=q|Wl}oBsS(?G6?qHF}1!UI?lSMsAtTq1pWz%`E?${3Hk8PXw zYK%!sqtoblc(kxJEDpMRtZsgDb9%l*yHavGvkbj2ZKx|D6tGJv2KbjBZ=BzsjMC4} z>HI0-KJ-{JX1QV8b!~=pj+^&SE4i6c$1LiX7peEFA1>)hkq|KJ=L2ySK%ziL+IU1@ zwoQsSMoKeD#6$Vp0)0MFR`yaV52E&XrUie9v*4B1iIw{ehi>8 zolAY#qTeh$pdhS@bH8$Dj)5zBa3wG%F)}wE}?XnaQrL3ri;X`UB^A7}&0Mr3ESMcYC=Du1z;TDMFpw$3kly}MxeJ!uY z!ymw<40m=0azkNx6H{S5D=-x+=#+FHwywayu+}Gji8yHCrD8aXWW~XcH|C$0UO}c1 zD3IjO#eEB=5GWkdmhAfe%L}Fjo~lEqIoKb=?Pa)}-SR**>Q_bdyZ$BwxQlR0rw%hC zTT)+Dg}K*3n`DEEOR;e_6Yb-=Ij zMOu=0!%y(c1U+BtsvOzqodi-6f-JAOu5VB+GUsk*0AW%cCY(6Jdek2}T<*Aa(vi-h zL<_MUmwsF725ryp%%eJasa||aD{}HplmXiVaRFC!BrlWJR0CN7#`(9VODEsc%CmyB zJ)bUD_#?jI>j&$G>vStLpa!N$5{+{@L2-WS$+litZel4e8$E9t27OyWG784Oeb^hr z@>H$aCSEcysE)cl|7#{C)#0k#~=(u=8z+`UKcQIJieFn&^8z^6PUZ?qE zBX)9zbNP|v!}aQqzgkVkO!;kL>K0-oJQ1-IR9)kBit=M-&=PE9+z{$MY=3{B^Ys20 z9aK)H5;&x7=d$niJn0N{baBH2PFtQZ`p&Izq3ca)uUO|-CRJtYh_d*<>}hQ3)vIwe zfxR7|vYQ(KMk~Q!QOR(F0UpfbB%1N;Z;hebSgerSq4ucTZZs5#4X(U2hC$subx~%d zYQ96Zjo-UEA~`8RA1NC9)$iiZPo?t@66B}S{vQ7a{!Lnunxbx27&q$2d&WwpO;BO+ablRG1(3C9~h-l0~x zGB+B#I3K84N;Q1Tyvd}#hvC9OmD5TjpG(j<$OwB9 zkhL=5eIUvHsuR%L8WpRfNX(Cqw0Fhd+qn}XixzO+{#vt&Wy7J`^P6+;m$G;LV0K}? zqHN3Br#_Ssn7vA8ULUWYh^2K{)GV!uGZ^_9z7jj}WA}kvGh#fobVH%md`>6bd{ed3 zk&ngep#|ts&Fv|)8Bk(&v34AkvB-+*U~sn_-ItIyi+f4RYP_Vj@8#Dx-KF+bMp}BL zVCJO!I}}Xp`al4`;La%2#tjOblIeY1WOEnKb33UM%RMAs(R5@_hCO7tMs!o(>KgnD zE(6Foc3i6FN0rU!!e-R~W1w8Jif+*XF}BGUrpr&RD?Un!I(uwc`pS7jGLIijjINK` zD4~mCmMd{k%5k#WwY-I*?cp`|3)B#?7e&Hz7p4N!l`dUhKHMsH2eFFc#V`3ur@Q$= zpyDlKSk!1S@H=OS41Ib5HMdV?1GDE3Nl8y}Zg%K#wzaUPZBBDey#GdY*usOf^7F<+ z;9nxKx12V|InTa9jk*y>D`bs@UVfp^GYa1hh%O+;FC-^xH&oxYiuPu4VJ+HSN-e!u zmb96%u?=!bJPGK0<+DS_pFPwhHA%hX!I8nX`v}GkIrC#XjuW+3PK--Lj=rymL?L*F zp4O7^Tb-MKc?QV?c&4qoL3GJf0j@FW#x_lc+|6a}0vw$@?2zP09@Mz-AMa;z`Ol1c zolH0fxPjm#AEfG)b652|@endT0rSh<%CI#AVnUwnL^RByWe z-9cF2{r|p$0B_k_pa266%`+#S=xzr{4_LCB&FR4)3rZ9Ar4PcKojw7TVKZNOd`w3;94a zr+lAf6z03IdNJboBgs!R*K;%=A)Pd^TKrYhqw@WGM^8$bzgVhNnLqNZxs}Pd0a9Ob z9>s?3HE?}S?D1mJ$1yM;zgV^pLQk3d$%mTXAr=t`FfSJw8JUxFTEZkdu)7^G-&m-I z&;ce19)!t*YY*cfVR(2!xp#k7?ul^EfMJs=>JZ3%Dyk?s!#~EQY5N&dIiq*Y=(1-~ zz79A(FMgaY$ec;GVeX&MqM$c+8h9HWD+{JQrr=Hrfmw4(DXnmQi>kp-2xj5oQCiEj|oT9dzp?UOKhV16vMoIWie38CkzUgdlEgby%wuaXYL7XsNPmKGwx~3t}h)*@^a0oqCNV zjmG}t_VUlE_CSH$UY{_UUmMIixo1%dbYW|UHX)WmTsu`yStPs~c*We{1m``;_?LR| z54)V;n)3BAt>9`V)M91BqkR2`F1mCht5WiW(G{T)jlFX^-1q%S2pm5a)XIu0%*<(B zelzhXj%>3sGD=j8tMRv9Zi%!xZ4FS8u$}6~6N@y=IdL#Csc)@bw8VhBdtHT(Z;8f( zZdoLP5ScgWg1dd=rN;_9!;W&>Lr&vQ+kN88*Sp^o&FE0Gu>m_()_0Km_ORIcx5`sP zNBfpiH`&Adf;u<^oG;-DCaDUl2E3WMNG z{hDIOke&~>JpB*W*3^Gj(F)cEOHk%PD;W)e&})hola=1kfB?_SquqEu=AhX8m=`bI zHpRyHdb>{RZ1#Aix+n#Y78i?)T;G)r3cfxoc&?{o^2y+_;Wf0PHi0ZWxO+0Jd6_hP zw<&BEbUubsBn4ka!hb0* z_2`I>8#RbC68rW)w3r&7!jv_jN3x7b=3_lyJ83S|Cw>IKh`+DCs(3$!>R`=Wnd}S} zB0(LSs0L=Mtfp;gcoa7$s4l^X>v!5zB5>DmCZH}JOxnwJO-{=9_Y>aW(8j$JAStEG zlMuM1Z}qE2I5TE3Y2BVt;Nk}S8oJoKEh7wapJUUULr{OlFkIm$;m5+i$93rxO>@v~ z6U9Y*qynwQP!%HLfN19-@-jysl)sh8nv-<_cD}dpkUn@xj>zf`$-N5;tMRJzm;Z5S zmVQ+{<3K2jvQIu>-yGWGo%94a*NJs@ckaGukB*(%Qm+LG6#QNyNkh`J)%%5szc-P!j5yYz-zs!4M&K2RG3mE)Yd7knTo4wTOZ zrI4$78b?^Np{!l#1E*EcPxSZ=YDZY2JT{KDK}1Kjpt#d-^ZmoE3vxz|x(CT}4Y5&} z as{a@vIYhNgl^mtW0y;vs$y1n_Yre^_>G5Wx&_SUxlM8KaiQv_Ar!yr-q+;r- zRo=qRqIxbRFNH_VCUBvD=>#Kx7YR&Jv~0`qQC{pVl1&@N>8DImXw#(ULb$3`PHKo*AmRFMQt zvMWLws`Z#w&<+fwxknuafcNWWjt!c?(Pmcsd#V7VnDF!r$Ey7j4T6WeMtw^Dh?;Gm z!gfptOA_fppZ_|x;a1068z(9e!KZ&6aSgBKu$_6$NVXbLF(!faC1PqtA0+b%rNsh; zbc0Ui={L)VPVK*Pmx@`JldBgRxgtq(h}y)<@=TW#i{)AHgb z;SA{Lb7Ac^?JZbHpiFE;6YG~Y=Z&8Z(R53-Fm^26u({gJ3TGxkQ+GCm#X$o89dx4w z6v^JYl>VnaIBmvDUsSLv$>QaiNQ>_pBp-Ict20Rj<{bmur`pKUNqu8$(mS~ebNm^< zUTdcWGhv_+5a_lB3Inr*)5>J`BxQSvlc_+H#Ms6Sv#mf%o>nQ;z$P-Tgr>8gJTGtM zn^m;Ema4tjYvPHhlF~+ZO$A`S7|9-lg1It!(&MT8OnjO)P(P}r4v4j%=t>oWU%xPj z>6)=~1~a@e?r==kwCMiOUmh9T?<4D_;b3JXCKduPYx`32!RFxiR7>_-EfsT&ig5jA zh7CFv&(*PHny{F#aNI$Qd}~Dp!6ft0cpg;UmFa?+zW_Jj_Y@+3DaFy3SPts!X^q|} z0lTLV^)68H%Pj#D651?xH+Z5jO_@fUzAc}H#!b(8e8X!B59FY(^ec@x?$yC+kh-4O znvCT7lQ{4`UHTmJRhG@brNOTP_7$1nfBVQZLrFzGj|p9A1(uup9$xze;=$&GAclQO zn}<~mSt{$3_)G;$r?X)Nwk#^FSaxkn%r%kq2Iihvi0!{}pB{t$uk3Fx%yWIh=0RumXKky?T!bI7(w+1)#9={nK-Wqt*+* zT0`)2?xxL+rw!8(Yf*P_U#PFt1%hD_HPGKoyZrrfFy*y%Cq~=NU6s`YYnuUxS(!>9 zXLzKHA=ZP~s^&1z=6iT#E`j=M%&D860;mLY6p## zxx6CKLUk}RRU&))u2S(IW={+M2eX3*CajxZ@7P$6wI*P;c72D5*8FVXwhgBal8+b6 z0d`_B34ovh#(n(Vj$SOcy8+M^U(u*}XFq8?1B(uShp`?p3?A3;hIa^be$9CS8g*BA zJ%5GQ#_Xbos>VMBc8JtgxV~IH!{&5auw&Gstr#TVDKEg-ZPjKN@sSMx4L&-JF8S|c zHf*omn-RX*N}xTEuOMhXCMAv;|5hS-yI2}q9JJ3|D7?-br1WFjE(`q%jE1IRqQI-0 zlg>}7wW&p7-)dk*6M_UYL*52|iMg<|W6T`Uf^(81s^$RJQ?FfNkJSFeKI#~Rdy%B6UQ7_8LIcFK*{ z%O~}Q1pVP0*w9ZfDyWEQr`!f%qY$)H8o1=0 zLW6_5LDW_Ga+Rz$HLGEPR+$F>@dxocMNl$&!F+vEKgRlwtL?nzHOVnI@W>b%!Xif) zvA@r`tM{;myD)Jv+!N@AnehR+5oT*f zgGT=kd+!0%_xt2(vHh)FE&atxR*W zplqLSrCn`__cdYG+&zCFrn5?oYHIzt6&asKdRu+`2)Lnh2RANNHQEdg=`xcaRqZj6SsS4~=%0PaFBW+O9q*ViVQh2hz1wX}naEnog_$ z4=(@X(S68+B?!jE!M^RaisFdMV`|F7rc-6}oDM|mAeaFTfpf+!oYQeai{g&ebeHY`=PvwhSZBX4}cLKc-~B*8<_mtMbA9{NqJx_t|;I`gQT z?FeZp5z;*)^O^5Vb?~&-SXGgUCMQ8+oXM42+WttA>K%C8_|E-1z?jm#dZDYd;3iO7 zcecNg zIj?lS!)R!x@Yz`|y-c#!T1e#$B#d#4s+w+j1Ha;+J*&tNvFRO#V>k*R2rwJ+gToiU z=ARlcxGFuXqk$TcApqyN&MZU`aKTfGmuP}ErP3JNcad$P}}ivdhIi zbU`@Fz%yJ<8OYc21nyn6M;n-a58iD+Kf-K|4C-o4g5m~~;uGI0m8xIRhwL;C!s8SM z?64JRAvNMolZDd2piCt_7NVp(R@Y}Kt0xZTbUeB_nQ%&2RHBnm9CUqDsR)Q*Q=QzQ zJ7s3eQ-DQ)SjJP)-kP&~f(iVHGw8Hi4FCo`YNs;pv?#v+3e)O3W%$$8eg5f|;kl z;L`^F>#zEo>`Y|xTJ&t9+z@rRmNG#YWqb)B;mkC84&8dUwa%|#`kH=9*~us`Jyp_T z*YuDhTOl{^TyY}U4XXhJyTPlA^}YI&W4|QFY{w!eKHBZ?&^D@+WDb*aNL>98#7D67 z_H_$LW3GkY1!l)}lB>v|C|Cb$)M3DfyDn$kSM@{7om0fJk09sXo1WW2zt_Ec+yd(x#kX?e%gFhU%L7}($}kGZzbxiD%Ik79lovi;l{mAj zwAKyT36lMg?gvC9K(gVr_kivuy}j-r7W^-5up&awue{Z>7a2HLP{vZxIulven~^AG z%-$T9)gssJIpYX}QnRddW4Q`uf&;uhXDG0R{cL;4{>12EqQ@88-~*z8sO zghgj@&TpY<$FO_-LzNPbHMV~%l(-f|V1(J#0K;oCfIx8is6YLP`4}$eFR5);;8LT4 zy;xZ{@6Pe|(aOQ|_hJ-CAa<^)x6a764WfZ|t42)j>8%jGv1BvO9BJC0TOb^|-N*0# zRuRLVQR3zCd@U@w>n)TgkV8W6G+KW?gO<~1#ivn#uNlW`Dq8wLZYr{t#Yj0a{zXA} z%W{F%@>aem2pimVADl?y`4vVLL8}+3u$m&_gHyG7q*P`zn{pP``?C}a1!MMS-ZqeU zId>0AFfeNhmDIRrRVhBEy5n)|SIX*91kA|m``4K*wW&IlR?-n#W%I+!mXC=du4(@y zQf0W0@B3Ru@67^#sZs44=?F0D(#S@sN5ji`@4lG!uZDcME}~;d0WYr_FddnD<3GK> zz`mAv-P9YEVM@0F`E`)>qc)r-~fP87q-xdZ11qz(w1Aj=A+3r*w{x((95OGeEzccp4H52`F*)-8fTRE=~hDxstN= zXUaDmgWB@Ig{k8vJ_yU9IcT_p^9p?~N=owm4}+5#1Yq~>7t6UFONF!SsurK~PoW1O zTQ9LUbNIO6r9S6K1vHM!kd1JkN*<}tF#}Jn@8_N;J*IY@Afu_T0y*hWMn`n5m)HL! z#c(u0u7gPFg8}Yy2W^J@gtIbdyxv1Lsw&O>Oy{Fm$@L1lSsmA#W9)Hqszk|*gy94Y)<&fASz(!4XI)K>)VKbtVVd#ynVM?HXk$^*b`&6w>=3q&8h1v z()$I;5AwoTfG=qVxgx+q727G^&X*ezb_TBHClI-4BC9#k2{IEL1>}*j(LuHutda*p zZvvm6cChn*+Dd&)?JDH_nWESVx|JfqCNf04QDZ@A#^)Q z6~_LV08*>^V+$F9Z2Gj#kZ@VZ6imNq(bfBD-R}*!y#=^v@Q*;1Byr#4)9tHKZG)-mJ-FwbQ)uEk8zxop{b zQ@H0h2W>-g4-g+5i`w#Tl^IL}xwUb{%|5$9(Ft7s!KsZd*5%0!(KHCppxc_M4-%V~ znF+a(_)ah{99o8|kH3NpP7#X$^)EFgm*)y+&AO%B3JX^*d&mWW2!R;aerrzGH)7KIK0A#wbeWb|LWtf#&N^&y&eW}RGRczVbsWYJC71#mY= zWd$*pr?rgU;!;GAml*6O>eW$#|L1^REW=SVNE%IhHt|%EA_%#4)ffT-Nb@vxD~9nc z#xyv2uiuG&NZqMo^UnfE&WrvTM`z)*0bR6B+0~v0=BO-sy4f+k2c#5ARW4ZdcS6$M zCyEuJ6?r}bVb8q+y8SpA8$0VE52vxQCP=-?a1x7}wCmj|v*+GbSGIJl0n^SI$p0Wk zd{Mdfk{6%L9+m^#KSqe?JfMf96V3iH-CL!=?SGVntdi01@2$X_1|9){vS=H8&^8=-Af>+NiQgr99MPY!U~IhT%aB(;$i>B*8_?X` z%w^9g^&9!`7j>0SoIG*j{(bU`G+NAp_cgwIj8I=-ma_dVWODbbVafoy>cnXl{K&xCN$&2`+IaM(S6yEVTHxAg#jb3uBC8TJYnPlua=OAPKT7UBwF>`D z{{Xw#RXQFaIJ}*%m6v@s-l9b(fY7!_K|XR7nU^Oxb==ak4?15}etgYpZQW3O`NQ*J z(~X8mIWnb)(6xmS>Bf>wt4`LoJ}kLAC+C#A%3LVA&RVyXhn<6Gn(Gu{Zs5tDwL3;w zyi)J|ZCHJ9aSmbCzdk;-ks>^0I_h#rEd6HtCs= z*AW#}JzF#s`Wp&^v=ZHOHQ}xmeFl##*V?D_QncI)Kh+6-kKfB*X(AS7Fy`E-;n8s= zBR-f}^CGh@{JB`yJB-6`n~JU>83}2nmjrhMM=oKbvgj`K6))L7{)(B4E)EaZ)Gc;* zYHNS>C7&Z>yp>1Gp|WQ8M{%U^h`gd(NKW6@X5=RQF1k|jzIDa>m{`yG<}9q>(hBl7 zLQ8wd5XdB@c*fCFwIZ>u#XfNgmmQsFC-rR#amfyKyjRME9k-hk-#XNrN=lK%M66yn zWNV5S+`3%8nuuH*(D_->X)?os+VCh`IdDe2C!`e12j`U(Er@T@UJ}jnLE?6kQj6E| zNut8iX9QC8iG#$auQ*or?f&55&m~fD{SsptVK}ueMHJ>8AF#7$FgGlz7>iMNej5XR z%X#vgxZO&721nW%nRX0QzK)#_RpO?I$!PCF7qFx*7vU@+?EA)A^?1^EzfAlI)vQ2h2L+FmpVJT!$crsPeR_X1^yE;& z$+3!^_DO-6V89L}p%W&cn4+V}w5EW-KxC|v2caqpc@B%?+-SlTJ%_o`yT`< zM?#xLoe4+6_TKM@`PV@L2N@|2_2J{e7`phuPLVglh{K{d%M7{vq6dPg*CYMOo|e)3 z(Y<%3+<*JmVys8+4@-*tude1wsMPo0wh~g!|8J`@dzfN=sF(h}=f4iwzxiTRv)iN0 zWsAyY>&9S8duNsox)X~iBOY3q93zR$DZ8PEo^xsEM7*o?UJ9N7|wkzkbax?uPU;9-?DUyC#B~Fwzj@PU zE7INDTdBa{;ZZGJ?H-#SeSKx=Q>NxsC_G;BesC-r+frGHvCqzbD;$2X`pEW6W~Tg< zZe3t}h&T_THMs4OzJBZb%P`CV0{Am${Mxw{ySx#>&!+s6m6>AH6_l0P3_kX*z3Y#@ zW!Bd{M%&)m>x539j_LcJkTy{F`meH_;bB00>96taU*?b)b!yLNatTjwXfQ5}m~dFy z-}CeH<2P;fjYBrQQWw|slJ-juPHDYySd=#LEQV78XYu13@m<8oMyMBpku@_orc>`3#9ro&d3`9qubWn z$FZ(MrK^RT9Gzu~I&;Q4HL6k*MX4Yi6blu^9zGnrS|Q)|Gixp~I8W)ORX|`?*2~#G zIYC$nB%pbdL?0UsV6GlN{JmNNfj zFOtf`!VMpmn{GrKun#RGbF(^~X^GtGX!@m-l1zQ2jg3q+)zol1C)KHfFJ2ftufWKm zK}qli64Krx#&G=w0|h}lOOz2;j zc#jaCqRzC0>xabLukTC=4)z^|Fr+T@!(&4qR|?3VUD+9xK_0W}c$I`$;Li9Uk@ ziC%YSwH3Q|O>y^nNkgxVq6BCh>&Hc^?rB??^9tnT1DF1)sM=DAN=PuU9jxk<-c9XH zY4hvZpnY-iB9uk4uMT%TAZeeNTKs-EL*zy9uHzR;Y~A~EuP-E)I&Ev@E5=V*^?aJF zeV69DB5cd6b*d88ol$h-s8ld2$_wFDWbHdHQPEToB;qg^VD_#b_k@*4+O%jz;9Rg( zEa@AB{gf-;;Zz7dhq)|1)c>s+_1j*ZPY(haXWsM4*!i)FF+V0sfR|d~x8K@H)8JWs zSk5pR)pT(wc^Qe=C8MLr(kWztp>B>XD$b1rmNj!i!vO1_hqY}ZUf`Go%X`bFdw(!G zjw!#+VvW3I#%4pa?as6jhu|7sWQ?L}CNchN_1q%COn7g(ZsBDWnl1!2;_a*4T$<|L zqQo)TdOYV9K6CUQOA18e=+m(S28#(6q`(sY_TPyP#7vZr*W%6 zp@J|LnRl8{M2hFdQxvsQ=Y*Xceaz;%R!IJ;lBzzw%;CNv(*9y~!dyLga3Z6;yc{UW ztfuiZG?dY)b2Nn(S!SiqD-?&7Z*OcY%MEw%^4XQ0E_owfdX~HnO(pHa)F$33!N@Jj zE5XXhy$j3ExJ?tWb2~FOpxyXJ++n?Elr%901SxBju4xN3WB9M?hR!kPU#p>G^?SQp ztcrGYHsd#JKN{ZoeztFIb3xQ#;Y%!H zIxQQ}mV^71fl2XgIY&iQRrRq{+r4vUwr44t>^)ihjn>$eo1j)Hkm9m9b!Fwz3BKLY zK)sBfsp$h{ZSB&7Z;T)8-+?A^TP&Y1VHZ=OixIV1ne8-fYHH${(*H;{5|jUKg`hXi zBgMZO`|IaK^GOkf^6Q4Nxk+rv?|%JpA1%&wwb0z@>^)dr*YN4qxQ#l7UaN%|IP3#9 zAyj;61S8p2rDLNc=tQ=V{S+>BjO8-a+BGvDUd)?GRa1{MmUQ?~Xxhm##i3E1;kvVJ zWw!ZD`cx;B=Xr?RfK&`AshY_qO}dn_wAD-y{{3+f?#bepf_6EX=1oMvke-qVn)(r6}9GlF0#ME0pZ<#cx83$g$siZ<=SK) z4(5uwwLvY(v+Lz*4_g088DM`k9C3c}tkGf7UO<)LT|J7>vf1;rM|5_7>P)!O( zfKW>7e_&1$p7DQePW``kt$%%dNALf&mFJPXccEe=OkzTXucMk`hgB8{r6J+}M->6# ztN;8Hq0>hv9bMobhY`LwI^}_xNyP{O8a3$Rqvdv^c83_FoQJ zD#K`RUR%E9nsxjX%Hip;BP;YkI4LPYD8k zr_QqOol||#aU?NuCGNs)O>TW)Kz&A!2YmYVl|yrlMg|PxW22f1^Mmc|jNCdbh>lBo zwPiLNPyX6CA}E-I+8#7eNJDs6>+r_T#_xx_MBK)yi_=CIw9j@(^*$Qwpe0TASB`b^JeW|;@|^}@(A64>4#pkA&)5f8!S)L;$oyL!OR#g&zHpj?)B z2}GZPdZyrLIE;F=S%>}8;=*qDW#+N_F8dmx+8plMG@_OqsaFxh`XKl_<7j^m_(kom zh!pm7l{C$mz4Cp+J%5K=pT?wr+4zH& zH-wJAQEEWMc=h-89rGoIe;jl7@R+%%p+2|jM|K07vHd+ii(3*l>f6UjS4yrYXuy4b zyO^l)2BDq{=331oyN~bUA`$$$;l4dvEkysJJ>V=sd!Q)=S(Z$Kem(vr;g|khd!QWk z9_jq{Buox759~(Je`rg2Imf9@aInr%W(nF*@%`Q9lZRbaZwN=sT=V`2)`X=F7)1A> zuA{&|n#y?CR0!3VNf}%(dD5<8g&lP9m$C#8{hm9wU+P8p{&r33#ZgW5cYd~rg<>IDOrWXLPD+wjc{^aNR+pUKjw|o zy`aoNc)Z6C@7n$RV~Z|tRLtxgO3Yf&__NUdIN7;>v`m@kaHQ$UR>K0xEfYiP1Z%GO zjkA??{GU2Cxb4( zW$enMN6+sCupE?68#cy@I)SeP?y?V4p<^qUQUCtt=_#v=*?~lIt zzkDqQRGUQS;(}l)1b^gdd!Xs=0mbZJa3|I_117oFIm4v#&3pF*b5$}dW5;wBfNO0 zV8hjhQ9RKB|p-`!x4#Skr8qMhK?!o%%QlnwnRI$3C zCCaJ=i`m6Kwk1;>OnyGlz74;(mPQ1ZuZ43@`o>Y)^Uz>$!)m=(U?8ck7%*?gZZ{AeXVEdRWzB^z)Za-ts zGB}Iym_2@6sUxFqDX_=-!(+hH=A;cpq2+j*MrIrHJMv+gnBX_Yp|G?}W(T(orF-Mn&K$!;De)6QkNML*8b?wxw+ zcqs8XV$=%%QeU1Yws2xT27L&8bJV%Me>ZFmLG&xs!2s*N_*|EsntCBA_dahasd{IS zq)>#m2LunVr{_E!Qd~&*{HFMsi-^P0YF7H|-OStVYW|c3bDB8y*LnWSP0w+#G&}!9 z-NZhN8tr|8mC3y?7ydwzPSUM@4+*U3D~p@1 zr3LcE`mPnhFFVbnUWd=+eE2XR)hW$zj<01o+T4c9F z=xNL^L=_4aTuqIuhJ<&vE|W$o%{feCQ`1?S*n2o*70wOfE}i!dSO+`4R%hC`TGk{X zS)dHy1}-kbFy_6U^hg>GusMBpGPM&u?ZtVPj1#JI3|SQf@ab4sEi|6Ef*0mraCJ^2 ziW(c{&w3tkmaJ-(>f7MDe`dCXG>}w++7+QnY=V}l_Hy^6Pp_;EoCotU;UEG+B2T=V za&L|5P>kg!CaR#(Oc1g#TpuNb)n2|Vjm+LpA79Y+xO^#5hSp*xw5J| zK3S4Xm2y>rSQ{y!-DN7vjP=hV>hn3rb-#9Lvb%H=~f-i z4qj0=O?Z+iiWwtJ2+SW#%=^1r45c2siW8+~MZ*3pigqtz7N;;`>+9x*&iBsNQDOyW z%ENKeneSAtVC-&H^E;AN5p(p3@`@*~)>wt)h^Grk<69{oilFc1^| zpiMLkt&7#0_KA3q{KRPyj~?%6H)O58V-x?Ur?){3d_B#h%h%V_(9`M?=~)jKgJ%L> zO0SLc*Q*V!!wxy&BU4`pwq2AW&SAQBs6}Q#Ow0pXm|tMOsXvC&&eR-IZGTaTYLU@F zLldn6*todf^>y;|dG(>s$gTv@7(EvxvL{8_87onEMpY1;{e z@bpHwBq_0PXBbGVMGITcM|QrpG>QuQy>3;Mo7|C}G_l`QrS^T@813h{ zxSq6`4>qe7WyK_%t+t<{SN51=DJFY0GjGw??1J zAd$32v)bs+rpH@&S5!-t(hNkP)7w4-`~nkgh~Sap)HqzeN*6JPF6>Hd_qrqmO;&w}9BD6|TT_ zqiTZV=FO+LujU%ZYeke0?43m0TUOmxz2H`}2F8nn47y)k*jOkfIJqo0@f#V^b! zz+m_(AHh`=)ic{MiARC+(8TWL#R7ig;!PqRV+)gYh^k-kOwX!Ye%dKUowdK~?d_?6 zV#4#$A=y0Tz1~!#J2LZfV4J~s3uaG^x*DUF7aIrpTR}WG7oYrMt+Rj|^ z`FtJ<5w015oZ=&`z5E5*K02udXXd_QvzJj6<#$sjf|rFc=N#mknsr1IbfBb^kV0%hqy zdLFhC(_f5EOH{seS`)Y4o?}puYdWJ>pn<$gLSo}<&t|)(v9eN>=cF)Lev6B%=|#HQ z>t(t9%R?Z5tX0c7?TjtCh%s}jxLYP6{&ZesR}510){3h|Rn83><2EL#F+NO$Wn0R) zxXzmGHD-`&6p}p1gU}Z)|5033`;M%)b!IQIl-L_#NB#~LtFgN0PP=kzTn5jr6>a>D zygb}54qGE%r!Vy?HAPexE-;zorxiAYOE+K6j}dh8a{dVBQ7DNID5cb^zTk(D3APs@ zINd5bGS>iWQy^>t=;+qT;)#fCi@d^VY8~|q$IQ|`(+zN@0N&5PfdDnC77rL=l#m^w zpY6Px_`tO(X!6TC70}(vjJN+BA1fsB>EP1%z;Z>Ydb$=aDFzF%`H_R?Wg?X*R#tpJ zcp-t6s-1ksZ!x`Mr?TH4ccOvah}>?|t!$8dob@j5j4!5wRd_A&<|J}^wej})oIgK=v(QvzLY$zr~Ws6>R04cNZdDVaJ8@_sF053JlH)S4T zkHw6>ZWxV|VA6GxF26w#keq$#ob6uET-}gmtnV4j#7I%-Z!hWAmqt7v(jptMRtx%S z5dTT%{xYdC z$t{vN&Z@-ylzZq-15b74Ic&<(XqPciv~)chHo2XAbER8x8@2}FjRm=}joyz*~Tk>`p^Rw+ncbTBGoz4d&}1*z@6B{uHXePx9%sf3|8; zs{Y_RZpx8&LwN6z^$jCYmzRZqG-B`hlU1l#iGAt1zljI1PuaT72ryz$0M#pibKRO; zZZe&9MYlfJOFoMU;pcuwkW?#YukaB^seupSTGzqk!gl%zjjC zX89StIm*nIcHcYEJ zSWdHj9uGa({EL}m9@h#%EVRV8c>a&g32-59SpHBMc31~kR|*SyGF|07@E9Oh~FS&5uV#sjIUF!FO~3Gn*909s=s>B zy78{nj^UY6&5IcX$?s;-U_3;~FIYuwiK=!~Kh(>-Ln%0?;)Spy`MTWgD!}|9I<~2& zF>F35*#zndNjKc6|H`Tulg?vIUi5~t>5}2NK$AkXF;Na{FWyUzUUzBFp|}0jE82ux z#+t6`XH;OrtI$xxKR%z2?xgX+O$rSuIOt}_^T9&bc0&?aE`iZ^aY++BSp%~)WuaSx zkA`XUi;Im^;GHXjN398T{3oJL% z96gyALgK-RYs`4Gog{#tvsiftYUubu>Dy%IkY z|8T`v2@VZ9tkkK-RqtyqE}Cjisb+NFD4U*_c?CHND8WP z-s;Y|MZe_BJ$JLzOfyNRY~H(U>{?y1Gtl(dTL61kIoxACJs^~*jdugBh~lR zuHpG$sNJuFQ?BkdVZM8_ylsYmgEF@rFc?Db1b5uvU2;_0OX=J zUi21Eu#Q>Nl|68oLbG7n)qHPmes=t%vWZ}$$I3z6pPSS7FIJ+`gx*g`5i<-W z36VFd+D!*6MC>9l2CPQyLQYwC#88>Ljurzijq0-uR>^eBUTe+Cr9|m{6KJ$U#`-TL z4>#G;R>v4>a-ebv1MBc4fjmI(B|CzAW@Ub}S^X_A~}4 zB!9O*G(6m&XS#W#OQPZXJ?R7oTX6Z+-6+Hx>aAvL`Vz#LPuT5c&i}C_ms*}WeCbMt z$12#!aG1Hd78oWa;oSals{!ie-UBSTqaNy&DE7FcA>YPvQ;+nfshYB5nOF?{tTra3 z9l#h;r^xq^_5+8YJ4*%j#Dnlb_o~$$ZC7x4WZoj|$XL?K^+0?Bmyt@E5V+gUSBQRb zUWtM_xI5ohcr+XorCd3~qDfM@oOVheqF$s)x*@hn)M-a$o0LbQSD8~tWjH=t|9bYz zr2dw?$s+tRlB7k117k^ESzBWyK9Y(a?(;HWDglBQ5490`#ji#(;V}_VcWM5b$&0YP z8r!)ue&+r6+rl;p%*Gd|$>dzW4(-zF)r3RHGju4tQK@6`=ReU#}ed(j)${4d% z>}2aCHTT3m|21|hlE9FylniPg%O`1$YtOd1NR|dm67ktmr$zgEW{3B7T}`R|-c2ly zV4&$2hf9+L{h0CTJ!udy7#t1PRW1M7g!=O3{=gmU6R@OMb#Dy8cFVSYyaqjIid_;5*Lw|!gw5&)=nmhQ0i(H&d?^0i_~ynl?*m$Mi< zdxqA6NQfQa5ISE+Dm--NQC~`z;(TE$N~Z&r^5jWD7{;wd(bQ&|$;1g=R=^P7C~q(5=y&0u2=$s-#G?hjmOS%_|!J^3m0JjN*3;ti3OP4r{J2hf!!a&LqlVQ z-CA3Q?rq8|Du%WZSW(EklfTQTrhW|gxNyZ(w>ZM>V1JL2Rf(er;0C^-fj*@n;*?{##!4$>e?K&jBI$)I0{PS4 zd{*%iEjrtYGLHIXn@ep&tCP|BP8sjzepmP`3lD1sO`9AOB@0sOG=^KZIn?mQBvQYB zIRl7~Rud15Rak7CdG>#y23M-9t55*du9hmN$v+PX(x%M0qov*_T`jm_R>kujB-I2K z_+<(Mqm^D5CD`xNA-xBJDLE=iCa)T0*^l?+=JFZ00l)XZXk<|Tr3`%gHPJRZoj-!y zTzFJlB2~DFZ+fwZhKA1m)kb5A%~?qEvD9_Z&2F6muha@RS#m?SZ@Z3xE475~!)Fr!n-Loq4zi4v9BymVC%W&vxymf-kJzs|gx7&*apMp3~Z!fqdT* zJoozW%`Bix8yT+;*RS@O_BX7utA1@~@>Jb$uTXYF)sUyhA=VlAJ*`u1-y#gc-Z}b4 zLil_!?J?>i!&NJmR87x=cdp?Vw`K&YA6M~!F*)LqQP+|5!PO?A)OCZZyJ+ys(}9y~ zchx1s2ZzE0f$$gT_CCgmZ91b-=IMqAQ0+p&U3Ui#sqr7zC8B}wcixlXBZg=)Eotuu zm+tuoIOAM8QAZW10wl(*X-X&Vc$XG=@-5y_DJev6wqLp8CrZ!lB0JIE$AIQ%gpSM4 zir6bc#{tEIINOii)UGc1?u~9xx&TM7XP3E*r6`8fFWp^I=madmn9%Rs{Cu@A&B#|) zBOemxT!5YYZIVM>d}~QEpO3S$xQd6j=|NewJS}0ZWcK=yeGs7RYEp^6jc)Q&iV?E{ z^#`EJ2KFTKH%92Sh-r4poDMe^*IB)i2OIY0-BAvJr~>NP;1Zs&_If+rQ{hZTFF{~~ z@KbiihVh-h5Z?m)f$EXB6H9koEX*Ze9P)xktHhhioUY*4%zERc%QojF?w5q0Pk#oy z8dPSj$FS4Hz`-DimW@dl8v8595a`>sd#nD4xuw$2{i_hPlvon%FsYm;uSy|A>5rG~ z7rCYYa@K&si{)8TTiWtGbPrJ_e>dzjGS|Ko9A6t?XX~gfvQJ$ES4a0IBaCB5EIVz! zZcM;r*!|jhdz+VleYal80@x~{rOYEF_Fzl@0OppORh8)(byply#!~%Djd6(CX#`a$ zRPrQ#E-s#!Xz0`_S{N*~n)ank32`HS=?4^ayUlq~=NTUho{7ecsB#CL)i^ZKVY?HS zd$L{=1zocqj*5wKotUwOW+TcR#hLisntCR{8cVX?N8rxuR#d$Eh-KRC?P z$BFL(={-YwgoTjx^H(0lpY5-SQ`lFK$b0GNx`C;k(T z#D90?|M|7#`SGqtSv9HHm9c@AG9CA2b)Y@m1XFx8P9ZwNY0+#0cu1m!O9!Y}pm~tL z<0JqFwhOLz^n$2K&REBYJMEi1g=tzcN?-&7phGY0itk7&_go-_?k!h)AzBdFkC);B zL^WL5|HdxyMQUvk2+SPz;21Qv0@7Cw5F4bS;1GbO8N8qwuWjv!wkUwrPOGV=<35E;aSEmhc55N3!SLr(5+ff4&EGRdc`x z6aXO6ZE=aNCu{d+>mk5c+&toTj|12ZdhOI8H1Uy5B`Qso$}b`r)sWzp` zuIITHEIv@QK%Ln1W55c6wCo2K8;U64_qdAg?qr*OBM<|V&m(K9S^Oeqn>udiPibH081MUeHqC``Kp zUY*&REiE+=T z%!P}#Jl6_40>!I_c949!V)kZcuk41#bWon08h3#5GVz^|@zA=zPa7I5i4`4t`eTZ| zI)aukf%x#+m^&%4@6|V!IqdY-kDzZ-CsFr_2&Ls0&Qu(UWFoL`6PL%lVQp|ey<%6I>C)F zFCM6!dA!mLfojcLSvrtyQ&JMH&NJIzfNhMMoSX#KyF=_P&%IMu{vH?}hz?%9`TW(7 zUMCNSDpYD}NHs2oEtvY!V&OBb5NDGG#|=WJQ!<29eBa15pClpnHGFb7f2feL;!YBx zrl=n_TF)J-c!2Z>v)W)>fOc_eyi8Xt&#`Q$D__2SeK+jN)lmxj?*PDFdJHVm+h|fu zNWZ#$)h=|4Vh=p!Upvtweiv8TmD4_dCI*5As6VAX{u_^2T?JfA9gNGoON4f#Amb^= z!*e?Z;u*XKxOFf3jLN%|KqS4w>%IfVy=gw7Rp5W_B}dFzIV1G-xpx3>(Jzy51+XTt zb7+c37Z@4rOO5KrN&sCaq-@p(+Vy^Qz%n#Xm%dfU4F*Mc zuC=Fwh|F|@_qi9;b?jj=Uqmb6K0)82k8ZC;}wP?5tnUvM4m-{s0^A{E11 zt+${p4{=H15I{R+y;01@qP(e#xq~iL&gJ90d-LSmH;^JjC+2+Ly@Xdp1I|H@lRB0W z!Ho>hVF<}&G;%K7r17`-Zx5&P@=BNj)h1y&9D%gTeHr+R?oRdVjr$7 z9_-G^Q;Sp&*-=oQ6Qnl8$gbwRpy|$oFX5OKw8>QG@WG4V$xq|=y!B{>$NKBZ>)w(M z7zvy8@5Wd32IToHXSj~`=8Ut3=BPb?=v>`@-6gRWyX%BlHy8i%WYtgVJ&rMA0>((k&o zPp<0f&3+Kx%JZxU=f&yQ{@U%645yD&jmzNRDV6v5#2zv^d9ki;XhrvhePhTg-b9kx zfC^#b#w%@7H7mBpE-qbl5b^_H+;<_ZQUvV1i4PzJG@~7;$ZYz*RDrWpy<*&yuwV5Po7hH;G!C}-79@dqcw+NQ zoj#Yy-c8f`u_0AbTxSfUP2nHESIOS;taE?ohH;ziIi)*3+=jnWNpkaoo7Z|F`z7Iy zKN-IP%SgY1lRDQ1^g5}3P?M@6iff{OR z&j#YI208DZ7%Z`u7AybqrMk&2QfP6!3@;ggrULq@^Rq(dN!zPmStU1Rh0y)WKRHL& zEw0|ULFX14yUr^nz#%$&@5Cu@LsS{0O$A*x{|0}3zsYms3DjxO)A`TZEJ(U`P3s!5n;IJq_?9~eapfWHru*;`t( z@+GCJc688G<*$bP6o(P1$U?$D;g5LMt_p9Li1nl1gf1J>pzJqNX(Iu&U7>!Tdw3Vz zbZLbvpRY2P3)odhY>KB|0w{JTJS+@YiUdYRe=>L>HL8bbVF~b70Qe~r>41zpJd-xH zCIrIE`PJRcEvI#LbralM0q}1kG-}taKNO~5I-daTO}2%td=A}9Vv%%>ZOe^u+Mzj- znwwqswrSKz*Nvz&izFka)xC21&;j3#HH%bvf7tODn|_aI_YUTH3V$F{qryvh216=j z_UnZ47iRax$W2F8DsL|qh+fsy7@Z`l+h1L4M#kf>xd!4J8ekRy;p05Ql?zxOS;Zwr zhl~NSMK)nr`)bB!N%^m9LQ0*P$LoZXQ%o=YFnp;r)Xm7q$R;j6-t?O!A(hHlSWH~p z&`?cYyi{XWa>_rQG%IA2VNFV}oWiY4Yj&1~m{`VDCpcKO12(Z?5UV(~B&S#Q6utO8 z5=Je-C6q6=Ju%tD*d*(Wj^$0w^43IG4Rf=kA1-Qb+MYD_CT>Y7rt`8g9@)yG;*2(1 zu#;TnFPmCdu5%BS+9E^;GICQa+RH69Of+O0v+EwAk@2MDJk6%&k1jIgS`7qdHgm3R z?a-)N^DXQtWl*@W#cuAWIIPH;l)9#R27O6lW!YcE(i-(SrRGj^D2V!=I~#8;wYpL5 zjW|``+LsZKe*#FQBNu{&+N#_DXazQ6TTKO|DH7E3`rwCh?427cz2PsLG%eya26gSq z-&GBj1-V&tgAD1u5)A_8F*V9)x-~ZJl&_CZYMIE-zCJB&ZF&j!;)H~;`VUNDVPX6x z&8gD8?2+L`8cxr`TwE;m%0GVja!pQ7PE=GBomKUgtSCQ!Fwa!!>~MH#?a|UJ&SbKr6vhqPi-NQ8i)Bl)a&iS(rfqQ-CC_gz z48WGECg$cP$i1D$IKm~+Zd?2NyGsoBHWXuo81;YpUF1l|z2`NoU0)p9o$Jo14T-)` zSEtUrsiIBCph=CopVFCz^nDD-Lx2A%A|eJ!q;6jxq~yN%F& zuXMXT#|Y}Y0I;((M+*z@=ERHRt!A#P7nMdFObS@GFT&YLU*@b@8k_qenY`tG%H?t% z2aAC)^hBgUXLlkyS>%mYTL2Sjd$0i}t>G5SA(zFTymAm+b83!`D6lZ-X~bVyBkmbe zc}mzlZQhgsEAD^5Q>H89OHYGongI8hQ7pE2$uNxH&IYVn7jtWdTd;7AJWa|YZ(`E@!_8ShVqZTwQo*!zbPhqWW^(d(hbB1ak^u6h z9BavjF!n>+y4IR*Q@nGA75ra z(M|eYF=*~^5I}!jGlh|D)8XSb?HQc>XXvuo@{|}|Hc|kJDI$bpy&8;HtyBxiPyTEY(ahnh+da;blO$J;rBZ`%isS3l`XGTGG6+P`fo zGci(s0|9~Aec7)Ge-@0E#@_BNoU*)@erN< zTzQ(pQF=KJ2Cv5=3v%~^%NuY==NV6kmK6eA4?gBF-yRBHdkH~Er*q^8&YCDxE^nOssi-U~msh#c!^Tg6dYidjk-Bt~HRvCOlqIS6iEknmX>= zw^!#!(_U_YRJebhj*$uc;UK0O=|15<$qt$nkeb#1tddyE1SZb`HBn)!FF`pu6n4@B z?@UZOq|He{Gdo{go$Qwz0~!@awc_X;%~Y;al~-vC5=U0zQ812c;A(`=&qtVx=C({s zC4$sR@xzy^XFK?~ynLJv+;a~uD|d>AP#2zbUYqWDhYOmj%{f4LJ#RdRz4~d%Pb_E= z2$0TgRRfq!`|j&vR(lSsxox*No@@H&8Tj{JVqe7^%hOX_N5qPno)x!zubf#@MHt`@ z6COexPNI`B{?_!l2MG8Sa<2Hhw8ExagRJ|)Ho&jjHX*3UQf|bSxUDsKdfIKBvB}j< zqnAg6I5sgVF(jl6aKP+r#mIe+gBYisYZ231c~)KeWc05zY&S+pGR%G5yB5iOPIMku zzFhZ$f&}r3f{AjQA3g*^wjVo!?HAnNSM(RkTTRqdu5_!9Z!K$rM?Echip;_ZKSTLJ z>Un3U9PY(g2V`Co=&kCZnz9|DI>M&?4s)%a^0xJIC}+F!^J$Fxz?~{@(XJhO-$7VG z!>QpN55$_}0H9zl?ZzR^X|%ZXrl5B6pMyp<`9fAz1Z<|&3j%9w=cH_HZH-TDrfT;8 zJ>{fY*Y0;Xdx7A;PZ{h{>+HQmg7A2j6(Hl9I8PqZs%yM)U<`#$YsIO z*0%VG0BFEaX+6aop9NWJPTj1ntx5YP zSn&YpGJFXsH=u4yA?CP~n(K(xAP}C#2Wx4*aRB#HW8>f$ER?TzT8~}n#!5%%>L$L2~8iiGACX4OR%?tjU#;=Q07!2hMeKXte1J z$lUac(FF#03PH7jfbqepkqf9O5b(&=06F>~OLG|CMP#rc_X)b|I~G2kfYoT(S_SM# zD@IF2C2noq#E;)rOG}G7%^((G&eQWlR8&+#mzs5R6d3l2Xjcpz;&jJ#7tLkSwlal&d zXY`Y75c@H1@eAa1ekFOpvHOEfz`pf4NR>Rp9sB>1fHC$e*{@2P^rv{clA=8*zu|^c zB(0PtT;YoJDy=~GHAjk=7#V$`@A4Nt1uHhK#noS$d*pr?5urC*94BByDLAP~3gh>v z8U7@Fy8r1OvvKqeN<*-1FZKwngD~pY=?K?tPSZCVmvxV|Ir{B%+EB*25WsQ6?id(rNuA1Hjp4-(y72&$`X(ha+#2jP9pTmT?nBusfIjK@OagRy$*8Du4?S;_r>3N&bh14L+DT{n zG7{>wK2>{&*+uK=>b|H1VgY+FVZ+SKd{uvUd#+8g5A^NeDZbCd^unD0i(5;;Kow5t z+i)LFS{yma5AE~{IZsAA=t`L7?`d(^>O|ZVko@xX>n*vkFA*V+Rn7YKiJAKw;DgiZ zeEXh5ZK8)yvUnvjI#w|*XYYCh`Fc*f&5pY*rjriQhK!eT6X?CkU; zN8mmb3Y9uq*w|2lJJ6O@hSR@{QTuW)=K4@7#d0-T)1?rUP2&fG+KHJT9c-^gAt*r3ULvJQJ zfx4ag<4Nu*_UGK3Za8?*x(Bz>Q8{GcR=thn%V$>T{04^EL&BYZgQ-fMw-kn6^ z)E*FHW{_tFhYj2Jg9~GH=__~R6XJEVDg2u`&gZkQt4~zzV7t+t zZS*;UDwLY>-aU~-mlMpDkhH7PEq8H3N~`wt=G=_Wi5RtU@HyHk%vm*Dy!P|gn>&sZ zI=HAo*vRf`{uuL$)d$@hNz){6QRMqVSFd=#jP~t1^&Pqat!vemRc)0It?iC&a2x#< zGmjuzO~iVXM$``t)7`oAyiZ!@$g%rp0G99W-Jf%Q0Bqc$EOH~`qV_bZS&Ch3gdP6t3 z4(T`4L=`;ucX*k~K&zzz(I&W$&s9Sb`Qwqm*zw~bFKQZbH9b9vsj1~c4#)PN?Jsak zUc%x&-qJj<5m8ftgNBe7$ZH#Vg5?>9)#BzDsUzWm6E8zBa%hN&UMW32JsW=7Qig^YCDPaTMPHBPFZ;a<{i7}al~M_PLO`JG zVaX%(JZ>;b3W^Ytq2b~3^70N^fQj-~2-NB15-(|qwxQmE_BeyR_7!Di=>`vo;q9HB zyuJN{gK1%E#33pj*V*{*2>@%Fnt~!bFE2bzUtfO;$DVpvjYf!aVQH675khsl^_iJ0 z=kO{C3?#s?rlF(#{qgrJo)%vIOB9=`-v%sDwP@d*95%;BayZXpu&#M7S65fCn0bV! zr{^-d&UM$PX54vmTJaoI3(L#0XF0jK=C5Brod(U1^*FegU+;+>YM5j;&J=fcr-uv8 zRFc3#UnjVkzTU%vN=BB`VE>4SJ2`ADUb;-o%o-XRV>X&bp9oi0Qk5R^^Lt`;nD>YM zKYo0EIHQ;`*8~^jJL9OMI+(C@%at^EhXd4ZfTXTBA^j~-ngje}<>VEoE$dAZ9uWEq2c$m2e8 z;UR%XRbuZ<q+ zO<-YRA$8=qHd+jBz5Vd?sUyFphDJ}PIqWtGF>yO*x_(-6@_TG)@-MZdGY~wKvY_Ju z2|=(T(m#9Hl91kD+9E|o=jU6>$>HU6_9Ky5(Q5tB=%uB%cHRI7RZ=ctp13U!Fdt*~ zA|rwJx$f+lTEib2=|D+IIe(k@t$&5g#oNA3enDq@?(2Z@6Cn%?4BE4d&3Wz!K2uaI zIDtxHomu`Y{b*A`=s*i|d>j@Xr!6d1;F>;-1Fey?Q0+iUfs*d*lkGWayLuHk?CH}B zuH8dJ>UQ$Fx-_Q?WQ$Z5%yQOR>42Q%g8RzK%9hX}YZA)J!JprP=oav7{DxI9z4%!K z^R^39-0H_EI-$=iyHS58&h682(mHZn=p zJnuVEs++{y+uQR~0dCQEXG-?Ejf0`;C-0ZlHb;M)X7O0#?3X4r2IPb*SFL88-fpY~ zemX9%zGv9oE?L5R!av;iHakJTQYx~4`4j4W5-az&T37f^al*v@V(;X`U+4~6VJlKc zcgs*sZr%}jyiI|P0~t?`j7E59lNcvk0>3AJwYN46@+8Z4UdI{J(^EYiAAE$TB(3-7IJv<8v|;b+V3-GS{6*0 zMybtbb;p$kXMgf9uKCJ)xVv0^DePlnrp9ai#zx$IKvpTrcydNo|ioD8*y~pq* z&0%jZXLrw;sN~*2e}4=t=vN`Is&vABrxH7Ag5n@*cyll+}N#{Mp34 z6SZK6V<<-@cgO0r5%h6|Om0o3-D>R(fU2ht`v>fYHJ${bkb>+p1BQD@Y!9g zmR#TTS|WP>Q3X(Ry%*Ktn$~V@vmPtt_y)KBWl2e?Q0F3RQW&jA=y;GG3C#1hO%i(L zTF{nDx3>yuWaJG$*_4#fH*ZvyDPz`1?pIBgR3UAWFvsG%1Yd%c-+BdVNJvO%Yq$D; z4~b5>O&O!LUPg!!dXd1taOZ208&6iz!Rn&Pb04VHv)^#b%~hry1HCNUIfrJefausM z5XRh6RaZB9^9D6L`}{Y|>Rq-|Cw!o(y|FK}>)T&(v(+Vl1Y*fk2qP%z=tjMB+L-Ks z={Yz!JfR6HF6KGC*wH2rq~&jz?b_H%UOC-mjr;!n>9L$p?nF&>wV-2AR1}$SQ?=7N z)oIXPd=L{q4I!(raGdr9Aa9n@=tEEVJrz^Mdj&ZQSE(aLFG5V zWUm2$0W0_qz&bm>!h(QI+dpTD#SD4mIU0rYRGDow>NLtWPrk**$`K*jb)vwCVNYH* zwvNF;K0dzPT4{#oN>L5g`}aKS(`D>SZEhk!VyZHp;KU6?wg3UUHUZ(8B}9%m;Ogbe zkNEk`EG+Dw(BR|aAKw79s;a6wPn)mf4PEc+5qf}KnXsty@4^>A{-P@#tIJkP603i) zls}n;{H#QP0G^)+=hdPqAcBYxOJjKZ447aB9H%sMlHK9jP^Pn?%DDZ{Mr zJL~LE#7OsM?5gs>pdk{+Ym$K($NR(!>?_RMdW~@T=(X(eZp|h*>juv1nS=&OT&!+7 zRD|h%WwldyjmuKr-P&F2;3;w7x3YXB zJSR8@0A(`R2{Df~U)}sOV&s&kHIarJk{RL(@q# zPe4k8{G03hAHvTXfsOEU5bt>PxtJ+08L^3p$$-v-&|S*F)OOR}ii06W*EWE4Bxegp z+j9ZdtMg`qgBs=uQ~+UCp6|Q_Jw%dKA8z9zVyQ5xb?!UD+*osSbI`5wj&BnWFK;T` z)nn_|Gr+uEhvVbLCNcy7&ez0W{_CRa2jDQK@4xGI{kt(p%9MUMsIxepI*xY86Zr5fOxUoi-IsFad%2KkFvBhjVsZqA^>~4iCbr)O}X9>H|0OVf}G) z4;$h5{=V7| z{kK-BtKVAX!G3*7@_MPJ{4BqTo53AsW^P{6#O-EJ12hkGFKzAz{9zJMk7W88ny%pE z(DCN%r`O=M0p{4_@3P{)5lux++$#+M&nZ@hSuM0XFgKEH_>f9Rl8zSUq^kDn5D0RG zEM#6aUGpsq6VuBS_F>xmQ^gy%VdX?x3UX1ADi(Cry4HE9=&&&2dhE)ecHN5kiXHod z2bSn^5UswmLuL5-&71yS!!UbGOUoxTgtdbtu5tGuEJ=Np6&0C>e=&N$rq!pKOlaZ` z-GKu>)lPS1Ueb&obQLK#e$Z&;?@!LHN={V%nhXW$s-ZBf1@hWWVTXC6i_ZHdV(HYO zfda;6t-;FrL`W!atv^PzwAvScSs}nUn3fI}S}0q2DOv^?bp5u-gG+n6 z0#@n_M7+tHOe@%ZUiZ&85f8fIA#M`n(b5jGp`lq>L|RPpux7F0roEFDoV^bnOvV3Q zFlDTY;vgl*RMDDB`c@t^=|=ivIX%Usd{>X-J&dVU955KQ99oyU`R$LXR_yLQdj%wS z%7>gupZc4!^gM40i~FXDuDxs5^YHLkMiQ|}_y+~C=yWDl)=Bj>Qsk8`Ll%=^YLy)3 zqvKD)G9uPmDqbCoGN7WHM_cwhZ-8xvrpN8=8bC$VSPGK4=l}*LdFe6r!}~6OhC&C) z<`Y-DetyZM`}~UA{SGfS^>7elaJ0WN%whL2GExI1aamgzKD~Q4!LN9&xT%SIfInwA z{e365j4yX+Blk)g<8Wr+*1@{Y&RuL&-^4t&x%mYH7*!yvtvx<(FB2Nt&>+S}Xq=Bo zgBGhFNw#-&?e6WR$7b?r*1Q=@lR-s;cbBXD`0>N2CoL$5@bt3VktA6HkC6QW8m$&h za-&h^>4DD`Ox(S0eyOa&!l228EmYIqs&7P!?Gu`kjQsF$5>foLyYjTl5EEdmSz6{7 z6mV+Eb?96A15gsfY^!yT8!kg{BC;0_fDX9kpOu~crN)KAI4dwPaELyWo(Fr(vtB{4 zDGYQT!RY-3>b2m6DM2jppwHou$zQ$>G3$lxLO+(4mVR7%0tK{>t0=WMI;6^aY{#9><}35_CE9Mn^_c-!-Q#hcM|I>HC)CdE ze?20W4qKE1a-@ARX{#yX7$2T1NMm$u18%$kTidPrVXfP}NIHO9xX3Nq^h&*FLVX z!#tK!6I>xr(iPcr_B#_-zUTF}-3jll3sHkirIpJJC5pVG8aR4j_UkC<;x6`@4S zW4`aA`zU?0PuJSrxKw~THxuySeL7@lF(B0k%4Conl~s%{%Fe-&!}U7gbxU`503HG~ z#(lua86F2%F2cY2Ew-KB!x|)Wi&rl0>q{=Q+f)0D*j0!pm&#{d^mv%Cta|U-s z3sdFL?{$)=IBrL7Ox^cEJ9Ykw@ zvd;>G&_gXxtdvv1Lixk?98DR0dKpkGj)I}>pc~ES&Ri*6`TJ%P9E~97Jikm&K^Z}!GIvE(aJ$+hy)BfXlh+~|HUo(7fir5Ibk%=%j>hj(ydRNl* z4yZwtRNn?_uZ3B>FU}@IktfeB#wjWm2WdClJ`0lOoO$W&u)E$~D3w4C%gM{*JH8c8 zd%^wb5orusS+O`ioa=^{G&)^=h?a3zsEVyNHkL{YBZCvos2ENYTK)pIJWdZB+w9M> zb8;Ap@09;Y0vs1O5AIld9LS!{urm-51p_r)M@MHTKbw~;_iNy1C~y)Ps(%1wZsAE? zOLs;H%(`uH+)Zxox}S&E*0*tTt#*^bbJd}A?}p5crKleOrZOTkfK1SUK*HaJ*Tl=r z7lTv)_B_zSg?0O~*)S8}F1`_Q38L;%o?jj~GEuX=B)>#j`uOo<5Ghmx{GUY%A=klJ zB<$^|>@uyd?xSJM@|;-P*hFqB6umy2bI!)vJ31I_UhYND`J>2_`dGI)JS#r~pHV-Q ze`oGIlFQYkKB??T#Dsk6Jo*E4-b8o4s=sfvO;<(RUpPoN` zagR?1g9(GHTn9UVp|{fW;xBIYwCx=ax5Yhg3kYqyJy7ut;gPFODo5Y?G`aD#u#(&- zxkS-PLOz4C%E19lX75{`ydXkk*W;(Arp6~sSz6KL8ivwaJx+4cek43A<)__l9LU~ zM1W|&fxrnRT+RVL-k_k~A^O;JB`$%!!{lx>m%jAT6>a9MU;lfYWJ6BB)Xcpqr3rlv zU%%dRM3G|@o{!h+Hh5@BN_x8~faHaNNLhs@?$#Aa27knoF*LO>`i>9KUw)te&6_vd z(Ne14B&-J6%#Sp5bmZC3J^EJKcXK`i=U+Kn91wQE(DQ9lfk15banFI5W95^+o}MCX z4@3?Mz`y+b>}dt2tyJDv5D}@Wt{xj33q@C$4YD-cKMihBKHA6p@60!N!_qI3&D{b% z%mc2FhzJq)gLB#EIII$_2AWs8qVABA+Dum20`JI93CPQdt5X2MgF7uPE%Vzmb*_U- zmeN9#p*uV!Q6tmSiJj1Fj_?POkzrvam6cw5OSee_LmgeG=#N(`C%QnH4x9NkWKdJ*_=HTF1A?g7^jrJS!WLK_ugJ=~4 zb_La|WA!YFGmxTmSza&oaerS@<#?)LlJW_yH|Ra&T1m)=Jw8P)uWk8%zRQHA`sqwu ze@#tYJ!1HZ4n{F|UX2U$SwcIq%SLtmbnpqL=cJh#yK*{MCCW0fRGMMt-w>j!pi>qC zJEH^5@3-@xsA&Q-l~?~66pG+sBrj6y(rko#MStsuk`FZc^{bz?_$RZGM5#Elo_qQ- z6{Acncjc^YESw+HuFvh&6jhfRW#91;kpMo4y%#>}u0L6%+LJrBG@EJ^ zTu(w+qiBvXhf46ZI<(V9K0jq&LEK?w&HXTK&L@^z3d9U5A%qTlr2hC!0wDs|jyK}> zBHx0Dz(09QCvmKE!|mtnLl zJ2D<>KOye5-d?@8Ya`d;w6!*ILlEW;FO^x~& z5c-mm8C6x^YJ>&H0p+}Ubu?z`_~HE|=yPIe)Iy^{9u*!gk@0Yz56t>M{_MXRG|`^{<5gPGfGY@pRx!LMJhk7I`1Z@aQ}NQDG!`D6DPy!h{f zSmX=kN)R(U*ql)o{{iT%Mg#;um5kxn5pJ+;2%^8mu;uLG^+)vAoz3i?+Z^{2rMrK2{t0i~23uP|c&Qs0h_ zcls8x4-JUr7F;h1;yhXTYhZBj)2C139!F1&jYL3CB{o03pA7mDBV<}FG{hxm{wll1 zr1sfOT@6c*9z6nnZVUzk+!qe&7bAdx?(HSKc{AY4m)G2owaL#icV%Q{Z(P4FqpWPh zznKkei!Wcc_VxfD$8Mn{bYf%#IM2S0vKyU}r!D4*8CakrJw300xX_0WAN>6M*2Hv& zR=>r>U}jtVi;9Xg1>UXIS>)H%i2%6l{GL9x{Doa=47N4CaojWovnK{^M!&g2QNJPaT;;Oi zz(TwOTf_ajvI?1>_isJIle6%j^>17TZ@VFRn?iJpt@^&lk8cj!Gj!y4js&jh1Y$F# zV1`zS$={QHZ&mZ?ue57o#u5xa_GI!haM5OZFGKE%BZ?P-zk>g`?q_#)f40^3lzAvc zgn}q8T6y^QRHjiu3N6?PPI_O;TqfH$&@9}_>2m^o<||GdWR*~n3Zmi zj#2_6%S?aD3adWItJ(%WM>#$q#0b6(r0^fb$E&>Sb`uRuBj{@RSR%EBgaFdVy7ypm z$)f(CsxvId@YbuRZy1ZbObT5}G`Up_S^qlX{nqVoaW)4x zR$nkT-4|Sc2tLeB*&x1V-7xm0zM11M|L$G)qaP!W&(bxz8S=hKRBW@-!-@jCccs^^ zd=CCjWj~48RG>0A;75Lxw6yv%*5+k8@NF(=6#qK?hwZw05NwKCU9rV$6 zt2@I1s3B$eeCs)AfAV+5X(RXb^Dq9XIYp6!U#>I!xhdhi4>kDZ^R55ySnx0?6*|9+ z?f2Lhf67w-8~gXepP}b(0v^M^Ygq4MKc0W__i%8-#YpcS=z@cp*Q#UM+K2;g{sAS-xQE=`N%F-h7Hp}eJBd+0ogIDKt zN?6yBw6zVIxN&yT)yNu6jBSh`z6fGudg>ha z;6!X3EuMnt?O0oOkzIusQCdb(uId%W4!z#r*8Jgih0P12b-nd;NzQYMiA@vO3BM~! zeph-o@$|yJ($#UhMd)JZ4gE~z{FKd?OCN3QI&Am{lqBbugshePjNjRs+*z9ZI$GCR z^|AA)G52%oigU~Gro6eToW)>OIpsoK{@0p#IenOh-Wx|fTSd{zij5P#cC_{Cx$Y=B52ZW^w!B zqLun<_WokO;)X`<$axI!;NJbx3iEOPSR;*{2{t^emdu$Zf>fWVVw`?jU&AE`cvMat z-`C$(ubOYz{}@;2?LRr@PTe=D<+U;*lt#_#Q(>_OFC3^!IaLy#4y!#C>bpNP(ldTCsC7K_w`#{Cj=8|gLj6%EEX}6Zf7yr@&_G*`Xk{Cf&A!hFNLe>2b^i(x ziJ-Z3C?3$i<2kdNsVJ%g2>K816{lrBd#S3Hq@fb6t4acVS+Qyx(Y>BK#myMK6tKQ7 zxLt3>3vFL_gY@Cjdg5qM$_`lKn#?uASV7C7FqL@6Ir95TI`uZaQ4;3oW2KW=E$MCPPj*m-kC_k>RHMt zMh_Jz;2I5G_$FyW>1{$o*i4hz=Jw=1!Ec6gbme4^3bz`fHY+hSv8ED$=mP==)3I_- z@jF)Y0$kcF_v#B7{#LGH(Q7hQjpw#oxyn6hT=i~FC&50d(m|uht!#ZK94yyK*Q=)M43ntC4Hlj^i9dy=D#pDj zi*=9pK~pOxy(mC$mR}P4hs8g9YiXIAize4VnnvtSlS0}SHGGVsF`2gXUiTZKM`_IT zEd9!Y!0F*(&-^b3Bf1~@ch_Lq(XDYJXlHL_v8baAdkOnaFxq-mA631u;OM~xPf4$6 z$gXKf&gFuaR5L)N1i1_HA7_+3u1;Unvvqu~;^^^4L-(1nrM|JczNCw_>suvP8K>Rj zXSje8^zx*snQqdMDqvWL!OX#7{`7Ugb;NE5gDge7`t|MAudT(5?0o`a(?3p!)n{qam1&zg7?xsA*O7IR8<%nGXDi7#=b*B(OJcdzZEV6< zIL2LU9wWHzCzZ4(>_T@ss&{;!gjqmyRECl zIkv4CDNj$n8&~Pw+gP+etc>?6+Mi9c8ljtjyKWY_SDa)fh0Wm`XNA=FzR4xJ2k63# zb*Z^T8ZZ~pZ@m+W%0EY6X|-|Z7s_+bF_USumA%mJ)4s=<)%?5`P=tZK0%K_q0(%x3 zr6iwjOci5H8fSROvZ-&7a^gD+AP_ya03`8D^pKIpP}I;6^3nBi9CV}e>N@S0 znO75cvkTD>JoeZDs@$abo$!zim}>u&v$r!bJ`G8%gb70ERYvrV?@3 zc;`n7NG86_2z`@s-*qDBfeOEVj=gO{Xnmb`7a_Hcan>#V!>UbvjdYTb)Pwo*ov9Go z$6`BVT&sa=kQHstF?Vx7(1Xaeq@s5xZ-dr~`sD$uVIzApOGMF?iV_8FH0T52*Da1d zw(ivUe9WyWD;aN2U0K3@{gq#0YL)@eFM$|;ZFV=`AZ|6_CNy)^V^c={P%;1ZnK=dFMdEZEdjWk3aXK+zH7Jg zwA5i{S;LpBGqH-z230dPB8{>BG9Hc;y2v(DU!pxVSKc`lJzafSgy$qc2(dsM*?j5NOKZ>@1D6xI0YQ1XYCv9iv+0%5-^NS%9} z;a?VI@`N8m@V)gb;{sR!07A!1F0RNy(97=Mk>>%?O;Bm&$S=&xMGHKhl{`Z=YW)@i zh*G@hsalQF3y#4qK=BbS6rVD{ygrrnjr8T_oHD(abJW-ENEIHnLB(f3M?V)ubmplv zGflEJ{zi-IH(wSF=CG}vGPgFl6$WFuxB6V6!b(1UAxanfsQl6Wyaz&+_lmQHKq*yn zZed9f_tVV%Pm*PNYO=oP0^v#X{Z0u^M6C9+&*OKmtO~ ztJSTiL$$W8cl?p=bGP;)SJ2$&2K+iU=(qB@H6=(BF>=MeG>u`|w2`l`&1j;bw?5(3 z)|O|evboty76Eqny_9UBNS!#S21FnEo&4^=Uo#}XH!j?2GbX4qwYoli@wqf-Cf z#A^?Wo;Mab2*t(CCqnk8AK1DM0^&+BeK$CKu?%DIO``z5KT7@erpmGyajGy_4f8;W znO_+lIPecKlV9q-R(fmDSC_j+*752~h~DG;ttz94W`82c;Cv-Erf2Dk7?V%Mb1RIH zsGJzC(Kiq6n?7`OMYi^Y((~93+jwy;&DgNF0%PH~UY?wGKPSgo?!jBHE2)Oh?b8<$ z258JA7uB1|H8Ubc7S(sE$_X4jF1FtKV+oikMvSb@xQpkXauXFx0|Nw@vcPCS-im{| z3W=1SR#P6_zx>ChNTE4e4bZ5GZg};0Mz(hO*&kCUSxv3a3n+dq)mp6Unb*J#a)3@n zd;I*J*Gjy4zsb|O94H+e1s0Ae68&wWwA9X;cP-JhPAYKU?_n!0vTz!_^xIx)Of*cw z$;zyYH=U8$`VTj$3?dCZ?*2Z$WDYY+^Bq}Eezu3Qd_1d3FYQF99PM25d9!#!jX|r9u26_zvGeOenEGSL8Z-y^ZQ+Pd5@m2Ph zA0K|(Z|}KS9)`O=xgW?Q0Mw=gb=^-tF8(p$`f0d|4Z{6MPUKr6uN7Rq86UL$_alW& zh}>S3m6*Hr!I6Zm)u#({m;P)%RnQ_WYCP>#>yX^Sw0tkS#!bRMwweP^s356S3S~fb zjO+`t*s)8$L7mc0h>=ij{qA#`k=kurJ0ta=`RM8IvwaFtZMCRMQg2U;oAQLb(w=y~ z{m-i6OP)(ED?Kzc&p4RhrxB$6ZwfemE@0pk_Iypz%Wni1C}{o|lXrT~PBROCmb~`L zx$k^1{lzcuq1Ye$@@M4G_7xzji_j(lGxKQmo&Sz@j=6H9X!}iXAy%Ag((&e}OMh%% zJq0`2Kn=^shSr%R-&T@TeEvDCP`!M+u+xm$$E&P{rd@B|{S7<+ZAEkm+GGT7r&?Y9 z--3WPJkO~&R?5NVSPDH>_;1%?8ojl2No|R7u9*>!9z8bj_+!Mre1x_d9^6uTtx$0A zuxH>@w=^325R?+XYuw z|AT^`U~%=wU-$uz>}S#V1nPhN7e~@_6LG&hZ@XJN2^S}4*UBwnF@PhmciJ*el>g#xsZEk!*HCW>LVXf&+o2&x3i>~W`jXt`z`$v? z3}EV7dFY!668$%cQ^h2J#oE}gL1Z`u&ELZf02D@S1;KC|A@WauBkjG~chRV4xZr@C zVM1zpKMdY~!?Apw4u8cIM{8I**~t?8yB_=IW{tR>jbenlZi;a~Vn+SHqjilGIjO{e z2~OIG>7f6EwVci`*JWt{*3RD%(a^r~AN*b^RRgKnI@t}>G{BVprLf6NiJfUN*?7n>^-K=j8M z^L6pF_g5hJ3>6B>5?T9ZZ14QH7ggCF%s0!{$+dScwO_OR&k4U6{sw5gF{2HrEzQ6F zrg8G!2L%zL0=2}^ahjU`{~<20I!5q`0CnV?W_q5ne)t!qn9|}+cZH%w1$JdQtt^|j z{y3sizR0nk+5Z|7ZXGg@KHUZE_w~Pcd!v(m5MR!)yXQe#DbV5#-~B^RzQKAG+hvRZ zZvk7sN*L?+?3|gO?$nbUd*!x_8;D=xRSCy z=cBMM9YnsM}9g{ZepT-el+*QWoeTC7%~QB?@TPBKSmk=yb@PGYFUVijDVd+y#X~B%*+`C z1O)3znkp(w}qI)N|97%pi2R~18YctPHGTUF`u4m0&7hk|Ig<&JWph_FjsY+z_a5yqw z)z*<9wb#Mc)wXeI9OP&5O!(Y7u*`a(rfPQ+VA&&)neIsO&p$qFN#i3rIoOAYXjH`C zF){M3uCjbQ_Gty#%_6(|Hv8F6@49S|XWNg4VDIc-lJ4&2KE8Ij(rqWM(yvW9R@Ia$ zLCAe(K}C;N_2Gr5L};rw!(-X!SoBurxGUc7CgBAGN*L`x`CZw;kJWJq1G1{OKQ!%} z*DqzRr2+h~oo@8QD_x=!^hmVb>0Ng#NL>E)YYK;!{q|1cx_kQRv66nFYY^bgCc7t$ ztneR4PmeD7K{c?8kR@0Wn(WX7&+xQe-7L_LW2T#^6tD(J} zFXpV+)SUSmep9CMuEbQ=;*cRS*n?<06wE=@6fwnGs{XM`dHwCvf7-mAchC z7f7tHzv)vmD6E^+;67M0PYJty^;#qSLu_t-zT0tkQs+02zOzD2m1;OkxI$4z0`vBf z3QGfJP-4obVjeQvMAt_K#h+Pw+@^S*p!M?A3sDmE2@%Omeejn69zKMOb+ua$9f|dY zr+sr0X6r4Gb3OyD1M)*K3Fq43O zB|_19Z_iCCK??#=9#PMwe*$vX0|W&wB(tKTdx0**)zFD~sSUWs(+5p(Y5|eaJbZ5= z#G~Q9qRn1H1X=ggq~=sq2c^5+TNJi{iDh^DtLqBw>cVZwmN!WsD+s9OyCsAczu5x} z@c~FNW(i9Yt<^4cEriZ=07mQeeQWjOu*Sj4b5s-DwBc;6wzLUeRu)jPQnB%*Iz)nA zZ9qmLGp7I!`_=x8_7XcGV{>zBu>=peA=;vZV`Xi6z8Gx+Fa_WXkgm=A*jQorw8^Uk zvymJ`0EQr=Bx6IV{HCEVR690v{%1u&O@Kt)Szy^-@T>hZv&lM80+K|w=saq{*O5}| zd@5u#USoi{dYu6qWPQ>$`+e{-(6COQRn;Ba0xmR@edGgOri|e!wr$Qsu1OLgKzUl;-AsrQzifonaUp*_*UG zf4`XQgP%l7fMY888XqCJ8-G1L3WTAz{5McG7A^=ER7FK2JP$I}o&u5)cnAY2tC!Tq z9XFgnc2!O;4J%Gv{iiYRdWqA(lqd~wF1*awtJTtKIlc%Ot*GYVNd639v|G}Ih$WHj zqfDPe`f+O)uZ0x?yDwdwhBUKwUF|7xgwAoXv481*4)Fq2e8pauwS;rBy#D(AvcSIk z<$gUTeLZV)cEo(uza`=gQkcs6$~CM=%+!MBeH3I!~{+ zAeSu;HtXqo0rR%^Pb}6a0WvE})JgG3vOLe`?c3Khxi)X_`sQ=#r-}Pk-q;)!pN-fS z9N?wT_K_RR2hm@tm4ylEYj4g0eG<-v5BQ5hdy3|! z3?XIGV;ghx8uZ%1vS51U4o$C?K8rNQLo9RZ!iD0rn#9d0-R{IVL6$prG?8!4MG~|2 zk>q3ZKaA#HLS454ZM%4uqJERu?g%Hn-Cp!G$-{M@TVJC|$TxvwKAxvsXlpGYeOCOp za^q-w{;){4;ZKn3EaW;>W1ocO6A(!9T-5THp9k#vdl~hGyZUt;g%tt42Hib-9|t~` zbpF=*j$^mFmMd&@BB7s-ZQB_@#`$@vOYpR}Q{pFo{3y}q*IW9;aN!~2Hl1gxwyWO0 zX;}qr=URQ_g{->nHL}q4Y+lKzS$h9;z)8e(;7w$Sedi)rZ9t9L; z;KSnUbp5TEdKw=|t}_Z2ahIY&>70K@ioHpt8}5;kWXG0TA3U;P54-a&*ky(GVZ5@fU1A2k0LJ*HWJN4LuA>aX=)Z+;GksW;nG4@BGg7_ z8RPh>Pv-Rd?bEc@Z}yiiGe#pRDtvX$?a@dAxR``{$od5}Wa*i+w zp=*8TlzQywHHaHCxA3@j&8EAW;j;k>ODkQT$a-#P6^h3dy}W&{9lFAKK&wDeo!!I_g?HnAhRmcg@Vf;KD(moxu!<|A7c zgI5XcmO=`z%!Mq+#LfQVy}bJ&+*+&POiGiY!X! z%0FG*!*|~w{nk($Y>r5&Phx3ywmdqYIGoI|K*z?a6%`dpNh9ZzOcu#0O{LnJLnZo7 z|KdSkz2IQKleYrg?xkoG;KxBePPSkGM{%|fQ0sUlzv!O&?0Riw>0@)?J&xij zSFJt_E0rVteM~`k2v9VE@NR9D0T*;VPwyKx|Sa zOE3w2($lHY(NP)4T5fjs^YiTr1R|}9u&{5hh7SwLcNg)V}nHHd&b5Ghd9@P>`;F$s1t+0 z_?YOA&(zOHt!Q_A(*r(m0)7U(k+2hchTjS^Ed>lvFsn2lZz*8!v9Yn|QUdfIBUe=$ zq^71WwYMV(N@5TY+a*Zu4e&cvM`hTLKHS*X5liY@h|(*sm$fddaUnRD&6ODe$agqB z24FWG>b)_uy3~4Z!PC;f2##EL)^(ISZrn^rxb**sd+VqwxAt9Fw;h1AfQU$UgVX{^ zY3T;(2I&TsMnXClAl==y1nKS$=?3Xqu)eu)@BNPVch2~}f4(!00~zCCt!MUK*L}@7 zJvMkhdz3B=b^~W;1)Yq^g^GOUS@Z6Of(bTR)(2o5cEo1PYrOsld)4o}@86qx05kma z_k9!F&%erq`7P0S)p!q6Lf(o!QWLs!tCs427d*QY!{b?&%$ku*EP|2HrC+~#JIV^R z>xi>o~M`WhG^1jiv#Z8DlV38CCaUJ-`{6{0c0EaBp@MDFaEOa!6zav_(kf} z14-biR>mtn+S`NmsZ@y^r$kSlSb&S?Vl4N5F84>^Fw8jcF9jXE^b!tNXYBWV<{(41 zO0)fM^loqibs#sBXtzwS)m(fgDKJ!QmY0_&AWHtVbI3zWo0~Gr__cq{^DOq_D9-c4 zKsVUE+EaG>)@;ObIDXy)a78647)SZi01R-exrkw+YTOAo2G_E%DRxib;ew}d5j6$y z*)7XFm>nu#+{9c^d=EB2yM=O@8S8&Jrw51Po@Lrj+Olj_Cn{Ld-Nbm>V`C@#VDl#I z6x!m3EAY@2h%*Rn)oF=}jg&#Od$PlVeq$zpJ43HF4LqR5H6m|hSzynaLG+>d(jo9e z_af!q64WjJ1tNGRUJLUo+q#$Jb?2k;jOX%sAlL?oB(UT_34_VxKGo3n z75PvKz%C&B#FGXfgBDa1=d9o$Aj|e|_-Q+_p0Opv2__Q>zJshP6B0Dp>`KxGV0vKg zmK6mKfKAZma1}=nL5%S?A_YK$J=0S^3cGe5oje!M(i1)1RebLi~SKh!i%(uZnswf5|BVwQx z;=r+JlZU_pgovInRHhW}9l#SA1OoR@&nKy8u9TUia zNWCrvC|lYHSEsw$Y{&|J00_96PQ6O0UepTn^iU7U& zrz?-1U^`Cn-XICEWY`iVkewU&uQoP)G5(MVKtYoWDdpgNPOw^T5JO>yfK5E$MyWGE zUh?XZ{O9{1DFN(tMfJ=P^UHs~Y&&vvte*d})JR$Gvj6Bj`7Y4af65OJvPtUQ0vKrz zMMXJ!+D)(P0*00LPaB#IPEGPobtFGjH9)|o_&2||3H3}XKnAg;m77rs zIj<>3zo}sd;u^c4jX&R-C@H5V}60A8$ zLmPtY;|0Ljp92^e3?xW;XVNQ!L_d?`)`GBWP;_2G0mRN3Iv6Zv=vbxYmcIZU=-W1h zhFt;pUhf@};lnS}OwFEEz~=@M^r%*cdt^8earzT!s^fl2*Er3W5z70O#hZdAQihyG z#kGY&<3E<3Fb45E;S(g7;@_Q_@`dNt2HDJAhQ|ZW1mI76+h&H@6#|Zhx=o3^E;4U! zW?ci6*G|trSVubYWc}Zl+`q^1Kyz_+IO&aC9Or+oGvLrYF$%05S08;4CLZ#c+q}Li z(Q(>owKC{)aCx6k#-%g^NG_=F{wg26q@bJRbU0ZJix_`OP@(^O50C_*K{0~)JL8TA zDf4T{KQ5=U0gzWpqu#5`Wqw;~>adDPGu5tp?ldnCA5T*ij;5X}8j2YsqB1S!ZKKtS%FuZ@m~ zP0FEuc?@K6GK=Jst5$xe^0vq1#1#%Tkh;!sH)w^Hwfj77-%# z$TLv@^==r{gGG?l^4G9`z9kz6H&(3a8S|B$Q>L)p*orczgVlj01x|G%g9~6*a0C-X zD&oY+qbt9UQqYJ{YU|Ehjv5i+GR@%ICAfl(TAhn2XE zs##OHQR0_Q(MP9CDl2sij&r{itC#6P!U2$H^3XK33N0&*LkDLH{EP~RW9v0c>eHJ6 z^T9Jn9XT+c?_?gICkw^c=U&j)8J%1@52ef-qFtHo`-|lvvw7BosD0F@KMYw;Zz0tY@Qk44%s7OX#i%-3{mXKB}$bUu; za@O)%>N@-u&eeJ!FKg^8CNy>)yA9%;6RSg@u4co(^2m$BhiZUBFj#{P2vVJ7Y=D{c zC6@~j7b?GRQTH~E@5UW}Y0JG>mCFZgB{c~uB@OWZz0zbEYvE=4svK>5v|RpIx(pRy z=tTvGT8|#r04~eC-Hr0ALA^421V|l$cUGtKd8e!*Nb3QWB`8KAwpJsjhA868oNfkY zH)~%ZM3>HWadp+UZ#qADyYzH=>qX`Xsr03DX*FDN?6>s98cv2Aw{cxTKLCk2;%34C z*+gz!+!VI)Mbp=oeM?gN@^m?)uB|r;Vb(Rp*Y*zOC07-&tn-cB-?PEk5;0l;FugZJ z1(0gUs-#sb{is{RFN$c!czq;xxvkD}XWY+EmnQD?hqoBJq@N$nUi&e1NjHJ48I^`h zedqQZ7s;ifOH7POqGrCGfZRey&vCqbh9XdhI)VV9X=Zp8f;B$Uj;#PWSJAzq7Ug@> zAb9Npky#@jzF^|D+Gs!eTu*i`QwitXVwlMa&>U3n(LbsfB<^QXisCp(|g8I>}pB`4%vi zD6MrI2$p;j@hK$vBbv3K+MnT5T1`sw-vIvnJjjQ-7K+6ESH(txC z)llFULbjJhYm`j4zu;DDUeWW}aCthlmd>Y-jVwl1^W~t`#_fRUW5L@2 ze)npYC{@_CPFdRl4}h7Lz~pCXKbu^Gvr0>*iVQH<@s~6pAz!zhY*hyr+D$Cm?o7xF z)le-oDN$L`KWrWiR!fY^#l*EBVlf*ALgg2t#=KrN`MSb&>)RG4l3@C|FS9fxSw-QB zw&2LcEh)R8uIF_bz|g%)yFk_mFw+E^<9*xOHeEc#EZnuo7z(yw@oApZeAx3c)Hafo z#lih`fWg5|eW@?e8&=)JZ}(TiG$Q$NKWk`L;~Djui`(IWWK8<%N?iX?_1m}^Knbjd zcR9B97QItPI{=B0QS7`k54rDWs83W~o!|y-asIU3>$D(X01IWeoL1xbOl2`anoh&w zWgM%eg*4e7%~XSZ$MGX1NA?3j2LDxNNCFA$LspaTa7dSjBD8=}8Ho4M=x zz%wFra(gRoV!=;7&h-6uPOQT5VjA+P3{dA<*={o!9AX z_-Kne+x-5;U8MQq9RNwyRr9eZrt(<>1Uv=tAZ#p>N`+S~)7oLPtKp{z!_H?-xN9&G z$mD}WGu*cRXdREBjbVaaQO#iW;?7|up=!R3O-*L&re|S3-$wD|jPQP7yX6DV(aYY; zr=|hSzPh=-r@(`db+vo|a>J7@-wmdv1gAmvjCR)3uu0l$)gEdVKW;DH12j)=PjN}N z@6!a16ut*AGo-f&xZR9^03%@A1)axM6EPxujAbD;IXYgGL`7zOPZ8u~d9C#C2KP=Y zMUSyBE01Qx?9auF0LcvO$a~mFeJBN%5UsU^YLdxmrgQS!uj{m>{lC8dNFve;v*75j z$lofrP#t$h%o@triIbZ#S6@R>VYZ{`4xc@r?I6zUhh?;eY! z!}6ys+?9wLSpl;mEJ8_-blUvUyyL+yq@&Ydx4g`@v}&FNct+)Hmunpxv=b)9c8EAY z2he|N!I4x`cKl`9L7ix2`t9XRDhM_k^(68M$CE7@&ffJM6>eMCf#rl`ZcMqm0p=o$ z{zw+>G>ewa7G+;n$n~B3(tE>ZJX*RpV^D5$!wc=>sPZ#j+sxS^LwAR#G4HJY7 zp%1$OkbT)mS5nw$X&GQ&RFmde0t~yh$Yl3+DWEa|@=0d~Tij8|^~8Nl0Ni^t0hr@* zr~jUO3=N$;H;vUsZ9koOI;;t3f9CcbQtYF)o~aQ;4At|VzOsJc)1bz(1Jk{LK_em+ z5fzItA^PO3evCtdM+az$;{9qT-VHOVYYwj^?2D>;=}M$$kb$(1@A>N$8H-sExZ%M* zOvi2z_=d(@@AUiJ@q`Xmo!$-Nyy3pj-?Ow3bkm7)6t~?fi~xsg?=lDX)Ls@czNw=P zR#$Hq-5v~Jt+Y#7JHUUOyUE<;T(EoR*GMTEKX=&5;5WM=jIFm460|Prr>A6Wz-a=G z^w5-V{C$W3?F}tn*!EXS+!C(2dcK|RQrxt-bkpnJ>}wCWDIjYD)+Pwc9$Y~lcuk@} z0S(=O0`SbewfTbpw++USdWKzNy98xd$mt!_4ZuaO(Lo+aGG zHy$N)7fDwGM5uZT(J?%&d6TugofukpkoYu1O^tm_{05du)OSz1whw_m6VMxy|L5JO z+5@plN(70DtMJ0#ZjzPnEV6)$s^t#dg34XgrsSqmRPJtueQ*@G=?8Z!dW2H{RCa~< z=}=|2%n0wI@Wo^6HI#WkBkTJ%`kcucTSU%n3s%hiXG_7XAMjh8EPX%#VXqPL*}tHU zRDlFihi2zm`2>o0#BPSXp#XcLH}l+vE7y zQkfg}1$5S&EwSrXw)Cx;K|=*v7#JnjH8l--ms`44{haM_nW;7B;WJ~Jb5zNDYoi%T z6$)XLZ{q%xdt^VUhDR@KMm4=OrR7K~7~x?mWZ=x8I=aLK>kCnwF)cGHZ123;N&@@A znDbh8C{K;#2|-~a!iI8xt#bF^9c5jV=2c~CO?jMThTax{*>2t1H><5R_IX&B9uON> zH}##skVE@=#J>wdt=>+dFfw8RO_?J)bpB6k@wvG89IR%sV>R7huN=w*_d2xWYWH0n zN$;5z*rVFSX~eE^pYV613jskywxjLXD9AqBSKcU1;na zsl67Xx^a?ul+|XK)VcCK*;GDHEw{uTz;?)T6<6enhxmwApCxQPOUUzt1W7dIBAB{W zSE{k{Ni9N5pbsk_ik*Rqc7ECglYIViQKw{`+Y{duh>40^Zyv-R?tYGn1<2`J3mU)b670Tw=Dce}^h~l#l2{J}rAL{sBzUp`l*Z z{j!uz?o9+xZp4eYi{rm*zR7YfmrM?(A8>QBbz;-8SxnR-cTMrbn;#x0@Ub;?)APs= zv%E7tY=qT}7+zb^^}YPFXhouvEnwo zhjdZvo?U9tC()h-Gc}>>`mAf}vqZY>*V|ekkf?Cc$-?VL9 z6_ubwf|?Y+y0aP`F!)`{{s#F z|EmN3+W+05|MmH%2mk5d|E5EKcMs^|n-Bk6Hgm#v?YZ~7Zq7$TN%IT=>{k9Dk+aYyZafP9of80S$I63 zpY427nJl`=VAuw)R_&4T6AEv3hgDN#Bs)~%H1*4$ep30GW_C&*z1bfM%$vb=M-yK;BW3d z*CPnFM_-&Swxi0vn)Np&%^4-b{M+9UAX_8P=W%sSp#Fj1Zf|>3Peo-B&Pm`BqQM%v zc0GHB;E|J_DnB*rgU?UNL#hym9kcXVj3a+n&p%+yDzjJCP^KJOck(j*JtePbWtC%f zEzxB^$>k9P7t~|tVh6#)ylqYDJB6$(c5%P^=hbT#32;WBlH%k=k%7Q#0TJUsrYeYij{+wctk;-D?~-Kt;6 zbSO(GD~Iil?XuT{qPU3q>)2Mv5-yI8hsA0bF8$1w?Q%)lc&tpo!wsDuD9CoT6hT^A zAV&9dyuBkKGP4c1s~+p#m$MB{A9nR;PN6EIJ2(WlhTf5JayyDPaa&3>+L)IuHWPOK{kI-r8K)h(}qc3uGy->{`VX zxu8E$Rc~9b*epPrXc!q+hcZNYr$g4g!_=P;gJa@k$#U z8Rvbz-EgS`W{uY|5Z*7-<+k}7-Rf!ejcDClQtk(Lvyu!GLEO4K$>$G8q>Zdrm(Ule z$~-j3ZROv2A|8M-QFtG7zTL=cWCU+M_`RUMN(7gNKYr}udz<5r)^!=Sy%cVneW{7& zc`i45I1=Iie052>?{dS=rC*BJok3#*!R6!A+G9k-qrbgeF@DT=h~`1zLCEd#_>LtQ zkz0~YXRVb=nG_!T`$w}%Bs{bM=OZpS8$j7#_Vq9r2urM%u`9h~@zALue9k@4Q*>_o zCQe4P_UPdq%Res9ab|61C51;+bkwQym_ZEpVb0VP7Z>yz8mFzg$H$!Pe!^1-PW!1| z+xTqg5!Q*dDi8EA5WSn}cn({=KCypL_`5j$y8mS6r>x>6I0o(#F>~16@x#YCJt<@f zNDa72pdDU}AS6{T!q9`Ptl)k6xBG%um3Lx*;<$O6iR4hQ-}e+zvo=2Mt-l)9IZH5i zd9JPJF@Zo0KSl}e$@+Sssd1^HHaH%{^LkbEhq*dH4IyN-*(_l0 zN&G;;#Z?%(zCBrq(0aySf0Vv5QLI>Z@6wrLxRUs0-5j?w`rW~`4pANSo~*}TpCgj1 z_GY%ObgXO+AIHiF3$^L~sW1l*CLpNIY_)wxBxZJsXPCV>l``V`IySplE1ATV{XG77 zs}>JdY@BPQ_p-*;PbQfpl&GQ4EznQm-oHcLbT#m3HJA_HYhWwT>jI z#&tUvWo2a-7xKf7-xP!HAy4bEo82}K*Tnx`ZEQ<1OD9V`_y!gmbC>%-5c!-Fd$x6L z4GZ_&CE5oDVtP7S6(n0eou9=GJGv;ziwLJPA+~d)QhAXEIe>F;n@?Hw#!GwcAuPgc zFa|D)Saji=6U*SLt7fiy9xSr8xd|?)FnGD)v3{4uhN+W*QWxTJ-X*n4qCh=5XU%Zf z54gU^NW08L5r4HtErDEopQtcktG#nSf;4~+poFt)>#4UrRN<0g{NcmX!?)ZCKY1VU zIsJ}5Pg&b1$Tv%0?a?U8H}2d^dOgXoz0S7kRdq+t=e)w`sx~A>zGf}ds*Lx` zKUVQV@Vgx|iLxUiFw0?YXmny?*?IBlVbeqwgDdLXp2N{rh-Q_5so9n>tJ>IQXiuL3 z@FB!ZRQtoKEd7{?cy^s@ffP$;c@}1GpD!_$FfdNt2hIKw8LSN?VsNNwc2G8RtRI05YVwf|w*?q&z6e6~e5{Z~{MF z(4%l=@XOCLTc`JCOkCtKP% zjcz%+p36(Wv#*Q9$mQ#$llE+vfwtCXz9(pboDaz>WKGdP_?Pq}IG86)Om@lXO^eU^ zgXcM&j>TmKuLx03+U?6L8Pr=&p(MDyOR}=%b~e9RnI}3MrE$E>|EL6%`#}CzBoqY% zy1vHjpP&0!SnSMmR+p4e5i^kiXTx-g8zbNdN-{moU0Mne5#g13_b#Wfu<6x}Z6Bum zCn%9h{4YoMe}o=jG?8uoPpI)fpKm_>@6h9)VB^0%_5Triy#5mn{Tpf!|9?Cq_4%!T zqNTq*_rIg1|MuMf?{pxfj9gs6Iwn$VUoG9Kpjx5}JpSGPrF#YRpW}B1PgN-D}iYdFdf&0GB(@3Tg14SztVQmhtwg-B8Hn*`H`);n|woF_9({Vet7sq0jth zr5MJ633Jv}&%f<{V4W$Gt5WeM|DAkL_22dCi5g+D*^cw;v6xmqKo-{gs9;cS!PsEO zRK5)S7#momRW!e$_!zVTPp~bk|MkeVGrKGh8$JF`aGncktJ%$z#FmB;bH*+2j2c@E z8(T;noNP);w{hOqd)lz{L^fF{(q{nTEH|9*@dhL*nT3!c=o{-}tVpYw+KSMmF9&Z} zK1L=UZ>bTZTAE4e%+E3x6;X2VAgnh9kU^jbXxHrfL_9{9jIXbvp0O4A zFA|ia?T%nY5C`?%#K6+)oZ462xbi)SFC>epHTk7(1dh)G?!S!etuC0lRx_gfNk!{= z7Zk|5E-AgM-59HTjr%+f@Nv_smY*rg3Vr8eGjlWwZ}Jc7E#5{4PF#!4$_w_-!aSRv zPo|2$da^R&Q+gO|;+YoUEULGZomCybG5PqdP_?U&s>yLcZt-&rJj>PeC!WB{taATT zxmMp(uoyEvf{ZOwqoUNC-os5NtEyO*2xYZItgL>D-SP4n;%9A4^Yjqv z=9cRHh_5u~vc}&%6O6J4JU?lyHGqX|)uUi^v*YDsJFJFt5vPBYSEEysT5D*O-BBu= zOUwS;g*%+|Q#@E|&Un+W!^G(c4VR5LvYFZ~W%@WY(#NbZt|)6b!f&k}< zzLcnd4SINr(ru?Vn;20&;6=wqhny%9#3nCBM%W>iWH`k_+hV+s3+}_n>eRq`MMe1+ zH&gM)WbD2#@P|A)lb4Nf+vRJWgfJM(hij3>dp{ z-T)D*I9HWPTQc;mu(PT{+}SGGi^S|9P3PWm{EK@c>i79<@b%&N9i?=cRxn{E3VN}f zBH196d1%gBVw{=q8)x$hVfd+dyQW-W;Mj|UkGcCkN?lS>19}HZ)1(Eg-UjDR$_zS) zzAScGjKI2d$-wc~t!Ay7axa59|A>%C3U_(cFg1-a5uZb&yPz}1ob{H{bd7C+A1WIs zHwv*8N^cv&UpK>FSDq~gBV8bM^*}`_vQch820- zj0NuGIHef=-jj7n=50ylbVJvmwnPRbvXH2Ceav0=OIIs+RG{(&hTpwqdWl>f*)i#1 zCb+pS7c)uvLTk~UFcX~!)}f9N6V(pe7x-7F=+}W#FJt=Di(VC5$CRj~_?aJ|M780n z3BHt86g6vX%zxqZ{v;*CJ0ScUB}ISfIi?*k9a1xYB6{GLDWWF!h>j%fa7E(a=L2wQ zPnh&Y`HP8peIpJ-A2Uk9MvIez2WXYad@`tyc0+VGSVgc%76`aZ=y|9E<`Sh8L@<1= z%TEhOmgxj#G;>zVLmvbPc($o^)ZYD~z@Jqq-BW~*gpaa9JmIyLSM?}z-5hv@*mF&E zD`e@ z#6VpVv;3*R3QU9v%J$_ie_hNU72TZW8E0s!U*~xXzv1Oi?Tff}{LCr+7;Mxij(gg< z&4fN4wXmkQa$$Q?+iCOi23fLGzE3SHFWB9`B`KZRA{4PVV**VIuH&af_Xf+P% zjZcKCp%I$$c@{366r4z0-ys}xShcGwvdZ%l9d@`3`>H#w_FQ)R1?QVs3<5zZnXIU2 zhl($9*OT{#5Bg{3dQilZLr`)0S7> zAH!>aT<-m4nW6aCs=4kZM`t3gd}C3{xrjXM<6-pRbAeF{w#yVFth`KHd9@wyZ(mqq zBAe87_6-uodY57kx27NnE1)^Ax?{3Z-1hWv5S2+*=%Hh##G=w-RywWEID@O=FEZ36 zMK?XG;p$l2Wclko{<_V7eRYl|4h#;dH{+Cw!XvQvNtWwrD1!9xZX_ovy{VI*8sry} ziVQup>QlX4ja)Tid$j?sfri7!MA7NatRyLUB7 z`%L!Uf41Q`(ncV5EQD0?fM)0#RuM@$SjJulH7Vtr)08!4N%LDSVeBM7fo|g|8SJ8{9^@Sr%XtAEHxTdO{{PDhRg$A{FoX zHA&O_DguUl*8eGhEdObD)% zL3Pnu$hTjdsXwW0Ueiq1bC2q3X7hz4iVvJWOLaha!vl80+2flJ-~_7C){-T|H}IhR z)6|mBl=PX6uH)zMd*@A8A!f>Akh$K%%Xo7OQG>r?pqkyEuhJtRgyThFM39tv7qRY+ zl&I)|gm}*rL_N#jhIQ81Lh#10UI%0=D_!hSIuu(cTy?kyPpi$$PWM4c9z3uYEh*on z91HwvF@Q@JHK)d}z(*o(Ib;(uIAq}$RmXn(>j7v(m+>9LhayP4n%5wEl31V5&W|yz8-x z>!o*+x{zraQ>qFVN#MN)RmptwHoreCRa%hXT>}xO<)rk-z?71bNQ;UbP|tM5N|RS# z?#t)xIFT&Qi+z50+k zEEl?5)Dl=Ul08HA!LK7Lir(eC!1-1-{px!~{Gh@0HI#6^w@B8UDYOq?$A~^B;&q^- zC|4kmaHiDQzeoai^hHX@>bs3(G9&uiyDEfbe`go8@XDN@I*w325=+V$((beh z4J!Md?fZsrEgr?zFuzq81OntucVmjWQ_S%T3Or5mux>^Cx=0@m@O4Se_K#1RJKyG9 zxo$YgQ+_w6MR$41J~Y9^hq zv{=`O*$!bQ^*S65j<&nCDbusEv=!WeY%-}VEfbuL^q(nVqTSpQy>=UtBZMxS;$`WE zM48yyS&FUCf&m$$i=GQ*{M91vizg4tZnJx1!Y|;q_i5Ub6H95%f>eba_TMFA$v%x% z^vo$t(EGq6E`jxx-O4#H2f_b#SXpw?J|c)SA$ExR_T0T03B!`bI(F8WUR_MMGS;x< z2=kdabF=LB=P#>xvKi2sAs1SKW(gP` ziN-tbzQ`z1jYt#BYj3J7GwS%v(YX-HJzt;ce#WohmKibiTay64Wt=j)&0qKJTZ^^6 zit0L!$;sdkk@`X$L;a5qq|6UFdM@n=8@csxTMdhFHG1;uM4TQ}jhLXfULM2; zOaV!Hqs=QHkl(RcDETx z)?o}S2Fq*qegJev4!A2oQV%iY-Y{gksmhVP7uhMSHw5OEMG*?T^C)t|JFPyi)94x( zyF~9TYdWRVO|+JeKkUl?HC_G9^;qM?ndNsMQAq3)qte1FFE3B@P`J2whCIVXfq%}!E4>f@?E+bS-kNT}qWAnh z6t7jqyEZL$$lbY@)WQqBe%df2N3}F$LGWI0nRZ%iaRul?c6+bl;} z%AlP$gL%eLm84;=4c>~DER7S8g2bvJfE=MQM+vY z3RXFAuD|hwR=wmpf^rYDadL)R&85%4+MW6l7i?_2(EUn;E$85XzvJ}>(jo(!2MvWG zN=oA0ePElY+@hB3>(?EQg4~uGL>a+V*Y?oqiSq4viGveUn2V1MLTl}-(a4cqYPG*L z)a#MQN_qK^cp!qXbtc|ils<5BqVnaN0m4>G;2K2kQl1o5M=GVEG{fE32mOP5^AwvA{*@S9D7H`0VVPIE3NS>i<-XOHa<7ga zwCXbm%s#jBfS{BL-dc2Bl>+%%Jn14!;9yNbp93cG!MOqNJ?uVz>T`+gnQw9pBw73K zWNE~OFEeVjzC^$EEtCyuT3zfVk0Pm(9dzt!K3x(3Ggi5<|19*@FE?W;nY4-r9Rb+KLA ze-Yr?FhG6cnB`dlAJMIj>Y-0{(%Fj$Z8SDN6fI%MG|UO2%sifRIONAQ8a40&9tbg7 zR=k!m*@Nu6E*-V;0UPfQ4vRnbU0D!%bdz{UEyulzuymy6iW0Z7%Hm)fHZwDc!Y&`e zP8MbE}yhui81vVK2fg5Dh7R zVP`c7tC}=00xB}1V25(nd^c+jhrMpwoYSeecRGQI;eOoHBPlig)W#4>nhf_Y9dbGw z{kuyCjn-+ir#u_pMqd-u4^h`Z)Ll}oL0DM@3gotpcVqbkf0KV`&vSg`x@haHO!H_y zCx@U_j*4lJ@NLy}Uy_Bj?WOcOkpQECPzg)cR%p#ryQfqw;qm6ILDLMD-y0ms9>X`V zLj&4aU0j86-D}~rgk|#w{@QxA+@srw0!_vU`*U-LXudb>J!{MA9dxyJY1@w>QHp;7 z=QvnZn0B&to8w*W?{{^U;hfD3YjpW%MH>p@QzfQc`}i(YQ@*MfBF?^T8Exc>hU)E( zq^#omTUmxOuOg%}(pwK6JeYs|vL?!{C%qy;d9^ylO=d`Zh`r-db_hRX>oDT;K8=0D z2i0TX0Mt39gWB|!f0rOSIX&-_ckuht7?wSu(-C3XU`Z86!(x>$NAWwfdNf}Lp{ruI z4uaUDwpAKl;Jp*MGIyYh)Sx5#4ix6WE1 z;BKH$FSp9hOO8~4(C7XlepTg}wr#1kK{z8f%}KWNhBW_8OI2xrg$_2822FmQh>BUo zw@vD|0Hs(_0*6)2lUCZL4d`k$3iH%IsRqNP!RPsNiti2ZXWU!OPsqw9aC-Eir(3m? zutI1bYy}-A;w3u|4Scn(&)kp^wV&Cr`2+w%SlG-C=q`w)_@uG8$cb~V#=}+?8#^pc zIMexC#D)Te7zK|y8j-2Bt;J+r!hV}aoqJlvvCzu|;)u`0WChG3L*fz{Ev-!9V-0mZ z>7$$Wi)KUkq1}znYawGKqElCHop0YRXLt0a3z_axq}B#9iDKLm!7?)xDj87_x3g>C znGTwE2{FdH953E6YBQuuQdf7|R_m)RKdY$|L*ltGaXrVY}Kh9b;NP%*o#F}jqo~WgPAk^ z&_|uX6FS0FuAwi$r_H+tUbmd^nos<$y401O=Fiak2~UD6-PoB5rcEKUB7Az!VBb2) z8$J6z7{qlqRee*pBul3M`VE`JM2rYG@-*Uo4M`SyL2j?4nx3`|%+}g)%WAHVDhJH0 z-G)eX%?sES+Pvr)W*@Z7vXi-Q)I8zMUGHVAjQry$G<9RmGLE2+Q{mhC(N z4-eG2+JaSW$zDi8EKpBa&n?dNKfs%QPzv@_Dz-DqcK@o#yq2(^HOl3ZrJh<4pF+c~ z*zGdA-<>-jsZ>W_;36hBDx5it!^188_SifCv z(A;p&^Sz#*FJ*UU$sXLZzk9b_yJl#2ZQSAHX=i(a9b5$<9c5dMtD5vu(jig~4#Ckl z!#oPa5mLjH{KS~YC_i^?M!o4^L5kcAHA5a2DXI0)~O$c5Mt&ov)5I>PvXnS z%s?0R5putyN6dK33*jSRS1A{7I^7sqg@YAEv0~u82C0*M=2H7RRdi!tGpep?R8?kD z`vIscn4KL|Dup_okeCRZN#nVOJcIeU=sTC{GqdVwgs%yC1rB(m4^Cb~k4(62Yp>un z4t(fiuK&5BubI*F^Ex%ZD_-e4qX{3Lm>@?Zy)`^GbOJORV-T%ulT; z%`EdBe5;ukA%dzbb?U9=B4l;wvSr6*-;UM*pE{RLAC7qMSDiP_+&2;ZqBPf9$2^H^ za%o&2-X04;{+6PEN1fA8Vs`n)i+!9U3M?Yh^bYA`K+IF{@@4u``#Z>-g;9Uy`K6;q zU03xT&3BA?E^23bB783UK};5OQ~~ixeJa1BE(5}zc6C#gFx??<{q<{iHYSPDQQMS{ zZ%ktJTc#@8s46ko^1``qAkL2-X>#6sVqjr}vgB18ofY(=Fn*`TYz4icms{t(*j843jCpdnxop@`5#eh} zh9k;Q6s|A9@rgapU~S|cqn2!f@c3BCxnr*&Ps91jg3ietfZUJWd7y?yL=OFJ&TXGN zd+K(%B0x4BL<1`oeHf(HB@o{3^eTF^8G<4q;m4?jB@Cf`W zs)kKQthEiBXVT&A++4w@juslslk2;xg5RH^91A&fl9*&<0bRioK6d5WlP-L4auHu{ zZr*lYT2*;XVRD|dS8eTO!x3p6*3yugnK=Ymd1jDtRLjLxqqj)w^%o|aNf?a00Nht9 zE_r?cw?F3-qxqfIpFta1wo%vaX6}1?RK>(1;EZi!NjYkA3_!&)zHMd zJl}$RF&Hfp%h7tKe1fjTL;Y&6R?Lv1>IguF0CE-C5(0Q1m7`1+hE{W(H8IDfTOXV4 zBnW^K_`Hs*OkhnP``gwKH4+NtxqVJ_IRqJ!?ByyyCDnj)*?lCg1_B!fHwm>zYWF!Y zUzsSnOQ;RzYDbJ&zdfIw509P^hZqj20k5f4Bl%-Je92MCaA@%v#%e^&v+)S|()VLi zO_FK}goVIBe~*N+{o&r40GizJ%+%+z6=qAj-IdVH_u9+{62HW?Y)ayp8_ za&LKLK8nH%$q@}&wv%ZSBAbEZ851YdqOiT&OWiNYIYQ#+PG;~oE%tv$jz*LzF*UL? zz_%9}EM2!?bo-o1WH?31Dvwy4u?2gRMXRa76# z=x3}n>-%%{LlrmZ^A4cV$xu2PLb|+4bp@-k?2?M?3ihHZR;%LJ$o;%NU7E#lp z$Yr9pFoULBT0F@LdOXCsIew>|Qj!&*zeqrF`k8tuy4C2GOW&VMD^1t!sUCiq`b*GG zOXMtTWd}$IYH@>Adx5!ZrszORl*goam)Qts^DzGQaLXqxX;5M;s3I4XZ~d z2PY}Ee;SX_Wdn9UNspjj)XORVweYni+6gm0O7oy;xc9zPM+BVqi*z(q^o zG0wIwy>>+OfraWZh?REJE1X}G7RZ3VoDg!Nz>35qrZ&}wK#KAw^N`q+keDxBa;VC^ z^_Ynbn2Cgi@sFq_g3X82O262ma1;4`V}yP2PESfqB_lDhI2kD8shHf4pPX}@6{8un z4)T+7KN7RydSM3JYpfWyXUStpAgn)f>o?;=8_IQtWUI5{K;FX^sr5)1VwZGg5Db^? zUJ0U`Zb*t|jqMnN%8y1n&b2N!9G`D|LIpH`zwG*(jkTosc!ksATzy&Q`(kLynT116a zanmZ#+d z`K2%{#B7|)@?N;0U+7y-=Lx1@v-u2MCp`k^IfKpC{A_o_M~FrLc{%T?4a4#njG!}J zIE_^v-)ssJQ?b0p29GFD!twLQ)k4IVGq)3)9Pdj`6@HD|y-g(Jy`1E!@$pJghhKVb zG9Imvkc!-^mSBn76+qpokespk9E5f@00c-*SNmmlr6BLz_nqKP~3ong^ zFJ^An`vz^-j^xLCALX7cGxX0X3AIM?d1$%tWu8e3>HJ#yVs?5+@8iMc$-SoVqa9Ou zo~R~v!{K_ik;R0YVtXRr;}`G8Co>knAc4z8d+x?n5|ks_EtN{~c_k3J?L5>{*}R`} zrFtQF&w;5F$}ye~8~u%`%t`(V_EmH$P)frwxEMs7jXpE9ww%{3z0a~DxVTv_L)q;d zjITc|ENG08(NwFvIeSwV5$)YbOJcG!GPC&I$o@ioD6ryC+Ait6ST|T+C(=@6G}u(` z&K|-6D9z2ZFWe-QZF&>B*#Xzaxoq52>;O7XcEu!Q!RVD+o27Ot(_uA?u7fZW+>5|m z1}D1pmk*knMU0M3xo5uZo5FW;G|6NrH>-l5%&vK_4=LYa)9o>N}t7M&k)c2zs* zF!Jqf((UUzjSWA^(JVP=5={X(4;jX)lDTy@4ix1oP+9pu9 zKRH{pYy=?CP@qCaGVk*&^476Om~9*HS15Nz^`zjO)E{Zt?L+-j6G9&s&h^(htqs>q zPf}R9{jQI>)kH3$L@|))Cq@^`Xbnim=~wCaR@hnIe$hv)Q-uU$;P|7qgjl>JkFlN}b~W4^dwM z6j#$kn}k4+5CQ~;5Q0O{#Wf+gyGw9)_dsxWcXxLW?hcDDwm2;A@@~HWy?RwtQoCEV zcV@c#^y!{6vqJ8L1!vhOd5-DPbsq+n9>_SQa`LWz=DV?QuL zAtcmd{qNPq9|5k^c)VF<4^*>9LV<1`h;NEthXoAJETCdZre3g4-tHPM_LQZ(HTq`>S4|sUGBEr4RB&?GyOk%As~{thDiK3o?i`m=3!BgF%ka?(slcT_;iAiIT2g zUfgJUT8;GE1*>WGgvhinf4#{GxE>&!HRq=nLlT3yv@U{6;V@a#%b58asNRMH^G8n) z`D*A~mNIJrME=Y+P9A-Y1!ZJofM;AdfMdH=4Xlw2{Oz`?i3D(@Nv|^1gxUkW4gF^v zV6AeKhWJ3BMemaqN1IFLMR1gS02|7 z;10m^o#!emjfgTh^lPJ~)cHBkjGi{|c_A zKg4(BMKdzg%#LnE2oNbbIC`z7Wh5j%`~&@=(xD;St~TiQg1K|mt+(~R2L*t(0#<;7 z+H0Co3YiJ#(7Vv-cN_lfzV_pq!{>p)ZA@W#i~D@`-wV{ceAHDc{z;R zxL=)Bu486gKKVzuw^1kH5Ma8HKxxvHnxN_B*-@=O%l#vM3C`jKJc!Xx9 z-q28S;Dw&%Lch6s=q-HLaFNgqr6zr9S4YMk?lzkycbibdZp}T)(~gS#mDBOFA4AYA`cINs zfTZ6kcxG{b0vKg=>?)k5<*MazsPzDR7p@jxPF@}-d@r*WZ8LhUh+kd1`shQ|`g3H7 zy$DZxDAlx?a(}M+GD2Ll=>M&gj>Mo3SG$M?wjj>=9`p|zWWbO z1eJh5@pA$O22Wd))&JH+soyzRPe5q&VX1esAPr~)IMJB4qS+?=) zWfD(oT-dI@`6p`V#pr|4$)#CUX#Ca9B`0)~?4U4`1w047G-HvvoMfE;rqQt}=6_#~ zN^y?Sw~vsn`E#}{51N@SIRV zD(tn!=%s-_&E0!5Hhm8b;0PZsUtP;vvj!347+vES5blLt+4loK;44`OawapCZ(2%gO?^F(&P?myjeATwO3yk<^VsbC^iZekC8{t?rhod=eYuRN*n)$3{_!ojwx$V+M;iq&|Ay-un$|am` z(w&0pCre`2-j!22;m0?>IR1%Dy>T(}e{g_)ePtX(U8)wejbW`!Ak5*3yMFFkZ#ZMl zfx69<=xXDOx7P+%}*%T)7e^IxmJW~0TsmwjO@csfg4Y^*I z@KlMa_7{$xwIpP|ZHMOY_)9%Raa37CRY&-Hgf}TMEjT6r=)zbxkci`)UUl%9{ZLq% zME8dw^&%Z|O2mPP-jRsuwjX(jeq3Nel|~T~JW)bv7~w3NHnG6$c(bUv*!fs0FOqae z)A*GSg6i;mb$7`wJhYu%jA#dYwbKXU${UG_61ZPde^0Ai%%Dcm_{(Rnt=YrgXfpxm z&AxhkXs2pUN!e#!w+L0V2jV#A=tKM0v?5nAmb^&~yFE)ot+)XCwu^VU-?{7SE80uS z$oU(eS6dI7*fU8P4Bf)67v4*J62TFNlOq6RDp>_;AFK!}i3EqFa+umfvm_rGPP&rO z;KIkkoG9J3hd2q6yzi{!ez`0@Elfn8>1Y?sQnXikXM#0lm+qTe+B=GC+y4ZZzdbV# zIeG?Jrt_Ppf8=fiunB;f){Ju?l~|ss|7lYi_>K|{=$@GWDC%e_y6xrLJiQ`~JqBUc z&S5Y`VMXmi1{*uLW5<3_{CRIYrrPSVA23Jgp{e)v>%la#Mtq%-GG)669HU@xJ(R-Ue^06~m2Ph?O3RCUYb4YCE1|kh(3Hnq~qSof}8*YG0^6$zmX$=2$`mR)6w%n+Lu;r zF6dd_h#X@f!p$F@rkgu6>CcFT@jlkHS3>U*ur%FeF$mQFZvAz~($T}s(#+|nldgmu zXK_tIZneKaK~@ThSNOmQzs;PUlk0Q%vZK&Mv*c6EVYsEW zzQGNDL5F$Ked1v6LN2q*pFCu%;uEaDXMPjVX`}572xzn^_u~1dr}nW`Y^8kDS%=j& zgR3mjWl!a5LhzoO%x+68LltVm64*V-EI<7NLBV6+tW7b#{ahZscWj6!23z$St$!b_ zm2k}$uwd+*Po;|Xg?OnW5{|1<2otYcpZJ+RGmDWc8)1LlcQQOS)alfs_JZ-Ei zAZtVSPizG(ZdE3iB_|IZL=RE0viL4ZnwC+-W3fX$iX^0;&mWZ*a|gSZZ_Xdz@Vh-2 z6XO1<#!H}zus=5&%T46Z^0XnIl?fpGxkSm3Lld&5&8ODUmB41EseYW?<*~&}jj3x< zu$9(is8drevh-nM6wa8Bu=RFd@q321sP1=FQxnO%SQVWN^0~ILB8dspQECh7;x9^b z(W&a(+}uc-r9nFU)ejRanJ<0q0SY21kU2@7(=3Zk$M^%>F2n8ZA< zbwOOk@F1E7hEJoU28}C;EKTGEu0o3Yr+f{*ycoH}q%aTz-ooqI&_fv9@mPnd zxMQ0gjB8?F#tnv6lgsM3V;$EkdvJed%cTrD0t5m+99CQaP2;oI~b~6A#oNHjs@N zv%OR`|D#o+bHc;j5vB@%dTYElRQs&_w8mWqZv>=61|~C@H{NE0VmBrzH_Xk(YAkV? z)-m1FvKjrG%Do7{Ug4gKc(3(ZhvYodwbX~_X<`uU9+5GCBC&LljZUpW_rzkp*Z~83 z%n)m9vsxCDt6J+ky0QC#+YHF5KR-`y^UKO~vaYYrj~_)fOku29)9f67alHC{1jpd7 zf)ft_=LjGhy$}VW68#q zm1|UK<{?Tvf$a<;Q8wevdcvkZ^%_S67^CU+529aDYup?nXS4)%%lfl>dBO3LvU$X-NFn55Aa zYb=x*q$UgCw)8CJ3?LR;7T+H<_*3v_X?{}fqB)fU*3r1;ZMWEuEvqN@p8-lxBJE&=uKOFO(` z>Jdn>dKLxHq$*dLn0oh=nd-3i!ZqUaiL>T$)eP6GAGWfBi#^6za+Rgp`ST9eX7h16 z0yLFomF9VM^$JLvlqHL*YrL3ehr~c{H}IlhiMQKHC903Dlg=mu!Ogv1@mMi0d>cNV zoKr|}-fCUr8VB6wifLsz+hRyK+?|?+D)e+C&VQjm<5tA9jV=brpDs0MNJOA$YGM`% zH~>|6>7M11{yWxM1i@ii+N7ty0OOK3~i15z!Df?ZXFvtfIrfBv0ex2ReT^c%^ z{I>*(`6ad<@au?458!yobB$e6q`>diQ87wW6?j96Ualy%^K(qo60zD37h%4x z6~e~4e2x=JpLm*4-R4fQ2@d+#zO`9X)baEtquQPQ^C%JB*QlMqD_IscROA}Fd|FXQ zUYVk}CRjl^vqY(RkTZ)Z1v6D*`p5j!Nb4>wdy0hI>dJTppIz^F9|S!y^z%uc%(2PD z|2*e<#3MYJgkvUG=c{PowUY;$h?1CTGXjj|v{7;gU@R6C@)X<)=|l8R#x;yNEzT6B z`7^@jmYn~cIs3byL^l)_z1#oLk^ICS73UbJo|JHB747C2GR8aB2t%FuJw|8AnS zxdUB@9YAQ&5|8^1w(6`ieM56G%;pT{u1&#jP8nZT(@loIid%ykPzWVY#p}tCJ%X2- z=*6Gn(zfdX|DFh6S@1hR`Rm^k$;yJ?9zUz5BtrizIZSUM_O$RZQ<>nR;9%+^Br9mT z^d@uyLJyn~iv=)TYfbGs5R%+nu-8f^l~A305+NA-MD6r>pIe$S!T9sl1Sek9u5;n( zeNRl(U`-XyYHCXUT!DuPVh9z{|IkMA@xEB2(^YW!_(OGFr-9yyVG*pP+^UkIRp^JR zQi_N`TzsH66h8wVWzjhN62Fua1h&$HGRI(Ym{6m82-2Um*eP93sxZv=n)GYQchu<^ z?HVxw{go?PwlMv&Wd6YDpTM4LozDA}LY>9&%Sf#TAhRNFA#uElF0RQ!-|EN_XY1Kz_rF8gSm1A`NV#yZq zXdB%g8p}sh0Kj8ajsvovC)SccYgyx4-ybg#&?uwik5QuQ3s1H@X`r=wp3zAQYM{voFr7 z&ytu^DyZ~nDo%(J3@o6o#g0(1u|dtwk#+JBlN`R}C++8iAx+$53m1aZNI?qF-nap` z2{GEVo#%7jqBJ} zjbtT%oODihb8SvbdsZDQsFIqg^jXMmEVhXun+f__mlt!4@0kDM?;>bs=U2+vnt^4Z z-w+2Ix6KaRCiwQ7J0Xq?1vgPdJ;Z%t7-+ooiRF%2aRK$@xlxE-3UjJK@8TW&i_vNm zP#Hm9%vYi3{9p;o?fR)td{8o?o!ls_GOj@)`{$XQKztc#>I{dthWSqk+fX&GmzSgT z8~(W`f`Jzwm?wC3?a(UmkW8Vj|x^L z3cvN?nb0f{ann6#?9iK)ImrL^w>5>=6&BOB=uQaStFT@e6y_}U@SZBynW!!Umx|4q($H#l404$O~L%6dq%o>YW%HKG&&Go$K-_fu_CkNEFT07wI=$mE?`b zwm&T59VeJ3x=IJXWsTCe4R7gNcJ1~L9?i@2rQ^l(3Wa;lrT;94BW>q++6g%Hg4Yu7PhU*aD0jy=abyOAcvaxEA=2^Y6$T z6QT+NR`qo>&Mb*-p$x*H3hB}?mA^kd+Fw+4hNh9bFJs#bV8*I0ao(b)=7%|H<48Ys zM7Z6A4>SPP*h8&^8{e*jm#8U9u=#m#nKNoxwX1^ZfwGy2Mwz8{);XETvu?qq0A-4p zY2KSh^(5aL9Eb5UZQ%EGK1EM*(CUA2Ts?}3*-|QJ2NMUZGDoPWooX;eN-A~Au;=h; zN<}14yLo4mpCmrF?slMGxPJXrG)PL?HSCb&H5LLzB>G69pU+3pJM1F%`}ff2VSA0D z%&)(g?Xv~_hQ5*^;NZuiw^9piHY3B@M>JJrGC%6+>+wjw+!!4Q$&0SBsA=&(UTZPj zr7G7jBgh*o_TJH>)F5Z(8S+-|PM%4nnyladWXfO!O`Y&T41ch(^FEuNl+%0Co@Ch{ zd?g-9s8{@yy6t$z$~*8U-MvqDT(W`Je&RmA)Od8&VyGL$=5XDmypVYA4rFvy z;6_bz10!=qqtbe#)su;+hy0S$yQN!k4FO+O6|QW#r3E_+7a6M0f?WoVZzbpBBdjBd z1`MnblgdW*>K1GWV^>vOB!wRXM_PO;Z+aSqH@FlKT@8Ms>gRff=0!b@96eaU%Xo;F z|D;{zn@1pH7lJmB$2;$`U8*>t)_W2W{XRs4lG#heB?pzBbvfs6lxPXt#}%mbOQ5Q3 zMZm@hH9T7TcA1B0+xR+jaCSyJ7vfCZjdYcCgyozCjNBFF&DR6_!Maz{ujiDtvHHi! z(aMowDch@FagNX*EqTH;U6uJ8i%KtxRU3ojyqE7Hm}k;|8Dnp6L~rB7@Ovs>jgq%t zoKs9YA62Zl(^cYlT$q;C2({c-D*KPlo{q}~OLwNHc(s!qtLvvo>KybfCOW=&bZ}_W zoX>F*DA+o(>TZB|0`XLz*Cwh=L1Qb|4Y})ej5yhFTUgvzpfQnSyJkKVi&R_vS%9NOo?eXK$tzTe0HY z$WS1axcz0HTZMiaGt6_G2wlU5wo?s`PT2beU%{TQZ_Pi^HE?_c6&r$c`ag*^W?AlXV9JtLNMawd!wQ#fr;)*6S4 z6wvQvPCccWXlijT9%BN0GoBY->WP(Chg;ZY68je()Z?k!$PC`YA2l1P--Z&N(pAkZ z!CTVOx-g5ZvM+0>!8nKS)pdsw_Gd$xBMExb{J#wY@Z&G{o=HZlW+lhmktf{UqCMUH zy#r&e5i;u~RZTSuLh1J43^9lsb?FB6%lhir0MoD$^;^lEwBlzrEl$2CBjpqU!=?BJ z#pKFj`Ofpm2Cidqqn7T#%TzBsnh*T6bC*1FO8k!v1&zKjPgr-m)6*@x6GcHNnwUF0 zBLglWsVT{pFx~$0<;V&(p)2mFO##X;gz6XIje7G)iv=5l3!@a^vy%m(MtfNG>O0)) z&qh4odmN%7{0}%#P(cL8NKS6j9}qs%Q}9_C{rJol9ecD{*hF?Kt^IMmovh1SNL2RZ za{ut_*T!D@l2FPaMr)q<+#OHz`zdX~b+ewqGwg!R zceI($j_XIi#C2v6LQjA2u#vDrG+v@683x@Lr?M-vjn6**Gb7r z7=&Wc9@h5v&q`Lx2l^7Uh#<-H^PJtu#rk(KZP*JB#fI7IPt#-nth7V$tno6KIG(-J z-%&E0;k!8=2IMGesVM-dX|+5hblk9corghHP7Qh`(%NxD(c1LVfZot>$ z+4B*93mSaxcb=E}I}QTYhFjKZQW(gAw1~y)YPiZtuBGOmz7J1S?0P)JX(^Umeg+_> z=@{`eK@aoc8@rPBbDDJI;c|&kDOwa_6`VcRZL;w6z@%lgY{0- z!({E=-Ll=oAWh}%{rY7>q!7_Qt4@dp!ofp8tL-g%lhwD%w!tZ%>J8<`?^w?gd?aI4 z18V4s;7uqozlJP5&57zK#VAJuWGu8tI5J_p3QE>$- z>DWV=cE*=X87B`86~ZqW>tqmigRb^LW8mw;#fM%tAhJE#gn+!mAClXeZ8j)@t^hOI~8viV$$M7clz z-Lp}`wxR7_(PIE=8DlGUBwo{{ce^`9S0%JQ?{O&%Hr~xHvTn8_ERo?kBBxGsW5iGk zYuzSjr*Cl4*!idpMOQe?T)@qk!qAwEzAxr;sWHZK$ot@Rcu0JAZrD`1Yc2woUFJ|U zGdZp_KPa`@t1LUDtvseHzn518P){&Xat#YrOdVe>ii7IebfK2NVzN@Ow*unb& z63aTT!^yV77Z6B@9n$o?jxZ3g+#jv{SJfD~;}}jC26}C}xFs%S>wllye2|-r4B2@z zzKQH`cIBntE+j!O4w60>H@Ai%aJ2<(qia4Ku7X~B(V1CmiS!9ge4zvsq7*lW18*|5 zgi^nfdu4}b86-3&MedvG6OmvU{wO{a=nnb1dy*c{8rNb)l6&AFHFDG9b!!>>c1}o% z6`Kb|q!5x}f&Zy+C_i6^K{U2hvUNI+VkX{g|Iouzb`jIL;&C;3q9W&qkw666ZJ1TM zVsjVC*u?ONOB&!I^NvyY4N-~s2dg5Brg(zDH8uW=iVQZmH0P?TyjS<=-nS^(1}amV zug>O8f;YAyYbcInLeu-NA>^;;0k@*!847)RuHe;Uyur4A20uDXyuGde1Wvy75!W=v zAkoj6{;Xocn38`>do?9;4ntE^bq04-SR+!KMu=J8CCz@sS2!frhMqO7tO53^Umt42 za(Tnh2pA%aHkZ?^NdQi>nY^OkvWz53Hno!*4x+<$U2kX_ZF#iej#!V7Yt->yV&F z;`_n5QCqT^csWj+Bu>k%Id!Q#iPC=cO?r`80q(>IyRdfp)1a}Ca*D59T})F9E{yy& zkl65z8i4G_W|6hlw!=7V957`S^%{#hY(o@89hwSiMa8p92(GY&;!xoi;g?X(=dZ#e{%$_tMH!OLbRx8d-9O@Il=SttErBW?(s_t0oR(M zg%)RYC2b$5w6(Z)6AmA#;@O06YZkea^-jzURX#OWC2w;MWo30`%Y*p?qg9Y>j75`W zS*LH5;=*T%L1^(=SG)$My2egPq>*MSC07FdpAqG5ti6rlQQJBCTQ_gbLw66AC7?)J zkOg*wh+Aw#&4Yf|A($iKBvi0?EDzY`LBlKUa7EM+wnQb)G?x5@W}~ui(SiB3yC{85 zonM=R6Vv|kTc@+K^I`a>q~fJ~+c)(Z&Fh=H93AAucJ2#W0)HAvIuZ*Oi{f_k;6S%c z)JY}(&OVOX)o%8fhKUpLuPnV^y6YPTI9t%xZ&Yp?iU%FNbA>o^uFR`h8ZvxT$%VxV zYf@oC0Rd_uEn+b#wr#_)ku;GIT0Fs(d9?O?0+$P~E>t?m;f*$}iOXC#s2B z_ZqAUp&eg-^XXfN#u7=#<4ebziN=OYcRqc+I5|3)DSrr^1jlSq^{81T5Ew5yLYvD^ z($76#5Hdh2!A!Yv3%gKSX`@3;! z^2%PkWlPcTwvc4@wHTH^x<_6Cng^Bd-wM$A#cB#7KlP@Pk_TYpo1*?}F^GS<52kDm z@>56bWd2w+yFRC~uAHFPIK{)dSX+_7_rq08+u;b1=VJSNd;I#X6Y8zR#Ws67aU$fb zS$t*^u~ccG6t+{eIjr+hxnVU~|ECmWx9-D}V&?#^mq}gcgSorCx22`En5l}B)$;D_ zP7=UH_RNSCGycIolMIALBJ})ZtgPll&DeZ-dv9U)fOC7F8_I7t#%{;pvLk1*sbsLD zWwEcI2i3S|&KkYeYSx$ax3|eRSB)1Dyecg^08g=YFx5W;31{oz4gXvq8LJ;9yKn(Z zyNvmB)D%YQDt_inLL4|lb23^T$XwI$O7rOoKrXw=FWQk1)3R3kX>F*W;|L6M`TNg- zUkbaj<^WG)=+Sy2<%NT|p>WAlwz8)hdbU(sLqu8-lYj7X-bTpy6(rPGo?$iQlFJ|w z(IIjExHu=~m%>l*t-PMg(;(tjpkf#r zVbAHPDnWaO`MmOyYSd8kjUD{H+3eG6k0kw7fnmYPlB?VE=#~||L4@6u`;G8TrS(QNETi8wU{5U>eSJbQ@Om zA6^CVALQFyn@^GH>Mk1h5Wp@ zsK_j4FDG9Y65y9r?w8nl`c6EY>y_nEL~Qa`;0Er=_~x>?AP9h#Zy0(c+ooTB6?=vJ zt|Q|#c)RGgn6zLLA$Od!T6024zV>a7a$P6kppc4YC{)>sm(11Ywbxj#O*(aMUt~wV z)_sCguLFg9&y0g~Rf62)<+9bH z3|2}78y|s*j+q2YnIT3NUpWuXWge}Ka!J^qeb3LH^3h$HWPd!}!?m*LK-@ZFfuX+b z@9=(LW>bxPk^g-t3GlFwH6Ka|ZSpCa9v^anMWkyFdZl?@k7ODd@8su|Lbq`nA^4c+ zAy9s4%?lYg{kI&pw}?;QTl*h;uwQ1-SS~xCzO&*q5bte^9-{hm)c0Z7UAl!LDq1yN z6sD@4Ia&|u5bE3n=*6^^wb5)&FLRR&p}ajc7tU~7blQgH0s!DVZl6?q-r-K4^rT+L z?Q~sK`j9IKxQ)b^LWr@n%`}sRnnbc=^n#!ZW$WLRW$Bd3Scli`_FL!ye;jtr!7+BIA+r!ThI z(aM|6{fNPDbj}2gqd(e{$iVTTI0_iV{j;{J|6-CVP-!d)wYo~TVm~S;HT@FPrmO>| z`~KAY2g_AWxa@LkV~{LxGbxVBvv1Y;MAJQrVN68?HviYz*b~t%G(|Zxt-P9ww4sx+ zorc(*nrZ7}F)o4*(2~qT`+`asOq~44xa?*?srBPE1W0=|@xn8PJHZi#G+{fdM08%h zl~sSi9bbQ^Ud#A}HTaZNM@PV7>&VlI%1GkwD8H1uy_r53?`j+fC#56yhzC`y_*Rw1 z{jRe@|Go5vv|IwniS~61A61Obbn@c)BI*th_l=q=QLfOt<;Bi{P9j498N^51*s>2Nm~XxAu96tAVKPagBBTa;B+&yZA;&0A>7_Jqenp7s{0a8Wc(NFy>Y1 zM_N+atLh%^U0hSS0OR=WzW26paF6O;X_Z5mHFYBPbKZtGUv(u^lJPo7UP02CuIpXZ z;GNb$@!vzG{qU85w(FDOTj|+rTYx%NQ8%r`RK+uh9IJdee;<6oDv)2R_fxZ(wWD9Z zj0sWYm}T)-_w~f}ZFK>oKyil|j%G8IV|p5YtcBH@!x~@oaEfEv?z4z`_N|j%-W+Sd z3$i^7C$?>KhMTMNdkhZZI=GVaub4pvy|=&DCZEjP6CEg@r>`l54L|5uZ$$A81Dmy~ z=iVu#PV@5pt~4_w=F4o0Te0i#OY*O_o_zuSvxXat&_a$qYe99SU4rh3orfUws06&% zrpcve2gCLd&KEe-YFT3LrdX#Lv+wGi+(Q!PyH@By1i0&9y^kbHx)t*auFhxi4YvuW z)oTLX0pA7{)eVxxvxF!g2N!H8y|OSMu~Ofq!%6(|2162a`-J@rDkS}(Hr8z7-_;wv zzLeYf)p-CV4PmyJo;8#1AHd5XncGkTC7n0_F)91KMN8QO8IH_Nip{JZ?_HjElteuR z^;Ps*gY)OVLM+LvHz%KuSu9uvdO4D@dS&)Bw`vsmp--yo?PL3z*3|`w!8)e2XRX{? zY<}ob^OPddUqB=`fp7EjDF+;Pc>-DZOTW;Pj-b1JR}Uo}I$R2Hl>EpJ5LBUj;JIJx zs%d8j=9)0Ei{O;1=+k8{=G8w7HV^6F!bo}b|J2_y-1*7t&~5nDsKq-q#Te(_Ep63b z=V4P%izniVsH<;@0x}3uT75#(xk%D--CI%yn-~>g5pbgQM|L0({C#xBqA_5W(y7Jg z+UQ2yPQO3+vJru7_G5LXaGNeknAe-HAgRT8Xfr6aOj^92n`?#@yEJVX2p;Il0(coY z^(4j!yLFGs-fyyb4c7>&Wg-gyNFs@jNXFmz5Q2~Gw?sqzqwf%(e27>GbhkD(rO&zC z1k48@g(Ox0#gV}G3OAzO6c0x#-)oUiTt4Yj8zF5l7 zH^4OR;fL3p*P$L|K;1E_xFu?i^`$&NecSQ(&H1L0 zJP~-tG3nUHwfc2rexa&Eoqedc{LZ6iIa{%BXzfZz0f_C=HD^N8KEMzdesvvi)9MB( zrZM2c(d!d!;5%PGs=tMY;TShEkJ7$yJc5xASZPhc6*)SMJGX#O5U^EQtqgXUf_4+i zc{Ca`mm2-=8;MK=+83#5LC@hBP^~Qj01>1g~!!i)q zmEDROEhALBZF;THz~jyU?rlXIW*hc5Dq;!`-pw%iO#>CKsZ?T)-s1&7x+EE1!*w^8 zIH}nCrs?e5^M@k(<2A}^{lrONz`*D$w1j{*>rY1hzaUo;LiN@VuO5VXIt^E+Ba9_r z_{4MhKSiL$k+ejHGY0E!gB}Oesa5cSP3g(OBL=Yh-Tn^_ly$|pR>!$5b@q*e1!HOE zFTMscz{33jC`f4mjY}u+t3SHkTLT^8o1GuF?gNE8FTD>Bp5~``rbH?a@jcT~)TWbu3{ThFe;uP$k_BIU`_W>PS;>TlIXQVPV}cdM&j30UJK0 z;0~X{wM51~F095H&xrcKczEA1O+_a8$c#ES{kgYzcDi=uZ{;v3kN!&w$)ke3g}S?) zm9g}GVol2PeZt>}ljy(MQ`OZ>Nts!A-z%!CfmgtLz$d`xY10ft&FR&q#~Ya`a5)4# zKMx2WOTO`rWOBqWExE{CS2)*sZ(*tt$Iqt3fYmhTz_ZtmHYT6+T3uL5$tt~q2msjb z-ll?Y)`-$E{srcv@mILcl!)`UJ|pOuO`ET4@ntYuTeu0uzJejSiskWElu{7w+%#( zsciNY8UuB1@N}aG`6qLfWC= z`gW2LMddFe5T_{?EZu=r0`BY#{o!yX%!?j8MuC5ksj zzS7lt80HdkwugnLn0CU}B*jUU}wxf=?ft&WYYJ+g7_FYhUQS35X{ z=6jy)k@)0F-?qtf*z2?u;t$#8h$LA>vc#u|@3{;Cwg8-oqgI+V91gD)2-q`J8v}Ib zLP$@Yk~AvSZ4FlO1HuVpELOeDcCDsX-;v!YjC?Lo$d9&fHUQ!G2{_<+qZjM`=gb*E^!M#qsE@UPAP4@PG4;a z$Dta1BzHZ=@NEK06uIA@)v>zU@%+^UScQbSwdD8}j@3@!Lf??K>Va;Um)Ya3eCqk4 zuSjgAn1(Ea7m1SlR{NAZS;OJV(|bIhAi^SN|3)1ivH5V{S?}}#%<|!r%9SCuGo_Jp zFIl61FYBG)d@KC?Qb#e1Jp-tQ*6WvC*7Y|P;5oq41XvA+R#VdzB%-~OTw$(j`hhWt zYgpPOj@hixo}#I+2qX@xn)$veZhfq$er zYNgJH4_>tao&kIaUuRu5-LP!H<7Jt3d zyxvC#{p&d%e^G`R*aX*_gqj+JrCXVwg;)C<2?POAXyj}>|NZLrN%69Cc*;=Fk7@Aig}=n;1`2^c3;{X^HC*2DP85^2YUb@XxT+s5N{ zNK3f$1@?(lDkr-YPqi2CNQ^&ZXR!~M$%x;@DLnvyZN|!#rrP50rm;lusyECnvL2P0z_q= ziHwgg0KWiY@b)}4W}>uEvnkO@j9W{Y@+n2T|0*!K@qKOFXX8@7u_?x(8J4k5Yq_kO zoXK^=Dbk0{!VlyW^!Y|sh6x$ad2Or)Yno%v(zG`vT97%Hx8RNs?5lyOEAh%9ja>SMlI$rMVk08!AiP zd)9hy%VWZmJ-q#sC+yf2w#CR}OtsDh=HCgu*Q1>K8JuX#NH~+ba|#BI(?HfU#oaw< zr(&`DR((pAz9kvtH6)-2_T@!jR(Gz%mb_5w=-Ch1nSs)=E+zlr6|I`h?E$|j_JItUMVpu*q zC4-x-gsWY;^Hz+_4#!p(Kz;xU1P~z_gMOM*LUeNB3=vFpa`HEFIi0pa(i>mOSG*2r zABqgFKX)|kX3at#CZ5`FMuA-b?q|Ms&%*VFV-Jmnbh3~6QiKF-HU9)YUUXY6a|82_ zLXB?ZV>ALWgL(`IXjMiZ8jYvZC$+U1&*nu){B67z8~=?(jH5PGwHBGjnCC7iLn|;r zE&gC39Bx+SnlNsuUc_SAsY5Dt0bI$;r@+RNd)Mp+f7~BV`Hw=`?{(|C331K4hfxw| zayy_RPBl2TA(R202 z9gcM@pzLs6Bw$^dT$o*2Vq-o(F2tkK(puG8wO{l>w{%alp!1Y+PNTvzSanS+2aL1I zag$-1(ct>`503x+yifojtUHnjOP7#b6{q7F2AU-nZIqPa)l#}=W6{BMfW*m5(lS&A zCOUX|F@~f>|m8fqG!da%Y1hs`GW& z7ZK$BZSpHhYCkWq~rb|Y&;xb#KIpaVgq2iA?wpVycU4@&oBbbwfUshL;(F1 zy<+U|yp}xt$+h-v8`eSv6dL6Vf17pg1>9t6%$&E1mp*84b$AhJyUm>#MQ>l_6VsIa z>lF4F_gcM!Cl?Vh(s!~!%*(}2`xRd2zdxjJY@sTs8W5{c^`&zq&4N7jh>q8Kd6=px z`IW_t#yEECg_tUn_`2Cgz#lbtR~Py$)ci-2rFl8~i$wsS7(82kX9~UkoUm38JGxHy zO>MLR+^Wq8I+f4Cuks{T4L`8Sp(ypm}#VE zcA~F#Q##qxd7`PK|5Cv8HJhBiotL$fw)03r$WrI$q3mvAbarJEFar@={d8VZrK=~k zK3)KYeh{aw{4p!njwe{cE+yF2o*PTb{H+6E;0WVkhmcROMDQQ$xzwQh!QO;zO@Za% z{)X)5zNrQ~HZkpbPa977*N-VaS64?t)i^svLEoGbE_z8Dt$w-SL~(5V@=*X|i$!4I zBG)Nc!TFE@!69Hr^>ZxtB5W&ohC%fd$vm}mEG6s`eBw)EA$Swo|VeO2xrTeq9v*?k8`1d8o zrxx9R?Yld7$V89?U#oA!FX0UD&dSq6WLiz5@}Iw{4AiVw{|s(+PfnMKcb6@|-t48zRW-N$M!|2M9Ba8m{imRGq;2#kOLP1KAwY z6z?b99oMV7B%v6;hWKQlW|1Khw}2>id?-bGnN3Stjnoa7o{JiWoF+BZ_$QvihMd_Lk4NP9{j=eCW zmNZVkN=VLV=u&JkK~^Glog&c<_1lvWu&jwKVoS!Kt4@7qQgOoRpbP%2m>Q=4q~1SA zYq}2OmZ6p_-D9`jSpsMzar`KHfCh@Z+fmrLF;HnJF!QAur>nk|!fX0G%~(vB)!gEq z**kC9b~w*eo|M<#<3~)wc#aPY8E6(^`08NA&*6531ceoslu%RCIXk)fN9^%1c5ggO zy|Q(>5E!_6pF!>^O-Eb#9yPQ(Lt8_o6DR||$7Sc&@G7JLqx6wFvj(=$Vlw^B7|T z6}_jHZlLHRtJqgCa@XEZOzHPIS+kC{Y|1z#eY^WRC7HriY4$^xaBfe@DP3FRYG9)Yx$C-)ea(e|gzx9J2PvNIlVV zx6!FZ4U;48{5c(Ox8;^l4~R`~w?6iI6ocmbWZjNfvMuxZUuPhz5$>{O>B{NzT{+CN zKL4-Ld)CE}YmAMkrKG5cPJH7|5EkJrE&Wr3i;HUtU5f6{T8B4#Cs|=$?p6eShD{@? zdPvIiwIts0<uX(PyqBa$JDOruBs}-pJ(GS1Uk0y4)v&bodA{I zQmrOj>Lv~lA#nUGT(?SNE&crB=LbZ;|7*~4irL(T;@i@yfEi;H2*8v7hrRC(YjWHA zL_L5?QKSk23J4-4(mSX~7g3R>LPS7%limVK?@fABX;PHlOB9eI0s=xP(yR2)OMuyL zK#u3!bMJiL%seyyj1P~Hv@=^d9}UP^D8za(J^d z5>ow4$iSc)A_1S5xDh|EceXRIis50qeFT#_g*86<11QHE2!3`ZqDvgB-v-2v6Af0x zh3k$NuzZ*%gSAbRZTB)~v*Y2xO6fK3EcLcCHuL%r+Dj7?w>Xl9OiU&ij>T#}OG0l- zmA9_&7ByrDtlrlx3~S5SEsk8VQ!WhbGM*h=iOb5olb@N$eYHC3)d|=YnMCC+d)3Q7?M&Z2@Qu2+9c<;xjp{{iu}YqKQEv7N+==Sxv$1K0qH-0x*HqRKe&dAxNcne65-u?d z6XB;`;KE4vimXS}By~v3@rek6nI*D5yzy^+>&&@&SD_)qSy$c&k2)qY5qF&6Hab$x zh4uY~t8c=Xzz_H%XZzgK~08QDxU{< zd)!_+eWE_%R=YKjgKMNMQ zmr1$3ofpcwHA_Yj`MO|HXLJ&L+5CsVGV)vGqo>d*OrcS9;jYm_y;Z%ESvP&CzP9O+ zw|T6G4YFW zSWOeNXRCOrIZ-pAdgTq#PiNaaxlcriZw-)x|8L<XqIwUpTJ%1FV9Wo3O4sXx7dJ+7zq);aQIPm{X-6sfe zN*l*`kdGy&j)Xjv{A`F@wbt6yh>9y+BEyQpEp?KFDw{D9cAh6_JoF!uqLlpm{*O9n zyHds?t-a%6(MdSS$P1Y5yHqjK<(*Hq-7(+EG%f4zFU1GxlNk#b zYq))8hm_P;6hJr~Xw(XM;C`fsI?_>~hBg1pj0`IaYgCtOW_DV#{?gZhF+~N1xON_Y zk*j?()a3?*SM4RVTXM!C#^Fx z%PEf3eOAeb#h|PfW~B^cQ=l))IwKq8@B8D{Mw*)5Vlrb}V(DAP_&G{hJb+D;FXREC zd;NVU<1(j8kOAdoZ!-%e#;N%%D29utzhxXWKmINB%NL`tPr{DUS7b~~ObGwJX-;lP z;dJBN@JHRSF$4lVJ-E6!pWV|fYh5=akx2F2(o!~gOcmy=9ditl1r=}+5BrzL5W9Z7 zMT86Q3}!{IF$nGTG?ER(t*@;mGxG7-O#6Hqo2m=RdYey83sN-hfnDB!m;|C+nth!x z@W}d1X1Z|!=q9u6*;(vfr3P$Ue;a-yhJKPwkm8$%-*s$|k1g2eB-`78(Du+?_S^dZ zO28cLk8fhr6(8?{UVLDXaD~GgcZ9jSFTRfEMKSn}jkWctMJX_?LXqVlKU-5xu_N<> zLIs$exP$8Q$?8=G_F9wxu@lwVkX#2^G4!zejzf)PXVW7|X_;pL} z9==S3EH5wTa!md3#(1@k(COWNqrJU-w7rGCeu-Baor7^Bu%x|XpDYB<9Di~B;#mVO zgL`C^`ugE@_sg$|hQP>*A%UsftrCNScPfIdvUk=~X_*=?%w3uuA74$IjLc}*Sap_@Yw_{hi;jul zxpoalpch*FIH-V*ZhTm|L;#+Fb{(d~@(;)yri88n&wYdenjzBN;5bMuWq-N(Wxq0Z zz3bo@6T}_3^60YbILMC&&mBV?Fa_o&#}A|c2tL^I572fxlnmY`?%{Jw1lTPhGCsoo zb$vkm0VRJfcXaFFa!cn{`;hN87M{YZUY@>r<2=_N2UmOxqagO)Sx%)4Zjiikh0*I3 z9&$Q3vADp=Kl_cD@Mqb`G5y?7fe$nvW3`13=3ec@Jt-3Bqg^?ENUs%+bVaE(?}lp!5aaCZrF3%OU2Zg!1F-^kc_C<(8(ug`7( z&a14MXXw%1IA+bz%pbNYqa-4P>+P8$CG(6C{HiKk*MCjvX;_@1b8?A5Sy|b?%AMx< zE#0qVjI%Q|xuJQMzPZn$gBX&!0$tzI&fEE4_w zDDPHBP4d%?J?SwkfU7BG=cwV}z82%I)`f8vzzfPEJ;?l(n*Aqwekb zUTMPE`~CY<)7g{^JqsBr8V%*! z_`mk`QBs`g%!|_JwX{z!26*pQz>mx?^;g8}l?IyH%FDgpfG_pd7;hq&YQ36Vpq1Ee zwYFmK^!b*|vx*8C_O>lw#IBp$AJH*9YrJEXE(D!qu$o$%Q$*pS>E)ue?>0U@^PAR) zb!yv=X!9AU&M>f82sl@Fb{O?CE2Z#4#YR=~TQP2K?q1m(6r$&v45gB~=xrJ1XWexp z34H)RLIU#J^BEmm>kG!r5wJN~t7<5Ei#lB5VWUjo<0?o566zWMOiOOcqtHJgB+;Ie zv)@SdZ1Of=i{KeT!aHaNy@?0|b?IlV%YRgkD&-3L%3GJ7A&L_my-r|sd2`_-sCW02>>7AxDVj4$v452tl5N4!KWom+nSQL$@ z*uD;LYi*ttvwi%i^SLdI?rg|e+L-xS8hoyJ8$uAGnKvV1_|PwnOiXTTN>TzkCT2$7 zXYIcNbnq1s%H9E`lBZ8-)`#k2Qn%ZN&o{ANAWqLtb60H6%%l!GHdt-mo*{Jm`&*_> zKL4##OS7nvD6h0ZGP(;Fj&JhCbaWQvUh5MnLk9aQ%HAfnr+K>k#wD0*ki*Dd$eB_wt)`YPZRIm-bQEeRLvw0c3petT4G0(vV{MmOUd2`hi>50{n zbuL#IlQ&uI?vAyys!m$rASZPJ@Yt5xB&UjA^(T*|`uQ3Bq&?GpHM8_>wP~J!^f8q7OVTGHMZ|6z+#ulh9blX3ohs=TDKdA{B1)Hv_l z{c9D&?4+A(kAOoOU)?09jj1x^5Zk(@OsZ5^U}Cgc1QMDuW%e-;cs*%p-I)nvs}pG> zDx zBO~QxZ~rnOI5EfhTWfyC2&$*2=R2-3h@sCe(L94N9tx4C-Qdj{w6qCVymDNaIY;#M=H2jKfv-ovJPZL=8cT)f?b%F*amr_e2WWtJ zXzG<;HN1nZG# zpI=xYp`J-|vddG}YH=dtP1v8bts;=UbrCQ5NxyGCxxE8o+!Fw7QVHV~VMkh1HYM<` zo!o$>Z`P0EO29g#Hy_PNI-jvIt*RUZQL?Pui*?AMTz~468~n;-KR?&i0mSG69fVTp zVi)Ev+{`C2PYXXkOqmCK#>SSoz009&9X5l%@&2Cn@(HKXcf?B%HMZ3?w!dm~kKIQb zzL~w^WyjL{ncd+IE>Q?FO~E-nRO@TU4-vs@=M#ud$rTkiHQOzp<{z%NIiWvwHXs5d zc5wG~!giALKb@wDDiGvEa(6xi1|kcrd{#XxrcZK2;7~hQ0Hs&GE6Y%O^5nj?ZZXoe z60N*3Aku?_XgQAP6)8)Gb#xTS)(@lY3(tS~)b4U~)3af$mT{0KuJXF|Z4i3D^u5W9 z@iH(`<4V>~&;xmHjn4j{#c9f$?nPie$fNKGKz$-bvDv5~CK~iJ;h19xl3ADA*=q_7A75X) zKuk$R7IZq?&Thln+8Q7@p$dlCFvHo?C5nJ3R4d zHTp@_CsG>mDpKdf)3I~!;lfX|e{82F7sOH4ou!qNYr1aUW4>P{8x$A_B>Mt@Mc69=YGt2_ zg%>`M_;BLJjV7i=)wx=?BG-F4yZ(+7^xnDdk1uqDtJtck@!im2Z>f^IBjurYolx$> zDJG2(VYWE}6F*TqiYqv-a(`8>5pcL_~_?oxvds=&x^) zu5O!gsw${+sIuC~mXng~R-37*IzE$EeSK%UTMW2QU>HcAa@8}#=H@i>mTYZoV1WPk zrt{Nwpv}$TQ1Vm|Pk?jucAMXqnWS|pOREiLApp?{xR}bALv%gIECj7F^A%^U|A>o! zqkXTgiz;ui2Q`Fr9--{(rvf3|rq=Z;Ta4JoO=qLdhmOxT*Ct!eEKmGAZ=*Z86ER1)zy~a5j^;te0;Ev(aAaHKLTg*Kx_iRP~9WA)Az1! z0(ExkSgOBWI|*H@g0U*y4P%Z`aXmV^Py-y=qKjSxd6#1X1NS4E`>x6><#D%Nx|E^5 zhuRy6S7)jcO;(8rTr_?}qFewhA@}X(2JhDoUj|DG?N`hTYFxt>aS*%07>4R6N zrPIb(92`J}5aTJng`X6MyuBSC8>hC(d5tg`uSdUzsioDLj;boy*M*)`f3?me|M?^i zGHnu<%8J+VDFsc`ChJH+vOf#ONPXHfc|RJ}bUfpq(P6PKf?laT(2iL2-FX%Bu;=wL z4h~Z)&bmn5^*al4Ny^DX4NvtFi>wLrFpxQ_Gbw(}PJSx^viI3v!Wki11f_0yxdTbW zX=*^W+LHg~OT%Y|B7%a2@gtO$L*zC@nsDUDu#V->P;+HbJ%edBNGfFHQE4f<_SNgP zA5OTq>>AvWMg~h!o(JvG>5V*A*7Ij;HELmVkr(+nxtMs*?U3FsMujbpM7@0}Zaa0A z@x5I26gss?!nVNw6U?&x(Xen=#4ZLlBqWh9-tdk(ZuJbTgGr|QOT?UX%#yo- z8=Q3cxQUftYMFrLc#dZKC+@i`tY)e(goPMITETRqg0X9zZhOw+47FGOpzN1%9T`>3 z;%iV0JCbOe=NN4fQH>O5x;_GG3wo*5BCRKkC8keTSN!oeJ@GcTKAS&YS&ZH4RTf~E zAR9(~AE0x88OBlwO6}*H4i!l(ym-B1)rM;t? z+cAb3zvlPDySH@&MK-14%@wSoU1P^7hbe_Hps1)>cpR?Wk#}r=!NGd{qnRz&W<>ZS zx1gThil+~b+e}Ml5dbL@rjnqV8y1RXq^o~U@Ad?8gW7V*IJOd}KYny_LGi*?T?!d{ zZBW?g(#C%&PHXC13(3C7G z%swts{k1~uX}C9&X{W?RL4lkQ=auJXT9+K|jBYFr0dCsSpgR!O4Es!3nPf<)kB{_O zG40=z6WC$hO4Z#g0^?^ND-zgTUPR`*Tm~UbjcU!fO&TH5g>S524CRAD04NiO+MS}K zK0&1JMf@=*Y5Dkr1<+1#ue@5?^ZyxZ-g!+(o&Uwu0VmqLc)}?{i}qChzu_TqB{B zyusvo0dWcE1|q#;)D<5lo0DG>jVT*!I1!}_rh8bOOGCXa z|CAl+8}@{u_)L3uD{d-9*aN-#@@No`FF(^(r)E^$W?|s=5;dqZF6b+F3=6wn_c9i4 zfOCq%#KcIt0mM|GbZUfgE-#PwCSX^>w>FxHP9n*Io}Soy zc6yqfl_MC0g}*V=D^mJKxtSWFo#YL#c@?8B5><8{T6ph%;|)QF!^x-EahuH-jD2hEwUjK3gfZD_qy zObZhdq8&yB*dN1lOtY1eBERfO%x5gwPX(a4&gGAJ$KElc04nw<>XsN#0OOw51t4ps zlNK%xA@y~2l|E744Xpr49Aw7O3k|mXpdzJ4w7i>)N{c+!Wa$PUpIM}rRcvNj*t_vV z$J*YWiI+V#ei6X2XN3C4kc})X#YN5pi~YpD-c%G3S)Srx@35lehZX0nd$AlFH@f-qdpUfhy;Y&y(C^vuf?H z4R4DMCwlc-zXaXuuKBp&y!X}P5_p-($gd-mTV$Wh8#6Mf+91>wdmQ2E0Y0Cl=IeFX zmsV!qbv`8n!bdvu$_7CvLsm@!Pc|I`MM3?0AN7j~MS(z6Tki3-B6EIX*s4DnX$0O1YvmB_Qmk zw_YLW-eTzm2lv`}nd#in`5A!?V-n6757V{F`&@TvcY#zJ)30<(5i3N+P3nR%3ofRk z1N0g^GxGAvKy!WGIPor3aeZHUVR3Qjs)-8f8))$SPAne2H?uo@Tg%ezxf-rAqv=Vk7LMps@z2j#+E!4H)<27@|luToC&XRmG^Uo!4q^4A4&1?>~X zrxlwy)Z}Q?S#WQ9x@?2Pfp|*$XUB7y*&uNMpRUqEkODyPm;aW zS+dF`W=t%keLzSoII?pKDZ&!>U03Js7nZAo-kN7I81RvK^wFsXL$=W@#AMtQqB+syWF~+4dyhX*<2uKydb~} zPEslz{k%-}t)RZX{#&hnedIXozWRf67tWE;p%YUce!EYp8cEk8JeuL@F<<)`?@0o_ zZ&byNPb1^7J=PH`3)x%p^7R0B#Kk`PCTlWDx=VNhfSOo9_MynXfT+E@prXPT9(aQ_ z>76~j?G1YqUHKZvQHje?!sw(z?C%XoT#VKw5V{Y>tsisF*TS-G&ppf5WE8?Ye|}n8 z#=Z0M6;P_LEq?m z)-EWSD!GgG*>Zljx;kRjw5Lw?!uda}z(lP(=WWb21rqXc4{nx__j$P&&kz%zlfnD+ z*oJ7pJUO|pttOxB-i`A1_IoB-58$r*9^3%@+``F@ zkI!rJ2T|K~tHYlzR^t34P8%8*9anVF$}jdqDNa0~+P%zR#k&BJM7 z$J3(&R}`#4dq6ek^;13ZsaYEDz*iO9I8H9GHiJ1~H`5Rgs;3`?nV2F%wIGdw9ztCz z8oV!q2IIKH=}~&~bmVma8DnD+)6jZ zQA9R?*}+}4Ava=MYinw;g6Qla3fz;;H$Hyp2)zQ}NU8Sure08P^;mIbsytMEq35T~ z#Kq5fjJCa<2h2%iX!-L@NFe_^vNoC8+S(pWJCD8U8 z^~J%!{96t6^YEJjGS#RumbeEveHvJ#8SR$7gBi z41kC`JYe-{j|+#T7z`kvVG=yzx)eg=OTpqdSw5UQ4k_}*qz_KjSeV-(~)y5dX zqb7IgdB>wY=g#nDNp2#;@k!^vTQ|!KITUcX+#r?#*VhYmuTpC3TE4mfUemg zY+V=hO}-N9Gdo9S2T(MXU%tvPi)KtewNY@_P2j_uT14k5n#lK>^-&G;Xc z;K*AQXqG@ZB-gvSzTUM)^}YF^Gt;T&*a(^1ilTBKLX-j?cV~+(&-t=N4*2S|K9$oZ zBSb!M!uEP96O+$U)6aokbDf#*G+0vkWY9b?PsDTRt zvemv4M@mXt#<*SmI|`AlzB3i~>R*8qG5}O7D$>e1am!G)m2Z2UN{Wb&zmsovPqh=h zMi6fyK_HdF5%2{0(}M_5Sf4ws*fV#|yH?xv_|wxA`>ejY<0b9)K*`0#2ztO;4qKf1 zo1XbPjU`^7VHb1fnIENNR+v@oDLtK8(UHjs&=CU?sdn8T92n4992eKl>IRvMNgLF2 zV5T7ZAtcA;xP@T+MjQ@%1t}4;ZtGq+ne->9K6OeLX)#v*3G}{x#CO!GAU+mc1B3g5rzM`76B~Oa^-CV2KHQb)kmf>gwlq#rZE?DoZJJ_G`rfhp7#JYS8PD zW@Z}8J>fKHW#Ku=>*B2Z;4w925@?3;f-k(Vy`wd|xjufXtFJpTGLd|rH3N*;oC<;i z1NnIQ$;qQYFg$n0%*ZSw%lsniIzAW1vX}j8Q&W?j!iB>trD1{(X>s zG^_{jp8JQ%_rH$sp`3TP-oMV^f1myTn!*3WApK|tPxxzn1G(CqhlkVnU%z~A0xLf} zJ#hHzRvwta|62Hf+_&mrgG0&>f8EPIn&SU@;fm^?M+bhB#^Im8e)*9f9SQhF#OKpT z#}!Wgu`S_bN5?GXaK&VQcTep`-P)}{y0NS)@~@)a)twEHN%oZqq`QpAw@~kM@wFRc z;}u4cQ3uBT)D}e8a!a0kSJ$&5<&LkH$N_q4$0S?Y}41-))$|f!j z&P8a!`@h|Q{`E2$v>^6n?0$c)2knPl&uue8cT5>()H_-pj&R&FGjr8-XQtG$*u_Pf zY3>hq8ud*|1n=vGcfy3SwREPwK^yfk@|$6-TVn01dnz3SO7~nlhI=x<2KHsff{?cK{m|A#=?aF}W^a zdAWx+>Q(i2LtQ%EU&+y81k26)&t-~v48xdM5nZk2cBl;}6WRWC4bwjGEsv&2e3l)B zId%)#yPmFW(Nx9zn`260sw%3g;$j;yK?&ubH|9De>;^GXttrQFt`7vmIUYTZimp1B zAnwwXC&QQZ)6=zdG{>?zNuZk7Qf1d&iAM0r&AyGf4#U^s2V2&~@+~qw%ehrhKHc)^ad6%>qi4S-X`U_k?zX4&*kMa^innTc zQbOWvPS4ERbaWw1bSov&w~3tXm?u&HH;B!8J8^5(A<~5>P2P)+bJrSQ>|(;D?`WbkDURJwhIFsnOT zbLtf}aPF2(K9}t0PNU$h!wX3B>v71*l=>W}{&ix4M{qlM zhtpo0%7%xEh9;g!DpvaEGzOmc70z}D&5nFmA!Sh{cr!Dhrls(hu3r_My)2{zlMRFe zq1V>vH76-JwsmE}3A57Lq9+b_w*h)Asz{&Oe{7@FvAm6+q^e$e(IZpY)%M2YJ$e~l zq7q(lK5a91$va9k$mQiUFVFP&@7zC4m4q@TK1}(qv02C~0*B9Gq7W@8bzZLo>)(E; zrJ@oskZgWZ1+omzp=uYW(p0W=lnzja;TS5nl1qCeO)-h3Y99RWtuj_G@$-j_>OR`2i_^m9lR0PQJ?b?vz)u+BN@k3H6Kb8>!Fe?(`J3J^8k}L0ejY? zJEO}a$t$%wa}v9&1v4`_Vd<~wVx3EEx5KSu6k0N+Zh%NYw6ViBKb z`}qRyx~=1#yRi#efl5{HvUOED zbmltibCxdTg^flO)#b1x#m~Nqh2m<_T@{rg19S&5ZH1S3SFua?m#M^HV*xWvq3KR` zN<&Y2AbdpVDXp;W`^$*68L@Aye87Rn&{S2I?rv1RY`n8htF5x|EfmXVLLhwYjQD#UZv>YU zIXOqg_LqwA;og*pT0D|?&h)Uqm)3H(MQ8&4V;WSkOe4y{dzhl++Brd36!9nX-Sc*tV*gno_jj zWz6$=k;U#+ap1z(UCPfRIjc4!?vL9B?xDziZF<37M{!CbO z%?AALO=UVgl~-^~8Wd~rRB4IT8aYt2T;+Bj%^PW(x$ma6`1IX{y}KcX4vq~EVr@Qw-sl0xL>7g4MXK=( z4>CxwP|ltg0g_a>lF|7n`u%XL+Rjyf|45O;&xR-pw`hrJm$iP0QW{+J$*5$=RK_c!Y1K0c5?qK2Vy4RjnEs_I4^neZUA_4mpN{ za{zo$$1WT}qa);$vUwSCbj4qw5f)he6EtG|^Mxt<>! zLSopLSrNX!fE@PqLm&sR+u_T<2*e_>e}#5OtN&M!+F!^aLt>Ha0dV}wepq1m=YB`> z`fnmlx6KK{h~IJLzY*SVvH;Bfx%r>4^RF=X5OxA){uhLI#LWLW<^P@j(crO^{gr*a z*L%otAhNk6-N~|;{Y40)k46ELAVXfnDjn_rstPC+sJ#~g>pt)l@FIAGh3-CZNI&4= zWyB3EtRJQP3?* z9Sm5^MZ~>>hhU}u=5E-{|EIehZhr2F(?iDVU_OxPU&p)!WQ79ZT>m?7z%PzC{lz$> zW{A_jF#ac}hm8N7H%hFO-FDd!3C{PMmG4x)UN@!gmPl?oA5|=f>~f{sZys=+qL?Zv zUwS#~`dpWXrSp(V+i=A=@%;wE0@crYS#%UIW4(4 zAmec(^n-5<30!2#q-e=e)a+lzNHBw1V`Zh8`oeQZMRTXV{i<95a(b4FAC(JZ2?e%P zBtq79^^C94K>1pRG3tXRRM5BS`|)? z_0bX3*bH~CJwLbDuFVn@M0Q#QSqqg_PJqeWrNj!Wj_MWdHEIcfP@VMwgIJ3LfK9Kt zd%1Vz=~wwcxQN}tT>P4a`lF?~6h33{kr;zJE0pXr-|~#r1*d*)84i`@=W_#WicSF5 z4td4*-OaVTs5hUbn!`Vgg9VU#T{hY(HxOHPiQ`?EKFwx=XX!5c_~nFm{@hZH<95u$ z?-^FM9TDK8IgMLNqFmN~CdHLH1HLOFH)!M6clF64n5qka5kj&or$^QYu->T(qbHAuOswGS2NPO|wyNRN+uG8b;@zn|Lxw~+p;dmcJX<~$xxd2{6SI(no&_-R z{lndx*UUG2VnFb8439gm%NU06>l!iOmN^kn8^L8N}<&wFPgu zMN)Lr)U&_mDScRYg{e}*WzY3 zzumL9(uTBmb;n8=s>$@`O-rl;H>4sXvSUF>fgx@HFd*2>UUjryV1MgH?#v9^;s<~a z={XVYrom=TOmf{_=1$p{v8bhBsn;H^3u<>zU5(lat~;4D2GNR~6VSrU<>wl$t-t_G z+_yjzm^oSZGvYi!R?J&&jDatppl;Y<2*=F34!kOzXrqBsN1nNG?Gii55i|YRB6QLJ z_VSv*p!|>J(^}_qT>aW$MUW0K*^ZhsMbC(L zqL9OK%|W>sWM*Idi(BKQh8&JZ#m_dTX<$3l@gmNf@6ehR8v(nl+o6pAy-}3Rkso8Q1VpaXxrCOT)cqXZ|C`CIJ^GnEbvw_nLEf_qj`}g6T%FH&(ytj-!6TYC3$UxrB0oEO5-4mrg3(9uWWIJ2D!j61dNTSI zU`Xo3p0$Z6xMJdcvPiq;1(jx<%HMSfAb&7DJa+Tj2T;2DB1Ln0Rf;MPf*Ei%V_+B{ zphM`{*+9)ZNR!mHY_Dp=*x?`~gZzpr$}kQVs{DCE6E7+vTi(%nH${#hHgRpJ2>F*) zfRg9??Y>^QYS=H%_OpFW?D@9K(x)L~*Iz50r$*W~fZ}~B%-_6vWql!GfyP2JYaKMN z@&Sz^5>S4G(oWkLY9SYt?I?P^{v#v5RL**YaQ_kLft7xN*#GKo*v1ZBKK$^i}k$l!mC2FO{l z%KS|Z;4v7n{38w6m;NO6{|ou=iXIP6O^(FYn?Qtf5`sp%g6P@t@P~=dmvM(GdVL%C zki)3=G)a#4Kzmyt6cT?Ys92*m*G_!SIV{Mk?Fw2R6<1bGCIr$*ywA+!KD-PET&9xD zvb%}_U~D2aD{g-@vydjs$ z0E@s+&mw1@V}t=X>>KFhiOeWO8}}7{);7KIX|5YJfXeX7H2BY%Y0H z!kZS_1=!~z2eR_>^8w;Xv2F$P0>k-@o{(J2Zg(MVokIy=GTqU$Z$3zdo9TcaH#Cc> z$pjsBCjbB~9cs7rZzoh<$=)8gT++Qv($KYUz$x28CwQ`*{rv!CQ}XWlpHzq4$KHG7M3hxdcb5U*5inR0<`hh=+W;^ z=adhoS1M|72fL2UIJ3EPszv6g3UDXrk!u%7JVvYiQap$pY7g;3ii&@dCWUH5q?l&2`2&E=Ox7_3u()6P#$+~Q+x>8>F0oJAwQ1kUklX96XR_|> zYAoB`&;s2_ZIyLN2fkfS#kj{5#pgwrGF+Ul?)UrWjEZxGE9I`6)p2j#omja^=Ob*C zTJBn(V~0YP7_AX}svOZV_JczcNmZA~Wz7(%ovF@e_$43~5p_labH#+m$mCPCScL0F zEv!`O>$p`x6;0l4@h@AIA^2~D9%k&hq1oE+@JTG~EjKTi*eSK~ySB)=bk+9O)@GR* zxVS0`h(ZIT(h;;i3q~Gm1!#XLUe6OB6m|f8J`{Hvj8CUbDSP_P!qL8~BbCj#d;}U8 zjd(S{s(aWW<2{V!Mk_T0AA$uGARjg?DVs>k&iw=${}w3Ue!7A6>0+5Ms3aRh(t!a- zOG$TK+~xhy=l9f~w2!80y93K#5Vq`3hAut%(KI+_*)-UR1WBBQDjg83db(xQpQf)E z2PPV9FilM`KzUc&%DsV&%2vNweXP^D8PHt)@(Ln?6LNP%}fZN&9&}+Q>rz9mxIByn4S3SG^=y}s;0n~Eho6rcd98u68Cp~izQh;TlssrJ0 zlR;7Ip6TeSe7dg=^J@ae4sG8Wg{|ivYG@da9u|J!2KjZQtE&vuM^Oah12A9|$9&^4 zcBqAhk3FSMCECwuvHl+lph1oc4N}W-s|%V>nf4X8U1dvpbno81W}0fu7h~66Ves8s0~~2UQJfS}tN*OMK3CrJ#64 zEYg5bAZW7R-jEb+^UKN3A*%~!JapRF*fhwyi_0em2OLV0F7&dS?2m_ADGGsYn|ZNK zOHk1i+01qq&llA6MYM?_MHbh))cR}Js~pepP8`H`C}>AqKt9y8GFP|h=g_oU8Te3% z`LGlQY?kZr8Yn~+of$)c5!{)qM2*ckv+8~VSoJwA?x~-+X&1n&deo;N{17DjW zD;8%g!L-EC6tU1X0=9eFv6V?*pN~@n?I}w{w+u&=Di;$mT z={qsbZ()euoI2P?B}o|$bo0;Z1I5x7)qz*Bw}Zwpg4z#$XEk9O6kNc6JMJl9o`c(b z;p?0@2xjOd5QCcs0pde23mf?!JO*%TSpV(j#4R`w;G8BgEG5Yo+5B}yAI?5){uf${AUR>?cRpq|1Vit z9Eo64O1N)dJ?R#tU+nI^6*w|GyHnxQK+-Y92SIsT6vDzkLjeE16?HJdK7V+<{Gpmh zDQTx%&ILwn>IpMpwf@mk3-SuT0}*dZH8`M~)qUa2Qjozc9=|XJ*+YsfR`JlypJCA6 z*e8Icu|QSpZ9m9_2c?8tu}1aFEdJp|%EMi78yu2u=>Uq!4k>1WD3%L7l=ZM63~`?A zkV9X1iV~#CgKMimAvjhE9{v)(b^L}LuPSsimR%e`KX6M{$fzOaA({a5+^pC(3xP#E zWQ^eqSVQoITVo&oCwBfF#Rt6p3&n?W>G)kPml2<^GM>h|4@A-q6E)!OP^fNLc4EkW z`AN{qXjI;zP=O2mg95M&9`Lgy2ieIXKcUdAKnjN|5d^J>`~Jzh{{ge%42M<)5ykyW zaQ`UeiQl~UFKanbLK=dMxt>jz6!}TReySSBjP1{t|QZAg&ca?{53#8L>&c)Kb3G0OwhpQAf4=u{ol6r z-^>Qs@?Tx*?~btgyVLxO-TXJ)^M7hL|LC5FK@WHHFz8|9mMm7+zp~Qs@4EieE)Fs^ zWK^GFAbS3a82`Wzu!qC6`yU(^%0YkC<}af<)TaMoK>1&w7|YH<7>4ZrkYemYYMRl~ z)NI%QdJtVvdpv=>s(%a3qfuBT9%iD;ARqJqXmb=bp@aq^|529I`@(_vG9O$2x)x!pXv>)}SA*CFpEGT9HeM4B_fD|k%6X1!% zl-I1@ZaD}t%7Jwp&^fPp6xo%{bfl7Q{R>st*neO#X+K6O=QV%Z@_;pPi~j-Md-VuN zv&0U{xrbTlNWQ<20akv$MIcDR7KakXrhiBSLRiiZIfI0giUEAe5HS6y9 z;^dK_6EY1>_F9bKqU@^o^Lmi6Nlrya%ricN%oL>s+C}NL%k|%(q30zNjz@csdl27y zUgoAevd#J2#_6>3o)1h>p6)x^?K&M=j%jv4G_XO3NwpSA&xE0?Oz-1mq(9%Mh$N%r zkocKC)xcqHFu=;*){+33+h`PPNgnr8to`nu&32g@2q{dA737P|&rJaZH27Aqphuh< zss);Do}L8M-4cxKCPN?Wd>)q!^>G;P7orHdrxmd=2IEiL;A${^)7AzDwk|yv15@6V`3l>`UZ5{f zH&zdp9ki)_+juPGlII&MJ}~7jwfIpQmb(P{hs>r!v+Z2kT~d^Tr8#?qMG{`@;dW^Q z4!0k@jd6Zil&+%(L@Mz^{XCbBUiMysj>^WU+F+yQ8!HzKn#EFk|Al024QMYa^&x7) z!)r4I2A!SYyXTEu2{o7(y(?Ctix)-nIo#V?)~&Mv_cPuQC)ojANUQAihRwAK1v4U+ zpkUo#*~eP-!te_jaJS5JIX~xs78YZ?;GKA0 z4oe4Mll_Nhg`?Oti@7UxLA&9%>n-;E;6$@Y_Z}2xgLOf3U@S<8g%6ynF1)y=f<&$s z=dObTe*@m==BNaSySkZi^)j)R!HMwAv7oLO+?5Hl{)QWMTLOS=xknpHVXWt2m=;yw?wbEB(Q>pBzR}QSe*(B9ZED_o|s;oW6cv9 zx~lICpD4S7R`d&q00i0+fg#{qj6;CA)Ol3fpA=; zq`r&sH-zn+*36D%!}eKnZ5Jv%kLb7t(XpKl?7n7e6g}k9r#5BKt-l6aYC)_JOeQ)xw!IQHCU%c_I{X_yjm_)alA2D_yb=QQFAuXCa6f4p}3Kcg% zG}3lY5n;&6$^z$GJXDN_98kZAIS_k=bLq~KMgC_0emUzrUKJfJDZc@D<3@@~XFBW@ z{A}<4An(1SnoPTQVP~u(3JOvcP!Le6fQWPz0qKGuQZsZB0qH%AA|ky>Zz>=nCG-wa zI?|hTkkC5>2nhu8?Km^r*pNGW)6XNsSb>Dkm`?~f6W0U;9495=Y5v2TY z>v|o8l=a%)0F1=g7kE30deH-XTwZt0fLi{@D~b))UNCKN95~grj>bBGU?u$in5fiT zS9d&M)L>)TFg6%S{5}7+<@;?0K{z&7Y3lq8f%-adA^%6NK5Hjuk>|GR*c_QWGn*z) z>iC}@#{%v|VHwD-(D~WC2yBdh$KE!}B)&fg4A3-8Cof=9bhl)7pJn1X<$ew7^q=G@ z-9Z%rlK0g(jYg^^md;*+GfzjZ0AJkQ)ybf|qu`^~ykb62BL z@r~wW!O36v9Rc_6ihL+ipZ9L*>iANE3(&Aq{w2CTAK51Kn)9@MpO-FMB0%y$JOsGA zWR_$)UfUHCe1DTi|4Th3`%3>23H{%2Jt6b?&wW5P1bMcrtv+e~tR8bfQMnD^r))%P z+Et*)=BGZ?(AXr*BeWhrW(rhc;n=jE9NNwyvD|vDln)?$$@5_%y-p(^S)ud68jg-j z;p;oQu@f;?(~iK3s-HagNMWa92sO!E{YrK-Mwiw0774~SD23*gY?-e5aev@H=K!!)?_!d@xk!gQ3XZf zi0B~>Z5ueh3HdBCQA$-Gwn-aGU04{u~vJMEO)b2vM%pZ59I8b!bNoU<~~)Qza#nLDdW z=IH0^W?Qf2ddl{%e!Ef<-2U}98r)tosuH_awbo9it_4Tp{iHBJl!7J!Mmbzys-UV* zCnoI^mxL2QV^wLLABq?UwRu(9K z3Q^xe7|_a_LQ*VC^lWr=PGHrewk=Xz@wYT7c|Yy_jeEIAd627(fPN0Jpuz9d2x?|_ zRI_M8E$fwp$=)=3U_5$D%C3g+ZEgGw?S=Nxwkjv4a#uU)zxiLljTcqI&>w=a8T+#R zs0w&3aN-6c0)iQ3K3MOj1TKBu+8h}I6d<384vwm=cX}r*rBlpYa&rg9}v!(_| zm-5J;bq&{z2c)YXE`JR~coqP%QPPY8HQE3i9|#KzqF#ZC_N9-Il(guIFMH7w30VK$ zHuI%e`VQXlD$(`B2kW<1D`zA}CShS?2A9sWf65$R`8YWiS00a#{-IE)@OqN~NjRnu z7%dixLG{q*kK5L^@5FvnMDg(&oO^tLt+o~t{%0Jh(J+ie0qN<*q)$32ecRthE)Kt3 z$cg89wwLouh9+C->a!_MgGP44L~PV-TDNp-EY2hC@)XBZh)Qh@ihXr>vdBU{?aLQ# zx;#|vh*8_x&9u)~7fV3e@kV=j!Z0;{(^>$>znL9_A1Lwc@|jfypJiflCZJ0 z%x|4m`g1>ZjT9-zG*c~395gPg5clrF?)d%=PZm7H)hB+k{eed83jKws`LPYWq>toBbRD+GB*j(%E2%e^wJj)16>R5N)t=#v%LZI zzWi@;=n6s5uTe?CeAbF0ORNUX_i;B}rRPYiSugzcRyVU@a&ZdtZxM`*;UCg^DO+Z) z%Waw@!N6~~EXJ0*fHr3{v;}$$z|daLw2qlD9a4aG7E9o5XHeO+85tWe0YPazW|mph^(I5BeTJh~#LBaxug0%e^3{Pdu#p?@fo_VxqZ+w@t>6x^sr zTA+Lgw|M4av?9kQPQNOIL9nL$sXMrpkeU{ES#ZS$@KNSiPWb=Uy0=zh_=rp3bUf$d z{ArrJxblTM!$Ch#E3t2ClkD&J4$oe32t3*pzvZokcQsjcEk>3-*@kc)=a znl@c1v+3J{G$XeoX3)Ml$+2rZEcBv|=HtR=Aka*cr{x&WDa))fnQK4+LmHaeFS5K@ zPbIbW?W99}T8H|<@Nt-&ryE~0Pf&S1V>Jpam%&e>(d@xp-XdcN;8MF7`;OW!CX^Fl zc~V}wVcb;AVQd55HzZ_;MU&$>x3Cl>5T7ydN8`Y8p6VGE0g1+rK_px1|HKLW%YG%w4g6Gma3-; zk`-kVPAel27*DY`k>jl5f}LsgTWaxp9n6Z!;+9lQNur*e)sWmx65F&MEfuirik}4T z0kjpk4l&T4^u!&UlTLdQUIab|jZ;Z9GSJWvwAstqc)HakJz5O$Dk!Fcne_9i1mwn8 z$!=9WKK)=KfaJY5v1ROQNhh6HPCPiv8q6$uW%*lDeyQV+diVO~+QTM&dtb2Uv(nOR zk5}N*aE)-Wv|^{l?;9F>dsQbP-A`6+I6v;-34oVQTkcU+h)yP?J|O zkO`)e*=`3lC>_1g#_|slsok3T8t=MWM^CCe(9_ne7IKuoj?|0FOD89d>#_col&T&{ z2J`!@%3jnaL}qo#yb64D>*g|O&fe6C+;(+S9nArfLqER6s&8JbhDCY*%un!LG%Y^> z@n8s~tLc2;66<;X+(nIS{WB=!xOGQczx4Sk9N0_YE})tNPl@%~QEZO_>$-=n_vAPG zDbO1=T(T?8e+Oj%?wOy- z5s&Y$kQ$*C=0^G%^;LDf2k954`(TAk(lHMLF-I~E-;n5s6CBHhl;jap9- zChTww61Mkx$tSKw=e0(4>)z;oGOR#=ePygTR$@UH%OU-T;9)3Gn9rk^?h#M#-inFM zlg52sm;8|BGx@4JGgPeF>KV}k+iEz=BZFQc<1^rTI(xo&kVCaOSr%36VguI2W^}uH zeocW(EeX+Q+9NE6Y)rWgq+-5dBX zuL(vN*NhNW1k(fybF zzBJjo$zh1i5BOcz6`!qCRtEe~6p47R-cA5TgMJo<2=LE>H5w{0msH7wUSjpqlYAU| z0p)eov%!wE{3(r6B0DDb54f<+gFgjqPU)Y%fIjWY3&2F%1nqRM+7n}%-VL*HA zurSc!m^bj?+0=mG{81)t^WHg{ZVrjOpyadN1PvE5MKA?)soHD-GIsHA0Rn3_C=EprsIB}F1`Wg7r-x`R4D=J zXO&<-HuuQHu&}iLOdnfa!Wg3*N5DW%XEO@_kO)cydYP){?L)6#pQN^-LA!7vIaogJ zQC+G8b%e7Bk^>o~2nLl)EdjT8(Qb8U)0t0z02+#W3Y0Z-1A`M!DxJ&^X`(P(PEd@% z7{Lwq^n$`Vo&2d%c8k5y@xn?#Rl$VyKu>5pctidkr@@yO&}2P~BnA3|b7sFM3u_l& zFxQ$O@?a_u{e}ZJx#{?+$!+?%dmN2Crb^0QM#v?*GF7)iOl4{rT=w<^I96eN_&EM0tO_(X^UpjV;PDdv#kl;O_;X#mWrzbIkr zY%-1AWhTjutn{lrfQePHe4KQDIEF1Z?To)^br&X4F^cZe_(rPmmXTC*6OX9yEu>%2 z(_ZoCL+|>5fL@J-sH^?8ooDqnM!(nSA>qaD6q!!8WYhTTSIKLVXBr|ip9sNrjwe<1 zWS_=J6+YT6*BZ(%5YDsea3NP^Hpv=?O6 zXLheXL>z_l!jQ29}XaaEF zBi4^-m~SAio2wB4`m$?=N2OJy#yw;}jkOQqY56}YT2E{gWNl{4Hs{$@6I=|8{L!m| zhwAE;?+agGgXxXDICe@gzkcb}0Uw@2S?BevKn?L(?_Ct7e(IwqIjZcXvCPnN=Q0V(Fz z-QYH?qdLBXPfbcJUy=!Z$|NwP=%I-uM>S%bJT6V?F&+>~gOwVX*D&-MyV_NxOJ~x#2Gq( zH54#9URQsRD7CP$RIjxm3WR6YT{>qEjZL>faGnE{3pzhZv*umWaoL$o(<{wq!r7zt(5tp@@Nj0kT-# zNFm+>g(+Svq9*BLGGY_FC3+K6P=@+0q5W>(uaeQBi*aXzOBd;EsgRODB;M4O?X!SeL}T3gvi>TH%fQ}y1k*nx3I^xqr@BMv0i24(v+Kp}f4W(V^R8NpRvC?h%dC6~E|l`Reo;7b(#Hs$YwDKC~T zU$kgIoq_X$`PuRhL)Qm>|4R=+<6dhrP)16qxnWNyZnp3_oi9}v|6FyFE%hbYxfLQh z{Csar&UZv^GJQVEaiMAdoImA7X8u1^JcOKxoF$+h=P1p0BN%&qeW1e5^HVM zVNLo;Dvro2UBqXAZ)oC2H@^8ByMvvEe$^`kD=(+lEoN=l-z?@Ipc!1?z?YRb$p+K2y?BG7W(Z=X72Ou^P>tt)$ zZc``qbSkJ4%Aj~1dje=tKQ@1>y!4Yk?$Arta+9a_%Vrk6_j(C8Kq@|cg*z{Wc&B)# z>TH5{ofqg?*;qtRbHMo7<^{mOvY314S=4kOx(c>Z zj+6$~r8CplwhrN%)d_<}D&11z2{us49U?2~iJ8A)!2}%Bf*8gG|py=n8Um zj@){s@e+*9IHX2sNjpd&Lr$qkjrr2me&)H3Y*hG5)lH~FRuNO*IX#kKJFH)5=7*<6 z(3(D6tv$ev95sJZr&H%Q%3vAY9!hmS?BZ)nhaEV7MYn3~(9TYMpStQt;E)_m{w)jU zwZg%f&yP(qDGyFX0L&v}n)fq>#9$1C(ZFj~(@XhdlP3b$e*BPO!noRAMT#!qRwck= z%KVY4@)l7gM&2lzuDNddWq57a%uwitg7g=wQiD0VN-F2zAfqe;QeEo%HcMO4ngRs( ztDg5Uyf+VpM35y{ft;%u24pTg?KHXm4E`kX zA)66$wj>`Htz)Dff?)M26x<;wWyKO32zQpQa*H8z+ZymYP&0v}mK)bR;ti}#s&~c# zI@va3c&m{+G@^L2Ty3Aj_ME5g>f^sF2Dt^I)>GkZAD!hgF_I> zMJ%1+@TkLjf578K$Ly107~W0OM|y4dG%HSi8u?&42!Po1pu~?FdI#fM^Y)}NKaK%@0HrkNhy^=mP5M4x0=n|FmFWCY()u5A1 zw7I!5Dj_rWEa6AG{wU58Rk4&(&Xs;}ScpHhioZ{SDj1C=usqjC6`l9>PFyX3iY@dq zO#E8s(JnqZ7tl*y#M7*Sa4*HK7Ul6zka!y6MAoc-){rCn0A7Dh3v^X|%4H&)rH_d_eYQslm1_V>B-tHHh_3A`2blp=rlgXm%R$0 z6^U}P9zAUTG9b|4&AYlA+oZHghY=8LzM+#2t@k?T28puMoI z6^Xey#p^w!Pwg7;XSL5Q+jHpH8}^#X1LiN55+~tMI4Mq5 z`C;b(@=V(#BvN-sXssYX^qP6g(REjFj^^^9eg^?B0^H$^-DmEHtkxr(2EmLh+4M4B zqB!{;EUmka;T{@>kPoOyuSw-y!^vHT?`36nC&`Hb3_Xq?*?5wx!`rYhPt(#&!E)E0iUrE8igy%{d%fi~TA?nJV%OD? z)PS%IDoTp^0__{}NHX}1b>p`3W=8@z3~1vY}qQ1|>)60rqg(clmR%FdCyH55D=C zPfv-JP5pQghne8~88SGDFI5ngc=122El?T=RFQ`a{47b#EGU%H*Jx3PlPnb`5BXikd4mr;D^qZ5p%Lh}S7z!Pfp3?z#}Dvc8qMiAhX8T&#>m0I_){Q$l? z0gBTWT(&L^A5<~4#?AudzK{#ARKMN%-nOnJ`Ofd;Czm^Jf%vFF1%4cJ-DGUT|d%br#PBFRo`zPs?JZ=WY=B{DD}S>N{vok`|EQ1 z%d{-2u27%ZpO7M?CjGcl=dv)g1G=?NS)E^?dMw#_Iv z_09L++$CIA9*kd>K9L7tIygW8jmzQ9Q)_)`L`N$eEvwmb)*4Y#%o$|0?)hcNT12{C zqoBHT0WBnslmesDmawl$hWu&ivr(x+s+0L>a9 z$F`^t?PZ87f^`BLmE3@uZQKg(C=^Ig#N*oCR0HuPnN=V0+GW#&K9_oK9{PYZwugg$ zl9<{|61ucRn(Pv2LtYbDqb42fOVlaf3!ogd`vC$H07?&M-3L{m+K;XKatBq@u0V@G zSZcSMuNh~srb;Um@anYkm<8T-1*nQ>SVIJm#sZi@fCK`%90TYX;n<>*9&*lA1%id0 z_x>pyAarl$c{se+jo!c_z5fMt&9`j!h*0MN4Q3@ES+JJdXc>wM;P!SWs3@Qs)J;%C z{OY#a-`x&~>=g?@B*YY#df}?^BTq^u+_qNTGM?nT-kK9Qqg)7O;DB&2H7YzUavd|6 zvKENZ0k?Iu%r1;HS!KTK0mqD}-2^q|4yzY_SMkvyp}>1_*3gRc-NK6l3)sl!=ChTq zgY%LjGPV^jrXul&P;jS7{b}`GAsYGXpJqV(fCj`cS;DmzqH6jhio<7H~psQrQOM%My()XOM~tBZTl*befBc6=1dR-RX?7kqHa&s{?wFa=Xy~8lJwvP$DnU-{slM{p~L4smYw_7jkK_9Dx**)Uk+^w3qK~8TC zJt)Stm0%c+)Ap(T;MhxqAWu6?LH<+Cx`oW{!W+wGwA_e*YPQdYmAzRnGGZ12Kt_Mj zf>+}pbXU}88Ga8i08LbBHKtGkkW19)CXa!6lt+;6GjeY>|GMS%Rx|NWJ%!-76kI6= ziZ@llAq^6L@f}P0GmM&XIAyI=F9+LRLJDB*T>0PPCNa=o3DP>v&!4vtnY zl^BgKWwzz!mhhJ_4eEV)Vj85)tE0hf0?&l|cunr^^}x^N58wZM^*i^gk8gR|F2Ch1 z^b3Fg>SHM|5A~^qSw^-VtE1lYkT#NeFxMX0dNtV{m$cg|ozh(FMOe}v z3Vra&+{#LKCS?J~hkhV%@$j5*EwOi3^X9Xb*thG)L;%K&Ycg)67cjI!VU=?q%eZa4 z(0^Lqq^LD$hfj8I+u7MUAF&@lnNhP(1(mE7RwY_?s;-70c6AQ2AH`|333zu!>g6Jd zGk@?MYjxdv+-QR(`InO@9b)N7%Jj9KtTXgj%MOP=jlTIVeG#9DFLo-H-6gNjaURHA z6m6`tdNn*|WcTCVkA+|r1yxt4C$kIrOFlBh=hf41&P0bzu!}IRGu{Cm?PVMM^*x(Ph zKS`T?xyX1?*V$NEE=NRtCuvE-E5C8q!g0^%R;aC{+0O<6e>IEm8wWIQf6fwQm(zir=+K>ytj01-Ls~+AF+fnb?i*vh&Mzueoph zG#(zt=B$jBeb~_zZ1x$h9lj!FNycg9lLw( z*h_LrR3KCQ^YZRxat$%4hl>97S9tk z%D=7q&*d7^NtV;F=Sg^38o?0K{zNS7?9tUp#Hr#%BC3|WpSK75_L1VH%FW2~5cywA z6{{=>TaVwcQgaJm5Z9!hDqZ74`j)MOIyUlI>&rTVI4(3pLR|SO+DLuIMK*FKU{hN4*@}#Hb!k%+g`PoQfsUQZu z?j4Y5Mcz8FIgXWktnS(Urk`XeNyn=vk6FQ-_r83X@qP&Vq`>9dM{|WfVG(}s!)g~h ztutkJBj2_hK)V_{pd9XzBO?_=A!d=}A4X2p)TbvrEkBo*Jh&JucM-2Fvmh;bT_evv zvDH7w1Gz!FmU;f~t=iiH=H}_DT(fE8$b6S|Nv_<;B}J(w#NNuVu;{KfQ`zEDDQ0t; ztDIb$@W`F2XatPan?B7$q$eMz7$xg-W6LT@!i)3n_BCB<7SUx@UV_enj!KdD?jUU@ zF385L4Ldr4rSwrU{?v*l?C z(%7dI%C7d>QPTBVqSsOXjZh->TvWHRNA&Z`b3$(5D3{thH;-I)ffF_(q5DvL_sEfA zeL_k9K-j4)ZJsj0M)d9LINQOyGmTk~lBgQ#Z%9?(vCFw?2NeZT>(wG}Sx&Wzm5_*@ zM{KkH83>aHYGO*S`(F;pZZE^E-@Xpjkra%y=u)wGXTH9uAgC|H#8h4o1rJ)R7)+Hx z%_ix2drR3uEmp97(z81E?{gPuusX4J@}52&%o!vfk|b|rZcdy}x@(_8$w)7XEQ(jRgud_ngE8d=~ef<8_~fmE6ds7IBp$(<%xP z#xf8tr|;`}Bj`sS6+T;ZSa}Qzl^!|r-upYs-BE{Mue{R%dv9(B&bNy+QL6U`EK`H0 zP`53%&%8`PG-O3oT$aJ3&ztei2$fB?2Aw~jRi66KrV3KWZB`ej#lsBVKxJ!v(YE#q z`0TOq^NLSn(5vI?0gu=n?@D{`1qb`7NP4}lURXvm?)H%<_-Pqd*^)2+_3Ph5&c2=< z{2b9&9*8$%A4?4g@Pos*`QYX+yB3bXOg($)p7SKT;AK9s(ql(l=X~n(*ZY0r_4~Hw zu=2?>wm}t%AWxR|{znSrA_u^F3&PE7I>?v#uxn$8Sp9jQoyLQkCc%pn^-kR_9HyUM z$B$;JxO672Bw5;~3Rx%(y^m0?+`Z8V)z=mY!`%UtGPmuD^b<>Oyl)YC-{NeOP_%Wc z3f|o&KEKvU_392%B$eoaTVd2$4dTaV#1b{L2cV)p@poeiIzDAJu`ilgFJ#UJM+AN! zDc{zg(C_Nh{SddrmI&WP_oixgo*V4t27cE|O2u{fjx2qYh~K1_l?7Tqt-x7sBPP8{ z@k5iRJ;}i*O9pPs9JzzEQjHBgu;{}6tbCgB>4LthVNPzrU&JLabq2=!&_&$+^yA0n z6;>7JjsBnvCHK^6WI6kf!$)+qr)J>y!#`IadG4@?dmaSenWcW&ZX}atX?N`gob5vS zM9nO%3U{HrpqQc{|9kG5`li1TGBmTw>u}JO(S@?>@Hpo;Auq>xMoZW04sPBMU!`Sm zzl)#Xy@CDx!V}K{qbwcVACrk0M#CqMpExoT`zH93;Ox(Dmpawu?x#~O>?hyx{Ee_P z5c{b0WBPr<&%1MD%k?Mqud?#91@Ur-43cn_w#82(Nx*U#p6Nwnio7~W=dAaqd_Arqr`!&nVv6;aE z>%mqwuynMvuH}Pv6JK69>))kI<`(nSfA%Nur6_GR=ZJs`QJ4n_&g|!tmea6LQBd4= z-fPc%0Q(-3VY1foDlj%iyKU3^wc()8%b($XT-#Qr)Zhh46tLhw64*M#ikQvW&}ARagt?qul+k-8MCAD0f$F#=oX54UAy z*+LGMOY0nc4fv@jLN5CthfHs~TZbcBWF8_LxvtvJ@mv?nt*td`*ZUo7eehA;|Gu>H?m+kZXKoMm4fPBe3~S?mb)>hq_qEJHclSe6QY8l$S7Lm; z-|N@mGO02?Y7;{*oZa$1);j@iFI~rUvKDn)f;BryKH51+glDO z+S(c!7LLM$IvHF_s?KF(dzwZYDy7C>D2+LzuSD$;PqK6hBkAeJ9^yWd_WNlCA1Pf^ zk6KbjfzR}tYMKCWBe2W%R_S-|LA2uHx4 zZ~d4F#I7KtYPXk#h_6pRf6g(Nmtf&5&(7WKc~#YpSMVJqv0;_DqoqH&ZT!3oW1F4L z({l`l7Zy%ZlEI@#?1kQHYN7Yp3Q9}qWafH4&kp*IJhLb^wQ~MY+LSTi_wO~@ps@cN zx)do-iX=Nse~&1+xJ#tsJlX%qC^ zveMB}8cdwkv@!SC?ut#8a_keKo%KXnWb3TM;m5KnG*vEZsN9!kKk+>X^}{ao$y3i~`qbsUyS?M$427}E`jswgGT+S#;REsp zO{YvQV0j$WZx(2H#0wY`oNwIH82$L_6`O6R!kDJ-Ey_nzhh_xXDI8ZD>))-8kB5V* z#$zY&%mWp5bxXP$FGAs$FG?t8Det}Q)+ny_AVx+;>VSrhj*!Vic+JF-08##@x`UmB zt-4jzV3Ot1q^Li!u&7A5|3sq!19$Y&+IZF3vu8(`K+`f_ZZBJoexa(WYGaf8tGO59 zPolPC-R>Jq0;Wgw)R2wM^AX~RP|ED$+37HOIO!n>m~YY$7kIMk5<7Tse`2ZM=ZAV5 z`01_7-X39%d?LL~Ro($BTO8d$^+`q_o6*Un^u}Vb@y`shbqE=mmfgiiqhI{ljF>-CZSqI#it75T^4-_drKIC6x9v2;AVaJ_s`Dh9>Q z5r6NV%lynt#303Kvz{J%(`FUxli2KeOIbM_fqH>7uvPSdj~6`_lk@n(bu%GG(=^S< zKG;Cc(l1T;gAev8>As&{Me1FmPi*mCurCNG{<_p#Fgd4c+)(Cl*2CMZP6Td+-8$Wr zpe7L+`ALg=Fz=7`_nu@ZpL8x_h|Mw;H)VaTKP$ zR7K7_w?!IpQ-vf@?{Wx--m{XCrlvPpP0?|2sLM>7NVdC z0*pRuUQ#WVPGbGq5!XqMJ98yoM{5fN8c*MR$x;ott2_F*i=)_^Z|uz8J*vc1FNP;CA6C=+(W zXZz_1d)68Cw(B@z0%B_=w)fr@p5@z_S87?r2vo|*C;YKd8Q>l$8`MZRFVN6L-7!*B zQVye#ca~${YR3t-&AMY)V zIqQuGVgo-e?1)&HFMjPOE)fo6{R;2({(PXM=i)-CoAA!*^@`TKdGKZVD`>EKO}gAK z4XT~w1PD8oPRidkJSfoR9=$#m7PA;6Q?dPm_%0lCbZ9n1*kjS_$7gg@RnMM3NzZTa zQ}UEM-qqgz%9=0HeXc!~Cbw4v4ZDEv!lg@>ZlAT^no}*&tFh={5*8LN?Ck-$HWMUkb7!jYB_+iyQ~Ynk6Yp)!B@b0o#Z(c50RqC? zvh#(q(mUZqC250gG%K>H<7O{T*g`3;cDxp!jBZl-!#Xqp@hOeBLM2(!?$N`iNTZjU zS?z6Y^YWk1uiw%6#AR3vhJ&I7Ra|UZ;~B!q&KU6YNo~773(jrfp%B6Gvzg>0^PKg} zPr>ejMugew4z)>J1hEs*Il6L&AARApoPhzG%+!=dI%C#hsSjyVjus4qTW((Hd|>sB z+k_IQ08w}I-Ui(n+AaiwG}2XQct7-Y`!rz$wG$PY&0(@Dt%tmR0W~j=&u@NVf^u3* zV8pewpz^y7Qwkjw^dN9)RbQa_O|qbtGC5%uP%plamjK1jqjlKzR5$7=VkW`g(dw zOf&QILDj*(J-tF07$d-88W)-%y_{*@Hij%KGPHe$ovt!GIi<#AwX+~0Rce$*AHNxi z>1!BfnROueWL@X1t53t-m+z~egqcSFVB4pB7KJ$Nhv`#4WSPFi$O!(aSaw|t>gCbe zQF`Za7W3f>)5)Bi>EiLHiCE>y#eyAf!^xuEhu&rCy>L+q3epNy`H=f@!StjP9IU4o zJvrv;E@OH4RvBts*-{=fied&a80y6nU{Mxr17<$o&gO6!{2iO^*jzg^iT23JEOWms zu9l_M)XYlf&dC0@pdB~l)jv3hsC42GK;PKhh^QvkwZ)=-3=BZ0ipBRPM6|UQ1w9JD zd9~lQV4ID-1x9}%avrE@XV08T_ecBr`Ss|%79dZ@La*W7yLZ7;E#eL)e#y(j?e1nO z=zh`SK6&!wh;6YdA!FSz>YpKE*F;*?kBueWZ0qdgeDkjF{fz7tZxopJ`{d=&>&b-) z(DGtO+N_S0I30Cxe=$zos$u_Fc_#1pOsrA{8%a%7HKVM;ep)`@ej(V7h*-fRtM`#t z9_)uBk|l8T=*>>%ebF+al6u!qnBV%4)sOr8PD|bMHLh>k3k{1qxn8*9rESF@{6>gQ z+;0l6JiGkr0UuWgHi%}-(Sn3or>_=Rx~xOYPHsh&iSN*$H{qxCV**EP+x$ocR=Ck* zEp@FV@wEZfOcXQGkCE_jq2jWiz!^65Ejy32K1>&7Tg$bULFV$q1!Xypm-dY2Lh;Y% z4_y5nu-4myD}TyP8B(+etc3(K;F`vGC$fp_c7 zrbbG%G-z#ImQ&|o+UIhk&2XV#BBkaXA)=p|610)vvbBn6Jbo;n0J-sq<(FQCkVc)6{m}S%!|(14;9SRQc8NqUq0^eV zkE3d}(&-tRLoSN8xU{q=c)ZWRTf@!l?PhSRqH`9CDk?MbzJV3NzmehK76GYe$kmaG z*v~K5#;+PsUC#SNEqX%r36fd4E4{3ulk4FVgIBg`jA_5HJ%^$!Rvbm^n)L{Pm%F6S9n<6G5(Ki|#6hsq) z@Z4SF@cX*3DvK1!CQ=KJrlC-%`)q%lI^|~Q%PX$O7LlV@68Lvpc!ak?UYW-VAUOFh zGBMo@%pDog^I+g5>}JbYNSsGo|3;9Lzpa#^IoI)h)*){?F|Li_NQ=O+Z}|#RGxR!( zN$-sJX6jLIA3so3)5k1H{csuqJ3)X*pBH=@;f6MW#6^l07IyZuRm-YShFe*HQ3E!> zfE!xES_d{7U;-+gRun3y?X`z~?Fm7k^b;2v#5fC&V+$M#l1$X|{A~?SJbi~SapAj+ zZt{`vB_^gg6+$W?@zuR(CG*D?r7dj?%~Yz!_JGQ6ENa6LMBVPN3IB7yY_%T79NmQ_2I*}j*heSEc%8>aMSGB zSruI+^G+wmQTVn9d@>!(dX#y)`F`o0!G4|W0n5&$D}zTF2U=qPZWN&G_jh@x-v$T2 zdvG;0G?WcaQ8LJXe0?Vzkz^aUnbx;_D1EUkJRZMr0^Hsc?+^`+Hsgg+Mt)gOLtpLk zNsdlWvNo`?(~zBP`ZJ=+Y2^E&T3Vh~cFc81l(U%4d><~D4!QpD0O>j2nDg-Q14KwM zk-7+Gr}4nEa|N-$7hVu0coK63O#M7rwe;i$bk1XGn&r4bzE$ch`fL<61*zG+_ zpN)o>)t7u-+dXZFYb($Os;3yi9|3m>MCV8Ao}lq@&Mr|H^h^+(vp1h$J- zUcaW5NFEwCG$q%kr%9`V%VBNT7dOs#&W4C2%a{Hs*2sdTAe$d}6azA-s&P-`PS|xN zpR>0+av5Tg*^M*wj1M74AN2NZ_=BrJ_8aT%%T!;!g!>#z)C2eGKHKK*uH{G>71>FP zs%ivef*0AifbAFylyeo*Q%0WGksB&7J-J)?Ywgg`(AfTIYHrR^QTf0%AGjLST{||K0V{LMq#nU=byjL#vW1h4|@^fPZj^QM%n>?)#83S z*e-~7p9BU zfe{ZDNp5OE0lXI>QzTU6Tedbr!>CH>n;1v^_o#b6(jYV~$VDWh7i{tOVgl4i1!ZOPE(LCz7}(xS zB}5Z>fxs1_oa=tCYjyeq0>@u4c7u4(U5_n;B4}*cgddKomamGetf_zfb;P80Wo4x$ zya{X^Hqg&cu7&m776$}sg?nBE4vWFY#>ScGXdWG-DwmK5#O&@aW|M9p}LW|9^-*4?blv!jkF~V9P_DXp^CQ;>o>&AKk?wyIJ)k_+@B@O z>Vvi^W)yR}=Kk5t3s%1H!*r&1(HXK3aLb=p-4aWH$_E-h3~U> zUw(KTL)oD4`ptbIY|sT>Q98mvmTcN^{WB2nwSa2!o)L3?eTh=odV5qh_i6MpJox9+Xi9SN}OQeMNXJ zqEgu_DLFZS$&G-`(94}b`^ebHS65dzzrHx6^M_kfmy*4CEYb$w!%bNA}d=;&mXYnb)>f}b^=hJynG z_H^2uQTB4%0YtXwxwuF|ZEfw$D|(1_$yUnd?Pr3& z+Wi-s&fnJpxZWeW)$S4fi3mhcl9Yt&iiAsh@o_a407<6p(&5-ccoTfL?sZkTYczYx<*Yt&+zk3hY3q;G{dBz#VwHmIg24% zM99yH8c(74ob>dW#vu9`+Gr)`sk-BOnl~drO+Gs}2k>CT#Q+?pF$l2hyp!RZ*!QL4 zpWU)r4iPG;D1iLmtl|bD$!%;7W7Wyh(m@$Ps0bhzw+}nOPi3~_;z(k-0Y54)@77Nd zT@4NU-8I9tKogkkS-7FFkdTs+Qn`IBq-n0ajmStfV-a5O8d{7vIMKB}QC|%3H8`c@ ze*vWJl#G%Qi8o{EOevVZ$Rlhq!3xp+;`XMLCzW^hBQ*G#%fp_Zo%Y-+JLy{?@6oiM zCr0q2IP&W(_x;}>%CUJ{atzQmP2jJWd0qlSZ*m=}^v+kp zXD*Dl-drj>1NnQ%#upoq1T2VYrI10BO-11bNkNRH&wMc7^5gRqa8;P98+4(q-0_=X zBSHgmZ=?~c!G+Jngby|JA-lrloC-WevOkbcyW}IdvrZs9d*zcoNVu1fbx8k+ltSLw z#k1lFj4=340C7Qp+%z9b-i5{H+}zgjd%MJA@KuYm7_lBKW!Ib50k=`onT*i7=HYn zP@Q@KL2!w`;#-?3vk<|~`$Fy9F>IR~4A&n${@vZ(hE*;coSfVj0)diQw$T&w?%fN8 zLU?K|IK!o1)mWvy7^tZ+YiqV(un0#jE$8Qkdf?ExCo5Ya+Je5HmX=nLAr!yD>JR{x z;a@Yn-QQiG=9%Qr%E?KWSqKa~okRn(t|vxHys1BY%uGo4LCYFs5{lb<-uNr@c&_gc z$I*4$zzMpQ=NLMFtGTxJqNVD3400&RiptB=nMsgClPPoc4-v^b&EAnt2+OgND7e;y`c0xk-(j5ORc9AQM?B!x9u*zJJzyTNkpcMs?hm{vP91)Iq z-w21aU+}%@;6PZ*caSCO1UdYGskcNF0)6tiKk*guo}MV2bld*rUh!10&+Z`aA_K09 zh?GDm`uX!U^4+>C-^IlAvYJ5B0d{FPLjF41?9~Oj@5g6e5sr=GuA(v1ROqQ{2P~wr z2v$w^`ZQv~5lz?7oTM8k5$@zgcNrb5hSWW6Vr$EPnZ7esW-?`FFhRt6VSIRaI3pv2 zmYyDgMlxgD7-n_g>BO~IXzGy`)Z=gj+y2e7D>9vy9qYwGS1zfkSp7&#wplKOU|G@3 z%xTv)(qi23vBj-}wG)*1JYCn51P*!RYLGbDMGB#)U0>BkhFp>k*f$@dcg~OBhV*_o zB9{$)A7@qRx^CpsrinAHRTg%(F=rv7L-LS;ws&oix;Gl*uo+>xwzKXD=kjTIj&P;m4k^R z%(YYq{lEKv8GX|MQkb=*-X{^w4+@HkrYB+p0u=xKWT81lZRy{=#_|5*612ITXGiCJ z>adH&WCkpM&FQ^X{RW)_kb>~B=5 zWp4F-p4EZ0|J9?-iR$?xZdY!xMr~uoMNQPmhh5yCz7SLa8*#s$ zrCxv8^#m*nh@^SYK$B-6a3DvTExS@6A(IAE0Nw($*3i%pkONiK5T%S>9i*vdrv7Lc~C6e;1B6WZJZHJ-b+6V=1-*4x@* z1=hzZ9C0hd5J^C=sXs%1mrF!MWOr@cb7x80F)3;;3IVTm@(ix?@JM*#R3#_Or^q=*~2lvdI!hJ0l}$VIxhA^p@6E3Zm4^mbB^d$En2nq_1DkQG+3z zGfvFgr(tANjd58V>ROzi1@HcbXL}dV(1iGq{SN-TE5DZ{m$xE|f{43Od!4kd$YM*j@1Zi5 zS*~gN-dz~IVMt@D*l>u7o?$e=h9-Hr2;_Zk6NR#%FzdrhLH1(K8^vDz{u#&mO6{B( zriuy*(g%tg9v@(?9ri5l1bLyJiK$y|^7+9jF78F}AAIJ$ns@xGC$01MZQG?D$ybmU zh7U-wK+Z*jC77pDP4lee^XJ+6YsuES-t!3;(WWGAmPWvVm}h5YCFLB1gu$0wIP3%7 zeG4^}Iu|*pwwRjcfa?hmy4`Q})YY?>xDsByihOL9Kc#Z@>cN{`U%muJM^B88SN~}0 z>Js7Q#jmfe63IH&R+oZxxzp|xNPvSS7)wP%V_{>%6)HbYsidg*Ha&g&_U(YpfVhN> zgTtTmX$Ta{WkPoB*l{P#+uM7lTL+8og*<&t%~Jw@Y)s6y?c3+(=DJ@HUFXMwHlm*# z3Ly{(^Q@4WXgcd`XK$~oqq97BNmEP9)z$SF6_pS_|LyK_h~x?3&LG+b1_}QD`-=qJ z+*XyM1%0NCJ7Lm6K?5Tr6||u~KGk3{h(sbMs+fI!MNUO!w75Y}PtU}}#0X9bvEutC zEbRFGXlE}tnUVcxr>^A2`-0Y=OnUwH?NJvl0N8eBTSY@SXD>D~GBPza1(Z74?z@W+ z3uXmug)=Yj$1x7#_YZo}i}La!j3)BMiDj~xj{6S9O$J5IrgzA)paNnb#9(^Q_3)BD zq`wXw6bT6Q49j;8{&4_Wt?wn<_SzbHTHb{s{)hOxEFF0@?qou)p@oG+p`*>Fh6%5R z9E$t5H`yx1gqM87r-7eQcX9p4d&N;LKeS!UbOZm4-Y^{6&uXffS*@1CoHia7zZ9&@ z9bNt8`lG^o133+ zZRfe{k}Ydekpr%Hf8pJhzCOKMD5%asX65IKK|N(#c9xP>48|g}kl2-Jc4SVGQ)cN) z+SjjNzbJr{GBz=hHn(Qoll#GE?(lIPbX#jHH`zIvW}X!vtUPdfM(1^meiMsIOH0dm z7!(AscLugGsh%h;E!|;B{j#tyhNqPpj`peqEtO^UxwkjgA`eQO31t!Faa`CaJLS@{ zGRJo=U_t!*J*+asiy>BkV#cURdU`sSPVS4z>&J0FHC6AxipN28)Q7-+0Hg*-nv@!u zjuviAePOBLTJ3yiU>TyCn#kZla|$c*gGX$x{_d%VQ2c`mVcx^xj%6ED?#DcK-VbM3 zVLP`>c3{X8`gvQr74AXxH+I#0KtCX}<{E40o>{rlNi4l^Bw@#R!$k--_V;ILq*9Oz zEEF2zIsi1pLv=^J-S+<7E2DMm(!^_&N2^$rV!$@%fvUhL*J6_6k9gH$mikWE&EI~s zJk?<>w`tPQ&~QAbZhrA_NkxUsXt9Nam1J@`JCBh51l)CMGU=)|L zo>i+CoyEjA7*5j)l@-#5IKEh7q0f#iC> znH#&Au%Cm2gHt{fwkG;yWIAO(r!*Jiet3xo;1}_0Tzz0Nz zHHQAuxf+lpo4e;c+CY~KR`+9ecKb5_ZGHWhN>79Om|^Cw;&VdMkYwLwKGB$v-t8M1 z*$I>Ys;0J?kElI)`tL7t zFqD$ynO)&1;+MZIN&Z095VP-sPTVHa9M7 z04NN-OsGp{Z}*TCFct*(l#tmVyDPwkd@=?NjzpS3z5>J!ziP#1A2S%LW@q;%+d}5$ zRTm6?sK&%`vd42daL?*eCGT{H#Y3C!AQa@JJ}*-ZTr*P?5;FP5%J=#zIQZXiv$JGO zdAp>ThjMm4<~wuRWr8yZ&&D>fY^hE4@l$bp6ent=45I->)<-@p%l)a}zQwAskJwR- z<`{b7JXHY`vC-D@T6Da@V|@I?yb%=;3Fga;5`x^9Lv&Tum?YLG?0`-qdo11}x&Bfy zkIs)m1Awo|LFX1-KDhqpQK;=*3+>Th_FncOrJnWM^{gq;xddI7CqUkipXVktT%rpF1_0V?vu2BR3O|M*D7J{{v-l;9oq^z;BQtNED=00`^$ z?4h8bI){aP6*!AkyBNe>A%20^>^T1T%CoLNhgB&@l4GtF65~IVov& zk^@^@3|0oZRUQzVsps}&o0(Nc$cm=KhtFwO&^}4&eye-rMZGMy7ukl8nN!Pf$A@{v zbunuqJx{dI!#$0Q5kW!B$;vG+y-!=UeJs1g)OR+1!|e)rEv9i*F49@tvg)#xKb)vC z9tMC8JKu;ma(rlq!)nxWuZ~-J6Km@0=a#yYZI*YgFG5| zqO!BIR~H_88n3LbwnQ(?&Nex10pI;l;3J3`6sPH}=5%?P4pKpxNd~=h=gwInXo{{3 zxi7@WXK0?r!`yxPuury@AyH4u$HxaEJjiley@(o$c@i^uO%t7Zoi*7g8caY%=>zDF zFn)SGDl(D>PBg*tK@h#hgbPo&^1(GUJ{y>O@T0gGr{FciwI8ovANMb)N(c$N6T5Je zkE)4Ar`~N_hX#5WhvVV9WOs9N5|i;g_&A|_Uhhyu`tuW4T+Z_(Jsd{xVG&WXSb}w% zpcS+IjV}+prlwM^p1tf80cr{|=hU)LJ;=C8ZZDd=5hZAGg8Hyr&iu_eQND98l{ac1 za{4w%o^mHRf+@{bLV~|t6HOuuk{k3T^9Nc?im!m8Gn9D`S`s9ae}$yX5OhWR=H7F8Sm_R&s zcEZf{p=@LKg=Il%Q5 zIQ-~vB7yvliyJMq82FQw6!!Nq1SEv7fBz7tw*t9{ZPUyW>+kOg;c79EU_SV@tC_h^ zag@m_x>-2SG>3D0gzXE6E&3jMP_#TiJ2IHCh)|+Xs8w!dfWfGPO|$C_E6V9 z+E0^NFCwe4y9=tOq=k&_o$wDv5nn!}t-B-bA9m4?2uB2PtnFiW&mLDBn40Rtcz^EvB zF3R_;V65w-1h(}Ba$!033eUdJf&?8;Y(S=!{3tFCdM@kEf0+Phv5E^SZ6jj*Ey6rc zhz1fDV}sr3#asd-J+p6m{?w2)K_UEGF+662Z-p~FPn{q>j4b)|buIJjJ-n~eR%)rG z=`WgFAa_D7?0$G@3X*Xg?+Ym0_L(Yc)z)GlIOTgLHFTzQ-)%Yz5v3Qan##(0m;lA7 z>BCkM1j?hwYj*4Sm$~)NoRpJ|*i|IKJHWZcis^#1Q`C_2)#jTHD%#HJPkLAT#x9Rf zV&=s7%7P<<0{n>0?WSM8jV6u*hH@3fTXx*Bp{QhEx6#V06Th@uloWWb1>`RNkk2Qe z05`ga*6-3w?ia)a-Fq@)>vYuQw?K0urLKYkz^9f>fnVAXlNlC{a&&a`8~U>B!@XTA zl8d~>18m0>00!%weFWo)T^XhnOm_%YpgFm|U2HX97^)1&BfrqS`)W|^$TD4sch2JX zHa4r?EJ2$-MJ^F!pUu_nQ!!c5ELpB4TVz}EKsMU-W zQ-}#?R9eF_g-p3|yZU+fXv}Hi&(199%kc2wCm=PfMAVdygUMp{nDC8DpE^}gPD{`C zF?wpm1a>FDP#zG?ljBf}i;DouGMm>ILle&n357>Wzw^N>xCly_T#ZXgG9JQ(ABWP) zH7%{0>--j!gmPzEVlZ)e)=+=v5lYJPct-Bir*V)B@}KBV!Vq~|82roXBl6@0p1B)w z3J>HjZ(Dl<<=l$vCtA*7$EuHHeK4v%>`G}pL&ul#GJDo%8;Zf?C?69xYJK$_K89Zx zt($x2zTVMe$5=*YB7%AygoL~{8n$d9ET{ybcqfn6>?O>Fk83yS@ZKT1ljQ)ShmmoS zK~Ao=k?qzB;|Y26+TbAbI-&h4egd%6QDzxm+(J>Bw?7Yj4vC2ovod{~g`;|PcsahS zhLUD{mxX%9k)!U0A~(7PUR*t^s@CG!ojY7$+YYgn)d7NWU?+VZcU!$_7rW8kq?SwS z*Al-7W`}c@8|z!=xJRnYwCe(*;bvr~qA}+z-lEtmx?zZ-FW*;hIE~BmTfi9m*@MhF z5&7#7)WIILT4>sbR*vGt9uvj9pyI$Od7LyUC3AhC0qY~hU*XCG<5W6;8mtqISJe68 zwdOUAjRF4ty_sgg1qB6JSpqFo)mKUSggBS}64wCEDu22zZR%v zXZP_=%1bDXnHB5;+!pw12WZdVA>fTe<=bfSwI?&g?O<&xG3PIG-AKKj85k;`Br>U| ztJ|ArKMG9+5c&e-mX?k#vPNfcIJ}|hu6dS-m{^S7Fl5Y;On!2+o_HS>eRgpZP?*nsa)vXMPAEX%g1n!#zT}yo8s}y5g za3zJ?T$+#tE_Bf>fUBDoQk3Ilxq3fHy*B98Y%x>xWTP9E4JYynMW@a!Lo4SCjYz)L zaAmp`hw-nNLypN3(|qc;2BozSe11?$&N!loEY!Zxcxj)3ka?tPY1-|TLKlucB4uGaNl8i9 zba+kZ$j`vc*T3IJJJM9c-{}Q_1F^X-JOU}&7tr+|bz6Dy7JwSPX>-8LvKH?vDK*?B zu(fO7Zcll6R~boHvG6V6k;XoF0oz6GiPE*i7qZq=M&uWMyHw*iU{Tg-Fd~ z`P};M=u}y_1cXrIRM61zIc9IN;4%A86KvRhj)=5Fw6^m)CYxKjC0RMH!~LhX)8;@Z zKLnwNSb=%wcGgfN;@mI*>9(S6mnRuYm3)7BtIHg{o3x% zfG;{6ewxNY#2;-t9k<<}p-cm{J|jcei13!F<=ReC<%x+*^9d@FCzwYpY2~jZbUfcj z%kWy~(&03B!`Ehhydm0&Ja)tV&op1MmwGxN^-PROC<5y5?7W#vn=2z*;W?=L{?a5HgHT>4cx6e?^7ic)kKdZJNp6faG2Q=A(o-S@L93tNK3DEoWx~R@ zPuo3q@{beB{S*L8deolYx;I}MlZ9Se`L!f26&02H)goCR0HSZAw|h#jR@_do=r*A^ zuXM?zU+F}dz&adELX;&V70LGUq3BTu{WhF-ZR81YaY>4anU5cyhKyxXXrk=CXd@j` z(v$euJx_<8j&3xoxud38e}>A$K_x+u5vlP6$HvZ8L=sy=3gZAbf@WfrWp|q3EivyR zeoHU#b}R7^x3i-OK}ptYzP?6TpLz2v_v)#X4Z!m)PtV^msIe*5Htpo37A_s^edoph zR4^9r%l3^quu4dlLHni%fb55iqzb{!eH>XhPEx)D7wBIeWHGL16}J z6FgGqg>N`OBz?b=LU=6)T07Q7b@S|u9p)zrk|AP;BB}XNE0JL;jS_`>FJ7E<4Q*~# z&C=4<)@JLeyvoGP%sj6Z6chyB?j!LtO5vzapFYhq4xGCw9Kn|N^5s^jZC7EAg`yxm z!doO9u}iU>0lb#hqbYMxv8rIky0;S>#0FLY8+p?2wpx2WzSiO)SO1TF5G|v5*!dG| z)wCNT*J}I3$(DORL3>#1E>cY_;>}{>bxA&skxB-?)~hY%b^IgZ^dccd{eS_j)gyHB z$GEV`nsseCoCQYTT-HOw!o#^n#9Y`>vNkmf^&(SXxbz$4APDY|M-|CC1buOwJzB%K z@@NkUy3mzNgoK2lt3CJrh^LZ}eO6Smje>k8bvW^9K!9o7jG=+S4(~%&HCh^Io*R=s zovCl$B%t=~*<5s6@!NDd=Ge`er$`ceUBI+NXy7!4(sm7 z=ZqV7IkKV$B}Skuly;xrx4BNm%5D_@G;;4!XYG8Z=|Y^&G!CGula^ldWcXy_^( zg|4#ZRgthbg6qEC3XU$5+*keODe-=c;|oDPC7iAfG%*g#{&V(cPo?g!!GJyVekk*$ z;C+lie|qhf6-z!f26GzbsHiB;9*t*Hnki~%fU~}Jo7(m!MDOL>tA>@#4=*(pMPDA3 zyCR1+l#nI2F94^ujHH=PNQyK;v%HjJ+*6zWm}S-EIxiA>nCUsnkCR78$dsC!a_V84 zQoPvR=3E>VUjnO$h*qxKb(&NJ{TDCcAwOLUS}I+g;ryKo-TR#93tkg^p*}$VBjMe< zXTp+c>gncQ$muhWy}iE_oVOoQghqak?8sCK;fQMq*4Eag9>ZhL93iu+sOUGNpLU%! zKO_#2>lM!wfVU75h^Ul)G_D;hiWhZ$_lw+c$d%fBg1Fn_m>6Z9(Cp*R{)s;rYo1`wh!#kRS=c*Aq(8ijMOkTVW2(w`JaO{9 zZ-;TlYs2=tTQkGpNC#uNX+}na4INPp9_jj_!M?M}#Z{eZxhk|Cf(|uY2B#mMIo_uJ zHSU}s7CKP%+NMI~nZ@aEauJNb+BbuNq?#8Yo8#r>SGaqWB(Hu~(Bf!fL@Jdsm$Cfq zxz&d}KY9x~fRwKmb3b_*xK?MqBQ|T2`=GI1?{>%pwsmxnJHJT?xH-D>ixz%jWnp5T zQ_!mGba-v~Q2{t$mZSH_^6XHl$KY7TOEvT%rgK~D10D3;lE1ox>o}7ffnmi8hPnJ> zG7cjjH-1rQ0t!F7727M$?;P-78WW7Lm9s*jd3IvwpDU$vVvl3X#Ae*mXWDYx0VqFa za-_~=@ASjCL#o>K%j)5%I#Z7DS}=iQlH;XT+u~E(G6~xXG&4jlU^?kT<%hrWw0x$r zw!c~UTsu==_h8XkNz8@iNz6>oNq5_);Xic{xar0+-#8uc2L-d|BV?0QPu!&4P133| zq%}!rnWXY*2CmD`^Ml=uAgfD zIx8jLHlZ_TWWRoGHl#-_t%~9RNU#N`p-_u#IPQRnOqQ`GD{i$t>p;NUZr_aFP@Q;4 zH2C2)epbP1)xhYob|7klu(aj=IRerzTagu!e+vSQZ3WBo!PjiAcvp=HvSF8pyU#Abeq^w3{6DEe8<q6muc4XXq$F&T>4*klqrOT$rV z0`+1iPhyvQDUEqMN7oX&WS&>hi+zUp+d6^-Y)SL41=CV5_O2!B1?;}m9UDkYOcA5F z!1yW<<>!%$Udzw+;NeZ+fJTNDSC}efpp$Jmk{SF10s=}n&CSinDxgusN*z60n`7(! z@S&MDGy?fq-yQpMDhS0Ngs*LCx~AQq9};pjnP<)Mb$Yt7gwA@7Pw~ug@z2gtB+b1C zg*J=1d*K3lwt!7bOAGLpsG(D-*WbXa)_KYVBi%Si;4-Z%Xr6$206)lUS2852LhsA7 zexDJD;xbJJzZTw=r3r_g0NPt7A8=HQQ_xlCDj|A*KNJtXx4u;QJmo>{sB)?Bsx4=- zSKri($2`tsK2URI-(2YBA)JP_bsQFTXNVUt+d*;4xVOIKv0}%a=lsX7Co3&kA2t!= zA{%-@K)hCZ@u*L&UDG`uxR@gN+tsx5447I>WHnEx4y%~rc9Y8lCneDhVbx|yS{?xW zup5ePT~f!1{Rj043jp;}G<{cki7TqzT+=)jBAg%;w7GeLTxdPz?_B>0(7FkqNyEkNs)FH3CiGv%p~{Jqm43E*e!me z!?$#}QE0i-hpDKjlG}^rlMHqQSGbxhnsP!jj>oE#YHfUSLc)V4qj&G#5uI7}&?gpS zUblUR-SlOD82ioAjs1thP+X{DBN6+^=x7UeGh_lIE|7GgAZ>;Ta5_`%R`_LI$K$GQ zkLdGCVoCu21*wt7Ec=Dt+?%f!2lu*c(7*TiF!vM+Nf)|9P~?5?4QFmN64$b!FLFRJ z`XQT`5O=UH-q<_Mmr6q?b$FO6L-xS^6T$>3T$O1)TK9{kb~qp`_J{iALgb zW5;SXRy~=(9g8Ym_aNKpba^!vyQ*hQN2O^D;2Gi#My6Mzom^Q_g8gmf6Bit4J=+!X z`+G3-6L}x}p#^7F7VsUe>-qX+`7fZr110a|`-&{9FIKtHHuC7&n3%#DT{lnLSuNa; z6UUD~kBVxL6!XteeL~V%&<-=+Yr(%-d-be}f+)16i`*%3hBSCZ+Lf1A!JWtV=H7i7 z{J8sh8$1NBLN$92&R^O_Fm}NE-hIP}1I=MJGC2R*T+u8B*buy!5jEs!#z>$}~Xe6LTX<;z|m2~j! z0o$XYt`6luKs%|4i;<-TCV{mZJO$`eouXCgu#qwSMc^(*h6Owl?1|f zAty`pD?PNN=(rn8UJK675&uWAlFUiUBy9RCS-yD@O1nJwuYo?B%<{w6LI-tUX};sc zSQ4b*4PjdC?d|_DE%zT^KR^^~o)xuG!gY1<>BQa3DlBK8!;u__!$@KOf(<>MhJ#zr62RK@F4d#-bOa6F8lH?J|A z7q2-q{0Y*N&IJbssgAXFO=ez|u=6gD&-k*b`aV>1X=rGSybL;5!-U_{Q(vE+oXo<* z)09hUJm%YXl?i%Opw=hI9~Qc0?_6K~)BXY*MAi6CDFNstk_IVY}@QocZHY` z%b66su3YkB@g)$*9->8Wf!uQMtMdfPkK!@tBJeEd^-Q|h6T|l&bz!Wo5mDB7-u&gB z$Vg_ZgH<KII^4*J(z^b$5}5-KX9uA6hP*bLHG~!}n%kMr{SIfO9qY~QC z($%HIx*a`(1sT7HU58Y&D;KQ=1P=oFHkTUPi2Kodm2WOHy$S&aLd@!veDP;tXA<&QUsu5Jnkml`IdY4 ziaVSYK68ePk5817ljpn(35Osls1iT2++D%(=@YzQ)jB(SCC_4X-D;!Pf5Yj~bVWV1 z#${yKLmLdR7!J7*1&r&)w@UxDCX1x$>~Ayu+p|R*oNaWN-wGbCE}5OOwlFX_3|bWq z6M$xmtLiTEw`Hzhud|`a;dg!gipS*Jy=gdGKt@J}L7}m(x*86v$aZer>YO7$G}nRV zj?wRfl(dC>XSrK@t@e*P5%9i+66FTg%kPSy#mDa1C_w3^`<=f4ws;5|`?6!e|G1zT zm{J_B^~aAGIFdt=rM9L{SzcstI>#RsSWIY;3&W4;8@H+tW9oFTL^PkdmNy!~E36yo zqIrTcd48Zj)$+!>C)Xa)smn04E>*BPKV%caPb~S$0Zh3wn-e_0^I>t3@fue(&ob3z2sF?0B&96@9z&_9AG>|roO%k7cP|C-%ds?-r95=-e90CFAoifc1}*& zz%gfMihcXw^p#PKA?UMisH*x3a{@0Lj>{0vsSQWr79i96?b|ICl}2Ivk@LdB@UZgA zO2|xH!;}?(i)Ly0_VMG#MMXvMD0m=%_ESFh}Z2|YPd;DY~kv*>SZ#;DCw49`netfR2ZlQjbWyy zrWO_!a6*)}wl?^Ql9E{HFkT-u{_4g@e2nzT?0%4WJF^eDUO80NCA6B_3Q-FOM-N&ApeqjCJ>zRCdeK+gcQCdolS{UtpGkxYOX+TB>4ew zBp(8v`S}C{6H>}UYI!1+){!(D3FQrl;>~sxQtj*4C~*0e2XOW&#Mq?%4_ZFR_rqax ze~g|v=?6G!a2MqkrRjb^41o*;gKXP!uYC~8?r6_}>FJG`0jb{)*c^&<2`q+|Zwt(A zbCRSf!O^RvIgv<&{|E+ez4oQ0L-7`d`Me8XbmASPPmmL4|5_FD+kf-nuhIW8K0^LYMj-s$WDjCFNKHp@ zq~-5Hf87tWBZJ>@^H{A(Sg4>w06vHb6x`tQiUNr!*Tlf-9|NdF~8n?wHBA0kuu zSBU`O{%;ogdp~TlZBwF->!BA`zGgaOco=E0y~DmA3@t1C;+o(jldLSlv>WOf?+0q3 z#gsmV=s`j1-%{G_`FBW@ed@zZPHB??Z8qBL+v0XZmSPoYV2vTo~ zK#8O>+JpE~u8VY7bprd+1{_w+s$?b3Q7O^Rv!sR=OG*)QvBVgfF!1qp*D0!9xyBuG zx!mL8!J9joFCC(!byAYPuCq1AuAfz{<@3(HJ1eJOak|H+t;Xq}Fu7GSIybv=(bU?6 z^IhIl^r~w^meDaI(_;>+vhm+(CGA~fM2gi4!s{Ac9j3AT`spGUnCm}I#^%V{@+s|x zt%QXiHy$g5b5Sf&i}qOjsGjzG-7t$PKl5g&F>bAs_#=p^a$8FM4YJqE%eySQ;~L=< z){|HeznnlKHJ|IVkJoz(if#;lvMH2MeB0jNjkR=HYzvoc&kB!IkywAeYIbQio}3`P z8=ofM+?)}b1Z{&xp=4B3U2N(TesXAlnxi`OTRek_OlDG4bfaa+HnTzUd@-uCqP$90HqE^H)cge@=`vWl`tE z7RuJEK7RO!C309JL$oXPqW-a3^|DLLbX|pkAtAvbAuTzLyRB3AoT}o&QNa%y-P~_? z=ITDz3~R`YP&;b6v@&KOk2Jp;f$6^tH-Z(Vh!Equg|8z%&_zx%1;X$Aa(h@KC#C;K zx2dgTY}7$j4l$tg7I%_%**iC&u-I=663eX&afB5|w=gxpPG)tnTqY%e{&opG`IYw2JNN?KJ3&ioN-sU*8Ir+!=zB+NE-p z!c}Z;F_;cDOU)y|ZdpE99vOT_dSOc7D2UB32@P(|WIa~M#lf+#5PiPK!tz^Yo_bna zGEpl&61<30hX-jxsZb%`gvxhI3n0^sL|ML7OVKSt{V_`dKqho1N6uwj_jnqL*z zBjQf*d3okt{j9im%dIY^7W%E!bD5RjAtvjiPm1$cihXJwphOUGGbyw#06Ai0e12rG zqiQP9$7cc{xs87b=?xk}mX%wvt5a<|-S+UGqg#5(DC@6`MN zxRSlXelTV@suIW%cS)`ne$>#{XTx2L#ntM@@T z9NzaJF1!ps(UUha15O9D4~$8BhKV0L%5! znW$`b+5JPVW9um({2zB3Ib@d4tV~nP-%zQikQ)q(ItVTR`p^TSog!Kni}tYl#xCHO zmWb=984kDHdV*K7d1mGA-R?HELruPUe~c_H-ghHFn_XM#(qU#fIpOcK<-UCIdy$Ny zg`IXZS0&d~iekwx9WyHdVy#NzS#|`OKSaI~*YUDUwr!{weT0dsLT(#NrWK zZe^?KTm$3sC{*-Z_6fZWd??%Za~t=}eo6fu3xHxxM}@x=I&Bt(+H++Ontq18%@s8e{Vp~aE-YA z&vm71-`zpRA#jGrwn#*R)%?btFRJ}K_R&4-ieC7={67ac zbkc6*w`Q9PmAO2{C-|WAhVm>5(V=RQrf;jogpSJJe>A`aw! zgs;EEV)L`#g7OE$wg3Z2EQEedg!81Ee_sgqBeB5$l)nGZ;I=6}l4f6$lYYyGE8 z|KC0n?*BjIGtA@vM|}RZgMSOe|7K7Bhn)ZKX#VeO{SV3^FXqO1O{gnnNI z{P+(&!ts=}iT*`@{Y^vs)){|jL(;}a^kX23wECZ3#Xr;oNoQ|v%uOXsx&hI!|F{r_ z1NFP1bBV z(THpmPw94h7}+xPk&hhy6UlOe_jX+RqKAmysVYp@OpA(Xp$9QdQGHR%4Ks7Yeee$E zLs?NpocJmq40szZ+Z@m>CnqHTjo4Pyqi*7?kRAg|C9!C&wny;@!ZH$r+a3*7s<1lV zxEq$PX*^d+?mQW4*Z|scQ}=>P0gjtU=G{}^>lQ%_$o4_t1=fG+i($GL4$-d2j1V$u zObRMZU(YDbtIvW%^o1 z$lTujN+iqwb6t5M5QBn$^w`aRe}q^@VPTK^1qj)O3rk-eBW(rJHpZuYf71Lh&#&n1 zQ9+aWn1Qlwx&Xv*e@SsFQE#wEa$|p5W<$|UGeu*TME#`MYOZTqg5e*+LrWoy?r;wt zVuV(&6b0`l~rY{Q|Bu z7yM^&*_BvH&jE0)-vy(#lpvS#P9Ay@r07QcR`fyM#A8M79-;GhBz530iM5Wn@QK!a zh?HL$3PVK;+T7r^=w0z2G0m}R)M&Ks%$E`ePvQdlhAcWyxt^qzrl4Bg*XMM@PS45Y z(;Hmjh*B3#oD~E~H%|~cBX^Pls6V79-1j}aZEI*7EPR26%4KcEu?*?=S)v_ZT4h{1 z^Z|eJPYIZuU0kp0dyj!ZxwONAV{ZnUbSA4jzKjs{4N3q&TKk-n!y&1@X7j&~3|3>*B)`LOc+tUPc?W_k5{(XnV8M0wR=6 z-3lcr>BDKW&7pizP$ljM(9Nde!h3s9O1sp zlGFNIDclJ1Il>rHg80^TjoH@2hiEffV?KXg_@0uGpuUrgV}Xt@{BPq0XS#n2dAeL$CDjvipm-avR zqsaQ!mPf!A+Hun?t+Wj_8attk5g;L=&4A~fS71BVYY?uN~LPQ)SoVYarZZMm$7I|^5?UUhntEd z{}?z8J*-jse7HuRPS_4kd_pYUA9f8Cnwh1=Pg9iX`OB65=_maf`KMb?8uee?PVgW8 z7#5k#rgr~Lv&{%#^Y-6#IP{yNKmGm9VBz=f{iiGcGe{u~|EI%2au|Mz4@4UzI{(v# z|Ia1``|B^k{c}yfRS$B;!zLRyV~$@|_Ag)jw_ZjJ{9hMu8i(IL$!5s&dz1VbLH$91 zzxhI&p8Fq!{?|#7o)d22^@i!E`%~+Iqk3}y@svn3`1^!6Lj@9>)81u*SwftClHJG) zfS_?Jux#@wfhZ*M`{Ut%4fZSg`Q^tTGeE+mpI4APrbZrbMc4^_s0#J zTqecHf6D3RhCzbZ|K#ZZJF5KNZ<}QNwYfCpY1q7nzx4B#A^Mk2LeEW$euXKRH16`h)PU|Cht?rfY{`U zGkd=~|8cv3)ZeEAJSSO2X$@MS$cs%W0-gfNe?9{kkihl~sQl-2USzg%17SA(?7yzv z^rsKB?)$j|5Tg8E2t-&g1FuDdAP9dD5=6axl&a4;^!M5RV$ol7mDY#>+P?-#B5_aG z)`*O>E<_EIgv^XY0T3k*WR(b`NEd@FyiT(cRQxPs zPg^KcfbZtHFT*3T#>j?CU{l`T0z;Cf1g;Z20ud(C>Uz2utJ{1l;T|?+Gg#Ff!#4x@ zgfzeoXx}_7?96yd*A`}sh-FW%MXvR_`AMu!#A1NtbW@RM8dkz<^b!o0^5`7LPriST zg?FAX2;2Q=9OU%GAUdXKH%vHAHnPaYr3hGL(07i9B^E zPt}JV^Wu@sLy(|6%1V`(7y+SH`^0|mpjqRX)((d=quAJ_T$-*W!h+Ngd2we0L9DHw z9qU8th^nf1`obLY5#MKwbkcu3w&A=TF5+F${4#-TePzNX0(sccpAUo0h@r;K%DO%I z9>uph(O2|HqAhRf@w8`9T)wXOc`JEEuP<^9QHOzwudZx9RB?X?T7Nx1+`%8-{g8Y0 z^cyx4+tPQvtLWv~*5rC^2>sf;_9%o2?T*F0JqP+#u!mlv)>eecwNj8sx5JQq5^dhQ&L7-i86+d?b6 z?($#8VrJ$N%_uSGG)J4OUPye7!W8j-y=jxeb#|l&Ugw^%$dFQ>)fl6vH5$k2|Edl) zq#|%Db>NX+*-BboLQKvRB7Tm77HSP0HVK5(&&JjA=*ixt*o;19)YZDYN%bO=N$m%} zhA{rOA@<9mJ@B*PdQ8ddsQ5#VDx>@Q1R+f7wSf0LQlvz4r8rak=&d;dx$wj$92~z0 zbsA%gp2pSp-7~pu<`8bH^;+oVUd1`g4bM;AFVemXS9TEBd2W`iPXyb&58^n@*40 znn_8I&haHB!Mc+i4a|CV(cHuhjH?wbCVoruu;8DQ?Dq9yv2!&mpVlj7;<{h7<=>z3eP>!* zR8XEwW;mw*^Mlgf9-|ijmk0^KS|E0J*rj5%o@!12QW#J_x)ZGQ_l0-_#XM&jVdD@l zfF8Ynj!oNG%jKRp#nPgdvoTby_s^kk1h}vEZgmtIpB&m4N{!F0PX626)3PIl#g%)N z^1Iw&S$}Y`3d2fZmALjV-{d?c$}9IJwiBpDPM7Fui8seu@7rYP&(+)@^NZ)ckv<3S zB!5?=Q|RLJ&+pU4NIchI9-qZ*-Jdpn5yUG{o5NoU9U2l+WsVBP%>)?=LBfAa&vBvW zD6XOzeMcNpb4Ne}NChK2jbOd;>3bCha$iXG4DoLf8HGHSSI^`jI+H;5;TAbm*V{k(2-bdnSH*LNfj3I6==M$Acp z2lR+J_jb;Hkj)peX)Zo>Y#sDgruFdb%yyMIVUky}<;(fATwGX}*=A@mrZE@*RI%1| zhYz{A-i?O{(w3%Btt>57XWy+m`>jZ~C*AVYDIZA5u&P|SGT7_v^roqH#V;Qni;PhjcXX9eO9; zN>EYd9Tu|82^AWD{rZMkm=$DvSmA$jQqS`p(7kKX7h%uD2rzLnSv@`~A@1m=s2H`8 z`{kYPN~=vLQeoHG8uw%QX;IlR?{#!ZC4)bvzggmr3RSdc>m{jR_sY7p#^9pdd5y)2hL;j*Ao=raD&uLE+$;~!|N2~*f2(8 zqj#yes^I>Old|u$u}!_-iGZ$EoqT+N!SOMpKvcft2490CbAQ3K=t5p@RcNk$L3*Lw zWA-Qb+5N|-1k}qbg-$ZM&IU-XR)N>9Bz%Qd)682c*L7@)ea z66JUai|O}Is-$67kUQzHG4otaZ(Z!qdM%x5cGGPU?KX}##%Yu_JorNSW_wG1=;MM= zB@vC#l;qy=s;Usk&4ktpiF|m?C9!m0FL6~%On)$ZiFMPM33&+sl_+>x00$NaB{?&nr``M#vm=M&F60llosrf+3((IGoUha)f&fv_ z9p-kpQZf{{CuNM;LTubkL-`izqY^TMnk?~b}kF_@7c=1U-Y;0KS(UB41 z#X$heYvo8d_pbDiQ$3~S8~|uk;B&=j`s)N#7*yvMwBw-em~ zSw0j86=^#mLK_AXUS9_4UYUVs;L!sXR`bwx-_}g)33yR%PrfudZz{*B%*ldpZPh>I z(xXQ#cMrsijFs6QA(jmeY19rGdOYZPk5jU-p*j5g?8CY%-G>eZiB-5|gSLhpGk?v} z-o#V4r71VR*nK$ZqH+)lWSyZgRy;V<>Feu%>Q>p5~*)^(Ev)=amMDtunU!q;F&E%uWc9!m( zQH4`wua2ebWpFwh_TeeR00=W|t6-i?6V_v%CBx|#eCZjU9(&SK-?ieqU!4F5+{)SP zi1IxGbpB}*wUA~0c9b9h@G|g@XuOGd+HtD$#@RKvlAC=J>nk>g&Rb0-DOmIG*hgr4 zjnlBhvy2v7LMY_c`(|`wEe;(~uqP^v!pX7y{DJSs2mmFh74J^3f6}oG&g3J2=Z#G? z;H|5^?OB=01Sw6GbX$szowp5_cr}{qMXZ4|HQ|=VQaH-@m~lk(e8IF|LroRc1`^!n zMH8td_21Z|vJc?Gi>%u|dCAU~^(cLT*S?Bc(2@ZO-tZBIlo4J_V_X#?O zIZxONj+eE_D{Sy@$p9cbgL7n5*yI6xEx4+oY~@p2SQ9c1ZZXGU`Pr~^Q8C#SpA96C zrhY?wv-Y56*G0%1-`UWOt$$n}btom@XzJYUM;;<_ly%N^J*+7Q+QNzEFMd)V9zF8( z`WqLuZB$)iw+2eDJC@9Cpc{L`wuOAq1t+Of)bg|GeS_F_J7-fj`!iO0HoB*(oD|KzD_p{pN&siAztqzMyxsZTjs?t`#Qz=mY44fscwoDDSW%}Bf3b^_gS|0BNl{33~o~G^FCa``vddxzqU>h9J2& zssz*Bs1MN059EG(k%Tt%nzma1{O#iUwQFfGVeoXgbRt#;?HPz>bn)u+@F|SBvAWce zFTQ5tPW%o#7gS!)d+P$H@gsCrKF_kh((?27*%Z6Bk6d`J6=#cjhB`=R6?yca+4+x# z-BfMS5Un`(#@N1N%TpNE5a^yP*=l$_b)WgGPP$1jSupzcl>kA@^5wkId008%(vER8 z&`PksSDJ_e#r_E>jPl#>^de^C?!u89*-cK1R%0C<3Us$LeTzU&$SCjueu{D#mTDTT zQ0t<1ODsUwVa0a=_-X$EEmxblGb{7!?6;LKxqe^l@0KBc2h``sFah>g&FajfH=66B zgv{VLl9Xq}9{YTKIm`>;J@~ifA01UM;5NjFDgrg9o??@=d36 z<{p%_#paA&k(Ash@%~I{+CVhhGXQSxsW~Q4c*t4bcRKV02<5P|{W?#DwbpgfFq7dl z;8cm4H}jG9BLR5&>B%96LwUCWZdFE08w7x>B!wdyD`bjl87`m(zGf_SYweAidHr;y zCtJL~=l=CMd}71?2P1>!3f1Svht4S8*i{MUyW&S6hqm+ac6T2ie~L(kJVV(}NebaG z2Y-0ND8pDt1-E{)!-6dwd>sHTDkUD!iI2+c?B@~;ht$-QP(`j*Qd1*=JFh{U4E0$r zDLCrsd?Le5sKXdtyk158U(~&4TodTiHoB{etRk?YfOG``sZn}Iq)L(AOGJ9_9l|OC zA|0hSL3-%DM+F1|NbgNLgdPYGNZ{Pr{Xg&Xyyth`^XYs!{QRJjI(M0wYp!diM_W2m z$_;%1Zf;PD>k6tHBi%k(J(YgfAA38MDYa$z$LE~YPXZW6H@B+M!A43h9$Z;A6y;63N^(eSig@4h645}g}$=5Me(e^1 z1p*(z#nlYyVDqatvNt2R^bGmvA8%x}QNq|IE$RlYd#_WMT)*v5Wn4Bv+LSI!Eq8Ht zqlimaVLc7>4BG0ZmkJaR6Os}Wx&)lH(9nR_)U3W2XIBeC);BgBr*!&gfA-Cm-&z;u ztxT}?21PsRt7qvkJHVz@krbu=$auN53j+ zY=SSv9&)%M9WlgWd+_|wmXn#l_%DjFAVi~x6@q;q^V;_4qo)i6wKXIJ9G9Ik1f2ZE z*>|5T)T6U#QXwW9s`}idw!<`JMPYNRd6lDJvZdX3qj|%}*u?mH+4Eli0@axEXdJCX z57eufidVJHrytyW{3HbTC&-Oq1`YW~CnfaGt&yv?SgTR)S^Gr_5ZIa~88`zvCE$Y= zUBx^dc%?;YTji+s9%{i`wx7~;g_jdM)g$*O%RXPMx-X+LU+K)`SCsC#KagH6>h@PI zHcET`a;?vURIwdB@}R>2Oa&)gC)=y~nAu%WL{4WR2AA6xe;nXPuYQ{-lSty}dphO{ zxYxPzG$_>4GtH}oODl{R2Zx^!k3HZVEO^;;x9sf{kq_Dd&xNSYvkipZ~NC*?ihp(Xzjj7Z#HS5`}`aP|h$(fLgRJ6_?If$0gK#f}Spp8!FVG z7T+H43u`e>@&}=qJLI1sPEZ88FW?3O*T;(BI~$TO0Ll++hOm!>!=hN;k2)#-*PZ;Np9@2;=fvejs;5Q`n5Z%cdqwkKOel zzHMP{67-{~d==Eu$6Xr0K6i?t=Y~M^V=D~ohTC>QP!&ddLcb*}Zu_R$UqoY!-zK=+ z*5dMwP~nPU*#ug8D0~ByNJ|&S{&Hao4)W;&d)De@F80^2xcAE5ABqydtp=au;GWa| z&yrkT4?o779fx*+`E@2bp2N7Yb9%*hnLQQ9QR7&mmenYs_lz}!?l9W2iUX;F!a4)b zDLbU*97_ES992Lb|H zA*Vn5qfGiYD z&*a^`mE1u^p*;{cVwJlS6Sc<1HeR3yQ90w*2-XYVwHRbm>mLYY31A>cx%digF0KUD zQWlS+I7&=NpcdiqFIA7bt>$h369kaU)W@h=hL6{np@DlL0qOcnc}Z-gi4QfiVH8h5 z(9(W@lg`?)ii4u${!D9G?KnlG2(c&)Zg9$}|}zcxtg1iAVJ21Co|`&KB#ixUn1y_bM)C~w#UkAx>CD>Ftsm0;Fu zcDjLOHKcFw1fFusT(7WjRSpY6IZ9 zs(pBh?gv zHo_`0Uo_%=s z;NU>s3C9%zp$u5V?FpB;xE4dG?`5~PG|g(V*qzs}SA?Aw(!e)qwLq45hI1LdOiD=L zteP=sQLY77rF)v(Mx8#bBd|X#D;>j26=k|yjvX9iwBX% zKbZ-S!p; z3P;@non3|dk~dI6O#n_u&W?MU-@79Kv>uz&EA#0LkC={HTd@ycj7(F>uvkRi{)m~m zEVGd(XMgaW8<7MVbh>EBdTDoqC(T=uH)uMcJ-Vh3 z;O_1pS!0ItC;P(6l6-rSf2DIh6_uY80jc$7l!Gf8uCQBwj)w22XRQxE1uys4_G${w z9yrQm=vmMD&={b%0G7IaRs`GKhau~aHd*|o&cCWlN&(fBA#AJ9+H3DPO~MQ>^CGM_ zY6Ml{(Q5K}EVxiDno{ixG*y10sPC=EBu)zr_u?Ywh)Q9p!TImR@42t(^FP&PY`@|- zgkJgABQDRwz7_I`4lkJ1*2P0}iJ$>imFFTl#ULAy54tp)ABk=)e^rc@a%>&XdFfC%M3c^%V_-UiX%KgOp74cL|uF}NJPH4JHpx|Mrw zTbr!|3qp=$4-_K^wkM?I=QxW%hlsTA5T@F3`$Y8q^wA;>9%1sBBJ%^T!~weoKu1;8 z8F00cD#jdUl`R@9Qz%M)9ezlXi;= zJ8DyE0YEY=6kGK-mm_YyocXKfvmM?bHYKGtB}E{14^Ile(`);u$6_^pWl$VW(|UOR z1d|33pH-QPJCsLO1!@sMrL+J%%958QED2>DiBo>j>*1?lmN~u~#FM4r1t)jG_03bt z_EIcQjFL!`=W^@tWx|DAVj`%?}x@{>f-QTszAESU?E0que$X;9vK10-bG)bubp ze%g{#<}VNXgH%E?OG!asUNTvmXN?S*hI6g=J>oWW)`mGvH+LL}@ky%)Qp7`Hmv6`h zd*C(AZT@wy!{Vh{t7>b%XR2jCtyrK;fDbm_U`N=GIm00cOB2v+F!?I*Y4LqC6d2y& zw(t{7XOt@0F09H(=Ie>^s|EBNGuG;Y#)}{BO$3P z8OaT%E=TKcioy!X=q0#ib4V4D8hf0?jLZm=#*kUC3wGwV>dY!gvCoYydcaIB=|iRt z@-$LHfC>;@Ar=d7f1JbLVj}@#rNsNYuivA}m4bCAaD0d_QH7gZhvgk_*H6EZ3A1ZT z;l7TZH=LFf+EWRHHEG65j?8}vxcVKh*cZiKgL6-c)C4$0O6Uy0YU8Au7ThSYn6odE zw=4M1*X`X(uF1oKmc%PgS|lfA=5Gwb@6U`jjXI#>eHO~^lbs9`!}eGZCZ0b8MX@lyvFN?WMg2lkDQ{xuAzk zltkS^li?jbY4Uk6sy^dQIeE{~QM3xDgJXwsXLHKH0(RWxH4?UAg!??LF{S{Mm*cIb zp{elzm$H{7*xJxw{J>x1rtz00rC2MNB8|G+=7DB7(E#ZFV@YA<<`!|e+lDGmBZ`(m zg8I@{PrQY3!|o>XuZrmV zcDwTzYFIuaZmW<#Z0Qx9u#+1Tb}g5`{9A7YZQU%Y52BkYWUAitw#W#~fs1fYhPX^u z%R;Z4Q9SW0(4yd5<+L?R!B(?bn1Y!BU;c-20Z0RN5V&s2MDMfSZ-`k0KmxEWxLYGX z@HRVxAZE?#2K+X)U=PIVtsD!g=kpWMDMt#c2fD3WbS#DcB-E7dSFv~ltW5zm=PtTE9VDz zNC`a~+oJNvWf&;o4;iZvyl@=}!PUjunZ83~CKbEilnyTKa1E6tz6FCg0nk z;+@qITeq;R8>W-Ih<%sO6=&9fd^Ov7^Uk`Hy*(4aK9Lom#6ZPk_WHkU@_4L-8Mx5# zEjJJt*CEYc^N}hx(WUcCb=DN^PccvlC_0}AB|hZ8mL>)b=r>a2BRLB5&aD8z$R?jA8;c!91~iwrdsE&nfGOP+g_V3H#33} z20t4?R%}1x4Cg?Uo3(NNoW~W|j~CALK{5fIy}^05xWc|dXh;HZ?Y(#%!ms`s0Izx7 zC>W0sPW9h0xM{Uii6UX}dXpHht&4J@?u7)YyaP$|`2TK{+zz>o2r_XubO5*rMfb-p zZ=8Q{Imr!cV&#EaEff@-JU}?E_Qq6r1{Y*w_e=_;l?sn{8>EEiUKASE%gdJ;wTg^p z;rP^hi!HFM+I(EGv^R3+)U>o>uwIr~?*rlcDWC291B`XA0~}b*+2Lr0D`dQ;q8(SI zCgTCX%CSzGpk9uMpOiTHF;Zff;m?vR9SU}6wX%<%3f2pJ1Iw%y^gf?3B7s}YU>00p z)i+;og-`f{44M?QACLsT@;_$t?2ftCky#t-@(kPth90uuvmSlQ5KDsc{VGBinLj|z z|Dl>?2V+QO*BZsj+>o)TGtwpP&)~lT6#anHpu(*A1{Vad8U`gO=%xUz_6L&Rt+tf4 zWIy+h9i>?7phVrm!NQM#S5f@Tsz45w%C6LGGmk`@myGvjC7G}Gh+|x2&VhkW0 zI8YqiyM@&q^>zS`uZN8lVfkPXO-Xf>&TG`#3EKLt#7Z+rdOyEGnHKL*VI-(7;j*SV zdP5$TN_~=W$FlmFf!ZCnz{^0&$lFMFJJcWj^C|zYHY<6kyZ6)npPkHhG?y5h+=NYh z8hf0Z;{)eCt2?49E2CEs1Sf`G;x9PLo> z@c{3HlHlopwWp7T$Dy?!!_j60?M>RYLVSRzF^1eG{S{=s{keo?v~_fQ|uYS+nglSiY_FlKr z5~~3WC{E>H81!^ZBjZI4Q>6MPK|DX-rtdrKW zl!b}1+ZU&S>PPrxt3Ez~)xpZ`bz8-2M$Cg1sW}Z8zQzH%bt65SL89l1WYMqsUQ8oh zhy8><)1X9IX~Elq*-;neaBWNn7-2W_WI*|k=pFUbgKX(c5I8N{V=+3(!ehproq5v| z&#b3G)3}5dTq=0qZrH$zau= z8CZ(u89S1U{zwD1V=t(lLIO96Q!BMP*83`M-{OaOgyBjo#3cXY4dmuIzGGSwng z3;IuE{o~x2oF5}VNta{()lm%~M^sc>_GpPLJKu&IZU;#m)mEq7N(1DnWHOsBxvs98 zVRm}VwwA$SL8mVSZ*-5Nx5Jq@abvB&T+@krxYO0r8)!L)T9+^N4{XZU;Lu*xtoVpfFvnfN@|c z<-XW(p>N1H!mr0Q3bLqHk@=X+(En-7xH{^f!0TfiEdNi&1VGQZu8LxP^7z#Qq-|;C z!F|Iw@Pc5z5*7rqukXJM`6eWsv>Wg%Rn+>7ta>&0&GW+slA$#B*1sl_Vy#&2Ugs2p zf$C>dJ<6#|tu+cAx1So+-7gr$5Ep+B7?V(c-TH*oxR$s#c+9Vgz2jq1$v8q;H9cNh z{CU_%Qriz38oP6ob}N?V7L<6D(F*T-^wK5_|I^YaPUqFHJZaMFejsZNi|v<3_j!52 zW832!p6myrI{9Dj2W7xtd%1X=T694!CX9T)j_|yST1^mV)-V7Uyac%rApIoZ^ zvqsdT2BgVo;peJqM{K)RyGqkJ&n0;`lEt2y@*s|Pxo@LYyx$2xRN0`|`#(l|+2~LW z28~a~-;97xE{x4r998+C{DDsW5DUuG_hFV}8~n!~pW|Sl7#Z}b{Qiq>Z#5a1Xfl9T zDCvxL9}hV%bJaI|)MP|Ude|E!neY4^mFFsp)ipBW%p7qDz7)FHthyVMevLD+l#|EX-RVAJ@cZ#@9^;IuRF5bd1>Evss~}w^WlD_% z$~lxCQxJ>G9sLfkQU}i;TR|>ChEGj}|8+B&ya;;RhU&~NfS(?#gxCHBM#lWuJ;?U? zQRE;S_g#mmcs4vr2=^?|{}%op-7HL{F+I#T#}$&F1=-@k~o z3;%#(Y3_6}`8<%C4){!oh&!+Cf&PuxK@mwtiEmim-Z0G~%YFK7V<70)ac_m<2n%=k~>2cvgBt0Mp~#VtlEX zPg1V^YcN11MlcBrUmEGw&Is5es99YC0wUj1&zps0HJPKeGa|IY`410kfKNKL-=`~W zeoH7WJ1At}8r${T?ygOm`grSPJL)O4es5LP;jfN&|fMOoioM@$ zVrJqdVllqp;I##iVwjjX)p-o7^%gCU@Ne4DT=1$~LXVNTd{y>Onieu16pXN6cHP#i zy1axQO}baIZ0KzeRg7%`M$5q#`|l+Ogoj(JLd-JkT;x)a>4Mo*WqpuHtL>qOzf%Bq z#T#gz@gTTm+&Kqv(JpNr3U4DD3q1$%&1; zj^)0&&-A41^D7@i!)Y*b=RYfrIXRT}II*eY8OxGfM854NsF3k1ZVd@g(6*@4wsor*MAuQphBH3}fG4e21RNe{ezw9Y(T8z zlrG=b-3RbLfIy`T2jgLrJF0KuDcACkO7(xC1h>cEmw=Lb(k+uV>ozz@pHLGII2=y` zG6Q}9*1$@79bIR{JxWvDZo>$`U$?v~{=K|Ruxkb_iIM4`0>}iD(ACrP2Eaj3s$V>G z#2Ex9Yt%bnMh*e->QD1DfF&j+DX*Oot6n%?$q1ShwYK8M)C;W=(ss5BW9=}9q#E0q z@X!M*@1Z*RzlZ3{AE@t%AGAqAI|H1C!-q272HoFfj6dJGe&>g@a6(CQV90 zEuPQ9e_~D}faSZ+ty?~m3NY-snn{C{enK^;r2mq>zZ2b~9dK`8d`Hl_${#?z(Q8{6 zx#(PHyt&`LA8WW|Uvb?lhZl&m6}*CeDy$}ZxC8S4GTZGJ>hru(Z~%a>{xrZe9`i!?{Lef^;=_bF*Y_e1sWh&1}9S&9Q{Jv`>0a4 zVVcvHsO^Jlvp47F7yz$nx^EyM-7`+W6F6O(jXaWrZK-rkJEF+;Pi)OP7EInO*XRH~ z`@RDimW7(gArm$2fXl`ZiQEC`HQnee&_rBi@wD!IL=aepKAc1n3G+!BfMW{|s zsxcizy9odvjkMlXaXhqn&BtQ^)OyN z)so!>XpG}LQud0a{Avtz$x1Ah3jIWHe2#h?`F(m;f z0Zh{1`=*v?vM*t29mJxD+WSG@EhJaNVVg&S4;Vax=lg4tGA^~?iT|@m#j$O=%~K4D|s>YUq=DIT0RdE>7;NJ5sZc>`3Qc}tADAPAETQiUXoYHM|_IN;-)T%B~vYv9un4CvqzT?t@` zpbv0!YLe+(nG%(XBQSWA&P=g>UV~WViJwL?G_eyfc56>_c?C-PF=VO#(%6v$*^D!1NMovNwEv6rc`*!#E=idW>k=#$<=B>XKAK@9E zw261lTJXABU4f9!{{qA-BRnP*7Sy(SNART_!}`GwCn0uBN^?a zrg|xQ+J9O#-Nj~M5qG;U8~?|eEF+GGX zPCCh+QiB{cTfW)Pe^L^_@Up_b-a~Ie)5HCK$S1`ykvm=~9dr%T8Dkb^QVKR8)E+lS z)o7sm0NvWhA}gmKaEgvYb6;kPnPTSzeBj11Kkw0WtvB=Uo&GM>txlWvdiA@=R&OMs z2(!_g5SiBGiFF4Hvgp;3$o21X9FD0g|Fwx$!8e*5j(L9nZW=H?CYm1kMgJoJ{{Cw< z(CB(P+R6wd)sH`l7_fH>6+ zLa7}w6)(iTY)p2)#x`i)DKEiHi{gRgQJgfXF91vVkkUHB3YADA*Ii?mF0Jwx< z!@A8ldr*5u-NgbR`Ucs-)=8|?%Zjhy3+QH_8Du{I9o_(-QVu$sl(dS?kCti!T?eqm zde??j<>X6Xgt}SjbBXE0L}bM*uQKplS*W=SU_ijdXgfjv>aNW+pXc9Y3T_9-3^Z(G z68WlV-8IwSaVm`g6brIV>6w+(hTWTjtNM8N<<(Q*peM@~3ET%@dU|p1*DD1)#`QZx z)Pe{QH>~zl0d58G(k;6XUo0{)=;Fkt!YnyGy#X-cgRaHUz{ma37fkNL>!4vlKleRU z^J;R%&PSReckr}QT1Nxgr<1SpCd!(X}y2BvW}jKIU@<>!e*aMxV#0JTmWG$zVM^NYUaxh~L}tgf^Zt%zHf z+y9nLnpsLtl0f4DM0Nk@qX`n!WO&u(8!0>rXgRQrE;68aqI3PsdiRE3B`B3!_XF`9 z!#^@xpbn}V0gX?AV6yM+@;c8#4^IL>d6?lWUENmd=@ft}9G^dsQ9Z}_pVkAqte{2( zSYYfVAJQ9qLyX@6V3gGk0 z>bjzI?zZrMAm^6DSc5 zisV6Sz+1PxTaMf>!EQ3|{`s9joCJfX|KAl+1Wi4VK@s{g5VTTrSrq^CpZ`dw{^`m0 z+tASJ#_KM(&$j|Kkzw*sLh_kVu=fAs|P z6`%@)5hP^qM4r|)iM9}=W52y5`Y*j0=+_5&`2Ax<(9D4FJD`jPk0x|*_#eL`2>S`Y z{9n2?!ax3_K>PPM|MdL=jTQfo+O+=ab$P3DxN7v(x2P-Qn0k`RL_vznczX6rq zGOBU;@>?9}`{RQ;K!==q7q6xOemRwZPcJ|r0DVUXFza7ijJ8ORRxBYa{#ye5vi0}2 zKrC{)Mw-yk{-?8FFm~;^ubiW=+|E*m;ugU=jkNl6()YoXsPk07)x={Olw&yN>V(;Z z7NlRz5Twtbdyvf0_ZUWxgO|miewuB1!E2V0nivlej{G-vqiN@Jnn$uodbPCOW}>of ze1Uh|Tm>-~I_=PH8n|x_;)Y-9UVCK=hd|9R`jDU+G`R=fG-Wi`j`+$g2TgVJ(19R- zTS@`ET@k>S75$L`>Z*GVhjP~wp#MvVoju3xA9GBIL(Y)3MVq+|v52-(EL*qh$Mb<1 zQlRBQr-2)$)EH4k=KL-A?C_I+Hz2ix@bS0bTEn}n06;i03Qe&8`Olsd zI3_HKHK98*OGk%3z>=+Os0_G`y*?6f4!{{hzrD(Cm} zynfHP)Pcjfap;2`h6 z{J@yv60)BhaGwpxJ>!1MKHbKD?pL+`u@sku?H64r$^LFurr7a9!@gXg<3#JC1z&0HizfJWP+jXCnCa-wdZ1VRh0MWkwQ|* zfp4f7$;8;U7n3Whc(k?or|M*i5-kxflp+6NjVqZXH2N0m z<)@^ikCCG4JLn3)k1-!%VY35f9$|^#FBBTh$JwSSfDyH90T#TK9ozjmTTBO8Hvv2v^`UF8RB7;wH<*fCKBH ziEq#9SI?u3!Pk+E2^)>Y5{2%(AIzfco$pQLnsnfL;)t=$Ip|xIj%f}tm10C1uPre? zhu>C68KGdx{?p2u^nTQnd~$!k&_lf{n;Mqjl;T(94tl%Cm}pPWgY%-JuSDw(0&#a2DJ*B>WU46QA>WA9sUoe7dnO2wZ>Bu%M?lGlP zQn)AaRMmS%#|{{ow}ryy+P3dA{IvQ~@fHt;W+Nk4J%w;H%@)F5#C=GlFFf#+c&LP! zoN+k8G)oHEPwNYkte~NQeVGN$6Gx$oh3iBCA~ci@AaEV3>_H-ttE)ObKE?W+KJMR+i~DR7Gt0u?O8!B_27VVBUib$wJDM|uo?KFT)UnC2E3T~k^56ZD zq)9N1H)=?nSt7Bz44f%$Dv?gPn=2MIVPu!7La#ywTD-Al-(bx_IntkFH5ap1ynY+csmp7O>g~?QtXkI?7Pq?WyHCLVz>~wI zUp}>7`*U^>BE&2)z9{V+GTQ!oP*h_!=0xhHvG=~vhlbg`d4=%_;%TZW+cSBEcZKC9 zRZgK8s=Y`S@WpZXl~Nv4$vIhrhk#bk{tgO!e~!X9_=MlyyPH`B!L8D5bvI&y4CRT` zaQt-?FxE_!2x%`iuI*|^=*RIG9!`H5mCf$W6m7*0=K9?^i-rksAI?8i?8siHc9q^< z3;Mf0@Gv)}VU`;5!EXE^;+H~4#Y}FKL*^HYmt8+H*V{$hixYPz7+O}A?*^R`S3YMf zRg63!#9Bj-(>A3A{%EkJrU^#fE~AL-D$RY%cA0urc(T9C$tn7mQy@RNP%V%0NB`i!&eQ~N^p`y)E%TSLIfzJuJw&0DIr{7d?>l}3!-WItQy zl*`$_EKl1sI4;VQz_$@wtpx=ICCzDiemgU8)w8t@&9gC|qv--0U8tb1+LP)f82z)7dgi6emZ|nN{(?o{=hGDuiHvOOi5{P_twvl5 zCu&75O|~#aZB0!sE#6REJb$_iWfQ)#az83#8ohLKt+jxL`$*ppNoOv)*>ZAU!fyDU zii^j_nUy%dlehJZNVl<(f4aJnK)yrlw??T-R)#6lU$#%#zKx0q`y2U{*nvOJ$F+Z` zTPQ|8z1~9N8Z=WsurFQofQ!GxNTzCn0tSXcRoOGly=7?Fx2y?u*qLCGxOWd6o(tf%|*d4Ti(bYvhTQe)!W9X)PPA;!$7u)U=3ZI) zB9SC+LC;i}d4ib-BJVBEnFJlimPDoM((uC}mk-;U4AZDNc!J+hK zeW=qo8!wjK#~$qzeY#<#YRz9dZFJNWJd7roe|(LHN~H4Ap#gGi$PkzEIOpvFmxzdF z>Oo{f#?R=}<|5u~vK8Itapg129zUrv6xW{!p_XQjyRgHg(WXN)YEX0h z0r!L_9&m|QAiwWMEVrkI&fb-K^{lN*e-8huE2yUN;@kVL&-yye5**dLg7{z5volxL zV`ufXfkCGFSgjVTzHlu~zBeBQsa+Fg-8m-h>-=Yr?)Lfiq2vn+x0Afn4US;W_vOb6 zdst1I-^i& z=JB3sJlJwSQq(#rL()8YZ-=0Dw80~*CB{8_Z(ld5s?VdnAm=>GGGm(QsIqwRphEHg*0#W2RVQED1XM9K>80F8PB%N}$QJbP5mD_HF(HghU5EESHHW|=Tn5=&ve`d}O8>rY@j4IHb ztv?f{g@I`yeGJ&OZMtIZCH?MpGNfl&qxa7C=Lmko=1yKoN!d5E4Sw}i>E(mcw5nIN zF%157@RorWkp+)O>z2jrhCfj`cme6^q1#QmjC!BFDa9|74|#bXN=mM5^d8lX8>M+( zbJ8V_e5&kKCL(4~6nxuJ)w6XO^7Z&Q%Fm-LPPh0dI2g4jUBnhG92?m*RV?d5l z)?#oobphEgL!r**@@l*3O`()_%c@}JsY_`b_!06R1(mm#R|0#sZ%>}Bf8+-bv62!U zeO=~!e!Rt{Uk)Z}I*zCn+$uF|o0*zA1FW?fdmc5hH$vhlc1U$`5Wk&S-i&$&m?qiy zRF3&hH7ADbOv?q-(QI3r*4)Lrf@j)^uWuRn)a*BCoLRXvq+?9<%jSlgEEWs)%;%;S zry?`JhTWMol(L3u~DZbT{wHm)aG;Eij8HQ zxN=eb!-Zch>gv32LO$=W?4aMvE`??n1X)-*CJTim@XH@_j@2FXmnQGmM6~|=7>x*B zQvFgsPmCy>ypU{LFl`|h%CNIsarri@dUpkJuc5iKv*v?~V)_>Lh=VzPQ=dQoN7R8) z-;`zn4GoRW;3JM;k?B~0tv_Z^DG;*_4$QArD{B^_#am+A7*y$`%0bzy)ajnFkdJ=p z#X&fIclQrPPpPh|3I4)1i)PaY4^==BKyZ0U_?Ci=2WH<98_#R_+qiI!xb+!`gIC(qpwBj7whj z&CQt%-KXX?u@zq_OI!GRJZ9#CyrimcG~Ao{p0!{`kbb4M(}-UQBa9|GTRrI8=Eqdo zKR!~ba=rgkJvvHtu?k9|HCs6HJ$h34HoiwpU3D5HQE` z*#nWlvnM_|1>wx~k2nQh2^JpEZb}y^ps_kL5p634VT|t{Wvb*jf%tVaFB8rPbMnFz z?tOln#nsE{ABZ(<`)y5npEOU)S{3dcHa8>^yScc#;89@g4tJlZDbn+ICFI z3?HCY+gw{KAnMZaUgfU{xjXE+minZd!fz%YNnJi0YS=K4w<-&ui=n&dqt3pqi|)K} zoPIDJ+^)?dzB!dM`RYylPKw~#$_=ZuphB`X;^Xws!|`ruN%~7LWRJo!hJz*i2({?2 zHwX5#JaatWNWaMeak+e<*Pe)k z=`WdS%_&W@y*Shb3pS9M9uX1o?7{npch@y}jwSpJFk6*UxJ1Et{%B(m zZguP0ff3PuBph3&`E43~`37l16@9{_bK5*$OV4p^)FBuIG%g|VN#{y)=(Jku(NyUH zmxM$p%9Gn{bu4cFa+cNfVv-jn0y4dr`$ExT%lHf0s)j@t*O_kb7Qay$qx<(#UOo9< zs~x@o?!GMpu&4Wy8f)JiY|oSbcr3mSUpj=M7;yO@nekt{VP5crhbP)+@a|m(NdG-& z_u{hV>Th-d&!00#&-M27hyaa@?NUjz_`z zz|iLp(_K9!xY6kqsD%yI{(ELhFBrs;0zzzNk0?Z4=B77uw6%CE8Nd_y)u<80%b$|6 zvXXulNP6P~eLEu_du!xqY}R`~F1mlFTY#rCius-m%GZOCr&i71==`}y`oz;6c=s#T z?m&+FSL1cvzmjeuPA+b|m&*mCq_@C5j`~FOU3Dq`*N{Ak{_t^a)fZKV#WSJB_24OVz~SQrjF)izBnto6KW;Q_M28GIdwB+tCp$MB7; z>-Pd%MbA_7?#QxFj^oau4x;qFpJtQh<{c32u=F}^X67`bI*rE?UYx^TN4)l??$X~S ze+Osn`SaW-+P0siF$0?K>J&w3XpRnv%k~-GgFNaJ{Zala+~n82w@J4VV&0o;d-bt5 zLL=mIKYb$EQHc$beixo?Qsd8}W=nZ1l>PgcW-pq<A9dy$XcbZG>I1s;yadQj2 z4KmIW{U~5_!dLG-tEX;W;5vYc7OxM;FSPkH^!d2a$~6BAV2XEc2>0!|oBW|PG+mwJcwiUHkfI)y9!)2m^5 zymn_1wkVOAGB4QK<8a1usi3sM1wBTP=nH z%sx9y%+$|cO@R=tAjZVcR8kMP9zOgwG~^0SZEFA{7@{gG+p*FeI~p4w9}j{&0e73_ z&WP=aG8GjS3p$s@_W90ExySdK8yoM_(vDd3^7798rotS5c5$)2yq7^vx&lVH()FX~Eb{}+U4X>y@0fauz{ zT=~d_+Z0W(dGIZO>>BJ!0mCgaPTi9hGj~|TDy-7j>?vO9PWFP#+ZPqFRfy4@}*HiiU_&6Jj0r%zb5V*~; z5)1|d`jauz(khp!>?t;~e^#w&sIM0i5CGr8&C@e);249MEHm!DU~fn>ha#h~T2C%j zJRrfJ=wL7MM>@jEM?XJ#^Xv(*#7Ta4JCl&}TuNNrv%5y%btfyJP$MH+CZ<8Dx>w(> zC8-O}pr%eo3e?i48rBk6RjR8|Y@4C)-T}+AJ$eKth2N*616GGm(1I|{(bm>?e?hW- z1C4eE7LK^fJ`po+|7%d=(8_M+|zGNzkO zs4U&vh~_|vPnbU`mGaF2jB^$LS#HmrcA@J$Ej!pmn0W=bT;lWYzIkJ%o@oVW?HK2G zh;!zJuvh!1%LfgY$^Kl6Tz6p@)YCL)7jOilJZ7IHQPFOyj|a4Dq>a;Ub!!(=aNPUC zRH$C_d6%P{c?5K`(&8OkxXV^pxpY%gv#Jy|TC5%6nGLR#uDFvn+(;q@z-1 zno)DJXU31OWSsF3j9$CG0GjJkAYatIRysUIUgljthXX>S+o{R2O)yNt4<*$ zb(KPi=Z`2%m0sl6zBhJ{R3NGr`L#3cu|ut1uhkEBgNp%IgQ=< z_`^WatUKojqGA)hc>}#iMltM2lxiKUp(Y9Vo$t;CGgHYdkk->4sSACk-6Za|K zL3diXL`6eQaTbalRtToYfi_ODr%cpZT1^(3l(k~C5WS1GCUTiq-DF3^Fu+JE^afy*~MNnz4rG`fUoBhLf;Sz$>&5` zc2g*n{l4L_67Osf-DS}tn=L`%uh(WLp(f`WqJ z92P8+v|M_A10&LrdkuyIY+w#F)%_|`RaMo;v48#f2j~*Ol`lV+U@X8H*Y*4V#oAkk zMb&+OpcbMapdz3kAX1WJ5Yi$F(%r%cNO$+3q=KXZ0@4DKLpO}HbPgTTJ#-In_kig8 z{XO^occ0;TAKvkB&fcr`TAvjMb6bRgFJo~g?ZbybFNtPmX5!<`%|2RNS@nn5F81a) zd8;UyrOyPK7jl{-dot1_>!;UExn zsfO|pD+;D3u4!)y?zd?{olGvH;)Q&QeV(wfDP*#DaSZoCfH&05v8f~E=Isj+$K9b+ zpktBzvHRBDT`2t)ewn=fF1uxU$>V5cj~mI%dV@<=&l>TkMWV4_u$*$1ii$ut^iiC! z^e6YcprAaf8hC|s&9qXE#!7LKT}KFlhQX=M4q9 zw9ESiAJ5_SekOx?dEQOAz8wYMOnpf%K*2Di_Ez7YoWRdzBjv{3rm(x*4k|P^!3YCR zw$4w^7n<0d!^Tuu^HOM|UJoek@ngMbv6j(1+m`lY$~<2em$;ff0-WhP?U#0r!3BdK%+q2S9K!+2 zqc(JGzk;hF!LM!+k_%|hy&Vk1$&_te_1n?!pVKwmI}&=bQ0cE*w^AZ3oGktDTgo86 zIzMQH-za<>-3PKjIbRtbJXL7K2i?Nch0)Fq>Q0W7LD7NtaIy5;Scj&)p)r~VCAg|Y zLpt#{@@XI|qNdC0owRsusg_Nq3)zr?DyV$46_P?|ZgG*Pxu(1OGnuH#n5MlWKnVnE z?#zKvv*KcDOd^u0o^Uv1Ee)aRiU6HP7 zZWh0H9Yh3d|2Q1YV;>N9R{-|yLaq`C?4!Av*(qrzqN3E9(cI44%!lr%F?jUu_Rg4F zH+&LITpV8U0k#0RDiZgD!ML=qVa#gzAFL8U&29J1CVetfTQ-F-E86V}o2g$nxCxsq z7|=JbTq-Oq1aI)nrzBEK3>ha`Y0vI#?pg;CnB!6T2O`95X}#HDtGd0y(Cl%+6kfY> zY~ZftgnNl~Z%aghQEj$iZXJ6uY&*6}o{j}13U%8u6c3%HO;|W>C0+UKKI=i&XT%xJ zpNy3?pt3Sq$mhldn0j6&5*aKZqtr8m1mB;h8g>jm*xs`=uX%v>4HRhQ?hBB1y z-n|zzH*+jx)H$}c`Xw1P#tII8C!=Cb^wRx4e3%)rwf4CyC+ouT!5d>J$i#&22pSoY z?wH146Wk@%!{Hlto$`iOOHdWfh3uL4Zjvd}q19IM`JO)5JQ%m7p2Ro@JXw;KyGasx zDa!+kVhl|2dHd_#TBRH0{XKm;oT)YyztsihcceL&X4IszUAA87*Ug*_* zvHWym1(rZ-qQ}%c*D7%=lZ>=o(fcX+-Z7)Xv;3-b~Gk$Z6xH(ZE*{65l)VhFATP)Wj&%1b1me#pV%{6B7%%sp^GS zF1Z8w&y7-db#*oKvLYZLc>nBYwV-KdkEZ-z{;NkPCQ`3tMe$4p`A*~sveg3bctGZH z)0LK%mg1Kg6%`eDcz72tUIezm+uM6MLHv1q5Nxu^6AD~;Q0VuowRO79V=};4{w|E6 zd&$swyHu`8Y%arQ!S$BpGCRBB_I>lp@9U>jr=XzNx=dPDnrnWW81zf@h9x@zf0;$= ziMpz=+jJ9=u9}9Z=v7Xvnds4hJpGb!k|Mkx9i*WIh+;Qye@$Z3ElP#t{CsAf1DKVS z(L}_QdeO={j{m&PE|S8;ig`;)e)Qh96eWPH0pN<;YWg->FE>b$IHi-#rh)&*@rzRO ziC(UwC4sTlDC2_0x{(!`ha+9h-q14pJ*&W@+575tI&}8cH^}lf_C!2XciGo{QXjuh zO%TEy%mQ!wgPfjZ_wtzP=LycwY@_$S>_e!w-sEkl$?k5&XcFQi0bE$Udt6zp2}{q) z3WrEaJ1S>SX}EMGg|MyTn&7NIPlR*Dp@9#j&4P&iZyXqV?zpn{gsSFw^FehuMIsqU zjqi50f1c&xHrW~=xo&yi_ek!`HN+Rg?fkEOdVE;C)nm?&^nwWGpeinRbmViF6(6IsjTuP=xD|poW}3ctPo@ zb>2eDJHGe+K;GucHJmLBTTSQd0Af*~l7?vhN`NHCK}EK zRK&$S+pbJcNSHtbssyYI()Tr+}u!|kk`dO&040Uo@(pZ8Q|QuPtZMl!!5r~2r7sveZFbqCJb>?WMmE*< zu&^*Tq18)1hX*^|_;uQkM&2{+B7b>9#lu;r%~ltXOoKyU`XuQI*?^cQBqqALxP1He zZ4UCXaaBA*PkP9jX%5-b(;*wf?>gvI11C)_W+0@iW1)nJ(%jtEtu{4hlMiL=?%cV^ z>90F}V@DGA3$d=A9%J`H|Ervi4jGiCq22h=;eqOIf!PT6k*$%ou>x$6`rwJeOm6

40I^0LlYg(}5Bl%95(y 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

B$Cgm}jZV$c*0`ut7M0XH~fZ@~DLIdx%qK5}P zC=<9BQB2G~fX>+`p4|-hxC>zG#q%aU6*9bW{NUi(`v(0J5Ttq6e2gcj70iF1-k!HW^8QjS5LDXN64fGhbb`Sli-dR7ZhdR8A($HHzYWH&}@iIgysh&t>QP`v$Qup`##*t0%p z7@sfO@_zR$?F_I8|B<%)~#Q}JCG`ow;L%UwH1?_JJO3;)|D@6ZOv;s z#KB`zvwR5g11`b=5OsO*VzaUL6s@t~Dd?}+Wcp;`GY8ve8}p;~%NLh;17NkqUF)BN z#6nAx$HsJD*!*PM#SD!HMF|(;8s>8JoW23*jVh5xX``)x%gJ~94`ycDFp%x)3D9EI zdfZ$A_uFdKJ6ZQ9vI9#v1xNySP}?<1WuMmKvoi-^F>C_4&T+rd?egg0;J|FM$O2fs zfnFSL=?Q)LLho2B0bEgI&f(J4SZ7Sb?F zxq6(mqh9TCe0LijIBkfLtELOK?RbS7!4W5Rpp4~SbZe`HaPHq4 zE;b`pi-*>7>Hl48bbsHW6D{DnEw}A*$|LakV`%KDKA-lkAP91r8cvXLJO>TLW>3-N zGR5iy8G1ApNO0x)8vzKP94`+k8SCfvt_bwAGq>7+j)P#ApI1Z|}lFz`hbxaHuHFbcW-|s~hV5B2|frF0^9E?v+o{wiSaLBhb ze5(%*Aol~8aQlP%)>CF?XGceE$HFg7r;XA=H8oA$QkLSh$s8dTjnc}C5ZbjJkz zDdhZg_T37T=!0#l^De4K83Mwy12OvkV63InRqWvTV83B9A^`BmS0Lentv%jM^k6EnR1~NwE?34V`49rXuut)1T>r zgQMSXt?sOZs&7woNVg_g6k$=mWBOJ^$ZEgs?Va2`q3uy_g0~Pd=f+g4g&XPfrY{$e z>~Ioe@+7po3xm_oq3bnUhg#uHx3cRXJc*E(S!O0Ln*Oj$_iF6`%h7&1Qa9eB$xD;D zN;&U!faOyK@vYvMeg`i&at`wA>w^Y42dRQ5x967Qbd1VAFY#DZLkQqL3^Ww#a!!G- zBfIAFqjaOYg$kCzTHR{eKi7isnV^b)ukx7XMsKkhVsi5k>s zi>#+vL&F~vl6ufBL#92G(}f$U+QzcWzxSaE&`8OpTGDh6+(Em#>Et~)|%V2(%8Whs@{}7|>4;F#yYA7d%h~ zr)0~*LhXbzjYS+511!Y;VX=9Wdd{{r>bWKxk3X^q0I`$e8moi(qU5*B zSx-I2A7NR+N1{W zu$^UOKso3npOYE*og>$4`pqV>VsL&YFr>-Isu+F#UTzmb{(fTK0H+*7&|PdjOG86r zJk>6{&#gzXp$va@DGXa(T7o?Q%y(_Ge5{72P)AO0`4O36pLRRG4?{MF)Spb_9REu%nghWZ5{svzKbs3d)8iW<@725jG1m(^Hf5=@_Zq&gE z7!FXS4t9nRoD544zi9k~Mj}N5;+`H{O-&6V^=Nl;Dk*Y~EjPg%b=1;QUl$LvTXVL| z8=NY=yXEX8TfX63Q0M%rTY2`paK83tVG1}hLmAf#1npcV%RQh;?5K4uI7LiLOXG>k z23Cag1vg~^FQct4ORwNiE7P>^RXDf%mW_g5uILDD#Cr~Qc08Qe zj&>@G>H2-Eedr{X!_YnH4W*d82;)m{OGFg^HIQ=ptIyX1y57%a? zLFDGBXl~I}?OeS_19VfVEIYv5!rj!A2&5#kvMyOHCS^3RbFnI_g*9dgr1Vs(H*s-l z;}a9>Yq%YJL0~S=$|__qVU;}8t-0q{ps8gw=W3~Q#ZTX0tx4pgH*4CCIlfY`XF?0*;+U!h^&dv{XYrY`a6=^u`24Go62&~sQVyM-4jOq^VJf8 zeb4LmRKd%CXs|z=zHOT}xOI2d6x^HYbu!0YTB)d&z(^ew+&`RbLc7|?2n2hSwoaUt z=Hy%rgma3A&5h*@KG&S>cfX#)=Pna36mN9qo}M)h)&_?U3hZ9rUb`=PHg$sU)_@ZI zxbbo=zHNWC?{O)}-TeljACF06WorxA#~cFI9FUQbVFzxy>#ih3MA|}$IAfVKjf{=Y zFB#BCcNm%zs)s;w3UoR2<>iv9%_P~YQTW0%4~3w(~C-D{WZ zoM-Vq{hVz>hcN8@F({%e=H1_Hv^Hq; z5;knmqjWJGQWYYRNpO7n<8d=9sCOU*b1Y?jK*L)I0XFCQ0eWHngrocohc7uW4MGjx z4VX$#@wICuk{R|e{q)1b&8fE;axyY}gF2#P0x_LoD5!`fj5&Q<`iO?A z`-`qe=jX1vL-*3-fs>l>Kx#eoG|o2)OX+e%Wz|CWB|4I)KL?(+5cQEBr`L2KUp5u$_!fdbMEzE{=A50JZ?xuls z5G(R>fB`r8$qhnDfqyB*+ru3^$9=x5(Il|mJ8zg(oDfdHP4B&fuXBXVfduII-sX7RPr95_NW>FJ9&I4%f|w0R_`1q-hz0DPAiV(04dB7v2gX6k zgS}Nd`uiPjF}z9Zn|rhjJW!)~zO#0@S>`&4iOLKVk1(qig)v?767U2+FuC%SOM{2S zQ|3R4RrDj1h>i&AU)?`^kUsd7LiP^0y}6wni4qDJzmWK|M%eGDb0xtowMv{>8~Q@7 z@sT!SiEa#chr6qjM@NB14T%WaJz0S%?(m=S0Qd$RVXBtTb|##UH;~ng_XCO-a=Dod zvB2MQ6xoFO$4KZ8kI=&8#Nh|94tS_$aOY*;(zM9;xrSfF2)G5qBiJ-fXOt4(4)Gmy z{lI`^KfZ$h!qUSp9PyXj;roy~4Xd;$kfS5KSS#6?0|{v7mXu^}uOq#?XnxxC5{Lt7 z-FPr%1h*K$%F_U*IkE=hq==NZ;G&>GZz}}#l0EK@UQ9Qhv72i-mfMGigdQI1e0XRY zGtTlbJ-_T@GaB$iyq!*vC#jb9I~&fZLia+>G={6OMIQ(Ru<+D-vKH# z@{2M)op!`iu zOw3IxO0>nXZqy|Ngj}5z%S=gy#&fNqptp&adfGYk_+I@m3p0QIKpU1DFxE}x_g1c= zkBmhy0e;Tga=I#J&{%F|ybeF{UOP{LaO*4kpv^8m9-5Y?a&GC5ylarJGrQZH;1>oOkB-}@*kv*Zq8M&$YQKL`!Kc%vn z4E+@H-E(nm3P7t0CtVudR4tzKMtm-Q;SU5~xF;k80?q)Fx$WtSz@>`gj*I!RF5o~?9VZ?BE6MbBeh;a8ww?N#32sI`))}ZTua$!XAU=n;g ztRtzD=~p{1M-#-$mvU+vZ+Pz-`thx-3=AObWf-STAiTL;PFqU5OajD-ve)P@NQf=N z36yp?oxepzdEVVRR8?8JUq9wX4XRyK2We%Pn^wh7_I)zUE+vpF98YTGXw?0&*0zxmF2M;pt3anyt1LA40apHocJ;Nl->L*272*Nwx?cMWV#B)1;8O$ z<!V$} zzEZuE%XaD-m{5fjtPwamo)Qf^<{;+JEqa;@@`ehwS_2=YS_kP?N}NaFH{QFO87?fU zaj?e(k%j7WKg-%Ycl|HOuYQNuZbGgSbgjP~5s?ClIDT8FiJ+@svpu{1J*gLv zb@$D+QgO(xaVMgBop@NL9N*TO!{qFBNq+u0gARzz9DiFYaaLF&jBjwN{}Bwt5oOVe^xO=pwqT zEPg*?4P9L*Ok~rvmj13g#lao4(e|jo4Gi8w036sKm5)AwFTtoFrx^G5s26)xs&>)- z{{Gi21C%%O`22}UVqtYPiV`EzhgMA*rh<+KI!blNDhj z@GgD^5+;O_C+8a=0Z>-T26YbRnBcJH(^3S6lku_T%Hf@EenR&RidXM-Sthq8Q6A5^ zv7_Pd6&cv`x61&Yw0e7Mhp0>#AMbZQ)cMWDn#sT=>Ie}J4_8+~MT5lkj9xi;fp2fk zWokU;)G}1hbV^SkRT61e!hqHn(*sfNwHfxk$$=hB&PKo*n!YD?DrPKWyJ(W;Wp7eR zY2Q;t7EqG^=4A8s;DB~LjUQAjcT{Fp&zZ=b%r!WuV~~azx70vy<)ZOfJCKYxz$Cx- zrJ&_c@#b{gj@jv%y!}=YIlhs&tO3A<3`r6=tRJP`6k>OV=S+69fx&F%@h)iJ+lokz ze-xyb0L?h4F-pB!^WVF8@xJ~~l%%1j9A}Lm>Fw;9%96=1+^A#X)bt;S&&Rqa-td8V zjTGDx<@5Bb0Oiq41`&i{iadTHkwJ53Zn>_NH^mX|trO_8rREzYE&M#svHiGM)=_iu zaxSLCc5OXu##T43^pxCqib|YIeN7*!y1Me(p99NsX2^_-=*`dVzREM__3&Jz=b&)v zhF0%O?3x!I>YOxA&U{gnA5aCzT!4Pb8y%RKs7ocWaB;A%cNe_UtsO8+(OK|7q~4cLNkL6l=N|$y zg=oNZk+Jbyx(dV@{oc1X3%h5??Z)rRo-cVCf;NQ&sc=a4I zr&CnxNIIiLczhjgpxI~Qn6ogZoZ0;-)>ou6fOl)uy&#uw4R?&B36X}z!b@y$xRg9_ zInosAiAg=4O0oAE>6RAtlS33BadEygA7{NX+2 z05uaH=Ov1?=3jn@-FJ0WLfO&%7ro%MYGx(3OO@%7QAr_DOn^0hhLOs)@~>z&=o z$5a))?V8zh`h^43StY`60d_v{_{M+fV~$nYy2JS0vLm7Wv;+Z&FrKwn2u8MeP+s4@HIaq14& zf$(w*b;F%2DdkGOD5%^Z1dG##{)=ZZr8q4fXmA~ub-wJ82^n<4q{~Ujb(q`awklhLwO* zeQrP(3H0d)W@i%n)2eEdTk49%<|+b72Dn~X654@zv@!FZssjX~-h|supF@^?q^Z&2GINhqYn9$Y@Uf07`)$_S+Nv+tH+eb!~?@{yi?6md{GX48scxDN#`d z#>Slrz6L;4nQ$0(LBcIxMxx65L9ZS0-nsR08)9!AxHCLzH{U+#>lFo%7RKb_0K+Lq zXV9kcS>XHLNYY@&b$Z*$>OiNzmz{Z+sjrbZ6i&u1WJC5NBEnYz9gfD(z>8X=?E7-? z;`E~9)U`I?z(oxD3L%z9cNcvtUc=38%-?L6|)1KU@Wl~>Mh?I;&k zb))AaJl^fqNnvbG1WNNOtn)vI2AkaC8cI)4X%AF#$37(U)_8hOXdk(|b0aXEj^ln* zs@TyKojo7lx|%iUkS|`j`jj3wH|kFV3z-h+=~il-RJuSfvDH+h;O??`ddBg%5ZJ$a zt*Pnfah5q*0liAsTGu1u^wa+Zw{o#(_eq`YKB@1S%cWGvpO5LEeJcM2lXB<_-YrM! zRE6AbLTrwnlWnOX0Mn;EIBj5YIg#Y7#NUG2i@ z*?^i@{^SNwtujdbw09I-UrJ%sdnDoi9SDg;84_f6*3)cX#+)(2<4X-HEhGmsSsDjbjy~zJ4B}ZjIw!O>FN^6F2(9{P+ zTmuS8I+jL@IR-gimJFD0P6cugHF@st#<^msNH{0Y^Z2CL5pw+b213Av*3OmLqD)V{ zIiaMfE3%i?dM2jkJ?zXthEvrQGnX@0Z%x)l0{5&paGXW=_@RkRUOzPxvE#55TYglI z#F$Jt*7S|mONC@rj43UrCG2)zQpe$>Atl)kXkiJdaUjbl7xguySpBy+SAw8VC4qirTC5AslMjP`as1LezU@(@%9s5sY}9+eaTpU~y_af+3e`u-AY zGt3XmzBc`*%50Cj%g*RJ{y99~?7;%IZtz1>m%MZ^s%AG7Q!!G%v1MO#>8-Y79d|q% zuqen?b{0l+<1(*3cma7Ux%3uDqB{G$k989!GWGi?`2~zDamLI<7Rg^A_6Y3fPGzV_B{GJJ)~ixw;s=Bm%i_~}>sfPlVwa!N z!U%d-R!~DcfSU6uD;N%U_&-#~5T4hsK`7diI$qL11O7c$LZUh43UhxxvnYUGpV(%lgQ^5` zwO(o?i?1j5|6Xe}xBP_I@d3_52CToHq5z;kI8xgvy@I#>D?cd73kw04G02d!s2baE z2qWej6;_&wSY3r=kNY7o^fSPRQ;~c1KIgw6NTE z=)0HC5MFTDDIVH91}-AFVRTlUIB2_Z6WIu|NfYgS3>jpo(t8IdWt#CCu5IZDE7o^e zn2X`b#!V{orbJ+z`oQo4*>gMgBaVa;1DXUwj~*RQkNU?qXk@pAyaA$cNwnO1U)7`g z;)F4~yzIzMhRMkMNf;o_8ycL!fa+f4{mm%(g_F^?N2LG_4%!UovYeJvzOON15!0w- z2L?#{7Q&!h7$6M+4kQ4t;K=kA1N3KeaNIua^O1Td}8dL7}p0 z(bx=0HH&@AV%zV8;R+SKPj4ls52k%{v!O@q_<}l-Rp>Rq$Pb)u=Es9eQM++vW;`f` zv{rJo!$PjPApF;GklqKb%k78E=yG-AXz?*}jJ@&?(yK?!K9`^910Gj%K1-?WEwGp; z)*MLy#86ZpaUB|ZnCNYd1=B@#^@A9q@5QhU$&eV>j6XC1u6|K}{v6<*V6c zpG3{sOOtk6AK1~KkSMqo=-_V2{s8p3&yD>xQ^QOb5K1T|U<3%LtO2$|6i3KUAg_xX zEi~OWx6>JV5-NFuz$aTvK56#^P{Yz^mBxcL^)dKVJ#Q;mb2D5(gc-Gw9KC>ZL8ozB zKlExcST#C4Th*p%kUy>SoyNWVDBr=K7x?daV6b;pVN&DA$X)y~9{oMQfNZ`RcBQ@W zwY-Aw`wQn>x*?p^JY0g#It#NXkBiAY{C99s*1|<;rhkuYJ>s*5x{1&b<)_DV3nI!R zsH>V?-nj18o(0QKCJP5{{=xx1iB~zd?>rrehR+6n!IKv)_ZXc00|wU^7UV*XZX~Hg z%T|r31iWIkgDfsm#YZhOj#KjdO-uqIEYL7{s{eZP=OYUnC7uB_EFJVwKZ0T4%|@{U z_g;Q^)w4>AsmVR9nAwLBC3uQhj8MY3P^QT_`%Kt`%vqk1MW`a3L@6(WVn=;{8lMAB zjW~=Q;2jTyo)D>Xm>Mo2oaY?K&dMrYj zS8wSo7u>ueuwe$WhUX1?kuKW{!+X)xHYolR2p1Mp7L?B}cw7h2@DN}D zTWs~St_D`nmjf9ObDHOD+yVbRt_Uqmg*^8S18nXA8-#f+UiUgG(oH@VE_xH1%`kHw zL_zr3KK%s6u-`yz=8G;GLhoNDe(Q8?YNxziXR*;i7JnltSP>#9KugYDJ&wNMjGuA; zVi3H#|L?`|>wT!pmcNB({8G5zi7C(p}Re7mO6{vhfmWXFIKgp=%&e7K?% zEE-M3cyr4VAf3QIY&-3981J9%ku#+Gnh$sF8-_kNp;>Uf0+IIcLKJ?qTB_6!Da?1$ z8j`P46#rg&+aRb@F9U0v-BlcEOx#&{&izpoFMh#t6~r`VPO#wkKob8W%>Kqq@9j^Q zEyV97Fx|slTj1CFL$qBUe0JP(y}ZLO+7*q%i4z#y!h=vSX(lEWG}Mt#-W?2L zkM&lK##`)-!_?~C1`djOm%f5oVlq5Z0Eq(v3`}7|Npq`32d}!)6q(r;vJ%=wIxd=s zAf@jSzk^jWi%|{{N_5&X^*1cbKnIaWA&C=crR}kR_ETdxt)XKvIOF)z|2v_U_Xg1C z05V0EkY=*z!IM&}82s!P&5l!19sG_?h{F)O#ub=c6$~UPyWMJq2e?q>OdJgb*{Dk) zpAYUWap1Jk!L={+prnp(_c8TuuLa5dkLK2V>oL%Rto}3ZE!)D1@e}s*pvB0IT-T%E268|{NC{YKS8CQF_F~PI8s8EXdHXoQ@m_Gpqo}$*rwUwgU z4MXDUv=Mu5s$bCTaPX7Qw}Wl=7CT_^M;RV}l>c*7&wH^#M}Xleh9g@;tgDP&bGjRa zg{GvzTRQRXXX)JF1V@CAz~I_M@o=flLGi0u2>tJBtcvt`a)^ug+DUFNzS{reol!JQ zE0)==DJTTbN=$Mlsk@%lJk^$Z3v4tpU}gJ;BB=Y!os8O)X&l%&nnt~UU)ndbLH~|t zUqKS7vpB1?lmK!sgZtP7NEMi($0|{edv`zBJ@Ij_vaS7iu9qFGj*M0l}0E?L#-Eq0v(*xCa>_ zN`9gqO?ezPQ595f$o$$Fm{mUc^hnpV{LQ-`zh7!mrIm@D0iw*$V(6)~(CS50EuQgC zgR5Tr9<)PBdUhX&HS4a=kC!bomNr|GQPrc{6ghAu%On;3LS4IKDS$Ismr7&^*a*R< zo0VM-!e5bGl}AbrbW&nQRdnriWauWht~Tme@U`J`ee}ei zdy;%eaeT7gUwL4vnFdbf46<~<>XMIk|H<@W2)uoo=DS2(SYD9Z{CG2HGcylAw@d|) zX%*J08qOe|*KbCglIUrWu%=kP4_C4da?tWY%V!c^&l|{13ce9cO>fehjowY6A{ae| z+tielwz_=lFi&diJgYU}P{p+A3K}$0-;^i#R5J^osDZF_CE;j_iL{f#c>R?%=F6a2 zX|fHcPkIIC=BVW`JH=AaWy3drLUfPRRf(T(u6E4x41V5WeF41jwJq4twv={0(!7t{ z#=*CU5uqg7G*|fU%EpH;4us^iyjg$65e7Ee*vr5-{T~!QOtH;FZ%wDE2khJXfuvh; z{^rT*SPoXE;^V$ZRV@FUSJoZ~jJA&pCfr@SCUDa{PfikJ!6~>%Nf+0uLj0ZkY*gGx zluR%)`g?EqzG(MVu4aan1pl&0VnXF$KW2%EU~&Cowh3lhI2LRAaxH~53qo%Qf^!lsU6=O&UetgyPMxH z2u#(^73L#3j`IDe=y-$>e3TIKqb%F!%mGv2NmsTxg(EXU?|VdPOuU@k!jAU#LMU(n zZ?eJ7XyqJFB2KoSwqqjU#(Va!eR=(->;hn>o9NkaS@3$ z80X}A9~V)*;CJ8fGZmqcIlf~T9s&`tYt^~zF4#YY{7+tyk_hf=$*Q-m;VIq2Z>dH! zg3}mgS_Wec$EoO_`9CF5Qp*eahj8FQxRLSb8=3uaZXQ9)5VY&N*qy* zkUXQ03K|&2Q~2h5Q$h8PC;ZB45}CnHIAAi!Vyp$2Af)uKH( z3#bhEa)HCmgQ;daQ>Cvy0C!teS646g6dQZD`uvueU2xAeFiP>%_wcf(sf)Y$Kv?p` zHDsH(d8Qwvk)EB6elG{q|3XpVgQ>p-*E&UIXbaFan6?03Zgjg@TSX6i&{`q&SKkzB zvkO{O5QADIJ3HTtH zfgMi@Qc1TyKEFL~Cr7P;=K=YLN`M;o-e-e;CTVsJzb#(z1M%r92t-sBX0pV+%2;_k z{Ij@^7omCUeQ(BoMbx9)ua%XRuRctj?GZWAXp+3z_+NFsby$|&(mqUxh_rMI5=x46 zD=8o#NFyPQlyrwdm$Wp}-HkNT-Hmj2_qXo*_St*Czi)4j=a0t&*0t7}Ip>^NGqbMC z?qrFR4EG_IF2Y#CHj;zQ3Afd^yZ4&{j`z(C1Rp;p)-kzEmoG4nw7Fgtn9cmq;RQ*2 zeEuf}D~2V5#}++)&3~=cB$v{%qye(7<9sFSdq7DU{hekF4`mo0gdj^{zeNqa1{&Uo zmG<;n-v5o|e#K&ymz&ugTGN9{%wf9Gn$R92(bo{UTW2`_sbSJSSQcZhUQ5V4hWz#= ziB2#7U90&*PLmdnnaf$ZgSDL+)^g?9FLCi0`^);_k(XBssaacS))ZSrWp=L=Y2`R$ z9hhQxttQf9Yzk@Za0frx4%xdlE|^-NdXTTLnhUv(bi_#0nh6m@q)>!E(|4#w!rN%T ze$rhGz7+ZGZYEp8vZNqNy|>)%rVCGlbrX6feEARes=@+r(}Pd#D5OCpGJ|I3f8DuL zD)-h7>~L2kTDjeJV*dr}a?Med>gVarPr_!WF$MFjO&__$mRNJWvB)1T945(el|ixh zU1Z)O=lM})8XN0%nJ@HzcCZF7Qkb?K5D(w>35m781ULMNuet>{aX;Rr{#-)Hx>NG` z38LeJILz#MQ?N~t-UVMt_v|(fvg|Rs5nM$|eYnZveqq#Hs5=7H8Rb7Z!-l1r#uk4E zj9IaFEqapz|JW7kBw?z-(AvZ(nexJh1Wp>4t0z`0BI>~n&PZ7oCauaq>&wCd?N59f zOEu070&8XPW6ibI?4Kt1s-5qfp8(-G9*fdC4Xj;K)JQd~7u&Y9CeZPJtr!aT>0^t! z792d=d<{&hPTA~e+QVuls)cl}@Tmv~d`uCX2H zF89#jQk?JBCf64vB55%;rWidYqmxbYU`Sn>sjV(RRW5?xl9jy+O&mco`X;2$?3sye z-WMtQaB6*{E4w{){RzQbuU%q!gtJ>uj*dkQP@y}rZ0|*}9{#bjKW9YRyysn0_i?~* zKYv=M-+e|t2|5yzxOx$9Rus#rVvWK%r3W{QZK`B{rdRssb^btAIQNeVtzartUI2I1 zxrtYLuRr~lXbN6cIG+*sT2qlqiBu+E(FptQtIEjQnX$EQ@9$!`fW+7FcF(lZGg^9W zV`X`ntImE^Af)GcJmhwjna-F!vd9?TI<1E92IAlBc=lm@gTUvaZ}Vm6KHd#(fAA7+8hk33W{#|w zeI;+DU;2is&-n@(t-&!0MkS(KMx!#@$HDS^L5wATEG+guV-#l0mZ)xRW|GzZhF8TE zLr-`v(_$f7Xo!$~M^fOYYldNjV z$v5NyP8*|@*v!ae0KG$(A;)R64js=gPv*~Ft7DB=@r|O0JRDK=I-c9@ zdR64eBCSN$L!nJ6$Wi4rVVf2tv9W=I_K&OJgt>}C0lO|tQl^re^n1AJ!^m2BOyBjf zQX=Aw8E75`ck9u?6)Do=doOFQFleUYcF&P*B<6Rfve6CaVSPPq&=)e&0NA`>r=4h*OJl9B&7Ai&8Go|} z^U1^9iF-$D27(yR_tZ92hV#*b0PL3Ur<`+uU{HN+woAWHkY;rDjW|lXr94lR9z8-;{u`C)HSd8uJBLiC*7u-=K-@ z0B6)Je!i|!#wYDEbv+X_|Mara<_Cd&ac&or-~QnAl|~KWv3m!j>X2i_s&V-t zN$KM=ZGD6>AR8_43gY|;&Z|Q4)$)-^vHH^x4)*Q`r^W&naZUe3!&yuSCvLajzGwmN`svwCwTpTW74 z!L_#fG-aV&ce=Z`NKSlspyDMSj?eiU!?|F0y-kPlQ|^~;B;&Hg0<|H{`%s|^{3G-> z&`}IhIvOQ+2kvsa_|u~tF8#nn4kMq}9JADNF@HYM^i)4Rp#;Q1Jx!n`;^_P2nA}X?g z_ibq~O_S$?`GOFse ztfGT;mRjo^BANTV@rG>0T_H9ZA44{C{&;ov_pPTMfsK&JZ%E{?IUAzE41#9*l#ecW zb%Ht#DTDC$}jGQ zN?A!`x?Z~e5Eb`6XenF$txD@CPog&*>wLVrM?=Eg#u`#)W2>v>q}%b#TnIsvQ+Kg% z34F3NAr;4_bYG1?agNZ9#rf#5GjC|(T-w|yT=ZZM7w1kZ*;tU4qLut%V78F%J?Jfg zxBuWK6o#9qZR{3WYxef8RVvTWs`_`IWU2D;42m8@Pex2AMe3ZER5a+q9+*xi=F^MP z=xMq086!g`@AqdNKGW&cG4}3v3yzhz7OrTxI(U`B1*kX5DTygfzV6VAcP{pemH<{r zHtCYwGO|?3<9;tTocokScg#HfOgI)N^d&)a@`yu6ks5(+cEVTVMs-K7ans-SCpUiE zqzSYXzHb`_Qy-zUQ&^njkP$*#)2S8zkvQa@1GvFRGi|B+Si+_!It|`0aABB;(m)1j zXD98!)=pfB-%K4ooT@)v$jSME1^WT}eddvd){#pKg&i5_Rg zY54QhrMEU}o5b0^CkG2ye48cT3z}`-a)Pj$!WHXLoNK$gXE3Zh`X~Lw_6SD(VRg0# zETp}x)tAq7Ivg?FD;RT`#s@Cu?U(? zQ?B&+{!1)`PA3?!7Jn2x*hx326`Izn(6^kvWRS3NRmVp{+q~BvJ!_)G?)TjN`#pIl zjRW0mBKWB5+q&p0IFykDVU+#f$8~hsflDFh*J=;{$Mcf7-9uA(=9qrLU2d??_Xuf@ z)ApI6LC;Xei=LxZw$Id*o*hdtScdIN(j(UX@ZxHvFaYgyH_H%M=vrzG!n7 z!{dbCAYO?2H4Flr-hlkSLhXwd$2BxrnbN7tBkwr_PbA9 z?X&&v_ZEMAfo2AkeZQ)Oi5jd{j3cN*>LCsq(0T~`8&++j(F*HpH@d($A1kN;zrgrY zXX&p1hqZ5Wg(Ng0=rvw((*6@gKWkPuC`o@E}VtqnHuT7{rhnH~esRUNk*E|CM4Q_J(qx^@S@>X4H~p9RoGm5>$rg zupD5M_}@fm2IQ?PgZQPJkKkD|_Wou7iQGE86%CY&R6Wysx^OS=PvN%41b%$!M|0td zKORMl>@MI16XEq=45pSqJ8zkWbKU2_({LCl5VU)K|37h8mmb|Zx~jPkMwq#|@Lrt4 z=&w~tY~R*q(nR^*0|_DbZG<-H#jXQbzTs<77tHeB?9JN5r!uugyhp71kr1AvnXQJn=tb+>J6 zy2kr?X`2vF#hxjG7iUVG1OYFeLtf(8XOZAZqZn=T@$=)T9c}Fh8+OlWdCdO-lS^w+ zT)6JVIy%;;nSzmzBdK(v6w6{#W@;+(57Pf&1~?e&5=pQ*oa-!OY& z+&s9#5y{iQ59+4e%=t(Oq|*43J}3&>e==PI3-P#W0XhxRMLt|bYRIh`;|X#7HJEU`rv(uh)u&Z5R8box1- zYgx;q3mYH{*%=n>8eCDKn79qX80BN%NN#9$3uTGrxaRn`(GBZksJTg;Lm>DHc9-vS zy*v5>!F8?WYEpq|Zu3(#yZYM$cTBVnNK^qLqAJMQbKl@FWZEPo^Y`a<9A8ScZtHpsIV zpTG)1&?`>(+ZtRHpbNsh{)by~MfoGhUvhAAeqe{<2h{Tbasg13U=**MHXbcYOGNfmo z>2I-;kySG*$@`X##lW?yzw)I3-B?9LGr(0q1R{Opw-n7iwFs(*kI}Z~)Qt=K;293x zdDh{_Hoh-SlIE`;cXt1KpAaqX-h(lBx>Nhp4VjnT9JN)HJ}zZp?46%6o>T1c zg|`oW#~?#%H-=uu6oe%$K7nRN$aNZ~-foYX)MVgZ{|=4dG)mWiLLbGJ%iEd}YfUdt}0N_Et%848g+F>2jv`QE)|> z!I9wqh1|dNvc3AKaS&gc_^6R+Y$G$h(iTGr)m`!)S0lgMnhBnShI+{-GI2e~dHLXP z5}yxpSr9OQNyXMu(;)uVRE{UH@_I{WLs@0`%#xz8xfRdBqu^Ec4>SD#W8RsQ zBY0BtVwpjNsUqRb@m3p51#7dP=%}_I)KDb?h+h~p{*PJR&vqU*^*WlQ7>kH6f8&m$4AIW`Ip!+|60&O}oitah!Dy!CO5Cw8fcz_f`}c?H<+E_P16 z{QdWyNRvhfIJ@E};O%bDaiJK@{OgX*U`j>eW&65?c%nar@!aQxoBl4a51W43krOiK zWNwmGSyoOLabOG7r2nDGNSKgf+`-F8Q+c$y1mU)e9__t3|M^O}Uw|JkLKoFswMb?A z&4RI_q@T(E@Y;~~nFg;qvI&tcf1n9w3K-(y@6|jat%5^6Ienr=8nk&?Zu~#yovU2q z263k1;%XMrZErM=GB_t?O|A55HNcSqCos3+7fKpBLRX8rgI_ z)MjqSpDIeMC)I2lEE~&5Z{mjH_ZEiVBKg0Dy5Ur+0?sbSQ}-HueqRZXxhEhFr%$KD zA*l)pxoY(emaX=nHUE#H#dD=Rv3egwXwO>~HK)KUiRec;I$og^&GkJqTQt^8+#UWO z9?-cXxtO%KSdtdrL$$(^AbymGeuq02Ny_u2LNR06SQES(N%z0I;Nu3to%UI(Gn#^X zUaC1?aiTaosb|n1H>45y!foyFm{v(eeW$(vm#$zg{5v!-g+rTo{g)%`ot$VS0{D~4 zF(2z@2QxIZ2#|;BU-c-VB;QlDwB-NZG}t&aRPr2pEBAF41W<7I&Hgzk@zHO>O9cE< z!G*^Hp@+<5mJPr2WeUD89LXY%3TkzILqe@L_P+!6rlNlx5EJ+?tjjt^HbE1n7;ot* z&zTN&3(!uJ`}fB3gaOc+@SkThG!j^=ompq%<{hF$K%N;hLV#)_iy_4T4`D(8Jv>F@ zecpz&nA9K{LOy~g&{*#q#B9EP_}2l!zHXLBJuU35@9jqY${<4FWZxz^o5OO1U1~J> z(LAAm+>+nO2UL#}Bub+75?ZqPm5($N!X)@jQZ$`|JvGzZAO7R0`}|)5xJsz3U$uy6 zSK#!!+NeL6<0sK1u57i_*cKl18xab+YdX2J-1~Kx(t~kxM?lTx5bkoeN?YAoCs|(` zH%nd1TJvz|UfNlP&fY^`s+wF~0zQBL36fK-B3%jjm)LJ#tPE?}m(% zLYnrSmXaf7qg)6NR0TMTm!tNHN9Jw|I|InEF^bL-s}!C-9||T5(%lj3V)0CT#rY(T zl3pMV{;m7Z-P)(zitFmbaf;YiDbWAJl8eyGPpRI%_#k!OTZiQgeD-ur$Vd+p`{97#I zSery?LYtaoBEI!+ZEhXOO5^ggienE7x3RXKh}F^$@WE`A!Ka#QJM3Lj&IfOugRFWJ zLi&#nOOvYYj(c|WNF^{L`4>4m4R3DL>bHKmeTnC-za%x9x0_=qxHQ#lq|fdp&~l^K z=E6pOt7ah>LGyea)$(yCXv# zBCVx7eHK|2=^<`=qE^Y5095hf(mke8htGjCR*B$Q1DrGBWT2UMR;$_lmls}_i(^co zKo*it@t25Wtt*KM!b6z|QC_Lp+p<}vdWPS=ms2L4%Y10hiASWwxx5+e8Pq>r@_{Yyufmb^_|g zCqbS-*|vW+7ng>no3~_Lt{U1{9ADGEG~i+8e&yJK&PvqwUnaHk^^4vgm`Nyk-wWSu zTJv?;M7mE72Sas;&6~O}kZ@EEgHte8;7r796L-*dgL_9LdrNFQVIu9}3wZj$a+e{b zHVtzbGHGTA>ySfP=NXiBPCD++&l*6L8U?L)eMWB+O_hZFp5z%XdL6-2(jvnfb{!ct zjyH*(<&>09b)+S5bMepswz&APakemJ4 z0-T|*K4t7WVg`G7nzq53&mLnXTleP&8z93!2`rq}&c3~?-_^c|nY5AEH_li!G(A@PKZG}R;?zej`JXj}org?3uJ z+QH{xjV&ALbD40ptmt#Ng-Igw&f>WjiCY9tfo+2 z0s0ARrzuPhg5R=l;u*v<8pQ}65T~i-r;>3Tal4(Y%&UBTfs~BfVW`j6I%mWN*Tpiz zr(Mqo+VhIVq9aL)ddz}=dr6ahzq>)U{&ZGW*x5jC5XzLmT8H?K#%DHO%Qm&sNiU6r zWd#SR8(EMsIq7HRPWrEJgfTIRLo985!*qTlf-328X1RlreU~}$dPN!%I#YRbw~XPO z#tz0uv#}?;TPQt#*BZXm#5FW&+0pO>79MrGLz$tP!K&fd5eaq-&ko@YJJm z>N}SHk_odL2TpENNwxWu`d$dZBZ~VxA(c@#HA8piW*;7-8vzw{ySvP8i~RgR8##xk zWjZxA-QE*Ghn_st+XtGwsLXDdmDPco-{M2mtjhwUyHxNEENt@Rg^;zg+fonno*uas zdOcLc+6DajpMqP0@l@1UMNyi^k^GO!T;5m4y$jS_pW8T*$-D2+EB*oH)e?b&dq%rr zEuPAaK@z8Xwok>qycQD@(ec2zmZNYH^VryWL}18za>e-l&f)^nX2t~`r&uE_r0)ne+f z+nwYQ`{mf>_BfS^BsU6??$4c=o~h~q=6zWWWnO_kDDyUW7fe$=f2lnh9je1V zb67*Qpp6(UwspoX&kNDREt+9sfr!1?Y{>;qCDTgTVS-jE= zBuL)#r}@ZgDiAH$LACJE0HVEChuulHH#$EmD$2hJB}(KCk}_pSQIZ-bti!JiGd0(N1jBHiY`En5JzWETb-c_P6O-u==v{rs)fY4G{ zQ{yd$2k1x<9YRM>ji8&mHa5u~=&VArEPc%x`zLt$w@f}d)g3O?8WRc_SfqwY9H)*X z{^vlCKvf>H)=}tMtqq}T4e_>|qT^S^`YtrR(J(V{X3F@@4S>*kvVYA3pgv zJqe@|@U1cePhzMJS2`hB^QGWmJ;WlbDBchaS{`y>3n%eZg zjPgmwYhF5evns0~tL?P$8-5VU;I5kg5nRqlxC*Kl^3RxJ0@yHg$Yh;{dEY=tkoCjk zy6)$`BT%5|zy<@umb8}#9}OP5>vd`lQ@$B4;kOX-jH2(5t?^O?l_LND7z&9&vWn(fuDyJ= zgMNj#l5y0s8A#g1bL@?+fXIo!`nfvDaPqIznmROrnlC1V=DGv)Qs z9%N0@tzdo|4;`zp?|&(HD_ z)^23X3Mimu@$mj=!?^F?8J~aD=28xG8ChD1Z%GO0m}3K! zN$)V+#JFHpWwB$gEDQ0<4F9pI?RYiHX2dg)*c=KWc2&}*y$*QFy!OCc(TAv-qgliX z*rX~CBznYz2_GuKA9rVbh@t%_vG0dMa)Ov@7;C;TPBcQc6m3bsBgS|65v`jR62mY- z7%U7zCs=r=$In9L&Hy#*KOU{-GjKB12-q+DBdN@hbdz>y!qKgGi2FeOB z;pt+W9paJK#^>fMBq_I|G~DIq@3`)#635r>`t84c<9hrJ2_gq}`2Uc@)wY`V{=Pt5 zc>s0VL%B3dY)!rtz3%gE2@XfL`uC1cWfRy#Mjt^&-TU__{|zn1!Ols3X$E&5j4h_z$q=U_LA7o4$NPsTyb9cjXmh4 zH{MC$dYVei?{SpA{}wH=Hp&h<6;x3tJWwQ^wyLp3p@jU|9+&eI?JCdtDSR%#LZ7?# zm16XdFU2BBoVr(mbwmEmN#Si1F9c4+NDwM@o&6Z1)$1GAia`U=H<{P=%Qz>a={#WnEe8HWI;e zdGz3fq{q%C2XQRDYLpQEL4;`gtq|1p==R@iugyn9Dm@HYYBBlHnmQM!9{TuNuoB`U zyR)W$H>X;@R4wQP$< z4QWG_=TaqvEVTu?R1X+ltlyXG2JF9eS0I;oy;-cHO^T<TfJd zWif~*KS4E_1l42~>D~VHD|Gar=2WM>;YiW+#ETkveUx|M= z0M*7w5L9o9K#5&3gGAT?C1f=d??5!2obc?0x^4Q8I$AFXaws*D0)pFa=O>HFAsnO( zG4P*)P#-C3aQT};2E6ds3;B4XhwL7$*UXi^n2Sr?e(fdq4F|<_7WpuE74%uagAjdI zh=7=&k=-mbgz)X+qT*L@d`U3A92$fBBLDE`zQ)whP+O*8PJ2*jOmk}S&z}eVcc!gU zz5qPx_aG?XjfbK@X;HhO0+(#q;b9+k-14zvoBiO~kuDlIAjI~t6yT5tQFe2cqCr+W z2FV=!EP#3-QKf2^=#EJ);I#POMPVf_7Z>qrocFrEYk}wkQ)~t3BW$rm`)1KH?=u7i zP*FY8?uG~uOTIS*H=12g+-&Y!Exua_ z?cL33ZX?jf(Ii7qp*d;_`S|ImiE(g{+iHe%OaL;^N9a81uz4^v6X^UgcKMLjP!wis z_BQAT9ava{o|MUxUH14Dx(-wG6YsSP>JCC?BZD&2YzJ(%qd%Y7n!na&mzx-My;xLK zNm3Df7vQkTvLZN8SnW}d19bgn0;*{TV!7zGxeRvl$I?nYVWN*a(-l8I% zoY5|pCIRyd^C|?UL;H$@gH;@haNT48Z0l$cuzhrafvxh$<2@5^Yrp<3wPL6GF{i{i znafRu9{^j3+64ztd{NOkupMMm=+H;dp_b60+ax#?0@&n>=^Pi|=(ERd^%=C9Ex@WSWTab5WHx^et-d(K=^$n1pw=MkFmw7$WIwc7=kb25HH%3O8$ z?uCb1IVTUyGbN4Qn9+Jz8jtQF&XcIeOkMHG@aN-UH_dQNbbQRKKEf1m_xefB@Mb5& zkGGZeb-Ivm`n1BkT9c?<>5qzI;~W}bIJ)7SSU{EJ zzZY`4uNFBasJ$a@7A}tbj!%f8pM$f7OTC7f(2PgnvI=bA21OMStp|yedqO-KVJuYo z0>JszJ}*8O1ZE!~Fe{0%hXtJV4s)2fqV3Kz-KLkMMMK&G_|^BP^TwW(ArtiNJ(J z0~OLoe-I}5Vw{z#)t<0vCUnj`yIhU0Jy0;GSYv+2BBkI}eH1b)*fimsvWya}hiM}G z-5RxOe8;4K&NZgPHI ztH|tJUt+R{*452So^@gQG`?!X2(vW&qeFrkeZlNLsEHVrdxy?YST3%-bcy+#P)Fx> zmqWrrMXb>}(RvO%rMQ+N6y$oK$?z>ZI0Um)OjB zVb;U52@Ga)@mM=(uXV>$xtj(+4)hM*5E{_;{9K)#P}sX)B)eB}6?nz9*d?}R(i-&| zpB;h<92hEAp&0|w-WS$)&jzuR)FSgNH#Wr+&!+}q_T z2GW`L;P(h5V|E{}o&919=2-d`E+nbqKAv8=>(D&m{AJrtSn|5$QzGA|qM+l~PdX`h zf&~UVk|oDg)`9$gpXHb}5_3v?nEv%hHrhAMgMa};ruG^LWFXR47oIpnaq#P__h(dwFYa<9v3F}py{h2VbNwV3c@UcA>v*pUJAsM>}4`f86Ivi ze<4kz;EpZ#Y92!R9friPu#H3BVZ8G&@Cs)`Q-IaVT*a=`k!Sv65rN@a*lb!|w zW_3MC(^;5;@ z+6Xh0z_mf!Brb~2(E2_pe6rgNb-!Nh(lTQ|TCXa=`?S|0u(PCjV`;D8Y?oU*oUE7NRtR?W zaSMmCj;+D8k=TqUW!jttI86ru^$w>g13>hAnws0TdcTI#*uvWL`BgfJioCgz(5+%` zo~83uOCd&`6b;C-(9AL|ws>5+bBA5qXBw%ygQ9BQe+EK5kxkToFVK;=FIq#y7$*LHY z+6UAlW)={bjHq=3x-oa7(r2kstLpJMdnR}SE+hVlZzBs`rJu&uK=*O9zbY$$@9z0v zScy!oR>OjQ>&?fh#8I+UVrmwV0xv!2MpKihN?jLOr$>UphB+A!R5BGZMRS*tlW<#* zFIQ#OSaLAO*k34a`}9%<-Ecv;iv`44um%1-3-gh3IY+IpTbfu3{2qGGY2a6!S!{SI8aWg;M1UNBE?REW{nivQ5Vqh70wo#C>LN6&<^D^hS-=gmrtv zwZg46G9jTBFLFBJyE~dQrx}v==BO&gx*nWr1 z3s1pa-W~og=fdLCDI;Omuys;LMQ4rnA*J)B3%g#byG^#t27KjL$enh#a|Xez&X%$=Tk$Y>pBVS)?4?q+&hC?%P19R$oYYGyauOI>Ia zFFT7lZY!@qNPv#~f=;Xbdig17wPn5oW))Xs5%W%PYgH zw^8$FNf|r!%>F&e^(VY77ZC=NHtQH?d1u-0$KS|s;yQ=6G{Zt%*Ph9X#D7UEH2Jtj z_ozr;_uFT`faNsv$_>_`@U--`?We3dYR-%}%GOm?*YMrumt>uI>YY|XAbN_=jISie zpW1mgD}bT87Z$&k6KvWb(hi~on znqD8s;KxqKh6v5)A;L41(yN`*nVWqa{nqleW;dL^leff{mvySyV7HwP$Xg4}^=#0B zL)O`@?}J&|wy9Ks!0FbwB?v;;N6|^mo>VVfzXP|T#Pg1Ck7Vbk;Sg;k1K(OSJ`!Tt zxFIh)M9w=S(cj)UO;6kNQ$UCUCyfmuBgZo;@v*PSB$9VW6UBP7!7aajHM895H*bD} zcosN>$?d05`+BDWQ-$;0(R_o9MbWRruYjUnV}Qa5lKtjSZDY zha3hZC!7NdC2CfSQ{@kP{J{Y^Us^?j0(qQk{K4J($qSBFj2n4poZBlV9U(2La$Ak5 z;-K6u1RD2h#I@zihOPEs@nS6K5gZd?6{T z?nZlwfS=laJ;Vb3ER8Mz^MyU(BKvgDoc5*f0+w87MTwMEyB~qIOzwGFzxypmE*5m9 z$G|^@^+qH@6DoFNcQ-r9MsmX|F(e?VVj^9`8&RWm-0mln^VnuRu5Xwb9CRFJlST)6 zMEo{Bf=q-Ht)i3Dii1bx2NbBc^CTDH6e)>$1kJUj1Wz|4fv=i*@eeOq_kGBJpsJ=M z=jHLetxb8zyPkN9n|5f(%?|`);6z;^xUg3l>dnAfak#?N|QoJ;f zto1Vn=+SVqzG5sDq?%S@C^KJFm^#+@cg-~{Gh1}Y_G3uc z+9}jN{rh zXnF;8-3Ia!pa7`}vso4+Waen2FvYRx-8X6(F&mqZO6r~mtdh#-BGVNYYv`0Aw+xbp z9Ir3Lz_H;y{Z>Gyp|1ce5qP;CJF2nLqk5HCFjQt+&SdgRL^^-pAu;AGirurz?((qR zppbYahMP|Ay>2LM{>Wo(JFt0CF_<`SYb^V%oHDxN+PXlkor7M722?U{6Q^O7OswQb z=;{gY6$T&oM^w9R;CG`!6`U134tWAJ>_fpjnGGPY=wj3O7?%rSOUjMSPwGF`xm>wI zL6WH2MUvm`rb05Y(|XPRn&ob%Fpmkg6Ohb$%^A)X2M=067PSTMwx_?H>pRiD(KBt? z2qcTeDk{+qApJQD$(nB;eFf#8l^9xZgum`DL@p|VDT3J8ET0Zi5`g5-R}Qxddu(h_ zS7O-Acg*D{U9LDaH9O{5F5SqhRUwTD)fSdD@f7qXCTiNZoe?xhkld(wS$Sm`u!8%L z0)e&3$89wg6_&N0>Ij=6OhjcT&CvZymD`-qH=t|d`fXJF5tUFw*8IG=>KiPO0~o=C z7$h7hnLLe7+eeS%Cf=kOD_$?oMX_v4*IHoV16$2xyyed`hp~R}H>Sr(?kS1?e7Gak3@l zzcxJ7_EBGHl!Pa9psqOpv^+pckPS(HOOR-w)ybbZ!UkWl&e>d#BP<;evR@nk-M`|R zzU%Ht&B_w(Q^N&GS%HmBNFCC06Fhb>MYm8) z(c8z6oH8w_DpbPsBycR}K}dS`SiWyVQ9ayae^MO}DbJrb)Wcg%y%T$Cg5gQ9e)rvi z)z#R|y!%`d4FY86;goSdZ}p+e-;TVyp}4V_t72IT{P@wlD#GpM#s+=HbE#u#mdP-2 z(MEEYOZCv}BvOJDi|a)r?NV;&3P56d#0R#5u6-kqYR3id>m#Y^>Ac<7S~DY4kFW8D zt>+$L7a3t-`UlA5M0hw-2v{d_z(Z!Q1;WGlE4&Q4VC@Kxj|R%=qWl=jQjJp2aH{w6 z^7GwP-;%z9chULNwH*IN{Q~)PS5rdmAp~e;*dU#*&xr`?vZ5=s9`lkHM&r4cLreW! zXD>9#-0CHdQD*~L=$`6ezArs;G8YNB7ID^_AjgM?B*u5VKyo{(7Y_91$tzg|a3>Ft z)+V~7aKSU2_1Y|q7v_Ru*0!IK35KLqa=-V!-2%h} z3g4%n?~b+#L&@m7s?~qbt&!tnJu9 z(zc+f=%X}L(yjHjCtVM`3^kjkdq7pE8GcLh0&#)B#N6}@jhZX@ePX?G+5nchi3t%G zt#5V^WO6z%c?;lGF!@JF!Fg99Q!~v4;1S|NU{{yzkNjb6kh9oMm>TGr8W5 z4p#8e00rpANx;T?U>hf1ZiJWh3rT#+e&cU?D4S-vL0oj0GwgMziw+7Aq~x^<$?Fo$ z=>e6upeXak2%_biZ)V=Hf3>`H{ky+j(D6@TO8EYVPMJwtJD#xX#smo!(sisxy!=5^q1pP%b zz6>h1_XJ&{J_y*}3nu`;h6B1rf$6&ZCCJ~Tr$0>6h<}go(y(5#K8$bn2ViTCtX+F# zto$kOKIqcFoa}G-Fa@a+!A+uZP(s;1W$gS!Wwp|BR>fAhqQcLWSFkgOR$NELLp3@q z{y=>2Kw0y~ezA(DM;WqHU`c=rAT%^0RVhaL*6{kHIh|y3iEMXpJ@L_5q0bA+zq^VB zeHxHm1)O|}3rkGQkJun4(-8mhQVs9}K{VH~4kMH1qqZ4Q09p{Sd;~`th=FN-(wj)s z>Km=J>s>~PsIhQxws)7oysx0Ho{`XNoIwr93=ZfS2L`gu2oO6w!bv)IEZF6}_@elE zmu(l2$Yoll#%r^gqO0h;wz*RX=_lXoFr2u8>9=OX|NDMo?`TzoijcP;rPlgcU$z`* zDLpm2Zk_QfeNNJM54tFWSDY<#fA?x76U48pyXeBHXGy2n^FCB`WPs}?TA-d>WvrC- zorVS%-zT0U42Vh;;la58>d?+5L5;}7(sFO|SDkgCZC8p!D~8*r>n}cQmUY_)k35$5 zs|#<(@I{tma7Z1UmrP+~RZra`KIh$(Fk7 z9|q7(aYAyK5M8ud*cOq5-}2XT*>H1a>mIBsF8VT8v-6inUrFR?mIift0Rw?^L-=QD z6G8RwzA!N4Is!ei;e_Q>LW2nYFgU%W6_m}fnt^a)kXcAF+& zNLg9gv7sQ)pJ-z5Q4Efp!XR@U0>w5@f`+2{eB8Xd?qWFh+;EHpbbUPEdyhd)8MZ6% zX_JAk$bNP4qv%2TYnJuL+NVGMq+G~q#5+>e6lGLYb2S`nZ}ZPTJBks6j*bDNnP8*+ z`I=oWb5#npmFjm_j@`d25Y=#f#Y!!97!;Dq-&`rIO1T~d^z2w%TscpSIk3R|;c z_t=0-ax8dTYrZa&h!V>q>p$;-?ul{?bH}s8z3_pfNtwt!--a?g(TE?@qe+ zelS8;p!vPm_62MOr!zvgbD!Q#kf-;Y&ZJC<$X~p}7ou9p0^iZ5Am@(0ODR%**3gxY zja+}8ic$)3*>GjVB{6+4{fN?>j~6mI?D6L0nI!!j&~IC)%fu{Tnk8$6QiCfQ@&!Mxx*RrxFNfn+}5H|pKi8lGh1~#{D(#D41N!QA>ls56) z2>ZOdDmH!$k9(5{m7+=}qdP8s43S$y-lARj(ERn*_%8a{p@A8Mkb#l2!}y8n<2Tx` z0;hWdKT`}+vdV4^T`wy1cs}Qbo$x63sz?4>a_rmj!2>Nh^v<~<n(s6Tt(yAsQi{EfgyXs)_bJq1YBc;*u z-W(T|BtaSNs>jEy9=8|#0)Ig5u$Kl8Guj+fVYLh z)9!r$<=iwC257)AZr&Uom{5N|x6i+}bFP@tJ9kN#c&UoSNe(F2~+HT`05(o&W!s6NaQ`i3WcPP;n?wSV5b6K=bw=)9d@Rb znbesj4|0NATj>~7%pe~B7bQ$kaF9?zcm8~bOZgRBv}UzyW`2GUlKeAK?I4uc>g_^p zjTbe5P=Mya4>;qNPZPqLdEbDJuS|`Lxj1e6f|s=tjuq3jrw{BqaA$-_SuEZ}g;* zz)0%uT)hjq*%Fhz4Q*L7JZB+4u4B_fg!t6Ii^#m*?9X`OhQMh#MM7{^Rad7er`)-m zHnKAfJ{cvj1$tzN5dY)R&I=ybSMz3h;(f8jW>*y=l@@}I7bS{ZW3A0!7EK2oxGbmE zxHu+sea|fKa)la9p{@@O;#5ShyD8k+2CRK6_aZJxTI{v!ZTaZvv{7>kniqkodRfk` z37LORukHtlOBeT$|CsY>G+^9>(9hF9LfO`OFiEm} zN@lAt&(GDaorAY^Azb4-IlWkjP?+OwmFhmmt-M5>oO9#P+2CLn+Zogjnfqu~p!S0T}J_g38eSKYSm+Utm zgspoLs=xw3JW9bwTyDANXO4}`nKxffMGg6e+h=&`I-iS}7)Q60-`_zl1>KSZ8YDpx zLIr+6)B%2gcLqNYcKYWR{{bZEZy@&f@83cG|L-8!174rs(S6bh=u=p*hWtuWOjfi& ISm(?C2Vbg}{Qv*} literal 302307 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

INkic#ym?MeA0oNz^ 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�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

WZLN?sds9p*lLkwnm#>8p=jLNnGE~GP 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 MAunF^O7GME1HwJWu>b%7 diff --git a/examples/demo/main.go b/examples/demo/main.go index 9c77078..0eedc68 100644 --- a/examples/demo/main.go +++ b/examples/demo/main.go @@ -15,6 +15,9 @@ var html = ` - go-charts - - -

- - -` - -var chartOptions = []map[string]string{ - { - "title": "折线图", - "option": `{ - "title": { - "text": "Line\nHello World", - "left": "right", - "textStyle": { - "fontSize": 24, - "height": 40 - } - }, - "yAxis": { - "min": 0, - "max": 300 - }, - "xAxis": { - "type": "category", - "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - }, - "series": [ - { - "data": [150, 230, 224, 218, 135, 147, 260], - "type": "line" - } - ] -}`, - }, - { - "title": "多折线图", - "option": `{ - "title": { - "text": "Multi Line" - }, - "legend": { - "align": "left", - "right": 0, - "data": ["Email", "Union Ads", "Video Ads", "Direct", "Search Engine"] - }, - "xAxis": { - "type": "category", - "boundaryGap": false, - "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - }, - "series": [ - { - "type": "line", - "data": [120, 132, 101, 134, 90, 230, 210] - }, - { - "data": [220, 182, 191, 234, 290, 330, 310] - }, - { - "data": [150, 232, 201, 154, 190, 330, 410] - }, - { - "data": [320, 332, 301, 334, 390, 330, 320] - }, - { - "data": [820, 932, 901, 934, 1290, 1330, 1320] - } - ] -}`, - }, - { - "title": "柱状图", - "option": `{ - "xAxis": { - "type": "category", - "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - }, - "series": [ - { - "data": [120, 200, 150, 80, 70, 110, 130], - "type": "bar" - } - ] -}`, - }, - { - "title": "柱状图(自定义颜色)", - "option": `{ - "xAxis": { - "type": "category", - "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - }, - "series": [ - { - "data": [ - 120, - { - "value": 200, - "itemStyle": { - "color": "#a90000" - } - }, - 150, - 80, - 70, - 110, - 130 - ], - "type": "bar" - } - ] -}`, - }, - { - "title": "多柱状图", - "option": `{ - "title": { - "text": "Rainfall vs Evaporation" - }, - "legend": { - "data": ["Rainfall", "Evaporation"] - }, - "xAxis": { - "type": "category", - "splitNumber": 12, - "data": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] - }, - "series": [ - { - "name": "Rainfall", - "type": "bar", - "data": [2, 4.9, 7, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20, 6.4, 3.3] - }, - { - "name": "Evaporation", - "type": "bar", - "data": [2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6, 2.3] - } - ] -}`, - }, - { - "title": "折柱混合", - "option": `{ - "legend": { - "data": [ - "Evaporation", - "Precipitation", - "Temperature" - ] - }, - "xAxis": { - "type": "category", - "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - }, - "yAxis": [ - { - "type": "value", - "name": "Precipitation", - "min": 0, - "max": 250, - "interval": 50, - "axisLabel": { - "formatter": "{value} ml" - } - }, - { - "type": "value", - "name": "Temperature", - "min": 0, - "max": 25, - "interval": 5, - "axisLabel": { - "formatter": "{value} °C" - } - } - ], - "series": [ - { - "name": "Evaporation", - "type": "bar", - "itemStyle": { - "color": "#0052d9" - }, - "data": [2, 4.9, 7, 23.2, 25.6, 76.7, 135.6] - }, - { - "name": "Precipitation", - "type": "bar", - "data": [2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6] - }, - { - "name": "Temperature", - "type": "line", - "yAxisIndex": 1, - "data": [2, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3] - } - ] -}`, - }, - { - "title": "降雨量", - "option": `{ - "title": { - "text": "降雨量" - }, - "legend": { - "data": ["GZ", "SH"] - }, - "xAxis": { - "type": "category", - "splitNumber": 6, - "data": ["01-01","01-02","01-03","01-04","01-05","01-06","01-07","01-08","01-09","01-10","01-11","01-12","01-13","01-14","01-15","01-16","01-17","01-18","01-19","01-20","01-21","01-22","01-23","01-24","01-25","01-26","01-27","01-28","01-29","01-30","01-31"] - }, - "yAxis": { - "axisLabel": { - "formatter": "{value} mm" - } - }, - "series": [ - { - "type": "bar", - "data": [928,821,889,600,547,783,197,853,430,346,63,465,309,334,141,538,792,58,922,807,298,243,744,885,812,231,330,220,984,221,429] - }, - { - "type": "bar", - "data": [749,201,296,579,255,159,902,246,149,158,507,776,186,79,390,222,601,367,221,411,714,620,966,73,203,631,833,610,487,677,596] - } - ] -}`, - }, - { - "title": "饼图", - "option": `{ - "title": { - "text": "Referer of a Website" - }, - "series": [ - { - "name": "Access From", - "type": "pie", - "radius": "50%", - "data": [ - { - "value": 1048, - "name": "Search Engine" - }, - { - "value": 735, - "name": "Direct" - }, - { - "value": 580, - "name": "Email" - }, - { - "value": 484, - "name": "Union Ads" - }, - { - "value": 300, - "name": "Video Ads" - } - ] - } - ] -}`, - }, -} - -type renderOptions struct { - theme string - width int - height int - onlyCharts bool -} - -func render(opts renderOptions) ([]byte, error) { - data := bytes.Buffer{} - for _, m := range chartOptions { - chartHTML := []byte(`
-

{{title}}

-
{{option}}
- {{svg}} -
`) - if opts.onlyCharts { - chartHTML = []byte(`
- {{svg}} -
`) - } - o, err := charts.ParseECharsOptions(m["option"]) - if opts.width > 0 { - o.Width = opts.width - } - if opts.height > 0 { - o.Height = opts.height - } - - o.Theme = opts.theme - if err != nil { - return nil, err - } - g, err := charts.New(o) - if err != nil { - return nil, err - } - buf, err := charts.ToSVG(g) - if err != nil { - return nil, err - } - buf = bytes.ReplaceAll(chartHTML, []byte("{{svg}}"), buf) - buf = bytes.ReplaceAll(buf, []byte("{{title}}"), []byte(m["title"])) - buf = bytes.ReplaceAll(buf, []byte("{{option}}"), []byte(m["option"])) - data.Write(buf) - } - return data.Bytes(), nil -} - -func indexHandler(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/" { - return - } - query := r.URL.Query() - opts := renderOptions{ - theme: query.Get("theme"), - } - if query.Get("view") == "grid" { - opts.width = 400 - opts.height = 200 - opts.onlyCharts = true - } - - buf, err := render(opts) - if err != nil { - w.WriteHeader(400) - w.Write([]byte(err.Error())) - return - } - - data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), buf) - w.Header().Set("Content-Type", "text/html") - w.Write(data) -} - -func main() { - http.HandleFunc("/", indexHandler) - http.ListenAndServe(":3012", nil) -} diff --git a/examples/demo/main.go b/examples/demo/main.go index 26866d9..f0e32c7 100644 --- a/examples/demo/main.go +++ b/examples/demo/main.go @@ -5,6 +5,7 @@ import ( "net/http" charts "github.com/vicanso/go-charts" + "github.com/wcharczuk/go-chart/v2" ) var html = ` @@ -18,6 +19,10 @@ var html = ` body { background-color: #e0e0e0; } + * { + margin: 0; + padding: 0; + } .charts { width: 810px; margin: 10px auto; @@ -56,321 +61,117 @@ var html = ` ` -var chartOptions = []map[string]string{ - { - "option": `{ - "title": { - "text": "Line", - "left": "center" - }, - "yAxis": { - "min": 0, - "max": 300 - }, - "xAxis": { - "type": "category", - "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - }, - "series": [ - { - "data": [150, 230, 224, 218, 135, 147, 260], - "type": "line", - "label": { - "show": true, - "distance": 5 - } - } - ] -}`, - }, - { - "option": `{ - "legend": { - "align": "left", - "left": 0, - "data": ["Email", "Union Ads", "Video Ads", "Direct", "Search Engine"] - }, - "xAxis": { - "type": "category", - "boundaryGap": false, - "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - }, - "series": [ - { - "type": "line", - "data": [120, 132, 101, 134, 90, 230, 210] - }, - { - "data": [220, 182, 191, 234, 290, 330, 310] - }, - { - "data": [150, 232, 201, 154, 190, 330, 410] - }, - { - "data": [320, 332, 301, 334, 390, 330, 320] - }, - { - "data": [820, 932, 901, 934, 1290, 1330, 1320] - } - ] -}`, - }, - { - "title": "柱状图(自定义颜色)", - "option": `{ - "xAxis": { - "type": "category", - "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - }, - "series": [ - { - "data": [ - 120, - { - "value": 200, - "itemStyle": { - "color": "#a90000" - } - }, - 150, - 80, - 70, - 110, - 130 - ], - "type": "bar", - "label": { - "show": true, - "distance": 10 - } - } - ] -}`, - }, - { - "title": "多柱状图", - "option": `{ - "title": { - "text": "Rainfall vs Evaporation", - "top": 10 - }, - "legend": { - "data": ["Rainfall", "Evaporation"] - }, - "xAxis": { - "type": "category", - "splitNumber": 12, - "data": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] - }, - "series": [ - { - "name": "Rainfall", - "type": "bar", - "data": [2, 4.9, 7, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20, 6.4, 3.3] - }, - { - "name": "Evaporation", - "type": "bar", - "data": [2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6, 2.3] - } - ] -}`, - }, - { - "title": "折柱混合", - "option": `{ - "legend": { - "data": [ - "Evaporation", - "Precipitation", - "Temperature" - ] - }, - "xAxis": { - "type": "category", - "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - }, - "yAxis": [ - { - "type": "value", - "name": "Precipitation", - "min": 0, - "max": 250, - "interval": 50, - "axisLabel": { - "formatter": "{value} ml" - } - }, - { - "type": "value", - "name": "Temperature", - "min": 0, - "max": 25, - "interval": 5, - "axisLabel": { - "formatter": "{value} °C" - } - } - ], - "series": [ - { - "name": "Evaporation", - "type": "bar", - "itemStyle": { - "color": "#0052d9" - }, - "data": [2, 4.9, 7, 23.2, 25.6, 76.7, 135.6] - }, - { - "name": "Precipitation", - "type": "bar", - "data": [2.6, 5.9, 9, 26.4, 28.7, 70.7, 175.6] - }, - { - "name": "Temperature", - "type": "line", - "yAxisIndex": 1, - "data": [2, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3] - } - ] -}`, - }, - { - "title": "降雨量", - "option": `{ - "title": { - "text": "Rainfall", - "left": "right" - }, - "legend": { - "data": ["GZ", "SH"] - }, - "xAxis": { - "type": "category", - "splitNumber": 6, - "data": ["01-01","01-02","01-03","01-04","01-05","01-06","01-07","01-08","01-09","01-10","01-11","01-12","01-13","01-14","01-15","01-16","01-17","01-18","01-19","01-20","01-21","01-22","01-23","01-24","01-25","01-26","01-27","01-28","01-29","01-30","01-31"] - }, - "yAxis": { - "axisLabel": { - "formatter": "{value} mm" - } - }, - "series": [ - { - "type": "bar", - "data": [928,821,889,600,547,783,197,853,430,346,63,465,309,334,141,538,792,58,922,807,298,243,744,885,812,231,330,220,984,221,429] - }, - { - "type": "bar", - "data": [749,201,296,579,255,159,902,246,149,158,507,776,186,79,390,222,601,367,221,411,714,620,966,73,203,631,833,610,487,677,596] - } - ] -}`, - }, - { - "title": "饼图", - "option": `{ - "title": { - "text": "Referer of a Website" - }, - "series": [ - { - "name": "Access From", - "type": "pie", - "radius": "50%", - "label": { - "show": true - }, - "data": [ - { - "value": 1048, - "name": "Search Engine" - }, - { - "value": 735, - "name": "Direct" - }, - { - "value": 580, - "name": "Email" - }, - { - "value": 484, - "name": "Union Ads" - }, - { - "value": 300, - "name": "Video Ads" - } - ] - } - ] -}`, - }, -} - -type renderOptions struct { - theme string - width int - height int - onlyCharts bool -} - -func render(opts renderOptions) ([]byte, error) { - data := bytes.Buffer{} - for _, m := range chartOptions { - chartHTML := []byte(`
- {{svg}} -
`) - o, err := charts.ParseECharsOptions(m["option"]) - if err != nil { - return nil, err - } - if opts.width > 0 { - o.Width = opts.width - } - if opts.height > 0 { - o.Height = opts.height - } - - for _, theme := range []string{ - charts.ThemeDark, - charts.ThemeLight, - } { - o.Theme = theme - g, err := charts.New(o) - if err != nil { - return nil, err - } - buf, err := charts.ToSVG(g) - if err != nil { - return nil, err - } - buf = bytes.ReplaceAll(chartHTML, []byte("{{svg}}"), buf) - data.Write(buf) - } - } - return data.Bytes(), nil -} - func indexHandler(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { return } - query := r.URL.Query() - opts := renderOptions{ - theme: query.Get("theme"), - width: 400, - height: 200, - onlyCharts: true, - } - buf, err := render(opts) + + d, err := charts.NewLineChart(charts.LineChartOption{ + ChartOption: charts.ChartOption{ + Theme: "dark", + Padding: chart.Box{ + Left: 5, + Top: 15, + Bottom: 5, + Right: 10, + }, + XAxis: charts.XAxisOption{ + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + // BoundaryGap: charts.FalseFlag(), + }, + SeriesList: []charts.Series{ + { + Data: []charts.SeriesData{ + { + Value: 150, + }, + { + Value: 230, + }, + { + Value: 224, + }, + { + Value: 218, + }, + { + Value: 135, + }, + { + Value: 147, + }, + { + Value: 260, + }, + }, + }, + { + Data: []charts.SeriesData{ + { + Value: 220, + }, + { + Value: 182, + }, + { + Value: 191, + }, + { + Value: 234, + }, + { + Value: 290, + }, + { + Value: 330, + }, + { + Value: 310, + }, + }, + }, + { + Data: []charts.SeriesData{ + { + Value: 150, + }, + { + Value: 232, + }, + { + Value: 201, + }, + { + Value: 154, + }, + { + Value: 190, + }, + { + Value: 330, + }, + { + Value: 410, + }, + }, + }, + }, + }, + }) if err != nil { - w.WriteHeader(400) - w.Write([]byte(err.Error())) - return + panic(err) } + buf, _ := d.Bytes() + data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), buf) w.Header().Set("Content-Type", "text/html") w.Write(data) diff --git a/label.go b/label.go deleted file mode 100644 index 6d77eb2..0000000 --- a/label.go +++ /dev/null @@ -1,77 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "github.com/dustin/go-humanize" - "github.com/wcharczuk/go-chart/v2" -) - -type LabelRenderer struct { - Options SeriesLabel - Offset chart.Box -} -type LabelValue struct { - Left int - Top int - Text string -} - -func (l LabelRenderer) Render(r chart.Renderer, canvasBox chart.Box, xrange, yrange chart.Range, style chart.Style, vs chart.ValuesProvider) { - if !l.Options.Show { - return - } - r.SetFontColor(style.FontColor) - r.SetFontSize(style.FontSize) - r.SetFont(style.Font) - offsetX := l.Options.Offset.Left + l.Offset.Left - offsetY := l.Options.Offset.Top + l.Offset.Top - for i := 0; i < vs.Len(); i++ { - vx, vy := vs.GetValues(i) - x := canvasBox.Left + xrange.Translate(vx) + offsetX - y := canvasBox.Bottom - yrange.Translate(vy) + offsetY - - text := humanize.CommafWithDigits(vy, 2) - // 往左移一半距离 - x -= r.MeasureText(text).Width() >> 1 - r.Text(text, x, y) - } -} - -func (l LabelRenderer) CustomizeRender(r chart.Renderer, style chart.Style, values []LabelValue) { - if !l.Options.Show { - return - } - r.SetFont(style.Font) - r.SetFontColor(style.FontColor) - r.SetFontSize(style.FontSize) - offsetX := l.Options.Offset.Left + l.Offset.Left - offsetY := l.Options.Offset.Top + l.Offset.Top - for _, value := range values { - x := value.Left + offsetX - y := value.Top + offsetY - text := value.Text - x -= r.MeasureText(text).Width() >> 1 - r.Text(text, x, y) - } -} diff --git a/legend.go b/legend.go deleted file mode 100644 index c85564f..0000000 --- a/legend.go +++ /dev/null @@ -1,249 +0,0 @@ -// MIT License - -// Copyright (c) 2021 Tree Xie - -// 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. - -package charts - -import ( - "strconv" - "strings" - - "github.com/wcharczuk/go-chart/v2" -) - -type LegendOption struct { - Style chart.Style - Padding chart.Box - Left string - Right string - Top string - Bottom string - Align string - Theme string - IconDraw LegendIconDraw -} - -type LegendIconDrawOption struct { - Box chart.Box - Style chart.Style - Index int - Theme string -} - -const ( - LegendAlignLeft = "left" - LegendAlignRight = "right" -) - -type LegendIconDraw func(r chart.Renderer, opt LegendIconDrawOption) - -func DefaultLegendIconDraw(r chart.Renderer, opt LegendIconDrawOption) { - if opt.Box.IsZero() { - return - } - r.SetStrokeColor(opt.Style.GetStrokeColor()) - strokeWidth := opt.Style.GetStrokeWidth() - r.SetStrokeWidth(strokeWidth) - height := opt.Box.Bottom - opt.Box.Top - ly := opt.Box.Top - (height / 2) + 2 - r.MoveTo(opt.Box.Left, ly) - r.LineTo(opt.Box.Right, ly) - r.Stroke() - r.SetFillColor(getBackgroundColor(opt.Theme)) - r.Circle(5, (opt.Box.Left+opt.Box.Right)/2, ly) - r.FillStroke() -} - -func convertPercent(value string) float64 { - if !strings.HasSuffix(value, "%") { - return -1 - } - v, err := strconv.Atoi(strings.ReplaceAll(value, "%", "")) - if err != nil { - return -1 - } - return float64(v) / 100 -} - -func getLegendLeft(canvasWidth, legendBoxWidth int, opt LegendOption) int { - left := (canvasWidth - legendBoxWidth) / 2 - leftValue := opt.Left - if leftValue == "auto" || leftValue == "center" { - leftValue = "" - } - if leftValue == "left" { - leftValue = "0" - } - - rightValue := opt.Right - if rightValue == "auto" || leftValue == "center" { - rightValue = "" - } - if rightValue == "right" { - rightValue = "0" - } - if leftValue == "" && rightValue == "" { - return left - } - if leftValue != "" { - percent := convertPercent(leftValue) - if percent >= 0 { - return int(float64(canvasWidth) * percent) - } - v, _ := strconv.Atoi(leftValue) - return v - } - if rightValue != "" { - percent := convertPercent(rightValue) - if percent >= 0 { - return canvasWidth - legendBoxWidth - int(float64(canvasWidth)*percent) - } - v, _ := strconv.Atoi(rightValue) - return canvasWidth - legendBoxWidth - v - } - return left -} - -func getLegendTop(height, legendBoxHeight int, opt LegendOption) int { - // TODO 支持top的处理 - return 0 -} - -func NewLegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { - return func(r chart.Renderer, cb chart.Box, chartDefaults chart.Style) { - legendDefaults := chart.Style{ - FontColor: getTextColor(opt.Theme), - FontSize: 8.0, - StrokeColor: chart.DefaultAxisColor, - } - - legendStyle := opt.Style.InheritFrom(chartDefaults.InheritFrom(legendDefaults)) - - r.SetFont(legendStyle.GetFont()) - r.SetFontColor(legendStyle.GetFontColor()) - r.SetFontSize(legendStyle.GetFontSize()) - - var labels []string - var lines []chart.Style - // 计算label和lines - for _, s := range series { - if !s.GetStyle().Hidden { - if _, isAnnotationSeries := s.(chart.AnnotationSeries); !isAnnotationSeries { - labels = append(labels, s.GetName()) - lines = append(lines, s.GetStyle()) - } - } - } - - var textHeight int - var textBox chart.Box - labelWidth := 0 - // 计算文本宽度与高度(取最大值) - for x := 0; x < len(labels); x++ { - if len(labels[x]) > 0 { - textBox = r.MeasureText(labels[x]) - labelWidth += textBox.Width() - textHeight = chart.MaxInt(textBox.Height(), textHeight) - } - } - - legendBoxHeight := textHeight + legendStyle.Padding.Top + legendStyle.Padding.Bottom - chartPadding := cb.Top - legendYMargin := (chartPadding - legendBoxHeight) >> 1 - - iconWidth := 25 - lineTextGap := 5 - - iconAllWidth := iconWidth * len(labels) - spaceAllWidth := (chart.DefaultMinimumTickHorizontalSpacing + lineTextGap) * (len(labels) - 1) - - legendBoxWidth := labelWidth + iconAllWidth + spaceAllWidth - - left := getLegendLeft(cb.Width(), legendBoxWidth, opt) - top := getLegendTop(cb.Height(), legendBoxHeight, opt) - - left += (opt.Padding.Left + cb.Left) - top += (opt.Padding.Top + cb.Top) - - legendBox := chart.Box{ - Left: left, - Right: left + legendBoxWidth, - Top: top, - Bottom: top + legendBoxHeight, - } - - chart.Draw.Box(r, legendBox, legendDefaults) - - r.SetFont(legendStyle.GetFont()) - r.SetFontColor(legendStyle.GetFontColor()) - r.SetFontSize(legendStyle.GetFontSize()) - - startX := legendBox.Left + legendStyle.Padding.Left - ty := top + legendYMargin + legendStyle.Padding.Top + textHeight - var label string - var x int - iconDraw := opt.IconDraw - if iconDraw == nil { - iconDraw = DefaultLegendIconDraw - } - align := opt.Align - if align == "" { - align = LegendAlignLeft - } - for index := range labels { - label = labels[index] - if len(label) > 0 { - x = startX - - // 如果图例标记靠右展示 - if align == LegendAlignRight { - textBox = r.MeasureText(label) - r.Text(label, x, ty) - x = startX + textBox.Width() + lineTextGap - } - - // 图标 - iconDraw(r, LegendIconDrawOption{ - Theme: opt.Theme, - Index: index, - Style: lines[index], - Box: chart.Box{ - Left: x, - Top: ty, - Right: x + iconWidth, - Bottom: ty + textHeight, - }, - }) - x += (iconWidth + lineTextGap) - - // 如果图例标记靠左展示 - if align == LegendAlignLeft { - textBox = r.MeasureText(label) - r.Text(label, x, ty) - x += textBox.Width() - } - - // 计算下一个legend的位置 - startX = x + chart.DefaultMinimumTickHorizontalSpacing - } - } - } -} diff --git a/legend_test.go b/legend_test.go deleted file mode 100644 index 8f21210..0000000 --- a/legend_test.go +++ /dev/null @@ -1,113 +0,0 @@ -// MIT License - -// Copyright (c) 2021 Tree Xie - -// 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. - -package charts - -import ( - "bytes" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" -) - -func TestNewLegendCustomize(t *testing.T) { - assert := assert.New(t) - - series := GetSeries([]Series{ - { - Name: "chrome", - }, - { - Name: "edge", - }, - }, chart.TickPositionBetweenTicks, "") - - tests := []struct { - align string - svg string - }{ - { - align: LegendAlignLeft, - svg: "\\nchromeedge", - }, - { - align: LegendAlignRight, - svg: "\\nchromeedge", - }, - } - - for _, tt := range tests { - r, err := chart.SVG(800, 600) - assert.Nil(err) - fn := NewLegendCustomize(series, LegendOption{ - Align: tt.align, - IconDraw: DefaultLegendIconDraw, - Padding: chart.Box{ - Left: 100, - Top: 100, - }, - }) - fn(r, chart.NewBox(11, 47, 784, 373), chart.Style{ - Font: chart.StyleTextDefaults().Font, - }) - buf := bytes.Buffer{} - err = r.Save(&buf) - assert.Nil(err) - assert.Equal(tt.svg, buf.String()) - } -} - -func TestConvertPercent(t *testing.T) { - assert := assert.New(t) - - assert.Equal(-1.0, convertPercent("12")) - - assert.Equal(0.12, convertPercent("12%")) -} - -func TestGetLegendLeft(t *testing.T) { - assert := assert.New(t) - - assert.Equal(150, getLegendLeft(500, 200, LegendOption{})) - - assert.Equal(0, getLegendLeft(500, 200, LegendOption{ - Left: "left", - })) - assert.Equal(100, getLegendLeft(500, 200, LegendOption{ - Left: "20%", - })) - assert.Equal(20, getLegendLeft(500, 200, LegendOption{ - Left: "20", - })) - - assert.Equal(300, getLegendLeft(500, 200, LegendOption{ - Right: "right", - })) - assert.Equal(200, getLegendLeft(500, 200, LegendOption{ - Right: "20%", - })) - assert.Equal(280, getLegendLeft(500, 200, LegendOption{ - Right: "20", - })) - -} diff --git a/line.go b/line.go new file mode 100644 index 0000000..e1f3583 --- /dev/null +++ b/line.go @@ -0,0 +1,105 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +type LineStyle struct { + ClassName string + StrokeDashArray []float64 + StrokeColor drawing.Color + StrokeWidth float64 + FillColor drawing.Color + DotWidth float64 + DotColor drawing.Color + DotFillColor drawing.Color +} + +func (ls *LineStyle) Style() chart.Style { + return chart.Style{ + ClassName: ls.ClassName, + StrokeDashArray: ls.StrokeDashArray, + StrokeColor: ls.StrokeColor, + StrokeWidth: ls.StrokeWidth, + FillColor: ls.FillColor, + DotWidth: ls.DotWidth, + DotColor: ls.DotColor, + } +} + +func (d *Draw) lineFill(points []Point, style LineStyle) { + s := style.Style() + if !(s.ShouldDrawStroke() && s.ShouldDrawFill()) { + return + } + r := d.Render + var x, y int + s.GetFillOptions().WriteDrawingOptionsToRenderer(r) + for index, point := range points { + x = point.X + y = point.Y + if index == 0 { + d.moveTo(x, y) + } else { + d.lineTo(x, y) + } + } + height := d.Box.Height() + d.lineTo(x, height) + x0 := points[0].X + y0 := points[0].Y + d.lineTo(x0, height) + d.lineTo(x0, y0) + r.Fill() +} + +func (d *Draw) lineDot(points []Point, style LineStyle) { + s := style.Style() + if !s.ShouldDrawDot() { + return + } + r := d.Render + dotWith := s.GetDotWidth() + + s.GetDotOptions().WriteDrawingOptionsToRenderer(r) + for _, point := range points { + if !style.DotFillColor.IsZero() { + r.SetFillColor(style.DotFillColor) + } + r.SetStrokeColor(s.DotColor) + d.circle(dotWith, point.X, point.Y) + r.FillStroke() + } +} + +func (d *Draw) Line(points []Point, style LineStyle) { + if len(points) == 0 { + return + } + d.lineFill(points, style) + d.lineStroke(points, style) + d.lineDot(points, style) +} diff --git a/line_chart.go b/line_chart.go new file mode 100644 index 0000000..f1eea22 --- /dev/null +++ b/line_chart.go @@ -0,0 +1,174 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +type LineChartOption struct { + ChartOption +} + +const YAxisWidth = 50 + +func drawXAxis(d *Draw, opt *XAxisOption, theme *Theme) (int, *Range, error) { + dXAxis, err := NewDraw( + DrawOption{ + Parent: d, + }, + PaddingOption(chart.Box{ + Left: YAxisWidth, + }), + ) + if err != nil { + return 0, nil, err + } + data := NewAxisDataListFromStringList(opt.Data) + style := AxisStyle{ + BoundaryGap: opt.BoundaryGap, + StrokeColor: theme.GetAxisStrokeColor(), + FontColor: theme.GetAxisStrokeColor(), + StrokeWidth: 1, + } + + boundary := true + max := float64(len(opt.Data)) + if opt.BoundaryGap != nil && !*opt.BoundaryGap { + boundary = false + max-- + } + + dXAxis.Axis(data, style) + return d.measureAxis(data, style), &Range{ + divideCount: len(opt.Data), + Min: 0, + Max: max, + Size: dXAxis.Box.Width(), + Boundary: boundary, + }, nil +} + +func drawYAxis(d *Draw, opt *ChartOption, theme *Theme, xAxisHeight int) (*Range, error) { + yRange := opt.getYRange(0) + data := NewAxisDataListFromStringList(yRange.Values()) + style := AxisStyle{ + Position: PositionLeft, + BoundaryGap: FalseFlag(), + // StrokeColor: theme.GetAxisStrokeColor(), + FontColor: theme.GetAxisStrokeColor(), + StrokeWidth: 1, + SplitLineColor: theme.GetAxisSplitLineColor(), + SplitLineShow: true, + } + width := d.measureAxis(data, style) + + dYAxis, err := NewDraw( + DrawOption{ + Parent: d, + Width: d.Box.Width(), + // 减去x轴的高 + Height: d.Box.Height() - xAxisHeight, + }, + PaddingOption(chart.Box{ + Left: YAxisWidth - width, + }), + ) + if err != nil { + return nil, err + } + dYAxis.Axis(data, style) + yRange.Size = dYAxis.Box.Height() + return &yRange, nil +} + +func NewLineChart(opt LineChartOption) (*Draw, error) { + d, err := NewDraw( + DrawOption{ + Parent: opt.Parent, + Width: opt.getWidth(), + Height: opt.getHeight(), + }, + PaddingOption(opt.Padding), + ) + if err != nil { + return nil, err + } + + theme := Theme{ + mode: opt.Theme, + } + // 设置背景色 + bg := opt.BackgroundColor + if bg.IsZero() { + bg = theme.GetBackgroundColor() + } + if opt.Parent == nil { + d.setBackground(opt.getWidth(), opt.getHeight(), bg) + } + + xAxisHeight, xRange, err := drawXAxis(d, &opt.XAxis, &theme) + if err != nil { + return nil, err + } + // 暂时仅支持单一yaxis + yRange, err := drawYAxis(d, &opt.ChartOption, &theme, xAxisHeight) + if err != nil { + return nil, err + } + sd, err := NewDraw(DrawOption{ + Parent: d, + }, PaddingOption(chart.Box{ + Left: YAxisWidth, + })) + if err != nil { + return nil, err + } + for i, series := range opt.SeriesList { + points := make([]Point, 0) + for j, item := range series.Data { + y := yRange.getHeight(item.Value) + points = append(points, Point{ + Y: y, + X: xRange.getWidth(float64(j)), + }) + seriesColor := theme.GetSeriesColor(i) + dotFillColor := drawing.ColorWhite + if theme.IsDark() { + dotFillColor = seriesColor + } + sd.Line(points, LineStyle{ + StrokeColor: seriesColor, + StrokeWidth: 2, + DotColor: seriesColor, + DotWidth: 2, + DotFillColor: dotFillColor, + }) + } + + } + // fmt.Println(yRange) + + return d, nil +} diff --git a/line_series_test.go b/line_series_test.go deleted file mode 100644 index 27c9371..0000000 --- a/line_series_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// MIT License - -// Copyright (c) 2021 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" -) - -func TestLineSeries(t *testing.T) { - assert := assert.New(t) - - ls := LineSeries{} - - originalRange := &chart.ContinuousRange{} - xrange := ls.getXRange(originalRange) - assert.Equal(originalRange, xrange) - - ls.TickPosition = chart.TickPositionBetweenTicks - xrange = ls.getXRange(originalRange) - value, ok := xrange.(*Range) - assert.True(ok) - assert.Equal(originalRange, &value.ContinuousRange) -} diff --git a/line_test.go b/line_test.go new file mode 100644 index 0000000..e10b806 --- /dev/null +++ b/line_test.go @@ -0,0 +1,165 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestLineStyle(t *testing.T) { + assert := assert.New(t) + + ls := LineStyle{ + ClassName: "test", + StrokeDashArray: []float64{ + 1.0, + }, + StrokeColor: drawing.ColorBlack, + StrokeWidth: 1, + FillColor: drawing.ColorBlack.WithAlpha(60), + DotWidth: 2, + DotColor: drawing.ColorBlack, + DotFillColor: drawing.ColorWhite, + } + + assert.Equal(chart.Style{ + ClassName: "test", + StrokeDashArray: []float64{ + 1.0, + }, + StrokeColor: drawing.ColorBlack, + StrokeWidth: 1, + FillColor: drawing.ColorBlack.WithAlpha(60), + DotWidth: 2, + DotColor: drawing.ColorBlack, + }, ls.Style()) +} + +func TestDrawLineFill(t *testing.T) { + assert := assert.New(t) + + ls := LineStyle{ + StrokeColor: drawing.ColorBlack, + StrokeWidth: 1, + FillColor: drawing.ColorBlack.WithAlpha(60), + DotWidth: 2, + DotColor: drawing.ColorBlack, + DotFillColor: drawing.ColorWhite, + } + d, err := NewDraw(DrawOption{ + Width: 400, + Height: 300, + }) + assert.Nil(err) + d.lineFill([]Point{ + { + X: 0, + Y: 0, + }, + { + X: 10, + Y: 20, + }, + { + X: 50, + Y: 60, + }, + }, ls) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\n", string(data)) +} + +func TestDrawLineDot(t *testing.T) { + assert := assert.New(t) + + ls := LineStyle{ + StrokeColor: drawing.ColorBlack, + StrokeWidth: 1, + FillColor: drawing.ColorBlack.WithAlpha(60), + DotWidth: 2, + DotColor: drawing.ColorBlack, + DotFillColor: drawing.ColorWhite, + } + d, err := NewDraw(DrawOption{ + Width: 400, + Height: 300, + }) + assert.Nil(err) + d.lineDot([]Point{ + { + X: 0, + Y: 0, + }, + { + X: 10, + Y: 20, + }, + { + X: 50, + Y: 60, + }, + }, ls) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\n", string(data)) +} + +func TestDrawLine(t *testing.T) { + assert := assert.New(t) + + ls := LineStyle{ + StrokeColor: drawing.ColorBlack, + StrokeWidth: 1, + FillColor: drawing.ColorBlack.WithAlpha(60), + DotWidth: 2, + DotColor: drawing.ColorBlack, + DotFillColor: drawing.ColorWhite, + } + d, err := NewDraw(DrawOption{ + Width: 400, + Height: 300, + }) + assert.Nil(err) + d.Line([]Point{ + { + X: 0, + Y: 0, + }, + { + X: 10, + Y: 20, + }, + { + X: 50, + Y: 60, + }, + }, ls) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\n", string(data)) +} diff --git a/range.go b/range.go deleted file mode 100644 index 4e00c60..0000000 --- a/range.go +++ /dev/null @@ -1,93 +0,0 @@ -// MIT License - -// Copyright (c) 2021 Tree Xie - -// 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. - -package charts - -import ( - "math" - - "github.com/wcharczuk/go-chart/v2" -) - -type Range struct { - TickPosition chart.TickPosition - chart.ContinuousRange -} - -func wrapRange(r chart.Range, tickPosition chart.TickPosition) chart.Range { - xr, ok := r.(*chart.ContinuousRange) - if !ok { - return r - } - return &Range{ - TickPosition: tickPosition, - ContinuousRange: *xr, - } -} - -// Translate maps a given value into the ContinuousRange space. -func (r Range) Translate(value float64) int { - v := r.ContinuousRange.Translate(value) - if r.TickPosition == chart.TickPositionBetweenTicks { - v -= int(float64(r.Domain) / (r.GetDelta() * 2)) - } - return v -} - -type HiddenRange struct { - chart.ContinuousRange -} - -func (r HiddenRange) GetDelta() float64 { - return 0 -} - -// Y轴使用的continuous range -// min 与max只允许设置一次 -// 如果是计算得出的max,增加20%的值并取整 -type YContinuousRange struct { - chart.ContinuousRange -} - -func (m YContinuousRange) IsZero() bool { - // 默认返回true,允许修改 - return true -} - -func (m *YContinuousRange) SetMin(min float64) { - // 如果已修改,则忽略 - if m.Min != -math.MaxFloat64 { - return - } - m.Min = min -} - -func (m *YContinuousRange) SetMax(max float64) { - // 如果已修改,则忽略 - if m.Max != math.MaxFloat64 { - return - } - // 此处为计算得来的最大值,放大20% - v := int(max * 1.2) - // TODO 是否要取整十整百 - m.Max = float64(v) -} diff --git a/series.go b/series.go deleted file mode 100644 index f645749..0000000 --- a/series.go +++ /dev/null @@ -1,135 +0,0 @@ -// MIT License - -// Copyright (c) 2021 Tree Xie - -// 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. - -package charts - -import ( - "github.com/wcharczuk/go-chart/v2" -) - -type SeriesData struct { - Value float64 - Style chart.Style -} - -type Series struct { - Type string - Name string - Data []SeriesData - XValues []float64 - YAxisIndex int - Style chart.Style - Label SeriesLabel -} - -const lineStrokeWidth = 2 -const dotWith = 2 - -const ( - SeriesBar = "bar" - SeriesLine = "line" - SeriesPie = "pie" -) - -func NewSeriesDataListFromFloat(values []float64) []SeriesData { - dataList := make([]SeriesData, len(values)) - for index, value := range values { - dataList[index] = SeriesData{ - Value: value, - } - } - return dataList -} -func GetSeries(series []Series, tickPosition chart.TickPosition, theme string) []chart.Series { - arr := make([]chart.Series, len(series)) - barCount := 0 - barIndex := 0 - for _, item := range series { - if item.Type == SeriesBar { - barCount++ - } - } - - for index, item := range series { - style := chart.Style{ - StrokeWidth: lineStrokeWidth, - StrokeColor: getSeriesColor(theme, index), - // TODO 调整为通过dot with color 生成 - DotColor: getSeriesColor(theme, index), - DotWidth: dotWith, - FontColor: getAxisColor(theme), - } - if !item.Style.StrokeColor.IsZero() { - style.StrokeColor = item.Style.StrokeColor - style.DotColor = item.Style.StrokeColor - } - pointIndexOffset := 0 - // 如果居中,需要多增加一个点 - if tickPosition == chart.TickPositionBetweenTicks { - item.Data = append([]SeriesData{ - { - Value: 0.0, - }, - }, item.Data...) - pointIndexOffset = -1 - } - yValues := make([]float64, len(item.Data)) - barCustomStyles := make([]BarSeriesCustomStyle, 0) - for i, item := range item.Data { - yValues[i] = item.Value - if !item.Style.IsZero() { - barCustomStyles = append(barCustomStyles, BarSeriesCustomStyle{ - PointIndex: i + pointIndexOffset, - Index: barIndex, - Style: item.Style, - }) - } - } - baseSeries := BaseSeries{ - Name: item.Name, - XValues: item.XValues, - Style: style, - YValues: yValues, - TickPosition: tickPosition, - YAxis: chart.YAxisSecondary, - Label: item.Label, - } - if item.YAxisIndex != 0 { - baseSeries.YAxis = chart.YAxisPrimary - } - switch item.Type { - case SeriesBar: - arr[index] = BarSeries{ - Count: barCount, - Index: barIndex, - BaseSeries: baseSeries, - CustomStyles: barCustomStyles, - } - barIndex++ - default: - arr[index] = LineSeries{ - BaseSeries: baseSeries, - } - } - } - return arr -} diff --git a/series_test.go b/series_test.go deleted file mode 100644 index 5016aab..0000000 --- a/series_test.go +++ /dev/null @@ -1,125 +0,0 @@ -// MIT License - -// Copyright (c) 2021 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" -) - -func TestNewSeriesDataListFromFloat(t *testing.T) { - assert := assert.New(t) - - assert.Equal([]SeriesData{ - { - Value: 1, - }, - { - Value: 2, - }, - }, NewSeriesDataListFromFloat([]float64{ - 1, - 2, - })) -} - -func TestGetSeries(t *testing.T) { - assert := assert.New(t) - - xValues := []float64{ - 1, - 2, - 3, - 4, - 5, - } - - barData := NewSeriesDataListFromFloat([]float64{ - 10, - 20, - 30, - 40, - 50, - }) - barData[1].Style = chart.Style{ - FillColor: AxisColorDark, - } - seriesList := GetSeries([]Series{ - { - Type: SeriesBar, - Data: barData, - XValues: xValues, - YAxisIndex: 1, - }, - { - Data: NewSeriesDataListFromFloat([]float64{ - 11, - 21, - 31, - 41, - 51, - }), - XValues: xValues, - }, - }, chart.TickPositionBetweenTicks, "") - - assert.Equal(seriesList[0].GetYAxis(), chart.YAxisPrimary) - assert.Equal(seriesList[1].GetYAxis(), chart.YAxisSecondary) - - barSeries, ok := seriesList[0].(BarSeries) - assert.True(ok) - // 居中前置多插入一个点 - assert.Equal([]float64{ - 0, - 10, - 20, - 30, - 40, - 50, - }, barSeries.YValues) - assert.Equal(xValues, barSeries.XValues) - assert.Equal(1, barSeries.Count) - assert.Equal(0, barSeries.Index) - assert.Equal([]BarSeriesCustomStyle{ - { - PointIndex: 1, - Index: 0, - Style: barData[1].Style, - }, - }, barSeries.CustomStyles) - - lineSeries, ok := seriesList[1].(LineSeries) - assert.True(ok) - // 居中前置多插入一个点 - assert.Equal([]float64{ - 0, - 11, - 21, - 31, - 41, - 51, - }, lineSeries.YValues) - assert.Equal(xValues, lineSeries.XValues) -} diff --git a/theme.go b/theme.go index 63e000a..488e11c 100644 --- a/theme.go +++ b/theme.go @@ -1,6 +1,6 @@ // MIT License -// Copyright (c) 2021 Tree Xie +// Copyright (c) 2022 Tree Xie // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -22,201 +22,101 @@ package charts -import ( - "regexp" - "strconv" - "strings" +import "github.com/wcharczuk/go-chart/v2/drawing" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) +const ThemeDark = "dark" +const ThemeLight = "light" -var hiddenColor = drawing.Color{R: 255, G: 255, B: 255, A: 0} - -var AxisColorLight = drawing.Color{ - R: 110, - G: 112, - B: 121, - A: 255, -} -var AxisColorDark = drawing.Color{ - R: 185, - G: 184, - B: 206, - A: 255, +type Theme struct { + mode string } -var GridColorDark = drawing.Color{ - R: 72, - G: 71, - B: 83, - A: 255, +func (t *Theme) IsDark() bool { + return t.mode == ThemeDark } -var GridColorLight = drawing.Color{ - R: 224, - G: 230, - B: 241, - A: 255, -} - -var BackgroundColorDark = drawing.Color{ - R: 16, - G: 12, - B: 42, - A: 255, -} - -var TextColorDark = drawing.Color{ - R: 204, - G: 204, - B: 204, - A: 255, -} - -func getAxisColor(theme string) drawing.Color { - if theme == ThemeDark { - return AxisColorDark - } - return AxisColorLight -} - -func getGridColor(theme string) drawing.Color { - if theme == ThemeDark { - return GridColorDark - } - return GridColorLight -} - -var SeriesColorsLight = []drawing.Color{ - { - R: 84, - G: 112, - B: 198, - A: 255, - }, - { - R: 145, - G: 204, - B: 117, - A: 255, - }, - { - R: 250, - G: 200, - B: 88, - A: 255, - }, - { - R: 238, - G: 102, - B: 102, - A: 255, - }, - { - R: 115, - G: 192, - B: 222, - A: 255, - }, -} - -func getBackgroundColor(theme string) drawing.Color { - if theme == ThemeDark { - return BackgroundColorDark - } - return chart.DefaultBackgroundColor -} - -func getTextColor(theme string) drawing.Color { - if theme == ThemeDark { - return TextColorDark - } - return chart.DefaultTextColor -} - -type ThemeColorPalette struct { - Theme string -} - -type PieThemeColorPalette struct { - ThemeColorPalette -} - -func (tp PieThemeColorPalette) TextColor() drawing.Color { - return getTextColor("") -} - -func (tp ThemeColorPalette) BackgroundColor() drawing.Color { - return getBackgroundColor(tp.Theme) -} - -func (tp ThemeColorPalette) BackgroundStrokeColor() drawing.Color { - return chart.DefaultBackgroundStrokeColor -} - -func (tp ThemeColorPalette) CanvasColor() drawing.Color { - if tp.Theme == ThemeDark { - return BackgroundColorDark - } - return chart.DefaultCanvasColor -} - -func (tp ThemeColorPalette) CanvasStrokeColor() drawing.Color { - return chart.DefaultCanvasStrokeColor -} - -func (tp ThemeColorPalette) AxisStrokeColor() drawing.Color { - if tp.Theme == ThemeDark { - return BackgroundColorDark - } - return chart.DefaultAxisColor -} - -func (tp ThemeColorPalette) TextColor() drawing.Color { - return getTextColor(tp.Theme) -} - -func (tp ThemeColorPalette) GetSeriesColor(index int) drawing.Color { - return getSeriesColor(tp.Theme, index) -} - -func getSeriesColor(theme string, index int) drawing.Color { - return SeriesColorsLight[index%len(SeriesColorsLight)] -} - -func parseColor(color string) drawing.Color { - c := drawing.Color{} - if color == "" { - return c - } - if strings.HasPrefix(color, "#") { - return drawing.ColorFromHex(color[1:]) - } - reg := regexp.MustCompile(`\((\S+)\)`) - result := reg.FindAllStringSubmatch(color, 1) - if len(result) == 0 || len(result[0]) != 2 { - return c - } - arr := strings.Split(result[0][1], ",") - if len(arr) < 3 { - return c - } - // 设置默认为255 - c.A = 255 - for index, v := range arr { - value, _ := strconv.Atoi(strings.TrimSpace(v)) - ui8 := uint8(value) - switch index { - case 0: - c.R = ui8 - case 1: - c.G = ui8 - case 2: - c.B = ui8 - default: - c.A = ui8 +func (t *Theme) GetAxisStrokeColor() drawing.Color { + if t.IsDark() { + return drawing.Color{ + R: 185, + G: 184, + B: 206, + A: 255, } } - return c + return drawing.Color{ + R: 110, + G: 112, + B: 121, + A: 255, + } +} + +func (t *Theme) GetAxisSplitLineColor() drawing.Color { + if t.IsDark() { + return drawing.Color{ + R: 72, + G: 71, + B: 83, + A: 255, + } + } + return drawing.Color{ + R: 224, + G: 230, + B: 242, + A: 255, + } +} + +func (t *Theme) GetSeriesColor(index int) drawing.Color { + colors := t.GetSeriesColors() + return colors[index%len(colors)] +} + +func (t *Theme) GetSeriesColors() []drawing.Color { + return []drawing.Color{ + { + R: 84, + G: 112, + B: 198, + A: 255, + }, + { + R: 145, + G: 204, + B: 117, + A: 255, + }, + { + R: 250, + G: 200, + B: 88, + A: 255, + }, + { + R: 238, + G: 102, + B: 102, + A: 255, + }, + { + R: 115, + G: 192, + B: 222, + A: 255, + }, + } +} + +func (t *Theme) GetBackgroundColor() drawing.Color { + if t.IsDark() { + return drawing.Color{ + R: 16, + G: 12, + B: 42, + A: 255, + } + } + return drawing.ColorWhite } diff --git a/theme_test.go b/theme_test.go deleted file mode 100644 index a25a2db..0000000 --- a/theme_test.go +++ /dev/null @@ -1,122 +0,0 @@ -// MIT License - -// Copyright (c) 2021 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestThemeColors(t *testing.T) { - assert := assert.New(t) - - assert.Equal(AxisColorDark, getAxisColor(ThemeDark)) - assert.Equal(AxisColorLight, getAxisColor("")) - - assert.Equal(GridColorDark, getGridColor(ThemeDark)) - assert.Equal(GridColorLight, getGridColor("")) - - assert.Equal(BackgroundColorDark, getBackgroundColor(ThemeDark)) - assert.Equal(chart.DefaultBackgroundColor, getBackgroundColor("")) - - assert.Equal(TextColorDark, getTextColor(ThemeDark)) - assert.Equal(chart.DefaultTextColor, getTextColor("")) -} - -func TestThemeColorPalette(t *testing.T) { - assert := assert.New(t) - - dark := ThemeColorPalette{ - Theme: ThemeDark, - } - assert.Equal(BackgroundColorDark, dark.BackgroundColor()) - assert.Equal(chart.DefaultBackgroundStrokeColor, dark.BackgroundStrokeColor()) - assert.Equal(BackgroundColorDark, dark.CanvasColor()) - assert.Equal(chart.DefaultCanvasStrokeColor, dark.CanvasStrokeColor()) - assert.Equal(BackgroundColorDark, dark.AxisStrokeColor()) - assert.Equal(TextColorDark, dark.TextColor()) - // series 使用统一的color - assert.Equal(SeriesColorsLight[0], dark.GetSeriesColor(0)) - - light := ThemeColorPalette{} - assert.Equal(chart.DefaultBackgroundColor, light.BackgroundColor()) - assert.Equal(chart.DefaultBackgroundStrokeColor, light.BackgroundStrokeColor()) - assert.Equal(chart.DefaultCanvasColor, light.CanvasColor()) - assert.Equal(chart.DefaultCanvasStrokeColor, light.CanvasStrokeColor()) - assert.Equal(chart.DefaultAxisColor, light.AxisStrokeColor()) - assert.Equal(chart.DefaultTextColor, light.TextColor()) - // series 使用统一的color - assert.Equal(SeriesColorsLight[0], light.GetSeriesColor(0)) -} - -func TestPieThemeColorPalette(t *testing.T) { - assert := assert.New(t) - p := PieThemeColorPalette{} - - // pie无认哪种theme,文本的颜色都一样 - assert.Equal(chart.DefaultTextColor, p.TextColor()) - p.Theme = ThemeDark - assert.Equal(chart.DefaultTextColor, p.TextColor()) -} - -func TestParseColor(t *testing.T) { - assert := assert.New(t) - - c := parseColor("") - assert.True(c.IsZero()) - - c = parseColor("#333") - assert.Equal(drawing.Color{ - R: 51, - G: 51, - B: 51, - A: 255, - }, c) - - c = parseColor("#313233") - assert.Equal(drawing.Color{ - R: 49, - G: 50, - B: 51, - A: 255, - }, c) - - c = parseColor("rgb(31,32,33)") - assert.Equal(drawing.Color{ - R: 31, - G: 32, - B: 33, - A: 255, - }, c) - - c = parseColor("rgba(50,51,52,250)") - assert.Equal(drawing.Color{ - R: 50, - G: 51, - B: 52, - A: 250, - }, c) -} diff --git a/title.go b/title.go deleted file mode 100644 index 228b2c0..0000000 --- a/title.go +++ /dev/null @@ -1,103 +0,0 @@ -// MIT License - -// Copyright (c) 2021 Tree Xie - -// 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. - -package charts - -import ( - "strconv" - "strings" - - "github.com/wcharczuk/go-chart/v2" -) - -type titleMeasureOption struct { - width int - height int - text string -} - -func NewTitleCustomize(title Title) chart.Renderable { - return func(r chart.Renderer, cb chart.Box, chartDefaults chart.Style) { - if len(title.Text) == 0 || title.Style.Hidden { - return - } - font := title.Font - if font == nil { - font, _ = chart.GetDefaultFont() - } - r.SetFont(font) - r.SetFontColor(title.Style.FontColor) - titleFontSize := title.Style.GetFontSize(chart.DefaultTitleFontSize) - r.SetFontSize(titleFontSize) - - arr := strings.Split(title.Text, "\n") - textWidth := 0 - textHeight := 0 - measureOptions := make([]titleMeasureOption, len(arr)) - for index, str := range arr { - textBox := r.MeasureText(str) - - w := textBox.Width() - h := textBox.Height() - if w > textWidth { - textWidth = w - } - if h > textHeight { - textHeight = h - } - measureOptions[index] = titleMeasureOption{ - text: str, - width: w, - height: h, - } - } - - titleX := 0 - switch title.Left { - case "right": - titleX = cb.Left + cb.Width() - textWidth - case "center": - titleX = cb.Left + cb.Width()>>1 - (textWidth >> 1) - default: - if strings.HasSuffix(title.Left, "%") { - value, _ := strconv.Atoi(strings.ReplaceAll(title.Left, "%", "")) - titleX = cb.Left + cb.Width()*value/100 - } else { - value, _ := strconv.Atoi(title.Left) - titleX = cb.Left + value - } - } - - titleY := cb.Top + title.Style.Padding.GetTop(chart.DefaultTitleTop) + (textHeight >> 1) - // TOP 暂只支持数值 - if title.Top != "" { - value, _ := strconv.Atoi(title.Top) - titleY += value - } - - for _, item := range measureOptions { - x := titleX + (textWidth-item.width)>>1 - r.Text(item.text, x, titleY) - titleY += textHeight - } - } -} diff --git a/title_test.go b/title_test.go deleted file mode 100644 index 0fe8256..0000000 --- a/title_test.go +++ /dev/null @@ -1,85 +0,0 @@ -// MIT License - -// Copyright (c) 2021 Tree Xie - -// 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. - -package charts - -import ( - "bytes" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestTitleCustomize(t *testing.T) { - assert := assert.New(t) - tests := []struct { - title Title - svg string - }{ - // 单行标题 - { - title: Title{ - Text: "Hello World!", - Style: chart.Style{ - FontColor: drawing.ColorBlack, - }, - }, - svg: "\\nHello World!", - }, - // 多行标题,靠右 - { - title: Title{ - Text: "Hello World!\nHello World", - Style: chart.Style{ - FontColor: drawing.ColorBlack, - }, - Left: "right", - }, - svg: "\\nHello World!Hello World", - }, - // 标题居中 - { - title: Title{ - Text: "Hello World!", - Style: chart.Style{ - FontColor: drawing.ColorBlack, - }, - Left: "center", - }, - svg: "\\nHello World!", - }, - } - for _, tt := range tests { - r, err := chart.SVG(800, 600) - assert.Nil(err) - fn := NewTitleCustomize(tt.title) - fn(r, chart.NewBox(50, 50, 600, 400), chart.Style{ - Font: chart.StyleTextDefaults().Font, - }) - buf := bytes.Buffer{} - err = r.Save(&buf) - assert.Nil(err) - assert.Equal(tt.svg, buf.String()) - } -} diff --git a/util.go b/util.go index 81c7c04..11fc066 100644 --- a/util.go +++ b/util.go @@ -24,6 +24,16 @@ package charts import "github.com/wcharczuk/go-chart/v2" +func TrueFlag() *bool { + t := true + return &t +} + +func FalseFlag() *bool { + f := false + return &f +} + func getDefaultInt(value, defaultValue int) int { if value == 0 { return defaultValue diff --git a/util_test.go b/util_test.go new file mode 100644 index 0000000..983efbc --- /dev/null +++ b/util_test.go @@ -0,0 +1,121 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestGetDefaultInt(t *testing.T) { + assert := assert.New(t) + + assert.Equal(1, getDefaultInt(0, 1)) + assert.Equal(10, getDefaultInt(10, 1)) +} + +func TestAutoDivide(t *testing.T) { + assert := assert.New(t) + + assert.Equal([]int{ + 0, + 86, + 172, + 258, + 344, + 430, + 515, + 600, + }, autoDivide(600, 7)) +} + +func TestMaxInt(t *testing.T) { + assert := assert.New(t) + + assert.Equal(5, maxInt(1, 3, 5, 2)) +} + +func TestMeasureTextMaxWidthHeight(t *testing.T) { + assert := assert.New(t) + r, err := chart.SVG(400, 300) + assert.Nil(err) + style := chart.Style{ + FontSize: 10, + } + style.Font, _ = chart.GetDefaultFont() + style.WriteToRenderer(r) + + maxWidth, maxHeight := measureTextMaxWidthHeight([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, r) + assert.Equal(26, maxWidth) + assert.Equal(12, maxHeight) +} + +func TestReverseSlice(t *testing.T) { + assert := assert.New(t) + + arr := []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + } + reverseStringSlice(arr) + assert.Equal([]string{ + "Sun", + "Sat", + "Fri", + "Thu", + "Wed", + "Tue", + "Mon", + }, arr) + + numbers := []int{ + 1, + 3, + 5, + 7, + 9, + } + reverseIntSlice(numbers) + assert.Equal([]int{ + 9, + 7, + 5, + 3, + 1, + }, numbers) +} From ffbda8f214da731580e195bac2c4a3090be1671d Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 29 Jan 2022 15:02:01 +0800 Subject: [PATCH 050/251] feat: support title render function --- axis.go | 35 ++++++++++------ axis_test.go | 4 +- chart.go | 75 ++++++++++++++------------------- draw.go | 1 + line_chart.go | 96 +++++++------------------------------------ range.go | 75 +++++++++++++++++++++++++++++++++ range_test.go | 49 ++++++++++++++++++++++ theme.go | 17 ++++++++ title.go | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++ util.go | 1 + xaxis.go | 69 +++++++++++++++++++++++++++++++ yaxis.go | 62 ++++++++++++++++++++++++++++ 12 files changed, 455 insertions(+), 141 deletions(-) create mode 100644 range.go create mode 100644 range_test.go create mode 100644 title.go create mode 100644 xaxis.go create mode 100644 yaxis.go diff --git a/axis.go b/axis.go index 5e33062..9a9508f 100644 --- a/axis.go +++ b/axis.go @@ -239,6 +239,10 @@ func (d *Draw) axisTick(opt *axisOption) { tickCount-- } labelMargin := style.GetLabelMargin() + tickShow := true + if opt.style.TickShow != nil && !*opt.style.TickShow { + tickShow = false + } tickLengthValue := style.GetTickLength() labelHeight := labelMargin + opt.textMaxHeight @@ -254,17 +258,20 @@ func (d *Draw) axisTick(opt *axisOption) { if style.Position == PositionLeft { x0 = labelWidth } - for _, v := range values { - x := x0 - y := v - d.moveTo(x, y) - d.lineTo(x+tickLengthValue, y) - r.Stroke() + if tickShow { + for _, v := range values { + x := x0 + y := v + d.moveTo(x, y) + d.lineTo(x+tickLengthValue, y) + r.Stroke() + } } // 辅助线 if style.SplitLineShow && !style.SplitLineColor.IsZero() { r.SetStrokeColor(style.SplitLineColor) - splitLineWidth := width - labelWidth + splitLineWidth := width - labelWidth - tickLengthValue + x0 = labelWidth + tickLengthValue if position == PositionRight { x0 = 0 splitLineWidth = width - labelWidth - 1 @@ -284,12 +291,14 @@ func (d *Draw) axisTick(opt *axisOption) { if position == PositionTop { y0 = labelHeight } - for _, v := range values { - x := v - y := y0 - d.moveTo(x, y-tickLengthValue) - d.lineTo(x, y) - r.Stroke() + if tickShow { + for _, v := range values { + x := v + y := y0 + d.moveTo(x, y-tickLengthValue) + d.lineTo(x, y) + r.Stroke() + } } // 辅助线 if style.SplitLineShow && !style.SplitLineColor.IsZero() { diff --git a/axis_test.go b/axis_test.go index cfbaec4..06b1a97 100644 --- a/axis_test.go +++ b/axis_test.go @@ -140,7 +140,7 @@ func TestAxis(t *testing.T) { opt.style.BoundaryGap = FalseFlag() return opt }, - result: "\\nMonTueWedThuFriSatSun", + result: "\\nMonTueWedThuFriSatSun", }, // 文本居中展示 // axis位于left @@ -150,7 +150,7 @@ func TestAxis(t *testing.T) { opt.style.Position = PositionLeft return opt }, - result: "\\nMonTueWedThuFriSatSun", + result: "\\nMonTueWedThuFriSatSun", }, // 文本按起始位置展示 // axis位于right diff --git a/chart.go b/chart.go index b768993..e0e9a9a 100644 --- a/chart.go +++ b/chart.go @@ -23,17 +23,13 @@ package charts import ( + "math" + "github.com/dustin/go-humanize" "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" ) -type XAxisOption struct { - BoundaryGap *bool - Data []string - // TODO split number -} - type SeriesData struct { Value float64 Style chart.Style @@ -43,31 +39,6 @@ type Point struct { Y int } -type Range struct { - originalMin float64 - originalMax float64 - divideCount int - Min float64 - Max float64 - Size int - Boundary bool -} - -func (r *Range) getHeight(value float64) int { - v := 1 - value/(r.Max-r.Min) - return int(v * float64(r.Size)) -} - -func (r *Range) getWidth(value float64) int { - v := value / (r.Max - r.Min) - // 移至居中 - if r.Boundary && - r.divideCount != 0 { - v += 1 / float64(r.divideCount*2) - } - return int(v * float64(r.Size)) -} - type Series struct { Type string Name string @@ -78,6 +49,7 @@ type Series struct { type ChartOption struct { Theme string + Title TitleOption XAxis XAxisOption Width int Height int @@ -87,6 +59,29 @@ type ChartOption struct { BackgroundColor drawing.Color } +func (o *ChartOption) FillDefault(t *Theme) { + if o.BackgroundColor.IsZero() { + o.BackgroundColor = t.GetBackgroundColor() + } + if o.Title.Style.FontColor.IsZero() { + o.Title.Style.FontColor = t.GetTitleColor() + } + if o.Title.Style.FontSize == 0 { + o.Title.Style.FontSize = 14 + } + if o.Title.Style.Font == nil { + o.Title.Style.Font, _ = chart.GetDefaultFont() + } + if o.Title.Style.Padding.IsZero() { + o.Title.Style.Padding = chart.Box{ + Left: 5, + Top: 5, + Right: 5, + Bottom: 5, + } + } +} + func (o *ChartOption) getWidth() int { if o.Width == 0 { return 600 @@ -102,8 +97,8 @@ func (o *ChartOption) getHeight() int { } func (o *ChartOption) getYRange(axisIndex int) Range { - min := float64(0) - max := float64(0) + min := math.MaxFloat64 + max := -math.MaxFloat64 for _, series := range o.SeriesList { if series.YAxisIndex != axisIndex { @@ -118,18 +113,8 @@ func (o *ChartOption) getYRange(axisIndex int) Range { } } } - // TODO 对于小数的处理 - - divideCount := 6 - r := Range{ - originalMin: min, - originalMax: max, - Min: float64(int(min * 0.8)), - Max: max * 1.2, - divideCount: divideCount, - } - value := int((r.Max - r.Min) / float64(divideCount)) - r.Max = float64(int(float64(value*divideCount) + r.Min)) + // y轴分设置默认划分为6块 + r := NewRange(min*0.9, max*1.1, 6) return r } diff --git a/draw.go b/draw.go index e7c37a4..037124b 100644 --- a/draw.go +++ b/draw.go @@ -34,6 +34,7 @@ import ( const ( PositionLeft = "left" PositionRight = "right" + PositionCenter = "center" PositionTop = "top" PositionBottom = "bottom" ) diff --git a/line_chart.go b/line_chart.go index f1eea22..553e9b8 100644 --- a/line_chart.go +++ b/line_chart.go @@ -31,78 +31,6 @@ type LineChartOption struct { ChartOption } -const YAxisWidth = 50 - -func drawXAxis(d *Draw, opt *XAxisOption, theme *Theme) (int, *Range, error) { - dXAxis, err := NewDraw( - DrawOption{ - Parent: d, - }, - PaddingOption(chart.Box{ - Left: YAxisWidth, - }), - ) - if err != nil { - return 0, nil, err - } - data := NewAxisDataListFromStringList(opt.Data) - style := AxisStyle{ - BoundaryGap: opt.BoundaryGap, - StrokeColor: theme.GetAxisStrokeColor(), - FontColor: theme.GetAxisStrokeColor(), - StrokeWidth: 1, - } - - boundary := true - max := float64(len(opt.Data)) - if opt.BoundaryGap != nil && !*opt.BoundaryGap { - boundary = false - max-- - } - - dXAxis.Axis(data, style) - return d.measureAxis(data, style), &Range{ - divideCount: len(opt.Data), - Min: 0, - Max: max, - Size: dXAxis.Box.Width(), - Boundary: boundary, - }, nil -} - -func drawYAxis(d *Draw, opt *ChartOption, theme *Theme, xAxisHeight int) (*Range, error) { - yRange := opt.getYRange(0) - data := NewAxisDataListFromStringList(yRange.Values()) - style := AxisStyle{ - Position: PositionLeft, - BoundaryGap: FalseFlag(), - // StrokeColor: theme.GetAxisStrokeColor(), - FontColor: theme.GetAxisStrokeColor(), - StrokeWidth: 1, - SplitLineColor: theme.GetAxisSplitLineColor(), - SplitLineShow: true, - } - width := d.measureAxis(data, style) - - dYAxis, err := NewDraw( - DrawOption{ - Parent: d, - Width: d.Box.Width(), - // 减去x轴的高 - Height: d.Box.Height() - xAxisHeight, - }, - PaddingOption(chart.Box{ - Left: YAxisWidth - width, - }), - ) - if err != nil { - return nil, err - } - dYAxis.Axis(data, style) - yRange.Size = dYAxis.Box.Height() - return &yRange, nil -} - func NewLineChart(opt LineChartOption) (*Draw, error) { d, err := NewDraw( DrawOption{ @@ -119,27 +47,35 @@ func NewLineChart(opt LineChartOption) (*Draw, error) { theme := Theme{ mode: opt.Theme, } - // 设置背景色 - bg := opt.BackgroundColor - if bg.IsZero() { - bg = theme.GetBackgroundColor() - } + opt.FillDefault(&theme) if opt.Parent == nil { - d.setBackground(opt.getWidth(), opt.getHeight(), bg) + d.setBackground(opt.getWidth(), opt.getHeight(), opt.BackgroundColor) } + // 标题 + _, titleHeight, err := drawTitle(d, &opt.Title) + if err != nil { + return nil, err + } + + // xAxis xAxisHeight, xRange, err := drawXAxis(d, &opt.XAxis, &theme) if err != nil { return nil, err } + // 暂时仅支持单一yaxis - yRange, err := drawYAxis(d, &opt.ChartOption, &theme, xAxisHeight) + yRange, err := drawYAxis(d, &opt.ChartOption, &theme, xAxisHeight, chart.Box{ + Top: titleHeight, + }) if err != nil { return nil, err } + sd, err := NewDraw(DrawOption{ Parent: d, }, PaddingOption(chart.Box{ + Top: titleHeight, Left: YAxisWidth, })) if err != nil { @@ -166,9 +102,7 @@ func NewLineChart(opt LineChartOption) (*Draw, error) { DotFillColor: dotFillColor, }) } - } - // fmt.Println(yRange) return d, nil } diff --git a/range.go b/range.go new file mode 100644 index 0000000..c2faf8b --- /dev/null +++ b/range.go @@ -0,0 +1,75 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "math" +) + +type Range struct { + divideCount int + Min float64 + Max float64 + Size int + Boundary bool +} + +func NewRange(min, max float64, divideCount int) Range { + r := math.Abs(max - min) + + // 最小单位计算 + unit := 5 + if r > 100 { + unit = 20 + } + unit = int((r/float64(divideCount))/float64(unit))*unit + unit + + if min != 0 { + min = float64(int(min/float64(unit)) * unit) + // 如果是小于0,int的时候向上取整了,因此调整 + if min < 0 { + min -= float64(unit) + } + } + max = min + float64(unit*divideCount) + return Range{ + Min: min, + Max: max, + divideCount: divideCount, + } +} + +func (r *Range) getHeight(value float64) int { + v := 1 - (value-r.Min)/(r.Max-r.Min) + return int(v * float64(r.Size)) +} + +func (r *Range) getWidth(value float64) int { + v := value / (r.Max - r.Min) + // 移至居中 + if r.Boundary && + r.divideCount != 0 { + v += 1 / float64(r.divideCount*2) + } + return int(v * float64(r.Size)) +} diff --git a/range_test.go b/range_test.go new file mode 100644 index 0000000..151a0bb --- /dev/null +++ b/range_test.go @@ -0,0 +1,49 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestRange(t *testing.T) { + assert := assert.New(t) + + r := NewRange(0, 8, 6) + assert.Equal(0.0, r.Min) + assert.Equal(30.0, r.Max) + + r = NewRange(0, 12, 6) + assert.Equal(0.0, r.Min) + assert.Equal(30.0, r.Max) + + r = NewRange(-13, 18, 6) + assert.Equal(-20.0, r.Min) + assert.Equal(40.0, r.Max) + + r = NewRange(0, 400, 6) + assert.Equal(0.0, r.Min) + assert.Equal(480.0, r.Max) +} diff --git a/theme.go b/theme.go index 488e11c..a67dc02 100644 --- a/theme.go +++ b/theme.go @@ -120,3 +120,20 @@ func (t *Theme) GetBackgroundColor() drawing.Color { } return drawing.ColorWhite } + +func (t *Theme) GetTitleColor() drawing.Color { + if t.IsDark() { + return drawing.Color{ + R: 238, + G: 241, + B: 250, + A: 255, + } + } + return drawing.Color{ + R: 70, + G: 70, + B: 70, + A: 255, + } +} diff --git a/title.go b/title.go new file mode 100644 index 0000000..b37c0da --- /dev/null +++ b/title.go @@ -0,0 +1,112 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "strconv" + "strings" + + "github.com/wcharczuk/go-chart/v2" +) + +type TitleOption struct { + Text string + Style chart.Style + Left string + Top string +} +type titleMeasureOption struct { + width int + height int + text string +} + +func drawTitle(d *Draw, opt *TitleOption) (int, int, error) { + if len(opt.Text) == 0 { + return 0, 0, nil + } + + padding := opt.Style.Padding + titleDraw, err := NewDraw(DrawOption{ + Parent: d, + }, PaddingOption(padding)) + if err != nil { + return 0, 0, err + } + + r := titleDraw.Render + opt.Style.GetTextOptions().WriteToRenderer(r) + arr := strings.Split(opt.Text, "\n") + textMaxWidth := 0 + textMaxHeight := 0 + width := 0 + measureOptions := make([]titleMeasureOption, len(arr)) + for index, str := range arr { + textBox := r.MeasureText(str) + + w := textBox.Width() + h := textBox.Height() + if w > textMaxWidth { + textMaxWidth = w + } + if h > textMaxHeight { + textMaxHeight = h + } + measureOptions[index] = titleMeasureOption{ + text: str, + width: w, + height: h, + } + } + width = textMaxWidth + titleX := 0 + b := titleDraw.Box + switch opt.Left { + case PositionRight: + titleX = b.Width() - textMaxWidth + case PositionCenter: + titleX = b.Width()>>1 - (textMaxWidth >> 1) + default: + if strings.HasSuffix(opt.Left, "%") { + value, _ := strconv.Atoi(strings.ReplaceAll(opt.Left, "%", "")) + titleX = b.Width() * value / 100 + } else { + value, _ := strconv.Atoi(opt.Left) + titleX = value + } + } + titleY := 0 + // TODO TOP 暂只支持数值 + if opt.Top != "" { + value, _ := strconv.Atoi(opt.Top) + titleY += value + } + for _, item := range measureOptions { + x := titleX + (textMaxWidth-item.width)>>1 + titleDraw.text(item.text, x, titleY) + titleY += textMaxHeight + } + height := titleY + padding.Top + padding.Bottom + + return width, height, nil +} diff --git a/util.go b/util.go index 11fc066..041b8c5 100644 --- a/util.go +++ b/util.go @@ -67,6 +67,7 @@ func maxInt(values ...int) int { return result } +// measureTextMaxWidthHeight returns maxWidth and maxHeight of text list func measureTextMaxWidthHeight(textList []string, r chart.Renderer) (int, int) { maxWidth := 0 maxHeight := 0 diff --git a/xaxis.go b/xaxis.go new file mode 100644 index 0000000..01ef2d3 --- /dev/null +++ b/xaxis.go @@ -0,0 +1,69 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import "github.com/wcharczuk/go-chart/v2" + +type XAxisOption struct { + BoundaryGap *bool + Data []string + // TODO split number +} + +// drawXAxis draws x axis, and returns the height, range of if. +func drawXAxis(d *Draw, opt *XAxisOption, theme *Theme) (int, *Range, error) { + dXAxis, err := NewDraw( + DrawOption{ + Parent: d, + }, + PaddingOption(chart.Box{ + Left: YAxisWidth, + }), + ) + if err != nil { + return 0, nil, err + } + data := NewAxisDataListFromStringList(opt.Data) + style := AxisStyle{ + BoundaryGap: opt.BoundaryGap, + StrokeColor: theme.GetAxisStrokeColor(), + FontColor: theme.GetAxisStrokeColor(), + StrokeWidth: 1, + } + + boundary := true + max := float64(len(opt.Data)) + if opt.BoundaryGap != nil && !*opt.BoundaryGap { + boundary = false + max-- + } + + dXAxis.Axis(data, style) + return d.measureAxis(data, style), &Range{ + divideCount: len(opt.Data), + Min: 0, + Max: max, + Size: dXAxis.Box.Width(), + Boundary: boundary, + }, nil +} diff --git a/yaxis.go b/yaxis.go new file mode 100644 index 0000000..1777b02 --- /dev/null +++ b/yaxis.go @@ -0,0 +1,62 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" +) + +const YAxisWidth = 40 + +func drawYAxis(d *Draw, opt *ChartOption, theme *Theme, xAxisHeight int, padding chart.Box) (*Range, error) { + yRange := opt.getYRange(0) + data := NewAxisDataListFromStringList(yRange.Values()) + style := AxisStyle{ + Position: PositionLeft, + BoundaryGap: FalseFlag(), + FontColor: theme.GetAxisStrokeColor(), + TickShow: FalseFlag(), + StrokeWidth: 1, + SplitLineColor: theme.GetAxisSplitLineColor(), + SplitLineShow: true, + } + width := d.measureAxis(data, style) + + padding.Left += (YAxisWidth - width) + + dYAxis, err := NewDraw( + DrawOption{ + Parent: d, + Width: d.Box.Width(), + // 减去x轴的高 + Height: d.Box.Height() - xAxisHeight, + }, + PaddingOption(padding), + ) + if err != nil { + return nil, err + } + dYAxis.Axis(data, style) + yRange.Size = dYAxis.Box.Height() + return &yRange, nil +} From c4b5ac3f4241d6ea2a6e70272f0b3a3aa6653616 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 29 Jan 2022 16:35:45 +0800 Subject: [PATCH 051/251] feat: support legend render function --- chart.go | 14 ++++++-- legend.go | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++ line_chart.go | 12 +++++-- title.go | 11 +++--- util.go | 18 +++++++++- 5 files changed, 140 insertions(+), 10 deletions(-) create mode 100644 legend.go diff --git a/chart.go b/chart.go index e0e9a9a..556e2fe 100644 --- a/chart.go +++ b/chart.go @@ -41,7 +41,6 @@ type Point struct { type Series struct { Type string - Name string Data []SeriesData YAxisIndex int Style chart.Style @@ -50,6 +49,7 @@ type Series struct { type ChartOption struct { Theme string Title TitleOption + Legend LegendOption XAxis XAxisOption Width int Height int @@ -60,6 +60,7 @@ type ChartOption struct { } func (o *ChartOption) FillDefault(t *Theme) { + f, _ := chart.GetDefaultFont() if o.BackgroundColor.IsZero() { o.BackgroundColor = t.GetBackgroundColor() } @@ -70,7 +71,7 @@ func (o *ChartOption) FillDefault(t *Theme) { o.Title.Style.FontSize = 14 } if o.Title.Style.Font == nil { - o.Title.Style.Font, _ = chart.GetDefaultFont() + o.Title.Style.Font = f } if o.Title.Style.Padding.IsZero() { o.Title.Style.Padding = chart.Box{ @@ -80,6 +81,15 @@ func (o *ChartOption) FillDefault(t *Theme) { Bottom: 5, } } + if o.Legend.Style.FontSize == 0 { + o.Legend.Style.FontSize = 8 + } + if o.Legend.Style.Font == nil { + o.Legend.Style.Font = f + } + if o.Legend.Style.FontColor.IsZero() { + o.Legend.Style.FontColor = t.GetTitleColor() + } } func (o *ChartOption) getWidth() int { diff --git a/legend.go b/legend.go new file mode 100644 index 0000000..e37baf3 --- /dev/null +++ b/legend.go @@ -0,0 +1,95 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" +) + +type LegendOption struct { + Style chart.Style + Data []string + Left string + Right string + Align string +} + +func drawLegend(p *Draw, opt *LegendOption, theme *Theme) (chart.Box, error) { + if len(opt.Data) == 0 { + return chart.BoxZero, nil + } + padding := opt.Style.Padding + legendDraw, err := NewDraw(DrawOption{ + Parent: p, + }, PaddingOption(padding)) + if err != nil { + return chart.BoxZero, err + } + r := legendDraw.Render + opt.Style.GetTextOptions().WriteToRenderer(r) + + x := 0 + y := 0 + legendWidth := 30 + legendDotHeight := 5 + textPadding := 5 + legendMargin := 10 + for index, text := range opt.Data { + if index != 0 { + x += legendMargin + } + style := chart.Style{ + StrokeColor: theme.GetSeriesColor(index), + FillColor: theme.GetSeriesColor(index), + StrokeWidth: 2, + } + textBox := r.MeasureText(text) + renderText := func() { + x += textPadding + legendDraw.text(text, x, y+legendDotHeight-1) + x += textBox.Width() + x += textPadding + } + + if opt.Align == PositionRight { + renderText() + } + + style.GetFillAndStrokeOptions().WriteDrawingOptionsToRenderer(r) + legendDraw.moveTo(x, y) + legendDraw.lineTo(x+legendWidth, y) + r.Stroke() + legendDraw.circle(float64(legendDotHeight), x+legendWidth>>1, y) + r.FillStroke() + x += legendWidth + + if opt.Align != PositionRight { + renderText() + } + } + legendBox := padding.Clone() + legendBox.Right = legendBox.Left + x + legendBox.Bottom = legendBox.Top + 2*legendDotHeight + + return legendBox, nil +} diff --git a/line_chart.go b/line_chart.go index 553e9b8..33e3ffa 100644 --- a/line_chart.go +++ b/line_chart.go @@ -53,7 +53,13 @@ func NewLineChart(opt LineChartOption) (*Draw, error) { } // 标题 - _, titleHeight, err := drawTitle(d, &opt.Title) + titleBox, err := drawTitle(d, &opt.Title) + if err != nil { + return nil, err + } + + opt.Legend.Style.Padding.Left += titleBox.Right + _, err = drawLegend(d, &opt.Legend, &theme) if err != nil { return nil, err } @@ -66,7 +72,7 @@ func NewLineChart(opt LineChartOption) (*Draw, error) { // 暂时仅支持单一yaxis yRange, err := drawYAxis(d, &opt.ChartOption, &theme, xAxisHeight, chart.Box{ - Top: titleHeight, + Top: titleBox.Height(), }) if err != nil { return nil, err @@ -75,7 +81,7 @@ func NewLineChart(opt LineChartOption) (*Draw, error) { sd, err := NewDraw(DrawOption{ Parent: d, }, PaddingOption(chart.Box{ - Top: titleHeight, + Top: titleBox.Height(), Left: YAxisWidth, })) if err != nil { diff --git a/title.go b/title.go index b37c0da..a6d9a39 100644 --- a/title.go +++ b/title.go @@ -41,9 +41,9 @@ type titleMeasureOption struct { text string } -func drawTitle(d *Draw, opt *TitleOption) (int, int, error) { +func drawTitle(d *Draw, opt *TitleOption) (chart.Box, error) { if len(opt.Text) == 0 { - return 0, 0, nil + return chart.BoxZero, nil } padding := opt.Style.Padding @@ -51,7 +51,7 @@ func drawTitle(d *Draw, opt *TitleOption) (int, int, error) { Parent: d, }, PaddingOption(padding)) if err != nil { - return 0, 0, err + return chart.BoxZero, err } r := titleDraw.Render @@ -107,6 +107,9 @@ func drawTitle(d *Draw, opt *TitleOption) (int, int, error) { titleY += textMaxHeight } height := titleY + padding.Top + padding.Bottom + box := padding.Clone() + box.Right = box.Left + width + box.Bottom = box.Top + height - return width, height, nil + return box, nil } diff --git a/util.go b/util.go index 041b8c5..01590b4 100644 --- a/util.go +++ b/util.go @@ -22,7 +22,12 @@ package charts -import "github.com/wcharczuk/go-chart/v2" +import ( + "strconv" + "strings" + + "github.com/wcharczuk/go-chart/v2" +) func TrueFlag() *bool { t := true @@ -90,3 +95,14 @@ func reverseIntSlice(intList []int) { intList[i], intList[j] = intList[j], intList[i] } } + +func convertPercent(value string) float64 { + if !strings.HasSuffix(value, "%") { + return -1 + } + v, err := strconv.Atoi(strings.ReplaceAll(value, "%", "")) + if err != nil { + return -1 + } + return float64(v) / 100 +} From 29a1bdc1fb05dc4e8fc9265f1e1321044525f119 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 30 Jan 2022 18:27:18 +0800 Subject: [PATCH 052/251] refactor: adjust legend to center as default --- legend.go | 21 +++++++++++++++++++-- line_chart.go | 1 - 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/legend.go b/legend.go index e37baf3..ad9be61 100644 --- a/legend.go +++ b/legend.go @@ -54,6 +54,23 @@ func drawLegend(p *Draw, opt *LegendOption, theme *Theme) (chart.Box, error) { legendDotHeight := 5 textPadding := 5 legendMargin := 10 + + widthCount := 0 + // 文本宽度 + for _, text := range opt.Data { + b := r.MeasureText(text) + widthCount += b.Width() + } + // 加上标记 + widthCount += legendWidth * len(opt.Data) + // 文本的padding + widthCount += 2 * textPadding * len(opt.Data) + // margin的宽度 + widthCount += legendMargin * (len(opt.Data) - 1) + + // TODO 支持更多的定位方式 + // 居中 + x = (legendDraw.Box.Width() - widthCount) >> 1 for index, text := range opt.Data { if index != 0 { x += legendMargin @@ -61,12 +78,12 @@ func drawLegend(p *Draw, opt *LegendOption, theme *Theme) (chart.Box, error) { style := chart.Style{ StrokeColor: theme.GetSeriesColor(index), FillColor: theme.GetSeriesColor(index), - StrokeWidth: 2, + StrokeWidth: 3, } textBox := r.MeasureText(text) renderText := func() { x += textPadding - legendDraw.text(text, x, y+legendDotHeight-1) + legendDraw.text(text, x, y+legendDotHeight-2) x += textBox.Width() x += textPadding } diff --git a/line_chart.go b/line_chart.go index 33e3ffa..391365b 100644 --- a/line_chart.go +++ b/line_chart.go @@ -58,7 +58,6 @@ func NewLineChart(opt LineChartOption) (*Draw, error) { return nil, err } - opt.Legend.Style.Padding.Left += titleBox.Right _, err = drawLegend(d, &opt.Legend, &theme) if err != nil { return nil, err From 9dbea37f5553078bb825833037a62f9cb1df9e5e Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 1 Feb 2022 09:26:57 +0800 Subject: [PATCH 053/251] refactor: enhance axis render function --- axis.go | 62 +++++++++++++++++++++++------------- axis_test.go | 90 +++++++++++++++++++++++++--------------------------- chart.go | 4 +-- theme.go | 2 +- xaxis.go | 9 +++--- yaxis.go | 12 +++---- 6 files changed, 97 insertions(+), 82 deletions(-) diff --git a/axis.go b/axis.go index 9a9508f..7f3ba4b 100644 --- a/axis.go +++ b/axis.go @@ -45,6 +45,21 @@ type AxisStyle struct { SplitLineColor drawing.Color } +type axis struct { + d *Draw + data *AxisDataList + style *AxisStyle +} + +func NewAxis(d *Draw, data AxisDataList, style AxisStyle) *axis { + return &axis{ + d: d, + data: &data, + style: &style, + } + +} + func (as *AxisStyle) GetLabelMargin() int { return getDefaultInt(as.LabelMargin, 8) } @@ -85,8 +100,6 @@ func (l AxisDataList) TextList() []string { } type axisOption struct { - data *AxisDataList - style *AxisStyle textMaxWith int textMaxHeight int boundaryGap bool @@ -102,9 +115,10 @@ func NewAxisDataListFromStringList(textList []string) AxisDataList { return list } -func (d *Draw) axisLabel(opt *axisOption) { - style := opt.style - data := *opt.data +func (a *axis) axisLabel(opt *axisOption) { + style := a.style + data := *a.data + d := a.d if style.FontColor.IsZero() || len(data) == 0 { return } @@ -177,9 +191,10 @@ func (d *Draw) axisLabel(opt *axisOption) { } } -func (d *Draw) axisLine(opt *axisOption) { +func (a *axis) axisLine(opt *axisOption) { + d := a.d r := d.Render - style := opt.style + style := a.style s := style.Style(d.Font) s.GetStrokeOptions().WriteDrawingOptionsToRenderer(r) @@ -224,23 +239,24 @@ func (d *Draw) axisLine(opt *axisOption) { r.FillStroke() } -func (d *Draw) axisTick(opt *axisOption) { +func (a *axis) axisTick(opt *axisOption) { + d := a.d r := d.Render - style := opt.style + style := a.style s := style.Style(d.Font) s.GetStrokeOptions().WriteDrawingOptionsToRenderer(r) width := d.Box.Width() height := d.Box.Height() - data := *opt.data + data := *a.data tickCount := len(data) if !opt.boundaryGap { tickCount-- } labelMargin := style.GetLabelMargin() tickShow := true - if opt.style.TickShow != nil && !*opt.style.TickShow { + if style.TickShow != nil && !*style.TickShow { tickShow = false } @@ -322,9 +338,11 @@ func (d *Draw) axisTick(opt *axisOption) { } } -func (d *Draw) axisMeasureTextMaxWidthHeight(data AxisDataList, style AxisStyle) (int, int) { +func (a *axis) axisMeasureTextMaxWidthHeight() (int, int) { + d := a.d r := d.Render - s := style.Style(d.Font) + s := a.style.Style(d.Font) + data := a.data s.GetStrokeOptions().WriteDrawingOptionsToRenderer(r) s.GetTextOptions().WriteTextOptionsToRenderer(r) return measureTextMaxWidthHeight(data.TextList(), r) @@ -333,9 +351,10 @@ func (d *Draw) axisMeasureTextMaxWidthHeight(data AxisDataList, style AxisStyle) // measureAxis return the measurement of axis. // If the position is left or right, it will be textMaxWidth + labelMargin + tickLength. // If the position is top or bottom, it will be textMaxHeight + labelMargin + tickLength. -func (d *Draw) measureAxis(data AxisDataList, style AxisStyle) int { +func (a *axis) measureAxis() int { + style := a.style value := style.GetLabelMargin() + style.GetTickLength() - textMaxWidth, textMaxHeight := d.axisMeasureTextMaxWidthHeight(data, style) + textMaxWidth, textMaxHeight := a.axisMeasureTextMaxWidthHeight() if style.Position == PositionLeft || style.Position == PositionRight { return textMaxWidth + value @@ -343,14 +362,13 @@ func (d *Draw) measureAxis(data AxisDataList, style AxisStyle) int { return textMaxHeight + value } -func (d *Draw) Axis(data AxisDataList, style AxisStyle) { +func (a *axis) Render() { + style := a.style if style.Show != nil && !*style.Show { return } - textMaxWidth, textMaxHeight := d.axisMeasureTextMaxWidthHeight(data, style) + textMaxWidth, textMaxHeight := a.axisMeasureTextMaxWidthHeight() opt := &axisOption{ - data: &data, - style: &style, textMaxWith: textMaxWidth, textMaxHeight: textMaxHeight, boundaryGap: true, @@ -360,8 +378,8 @@ func (d *Draw) Axis(data AxisDataList, style AxisStyle) { } // 坐标轴线 - d.axisLine(opt) - d.axisTick(opt) + a.axisLine(opt) + a.axisTick(opt) // 坐标文本 - d.axisLabel(opt) + a.axisLabel(opt) } diff --git a/axis_test.go b/axis_test.go index 06b1a97..e8efccd 100644 --- a/axis_test.go +++ b/axis_test.go @@ -73,30 +73,27 @@ func TestAxis(t *testing.T) { "Sat", "Sun", }) - getDefaultOption := func() *axisOption { - return &axisOption{ - data: &data, - style: &AxisStyle{ - StrokeColor: drawing.ColorBlack, - StrokeWidth: 1, - FontColor: drawing.ColorBlack, - Show: TrueFlag(), - TickShow: TrueFlag(), - SplitLineShow: true, - SplitLineColor: drawing.ColorBlack.WithAlpha(60), - }, + getDefaultStyle := func() AxisStyle { + return AxisStyle{ + StrokeColor: drawing.ColorBlack, + StrokeWidth: 1, + FontColor: drawing.ColorBlack, + Show: TrueFlag(), + TickShow: TrueFlag(), + SplitLineShow: true, + SplitLineColor: drawing.ColorBlack.WithAlpha(60), } } tests := []struct { - newOption func() *axisOption - result string + newStyle func() AxisStyle + result string }{ // 文本按起始位置展示 // axis位于bottom { - newOption: func() *axisOption { - opt := getDefaultOption() - opt.style.BoundaryGap = FalseFlag() + newStyle: func() AxisStyle { + opt := getDefaultStyle() + opt.BoundaryGap = FalseFlag() return opt }, result: "\\nMonTueWedThuFriSatSun", @@ -104,8 +101,8 @@ func TestAxis(t *testing.T) { // 文本居中展示 // axis位于bottom { - newOption: func() *axisOption { - opt := getDefaultOption() + newStyle: func() AxisStyle { + opt := getDefaultStyle() return opt }, result: "\\nMonTueWedThuFriSatSun", @@ -113,10 +110,10 @@ func TestAxis(t *testing.T) { // 文本按起始位置展示 // axis位于top { - newOption: func() *axisOption { - opt := getDefaultOption() - opt.style.Position = PositionTop - opt.style.BoundaryGap = FalseFlag() + newStyle: func() AxisStyle { + opt := getDefaultStyle() + opt.Position = PositionTop + opt.BoundaryGap = FalseFlag() return opt }, result: "\\nMonTueWedThuFriSatSun", @@ -124,9 +121,9 @@ func TestAxis(t *testing.T) { // 文本居中展示 // axis位于top { - newOption: func() *axisOption { - opt := getDefaultOption() - opt.style.Position = PositionTop + newStyle: func() AxisStyle { + opt := getDefaultStyle() + opt.Position = PositionTop return opt }, result: "\\nMonTueWedThuFriSatSun", @@ -134,10 +131,10 @@ func TestAxis(t *testing.T) { // 文本按起始位置展示 // axis位于left { - newOption: func() *axisOption { - opt := getDefaultOption() - opt.style.Position = PositionLeft - opt.style.BoundaryGap = FalseFlag() + newStyle: func() AxisStyle { + opt := getDefaultStyle() + opt.Position = PositionLeft + opt.BoundaryGap = FalseFlag() return opt }, result: "\\nMonTueWedThuFriSatSun", @@ -145,9 +142,9 @@ func TestAxis(t *testing.T) { // 文本居中展示 // axis位于left { - newOption: func() *axisOption { - opt := getDefaultOption() - opt.style.Position = PositionLeft + newStyle: func() AxisStyle { + opt := getDefaultStyle() + opt.Position = PositionLeft return opt }, result: "\\nMonTueWedThuFriSatSun", @@ -155,10 +152,10 @@ func TestAxis(t *testing.T) { // 文本按起始位置展示 // axis位于right { - newOption: func() *axisOption { - opt := getDefaultOption() - opt.style.Position = PositionRight - opt.style.BoundaryGap = FalseFlag() + newStyle: func() AxisStyle { + opt := getDefaultStyle() + opt.Position = PositionRight + opt.BoundaryGap = FalseFlag() return opt }, result: "\\nMonTueWedThuFriSatSun", @@ -166,9 +163,9 @@ func TestAxis(t *testing.T) { // 文本居中展示 // axis位于right { - newOption: func() *axisOption { - opt := getDefaultOption() - opt.style.Position = PositionRight + newStyle: func() AxisStyle { + opt := getDefaultStyle() + opt.Position = PositionRight return opt }, result: "\\nMonTueWedThuFriSatSun", @@ -185,9 +182,8 @@ func TestAxis(t *testing.T) { Bottom: 5, })) assert.Nil(err) - opt := tt.newOption() - - d.Axis(*opt.data, *opt.style) + style := tt.newStyle() + NewAxis(d, data, style).Render() result, err := d.Bytes() assert.Nil(err) @@ -208,17 +204,17 @@ func TestMeasureAxis(t *testing.T) { "Sun", }) f, _ := chart.GetDefaultFont() - width := d.measureAxis(data, AxisStyle{ + width := NewAxis(d, data, AxisStyle{ FontSize: 12, Font: f, Position: PositionLeft, - }) + }).measureAxis() assert.Equal(44, width) - height := d.measureAxis(data, AxisStyle{ + height := NewAxis(d, data, AxisStyle{ FontSize: 12, Font: f, Position: PositionTop, - }) + }).measureAxis() assert.Equal(28, height) } diff --git a/chart.go b/chart.go index 556e2fe..9383809 100644 --- a/chart.go +++ b/chart.go @@ -65,7 +65,7 @@ func (o *ChartOption) FillDefault(t *Theme) { o.BackgroundColor = t.GetBackgroundColor() } if o.Title.Style.FontColor.IsZero() { - o.Title.Style.FontColor = t.GetTitleColor() + o.Title.Style.FontColor = t.GetTextColor() } if o.Title.Style.FontSize == 0 { o.Title.Style.FontSize = 14 @@ -88,7 +88,7 @@ func (o *ChartOption) FillDefault(t *Theme) { o.Legend.Style.Font = f } if o.Legend.Style.FontColor.IsZero() { - o.Legend.Style.FontColor = t.GetTitleColor() + o.Legend.Style.FontColor = t.GetTextColor() } } diff --git a/theme.go b/theme.go index a67dc02..c47a5d8 100644 --- a/theme.go +++ b/theme.go @@ -121,7 +121,7 @@ func (t *Theme) GetBackgroundColor() drawing.Color { return drawing.ColorWhite } -func (t *Theme) GetTitleColor() drawing.Color { +func (t *Theme) GetTextColor() drawing.Color { if t.IsDark() { return drawing.Color{ R: 238, diff --git a/xaxis.go b/xaxis.go index 01ef2d3..c814074 100644 --- a/xaxis.go +++ b/xaxis.go @@ -31,10 +31,10 @@ type XAxisOption struct { } // drawXAxis draws x axis, and returns the height, range of if. -func drawXAxis(d *Draw, opt *XAxisOption, theme *Theme) (int, *Range, error) { +func drawXAxis(p *Draw, opt *XAxisOption, theme *Theme) (int, *Range, error) { dXAxis, err := NewDraw( DrawOption{ - Parent: d, + Parent: p, }, PaddingOption(chart.Box{ Left: YAxisWidth, @@ -57,9 +57,10 @@ func drawXAxis(d *Draw, opt *XAxisOption, theme *Theme) (int, *Range, error) { boundary = false max-- } + axis := NewAxis(dXAxis, data, style) + axis.Render() - dXAxis.Axis(data, style) - return d.measureAxis(data, style), &Range{ + return axis.measureAxis(), &Range{ divideCount: len(opt.Data), Min: 0, Max: max, diff --git a/yaxis.go b/yaxis.go index 1777b02..171cfec 100644 --- a/yaxis.go +++ b/yaxis.go @@ -28,7 +28,7 @@ import ( const YAxisWidth = 40 -func drawYAxis(d *Draw, opt *ChartOption, theme *Theme, xAxisHeight int, padding chart.Box) (*Range, error) { +func drawYAxis(p *Draw, opt *ChartOption, theme *Theme, xAxisHeight int, padding chart.Box) (*Range, error) { yRange := opt.getYRange(0) data := NewAxisDataListFromStringList(yRange.Values()) style := AxisStyle{ @@ -40,23 +40,23 @@ func drawYAxis(d *Draw, opt *ChartOption, theme *Theme, xAxisHeight int, padding SplitLineColor: theme.GetAxisSplitLineColor(), SplitLineShow: true, } - width := d.measureAxis(data, style) + width := NewAxis(p, data, style).measureAxis() padding.Left += (YAxisWidth - width) dYAxis, err := NewDraw( DrawOption{ - Parent: d, - Width: d.Box.Width(), + Parent: p, + Width: p.Box.Width(), // 减去x轴的高 - Height: d.Box.Height() - xAxisHeight, + Height: p.Box.Height() - xAxisHeight, }, PaddingOption(padding), ) if err != nil { return nil, err } - dYAxis.Axis(data, style) + NewAxis(dYAxis, data, style).Render() yRange.Size = dYAxis.Box.Height() return &yRange, nil } From 910e2dc422fbd36cd0c60f4975cc7f723507c565 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 1 Feb 2022 09:48:47 +0800 Subject: [PATCH 054/251] refactor: enhance legend render function --- chart.go | 1 + legend.go | 19 +++++++++++++++++-- line_chart.go | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/chart.go b/chart.go index 9383809..33ed71b 100644 --- a/chart.go +++ b/chart.go @@ -81,6 +81,7 @@ func (o *ChartOption) FillDefault(t *Theme) { Bottom: 5, } } + o.Legend.Theme = t if o.Legend.Style.FontSize == 0 { o.Legend.Style.FontSize = 8 } diff --git a/legend.go b/legend.go index ad9be61..abffeb3 100644 --- a/legend.go +++ b/legend.go @@ -27,20 +27,35 @@ import ( ) type LegendOption struct { + Theme *Theme Style chart.Style Data []string Left string Right string Align string } +type legend struct { + d *Draw + opt *LegendOption +} -func drawLegend(p *Draw, opt *LegendOption, theme *Theme) (chart.Box, error) { +func NewLegend(d *Draw, opt LegendOption) *legend { + return &legend{ + d: d, + opt: &opt, + } +} + +func (l *legend) Render() (chart.Box, error) { + d := l.d + opt := l.opt if len(opt.Data) == 0 { return chart.BoxZero, nil } + theme := opt.Theme padding := opt.Style.Padding legendDraw, err := NewDraw(DrawOption{ - Parent: p, + Parent: d, }, PaddingOption(padding)) if err != nil { return chart.BoxZero, err diff --git a/line_chart.go b/line_chart.go index 391365b..3e04514 100644 --- a/line_chart.go +++ b/line_chart.go @@ -58,7 +58,7 @@ func NewLineChart(opt LineChartOption) (*Draw, error) { return nil, err } - _, err = drawLegend(d, &opt.Legend, &theme) + _, err = NewLegend(d, opt.Legend).Render() if err != nil { return nil, err } From 3a9897f9ad629053b44c27b9894095326332a5c0 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 1 Feb 2022 10:08:59 +0800 Subject: [PATCH 055/251] refactor: adjust theme of chart --- chart.go | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++- line_chart.go | 47 +++++--------------------------------- theme.go | 6 +++++ xaxis.go | 4 +++- yaxis.go | 3 ++- 5 files changed, 79 insertions(+), 44 deletions(-) diff --git a/chart.go b/chart.go index 33ed71b..8478757 100644 --- a/chart.go +++ b/chart.go @@ -59,7 +59,8 @@ type ChartOption struct { BackgroundColor drawing.Color } -func (o *ChartOption) FillDefault(t *Theme) { +func (o *ChartOption) FillDefault(theme string) { + t := NewTheme(theme) f, _ := chart.GetDefaultFont() if o.BackgroundColor.IsZero() { o.BackgroundColor = t.GetBackgroundColor() @@ -91,6 +92,9 @@ func (o *ChartOption) FillDefault(t *Theme) { if o.Legend.Style.FontColor.IsZero() { o.Legend.Style.FontColor = t.GetTextColor() } + if o.XAxis.Theme == "" { + o.XAxis.Theme = theme + } } func (o *ChartOption) getWidth() int { @@ -139,3 +143,60 @@ func (r Range) Values() []string { } return values } + +type basicRenderResult struct { + xRange *Range + yRange *Range + d *Draw + titleBox chart.Box +} + +func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { + d, err := NewDraw( + DrawOption{ + Parent: opt.Parent, + Width: opt.getWidth(), + Height: opt.getHeight(), + }, + PaddingOption(opt.Padding), + ) + if err != nil { + return nil, err + } + + opt.FillDefault(opt.Theme) + if opt.Parent == nil { + d.setBackground(opt.getWidth(), opt.getHeight(), opt.BackgroundColor) + } + + // 标题 + titleBox, err := drawTitle(d, &opt.Title) + if err != nil { + return nil, err + } + + _, err = NewLegend(d, opt.Legend).Render() + if err != nil { + return nil, err + } + + // xAxis + xAxisHeight, xRange, err := drawXAxis(d, &opt.XAxis) + if err != nil { + return nil, err + } + + // 暂时仅支持单一yaxis + yRange, err := drawYAxis(d, opt, xAxisHeight, chart.Box{ + Top: titleBox.Height(), + }) + if err != nil { + return nil, err + } + return &basicRenderResult{ + xRange: xRange, + yRange: yRange, + d: d, + titleBox: titleBox, + }, nil +} diff --git a/line_chart.go b/line_chart.go index 3e04514..331ebcc 100644 --- a/line_chart.go +++ b/line_chart.go @@ -32,60 +32,25 @@ type LineChartOption struct { } func NewLineChart(opt LineChartOption) (*Draw, error) { - d, err := NewDraw( - DrawOption{ - Parent: opt.Parent, - Width: opt.getWidth(), - Height: opt.getHeight(), - }, - PaddingOption(opt.Padding), - ) + result, err := chartBasicRender(&opt.ChartOption) if err != nil { return nil, err } - theme := Theme{ - mode: opt.Theme, - } - opt.FillDefault(&theme) - if opt.Parent == nil { - d.setBackground(opt.getWidth(), opt.getHeight(), opt.BackgroundColor) - } - - // 标题 - titleBox, err := drawTitle(d, &opt.Title) - if err != nil { - return nil, err - } - - _, err = NewLegend(d, opt.Legend).Render() - if err != nil { - return nil, err - } - - // xAxis - xAxisHeight, xRange, err := drawXAxis(d, &opt.XAxis, &theme) - if err != nil { - return nil, err - } - - // 暂时仅支持单一yaxis - yRange, err := drawYAxis(d, &opt.ChartOption, &theme, xAxisHeight, chart.Box{ - Top: titleBox.Height(), - }) - if err != nil { - return nil, err - } + d := result.d + theme := NewTheme(opt.Theme) sd, err := NewDraw(DrawOption{ Parent: d, }, PaddingOption(chart.Box{ - Top: titleBox.Height(), + Top: result.titleBox.Height(), Left: YAxisWidth, })) if err != nil { return nil, err } + yRange := result.yRange + xRange := result.xRange for i, series := range opt.SeriesList { points := make([]Point, 0) for j, item := range series.Data { diff --git a/theme.go b/theme.go index c47a5d8..5aa4bf9 100644 --- a/theme.go +++ b/theme.go @@ -31,6 +31,12 @@ type Theme struct { mode string } +func NewTheme(mode string) *Theme { + return &Theme{ + mode: mode, + } +} + func (t *Theme) IsDark() bool { return t.mode == ThemeDark } diff --git a/xaxis.go b/xaxis.go index c814074..6839329 100644 --- a/xaxis.go +++ b/xaxis.go @@ -27,11 +27,12 @@ import "github.com/wcharczuk/go-chart/v2" type XAxisOption struct { BoundaryGap *bool Data []string + Theme string // TODO split number } // drawXAxis draws x axis, and returns the height, range of if. -func drawXAxis(p *Draw, opt *XAxisOption, theme *Theme) (int, *Range, error) { +func drawXAxis(p *Draw, opt *XAxisOption) (int, *Range, error) { dXAxis, err := NewDraw( DrawOption{ Parent: p, @@ -43,6 +44,7 @@ func drawXAxis(p *Draw, opt *XAxisOption, theme *Theme) (int, *Range, error) { if err != nil { return 0, nil, err } + theme := NewTheme(opt.Theme) data := NewAxisDataListFromStringList(opt.Data) style := AxisStyle{ BoundaryGap: opt.BoundaryGap, diff --git a/yaxis.go b/yaxis.go index 171cfec..6cef270 100644 --- a/yaxis.go +++ b/yaxis.go @@ -28,7 +28,8 @@ import ( const YAxisWidth = 40 -func drawYAxis(p *Draw, opt *ChartOption, theme *Theme, xAxisHeight int, padding chart.Box) (*Range, error) { +func drawYAxis(p *Draw, opt *ChartOption, xAxisHeight int, padding chart.Box) (*Range, error) { + theme := NewTheme(opt.Theme) yRange := opt.getYRange(0) data := NewAxisDataListFromStringList(yRange.Values()) style := AxisStyle{ From 6ae7e1d1b36bbbcc8993c01694f1e98740bbba09 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 1 Feb 2022 11:19:31 +0800 Subject: [PATCH 056/251] feat: support bar chart --- bar_chart.go | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++ chart.go | 11 ++++++- line_chart.go | 10 ++---- range.go | 10 ++++++ yaxis.go | 5 +++ 5 files changed, 112 insertions(+), 8 deletions(-) create mode 100644 bar_chart.go diff --git a/bar_chart.go b/bar_chart.go new file mode 100644 index 0000000..61fd8f4 --- /dev/null +++ b/bar_chart.go @@ -0,0 +1,84 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" +) + +func BarChartRender(opt ChartOption) (*Draw, error) { + result, err := chartBasicRender(&opt) + if err != nil { + return nil, err + } + d := result.d + + bd, err := NewDraw(DrawOption{ + Parent: d, + }, PaddingOption(chart.Box{ + Top: result.titleBox.Height(), + Left: YAxisWidth, + })) + if err != nil { + return nil, err + } + yRange := result.yRange + xRange := result.xRange + x0, x1 := xRange.GetRange(0) + width := int(x1 - x0) + // 每一块之间的margin + margin := 10 + // 每一个bar之间的margin + barMargin := 5 + + seriesCount := len(opt.SeriesList) + // 总的宽度-两个margin-(总数-1)的barMargin + barWidth := (width - 2*margin - barMargin*(seriesCount-1)) / len(opt.SeriesList) + + barMaxHeight := yRange.Size + theme := NewTheme(opt.Theme) + + for i, series := range opt.SeriesList { + for j, item := range series.Data { + x0, _ := xRange.GetRange(j) + x := int(x0) + x += margin + if i != 0 { + x += i * (barWidth + barMargin) + } + + h := int(yRange.getHeight(item.Value)) + + bd.Bar(chart.Box{ + Top: barMaxHeight - h, + Left: x, + Right: x + barWidth, + Bottom: barMaxHeight - 1, + }, BarStyle{ + FillColor: theme.GetSeriesColor(i), + }) + } + } + + return d, nil +} diff --git a/chart.go b/chart.go index 8478757..0a067b1 100644 --- a/chart.go +++ b/chart.go @@ -51,6 +51,7 @@ type ChartOption struct { Title TitleOption Legend LegendOption XAxis XAxisOption + YAxis YAxisOption Width int Height int Parent *Draw @@ -128,8 +129,16 @@ func (o *ChartOption) getYRange(axisIndex int) Range { } } } + min = min * 0.9 + max = max * 1.1 + if o.YAxis.Min != nil { + min = *o.YAxis.Min + } + if o.YAxis.Max != nil { + max = *o.YAxis.Max + } // y轴分设置默认划分为6块 - r := NewRange(min*0.9, max*1.1, 6) + r := NewRange(min, max, 6) return r } diff --git a/line_chart.go b/line_chart.go index 331ebcc..5b8ba1b 100644 --- a/line_chart.go +++ b/line_chart.go @@ -27,12 +27,8 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) -type LineChartOption struct { - ChartOption -} - -func NewLineChart(opt LineChartOption) (*Draw, error) { - result, err := chartBasicRender(&opt.ChartOption) +func LineChartRender(opt ChartOption) (*Draw, error) { + result, err := chartBasicRender(&opt) if err != nil { return nil, err } @@ -54,7 +50,7 @@ func NewLineChart(opt LineChartOption) (*Draw, error) { for i, series := range opt.SeriesList { points := make([]Point, 0) for j, item := range series.Data { - y := yRange.getHeight(item.Value) + y := yRange.getRestHeight(item.Value) points = append(points, Point{ Y: y, X: xRange.getWidth(float64(j)), diff --git a/range.go b/range.go index c2faf8b..57dbd20 100644 --- a/range.go +++ b/range.go @@ -60,10 +60,20 @@ func NewRange(min, max float64, divideCount int) Range { } func (r *Range) getHeight(value float64) int { + v := (value - r.Min) / (r.Max - r.Min) + return int(v * float64(r.Size)) +} + +func (r *Range) getRestHeight(value float64) int { v := 1 - (value-r.Min)/(r.Max-r.Min) return int(v * float64(r.Size)) } +func (r *Range) GetRange(index int) (float64, float64) { + unit := float64(r.Size) / float64(r.divideCount) + return unit * float64(index), unit * float64(index+1) +} + func (r *Range) getWidth(value float64) int { v := value / (r.Max - r.Min) // 移至居中 diff --git a/yaxis.go b/yaxis.go index 6cef270..7329804 100644 --- a/yaxis.go +++ b/yaxis.go @@ -26,6 +26,11 @@ import ( "github.com/wcharczuk/go-chart/v2" ) +type YAxisOption struct { + Min *float64 + Max *float64 +} + const YAxisWidth = 40 func drawYAxis(p *Draw, opt *ChartOption, xAxisHeight int, padding chart.Box) (*Range, error) { From 5ccc497ad31a1cfdf7e5017daf5c900cdf51573f Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 2 Feb 2022 08:02:32 +0800 Subject: [PATCH 057/251] refactor: adjust chart render function --- bar_chart.go | 6 +----- chart.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- line_chart.go | 8 ++------ 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index 61fd8f4..7fd068f 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -26,11 +26,7 @@ import ( "github.com/wcharczuk/go-chart/v2" ) -func BarChartRender(opt ChartOption) (*Draw, error) { - result, err := chartBasicRender(&opt) - if err != nil { - return nil, err - } +func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { d := result.d bd, err := NewDraw(DrawOption{ diff --git a/chart.go b/chart.go index 0a067b1..a5f924d 100644 --- a/chart.go +++ b/chart.go @@ -30,6 +30,12 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) +const ( + ChartTypeLine = "line" + ChartTypeBar = "bar" + ChartTypePie = "pie" +) + type SeriesData struct { Value float64 Style chart.Style @@ -154,10 +160,46 @@ func (r Range) Values() []string { } type basicRenderResult struct { - xRange *Range - yRange *Range - d *Draw - titleBox chart.Box + xRange *Range + yRange *Range + d *Draw + titleBox chart.Box + seriesOffset int +} + +func ChartRender(opt ChartOption) (*Draw, error) { + result, err := chartBasicRender(&opt) + if err != nil { + return nil, err + } + lineSeries := make([]Series, 0) + barSeries := make([]Series, 0) + for _, item := range opt.SeriesList { + switch item.Type { + case ChartTypeBar: + barSeries = append(barSeries, item) + default: + lineSeries = append(lineSeries, item) + } + } + if len(barSeries) != 0 { + o := opt + o.SeriesList = barSeries + _, err = barChartRender(o, result) + if err != nil { + return nil, err + } + } + if len(lineSeries) != 0 { + o := opt + o.SeriesList = lineSeries + result.seriesOffset = len(barSeries) + _, err = lineChartRender(o, result) + if err != nil { + return nil, err + } + } + return result.d, nil } func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { diff --git a/line_chart.go b/line_chart.go index 5b8ba1b..56d83cd 100644 --- a/line_chart.go +++ b/line_chart.go @@ -27,11 +27,7 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) -func LineChartRender(opt ChartOption) (*Draw, error) { - result, err := chartBasicRender(&opt) - if err != nil { - return nil, err - } +func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { d := result.d theme := NewTheme(opt.Theme) @@ -55,7 +51,7 @@ func LineChartRender(opt ChartOption) (*Draw, error) { Y: y, X: xRange.getWidth(float64(j)), }) - seriesColor := theme.GetSeriesColor(i) + seriesColor := theme.GetSeriesColor(i + result.seriesOffset) dotFillColor := drawing.ColorWhite if theme.IsDark() { dotFillColor = seriesColor From 445a781b04712745925d9c428bdc1d6b8c0614c2 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 3 Feb 2022 08:45:55 +0800 Subject: [PATCH 058/251] refactor: add index to series --- chart.go | 14 +++++++------- line_chart.go | 6 +++++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/chart.go b/chart.go index a5f924d..12af36e 100644 --- a/chart.go +++ b/chart.go @@ -46,6 +46,7 @@ type Point struct { } type Series struct { + index int Type string Data []SeriesData YAxisIndex int @@ -160,11 +161,10 @@ func (r Range) Values() []string { } type basicRenderResult struct { - xRange *Range - yRange *Range - d *Draw - titleBox chart.Box - seriesOffset int + xRange *Range + yRange *Range + d *Draw + titleBox chart.Box } func ChartRender(opt ChartOption) (*Draw, error) { @@ -174,7 +174,8 @@ func ChartRender(opt ChartOption) (*Draw, error) { } lineSeries := make([]Series, 0) barSeries := make([]Series, 0) - for _, item := range opt.SeriesList { + for index, item := range opt.SeriesList { + item.index = index switch item.Type { case ChartTypeBar: barSeries = append(barSeries, item) @@ -193,7 +194,6 @@ func ChartRender(opt ChartOption) (*Draw, error) { if len(lineSeries) != 0 { o := opt o.SeriesList = lineSeries - result.seriesOffset = len(barSeries) _, err = lineChartRender(o, result) if err != nil { return nil, err diff --git a/line_chart.go b/line_chart.go index 56d83cd..4f10f97 100644 --- a/line_chart.go +++ b/line_chart.go @@ -51,7 +51,11 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) Y: y, X: xRange.getWidth(float64(j)), }) - seriesColor := theme.GetSeriesColor(i + result.seriesOffset) + index := series.index + if index == 0 { + index = i + } + seriesColor := theme.GetSeriesColor(index) dotFillColor := drawing.ColorWhite if theme.IsDark() { dotFillColor = seriesColor From eb45c6479effc088bad52717f6aec16578b533d2 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 3 Feb 2022 21:00:01 +0800 Subject: [PATCH 059/251] feat: pie chart render function --- bar_chart.go | 9 ++-- chart.go | 49 ++++++++++++++++------ draw.go | 4 ++ line_chart.go | 9 ++-- pie_chart.go | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++ xaxis.go | 1 + yaxis.go | 5 ++- 7 files changed, 164 insertions(+), 24 deletions(-) create mode 100644 pie_chart.go diff --git a/bar_chart.go b/bar_chart.go index 7fd068f..dfaf50f 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -27,10 +27,9 @@ import ( ) func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { - d := result.d - bd, err := NewDraw(DrawOption{ - Parent: d, + d, err := NewDraw(DrawOption{ + Parent: result.d, }, PaddingOption(chart.Box{ Top: result.titleBox.Height(), Left: YAxisWidth, @@ -65,7 +64,7 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { h := int(yRange.getHeight(item.Value)) - bd.Bar(chart.Box{ + d.Bar(chart.Box{ Top: barMaxHeight - h, Left: x, Right: x + barWidth, @@ -76,5 +75,5 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { } } - return d, nil + return result.d, nil } diff --git a/chart.go b/chart.go index 12af36e..426bc94 100644 --- a/chart.go +++ b/chart.go @@ -23,6 +23,7 @@ package charts import ( + "errors" "math" "github.com/dustin/go-humanize" @@ -168,21 +169,37 @@ type basicRenderResult struct { } func ChartRender(opt ChartOption) (*Draw, error) { - result, err := chartBasicRender(&opt) - if err != nil { - return nil, err + if len(opt.SeriesList) == 0 { + return nil, errors.New("series can not be nil") } + lineSeries := make([]Series, 0) barSeries := make([]Series, 0) + isPieChart := false for index, item := range opt.SeriesList { item.index = index switch item.Type { + case ChartTypePie: + isPieChart = true case ChartTypeBar: barSeries = append(barSeries, item) default: lineSeries = append(lineSeries, item) } } + // 如果指定了pie,则以pie的形式处理,不支持多类型图表 + // pie不需要axis + if isPieChart { + opt.XAxis.Hidden = true + opt.YAxis.Hidden = true + } + result, err := chartBasicRender(&opt) + if err != nil { + return nil, err + } + if isPieChart { + return pieChartRender(opt, result) + } if len(barSeries) != 0 { o := opt o.SeriesList = barSeries @@ -231,18 +248,26 @@ func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { return nil, err } - // xAxis - xAxisHeight, xRange, err := drawXAxis(d, &opt.XAxis) - if err != nil { - return nil, err + xAxisHeight := 0 + var xRange *Range + + if !opt.XAxis.Hidden { + // xAxis + xAxisHeight, xRange, err = drawXAxis(d, &opt.XAxis) + if err != nil { + return nil, err + } } // 暂时仅支持单一yaxis - yRange, err := drawYAxis(d, opt, xAxisHeight, chart.Box{ - Top: titleBox.Height(), - }) - if err != nil { - return nil, err + var yRange *Range + if !opt.YAxis.Hidden { + yRange, err = drawYAxis(d, opt, xAxisHeight, chart.Box{ + Top: titleBox.Height(), + }) + if err != nil { + return nil, err + } } return &basicRenderResult{ xRange: xRange, diff --git a/draw.go b/draw.go index 037124b..ce0bd6b 100644 --- a/draw.go +++ b/draw.go @@ -138,6 +138,10 @@ func (d *Draw) moveTo(x, y int) { d.Render.MoveTo(x+d.Box.Left, y+d.Box.Top) } +func (d *Draw) arcTo(cx, cy int, rx, ry, startAngle, delta float64) { + d.Render.ArcTo(cx+d.Box.Left, cy+d.Box.Top, rx, ry, startAngle, delta) +} + func (d *Draw) lineTo(x, y int) { d.Render.LineTo(x+d.Box.Left, y+d.Box.Top) } diff --git a/line_chart.go b/line_chart.go index 4f10f97..cf769e8 100644 --- a/line_chart.go +++ b/line_chart.go @@ -29,11 +29,10 @@ import ( func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { - d := result.d theme := NewTheme(opt.Theme) - sd, err := NewDraw(DrawOption{ - Parent: d, + d, err := NewDraw(DrawOption{ + Parent: result.d, }, PaddingOption(chart.Box{ Top: result.titleBox.Height(), Left: YAxisWidth, @@ -60,7 +59,7 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) if theme.IsDark() { dotFillColor = seriesColor } - sd.Line(points, LineStyle{ + d.Line(points, LineStyle{ StrokeColor: seriesColor, StrokeWidth: 2, DotColor: seriesColor, @@ -70,5 +69,5 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) } } - return d, nil + return result.d, nil } diff --git a/pie_chart.go b/pie_chart.go new file mode 100644 index 0000000..1013bce --- /dev/null +++ b/pie_chart.go @@ -0,0 +1,111 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "math" + + "github.com/wcharczuk/go-chart/v2" +) + +const defaultRadiusPercent = 0.4 + +func getPieStyle(theme *Theme, index int) chart.Style { + seriesColor := theme.GetSeriesColor(index) + return chart.Style{ + StrokeColor: seriesColor, + StrokeWidth: 1, + FillColor: seriesColor, + } + +} + +func pieChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { + d, err := NewDraw(DrawOption{ + Parent: result.d, + }, PaddingOption(chart.Box{ + Top: result.titleBox.Height(), + })) + if err != nil { + return nil, err + } + + values := make([]float64, len(opt.SeriesList)) + total := float64(0) + for index, series := range opt.SeriesList { + value := float64(0) + for _, item := range series.Data { + value += item.Value + } + values[index] = value + total += value + } + r := d.Render + theme := NewTheme(opt.Theme) + + box := d.Box + cx := box.Width() >> 1 + cy := box.Height() >> 1 + + diameter := chart.MinInt(box.Width(), box.Height()) + radius := float64(diameter) * defaultRadiusPercent + labelRadius := radius + 20 + + if len(values) == 1 { + getPieStyle(theme, 0).WriteToRenderer(r) + d.moveTo(cx, cy) + d.circle(radius, cx, cy) + } else { + currentValue := float64(0) + for index, v := range values { + getPieStyle(theme, index).WriteToRenderer(r) + d.moveTo(cx, cy) + start := chart.PercentToRadians(currentValue/total) - math.Pi/2 + currentValue += v + delta := chart.PercentToRadians(v / total) + d.arcTo(cx, cy, radius, radius, start, delta) + d.lineTo(cx, cy) + r.Close() + r.FillStroke() + + // label的角度为饼块中间 + angle := start + delta/2 + startx := cx + int(radius*math.Cos(angle)) + starty := cy + int(radius*math.Sin(angle)) + + endx := cx + int(labelRadius*math.Cos(angle)) + endy := cy + int(labelRadius*math.Sin(angle)) + d.moveTo(startx, starty) + d.lineTo(endx, endy) + offset := 30 + if endx < cx { + offset *= -1 + } + d.moveTo(endx, endy) + d.lineTo(endx+offset, endy) + r.Stroke() + // TODO label show + } + } + return result.d, nil +} diff --git a/xaxis.go b/xaxis.go index 6839329..8d47ed8 100644 --- a/xaxis.go +++ b/xaxis.go @@ -28,6 +28,7 @@ type XAxisOption struct { BoundaryGap *bool Data []string Theme string + Hidden bool // TODO split number } diff --git a/yaxis.go b/yaxis.go index 7329804..6b8af4c 100644 --- a/yaxis.go +++ b/yaxis.go @@ -27,8 +27,9 @@ import ( ) type YAxisOption struct { - Min *float64 - Max *float64 + Min *float64 + Max *float64 + Hidden bool } const YAxisWidth = 40 From dfba1ceafc0d3d61a6e461e8b2c09e505a6d623d Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 4 Feb 2022 09:18:57 +0800 Subject: [PATCH 060/251] refactor: add label for pie --- chart.go | 5 ++++- pie_chart.go | 27 +++++++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/chart.go b/chart.go index 426bc94..5cd85af 100644 --- a/chart.go +++ b/chart.go @@ -27,6 +27,7 @@ import ( "math" "github.com/dustin/go-humanize" + "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" ) @@ -55,6 +56,7 @@ type Series struct { } type ChartOption struct { + Font *truetype.Font Theme string Title TitleOption Legend LegendOption @@ -71,6 +73,7 @@ type ChartOption struct { func (o *ChartOption) FillDefault(theme string) { t := NewTheme(theme) f, _ := chart.GetDefaultFont() + o.Font = f if o.BackgroundColor.IsZero() { o.BackgroundColor = t.GetBackgroundColor() } @@ -93,7 +96,7 @@ func (o *ChartOption) FillDefault(theme string) { } o.Legend.Theme = t if o.Legend.Style.FontSize == 0 { - o.Legend.Style.FontSize = 8 + o.Legend.Style.FontSize =10 } if o.Legend.Style.Font == nil { o.Legend.Style.Font = f diff --git a/pie_chart.go b/pie_chart.go index 1013bce..210681c 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -25,6 +25,7 @@ package charts import ( "math" + "github.com/dustin/go-humanize" "github.com/wcharczuk/go-chart/v2" ) @@ -78,11 +79,13 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { } else { currentValue := float64(0) for index, v := range values { - getPieStyle(theme, index).WriteToRenderer(r) + pieStyle := getPieStyle(theme, index) + pieStyle.WriteToRenderer(r) d.moveTo(cx, cy) start := chart.PercentToRadians(currentValue/total) - math.Pi/2 currentValue += v - delta := chart.PercentToRadians(v / total) + percent := (v / total) + delta := chart.PercentToRadians(percent) d.arcTo(cx, cy, radius, radius, start, delta) d.lineTo(cx, cy) r.Close() @@ -102,9 +105,25 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { offset *= -1 } d.moveTo(endx, endy) - d.lineTo(endx+offset, endy) + endx += offset + d.lineTo(endx, endy) r.Stroke() - // TODO label show + textStyle := chart.Style{ + FontColor: theme.GetTextColor(), + FontSize: 10, + Font: opt.Font, + } + textStyle.GetTextOptions().WriteToRenderer(r) + text := humanize.FtoaWithDigits(percent*100, 2) + "%" + textBox := r.MeasureText(text) + textMargin := 3 + x := endx + textMargin + y := endy + textBox.Height()>>1 - 1 + if offset < 0 { + textWidth := textBox.Width() + x = endx - textWidth - textMargin + } + d.text(text, x, y) } } return result.d, nil From 126244ba520cbd7916db6e5b619a47195c69833d Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 4 Feb 2022 10:05:58 +0800 Subject: [PATCH 061/251] feat: support subtext for title --- axis.go | 6 ++--- chart.go | 24 +++++++++++++++---- title.go | 72 +++++++++++++++++++++++++++++++++++++++----------------- util.go | 7 ++++++ xaxis.go | 2 +- 5 files changed, 81 insertions(+), 30 deletions(-) diff --git a/axis.go b/axis.go index 7f3ba4b..ba0604e 100644 --- a/axis.go +++ b/axis.go @@ -256,7 +256,7 @@ func (a *axis) axisTick(opt *axisOption) { } labelMargin := style.GetLabelMargin() tickShow := true - if style.TickShow != nil && !*style.TickShow { + if isFalse(style.TickShow) { tickShow = false } @@ -364,7 +364,7 @@ func (a *axis) measureAxis() int { func (a *axis) Render() { style := a.style - if style.Show != nil && !*style.Show { + if isFalse(style.Show) { return } textMaxWidth, textMaxHeight := a.axisMeasureTextMaxWidthHeight() @@ -373,7 +373,7 @@ func (a *axis) Render() { textMaxHeight: textMaxHeight, boundaryGap: true, } - if style.BoundaryGap != nil && !*style.BoundaryGap { + if isFalse(style.BoundaryGap) { opt.boundaryGap = false } diff --git a/chart.go b/chart.go index 5cd85af..88fc43d 100644 --- a/chart.go +++ b/chart.go @@ -72,11 +72,14 @@ type ChartOption struct { func (o *ChartOption) FillDefault(theme string) { t := NewTheme(theme) - f, _ := chart.GetDefaultFont() - o.Font = f + if o.Font == nil { + o.Font, _ = chart.GetDefaultFont() + } if o.BackgroundColor.IsZero() { o.BackgroundColor = t.GetBackgroundColor() } + + // 标题的默认值 if o.Title.Style.FontColor.IsZero() { o.Title.Style.FontColor = t.GetTextColor() } @@ -84,7 +87,7 @@ func (o *ChartOption) FillDefault(theme string) { o.Title.Style.FontSize = 14 } if o.Title.Style.Font == nil { - o.Title.Style.Font = f + o.Title.Style.Font = o.Font } if o.Title.Style.Padding.IsZero() { o.Title.Style.Padding = chart.Box{ @@ -94,12 +97,23 @@ func (o *ChartOption) FillDefault(theme string) { Bottom: 5, } } + // 副标题 + if o.Title.SubtextStyle.FontColor.IsZero() { + o.Title.SubtextStyle.FontColor = o.Title.Style.FontColor.WithAlpha(180) + } + if o.Title.SubtextStyle.FontSize == 0 { + o.Title.SubtextStyle.FontSize = 10 + } + if o.Title.SubtextStyle.Font == nil { + o.Title.SubtextStyle.Font = o.Font + } + o.Legend.Theme = t if o.Legend.Style.FontSize == 0 { - o.Legend.Style.FontSize =10 + o.Legend.Style.FontSize = 10 } if o.Legend.Style.Font == nil { - o.Legend.Style.Font = f + o.Legend.Style.Font = o.Font } if o.Legend.Style.FontColor.IsZero() { o.Legend.Style.FontColor = t.GetTextColor() diff --git a/title.go b/title.go index a6d9a39..cd8f6ad 100644 --- a/title.go +++ b/title.go @@ -30,39 +30,71 @@ import ( ) type TitleOption struct { - Text string - Style chart.Style - Left string - Top string + Text string + Subtext string + Style chart.Style + SubtextStyle chart.Style + Left string + Top string } type titleMeasureOption struct { width int height int text string + style chart.Style } -func drawTitle(d *Draw, opt *TitleOption) (chart.Box, error) { +func splitTitleText(text string) []string { + arr := strings.Split(text, "\n") + result := make([]string, 0) + for _, v := range arr { + v = strings.TrimSpace(v) + if v == "" { + continue + } + result = append(result, v) + } + return result +} + +func drawTitle(p *Draw, opt *TitleOption) (chart.Box, error) { if len(opt.Text) == 0 { return chart.BoxZero, nil } padding := opt.Style.Padding - titleDraw, err := NewDraw(DrawOption{ - Parent: d, + d, err := NewDraw(DrawOption{ + Parent: p, }, PaddingOption(padding)) if err != nil { return chart.BoxZero, err } - r := titleDraw.Render - opt.Style.GetTextOptions().WriteToRenderer(r) - arr := strings.Split(opt.Text, "\n") + r := d.Render + + measureOptions := make([]titleMeasureOption, 0) + + // 主标题 + for _, v := range splitTitleText(opt.Text) { + measureOptions = append(measureOptions, titleMeasureOption{ + text: v, + style: opt.Style.GetTextOptions(), + }) + } + // 副标题 + for _, v := range splitTitleText(opt.Subtext) { + measureOptions = append(measureOptions, titleMeasureOption{ + text: v, + style: opt.SubtextStyle.GetTextOptions(), + }) + } + textMaxWidth := 0 textMaxHeight := 0 width := 0 - measureOptions := make([]titleMeasureOption, len(arr)) - for index, str := range arr { - textBox := r.MeasureText(str) + for index, item := range measureOptions { + item.style.WriteTextOptionsToRenderer(r) + textBox := r.MeasureText(item.text) w := textBox.Width() h := textBox.Height() @@ -72,15 +104,12 @@ func drawTitle(d *Draw, opt *TitleOption) (chart.Box, error) { if h > textMaxHeight { textMaxHeight = h } - measureOptions[index] = titleMeasureOption{ - text: str, - width: w, - height: h, - } + measureOptions[index].height = h + measureOptions[index].width = w } width = textMaxWidth titleX := 0 - b := titleDraw.Box + b := d.Box switch opt.Left { case PositionRight: titleX = b.Width() - textMaxWidth @@ -102,9 +131,10 @@ func drawTitle(d *Draw, opt *TitleOption) (chart.Box, error) { titleY += value } for _, item := range measureOptions { + item.style.WriteTextOptionsToRenderer(r) x := titleX + (textMaxWidth-item.width)>>1 - titleDraw.text(item.text, x, titleY) - titleY += textMaxHeight + d.text(item.text, x, titleY) + titleY += item.height } height := titleY + padding.Top + padding.Bottom box := padding.Clone() diff --git a/util.go b/util.go index 01590b4..c9c817f 100644 --- a/util.go +++ b/util.go @@ -106,3 +106,10 @@ func convertPercent(value string) float64 { } return float64(v) / 100 } + +func isFalse(flag *bool) bool { + if flag != nil && !*flag { + return true + } + return false +} diff --git a/xaxis.go b/xaxis.go index 8d47ed8..5993796 100644 --- a/xaxis.go +++ b/xaxis.go @@ -56,7 +56,7 @@ func drawXAxis(p *Draw, opt *XAxisOption) (int, *Range, error) { boundary := true max := float64(len(opt.Data)) - if opt.BoundaryGap != nil && !*opt.BoundaryGap { + if isFalse(opt.BoundaryGap) { boundary = false max-- } From c5e2ae67cb53830116952a16ffc14b7e93822c96 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 4 Feb 2022 10:54:15 +0800 Subject: [PATCH 062/251] test: add test for title render --- title.go | 21 ++++++--- title_test.go | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 title_test.go diff --git a/title.go b/title.go index cd8f6ad..a5ba6b3 100644 --- a/title.go +++ b/title.go @@ -30,12 +30,21 @@ import ( ) type TitleOption struct { - Text string - Subtext string - Style chart.Style + // Title text, support \n for new line + Text string + // Subtitle text, support \n for new line + Subtext string + // Title style + Style chart.Style + // Subtitle style SubtextStyle chart.Style - Left string - Top string + // Distance between title component and the left side of the container. + // It can be pixel value: 20, percentage value: 20%, + // or position value: right, center. + Left string + // Distance between title component and the top side of the container. + // It can be pixel value: 20. + Top string } type titleMeasureOption struct { width int @@ -138,7 +147,7 @@ func drawTitle(p *Draw, opt *TitleOption) (chart.Box, error) { } height := titleY + padding.Top + padding.Bottom box := padding.Clone() - box.Right = box.Left + width + box.Right = box.Left + titleX + width box.Bottom = box.Top + height return box, nil diff --git a/title_test.go b/title_test.go new file mode 100644 index 0000000..b5928eb --- /dev/null +++ b/title_test.go @@ -0,0 +1,128 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestSplitTitleText(t *testing.T) { + assert := assert.New(t) + + assert.Equal([]string{ + "a", + "b", + }, splitTitleText("a\nb")) + assert.Equal([]string{ + "a", + }, splitTitleText("a\n ")) +} + +func TestDrawTitle(t *testing.T) { + assert := assert.New(t) + + newOption := func() *TitleOption { + f, _ := chart.GetDefaultFont() + return &TitleOption{ + Text: "title\nHello", + Subtext: "subtitle\nWorld!", + Style: chart.Style{ + FontSize: 14, + Font: f, + FontColor: drawing.ColorBlack, + }, + SubtextStyle: chart.Style{ + FontSize: 10, + Font: f, + FontColor: drawing.ColorBlue, + }, + } + } + newDraw := func() *Draw { + d, _ := NewDraw(DrawOption{ + Width: 400, + Height: 300, + }) + return d + } + + tests := []struct { + newDraw func() *Draw + newOption func() *TitleOption + result string + box chart.Box + }{ + { + newDraw: newDraw, + newOption: newOption, + result: "\\ntitleHellosubtitleWorld!", + box: chart.Box{ + Right: 43, + Bottom: 58, + }, + }, + { + newDraw: newDraw, + newOption: func() *TitleOption { + opt := newOption() + opt.Left = PositionRight + opt.Top = "50" + return opt + }, + result: "\\ntitleHellosubtitleWorld!", + box: chart.Box{ + Right: 400, + Bottom: 108, + }, + }, + { + newDraw: newDraw, + newOption: func() *TitleOption { + opt := newOption() + opt.Left = PositionCenter + opt.Top = "10" + return opt + }, + result: "\\ntitleHellosubtitleWorld!", + box: chart.Box{ + Right: 222, + Bottom: 68, + }, + }, + } + for _, tt := range tests { + d := tt.newDraw() + o := tt.newOption() + b, err := drawTitle(d, o) + assert.Nil(err) + assert.Equal(tt.box, b) + data, err := d.Bytes() + assert.Nil(err) + assert.NotEmpty(data) + assert.Equal(tt.result, string(data)) + } +} From 3219ce521bb58788127b22634f9283420d602684 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 4 Feb 2022 18:34:31 +0800 Subject: [PATCH 063/251] feat: support vertical orient legend --- chart.go | 5 +- draw.go | 5 ++ legend.go | 120 +++++++++++++++++++++++++++++---------- legend_test.go | 148 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 248 insertions(+), 30 deletions(-) create mode 100644 legend_test.go diff --git a/chart.go b/chart.go index 88fc43d..a5cf8ab 100644 --- a/chart.go +++ b/chart.go @@ -108,10 +108,13 @@ func (o *ChartOption) FillDefault(theme string) { o.Title.SubtextStyle.Font = o.Font } - o.Legend.Theme = t + o.Legend.Theme = theme if o.Legend.Style.FontSize == 0 { o.Legend.Style.FontSize = 10 } + if o.Legend.Left == "" { + o.Legend.Left = PositionCenter + } if o.Legend.Style.Font == nil { o.Legend.Style.Font = o.Font } diff --git a/draw.go b/draw.go index ce0bd6b..bdd5a2b 100644 --- a/draw.go +++ b/draw.go @@ -39,6 +39,11 @@ const ( PositionBottom = "bottom" ) +const ( + OrientHorizontal = "horizontal" + OrientVertical = "vertical" +) + type Draw struct { Render chart.Renderer Box chart.Box diff --git a/legend.go b/legend.go index abffeb3..e1202cb 100644 --- a/legend.go +++ b/legend.go @@ -23,16 +23,31 @@ package charts import ( + "strconv" + "strings" + "github.com/wcharczuk/go-chart/v2" ) type LegendOption struct { - Theme *Theme + Theme string + // Legend show flag, if nil or true, the legend will be shown + Show *bool + // Legend text style Style chart.Style - Data []string - Left string - Right string + // Text array of legend + Data []string + // Distance between legend component and the left side of the container. + // It can be pixel value: 20, percentage value: 20%, + // or position value: right, center. + Left string + // Distance between legend component and the top side of the container. + // It can be pixel value: 20. + Top string + // Legend marker and text aligning, it can be left or right, default is left. Align string + // The layout orientation of legend, it can be horizontal or vertical, default is horizontal. + Orient string } type legend struct { d *Draw @@ -49,10 +64,10 @@ func NewLegend(d *Draw, opt LegendOption) *legend { func (l *legend) Render() (chart.Box, error) { d := l.d opt := l.opt - if len(opt.Data) == 0 { + if len(opt.Data) == 0 || isFalse(opt.Show) { return chart.BoxZero, nil } - theme := opt.Theme + theme := NewTheme(opt.Theme) padding := opt.Style.Padding legendDraw, err := NewDraw(DrawOption{ Parent: d, @@ -65,49 +80,91 @@ func (l *legend) Render() (chart.Box, error) { x := 0 y := 0 + top := 0 + // TODO TOP 暂只支持数值 + if opt.Top != "" { + top, _ = strconv.Atoi(opt.Top) + y += top + } legendWidth := 30 legendDotHeight := 5 textPadding := 5 legendMargin := 10 widthCount := 0 + maxTextWidth := 0 // 文本宽度 for _, text := range opt.Data { b := r.MeasureText(text) + if b.Width() > maxTextWidth { + maxTextWidth = b.Width() + } widthCount += b.Width() } - // 加上标记 - widthCount += legendWidth * len(opt.Data) - // 文本的padding - widthCount += 2 * textPadding * len(opt.Data) - // margin的宽度 - widthCount += legendMargin * (len(opt.Data) - 1) + if opt.Orient == OrientVertical { + widthCount = maxTextWidth + legendWidth + textPadding + } else { + // 加上标记 + widthCount += legendWidth * len(opt.Data) + // 文本的padding + widthCount += 2 * textPadding * len(opt.Data) + // margin的宽度 + widthCount += legendMargin * (len(opt.Data) - 1) + } - // TODO 支持更多的定位方式 - // 居中 - x = (legendDraw.Box.Width() - widthCount) >> 1 - for index, text := range opt.Data { - if index != 0 { - x += legendMargin + left := 0 + switch opt.Left { + case PositionRight: + left = legendDraw.Box.Width() - widthCount + case PositionCenter: + left = (legendDraw.Box.Width() - widthCount) >> 1 + default: + if strings.HasSuffix(opt.Left, "%") { + value, _ := strconv.Atoi(strings.ReplaceAll(opt.Left, "%", "")) + left = legendDraw.Box.Width() * value / 100 + } else { + value, _ := strconv.Atoi(opt.Left) + left = value } + } + x = left + for index, text := range opt.Data { style := chart.Style{ StrokeColor: theme.GetSeriesColor(index), FillColor: theme.GetSeriesColor(index), StrokeWidth: 3, } - textBox := r.MeasureText(text) - renderText := func() { - x += textPadding - legendDraw.text(text, x, y+legendDotHeight-2) - x += textBox.Width() - x += textPadding - } + style.GetFillAndStrokeOptions().WriteDrawingOptionsToRenderer(r) + textBox := r.MeasureText(text) + var renderText func() + if opt.Orient == OrientVertical { + // 垂直 + // 重置x的位置 + x = left + renderText = func() { + x += textPadding + legendDraw.text(text, x, y+legendDotHeight-2) + x += textBox.Width() + y += (2*legendDotHeight + legendMargin) + } + + } else { + // 水平 + if index != 0 { + x += legendMargin + } + renderText = func() { + x += textPadding + legendDraw.text(text, x, y+legendDotHeight-2) + x += textBox.Width() + x += textPadding + } + } if opt.Align == PositionRight { renderText() } - style.GetFillAndStrokeOptions().WriteDrawingOptionsToRenderer(r) legendDraw.moveTo(x, y) legendDraw.lineTo(x+legendWidth, y) r.Stroke() @@ -120,8 +177,13 @@ func (l *legend) Render() (chart.Box, error) { } } legendBox := padding.Clone() - legendBox.Right = legendBox.Left + x - legendBox.Bottom = legendBox.Top + 2*legendDotHeight - + // 计算展示区域 + if opt.Orient == OrientVertical { + legendBox.Right = legendBox.Left + left + maxTextWidth + legendWidth + textPadding + legendBox.Bottom = legendBox.Top + y + } else { + legendBox.Right = legendBox.Left + x + legendBox.Bottom = legendBox.Top + 2*legendDotHeight + top + textPadding + } return legendBox, nil } diff --git a/legend_test.go b/legend_test.go new file mode 100644 index 0000000..aaadec7 --- /dev/null +++ b/legend_test.go @@ -0,0 +1,148 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestLegendRender(t *testing.T) { + assert := assert.New(t) + + newDraw := func() *Draw { + d, _ := NewDraw(DrawOption{ + Width: 400, + Height: 300, + }) + return d + } + style := chart.Style{ + FontSize: 10, + FontColor: drawing.ColorBlack, + } + style.Font, _ = chart.GetDefaultFont() + + tests := []struct { + newDraw func() *Draw + newLegend func(*Draw) *legend + box chart.Box + result string + }{ + { + newDraw: newDraw, + newLegend: func(d *Draw) *legend { + return NewLegend(d, LegendOption{ + Top: "10", + Data: []string{ + "Mon", + "Tue", + "Wed", + }, + Style: style, + }) + }, + result: "\\nMonTueWed", + box: chart.Box{ + Right: 214, + Bottom: 25, + }, + }, + { + newDraw: newDraw, + newLegend: func(d *Draw) *legend { + return NewLegend(d, LegendOption{ + Top: "10", + Left: PositionRight, + Align: PositionRight, + Data: []string{ + "Mon", + "Tue", + "Wed", + }, + Style: style, + }) + }, + result: "\\nMonTueWed", + box: chart.Box{ + Right: 400, + Bottom: 25, + }, + }, + { + newDraw: newDraw, + newLegend: func(d *Draw) *legend { + return NewLegend(d, LegendOption{ + Top: "10", + Left: PositionCenter, + Data: []string{ + "Mon", + "Tue", + "Wed", + }, + Style: style, + }) + }, + result: "\\nMonTueWed", + box: chart.Box{ + Right: 307, + Bottom: 25, + }, + }, + { + newDraw: newDraw, + newLegend: func(d *Draw) *legend { + return NewLegend(d, LegendOption{ + Top: "10", + Left: PositionLeft, + Data: []string{ + "Mon", + "Tue", + "Wed", + }, + Style: style, + Orient: OrientVertical, + }) + }, + result: "\\nMonTueWed", + box: chart.Box{ + Right: 61, + Bottom: 70, + }, + }, + } + + for _, tt := range tests { + d := tt.newDraw() + b, err := tt.newLegend(d).Render() + assert.Nil(err) + assert.Equal(tt.box, b) + data, err := d.Bytes() + assert.Nil(err) + assert.NotEmpty(data) + assert.Equal(tt.result, string(data)) + } +} From c01f4001f1c6cdc0b8b5755a52867b5da07c1b1a Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 6 Feb 2022 09:55:27 +0800 Subject: [PATCH 064/251] refactor: auto count the split number for x axis --- axis.go | 76 +++++++++++++++++++++++++++++++++++-------- axis_test.go | 91 +++++++++++++++++++++++++++++++++++++--------------- util.go | 13 ++------ util_test.go | 6 ---- xaxis.go | 4 ++- yaxis.go | 2 +- 6 files changed, 134 insertions(+), 58 deletions(-) diff --git a/axis.go b/axis.go index ba0604e..eb0327f 100644 --- a/axis.go +++ b/axis.go @@ -23,15 +23,18 @@ package charts import ( + "math" + "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" ) -type AxisStyle struct { +type AxisOption struct { BoundaryGap *bool Show *bool Position string + SplitNumber int ClassName string StrokeColor drawing.Color StrokeWidth float64 @@ -48,10 +51,10 @@ type AxisStyle struct { type axis struct { d *Draw data *AxisDataList - style *AxisStyle + style *AxisOption } -func NewAxis(d *Draw, data AxisDataList, style AxisStyle) *axis { +func NewAxis(d *Draw, data AxisDataList, style AxisOption) *axis { return &axis{ d: d, data: &data, @@ -60,15 +63,15 @@ func NewAxis(d *Draw, data AxisDataList, style AxisStyle) *axis { } -func (as *AxisStyle) GetLabelMargin() int { +func (as *AxisOption) GetLabelMargin() int { return getDefaultInt(as.LabelMargin, 8) } -func (as *AxisStyle) GetTickLength() int { +func (as *AxisOption) GetTickLength() int { return getDefaultInt(as.TickLength, 5) } -func (as *AxisStyle) Style(f *truetype.Font) chart.Style { +func (as *AxisOption) Style(f *truetype.Font) chart.Style { s := chart.Style{ ClassName: as.ClassName, StrokeColor: as.StrokeColor, @@ -99,10 +102,12 @@ func (l AxisDataList) TextList() []string { return textList } -type axisOption struct { +type axisRenderOption struct { textMaxWith int textMaxHeight int boundaryGap bool + unitCount int + modValue int } func NewAxisDataListFromStringList(textList []string) AxisDataList { @@ -115,7 +120,7 @@ func NewAxisDataListFromStringList(textList []string) AxisDataList { return list } -func (a *axis) axisLabel(opt *axisOption) { +func (a *axis) axisLabel(opt *axisRenderOption) { style := a.style data := *a.data d := a.d @@ -131,11 +136,14 @@ func (a *axis) axisLabel(opt *axisOption) { height := d.Box.Height() textList := data.TextList() count := len(textList) + boundaryGap := opt.boundaryGap if !boundaryGap { count-- } + unitCount := opt.unitCount + modValue := opt.modValue labelMargin := style.GetLabelMargin() // 轴线 @@ -176,6 +184,9 @@ func (a *axis) axisLabel(opt *axisOption) { } values := autoDivide(width, count) for index, text := range data.TextList() { + if unitCount != 0 && index%unitCount != modValue { + continue + } x := values[index] leftOffset := 0 b := r.MeasureText(text) @@ -191,7 +202,7 @@ func (a *axis) axisLabel(opt *axisOption) { } } -func (a *axis) axisLine(opt *axisOption) { +func (a *axis) axisLine(opt *axisRenderOption) { d := a.d r := d.Render style := a.style @@ -239,7 +250,7 @@ func (a *axis) axisLine(opt *axisOption) { r.FillStroke() } -func (a *axis) axisTick(opt *axisOption) { +func (a *axis) axisTick(opt *axisRenderOption) { d := a.d r := d.Render @@ -259,6 +270,7 @@ func (a *axis) axisTick(opt *axisOption) { if isFalse(style.TickShow) { tickShow = false } + unitCount := opt.unitCount tickLengthValue := style.GetTickLength() labelHeight := labelMargin + opt.textMaxHeight @@ -308,7 +320,10 @@ func (a *axis) axisTick(opt *axisOption) { y0 = labelHeight } if tickShow { - for _, v := range values { + for index, v := range values { + if index%unitCount != 0 { + continue + } x := v y := y0 d.moveTo(x, y-tickLengthValue) @@ -326,7 +341,10 @@ func (a *axis) axisTick(opt *axisOption) { splitLineHeight = height - labelHeight } - for _, v := range values { + for index, v := range values { + if index%unitCount != 0 { + continue + } x := v y := y0 @@ -368,7 +386,7 @@ func (a *axis) Render() { return } textMaxWidth, textMaxHeight := a.axisMeasureTextMaxWidthHeight() - opt := &axisOption{ + opt := &axisRenderOption{ textMaxWith: textMaxWidth, textMaxHeight: textMaxHeight, boundaryGap: true, @@ -377,6 +395,38 @@ func (a *axis) Render() { opt.boundaryGap = false } + unitCount := chart.MaxInt(style.SplitNumber, 1) + width := a.d.Box.Width() + textList := a.data.TextList() + count := len(textList) + + position := style.Position + switch position { + case PositionLeft: + fallthrough + case PositionRight: + default: + maxCount := width / (opt.textMaxWith + 10) + // 可以显示所有 + if maxCount >= count { + unitCount = 1 + } else if maxCount < count/unitCount { + unitCount = int(math.Ceil(float64(count) / float64(maxCount))) + } + } + + boundaryGap := opt.boundaryGap + modValue := 0 + if boundaryGap && unitCount > 1 { + // 如果是居中,unit count需要设置为奇数 + if unitCount%2 == 0 { + unitCount++ + } + modValue = unitCount / 2 + } + opt.modValue = modValue + opt.unitCount = unitCount + // 坐标轴线 a.axisLine(opt) a.axisTick(opt) diff --git a/axis_test.go b/axis_test.go index e8efccd..a6a7690 100644 --- a/axis_test.go +++ b/axis_test.go @@ -31,10 +31,10 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) -func TestAxisStyle(t *testing.T) { +func TestAxisOption(t *testing.T) { assert := assert.New(t) - as := AxisStyle{} + as := AxisOption{} assert.Equal(8, as.GetLabelMargin()) as.LabelMargin = 10 @@ -64,7 +64,7 @@ func TestAxisDataList(t *testing.T) { func TestAxis(t *testing.T) { assert := assert.New(t) - data := NewAxisDataListFromStringList([]string{ + axisData := NewAxisDataListFromStringList([]string{ "Mon", "Tue", "Wed", @@ -73,8 +73,8 @@ func TestAxis(t *testing.T) { "Sat", "Sun", }) - getDefaultStyle := func() AxisStyle { - return AxisStyle{ + getDefaultOption := func() AxisOption { + return AxisOption{ StrokeColor: drawing.ColorBlack, StrokeWidth: 1, FontColor: drawing.ColorBlack, @@ -85,14 +85,15 @@ func TestAxis(t *testing.T) { } } tests := []struct { - newStyle func() AxisStyle - result string + newOption func() AxisOption + newData func() AxisDataList + result string }{ // 文本按起始位置展示 // axis位于bottom { - newStyle: func() AxisStyle { - opt := getDefaultStyle() + newOption: func() AxisOption { + opt := getDefaultOption() opt.BoundaryGap = FalseFlag() return opt }, @@ -101,8 +102,8 @@ func TestAxis(t *testing.T) { // 文本居中展示 // axis位于bottom { - newStyle: func() AxisStyle { - opt := getDefaultStyle() + newOption: func() AxisOption { + opt := getDefaultOption() return opt }, result: "\\nMonTueWedThuFriSatSun", @@ -110,8 +111,8 @@ func TestAxis(t *testing.T) { // 文本按起始位置展示 // axis位于top { - newStyle: func() AxisStyle { - opt := getDefaultStyle() + newOption: func() AxisOption { + opt := getDefaultOption() opt.Position = PositionTop opt.BoundaryGap = FalseFlag() return opt @@ -121,8 +122,8 @@ func TestAxis(t *testing.T) { // 文本居中展示 // axis位于top { - newStyle: func() AxisStyle { - opt := getDefaultStyle() + newOption: func() AxisOption { + opt := getDefaultOption() opt.Position = PositionTop return opt }, @@ -131,8 +132,8 @@ func TestAxis(t *testing.T) { // 文本按起始位置展示 // axis位于left { - newStyle: func() AxisStyle { - opt := getDefaultStyle() + newOption: func() AxisOption { + opt := getDefaultOption() opt.Position = PositionLeft opt.BoundaryGap = FalseFlag() return opt @@ -142,8 +143,8 @@ func TestAxis(t *testing.T) { // 文本居中展示 // axis位于left { - newStyle: func() AxisStyle { - opt := getDefaultStyle() + newOption: func() AxisOption { + opt := getDefaultOption() opt.Position = PositionLeft return opt }, @@ -152,8 +153,8 @@ func TestAxis(t *testing.T) { // 文本按起始位置展示 // axis位于right { - newStyle: func() AxisStyle { - opt := getDefaultStyle() + newOption: func() AxisOption { + opt := getDefaultOption() opt.Position = PositionRight opt.BoundaryGap = FalseFlag() return opt @@ -163,13 +164,47 @@ func TestAxis(t *testing.T) { // 文本居中展示 // axis位于right { - newStyle: func() AxisStyle { - opt := getDefaultStyle() + newOption: func() AxisOption { + opt := getDefaultOption() opt.Position = PositionRight return opt }, result: "\\nMonTueWedThuFriSatSun", }, + // text较多,仅展示部分 + { + newOption: func() AxisOption { + opt := getDefaultOption() + opt.Position = PositionBottom + return opt + }, + newData: func() AxisDataList { + return NewAxisDataListFromStringList([]string{ + "01-01", + "01-02", + "01-03", + "01-04", + "01-05", + "01-06", + "01-07", + "01-08", + "01-09", + "01-10", + "01-11", + "01-12", + "01-13", + "01-14", + "01-15", + "01-16", + "01-17", + "01-18", + "01-19", + "01-20", + "01-21", + }) + }, + result: "\\n01-0201-0501-0801-1101-1401-1701-20", + }, } for _, tt := range tests { d, err := NewDraw(DrawOption{ @@ -182,7 +217,11 @@ func TestAxis(t *testing.T) { Bottom: 5, })) assert.Nil(err) - style := tt.newStyle() + style := tt.newOption() + data := axisData + if tt.newData != nil { + data = tt.newData() + } NewAxis(d, data, style).Render() result, err := d.Bytes() @@ -204,14 +243,14 @@ func TestMeasureAxis(t *testing.T) { "Sun", }) f, _ := chart.GetDefaultFont() - width := NewAxis(d, data, AxisStyle{ + width := NewAxis(d, data, AxisOption{ FontSize: 12, Font: f, Position: PositionLeft, }).measureAxis() assert.Equal(44, width) - height := NewAxis(d, data, AxisStyle{ + height := NewAxis(d, data, AxisOption{ FontSize: 12, Font: f, Position: PositionTop, diff --git a/util.go b/util.go index c9c817f..10fcb18 100644 --- a/util.go +++ b/util.go @@ -62,15 +62,6 @@ func autoDivide(max, size int) []int { values[size] = max return values } -func maxInt(values ...int) int { - result := 0 - for _, v := range values { - if v > result { - result = v - } - } - return result -} // measureTextMaxWidthHeight returns maxWidth and maxHeight of text list func measureTextMaxWidthHeight(textList []string, r chart.Renderer) (int, int) { @@ -78,8 +69,8 @@ func measureTextMaxWidthHeight(textList []string, r chart.Renderer) (int, int) { maxHeight := 0 for _, text := range textList { box := r.MeasureText(text) - maxWidth = maxInt(maxWidth, box.Width()) - maxHeight = maxInt(maxHeight, box.Height()) + maxWidth = chart.MaxInt(maxWidth, box.Width()) + maxHeight = chart.MaxInt(maxHeight, box.Height()) } return maxWidth, maxHeight } diff --git a/util_test.go b/util_test.go index 983efbc..3d155ed 100644 --- a/util_test.go +++ b/util_test.go @@ -51,12 +51,6 @@ func TestAutoDivide(t *testing.T) { }, autoDivide(600, 7)) } -func TestMaxInt(t *testing.T) { - assert := assert.New(t) - - assert.Equal(5, maxInt(1, 3, 5, 2)) -} - func TestMeasureTextMaxWidthHeight(t *testing.T) { assert := assert.New(t) r, err := chart.SVG(400, 300) diff --git a/xaxis.go b/xaxis.go index 5993796..0383c73 100644 --- a/xaxis.go +++ b/xaxis.go @@ -29,6 +29,7 @@ type XAxisOption struct { Data []string Theme string Hidden bool + SplitNumber int // TODO split number } @@ -47,11 +48,12 @@ func drawXAxis(p *Draw, opt *XAxisOption) (int, *Range, error) { } theme := NewTheme(opt.Theme) data := NewAxisDataListFromStringList(opt.Data) - style := AxisStyle{ + style := AxisOption{ BoundaryGap: opt.BoundaryGap, StrokeColor: theme.GetAxisStrokeColor(), FontColor: theme.GetAxisStrokeColor(), StrokeWidth: 1, + SplitNumber: opt.SplitNumber, } boundary := true diff --git a/yaxis.go b/yaxis.go index 6b8af4c..79ed299 100644 --- a/yaxis.go +++ b/yaxis.go @@ -38,7 +38,7 @@ func drawYAxis(p *Draw, opt *ChartOption, xAxisHeight int, padding chart.Box) (* theme := NewTheme(opt.Theme) yRange := opt.getYRange(0) data := NewAxisDataListFromStringList(yRange.Values()) - style := AxisStyle{ + style := AxisOption{ Position: PositionLeft, BoundaryGap: FalseFlag(), FontColor: theme.GetAxisStrokeColor(), From 54f0195c53a0f1481bd74b9207599d7637dee638 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 6 Feb 2022 10:40:05 +0800 Subject: [PATCH 065/251] test: add test for legend and draw --- axis.go | 42 ++++++++++++++++++++++++++++-------------- bar.go | 1 + draw_test.go | 17 +++++++++++++++++ legend_test.go | 21 +++++++++++++++++++++ 4 files changed, 67 insertions(+), 14 deletions(-) diff --git a/axis.go b/axis.go index eb0327f..4b9444c 100644 --- a/axis.go +++ b/axis.go @@ -31,20 +31,33 @@ import ( ) type AxisOption struct { - BoundaryGap *bool - Show *bool - Position string - SplitNumber int - ClassName string - StrokeColor drawing.Color - StrokeWidth float64 - TickLength int - TickShow *bool - LabelMargin int - FontSize float64 - Font *truetype.Font - FontColor drawing.Color - SplitLineShow bool + BoundaryGap *bool + // The flag for show axis, set this to *false will hide axis + Show *bool + // The position of axis, it can be 'left', 'top', 'right' or 'bottom' + Position string + // Number of segments that the axis is split into. Note that this number serves only as a recommendation. + SplitNumber int + ClassName string + // The line color of axis + StrokeColor drawing.Color + // The line width + StrokeWidth float64 + // The length of the axis tick + TickLength int + // The flag for show axis tick, set this to *false will hide axis tick + TickShow *bool + // The margin value of label + LabelMargin int + // The font size of label + FontSize float64 + // The font of label + Font *truetype.Font + // The color of label + FontColor drawing.Color + // The flag for show axis split line, set this to true will show axis split line + SplitLineShow bool + // The color of split line SplitLineColor drawing.Color } @@ -380,6 +393,7 @@ func (a *axis) measureAxis() int { return textMaxHeight + value } +// Render renders the axis for chart func (a *axis) Render() { style := a.style if isFalse(style.Show) { diff --git a/bar.go b/bar.go index eb88cb1..1090f6b 100644 --- a/bar.go +++ b/bar.go @@ -43,6 +43,7 @@ func (bs *BarStyle) Style() chart.Style { } } +// Bar renders bar for chart func (d *Draw) Bar(b chart.Box, style BarStyle) { s := style.Style() diff --git a/draw_test.go b/draw_test.go index ef449dd..65c2398 100644 --- a/draw_test.go +++ b/draw_test.go @@ -23,6 +23,8 @@ package charts import ( + "fmt" + "math" "testing" "github.com/stretchr/testify/assert" @@ -224,6 +226,20 @@ func TestDraw(t *testing.T) { }, result: "\\n", }, + // arcTo + { + fn: func(d *Draw) { + chart.Style{ + StrokeWidth: 1, + StrokeColor: drawing.ColorBlack, + FillColor: drawing.ColorBlue, + }.WriteToRenderer(d.Render) + d.arcTo(100, 100, 100, 100, 0, math.Pi/2) + d.Render.Close() + d.Render.FillStroke() + }, + result: "\\n", + }, } for _, tt := range tests { d, err := NewDraw(DrawOption{ @@ -237,6 +253,7 @@ func TestDraw(t *testing.T) { tt.fn(d) data, err := d.Bytes() assert.Nil(err) + fmt.Println(string(data)) assert.Equal(tt.result, string(data)) } } diff --git a/legend_test.go b/legend_test.go index aaadec7..0274269 100644 --- a/legend_test.go +++ b/legend_test.go @@ -133,6 +133,27 @@ func TestLegendRender(t *testing.T) { Bottom: 70, }, }, + { + newDraw: newDraw, + newLegend: func(d *Draw) *legend { + return NewLegend(d, LegendOption{ + Top: "10", + Left: "10%", + Data: []string{ + "Mon", + "Tue", + "Wed", + }, + Style: style, + Orient: OrientVertical, + }) + }, + box: chart.Box{ + Right: 101, + Bottom: 70, + }, + result: "\\nMonTueWed", + }, } for _, tt := range tests { From f053b49440986f96b776f0d77c473b037d32edfa Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 6 Feb 2022 10:50:36 +0800 Subject: [PATCH 066/251] test: add test for range --- range.go | 8 +++++--- range_test.go | 29 ++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/range.go b/range.go index 57dbd20..ec9265d 100644 --- a/range.go +++ b/range.go @@ -38,7 +38,10 @@ func NewRange(min, max float64, divideCount int) Range { r := math.Abs(max - min) // 最小单位计算 - unit := 5 + unit := 2 + if r > 10 { + unit = 5 + } if r > 100 { unit = 20 } @@ -65,8 +68,7 @@ func (r *Range) getHeight(value float64) int { } func (r *Range) getRestHeight(value float64) int { - v := 1 - (value-r.Min)/(r.Max-r.Min) - return int(v * float64(r.Size)) + return r.Size - r.getHeight(value) } func (r *Range) GetRange(index int) (float64, float64) { diff --git a/range_test.go b/range_test.go index 151a0bb..b10002f 100644 --- a/range_test.go +++ b/range_test.go @@ -33,7 +33,7 @@ func TestRange(t *testing.T) { r := NewRange(0, 8, 6) assert.Equal(0.0, r.Min) - assert.Equal(30.0, r.Max) + assert.Equal(12.0, r.Max) r = NewRange(0, 12, 6) assert.Equal(0.0, r.Min) @@ -47,3 +47,30 @@ func TestRange(t *testing.T) { assert.Equal(0.0, r.Min) assert.Equal(480.0, r.Max) } + +func TestRangeHeightWidth(t *testing.T) { + assert := assert.New(t) + r := NewRange(0, 8, 6) + r.Size = 100 + + assert.Equal(33, r.getHeight(4)) + assert.Equal(67, r.getRestHeight(4)) + + assert.Equal(33, r.getWidth(4)) + r.Boundary = true + assert.Equal(41, r.getWidth(4)) +} + +func TestRangeGetRange(t *testing.T) { + assert := assert.New(t) + r := NewRange(0, 8, 6) + r.Size = 120 + + f1, f2 := r.GetRange(0) + assert.Equal(0.0, f1) + assert.Equal(20.0, f2) + + f1, f2 = r.GetRange(2) + assert.Equal(40.0, f1) + assert.Equal(60.0, f2) +} From d080d568cda5648ea090fedfaaac4e859b7d36b4 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 6 Feb 2022 10:55:56 +0800 Subject: [PATCH 067/251] test: add test for title --- title_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/title_test.go b/title_test.go index b5928eb..9556d9c 100644 --- a/title_test.go +++ b/title_test.go @@ -23,6 +23,7 @@ package charts import ( + "fmt" "testing" "github.com/stretchr/testify/assert" @@ -113,6 +114,20 @@ func TestDrawTitle(t *testing.T) { Bottom: 68, }, }, + { + newDraw: newDraw, + newOption: func() *TitleOption { + opt := newOption() + opt.Left = "10%" + opt.Top = "10" + return opt + }, + result: "\\ntitleHellosubtitleWorld!", + box: chart.Box{ + Right: 83, + Bottom: 68, + }, + }, } for _, tt := range tests { d := tt.newDraw() @@ -123,6 +138,7 @@ func TestDrawTitle(t *testing.T) { data, err := d.Bytes() assert.Nil(err) assert.NotEmpty(data) + fmt.Println(string(data)) assert.Equal(tt.result, string(data)) } } From cc6a1832fe7d755645297241e77b1a8cfae4567a Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 6 Feb 2022 10:57:40 +0800 Subject: [PATCH 068/251] test: add test for util --- util_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/util_test.go b/util_test.go index 3d155ed..1c6ebf9 100644 --- a/util_test.go +++ b/util_test.go @@ -113,3 +113,11 @@ func TestReverseSlice(t *testing.T) { 1, }, numbers) } + +func TestConvertPercent(t *testing.T) { + assert := assert.New(t) + + assert.Equal(-1.0, convertPercent("1")) + assert.Equal(-1.0, convertPercent("a%")) + assert.Equal(0.1, convertPercent("10%")) +} From e07cb9060705963d5001cbbdbc442a8cdbd831a5 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 6 Feb 2022 11:31:56 +0800 Subject: [PATCH 069/251] test: add test for x axis --- axis.go | 4 ++- xaxis.go | 16 ++++++--- xaxis_test.go | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 xaxis_test.go diff --git a/axis.go b/axis.go index 4b9444c..e6488cd 100644 --- a/axis.go +++ b/axis.go @@ -31,6 +31,8 @@ import ( ) type AxisOption struct { + // The boundary gap on both sides of a coordinate axis. + // Nil or *true means the center part of two axis ticks BoundaryGap *bool // The flag for show axis, set this to *false will hide axis Show *bool @@ -379,7 +381,7 @@ func (a *axis) axisMeasureTextMaxWidthHeight() (int, int) { return measureTextMaxWidthHeight(data.TextList(), r) } -// measureAxis return the measurement of axis. +// measureAxis returns the measurement of axis. // If the position is left or right, it will be textMaxWidth + labelMargin + tickLength. // If the position is top or bottom, it will be textMaxHeight + labelMargin + tickLength. func (a *axis) measureAxis() int { diff --git a/xaxis.go b/xaxis.go index 0383c73..60c7c23 100644 --- a/xaxis.go +++ b/xaxis.go @@ -25,16 +25,24 @@ package charts import "github.com/wcharczuk/go-chart/v2" type XAxisOption struct { + // The boundary gap on both sides of a coordinate axis. + // Nil or *true means the center part of two axis ticks BoundaryGap *bool - Data []string - Theme string - Hidden bool + // The data value of x axis + Data []string + // The theme of chart + Theme string + // Hidden x axis + Hidden bool + // Number of segments that the axis is split into. Note that this number serves only as a recommendation. SplitNumber int - // TODO split number } // drawXAxis draws x axis, and returns the height, range of if. func drawXAxis(p *Draw, opt *XAxisOption) (int, *Range, error) { + if opt.Hidden { + return 0, nil, nil + } dXAxis, err := NewDraw( DrawOption{ Parent: p, diff --git a/xaxis_test.go b/xaxis_test.go new file mode 100644 index 0000000..bce3863 --- /dev/null +++ b/xaxis_test.go @@ -0,0 +1,91 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestDrawXAxis(t *testing.T) { + assert := assert.New(t) + + newDraw := func() *Draw { + d, _ := NewDraw(DrawOption{ + Width: 400, + Height: 300, + }) + return d + } + + tests := []struct { + newDraw func() *Draw + newOption func() *XAxisOption + result string + }{ + { + newDraw: newDraw, + newOption: func() *XAxisOption { + return &XAxisOption{ + BoundaryGap: FalseFlag(), + Data: []string{ + "Mon", + "Tue", + }, + } + }, + result: "\\nMonTue", + }, + { + newDraw: newDraw, + newOption: func() *XAxisOption { + return &XAxisOption{ + Data: []string{ + "01-01", + "01-02", + "01-03", + "01-04", + "01-05", + "01-06", + "01-07", + "01-08", + "01-09", + }, + SplitNumber: 3, + } + }, + result: "\\n01-0201-0501-08", + }, + } + + for _, tt := range tests { + d := tt.newDraw() + height, _, err := drawXAxis(d, tt.newOption()) + assert.Nil(err) + assert.Equal(25, height) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} From 524eb79a8e5a969b2f51a11422acc1df368e401e Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 7 Feb 2022 23:29:00 +0800 Subject: [PATCH 070/251] feat: support radius for pie chart --- axis.go | 3 ++ bar_chart.go | 25 +++++++++++- chart.go | 106 ++++++++++++++++++++++++++++++------------------- draw_test.go | 2 - line_chart.go | 49 ++++++++++++++++------- pie_chart.go | 35 ++++++++++++++-- range.go | 13 ++++++ series.go | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++ title_test.go | 2 - util.go | 5 +++ yaxis.go | 7 +++- yaxis_test.go | 87 ++++++++++++++++++++++++++++++++++++++++ 12 files changed, 376 insertions(+), 66 deletions(-) create mode 100644 series.go create mode 100644 yaxis_test.go diff --git a/axis.go b/axis.go index e6488cd..14648cf 100644 --- a/axis.go +++ b/axis.go @@ -277,6 +277,9 @@ func (a *axis) axisTick(opt *axisRenderOption) { height := d.Box.Height() data := *a.data tickCount := len(data) + if tickCount == 0 { + return + } if !opt.boundaryGap { tickCount-- } diff --git a/bar_chart.go b/bar_chart.go index dfaf50f..d9917f1 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -53,6 +53,10 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { barMaxHeight := yRange.Size theme := NewTheme(opt.Theme) + seriesNames := opt.Legend.Data + + r := d.Render + for i, series := range opt.SeriesList { for j, item := range series.Data { x0, _ := xRange.GetRange(j) @@ -63,6 +67,10 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { } h := int(yRange.getHeight(item.Value)) + fillColor := theme.GetSeriesColor(i) + if !item.Style.FillColor.IsZero() { + fillColor = item.Style.FillColor + } d.Bar(chart.Box{ Top: barMaxHeight - h, @@ -70,8 +78,23 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { Right: x + barWidth, Bottom: barMaxHeight - 1, }, BarStyle{ - FillColor: theme.GetSeriesColor(i), + FillColor: fillColor, }) + if !series.Label.Show { + continue + } + text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(i, item.Value, -1) + labelStyle := chart.Style{ + FontColor: theme.GetTextColor(), + FontSize: 10, + Font: opt.Font, + } + if !series.Label.Color.IsZero() { + labelStyle.FontColor = series.Label.Color + } + labelStyle.GetTextOptions().WriteToRenderer(r) + textBox := r.MeasureText(text) + d.text(text, x+(barWidth-textBox.Width())>>1, barMaxHeight-h-5) } } diff --git a/chart.go b/chart.go index a5cf8ab..a485df5 100644 --- a/chart.go +++ b/chart.go @@ -26,7 +26,6 @@ import ( "errors" "math" - "github.com/dustin/go-humanize" "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" @@ -38,23 +37,11 @@ const ( ChartTypePie = "pie" ) -type SeriesData struct { - Value float64 - Style chart.Style -} type Point struct { X int Y int } -type Series struct { - index int - Type string - Data []SeriesData - YAxisIndex int - Style chart.Style -} - type ChartOption struct { Font *truetype.Font Theme string @@ -68,6 +55,7 @@ type ChartOption struct { Padding chart.Box SeriesList []Series BackgroundColor drawing.Color + Children []ChartOption } func (o *ChartOption) FillDefault(theme string) { @@ -115,6 +103,13 @@ func (o *ChartOption) FillDefault(theme string) { if o.Legend.Left == "" { o.Legend.Left = PositionCenter } + if len(o.Legend.Data) == 0 { + names := make([]string, len(o.SeriesList)) + for index, item := range o.SeriesList { + names[index] = item.Name + } + o.Legend.Data = names + } if o.Legend.Style.Font == nil { o.Legend.Style.Font = o.Font } @@ -165,20 +160,19 @@ func (o *ChartOption) getYRange(axisIndex int) Range { if o.YAxis.Max != nil { max = *o.YAxis.Max } + divideCount := 6 // y轴分设置默认划分为6块 - r := NewRange(min, max, 6) - return r -} + r := NewRange(min, max, divideCount) -func (r Range) Values() []string { - offset := (r.Max - r.Min) / float64(r.divideCount) - values := make([]string, 0) - for i := 0; i <= r.divideCount; i++ { - v := r.Min + float64(i)*offset - value := humanize.CommafWithDigits(v, 2) - values = append(values, value) + // 由于NewRange会重新计算min max + if o.YAxis.Min != nil { + r.Min = min } - return values + if o.YAxis.Max != nil { + r.Max = max + } + + return r } type basicRenderResult struct { @@ -188,7 +182,7 @@ type basicRenderResult struct { titleBox chart.Box } -func ChartRender(opt ChartOption) (*Draw, error) { +func Render(opt ChartOption) (*Draw, error) { if len(opt.SeriesList) == 0 { return nil, errors.New("series can not be nil") } @@ -207,7 +201,7 @@ func ChartRender(opt ChartOption) (*Draw, error) { lineSeries = append(lineSeries, item) } } - // 如果指定了pie,则以pie的形式处理,不支持多类型图表 + // 如果指定了pie,则以pie的形式处理,pie不支持多类型图表 // pie不需要axis if isPieChart { opt.XAxis.Hidden = true @@ -217,21 +211,56 @@ func ChartRender(opt ChartOption) (*Draw, error) { if err != nil { return nil, err } - if isPieChart { - return pieChartRender(opt, result) + fns := []func() error{ + // pie render + func() error { + if !isPieChart { + return nil + } + _, err := pieChartRender(opt, result) + return err + }, + // bar render + func() error { + // 如果是pie或者无bar类型的series + if isPieChart || len(barSeries) == 0 { + return nil + } + o := opt + o.SeriesList = barSeries + _, err := barChartRender(o, result) + return err + }, + // line render + func() error { + // 如果是pie或者无line类型的series + if isPieChart || len(lineSeries) == 0 { + return nil + } + o := opt + o.SeriesList = lineSeries + _, err := lineChartRender(o, result) + return err + }, + // legend需要在顶层,因此最后render + func() error { + _, err := NewLegend(result.d, opt.Legend).Render() + return err + }, } - if len(barSeries) != 0 { - o := opt - o.SeriesList = barSeries - _, err = barChartRender(o, result) + + for _, fn := range fns { + err = fn() if err != nil { return nil, err } } - if len(lineSeries) != 0 { - o := opt - o.SeriesList = lineSeries - _, err = lineChartRender(o, result) + for _, child := range opt.Children { + child.Parent = result.d + if len(child.Theme) == 0 { + child.Theme = opt.Theme + } + _, err = Render(child) if err != nil { return nil, err } @@ -263,11 +292,6 @@ func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { return nil, err } - _, err = NewLegend(d, opt.Legend).Render() - if err != nil { - return nil, err - } - xAxisHeight := 0 var xRange *Range diff --git a/draw_test.go b/draw_test.go index 65c2398..9627d0e 100644 --- a/draw_test.go +++ b/draw_test.go @@ -23,7 +23,6 @@ package charts import ( - "fmt" "math" "testing" @@ -253,7 +252,6 @@ func TestDraw(t *testing.T) { tt.fn(d) data, err := d.Bytes() assert.Nil(err) - fmt.Println(string(data)) assert.Equal(tt.result, string(data)) } } diff --git a/line_chart.go b/line_chart.go index cf769e8..c9b1b7a 100644 --- a/line_chart.go +++ b/line_chart.go @@ -40,33 +40,52 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) if err != nil { return nil, err } + seriesNames := opt.Legend.Data + + r := d.Render yRange := result.yRange xRange := result.xRange for i, series := range opt.SeriesList { points := make([]Point, 0) for j, item := range series.Data { y := yRange.getRestHeight(item.Value) + x := xRange.getWidth(float64(j)) points = append(points, Point{ Y: y, - X: xRange.getWidth(float64(j)), + X: x, }) - index := series.index - if index == 0 { - index = i + if !series.Label.Show { + continue } - seriesColor := theme.GetSeriesColor(index) - dotFillColor := drawing.ColorWhite - if theme.IsDark() { - dotFillColor = seriesColor + text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(i, item.Value, -1) + labelStyle := chart.Style{ + FontColor: theme.GetTextColor(), + FontSize: 10, + Font: opt.Font, } - d.Line(points, LineStyle{ - StrokeColor: seriesColor, - StrokeWidth: 2, - DotColor: seriesColor, - DotWidth: 2, - DotFillColor: dotFillColor, - }) + if !series.Label.Color.IsZero() { + labelStyle.FontColor = series.Label.Color + } + labelStyle.GetTextOptions().WriteToRenderer(r) + textBox := r.MeasureText(text) + d.text(text, x-textBox.Width()>>1, y-5) } + index := series.index + if index == 0 { + index = i + } + seriesColor := theme.GetSeriesColor(index) + dotFillColor := drawing.ColorWhite + if theme.IsDark() { + dotFillColor = seriesColor + } + d.Line(points, LineStyle{ + StrokeColor: seriesColor, + StrokeWidth: 2, + DotColor: seriesColor, + DotWidth: 2, + DotFillColor: dotFillColor, + }) } return result.d, nil diff --git a/pie_chart.go b/pie_chart.go index 210681c..d2cd029 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -24,8 +24,8 @@ package charts import ( "math" + "strconv" - "github.com/dustin/go-humanize" "github.com/wcharczuk/go-chart/v2" ) @@ -53,7 +53,11 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { values := make([]float64, len(opt.SeriesList)) total := float64(0) + radiusValue := "" for index, series := range opt.SeriesList { + if len(series.Radius) != 0 { + radiusValue = series.Radius + } value := float64(0) for _, item := range series.Data { value += item.Value @@ -69,9 +73,23 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { cy := box.Height() >> 1 diameter := chart.MinInt(box.Width(), box.Height()) - radius := float64(diameter) * defaultRadiusPercent + + var radius float64 + if len(radiusValue) != 0 { + v := convertPercent(radiusValue) + if v != -1 { + radius = float64(diameter) * v + } else { + radius, _ = strconv.ParseFloat(radiusValue, 64) + } + } + if radius <= 0 { + radius = float64(diameter) * defaultRadiusPercent + } labelRadius := radius + 20 + seriesNames := opt.Legend.Data + if len(values) == 1 { getPieStyle(theme, 0).WriteToRenderer(r) d.moveTo(cx, cy) @@ -79,6 +97,7 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { } else { currentValue := float64(0) for index, v := range values { + pieStyle := getPieStyle(theme, index) pieStyle.WriteToRenderer(r) d.moveTo(cx, cy) @@ -91,6 +110,13 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { r.Close() r.FillStroke() + series := opt.SeriesList[index] + // 是否显示label + showLabel := series.Label.Show + if !showLabel { + continue + } + // label的角度为饼块中间 angle := start + delta/2 startx := cx + int(radius*math.Cos(angle)) @@ -113,8 +139,11 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { FontSize: 10, Font: opt.Font, } + if !series.Label.Color.IsZero() { + textStyle.FontColor = series.Label.Color + } textStyle.GetTextOptions().WriteToRenderer(r) - text := humanize.FtoaWithDigits(percent*100, 2) + "%" + text := NewPieLabelFormatter(seriesNames, series.Label.Formatter)(index, v, percent) textBox := r.MeasureText(text) textMargin := 3 x := endx + textMargin diff --git a/range.go b/range.go index ec9265d..8a3db1e 100644 --- a/range.go +++ b/range.go @@ -24,6 +24,8 @@ package charts import ( "math" + + "github.com/dustin/go-humanize" ) type Range struct { @@ -62,6 +64,17 @@ func NewRange(min, max float64, divideCount int) Range { } } +func (r Range) Values() []string { + offset := (r.Max - r.Min) / float64(r.divideCount) + values := make([]string, 0) + for i := 0; i <= r.divideCount; i++ { + v := r.Min + float64(i)*offset + value := humanize.CommafWithDigits(v, 2) + values = append(values, value) + } + return values +} + func (r *Range) getHeight(value float64) int { v := (value - r.Min) / (r.Max - r.Min) return int(v * float64(r.Size)) diff --git a/series.go b/series.go new file mode 100644 index 0000000..1ab95f8 --- /dev/null +++ b/series.go @@ -0,0 +1,108 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "strings" + + "github.com/dustin/go-humanize" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +type SeriesData struct { + Value float64 + Style chart.Style +} + +func NewSeriesFromValues(values []float64, chartType ...string) Series { + s := Series{ + Data: NewSeriesDataFromValues(values), + } + if len(chartType) != 0 { + s.Type = chartType[0] + } + return s +} + +func NewSeriesDataFromValues(values []float64) []SeriesData { + data := make([]SeriesData, len(values)) + for index, value := range values { + data[index] = SeriesData{ + Value: value, + } + } + return data +} + +type SeriesLabel struct { + Formatter string + Color drawing.Color + Show bool +} +type Series struct { + index int + Type string + Data []SeriesData + YAxisIndex int + Style chart.Style + Label SeriesLabel + Name string + // Radius of Pie chart, e.g.: 40% + Radius string +} + +type LabelFormatter func(index int, value float64, percent float64) string + +func NewPieLabelFormatter(seriesNames []string, layout string) LabelFormatter { + if len(layout) == 0 { + layout = "{b}: {d}" + } + return NewLabelFormatter(seriesNames, layout) +} + +func NewValueLabelFormater(seriesNames []string, layout string) LabelFormatter { + if len(layout) == 0 { + layout = "{c}" + } + return NewLabelFormatter(seriesNames, layout) +} + +func NewLabelFormatter(seriesNames []string, layout string) LabelFormatter { + return func(index int, value, percent float64) string { + // 如果无percent的则设置为<0 + percentText := "" + if percent >= 0 { + percentText = humanize.FtoaWithDigits(percent*100, 2) + "%" + } + valueText := humanize.FtoaWithDigits(value, 2) + name := "" + if len(seriesNames) > index { + name = seriesNames[index] + } + text := strings.ReplaceAll(layout, "{c}", valueText) + text = strings.ReplaceAll(text, "{d}", percentText) + text = strings.ReplaceAll(text, "{b}", name) + return text + } +} diff --git a/title_test.go b/title_test.go index 9556d9c..e5f895c 100644 --- a/title_test.go +++ b/title_test.go @@ -23,7 +23,6 @@ package charts import ( - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -138,7 +137,6 @@ func TestDrawTitle(t *testing.T) { data, err := d.Bytes() assert.Nil(err) assert.NotEmpty(data) - fmt.Println(string(data)) assert.Equal(tt.result, string(data)) } } diff --git a/util.go b/util.go index 10fcb18..9765bb5 100644 --- a/util.go +++ b/util.go @@ -104,3 +104,8 @@ func isFalse(flag *bool) bool { } return false } + +func toFloatPoint(f float64) *float64 { + v := f + return &v +} diff --git a/yaxis.go b/yaxis.go index 79ed299..8603924 100644 --- a/yaxis.go +++ b/yaxis.go @@ -27,8 +27,11 @@ import ( ) type YAxisOption struct { - Min *float64 - Max *float64 + // The minimun value of axis. + Min *float64 + // The maximum value of axis. + Max *float64 + // Hidden y axis Hidden bool } diff --git a/yaxis_test.go b/yaxis_test.go new file mode 100644 index 0000000..634ff59 --- /dev/null +++ b/yaxis_test.go @@ -0,0 +1,87 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestDrawYAxis(t *testing.T) { + assert := assert.New(t) + newDraw := func() *Draw { + d, _ := NewDraw(DrawOption{ + Width: 400, + Height: 300, + }) + return d + } + + tests := []struct { + newDraw func() *Draw + newOption func() *ChartOption + xAxisHeight int + result string + }{ + { + newDraw: newDraw, + newOption: func() *ChartOption { + return &ChartOption{ + YAxis: YAxisOption{ + Max: toFloatPoint(20), + }, + SeriesList: []Series{ + { + Data: []SeriesData{ + { + Value: 1, + }, + { + Value: 2, + }, + }, + }, + }, + } + }, + result: "\\n03.336.661013.3316.6620", + }, + } + + for _, tt := range tests { + d := tt.newDraw() + r, err := drawYAxis(d, tt.newOption(), tt.xAxisHeight, chart.NewBox(10, 10, 10, 10)) + assert.Nil(err) + assert.Equal(&Range{ + divideCount: 6, + Max: 20, + Size: 280, + }, r) + + data, err := d.Bytes() + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} From c0bb1654c2d1af735c294a08b8f21519d327b78f Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 8 Feb 2022 23:16:30 +0800 Subject: [PATCH 071/251] feat: support mark point for line chart --- chart.go | 2 ++ draw.go | 25 +++++++++++++++++++++++++ draw_test.go | 21 +++++++++++++++++++++ legend.go | 13 +++++++++---- legend_test.go | 10 +++++----- line_chart.go | 42 ++++++++++++++++++++++++++++++++++++++++++ range.go | 4 +--- series.go | 16 +++++++++++++++- theme.go | 4 ++-- util.go | 13 +++++++++++++ yaxis.go | 14 +++++++++++++- 11 files changed, 148 insertions(+), 16 deletions(-) diff --git a/chart.go b/chart.go index a485df5..7c511de 100644 --- a/chart.go +++ b/chart.go @@ -43,6 +43,7 @@ type Point struct { } type ChartOption struct { + Type string Font *truetype.Font Theme string Title TitleOption @@ -271,6 +272,7 @@ func Render(opt ChartOption) (*Draw, error) { func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { d, err := NewDraw( DrawOption{ + Type: opt.Type, Parent: opt.Parent, Width: opt.getWidth(), Height: opt.getHeight(), diff --git a/draw.go b/draw.go index bdd5a2b..c7f0849 100644 --- a/draw.go +++ b/draw.go @@ -25,6 +25,7 @@ package charts import ( "bytes" "errors" + "math" "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" @@ -151,6 +152,30 @@ func (d *Draw) lineTo(x, y int) { d.Render.LineTo(x+d.Box.Left, y+d.Box.Top) } +func (d *Draw) pin(x, y, width int) { + r := float64(width) / 2 + y -= width / 4 + angle := chart.DegreesToRadians(15) + + startAngle := math.Pi/2 + angle + delta := 2*math.Pi - 2*angle + d.arcTo(x, y, r, r, startAngle, delta) + d.lineTo(x, y) + d.Render.Fill() + startX := x - int(r) + startY := y + endX := x + int(r) + endY := y + d.moveTo(startX, startY) + + left := d.Box.Left + top := d.Box.Top + cx := x + cy := y + int(r*2.5) + d.Render.QuadCurveTo(cx+left, cy+top, endX+left, endY+top) + d.Render.Fill() +} + func (d *Draw) circle(radius float64, x, y int) { d.Render.Circle(radius, x+d.Box.Left, y+d.Box.Top) } diff --git a/draw_test.go b/draw_test.go index 9627d0e..dcba961 100644 --- a/draw_test.go +++ b/draw_test.go @@ -239,6 +239,27 @@ func TestDraw(t *testing.T) { }, result: "\\n", }, + { + fn: func(d *Draw) { + chart.Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }.WriteToRenderer(d.Render) + d.pin(30, 30, 30) + }, + result: "\\n", + }, } for _, tt := range tests { d, err := NewDraw(DrawOption{ diff --git a/legend.go b/legend.go index e1202cb..7b6722e 100644 --- a/legend.go +++ b/legend.go @@ -129,9 +129,14 @@ func (l *legend) Render() (chart.Box, error) { } x = left for index, text := range opt.Data { + seriesColor := theme.GetSeriesColor(index) + fillColor := seriesColor + if !theme.IsDark() { + fillColor = theme.GetBackgroundColor() + } style := chart.Style{ - StrokeColor: theme.GetSeriesColor(index), - FillColor: theme.GetSeriesColor(index), + StrokeColor: seriesColor, + FillColor: fillColor, StrokeWidth: 3, } style.GetFillAndStrokeOptions().WriteDrawingOptionsToRenderer(r) @@ -144,7 +149,7 @@ func (l *legend) Render() (chart.Box, error) { x = left renderText = func() { x += textPadding - legendDraw.text(text, x, y+legendDotHeight-2) + legendDraw.text(text, x, y+legendDotHeight) x += textBox.Width() y += (2*legendDotHeight + legendMargin) } @@ -156,7 +161,7 @@ func (l *legend) Render() (chart.Box, error) { } renderText = func() { x += textPadding - legendDraw.text(text, x, y+legendDotHeight-2) + legendDraw.text(text, x, y+legendDotHeight) x += textBox.Width() x += textPadding } diff --git a/legend_test.go b/legend_test.go index 0274269..db9d459 100644 --- a/legend_test.go +++ b/legend_test.go @@ -65,7 +65,7 @@ func TestLegendRender(t *testing.T) { Style: style, }) }, - result: "\\nMonTueWed", + result: "\\nMonTueWed", box: chart.Box{ Right: 214, Bottom: 25, @@ -86,7 +86,7 @@ func TestLegendRender(t *testing.T) { Style: style, }) }, - result: "\\nMonTueWed", + result: "\\nMonTueWed", box: chart.Box{ Right: 400, Bottom: 25, @@ -106,7 +106,7 @@ func TestLegendRender(t *testing.T) { Style: style, }) }, - result: "\\nMonTueWed", + result: "\\nMonTueWed", box: chart.Box{ Right: 307, Bottom: 25, @@ -127,7 +127,7 @@ func TestLegendRender(t *testing.T) { Orient: OrientVertical, }) }, - result: "\\nMonTueWed", + result: "\\nMonTueWed", box: chart.Box{ Right: 61, Bottom: 70, @@ -152,7 +152,7 @@ func TestLegendRender(t *testing.T) { Right: 101, Bottom: 70, }, - result: "\\nMonTueWed", + result: "\\nMonTueWed", }, } diff --git a/line_chart.go b/line_chart.go index c9b1b7a..91e1a6d 100644 --- a/line_chart.go +++ b/line_chart.go @@ -23,6 +23,8 @@ package charts import ( + "math" + "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" ) @@ -47,7 +49,19 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) xRange := result.xRange for i, series := range opt.SeriesList { points := make([]Point, 0) + minIndex := -1 + maxIndex := -1 + minValue := math.MaxFloat64 + maxValue := -math.MaxFloat64 for j, item := range series.Data { + if item.Value < minValue { + minIndex = j + minValue = item.Value + } + if item.Value > maxValue { + maxIndex = j + maxValue = item.Value + } y := yRange.getRestHeight(item.Value) x := xRange.getWidth(float64(j)) points = append(points, Point{ @@ -86,6 +100,34 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) DotWidth: 2, DotFillColor: dotFillColor, }) + // draw mark point + symbolSize := 30 + if series.MarkPoint.SymbolSize > 0 { + symbolSize = series.MarkPoint.SymbolSize + } + for _, markPointData := range series.MarkPoint.Data { + p := points[minIndex] + value := minValue + switch markPointData.Type { + case SeriesMarkPointDataTypeMax: + p = points[maxIndex] + value = maxValue + } + chart.Style{ + FillColor: seriesColor, + }.WriteToRenderer(r) + d.pin(p.X, p.Y-symbolSize>>1, symbolSize) + + chart.Style{ + FontColor: NewTheme(ThemeDark).GetTextColor(), + FontSize: 10, + StrokeWidth: 1, + Font: opt.Font, + }.WriteTextOptionsToRenderer(d.Render) + text := commafWithDigits(value) + textBox := r.MeasureText(text) + d.text(text, p.X-textBox.Width()>>1, p.Y-symbolSize>>1-2) + } } return result.d, nil diff --git a/range.go b/range.go index 8a3db1e..0d1b459 100644 --- a/range.go +++ b/range.go @@ -24,8 +24,6 @@ package charts import ( "math" - - "github.com/dustin/go-humanize" ) type Range struct { @@ -69,7 +67,7 @@ func (r Range) Values() []string { values := make([]string, 0) for i := 0; i <= r.divideCount; i++ { v := r.Min + float64(i)*offset - value := humanize.CommafWithDigits(v, 2) + value := commafWithDigits(v) values = append(values, value) } return values diff --git a/series.go b/series.go index 1ab95f8..8b5161d 100644 --- a/series.go +++ b/series.go @@ -60,6 +60,19 @@ type SeriesLabel struct { Color drawing.Color Show bool } + +const ( + SeriesMarkPointDataTypeMax = "max" + SeriesMarkPointDataTypeMin = "min" +) + +type SeriesMarkPointData struct { + Type string +} +type SeriesMarkPoint struct { + SymbolSize int + Data []SeriesMarkPointData +} type Series struct { index int Type string @@ -69,7 +82,8 @@ type Series struct { Label SeriesLabel Name string // Radius of Pie chart, e.g.: 40% - Radius string + Radius string + MarkPoint SeriesMarkPoint } type LabelFormatter func(index int, value float64, percent float64) string diff --git a/theme.go b/theme.go index 5aa4bf9..23a010c 100644 --- a/theme.go +++ b/theme.go @@ -131,8 +131,8 @@ func (t *Theme) GetTextColor() drawing.Color { if t.IsDark() { return drawing.Color{ R: 238, - G: 241, - B: 250, + G: 238, + B: 238, A: 255, } } diff --git a/util.go b/util.go index 9765bb5..5c1415d 100644 --- a/util.go +++ b/util.go @@ -26,6 +26,7 @@ import ( "strconv" "strings" + "github.com/dustin/go-humanize" "github.com/wcharczuk/go-chart/v2" ) @@ -109,3 +110,15 @@ func toFloatPoint(f float64) *float64 { v := f return &v } +func commafWithDigits(value float64) string { + decimals := 2 + m := float64(1000 * 1000) + if value >= m { + return humanize.CommafWithDigits(value/m, decimals) + " M" + } + k := float64(1000) + if value >= k { + return humanize.CommafWithDigits(value/k, decimals) + " K" + } + return humanize.CommafWithDigits(value, decimals) +} diff --git a/yaxis.go b/yaxis.go index 8603924..1742e99 100644 --- a/yaxis.go +++ b/yaxis.go @@ -23,6 +23,8 @@ package charts import ( + "strings" + "github.com/wcharczuk/go-chart/v2" ) @@ -33,6 +35,8 @@ type YAxisOption struct { Max *float64 // Hidden y axis Hidden bool + // Formatter for y axis text value + Formatter string } const YAxisWidth = 40 @@ -40,7 +44,15 @@ const YAxisWidth = 40 func drawYAxis(p *Draw, opt *ChartOption, xAxisHeight int, padding chart.Box) (*Range, error) { theme := NewTheme(opt.Theme) yRange := opt.getYRange(0) - data := NewAxisDataListFromStringList(yRange.Values()) + values := yRange.Values() + formatter := opt.YAxis.Formatter + if len(formatter) != 0 { + for index, text := range values { + values[index] = strings.ReplaceAll(formatter, "{value}", text) + } + } + + data := NewAxisDataListFromStringList(values) style := AxisOption{ Position: PositionLeft, BoundaryGap: FalseFlag(), From fd0525030522f94f9f70517b9f73aacd4b9b75b1 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 9 Feb 2022 23:44:39 +0800 Subject: [PATCH 072/251] feat: support mulit y axis --- axis.go | 5 +++ bar_chart.go | 27 ++++++++++++---- chart.go | 85 +++++++++++++++++++++++++++++++++--------------- draw.go | 55 ++++++++++++++++++++++++++++++- draw_test.go | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++ line_chart.go | 58 +++++++-------------------------- mark_point.go | 75 +++++++++++++++++++++++++++++++++++++++++++ pie_chart.go | 2 +- range.go | 6 ++++ range_test.go | 6 +++- series.go | 35 ++++++++++++++++++++ util.go | 6 ++-- xaxis.go | 11 +++++-- xaxis_test.go | 2 +- yaxis.go | 19 ++++++++--- yaxis_test.go | 8 +++-- 16 files changed, 393 insertions(+), 96 deletions(-) create mode 100644 mark_point.go diff --git a/axis.go b/axis.go index 14648cf..29cc3cc 100644 --- a/axis.go +++ b/axis.go @@ -78,14 +78,17 @@ func NewAxis(d *Draw, data AxisDataList, style AxisOption) *axis { } +// GetLabelMargin returns the label margin value func (as *AxisOption) GetLabelMargin() int { return getDefaultInt(as.LabelMargin, 8) } +// GetTickLength returns the tick length value func (as *AxisOption) GetTickLength() int { return getDefaultInt(as.TickLength, 5) } +// Style returns the style of axis func (as *AxisOption) Style(f *truetype.Font) chart.Style { s := chart.Style{ ClassName: as.ClassName, @@ -109,6 +112,7 @@ type AxisData struct { } type AxisDataList []AxisData +// TextList returns the text list of axis data func (l AxisDataList) TextList() []string { textList := make([]string, len(l)) for index, item := range l { @@ -125,6 +129,7 @@ type axisRenderOption struct { modValue int } +// NewAxisDataListFromStringList creates a new axis data list from string list func NewAxisDataListFromStringList(textList []string) AxisDataList { list := make(AxisDataList, len(textList)) for index, text := range textList { diff --git a/bar_chart.go b/bar_chart.go index d9917f1..7a5805b 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -37,7 +37,7 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { if err != nil { return nil, err } - yRange := result.yRange + // yRange := result.yRange xRange := result.xRange x0, x1 := xRange.GetRange(0) width := int(x1 - x0) @@ -50,7 +50,7 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { // 总的宽度-两个margin-(总数-1)的barMargin barWidth := (width - 2*margin - barMargin*(seriesCount-1)) / len(opt.SeriesList) - barMaxHeight := yRange.Size + barMaxHeight := result.getYRange(0).Size theme := NewTheme(opt.Theme) seriesNames := opt.Legend.Data @@ -58,6 +58,9 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { r := d.Render for i, series := range opt.SeriesList { + yRange := result.getYRange(series.YAxisIndex) + points := make([]Point, len(series.Data)) + seriesColor := theme.GetSeriesColor(i) for j, item := range series.Data { x0, _ := xRange.GetRange(j) x := int(x0) @@ -67,26 +70,32 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { } h := int(yRange.getHeight(item.Value)) - fillColor := theme.GetSeriesColor(i) + fillColor := seriesColor if !item.Style.FillColor.IsZero() { fillColor = item.Style.FillColor } - + top := barMaxHeight - h d.Bar(chart.Box{ - Top: barMaxHeight - h, + Top: top, Left: x, Right: x + barWidth, Bottom: barMaxHeight - 1, }, BarStyle{ FillColor: fillColor, }) + // 用于生成marker point + points[j] = Point{ + // 居中的位置 + X: x + barWidth>>1, + Y: top, + } if !series.Label.Show { continue } text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(i, item.Value, -1) labelStyle := chart.Style{ FontColor: theme.GetTextColor(), - FontSize: 10, + FontSize: labelFontSize, Font: opt.Font, } if !series.Label.Color.IsZero() { @@ -96,6 +105,12 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { textBox := r.MeasureText(text) d.text(text, x+(barWidth-textBox.Width())>>1, barMaxHeight-h-5) } + markPointRender(d, markPointRenderOption{ + FillColor: seriesColor, + Font: opt.Font, + Points: points, + Series: &series, + }) } return result.d, nil diff --git a/chart.go b/chart.go index 7c511de..dbc4db4 100644 --- a/chart.go +++ b/chart.go @@ -42,6 +42,8 @@ type Point struct { Y int } +const labelFontSize = 10 + type ChartOption struct { Type string Font *truetype.Font @@ -49,7 +51,7 @@ type ChartOption struct { Title TitleOption Legend LegendOption XAxis XAxisOption - YAxis YAxisOption + YAxisList []YAxisOption Width int Height int Parent *Draw @@ -61,6 +63,17 @@ type ChartOption struct { func (o *ChartOption) FillDefault(theme string) { t := NewTheme(theme) + // 如果为空,初始化 + yAxisCount := 1 + for _, series := range o.SeriesList { + if series.YAxisIndex >= yAxisCount { + yAxisCount++ + } + } + yAxisList := make([]YAxisOption, yAxisCount) + copy(yAxisList, o.YAxisList) + o.YAxisList = yAxisList + if o.Font == nil { o.Font, _ = chart.GetDefaultFont() } @@ -136,9 +149,13 @@ func (o *ChartOption) getHeight() int { return o.Height } -func (o *ChartOption) getYRange(axisIndex int) Range { +func (o *ChartOption) newYRange(axisIndex int) Range { min := math.MaxFloat64 max := -math.MaxFloat64 + if axisIndex >= len(o.YAxisList) { + axisIndex = 0 + } + yAxis := o.YAxisList[axisIndex] for _, series := range o.SeriesList { if series.YAxisIndex != axisIndex { @@ -155,21 +172,21 @@ func (o *ChartOption) getYRange(axisIndex int) Range { } min = min * 0.9 max = max * 1.1 - if o.YAxis.Min != nil { - min = *o.YAxis.Min + if yAxis.Min != nil { + min = *yAxis.Min } - if o.YAxis.Max != nil { - max = *o.YAxis.Max + if yAxis.Max != nil { + max = *yAxis.Max } divideCount := 6 // y轴分设置默认划分为6块 r := NewRange(min, max, divideCount) // 由于NewRange会重新计算min max - if o.YAxis.Min != nil { + if yAxis.Min != nil { r.Min = min } - if o.YAxis.Max != nil { + if yAxis.Max != nil { r.Max = max } @@ -177,10 +194,17 @@ func (o *ChartOption) getYRange(axisIndex int) Range { } type basicRenderResult struct { - xRange *Range - yRange *Range - d *Draw - titleBox chart.Box + xRange *Range + yRangeList []*Range + d *Draw + titleBox chart.Box +} + +func (r *basicRenderResult) getYRange(index int) *Range { + if index >= len(r.yRangeList) { + index = 0 + } + return r.yRangeList[index] } func Render(opt ChartOption) (*Draw, error) { @@ -206,7 +230,9 @@ func Render(opt ChartOption) (*Draw, error) { // pie不需要axis if isPieChart { opt.XAxis.Hidden = true - opt.YAxis.Hidden = true + for index := range opt.YAxisList { + opt.YAxisList[index].Hidden = true + } } result, err := chartBasicRender(&opt) if err != nil { @@ -284,6 +310,9 @@ func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { } opt.FillDefault(opt.Theme) + if len(opt.YAxisList) > 2 { + return nil, errors.New("y axis should not be gt 2") + } if opt.Parent == nil { d.setBackground(opt.getWidth(), opt.getHeight(), opt.BackgroundColor) } @@ -299,26 +328,30 @@ func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { if !opt.XAxis.Hidden { // xAxis - xAxisHeight, xRange, err = drawXAxis(d, &opt.XAxis) + xAxisHeight, xRange, err = drawXAxis(d, &opt.XAxis, len(opt.YAxisList)) if err != nil { return nil, err } } - // 暂时仅支持单一yaxis - var yRange *Range - if !opt.YAxis.Hidden { - yRange, err = drawYAxis(d, opt, xAxisHeight, chart.Box{ - Top: titleBox.Height(), - }) - if err != nil { - return nil, err + yRangeList := make([]*Range, len(opt.YAxisList)) + + for index, yAxis := range opt.YAxisList { + var yRange *Range + if !yAxis.Hidden { + yRange, err = drawYAxis(d, opt, index, xAxisHeight, chart.Box{ + Top: titleBox.Height(), + }) + if err != nil { + return nil, err + } + yRangeList[index] = yRange } } return &basicRenderResult{ - xRange: xRange, - yRange: yRange, - d: d, - titleBox: titleBox, + xRange: xRange, + yRangeList: yRangeList, + d: d, + titleBox: titleBox, }, nil } diff --git a/draw.go b/draw.go index c7f0849..5c65d87 100644 --- a/draw.go +++ b/draw.go @@ -173,7 +173,60 @@ func (d *Draw) pin(x, y, width int) { cx := x cy := y + int(r*2.5) d.Render.QuadCurveTo(cx+left, cy+top, endX+left, endY+top) - d.Render.Fill() + d.Render.Stroke() +} + +func (d *Draw) arrowLeft(x, y, width, height int) { + d.arrow(x, y, width, height, PositionLeft) +} + +func (d *Draw) arrowRight(x, y, width, height int) { + d.arrow(x, y, width, height, PositionRight) +} + +func (d *Draw) arrowTop(x, y, width, height int) { + d.arrow(x, y, width, height, PositionTop) +} +func (d *Draw) arrowBottom(x, y, width, height int) { + d.arrow(x, y, width, height, PositionBottom) +} + +func (d *Draw) arrow(x, y, width, height int, direction string) { + halfWidth := width >> 1 + halfHeight := height >> 1 + if direction == PositionTop || direction == PositionBottom { + x0 := x - halfWidth + x1 := x0 + width + dy := -height / 3 + y0 := y + y1 := y0 - height + if direction == PositionBottom { + y0 = y - height + y1 = y + dy = 2 * dy + } + d.moveTo(x0, y0) + d.lineTo(x0+halfWidth, y1) + d.lineTo(x1, y0) + d.lineTo(x0+halfWidth, y+dy) + d.lineTo(x0, y0) + } else { + x0 := x + width + x1 := x0 - width + y0 := y - halfHeight + dx := -width / 3 + if direction == PositionRight { + x0 = x - width + dx = -dx + x1 = x0 + width + } + d.moveTo(x0, y0) + d.lineTo(x1, y0+halfHeight) + d.lineTo(x0, y0+height) + d.lineTo(x0+dx, y0+halfHeight) + d.lineTo(x0, y0) + } + d.Render.Stroke() } func (d *Draw) circle(radius float64, x, y int) { diff --git a/draw_test.go b/draw_test.go index dcba961..efda7eb 100644 --- a/draw_test.go +++ b/draw_test.go @@ -239,6 +239,7 @@ func TestDraw(t *testing.T) { }, result: "\\n", }, + // pin { fn: func(d *Draw) { chart.Style{ @@ -260,6 +261,94 @@ func TestDraw(t *testing.T) { }, result: "\\n", }, + // arrow left + { + fn: func(d *Draw) { + chart.Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }.WriteToRenderer(d.Render) + d.arrowLeft(30, 30, 16, 10) + }, + result: "\\n", + }, + // arrow right + { + fn: func(d *Draw) { + chart.Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }.WriteToRenderer(d.Render) + d.arrowRight(30, 30, 16, 10) + }, + result: "\\n", + }, + // arrow top + { + fn: func(d *Draw) { + chart.Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }.WriteToRenderer(d.Render) + d.arrowTop(30, 30, 10, 16) + }, + result: "\\n", + }, + // arrow bottom + { + fn: func(d *Draw) { + chart.Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }.WriteToRenderer(d.Render) + d.arrowBottom(30, 30, 10, 16) + }, + result: "\\n", + }, } for _, tt := range tests { d, err := NewDraw(DrawOption{ diff --git a/line_chart.go b/line_chart.go index 91e1a6d..39d8b4d 100644 --- a/line_chart.go +++ b/line_chart.go @@ -23,8 +23,6 @@ package charts import ( - "math" - "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" ) @@ -45,36 +43,25 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) seriesNames := opt.Legend.Data r := d.Render - yRange := result.yRange xRange := result.xRange for i, series := range opt.SeriesList { - points := make([]Point, 0) - minIndex := -1 - maxIndex := -1 - minValue := math.MaxFloat64 - maxValue := -math.MaxFloat64 + yRange := result.getYRange(series.YAxisIndex) + points := make([]Point, len(series.Data)) + for j, item := range series.Data { - if item.Value < minValue { - minIndex = j - minValue = item.Value - } - if item.Value > maxValue { - maxIndex = j - maxValue = item.Value - } y := yRange.getRestHeight(item.Value) x := xRange.getWidth(float64(j)) - points = append(points, Point{ + points[j] = Point{ Y: y, X: x, - }) + } if !series.Label.Show { continue } text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(i, item.Value, -1) labelStyle := chart.Style{ FontColor: theme.GetTextColor(), - FontSize: 10, + FontSize: labelFontSize, Font: opt.Font, } if !series.Label.Color.IsZero() { @@ -101,33 +88,12 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) DotFillColor: dotFillColor, }) // draw mark point - symbolSize := 30 - if series.MarkPoint.SymbolSize > 0 { - symbolSize = series.MarkPoint.SymbolSize - } - for _, markPointData := range series.MarkPoint.Data { - p := points[minIndex] - value := minValue - switch markPointData.Type { - case SeriesMarkPointDataTypeMax: - p = points[maxIndex] - value = maxValue - } - chart.Style{ - FillColor: seriesColor, - }.WriteToRenderer(r) - d.pin(p.X, p.Y-symbolSize>>1, symbolSize) - - chart.Style{ - FontColor: NewTheme(ThemeDark).GetTextColor(), - FontSize: 10, - StrokeWidth: 1, - Font: opt.Font, - }.WriteTextOptionsToRenderer(d.Render) - text := commafWithDigits(value) - textBox := r.MeasureText(text) - d.text(text, p.X-textBox.Width()>>1, p.Y-symbolSize>>1-2) - } + markPointRender(d, markPointRenderOption{ + FillColor: seriesColor, + Font: opt.Font, + Points: points, + Series: &series, + }) } return result.d, nil diff --git a/mark_point.go b/mark_point.go new file mode 100644 index 0000000..f1a429f --- /dev/null +++ b/mark_point.go @@ -0,0 +1,75 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +type markPointRenderOption struct { + FillColor drawing.Color + Font *truetype.Font + Series *Series + Points []Point +} + +func markPointRender(d *Draw, opt markPointRenderOption) { + s := opt.Series + if len(s.MarkPoint.Data) == 0 { + return + } + points := opt.Points + summary := s.Summary() + symbolSize := s.MarkPoint.SymbolSize + if symbolSize == 0 { + symbolSize = 30 + } + r := d.Render + // 设置填充样式 + chart.Style{ + FillColor: opt.FillColor, + }.WriteToRenderer(r) + // 设置文本样式 + chart.Style{ + FontColor: NewTheme(ThemeDark).GetTextColor(), + FontSize: 10, + StrokeWidth: 1, + Font: opt.Font, + }.WriteTextOptionsToRenderer(r) + for _, markPointData := range s.MarkPoint.Data { + p := points[summary.MinIndex] + value := summary.MinValue + switch markPointData.Type { + case SeriesMarkPointDataTypeMax: + p = points[summary.MaxIndex] + value = summary.MaxValue + } + + d.pin(p.X, p.Y-symbolSize>>1, symbolSize) + text := commafWithDigits(value) + textBox := r.MeasureText(text) + d.text(text, p.X-textBox.Width()>>1, p.Y-symbolSize>>1-2) + } +} diff --git a/pie_chart.go b/pie_chart.go index d2cd029..84751f9 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -136,7 +136,7 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { r.Stroke() textStyle := chart.Style{ FontColor: theme.GetTextColor(), - FontSize: 10, + FontSize: labelFontSize, Font: opt.Font, } if !series.Label.Color.IsZero() { diff --git a/range.go b/range.go index 0d1b459..308dba8 100644 --- a/range.go +++ b/range.go @@ -40,9 +40,15 @@ func NewRange(min, max float64, divideCount int) Range { // 最小单位计算 unit := 2 if r > 10 { + unit = 4 + } + if r > 30 { unit = 5 } if r > 100 { + unit = 10 + } + if r > 200 { unit = 20 } unit = int((r/float64(divideCount))/float64(unit))*unit + unit diff --git a/range_test.go b/range_test.go index b10002f..06c25fd 100644 --- a/range_test.go +++ b/range_test.go @@ -37,12 +37,16 @@ func TestRange(t *testing.T) { r = NewRange(0, 12, 6) assert.Equal(0.0, r.Min) - assert.Equal(30.0, r.Max) + assert.Equal(24.0, r.Max) r = NewRange(-13, 18, 6) assert.Equal(-20.0, r.Min) assert.Equal(40.0, r.Max) + r = NewRange(0, 150, 6) + assert.Equal(0.0, r.Min) + assert.Equal(180.0, r.Max) + r = NewRange(0, 400, 6) assert.Equal(0.0, r.Min) assert.Equal(480.0, r.Max) diff --git a/series.go b/series.go index 8b5161d..b37e13d 100644 --- a/series.go +++ b/series.go @@ -23,6 +23,7 @@ package charts import ( + "math" "strings" "github.com/dustin/go-humanize" @@ -86,6 +87,40 @@ type Series struct { MarkPoint SeriesMarkPoint } +type seriesSummary struct { + MaxIndex int + MaxValue float64 + MinIndex int + MinValue float64 + AverageValue float64 +} + +func (s *Series) Summary() seriesSummary { + minIndex := -1 + maxIndex := -1 + minValue := math.MaxFloat64 + maxValue := -math.MaxFloat64 + sum := float64(0) + for j, item := range s.Data { + if item.Value < minValue { + minIndex = j + minValue = item.Value + } + if item.Value > maxValue { + maxIndex = j + maxValue = item.Value + } + sum += item.Value + } + return seriesSummary{ + MaxIndex: maxIndex, + MaxValue: maxValue, + MinIndex: minIndex, + MinValue: minValue, + AverageValue: sum / float64(len(s.Data)), + } +} + type LabelFormatter func(index int, value float64, percent float64) string func NewPieLabelFormatter(seriesNames []string, layout string) LabelFormatter { diff --git a/util.go b/util.go index 5c1415d..3064668 100644 --- a/util.go +++ b/util.go @@ -106,7 +106,7 @@ func isFalse(flag *bool) bool { return false } -func toFloatPoint(f float64) *float64 { +func NewFloatPoint(f float64) *float64 { v := f return &v } @@ -114,11 +114,11 @@ func commafWithDigits(value float64) string { decimals := 2 m := float64(1000 * 1000) if value >= m { - return humanize.CommafWithDigits(value/m, decimals) + " M" + return humanize.CommafWithDigits(value/m, decimals) + "M" } k := float64(1000) if value >= k { - return humanize.CommafWithDigits(value/k, decimals) + " K" + return humanize.CommafWithDigits(value/k, decimals) + "k" } return humanize.CommafWithDigits(value, decimals) } diff --git a/xaxis.go b/xaxis.go index 60c7c23..5c21c14 100644 --- a/xaxis.go +++ b/xaxis.go @@ -22,7 +22,9 @@ package charts -import "github.com/wcharczuk/go-chart/v2" +import ( + "github.com/wcharczuk/go-chart/v2" +) type XAxisOption struct { // The boundary gap on both sides of a coordinate axis. @@ -39,16 +41,19 @@ type XAxisOption struct { } // drawXAxis draws x axis, and returns the height, range of if. -func drawXAxis(p *Draw, opt *XAxisOption) (int, *Range, error) { +func drawXAxis(p *Draw, opt *XAxisOption, yAxisCount int) (int, *Range, error) { if opt.Hidden { return 0, nil, nil } + left := YAxisWidth + right := (yAxisCount - 1) * YAxisWidth dXAxis, err := NewDraw( DrawOption{ Parent: p, }, PaddingOption(chart.Box{ - Left: YAxisWidth, + Left: left, + Right: right, }), ) if err != nil { diff --git a/xaxis_test.go b/xaxis_test.go index bce3863..44e8a3f 100644 --- a/xaxis_test.go +++ b/xaxis_test.go @@ -81,7 +81,7 @@ func TestDrawXAxis(t *testing.T) { for _, tt := range tests { d := tt.newDraw() - height, _, err := drawXAxis(d, tt.newOption()) + height, _, err := drawXAxis(d, tt.newOption(), 1) assert.Nil(err) assert.Equal(25, height) data, err := d.Bytes() diff --git a/yaxis.go b/yaxis.go index 1742e99..b978d08 100644 --- a/yaxis.go +++ b/yaxis.go @@ -41,11 +41,11 @@ type YAxisOption struct { const YAxisWidth = 40 -func drawYAxis(p *Draw, opt *ChartOption, xAxisHeight int, padding chart.Box) (*Range, error) { +func drawYAxis(p *Draw, opt *ChartOption, axisIndex, xAxisHeight int, padding chart.Box) (*Range, error) { theme := NewTheme(opt.Theme) - yRange := opt.getYRange(0) + yRange := opt.newYRange(axisIndex) values := yRange.Values() - formatter := opt.YAxis.Formatter + formatter := opt.YAxisList[axisIndex].Formatter if len(formatter) != 0 { for index, text := range values { values[index] = strings.ReplaceAll(formatter, "{value}", text) @@ -64,12 +64,21 @@ func drawYAxis(p *Draw, opt *ChartOption, xAxisHeight int, padding chart.Box) (* } width := NewAxis(p, data, style).measureAxis() - padding.Left += (YAxisWidth - width) + yAxisCount := len(opt.YAxisList) + boxWidth := p.Box.Width() + if axisIndex > 0 { + style.SplitLineShow = false + style.Position = PositionRight + padding.Right += (axisIndex - 1) * YAxisWidth + } else { + boxWidth = p.Box.Width() - (yAxisCount-1)*YAxisWidth + padding.Left += (YAxisWidth - width) + } dYAxis, err := NewDraw( DrawOption{ Parent: p, - Width: p.Box.Width(), + Width: boxWidth, // 减去x轴的高 Height: p.Box.Height() - xAxisHeight, }, diff --git a/yaxis_test.go b/yaxis_test.go index 634ff59..5c66caa 100644 --- a/yaxis_test.go +++ b/yaxis_test.go @@ -49,8 +49,10 @@ func TestDrawYAxis(t *testing.T) { newDraw: newDraw, newOption: func() *ChartOption { return &ChartOption{ - YAxis: YAxisOption{ - Max: toFloatPoint(20), + YAxisList: []YAxisOption{ + { + Max: NewFloatPoint(20), + }, }, SeriesList: []Series{ { @@ -72,7 +74,7 @@ func TestDrawYAxis(t *testing.T) { for _, tt := range tests { d := tt.newDraw() - r, err := drawYAxis(d, tt.newOption(), tt.xAxisHeight, chart.NewBox(10, 10, 10, 10)) + r, err := drawYAxis(d, tt.newOption(), 0, tt.xAxisHeight, chart.NewBox(10, 10, 10, 10)) assert.Nil(err) assert.Equal(&Range{ divideCount: 6, From e558634ddaea7684e76b09b39024cbfc6a2e1a95 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 10 Feb 2022 23:24:30 +0800 Subject: [PATCH 073/251] feat: support make point and make line --- axis.go | 25 +++++++++----- axis_test.go | 4 +-- bar_chart.go | 31 ++++++++++++++--- chart.go | 41 ++++++++++++++++++----- draw.go | 20 +++++++++-- draw_test.go | 28 +++++++++++++++- legend.go | 4 +-- line_chart.go | 35 +++++++++++++++----- mark_line.go | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++ mark_point.go | 20 +++++++++-- pie_chart.go | 6 ++-- range.go | 4 ++- series.go | 12 +++++-- xaxis.go | 3 +- yaxis.go | 2 +- yaxis_test.go | 32 +++++++++++++++++- 16 files changed, 308 insertions(+), 51 deletions(-) create mode 100644 mark_line.go diff --git a/axis.go b/axis.go index 29cc3cc..333c8c8 100644 --- a/axis.go +++ b/axis.go @@ -68,6 +68,10 @@ type axis struct { data *AxisDataList style *AxisOption } +type axisMeasurement struct { + Width int + Height int +} func NewAxis(d *Draw, data AxisDataList, style AxisOption) *axis { return &axis{ @@ -379,7 +383,7 @@ func (a *axis) axisTick(opt *axisRenderOption) { } } -func (a *axis) axisMeasureTextMaxWidthHeight() (int, int) { +func (a *axis) measureTextMaxWidthHeight() (int, int) { d := a.d r := d.Render s := a.style.Style(d.Font) @@ -389,18 +393,21 @@ func (a *axis) axisMeasureTextMaxWidthHeight() (int, int) { return measureTextMaxWidthHeight(data.TextList(), r) } -// measureAxis returns the measurement of axis. -// If the position is left or right, it will be textMaxWidth + labelMargin + tickLength. -// If the position is top or bottom, it will be textMaxHeight + labelMargin + tickLength. -func (a *axis) measureAxis() int { +// measure returns the measurement of axis. +// Width will be textMaxWidth + labelMargin + tickLength for position left or right. +// Height will be textMaxHeight + labelMargin + tickLength for position top or bottom. +func (a *axis) measure() axisMeasurement { style := a.style value := style.GetLabelMargin() + style.GetTickLength() - textMaxWidth, textMaxHeight := a.axisMeasureTextMaxWidthHeight() + textMaxWidth, textMaxHeight := a.measureTextMaxWidthHeight() + info := axisMeasurement{} if style.Position == PositionLeft || style.Position == PositionRight { - return textMaxWidth + value + info.Width = textMaxWidth + value + } else { + info.Height = textMaxHeight + value } - return textMaxHeight + value + return info } // Render renders the axis for chart @@ -409,7 +416,7 @@ func (a *axis) Render() { if isFalse(style.Show) { return } - textMaxWidth, textMaxHeight := a.axisMeasureTextMaxWidthHeight() + textMaxWidth, textMaxHeight := a.measureTextMaxWidthHeight() opt := &axisRenderOption{ textMaxWith: textMaxWidth, textMaxHeight: textMaxHeight, diff --git a/axis_test.go b/axis_test.go index a6a7690..37c8314 100644 --- a/axis_test.go +++ b/axis_test.go @@ -247,13 +247,13 @@ func TestMeasureAxis(t *testing.T) { FontSize: 12, Font: f, Position: PositionLeft, - }).measureAxis() + }).measure().Width assert.Equal(44, width) height := NewAxis(d, data, AxisOption{ FontSize: 12, Font: f, Position: PositionTop, - }).measureAxis() + }).measure().Height assert.Equal(28, height) } diff --git a/bar_chart.go b/bar_chart.go index 7a5805b..597388c 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -26,7 +26,7 @@ import ( "github.com/wcharczuk/go-chart/v2" ) -func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { +func barChartRender(opt ChartOption, result *basicRenderResult) ([]*markPointRenderOption, error) { d, err := NewDraw(DrawOption{ Parent: result.d, @@ -57,10 +57,29 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { r := d.Render - for i, series := range opt.SeriesList { + markPointRenderOptions := make([]*markPointRenderOption, 0) + + for i, s := range opt.SeriesList { + // 由于series是for range,为同一个数据,因此需要clone + // 后续需要使用,如mark point + series := s yRange := result.getYRange(series.YAxisIndex) points := make([]Point, len(series.Data)) - seriesColor := theme.GetSeriesColor(i) + index := series.index + if index == 0 { + index = i + } + seriesColor := theme.GetSeriesColor(index) + // mark line + markLineRender(&markLineRenderOption{ + Draw: d, + FillColor: seriesColor, + FontColor: theme.GetTextColor(), + StrokeColor: seriesColor, + Font: opt.Font, + Series: &series, + Range: yRange, + }) for j, item := range series.Data { x0, _ := xRange.GetRange(j) x := int(x0) @@ -105,7 +124,9 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { textBox := r.MeasureText(text) d.text(text, x+(barWidth-textBox.Width())>>1, barMaxHeight-h-5) } - markPointRender(d, markPointRenderOption{ + + markPointRenderOptions = append(markPointRenderOptions, &markPointRenderOption{ + Draw: d, FillColor: seriesColor, Font: opt.Font, Points: points, @@ -113,5 +134,5 @@ func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { }) } - return result.d, nil + return markPointRenderOptions, nil } diff --git a/chart.go b/chart.go index dbc4db4..3321f50 100644 --- a/chart.go +++ b/chart.go @@ -80,6 +80,14 @@ func (o *ChartOption) FillDefault(theme string) { if o.BackgroundColor.IsZero() { o.BackgroundColor = t.GetBackgroundColor() } + if o.Padding.IsZero() { + o.Padding = chart.Box{ + Top: 20, + Right: 10, + Bottom: 10, + Left: 10, + } + } // 标题的默认值 if o.Title.Style.FontColor.IsZero() { @@ -110,7 +118,7 @@ func (o *ChartOption) FillDefault(theme string) { o.Title.SubtextStyle.Font = o.Font } - o.Legend.Theme = theme + o.Legend.theme = theme if o.Legend.Style.FontSize == 0 { o.Legend.Style.FontSize = 10 } @@ -238,13 +246,14 @@ func Render(opt ChartOption) (*Draw, error) { if err != nil { return nil, err } + markPointRenderOptions := make([]*markPointRenderOption, 0) fns := []func() error{ // pie render func() error { if !isPieChart { return nil } - _, err := pieChartRender(opt, result) + err := pieChartRender(opt, result) return err }, // bar render @@ -255,8 +264,12 @@ func Render(opt ChartOption) (*Draw, error) { } o := opt o.SeriesList = barSeries - _, err := barChartRender(o, result) - return err + options, err := barChartRender(o, result) + if err != nil { + return err + } + markPointRenderOptions = append(markPointRenderOptions, options...) + return nil }, // line render func() error { @@ -266,14 +279,26 @@ func Render(opt ChartOption) (*Draw, error) { } o := opt o.SeriesList = lineSeries - _, err := lineChartRender(o, result) - return err + options, err := lineChartRender(o, result) + if err != nil { + return err + } + markPointRenderOptions = append(markPointRenderOptions, options...) + return nil }, - // legend需要在顶层,因此最后render + // legend需要在顶层,因此此处render func() error { _, err := NewLegend(result.d, opt.Legend).Render() return err }, + // mark point最后render + func() error { + // mark point render不会出错 + for _, opt := range markPointRenderOptions { + markPointRender(opt) + } + return nil + }, } for _, fn := range fns { @@ -296,6 +321,7 @@ func Render(opt ChartOption) (*Draw, error) { } func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { + opt.FillDefault(opt.Theme) d, err := NewDraw( DrawOption{ Type: opt.Type, @@ -309,7 +335,6 @@ func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { return nil, err } - opt.FillDefault(opt.Theme) if len(opt.YAxisList) > 2 { return nil, errors.New("y axis should not be gt 2") } diff --git a/draw.go b/draw.go index 5c65d87..12c9d06 100644 --- a/draw.go +++ b/draw.go @@ -161,7 +161,9 @@ func (d *Draw) pin(x, y, width int) { delta := 2*math.Pi - 2*angle d.arcTo(x, y, r, r, startAngle, delta) d.lineTo(x, y) - d.Render.Fill() + d.Render.Close() + d.Render.FillStroke() + startX := x - int(r) startY := y endX := x + int(r) @@ -173,7 +175,8 @@ func (d *Draw) pin(x, y, width int) { cx := x cy := y + int(r*2.5) d.Render.QuadCurveTo(cx+left, cy+top, endX+left, endY+top) - d.Render.Stroke() + d.Render.Close() + d.Render.Fill() } func (d *Draw) arrowLeft(x, y, width, height int) { @@ -226,7 +229,20 @@ func (d *Draw) arrow(x, y, width, height int, direction string) { d.lineTo(x0+dx, y0+halfHeight) d.lineTo(x0, y0) } + d.Render.FillStroke() +} + +func (d *Draw) makeLine(x, y, width int) { + arrowWidth := 16 + arrowHeight := 10 + endX := x + width + d.circle(3, x, y) + d.Render.Fill() + d.moveTo(x+5, y) + d.lineTo(endX-arrowWidth, y) d.Render.Stroke() + d.Render.SetStrokeDashArray([]float64{}) + d.arrowRight(endX, y, arrowWidth, arrowHeight) } func (d *Draw) circle(radius float64, x, y int) { diff --git a/draw_test.go b/draw_test.go index efda7eb..11f8709 100644 --- a/draw_test.go +++ b/draw_test.go @@ -259,7 +259,7 @@ func TestDraw(t *testing.T) { }.WriteToRenderer(d.Render) d.pin(30, 30, 30) }, - result: "\\n", + result: "\\n", }, // arrow left { @@ -349,6 +349,32 @@ func TestDraw(t *testing.T) { }, result: "\\n", }, + // mark line + { + fn: func(d *Draw) { + chart.Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + StrokeDashArray: []float64{ + 4, + 2, + }, + }.WriteToRenderer(d.Render) + d.makeLine(0, 20, 300) + }, + result: "\\n", + }, } for _, tt := range tests { d, err := NewDraw(DrawOption{ diff --git a/legend.go b/legend.go index 7b6722e..263b312 100644 --- a/legend.go +++ b/legend.go @@ -30,7 +30,7 @@ import ( ) type LegendOption struct { - Theme string + theme string // Legend show flag, if nil or true, the legend will be shown Show *bool // Legend text style @@ -67,7 +67,7 @@ func (l *legend) Render() (chart.Box, error) { if len(opt.Data) == 0 || isFalse(opt.Show) { return chart.BoxZero, nil } - theme := NewTheme(opt.Theme) + theme := NewTheme(opt.theme) padding := opt.Style.Padding legendDraw, err := NewDraw(DrawOption{ Parent: d, diff --git a/line_chart.go b/line_chart.go index 39d8b4d..af87cc9 100644 --- a/line_chart.go +++ b/line_chart.go @@ -27,7 +27,7 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) -func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { +func lineChartRender(opt ChartOption, result *basicRenderResult) ([]*markPointRenderOption, error) { theme := NewTheme(opt.Theme) @@ -44,9 +44,29 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) r := d.Render xRange := result.xRange - for i, series := range opt.SeriesList { + markPointRenderOptions := make([]*markPointRenderOption, 0) + for i, s := range opt.SeriesList { + // 由于series是for range,为同一个数据,因此需要clone + // 后续需要使用,如mark point + series := s + index := series.index + if index == 0 { + index = i + } + seriesColor := theme.GetSeriesColor(index) + yRange := result.getYRange(series.YAxisIndex) points := make([]Point, len(series.Data)) + // mark line + markLineRender(&markLineRenderOption{ + Draw: d, + FillColor: seriesColor, + FontColor: theme.GetTextColor(), + StrokeColor: seriesColor, + Font: opt.Font, + Series: &series, + Range: yRange, + }) for j, item := range series.Data { y := yRange.getRestHeight(item.Value) @@ -71,11 +91,7 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) textBox := r.MeasureText(text) d.text(text, x-textBox.Width()>>1, y-5) } - index := series.index - if index == 0 { - index = i - } - seriesColor := theme.GetSeriesColor(index) + dotFillColor := drawing.ColorWhite if theme.IsDark() { dotFillColor = seriesColor @@ -88,7 +104,8 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) DotFillColor: dotFillColor, }) // draw mark point - markPointRender(d, markPointRenderOption{ + markPointRenderOptions = append(markPointRenderOptions, &markPointRenderOption{ + Draw: d, FillColor: seriesColor, Font: opt.Font, Points: points, @@ -96,5 +113,5 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) }) } - return result.d, nil + return markPointRenderOptions, nil } diff --git a/mark_line.go b/mark_line.go new file mode 100644 index 0000000..e895131 --- /dev/null +++ b/mark_line.go @@ -0,0 +1,92 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func NewMarkLine(markLineTypes ...string) SeriesMarkLine { + data := make([]SeriesMarkLineData, len(markLineTypes)) + for index, t := range markLineTypes { + data[index] = SeriesMarkLineData{ + Type: t, + } + } + return SeriesMarkLine{ + Data: data, + } +} + +type markLineRenderOption struct { + Draw *Draw + FillColor drawing.Color + FontColor drawing.Color + StrokeColor drawing.Color + Font *truetype.Font + Series *Series + Range *Range +} + +func markLineRender(opt *markLineRenderOption) { + d := opt.Draw + s := opt.Series + if len(s.MarkLine.Data) == 0 { + return + } + r := d.Render + summary := s.Summary() + for _, markLine := range s.MarkLine.Data { + // 由于mark line会修改style,因此每次重新设置 + chart.Style{ + FillColor: opt.FillColor, + FontColor: opt.FontColor, + FontSize: labelFontSize, + StrokeColor: opt.StrokeColor, + StrokeWidth: 1, + Font: opt.Font, + StrokeDashArray: []float64{ + 4, + 2, + }, + }.WriteToRenderer(r) + value := float64(0) + switch markLine.Type { + case SeriesMarkDataTypeMax: + value = summary.MaxValue + case SeriesMarkDataTypeMin: + value = summary.MinValue + default: + value = summary.AverageValue + } + y := opt.Range.getRestHeight(value) + width := d.Box.Width() + text := commafWithDigits(value) + textBox := r.MeasureText(text) + d.makeLine(0, y, width) + d.text(text, width, y+textBox.Height()>>1-2) + } + +} diff --git a/mark_point.go b/mark_point.go index f1a429f..3f05445 100644 --- a/mark_point.go +++ b/mark_point.go @@ -28,14 +28,28 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) +func NewMarkPoint(markPointTypes ...string) SeriesMarkPoint { + data := make([]SeriesMarkPointData, len(markPointTypes)) + for index, t := range markPointTypes { + data[index] = SeriesMarkPointData{ + Type: t, + } + } + return SeriesMarkPoint{ + Data: data, + } +} + type markPointRenderOption struct { + Draw *Draw FillColor drawing.Color Font *truetype.Font Series *Series Points []Point } -func markPointRender(d *Draw, opt markPointRenderOption) { +func markPointRender(opt *markPointRenderOption) { + d := opt.Draw s := opt.Series if len(s.MarkPoint.Data) == 0 { return @@ -54,7 +68,7 @@ func markPointRender(d *Draw, opt markPointRenderOption) { // 设置文本样式 chart.Style{ FontColor: NewTheme(ThemeDark).GetTextColor(), - FontSize: 10, + FontSize: labelFontSize, StrokeWidth: 1, Font: opt.Font, }.WriteTextOptionsToRenderer(r) @@ -62,7 +76,7 @@ func markPointRender(d *Draw, opt markPointRenderOption) { p := points[summary.MinIndex] value := summary.MinValue switch markPointData.Type { - case SeriesMarkPointDataTypeMax: + case SeriesMarkDataTypeMax: p = points[summary.MaxIndex] value = summary.MaxValue } diff --git a/pie_chart.go b/pie_chart.go index 84751f9..a8deb7c 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -41,14 +41,14 @@ func getPieStyle(theme *Theme, index int) chart.Style { } -func pieChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { +func pieChartRender(opt ChartOption, result *basicRenderResult) error { d, err := NewDraw(DrawOption{ Parent: result.d, }, PaddingOption(chart.Box{ Top: result.titleBox.Height(), })) if err != nil { - return nil, err + return err } values := make([]float64, len(opt.SeriesList)) @@ -155,5 +155,5 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { d.text(text, x, y) } } - return result.d, nil + return nil } diff --git a/range.go b/range.go index 308dba8..1e02a51 100644 --- a/range.go +++ b/range.go @@ -54,9 +54,11 @@ func NewRange(min, max float64, divideCount int) Range { unit = int((r/float64(divideCount))/float64(unit))*unit + unit if min != 0 { + isLessThanZero := min < 0 min = float64(int(min/float64(unit)) * unit) // 如果是小于0,int的时候向上取整了,因此调整 - if min < 0 { + if min < 0 || + (isLessThanZero && min == 0) { min -= float64(unit) } } diff --git a/series.go b/series.go index b37e13d..57fe12a 100644 --- a/series.go +++ b/series.go @@ -63,8 +63,9 @@ type SeriesLabel struct { } const ( - SeriesMarkPointDataTypeMax = "max" - SeriesMarkPointDataTypeMin = "min" + SeriesMarkDataTypeMax = "max" + SeriesMarkDataTypeMin = "min" + SeriesMarkDataTypeAverage = "average" ) type SeriesMarkPointData struct { @@ -74,6 +75,12 @@ type SeriesMarkPoint struct { SymbolSize int Data []SeriesMarkPointData } +type SeriesMarkLineData struct { + Type string +} +type SeriesMarkLine struct { + Data []SeriesMarkLineData +} type Series struct { index int Type string @@ -85,6 +92,7 @@ type Series struct { // Radius of Pie chart, e.g.: 40% Radius string MarkPoint SeriesMarkPoint + MarkLine SeriesMarkLine } type seriesSummary struct { diff --git a/xaxis.go b/xaxis.go index 5c21c14..cb7cf33 100644 --- a/xaxis.go +++ b/xaxis.go @@ -77,8 +77,7 @@ func drawXAxis(p *Draw, opt *XAxisOption, yAxisCount int) (int, *Range, error) { } axis := NewAxis(dXAxis, data, style) axis.Render() - - return axis.measureAxis(), &Range{ + return axis.measure().Height, &Range{ divideCount: len(opt.Data), Min: 0, Max: max, diff --git a/yaxis.go b/yaxis.go index b978d08..cbce44f 100644 --- a/yaxis.go +++ b/yaxis.go @@ -62,7 +62,7 @@ func drawYAxis(p *Draw, opt *ChartOption, axisIndex, xAxisHeight int, padding ch SplitLineColor: theme.GetAxisSplitLineColor(), SplitLineShow: true, } - width := NewAxis(p, data, style).measureAxis() + width := NewAxis(p, data, style).measure().Width yAxisCount := len(opt.YAxisList) boxWidth := p.Box.Width() diff --git a/yaxis_test.go b/yaxis_test.go index 5c66caa..0bbef7a 100644 --- a/yaxis_test.go +++ b/yaxis_test.go @@ -42,6 +42,7 @@ func TestDrawYAxis(t *testing.T) { tests := []struct { newDraw func() *Draw newOption func() *ChartOption + axisIndex int xAxisHeight int result string }{ @@ -70,11 +71,40 @@ func TestDrawYAxis(t *testing.T) { }, result: "\\n03.336.661013.3316.6620", }, + { + newDraw: newDraw, + newOption: func() *ChartOption { + return &ChartOption{ + YAxisList: []YAxisOption{ + {}, + { + Max: NewFloatPoint(20), + Formatter: "{value} C", + }, + }, + SeriesList: []Series{ + { + YAxisIndex: 1, + Data: []SeriesData{ + { + Value: 1, + }, + { + Value: 2, + }, + }, + }, + }, + } + }, + axisIndex: 1, + result: "\\n0 C3.33 C6.66 C10 C13.33 C16.66 C20 C", + }, } for _, tt := range tests { d := tt.newDraw() - r, err := drawYAxis(d, tt.newOption(), 0, tt.xAxisHeight, chart.NewBox(10, 10, 10, 10)) + r, err := drawYAxis(d, tt.newOption(), tt.axisIndex, tt.xAxisHeight, chart.NewBox(10, 10, 10, 10)) assert.Nil(err) assert.Equal(&Range{ divideCount: 6, From 4262b148ca15efb8a5828e740ff015c49bf83160 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Feb 2022 11:22:08 +0800 Subject: [PATCH 074/251] refactor: add examples of chart --- bar_chart.go | 9 +- chart.go | 21 +- examples/demo/main.go | 785 +++++++++++++++++++++++++++++++++++++----- legend.go | 11 + pie_chart.go | 9 +- range.go | 3 + series.go | 29 ++ util.go | 8 + xaxis.go | 10 + yaxis.go | 11 +- 10 files changed, 796 insertions(+), 100 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index 597388c..ae5adfb 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -37,7 +37,6 @@ func barChartRender(opt ChartOption, result *basicRenderResult) ([]*markPointRen if err != nil { return nil, err } - // yRange := result.yRange xRange := result.xRange x0, x1 := xRange.GetRange(0) width := int(x1 - x0) @@ -45,6 +44,10 @@ func barChartRender(opt ChartOption, result *basicRenderResult) ([]*markPointRen margin := 10 // 每一个bar之间的margin barMargin := 5 + if width < 50 { + margin = 5 + barMargin = 3 + } seriesCount := len(opt.SeriesList) // 总的宽度-两个margin-(总数-1)的barMargin @@ -80,9 +83,9 @@ func barChartRender(opt ChartOption, result *basicRenderResult) ([]*markPointRen Series: &series, Range: yRange, }) + divideValues := xRange.AutoDivide() for j, item := range series.Data { - x0, _ := xRange.GetRange(j) - x := int(x0) + x := divideValues[j] x += margin if i != 0 { x += i * (barWidth + barMargin) diff --git a/chart.go b/chart.go index 3321f50..de53cfc 100644 --- a/chart.go +++ b/chart.go @@ -144,17 +144,24 @@ func (o *ChartOption) FillDefault(theme string) { } func (o *ChartOption) getWidth() int { - if o.Width == 0 { - return 600 + if o.Width != 0 { + return o.Width } - return o.Width + if o.Parent != nil { + return o.Parent.Box.Width() + } + return 600 } func (o *ChartOption) getHeight() int { - if o.Height == 0 { - return 400 + + if o.Height != 0 { + return o.Height } - return o.Height + if o.Parent != nil { + return o.Parent.Box.Height() + } + return 400 } func (o *ChartOption) newYRange(axisIndex int) Range { @@ -219,6 +226,7 @@ func Render(opt ChartOption) (*Draw, error) { if len(opt.SeriesList) == 0 { return nil, errors.New("series can not be nil") } + opt.FillDefault(opt.Theme) lineSeries := make([]Series, 0) barSeries := make([]Series, 0) @@ -321,7 +329,6 @@ func Render(opt ChartOption) (*Draw, error) { } func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { - opt.FillDefault(opt.Theme) d, err := NewDraw( DrawOption{ Type: opt.Type, diff --git a/examples/demo/main.go b/examples/demo/main.go index f0e32c7..978bef6 100644 --- a/examples/demo/main.go +++ b/examples/demo/main.go @@ -6,6 +6,7 @@ import ( charts "github.com/vicanso/go-charts" "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" ) var html = ` @@ -13,7 +14,6 @@ var html = ` - @@ -61,120 +61,733 @@ var html = ` ` -func indexHandler(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/" { +func indexHandler(w http.ResponseWriter, req *http.Request) { + if req.URL.Path != "/" { return } - - d, err := charts.NewLineChart(charts.LineChartOption{ - ChartOption: charts.ChartOption{ - Theme: "dark", + theme := req.URL.Query().Get("theme") + chartOptions := []charts.ChartOption{ + // 普通折线图 + { + Theme: theme, + Title: charts.TitleOption{ + Text: "Line", + }, + Legend: charts.NewLegendOption([]string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", + }), + XAxis: charts.NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + SeriesList: []charts.Series{ + charts.NewSeriesFromValues([]float64{ + 120, + 132, + 101, + 134, + 90, + 230, + 210, + }), + charts.NewSeriesFromValues([]float64{ + 220, + 182, + 191, + 234, + 290, + 330, + 310, + }), + charts.NewSeriesFromValues([]float64{ + 150, + 232, + 201, + 154, + 190, + 330, + 410, + }), + charts.NewSeriesFromValues([]float64{ + 320, + 332, + 301, + 334, + 390, + 330, + 320, + }), + charts.NewSeriesFromValues([]float64{ + 820, + 932, + 901, + 934, + 1290, + 1330, + 1320, + }), + }, + }, + // 温度折线图 + { + Theme: theme, + Title: charts.TitleOption{ + Text: "Temperature Change in the Coming Week", + }, Padding: chart.Box{ - Left: 5, - Top: 15, - Bottom: 5, - Right: 10, - }, - XAxis: charts.XAxisOption{ - Data: []string{ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun", - }, - // BoundaryGap: charts.FalseFlag(), + Top: 20, + Left: 20, + Right: 30, + Bottom: 20, }, + Legend: charts.NewLegendOption([]string{ + "Highest", + "Lowest", + }, charts.PositionRight), + XAxis: charts.NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, charts.FalseFlag()), SeriesList: []charts.Series{ { + Data: charts.NewSeriesDataFromValues([]float64{ + 14, + 11, + 13, + 11, + 12, + 12, + 7, + }), + MarkPoint: charts.NewMarkPoint(charts.SeriesMarkDataTypeMax, charts.SeriesMarkDataTypeMin), + MarkLine: charts.NewMarkLine(charts.SeriesMarkDataTypeAverage), + }, + { + Data: charts.NewSeriesDataFromValues([]float64{ + 1, + -2, + 2, + 5, + 3, + 2, + 0, + }), + MarkLine: charts.NewMarkLine(charts.SeriesMarkDataTypeAverage), + }, + }, + }, + // 柱状图 + { + Theme: theme, + Title: charts.TitleOption{ + Text: "Bar", + }, + XAxis: charts.NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + Legend: charts.NewLegendOption([]string{ + "Rainfall", + "Evaporation", + }), + SeriesList: []charts.Series{ + charts.NewSeriesFromValues([]float64{ + 120, + 200, + 150, + 80, + 70, + 110, + 130, + }, charts.ChartTypeBar), + { + Type: charts.ChartTypeBar, Data: []charts.SeriesData{ { - Value: 150, + Value: 100, + }, + { + Value: 190, + Style: chart.Style{ + FillColor: drawing.Color{ + R: 169, + G: 0, + B: 0, + A: 255, + }, + }, }, { Value: 230, }, { - Value: 224, + Value: 140, }, { - Value: 218, + Value: 100, }, { - Value: 135, + Value: 200, }, { - Value: 147, - }, - { - Value: 260, - }, - }, - }, - { - Data: []charts.SeriesData{ - { - Value: 220, - }, - { - Value: 182, - }, - { - Value: 191, - }, - { - Value: 234, - }, - { - Value: 290, - }, - { - Value: 330, - }, - { - Value: 310, - }, - }, - }, - { - Data: []charts.SeriesData{ - { - Value: 150, - }, - { - Value: 232, - }, - { - Value: 201, - }, - { - Value: 154, - }, - { - Value: 190, - }, - { - Value: 330, - }, - { - Value: 410, + Value: 180, }, }, }, }, }, - }) + // 柱状图+mark + { + Theme: theme, + Title: charts.TitleOption{ + Text: "Rainfall vs Evaporation", + Subtext: "Fake Data", + }, + Padding: chart.Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }, + XAxis: charts.NewXAxisOption([]string{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + }), + Legend: charts.NewLegendOption([]string{ + "Rainfall", + "Evaporation", + }, charts.PositionRight), + SeriesList: []charts.Series{ + { + Type: charts.ChartTypeBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20.0, + 6.4, + 3.3, + }), + MarkPoint: charts.NewMarkPoint( + charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin, + ), + MarkLine: charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ), + }, + { + Type: charts.ChartTypeBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 2.6, + 5.9, + 9.0, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6.0, + 2.3, + }), + MarkPoint: charts.NewMarkPoint( + charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin, + ), + MarkLine: charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ), + }, + }, + }, + // 双Y轴示例 + { + Theme: theme, + XAxis: charts.NewXAxisOption([]string{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + }), + Legend: charts.NewLegendOption([]string{ + "Evaporation", + "Precipitation", + "Temperature", + }), + YAxisList: []charts.YAxisOption{ + { + Formatter: "{value}°C", + Color: drawing.Color{ + R: 250, + G: 200, + B: 88, + A: 255, + }, + }, + { + Formatter: "{value}ml", + Color: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }, + }, + SeriesList: []charts.Series{ + { + Type: charts.ChartTypeBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20.0, + 6.4, + 3.3, + }), + YAxisIndex: 1, + }, + { + Type: charts.ChartTypeBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 2.6, + 5.9, + 9.0, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6.0, + 2.3, + }), + YAxisIndex: 1, + }, + { + Data: charts.NewSeriesDataFromValues([]float64{ + 2.0, + 2.2, + 3.3, + 4.5, + 6.3, + 10.2, + 20.3, + 23.4, + 23.0, + 16.5, + 12.0, + 6.2, + }), + }, + }, + }, + // 饼图 + { + Theme: theme, + Title: charts.TitleOption{ + Text: "Referer of a Website", + Subtext: "Fake Data", + Left: charts.PositionCenter, + }, + Legend: charts.LegendOption{ + Orient: charts.OrientVertical, + Data: []string{ + "Search Engine", + "Direct", + "Email", + "Union Ads", + "Video Ads", + }, + Left: charts.PositionLeft, + }, + SeriesList: charts.NewPieSeriesList([]float64{ + 1048, + 735, + 580, + 484, + 300, + }, charts.PieSeriesOption{ + LabelShow: true, + Radius: "35%", + }), + }, + // 多图展示 + { + Theme: theme, + Legend: charts.LegendOption{ + Top: "-90", + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Padding: chart.Box{ + Top: 100, + }, + XAxis: charts.NewXAxisOption([]string{ + "2012", + "2013", + "2014", + "2015", + "2016", + "2017", + }), + YAxisList: []charts.YAxisOption{ + { + + Min: charts.NewFloatPoint(0), + Max: charts.NewFloatPoint(90), + }, + }, + SeriesList: []charts.Series{ + charts.NewSeriesFromValues([]float64{ + 56.5, + 82.1, + 88.7, + 70.1, + 53.4, + 85.1, + }), + charts.NewSeriesFromValues([]float64{ + 51.1, + 51.4, + 55.1, + 53.3, + 73.8, + 68.7, + }), + charts.NewSeriesFromValues([]float64{ + 40.1, + 62.2, + 69.5, + 36.4, + 45.2, + 32.5, + }, charts.ChartTypeBar), + charts.NewSeriesFromValues([]float64{ + 25.2, + 37.1, + 41.2, + 18, + 33.9, + 49.1, + }, charts.ChartTypeBar), + }, + Children: []charts.ChartOption{ + { + Legend: charts.LegendOption{ + Show: charts.FalseFlag(), + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Height: 20, + Padding: chart.Box{ + Left: 250, + Top: -80, + }, + SeriesList: charts.NewPieSeriesList([]float64{ + 435.9, + 354.3, + 285.9, + 204.5, + }, charts.PieSeriesOption{ + LabelShow: true, + Radius: "35%", + }), + }, + }, + }, + } + bytesList := make([][]byte, 0) + for _, opt := range chartOptions { + d, err := charts.Render(opt) + if err != nil { + panic(err) + } + buf, err := d.Bytes() + if err != nil { + panic(err) + } + bytesList = append(bytesList, buf) + } + data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), bytes.Join(bytesList, []byte(""))) + w.Header().Set("Content-Type", "text/html") + w.Write(data) + +} + +func indexHandlerBak(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/" { + return + } + + zero := float64(0) + outputType := r.URL.Query().Get("type") + chartOption := charts.ChartOption{ + // Theme: "dark", + Type: outputType, + Title: charts.TitleOption{ + Left: charts.PositionCenter, + Style: chart.Style{ + FontColor: chart.ColorAlternateBlue, + }, + SubtextStyle: chart.Style{ + FontColor: chart.ColorRed, + }, + Text: "Stacked Line", + Subtext: "Hello World!", + }, + Padding: chart.Box{ + Left: 5, + Top: 15, + Bottom: 5, + Right: 10, + }, + YAxisList: []charts.YAxisOption{ + { + Min: &zero, + }, + { + Formatter: "{value} °C", + // Max: charts.NewFloatPoint(24), + }, + }, + Legend: charts.LegendOption{ + Data: []string{ + "Email", + "Union Ads", + // "Video Ads", + }, + Left: charts.PositionLeft, + // Orient: charts.OrientVertical, + }, + XAxis: charts.XAxisOption{ + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + // SplitNumber: 4, + // BoundaryGap: charts.FalseFlag(), + }, + SeriesList: []charts.Series{ + { + // Type: charts.ChartTypeBar, + MarkPoint: charts.SeriesMarkPoint{ + Data: []charts.SeriesMarkPointData{ + { + Type: "max", + }, + { + Type: "min", + }, + }, + }, + MarkLine: charts.SeriesMarkLine{ + Data: []charts.SeriesMarkLineData{ + // { + // Type: "max", + // }, + { + Type: "average", + }, + }, + }, + Data: charts.NewSeriesDataFromValues([]float64{ + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + }), + }, + // { + // // Type: charts.ChartTypeBar, + // Data: charts.NewSeriesDataFromValues([]float64{ + // 2.6, + // 5.9, + // 9.0, + // 26.4, + // 28.7, + // 70.7, + // 175.6, + // }), + // }, + { + Data: charts.NewSeriesDataFromValues([]float64{ + 2.0, + 2.2, + 3.3, + 4.5, + 6.3, + 10.2, + 20.3, + }), + YAxisIndex: 1, + }, + // { + // Data: []charts.SeriesData{ + // { + // Value: 220, + // }, + // { + // Value: 182, + // }, + // { + // Value: 191, + // }, + // { + // Value: 234, + // }, + // { + // Value: 290, + // }, + // { + // Value: 330, + // }, + // { + // Value: 310, + // }, + // }, + // }, + // { + // Data: []charts.SeriesData{ + // { + // Value: 150, + // }, + // { + // Value: 232, + // }, + // { + // Value: 201, + // }, + // { + // Value: 154, + // }, + // { + // Value: 190, + // }, + // { + // Value: 330, + // }, + // { + // Value: 410, + // }, + // }, + // }, + }, + // Children: []charts.ChartOption{ + // { + // Padding: chart.Box{ + // Left: 350, + // Top: 0, + // }, + // Legend: charts.LegendOption{ + // Show: charts.FalseFlag(), + // }, + // Width: 150, + // Height: 150, + // SeriesList: []charts.Series{ + // charts.NewSeriesFromValues([]float64{ + // 1048, + // }, charts.ChartTypePie), + // { + // Data: charts.NewSeriesDataFromValues([]float64{ + // 735, + // }), + // Radius: "50%", + // Name: "test", + // }, + // charts.NewSeriesFromValues([]float64{ + // 580, + // }), + // charts.NewSeriesFromValues([]float64{ + // 484, + // }), + // }, + // }, + // }, + } + d, err := charts.Render(chartOption) if err != nil { panic(err) } buf, _ := d.Bytes() - data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), buf) - w.Header().Set("Content-Type", "text/html") - w.Write(data) + if outputType == "png" { + w.Header().Set("Content-Type", "image/png") + w.Write(buf) + } else { + data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), buf) + w.Header().Set("Content-Type", "text/html") + w.Write(data) + } } func main() { diff --git a/legend.go b/legend.go index 263b312..f11b50f 100644 --- a/legend.go +++ b/legend.go @@ -49,6 +49,17 @@ type LegendOption struct { // The layout orientation of legend, it can be horizontal or vertical, default is horizontal. Orient string } + +func NewLegendOption(data []string, position ...string) LegendOption { + opt := LegendOption{ + Data: data, + } + if len(position) != 0 { + opt.Left = position[0] + } + return opt +} + type legend struct { d *Draw opt *LegendOption diff --git a/pie_chart.go b/pie_chart.go index a8deb7c..ff24642 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -38,7 +38,6 @@ func getPieStyle(theme *Theme, index int) chart.Style { StrokeWidth: 1, FillColor: seriesColor, } - } func pieChartRender(opt ChartOption, result *basicRenderResult) error { @@ -86,7 +85,11 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) error { if radius <= 0 { radius = float64(diameter) * defaultRadiusPercent } - labelRadius := radius + 20 + labelLineWidth := 15 + if radius < 50 { + labelLineWidth = 10 + } + labelRadius := radius + float64(labelLineWidth) seriesNames := opt.Legend.Data @@ -126,7 +129,7 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) error { endy := cy + int(labelRadius*math.Sin(angle)) d.moveTo(startx, starty) d.lineTo(endx, endy) - offset := 30 + offset := labelLineWidth if endx < cx { offset *= -1 } diff --git a/range.go b/range.go index 1e02a51..255a51b 100644 --- a/range.go +++ b/range.go @@ -94,6 +94,9 @@ func (r *Range) GetRange(index int) (float64, float64) { unit := float64(r.Size) / float64(r.divideCount) return unit * float64(index), unit * float64(index+1) } +func (r *Range) AutoDivide() []int { + return autoDivide(r.Size, r.divideCount) +} func (r *Range) getWidth(value float64) int { v := value / (r.Max - r.Min) diff --git a/series.go b/series.go index 57fe12a..b1d72a2 100644 --- a/series.go +++ b/series.go @@ -95,6 +95,35 @@ type Series struct { MarkLine SeriesMarkLine } +type PieSeriesOption struct { + Radius string + LabelShow bool +} + +func NewPieSeriesList(values []float64, opts ...PieSeriesOption) []Series { + result := make([]Series, len(values)) + var opt PieSeriesOption + if len(opts) != 0 { + opt = opts[0] + } + for index, v := range values { + s := Series{ + Type: ChartTypePie, + Data: []SeriesData{ + { + Value: v, + }, + }, + Radius: opt.Radius, + Label: SeriesLabel{ + Show: opt.LabelShow, + }, + } + result[index] = s + } + return result +} + type seriesSummary struct { MaxIndex int MaxValue float64 diff --git a/util.go b/util.go index 3064668..03aad20 100644 --- a/util.go +++ b/util.go @@ -40,6 +40,14 @@ func FalseFlag() *bool { return &f } +func ceilFloatToInt(value float64) int { + i := int(value) + if value == float64(i) { + return i + } + return i + 1 +} + func getDefaultInt(value, defaultValue int) int { if value == 0 { return defaultValue diff --git a/xaxis.go b/xaxis.go index cb7cf33..1dca7bb 100644 --- a/xaxis.go +++ b/xaxis.go @@ -40,6 +40,16 @@ type XAxisOption struct { SplitNumber int } +func NewXAxisOption(data []string, boundaryGap ...*bool) XAxisOption { + opt := XAxisOption{ + Data: data, + } + if len(boundaryGap) != 0 { + opt.BoundaryGap = boundaryGap[0] + } + return opt +} + // drawXAxis draws x axis, and returns the height, range of if. func drawXAxis(p *Draw, opt *XAxisOption, yAxisCount int) (int, *Range, error) { if opt.Hidden { diff --git a/yaxis.go b/yaxis.go index cbce44f..99093ec 100644 --- a/yaxis.go +++ b/yaxis.go @@ -26,6 +26,7 @@ import ( "strings" "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" ) type YAxisOption struct { @@ -37,15 +38,19 @@ type YAxisOption struct { Hidden bool // Formatter for y axis text value Formatter string + // Color for y axis + Color drawing.Color } +// TODO 长度是否可以变化 const YAxisWidth = 40 func drawYAxis(p *Draw, opt *ChartOption, axisIndex, xAxisHeight int, padding chart.Box) (*Range, error) { theme := NewTheme(opt.Theme) yRange := opt.newYRange(axisIndex) values := yRange.Values() - formatter := opt.YAxisList[axisIndex].Formatter + yAxis := opt.YAxisList[axisIndex] + formatter := yAxis.Formatter if len(formatter) != 0 { for index, text := range values { values[index] = strings.ReplaceAll(formatter, "{value}", text) @@ -62,6 +67,10 @@ func drawYAxis(p *Draw, opt *ChartOption, axisIndex, xAxisHeight int, padding ch SplitLineColor: theme.GetAxisSplitLineColor(), SplitLineShow: true, } + if !yAxis.Color.IsZero() { + style.FontColor = yAxis.Color + style.StrokeColor = yAxis.Color + } width := NewAxis(p, data, style).measure().Width yAxisCount := len(opt.YAxisList) From bff06b2aa58207f5d5993c0544a79464bd431f6b Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Feb 2022 12:41:14 +0800 Subject: [PATCH 075/251] feat: support box option for chart --- chart.go | 2 + draw.go | 10 ++ examples/demo/main.go | 224 +----------------------------------------- 3 files changed, 17 insertions(+), 219 deletions(-) diff --git a/chart.go b/chart.go index de53cfc..69c2aba 100644 --- a/chart.go +++ b/chart.go @@ -56,6 +56,7 @@ type ChartOption struct { Height int Parent *Draw Padding chart.Box + Box chart.Box SeriesList []Series BackgroundColor drawing.Color Children []ChartOption @@ -337,6 +338,7 @@ func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { Height: opt.getHeight(), }, PaddingOption(opt.Padding), + BoxOption(opt.Box), ) if err != nil { return nil, err diff --git a/draw.go b/draw.go index 12c9d06..0dbcf83 100644 --- a/draw.go +++ b/draw.go @@ -71,6 +71,16 @@ func PaddingOption(padding chart.Box) Option { } } +func BoxOption(box chart.Box) Option { + return func(d *Draw) error { + if box.IsZero() { + return nil + } + d.Box = box + return nil + } +} + func NewDraw(opt DrawOption, opts ...Option) (*Draw, error) { if opt.Parent == nil && (opt.Width <= 0 || opt.Height <= 0) { return nil, errors.New("parent and width/height can not be nil") diff --git a/examples/demo/main.go b/examples/demo/main.go index 978bef6..1f37e25 100644 --- a/examples/demo/main.go +++ b/examples/demo/main.go @@ -539,10 +539,11 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { "Walnut Brownie", }, }, - Height: 20, - Padding: chart.Box{ - Left: 250, - Top: -80, + Box: chart.Box{ + Top: 20, + Left: 400, + Right: 500, + Bottom: 120, }, SeriesList: charts.NewPieSeriesList([]float64{ 435.9, @@ -575,221 +576,6 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { } -func indexHandlerBak(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/" { - return - } - - zero := float64(0) - outputType := r.URL.Query().Get("type") - chartOption := charts.ChartOption{ - // Theme: "dark", - Type: outputType, - Title: charts.TitleOption{ - Left: charts.PositionCenter, - Style: chart.Style{ - FontColor: chart.ColorAlternateBlue, - }, - SubtextStyle: chart.Style{ - FontColor: chart.ColorRed, - }, - Text: "Stacked Line", - Subtext: "Hello World!", - }, - Padding: chart.Box{ - Left: 5, - Top: 15, - Bottom: 5, - Right: 10, - }, - YAxisList: []charts.YAxisOption{ - { - Min: &zero, - }, - { - Formatter: "{value} °C", - // Max: charts.NewFloatPoint(24), - }, - }, - Legend: charts.LegendOption{ - Data: []string{ - "Email", - "Union Ads", - // "Video Ads", - }, - Left: charts.PositionLeft, - // Orient: charts.OrientVertical, - }, - XAxis: charts.XAxisOption{ - Data: []string{ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun", - }, - // SplitNumber: 4, - // BoundaryGap: charts.FalseFlag(), - }, - SeriesList: []charts.Series{ - { - // Type: charts.ChartTypeBar, - MarkPoint: charts.SeriesMarkPoint{ - Data: []charts.SeriesMarkPointData{ - { - Type: "max", - }, - { - Type: "min", - }, - }, - }, - MarkLine: charts.SeriesMarkLine{ - Data: []charts.SeriesMarkLineData{ - // { - // Type: "max", - // }, - { - Type: "average", - }, - }, - }, - Data: charts.NewSeriesDataFromValues([]float64{ - 2.0, - 4.9, - 7.0, - 23.2, - 25.6, - 76.7, - 135.6, - }), - }, - // { - // // Type: charts.ChartTypeBar, - // Data: charts.NewSeriesDataFromValues([]float64{ - // 2.6, - // 5.9, - // 9.0, - // 26.4, - // 28.7, - // 70.7, - // 175.6, - // }), - // }, - { - Data: charts.NewSeriesDataFromValues([]float64{ - 2.0, - 2.2, - 3.3, - 4.5, - 6.3, - 10.2, - 20.3, - }), - YAxisIndex: 1, - }, - // { - // Data: []charts.SeriesData{ - // { - // Value: 220, - // }, - // { - // Value: 182, - // }, - // { - // Value: 191, - // }, - // { - // Value: 234, - // }, - // { - // Value: 290, - // }, - // { - // Value: 330, - // }, - // { - // Value: 310, - // }, - // }, - // }, - // { - // Data: []charts.SeriesData{ - // { - // Value: 150, - // }, - // { - // Value: 232, - // }, - // { - // Value: 201, - // }, - // { - // Value: 154, - // }, - // { - // Value: 190, - // }, - // { - // Value: 330, - // }, - // { - // Value: 410, - // }, - // }, - // }, - }, - // Children: []charts.ChartOption{ - // { - // Padding: chart.Box{ - // Left: 350, - // Top: 0, - // }, - // Legend: charts.LegendOption{ - // Show: charts.FalseFlag(), - // }, - // Width: 150, - // Height: 150, - // SeriesList: []charts.Series{ - // charts.NewSeriesFromValues([]float64{ - // 1048, - // }, charts.ChartTypePie), - // { - // Data: charts.NewSeriesDataFromValues([]float64{ - // 735, - // }), - // Radius: "50%", - // Name: "test", - // }, - // charts.NewSeriesFromValues([]float64{ - // 580, - // }), - // charts.NewSeriesFromValues([]float64{ - // 484, - // }), - // }, - // }, - // }, - } - d, err := charts.Render(chartOption) - if err != nil { - panic(err) - } - - buf, _ := d.Bytes() - - if outputType == "png" { - w.Header().Set("Content-Type", "image/png") - w.Write(buf) - } else { - data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), buf) - w.Header().Set("Content-Type", "text/html") - w.Write(data) - } -} - func main() { http.HandleFunc("/", indexHandler) http.ListenAndServe(":3012", nil) From 1c89ed29be41ca3571da061b5c1e9da565776da9 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Feb 2022 13:01:37 +0800 Subject: [PATCH 076/251] test: fix test --- axis.go | 106 ++++++++++++++++++++++++------------------------- draw_test.go | 34 ++++++++++++++++ legend_test.go | 16 ++++++++ range_test.go | 14 +++++++ util_test.go | 18 +++++++++ xaxis_test.go | 17 ++++++++ 6 files changed, 152 insertions(+), 53 deletions(-) diff --git a/axis.go b/axis.go index 333c8c8..dc8844a 100644 --- a/axis.go +++ b/axis.go @@ -64,20 +64,20 @@ type AxisOption struct { } type axis struct { - d *Draw - data *AxisDataList - style *AxisOption + d *Draw + data *AxisDataList + option *AxisOption } type axisMeasurement struct { Width int Height int } -func NewAxis(d *Draw, data AxisDataList, style AxisOption) *axis { +func NewAxis(d *Draw, data AxisDataList, option AxisOption) *axis { return &axis{ - d: d, - data: &data, - style: &style, + d: d, + data: &data, + option: &option, } } @@ -144,16 +144,16 @@ func NewAxisDataListFromStringList(textList []string) AxisDataList { return list } -func (a *axis) axisLabel(opt *axisRenderOption) { - style := a.style +func (a *axis) axisLabel(renderOpt *axisRenderOption) { + option := a.option data := *a.data d := a.d - if style.FontColor.IsZero() || len(data) == 0 { + if option.FontColor.IsZero() || len(data) == 0 { return } r := d.Render - s := style.Style(d.Font) + s := option.Style(d.Font) s.GetTextOptions().WriteTextOptionsToRenderer(r) width := d.Box.Width() @@ -161,21 +161,21 @@ func (a *axis) axisLabel(opt *axisRenderOption) { textList := data.TextList() count := len(textList) - boundaryGap := opt.boundaryGap + boundaryGap := renderOpt.boundaryGap if !boundaryGap { count-- } - unitCount := opt.unitCount - modValue := opt.modValue - labelMargin := style.GetLabelMargin() + unitCount := renderOpt.unitCount + modValue := renderOpt.modValue + labelMargin := option.GetLabelMargin() // 轴线 - labelHeight := labelMargin + opt.textMaxHeight - labelWidth := labelMargin + opt.textMaxWith + labelHeight := labelMargin + renderOpt.textMaxHeight + labelWidth := labelMargin + renderOpt.textMaxWith // 坐标轴文本 - position := style.Position + position := option.Position switch position { case PositionLeft: fallthrough @@ -194,7 +194,7 @@ func (a *axis) axisLabel(opt *axisRenderOption) { y += b.Height() >> 1 } // 左右位置的x不一样 - x := width - opt.textMaxWith + x := width - renderOpt.textMaxWith if position == PositionLeft { x = labelWidth - b.Width() - 1 } @@ -226,11 +226,11 @@ func (a *axis) axisLabel(opt *axisRenderOption) { } } -func (a *axis) axisLine(opt *axisRenderOption) { +func (a *axis) axisLine(renderOpt *axisRenderOption) { d := a.d r := d.Render - style := a.style - s := style.Style(d.Font) + option := a.option + s := option.Style(d.Font) s.GetStrokeOptions().WriteDrawingOptionsToRenderer(r) x0 := 0 @@ -239,13 +239,13 @@ func (a *axis) axisLine(opt *axisRenderOption) { y1 := 0 width := d.Box.Width() height := d.Box.Height() - labelMargin := style.GetLabelMargin() + labelMargin := option.GetLabelMargin() // 轴线 - labelHeight := labelMargin + opt.textMaxHeight - labelWidth := labelMargin + opt.textMaxWith - tickLength := style.GetTickLength() - switch style.Position { + labelHeight := labelMargin + renderOpt.textMaxHeight + labelWidth := labelMargin + renderOpt.textMaxWith + tickLength := option.GetTickLength() + switch option.Position { case PositionLeft: x0 = tickLength + labelWidth x1 = x0 @@ -274,12 +274,12 @@ func (a *axis) axisLine(opt *axisRenderOption) { r.FillStroke() } -func (a *axis) axisTick(opt *axisRenderOption) { +func (a *axis) axisTick(renderOpt *axisRenderOption) { d := a.d r := d.Render - style := a.style - s := style.Style(d.Font) + option := a.option + s := option.Style(d.Font) s.GetStrokeOptions().WriteDrawingOptionsToRenderer(r) width := d.Box.Width() @@ -289,20 +289,20 @@ func (a *axis) axisTick(opt *axisRenderOption) { if tickCount == 0 { return } - if !opt.boundaryGap { + if !renderOpt.boundaryGap { tickCount-- } - labelMargin := style.GetLabelMargin() + labelMargin := option.GetLabelMargin() tickShow := true - if isFalse(style.TickShow) { + if isFalse(option.TickShow) { tickShow = false } - unitCount := opt.unitCount + unitCount := renderOpt.unitCount - tickLengthValue := style.GetTickLength() - labelHeight := labelMargin + opt.textMaxHeight - labelWidth := labelMargin + opt.textMaxWith - position := style.Position + tickLengthValue := option.GetTickLength() + labelHeight := labelMargin + renderOpt.textMaxHeight + labelWidth := labelMargin + renderOpt.textMaxWith + position := option.Position switch position { case PositionLeft: fallthrough @@ -310,7 +310,7 @@ func (a *axis) axisTick(opt *axisRenderOption) { values := autoDivide(height, tickCount) // 左右仅是x0的位置不一样 x0 := width - labelWidth - if style.Position == PositionLeft { + if option.Position == PositionLeft { x0 = labelWidth } if tickShow { @@ -323,8 +323,8 @@ func (a *axis) axisTick(opt *axisRenderOption) { } } // 辅助线 - if style.SplitLineShow && !style.SplitLineColor.IsZero() { - r.SetStrokeColor(style.SplitLineColor) + if option.SplitLineShow && !option.SplitLineColor.IsZero() { + r.SetStrokeColor(option.SplitLineColor) splitLineWidth := width - labelWidth - tickLengthValue x0 = labelWidth + tickLengthValue if position == PositionRight { @@ -359,8 +359,8 @@ func (a *axis) axisTick(opt *axisRenderOption) { } } // 辅助线 - if style.SplitLineShow && !style.SplitLineColor.IsZero() { - r.SetStrokeColor(style.SplitLineColor) + if option.SplitLineShow && !option.SplitLineColor.IsZero() { + r.SetStrokeColor(option.SplitLineColor) y0 = 0 splitLineHeight := height - labelHeight - tickLengthValue if position == PositionTop { @@ -386,7 +386,7 @@ func (a *axis) axisTick(opt *axisRenderOption) { func (a *axis) measureTextMaxWidthHeight() (int, int) { d := a.d r := d.Render - s := a.style.Style(d.Font) + s := a.option.Style(d.Font) data := a.data s.GetStrokeOptions().WriteDrawingOptionsToRenderer(r) s.GetTextOptions().WriteTextOptionsToRenderer(r) @@ -397,12 +397,12 @@ func (a *axis) measureTextMaxWidthHeight() (int, int) { // Width will be textMaxWidth + labelMargin + tickLength for position left or right. // Height will be textMaxHeight + labelMargin + tickLength for position top or bottom. func (a *axis) measure() axisMeasurement { - style := a.style - value := style.GetLabelMargin() + style.GetTickLength() + option := a.option + value := option.GetLabelMargin() + option.GetTickLength() textMaxWidth, textMaxHeight := a.measureTextMaxWidthHeight() info := axisMeasurement{} - if style.Position == PositionLeft || - style.Position == PositionRight { + if option.Position == PositionLeft || + option.Position == PositionRight { info.Width = textMaxWidth + value } else { info.Height = textMaxHeight + value @@ -412,8 +412,8 @@ func (a *axis) measure() axisMeasurement { // Render renders the axis for chart func (a *axis) Render() { - style := a.style - if isFalse(style.Show) { + option := a.option + if isFalse(option.Show) { return } textMaxWidth, textMaxHeight := a.measureTextMaxWidthHeight() @@ -422,16 +422,16 @@ func (a *axis) Render() { textMaxHeight: textMaxHeight, boundaryGap: true, } - if isFalse(style.BoundaryGap) { + if isFalse(option.BoundaryGap) { opt.boundaryGap = false } - unitCount := chart.MaxInt(style.SplitNumber, 1) + unitCount := chart.MaxInt(option.SplitNumber, 1) width := a.d.Box.Width() textList := a.data.TextList() count := len(textList) - position := style.Position + position := option.Position switch position { case PositionLeft: fallthrough diff --git a/draw_test.go b/draw_test.go index 11f8709..712641a 100644 --- a/draw_test.go +++ b/draw_test.go @@ -90,6 +90,40 @@ func TestWidthHeightOption(t *testing.T) { }, d.Box) } +func TestBoxOption(t *testing.T) { + assert := assert.New(t) + + d, err := NewDraw(DrawOption{ + Width: 400, + Height: 300, + }) + assert.Nil(err) + + err = BoxOption(chart.Box{ + Left: 10, + Top: 20, + Right: 50, + Bottom: 100, + })(d) + assert.Nil(err) + assert.Equal(chart.Box{ + Left: 10, + Top: 20, + Right: 50, + Bottom: 100, + }, d.Box) + + // zero box will be ignored + err = BoxOption(chart.Box{})(d) + assert.Nil(err) + assert.Equal(chart.Box{ + Left: 10, + Top: 20, + Right: 50, + Bottom: 100, + }, d.Box) +} + func TestPaddingOption(t *testing.T) { assert := assert.New(t) diff --git a/legend_test.go b/legend_test.go index db9d459..0c3a0c9 100644 --- a/legend_test.go +++ b/legend_test.go @@ -30,6 +30,22 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) +func TestNewLegendOption(t *testing.T) { + assert := assert.New(t) + + opt := NewLegendOption([]string{ + "a", + "b", + }, PositionRight) + assert.Equal(LegendOption{ + Data: []string{ + "a", + "b", + }, + Left: PositionRight, + }, opt) +} + func TestLegendRender(t *testing.T) { assert := assert.New(t) diff --git a/range_test.go b/range_test.go index 06c25fd..d1aea8f 100644 --- a/range_test.go +++ b/range_test.go @@ -78,3 +78,17 @@ func TestRangeGetRange(t *testing.T) { assert.Equal(40.0, f1) assert.Equal(60.0, f2) } + +func TestRangeAutoDivide(t *testing.T) { + assert := assert.New(t) + + r := Range{ + Size: 120, + divideCount: 6, + } + + assert.Equal([]int{0, 20, 40, 60, 80, 100, 120}, r.AutoDivide()) + + r.Size = 130 + assert.Equal([]int{0, 22, 44, 66, 88, 109, 130}, r.AutoDivide()) +} diff --git a/util_test.go b/util_test.go index 1c6ebf9..7c70447 100644 --- a/util_test.go +++ b/util_test.go @@ -36,6 +36,24 @@ func TestGetDefaultInt(t *testing.T) { assert.Equal(10, getDefaultInt(10, 1)) } +func TestCeilFloatToInt(t *testing.T) { + assert := assert.New(t) + + assert.Equal(1, ceilFloatToInt(0.8)) + assert.Equal(1, ceilFloatToInt(1.0)) + assert.Equal(2, ceilFloatToInt(1.2)) +} + +func TestCommafWithDigits(t *testing.T) { + assert := assert.New(t) + + assert.Equal("1.2", commafWithDigits(1.2)) + assert.Equal("1.21", commafWithDigits(1.21231)) + + assert.Equal("1.20k", commafWithDigits(1200.121)) + assert.Equal("1.20M", commafWithDigits(1200000.121)) +} + func TestAutoDivide(t *testing.T) { assert := assert.New(t) diff --git a/xaxis_test.go b/xaxis_test.go index 44e8a3f..267cdb1 100644 --- a/xaxis_test.go +++ b/xaxis_test.go @@ -28,6 +28,23 @@ import ( "github.com/stretchr/testify/assert" ) +func TestNewXAxisOption(t *testing.T) { + assert := assert.New(t) + + opt := NewXAxisOption([]string{ + "a", + "b", + }, FalseFlag()) + + assert.Equal(XAxisOption{ + Data: []string{ + "a", + "b", + }, + BoundaryGap: FalseFlag(), + }, opt) + +} func TestDrawXAxis(t *testing.T) { assert := assert.New(t) From 51682069d7523c0827f102c32fdba8751b7b47cb Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Feb 2022 13:47:13 +0800 Subject: [PATCH 077/251] test: add test for series --- bar_chart.go | 11 +++- chart.go | 36 +++++++---- line_chart.go | 11 +++- pie_chart.go | 11 +++- series.go | 9 +++ series_test.go | 158 +++++++++++++++++++++++++++++++++++++++++++++++++ theme_test.go | 152 +++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 370 insertions(+), 18 deletions(-) create mode 100644 series_test.go create mode 100644 theme_test.go diff --git a/bar_chart.go b/bar_chart.go index ae5adfb..6809a26 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -23,10 +23,17 @@ package charts import ( + "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" ) -func barChartRender(opt ChartOption, result *basicRenderResult) ([]*markPointRenderOption, error) { +type barChartOption struct { + SeriesList SeriesList + Theme string + Font *truetype.Font +} + +func barChartRender(opt barChartOption, result *basicRenderResult) ([]*markPointRenderOption, error) { d, err := NewDraw(DrawOption{ Parent: result.d, @@ -56,7 +63,7 @@ func barChartRender(opt ChartOption, result *basicRenderResult) ([]*markPointRen barMaxHeight := result.getYRange(0).Size theme := NewTheme(opt.Theme) - seriesNames := opt.Legend.Data + seriesNames := opt.SeriesList.Names() r := d.Render diff --git a/chart.go b/chart.go index 69c2aba..91c9cae 100644 --- a/chart.go +++ b/chart.go @@ -57,7 +57,7 @@ type ChartOption struct { Parent *Draw Padding chart.Box Box chart.Box - SeriesList []Series + SeriesList SeriesList BackgroundColor drawing.Color Children []ChartOption } @@ -126,12 +126,16 @@ func (o *ChartOption) FillDefault(theme string) { if o.Legend.Left == "" { o.Legend.Left = PositionCenter } + // legend与series name的关联 if len(o.Legend.Data) == 0 { - names := make([]string, len(o.SeriesList)) - for index, item := range o.SeriesList { - names[index] = item.Name + o.Legend.Data = o.SeriesList.Names() + } else { + seriesCount := len(o.SeriesList) + for index, name := range o.Legend.Data { + if index < seriesCount { + o.SeriesList[index].Name = name + } } - o.Legend.Data = names } if o.Legend.Style.Font == nil { o.Legend.Style.Font = o.Font @@ -262,7 +266,11 @@ func Render(opt ChartOption) (*Draw, error) { if !isPieChart { return nil } - err := pieChartRender(opt, result) + err := pieChartRender(pieChartOption{ + SeriesList: opt.SeriesList, + Theme: opt.Theme, + Font: opt.Font, + }, result) return err }, // bar render @@ -271,9 +279,11 @@ func Render(opt ChartOption) (*Draw, error) { if isPieChart || len(barSeries) == 0 { return nil } - o := opt - o.SeriesList = barSeries - options, err := barChartRender(o, result) + options, err := barChartRender(barChartOption{ + SeriesList: barSeries, + Theme: opt.Theme, + Font: opt.Font, + }, result) if err != nil { return err } @@ -286,9 +296,11 @@ func Render(opt ChartOption) (*Draw, error) { if isPieChart || len(lineSeries) == 0 { return nil } - o := opt - o.SeriesList = lineSeries - options, err := lineChartRender(o, result) + options, err := lineChartRender(lineChartOption{ + Theme: opt.Theme, + SeriesList: lineSeries, + Font: opt.Font, + }, result) if err != nil { return err } diff --git a/line_chart.go b/line_chart.go index af87cc9..53fde07 100644 --- a/line_chart.go +++ b/line_chart.go @@ -23,11 +23,18 @@ package charts import ( + "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" ) -func lineChartRender(opt ChartOption, result *basicRenderResult) ([]*markPointRenderOption, error) { +type lineChartOption struct { + Theme string + SeriesList SeriesList + Font *truetype.Font +} + +func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]*markPointRenderOption, error) { theme := NewTheme(opt.Theme) @@ -40,7 +47,7 @@ func lineChartRender(opt ChartOption, result *basicRenderResult) ([]*markPointRe if err != nil { return nil, err } - seriesNames := opt.Legend.Data + seriesNames := opt.SeriesList.Names() r := d.Render xRange := result.xRange diff --git a/pie_chart.go b/pie_chart.go index ff24642..7c62e8f 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -26,6 +26,7 @@ import ( "math" "strconv" + "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" ) @@ -40,7 +41,13 @@ func getPieStyle(theme *Theme, index int) chart.Style { } } -func pieChartRender(opt ChartOption, result *basicRenderResult) error { +type pieChartOption struct { + Theme string + Font *truetype.Font + SeriesList SeriesList +} + +func pieChartRender(opt pieChartOption, result *basicRenderResult) error { d, err := NewDraw(DrawOption{ Parent: result.d, }, PaddingOption(chart.Box{ @@ -91,7 +98,7 @@ func pieChartRender(opt ChartOption, result *basicRenderResult) error { } labelRadius := radius + float64(labelLineWidth) - seriesNames := opt.Legend.Data + seriesNames := opt.SeriesList.Names() if len(values) == 1 { getPieStyle(theme, 0).WriteToRenderer(r) diff --git a/series.go b/series.go index b1d72a2..f8a7444 100644 --- a/series.go +++ b/series.go @@ -94,6 +94,7 @@ type Series struct { MarkPoint SeriesMarkPoint MarkLine SeriesMarkLine } +type SeriesList []Series type PieSeriesOption struct { Radius string @@ -158,6 +159,14 @@ func (s *Series) Summary() seriesSummary { } } +func (sl SeriesList) Names() []string { + names := make([]string, len(sl)) + for index, s := range sl { + names[index] = s.Name + } + return names +} + type LabelFormatter func(index int, value float64, percent float64) string func NewPieLabelFormatter(seriesNames []string, layout string) LabelFormatter { diff --git a/series_test.go b/series_test.go new file mode 100644 index 0000000..cab14c3 --- /dev/null +++ b/series_test.go @@ -0,0 +1,158 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewSeriesFromValues(t *testing.T) { + assert := assert.New(t) + + assert.Equal(Series{ + Data: []SeriesData{ + { + Value: 1, + }, + { + Value: 2, + }, + }, + Type: ChartTypeBar, + }, NewSeriesFromValues([]float64{ + 1, + 2, + }, ChartTypeBar)) +} + +func TestNewSeriesDataFromValues(t *testing.T) { + assert := assert.New(t) + + assert.Equal([]SeriesData{ + { + Value: 1, + }, + { + Value: 2, + }, + }, NewSeriesDataFromValues([]float64{ + 1, + 2, + })) +} + +func TestNewPieSeriesList(t *testing.T) { + assert := assert.New(t) + + assert.Equal([]Series{ + { + Type: ChartTypePie, + Label: SeriesLabel{ + Show: true, + }, + Radius: "30%", + Data: []SeriesData{ + { + Value: 1, + }, + }, + }, + { + Type: ChartTypePie, + Label: SeriesLabel{ + Show: true, + }, + Radius: "30%", + Data: []SeriesData{ + { + Value: 2, + }, + }, + }, + }, NewPieSeriesList([]float64{ + 1, + 2, + }, PieSeriesOption{ + Radius: "30%", + LabelShow: true, + })) +} + +func TestSeriesSummary(t *testing.T) { + assert := assert.New(t) + + s := Series{ + Data: NewSeriesDataFromValues([]float64{ + 1, + 3, + 5, + 7, + 9, + }), + } + assert.Equal(seriesSummary{ + MaxIndex: 4, + MaxValue: 9, + MinIndex: 0, + MinValue: 1, + AverageValue: 5, + }, s.Summary()) +} + +func TestGetSeriesNames(t *testing.T) { + assert := assert.New(t) + + sl := SeriesList{ + { + Name: "a", + }, + { + Name: "b", + }, + } + assert.Equal([]string{ + "a", + "b", + }, sl.Names()) +} + +func TestNewPieLabelFormatter(t *testing.T) { + assert := assert.New(t) + + fn := NewPieLabelFormatter([]string{ + "a", + "b", + }, "") + assert.Equal("a: 35%", fn(0, 1.2, 0.35)) +} + +func TestNewValueLabelFormater(t *testing.T) { + assert := assert.New(t) + fn := NewValueLabelFormater([]string{ + "a", + "b", + }, "") + assert.Equal("1.2", fn(0, 1.2, 0.35)) +} diff --git a/theme_test.go b/theme_test.go new file mode 100644 index 0000000..7caf273 --- /dev/null +++ b/theme_test.go @@ -0,0 +1,152 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestTheme(t *testing.T) { + assert := assert.New(t) + + darkTheme := NewTheme(ThemeDark) + lightTheme := NewTheme(ThemeLight) + + assert.True(darkTheme.IsDark()) + assert.False(lightTheme.IsDark()) + + assert.Equal(drawing.Color{ + R: 185, + G: 184, + B: 206, + A: 255, + }, darkTheme.GetAxisStrokeColor()) + assert.Equal(drawing.Color{ + R: 110, + G: 112, + B: 121, + A: 255, + }, lightTheme.GetAxisStrokeColor()) + + assert.Equal(drawing.Color{ + R: 72, + G: 71, + B: 83, + A: 255, + }, darkTheme.GetAxisSplitLineColor()) + assert.Equal(drawing.Color{ + R: 224, + G: 230, + B: 242, + A: 255, + }, lightTheme.GetAxisSplitLineColor()) + + assert.Equal([]drawing.Color{ + { + R: 84, + G: 112, + B: 198, + A: 255, + }, + { + R: 145, + G: 204, + B: 117, + A: 255, + }, + { + R: 250, + G: 200, + B: 88, + A: 255, + }, + { + R: 238, + G: 102, + B: 102, + A: 255, + }, + { + R: 115, + G: 192, + B: 222, + A: 255, + }, + }, darkTheme.GetSeriesColors()) + assert.Equal([]drawing.Color{ + { + R: 84, + G: 112, + B: 198, + A: 255, + }, + { + R: 145, + G: 204, + B: 117, + A: 255, + }, + { + R: 250, + G: 200, + B: 88, + A: 255, + }, + { + R: 238, + G: 102, + B: 102, + A: 255, + }, + { + R: 115, + G: 192, + B: 222, + A: 255, + }, + }, lightTheme.GetSeriesColors()) + + assert.Equal(drawing.Color{ + R: 16, + G: 12, + B: 42, + A: 255, + }, darkTheme.GetBackgroundColor()) + assert.Equal(drawing.ColorWhite, lightTheme.GetBackgroundColor()) + + assert.Equal(drawing.Color{ + R: 238, + G: 238, + B: 238, + A: 255, + }, darkTheme.GetTextColor()) + assert.Equal(drawing.Color{ + R: 70, + G: 70, + B: 70, + A: 255, + }, lightTheme.GetTextColor()) +} From 63d4b0e2290fb0814a864805f9a39ef810e9365c Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Feb 2022 14:04:08 +0800 Subject: [PATCH 078/251] test: add test for mark line --- mark_line.go | 2 +- mark_line_test.go | 99 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 mark_line_test.go diff --git a/mark_line.go b/mark_line.go index e895131..18f7366 100644 --- a/mark_line.go +++ b/mark_line.go @@ -85,7 +85,7 @@ func markLineRender(opt *markLineRenderOption) { width := d.Box.Width() text := commafWithDigits(value) textBox := r.MeasureText(text) - d.makeLine(0, y, width) + d.makeLine(0, y, width-2) d.text(text, width, y+textBox.Height()>>1-2) } diff --git a/mark_line_test.go b/mark_line_test.go new file mode 100644 index 0000000..750ed6f --- /dev/null +++ b/mark_line_test.go @@ -0,0 +1,99 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestNewMarkLine(t *testing.T) { + assert := assert.New(t) + + markLine := NewMarkLine( + SeriesMarkDataTypeMax, + SeriesMarkDataTypeMin, + SeriesMarkDataTypeAverage, + ) + + assert.Equal(SeriesMarkLine{ + Data: []SeriesMarkLineData{ + { + Type: SeriesMarkDataTypeMax, + }, + { + Type: SeriesMarkDataTypeMin, + }, + { + Type: SeriesMarkDataTypeAverage, + }, + }, + }, markLine) +} + +func TestMarkLineRender(t *testing.T) { + assert := assert.New(t) + + d, err := NewDraw(DrawOption{ + Width: 400, + Height: 300, + }, PaddingOption(chart.Box{ + Left: 20, + Right: 20, + })) + assert.Nil(err) + f, _ := chart.GetDefaultFont() + + markLineRender(&markLineRenderOption{ + Draw: d, + FillColor: drawing.ColorBlack, + FontColor: drawing.ColorBlack, + StrokeColor: drawing.ColorBlack, + Font: f, + Series: &Series{ + MarkLine: NewMarkLine( + SeriesMarkDataTypeMax, + SeriesMarkDataTypeMin, + SeriesMarkDataTypeAverage, + ), + Data: NewSeriesDataFromValues([]float64{ + 1, + 3, + 5, + 7, + 9, + }), + }, + Range: &Range{ + Min: 0, + Max: 10, + Size: 200, + }, + }) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\n915", string(data)) +} From bdf7bff3135f0633be840fe8445a93a372d01e3a Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Feb 2022 14:11:40 +0800 Subject: [PATCH 079/251] test: add test for mark point --- mark_line.go | 4 +- mark_line_test.go | 2 +- mark_point.go | 4 +- mark_point_test.go | 105 +++++++++++++++++++++++++++++++++++++++++++++ series.go | 9 ++-- 5 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 mark_point_test.go diff --git a/mark_line.go b/mark_line.go index 18f7366..b03df39 100644 --- a/mark_line.go +++ b/mark_line.go @@ -29,9 +29,9 @@ import ( ) func NewMarkLine(markLineTypes ...string) SeriesMarkLine { - data := make([]SeriesMarkLineData, len(markLineTypes)) + data := make([]SeriesMarkData, len(markLineTypes)) for index, t := range markLineTypes { - data[index] = SeriesMarkLineData{ + data[index] = SeriesMarkData{ Type: t, } } diff --git a/mark_line_test.go b/mark_line_test.go index 750ed6f..4930842 100644 --- a/mark_line_test.go +++ b/mark_line_test.go @@ -40,7 +40,7 @@ func TestNewMarkLine(t *testing.T) { ) assert.Equal(SeriesMarkLine{ - Data: []SeriesMarkLineData{ + Data: []SeriesMarkData{ { Type: SeriesMarkDataTypeMax, }, diff --git a/mark_point.go b/mark_point.go index 3f05445..acecdd5 100644 --- a/mark_point.go +++ b/mark_point.go @@ -29,9 +29,9 @@ import ( ) func NewMarkPoint(markPointTypes ...string) SeriesMarkPoint { - data := make([]SeriesMarkPointData, len(markPointTypes)) + data := make([]SeriesMarkData, len(markPointTypes)) for index, t := range markPointTypes { - data[index] = SeriesMarkPointData{ + data[index] = SeriesMarkData{ Type: t, } } diff --git a/mark_point_test.go b/mark_point_test.go new file mode 100644 index 0000000..b2ea72f --- /dev/null +++ b/mark_point_test.go @@ -0,0 +1,105 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestNewMarkPoint(t *testing.T) { + assert := assert.New(t) + + markPoint := NewMarkPoint( + SeriesMarkDataTypeMax, + SeriesMarkDataTypeMin, + SeriesMarkDataTypeAverage, + ) + + assert.Equal(SeriesMarkPoint{ + Data: []SeriesMarkData{ + { + Type: SeriesMarkDataTypeMax, + }, + { + Type: SeriesMarkDataTypeMin, + }, + { + Type: SeriesMarkDataTypeAverage, + }, + }, + }, markPoint) +} + +func TestMarkPointRender(t *testing.T) { + assert := assert.New(t) + + d, err := NewDraw(DrawOption{ + Width: 400, + Height: 300, + }, PaddingOption(chart.Box{ + Left: 20, + Right: 20, + })) + assert.Nil(err) + f, _ := chart.GetDefaultFont() + + markPointRender(&markPointRenderOption{ + Draw: d, + FillColor: drawing.ColorBlack, + Font: f, + Series: &Series{ + MarkPoint: NewMarkPoint( + SeriesMarkDataTypeMax, + SeriesMarkDataTypeMin, + ), + Data: NewSeriesDataFromValues([]float64{ + 1, + 3, + 5, + }), + }, + Points: []Point{ + { + X: 1, + Y: 50, + }, + { + X: 100, + Y: 100, + }, + { + X: 200, + Y: 200, + }, + }, + }) + data, err := d.Bytes() + assert.Nil(err) + fmt.Println(string(data)) + assert.Equal("\\n51", string(data)) +} diff --git a/series.go b/series.go index f8a7444..7876579 100644 --- a/series.go +++ b/series.go @@ -68,18 +68,15 @@ const ( SeriesMarkDataTypeAverage = "average" ) -type SeriesMarkPointData struct { +type SeriesMarkData struct { Type string } type SeriesMarkPoint struct { SymbolSize int - Data []SeriesMarkPointData -} -type SeriesMarkLineData struct { - Type string + Data []SeriesMarkData } type SeriesMarkLine struct { - Data []SeriesMarkLineData + Data []SeriesMarkData } type Series struct { index int From da5e9505653d2242e1cbaa6332956a884156a74f Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Feb 2022 14:35:27 +0800 Subject: [PATCH 080/251] test: add test for bar chart --- bar_chart.go | 8 ++-- bar_chart_test.go | 96 ++++++++++++++++++++++++++++++++++++++++++++++ chart.go | 2 +- line_chart.go | 8 ++-- mark_line.go | 2 +- mark_line_test.go | 2 +- mark_point.go | 2 +- mark_point_test.go | 2 +- 8 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 bar_chart_test.go diff --git a/bar_chart.go b/bar_chart.go index 6809a26..ac5a0a9 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -33,7 +33,7 @@ type barChartOption struct { Font *truetype.Font } -func barChartRender(opt barChartOption, result *basicRenderResult) ([]*markPointRenderOption, error) { +func barChartRender(opt barChartOption, result *basicRenderResult) ([]markPointRenderOption, error) { d, err := NewDraw(DrawOption{ Parent: result.d, @@ -67,7 +67,7 @@ func barChartRender(opt barChartOption, result *basicRenderResult) ([]*markPoint r := d.Render - markPointRenderOptions := make([]*markPointRenderOption, 0) + markPointRenderOptions := make([]markPointRenderOption, 0) for i, s := range opt.SeriesList { // 由于series是for range,为同一个数据,因此需要clone @@ -81,7 +81,7 @@ func barChartRender(opt barChartOption, result *basicRenderResult) ([]*markPoint } seriesColor := theme.GetSeriesColor(index) // mark line - markLineRender(&markLineRenderOption{ + markLineRender(markLineRenderOption{ Draw: d, FillColor: seriesColor, FontColor: theme.GetTextColor(), @@ -135,7 +135,7 @@ func barChartRender(opt barChartOption, result *basicRenderResult) ([]*markPoint d.text(text, x+(barWidth-textBox.Width())>>1, barMaxHeight-h-5) } - markPointRenderOptions = append(markPointRenderOptions, &markPointRenderOption{ + markPointRenderOptions = append(markPointRenderOptions, markPointRenderOption{ Draw: d, FillColor: seriesColor, Font: opt.Font, diff --git a/bar_chart_test.go b/bar_chart_test.go new file mode 100644 index 0000000..bca69d0 --- /dev/null +++ b/bar_chart_test.go @@ -0,0 +1,96 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestBarChartRender(t *testing.T) { + assert := assert.New(t) + + width := 400 + height := 300 + d, err := NewDraw(DrawOption{ + Width: width, + Height: height, + }) + assert.Nil(err) + + result := basicRenderResult{ + xRange: &Range{ + divideCount: 4, + Size: width, + Boundary: true, + }, + yRangeList: []*Range{ + { + divideCount: 6, + Max: 100, + Min: 0, + Size: height, + }, + }, + d: d, + } + f, _ := chart.GetDefaultFont() + + barChartRender(barChartOption{ + Font: f, + SeriesList: SeriesList{ + { + Label: SeriesLabel{ + Show: true, + Color: drawing.ColorBlue, + }, + Data: []SeriesData{ + { + Value: 20, + }, + { + Value: 60, + Style: chart.Style{ + FillColor: drawing.ColorRed, + }, + }, + { + Value: 90, + }, + }, + }, + NewSeriesFromValues([]float64{ + 80, + 30, + 70, + }), + }, + }, &result) + + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\n206090", string(data)) +} diff --git a/chart.go b/chart.go index 91c9cae..1f31252 100644 --- a/chart.go +++ b/chart.go @@ -259,7 +259,7 @@ func Render(opt ChartOption) (*Draw, error) { if err != nil { return nil, err } - markPointRenderOptions := make([]*markPointRenderOption, 0) + markPointRenderOptions := make([]markPointRenderOption, 0) fns := []func() error{ // pie render func() error { diff --git a/line_chart.go b/line_chart.go index 53fde07..d2eb5e2 100644 --- a/line_chart.go +++ b/line_chart.go @@ -34,7 +34,7 @@ type lineChartOption struct { Font *truetype.Font } -func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]*markPointRenderOption, error) { +func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]markPointRenderOption, error) { theme := NewTheme(opt.Theme) @@ -51,7 +51,7 @@ func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]*markPoi r := d.Render xRange := result.xRange - markPointRenderOptions := make([]*markPointRenderOption, 0) + markPointRenderOptions := make([]markPointRenderOption, 0) for i, s := range opt.SeriesList { // 由于series是for range,为同一个数据,因此需要clone // 后续需要使用,如mark point @@ -65,7 +65,7 @@ func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]*markPoi yRange := result.getYRange(series.YAxisIndex) points := make([]Point, len(series.Data)) // mark line - markLineRender(&markLineRenderOption{ + markLineRender(markLineRenderOption{ Draw: d, FillColor: seriesColor, FontColor: theme.GetTextColor(), @@ -111,7 +111,7 @@ func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]*markPoi DotFillColor: dotFillColor, }) // draw mark point - markPointRenderOptions = append(markPointRenderOptions, &markPointRenderOption{ + markPointRenderOptions = append(markPointRenderOptions, markPointRenderOption{ Draw: d, FillColor: seriesColor, Font: opt.Font, diff --git a/mark_line.go b/mark_line.go index b03df39..464fe71 100644 --- a/mark_line.go +++ b/mark_line.go @@ -50,7 +50,7 @@ type markLineRenderOption struct { Range *Range } -func markLineRender(opt *markLineRenderOption) { +func markLineRender(opt markLineRenderOption) { d := opt.Draw s := opt.Series if len(s.MarkLine.Data) == 0 { diff --git a/mark_line_test.go b/mark_line_test.go index 4930842..abb3308 100644 --- a/mark_line_test.go +++ b/mark_line_test.go @@ -67,7 +67,7 @@ func TestMarkLineRender(t *testing.T) { assert.Nil(err) f, _ := chart.GetDefaultFont() - markLineRender(&markLineRenderOption{ + markLineRender(markLineRenderOption{ Draw: d, FillColor: drawing.ColorBlack, FontColor: drawing.ColorBlack, diff --git a/mark_point.go b/mark_point.go index acecdd5..5fd34c4 100644 --- a/mark_point.go +++ b/mark_point.go @@ -48,7 +48,7 @@ type markPointRenderOption struct { Points []Point } -func markPointRender(opt *markPointRenderOption) { +func markPointRender(opt markPointRenderOption) { d := opt.Draw s := opt.Series if len(s.MarkPoint.Data) == 0 { diff --git a/mark_point_test.go b/mark_point_test.go index b2ea72f..2092bcf 100644 --- a/mark_point_test.go +++ b/mark_point_test.go @@ -68,7 +68,7 @@ func TestMarkPointRender(t *testing.T) { assert.Nil(err) f, _ := chart.GetDefaultFont() - markPointRender(&markPointRenderOption{ + markPointRender(markPointRenderOption{ Draw: d, FillColor: drawing.ColorBlack, Font: f, From cae55c31638322d4e4da4022736526630540c156 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Feb 2022 15:04:32 +0800 Subject: [PATCH 081/251] test: add test for line chart --- bar_chart_test.go | 41 +++++++++++++++++++- line_chart_test.go | 96 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 line_chart_test.go diff --git a/bar_chart_test.go b/bar_chart_test.go index bca69d0..2351e1a 100644 --- a/bar_chart_test.go +++ b/bar_chart_test.go @@ -23,6 +23,7 @@ package charts import ( + "fmt" "testing" "github.com/stretchr/testify/assert" @@ -43,6 +44,8 @@ func TestBarChartRender(t *testing.T) { result := basicRenderResult{ xRange: &Range{ + Min: 0, + Max: 4, divideCount: 4, Size: width, Boundary: true, @@ -59,7 +62,7 @@ func TestBarChartRender(t *testing.T) { } f, _ := chart.GetDefaultFont() - barChartRender(barChartOption{ + markPointOptions, err := barChartRender(barChartOption{ Font: f, SeriesList: SeriesList{ { @@ -67,6 +70,9 @@ func TestBarChartRender(t *testing.T) { Show: true, Color: drawing.ColorBlue, }, + MarkLine: NewMarkLine( + SeriesMarkDataTypeMin, + ), Data: []SeriesData{ { Value: 20, @@ -89,8 +95,39 @@ func TestBarChartRender(t *testing.T) { }), }, }, &result) + assert.Nil(err) + assert.Equal(2, len(markPointOptions)) + assert.Equal([]Point{ + { + X: 28, + Y: 240, + }, + { + X: 128, + Y: 120, + }, + { + X: 228, + Y: 30, + }, + }, markPointOptions[0].Points) + assert.Equal([]Point{ + { + X: 70, + Y: 60, + }, + { + X: 170, + Y: 210, + }, + { + X: 270, + Y: 90, + }, + }, markPointOptions[1].Points) data, err := d.Bytes() assert.Nil(err) - assert.Equal("\\n206090", string(data)) + fmt.Println(string(data)) + assert.Equal("\\n20206090", string(data)) } diff --git a/line_chart_test.go b/line_chart_test.go new file mode 100644 index 0000000..62d0a40 --- /dev/null +++ b/line_chart_test.go @@ -0,0 +1,96 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestLineChartRender(t *testing.T) { + assert := assert.New(t) + + width := 400 + height := 300 + d, err := NewDraw(DrawOption{ + Width: width, + Height: height, + }) + assert.Nil(err) + + result := basicRenderResult{ + xRange: &Range{ + Min: 0, + Max: 4, + divideCount: 4, + Size: width, + Boundary: true, + }, + yRangeList: []*Range{ + { + divideCount: 6, + Max: 100, + Min: 0, + Size: height, + }, + }, + d: d, + } + f, _ := chart.GetDefaultFont() + lineChartRender(lineChartOption{ + Font: f, + SeriesList: SeriesList{ + { + Label: SeriesLabel{ + Show: true, + Color: drawing.ColorBlue, + }, + MarkLine: NewMarkLine( + SeriesMarkDataTypeAverage, + ), + Data: []SeriesData{ + { + Value: 20, + }, + { + Value: 60, + }, + { + Value: 90, + }, + }, + }, + NewSeriesFromValues([]float64{ + 40, + 60, + 70, + }), + }, + }, &result) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\n56.66206090", string(data)) +} From 56709e22b74d46db7ceca14a08ee08fb168e3326 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Feb 2022 15:25:39 +0800 Subject: [PATCH 082/251] test: add test for pie chart --- pie_chart_test.go | 67 +++++++++++++++++++++++++++++++++++++++++++++++ series.go | 14 ++++++---- series_test.go | 12 +++++++-- 3 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 pie_chart_test.go diff --git a/pie_chart_test.go b/pie_chart_test.go new file mode 100644 index 0000000..7cb9fde --- /dev/null +++ b/pie_chart_test.go @@ -0,0 +1,67 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestPieChartRender(t *testing.T) { + assert := assert.New(t) + + d, err := NewDraw(DrawOption{ + Width: 250, + Height: 150, + }) + assert.Nil(err) + + f, _ := chart.GetDefaultFont() + + err = pieChartRender(pieChartOption{ + Font: f, + SeriesList: NewPieSeriesList([]float64{ + 5, + 10, + }, PieSeriesOption{ + Names: []string{ + "a", + "b", + }, + Label: SeriesLabel{ + Show: true, + Color: drawing.ColorRed, + }, + Radius: "20%", + }), + }, &basicRenderResult{ + d: d, + }) + assert.Nil(err) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\na: 33.33%b: 66.66%", string(data)) +} diff --git a/series.go b/series.go index 7876579..f986c54 100644 --- a/series.go +++ b/series.go @@ -94,8 +94,9 @@ type Series struct { type SeriesList []Series type PieSeriesOption struct { - Radius string - LabelShow bool + Radius string + Label SeriesLabel + Names []string } func NewPieSeriesList(values []float64, opts ...PieSeriesOption) []Series { @@ -105,6 +106,10 @@ func NewPieSeriesList(values []float64, opts ...PieSeriesOption) []Series { opt = opts[0] } for index, v := range values { + name := "" + if index < len(opt.Names) { + name = opt.Names[index] + } s := Series{ Type: ChartTypePie, Data: []SeriesData{ @@ -113,9 +118,8 @@ func NewPieSeriesList(values []float64, opts ...PieSeriesOption) []Series { }, }, Radius: opt.Radius, - Label: SeriesLabel{ - Show: opt.LabelShow, - }, + Label: opt.Label, + Name: name, } result[index] = s } diff --git a/series_test.go b/series_test.go index cab14c3..aae83de 100644 --- a/series_test.go +++ b/series_test.go @@ -69,6 +69,7 @@ func TestNewPieSeriesList(t *testing.T) { assert.Equal([]Series{ { Type: ChartTypePie, + Name: "a", Label: SeriesLabel{ Show: true, }, @@ -81,6 +82,7 @@ func TestNewPieSeriesList(t *testing.T) { }, { Type: ChartTypePie, + Name: "b", Label: SeriesLabel{ Show: true, }, @@ -95,8 +97,14 @@ func TestNewPieSeriesList(t *testing.T) { 1, 2, }, PieSeriesOption{ - Radius: "30%", - LabelShow: true, + Radius: "30%", + Label: SeriesLabel{ + Show: true, + }, + Names: []string{ + "a", + "b", + }, })) } From 11fdd9121a9bd8aa08aa162c694166e852a29cd2 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Feb 2022 16:12:02 +0800 Subject: [PATCH 083/251] test: add test for chart --- chart_test.go | 271 ++++++++++++++++++++++++++++++++++++++++++ examples/demo/main.go | 12 +- pie_chart.go | 29 +++-- pie_chart_test.go | 8 ++ 4 files changed, 304 insertions(+), 16 deletions(-) create mode 100644 chart_test.go diff --git a/chart_test.go b/chart_test.go new file mode 100644 index 0000000..06370c8 --- /dev/null +++ b/chart_test.go @@ -0,0 +1,271 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestChartFillDefault(t *testing.T) { + assert := assert.New(t) + // default value + opt := ChartOption{} + opt.FillDefault("") + // padding + assert.Equal(chart.Box{ + Top: 20, + Right: 10, + Bottom: 10, + Left: 10, + }, opt.Padding) + // background color + assert.Equal(drawing.ColorWhite, opt.BackgroundColor) + // title font color + assert.Equal(drawing.Color{ + R: 70, + G: 70, + B: 70, + A: 255, + }, opt.Title.Style.FontColor) + // title font size + assert.Equal(float64(14), opt.Title.Style.FontSize) + // title padding + assert.Equal(chart.Box{ + Left: 5, + Top: 5, + Right: 5, + Bottom: 5, + }, opt.Title.Style.Padding) + // sub title font color + assert.Equal(drawing.Color{ + R: 70, + G: 70, + B: 70, + A: 180, + }, opt.Title.SubtextStyle.FontColor) + // sub title font size + assert.Equal(float64(10), opt.Title.SubtextStyle.FontSize) + // legend font size + assert.Equal(float64(10), opt.Legend.Style.FontSize) + // legend position + assert.Equal("center", opt.Legend.Left) + assert.Equal(drawing.Color{ + R: 70, + G: 70, + B: 70, + A: 255, + }, opt.Legend.Style.FontColor) + + // y axis + opt = ChartOption{ + SeriesList: SeriesList{ + { + YAxisIndex: 1, + }, + }, + } + opt.FillDefault("") + assert.Equal([]YAxisOption{ + {}, + {}, + }, opt.YAxisList) + opt = ChartOption{} + opt.FillDefault("") + assert.Equal([]YAxisOption{ + {}, + }, opt.YAxisList) + + // legend get from series's name + + opt = ChartOption{ + SeriesList: SeriesList{ + { + Name: "a", + }, + { + Name: "b", + }, + }, + } + opt.FillDefault("") + assert.Equal([]string{ + "a", + "b", + }, opt.Legend.Data) + // series name set by legend + opt = ChartOption{ + Legend: LegendOption{ + Data: []string{ + "a", + "b", + }, + }, + SeriesList: SeriesList{ + {}, + {}, + }, + } + opt.FillDefault("") + assert.Equal("a", opt.SeriesList[0].Name) + assert.Equal("b", opt.SeriesList[1].Name) +} + +func TestChartGetWidthHeight(t *testing.T) { + assert := assert.New(t) + + opt := ChartOption{ + Width: 10, + } + assert.Equal(10, opt.getWidth()) + opt.Width = 0 + assert.Equal(600, opt.getWidth()) + opt.Parent = &Draw{ + Box: chart.Box{ + Left: 10, + Right: 50, + }, + } + assert.Equal(40, opt.getWidth()) + + opt = ChartOption{ + Height: 20, + } + assert.Equal(20, opt.getHeight()) + opt.Height = 0 + assert.Equal(400, opt.getHeight()) + opt.Parent = &Draw{ + Box: chart.Box{ + Top: 20, + Bottom: 80, + }, + } + assert.Equal(60, opt.getHeight()) +} + +func TestChartRender(t *testing.T) { + assert := assert.New(t) + + d, err := Render(ChartOption{ + Width: 800, + Height: 600, + Legend: LegendOption{ + Top: "-90", + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Padding: chart.Box{ + Top: 100, + }, + XAxis: NewXAxisOption([]string{ + "2012", + "2013", + "2014", + "2015", + "2016", + "2017", + }), + YAxisList: []YAxisOption{ + { + + Min: NewFloatPoint(0), + Max: NewFloatPoint(90), + }, + }, + SeriesList: []Series{ + NewSeriesFromValues([]float64{ + 56.5, + 82.1, + 88.7, + 70.1, + 53.4, + 85.1, + }), + NewSeriesFromValues([]float64{ + 51.1, + 51.4, + 55.1, + 53.3, + 73.8, + 68.7, + }), + NewSeriesFromValues([]float64{ + 40.1, + 62.2, + 69.5, + 36.4, + 45.2, + 32.5, + }, ChartTypeBar), + NewSeriesFromValues([]float64{ + 25.2, + 37.1, + 41.2, + 18, + 33.9, + 49.1, + }, ChartTypeBar), + }, + Children: []ChartOption{ + { + Legend: LegendOption{ + Show: FalseFlag(), + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Box: chart.Box{ + Top: 20, + Left: 400, + Right: 500, + Bottom: 120, + }, + SeriesList: NewPieSeriesList([]float64{ + 435.9, + 354.3, + 285.9, + 204.5, + }, PieSeriesOption{ + Label: SeriesLabel{ + Show: true, + }, + Radius: "35%", + }), + }, + }, + }) + assert.Nil(err) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\n2012201320142015201620170153045607590Milk TeaMatcha LatteCheese CocoaWalnut BrownieMilk Tea: 34.03%Matcha Latte: 27.66%Cheese Cocoa: 22.32%Walnut Brownie: 15.96%", string(data)) +} diff --git a/examples/demo/main.go b/examples/demo/main.go index 1f37e25..5d58cda 100644 --- a/examples/demo/main.go +++ b/examples/demo/main.go @@ -460,8 +460,10 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { 484, 300, }, charts.PieSeriesOption{ - LabelShow: true, - Radius: "35%", + Label: charts.SeriesLabel{ + Show: true, + }, + Radius: "35%", }), }, // 多图展示 @@ -551,8 +553,10 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { 285.9, 204.5, }, charts.PieSeriesOption{ - LabelShow: true, - Radius: "35%", + Label: charts.SeriesLabel{ + Show: true, + }, + Radius: "35%", }), }, }, diff --git a/pie_chart.go b/pie_chart.go index 7c62e8f..f581273 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -47,6 +47,22 @@ type pieChartOption struct { SeriesList SeriesList } +func getPieRadius(diameter float64, radiusValue string) float64 { + var radius float64 + if len(radiusValue) != 0 { + v := convertPercent(radiusValue) + if v != -1 { + radius = float64(diameter) * v + } else { + radius, _ = strconv.ParseFloat(radiusValue, 64) + } + } + if radius <= 0 { + radius = float64(diameter) * defaultRadiusPercent + } + return radius +} + func pieChartRender(opt pieChartOption, result *basicRenderResult) error { d, err := NewDraw(DrawOption{ Parent: result.d, @@ -79,19 +95,8 @@ func pieChartRender(opt pieChartOption, result *basicRenderResult) error { cy := box.Height() >> 1 diameter := chart.MinInt(box.Width(), box.Height()) + radius := getPieRadius(float64(diameter), radiusValue) - var radius float64 - if len(radiusValue) != 0 { - v := convertPercent(radiusValue) - if v != -1 { - radius = float64(diameter) * v - } else { - radius, _ = strconv.ParseFloat(radiusValue, 64) - } - } - if radius <= 0 { - radius = float64(diameter) * defaultRadiusPercent - } labelLineWidth := 15 if radius < 50 { labelLineWidth = 10 diff --git a/pie_chart_test.go b/pie_chart_test.go index 7cb9fde..92ef6d0 100644 --- a/pie_chart_test.go +++ b/pie_chart_test.go @@ -30,6 +30,14 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) +func TestGetPieRadius(t *testing.T) { + assert := assert.New(t) + + assert.Equal(50.0, getPieRadius(100, "50%")) + assert.Equal(30.0, getPieRadius(100, "30")) + assert.Equal(40.0, getPieRadius(100, "")) +} + func TestPieChartRender(t *testing.T) { assert := assert.New(t) From b934b853a9970f99f1f113ee615fc0c1dcd322a9 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 15 Feb 2022 23:38:35 +0800 Subject: [PATCH 084/251] feat: support install font and enhance title padding --- axis.go | 2 ++ bar_chart.go | 13 ++++--- chart.go | 83 +++++++++++++++++++++++++++++++------------ chart_test.go | 25 ++++++++----- draw.go | 22 +++++++++--- examples/demo/main.go | 8 ++++- font.go | 61 +++++++++++++++++++++++++++++++ font_test.go | 42 ++++++++++++++++++++++ legend.go | 3 ++ legend_test.go | 16 +++++---- series.go | 47 +++++++++++++++++------- title.go | 3 +- title_test.go | 8 ++--- 13 files changed, 268 insertions(+), 65 deletions(-) create mode 100644 font.go create mode 100644 font_test.go diff --git a/axis.go b/axis.go index dc8844a..46292e4 100644 --- a/axis.go +++ b/axis.go @@ -73,6 +73,7 @@ type axisMeasurement struct { Height int } +// NewAxis creates a new axis with data and style options func NewAxis(d *Draw, data AxisDataList, option AxisOption) *axis { return &axis{ d: d, @@ -112,6 +113,7 @@ func (as *AxisOption) Style(f *truetype.Font) chart.Style { } type AxisData struct { + // The text value of axis Text string } type AxisDataList []AxisData diff --git a/bar_chart.go b/bar_chart.go index ac5a0a9..11e9d5a 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -28,17 +28,20 @@ import ( ) type barChartOption struct { + // The series list fo bar chart SeriesList SeriesList - Theme string - Font *truetype.Font + // The theme + Theme string + // The font + Font *truetype.Font } func barChartRender(opt barChartOption, result *basicRenderResult) ([]markPointRenderOption, error) { - d, err := NewDraw(DrawOption{ Parent: result.d, }, PaddingOption(chart.Box{ - Top: result.titleBox.Height(), + Top: result.titleBox.Height(), + // TODO 后续考虑是否需要根据左侧是否展示y轴再生成对应的left Left: YAxisWidth, })) if err != nil { @@ -118,6 +121,7 @@ func barChartRender(opt barChartOption, result *basicRenderResult) ([]markPointR X: x + barWidth>>1, Y: top, } + // 如果label不需要展示,则返回 if !series.Label.Show { continue } @@ -135,6 +139,7 @@ func barChartRender(opt barChartOption, result *basicRenderResult) ([]markPointR d.text(text, x+(barWidth-textBox.Width())>>1, barMaxHeight-h-5) } + // 生成mark point的参数 markPointRenderOptions = append(markPointRenderOptions, markPointRenderOption{ Draw: d, FillColor: seriesColor, diff --git a/chart.go b/chart.go index 1f31252..44bee0c 100644 --- a/chart.go +++ b/chart.go @@ -44,24 +44,45 @@ type Point struct { const labelFontSize = 10 +var defaultChartWidth = 600 +var defaultChartHeight = 400 + type ChartOption struct { - Type string - Font *truetype.Font - Theme string - Title TitleOption - Legend LegendOption - XAxis XAxisOption - YAxisList []YAxisOption - Width int - Height int - Parent *Draw - Padding chart.Box - Box chart.Box - SeriesList SeriesList + // The output type of chart, "svg" or "png", default value is "svg" + Type string + // The font family, which should be installed first + FontFamily string + // The font of chart, the default font is "roboto" + Font *truetype.Font + // The theme of chart, "light" and "dark". + // The default theme is "light" + Theme string + // The title option + Title TitleOption + // The legend option + Legend LegendOption + // The x axis option + XAxis XAxisOption + // The y axis option list + YAxisList []YAxisOption + // The width of chart, default width is 600 + Width int + // The height of chart, default height is 400 + Height int + Parent *Draw + // The padding for chart, default padding is [20, 10, 10, 10] + Padding chart.Box + // The canvas box for chart + Box chart.Box + // The series list + SeriesList SeriesList + // The background color of chart BackgroundColor drawing.Color - Children []ChartOption + // The child charts + Children []ChartOption } +// FillDefault fills the default value for chart option func (o *ChartOption) FillDefault(theme string) { t := NewTheme(theme) // 如果为空,初始化 @@ -83,7 +104,7 @@ func (o *ChartOption) FillDefault(theme string) { } if o.Padding.IsZero() { o.Padding = chart.Box{ - Top: 20, + Top: 10, Right: 10, Bottom: 10, Left: 10, @@ -102,10 +123,7 @@ func (o *ChartOption) FillDefault(theme string) { } if o.Title.Style.Padding.IsZero() { o.Title.Style.Padding = chart.Box{ - Left: 5, - Top: 5, - Right: 5, - Bottom: 5, + Bottom: 10, } } // 副标题 @@ -113,7 +131,7 @@ func (o *ChartOption) FillDefault(theme string) { o.Title.SubtextStyle.FontColor = o.Title.Style.FontColor.WithAlpha(180) } if o.Title.SubtextStyle.FontSize == 0 { - o.Title.SubtextStyle.FontSize = 10 + o.Title.SubtextStyle.FontSize = labelFontSize } if o.Title.SubtextStyle.Font == nil { o.Title.SubtextStyle.Font = o.Font @@ -121,7 +139,7 @@ func (o *ChartOption) FillDefault(theme string) { o.Legend.theme = theme if o.Legend.Style.FontSize == 0 { - o.Legend.Style.FontSize = 10 + o.Legend.Style.FontSize = labelFontSize } if o.Legend.Left == "" { o.Legend.Left = PositionCenter @@ -155,7 +173,18 @@ func (o *ChartOption) getWidth() int { if o.Parent != nil { return o.Parent.Box.Width() } - return 600 + return defaultChartWidth +} + +func SetDefaultWidth(width int) { + if width > 0 { + defaultChartWidth = width + } +} +func SetDefaultHeight(height int) { + if height > 0 { + defaultChartHeight = height + } } func (o *ChartOption) getHeight() int { @@ -166,7 +195,7 @@ func (o *ChartOption) getHeight() int { if o.Parent != nil { return o.Parent.Box.Height() } - return 400 + return defaultChartHeight } func (o *ChartOption) newYRange(axisIndex int) Range { @@ -227,10 +256,18 @@ func (r *basicRenderResult) getYRange(index int) *Range { return r.yRangeList[index] } +// Render renders the chart by option func Render(opt ChartOption) (*Draw, error) { if len(opt.SeriesList) == 0 { return nil, errors.New("series can not be nil") } + if len(opt.FontFamily) != 0 { + f, err := GetFont(opt.FontFamily) + if err != nil { + return nil, err + } + opt.Font = f + } opt.FillDefault(opt.Theme) lineSeries := make([]Series, 0) diff --git a/chart_test.go b/chart_test.go index 06370c8..ee768ec 100644 --- a/chart_test.go +++ b/chart_test.go @@ -30,6 +30,20 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) +func TestChartSetDefaultWidthHeight(t *testing.T) { + assert := assert.New(t) + + width := defaultChartWidth + height := defaultChartHeight + defer SetDefaultWidth(width) + defer SetDefaultHeight(height) + + SetDefaultWidth(60) + assert.Equal(60, defaultChartWidth) + SetDefaultHeight(40) + assert.Equal(40, defaultChartHeight) +} + func TestChartFillDefault(t *testing.T) { assert := assert.New(t) // default value @@ -37,7 +51,7 @@ func TestChartFillDefault(t *testing.T) { opt.FillDefault("") // padding assert.Equal(chart.Box{ - Top: 20, + Top: 10, Right: 10, Bottom: 10, Left: 10, @@ -53,13 +67,6 @@ func TestChartFillDefault(t *testing.T) { }, opt.Title.Style.FontColor) // title font size assert.Equal(float64(14), opt.Title.Style.FontSize) - // title padding - assert.Equal(chart.Box{ - Left: 5, - Top: 5, - Right: 5, - Bottom: 5, - }, opt.Title.Style.Padding) // sub title font color assert.Equal(drawing.Color{ R: 70, @@ -267,5 +274,5 @@ func TestChartRender(t *testing.T) { assert.Nil(err) data, err := d.Bytes() assert.Nil(err) - assert.Equal("\\n2012201320142015201620170153045607590Milk TeaMatcha LatteCheese CocoaWalnut BrownieMilk Tea: 34.03%Matcha Latte: 27.66%Cheese Cocoa: 22.32%Walnut Brownie: 15.96%", string(data)) + assert.Equal("\\n2012201320142015201620170153045607590Milk TeaMatcha LatteCheese CocoaWalnut BrownieMilk Tea: 34.03%Matcha Latte: 27.66%Cheese Cocoa: 22.32%Walnut Brownie: 15.96%", string(data)) } diff --git a/draw.go b/draw.go index 0dbcf83..228f622 100644 --- a/draw.go +++ b/draw.go @@ -46,21 +46,30 @@ const ( ) type Draw struct { + // Render Render chart.Renderer - Box chart.Box - Font *truetype.Font + // The canvas box + Box chart.Box + // The font for draw + Font *truetype.Font + // The parent of draw parent *Draw } type DrawOption struct { - Type string + // Draw type, "svg" or "png", default type is "svg" + Type string + // Parent of draw Parent *Draw - Width int + // The width of draw canvas + Width int + // The height of draw canvas Height int } type Option func(*Draw) error +// PaddingOption sets the padding of draw canvas func PaddingOption(padding chart.Box) Option { return func(d *Draw) error { d.Box.Left += padding.Left @@ -71,6 +80,7 @@ func PaddingOption(padding chart.Box) Option { } } +// BoxOption set the box of draw canvas func BoxOption(box chart.Box) Option { return func(d *Draw) error { if box.IsZero() { @@ -81,6 +91,7 @@ func BoxOption(box chart.Box) Option { } } +// NewDraw returns a new draw canvas func NewDraw(opt DrawOption, opts ...Option) (*Draw, error) { if opt.Parent == nil && (opt.Width <= 0 || opt.Height <= 0) { return nil, errors.New("parent and width/height can not be nil") @@ -122,10 +133,12 @@ func NewDraw(opt DrawOption, opts ...Option) (*Draw, error) { return d, nil } +// Parent returns the parent of draw func (d *Draw) Parent() *Draw { return d.parent } +// Top returns the top parent of draw func (d *Draw) Top() *Draw { if d.parent == nil { return nil @@ -141,6 +154,7 @@ func (d *Draw) Top() *Draw { return t } +// Bytes returns the data of draw canvas func (d *Draw) Bytes() ([]byte, error) { buffer := bytes.Buffer{} err := d.Render.Save(&buffer) diff --git a/examples/demo/main.go b/examples/demo/main.go index 5d58cda..7916b4d 100644 --- a/examples/demo/main.go +++ b/examples/demo/main.go @@ -3,6 +3,7 @@ package main import ( "bytes" "net/http" + "strconv" charts "github.com/vicanso/go-charts" "github.com/wcharczuk/go-chart/v2" @@ -65,7 +66,12 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { if req.URL.Path != "/" { return } - theme := req.URL.Query().Get("theme") + query := req.URL.Query() + theme := query.Get("theme") + width, _ := strconv.Atoi(query.Get("width")) + height, _ := strconv.Atoi(query.Get("height")) + charts.SetDefaultWidth(width) + charts.SetDefaultWidth(height) chartOptions := []charts.ChartOption{ // 普通折线图 { diff --git a/font.go b/font.go new file mode 100644 index 0000000..c40b51e --- /dev/null +++ b/font.go @@ -0,0 +1,61 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "errors" + "sync" + + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2/roboto" +) + +var fonts = sync.Map{} +var ErrFontNotExists = errors.New("font is not exists") + +func init() { + _ = InstallFont("roboto", roboto.Roboto) +} + +// InstallFont installs the font for charts +func InstallFont(fontFamily string, data []byte) error { + font, err := truetype.Parse(data) + if err != nil { + return err + } + fonts.Store(fontFamily, font) + return nil +} + +// GetFont get the font by font family +func GetFont(fontFamily string) (*truetype.Font, error) { + value, ok := fonts.Load(fontFamily) + if !ok { + return nil, ErrFontNotExists + } + f, ok := value.(*truetype.Font) + if !ok { + return nil, ErrFontNotExists + } + return f, nil +} diff --git a/font_test.go b/font_test.go new file mode 100644 index 0000000..9dc731c --- /dev/null +++ b/font_test.go @@ -0,0 +1,42 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2/roboto" +) + +func TestInstallFont(t *testing.T) { + assert := assert.New(t) + + fontFamily := "test" + err := InstallFont(fontFamily, roboto.Roboto) + assert.Nil(err) + + font, err := GetFont(fontFamily) + assert.Nil(err) + assert.NotNil(font) +} diff --git a/legend.go b/legend.go index f11b50f..7eb33b3 100644 --- a/legend.go +++ b/legend.go @@ -50,6 +50,7 @@ type LegendOption struct { Orient string } +// NewLegendOption creates a new legend option by legend text list func NewLegendOption(data []string, position ...string) LegendOption { opt := LegendOption{ Data: data, @@ -101,6 +102,8 @@ func (l *legend) Render() (chart.Box, error) { legendDotHeight := 5 textPadding := 5 legendMargin := 10 + // 往下移2倍dot的高度 + y += 2 * legendDotHeight widthCount := 0 maxTextWidth := 0 diff --git a/legend_test.go b/legend_test.go index 0c3a0c9..2dc286f 100644 --- a/legend_test.go +++ b/legend_test.go @@ -23,6 +23,7 @@ package charts import ( + "fmt" "testing" "github.com/stretchr/testify/assert" @@ -81,7 +82,7 @@ func TestLegendRender(t *testing.T) { Style: style, }) }, - result: "\\nMonTueWed", + result: "\\nMonTueWed", box: chart.Box{ Right: 214, Bottom: 25, @@ -102,7 +103,7 @@ func TestLegendRender(t *testing.T) { Style: style, }) }, - result: "\\nMonTueWed", + result: "\\nMonTueWed", box: chart.Box{ Right: 400, Bottom: 25, @@ -122,7 +123,7 @@ func TestLegendRender(t *testing.T) { Style: style, }) }, - result: "\\nMonTueWed", + result: "\\nMonTueWed", box: chart.Box{ Right: 307, Bottom: 25, @@ -143,10 +144,10 @@ func TestLegendRender(t *testing.T) { Orient: OrientVertical, }) }, - result: "\\nMonTueWed", + result: "\\nMonTueWed", box: chart.Box{ Right: 61, - Bottom: 70, + Bottom: 80, }, }, { @@ -166,9 +167,9 @@ func TestLegendRender(t *testing.T) { }, box: chart.Box{ Right: 101, - Bottom: 70, + Bottom: 80, }, - result: "\\nMonTueWed", + result: "\\nMonTueWed", }, } @@ -178,6 +179,7 @@ func TestLegendRender(t *testing.T) { assert.Nil(err) assert.Equal(tt.box, b) data, err := d.Bytes() + fmt.Println(string(data)) assert.Nil(err) assert.NotEmpty(data) assert.Equal(tt.result, string(data)) diff --git a/series.go b/series.go index f986c54..e5d9bd8 100644 --- a/series.go +++ b/series.go @@ -32,7 +32,9 @@ import ( ) type SeriesData struct { + // The value of series data Value float64 + // The style of series data Style chart.Style } @@ -57,9 +59,15 @@ func NewSeriesDataFromValues(values []float64) []SeriesData { } type SeriesLabel struct { + // Data label formatter, which supports string template. + // {b}: the name of a data item. + // {c}: the value of a data item. + // {d}: the percent of a data item(pie chart). Formatter string - Color drawing.Color - Show bool + // The color for label + Color drawing.Color + // Show flag for label + Show bool } const ( @@ -69,27 +77,42 @@ const ( ) type SeriesMarkData struct { + // The mark data type, it can be "max", "min", "average". + // The "average" is only for mark line Type string } type SeriesMarkPoint struct { + // The width of symbol, default value is 30 SymbolSize int - Data []SeriesMarkData + // The mark data of series mark point + Data []SeriesMarkData } type SeriesMarkLine struct { + // The mark data of series mark line Data []SeriesMarkData } type Series struct { - index int - Type string - Data []SeriesData + index int + // The type of series, it can be "line", "bar" or "pie". + // Default value is "line" + Type string + // The data list of series + Data []SeriesData + // The Y axis index, it should be 0 or 1. + // Default value is 1 YAxisIndex int - Style chart.Style - Label SeriesLabel - Name string - // Radius of Pie chart, e.g.: 40% - Radius string + // The style for series + Style chart.Style + // The label for series + Label SeriesLabel + // The name of series + Name string + // Radius for Pie chart, e.g.: 40%, default is "40%" + Radius string + // Mark point for series MarkPoint SeriesMarkPoint - MarkLine SeriesMarkLine + // Make line for series + MarkLine SeriesMarkLine } type SeriesList []Series diff --git a/title.go b/title.go index a5ba6b3..07a2eef 100644 --- a/title.go +++ b/title.go @@ -142,7 +142,8 @@ func drawTitle(p *Draw, opt *TitleOption) (chart.Box, error) { for _, item := range measureOptions { item.style.WriteTextOptionsToRenderer(r) x := titleX + (textMaxWidth-item.width)>>1 - d.text(item.text, x, titleY) + y := titleY + item.height + d.text(item.text, x, y) titleY += item.height } height := titleY + padding.Top + padding.Bottom diff --git a/title_test.go b/title_test.go index e5f895c..23573c3 100644 --- a/title_test.go +++ b/title_test.go @@ -79,7 +79,7 @@ func TestDrawTitle(t *testing.T) { { newDraw: newDraw, newOption: newOption, - result: "\\ntitleHellosubtitleWorld!", + result: "\\ntitleHellosubtitleWorld!", box: chart.Box{ Right: 43, Bottom: 58, @@ -93,7 +93,7 @@ func TestDrawTitle(t *testing.T) { opt.Top = "50" return opt }, - result: "\\ntitleHellosubtitleWorld!", + result: "\\ntitleHellosubtitleWorld!", box: chart.Box{ Right: 400, Bottom: 108, @@ -107,7 +107,7 @@ func TestDrawTitle(t *testing.T) { opt.Top = "10" return opt }, - result: "\\ntitleHellosubtitleWorld!", + result: "\\ntitleHellosubtitleWorld!", box: chart.Box{ Right: 222, Bottom: 68, @@ -121,7 +121,7 @@ func TestDrawTitle(t *testing.T) { opt.Top = "10" return opt }, - result: "\\ntitleHellosubtitleWorld!", + result: "\\ntitleHellosubtitleWorld!", box: chart.Box{ Right: 83, Bottom: 68, From 519c8a492e7e4768fd3d3a3b9c9ea4b122cd9c2f Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 16 Feb 2022 22:51:02 +0800 Subject: [PATCH 085/251] feat: support echart options --- bar_chart.go | 6 +- chart.go | 5 + echarts.go | 407 ++++++++++++++++++++++++++++++++++++++++++++++++ echarts_test.go | 301 +++++++++++++++++++++++++++++++++++ line_chart.go | 6 +- series.go | 2 + util.go | 38 +++++ util_test.go | 40 +++++ 8 files changed, 803 insertions(+), 2 deletions(-) create mode 100644 echarts.go create mode 100644 echarts_test.go diff --git a/bar_chart.go b/bar_chart.go index 11e9d5a..f291d78 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -125,6 +125,10 @@ func barChartRender(opt barChartOption, result *basicRenderResult) ([]markPointR if !series.Label.Show { continue } + distance := series.Label.Distance + if distance == 0 { + distance = 5 + } text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(i, item.Value, -1) labelStyle := chart.Style{ FontColor: theme.GetTextColor(), @@ -136,7 +140,7 @@ func barChartRender(opt barChartOption, result *basicRenderResult) ([]markPointR } labelStyle.GetTextOptions().WriteToRenderer(r) textBox := r.MeasureText(text) - d.text(text, x+(barWidth-textBox.Width())>>1, barMaxHeight-h-5) + d.text(text, x+(barWidth-textBox.Width())>>1, barMaxHeight-h-distance) } // 生成mark point的参数 diff --git a/chart.go b/chart.go index 44bee0c..c211a6d 100644 --- a/chart.go +++ b/chart.go @@ -25,6 +25,7 @@ package charts import ( "errors" "math" + "strings" "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" @@ -155,6 +156,10 @@ func (o *ChartOption) FillDefault(theme string) { } } } + // 如果无legend数据,则隐藏 + if len(strings.Join(o.Legend.Data, "")) == 0 { + o.Legend.Show = FalseFlag() + } if o.Legend.Style.Font == nil { o.Legend.Style.Font = o.Font } diff --git a/echarts.go b/echarts.go new file mode 100644 index 0000000..9232ed7 --- /dev/null +++ b/echarts.go @@ -0,0 +1,407 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "bytes" + "encoding/json" + "fmt" + "regexp" + "strconv" + + "github.com/wcharczuk/go-chart/v2" +) + +func convertToArray(data []byte) []byte { + data = bytes.TrimSpace(data) + if len(data) == 0 { + return nil + } + if data[0] != '[' { + data = []byte("[" + string(data) + "]") + } + return data +} + +type EChartsPosition string + +func (p *EChartsPosition) UnmarshalJSON(data []byte) error { + if len(data) == 0 { + return nil + } + if regexp.MustCompile(`^\d+`).Match(data) { + data = []byte(fmt.Sprintf(`"%s"`, string(data))) + } + s := (*string)(p) + return json.Unmarshal(data, s) +} + +type EChartStyle struct { + Color string `json:"color"` +} + +func (es *EChartStyle) ToStyle() chart.Style { + color := parseColor(es.Color) + return chart.Style{ + FillColor: color, + FontColor: color, + StrokeColor: color, + } +} + +type EChartsSeriesData struct { + Value float64 `json:"value"` + Name string `json:"name"` + ItemStyle EChartStyle `json:"itemStyle"` +} +type _EChartsSeriesData EChartsSeriesData + +func (es *EChartsSeriesData) UnmarshalJSON(data []byte) error { + data = bytes.TrimSpace(data) + if len(data) == 0 { + return nil + } + if regexp.MustCompile(`^\d+`).Match(data) { + v, err := strconv.ParseFloat(string(data), 64) + if err != nil { + return err + } + es.Value = v + return nil + } + v := _EChartsSeriesData{} + err := json.Unmarshal(data, &v) + if err != nil { + return err + } + es.Name = v.Name + es.Value = v.Value + es.ItemStyle = v.ItemStyle + return nil +} + +type EChartsXAxisData struct { + BoundaryGap *bool `json:"boundaryGap"` + SplitNumber int `json:"splitNumber"` + Data []string `json:"data"` +} +type EChartsXAxis struct { + Data []EChartsXAxisData +} + +func (ex *EChartsXAxis) UnmarshalJSON(data []byte) error { + data = convertToArray(data) + if len(data) == 0 { + return nil + } + return json.Unmarshal(data, &ex.Data) +} + +type EChartsAxisLabel struct { + Formatter string `json:"formatter"` +} +type EChartsYAxisData struct { + Min *float64 `json:"min"` + Max *float64 `json:"max"` + AxisLabel EChartsAxisLabel `json:"axisLabel"` + AxisLine struct { + LineStyle struct { + Color string + } + } +} +type EChartsYAxis struct { + Data []EChartsYAxisData `json:"data"` +} + +func (ey *EChartsYAxis) UnmarshalJSON(data []byte) error { + data = convertToArray(data) + if len(data) == 0 { + return nil + } + return json.Unmarshal(data, &ey.Data) +} + +type EChartsPadding struct { + Box chart.Box +} + +func (eb *EChartsPadding) UnmarshalJSON(data []byte) error { + data = convertToArray(data) + if len(data) == 0 { + return nil + } + arr := make([]int, 0) + err := json.Unmarshal(data, &arr) + if err != nil { + return err + } + if len(arr) == 0 { + return nil + } + switch len(arr) { + case 1: + eb.Box = chart.Box{ + Left: arr[0], + Top: arr[0], + Bottom: arr[0], + Right: arr[0], + } + case 2: + eb.Box = chart.Box{ + Top: arr[0], + Bottom: arr[0], + Left: arr[1], + Right: arr[1], + } + default: + result := make([]int, 4) + copy(result, arr) + if len(arr) == 3 { + result[3] = result[1] + } + // 上右下左 + eb.Box = chart.Box{ + Top: result[0], + Right: result[1], + Bottom: result[2], + Left: result[3], + } + } + return nil +} + +type EChartsLabelOption struct { + Show bool `json:"show"` + Distance int `json:"distance"` + Color string `json:"color"` +} +type EChartsLegend struct { + Show *bool `json:"show"` + Data []string `json:"data"` + Align string `json:"align"` + Orient string `json:"orient"` + Padding EChartsPadding `json:"padding"` + Left EChartsPosition `json:"left"` + Top EChartsPosition `json:"top"` + TextStyle EChartsTextStyle `json:"textStyle"` +} + +type EChartsMarkPoint struct { + SymbolSize int `json:"symbolSize"` + Data []struct { + Type string `json:"type"` + } `json:"data"` +} + +func (emp *EChartsMarkPoint) ToSeriesMarkPoint() SeriesMarkPoint { + data := make([]SeriesMarkData, len(emp.Data)) + for index, item := range emp.Data { + data[index] = SeriesMarkData{ + Type: item.Type, + } + } + return SeriesMarkPoint{ + Data: data, + SymbolSize: emp.SymbolSize, + } +} + +type EChartsMarkLine struct { + Data []struct { + Type string `json:"type"` + } `json:"data"` +} + +func (eml *EChartsMarkLine) ToSeriesMarkLine() SeriesMarkLine { + data := make([]SeriesMarkData, len(eml.Data)) + for index, item := range eml.Data { + data[index] = SeriesMarkData{ + Type: item.Type, + } + } + return SeriesMarkLine{ + Data: data, + } +} + +type EChartsSeries struct { + Data []EChartsSeriesData `json:"data"` + Name string `json:"name"` + Type string `json:"type"` + Radius string `json:"radius"` + YAxisIndex int `json:"yAxisIndex"` + ItemStyle EChartStyle `json:"itemStyle"` + // label的配置 + Label EChartsLabelOption `json:"label"` + MarkPoint EChartsMarkPoint `json:"markPoint"` + MarkLine EChartsMarkLine `json:"markLine"` +} +type EChartsSeriesList []EChartsSeries + +func (esList EChartsSeriesList) ToSeriesList() SeriesList { + seriesList := make(SeriesList, len(esList)) + for index, item := range esList { + data := make([]SeriesData, len(item.Data)) + for j, dataItem := range item.Data { + data[j] = SeriesData{ + Value: dataItem.Value, + Style: dataItem.ItemStyle.ToStyle(), + } + } + seriesList[index] = Series{ + Type: item.Type, + Data: data, + YAxisIndex: item.YAxisIndex, + Style: item.ItemStyle.ToStyle(), + Label: SeriesLabel{ + Color: parseColor(item.Label.Color), + Show: item.Label.Show, + Distance: item.Label.Distance, + }, + Name: item.Name, + Radius: item.Radius, + MarkPoint: item.MarkPoint.ToSeriesMarkPoint(), + MarkLine: item.MarkLine.ToSeriesMarkLine(), + } + } + return seriesList +} + +type EChartsTextStyle struct { + Color string `json:"color"` + FontFamily string `json:"fontFamily"` + FontSize float64 `json:"fontSize"` +} + +func (et *EChartsTextStyle) ToStyle() chart.Style { + return chart.Style{ + FontSize: et.FontSize, + FontColor: parseColor(et.Color), + } +} + +type EChartsOption struct { + Type string `json:"type"` + Theme string `json:"theme"` + FontFamily string `json:"fontFamily"` + Padding EChartsPadding `json:"padding"` + Box chart.Box `json:"box"` + Width int `json:"width"` + Height int `json:"height"` + Title struct { + Text string `json:"text"` + Subtext string `json:"subtext"` + Left EChartsPosition `json:"left"` + Top EChartsPosition `json:"top"` + TextStyle EChartsTextStyle `json:"textStyle"` + SubtextStyle EChartsTextStyle `json:"subtextStyle"` + } `json:"title"` + XAxis EChartsXAxis `json:"xAxis"` + YAxis EChartsYAxis `json:"yAxis"` + Legend EChartsLegend `json:"legend"` + Series EChartsSeriesList `json:"series"` + Children []EChartsOption `json:"children"` +} + +func (eo *EChartsOption) ToOption() ChartOption { + fontFamily := eo.FontFamily + if len(fontFamily) == 0 { + fontFamily = eo.Title.TextStyle.FontFamily + } + o := ChartOption{ + Type: eo.Type, + FontFamily: fontFamily, + Theme: eo.Theme, + Title: TitleOption{ + Text: eo.Title.Text, + Subtext: eo.Title.Subtext, + Style: eo.Title.TextStyle.ToStyle(), + SubtextStyle: eo.Title.SubtextStyle.ToStyle(), + Left: string(eo.Title.Left), + Top: string(eo.Title.Top), + }, + Legend: LegendOption{ + Show: eo.Legend.Show, + Style: eo.Legend.TextStyle.ToStyle(), + Data: eo.Legend.Data, + Left: string(eo.Legend.Left), + Top: string(eo.Legend.Top), + Align: eo.Legend.Align, + Orient: eo.Legend.Orient, + }, + Width: eo.Width, + Height: eo.Height, + Padding: eo.Padding.Box, + Box: eo.Box, + SeriesList: eo.Series.ToSeriesList(), + } + if len(eo.XAxis.Data) != 0 { + xAxisData := eo.XAxis.Data[0] + o.XAxis = XAxisOption{ + BoundaryGap: xAxisData.BoundaryGap, + Data: xAxisData.Data, + SplitNumber: xAxisData.SplitNumber, + } + } + yAxisOptions := make([]YAxisOption, len(eo.YAxis.Data)) + for index, item := range eo.YAxis.Data { + yAxisOptions[index] = YAxisOption{ + Min: item.Min, + Max: item.Max, + Formatter: item.AxisLabel.Formatter, + Color: parseColor(item.AxisLine.LineStyle.Color), + } + } + + if len(eo.Children) != 0 { + o.Children = make([]ChartOption, len(eo.Children)) + for index, item := range eo.Children { + o.Children[index] = item.ToOption() + } + } + return o +} + +func renderEcharts(options, outputType string) ([]byte, error) { + o := EChartsOption{} + err := json.Unmarshal([]byte(options), &o) + if err != nil { + return nil, err + } + opt := o.ToOption() + opt.Type = outputType + d, err := Render(opt) + if err != nil { + return nil, err + } + return d.Bytes() +} + +func RenderEChartsToPNG(options string) ([]byte, error) { + return renderEcharts(options, "png") +} + +func RenderEChartsToSVG(options string) ([]byte, error) { + return renderEcharts(options, "svg") +} diff --git a/echarts_test.go b/echarts_test.go new file mode 100644 index 0000000..3cefb5a --- /dev/null +++ b/echarts_test.go @@ -0,0 +1,301 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestEChartsPosition(t *testing.T) { + assert := assert.New(t) + + var p EChartsPosition + err := p.UnmarshalJSON([]byte("12")) + assert.Nil(err) + assert.Equal("12", string(p)) + + err = p.UnmarshalJSON([]byte(`"12%"`)) + assert.Nil(err) + assert.Equal("12%", string(p)) +} + +func TestEChartsXAxis(t *testing.T) { + assert := assert.New(t) + ex := EChartsXAxis{} + err := ex.UnmarshalJSON([]byte(`{ + "boundaryGap": false, + "splitNumber": 5, + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }`)) + assert.Nil(err) + assert.Equal(EChartsXAxis{ + Data: []EChartsXAxisData{ + { + BoundaryGap: FalseFlag(), + SplitNumber: 5, + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + }, + }, + }, ex) +} + +func TestEChartsYAxis(t *testing.T) { + assert := assert.New(t) + ey := EChartsYAxis{} + + err := ey.UnmarshalJSON([]byte(`{ + "min": 1, + "max": 10, + "axisLabel": { + "formatter": "ab" + } + }`)) + assert.Nil(err) + assert.Equal(EChartsYAxis{ + Data: []EChartsYAxisData{ + { + Min: NewFloatPoint(1), + Max: NewFloatPoint(10), + AxisLabel: EChartsAxisLabel{ + Formatter: "ab", + }, + }, + }, + }, ey) + + ey = EChartsYAxis{} + err = ey.UnmarshalJSON([]byte(`[ + { + "min": 1, + "max": 10, + "axisLabel": { + "formatter": "ab" + } + }, + { + "min": 2, + "max": 20, + "axisLabel": { + "formatter": "cd" + } + } + ]`)) + assert.Nil(err) + assert.Equal(EChartsYAxis{ + Data: []EChartsYAxisData{ + { + Min: NewFloatPoint(1), + Max: NewFloatPoint(10), + AxisLabel: EChartsAxisLabel{ + Formatter: "ab", + }, + }, + { + Min: NewFloatPoint(2), + Max: NewFloatPoint(20), + AxisLabel: EChartsAxisLabel{ + Formatter: "cd", + }, + }, + }, + }, ey) +} + +func TestEChartsPadding(t *testing.T) { + assert := assert.New(t) + + ep := EChartsPadding{} + + ep.UnmarshalJSON([]byte(`10`)) + assert.Equal(EChartsPadding{ + Box: chart.Box{ + Top: 10, + Right: 10, + Bottom: 10, + Left: 10, + }, + }, ep) + + ep = EChartsPadding{} + ep.UnmarshalJSON([]byte(`[10, 20]`)) + assert.Equal(EChartsPadding{ + Box: chart.Box{ + Top: 10, + Right: 20, + Bottom: 10, + Left: 20, + }, + }, ep) + + ep = EChartsPadding{} + ep.UnmarshalJSON([]byte(`[10, 20, 30]`)) + assert.Equal(EChartsPadding{ + Box: chart.Box{ + Top: 10, + Right: 20, + Bottom: 30, + Left: 20, + }, + }, ep) + + ep = EChartsPadding{} + ep.UnmarshalJSON([]byte(`[10, 20, 30, 40]`)) + assert.Equal(EChartsPadding{ + Box: chart.Box{ + Top: 10, + Right: 20, + Bottom: 30, + Left: 40, + }, + }, ep) + +} +func TestEChartsLegend(t *testing.T) { + assert := assert.New(t) + + el := EChartsLegend{} + + err := json.Unmarshal([]byte(`{ + "data": ["a", "b", "c"], + "align": "right", + "padding": [10], + "left": "20%", + "top": 10 + }`), &el) + assert.Nil(err) + assert.Equal(EChartsLegend{ + Data: []string{ + "a", + "b", + "c", + }, + Align: "right", + Padding: EChartsPadding{ + Box: chart.Box{ + Left: 10, + Top: 10, + Right: 10, + Bottom: 10, + }, + }, + Left: EChartsPosition("20%"), + Top: EChartsPosition("10"), + }, el) +} + +func TestEChartsSeriesData(t *testing.T) { + assert := assert.New(t) + + esd := EChartsSeriesData{} + err := esd.UnmarshalJSON([]byte(`123`)) + assert.Nil(err) + assert.Equal(EChartsSeriesData{ + Value: 123, + }, esd) + + esd = EChartsSeriesData{} + err = esd.UnmarshalJSON([]byte(`{ + "value": 123.12, + "name": "test", + "itemStyle": { + "color": "#aaa" + } + }`)) + assert.Nil(err) + assert.Equal(EChartsSeriesData{ + Value: 123.12, + Name: "test", + ItemStyle: EChartStyle{ + Color: "#aaa", + }, + }, esd) +} + +func TestEChartsSeries(t *testing.T) { + assert := assert.New(t) + + esList := make([]EChartsSeries, 0) + err := json.Unmarshal([]byte(`[ + { + "name": "Email", + "data": [ + 120, + 132 + ] + }, + { + "name": "Union Ads", + "type": "bar", + "data": [ + 220, + 182 + ] + } + ]`), &esList) + assert.Nil(err) + assert.Equal([]EChartsSeries{ + { + Name: "Email", + Data: []EChartsSeriesData{ + { + Value: 120, + }, + { + Value: 132, + }, + }, + }, + { + Name: "Union Ads", + Type: "bar", + Data: []EChartsSeriesData{ + { + Value: 220, + }, + { + Value: 182, + }, + }, + }, + }, esList) +} diff --git a/line_chart.go b/line_chart.go index d2eb5e2..78790d3 100644 --- a/line_chart.go +++ b/line_chart.go @@ -85,6 +85,10 @@ func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]markPoin if !series.Label.Show { continue } + distance := series.Label.Distance + if distance == 0 { + distance = 5 + } text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(i, item.Value, -1) labelStyle := chart.Style{ FontColor: theme.GetTextColor(), @@ -96,7 +100,7 @@ func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]markPoin } labelStyle.GetTextOptions().WriteToRenderer(r) textBox := r.MeasureText(text) - d.text(text, x-textBox.Width()>>1, y-5) + d.text(text, x-textBox.Width()>>1, y-distance) } dotFillColor := drawing.ColorWhite diff --git a/series.go b/series.go index e5d9bd8..8a9ba73 100644 --- a/series.go +++ b/series.go @@ -68,6 +68,8 @@ type SeriesLabel struct { Color drawing.Color // Show flag for label Show bool + // Distance to the host graphic element. + Distance int } const ( diff --git a/util.go b/util.go index 03aad20..2adaba8 100644 --- a/util.go +++ b/util.go @@ -23,11 +23,13 @@ package charts import ( + "regexp" "strconv" "strings" "github.com/dustin/go-humanize" "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" ) func TrueFlag() *bool { @@ -130,3 +132,39 @@ func commafWithDigits(value float64) string { } return humanize.CommafWithDigits(value, decimals) } + +func parseColor(color string) drawing.Color { + c := drawing.Color{} + if color == "" { + return c + } + if strings.HasPrefix(color, "#") { + return drawing.ColorFromHex(color[1:]) + } + reg := regexp.MustCompile(`\((\S+)\)`) + result := reg.FindAllStringSubmatch(color, 1) + if len(result) == 0 || len(result[0]) != 2 { + return c + } + arr := strings.Split(result[0][1], ",") + if len(arr) < 3 { + return c + } + // 设置默认为255 + c.A = 255 + for index, v := range arr { + value, _ := strconv.Atoi(strings.TrimSpace(v)) + ui8 := uint8(value) + switch index { + case 0: + c.R = ui8 + case 1: + c.G = ui8 + case 2: + c.B = ui8 + default: + c.A = ui8 + } + } + return c +} diff --git a/util_test.go b/util_test.go index 7c70447..dc5d98e 100644 --- a/util_test.go +++ b/util_test.go @@ -27,6 +27,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" ) func TestGetDefaultInt(t *testing.T) { @@ -139,3 +140,42 @@ func TestConvertPercent(t *testing.T) { assert.Equal(-1.0, convertPercent("a%")) assert.Equal(0.1, convertPercent("10%")) } + +func TestParseColor(t *testing.T) { + assert := assert.New(t) + + c := parseColor("") + assert.True(c.IsZero()) + + c = parseColor("#333") + assert.Equal(drawing.Color{ + R: 51, + G: 51, + B: 51, + A: 255, + }, c) + + c = parseColor("#313233") + assert.Equal(drawing.Color{ + R: 49, + G: 50, + B: 51, + A: 255, + }, c) + + c = parseColor("rgb(31,32,33)") + assert.Equal(drawing.Color{ + R: 31, + G: 32, + B: 33, + A: 255, + }, c) + + c = parseColor("rgba(50,51,52,250)") + assert.Equal(drawing.Color{ + R: 50, + G: 51, + B: 52, + A: 250, + }, c) +} From c15fec21ad3b2c5a05c30b75b410cfeb38708aae Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 17 Feb 2022 22:53:12 +0800 Subject: [PATCH 086/251] test: add test for echart --- bar_chart.go | 8 +- bar_chart_test.go | 2 - chart.go | 5 + chart_test.go | 226 ++++++++++ draw.go | 2 +- echarts.go | 60 ++- echarts_test.go | 258 +++++++++++ examples/demo/main.go | 998 ++++++++++++++++++++++++++++++++++++++++-- legend_test.go | 2 - mark_point_test.go | 2 - 10 files changed, 1516 insertions(+), 47 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index f291d78..e008baf 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -54,7 +54,10 @@ func barChartRender(opt barChartOption, result *basicRenderResult) ([]markPointR margin := 10 // 每一个bar之间的margin barMargin := 5 - if width < 50 { + if width < 20 { + margin = 2 + barMargin = 2 + } else if width < 50 { margin = 5 barMargin = 3 } @@ -95,6 +98,9 @@ func barChartRender(opt barChartOption, result *basicRenderResult) ([]markPointR }) divideValues := xRange.AutoDivide() for j, item := range series.Data { + if j >= len(divideValues) { + continue + } x := divideValues[j] x += margin if i != 0 { diff --git a/bar_chart_test.go b/bar_chart_test.go index 2351e1a..f10a1bc 100644 --- a/bar_chart_test.go +++ b/bar_chart_test.go @@ -23,7 +23,6 @@ package charts import ( - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -128,6 +127,5 @@ func TestBarChartRender(t *testing.T) { data, err := d.Bytes() assert.Nil(err) - fmt.Println(string(data)) assert.Equal("\\n20206090", string(data)) } diff --git a/chart.go b/chart.go index c211a6d..5178b04 100644 --- a/chart.go +++ b/chart.go @@ -38,6 +38,11 @@ const ( ChartTypePie = "pie" ) +const ( + ChartOutputSVG = "svg" + ChartOutputPNG = "png" +) + type Point struct { X int Y int diff --git a/chart_test.go b/chart_test.go index ee768ec..4fc3d20 100644 --- a/chart_test.go +++ b/chart_test.go @@ -23,6 +23,7 @@ package charts import ( + "errors" "testing" "github.com/stretchr/testify/assert" @@ -276,3 +277,228 @@ func TestChartRender(t *testing.T) { assert.Nil(err) assert.Equal("\\n2012201320142015201620170153045607590Milk TeaMatcha LatteCheese CocoaWalnut BrownieMilk Tea: 34.03%Matcha Latte: 27.66%Cheese Cocoa: 22.32%Walnut Brownie: 15.96%", string(data)) } + +func BenchmarkMultiChartPNGRender(b *testing.B) { + for i := 0; i < b.N; i++ { + opt := ChartOption{ + Type: ChartOutputPNG, + Legend: LegendOption{ + Top: "-90", + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Padding: chart.Box{ + Top: 100, + Right: 10, + Bottom: 10, + Left: 10, + }, + XAxis: NewXAxisOption([]string{ + "2012", + "2013", + "2014", + "2015", + "2016", + "2017", + }), + YAxisList: []YAxisOption{ + { + + Min: NewFloatPoint(0), + Max: NewFloatPoint(90), + }, + }, + SeriesList: []Series{ + NewSeriesFromValues([]float64{ + 56.5, + 82.1, + 88.7, + 70.1, + 53.4, + 85.1, + }), + NewSeriesFromValues([]float64{ + 51.1, + 51.4, + 55.1, + 53.3, + 73.8, + 68.7, + }), + NewSeriesFromValues([]float64{ + 40.1, + 62.2, + 69.5, + 36.4, + 45.2, + 32.5, + }, ChartTypeBar), + NewSeriesFromValues([]float64{ + 25.2, + 37.1, + 41.2, + 18, + 33.9, + 49.1, + }, ChartTypeBar), + }, + Children: []ChartOption{ + { + Legend: LegendOption{ + Show: FalseFlag(), + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Box: chart.Box{ + Top: 20, + Left: 400, + Right: 500, + Bottom: 120, + }, + SeriesList: NewPieSeriesList([]float64{ + 435.9, + 354.3, + 285.9, + 204.5, + }, PieSeriesOption{ + Label: SeriesLabel{ + Show: true, + }, + Radius: "35%", + }), + }, + }, + } + d, err := Render(opt) + if err != nil { + panic(err) + } + buf, err := d.Bytes() + if err != nil { + panic(err) + } + if len(buf) == 0 { + panic(errors.New("data is nil")) + } + } +} + +func BenchmarkMultiChartSVGRender(b *testing.B) { + for i := 0; i < b.N; i++ { + opt := ChartOption{ + Legend: LegendOption{ + Top: "-90", + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Padding: chart.Box{ + Top: 100, + Right: 10, + Bottom: 10, + Left: 10, + }, + XAxis: NewXAxisOption([]string{ + "2012", + "2013", + "2014", + "2015", + "2016", + "2017", + }), + YAxisList: []YAxisOption{ + { + + Min: NewFloatPoint(0), + Max: NewFloatPoint(90), + }, + }, + SeriesList: []Series{ + NewSeriesFromValues([]float64{ + 56.5, + 82.1, + 88.7, + 70.1, + 53.4, + 85.1, + }), + NewSeriesFromValues([]float64{ + 51.1, + 51.4, + 55.1, + 53.3, + 73.8, + 68.7, + }), + NewSeriesFromValues([]float64{ + 40.1, + 62.2, + 69.5, + 36.4, + 45.2, + 32.5, + }, ChartTypeBar), + NewSeriesFromValues([]float64{ + 25.2, + 37.1, + 41.2, + 18, + 33.9, + 49.1, + }, ChartTypeBar), + }, + Children: []ChartOption{ + { + Legend: LegendOption{ + Show: FalseFlag(), + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Box: chart.Box{ + Top: 20, + Left: 400, + Right: 500, + Bottom: 120, + }, + SeriesList: NewPieSeriesList([]float64{ + 435.9, + 354.3, + 285.9, + 204.5, + }, PieSeriesOption{ + Label: SeriesLabel{ + Show: true, + }, + Radius: "35%", + }), + }, + }, + } + d, err := Render(opt) + if err != nil { + panic(err) + } + buf, err := d.Bytes() + if err != nil { + panic(err) + } + if len(buf) == 0 { + panic(errors.New("data is nil")) + } + } +} diff --git a/draw.go b/draw.go index 228f622..bc3d9e8 100644 --- a/draw.go +++ b/draw.go @@ -114,7 +114,7 @@ func NewDraw(opt DrawOption, opts ...Option) (*Draw, error) { // 创建render if d.parent == nil { fn := chart.SVG - if opt.Type == "png" { + if opt.Type == ChartOutputPNG { fn = chart.PNG } r, err := fn(d.Box.Right, d.Box.Bottom) diff --git a/echarts.go b/echarts.go index 9232ed7..dc2e761 100644 --- a/echarts.go +++ b/echarts.go @@ -76,12 +76,14 @@ type EChartsSeriesData struct { } type _EChartsSeriesData EChartsSeriesData +var numericRep = regexp.MustCompile("^[-+]?[0-9]+(?:\\.[0-9]+)?$") + func (es *EChartsSeriesData) UnmarshalJSON(data []byte) error { data = bytes.TrimSpace(data) if len(data) == 0 { return nil } - if regexp.MustCompile(`^\d+`).Match(data) { + if numericRep.Match(data) { v, err := strconv.ParseFloat(string(data), 64) if err != nil { return err @@ -215,16 +217,20 @@ type EChartsMarkPoint struct { } func (emp *EChartsMarkPoint) ToSeriesMarkPoint() SeriesMarkPoint { + sp := SeriesMarkPoint{ + SymbolSize: emp.SymbolSize, + } + if len(emp.Data) == 0 { + return sp + } data := make([]SeriesMarkData, len(emp.Data)) for index, item := range emp.Data { data[index] = SeriesMarkData{ Type: item.Type, } } - return SeriesMarkPoint{ - Data: data, - SymbolSize: emp.SymbolSize, - } + sp.Data = data + return sp } type EChartsMarkLine struct { @@ -234,15 +240,18 @@ type EChartsMarkLine struct { } func (eml *EChartsMarkLine) ToSeriesMarkLine() SeriesMarkLine { + sl := SeriesMarkLine{} + if len(eml.Data) == 0 { + return sl + } data := make([]SeriesMarkData, len(eml.Data)) for index, item := range eml.Data { data[index] = SeriesMarkData{ Type: item.Type, } } - return SeriesMarkLine{ - Data: data, - } + sl.Data = data + return sl } type EChartsSeries struct { @@ -260,8 +269,27 @@ type EChartsSeries struct { type EChartsSeriesList []EChartsSeries func (esList EChartsSeriesList) ToSeriesList() SeriesList { - seriesList := make(SeriesList, len(esList)) - for index, item := range esList { + seriesList := make(SeriesList, 0, len(esList)) + for _, item := range esList { + // 如果是pie,则每个子荐生成一个series + if item.Type == ChartTypePie { + for _, dataItem := range item.Data { + seriesList = append(seriesList, Series{ + Type: ChartTypePie, + Name: dataItem.Name, + Label: SeriesLabel{ + Show: true, + }, + Radius: item.Radius, + Data: []SeriesData{ + { + Value: dataItem.Value, + }, + }, + }) + } + continue + } data := make([]SeriesData, len(item.Data)) for j, dataItem := range item.Data { data[j] = SeriesData{ @@ -269,7 +297,7 @@ func (esList EChartsSeriesList) ToSeriesList() SeriesList { Style: dataItem.ItemStyle.ToStyle(), } } - seriesList[index] = Series{ + seriesList = append(seriesList, Series{ Type: item.Type, Data: data, YAxisIndex: item.YAxisIndex, @@ -280,10 +308,9 @@ func (esList EChartsSeriesList) ToSeriesList() SeriesList { Distance: item.Label.Distance, }, Name: item.Name, - Radius: item.Radius, MarkPoint: item.MarkPoint.ToSeriesMarkPoint(), MarkLine: item.MarkLine.ToSeriesMarkLine(), - } + }) } return seriesList } @@ -295,10 +322,14 @@ type EChartsTextStyle struct { } func (et *EChartsTextStyle) ToStyle() chart.Style { - return chart.Style{ + s := chart.Style{ FontSize: et.FontSize, FontColor: parseColor(et.Color), } + if et.FontFamily != "" { + s.Font, _ = GetFont(et.FontFamily) + } + return s } type EChartsOption struct { @@ -373,6 +404,7 @@ func (eo *EChartsOption) ToOption() ChartOption { Color: parseColor(item.AxisLine.LineStyle.Color), } } + o.YAxisList = yAxisOptions if len(eo.Children) != 0 { o.Children = make([]ChartOption, len(eo.Children)) diff --git a/echarts_test.go b/echarts_test.go index 3cefb5a..d80ecbb 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -28,6 +28,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" ) func TestEChartsPosition(t *testing.T) { @@ -42,6 +43,24 @@ func TestEChartsPosition(t *testing.T) { assert.Nil(err) assert.Equal("12%", string(p)) } +func TestEChartStyle(t *testing.T) { + assert := assert.New(t) + + s := EChartStyle{ + Color: "#aaa", + } + r := drawing.Color{ + R: 170, + G: 170, + B: 170, + A: 255, + } + assert.Equal(chart.Style{ + FillColor: r, + FontColor: r, + StrokeColor: r, + }, s.ToStyle()) +} func TestEChartsXAxis(t *testing.T) { assert := assert.New(t) @@ -299,3 +318,242 @@ func TestEChartsSeries(t *testing.T) { }, }, esList) } + +func TestEChartsMarkPoint(t *testing.T) { + assert := assert.New(t) + + p := EChartsMarkPoint{} + + err := json.Unmarshal([]byte(`{ + "symbolSize": 30, + "data": [ + { + "type": "max" + }, + { + "type": "min" + } + ] + }`), &p) + assert.Nil(err) + assert.Equal(SeriesMarkPoint{ + SymbolSize: 30, + Data: []SeriesMarkData{ + { + Type: "max", + }, + { + Type: "min", + }, + }, + }, p.ToSeriesMarkPoint()) +} + +func TestEChartsMarkLine(t *testing.T) { + assert := assert.New(t) + l := EChartsMarkLine{} + + err := json.Unmarshal([]byte(`{ + "data": [ + { + "type": "max" + }, + { + "type": "min" + } + ] + }`), &l) + assert.Nil(err) + assert.Equal(SeriesMarkLine{ + Data: []SeriesMarkData{ + { + Type: "max", + }, + { + Type: "min", + }, + }, + }, l.ToSeriesMarkLine()) +} + +func TestEChartsTextStyle(t *testing.T) { + assert := assert.New(t) + + s := EChartsTextStyle{ + Color: "#aaa", + FontFamily: "test", + FontSize: 14, + } + assert.Equal(chart.Style{ + FontColor: drawing.Color{ + R: 170, + G: 170, + B: 170, + A: 255, + }, + FontSize: 14, + }, s.ToStyle()) +} + +func TestEChartsSeriesList(t *testing.T) { + assert := assert.New(t) + + // pie + es := EChartsSeriesList{ + { + Type: ChartTypePie, + Radius: "30%", + Data: []EChartsSeriesData{ + { + Name: "1", + Value: 1, + }, + { + Name: "2", + Value: 2, + }, + }, + }, + } + assert.Equal(SeriesList{ + { + Type: ChartTypePie, + Name: "1", + Label: SeriesLabel{ + Show: true, + }, + Radius: "30%", + Data: []SeriesData{ + { + Value: 1, + }, + }, + }, + { + Type: ChartTypePie, + Name: "2", + Label: SeriesLabel{ + Show: true, + }, + Radius: "30%", + Data: []SeriesData{ + { + Value: 2, + }, + }, + }, + }, es.ToSeriesList()) + + es = EChartsSeriesList{ + { + Type: ChartTypeBar, + Data: []EChartsSeriesData{ + { + Value: 1, + ItemStyle: EChartStyle{ + Color: "#aaa", + }, + }, + { + Value: 2, + }, + }, + YAxisIndex: 1, + }, + { + Data: []EChartsSeriesData{ + { + Value: 3, + }, + { + Value: 4, + }, + }, + ItemStyle: EChartStyle{ + Color: "#ccc", + }, + Label: EChartsLabelOption{ + Color: "#ddd", + Show: true, + Distance: 5, + }, + }, + } + assert.Equal(SeriesList{ + { + Type: ChartTypeBar, + Data: []SeriesData{ + { + Value: 1, + Style: chart.Style{ + FontColor: drawing.Color{ + R: 170, + G: 170, + B: 170, + A: 255, + }, + StrokeColor: drawing.Color{ + R: 170, + G: 170, + B: 170, + A: 255, + }, + FillColor: drawing.Color{ + R: 170, + G: 170, + B: 170, + A: 255, + }, + }, + }, + { + Value: 2, + }, + }, + YAxisIndex: 1, + }, + { + Data: []SeriesData{ + { + Value: 3, + }, + { + Value: 4, + }, + }, + Style: chart.Style{ + FontColor: drawing.Color{ + R: 204, + G: 204, + B: 204, + A: 255, + }, + StrokeColor: drawing.Color{ + R: 204, + G: 204, + B: 204, + A: 255, + }, + FillColor: drawing.Color{ + R: 204, + G: 204, + B: 204, + A: 255, + }, + }, + Label: SeriesLabel{ + Color: drawing.Color{ + R: 221, + G: 221, + B: 221, + A: 255, + }, + Show: true, + Distance: 5, + }, + MarkPoint: SeriesMarkPoint{}, + MarkLine: SeriesMarkLine{}, + }, + }, es.ToSeriesList()) + +} diff --git a/examples/demo/main.go b/examples/demo/main.go index 7916b4d..4ab6b04 100644 --- a/examples/demo/main.go +++ b/examples/demo/main.go @@ -62,8 +62,9 @@ var html = ` ` -func indexHandler(w http.ResponseWriter, req *http.Request) { - if req.URL.Path != "/" { +func handler(w http.ResponseWriter, req *http.Request, chartOptions []charts.ChartOption, echartsOptions []string) { + if req.URL.Path != "/" && + req.URL.Path != "/echarts" { return } query := req.URL.Query() @@ -72,10 +73,36 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { height, _ := strconv.Atoi(query.Get("height")) charts.SetDefaultWidth(width) charts.SetDefaultWidth(height) + bytesList := make([][]byte, 0) + for _, opt := range chartOptions { + opt.Theme = theme + d, err := charts.Render(opt) + if err != nil { + panic(err) + } + buf, err := d.Bytes() + if err != nil { + panic(err) + } + bytesList = append(bytesList, buf) + } + for _, opt := range echartsOptions { + buf, err := charts.RenderEChartsToSVG(opt) + if err != nil { + panic(err) + } + bytesList = append(bytesList, buf) + } + + data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), bytes.Join(bytesList, []byte(""))) + w.Header().Set("Content-Type", "text/html") + w.Write(data) +} + +func indexHandler(w http.ResponseWriter, req *http.Request) { chartOptions := []charts.ChartOption{ // 普通折线图 { - Theme: theme, Title: charts.TitleOption{ Text: "Line", }, @@ -145,7 +172,6 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, // 温度折线图 { - Theme: theme, Title: charts.TitleOption{ Text: "Temperature Change in the Coming Week", }, @@ -198,7 +224,6 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, // 柱状图 { - Theme: theme, Title: charts.TitleOption{ Text: "Bar", }, @@ -263,7 +288,6 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, // 柱状图+mark { - Theme: theme, Title: charts.TitleOption{ Text: "Rainfall vs Evaporation", Subtext: "Fake Data", @@ -345,7 +369,6 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, // 双Y轴示例 { - Theme: theme, XAxis: charts.NewXAxisOption([]string{ "Jan", "Feb", @@ -442,7 +465,6 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, // 饼图 { - Theme: theme, Title: charts.TitleOption{ Text: "Referer of a Website", Subtext: "Fake Data", @@ -474,7 +496,6 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, // 多图展示 { - Theme: theme, Legend: charts.LegendOption{ Top: "-90", Data: []string{ @@ -485,7 +506,10 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, }, Padding: chart.Box{ - Top: 100, + Top: 100, + Right: 10, + Bottom: 10, + Left: 10, }, XAxis: charts.NewXAxisOption([]string{ "2012", @@ -568,25 +592,949 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, }, } - bytesList := make([][]byte, 0) - for _, opt := range chartOptions { - d, err := charts.Render(opt) - if err != nil { - panic(err) - } - buf, err := d.Bytes() - if err != nil { - panic(err) - } - bytesList = append(bytesList, buf) - } - data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), bytes.Join(bytesList, []byte(""))) - w.Header().Set("Content-Type", "text/html") - w.Write(data) + handler(w, req, chartOptions, nil) +} +func echartsHandler(w http.ResponseWriter, req *http.Request) { + echartsOptions := []string{ + `{ + "xAxis": { + "type": "category", + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }, + "yAxis": { + "type": "value" + }, + "series": [ + { + "data": [ + 150, + 230, + 224, + 218, + 135, + 147, + 260 + ], + "type": "line" + } + ] + }`, + `{ + "title": { + "text": "Multiple Line" + }, + "tooltip": { + "trigger": "axis" + }, + "legend": { + "left": "right", + "data": [ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine" + ] + }, + "grid": { + "left": "3%", + "right": "4%", + "bottom": "3%", + "containLabel": true + }, + "toolbox": { + "feature": { + "saveAsImage": {} + } + }, + "xAxis": { + "type": "category", + "boundaryGap": false, + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }, + "yAxis": { + "type": "value" + }, + "series": [ + { + "name": "Email", + "type": "line", + "data": [ + 120, + 132, + 101, + 134, + 90, + 230, + 210 + ] + }, + { + "name": "Union Ads", + "type": "line", + "data": [ + 220, + 182, + 191, + 234, + 290, + 330, + 310 + ] + }, + { + "name": "Video Ads", + "type": "line", + "data": [ + 150, + 232, + 201, + 154, + 190, + 330, + 410 + ] + }, + { + "name": "Direct", + "type": "line", + "data": [ + 320, + 332, + 301, + 334, + 390, + 330, + 320 + ] + }, + { + "name": "Search Engine", + "type": "line", + "data": [ + 820, + 932, + 901, + 934, + 1290, + 1330, + 1320 + ] + } + ] + }`, + `{ + "title": { + "text": "Temperature Change in the Coming Week" + }, + "legend": { + "left": "right" + }, + "padding": [10, 30, 10, 10], + "xAxis": { + "type": "category", + "boundaryGap": false, + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }, + "yAxis": { + "axisLabel": { + "formatter": "{value} °C" + } + }, + "series": [ + { + "name": "Highest", + "type": "line", + "data": [ + 10, + 11, + 13, + 11, + 12, + 12, + 9 + ], + "markPoint": { + "data": [ + { + "type": "max" + }, + { + "type": "min" + } + ] + }, + "markLine": { + "data": [ + { + "type": "average" + } + ] + } + }, + { + "name": "Lowest", + "type": "line", + "data": [ + 1, + -2, + 2, + 5, + 3, + 2, + 0 + ], + "markPoint": { + "data": [ + { + "type": "min" + } + ] + }, + "markLine": { + "data": [ + { + "type": "average" + }, + { + "type": "max" + } + ] + } + } + ] + }`, + `{ + "xAxis": { + "type": "category", + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }, + "yAxis": { + "type": "value" + }, + "series": [ + { + "data": [ + 120, + 200, + 150, + 80, + 70, + 110, + 130 + ], + "type": "bar" + } + ] + }`, + `{ + "xAxis": { + "type": "category", + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }, + "yAxis": { + "type": "value" + }, + "series": [ + { + "data": [ + 120, + { + "value": 200, + "itemStyle": { + "color": "#a90000" + } + }, + 150, + 80, + 70, + 110, + 130 + ], + "type": "bar" + } + ] + }`, + `{ + "title": { + "text": "Rainfall vs Evaporation", + "subtext": "Fake Data" + }, + "legend": { + "data": [ + "Rainfall", + "Evaporation" + ] + }, + "padding": [10, 30, 10, 10], + "xAxis": [ + { + "type": "category", + "data": [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ] + } + ], + "series": [ + { + "name": "Rainfall", + "type": "bar", + "data": [ + 2, + 4.9, + 7, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20, + 6.4, + 3.3 + ], + "markPoint": { + "data": [ + { + "type": "max" + }, + { + "type": "min" + } + ] + }, + "markLine": { + "data": [ + { + "type": "average" + } + ] + } + }, + { + "name": "Evaporation", + "type": "bar", + "data": [ + 2.6, + 5.9, + 9, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6, + 2.3 + ], + "markPoint": { + "data": [ + { + "type": "max" + }, + { + "type": "min" + } + ] + }, + "markLine": { + "data": [ + { + "type": "average" + } + ] + } + } + ] + }`, + `{ + "legend": { + "data": [ + "Evaporation", + "Precipitation", + "Temperature" + ] + }, + "xAxis": [ + { + "type": "category", + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ], + "axisPointer": { + "type": "shadow" + } + } + ], + "yAxis": [ + { + "type": "value", + "name": "Precipitation", + "min": 0, + "max": 240, + "axisLabel": { + "formatter": "{value} ml" + } + }, + { + "type": "value", + "name": "Temperature", + "min": 0, + "max": 24, + "axisLabel": { + "formatter": "{value} °C" + } + } + ], + "series": [ + { + "name": "Evaporation", + "type": "bar", + "tooltip": {}, + "data": [ + 2, + 4.9, + 7, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20, + 6.4, + 3.3 + ] + }, + { + "name": "Precipitation", + "type": "bar", + "tooltip": {}, + "data": [ + 2.6, + 5.9, + 9, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6, + 2.3 + ] + }, + { + "name": "Temperature", + "type": "line", + "yAxisIndex": 1, + "tooltip": {}, + "data": [ + 2, + 2.2, + 3.3, + 4.5, + 6.3, + 10.2, + 20.3, + 23.4, + 23, + 16.5, + 12, + 6.2 + ] + } + ] + }`, + `{ + "tooltip": { + "trigger": "axis", + "axisPointer": { + "type": "cross" + } + }, + "grid": { + "right": "20%" + }, + "toolbox": { + "feature": { + "dataView": { + "show": true, + "readOnly": false + }, + "restore": { + "show": true + }, + "saveAsImage": { + "show": true + } + } + }, + "legend": { + "data": [ + "Evaporation", + "Precipitation", + "Temperature" + ] + }, + "xAxis": [ + { + "type": "category", + "axisTick": { + "alignWithLabel": true + }, + "data": [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ] + } + ], + "yAxis": [ + { + "type": "value", + "name": "温度", + "position": "left", + "alignTicks": true, + "axisLine": { + "show": true, + "lineStyle": { + "color": "#EE6666" + } + }, + "axisLabel": { + "formatter": "{value} °C" + } + }, + { + "type": "value", + "name": "Evaporation", + "position": "right", + "alignTicks": true, + "axisLine": { + "show": true, + "lineStyle": { + "color": "#5470C6" + } + }, + "axisLabel": { + "formatter": "{value} ml" + } + } + ], + "series": [ + { + "name": "Evaporation", + "type": "bar", + "yAxisIndex": 1, + "data": [ + 2, + 4.9, + 7, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20, + 6.4, + 3.3 + ] + }, + { + "name": "Precipitation", + "type": "bar", + "yAxisIndex": 1, + "data": [ + 2.6, + 5.9, + 9, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6, + 2.3 + ] + }, + { + "name": "Temperature", + "type": "line", + "data": [ + 2, + 2.2, + 3.3, + 4.5, + 6.3, + 10.2, + 20.3, + 23.4, + 23, + 16.5, + 12, + 6.2 + ] + } + ] + }`, + `{ + "title": { + "text": "Referer of a Website", + "subtext": "Fake Data", + "left": "center" + }, + "tooltip": { + "trigger": "item" + }, + "legend": { + "orient": "vertical", + "left": "left" + }, + "series": [ + { + "name": "Access From", + "type": "pie", + "radius": "50%", + "data": [ + { + "value": 1048, + "name": "Search Engine" + }, + { + "value": 735, + "name": "Direct" + }, + { + "value": 580, + "name": "Email" + }, + { + "value": 484, + "name": "Union Ads" + }, + { + "value": 300, + "name": "Video Ads" + } + ] + } + ] + }`, + `{ + "title": { + "text": "Rainfall" + }, + "padding": [10, 10, 10, 30], + "legend": { + "data": [ + "GZ", + "SH" + ] + }, + "xAxis": { + "type": "category", + "splitNumber": 6, + "data": [ + "01-01", + "01-02", + "01-03", + "01-04", + "01-05", + "01-06", + "01-07", + "01-08", + "01-09", + "01-10", + "01-11", + "01-12", + "01-13", + "01-14", + "01-15", + "01-16", + "01-17", + "01-18", + "01-19", + "01-20", + "01-21", + "01-22", + "01-23", + "01-24", + "01-25", + "01-26", + "01-27", + "01-28", + "01-29", + "01-30", + "01-31" + ] + }, + "yAxis": { + "axisLabel": { + "formatter": "{value} mm" + } + }, + "series": [ + { + "type": "bar", + "data": [ + 928, + 821, + 889, + 600, + 547, + 783, + 197, + 853, + 430, + 346, + 63, + 465, + 309, + 334, + 141, + 538, + 792, + 58, + 922, + 807, + 298, + 243, + 744, + 885, + 812, + 231, + 330, + 220, + 984, + 221, + 429 + ] + }, + { + "type": "bar", + "data": [ + 749, + 201, + 296, + 579, + 255, + 159, + 902, + 246, + 149, + 158, + 507, + 776, + 186, + 79, + 390, + 222, + 601, + 367, + 221, + 411, + 714, + 620, + 966, + 73, + 203, + 631, + 833, + 610, + 487, + 677, + 596 + ] + } + ] + }`, + `{ + "legend": { + "top": "-140", + "data": [ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie" + ] + }, + "padding": [ + 150, + 10, + 10, + 10 + ], + "xAxis": [ + { + "data": [ + "2012", + "2013", + "2014", + "2015", + "2016", + "2017" + ] + } + ], + "series": [ + { + "data": [ + 56.5, + 82.1, + 88.7, + 70.1, + 53.4, + 85.1 + ] + }, + { + "data": [ + 51.1, + 51.4, + 55.1, + 53.3, + 73.8, + 68.7 + ] + }, + { + "data": [ + 40.1, + 62.2, + 69.5, + 36.4, + 45.2, + 32.5 + ] + }, + { + "data": [ + 25.2, + 37.1, + 41.2, + 18, + 33.9, + 49.1 + ] + } + ], + "children": [ + { + "box": { + "left": 0, + "top": 30, + "right": 600, + "bottom": 150 + }, + "legend": { + "show": false + }, + "series": [ + { + "type": "pie", + "radius": "50%", + "data": [ + { + "value": 435.9, + "name": "Milk Tea" + }, + { + "value": 354.3, + "name": "Matcha Latte" + }, + { + "value": 285.9, + "name": "Cheese Cocoa" + }, + { + "value": 204.5, + "name": "Walnut Brownie" + } + ] + } + ] + } + ] + }`, + } + handler(w, req, nil, echartsOptions) } func main() { http.HandleFunc("/", indexHandler) + http.HandleFunc("/echarts", echartsHandler) http.ListenAndServe(":3012", nil) } diff --git a/legend_test.go b/legend_test.go index 2dc286f..c5d7e50 100644 --- a/legend_test.go +++ b/legend_test.go @@ -23,7 +23,6 @@ package charts import ( - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -179,7 +178,6 @@ func TestLegendRender(t *testing.T) { assert.Nil(err) assert.Equal(tt.box, b) data, err := d.Bytes() - fmt.Println(string(data)) assert.Nil(err) assert.NotEmpty(data) assert.Equal(tt.result, string(data)) diff --git a/mark_point_test.go b/mark_point_test.go index 2092bcf..2cd8fdd 100644 --- a/mark_point_test.go +++ b/mark_point_test.go @@ -23,7 +23,6 @@ package charts import ( - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -100,6 +99,5 @@ func TestMarkPointRender(t *testing.T) { }) data, err := d.Bytes() assert.Nil(err) - fmt.Println(string(data)) assert.Equal("\\n51", string(data)) } From 9cc2b9fadd1ea7c55e51b1cb4f035064ab3595c2 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 18 Feb 2022 23:12:31 +0800 Subject: [PATCH 087/251] refactor: support more color palette --- assets/go-charts.png | Bin 329311 -> 227978 bytes assets/go-line-chart.png | Bin 0 -> 40531 bytes examples/demo/main.go | 1 - theme.go | 242 ++++++++++++++++++++++++--------------- theme_test.go | 65 ----------- 5 files changed, 148 insertions(+), 160 deletions(-) create mode 100644 assets/go-line-chart.png diff --git a/assets/go-charts.png b/assets/go-charts.png index f556abf096397decba0a7d667e8c26f66a44d806..12d0cad34bb68d2d7ad9855cf156d7bea93724db 100644 GIT binary patch literal 227978 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⁡aY7)5Rv3ZNK-Ps?GK;)yV-c6UTy#i)4Bfh^5*)XfxWDyoubYh2w z7lWLbj4JTiJ+n?@ESKfCtm>eR7S0W!Z3;?!r*P*#bXhB%pKCY2ZMB{%^i(UG#2;Kh zCPt)Hw_)`g+kP^l-FiwK%U%6tDa$BxEsEiCwErvRSuR!C+;c$FmSX9KpDS%p)h~*4RHs@z_*l<}2Di!EjM769n?Jg(yLprU# z_S@8SreEN{ef_@nI)*2uq=+xxWfUP}>3*Zvoj`-I?N#rRrWBjatkpHnmF@Cf!W$Qq z(4~|2nk3n>SI5_c2lIhNu_oDQ!Hpth93np|tu3`PVQvtmggsiOqN^0qFaggI0T5o< zv$f^*d8Jt$zJC zbn53C0cjpiO3Tf2$aI=Nn=%OU8X7RZzP@Q`X>sy|ikY%q82~CyPR^xfOAHzs8vZu> zT?j=*MgBII^NhWq(VA>>27cqb*ACPe{Pq~sAsZ?V_k@yy&03#p;f|DNleBN=*@%uM z3>?oB15RW1M@uEZMJd8p-Se_hUgKUO47}%VEyzJo;DJ$lR=OgECT(SsEh?>Gcr8j4 zlSA9^0~8Df)XW-DJyJe7&7n<-SZ-eAt_WC5`#w3A_%BD6+W$0d_z|CciE$dnY$~DY z<@L2RIj2=3wy`vN8b87&o2%FNJDp;(<5wjVCv?6E(Z!l zoG%Ht#9Tpm3@nKMb=l^?9XK?+9C5Q+!ilyHHL%}S#g;U7X7Rb^_7csE=$+|aKf#D( z`bF#AQ_Q9ltj_5ZJ}}y8MCfykPM#JAdkyglV`^%OPTAYPy86N{SX@#9k&~0N78@M# z&FU8+YPaHoLb@4K#`{)}h=+C7G!$rK{}Q!U?ZB+9D13qk{{mJ`>2sb%Hgef;utR|P z#_aKtiXGYY2OLql0a@1hy9`*n(V_-}klndviD89RHZeWuBv)ZwjKwsz&o;~)$9^I2 zS1H&8zr;Q_rdvh4VuYnQmzsY)BUdn+-=38|vA^U+vs8cxXx^A&zH~X5yr@1RKtYid6q!bVdp%|sG|mcvz~}LR)7I7w zmOq}V!F%7;eFq2i^$=1=H3dsrm<)9K+C4ST!C?skZ_~jjTPZsimQN|C9N`bH`4Gm$ zl)a$)iFiSST^fyOB#-Vs&Z3potDv^g`tetZ?B8@cUb|s>rrbm_WygVr5q1}%Fzq4r z#!*@pRjQ#1T@bbqvrN5bm!%J$_$vIWj4d&1aKnC?t{l=S;J`!mZ$pc5nE8IThOJ0$ z7vY2D)DmrPN@O`A=re8u&)#orrDr-@$dW|yyp9Rjo3(jKJC{DDGXfzkyGoC^(ZIk` zP72D}H;R0R(*@ec$H&h;!8B%51kh}yCG3mS(@0QXeL+!?Fl8`IHdxOKWU9`rOPaXA zw(tr0@qL)NMcsyZl^w9)%l)1x-SK&x`iq$ zx@KJk>&=d)=*etc(Z|9W7mY--$?G~wO&_r?Q!O72y}28cZqaOxSLy(owZY^kcSrNq zp`?Y(KTz$K3RUpX$g)WMrTfn|vy7(4PW3*UdEJkDf*l`C+ohAWMT0}CEiHHquE4B= zpa{V~8P&7F86F?8C{(4BS;m$y?LGs81BQ{Q7=uyx(Oj+hr=YIP+UGi6>o?hyjgC+K~ugzV|A%)5Mg?!4v z4JI|3-tNlj8{MWXaFVb+Opfl*gPj(38%9(W+5x=t_DAHZV!uqV`1Yj~CLMgp=5ngT zS1rGj3{jTQ2WWr;BC+CcZzm^~+26mvl$V#cc|OohDt$#BqUk)|r`cKnu@X*<;4DDT_MS4!m%ZAzZYVedIQl1Gc zBKLH@^oix<5|s+=(#*sJ0S5=iYN^g23l%4nR4Qfb&qyMN@Afw*XAr=F$U0xp%%Wh& zhg7)329Uf-DN;8ZJNe5i>z|y6pd{8ed}DhrVV4a{Zn%lSmwRy+0j6K*0mK+6$hbOw zR4Z0cO_)a{84DAK;<$_1`Tq*rzBrsx)07iV_gR^l2^ylROV60Ix5ur2aN?}S4mLUm zfgLu9$Wfr;kpJZHrcDog*8PJSlEf30;1BI9b@yp)p;u<%WU}){rGED!L1o;niktJioml>00QMk5eU9-#t zG-FM0p7Bk;#fB_fdUl0zWZop@6b&w$18T6cIeopuRp7;!G@tX!Z1tdmg;9e~+!o1L z6p>5Nj`*;osQ(n&oE#$=kPMFKno0qgN<5bj??nRlVb{qFKO~CaM>u1=IN?{3i`+Zz zT_W4cYaHXf+Bue zVS@dzoZu%X=g4l_>wcEKa)&ZB1KFTltYp7P!H%>ajJM*+t|10$IX-;5NxUXee3eNA zOK*p)fcgQzA9$#mj7UAHWrGHWY0-(# zZp19lwk-Qnuo9bprkQbIcYC-JTSg_+)NX~9S6CTqy1OHnOyH~*NI*X$9*?KAjvSoO zvLO&EllXO$qfSj-g~*)(4W;t5kbcm*-&nv55Hq^sM+*sCG2TR05Kegrq%_{LD~$l6 zv^YuA0n$(adqp|&)2@;3eeoS(Xl6#}X^CTRK>e4{L;aFnw6gNbyxB{QN@w9Z&BX~^ zX3>JVv(WUTmG;CkX+(c?8Ek&?Tf_i|{469l?Rmf3cS_-&cb^~p>Gu?U;LyqyXY`~{ z`9vHeUT{wdiDRh=69RFv&6MWf;%jL81N?tS82kyBAKv6(%yRsP=b zQA*y%pbWx1n8^Xvtlj?UnSfjwqfHc{-}3oMia#yxXPI_Nv0oA=wJqP!qVqwe`l8BC z3^jwu{kI}S8`TlA$mjmg|Fp0+_D{VZrAYH)5GsxJ{qL1U>o1C;eF)j@v7+Cj0~nPl zijxZUU>8RyFc)$>(B+~XO+L%=(>WdVt9y|?8~P(R2pNQWW%81gcs!<1-{^)ZFiSk5 zk`)+2U_eFw>Idl#G$oQkJ%aTbreTw2H~<}&jkv5DmGwm zwG$$TP9Efy7f0p`QWnqsDAbF5E&X7CxrfWaJRg<^y|93%8NM2dFAjS1$|y;d?XBAL z-D`1;v?2z8PX)po4E@D<22!Nam$XGcX^Qqq<9ooxzMU#?bSy+|R>zjife6YX+ zPgC3(eD7+Xx?Ap5)zP_eDr4P$u((89(NrqNsFhF9!smeFa8VZrfwmr36y<>h&gDRN zD7T5rQo4oXp6|O%?K)qfL2QWyT583bLft^^-#CRjR`T4wU1Hq#rcLALDZ@0-m?xbh z#7Nyr*dnW8WfA_8JW~SKAC2?ZN6O`3mj+~&I;jey62^w z9~6o(>Xu<3^a(SGGJ3+bOID}@WFGXNAqW165RRP`P=iL)zT-WjdXN|Yq`riBZK#+X zQH=Jmh@~d`9Vzu8H8g_v--$Pk?N7Slf@`8Mpb}13);|Z4XN4}GdQU!8mP*=@x!gSYqnU z)WQb5H3yCYgPt3hl~ms}^DNp78(d5Ss;u3C88`cUhscrjCt=uou5= z`z;{5-P44x@6B2@s)f+NLtUq$P%x69xUmc@+vWK0F-;`}mDK=&0*zcYJvUrVPsH-{ zWCI@s+8Y?l`B-0TDdvX%$Osxwjs>n1Z9h_4v4b+`Vx5k_oe09hv-RqLH`NU#0a)e z=st9~)soqB+<`(}T-tntPIhf?H-7Q_0LS%+j`QhWc?|M@yqh`FYzHg(=a~8lh5kex zE00szV3Yc{7<(jZjUznE!RIPt0%$iG#0vT@%eZiJ6}e!@I>#+xl4Bb-2C}mzS!-a! ze;LyJN1K8UEF70o!?$~uxw&S89}Ab_i;pbD1r=XG#Gl5b`pPvE&Go5eMpJ(W(7BH+ zwhhwb(|x^#JT*dda z9(*oW#N%a^z_sEYq(OpDRdB9twYB)s;I*bf1D^#x8;bw3j=c%AvDn?U=*L>4A5Sra zAMHj1P=PumD5z`sfBg!^MFruF43#^V#?%*lYYz(x8zFo5BD-qmFMkrGM>euM?5QW} z?)e&`uR?qz{bhET6c|JYJWkR69Vb}>TXDKx&sMy663jDv73nA0TkbCVv(A0`geo?5(;3{a7&-ZFgP}b_N23mh#y*cN z*UJOdQfDK`xz=jXGWpO!7kfqgWq#frn#h|>`CjREW6o3>( zqU>_{Gx}je0@!I=YH)bJ>)SRsu>8cXC`tJbPLoLY<%aVpf{-{j$&ublvqma!xaKjZ zmNuc+5dffCU*~~>-i%3EP;F{zGH@KutZ-a^q>ZM{?o9=0Ep8F$r5uP4>+)gxHw2jq zN41@ZW`txM+f;sr1o`^bMlq{9>nH*)tlc3Q0k1P{jwQ}loAtVUAzx|`kdIJ^;qZwP zs^=^^TFr~mali;pCHr=zQ}I;ZU4M}Yi&#mk>~pk>$GmX5 zPr-v2pJ1b=Kf(`8D~e7Kq*8J=vx+Dcjbz@`tdXL~mH$NdY1;44K<eUe58aIkwey_poHREUzuAV`oY%sZ7BXmIQ77}>^X>!VPvw)8UmY}n---i;-S5UIb zjnGC!5t6-udS3ZN8R=C41a|gVLAR9UCYDpvS*nNYQ}g!0 zpu|x=ENP3ydgT320bgz=DKNYqYJA;zsX{Te-HXg6Q!Z?*#OV0XtBDC{4<1i_Q0;o? z?B}uis+xO+rY&^PH@Kj9`@h!^F@{rrF|O>c|K1p6u_jqF%>@EXfkdVhlBa4&qkC|HBVO&^J%pu;ddfEeO90pL7y~0vgK9bz}X_MjK}<`!LWr7_3y7Z_o(g(K62lF zvV8p#=Ko{Kw-%A!@OyndBqMX3$k{*8C@qEM|1Z{166F)m_pFssu*LS|7AqtgCURiZcKG*GfjChwAu7#+ zcvv(HkRj8DNqF3z%V0J(M811^(ioGCiUz&1p&9KR%X4~lQ>cx!TEt*LM7cRd|I3?R zy^X4sGG@rrgC~jlYdRg%TXhXqasU#}V>NSMzns(c=7U5Y(;H&$5QCMnI*sZFKOYQE z<96!BmzTD7sJ~7F_1wBUUJ78`O0Dqtx!;HWkhZCN;gZTc9bKG$iyROQ)=%r*^*^py zVw?RkvawLcqYv3$3WyN24oB@AkKZsaq+7 z!2!jUN!+Hi@Gi!RD4^;^<`uZIHZA=xH>Uh6V5+m=YICOEGvzF%M=W}@*3g}WDj6VE#Yc{$pLLnoy}Fa(K8Y2nDkTd5(>Gn?#uZP$;*g{j}4+XdLlxXeS>_;J9jSo&rr|1r2{P{|<} z+5p(7SXrCRENvkpSwjjS9(PK#z>GTJ{^hp)Xyt|f{{5}(JCP%bk^_p4`Td<60(7Lg zhq{6xU55wPZ-aV;cJB@ELuT%$KevV+2yo2q8Aem$N3#*349MZ3RdvoKge=M`m*Sku z54Oid2Ax2*3R+2t4v`#A6w6pdt#*xD}pkYK1O|Q-S z)vKD?axq!%bL1S#9g;n3bj`T@C_bUGSgri;RN}FH0A~+S!2G~?E9Eo=;}sTY9bc`) zzXHFCXeEK>7K>Yqv{C1mL11iTCw3Zo!lK1SWwoU9Lm8u!K0acQA6LFcb$^DK;c${8 z8B>vSe+*rtmVV5XIk`MUW5UhOug7LANM=#Pl&ZjDJZT7HjSb4!npU842r5h1j3c#nf~B=6rhqob*ClNl&(Lq^iIpf z7SR0|>_G=oWGk3k*bLG~s%~3oeXA}D62lb&4HX5Ge?-`CJB!f`o4Nyv(@2P_7=G7S_58ST#4;(sOeV+ogoxi( zt23FGb@Rjr>WJz7t@GTIBQT{*TxWwbw4wrr9_ef3i{Cc{>6=UW~QwyiA({48mL*;grfq0O||5*bw=b1E>ys)7GhL{w+vamJUW=G^c zT&SN28+vW&7bGblT6UsFW^m+{pJOCdL3gZgj@Aj@Vuk7poZmo3m{M;F{dz=gPZ}qR zZlu21pG#&J?1Iuj5AIRobGyN5+)JLy;-<;vKm4H8VG)iF2<~-HRVak?vUV+E8eTwl zJRWwE#>rEV0$*vf3i}OMo#uXYJYp6PMWQ{m-P{^!kR?Dc_$3^03j+v>;nMKz9qZJ3 z;8G>!3Yyxt4sP_+X(kl(F|iL{1}ayeHf=;J$%6^mpqBI^LTOmY)|%Dt+j(OynZ)k( zaprQHh=J%W<8YQe^PxE{*d?-W=bu~;K#v@RCK$ghP6o@p(@uieT-=03mtWKgt~5SG zj@yQNY2!57kv)Kve>BpRgZ)qaI(ol9@It3}m4s4YU{#ZZX`vj7C>~js2aIi!JU)t8 zPkYIEbFvPd5C6$_ZumXH8RF&=0`Y!}PlxQf5%a`rVMVSzJJp{EO1u|<*>;70x)<+MiR!(z&~vxTfG~Y_l|J&J5oGd_i5Zh&_O*lF*g*bX7}NnseDSvWi& zc2r+GgFPgLmSUBW0)k9KD*#5&O2O9wA~`brQZ6JHUY1jR>k0z(EWC z@#rF>%hU=^%JAqoG`B)qod&PEFkyvQ+vphkLnkdiEGV;uPcCC6qC6d+gWXPQ zL-RyUCG2?Q(CEngjote-NyWO@=%?Y>#Ez2yLjaTZc1BZ#bkwj5GT9)lIV+JPPrSTO zJj%bZ%*bIR=Lc8+0nvRneM~AWk8?(u$0}9<^PuXZ&^(=R41$HdQ)XHC()<|g9yb*X z8>uKWmIj6_2_4m8*oJ(Ro@YYTM6Nbpn_9TOOqs2#NaO|YQnB5n`T2Q<<6LD1_Xrr} zkBjS1k6G2)6EFb?nU*;(X+QOW?(tQE6m!i8w9)u(z16+~W)d>G z=G*^9@1argcqD?yLC+$1Wula^lCozWoW+kb_ikZO)^!%p7^P~Ng^sB}xrI?{CZv`r z4R?|Gw=iiLq^GJN82F)&^Oy0J@kvI59Zr-OfA8A$EpvF6S=Z+ArncR{a%f^kOjW(v z$?1qC4u{D6)p>FVGV0uwT;?=d7*$wFihYj3cDi@*`&3|UYkVpJ$-2k84V|RPkRv?R zb>1n2EOTxJb71U@EGlQ+rp{ZBk;nmT={r${;CneK%Dk$MuNmR_<+chnDNw5xFozJ?liagHJ&tiZz;3w6k+{gTHPG-#=7Hb}#l1S)9cN)~$f9mDe6h<`Y?u-@M z)iB`dFGH5cZ}R#~#D%Ae?FS0{s$uE*SxAOVD&sChR)PnTrl=YIWgMbFp*?%dqcVj; z=Z;*~;zC`gWc~M053Lp8T3C3#-z0nPOo{N@?`SfP=Ao>T1Y^9G{M=GPRH5QPMw^td zB^#JUQbns*0Rq0B>hG|`&KlwEr@Tyzi*KCC6j|;1h5b8fLzJFEMs`{hF+q)9;Kq(w z^bvXC^28({k9-&Vr)At?oPSV6B!?QB|J9igM_dCI*Y4qr#oviGcRO*d06!X2Eh^67 zy9_Wi_5;PI?Wsvh))(rIr7{M%OtY1LN=y_Hif{D?YoB{_Tb-nt}BysVz?ep}PTi&_$dq)etp|INW z04xAHB$OgF;+N5#u-Y&|HC;$iO&U5@tFsCr0U@$I0ArgxTKF(7J+AaRm8zZ@smbHv zo!h%UmDC6}yg<0x1)h&M^aWpAKR{syyK9^WmC1N}It22xh0ENoiXyJa{y8_n8BuZQwwY zr$Lt?N5x{?Ih%{Sn<$6bFy+`|JJBw)_@%y(*rFcCRPZFgdcQk zOCd|;atA?k3BwK!Og^U|#=t8nDKQU<25&pip9tjle8X1oT#Es{{)`)ojZyjJ-#Jc) zk@}xWbA>coEOZ4)mxYml(Z4yK@~9v7u{+W7EeREbCb^_*DdN}5QW|M@o9r$zh|=i+ zJf66ECKk_~yJU)#U0q$<=jTFQH#gKvARJ&EL4Nc7;0{kZ#a@1T%iVrni(M83PJ%Z-O|_RX!o>5b~`4y5{)hJhdu zoxyDiZC&eTxUf44@5|Y(y`l0^vS6$c%q!|t3&)`1p6DTON4ulA7To3?PuUikdrHFH zuYGo-EoprUt;B_?q@NFa|B{}R<~2n59wLlXL+q1lL4iplTFo;1R3zavRRjacPVOK< zw4{j%87>~4{r%amy}iAyRv1`V;Qm-@a>3o$jCk}7ddMiFnI^8%8V;VQk~Y9bs+c0S zNhG5dfbLx}v}n8rJhG@T7@G`X5#;1cQ-z90)e8ik%G5n7X|HjK1RT!-hN|F{Fb$*% zbJe`cL(OMZu77_Qsw5j63^dv2`7=QNI#O1p+lwz2i#OyS7+PmEq9~oqcE0k`H9b&H3W0gh^*$~kA(f=y%9?vD{3%6>Q;JL00*b9Y#=px^KaXGf7Nz4 zL^tGni}oAVhB=o=;QN$am^d2yK4B?cv=4#k?Q4i|CC^>!%})*zni9rIgLyM`X48q+ zL(p;LB)xuH6*OzfzN_y`TCTqeRx_hsLw9&rL**Mnh#eh}{4V z`h=Oyk<%Zl!AH2dzB`Lw(d+Bg-i?$OYP2Ik19q*}+Mw$}h3)Br0jJmK#m(Qzecte_ z&DX}t*gq}GoXn00Xssg+VMx)VJ-g-61ZtTG#%_xn=+P|;%GxWxh65O(MsD(M7_MDU z#B10cPG_cO=7XjcU3JO7F=_i)${uNffpmWy$gyL4UjMU+o&5al0ZQr$9KAl>a@g;H z1rZSwBcq}gvW(y9c2`8N=zdJkv~ZA((vpCAuPvS5^3Ff-nHRNTn#nsc)>QMC@<-ZR#N5MnELo`tQ zuTvR)eFjIB`=(iVGk~GHGcAT+Y%L~6-sX8$YE5rzyF!pUeishF*p6!x=U;^(#Rr#C zO8C>J&&XL`#t2EX@CT3%4wJ(TN&#@v-P_-8CAWMxpT91%ti^{<6f_wj)JM)1GKt1r zU%Z5UNmLja9_BYUr;H)slclB#4h~lDaH5Qej3i{ST%gfVQ79?b-LRCF$JQs$vkvBD z4;dAA8D}oC2NuAY{9}jk(oPG9Gj0ki@{Wfm8N`LXrBlU1tVvP~87un0y6#EgOHW$K zzaGO_H)`rPFu6Je#GPU#e?lcobA19zOEId;Xmq;LRFzF8bBH(ODk&#<9@ZYSpXcX( z$x+0p|HGSy8g&}T2@+BMzPY;j9X;~ji%)ey2`&}%Ey&^Ajnz&7h4#zt%1ue~lf&Zw zZty0SU|Wk=Ih2qjcT+_u4x%Y|dEZy&YF}TylvO|=`CbAA1qCR0_+rB^M`>n7YAx4) zW(nfLB-p;KlDX;!tS&{$qbm+D{Nly!1K8`t@Fn zPm-{m6Tb=^RfnhKRi%Jx8Tdu+cv3vAsMei7*}U0~YC=ZV)NS?T;Pv)zacXADFL74K z?d1`~wjz0l1?A!06Lh<--1a^~C68kCdDaVQ5jxq?v|K{@?)l3vwp08K>QyWEFp?t= zQm%Q^Lk0AP%EyeLh~=?Oje!Wn}l!~p9Q2Egv#~`~no?x~nn-cm((tRLumSS3I$sycSYeeMuPz?J z!>D)#D?w>U%Rj1=<%_3AK0mVdsgG^fK&b`snvQ^s7D+ZL*SO%^BZbEd{yDwKjLSq% znyXo^pKYEucs^bsp!R7uS=iM3kt4uX;r#(I2T_JTrqXxTvoz~4*a>uHY_j)3<3}ZQ zm;;|YA$M97P~MT)Ml0svd4@W!@7D{(QW8>?3L%-Jxi>`1ccDponrGwH6#8+qsZK$e2oDej#Y@N7A=?9_>DnEs@wFIvH%hc zPQ&!Z?5OBI!u3X@Mv@oZDA|lxb-j1WS0@$~F|z`MRCn4pEyQ1;)#eWIPIA zBAcK;GRWPNTp5)Dp>85^UP|Mg2`wY4DU-Da5Da4Wvc|2=#tRhQq=71c&d%OOE0 zkso?>!@Sc>M1*j_p#JDmTSw@pEC$%Dy213~PEMD*h3SS?RUxVaX(OW?k9g`GA{anLy&pC!$+vYfzVvOXrN zH>=h2NStc&ZGhPwV>JK0rfC$2BX@Ey68Mdu!I(cWj6?oHyjM5(L(7dAHZLJupvbJ} z*t0BlUrT`_S+4F~gVh?~)QyXh`lFsHq-OgOIdXuWNx2Da+u+(BS8|<98upEDC@D+W zTV$Yk_q?HJs(&8tA(A`go+ zZk6_E81QgfoemIG!W+2SRKfJEz$+k*2Jt#JvqUvKu32{g1Q_F2zE+T&Sz`AiqH*?&S@1h!vLX$!qOZTaJbajtmaf4v0xXV40sc*A$ZRCh1`d zt{%XvEAm}apkvDT;j;J!yfn?JQx*H;!kocG0)f``8b+p@YL5WydMaXjT}c0N9S4v( zLG}HZxNQEclRO@Q)4I{5qLe&aj2bFyXlT?Muj0d5-Y%@0Sy}=K=I7U4$C6l*h&X_n zud^k|fdzwFpmg=r3mH-NdiQX(RA{6Z>DnGn{IBeqpvgr2w2&6EKgokcKibSu<1xN9HXpCW6z0i4Ha?|Q=dr8E&?EXTI8 zcLZl==#sNU4J}{5+%DjNEKM!D!a6^|C1F5+RrDw{FtCdF^1-}#ANZaAH~-|;WcU%& zvi0qCCHiMf`pj?>KoGQg19^P}CpAoS^d=b_91OSFYx=!?QK*dDAoR-mAaK(68@FqS z{*mij6>9Mgs@U0hQl*&jY)W=nb+r&^sLq+|IbL)EIrh_WLKBSV{#d-SJ2YPRx#Xr7 zj+##n8F;W!`)tw=^hnlxVWrmz^blw>PoldrFz~D)%i12P$ETc*-B@;@G@gH^v;vxi z)UKhNp}cAD&X>1g<0arpOB8UDlo1ofT9)aD}&AOmXonv#(8Ey%-H#7b^xaNziP z4y@s!3tR;hVws5_PeLlS8o2g<1BJd4tZSns2_@WZb{mi)Wr|JB4&lqC=!d;N5Hb}S{WbfSSMii79>;vT#ICRncFM8Mxiow$V|6sy@}Ro~2Qh zhy2iQkZRboj^fuX{cDI$LtEUKA)q`0F)wAh_S)J1m<~`rIsd4_jIx9VeA+Wn(HlI1 z6#X-4{B&k)jeSfh*+27ERd1L=*u;v)rMuTNfvh^T zb%$@V;Zo&Kyxl*)f@-7kEX@y1ijvI~+Fa=bWm~|npcB9W96Uj?+FO-kNdm1EFb!ZI zj1`yC%Y_OG_{(poP`cjRAd;)XXPQBF*v+9$L6uPt6O^N=EUkrw1}H40HX$H{M^egH zSC@(qDwZ=_CQyX0Fgrsg*MN*KI!>}ZD{G|S94Kc=@o(AH?xlH%h0%ItDJL}|f=UZR z>NpEDySe@hmIu5i1`Y_yrp7ah*Gl-guE?H6Ws0@a6i8dqD6i^B@K6w8ko9m!OjvtG zfcQf}ziD1&yFonyq~EdsdH&hJ{dDy`$zpAG-{#Cw{(7iEf_%O*4g;~m&`_z_LFoV9 z4PY@Lq?nB!t&TZ(DgYI?3-fC>WQ9|4i3>@vKL(uWK}T#*SioKNvGFB5)JzexK-)Ll^ugsK;`Aa_8t~W=_)%=fTq6{Q)L79 zqn8(T;wJe@d?PF%MEaAr9^PW_{+4B-8x~4#AEJkUP z;lsN6X9_yo2&VG#O8i3@U_F;U;eDx= z+gFEG)pUIyT0la&k&rlmNC`+IC5jS6N* z+|Tnp*L!_`ydT#A_L)7iX3d(Jwf4-cy?(zW9P+iX-)tc~TQJ@*1piq++WSXCs{Wfh ze6uQsx4;%4!$QUbaMa`iU_s1-m+fCD;^wczGrH6T2$Dx=dSvkCVb#4Y-^cv zHMfWS9v4Kh+?9k{TX9_YXu+{KyynG2C`E4NdMEATjdjvfinCs@mEP)!na8se%NT|a z*H4gNL!;fsmO`$qt-T(rchiIqQ71eb0M9xtp(r$X$qcC7{<;5m9_ExpQ7!%JjNbx4@U-o{Po#5PHV z*6RQ!6nJx-eL_%S)zJJkHL~n^QD~vgAp7bO0HG#nk6SfbUaQ@k))v_^Ll3);;jq~J z3Yzc7fO0aj6e)<~y%v^xc*ptPy?am5;GH?UZjQDNn3kV4_EH>PwVa=tMwq3mII+DM z9{Y*bD_(BnEnH~y(5n}8E%F}g;=P*|^AGLp@2RfvA3GmUo3%>fqdKWsz;OGy?JmN3;vWog^MD` zKn9kQ`mQK3mhP=g;zbR>ym31t5|Dr^06iMOW_u0AM=%8f-6aNMia~*(KZ3L zARo4$g?%g@ zD$#b41_;LID1R0=*qQTqrozM-3Ws3;oB*%w6_rf6@Bl24fuF7B(|Qe5pgfLH|XP) z-K$70V$m^&8*kfssUy;WBM$^<*_s=<%LOUbZ7t~4cG(1;4k>uN8f>PUvTrb=%&sDv z56|!h_A1M(hk>JZC-~RwyOt|u0JeO%jxJR@tj2|iat`*`88MF{5!i7xS(7zW=BdLQ z3YD`sg>L-t52>a%_Wd69{R>=eCii7NDs>frUI-d@LO#8MG>K$K$3lQt^Hx|MS_NI( z->3gpiBI_?& zn>CWfqXf=xuOL7;LUPQH74;4~-M#uso0t@A zoz(4)lyrry%{OINsq}-v+>TY1eqq_v-*;`MRV}R9ae_XF&gcYf*SHE5Orxmf&~!IqSkCUOTi0{xYRnblY0K>lU{nHkS{@oj9I z7$wY`8@kB~kMngd(C4yxK8uOYVc;#pfr0V6y0FSMPK|oqL9NU~C7#NOAayXL%e(W%LpnVU0>XLs&KemAZsMfRuP2LOb_^UCyF7lD^irw4BvPbR_^(hq?{e84UQg;(la+^&Uu`r zQjOcf(*yQDJASS3WZt9lVb`p9L{(#i(rxMigqpOj_OPn9p6Wovy!&*)-x}O<##P+g z$efjRXfpb3<3rL390Pa>=2S&StNJiPk9=cvbINpGzXjG{?14khJ4Sr$V4Zb%yrI(j zHYMAyP1%$-NUTr0PVxr;>F&5SX1!+f8ff!a7%AuXptHg3&I*OcR?}IYS9oJoju##4 z@Ngz=zLc$8{NqN?tH{Bd603W2g3nQ1n?3egrkhub+WF3=u4aoP-z_E?>`!N6ON zhRMKz_sll8>yHYHwb--+IP{DbW7AsMz_8D~k00~Ye0x9SAB4Ap-%%Q|xGMOHR`iFR zprb(#1qesY3*WmD7AGpc2^Resbxug(F0`x=fPnv=(u4S^iPf?Qo<# zl3QQXg{-pY>8E-sr2_R@UvT#sE114}qoB7-BfG7MWAO~8@0oq?8*_o>nyBk+?-kDI zXD`B&J$}iwC#TDvY(C$ZX+3jZiQP)ECCFOT^kWU)UgS?&82jM&4;Co-=Vi@64ODO_ zx%KAAW~`B99!LuXSU0$A6&()EU}4D-+;Az?kI*Eo56+=#7^>HLk4VLOo$t!xPzY#! zU~>N~eFATaq=m1Ewb|TU;;PsiVp?PG?4HoJ@IagrM39qGJT{b&1FkltNF}d7UZ}%1sN_%Wj@iM^JFJ zkC)X3A6~k0@a?S@z1+DR+v;>5YSC5yRLR$r{MfwUJx(&zt69c`Ch}{kGhuv2Gz*9J zJfW{>>O!5Z;#s>yerhey(gM5?Phta6}$2$Mh%jpvYudJV-DhhVy6 zJ0xfIi@?IVD!*22ammMbP6b?ck)N1tjZw=4;nN*OP$N~Vj&8-92=5<+6j;5&xgX~( zE`T~J#e7}N3=W@LjK#{r4>#I%hu=0MozqsmGtRJzOWJiHkJ9ORPKQlW0tr4Cp%wB{ zUWhrUfP|NHv8KXCEn&SH?*h|4Q@$kV$U^pKa9U`4u(C@0lk@)F&ft?vE}NwMJAJ+i zDK(p4zJ4pt2D5{|)!_3cFn~7-;=6cgEJSmfJ#di8#39G+rs-@9CGweH3!+Kg8aT7? zA<}45MCQQ?<@HM|HJIW8!C2P7k>#E491i{A&e7Jnx56ju#V@jXeA>{P$4?z6A^N>3 zM)Z@|{&8vbxC8}l*Cjr5XqU|P(EN~^xTN)G0T!^rZlTb-{k*5s7HCR#I{2kI-w8Tx zgF^=$uw8f}`MDxPWJd6lqT)VO_sKtsLP0ugM~luayKl?mFc_};%F3KW$zYc2R3<99 zFx~5#T*!bwdrGSVZ1jPJQ|KOrw#|soEkiM^%r>1al+Ti_f5wF4HBDEiM^bP@hN<0x z^PS{oDKy2;&NDJ;q7G`>HC7m?5)cp;$k`P9R8E6esvT(;XMRS)BIfzM__jsvo#|>> zSm}(Snsdv`RDlPS%lix2TDHm=L)`YL(C2dUq%^u#VV%x>*T$0hz}s*?zj^pZ(g>A0 zZSiB$EgA|b0r9eV6@+0@@j8Cc7bzRhd40Q)-r5m}e+ntocmWAEX(7hwiEUY3X_QM{ zk&5%JUaNSf-P6rERyuR_orWq0qR_oSE2d1v?|dc zVRbpW7YKd9r)MFW(GUl~ z5^zqj8eUH!=KL{a-voQ8mkI~3_bsA5cHR;YwbI}$AY68cS6^*1G+JhHUk^FpJ{Y9& zr7ZhnyD)YT6m+`5?c-I3OZ~)xQ>p%(O=+UsA!_|q{|_LL(372s#`Fdf;jFQd0{k1~ z42H&VYtRwC;-?t4sFxnS(pqFra`@Zj9XmW{VN*@J@Z~n&-g2G7Wm4h{be`=nf~ZRG>AldMPeR``9}v zew*n-jI4@Ii!8}yUrE^Wgwi`A8*|O3>2h>_b%6ox>wPng71AUeCk}p3ln?Xz_PLbG z!`eQr%UX=z`_Mv4nod6yB3D`Ob@N_%s6rrfjBu;{N@1)DPXTSEo|y6@(iFar5f3H58Qzu!hcc8fcDUMJe367a zNueMD%_S-gL*2d@?I}wEXo_BojN1oGCLzbzm!y4o5LXTK_KBQy#W14?n{m8>myOYzSF-O&y6+W=5(bwrs${X_^o( z4w4{!03OHdDC!DOQ#7eh04N;&E((@40X?ISV^B1ARpxsi!Am-QpSf;y#tFu?e*J6R zhj398AGv%xkhXI3_)Hk&QBX6IifR8R(v8P8cYOAi3x@mVK&_oo>31@rw-;fg?&tfN zNPgOmo5$o5eO7Td7`Qj(VQw3#wK)$a!6U6Zlg$a2{PZk+PjFLdrMT&`Q);c&Ln3QXAhm77MAD>KS=Dv1T34)Xrh=%coET`QFHeWEqQ=9^W(n$|mMr znht78MFJv#5q&DBj8YZ9ZACU5NVbdffL;|hVZdh->H9bt+G26r1H1jhJ=}{>8Vo1Kxp3!m7j7Q`S9=Z4ARK3qf=C+H8 zB;zj;E19pIl_aR&zKZ1dOh|zn4ojL}36CekGc0a%dTyH0S4?(r`8%$GwZ{zd|wNSOfU zwl0SKiWeXc7c1mPcLEGXZkQdgInvsm6KmJMzTsCOpv?^}O^dn3O7o%)N|e?XJ}0xt)U!T*r_Rb5w} z9Ewlltj8N9@re;FY>=G03j$DF_?!t?N&=rX;LD$n52D6jpEKj|d!T65$D>*(po(cA zzO>-^9UuRwU%=?USrh;G8yWq-uzg4lEO37_%DtwO6Q=6`iWS<*I#*}?PBB$(ZF#)2 zd%xzx!FS-f*{Hq4g3O32(i*Zikt(h3o>Pw89YB=ixqb;TsmY^+jhOv z_SmQ=UKJM?H&MWj{>R};_dQBVZ0XRbC|PlF5K%~f=d%w?3jmy{eSM?L-r~k^{vV8Q zMa^fo(f1!63YfigmSy*u3u6#Ce9KW2*xU9gSQ_XCDNQ0mLXw6DY{{+!NqCvD3`&b{0s;c)dD*F!S4*Z6`E5V7HE33vEC6`tSPq0t zFHqBiJ}@bK?6#h3LAjoO;=WC`+OMy;;gmu_e*fIeBbiWe7S*|f<@qr8Nu}#gf`CBT zx3kIshIZl=yMR#Rd=RbImkQ(VxBK&S9jJc&rVs#UmYMMA;NWX0F`GC52)_tCf@dUY zHoNor`TKuO4}Qi-;Oge)+wmTjpPRcd_3^wOwqEa@o+BL572Ppm5-vCvCoLSmjzt2TVtT3Ljq9S zGfH*p{V?!oz5uAHF)=aF;zb??i4XRR2TaQe%YN=+9@C+Cs7tWLCM6O8DjAuEhDN8B zsFXuUh>{4NkCe^L!&A?+iv(Y3sK=P5ZK=t*YNuF*E-o65z3pGVWMO6f`qdxf9sxlc z#fE?|xv_$Q0Ub+U;0aYw`6~`O14!vy9V_9{>FHNsXXuObkxB1o(|)~u>@@&>z1*`C zcYS01OV4-IwLZ7kfSbze>9LNFCw{h|2)KEdf#I6~w3eX{M1qM%5q_2{mum$&OYdwDh~&MTMnfba?bK@_4-_0?wk3E z##Z!4xRI@C)b32f;7A5wOBYY>pMOZJd>u)tiM&rMXafA);bAVV#bxgBN&A*@(B2b{ z#1m+w!E?mL!*e3}w&O6hx z-OtNoDkv&iqMEe|XL&4|LbbF_B~R?|rXpb~>%(0%Imr+1>^J61RGwBHlYUq-kK{*C z%kT(@h!_F1@e1c1t%*jLGMW1om6fAk(w{gL${grCB#lAJ&{#+e{tjS(J4JD5R!E6n z?|)lDk3Vbm)P7uhu08VNZ1XB>M!8H<$b#QyPv`-OA`*!Yh$sWpb$(;=9oSTqhoN%5 zR#PJxWDX1m6hwDXSqs>}z<_{~lFb`fnFFdw-rc9 z-2_9BLW;>Pn_hoKMr-crd2zza#KbfNkAvk3F8at@r)jH|X!VM!;cx72jCyumtS6G0 zTkb^zzEL5;!Skthdu8!#oUJ;S80fi`McRi)wLbt{vS)AyacW)NsxL2*VzW1*m$t=M zo}kG4+`WCz_n6P}iU!5GmXzqn?IuM?SX6?Kk2ov%;ny$fiL9&~!_DvMUdEL*pqWSstf}Owoctz2(oeEW-H)hqeD%2j8Xb^CbGYe|QwF0xn+`u>s zDcNgZYIP;ef__RDPybu5vDNomWeLtp4MjzkM3>!NT`QYKrLoDAPmG$ea!dO-BqYAN z&pA0d|18yQsHAP@dU9s15 z?@0k!+QxEOEWTG{Gg2#$zVtSuqPAY`HYx*J=-?e0bU!4z4~;R~<8*s)UEI==&68^p zDGo6bTHI9pC`h$=tIX@$ex&H1Xl<&QF{Aa^OqbSTvu7a3A+fQ{2Y$x&LH#^BGlTP; zW&7;()WSQ9cG{n5+r!;`kxUW#G?=$Ut6F~Tm4X8Ccbmx6RH~tt7m5Z7qZdBg)AcIO zJCnH?+yVkDckmd-&LE)-xKI$~)tPz`G6zV`(2(GhwSuW;y?y+&TPOA6!h$cC)Mf-G zm@Is4+#fc`mm9`TVYUuOBEB4tsP5@+0m&$W0-B|+@)RVpHuMDRm35R0J&Mk06vk(s(68!)mOjtDa$n zg*sl3u&NLn>ghLZR?EyG&eymak4|J)4|VS?owY0;}g zQ?5Xx-~H-*kN7)p1!lhyJ|PDy2ZwRLrg&h&llx@DAV5+hz?_?C_TV49Bcv#}V7YhG zr0N?m87Bt6efq*2{=H-;5QVj7>D)Bo(kZ8I#-@}KG$@C8!XV6UX=&Ns*(pnB1fa7& zVJ5)G&v@JUgl;5lUhvKB&QvY7VcIt=un)mKRzdEyw{Xv4R*&yX!y^I; z*|^YXZsY(EE76z{D9P@j>l5N1T!M()6S6$lz_lA+!+C z{8!UgF_Xaakdch?`5Rh5HFrue2X7ig4?9;_LV{CsoY2_f7+p#e^6<`{eHG`P$<4K+rqEs3k!`~F!FULp9UVoBQ#@*a3WC12 z1_=^E-Y5Gfb4|Wbq_h5T=k6I#jPlrRxPK_a%Lpva36P}D!&iI+M-d}2MP*H~cd+%w zzlpbhGs^J^&8{4apvHm-@TUs0XS9iK?C!>BCMS=)8E5Y1`Z(d>dR3A^;2{77Je1A7 zX=(Lm!tCr0(4mZ);ww_ec}1LYzSlxlbSuLZjqTp6@!yhzw(c8q2nc+KlrUt9=H%B# zB~xD7^->rk3%>;c8|4rN@BwB>&)4odyraomC*0yV0zbRD9!nVi5UjD8!u_6Lbv$3*f%DKMr4P`(N zzvU1_PuoJ$lwZY=i zxH7yxc2X4QjDF%(fs#ib=)|s1OO{V%EGQC_c8P~cSZuv#IKL5lVdHy4hu%9nIwp2v zaW;MSJMvL8HDzYC7bibUo`^CFmN7fsnd)qo6B6fMrW*MMvMbJ?h`LG=)G!UG;v{@o zH^(~Q@;ycc6Z{3k$$Wh^_zqw6^sYO{CmRckkHRRQbw7QwU_8WHf}ph7*6lXjLkCCd zy&DYVb{R&+WO)K&p&IU}U+6P(TOvXi=zFBxT2WEiKJ3r}3t-%tYl{a9LUU z#VR;^roE*N6Z<}4M26V=$JHDHMmUL|n2S)5p}hjEFwupB=Q#{V&KDJ%uNz<v=R z<1~3VYyWtes?wyFo1UYfnE3`OMi<*gCD80R4Lkxc^^2V~(GUtYZ@i~``R<0wNgVCz z`$-}dR{QT7$Wr+B)Ahaw=S&YC81N!xf}sc;0fks%~xtzdO3*{Q+NO{jGr+qG>pItxGH_@4M` zy=l5J)hGSSi2F{*c^+jePTyHN;h*B_u=`2-?bLt3#~U%`hTEaoWZXId*hN1VN3%d^!vRiFRi(RWMM$gBa8v4Z8KziOgd`F>d zgovZtm-tUt77-`Eku9NyG^NbIF>eH2I;T9SA4Q#Hr90^#J7i(3^cp=>o;g9Hl$ba!c)j+A>@-zza))sI%PFwX| zQ#xSX9A(z|S&&rdL_-K1pRY)@Tok5p4|fVFDEfE@xN)*OCJrfgu!uMn&%RrF>gMKZ z@#B7@TR%w(yDcZJ0}ZfMkhSa8?DS>f5iQSDfu&E4?Of)(s6mBRg=78UVOY;A!Wz?+ zq@sso2W`^NfquCgPgrjHa^xGH2puOL=gJ#}!KEk>YaD_j9@@#80~IUB*vVQP#TO7i zEndsgANw(z1EK@hTEN+~bjoAvm{H&sn(mjn&Rm`Go*~|G695ZIdwWeLR zK=&=u2|MXR6y)a?dui8=3VOSh(Br^5_ij$lt|l{- z^0gUkR|IR5x-fQ#YxPF6a;Sn7l?p9NUKtd6{!aO`Oqp;Udj_Sv}9hpn=KKdS!d;xeZVO9vbiEmF$wd)%Co}FOS0>b^hw2n1Sd_iYJWE%ekHbCouNS@Rc>OqPn+{rAN&#qeKs@xQCfp zgstiTEwO$eo6fg}=nWIs5g4qyFi77vJ|UqfD@$^)+@E+_sON6H`LKz_P)AB(y0t7`&r z_?bOAq?~r9JEspvPZK_^UOQV~6Ajt!E6uF|D?^xd?JO2R!qvn5(_AJ20f|v*Y+OPD zrN`MWkI{DmGODb=u#aX3i@9B&*Am${%{Mf)$_?X#gV*2KZNc(sz4L`^8lSsNdnJ5w zKa{@N_he>Za7t}~mu64aY!uWbzPVY`_Z}42PWC!4t*kRf2GyNB=i}p};C&N-jz_(s ztf^V>bfWSQqN{6UgHdU^mSn0{9JE_vgy=P@sIuC!`s7$L{cZat9RB(i8p8P3r4<^r zLGA5KDW+;xeK3;V)RRMtvY0=7#qFKC$b&_Blm&P4`~y zCM?=g0&$J>C(2Ns2OGE^=SO91SXO)o1Q z3nXCWP!a!BilHKY3jzHpEZeSxBr9zX`9fxNApC@INP!NBB^(A{p68Wa-~^vtAZW+uUJOtd2h?$R^!e{3Ie;LBIG z9*}9A6pU#~hHIYyh?t8;Cp}Y}M@6E#tVduMgyFkQ+A%!6hYY!c1m4)Ft#YxAtFfBN zTwW%s2eS%lPSxxU0bW~i>FJ#6K=k4iPfW};DJAj1ET69QuA~0uEX<{AKBvQXo&yKi zFwvtY#)rZ93x$L%D ztrnq$g&hLf`{YkF-#WSNakk^ERrNZJDf|q^uOGp8)pBbeUXSt(?GuPt(kE1fwV+_N zuWMH%CNv~sIInjq)!1N(`6cJ~9t2uMm+HYm$mD0cu-%g5a4Ju@ky`yLd#(4*(z?z< z%vma3D{F+FCqitB6J(T^m2h-AR=9^sXW6cckljx%ngh3$<<$gCND~`Gaq2Ox`Nm=d zg^+vAvp?ULaq^(0(O){spatyXNWp)vKTGC2$O7|rb~MK z?Uj0&F3;3jpRS_W_>*Vc{lz_Ltx`hH+hYa8ri?$?38yOg<6y_B-fq?Olakt#nsW#ie@*w4&Ik5q9Y*H@jN^k3BJc!`qiK@$(|WcE)- zUff)VNgB^b52CY~_ID({d6Q@galE~5m;77|`}$PYab=TFA$?=bU8cQB@0I+=e6<&T zBG9;2!wpjD^z!5Gkjm*IkJ>T?3O*~t)0>4ePhO8PZX9aiXZr7EbMbkm0DqOV-byg7 z=ec&2F4JJ)8e2`qAq?*J`8aIAl>Mfwua67Ao(F&rSe=NA`0f4zW?_jgS|lVOF1N|n zyj0aeBF<<-jm_%!k#Bx-!s~pT+Nj*9X6>}SU!V6fNk2I5XQ6UI?1gQk%a#0a{zG0D z9pNKCTu7og!R1}3qIe)CqjBasPlluq7NHz61h_&5?kN*_qC8Wh6P)2c0p)}Ja)kRh24Fi6m7 zoig^=V%fPgU8EZ|78(5V7Y%f={S38hc&nXI8ja@&A#*h9@A6c*SVM*IGx$tjHIFI4 zjd(jIf}gH9Z#W(sEa734Fwo-Zz07_eEHnhSK$Z9iA%KX1Hi3vUB;BM2O~nI20Nbd* zcPxO#93VXNuO`t2089e~fFwlIemA?z1!yc1m`EDIEJ6T(3kT6;B(Qkk^xFSWoA{uq zU4g0N^`w^z3d9N>s8ShMGQF1)qE1IhQAZ6>1jrxsWc6E7g<%5qAo#u9j?@q!A^d$0 z5Z+(Oe>w$GFCr-r|91|6Ie`B=h#moMWctXn5-a|r-~MFI`gb~LKnJ4%q5)LzZ}JG) z{AwYPkM3Wc1|%a`qysYlx?};w_*bcwQXp?8%U@g|q(=l0L;NCSYfl^WZz;fF_?rsW zZ)!eRfav5UzBW&xG5u9^cey+WK6OzURja;m>b(&YbgM$#-0bZRM-tgjhi7!sy4^t( zmRzrFM1d#|4^_R{kT<QcH1o4D#>p zzY7(3-c+jp$~nV+Ve!EQ#zRH%0ZFtz-JGf_%E>CXl$NlNc*dg!w{B-Qi*_x)uC9Hd z3~m@Mq*OLR1oH4E+RV7E8XI~&N($5uRxgH*mCU+i9A3?xj19G?@Y>o0Pr&j{f|9wc zGcQl5ZDw7XU#1DS{tytIojp7_1fRL}(?C+W@~@{_wd-3Pz0Mc7;qUU!3XIK>C&t6q zkm!z+_@LL*=O&nYoXy9;URk@Zyy2o?1O<;Ka4ZDao)6w%kW1!1Yhq%C*sEIUH2HQn zpL~nbZ20J2G|jyEgO5!SQ^#wJ+~KTBQ0*b3DScGj#hSzQA~_pjsgtRHuj?m#$@B@o zuKtMhq%?JterT0@nLkRro(Ou95ST+-7+8|FjAWs0@p`N(Bdkr+Ty6g&lmw4Xv)SUL zPadZe_UU*SRW-=*yI$!+MlZ{B+PhA2U6wkGZ!dZ-E)lgr>t7`u2m`ad5-mQRvQ=-U zAs0J-3-+Pv^`Lz{Smfp-)5}lBAA_W2sH2NoZk*F`X$3omI6r!oABSc2*JUfyLmjvG zlSumT5?lg1PewlUTeMe{P;gl#%iyNl>?ViP2&(vFD7@Jqecq~ZDZS3~(Q5`X{ta5M z?zUCq00B+;S9T;J=j$As*(USdin`sLa59l+wKg-zU~d`3gaUNWkP`N4P>PuP;lZGv zn*lIN>OZniW=PD1!+^u7g86C>Uh6L8K=i%Q;a4Jfz`*`BW9zR3-8S|0`;wtM}L{H_sT*bqM`pZ+b`3{8S4?1eRGp^;=Kiabz4y%z0YCc)E5F z8W|KX^wg&-<85tJJL)f8BV6SZ8fXN}M1+cPc@HAS?)`k%@u5B=44MEif!`-heVXaRaHz7@`Cd(-OuRxDKrpzCS|w5sCND*9a% zuAR_d9A*$SXC;-E+HN=txLEyBoqt&)WXSfb`v_f+$oz|SguH=kKdLr|F>Stdc z3i#z86EI?~^|ZgncGr2c8j1-KF8?h6V^yi9$&+w<{?fSzfVKTiIR0g&ScP3*A|mPN zk23G6w_Hg5-9dCztAMQ5U zyr!L-pKrOm{tOFSzwCg}G|~FEJORFP>zekbizv=d1bWjcO=^lDg~cn+YXNL>W37fa zA3CB=hQs<>^XB77UDe601LD#@f3j-T7)Ai- z$BWBJliu^ur@IlcMfBOHmcV)1Z!VD`KJw)oqedCmtHmq<@_;ot(UZNnDvgb*t=03q z;NZ}&k^c7n#bDxKWp7IiL!RaN0PBNGej4~%=X4|th4`1GQK8di&s$?-Rj2?Q&N}6c z?QN?P99&qh^JFXI^bk+^t9Joe9AAYj}(;g1=M;R%T(wt(Fcp}Y1vZ?RUm&jHuTxqH=<+DOtz ze$<##b;;hEkGG7uVs>xJG|}Xx zzRsKQ&C$XFwFnC7L&;8NzDHGIQyaWn3_N<8`3hyQk{8MiJs01}9X9>(GyyYpa=?0U zpy3zFGaKH5Q~aWi9wlWKZ?3ikGiN0|EY2W3$pO|TXyla;r!CZ%3=NxF=(FCS>uLpe35jXK!c<0cQJ z`c5nD=|aRDo4$7%VS@WyP0Kt@fwr?gKK`$5kGt%7om-qSv?+oCW@?4&+Lq`xKSyaL z&o7KGGP@iJ+=Q7Xx|Jaw2ZULnKge*lV4U9-hUqs3&ZyZ)Pi(x>lMdv$a-D^To0>{= z^xc72E{jX$sKlmCnkdN=N#f|$b+j$E+Jti5Vx+9!M0wUq106c9AF`$a=qYTv(471^ z?*8nYyctCqlRP)qTi{74FrbvDzYH}ffQ{*KY0pP_z_8`&v)^QOW%O%Y8Y6*U)x4AW zYU#W+sy++((4l~hG$eO(74fLQSorn_%3(^SvWUlB_OM)K_8VX^^St%PO#^~}c_52s zt5>Ct)5Rfi?*Wdzh@5SOz3N*!#lvb7>%@-8^t@3^$zENOj72?QI35H5(|)CwU#p%b z4!&U{&sm~XuFLk(nvXRgL=%f-zE;apZHKq46l2%-k6s7G$9_cWPS^Zg;0+O)AvVdDdYaR`mHnn`=2gWm*x_#nw;1}tek%5Y4`d|jVm4$Tl_NJ z|FxRG^8caoR|UUF{;z#W6h72gXg^7Bnu#FqL_zQvx^e`#5TF1?P6dYd6F&Z^*5M+^ zfd&O3gza>GpiyyR&|(^Gef6OhTWK|4~E; zn)ov?FsvbI+ZBY618XBt%RidZuKd5&q<>KT|0=rw-Fn`bnr=;2Gv1spDVXZZ$h-%f zbFk;S{~8#Fq-aoH+sho$%Xygl(utaTTX*-i$L>VJiC0knXpWM~-=iznH76Wc1a0wK zjh%-K6Q@T*Dd)V)78saW7_HLsUZi9f7X$t^e}-bNl(}MA=2-D$fw{_R3hZU;Ubf4e zdD%d;EuX`sVTneKszM4c2H0Epuc2J3*PK^>MAEGqghxBvr|VJe*=a*9;w)J@*<{@K zGCdOg_rnZOfqWdE*m*Sxhem!7?YRr^`kB&F=cUCE5SRAar0HE#Gd5DCILc)d>OY7d z9v$`Se)#&d6RMu>EC2GP(p$N@hdOmE>eM3cIv%G|o3p?%hT=;buNbM$JcKsJ4sq(3 z{)BI{lJyC&JRNLIx%R>sD99x`au3smRfm?!`FtHa96a+#S}2dG6OJ{wEA5?@u3prB zh)LQCH#bK%?*MO&i`fcS^dp{IG$ zT-U)1&wUACSE5u@^nnNsprK8LVWt)fja+kf&!TcA!W!K36jW-5_kT9@C4OXzHYu)% zygBM%_+>RC+W{3`B3h(epu8dZfNmj`&=Un2EuVGM!e6LkcnC{2S zr%a?59)SH)ugp^j%Q2dBDb^WjyzpENCnq0i>yq{y^I0`%GE@e4^7Kwk0n0MeohSd` z#Tc1GW-+&mHVLO@!SjTNmA@?7PlF9o&yJxof?UA39;Q`F;@!f;C{ydA zx!;XL6q3mp%Q|U+1=hmlPMOE&?U*J8)1;2ofv?! zV~Q3J1a?Ebk=ZXUfNeUK!)q)!En<6)0I{#N!Wj`&n_vMcvpW;zZsguv`*bGgtx)p9UpzqFckL-?GtaO z74-{6!UShz@pzx#0cRj1t`w1o6}j$9NSh+Q0{O6@K3LE=L&RSnpbQ#Byxj+tIL#OF z6;T$*g$zb#{MXIvldV^&4f~A!oijmu;tzHP$Ps19qWLIPBfk#2uUxEiWl=-d??S|L z*(KY3n$8~0Jwf@4pk_vz@9$c2*(Fx){mO<0xhtnQ_=n2x`hNcfiUHiB5I`K!|6&5* zN?sGe8`gg*`gh~d{*(a7{C66^2>iF^{+%5mh~J;TCG{`qAY}N9G4cO$^FKs~Xv*J= z{hj>}1HU`xH@Sa_;P32z^YB-LfPO#-_Lszd@qp;czi$2yttE^8uQ&fe>lfDmSO02c zns3+98t2e1;21yyz?Mhow|W7B2PgsT{X9`Be|JGP;4L@lP{~x1Wt%RcRQ3|(Pj7uZ z0hWHdvrz^Nvdl9;aXKc2Bd9NyjTY^MmU4&A z35^CaLNXp_i=m_PrToRic*|#JLAbPGDYZ8K zf3tNknCFx~Ugza~ZMsMG`pwU*M^wy|BCQLPr#8hi^Ak1J5x=5j@VM1jYr|Vql184s zdNni^KiiOU#H@eyX+(d`(Iu^;SsJZm$ceVhY+S=_5yim)_58u>HD^;BNS)FGiX8B- z5B)u5JSnH%{fDAxuu}b?l4eRdw+m?jhgEhtPtV4|k&!~KT>v|@4tPNt-P5D*_35fs z^Ru2wj!yQe1eEl=GV5t=qqOD$ zQPnTlD;kjnKBSTuw35QMs6{-bm4Fj?L6*|Ra&}Y!F`6UTaH-UWP1l+2StxG9(%Imi=~);++Eq@ag2Wlnr-$l3`!)?z(X{pEFyDYO zes*>yIOKT;@Va67a2pcP6B0nkf|qCf;51zkv%U2pGEy4ypvb;mq>XK5AO0n$Qx@d* zA(^*kaRxVz8~xrZf$NVHy`Ur^NX_`*(=5LyDxiB?;akOZIXc7_$8#tZLb zvv93+Y(t(Q^yP#!gO#bLA=1--4pyW#` zZJ%unmy%s2kaVMi#87fIzfEI}PWiEK_3bejR;t^1ixR}hUYz>&cpP&hBGT(tdafoX z$7B(BJDp-_T|xIX=3-DYm6%=Z{Pbs1wC_$P>oUee-!;c8CP=jTr!wn4Qx~b(_-6Zy zy=yXjZDSa4J}$|wU!!D1)m$)KpK%8$Y&B*0>a7itFHkZ0>#?%LamMI%Q?M0lU+dK=2IF^PI_4spuf9Le*ZuM8lnglEfqvF6 zJXw;Fb`kNurJ8hH{LXrZABPJel_C@8=O4p$Z4>Yx?sj4wXo> zjZT%HZ8woG3^;l6I2i@_vA*cl^*NdWKrcY}9OVq9dsH6=84OIUj>oLCW$(sQGJd_! zS#@J8iId?f`XYRJCvRddTm~m7l_y(isUnc;(U7vJ_TJSjms!)dDh~!w5o895wOrTT7<8}Q9`|cf)_uQesF}B z-F*n@r!T0r7M_&<{>!8~W-WRBj8Gfa+HD8n39nJ=#wYa9qDrwE?_nm~}NT z(+)yCXZ|uQqSGR3FwL8juWC3MS1);KXMfkV`bO2Z+^8}8t*GYgJ0clr*ai+1xVuqAm;C07nV- zxmG)W;u}1L6H(Edb3)Yfb_V`N3BztC%91GE3bTlF(Kvs~`1Nr{4Gp1gF&<0noiBMM zV*=i{$Z}`9Go5KdE(eDz&!cIC-^pPs4oz|%T3ZlYWQ<-HS#Ay<;CaBV8M}w1;8Fbz zfG1&1FA(>krWvNUG+9$}L36b7lT@2aOiWGog$%^X>6NY2${W>w!FcHE;|=elUjEI2 z7dqJzEf=fWV@ugXy37)z{L8Eo6cj1utr214sP}ui#v)n_s9WH-7?)p`f@r7>xo^@% zy>HpYcaTubBBVUeW?Sfvfgl(gbB%DHLQC8sW*WdG=-)y1pnFyHly<$?%?r(*;B`>s zd%<>xUCPVz4MNYw_a|A6I<0me zye}I;CHpieJcoRE?dW8#YB=AetcBNcUrsQrqxS)-XB^fFS5$Pr-H>-{3rg->I=nBr zKKco~?1Qtr)r?i3B-YT`VR**mrkYlzJKN2f7(6q%kYsbPnK`PF#|kBFpKAN-Wn}cw zs8Wn(mH84)i6aH?+r;tgx_tqKB;n_mQ#D#jR*nx9k_G%bqSEMRvwczCE6$1Dta!i2 zqf|(H4WL=D0bX-v$b94IjY{XDa#l6`aozna5;2T4~wzr{@5B&lqIGS03X!UsmgJVk9Yu+rKK^B#I7Nell_@&uj}$o zqYoh&&F(kvk^SfaH^hJ}qYtR>HW)#hHMle&6&8ICy`W)JiuIqvrk_duulHD(9wylz zg=t3JIcN|zOu4uW3T;;0q>z%9JvhKt{er)SHX-Pq(LlZXJg||FxqqNHr8d5E4+xPm zNf-~rb)btd1GPqJ;HkTKhX#iyD35V)?Bp~~FNXTZ3}P~ebl0pLYocQF4mHN_AvW={GD*rQ&u~H+--`hiw=t-Qs<2{s_WcVqZFKWsTHV$ z`2fj7jc3w|?KIIQ_#7S2Q7o>m6mCt3D)lgC}uI%|rKyx+8H^o&3F?2F~ z_kWms%c!`zrBN3N!8K^G;F1J)cXv8ia0vu=*WeJG#$7@aT!Onhf#B}$?wm#5z4s^Q zj{D>Ox;+@(447+b&FZykRz1Z$oLMX9krO+#d}~P^VU{Z?pLMzKyrNARk14rp7f&{= z3BL)%k_yV~PaS1pcJ?yGkWwy%3O&D)k!Of=5!aAN(I@rL&J9ZmglHVP_IFNtuN5Yn1a7P)X~9YRKy7; zX3EPmaK2K8Mhp)h5!E}&_RE4w8p^EwhP8&=@7~&&P@~yw9u8F;)7ks&-C2@<|1|I0 zY=as0gj0{Yz-;tyFqJUJcy~c$^ib{itOskmBxv(=9{LOnNv+x*IV#F(jPSKN!ojHf zE-LO?`K}a1Nsu~PjAED0Ycxe&&3=NX&kFpF*E#9D2Q#nVZ&Ve3f9pmHil167i@9iP zQWeXOo}S2p77f@~cOU%W6(6r;Nk-oq1ZitrStq48tzF^6^A+{=V9eCtiv}nw2Xlky zyc>t}F7XL5MqD}HI$7-md25y0yo`*H(|L3xqcZuZ7V}!NLt|AdcTQr~Um-??nV!WC zH(n}2{CZKLf=;I=Imf|8)33xj7%+A$FmiG%{rS*bBfP2UYY}2o)h!WnV2Fp{#NhI~ zBg8-_kFBm`^3>tH(qx+06}Df76p@O5PX@a#$xy_;?hIZw3|e`(GS8CeZ4>ka5uE(&@4+b0}OGA)CsGdwG2ZmcK7pejw`nA~H#C`rk z48dm*sCXzQ^1Qy|?Q%p>EF9kiND?KKE+x;P7t{kReAMrGm*bVfXj8{Gz6ClS#L;!d zj+K>8IJ|tTqZkSBjOy}-24jd~=Q|Z~DhTb}!=vS5a2a6w7Wi-VqXV-TV);MkZp7dM zQK1$p$owuz@v*4(J9?IMmN01)Gla*WTxnLU#E()8E_`e8$>OGM7CLxT#Hh%a7ezqc zHaRR`sRIM^$kAcQlm>EPe80t=0mo|*d7uLc7~_Fwc_s{H=-=W9Bjeo`&}th3P z!zO*YpbuvK`?b)36|d|0Oj#o``kJYXSfWP#C8Sw!qVa^6wUo6)EFHr4u6)Hz4n+Y6 zJEZtl*gI5m!uMW9U#;fKgVjFFhqMqSeYM#a%`P6y&{42&{p0gY(;z1K<P& z%>(AF(XhUlbgp7CfxLs2X<3N!v@|-v$)eZ?b{D!5=WW`z>xAf4l0|of!gkX*>W8i+ z9sFM~Vg~q&JQ=@H=gbjp=txVBTd>)zb=UTv&7k17Gw1O}3NCWu5|4xxZd1^n
$Ipn!T;q&;n23lJY<^3^@%feZiZr%eg^pC5fwpqco6tr9f=C{Z|Z z=uCkOHQ)i33ZaCuUCE{F_lshO;!4(yHU6J83Z(xu45a#m`~^__(+}}~ ze*hP}bo^f*|JDEhH8jiGc@Gv70dJ1fNkM^UCzo3t8_!@C!2-6F4@OMdU6w78%M)K3 zBm3 zcCk@NOWG?wC@$SQ+T%-}-pP$R8S^-nc0DesJ!x+|-t#OCjfqj?HG+k`IGQA!N=Pub zl8g9maI+e0c`hhN)vEaVOHWT)CYAuU{xdR~UCFTnn%3dP@6L`Hl=QntJ%3 zJdLEJW|DKS5EB>o z2YZ`fcathz4u#ssO{A~(Z`Qgu9Nx2O;A^wG`3Vu@a-H< zuHHE`^t!rBeIxzi3f3g;9632T6&}~tCEIs5cWXcZ_N1ASkx8J`DkEbnRIX%%iiHbs z#&`oHbBxGZ!ARqGi9DnUQY}!hvzF<@bXE2bKAf*H+USe1q@d%5lZ+zyV^$VS!Y}F6 z^W$@P#j*u4+D&n-dNte`A>gMJ~+;-anVR1V%#>T_*kByGbirLu}XTmKhiHC@Q7AR?6St3#4-o(Srt9hPK3PoZ{)j}-n`m!i?w5s}F=XM5wvNu} zVeK;cyLV8EB4OUcF#Y|T6NhziUI0&iqC!#K0IC^?TtjScZ+BJe$m?=h_Ufg+?oj^* zxq*L0&P9n`q*nT>{Sp-sRoq*c40!xum?a>5`>j3D^SAxk1|5)GB*seGhQ9LY>{CK0 zIkcJvXh;mL818HK$dDL_bIB*uFKkG`bKUwKh%ekyQcNPYjuwtHph@8sJ2bN(zK*Y$RAK4zi6 zuOBsr(l}NHX{c*1R9|8y`KK0zTBGsd^ecBq!aKbKXC3)(IRU?F&J9eyX2)d$m3QD<`k@~!HU__;QD7?9&y>mO2#cX#Wgk=5(MiukMn{(f z02^ALKf76_@gfrUM__|&KT1(*K)au;K$nR+^K6egVUW(ppPJ3J0rB^2930<9Z!`Ek+QeW3`@?_!q@Q)5+PytG z*-k&8D7*#44xn$mK1sK+uz2YAqRH!W|PT^?l_r2=dJD0gu0sAz!l2e8UF^~<~8X^vU6Ik<#HDK9PMr2z(5B8 zl@Y%z60a#Gl3fb&A`12{^q>m?z%w@R#6>fdc!10JEB{5W`>W8sP}0zV8CIKY_0fzh zAo6~@T=mu6^V7EAsnRRX`C6Oc)Kp%L{MjZqRRu zau%;U$Mlc^z!Y^dYkH+}vRJQ5V=Je&x;>hT?&5;J$_kSi%HM1nl|dgW^F^&@fL)`~ zm~O}7cbgwe`c1|X_W4p&sZN9M;qTu}H+Q$lYd$cP8lAytor@mVw@0DJx=es+@4>qt zp)&}TaFuR~O#79+y0}QzAHZgFrPJ&#Pl@l`zSyZsNr0B6c)WCT!TNMYMzpjfu#&`= z=}Z|8?I*0!}wfm-NUKQ2-w@Fx=v4e zG+r3bVeJPLs!2^2#R1?%)3|s@_Y98zr;Ogru>Sk&H>0=p=iAJVJ4)Y)Szm`r_v@>K z7<-QANhh(IGCWZ&xy=n^NUO;PqmX<{W;N{?=zyt~m65@1XxIPbbX7dN(r9gMj&#K6 zS?Ut*5_~^EntY$R#Bnd^;j&8E8<_|FfX*#YMauf}N=hb3m>wD$y1*ZngZC;Q8fq#U z)YFFK_I@&|HTpV5B2N25ma0(J++^>bMU_2pp`lwazpS_wo0)F#s8DsP=C`0xk38pM zJnOA-bm<_x#UWL*lSo1vq#mYQ_s;C0@v{^Y+?bgcq*vDZe8M91hX|agQw+< zUC6MZrAGSQv?$2;?V~XZl+y}dWXwQ#ow!_87L_h9h~ z{qQq<1wm2pLb_HVcZt_Ja^as7{=f&R01q-s!LTa2UtjNAY^XLzuNF1uj(l2fI$@NB zbD+QO%WEL7Sw)}`umluP4w|z&j?awHvDQIOLu zr;@p?!)-g`J?uULw1u}T$Xcqb>CF5t>bdw8ZDyu`;1|oeDi^(-flcXoPM9p%0lYL9 z5*G4!`qFLcDWStr-tC2Irl|yv0ju)hZy%r@GLeKLiY*r#N*Hp+3lx|0NZ&19?r59~ zb;E6^lNxjeV}O~YyfSd`g=wkiGe&Jx<1m+@UgJ@Z7Bx2jQFXz`IoA=q-(}&)lQcMi z6CGwe<)t?_N|I7)eFN12eLK%{7NzoK%~x6?ED7+*N!XOzZGQfJnk1l%9Ql^~y;b*(E>Qij9t{~)xH5xIckOE|KccX{`rE$cY^QXP{gI4>!4 zCU}e8|6cV&E8o%Bgw3QyAfK&Q@H!S4+Cq=f%EdHzA6d)rKt2-%tM#p&0%@>IkNbmB$bh=P zBlcMkj5M9GlgwNKkbj%ht2%`dZCtqE_hyp}5V(X+(8O%DSd%VHeYjMWxJvdB-G8Ws zNhFTngfrl1L!O1k(Vt24G0upmT5-80P+-UK(Pihia{5GriL61LatoX$<+FEU^>drw zOzZNP`p&j`3Ys!>OFCJMSId}~)nZB~o3CR6|CA6RgQ2Pf$T!vU)WxcEv*cv9C!((W zs;a5s^$FcsLkLo|{`f@P55-Khu6=l9@n}AHS%za-I%Vj!`WEwZU^gvr{MaKP7!8b; z_JuZFn~eaN2Mh_JNNq76Gea<4}7_e6sf?; z&&ec1@J-8fn};L~O8uzxnU+}vTlObphQFT9JuA34&8YREJI+Q%=jlB*th&XEK0oPf z+I)m`V@Rz78| z4~p{bLxy!A-xoy}W6I`R!S_i2*-E0&MRp^4w*%_<))-|MfsCGh+JE#$nh4<0L+%ZB z^}tTJuz}1JRI`mDUxuM!F?3Ys;Oj?UqrRJF_YcS;85e~&PR7mI_DJDThK_`GBH()6 zM$@&l+G2NxP<@l=gSfwUD1}<2N2g4{VOe+PsE%)|-HMTV4|^@R;?O`_9I&0{#L>|q z8&leP#FK&4mc@_*LwSJQ;fuYoEup~Bd}H_s&y<2ll-En*^j+(c1NBy`c z=-Z;UozV>jTPNw_Q_uHRGo<`Eo#{6u07E+=Z$eFD!M;3P4h$3Q&XaXGI~*GYE<$*8 z|A*QQva(6mx!T~_0MC3`h6XN#i(q5lZ7>bEfDvJU5YTP6OR0(A%{Q3fo;jR58lR>t zZkOXFf9vdR{I0ZIBU|A%5zZE=gg+Z}s^oWOIQ;$l*kf$6f3`c6Osrj1-1r0HXZ?3I z8uE&xvPFYqG%t4>W-^1vYemHVuqq1rGmS%M>v7ypCXTg5X^aBd2KTLEen`Zn zkL}Ji^k<}^_w_f03=>Si8c2QP*6$vwxNIW9{Vj^lFQ$2J&-RYKC*#dv)$PfHkfs7u zSi@EazZfK_s~obInU9jqO`VJci%J@jL>~+1^R)UJdz4{57LE}_Y(eD(PR*Vmuz%!*2 zsxRj|`Vy^bgmF$iQoi?XE{kH~8Lj%+!*kS8N^l`NrF`-c?8w-(u%)hgZ;>C(Z_A#w zQduEUUWJ0uu?&p|EF?%Ih?}c1$0I4b$!=<%k{^|Y8_d@)-E<7Syb$8qL;BUP+cg?{ zIIOjuEQR!3*{^p=xs;Dx#l&4T$Uvj45%|nl%Frwh+-(zbAcgjYr*CSz2k+-_?6;Fg zi4q}v`j|xRAwdbeVOR`hIV+qbr_z} zJ~xDB=O%dyAi*(y)i;RfJH|P9yekh%QQh?MNg_F@;pfMmUA?Upyffdso`sc?*<-P{ zSuCTk38Dwf9L_%$OB+N^<=QexKwDgii3Ki|+no%-+%>2S_>u)T(fgB z&{m2?som7J7zvK4x2v}~+R9R~%_?~TxANDKT0R%2+*Q5i#Fn(VwAsp1Zx-dkNz4(| zG1w^<#w;iI%Sm;>&ve1|@p7t^zvm8xz=sj)9vLp@tanS^XvE?>q)y#M5QXi+YlIvx z9(j2Vugl-Aa{)j1+)ktsUk?M!N&a0g`Gm8_YDwNTRucE?*U3r~YWjSyB%>wB`?5On z!rnT?0xlkAL8ixXlfk!G;IHzjkQrlE1XD!ucTi{nzBB=!u)lI^<`}MLd5Z$2f=`&$>knhO1B-##vz1)=E9JTyNH7F5WTsjO z!iw#H39ly88WzjvKIFbgzc4;d?`ZqEs@p91YuO@v|0q|b5Fy*rR{pBLN{O;^;{g0C zso9@^DenA(>fUCeHG;Z`T(R^@X3RI{ES18C{wJRSUOf%st~?rh^84bU=7xLB6dAnD zw9L_&bJGBSnpfP+)b{(V{;%B}TI9&@`(^>;;kjq*qr^RvX;V*#bm=w;@!@w;(NOOP z+*r3fqo=75q*1n$d$FCbxB|K;BqkY1383xwL^piWIWQ|`HtP|nce7ph(D>SflvyM> zL_bGD_U7z$}!=R(`zZB!>E5-sJ-J6SRy; zebYkhQMq_x2({SO0nxmjpS+5u^AHj*t^op~!boO10SnawU8|$NBwRn4(M5PUjX_E> z#$(0p(A0C%Qo5t}VQMSzb)mcX$no;9D}Fv%dJfs9ZSuKg1XHBZac`mmeneSa3sND$-pyX9_aji?1)LiHRktUy!e|{9PVxzy;HA{GV?g^$H~KM6uQ`kC$gNjWfZI zRI!}+xYFw9&&sQ0nw5^4{wzHtxGMSqBu10GZ+Q~MKh^nRFl{Sa4tzIQE1!hl`epOy zC)mQBi({YH>ned^7TSF!^BShk;A?dyNn@@F4hp&u7+ew2@6yQR=DuV5g8Z^gt~ zQ7n6F){}pien2i#k~9mlXyB_Q#LE*~7OB#Zi-8Vahei+ZyQU28hBlt7w)*qhc1(fe z3z=iS(K!dBR}oF|;4QAhTE=p>tFM@vdIs*glLA%nDx&o1!XB)^?N9{Dg6q<=(J@K9 zv8?|)D8cSIz?Y^+-wiOu54$8YsbzO}raiX4(ZMXS$l(2iN#Jn9iMu$fnQX$#?A|v3 ztGJ-*#dkYwuHW4|nF`AYa#?WOzts}-RDa^7?MPTFHPZ>oA!mB4Of#WgJwX}EZV*L|4~0mhuLPa5Y*W+UI)(h;n<51fAI^E#exoY*8hUiJZjv zrnRQ$t=!O(gM)I@NL{Z3hQC(i;%|;cJ-tWv!zvR)!5ArRp`C+ll&HD>3wgTcrNgW{ zN4!aiz29FGrb0Co8|S5^(Numbj9}o?n`M;pC9f?Vg3YMGsZ|!#zL63%#)EWQpY3t(%SPZ zKAO(ux|&)dBXVV{bX^eUQHCIkTB3o51_oqu#x0XtnOsH|d?~w?gdnIfrJrbcgHkXC zx__zb5u3}ya}+OU1S=RA#|7&22Kg6iE{!+8KM%NJnGy<3TwjSU6R@;}kmYTlX_UXhQU5zl@?s?v( z1rtV}i5zRqvo~c;5dL$aPFqo*dgrS_rqSQ@(l%zc`?B|J@*h!D42w1tNS5x5oGWPP}>;w6UnqBpEfBuk9r;e?2Rn3TYjSrKF zigP+Vc{qb#(Ibp3cD_pL1-ti zzv_|v5da6e$AQ7%$rTy#eD*PtAqP9l)o+1P$lZC7Ba$F(n!^F2_}XRna4ZpG#K3^j zjQ}xm&|aP0`aX6^v&kZ{ICqTWZkiih$l&#|m)_xQvt(ZRujK308*gf0MQgmtP$#f{ zh8j2ugSyUNCug}w&li%^r0-MHPvHOj?%{=>j9BHct#I0l4R+P;>e7C-(R~1OO{okJ zC1rB#12Mo?0At^ylt*a-XV=KcoA^zb4DloH$)gZ|B3w4N>q=JL3Xhk?W*C@1EX)nF zZ!}TQQ}YcGqAtSlep#~`|MP*vntIUwoE%szR% zTQf}T1MpMR3kh*%G-+t!VD_I&+9?@~GA!-a z^LfmF96EJ({-#z@47@1mhv5Qqy-0-tL$+)QL}}7Z!uxS^+B~`Ns2j@0_87n)$|p>n z!F}m)EC$@V!|uGZGP;P8fQZOjKKgx|(i$8?mM=p|=3^b=lXp)0zk~ zO%WrOUns7OxHjH8Vy%XZLp>EZV=ai+3&{G5u;Z#U-H~txi__z+k!Qb;Z6Si~g^;)` zIHw*S&C*W=)}d>gn&sdB3TuBpSoC)w(t-^-70mup`FXzP)C-^`e*SgX)6-K7DC)y* zw&UT9dcp$dOw%p(RJZMe+2M!k1H9rQ-AT`k`}JF0Xj0b|=zk};!>13-e7mq$)b_$A z>~7L>zpcy%{V*QW&OG9_I`M3hD_q+e+~D~I1)Ma08A&N3>+CU`39;kxehA>Rnr+aj zIF+_{*&5P}AmUdR4UU@pA^-U=gK(dKXGYPk!U5YNHGf)fux0&pvDT;G#jyDHgjKPb z^78~rclXc~`tqZd04e}?8(Zy^+*rr6JTkVNZxL0lajoa|dHQyThF=;2(WtNLrZgK& zuxc=@Eiye8uACgwWG(E4Rr0R7nW^`tEnh-5>@!HWOc zgPKau@AP#l@%mc!Hw~#z;x*t_x95Eg1(m{SakYX9pqLKc@;O#JAI*JK{PSa!g@*o( zC(NaK6tq^2Cs-olbZqwp1hnvp+vTVUfQG#Rcd&g0pzeydXW@E7`R=l}XKz_%)Z6{& zkkHffCN{eFPOq87#TEWMHwqfHeE(?Pz*BRa@;rZj)shMYg}x@*3P33fGrV5EXXDe# zHW=G7Y%Tx}qTYY#pmrhTuw*f!BBT2>R`cp5edMMV5bqmY@36N0CY4U%@h&o^yQryY z5d3MHL6M&J-7Mezv`y=kgWeApAA;-M@Y@C`s3S;{?1gh9e|YEW&}Do#n(0*UFx|^Z zlG}jc3%1jV9WpINJm)evUg;HTM{TCKk ziv^(n{uhJr|7)g4vA^jf|5p27)WZMz?Vo1;JHPO6(f>C%VcVKXj5>AEHL5r93zo6; zi}qyUVDGQf8JXePxSYa9!)miA(l8Rvmlo-N9fgG}HbrMrRGYu#Ojn@RHuG$sVq-)UpB}8ug zVk<8sAg(oEV05~1^3-Mqg_unj4%f1(pk%W1J9ay1M%e(<8a*9yY_U8d#e7vz14`V& zxxMrx0*Z3Uht6=FIR}ST?47_YMulV>US4q=!#-EKBnaDCqP~4<_Hpq!q;dxmCF-na zJQ{M^uOBhIatT?D#mK2cK`iZDv1UbqrRcKtsNJ@#dH;l3fpjA9N%8Vx_X}k2eZQ)g z0;iWf5wAI=j7V2}89aya=zi0WD21Rfg=rv126ErffUu$>`Va^NTJ7k@X5-k?|500u z2av9%q=(xki>8GT+%9%L6WSo7^*(!4CRXcwj7k>d-7dwO=gr7$L|cNp7bf8Z(2lCx z9V1(`&WDa2pKY2b#KUm_FDsOJ|6pdXIc>X<_l(Wo4nH5->Sw~YJZ{l2OVD{$Go)WE zT>ienFnk~1LA7P{^&V}b0^*Wip_o^K-`IWKb!$Siw88Gh#sVtUt`A$hw^S~hddEXe z5~FMfct-~|_9{9noPGYtaP{@$#I&M`6h`|0hqTsDj=}IgTMPqni zra+N>p}gO`35Oq>&;d%M3JxyhL;5KHi)r_#zLYMq*8w`y3`pL39O$v3XncL+cdlcrJ>u%x7u{Ku=KT09qJg`o66 ztrEZFrY28jILqO?!?SwRk)ZH%>&>&tkzm?Ce_vLT?w1f8KjHh&?MY}ndUkeA0tU0JzVQDewY&sEd)Hq$BBq(88s7ml%E^9QI zeN;$q3aNKUSnJDX!u+_kPB?ws*}`8M!j(z)JY-PD^x@9q(rOu?rydK4(dE-g3IvmR zr4rF^tuV1qcYttV<7%*bJV}AIm4dEPl6z$NMBSm`uABD0iHS65W7BXise%m)De&90 zQ}lh$ewm|A7ZuRR`@m_!MKk zzewMl)~}F5H7uEQ*r+ln+$TJfv+%s!JzB8iR%zudjBdAs8Yus6SIhsD6IH7Ej?joo#K? z)h!q|Gi&Q#quA=ch_xtfoFk$mw;TcAg;rc;sPR!F6nKa7(h5V5C2_hGZm`H@aDD!e zcYTi7TPIi$N~hQQ#6qHgCQx1>5O9007Gg%gYCb`c@l%NIa^YlPI6HP7QB}U7PSj9J z3qe&iU!%a#T&**@<^0a@4xMs2(Ni5MwN-ouztS?#=y)}k^Tx3?nDM1S3WDU>zCMhc zygZaIVPP`1Kg{w4Y6tVan@{9IMTv2X}k{j;89h-J>7`BC0o*gFd;o+gH97a%>>lzUMuc$$K zf>rvt>a!gD=T>X<1s(tLlRNA(0LlA_?{u)68_MUATl_n}7G3@yZ_n564iGl%BvJ7X z@it=?1|OopJz@GExM7Vnxw;&gkuHb@BOwQXU8Y7b->f8wd|p|mM0F0kiaaHtI_3Ep^)QYVmgrMU?8WAr5Y zYT`6FgYZ4Jmo`7D6Xkd`D=L#xL>&K_24xoBKuVM9(C5QpRIq>nuJL-0FzJ0&^`q>W zVhD5h2ckt*f@PoQ$CIYWc%bp+{K_Lg-79=02 zNNk-ANe%wT+icfGT2VlgE~Ce*{nEemrt0~q*cpJs$*cP|wT=aKq^0|0@RZanFGLb| zT9+Q4tn)pHHb1vmVr?5v&rtrirzQXMDDk4bHDZGMaKIW6CKwt20}@s4GA1i}I;R|j zM3z_546o~Ff^QRvg`8GNjRXIt1Rk57UWW&PKsQ^2&TDfKue{HyAp}!)ff`O$v&#h* z3FkSz%wQsf%;oTJ*XE}DQ8{EV-@)2lMY?hsTUXPnj3nIKo<1=7zf^Gfh*v>vn}HDR zw?otd)v%-ZF)V(_=y)xeS@i7gr3Yz8n`^4%9qZoOYxb`rXRmd&k3Z}CM`mzDufhS- zbr&@)he>j6B-LffCh6ljDpiQ^2(|3ZrT$6+@KbOZF~9g^Kf<*TX3lMIZ|ZfuPbwm1Aau-wc8Pn+xXp ze1tl^fNI;P3pd(yDD|f+r?Cv#*tK0LJ3f+t9jWMXTL36n%l#1e;n*b`70(amvL4-T z;7;E2WNs(h{qbcca;9|O#E>y&wLZD6$++p=OtYM8G|Vi$rCm=5Kd*3fK^tw( zS>7(t75#}x(23%4V*P2J`g?8)RRo_tems=W=Ue02J0y!w_O5Az+%2+rcg zBFa|K6AkVYY@l{B>qO6^tCLM7H4|Y9;v$RU_6{oKQ_^SdwNkW-eMtiPfaste+20&* zl{DsPJB&tt$eB64{;-e`=&wspX)-}};z(B+Z!V{o8rc^>Px)hNAbSl*Dc~E{$1lZ$ zZT%|a=t6^61@8<=G4`=gUEw0$AIl1vQ{m+ zZ<~h7d@KVh8%o?Ut5M^3hISt$oJbnZKogmdEC1=z?-P0rkIljCwIlVAN}2Q-PWV3D zMs3T=Plk`}+HzXS)E!jx625@O2v_%UplMFYO`1v?f~v_HPyu^a zDd~$oP!OLqEK8L^1LwAjub~a{>=W71_W#Jq0P}wg2UI z@I!;H2+zR3vMw0~2iOS4Trt^}Ep#AD^v!Tyy7j~YgWXcgiNed7)x3Zo!swsNJS&ox zJT24mE;Pkt{HLJQGewxc#8u*;;B){&uAp)MM?QNkag8pgvq@-)!J3y%-rQBEJh-MF zx}~4Qkh$6MpdozqgSd=Q6>j@(Z&wn}9%~R1Fj$r}GmaXgvPL9v6LQedpT@3(r0+EcKS#ulj~Q?Fn)pmcdlKdUMa2s04<* zHV#32)`TQbjGGEU0~i5-@I7t}11W}1QpBHFPYF(0-=mENI$eBmqn{oL`DC~lmfE3p za2z#ab^UA#5!MLPUd3;cq^Y_FE=u8Ha9M;V3fCKT6rUoK>kBSQhV zw0Pg76%*O!0dkIZ55Wlcp&`&^0@0d4z7z8zofH2+;Zmtd`wSz#Q?_;w=z(k&PhbJK z)voGrQD{Nfg<9GW{?Wf{a!e^I4)}ZKR&?C!!6JbRKl_LdWY+?Wb70Ex>0yjygC8>D zeF`4O3@rSJ3pD)E(>$`JBrwfINmX=j43vNE9P9-G>IR=aL6%NbJQ9rVhWE`jBtQX^L5pst*Dm*Z9DCCq zw?0mJ;9pO(d0zET8~Wsdaax|v;2$nJNnO7j{4qRe&j%K2uMo5RuB_lgZ1!2+fD$IO z{X^GR2ndep&)AqBEIctLCQf*|howGSijtNZv;`r}%^f_&!2~xS5rP3EZ+oZwi(aHS z3+Oc=3fQLQ2~n4%x5DmGpyGM;K67OwRE%rxer2f8_hjOW1R&nM{h5p zy*cwyz`MLYy+LuvAA!cZ27m;1-~IgK;6Xn{lKMx~$f?*xkrEWl-c~cE$k|@=g>8M| zADZE<61)Ra@i27V z*s)@);L%wXgz~;86Slj#O3ftcIQ|izUD@Z=kbkUf0O6ap-&0pn`AI~-iaAzZV;2-Y zPiBX=IRGxwsI{ZHyT3Qsx=22Us9V^+Z*G2!M|;1o_47l-YrCWL7K)wk-PzJw>I z7cOYc77E=H^X=I5xe^)%$JThy_W5~!azqRL%?T^wabLx_NM=vkyI;sg<7l@%>Lr!}k;n5KqYQMuV z0fTix!o0MPM@hsGA1kAU_{i*jT4Fi*{6*-%*IcsX#Uqb}OaTzfx#%28jJrH(ZrFB< z$MNGdD%kIH;6R_U(G>j9${IeOv00N+vv>T{d(hI+7!6=6$N5}keEasyW;3eFM}Zi% z|KMsV*CDE+P?Re9*-Tq`j@|1!eb#&RMB_yg@ZBW`I=D9H%cXkGxb-t3>RxS#yHl$8 za?aX}X<0MNXsyjWuXW3AhLw-&VvOWd3FT)#2gf}#sV}wHBBb*X z%5c?MlRsxM=_w>4N3;#3@tJI;zLPwfIPO0=%cZe#SM|53rFRS+3puY$F|L$h(X(4L zVZotlbz485XDZK>e`>lBF>tih!@gd))BqLPYh3KI)6$b_bF<1eTn?7#IqpyQaNVBv zW>S!aMl_x3aQG#l$=i5I& zp+$@k-*@xccxBu+n{S%ib#HPSTf^>88tH?4PO0F%RUk@`gA^bq+Dw{pl#FzL1Jpav zJJ5KF`q%5e!NTg@WA4UY=zG#=zLwJpetU;C-$yhljtSnAIFUdRIA5h(RbM4CIuI=g z3IQh@CR+pvCtD;NMhGGViN>bSQ-Tf%Q}R<4vqG|q5mwC4WqxhHhBtaPXZ~VRf@gzQf@OekrZe2qK*cPx8Rea zG^+w!X+*;y1Bg%YOW%`wWJ$PLt=K55{uwcy&423*P=Sc}%P4^NzeAS$J5H#7PsINi zC$Kg^$6so}pnv&2PpQyVY;WeLQvIE$WL6j5p$vW+4kqh|fSZe|r_=M%^&9{k zHw8}U0TwxOExXeQa6EzjTX`&CwrHlXt~-kKfs?W3yE_R#9T+5D3+=TqA>rNe_0R1I zXO!%G{c-)`&&ceBmI?#`2MIiu+xp!dRWG!x^@#ziCz6=-aLy%^fYnqywI+S7AhWjz z?-5>n*_*U0N-!d#LqeYA6y|SZm8=$1u2k;VMEIius)Fa&lB90T4K9!GO6&I$TyyUw zPiJx`*Yi7S#)`kzy6&`_=Jw9(buD=uB`5zgv{1mWTpV!1<_H?#1gZyeB!mPA`v*(d zot~H}ooE$nRFGrwID7MN4J8x)BLTeUKi}Jg{g7|4MgjMdmSEN{o(XMDmA&lL^tlLD zJNt(U8k3CUg$g}wr|t-}r@!-S@&*2YqIh@?al(S_l5@WT z(wp_+X~9SdIIFeaKZ8w4fE_OcDrtIxnk^Jvu3J0XuXT%hyjtWeqGI&AIG7lV9^&xI zvHz>zYPTMD%OJ*E!PWfahbcHGMqNOV1~0FONnfy&0#8VEYB{{4D_4lsO~UZ zuKEC+nK|^uFYj|}-x&g!QiwyBDw)YZ1%*(+KDXb2ifZ4mt&MD~$fZ@I&Q|%K4VK4@ z7`@^1B=hvpWyGFao+ZzwWwTXJ9}J4<2r9{StD0Uv8!UBMDfp{G0Ii_%4m7a4{qrCu zbw5k-UkU_l5B0M3{_fKky+H>G0F=x-;Qd91oLS_*D60Q!12g^AcF_O3cn9|Xqt+UT z{Qpla|67CpTS5L?^Smf9TjW3)z~SYeNq&ggI(YJ_khIS48|ZY0EmP^bm56(utkNXwCv*CEvsusaq_9~K13BwZg#ZPE0M^?tEJ(vyY-l3oUwR^c z+d9X6HL%QDT7Q?|x<9PAe(2-AeTaU1bNP?{euPJfH0YERmzI{Uwp=6wc7G~jVt-sg z7vOK0BXRhR_T$HY*K1_ZIi=hjPIDR!CF)6bcJwd<2cxbn?vFDG>{Z)k zlvQ(U%vGwAqAd55)uiJRqAZPz?DH+Rs(b8lx7Xf#=`YnG?W~ztRPumgi|BwnI^k~_ zTdq9 zNr|P1>w&b=vYS=pWpAztrcZ0V)6`RGn!~|)@f?X(Cg6Jb{b|1BBQ_p-O!Kv2biQ1Y z`Ayj`t5xci{Rx_fwnt-#?XCsGnZ6Qr>K3Qt1?L+egv^F;5_y_^iKCDf#4`=PZ7w-7 zhXG07-1h#A6#i>>BY&*BcnH{Xuuq1>C@Y z-c0|(od1SA#vcH{@^5$hH}_<-yH7OUx!erur#zwSiNSux0MO3o`zz6j(yU?TWm`^Q zY{n5O;v{`GE5W+kGBYe9qke-7pOx0)o$3A$O!nW#7W@653E^Kv^FOsx`2W*Nt!DNcUwC(cuY**+aS zvbpv}YH8}k@u}+k`hn{v_9 zx3)`&aEikRpKV}LFLXbz@7SB>xU#mxRk8PeWS#BtCj#>hai=tA1OYW7g#$H>XdKLt zI|TFr62eo5kp82~F*b*N2nk-=hr$EHCC|sD_P>RtKQB`k8(6*}$?17&UP;cBe?O}x ziJY$WG*LcP{4`r}@1xJ}8hk1!4AiKp1A02HXx~*P5KxhOTHP3s1|J;b?H`0SD zV$#f1lB1$TgG7TAmN4aVw;s)jYDv+~7uQmqNt(vl&kEXc7Z`bY@e2wHq?MEg;%Sts zoc2|L>V677K0=^2TkWZ&wDcUPs%)>#GGQBsL1#vxQPHjfMf7ELXLWyJ5gqz)_(B_h zqSNugySEjXw}pMQQVVbBeUD?Zxxwo8hir~i5Q&G! zwa@OZ%2?X%=Ulz$wz&Q@d9LC*0;8<6a$9wOk1+HqT}#~ z%)dO|dXk(0%YP_@D;(P-oJ&_RubASB%F5fXrqH)4p^H#vcvmz_g)ss!&{3N4mwG{uG3D2Nk12I3U;dLE|5jOlL9v2b1=1RrTP1rIU08((`SF2rY*r4A9vdE4Vm>E)V4aS{(l@ucMgFx480sYECfeQQW@n-k zH_wK1g2WVh;usFicI9Gun+I0z`sC7AJ4y0@VV%R-E8biRR?_Kf{>t01D1#F&zT&c!-K45D}p*YI#4LhaBy(u8daKZ0iZzr z>WT?&CtSs$UKz%tPb^k=$v=C2t`q!^510fshr*f@spzdrSp@H)?+-b1b3V7SXn0d_ zl1>lJT9n^KBHe#!Hh{wMKQEGhY4!_WISFBQm_C2fvs;BES#b8NRToaUe?n8F!dWGV zn!D^VYG`69P&^3mZJ&iKsFlaS#H1fj>!lG$uv7&Y3D(#5saaAo-;2t9(gMWGPBUKv z=anoPS?(L|x#%U-n;L(3#8D;9qx^P@LaJ1m;Huc@{}Fc%quKN96R{3AH=x_Yf64we zBQLk$ge!$T0L$a5w4?+H8IL&-(3W}HOUldy4G$07pRI|;lJGh0rR(R`nENA=Hb;`F zBrj;eQ5ocRTY;UTN*lEd88ZT{Trz26#bP{{UGc*Oe|v7`uBRg^61H_6f_(3hUtT(1 z0WJfjqlGrz43)4LrB3Rk-v}s3{mHeK=bPxllbgm{N;c*2^Z+ew*X6Fd?DKS~p-hy4 zzqYr$3QCivqFgb`yo=wh(04j0*cb_ILJG?*C_w=4;8cp^NeW~oF zN=Dg>raKg(RM9?rV#NK1^bN`CHRWaSmN4Se>1WNkGS4hlge@~tvkJD3D+l&vV z+AA$n`b^QFGry-N6*cwdLERyH+STcz5*$7s?o>+F*WaU9wkNJ4xS6q`-$G(~CiaP+ zpaXC+7kI9#c(Iityk)>Y7E^fsb6Cy6e61D5T^PIAfSjHd2^z;GEwONBIQ-DI+w%iz zQ%T#<@8RKa+#!Z6u{A&|1=T~LI)$a&u=>|8YqcyfL#IMTz2NvBg(h3`CiK}#xV0y3 zbmFDcqC4lq6@o(+CRI#2dNtik(<&_#dKCIHV{iVP*ELeDeNMb#pe7mdx9)2fQVWR9 ze4A#Ee?%NrM=~bPgoF^TlHV0uS-ZvzQIFZMU>^H=z_H^Y+)Ec89H&OQ-YY}X=;`*& zdc2*osKkT(Rn@Z122@gNC33@itDS2WzAys z8$LVj3{di-FvS(lW5I$4yL)hs$VeNPqR$~u&D&dVM1C_R1 zZ(Ej;L|=WNw{FJq6s!~ERTihX;?Mt{>{DHA^3Cdk@f6m08W|~k*8}+u7NiIV{=yOt z-j+Ql0fUWQ?zt05{F5^TPTMlN{zl2;eUswBd?ABIX2$GZ2G%dFrt;2(+DkUa=iR;e z79s(`HX~cx=+ugexi(Mq=PIhqp8lD7jG{8b4pO?}m=`Z)_nV^+N5o?kG&D+ZI05ma zKll?i#|l|Q^6BBVMb9H74a=H>)ZOk&aK|$=f0tC+eUeE()WcI;8#hp*1PpwzeXxnz z?4$mH7$ehO-1qt4gxa?89t|j<{KwEKGI=I9m$b4pkkbK)R6=o@hUUK{I z7i?@?(}%15xfWLzV16xb2ayYVqazw*U@mXSX9Ejvzq6)i*1zfk2olYd_a}=vS_LQ) zHh0I|jD}}dhquF4qph#{9z|hAYYHdrkjJz zMwVE6G4WSNW+3kVTH=wY8Qx}7JK*3kFg?=k=!%Q_9LWV>)sB9z`Vb%9NQEQ& z+i?9pf>6Md{BfhNlu*Z0EY46VEjE_SU(uUV+5LP2mV%PL6avUxw;~Pd#NUhdGEN{_V>h}(NF_Ikt z*-f_sqIL|xYf84Huy=iHo1V{+ z)y@J7>q{*gKDQaZBnr{{M>G<47=T$OziiRgwyL^1NM<}EN@P1?TzH_`bYMb`4;PE* zcK4gCN583ny!;Q*zAhE0#7TBy{&l|^b{vC_ivF47M?$8eLPG=@YwK3YpxL6Tu+)+b zO~wVxC{ns6z+lfl>K_bSF?&a#}s?)(+8jMRE(zn4y4>ZH|P)c6a*d%Wd zUo&TcCX_A=*#_q%6>^*UYWStinE{tsFK=oezA`G6duV&y7aE6toGW$FBVs=yLT=5I zWvzjw)8uH`j$sInjxHt(WNK=vYz#by7(CAF4aFvRRvxbZ-bOfFH2$_Tbb9qa95u9; zoAjO4K3xB=ls}S?{gc-!?+G(5`gmmlUC_o7gyRvNVxV2-`=7mWyjR};a{}FZTiNmP zv(+l;dqI!M((r3x(toiryO*-@f0_lFuGTSp%eHWIa5(>D`NV|}Oge4j@oh=w9Dlxj3d|1{>e;0(k)@oJ2=nJ45 zr$_+W=R1p-XSh?fYZJ_rF}Ikvn=2c8s=dNdvs|2K@nZXbu%)6`BO)X?8AHsn_b*&R#Uu^!juX%v55{jO>RU zw!n7|xUhx|e_gCGnR1UONjgBp=SxjOSG^;}Ry+6QP89=W5b>n7MP$PII$5_95`=6=0GS|Cx0ZhdT@ z3IV*(rzH|pzM)RXOhtmbdTw};FVv4lk7W^^rQhwmppy1rzhUC`WwiqO<%Naq&Byrh z8Y2h(zYaG%&th4w*^rcn2Hk^CdBl|ia^s88uelga<<$E&RpZKI@xhU>;JNUUul5vU z0UP-dMKM!6v!6uGFP0pxq!Fok`NAILxrxRRBmMU;#(V~wxx}R3&S*cy@B8<(=LK&2 zR0kiuQHj7A>eICR3=QH}Kk?Ih>?0K#0vFES=4Hp`3OGj_<#ZZMn1V<*B{xA6{=;kM z&!2kO^~ohL1d+Hu>8&uePQ+pD* z9b4j3GGsD#0hpL?=t@pMqQFIppic%p>nM6m>fF zhpQ3kTuQ^jf=708)WVPBZ`r$nDQ~`GYG&2yNp0g^(>i+pQ2LjRFR9uue7=G};XS{u z01(TLIM4YW@$8FS`bP4&$KS}=YbUzBS+CNRIe-wTvOOUxBDbK-x*(DB~O)Xr1V6*Na&Lu-W(8RjD1sx7BJ$ywZ=(wMf zzfS8z|EY+E3?GuZyEKDr{}8X-_D{7Z#eJ<{Cq__l5F#(BWyQ>GKc#0bWFlALE?4qV zU;!Lu2Nil#-@HAV&_V)Bx}1^xkHpkFA^f-CL7^|NY((yv-o!a$qDPK9%cDY0Y;sUu zPJL=ItyR(f8A+2rUo;XHIP99Ev)XvsgNhCw;kGgq_x-a@&R!$C)pvoX573_#E0?l- zu5ibmyLwz$nSlo&Gmw2+?lPxMaFXz%Lytt#JgQ)0!ZFt~*9(Xvh7l#Tet?cZ))E%y zlx}$j;6u4xc3kD^#$s=b=lgg3W_W`Aq?rn5p>6&NX?X>B)2n(j!?Qh)5qlsoKJe6X zKRJllW0-ta{(gX#xN3=6B%Vw0!kGZnJ*j-(KuUZCgLj0*-LFLJ+M8^1QP9B_<$p8w z$`(n!0f=sEphK_iFGjp_)^rl*V+V%OTf$~5Yn++pA)_jhmQGYM?16|P-BgX39>tbQ zQ=I#@>458|7Z=>J&*Q_BTZ23n7r@@8tY;8%BoY36(`3&tr*+;+HprQ5Y%&A6)vBS_%+9FQKF`z4MeKDfZ?k%snohk`mO|#+ac+ zf5M<&jZxN)4GrhzryYRKyXpK;Axh}iod6F|uQF3ZJWfRy#H zK%6-V|GdN1H}UULR5c3CFjb6~W_DBW7sZB`UYw)hx9K#hwCbs)eK-6O0q>3h!~W$^ zZEvFL><9w8_`-oFf6KQ$At}}2p4$`6j$ma{tOGp z<^liMk@n%Aey~{O?j%U;8KcvQkERxuBCiw)a^z9nPEJZ5Wh`p=kPh|FG;4Wd*umy; zC&Nea*wM34|2r8qyk=aqoKcMdWI}En>5i1#G0hftK;mE;SzWsmvngbvdb9rdRo(ufbNa2z0|nF%|vPC(@EI)8VLWG7+sp} zFY6`KxUj3pPTN(trS`=eOO_%M z4&1)VCt)?|!0>=13+|I1Qb@o_A!gbL?%z%4#W%*g zz!qZNsOn>+e{(71!Br;UY-g!&w925HKQ#3>eeuL5X>U--1%-`uwfuccXZCui7~uBg zKd{s*9gjz%mnx*Kdf$hA`M{9EBHKKu7pBJ9L@K17FeM@!b%*(mUV`nV#wYTpJ}kHB zb~k(LNyz{4BzXXmwz&T*Xyu5lhOBeXr69A#atE}0q{26V68!F8pNIw^4IOu83AfH~ z9zR2)I$Cl#9^ z^s3JiPK>_P0Sa9*kCe$ni2gotFe<$nwRzwvYf9%E=2`anL#5oS4@QT`c z6hHWAQI;h}$Z!6$rZU`bFzEpw)o8C>80K5JA3m73;xyrh{AtBeDFwxaKI3(EyCfvN z8TmwCw+!MvVf@hJM=B6bTsflD57#^w{c1uRLlP!W+i=tWauKB&DEV7yCBoiPg6D@ij+K%Ic>@B$>gvDhuRjy<8UMW^vfzGc2Ib4 z$_RWHjf-*LkZ%}H0E`bQ7z55j)u%?sb+Y12_r6)0^JRyWELAL*1PVDdQ!|<$Y+18Z z)zrR)4u0zG?ai*Q$8FXEia1IPrUr8^7Hb%MeYyv-x)Hg)g;PXZ9jAI^6QltU2DO&K z*-iaX6*m!w14@}dz@FCSR3Q3T*M_y~)hPYJWq%6eqwtARPR)yu<{^z23jG^evDd@7 zCRq6R39fLwD&xyDpX|XxF{M0>D>-oa4H!w84V(N8PeRBA1Z0^H7r$m&P*ig^Yi|qx zwv`Lx{Dwp`g+d?BTXD%m5oBQx%n`(vP(a|cbX()`6D-UkV*lD)tJ)WmRl69p(>g1S zEvXk8o}2#Bw&&EuSswU!Np}T`CEj?Mx)(-$Yg$wM>?R@DJz~7aMihZuGD;@Rz%&w!l$; zXI7PEGT8$|YHO_8B*<59N0ZdzYUAP9KV7(sRKBR?HV3|8!BYzSXSAls-T`a?>EY8~ z!HKNqLa%x&yT7y|g}e%TYCby92`ka16p26 ztCw0G8WNuqt(myarE|*~PJH+?2lhvrH=}fOe^KUYt^;aE-bk9SA<*#Xe>*}PydO&i z)Cp@BdLJLRJxeAz)oKDn7og)S@^Osv(SnOPY&D}~yhj%qOW2C-l;kznG+Wa* z2GlO--JJtx0d+cl^&ED~8z}4@JMe-8Y$}`g!3eO_Ihr6Qw2G==NRPuNsD!haHsn^g zmRupxmPJOLRoc^JvTkZa)wlVF&QcdER@`58Q`Ob(1njz>Qw=l)$Y%_5iszgAtd((^ zL#0WUf6nB=MeqBBSyew*ULhYh0BQ#+VQPhAYh&pxVs(w+UCf`o<+T^3D~kIcfi0|5 z!p4d*6ICcB#Wd^V%L|^u8c>@BpEZE>cTejL>~Kng=Q+xwBdpCZ?;Q@yo=O_j9%8rD zFH#bX3ER2oi$BlvI^GD(mZd>mC58{vSLE~={c46OC_VeH{g>8G6>XX6o*nZroFC6J zd{4GLx^=v@dzKDb)%^0cNzSMlspH@{L5Rvdu@$XFe0!zMv#NX*Cf;3;zkT%;-9-XN zb0UXFM-S?+`klI6;T8E%>DIJ1W+Lq64>EFQivPB+d6o+5?K4_jdr{cyDev8UAAcM2DvlFoe5aH|tW9?Ll*;N87vA2p zIL4McV6x>aiPWhY!|%{-X5;O8Bpzv!7G4!`F#cXCEjS37G>o^|O%Ew0f-KnSbt zk=uf{{U4v`6|8&9@q49BUW=(Y^17In4_r|+92{qrzAtie2Ie`K@35&Ev$&FN&X5tL zq_t2qOKq^=;cfS zNCb%mA@oEk$xlvIZeq@KnJgn+ zOV&UWD%Xd_$-JepLUxd(%24JUSK$nxo`6i zH{{QyR9ipUp@EPS1TMd-t92Bl-(dTam^>e;DJ3MGti5XFv8+m5fBG1GKi=^QEn^j7 z{O4HGr6A01@_clb0q*Fr%hPcE`L^8&Vf;7cyZ1dpBN<$o3#}{6@9Ax%ZRBO>&09~z zKM!%gG?};u%7cGl8ot_-{#mxO>RG28us^z!dD(fqxj_T&psp`9A@jN)a0>cQ<(>U1 zD8Tj34_*i6(`lzU&=~>}IVH_-06Sgo<5x1j4&+mF|G_aPa6t8+Gv2!zv#>2dm2 zK^RN>Aa&#L6dWu`JWcC|7!fMvVL{4lSOFs=C&vKPgE|DxFN{RXlq9F4Mky4Pm*QDi znw!^kGZ?S7IwMC97K|IYr66<8#G7m?BJg0Hk>Z`^EnXnytgg42t!)- z{o;Z4qZ~m)0}_y8?RDQ7z+++14N*J$J&^ny-6pmM)X~e4^7e+7UikS6A1uCkFm1&d4PF#8Eu>Ne z%HXzY(R^-)#3c;di6~z=plU5fBmgZ8FHP}Fo>f3S3J2tK#akHQv%Zg) z>AsmH{3tZL`tpFc=0E;uNZu)o7J(4X8W0nHv?-6@aF7^F@Mbx0puz^h1!I{RNC~nR08%!?c z)DfU;$B_&>wy(X?xK5sHiAk&L?bmD2F^eI_@V25Wa2Hkz_6DY#@kyq+ojS?zoCTcy zPEYri22Yn=)G=Ll=A0Ss59St^EiRkp1w?nJujj5EeR3?VL04cBVI>9<|Ce*wxU(xY z76)7Cr;W2Q-ONd((2rpsT?&#HZy#4*2m#GrD#n6uK(Qo-ZrIPk-9VOFn~gge#%#Lo zX09N#a@+?uST$Ag+3ZAA0~in}Nn*eYEjXm2XVK0(!1rYnBp9c%u}lOk(5|k{5D!6L zdByB_xQ}6V?AP1V!o2Igw5z(m;PJW%gMaceO>k$kIgp2`c5k-+%qtm1T#ozkJ-rNF zGOy>20KoJBU286=qg&ZI>PY=+s;`&R^YR?RDFbG#k8)C=w$EQHtZGaXZp$xBx3M|) z!ZGRTXKGb)I{Fd<<>pbNC<`gAuP<1BpbRk{fR40dN++_OiW%#T&FId8ye8U~D+Z}z ztU`cZCM$bQMxKhPNqxDNf*Ho3S*fBdt29P8hikDLP1549ccv06-dC0bp&K6vWV22z zmbio|>x{b~srMpwRrZQQF4r6Q6#zMG)Z)D3uDhQiA`;exI+9UhUM!TZ&NI-(Q6@RQ z8gptJR~{|Z;eDS7n`^TamW$K*05>hBydifJXQz|bv&uKAk5M1YcsCYqck&4>?TI(8Z7{{rN|H?B%x(F~?ai^Mk7Bs`z+|JcMFVshk zH;tcWgbUWKM2*CFj~8>;nQy1^Z1zVT?KXub_y$$8h;KJPvEq*7owx7o1)zO5ow9<0krc{8t?`yDbIpwEw7jhL^K9Xi}x=ebpz6hIfh^C1Tcu_wma zy5gDJdx7H7^{i7R_WjY=WoK&9J1>XTiKH6qHo?mp6LafB#aI}2mX5Zv-Eoh_Dzo1O z(23&Ps|oIVm$%}uvCyo;477;!;>2Y1)cGM$Fje+1-HFnnNLlFio$w+}uOg5}5X%sl zvLbFuk;{}dGz_}C&uge_bn{KFuf}Ifjx3)FfBl9sI3@7geXwgi$IV*q1jM9x{**fy zM3;@AW&vEaABSrOl?hnCiriL23%g&GVc;M{gxp2P)3R?1PCim+@g;zsv5cj~AJMn) zjUlvjR-xnGLmiNldgM~li(e%bmQQ#IRxyfwo;OBQOW6($N9aXknB`+>p)})xxNPrs zhTMteM?l~^Pc3tcF2@=a1Nz_=BzxvyXe*k1YZ{jLXUN5;uIRv`BUwLaA^nys?svaD zHQCk(s`A;B_6U+Xd=-rK|S1z!~yL# z(1s#e`5Pf@h176Z%Rz|N>j6Kz{|Ji8Q1hk_8}5iB;yJ~?7g3#@`6D2Aija>h&MpCt zCh+6^dIa`+rw+?1E(#9yqWS%D1SL|J^RNot&)A$2M&#d7x)!2-b$T~ws_B1uJr9gCCG;HRV_1KT^|H&|gVU03jw~>_6YttE0p~gJnh}=&}3JlSRza39#yw8z@%o2ewDFY@p_KPJ@`Ho6HgK!$wT(Vll z({Wj5Wc%?QPLgvs%{D^|U6&a%U3E|W-W11y_lo-V@I9F#(3M{!=f=|0yFn)YRi2`h zT$LZS`lFMX{aXHD;51ynhk!dHLR3knY#SPY81@VC@eYCHF82x^56 zwl|)yH|b`emzWNjIogBTP2yuyXqI`6HN3)hcGn_xu3#Rt+nT#YTT<8^1(Z9-u zwqJyRj4)S|kh5~D6EP8FEnyN&{Fow&nwwu8*TaxbiS7L+5%bxhW+lQcR-oUh+%f}; zp6!)10z465*9d58bUV{VP%+LT6Nv`tmD_uM(y>rtDzV5=p|&N&rU^Nc+e4i}nnCvB zQ&O2n9c&iAvb;kGHgby?;Jrt!YBF*NcFly$;$m_nA&bwT=ojftJ^X0zeC#BWpUChb zCypL;`3}@ZXr)0V9`y2VXB=^!NaSHXmnOiJMlm;OlJ976DZEV2e1tp{$v<#W<3*es zjpBD58Jb>_dvB5!AbM9rVg_|a^C0ULv|ME}OtFRcLu`iJ>xZ_;@Nf*Pt!ERX541Mq zAO~JMltW=Js{dJa6P);|X`+bjeDi?x?E87FR|(nQXvs|72zK9v$re@k8npTHSVSjD zKW8w|o(G)O_N3}oJ~3Qe$Wp7^3m;BEeoWYcu%}yxNU&b0LTBv+*?ZvK^<Ojq@tZekb=OAIt&dTnI)Od7za6u zIq#2Pi!E-RoU&jFS8&Xqh1mktOFKQGg)V|3q1-$fv!(Ae^$>%8ke5 z@PhLc9Uer2{Bcf`Qqxq=@cdOgC<3%=oixw&e>bu#?lIu>Q5OXNP!%t0-`avJH z%hhAuOD$nzAY(!1^m&+(ux4J#+v`WOX?UUJKo#$LJ;{hW`!$R`I1{Ow1PPnyIyGTR z&oG(A*6=y0!VRS46Enf6Xb)Img^^4jXyYbcvsqkm9!bX_-IBeMeBLz*fx_r#b(G;Q zt6Jk6$9AHnOhPA6Avj>JU{XymC1B(>rk%MXQ<(D@+E9NzNlDB%6n`hI41y)=^4A}x z2;K52utw?(4OWAvD(XUKxXR@99=e#GHT)R-=h&qh$_YadeR@!qlaSrd{?(6-M`P=- zvI7!-B2DhH7E-r{$Cw&en-X$_>IQeGT++J(DIP|0b_2?t<)sXJpcLMFuwx*SlpMRq z!MLkze^`k6y~CcY>>e6paMX1!?L=(|56U-$5$-RDj6wGpDyedS6v=2pqcr@&Xy!-@ z>G(kY(F~NV1e0@7R%2GSNNXLjJlLAelYC`Q+|kuuL5${kSy{OjAz+$Tb+W_}tg4g& zUxq=G_M0a1Oki`t%SX1k9)|y;G)YrX8EXfrXrOG4*p$;;tOFFR8aW)X8pl`koM|X= zrU3Gi2zY#l$W;jA<3*RSwRC7f>&59U)2Y?lV~)TKG{}=5E@is2?HVTRU+?m=z9g1p zyRd&XCjtcHkyE(q525!^vVbbY(0+Yx^emX5ayfPQRkkPO4~s58DsWHuMMy+Y-*Na! z3d=5Xryn(p4U?&#ui}hYrFG1*)o3OZ2K|wzK6px8YDtY}C=J>(3exL*1c{ ze}m!-jA?Q-aiCAATDQ{*>F#jHeTAnad%I z7O9M5em*_lR_TaD(cy3V?%SKIC<#)wxc*isSUx2x;JJ}jx%)lp@7Al`lz11N8&g^j zguK2mcv{-zi{ML6u+QWsntfNTf=R+2Du#5m!)X~@?YtZD++DKQ6Mpsb9q32w#x{4tN=e3NdTGO}mh#Iy9CAS$Ur2Q5T`s`Fd@ zpEwXI4msTOHyQ8CIK@&=tML>Cyd&*GfW==NYFywugK5GC1pP)@vDy3EcLeltJkUr= zG@zpp=x?;t6d;iKecoUqfI`v3HUja5^jq}gs$@}R!*-G0#hS5xpmB7*;s3;d6WAn?_sF2|c7 zAk}|#2LJOmqzno1@lDI`|B)N~N3M_Uf8L-|dEV0!2ckEB{L&0~E56N8hj^E?lco&| z;Xr8m_EA3Q1qK2jpZo6@KzjG@>&2o7LL_ZQ2N6Qup}6h`g!1;A+F+LygkC`s-~fm- z^Hbuq%P$M8FPdJ8pnjR<{`&NW`lw=nyV7PcRKM?&HHrSJ5Wn3xXUT_Us~w)(42fl` zj`>IV_V^;{*hYG3=RQ9wZoT56+(S-1YO*O&gVI62SVtn06KIc@#h|xGesi#twuB&+ zO!p%leR)p{ooKAGO5emo^%l-lR$kdj2*5Ekf#k0kytiWxr3M`&P)T-m!|_e0*iWny z2WpVi5}8TgN+P51#x928P~X9)j-%BYbx&Y(u@j(Lf_v}6%Iz8?n{CT#x3mxhh9xQG zvS4L*4A!xEngETrek7A$^za3#V6e0J$0Q>O8PnZuU7vU4RiP(fyQk zknOkMU1kPEWS~^9edtZoU89gx{cimBxPQ>=$c$<_+^n*2#jGcm|GvxNNRPpHgYo46 zhMpbkhq&?YY`mZC^l<9a0zwHy=wIKZg0Cngf`%n$@{L*rNc^_qUoM`~$Vs{c_mO_r z>oAheBYubXItxEKcjfHO4!Rj^Aq>#3wQ=|o#35@N(lg!_n_ z^~W_#Ezi*>p`30(5JYI2z>fnt$ZR;TBa}0Yo}!{qiSu{0b|P*~(5g0&^E`o5VoxOW zjH=GeT5pebp`Kkyzg=o~J?+ul3WLt>C1c5e4#&&&7`#MP3WD^J>AT$y-RvVp-X$B9^*Nb{k%%tZW&%kG z^Ft@1H2v+!&}X5&ZOh<`mUVn=>jHiyJ6)IY>Yh9yn|+RNT}G_!Nc3c15+T1w`ci(H z!`UPH<*(6!>h+i@vKAWw1|L1`sAa3X!*D<`faHILHM1qv>z?U!?UZ59kfX8`_Idz? zR5uY3L*ZhnB%gbW!+LQ+gssHw*=mr5y)!ro)JlO8@({qmSx(a;Rs1`6phfdNrzZA1&fhel!s++J{KCSJ9~Vvs0ho?`Ff#BuWFD80a4t?>rIVX z$XvLwF^ZCqFimNFMA^zz*0oI2)Og8zTNoN%8zgk4j&zhNWhe8gRP&15kP&3+fApIi z40duPdarA|(}`BKpCz%~)Gv6Bx<8Orv-!CX+Ak;uZ&|xB}a&`zr#Ai^v9jaqJlzM_8i(G>8pmV-Y?IEp#p8ChuCmcM>nQq~^?r zev&ljS5EYsBbe-;Hi+Ey^nY*a4>Noyn@O|v zg|-PNTF~*B=xDYCyU2YG7Vb-sK!ZyFb-}gOtkLRy-AdKoQu04`to^l060n^uhxjyGx3XznE3~TZ^6+w_@`h?-e_v{=hr7c@(+v&sjNQFul~)ZHnN*6$hv2 zqj>6mIDVN=w7+CdMUfrLDY#cB*kKqzEev3|+t7KsIE`bKVk&?+&n68WM4SSb6=_ zcq%IH=^AkQ!6VUGTJbmBgu`Pa^tuv1Q^BIe)P!^Y z-~-vIneCAGz+O`yn3f8`{FSpez%uLpqqqb%b*ns6PtR`CFRt9?;DN%B{9pA5GO#Lq zdw0k^6k)N$hN2^$Fx9k#n1tX z-A7z(T2dv7UznFhM06}ZI3+hzz(D{+&r$I6jklcWVJs28Ka1w-XX_k-a@RbHB5Q;E zTVD?3$ru+trKTNj7)M@Rin@6+B@Cmu7iZM_KGWsoOq8rGjKVGN!jKsS63O%9ixuA% z?-J+>*3EJCq>1$#-fgmS21{0f1PDcmZaPi-#qf0(#EJ`VJzv{@7X7KOT>IYOEJl$# zo$~t-h@Ht9mbwKPA@3M6qd^J%e6dZ;b_^2Y;0f=SZ(|c*_Jv^4{N?ufnSPL}`F5S= zQcMjp8393zoj7H3aq$Tz#z)%oN^C$tta3={9fsx^K@Me3dwV-%9Mv<-Iwm;+ln+>3 zrgL=auND!TKdTBnN&JWAo3PJkyEpkAK3}6>UQ&?<99}I?8P{^9YlMAHPPDWPy_WUu zU0q`~0Md_ngcHo5HB73E*tPZ(BCQa!xYdq!c)^Bjnk9QzB7|3;`_}O*u%^0FN5xgE zU7MyL&!W-u5bQqRZ4_&*7SGz2ykXK8)H z_0k7_^|s(dr0w5_O_rHVS?EiyhTqe_#W+|@gzq?li}jiYqjk@HK*wpfMMB}8k|4Xb z5^J@7A(lrvqXwky;a925?e8I=nQ!OExOR1NTE`uhMrzpxa`L20!rE^ z<9>S*H&3ErZu6t~2GvpxCRiAlBFpiNi_6Q$7;8KNf?_}x&tqw}(omQjC@!O2>e8!) zD_l9)^+hH(Y?C|4zX-GNz?^LuRyak@f?)XCR;yMKk39PLqv(R!efJ3spA~|rL@^yG z(x_ute7M_;QBSy-x6J(f`tpoc#4CKa*S32PveY0NrEj$?n`amaL+T`WKz% zKb@UfsV|IHGZlXUbyL9;ez&t&H~kh{{p@4S3Z3#6FRwD6mj>3Qg4%;I1dV%3!I(mL zQXjD3jU^;4H|k(xR#E_*hjZGu5X=ONqY%Nre>r+xYAr_RG|j>@xqQ2z;KAVrB+7K* zQxy!FdfZV;9)=>rBUPqfllgv}Nh=Q*!ho))qOnnl-s(r%MdpFp<|Q;1j%DEfA#U{9 zM6MJL2viBE_-Z1YvgkEteS=3o0Op#wUjb296&eNxxnJ2V2SDB2;LJdhp--_){CheI z3b9|FkH-x`Y5cB=k2lAEJx|+cww~@UJ$BPwoz^-b+g@KDn+b*-^sD#t?S%iPO+lt4 z35gr(wbRPY6-0VZolo6(6zeurFb)k4{sEK|`YgBf03M9q51G6UVi5D1hTha$fDAIm zZd_U#V-A^J`+Y&x-}B7@3H}@Jm;2olAv&wMs_ZK0SxPoGm8pB6SPN#W?#p!e;T}*R zF6-gZT*cuWJ2E1_;88$=XrawK^%K@WbKd<2?{*-W5SmM7$h)uBbi2ij!lPvd_Eo59(eu| z+`Je`=E!+2%=DqR?se|A0JfV36jsYg05T+ZVU^r;go zJBVzze|0UL{JU+v;AL-P;yb`A+$=pNQOJdpk)&8@PpoLx@{|h(!}V|GZPcl6D&u z5n$sDuGCOCe?guk2pL%7U4+@1RSbUx+6#z}g>gv=!aYa90KcF8gf;;Cv=ixHy z<&{)w;@B8?t-~7E0y4QpU;Dx@ZZ9>z!J(pRTm7P$`QxvZM<3{4FAiaUo%{+qVgd8__p6N;pbK1E`{CB)NC{(ZvQklj+dQsuH~r4n?T&`EzAP4$R~c zj;RL;T0{n;k{0@{HfuhP{D#mpYyOrojZF3%l>xQI!yp6*G!`@~H@8M^yOlQ~g)kPFv}F>0mrwIG z=1{V{mc*+7IoSr8spdf{%VZrzPH&VDCnvZQ#-$hXbgnuVB2zMo5K#*_Sli{2ygaH) zb72^wujPL4T!jG&d_X1SFc5ld^cE2F*dTo8zV7C@GjfgwW=>xZ^Rx~N(b%HmWM9bg z)7dw0&$Q5&n$s-fWIdRla&~df&Vu>{Mc3wei_4w%r5&3<&C8`7rpo;J;kphGjc4Nq zsP~yUX=xEeOqU>9xED>8`mKQi44L{lHsfV_bxP@&|$T*_XLYH=A-9-`DU6ev(ee9>;67}+uo@DLr z3E*5zx`d50iOVlDWKq2)bVi@mFS-Ei|c2Sjy37vKm*yl~NP5Xt1 zwTvdqQy~gE-e8?J3#QlK3oR@LJs~m5VkVf1d^WTkx5=M}`M!d0R}Y_c;*=T$H{UF< zB0m-gknMp(ozC`#cYIyU0rU*$7#Y(p-;^M+ZHbMo{W;_lvSjmz=VTps$Nu&!U`%P6 zffE2)Bq=cDA4sFB+~FjK0S49p)F#lE&3*;AjS9Y5J)ZYnjT)k&ZA;JZytO-wbKfhZ z$a`jNh)>BA$uFA!{$X`ke{3*+GVPy>BqF6ev&c<7T57LM*Q&obsGkuXwmfoI+W)LC zGej2&I_5Gp+sKpAX|^V){|hkbgtq>?)T=Bi`ea=O=u?wP0k!`sCaN_Lx2JZsf`7Vx zE@R>i+}5l9orEBeND*2=K%4-2avh70a8*>>oq$NX%jpVqtG#@=PFug98p~z~HS1Ut zoY(BzxfwoYvSiUqI2|-gtta}45KBvb+yixe&&D;JdM$G{$4qh3iVA+Olo81h0tGDw z6mtQ2Qf&Z*i(`^^mbc~0O6!N(v87)7*5%^=MblLWMEN{@kdn>=Bt=xvWxYW#k_1ta3DBi7qBhP4&;}Jf`FN@ih;!_wW zn|tQ~zcc^!4OglDcDY`am4ui$fc9^A0F2OFAr=^q}!X(2edN+s7 zSCOB+LAt?BZ{8S4Dd_z43zG9N)rUjD{rt6yRg05BYPH4Q*dvY-Y&EZ_=rJZ&?wcp- zGfwcdIHRhC$m<`moENM7F^N?U420|q2q7!sO$q*9JH2#&k(Iv?j)c4#^&7Kz#qfP5 zcYk9+!Vh6MotnZ@`&y1>mWYttV!yp^(}`vN9)WqixJY@1pe9Zl!COlFlRW0mQS z=xTqS*csLJo3yu8pO{o6E3C%6E5A8%mlfnWRSP$KwOF-&4nE!ZizZh_ju2G7PnAY2 zO~??!X+YoMje(DUp2J4zgBv7g<$2pULhQmEKiveE6`gUcVeR zWuatiTS8)-XorX1L_09Kn!a4iR)B4|bf%W>d-^FPe7zFi=nqY8Ue8gztJgv{|Os% z26?FA(x&_Q+XD+vFD2xJ<#dK&AX{KvQbRjDKg*%1K485=6N!NwfjpJq?Yg^&M}*71 zX8m@>7$2yGF`&%vpS0On-j`ei(4f|HF2}Wo^k?%gg;x&#HCR=f%&YEu3wIGjvt|TM z{Rjam=(V7LLy4IPM6+x+2UE^4k=X$s*G@QF)jWY9TlvK4jiq|QZa)`toOOk|tEI{f z%Nwh70yB#F(JsUaBB_Kb#(@t=3%h-vz5&t%fTezuq z2Zb1M6<|U1j2EAQgperq=W0y!11nzxC96r2@+3lkP3I!Oq7au1{@6?%{L5;e5%#~# zVgYWhY6RGlv&KC_6#r`9z%u?TU9IrCxaG`%a!riSm?3T>cg_RX!vG zc{8KsY%V{{}AgsMBAt4tE5{T!r;Fkd$?|7{F$@ATI(}PVgIBpY?}2p*Y(#@EKp`Q_ zr%ymoOiO)A>B6o1Ty2HED;wmapVH$bf^t+Y?0<|5)1~dAVnq|5wj7GDo<*cO!?i_N zohD~JySyaHbIcOc9|HV7`z8!;j9tBFNJzoyBfrYF;m5O6?1J*7R5RwBvtMj0x$D;P zRKD{BE`thpqn(|`KN&K7`Q=wTA~M+LLB2~ctB|1A*ufll+#TZD2$Y0~(`E=OD9ffl zGukb$_ISP_;86^U-Xh4wpKpF!diOIwxV?E=9Q#T$oSb8l_)w(NB4w&2L$F*7!)Wic znp(K?YXIS=S&})ZaZ-Y_Vk3edI1U^f)OUkTj@{~Um}t(#3;`6%S!RL75d319@@#4qb$~z zte98k?XJHD2y;1jcYOn>23A^e!jJ}i4nKB*7<3PULdcc$^$|fxEP*~RW|wcLEp_rl zQJfl>wd$YGF|(b2WHZp@u$aZ-JH1E#{4>$S`zGB{2PqEtiMddwdPK6(pG+(E_3HL9Ibinwmd=m=z3(w7)4`h+#KAA9{8AI6>zi3otqTJ}%K^qb+v$NF zv_Gvb#?@(;C^vf4obNts9(KIwG0koa)t>VS3PRz^v3igAvQCQbWO{}CS+so%`}guV zr|m3N_e0($)fp2<`k{5jgKfM)Y~khkcMY?9`r+ilD5?hU>}4@3nkELH;S?hsNsgn> zL5wK_mDsu%Wa>%Nx(WKc%^9Cq$3qn;Gxh+}^ z7bxS;5GSKl&Avtoo&>37PU*Pkj^}Af6{%MfRLp)ZEp87(B^!`deI=yq%_ z1U9w5i6+jyAL19&T4*RiiTDuOhK5B-|B8j;_Iyf*WM8A&)a+c$aH~qKI3Suj`K3g4RpYj z|APe~B1jSCMd)-sWKP5JrMmBZFsFctrQ{llw82U=+kl<#vmd1l7GIrV$QIFsr%Unt zcivUmgZi#$N(Wfi8ydfvJv`NP+~YDch!i728fs6%kzCg?p_Yp>%UynB?gg(8GsP9F zu3EbuuWG_hSag2cH{V5ieHcC8kj!95RcibGUi8e*flum*obbvOeDkTmJ?{40Aw}x! z2otpaC1Wf3Z3bQEtYdb6yy=g~+3`j+zsGJ)vYubHc6!;e;2t|%Sb^xQdO7O28j)n)FZQyql2z(yuaTlx3_1mH zUkp6%1qJ!7c{oFA)UTjD$yuCzL-#j1o_hpMv>k{bG$o2R;oDx*X_++`io;WA;ha(S za#h%cK!9Gz_4&~_1((<#86eU5sG1UU&89a}3w~{d&_-}SBh}<(n*3e6F!QW@>lbDu zr`&#V!i3&e#qtlLZBbNO#!Ox)$`YF56Y-I^;x_8;V*XX5%!+^S?oUK2GrI zvo-AAkv$iw39Vg-_+ss9gDBT24_8{Jf)u4kj)%&1Zn8q?dUWAPt(Blk%o1qFWhn@F z@?mPmG;Pq+fhj1W|;DRX~}Y^w3j z2k);|w;b*t#Bbt9mo{j0;2^V=l6Q7&+ft<18ShawG<3=BF_U4Mi4!454{Ehs9_jQ= zFVWlL+!a?9f4^AR`v$8puARSaKHR-zbsn;to}EpYnEG0h6pFQT$i1%eP)rIo2Ht1K zdqZiyR09$Fg&2VGUL1A2p!Jh3533Tq%*1R2rIA+5GTKmEvpV*-J2E3;*0I=5;3Z3BvbY+;PMVWy*c;)?ZpyBG*J-D6g6-M_>F1%$YK%JT?UC;h&H z(WQ+ey6>1W@UTni(S?RoO}Ta$0q@-Ljup#Pk39Xx3ui6+55X{@hmj;ZZ05h-GI`-C zlmU0!Z+?vLe*az_R5D{WNstgd-~bA05d*5Q`A3a*MkO>6EwZte6Y4SaD0Mbd4X>7X zKTSI^jWZ6c_h%BRe8p|G8Hov~xUN~i`F6e$_qT+_m75`qRp~i{Y-N0AlmyXOrk8olf-k_p!}~H+b!0RJgSp5WTOay{ zUVZ`P&I8&4-uLGqEGk^$cjDnk${c=3GRraeN_;6W?qnaA7sBVxm(n8tB=S#5`FfP# z*enE9cJqhn#M^#hQeae>zaoqdi8p-wNUuh&bJb7^1~oFoE>qfqXi2X5jGkou7#53H z_wQ3=3)ZJ@=}_;_%E>7RZ4fJt9j;r_E`+y^- ze&BEL6bVRQ;HF<;1rmQlHbN4c^cilMh8~K(Cvb%gKJNJYgqIvU>#%u zKO@Q`i0g68du0CCePXhiJz!smsm6WcU^sigt3~WGt?Ni^Q|Rw5P*(>iNQ0!lhC}a3 zsJr$ylV3M0K%|aG_$@ZvzA>^pGiBe9W6e80CoD$G^!c=Ce=NY~`5^EXO(IjTnmh*~0u z=5N#2mr*1ou`0Vs(z~^OK#kdzq!T)%BLk?suvr}dPwNYau1~2`(wsDeBtXV7BBT-v zB>=IN70b{N3{j?J8UDb7D$4~Sl}|OM<>9Ci7whb*f0aC|z~gWTS9NDq8r1giOM9&K?<7Ce z+aJVRt8kTiPHbHpXtRO(YC{3FyjcD8nN$xEDVG?@$ja6y(Lfen(0BzV~ zjmqIgy==sH%4*7gl6wLD(+03b``2I<3*XdLx%B?1zqY_z3(EOiF^iF==R=z{Oke4z z9k+PUnCj&iQy~iOQXoy9=-Z(*l)hJv*Q5+kh}c&V`Fia8V>MH~UA?u}@q^@ykL5QM z=)|;)5m3>-*E=aX&;=dTy1wW7Spj{@aVtsr@lbZp0BR*=mT8>e&z*NwPDVoPZ?Sis z0#_1s_~kU6gWTnGB07~9osa+YqN$c1Ff+S#8>DPEzR8*X_-UxU&f*OZ-Q^IKDqqzb941S&MXP^og;Gpe34^CwS`AC){cpdN zx^p#BiDiH8J7zf0o?^XQ;u+r`{UL-K6QT1t+Sy`hz9C)^O)Ptpo25sYpkQc;_u(~J zCFwJ|OQiC}(sR=&eCm9Eg&UebEqyRgvrKx`O~mJw z;kqATYnxz&5tkN1r}VPM>IHD)rlZRGJnT_b!aRDqdt`mdj(Bvp*uAHvBcF|9(F?XK zkeYW0ZUyMgDCQgXAh~*r`??QZYdYt1T-I(fkZJk@I_0qlfG-WT44h1_aJ4K%3 zxCJ0-DUU3?@4E_=gX9K7*^W{Wl` z`BP>rk6w9WwYU_ngA(Mw)jG++lG<>;$8g|m)aa0GEYRr7Z{w7emF3Z~J1pxJKxApM4s#Z9 z4e-rQI?x+iV6Dq$1gbl}1RhpAWi^ZSo{_~6L zo!IPL6<(-W%v)lnY-XXMUj=APv%Jj?$rozn#HoT%)9v94TJ69K(z*iO2G4&jU8zb1 z+b>l_>#=5h^EuR^YMTr!qMenC&jjW#liCbHiQljB3BWlBW{XYuwRQc4{T5z(qio4_nQ7K0 zkbA0B|EE6EUr48v3KN55ayZJ-4#h0ZFZwiE`cf+&H||O8&PFY|%_eTb4efmnDt@`& zOl=nF*zbNd=ngI)&MA^L8ZVr}W~S;k)b*&4TkM^P{q--WUpZC=#3KA+n5ikdax+= z0J1CWv)WK+!dH(ewHzs5Kwc}5-rg}*&wAYEG?F9H7u;TVnpmFdL_yRWXs_Ndk%Z(M zZ0G3Sm4A??QvUmAq=GHTH9o+-nJWcNxVS#K?&SIJ##K9(GqqrUnSy|ep2ksm)W3A8 zppjxTkf!DsI(qKyQgAO@lX=r|BcfLRYAc({b*XkwrBl#V>1!{rcg>L=b zroeVGta6o8zB3c+94tn4b<>Wu1G7}tl!QB4_b;(u`1KmV6lxgvEG^P+g9LK!SJ}4~ zh(6fQsn7-PL~Z9PV8o3mk8I_mFIUCG0n^+FjeS^$>WYu zS|rNd01@p)&VEZyPj&H;kgVR9zh`BSNHdR{kE~Yx-3mahz2j@1$EmePV%a&(qq5gD z;_|iVokObvDp)~e<%-5guO$L81?^jiL|}8+QRkk%B4c8Aju+d5KA+);)GU%TZStEN7|^ad-xM#NpZu?% zVMosu=34gBJ)Xb=c#W7xfaEan$!)AA6ZqJrGj29j7xgXgv`snQc2y8ORd~Nb`sD48 zP^SdAT7acT-Y!7gB}L`WI&XpUWPrQc^vk9VxWy&7e}A=@Mke$S9r4&$A?XIHE&_9N zb*e6GlnV*CSV9<|dykRe{2vO7;I#u;lRv&&xvpHyX(IKQP5KXD`8_vBB{~#gRcsdt z35dR5yH@IqcINxfrI#GrU>9z@uNe!yqL{5cd|9VFsJAk8=K>erk96ojC4lmtVNJmD$9yDFA8fpLLoLo#l$Kl8oAaDcxMi z7d`iIc(LId4MMB)U>3kYep>g^0!3`XCb5zIO9|ss4%t16$YG%*;+^2m^MMTu>rorn zyx^4a-EVgtHl;ol04!xmi9P%o{Nz)2#L7YN>Asn19CJiUPY%}lDc#=&6%npohS{)N z&4)k5tJ5Qv%{kdR6T&OK#Qv_|t;D`1=BpaZk~iLRFREb0oq)i8re(S53yA@dfzS-P ze)SKmCvfqBG0YC*G*~wZBQ4)62@c{c$_1JTzus}&>$@Zt%bxecpkXf-4dv;ATpI$% zC$_-Fhv#D1je!{12XrN^R`=EceRRW6m_awE}$ZChSsW#|7>INcNbic z-Ji)HwwLu?c_ICtaFRgbS+h5l(+l9)T&ht2W*wrPYgjuL2mp<2hHtCF&|U&lApys# zYZ&Zh3#%zNm3}h`FA2yRW5PJUxdC#NVr0=Gq7uf{BNI9<)n>4t4Elnwhk7g_Qpk#% zRSEfgLDUpq11=Sl61~;hto%c~wP45nSOAikL=KqBWse>8khkkn{lC69F&2>fE<{#R zaHsdf-oa^J$QJN!+kNF2>TAr; z0c}M>MX;|3W;5Rd!k-Xj|yTp zf}QD)!fF5m4Vm(p!!;nv1v6VbiP?0@SQ)>H6-NNv zbZ|0)GzxhB4q$=)$uD@%)oTF_rPomk_UHNQu;X(17hqy);N+7bi%mk(%aR00o9E{T z{J?%P@&GAH!u6FmAMt^Ql`KN%p$EbM%?puo(dz6WQ~}zX(f;eb^|2=185iY@KR^Z@ z8c-a?$f&;NNXipTANq7BI08@}pb>O+noz~E{Tzh8ixuau$*ar*cP6}@m=f5B(G5oC zD+E|*0W#CP2&iY`I;3XN|Lcx3>q68XsrjzeRu=}`NzstrspEn?thjO#a2NUQN&~9{ zsX1}_IwI>kX23}A>BJ&i1|ST}1*$tu5)k)*c4_R+z*Y#`(dEc@qyW8G8JMa@Q|0|m zrs~L*yI{#3C#x|W8rtu_&==^ zU3UJyWF(?+gHwP>l`PE=Hv2S@@adCLnb8{P!VSvKzK&j&RFYuoGY)6;@!@lCXlsw0 zH`x{Ccsc{*UH}?kg`lhY892%SNR8@f(#fVIgUIAgIG&z&sHWl%{h62=_)qH9vF|ND z!vejqzLRrd30KE?1q$yRwY^un=Re6 zEL23qEbZB04H`tGd-mh!Oc(p%+^h7KIePr=d$<);Nup|jx@=MdP_VN06XcFgq=}2# z7vOqq-i6H@lIH0Rzj73|9+O7*C*DP&U8NbHYZ3Dzdya@Ye#*)WAPNjXrL$B6iHZr`wBa=?;2zX5M z*EyS}zOr~i4L^d%G>B$Gl?*mhOmwALr{F|g0uOyKA|V#I&;Z>E(R zX56z~hpmucF0o;YnYph8Ca_A!8&EOfVESB;K)H>D21uaW1)9&Gy;DOP5P>wAZq{8g z@_pKIdPZ65H;u;U+r@P2F+|uu7@a!LU*W3R2-DF)LZqqvzC`u=JziQ9#Z7+^Ts4juLL{ABj?IpcZj6+~bIkB#UV z5ohAV%ye~%?DKV~uDoCU7ai%6wI*I*Tg<%LRDV>lM!H>0Qx->=sR@HX9j>6Kq?Nm> zdGjG0p6j}w`FQgnZk`Keg#jVc9+L#lH!W5W0kO^;#W&+-YnpgqZ1r%_%V@U|mm^6B zs!IF`^C~g78W2mH7}eb6eLE4W#qydb0#k#$R9f%v1RN0x@2yd;~O> zN`TsFlRQt5*{$=QGA&SL_}lu!$&~(PxCVEs#DciH;;)&H+c6zP^b76L6#MtBL)fm) zCDO~bdk;QN&0Y0cm!U-9sryx-jnjk{`LSq9ZcLt<&7|u0{mX6&3z#T#4BK_i3AG)2 zz7X_KnbwXMp3=^V*oW!J@BUG|tMTwp(C18xI)ZZ;Bq(Mtu}Gg@S}=ay|Q`i$4K)q_P^nEm)vnxe!aIwfsR(L*4X=JJFYgH&R8XG zUoksS)KdNBm5+|(I%HP{YIEvh#O0(I?nNfskhQ#`{z z>>3SUt$!nrx{u~W+c}0yY+X^3bODeF64`=JasmTYYUDv@TH~Kp;RQrgc?-G904z2kNOxiq~g9isW zks1jpvDNo?ZZFal3#wMpgq*fjCPJP4Gg}+9Gka8&GzAZ@qSJ=%tVX?Hg+^oRzw6eI zo9I=Pv=_WoVDZ-5>{f@r_WP8{|F{h3ai1lJP7c0bS0(?=le540Mv08iRaDd{`8WSB zU04T^9|o2d>Zk>7MBg;w{>Tj1kbE6(rwu{nmIveqNs{I>(nN{*8;PKcBV^!|6kaOQ zF+RHGW>&F-8XirSOo^^X{v`kpV_9+d=d;GWsV_@XO?8bv!%pYQ;&Y zj?(fmxJ9(np#Iul2BcxZ&%c1FGU+6_g=j*dGy4#JO5!nr1#pbEW?Clmi<|F;s$yHu zVlUJxC^O|3W33i$ly83Q-WD!IpmQB&8e2#K@7v4399W)%$aiJ7mOT;nZ;M20mKy-< zjmxp~U24dVZlw5-y*5I~-@J-1eN{tjJ@+R%XbU5(as2ni>1)ZbFx5uPv1@j|cuh4n zhtP!7c)TxJ(uJ%_1IPlnK(ulARW-oTi%vLXWp6H{gk;d(iIA-jlppzqeMV_rW*}g= zHZ*3i*B0!}<2i}{olC>0A>vpaGS6SsA(rhTpb_R+q*i)3J&p5?j;k{^8vDpg$nEyC zo>=|VpNx{EEDYyW{|sitEH=xU1m9Dz4kUzIlo4jVDz0GHD9kylQl*lO55Q2hXl0%ze!0d!2b>k3uMc}?ZH<_kEB1O2o6yuGS% z3yjt9F*nEn-w$$6*Q+0i1v(X%Kl3Rp`gxE1>)Dgz7hYBM?!;7mFB+$>7FpU1)pQ=TrHC03=Cl zo0}b9>HSYTN_?9&z^A(1*`G>ZfGj z4j1swmU2Lde`a^8?+Raz?grH;_!K~f$0HUF0b_zbea*#aabowfZnhDlKUYu>O&#mTR1MWO9az1RWh1C`kK{{vwl zG>zs-aue=+=hTHHtjTV2_vWNajt@>gQ zomx$&ef@a!4fxCr7DYp~sxJWpJqo7nM_NIEu7 zEaTQxRxiND@Q^%!{}G%@EP(1QaD#i!KsBx*)E8Tg5~~RSa~T9$I{c7J$d-IDTzzlA z*#?6*>6iIMD7SC$aDcHZ6-qn-20}QJ#|wU@q)~~6&6`BcKu0r4!A7L}BQNNi4_HqW zfv9a9LG)-nWqqHOj#ZaeD}g^f)gLTv29S}x)TNHf1ppURdZApr>igs6jKGIerf~ke(169mn8>L;} zNl0~%eA=wFaYCAbl>Cfyz>roJk-hfkh4)-S@ExA^Toj8kqy!Df7XYXOWF~WxaqkiY zrog9e)0JgqaKd$q&4x!To8MF!5viK0qn5Eop-TI|1d+(@o-qF~`Cd6)SS-o-J0K9B zF2LOZNCQ!~CLKhOy zNqONGxJ~D@R`$uB5l>9wor*;PmXHI^0iDgCuE}4(WN6lGGK~6L@^^<0ezijY9+80P zP!C9Ef!koLr((gR1;UUwJv>DOpzdbVO>{n=gnFMgg5VO-c;O1XLGJtO!#W;jPX-qE za+k}=0m4)NeYE1J~X2M z2qGRmqvgX_-!n6{`;8!g%j&Ro{2NO54;5i%Dg#%z={?%cKa}CLe{7)u8;gB|IGZ`P z&aV^{O?B^X71uya4m`~L^6218W#4!VP4SHPIPUrQ`$P%@qNfQ3f;MwoaQQFnv}C*pf0iEeQZk{3=$Z@ zWb4)}Te&4R#s|kn@N5QZGjjeug+Pnu>H2_&OPiCd%b@ySdU2TQACyXUDzu%rFVvm| zrhe12(9nwDFy-iT*ux#S;w&8=ny765ZMwx;>?{iS$G&9cWIIjQc$E||z@&t*y@@^W z%%@#vCJEisfs-j3gv(@K(<=aMDLq3WAF?Bquz^}dY=C8&f8A5ru|0wXdd9RP4|~u- zP>;y=4?*q;5P+&y^Qc~&5>ckM+$_uWyr&Q#|50??j{iH#pPCr?6*vEjmUq}cJ+!#e z$x%PZ2I?UsT1y|TeLI*nn8%Oevn*W{_xZwG3M%JovJ-9oiGAHCFm=2A|Jw z`<;)e>rK5w)0`VdS^c-ObdytDt7oq}wG%(yf#o<4&TSrZqJlws;w?i&j*;9%Y;z25k6!`<$NFqET7AY#-bps z$)3FFw4_{31K>!;&9_2+Y2_06$%NOZ3{QSPIAvr^88J8$sobx^D{{R9cLO8=>pn|V zkR8>x=W>}3AL?)gKG#PG1qWF1hj1t%)2>4O`pCO|b42Bj0@4kisWYc%^$Sn5^#pMT zR)#ea#Ei~Ih4(Z!Z2U;8aj`LtZfkv%dv?$rNW?%P7eLAWV@PUZn8O>|`%X6jUC;R9 zyw?q?%f~3y+28TT_!F#gV3jVx{`~dQ;Fmoksj)bKB}koOE5Q8- zPU~o zS~(f3-W*%3x=iYhX+APJ-`w1^eT%{c5|dW4igp`+;)0kqf(j*~yd>7GfTRY5H%KhQ zRH?BuzqH?St*{a)v%FwXCIZr ztraFRE=50jSsLr4HIiUdbI5wxz>*t@LR~BlRzB+g+N0(pH^7L@E#J2ZiHRXGc%$?x z<4g3=blUyev9&Y-kVs;R1AUdMK7x-MQP;Px`FPcxRP)(TdpnZ3D8G^D4dron&0lSv zZW9ZqaoE=)@vKVYzv}iJokkBKxSj`o%3>izI8DuazCz7;8kM%HQ?+M8)NyQ|2*7VO zaO}7mN=oLAQc&iU8C5)0U_lX0B>l=idBgvGrcp%PzhUO^@BVPD+HXAukSb6=nN`P_ zb=4s|?UQLB1pUQ*e^0`=IjZL~=Z?XFIAzoW_JzJxtIf*2wbjv}!D{B=%|824& z>|Xm?Sw{5n4L1>C7Hp@GXpI&Exy#m))g;}n+P7E6sz0~}g$ytfj(#wc{wu(l{A}gF zhG}hUrr}!SsW59l?tE=fDH5rT((SxUQZ&^>H$S=mlc699o61b#$F>emT;g}WcB4JE zaf^)rSJ{7%20h#l=6r~92e%4Ul8kkrcV4#!uD7|@gy-rov%L(n$(n(aJO%sHodDzL2&?Ygq7QrJebjq?U?B=UBt z$=NPM|7ZwxL7?!=Aj2W_P>i_z35|4#n(cC}-0hc@-!$~>v!`cWj31Oi=#k7~HT<}E zj32g-K;|5=s#4^?>rPZ_W*{HzNh48{J1g;X6j9^CU_7|sP#_R03P-aWg}A5(+yj88*N8y_ z=PIaEj9^3JkJ zI_xWF-;zDwy%pH}R?Ah_%hDTs0u7LL6F78kI_}(JXM_*P*51=A zm2S8&8sy`?`JoVyCHhnsD-mJ+;97&s0AC3dFM9Jn;P(ZWs7!8p4K5D-nAdhP^lkD9g=0Me|6*)XgY;k zzVm%xYeqz)GXaG0XE;Kv8u8J`ZtGcYyFU_fV*%^nDfTe;rgFK`3!RcQJ} z-Z&Vj+wm~Qy5;ajH8kS{Z1_jMf$c$*evgt8uH~FYNx69@PDiD19{LAhLhl)Ryhpr9 zW2I=|8z)Z}Yt|KkkVPu}EBPfsv4nyPNHI4vP}Qh-tng`PeWA+a#|b>Xc?nZHrf-G! zFK;AKoc=7VOb=f|5!;kHDK>3 zC=G}$911|N#4I1TRgAO%DX}sQJNRwz7W|liV`t!zc@BeN<<=g)8ltnF9|&W_VulZ5 z)Hn-1DzM>}wMS7(v0ij2mtC8xf#AEJv_cOn@#QbSDi3<_Mw@or?c3nNAZC*%*^4|( zuCBUumvWkhm5bDK#DOhIhD{1~Ri5?aj>$NYR8VG%CJOP(ke1g;fXyO z5yk!Vo}SU0wiY@T05yR*3F3C-4m0b&iP^my-tMexf(FcNe$O8v{hoxyETN!qLgW9} zo2UY-EBzSqel?vx*pH$GY4q6NJlNyovV&nySlbW3`8t?}s;ldY>V z+Pu(=R19f5c_;>r$5$J|25$?-cQeg`68@^vF*KRtB{E42V^*)gRyWK6-P1b5R`Z^f z`wblq`=v}n!0A{Yr@nYWsvZ9sW?=B7B+<@=0bs*dW(FPJ0PcWaQ13KCq^LBh7h)_AJ=Ki#Qw|=gI|2 z?FV&5%l}#~$b&IxirfW#ZKPlEdh&Fmp3{RTTeahs-Q+_++h-FFZBy?%2&);G^$H z^uUo7RL6?y8q)GwG&-Fh%QrCwi{la}D=Lqbgu#WvvjKI2fPz+ByrfwF?|k}wg|PAO97_ks3)1Ji;S{pc?r0Mt z_lc;MH}xpS5k--~Nb}-0eW8(g#+N&%e*1eEZcV9CQ;HQXjGr6H{Aq-!16l`*m2^Va zSC$?mS0IV!A=IOmS-D%vW&+!*`fh`Rw2nlSZ#I9>X{B@-X}be5;pR;EQ2qVDa)97u15~Q%+me#4Iw@&>M=l{#K21SW9O7yqkk>I zPgIZY;^bqj#=0Tp+XnlM(0=R3w$FJ2HMgqsFoRET-0w{(d4`xm^kUeSaXqXV#0Wo>daN|+XVon3WyK(YCV5`=z^ddbEJM+;>6%6y~d{VyE%UwOWqbXs@um z`3|k&O$aM!KI>*1753R)G=QL*Df>bI_Y3n)E2b#Ny&5a=Loesx^NmQj4Xc<`jExpZO*WDK_znZtk3h!iwagIdODcdOmcC}RU zF5FQ6lJ6#aYs_D$pxim_qh^}$J_!_ZQQv;{-A)${Xsfo8;}O_%C;ZzBmqzelsePM{ zkM>Mm(7#c)!7&*NA6I2=g8uxA{I6eG!`(^!*#%p5t{FOdg_J6)k35<$6lu{=8M|o{Z(U8xZMhaM$y_g)l4EJ?EaujnXslxo( z>6cj4x|$9MEX}1k@Z?@|)&Ev>-v9`4Mjm8}E@<^JYE(n;+@85zpAcja-QB}k)kP}i zPGZJ})Xg9sY9o~xKiBg)qnYsp$4!@9?2ojZE;PPVOxLln;M{JCK44dsFAo&N7EqY_ zeby(^+V2()r{Tv7f<9Tid0xixPjG1${~q`dBwHGQ^>=uZpuH36EVX57I0Nbug3JoJ z^geC@J4~uyKSxC=O^jC}^-ox~QW#!8Nxn;T;(uT05%6x!a12I8C?Ia8EdY0x0G-Os z-5$X@g?>-Sj{m@)^UaAg-}fMYZRB52I@~RHtctc$S-t?WZ%ZL)a6m$Y2XehI? zsdV?M_yC&HREm}WOw13%ydj)j0^mpE31<6_8n|`Fr}-CwFSZdCY?--_-wFj@Ctqu% zBYvvhRR)&Q`DUX$Xo%%fwjP@SR#wo6EtffH zF5@ahV^jH^_GgdN&XqMN1Yda<)=#AmPRC1%!U4DU_Z>N<7oIN0$8E1jZ6?!Fxf5}( zzU!8?*{=~KV%&Hfu1olY(&AWMn#LOv0B}x{>KTl@D0g2v`${5~_$z2G+M=tF#MyD; z=Uh(^fDNieJqZ1;sKZ}fgGt0RwF!;nya{a{SU#&V%K*45*_D)+XXfqL!M-R2CMI#4 z?6UI49#e?RX8eOyX*2EFk*0W#fdDR$4Xc)&vbME2CA&X?i-Zi$wit84K$Atk&%bxc zRl?(Y3v#@!Osf@z8z8uNP!vA4nxO(@Dg``HSkN8m@7<31BkT=8Do@iq?}JSDp14e; z00hH2#OK?qcx7UAg1ZTFDm7)7I0gDzV*M|CWoN#~PXD|Lecn}y1P* z#6v+Q+x~+__#7cQ5-0_6kg)q!IVS1|weftkGcmQ8=ym2g*jgPB*wvIuzun~f2 zx1<4x9B!DAb*X zJqK^DBm)eZmw~uY`f{QYzTN1w>ohVlAL$@vvbR41lmX}O=xA*w7sc<%lGElLkC=eN@J4W-@|G9S zq){+-K|(y`vLVLxzCTEbOG1MRrhy!@yX`HgZy%!S$!G|>#DuT*gmUB}(Q+{18rrOA zfJnG4%~7*{KDW{(oMu$iLKrPb#Z#~O)=QsY;q-4(w9*Mx%Y$y~_NX=XYwYX`Ay}Qr z^T21l1Ev~TKV$`li8+uMK-Hpn-EA?mkJ53=h;$=nP_iZeQJX`f4+Mcj;=Edh!$MDqg)<9ac$zU>rJQh?K{Iln2< zKwLU+Qsn&|ivh(JXq}&cga=68k016T%dfm}owXB(d1ME~+6BIrruFNf0}6$C%h4VI zcq@dpA3NsMBJ(aD0Tm2>2jI>3tzy4xo4;mY)Ii3G5TZP(xvKpYgzk55=p*PX$7i0M zZD%e#XCXZ?ey#w`^vt$ha*P5*IXUFRTwn9%dNh!qaqU!*%K#bXbwQr%dG8cYj-qR+ z`JS}T3{@WG6eIVs0S=7|LLG8H23T7)dyEMyF~Sple(CSzKrW&}Oat)^1*n=q1t;{e zVg+>Y$(_xM6ml8jHOlEw7Li9x1Tq#x3R*Pj*h@pY08!WK$`frydW-8kzN=0VJ|PrTWRe*G{&bDhjZ)dQ+zp7!M^nBjVp7w;-JX zygmu!d)U4&)fQ1Y5@9<3PpW&LZG;`+>5ZGAv%eVaU0wU_0ee;9;tK((1Jg0DOQ8vf zSEPL>jeADo-1)um|0H7kqy9G#Zr~Dpi`0EXF7J5D?sVbxzk*z9oFM6YPXQ)sc<=uI zdgvo6g#Ss^QHi3FK3a>3mxX7%< z1t<)VmzaU|DtG-)|5{glDf`GfsQEq})g3ViG&i=pLNx2w6V1)q(?9d3@v%C;6$nQZ zM4sk~`F;_HtTA1=R*>FuMQ3K_IB)i?u<%92lJsXaf`IugsaH5?PXSRFXK)%4L=ap% z5}?I5OddD|XO-_!36ZutbtH7o>LI*B%Yfk0sVIIXVSYv=6+mf>$c+Y+LdFlmC=> zlQM5Pe&HZ)GB*~UofT`r9v}^i9_vQ6|~Zp=Ac#(K<EhBP)gA(25l6#M0#QQcvxjw3*2b?Rj*5q+_b>kHWwDq2ENq%aq z>p*yF_#7@N{Ob2vR77Z!pdtQ7?xE>LprJ1_Pg5vT@!Z6U6Go@UMew&+6f3;MJni#AStPXuRK6eEA~%+dMt=f}zZX?r15GWc>9M-2@sS+>xL zK(L~ardnj7!*-8Z4t{|&awa-2O|#9f`p=g29)Tc;IWHs~U<&w&M)E8#0mQ%TR;0B< z{~Mq+9|hv@z=Qa?P}C3Ggk0N??>|_PxCpL^p=Z96()EDWJlUpxdx3Q#<^}S#Ra>Wc zfEv5_KwD^KIrjAqSexQ}$Tl!;Bvz(_HlEHlJnlZoh#D_W5oP`m-dx{rzjLv(d@6c1 z!egJlRuG*b;pv}h01WUfhGE`my5m{94-T-9?sWt(teo;7PQTpWUOcZbGD8A)g-!kZ zdz-${vCBo>^Vcv}8P24myg>fv_H-g(+_16HJ=7?_-DY9mt&#VL#%AJJSU_l6`q?Uf z+-2_jUp&0~Q6fg5FcvZ)9F#>|2yPpq>xJY5;rHNHQv(BJb!Ag+!fLw|(uVn3kX{u> z5`rGoJ`=O*KYdkN*tFKKzo)+;Q^U@~{*fBAJl4DEA}7{v;sVpKF}cpmf*G`q!F7H} zIWg&aqT{g3=PY8dtoS9Y;Uyx z&@z`?C`lV2r#%dw<*$zEcqcleVUUZn!4Ew5Hw^&WKDk_T30JOJw@3=;!Z%*>%aHE_ zW=~`4!Bl~~cVbCqCX7O(!++$>KN$2nsL1@~xpY~R!M1oy z)kO3Ni=aji{bkSO-p@Q0b6%RkDW9{nK|Y#1`D*yhuo(g14sSS}iB9Ym_D@yXN~lb_%O08S1?jRG;Ug62*k5Jw5?DU7Te{j{ z_hsM6n;o~hm+IO~=gEfocC_2e8BQfoJlS%TJ+wB-q8*ls^OlNSm;J84R=DMA0mYH< zJJ_T<{q&UJSCKJ3^q7$Oh?m|N$X*~LjDIUEI4kct7GiVJ?u&pY+Ja#;vx)g5A#Q3|CYpGLATdrm*k`8y=QZKE$(=uW;jZOQp0i)mTdAwm zcRxr#_EZ?>lP5-u?*^AiRh%tC!KC8ZpsuoKL3rEv%TVxBRs9iYu%fBl<<^U$;Ne=b zvrZCmasIgQ5v|#7ph*BK-*?7O>|I$pW{RK~nprcug`S>vsbR8ykR=;G5dVK;x*O8l zbJw|up0^+A0={W@HOgIWC=^8(m5C3D4ikmCW>FJmsd5y}y9VQu9Ui^=wq;`1Aj_}9 z*Bmz&XNseiUQo~-u_y9(>QVDH1Z&}3l?sUJv9e+VNoS#?L~v>pmous<0UaAuUqU?9 zsu=CguYracw>>>BIko{zWmFOvQQkhuCO5eyU4yP%GkSrm=x_V+8LD!An((-IcUHCn zahWQ8OVj+A-Yh15;!lHV;HPIZkGrA3a_WJ`af-nE)k=2zmhB(-UVio2sWKG4IS5jo zUcX15Nyb za&sLiS5D@(%wpA&R3R^mVB~7FFm20gPZik)a_enSCH3cyF-(*iUk@FC)!noxZU0(d zQJ^v%xiQ8|LDNwr19>GJU>#KQP=&rg`QVa~!a*Y>2IG0M3%c|>77?ChjGN@Sq*MeE z^4-wVV8F={8O+~*^zq&plb`iJK0a-=N63b*t3If)x*IHoez`_ZVW`IsF^&J(-G~2a zit#(ajSxwws@a(Qb$Z=UFF7Nmsq=1~4&y_g-+$_o1w2a5p^57q{_4Qj+h{4ek8dhk}>nY9~BCnZATMR1K7BZ)hsu0|$gwso0ZwAt)W8D9uei*8@g` zpKpi0M(lsFo6{XbIMK$aw?M54J4Ui~9r(xpJDXmm92>U5kyDyxEFht(LZ)%yEYOsgyXzox4_ z%g}-3U+*|O8rN{?a=%&EN)E@tM=Br+UoxAgMuYlXUu2Me`$^#+ZW+|o=1NjlUBIxc zinm3w23E^{)W{>G{e3VlmQmEXHvv#6FckygdIh(r8ExEg zg?n=AZk#qoGysmwdPMqLuI0GzHa-_@OdBxtz{(A@Iau1pU;qe^zl)F)8%PBJa0pvj zfCnNG2q&d8wA+MXd!X2%1xWt>UZR)UOICQ5jJ>qqeNPneSDN3-Pi^|~h-zAdJIZpM9x z$)*++!_gNmXVRD#ns<*`TPs+%$;bLD-5R9k(pdl=25qZrqx!(4qmzYDwZwJp`k?xS zY;dg=ncTgf^4fcOd1W@nh`_6&8uQ`!=OyV3hWYKH7MvMynjRuB*@-1xF-nY9YKxMV zATxsO@O28oRpind)vzFt{p8MGn_vDOZyI)1%!E8gm;a8ZbBO^-GqVn}3PwbyDMCLn ze9fHwY&AeU6oUD67}Y*W#2L`-WGYDFuyMx1MgA$! zAceWvG7_2CBRt?!L;%@>*2)!`F}lNvoLQ*3=j+#`7kkz)a`Z7e7_P(AN&_DicWZ!M zW+I60l|ZS(9n`$7?vLUcAn7{{q3m}GN>4@vb1R7-t-o(`)ryBG)@LDs#;MTG_myOa z=K-fdgtgD_C;DQfJ;`ND6)B`&PdbK{T)W_5d-{8Up45+(fa3u|BN|ektFrnRlFPgJE=uY|NqVC?>Rh%RZa89; zuaO;ObNo!zJZk!7rL;b8^&yk6)?GaOSTtxNAcad62dnauD%I=0Pg%GZWBE9Oo<>CD z`1M)sga5fZtJrVXQf~cDo6yY&jmvR*-=_`ns4UpWKl!TScZ9o#s^z z?&RZ7Kyzh#M@5owK}u1PAl!yRaKt9wI$|2UpdI^e97>YOC_ zkC6>Q*5bl8dY9)7TlViqm(m(o>e^*{>tHa1p6o}LHF^B$8pw(Qx+jkV!OMmL$+~#e z^inz?Y6f_tKw4T91oC1BDY*bCcz~k32A5ehFwf2Zeg1FB!o{1h{7*H3>)q)91%Mt9 z5&#;2c!-dP04D#tDjSAoKLZH`1F;;EnK%FQ5lC42K;HTHyt(NAT*bxXD>I1yM*)c8 z{JZEt215S7Ch|*4ymNk;k3ilXBmvr5%5b-GaW4S3!v7D6cZQ=Ttca-&-)o`}=Kq^O zy&FIvtig2D%e5rUpu+L}|LZWb7OoC&G;&q$(Es+uf(t$bJ#G}RWma>QelYsKPhqUy z5I#7n)#$%CWde+ON0Y}LJ-s6Z&0BmQ_nn;^XS2KpOwr$=TafHEGR`AoS7P9yg%>?Q z^rA?VR29+_`WyG2*ld#Y?X@Q%hrRFBKERmVUx1qo-?$v_7}T-eH?W6WL*m~@>tI?4 zH48~LXsGjaHZYx7$S*2jY)ovUkRe717!r9_e7yf|!2mJPNYKL(^j6Dm4sdFROmfcB zBc75Rs|+rZ>t8X2uhEpUmBHzFX2f}2;YBKk)#Qg7+S)q2$}W*04NYgdGqES>NlL|% z`(43A{ZBF<|4Q(anysKKi`h|++6(Qw*k~BBK2%i;R31D0PRSEXBSkl;Vv!T1D9$h4lBJQ_s$ADedN3XQ`dAmpOq_L2QiM zo^+y-s@HzLxwDUMp~qJeE%d60vjL_H<5=Ay##}=+(0|8n``1P*da0SG(Wa|*efeux z(+>bCjU4=wk_ds(ikAKUX*Hgi|Mh|)S%jnHVu13*&)YZ0UNwqIpKs`|&=;D}!=-{I z_Iv$B`zY9q^72I5p#?i>iR`RMw;I{h|KSjsx7wZC)IAlVTiM@EQq*xgzhYDK{tS4QQm+dO z6AtmM_Ap#_SGn4M_Qu9jQAnqHuWaqoYGY`rA|O&F@pKeE_bfWT4#TizO8mue^dYbR z9hoLV+oI5GE*Ld+J*XHkScQ{~y816zB*BG-@&8oqc-Ln7l*>1S#>YE*ChqucNnXP( zlfX1MJ`3k*+o z8s7f;N(~DSkMg}tEPO)C6VUgG=(ERZjMby`Pv2GgX9z?)q7pQV0ap8cWb1m|^fi@z zRW^Js>tHt)X3g8bOBk27St;8^js4cm-h8l(0A-0&aUq5M8DRcBEW3Wkmd%DJJ@{;$ zo&$^IE$F|GK5E<^(sk!Y0xPRA6blBnIlu=DEkti(L`-+Hsi>A{S9kwbWw$ZzCtra% zpq#FZpWlrVzrot^YtXE++qHW7?9gI>Uv3&fX0J?@xgI%`7L<^xG=; zdMTyIAJ*R(ht$3I_ocU(ew(=hSwal3zl;N9K3>j_xVZSsyF7Jo$wkf`pI=lQ@S=|S zYNN_FJU3U+wBH82ZtuB72Khyuj!=2BF_sLbcwJ08jcgT3S5quwhFi+|nZlWq#! z=Ed1=0J0>g*Yo~Bd|m=M>&<|-7Z(BsSqK}zm9)jn3hbx8k2VFC zfBG0dY!h?6!f7Be7v*tRc(REI&SE?-nP4`Sv)sIlKP1}&fk?@{F%zyFEft3!%h(uW zSJFf9=o}_B0mowJle$$|-hho9^evD7=}!k<%g*1^u$}9ZA9ueZ*Y>Q40Coz95F`r% z`?zF!?94Q$Fn&_K2ZicU6G$|9Vrg!9CVY#JG&grZ#8>-o@k@>=^E(pB_)`A3QM>tO zVhEemJn`G2=Pws=Ha$`^v}O!honB<~ZAtCV#L8lyf(JyGdoiohRUh;!Y$pex5%6m} zN7_W41ImTNJ={M^CqSl~<~wz5HzZ0yr<4 zYKQTpI}C49^|)>|{tOS6zydE`>yLe}11j&qJ&_LGiZKU1rjQ+#yflqJU1#fPjGSEG z-k$LG{6yoK;lVhpHubKYF8SyyS$Ic!Tq0$ySIF&jXXCA{Q>T-eQgu_8TKuu)*7lM3 z4ap3zR_SMZ(Bt5`uNE#`BJKPY4=W=hlGw{$OlXfGnOXbgiH@D6m!~4}p^#hgp2k343bBjv{EL3^r-^9qm&HZ@fu*;)Z7CQ% zqO%lbuUSuy6+Y^MK3AzpNjgytu}+ic7%@p}<8$dOth$fQuO=t;^KLtTfJ!92Q6}xK zvVKoAAAs^p7V}GE_zK2S&0dQa$l(LS25!AS_$;;r(gcd1;&?x_%g2+w_D2$s;FDyt z19i4o4#qMBS?CIrH^SM>stxljG*KnI7R$Wesf>NgXtikaxi0aV^f+2#TmOob`28z` zITjMPZoa>+5ZwRBg_Q~1lT z`om9*S10KGbNTFq$SUo{&AUgr!(EO<>#Ts4Z@0yNLfW{C#F?D2Znx`7`aE=2^5w1AQt!-mnm0v{<7JxHV_{B zqc#bB;>E*rC4TJ4*DiEMZTz)<#<_4Mk+; zh7Y?H%fVb@&yN@bwq)^-F5Q}cUA2$mWQ;G>pFIrOOe!iDufxswNp%gBnl1d|CkN4E02EmvEn zoWlgvS(5NZM7}a>0UaF3miA8Vi)5znc@;UnmT8B#}|Jy|Z=0W4HZVucFuQ ze++kzvlV^2yxTNv@I!C)J2(>6cBY`*J0n?8Qz{sTmXF>j{cZj1#rYA>7zs3wgH2%( z@)yQ3R-+H(9p?)z*aY8LLf}J*G#*A5DHOHH#980=PLLYCJQDCaRuL~%IV9$MxXbU0*|ch1a-*s^eZ4d*&{H#uSLltWXkGmc zGAl~y8}K9Iw+g>Hv6YzbS&g80TbAY-VR|uzGp7DW6DlrYro35U2%pR`76vsbg*_?z zW$*E#`_y0SuV%P{zQQl>as#c{_}AYu3qnnDUb)8tvBlwyxhruvp0ME>whuLv10w+;cuv5>(6S}4p;NqXmr@ zNIZzIU!Mgp-RVrfgfdOW5W+n)9`!2& zWq*`N<&HQx8h{TIsV?6>EZ&f5nsOO%KG_6eRR{mJVuSv~j12=H7D=|b#%r&uYZ{xn z(;7iH!;4`DMJ>oC?{<+_V7)WclZb3kXUF#1r(1_`#>~`Gb5Lt?={Gn44v}vWBgv?&?$pqmbm4Xt4`Oa!Mz&{w1cSlfsm63@hE#A2Xju~+@s#)tf z22`s`_6Vi;1-WHl#|;4uH6<@t5h}E)!B$IGNy<12$LyDKxfEL#2!YZftF*$HI_w?? zFUIxrOU)KnSn|G>o?^fXFcqjq*uh&LViP4^1u#OqtfAPrgfAaqt8cw^e1zR_7 zyR&+p{EKU1zM==kzPHsYuDa0yG6Ww%$Xev$uS?3@c0IVW5``h7_B~b1=a*5`?89z< z6lEU-n(IM2xodyrkUuY9xb`uV#wDdq&Mpw62(WXQNYEjIr&7I)1ArN$lx+%aHS)wu zp)?&2^%gIsQ6WbYcsJB{XNI$*&-cae7o~urUwE$AIaP4XSviXB*Hk^U#+#Z z@Ddk@vR%asg>)}}9v@2flH^Dkq2+yC&nraqqnX1mIjik)zTUDuq7;6UoVT$~t`V)i z&OmK@57O~ljEm!1jwD`*J{LKyhG9;d4?}d5;mM9dtd)QxoSfAiP{(_UOl=cdxgx3| z%jSntviZSO3ciW7UU0yi)Az9oD*i-Uv=fN~qmAj8-}f$|8`tIhtd|+c&_lTi7 z*YBvn;^v8ZuYOT;k5W?MIJ$9-WONE zzonTw_5TzeLn^u=0V{W;9%Sh-Ob=#E;?R*0ll(!nnGiTU33Iwdk<-6wVea+?8T&p` z5H5M{?k$h1pGEkekltoVO!72Fpo$@XJl7M_@KgxMbBuV2U4+8_j%y9dC0so>3}!v< zY{#GZyAmGzgD`xu0v?93X!CtlbWEgfkP)S97@cOBC8Ztw6zFLW{0{H;pL)r#M|s4H zv`7hwF!G0X|2MQuxtJOQpZM4;n4jc@#rT62-YD1%5o;P-WmRgP_n(|p2Aretyf&WJslO*_rKBBM+tS`RrQZ0B*~M)RnKL{C-_0rBxs4*&Abxu$49e?yJf`b;Euf~ z8hJs2Y50da40ETVv3n%JV-9zdYcYbhTwLlAF<2d%QI|3@c2pz5m@VFRnnti1(|O(f z2?d>Z{miD$Qc#EZ{hJ(mibyk=4y+}o))(|Zs?6)3 z7kal#mr=Czr=#)`vf?#{3w6AB@a3OBPbrQ5xJ&N$kd)oz&|6@ngn_?{e}c*Jw|h;c z9{cJvp<&PygD2d&gQ(pIm34FMLkRAU-||kbz`JogK#6co)%RS zL~&j^{c{f=j7eht6)CHZ2IEWUJu>qa9G`Je`hoTbwhX9N=*|g?{yWmphvRCPIhDU9 zgn5~Di@!epNCOIE#9BK{?IFR_9@spQz_vb&X~lj;E=Qfn<9FyG6fE9+Kb$rgLXr~< z%^=v+yH%TZdLrrzmv1M1{dGp(A{7m$L|#=AE|6=?5;-YMw)>o>I6@s;SswnNPP^kB-6qp8n%9=F>it%b>|EmFJO zXI3g87D+rdpLjQC92)Paet-4NN~p*V_8TZ&9GZEdVlt|~wgpNGA6#{KFp#ZHXy@_M z5{yX%eSI`JMw3YR;}(h;QL?ma9Z`E_x`s&G23cqB=3svpI{8;3Tp8IVthU{AD#O05 zbd&h(MqzxglE#RSp~d91*ZP~rRFaNOwS_QNbEW7sqa4>)vl9eH1OA!-KlbEsS_xTy z+xv_ex-Wl(XjNM>GtZ$yhOe-mK0$e`eR2LBS31&CWFV=LpJxHuP&fNzNNe9{Cc+t+$lmOVmwK?U=XZ5zu4W zqP*-y>i%x1%-Uu{L->CUf8L8v-c`Hxw>KMLSzGYX3VglQVEfsniNXA7P66-isHY}h z3GWNpa&Vrx+*Dsrp$x z4FtoENNHH1@nq6$pAD;Bc^!EXc|-HCR8<|idboMyhtAl#B0mFm0~Be%u0kEpjl&Jp5cQz8PGYjCM0{PJg_cntjhA~hU&c5MPOVK zGxU1|zJN;4yYNVpey=-OOq9`##S)3easzh2ixr%J zmUs-pj6*{J7EF)8My5$%>2{)r%#Q3Ku6K|Z1IL-a+=H{9`5{TyKnN-vjGsbpk{2u{ zSUqg787tnlSlZj<^jKpiS(i;d$09SZ&9@jJWQKKNQSs@)LEiwokC)Fr>Mn;)RO3Ef23SLLZ95Kw)1|X9 z16zSRq?CPg=Q3UbL>Qb+id-%oo!Yb>bFjm6pVV^Cs! zKXszqI3tZp-3Ld!03N<}h(fD36LJvVs)*RJ9$EUS4dGhg-U%5UA_RC^5O8=~^vrb} z5*wV`kfmFrK1E;vKYhJTZG2m8PfA)u=5jc5tXpOgqs%+0B@3+`smH8y_dDu*K1O~R zrr|r89#nTx502bY0>4L01~vMpF(+4I%Pi6y@xaa+)7F$&xW)6%jIwCL+L*a~ZsqIH zj2eqXk*%y&`|F&G*7_`UxE#Hwl!b5^VdVyPm;&Dh$&0}uCu&wqB|~Vh7Au4nN#&Q= z{EoKqwMk!$J?h5dopBE-VKhe~(yeWYOJOJf50{HyUJ4NAguPB4uNU~@`N~_U7w$Y* zVPkLlIvjR}48CHlI&BSPla9ANKS7n#UES+})h#1ZW@;G7eU(-(g>84L#ItU)5w0b! zhB(@DH=4@5D_pu~5T)TFF>vqRY;R)xP+$Sh&L|F!Q9=|xAl3C?F}0Dk%fp2d&@_3nU6tS!&2eqBV%3`o9`la-&o8b*NE9nws<>p)0&-% zY?(6pJnTmvc%;azM9)uLdd9|*>Et`iKpvRROzoU^y9#Pb457z>zrvv6@XCfx#vfUj zwA&rX7JvK`|Mo<9GN2G))?Z{gIs5ghf8pn}j!&^#6h+o%_41|c-9+2Orphh4#4(O4*Jao zsjuo0`-kN#cL!4)g;aBMqGqih(x!g6{Sb2eUfi{9U%1;b*8(#fo+}Wyd5W&}gG#rG zPk6&4XxT!zn;k2Oj0$=S*Z-1(h48#NrEOv?1p|f&I3rBORlskjE;?JT7d(-y&8bZ} zx>Eo2ROC-#J-8`%i`-9hQs));DBxejF;-a`Xlgt$FMi^8drZV^=eu3ve$Ke=!&Jf7 zlbqkd7y!D~;?~Z&7Eg2G6Ff<7>R8qmAou+7!;4aK$ssU+vMc?;B=ChqS~ihZ8V(Bh z_W=y`C6`)}TN^lNnpQC!8H$kk|85a7|NngbzZc$vhc7dfp(PA$2*Zt$q5gVKzTMV@ zO2BVkONDw5{_pR}33&B?{{HtGa3^Ln6$SeD=}JDeqNX8x3JjzRTVe4~UOa8If7GG> zr$^32|NnZn?IlwD9eCP%ueo*E!|cci#`(h{{*Lk=vj3@}_37GnirJQRFK&ytna_SGva+5w zmq%4s>$jw(r5W#RZ?g^d#gM~zS9Z~05)f3@Wyg!%LE+&gbKc$W3X}gh&9A-s?Be*r zCh~ls!^0V+ z^WHd>wyv%eiIkL7mG`C9JTo)%iQlrhxjLsnaB%S2$w^#&J)b!m8k)1adv8w^j?4Lm zENa-VU)-!_?WFzj6#e;qdlUH@#>T8YU2X4y`osgn!=bSJ{QQK(#GvN{&cGMHg2F;c z5+H0yyO1H^^2QU?9f6Vm^C!HFk54lu8#1m)l+?$d-4FUjmE)W>sj_!xm!2ngJpuv( zuylnV8CjY89>_e?F;LY`=TDw6Xgn zsqYnPEVp{He;g7KQDi(bHx&a0+mt`=?e9hM<;%r2Z&s(U8X%jAi@T6vVHIB-xAxDP z;cA5{omTKj6%3o1MYJJ|h6wn+Fh5DPgz85rE_(Mf{Dy{x7H~hny*XZtQ2a)}ez85& zQS@yYo8BDEjl}P?0$Xj_kKWVMgKC()CV+rJo)o*OOz87&qCvZ&{H2Cf`)wX9?HKJ+ zi{~l4%X$|al`0K2_4wbv)bd(>{{Gc=)68#qd2P$(6Cx+|6fO#VJ3G$L&lOZvzekBi z1q1}NH+Fpe`Zdw4ILKe4_GdxCz*iJG@tD}yeepyyaL}6=w+*5Fj*y^Ltqg^)U(LJ2 zJOBRGlu1Fn84~>(D%fivCkLOGmsjPstIC`EcVPk4*eF0tM^_w$A4f(`KI%S%RZ1ft z7kN)1>VvDQs>;dFFYoKy^8MLQBv%59Ioz#1mvO=lMTCA?L!6KARrZsqSYIqj#B`}% zet8>A_TFLisj2U^PHV-lpuC;fSyPtwI{Uz{u|@aqu5+u!Z|J7|RotJMRe15mFAI#>Q~LC>X?CxNk&~~kP-7L4 zkQ$1M=lBVq9KMW?bJ8*t{hs)vcr@SYeVLGACXw5<`)kIBm0`XJlkSgM!>D$Wfx$C< z9?k?8SE`tQGvnh$G)E|+X{#4kVq#)$X@36Kh3(_xkhjx*`FZ(Vc1f79XE*1Po@yML znvS{Y}CW@>6zdb;%T(VSLSHYZ5W+AH~y0}8bC z^qpN@QYzr5pN2+$Qq&d}7F?EnsNSd`AJC5ebaR@??_Xgk1R!2E{VEB>p7aGF0RbWO zx@?S9K;H&mLUu7R7mCe)j>bwQBu$fRs;vt8%O;JzEhVZovAu>yg+;Pvi(??tFfl=6VPScCIIPsKwfU-$xxcsfJ44V7c6~EG`9q4hX7F~|SOio)Kdz#f zm{?v#aq<3XfhHESySqClH#fG_+SC2zlDJDeGBUCPWh#4Lo5di(ZI%W?`8DFh?@%Nh zg(q1%{NC`WC?r=mw`%`Kj~Fsx-2xGfr-VJ8^zKL3>jNEBSlP}*I%UE?SQ>T3T1BpL zztq=-=K3Y3W@j(Mq_c51pRXp>5}~xD-Q0NO;z*-N_&<&7&GWww2FRcP7Iag+GO38T z%+A~o<7(fO8KD$kd^E6yOvGziHN$B z-TcruvS7lISNzhDT^quDdTAuQ(yfmn^*^>bb;|?w^!UG?@Hj5KrGm$2H-_~W_4o4e z$^H2gUuT-v^#iRigP!aQXncH*R@2zw_^9WWt=v(+)eGr>gjmB=BWh_$L=x(Uk)ej6 zZr`M1d+A%?kh;naRSl|`g6Zx_9K2+mqmZKI4Z)Ar)?@Zx>!q>FFDK-|de6zKJ%!EC zK|y)hPr*`OPqa<6hQP->EZVda@>ILq+p=A3=piw&F+I_*b-&d#s#q$pWgGd81}FLy`!BiFkHE5JX}(!%1!9~2xb zaN%N^%@&#+g=sLZkmL@wUl>1IkEEB+^er#Ln3yc*sVFEg`aC}9_;pEHQY8b36a)rs03tdZjptdwDjO0QpkDzQ2&HAcN+NSJqivy)@)xyD$1h4MEM#b!-> z_jR|js8m^M@SB^9=DUjx3Ea-)Xl z__h`(*G+vKffvT%_x15oR>G)1oykKjk$HG_*+1NbcUJXrT82G$MR9l!4-;CAnwz~g zmmJD{)isUyc3gSDqL`nRHDROs`23hJr0z0&>c?P9$p5J|d2bK+RVeFqAxB}d-6e^o zWd7}fJ;R#02vD6dbLah$L0!XIAIsaiLb{4yt9=624!$c?l3`qqblJfI;kPkFJZ=J- z!R?KX!}X93j0icG`@&ZIgdo3rA%}LKdp5 zHyrUkA$Ej0CG+0W@Fr1+ZDL9(+NIn`(o!pb^mBc?Y#rC@yUSzh`lrx+^H={?Tc}-sNX_3{t`Xyr3>V^28&TrrnjtF0u*V$#UhCD<9KPO3d$)y<9a27%>g?^~9Ur z!x8s}d(-&{9N%8IiL_(lbFGn<@V!OFFCO!3pp!jUo-5C$YMiF_Gcle7gX9l+>vB27 z@8(f#9~+ee{yKN0n3bb-m~(E2nw7T4@WXfLICH%uoexZQ`BI1W54yqQ<%)e+YIOO- z@(rz-^g));2?d`O43m6|to{eS&U@rkwSaZhUoj(jSUmC1 zf(3C6K}E3dI1_>Sa`ZSaXJsu$?XI^OYcMMbwxt>-@-hIP>9iPg;+eMkjewY@0A*+$ZY zQ@$Q$5Dm7R`XngnW_pVqpx zqSQaKU+6z_z3_k?T1NQXcfD`sH@&C`@4ZP<*U;>cnSD>|8pZ||8RC1NL^#ndwU;V+ ztm}n5$?+FWP}XhEO?{|WzfDNr!Mx8J%kIa7ZJ9k7UERfYtsfd~`9h0Hc%0`HM)LpB z^wn`yJzumJknR#ty19UqA|NfD7r1n%Al)4zEsZqNap{uomhSHE?tbU{d++^sKEUBj z>{+vC_S$Q2JTJ8AxAkUDJbCyy+{%u}=3MM(zY=1F-7{T4KeQeZt)JTp5!y69VjCWX zuF7Oy#Ob#XEYO7W2bJ8pOJqV=$B`ktX)KQ=TY7JaaE3!rN|7!~m4jjpu=lxlUNh4>ZQ4PnHSn%sp^R<<|aT zOSrdXj{nlJZv%KqA4h#(94Xs7o>NCxU2e6J2>S-$x8Nd2-yB5{MbaZJ3ak)AQ}jov z#RaW-!9bclnL^Wj1-FRlV^^)!EI*gFcAViClj`A4nE4r3t8k-aXvgDeT^pomtK$tE zLN-UQr-ShjDgqeez^JWkhiIL5!Jvs9(qdO5N%&MX1t@AFE&fx8Qo$G1yuq%pRs{a5!uG(oth20je zWRU#ld9gix8b}uZcU-jAZPGdVTDnszNCoDv$$nD6N_2>M|4Id66+dt1}6X- z8X=r3{NYNf32sU(+4m7}?^eD%ozXb>JIwqo^0xknRXw1%ZWuq7p}ype z_%6WBW(Z)NOl1ivIxpdux-lN6M9-ud$--?fs|>X=4OX5FDio z%X;9BExJ@-hh+GlDHxfy^yy11m@|Hx@{cgD^b6b$D$%keX8x0&vR!p-|k z1eqC&l2^zBdo~u?IKz!XUmXGLU``&9d2CzKf6bzG6$hxQ+ZDPWi0Z!0 zKpkzlbGhS3J*)J`v?BHvPx)1(#;>W0tM>-pjhuM;!jCrm5)7lJHeu_^@kh<==i#VP zg}~K>J8p&(k(>HvZq#Fn(0O`*5E$o;ezAfqYxwPRXx&2}@%G62!eZFj`^+_X;MzT~ zh1JD5P;OPYF=4jk-X1e;gK|-g=vku(E zOQHo^73|H{MD#TV9iIhk`A*g)$#J)pO2J6fj*JQX1$#_)eP`F@-oy6q{n4&pMM4M( zML!97bSxRK;J3*k61F-!_g?ySH)Lh+Vi4 zGY6X*4$&Yyb0aTEv;Spj=T8_h~?@>+d`4E<%q@6niJ+mJShtp ze=_L0-)~1;Ht+Ko`&nNT|54MV3n$~^W>t39a#mez&#wFx(7W7sLjG{QkKgEetmPPv z(XV=p+lN6R$U?}cX}F&kf$M`5yU4lLDKp5bUMH^ybxs}aLiorDAL3p-JM27f_(&$& z*6M9JGVYiznO@}OEnMZzIaglO+a{H6>mcy!Eo-K7uGHjC@P%rX$FfuaTCIv3>xGx- z0-wQj3AH#HjDVF-Vtec>_HYs9*Dia{-4)tjY85HF2oibU)y7Awf#FgXiwvq@_Ev%! zAxDVWKt07zVxJiGxU-Bz-_Q%_}c&|~rh4HDX6vaUOJ!R*VQLAy`NkY?5T>n9Tf5B5ly3cM%`%A52&DW?{qy_JgD zq_WpFYU6Bg&jsswvi&;0uX)0Cr+mmnnT*9@!_}*gUwV65ICMSFRt3qGf{V{aghC^V zZ5FNKp1MuNw(aQP0 za63)WScxvxDW0wv_Fj<`Lb}I>xn)&*KZNzAeYB|RzB@=02Mor2`wvl9XWP>Ilb7R~ z^&dhj?_RD3%D=`a{vv?HER~DCjUUb8pk@nhjzwo{hP)s_D&>9Cb*6`T((y8>Y;)xy zG0`8~_31u{6Zu7_(-(z!A8N0{GdhSuOD@yF#`D!cSt7W2@x63?ZLTHH^R=_C;u-9y z+A<<~igAXgxZ5xvw7-66kTc(a$alP)ssSqEHgjWH7FpkiKg~#GI$SA9BA`Zy!v#-F za|~I^KFV6zqJW*YY-lEZI@_&Q&3|HcxpQQBw;>O zU;pkm2iveFeeAy1Z#^=6!zA)O?LHgJut7g2lXDJgpqeA(LZaeAnU6<%D`ucY}`RhL{4r|`4ZDFQ4jx`{j@3QyObd>dFmyPCnzj42{c-GWn<@p4sAX|jpm zV8R(Cg9%HbNff-%5Y7XpeTUC%@l)p{iSoO>rOC%SOLD(#?4VYfcU$`^S+hSURys}I zUN#d)>{#9DjpIGgZCREJ+{#Qhg2dtDXEgh}ve_b)2l%N6Ud#R-RTb8a%xGKdB7+Sy zeDTI|ZX<&-3(_6Fm+;ie@DyyPy@T-XBpG+!*>9>Y;3=yK=WSX59bfhSB-)34aMilH z8tu1rPJE*pU!eEuxZrcIIBHS9x~l)ILIz{UsOG!#7*8H4gT485)pm@IM>5o?f=JjVje&PF*1<2VVjBH^z9Jf<7 zvwDM%*}rWuVRGsGymaG=fA~IqdVa%lB9KXgfnhiJ)82}s=b^?;F;3iIlUO_~03N)4 zwmgIKS%Dlw4IWdE0b0xAN(-F3nNlyWXz*sLgU`i8;&n9k(U>zMoi? z&xM0cFQf>_7$|isE~yGP;gCmA%H2cOS^H1yJf!FcX)k8(=0^#v+5LJgVbg&r6!7D; z6#~9h%&(j}F=hT}b8GA2TfAs#y~LU1(n9Ht23(Kg<;6hj1`4{h(TvYR3!DX>LP0(e zp;;!5akE=bb51d?h<1y$r-F}ea+h$a=xp^B#@>5z+UKWG#4K!nJEP%VE(IWIV%iw8o0s{+spE_#J`^^+A57u? z(K){D<>7tjJx5k@U*HcnV;!*yG(nH6y*ISTq;|sJb-qz#eL^?#NiJJ=+#Me5HASAu zE-tTfkYB|;xNiK3T#!!v@Vj2oAp>7tOkKk)nV;M0?|M*{<*q`_V_#7AAZr7y{Ii0G z^Qlc!!MFFuZ@ z@KL8i*KV+ZU$#PtwWH7H-9e9Vsb-m-KaB#L(7;8ExXX3hcp;Z{jXjUqH15;&PeL~% z@Qh_Fm^p{7UrxB*^e$VQ>g2q471=;F@%z}%5>VgNWPq!Tis!16(#v}Cp&pZU)#24j zZ#;`(vGSeA?HAPok4Klby5x(lrn*<)CjFk-bu$P@lo+h{CtZAMYWBT3ipOn`h{MMX zgw)yL*%qfR$oVaHd*q)lrJ~~2{Yn`?&IWbXNYWgSiJ7VK%G14+g7kQLFTdTWz=gVl zbE|Nvl8gmS!Z+v#)$}+@rCli62eWo_?hUUVrhx6?*z3Ps92Gx3vZ%ANYN!5{(@moj zUK5BvlFVCbyW`>EP2I3x->H5^WBz^%JJ+z}itSPxfrKOLk#MaQz^>90@JO89+cU2bmp~`{q@hUmR~^QF zf6{cyZaP44JtYoLM^7*DM^@?ZfWtszqkyjy>nI* zF5RERIJ><3=_~9<`p$Oxi0ge?UtnQM9X<-4(ZN2-8f3Xj;Y)6F2V4^v~AuqxfLLF}2t?o)KviU>JfPm%Jx9`LL8liT5&P^$E%1*zA@&ZP!OKhI-)}g*ve3J^*qTjN zo&WbKzS())nxIy8{r;}f|2~s-VRkulHWw34#mlfB?@ao&O3}bT zhN|_+Cw%$V&c(t1S9NuK-I=YDqeh7y&^GQH2*+%D(lr|@fpO4hIfl9}C_4fkOQEg- z(-)*K(G3i&+O=YbGo_!R$i4)n_H=b25E2p+fBH@Ue2d2h#{YOxyhjvQ2%q;Ooka3{ zT-dhhgv(`#XKQ<#=JRL8$-X}I$0Y?*tii|AmS6$T+kQ`=w-Nl%AtGg}m{=h)_V-z( z8T06xY-yNZqB|lvlVA9NBp%a+<_-g4XXhFWAAXN3MuNA${)-4p$;gOWSQK)v>jlaP z3xob^fG~`Qw_|?3;m2_A=wCvnl$Pw9`R20FYkX{yqk0bNiSG#mG}rbIto8cM7(2rSepot^LBanAo*{61g+IDJRQ#!~0!=ZkWfk5RrsL^K>u`Lwsxz_qct znKij@2Si_w<|+}^*ViwWe;^=>j#nB>BBK$Cq5#FhxXj)KZKXHrSvSo_rFeJlI1A+5 zaHGWE1&Fce{MAVN?E9mn*y3`0JQat8Fz_f%Ct0{$QTA(H*)k3(sWQ=LTs)4TD~$Wr z6q`}Nthgmez&*%HsS`c?F7 z;wwr=ry2zW9Z9^5Y}%J3qeIkuSScv-|VI0=6?HaG+i8E z(UStD6#g^hsps3Z@r>t^ANpADoi`~p>!x>{6{p<2VPX;z)B2O5+w_xN0$ANkTUcVlx>`T)|8@7<35^D=%jg z{rdIO^!)GlfdhBvo4AC8fop39ydmZO+rBjaH6VCjS4U^9mUqM~7h{5={mXIVoFfG) zp?3-#E^bW9ckT0OhX&EKEXV-RJ6bb(IRJA1T8t*#kwGjKLvfPU$@Y zX@EyN^ooj#><*@wn5R?1u$|3YfuOp2na+=F7)*++L|waci@jw5-eqTqI3Q}%pH_^%?j;<(8DRthcjey|ZiQ%ch7JIY8uKH?YjTtfjoQhB5-Q}p@&!(m& z?6NYOyPZSZv1U!j>pphP)7f$gKIelswzd@fuSbq}tPZxwu|Vt2Dr*T6F1RY7y3kW$ z6sj$k_4d93avz*>uPYM4cO_j-$4%>nk1y1R{~xjbDdK>!SOCoZZ`;8EYFhliC!iAL zZ)Kol)&KCSY_dmM&-O&?KR}B=NFx6I<}L^J4VwU)JRoek*su@=0CDugwt` zjZUcVxvkoPl&!6l|L~|_l8TWL1q~Y;8%RnXI2`%&MJWT|dl>h}(p@ZHT{$rV$!Pun zJQ(ebWjU}Bf{WEkJ40}3Ou#Rp_zZTplz<@&)aSEND&FcLD8BK6iHEYXMZTmCA7(GF zRxm>WB0*Gct_dwIEj19ovavbQAZjJ2fk!aq^DYv^L=6oM2@gv+oWR)Uj9-D=HhSHo z)#USf-QCUs(ah}6)}2#@Dm4tB4^r;#-ZZqK#l!Z@0S?9h^odIE>y~F7uy=7nzhjfd zp51ZyGBWxRN^D}b=~vqSY{{aw&zfs?=bD(9FnM0<_=(4smzM{Dp>_hyAc@DDV^bq< zY3a~6asspvV6Rcq&D{Z)9{dL@t$^3^zuJn9HRE4RyZgI&t+?Z^K0R74F~gpyZ@& zYPM#znUs`V)x#^~mV(QSMIz!|;Iik zQLDx_ZfqYi%W#+e{1x$U(zf${lL#=7T3;V$9Zm=SU^vl#nsB|*@*LLra;t#8bouAm zd(}quqQTGP^>KSyZ?;g&r|%A`@b-h2iS6z2qT&XB?<<7KEk? zS0q)|k68P&zMwvzvX2%MxzagG?hcQ&I>#&WV}(o5Ot`$mTKHeZ#|vn}+Z`v%8`40S z?(4y9IUA&LBwc`6z~c(1hy@hi;JDj}2v$;365ak;gmzWB_`s5tm388W*4~%p{zI@< z`OknvI58C|!ry?v!2a_ecg4x7xWSA^J?! zs<+BOUabBGqAf6^arsdL_<3p~w~fVb+iw4gp6_)co_~;AGjn;kvhYkT8Y|Ons<1(V z@Qy6Y=Ya#^&Jea5&_D9)y*aVeb~gMyB}~`*hEPY@S{|GegOADi2pDk?veb`*XMDZO`&mjF62-ws`qe?s(V5W=q>d zu%wjn3e0|-o_HZ94i>b{z z15gp5K8+uxRsR`+aLAT{v?g7NPybY>q82s7PL#5|+~=EY+qPqOQXnV%?+T!yc#uPO zzV-`Et&g_rJR>ix+Ao8S;P=#O--80yy7Sw<6>?I$NTHXSi|?NB{&v#R^iz$$INvSezyu1?b;y+K(~J@b3!wPBGSG* z7nhv;WUd#>BPL8U6j3Hmqg*Rr(E9;pw4LV(YX~FrC>gL$5Mi8?mMzpHmzoj zR^{2j7X+k=vpjUE;R^MjqM&%rUD#P$9E(~JsaA^CCri{viM=NHg9WEgZ_Ze?rZ@zD zDX0`E#QiBk25V+_tH|iO8iu3dZ-OYU@{|Ndoq9n$b7sf@SUA;J$&cG}=F2j)c-*R8 z{@9Ov%)Gq+qoA%g(XE78SDTb%OY5ET@xt1QWi$(9+R&_=3zN&>P~meuVexusy+E5y z{b<3N_ur7wpMx-U2HtU7{p()l#una+5)2-YwX>^$ko{1>3;|N5Qz6UkexPW7UQm2^ z&jY8-yEz_}2GE%u=2g|sa4Pyj2IhNi6yZQmOi~`4H3X1o!B6~mxAwrb^|c1sGn}k+ zj?3|a--lkLDIS*W!gh9gwMl4nMM%(q1Y-Xu`Xl~BCB1rQeE_)({lfaceX}~^$@=P( z7e!onbdm0&t3Q;DAqVmp91 z#B4Nbf7ltvh-S^H$c20`ARPko>h-MzBOTQ5v=S^U*y!nl67hNwu)rjnXI5|Wk<*M3 z-;w%^b_SwblVNpefEYYh?estLruY5{jxrtZ04fsvx5(rKzoc4Bn=C(I!XKkYw+jM$ zg&(TV$kDv@!R+gPTaO zJM7^3by;?FpqZ;7gxg7WCHZYevS?7Y8E{upq)elosT}g-XVjK*2L(7zCrA+9&Yh7O6GmoWq0~ntBd0|z2fLq9N%R+ z?B5`0!s2>Dn??r0y?0Gtd$eP#*hRY7U#QHgY~kX&yT$gjph`(glfUuS;G}Ti?L-(} zfK8`gd3zrZ%3?N>#-s+ql4=K{O%L6aB?TXCf6(f&I2|g=$-Q9_7W#RCNEYq{!s@Mq znL$-iMhw&LFL$+t1FM=^oq*_c?+2Y}(qRFT;9X)NAO6uEF6C)lTWXt8cfb|vw#A2i zWP}Qv9hlhb8klMxsf!4*S}^i6N&EeK_orlXs0t7XII3m_kJSt$GBf1K0=3+zFkhc- zKeDdE`Gez`jaN%fe;VRl4u5uGd*_F=+Hb$vci1^sr`)FJ-BL?MDY;N*$(DMhM`~N9 z`wE8&&@2-#y3LtTW(X zML@zbq44V-Uy2LlUn%e-Tgful0yxU(k?v`ZMe1u@HTlwUNHAJ3qr2_2(thhj$RFL! zsDDGxB7LmGVt#Ri*HKqnvkGOFnKmngJO)lL9|~FJz^PV z@fqGXB!9tFW(*UW z$V8hq(34+6aassCEi5cXy#Jiw zV!e27o448gUA5@D>gTjmJ%&hSB`xcJ8K27!In0|AD4%8(=%1lr5Gz*ZM7h3ilfQ^F zon);Qr^N+9JKAHGm9&8{h>+xp&WrCT9{=h;3|?3?7Y)Ls_@F{C1cH=Ug3!b3yu|qz zHMqahAfRZ@9(co>{?zN@1r-m(gN@Rl7idhaYpVN0ceqYTJXuu}9Pb z@y~_|JmA^Fvv0^8!|T|U?}og>eex2tlX`%3>Af373w{P01U!N{B zbQy3Xt>5Xt+`G0JTNP^Mp%Jh=l7eZdK8fy`c5&|(nqKOY&3@}oQd)7_#PkmOXhl;} zSN=My{|W|b?8acQ6;#5hOL(i9o9@3{v(>U@cG^1dZ>|Dz46UB=$6;?1VhCj}p2g+k z=rJJ;`FGeUz1wejX2W`qj7M zAu=J`HlKiV7nNGM9%g3ca<0ZUa(Bf5_Md;BG`1yge?+HMn9GL$`j=||LBBQJ41o-p zfRQ7HZ{r*vvB^_~=6Ucx$kn>r$NOR=yRufU4LII@AB5s3`#AdI(0(t^ zRXguG_7k0D7EmJKI=)l6@6>Y3gv=)`Yp zk?A;{#SY0gGjiSPMi+XHNT(f?_kQ4^HKwN%}rZOwWAOTw_HSB3p7?r0TH{B4Hcw)YU0OCx*F*T{z`>ozHkwMzKUajB2xnYXB)4`r5#-rf&~%z z(m`wpWTa#dZP5^Jr>PIhhAuTIJC&B}&9)b0dg(5x_cBLVImB0S%70R?b{+~WYS22- zSDGn$`97xZoVPs2ZoyTN_4jB|I7M5QfeWQ8cz);-vbA$Molis=7%`5}V}&+iepW^SsvYjlVX$qEA;3;f>gRwL@` zZa`Q!m;fTgR<`WP*fhHOJ1_Wyp(V?Bs)DHQZ!Bgk+1VgTU)7s3)bG-Q5a=fzV z9VNc(zg^T>z(S3u*PoubRmdbLhjcGxcfVhrDBqKG%5lNdbE!R!27cD3pi z`;6y%Rps^$Dv9HGSykbL0U`|8Qp><9afJheu#123X3}$T;KnonGER}YS8(q6k8@hj0IL#JG?jg=9Wa>}s z#OLo|Zqa^8bql3&GZeNlG5EKGRW${F9~@Nv+sC%&=Nrwlb`_53!Hnm2EN^B*>h}$> z;s@cuP(>DW-FMjV(7k1m3r{DJBky55K-=Y0q)M738*ZLW%eScE`agUwqKqGuzB9t( zh)5}1ibUop!oe`exaFSoN=JC0dOT*F@g_B1?j~w@sT)fvWM1ANx+*FdTBfFgCrG0C z4VavkQbGkz?k;y`!bT%0!22zA{OX4;$NwFYw(GlT%Tmoe|Dd>p3JukUFS%%u^LtRQ z0F(MA0`1t^4~^RDimt`uy7Lbj8JY*dN7g;1y%ws^HcOxo$fpi>nche;OH7e!(Ozei z9+KOw{tSeicJ45?P85EtbFGC?p!jkd##s?YOLm@x;jpKL9k5g zEafi8HHr8EdNlf7usrilq02$L_H>QR2A18^g>a89ypD&QZ85Y8QaJhS%mm%?P2)71 zxKiTvx~~mi@sY3&i;|k^#jo1m`c%Yxp@L-4{b{K|YTbX^!mhMOQje#qPy;?uG(oVRGXBCpX-u&mk6S7wz@!ZB84Nv__Fj*=yaziXHIu5!et z9k0MuB+A5;528V2<8w}Y(B=gCR;X91Cjas@Av+`JT=($4MUWP_5LgsuusvD2B8d6> z`m|fE^H-|YzH~!Npe^i}J8+QjAwIL6(lVTgUtVooMkf3~h8tPk8R3JTM&^cGX}uRu z!B3}mlhAkGI$y(nGu}DAeCD#4aLWH|xbee(&H7u}tB~g|h<3I%XxzheGrk;&sM30| zmVvyxmfUEu{}YgH$uLrX%D9j5*d(ofTx8yP;)rCaS}Gd;XQ*UhSEx ztk{kmBlKC_>4rg$6CxGR*46OU>&piEZT^|B_e)^w#Rl@%?q)&36qTw9&-UjPbSlHI zFt;8h-)q&?z+=@mb=6DaTm~^(CQ@cHGT#RyfmT>U;!Gwz58%!ajx{g_wKs9>EXYAWbKOc4Wt3z3qWDOaav z#lnC5x-Fh6;JD59nc(fc7$_j@o7hpp=R_AMQ_h!bu5gscuRZ?S33`r;MOM#7X{bOm z1Wh)d!W<3F7zHJR!zz`=42QMsHS11#(fuIzJh+cLqsKlG6=Zb`H^DN!NUZy?gX2Ma z2~IpzLQpW5xR7p`o8e0U#9gIgNZV0$eW?PJb+JNS`|mo!MU^#9gdGRGQ(4jaiw|b? zGtou^2bFLQQ}2D5xW$+cK61c-C&o$>1*&5=J*pqXy*ebm^=2|*Aa9sPFJPd_xsA1C zH?0<|MJ4nN1vNemlhhNZU>*4+iIEa2IHraW^?kARQHHDO7YKz=%=>zXF7MZY+B29Q z4J97iX)D8f%Ert1{{G%BKN`}nDQsd?^)}7Nd}Tu%=CvW1fIB(D*#?i7cg?VKo%p$`)kayIhAwQ0yJgN3hAi+qfea$F@*sU{nA!@H4Ulr5y(flACX=WcX z%CC&?@fwY7lu!tx7917cZ!=x7eq;5Nfq`gO+sfyWZBw)fM0;d|?Iiz|5 ziDe&QTX~t3(D1K52OY;UH*pX+sf9YlN&(MFUCK*LnRLU>GXq>+; zjQd2xk|98P6d@|1Y|!yz(dJhE#kFCVfY~_&&Q8Fmq&pCu@I6lE+{yB_YZSTG&7+cN zPxgF#=;a5K!OuV8vivow{W3~8l@Q%}{1tXXfsPN#^4DDMVZCHF^AC-i zjX2SdfmDwDw8Zj<_un^b-89+fun)n zXHUAPQ(p=K#@>2A(DPXrIq+`Z5Pv~;AJczd=4zWi?5)6#A~1HF1)7eDrLicFD6_qe zvB>;i!=)gdxzhCff&(FIFDdoUoLNRcyYkbOyo{;<;~ui&25*#);pWLZdHt^396S`^ z679i4F2#n#pxyHfasvkUnJJDTb?uIpO)gm$Hn$aG@h$$2RvZ+7W|p7&Tbo{4a6E~M z5QQ+6wElzez3kSG98DHH_fYQBX&e1Vegi)r{iX;=Wxsv(X#f33dEm7L>p=e29ecJY zlJORxF>wepPO2yVt9G@e0NB{k38;2n?bCDen?YA8pIr|TMSJKASn4x#x18W`z~+fP zZP(MExOh%Qj2V7UcD+?aA$(sq=bJh>I=G9BO6cd5h)2ZAX}@k?9+@Eno7-DbRo`*| z06=8$`td;amN`UT$4#s63@som;zoC>qX}63grMD^w&u4?y~E6(@xa^GWXq7Z}aI1M${q zNv4r2*Y`9ArA0VE?Xn76QXn_}e{Gu@(+)eHpFE5)YX0=S3h5Y~4r*03oN3&6Nht!1 zi^rn9v%?_A_+yNbQ+SCm(D;8skFf8lRq4D!QZP{c#wOusyG+v`iMcq58fX^-n07{zL-nM+KAz>Ev#=DSKv2SXlIh(xKg;G@&ay63A|F$r>VzOk|1 z9nxkQ2<0a}q$j}A|F z_JP5{hbr|>`>`&kE2WROr-!^278ZOSSFoFt;5GqscbkjVF_DlileXS`ROqguT5HfH)_btmEbT z30pN6?vvKb5%h$f-rlT|W~1Ib({1%7TOBX{rDcIKOPf?~+urpq$+hF-uKmZ824v~} zejcYi_O~B2++LFG&v|I4^qb5u3-mqC#ep#y<`;Z#`F?KkOGqa5cNdG?#+1wslNTl@ z1kr;wLXjRZy^YDpxAPSB^C?M5em{RA_&i^$KLJBG*W&s4uNG^WD#6tI?d|OzkR8?b z)>dX^WsFG29y6iHKzlo=OqK5s76%6hgpt6`)pfV;PfAKyb2IK zx_?@YeA0w16Q9!dZMIZ9IH;H2YPm6DkY#AdfZO#%bIpj`mV6ua)scK?ca*`AtSazK zD0zUd$%OP@#v(GWP#Xx)g8eEbwZ|0f*T+9i5%JYxlb_L=v}=BzB*W)|Xerq0!@Lr3Kj`5N~FNn~{-)pdE}HDlH8u{Pb;FQC|M5p%O<|m_%`xaTLG* zOsxy4P)t}@m`qt*T>H>pKy@L#b9}BA30zDoe0lM)!6zjR2QENGa>gO#B5>Q6`ZZb+PfuQ6kH>XV zva&zLsDA_pBO|;GbrENjcZ7iBDaV^py2G>WUms6}qHm7oe^U59;SLWEV_4JB&|GEHg0NJ868XJAG#}<9tGPM3^$P|fk?}vYcCeJ&EbDh#(c|K}iyddoD zcrxW*3$2ug{;#X$tllq0D_;`Kb}G_*-L;b)z4@P~RL0&5N}8C^`tBsK==sMps~H`q z)R>>{2|LQ77g>HkKl_SJ1qP>F0ul?+F){tegfeu4K2bJ^R6WQg1Ww{9bl(mKRPpzCDKu6;Z<^3D$V={B1CGeIl;lh|ggc!9r zpzJVOo|A*`?0mgsD=JDo9Mu;Y8oJ$lae)TJoQK0(+%Mk(f)N+D*grH43@C4oSEGW- z-9T*oul!CP2q%B5QVJ=^$bQzX`lMzltXa0yJU9%xn*dOI%{KNFX^`2?A;VL0Xud?Vp~S`uY?Vo~a1_Lzp>neB_USNCqs6 zu^6TA;Sq}K4%vM7gbedv(ARh(Sulc=NrrI<0)~f%>NmcE`Xz}-sAuHF>?@f=-V>z$VH$~4?4#z(-w{xPF zH7d_HdcRhi4ga2YM|h7f+)4MqNDY9aMjm50W@1uY1-|vdUwi2%K&FC@j!qnfMG1gU z*R_r3+f`RoA0U3pFC1t*^)>mEhGP_wV@gaZ-Z&5Zf9HF-D_&l>A}v0J0;p9t8bT^R2+XGF!b4BsUUw{dV7 zu%AV&(ER(4BSr0VIFtBn2p!z4VAf6e)3l`Ry*9U12K2lpM5We?)X$>b}E0 z#XyH`pJ3ku4LvN3LR?O}jY_|3i#3FJoP?wXMXBwgj#m;B!WOgk?vV*!F9vrnnZ(RI zy*f#RUZYn37=SR^SUFy&sQRCQju01-f zsBOLY*N~ifq18Vk;i^9#>H4tAxGM--U39DkIsKN%!3NNFty20S9X}9HC?@|qElo!_ z($jb0kUt?hTB_yd9R-ZNfd~%FvX|gT>=`orLp*tPI5G?76bGcrilGq8#S$FhNk)0F zvV?|)MpE^>7{aN9lI2uXM864atq<_yGaqfo^{&c{05nWwjGz7D#Bh0ed9QFGMni>& zvwSziO~|+6Emu*>5QuQL#3P8%iV{SB66pE(=S5!zi!y8I_fKC^@K5#An;$YLgJCs! zi`g$No5soUHR^&dS6_I?4Th|j8>g)dyjI94lQ@in5Euc~8o+ysE+{CdHmFeVqPy$% zgF^@~Al=>FMV@N|fv2RMPFI$JQGPFukjeRdiqXeJ4-OE;oO7N!g#%yxBIb8v?*s8& zCHsFW7K?qu{xx$XGhbLsW7TjY49uQZ{h#v3(PEt<3&cA~5t5NqkTfZSN&$nyggcGe zx;XiSJ4SyZW5?{l%=@&0mVMhkswKqa20F6;1{~~*A+FJjrXn*onbVaPx(^@7?G7xy zCHt5G8yy?4m%D_IQr@8T1+?a^#Tv&EW*YZ}pkU({-wK+#9)Fq>Hn4X+oo9CbKI_uA zllP71?O)&5mx)r#IzJafw|kaO;;uA_fIy}YpY%@enB003^D-Zo&5t57vZ;BSTc*#v zFRt#d>ilG=QjA>NlZG|h5KjtNK-Cq=bk@|UTym1U>_IL$ zG2Lg#lU&g2ji;P>Vgo#-SPR-f*|YC(gqD?D_vUq>x zI!y4W3GUyWFdZ?(qLhk_*%5) z_@3y;28$?X2a=MKD#)nVq3>AOSeU{KgJYhR4xd{q*v;>iI+pFVTW?O0Nq;v~-A8B& zLQoC&$(u9<#o(CUW_aDS^a*e|nurkC1FubcO5U zxyJqlWp?ryix`o%ygVGj@M|UWXfxrX4N5e#*g#qT{m#@E!ufQ zQ;bAUdIdzt20j-rx^vV#YblamWi z)43Byym6{5nv<=nrjv!EMR&4UQJzydddsp$%g{XQ*2tTGc_r7UHB+QIc;HmRvT_D^ zJ6MZBaAbP2od{iM5US9zn}leo_PfTzgmR7k!_p7@XCML=8YHNcfr0CJ6!YeNu-{`> z{&GAOXj31Qy{HTuDryB+JbnOI{xHKRm!7g9ztB7;b<(`QRT8Vq=PKep=6+8CMTVjy z?(cI--s*!UilIfc%<-f&_L55G3%Q}PBXDmtdN5!hmKjTb{nGEMy;!sCtq=+xY^F6h zaJYSM4q-@C8zBN1hinLLuC$iDj{tZkLV|+$7{LIu*y;WdO}C9F_+X;4%hmup{*$zb zs&kD435OEQIHM7=U6|vzJJP5Z`As+1Mpqq4_SxgQoyVN%| z?V#!(5u#l6e!aACKOkyPqxHHzm=1Smi5hTYHH|_&$c?a$^=(Heq6_u*qefHepm*+N zz6|kZ03p52AIV+;sgv zgC1Bwq(h2Jsn@u4#106e0S~CcxSM2nftA?OojL|^#9W9Z?cL93o}udqgh%q^nMTsR zzAsIxHZA+~zwvgpDT=t8bgo0=mcl87I%464G5Q0n2d2dsG72^{{(!LS?nb9*18O0L zFR|RRBKuCRK1F4^v>aBoJ>}_1NpF&OMs(fx>H16}q>TW3a5<|mo~1-BR?U$Zx2$RT zR^i;RMa|DLM3!3S7uG$*k#~?BOkn(+MGg|Y{cF@Cb1Z4=Di3`IbC#)IXVR7Sd0&j~ zNt!gnCphFapWZ^j45wHg7zPmf!EvAKuPD%`3uTAZ)n4;^hY3#;PxX^Xc98c4VrNQ$ zO%`{4ZYv$On1sx+R*mV*5$_1vedA8>5e-S{{V1BMRt3-SjN_IQ6W?j$vsvR0GVveJ zl;@3DcHaJxi!y{@yYx!ZF?zMCt8k2|cgzcBtOTkf)rv@mB#)vn?7#p)qlQlZAeqAv zS36L^`IoQMG}OQ4d{yCwI6-e{|9p}B6Ma9!E!HDiitQZGfYOe5ACC?PGxoYWTepc6 zi9eof!p1iL;WmCvlW{+MGYY3i`hVDZ3#h2x=v{ay!J%X56c89dLP|QNr3L}%l#uR5 zI;BHUI);$$Zlt>PO>Xr;{QOI(F^mq?T)KX61V>mkd={sH?;JT(G)rqMpbbKL%*d3i=UrX*?*O!Mxz zF&^VMi%&08ywl`!0l9&xm}lVmV2Kr+kM4Dk7?~ybeeC}Jr`9gM48E&Ll_OSsKLp+ zU5%eJ8olzd{H;c+T)c42X5nmORe!qTae?*Fir0FS!?|fP$#Vl^WO>bYXI?#5ij@Od z{l1dEFBxAr4c8>waZkZ%Cp5DDD}$K4qHttS1GG!Rv03diZeCsAmOme=+?VVQY7qKt zn9lXQGZ8(X4xaEIOnw;N8xL!1YuhXR z#p?RL^ea&L`|}d6YpF#7fl`;$(V9n)f2Gdy*EsU0)g`?`d*fhOdXoqiUPVXT#7G2( zGSYqY0rqO$&k`Mt=WudAaP#jx1jqw6lEJgTpHa}|HNr$UwS+>V7YVP@g*^Dk`d=%F z1Vjbamg|9F%9iD!+ZC`+COSucil=77a_TT;D`f>vC+p5|gw@RSci;I3N!784OwEqX zRZ!nq3SJN^F^V@FPla^`EH&u2Jya`oA~$)e9$CDp@vXrqW^7QB9N5yJjPv0xntNm6 z;wyD+AgKrv`}&HiX9|->`FL=(O&B;|uZ?r4OBYgVm-tHZ+JyyLc;I|GNP-BH!2(fz zg0eOCA+Z~}u*1OV0F?H0g05*elh+Q!Kz(*N+`rMS{h}{?4Qu_HL9+t? zzOT_zW=q8O3@zdMqycN=?AkU22YzKb9NgvbGK5N4`LmG8y5PVwsDA}qMP=NpkJKOa zTfvyc$zOtfIuP;DKVDWu9N=Gm$FPK*t%v*%M!aa)V=HYZjAl8h^*s zD7`muNqBvlPh;w=7nAnB(=)#i{5AP8A-QQfzjw68a>fMdl^j}{*_&Ycz#GPqPENf& z>-ow&EwMR)%|iT)=6S)tMH013-JbT)uw=xf<>>cG+@nH_C~SgPz88m$0t0(XT~}#* zK0eN_wifHoUAq4H9OOp1$JKoFKwhNOGglc-WY-Y4(BC*s*rWUkri4L5T(9HjZ*NMS zTLSO$nSd zm~pv^3;+W5F6mc#UK{nWdt=cc*wM=4AEur4(>Rlh$Db#|1a@<;Rcu_MdG4C zz`-y*y-fsxJVSgh2tqVX|3b}Xsg&>;%nz(Zw11rqt7lSWNqp;$07+gd3LMxwY8ld= z;LGgXxTrL>!G`2aH57{WNFB^&umSrYq|(N78`UO?Kwhdt82H&a(z;iBf;+Qw*Je3p zAO?p%(}6X&F7llSB1}hFrdjJyV;YPE6%AtXzTR?FP2Jd%sW7=i*Yp(0T=RdCjM|UR zCOnun!I9Z{crc%Xtjh8|g6tVgXXL+TnPY*=5mVV-EaxLRpnLg&Nm~96O*(L2sO4oE!G0~G!s|0zC!0=6ozUUs zMUw@I65%QqcI65>z98Vr#7WcBJF*NF_0`aslH!Eu+Ty8zhf(=tO)Ek0l@03%U%~L8 zZWG-!IMfi^KKYe2lm z{Le-nP~coqnA+L-=`G{+N_y_^OXIQ^6`n!gnSV6<{Pc>S<{C%X)xp3hs^?X<7eC1HUHx}6@7nq~ z@T;g_iDvbDhjJE){5$kXVBv@y!LrB(;Q7HwUKAJ*@YkuYyagYg#!2&YRm%6j3feHZ zDO{;xjO-&U3egCV6Oa2hF(>8Wl1ly7>wiSy%H0#9%ik@5j`RMFD08jG5ZA{~40T$6 zpU8fW3Nzo1F8iDyqE5QAX#gMFJ8B(TRAYLYNQ>yo52}788OevD@UgsN-oQeUOz~5G zEvgAMm6&LxEOC9Oo5;EXRned&tv1SUn$E1%b&+x+Yt(S%tqvo@UO({8MV54t%t=hM ziw~ARxaRp|(to#qV@LQVm|b<;MS%?Y&~zO4B*ymGYIH|GEi~f70S5-}3*~7RN<@V2 z-(-rlZ`g7UfA|A}k6kq|1U(7SVDEb=Ck_pl84$|A+Ljm(?{YR zl0?vpw-k8!7k*&xvy&>n4SSMD#F_E3&spL~e=aue3-Ocazt-{;BV>v9G%h|Hg#kDkDI(>-=%Z7GB${Ac+Ny=$8@z*6&i1vo~tsoU*KM#xsAg_vB>S zf6^?~!%C7H#xNTNZh7uWv(-7YJSM9q^# zM99ja{q9i$K6X5r2Ta#O?Hi?|&)8(l(U%Fo2p6 zyOl>O@cs#I_49VM>q{x-$wP>8R#HIgZ_FZ`rzuhPjPim2hZ;TUC_z}QN;KsA!6*~n zlkgYk_c(5IT4LDxTEfg|PIFp&<+komjiWgoo9Mt>gFdg)P*|3`pAM}kE|Bm0sk_?M zTZv8duO<>7M`9ZmFJmZ%SE_Zve>?^r&XP{{f|dUo8vl5P1ObFB*_yB{9M~6iaiS?s zjugPT$h5n*ejLT)vE=|&WJ&au0RU~eHWY*@3yk#nN>Oy98}#|rSfK9U z4_J4p|Jr9-XCB1A|0$}W4VXEQm$WW-(5&?tgjf%!HHEM2nb|f|E?cT&h9CQCgUDpA z<^Q~HP3W;$@{)~58Up`5oUb@7SJTgE`sy3I?1)V4p==t$a}lMI13z$0 zsvx%0+&G_OQbJ1V9q4W_Q&1sz?Z7HzG<3!1Uj;MWA%4=5C7q9M_j*^d%-m z{dKNHcg~^4_FbNwp{UdnTxtMg)lmA@^$U;k$y~TXMt|$sdtb*k@s)>-oX)2O%@W-e z5u2=dX#WL1)pGt+0mrQo-KSTV%rm)E4fkxiikGXl#v+H9D56mq=Wx{6uQP1%71n)G#XI^u2TSBM1 zQ3QLpiBg40N2Oy;8Lg%NB-kz0N2cO&VyMbd5MiIgf@>ZEehk$czMZ6cDNp#XvLeVc z*i=;WZEyfK8Cb;WodYj-4LUUGHj$P@WWeoEVBAHi5|kj-9UM57^L2g^Lx(Td zkwkw0G3rpmL+M;&=Sli$X?$RO$Z=mff>cWmH70uH>yXcnG*s(!aL@bvz~`I?NH5N} z$1aFN#Cjas9Qf9yNeVjd^2wWCwS{^7>&M@(*iQmoOfFrXJ&9ms zI<}uTk>BROqTJuavT|nHs3hrgCp|Tpa1fh0Js9yZG>3ySPd=nk#Jdk)m|>!A7sMI2YQF(x@;LkfpR=<2=>Paz-dW@@wVt&;2(bv z|5q8-1$5vd_!NZnEUM}oJ4vl`J#v(+Gc$Yxvix89dp=7%c6Z5w+6yZn-sMhU?rUV3 zsh*`$oqxD=6}Gz9Q}-+#AQ~8{>%DiK74LplPM7}<=dr%mw{4B;D?N9O^HZD9Zrr{kz_&c@TU-?hx!Wpjm^a9%ni!8Mo4Skh<@ zx=4@i2NHq`0(V{m`pl^CePrOi5SH@8)Mtvedde3(Ky4LlX=S6XeCVCzh!R(Dfo06m zMp)Ec(>=c}k{7fZ9JNfwfb@~YHsO-_7Mn24=Sg92WEll9Vw0shYKALPJ_G$KEq+O* zl`+$xvRqaj1-lUrdQ!$X0un+FhOwNba{*Z*V=~7rqQFp7$faZ(0whyh1cM4&m9p0H zlB-TK{QQ34*ISpill0j%%Qjj>sF%{_Ga2`>gQ0hvJtv=~>(~_Vcohg9=d52z%k9r~ zW&e3n&3OgA#RdYhvA!qWMXl5`tCm>4K%Gn*NO^15#%X7xwEPw8NjGw6zEFOXN&){j z_=8!#Gau-Mu|X4zrF!Tb#C?{22wXVV`w{KL0?Q_xM}h!QGKzGt+3tGPtb7 zdHg;cSWMlGKRj)8ia)X(fc+_3rlL`Qo>LrAxHQ^h!Ryx8H}9JDNx0gQ1@Fszk9(b-!^?No@N0qwEFFClV~x~P=su;;=^Byy zwpB70ixLBpOnG-B0x&@4oxFI02}CmSq$ZcuZ1SOLS7G znVQ@@0&>|&L-8&FmwXt|S=;x(PAMAH8b*~xuiBgTnw83Jsz^LOZr^POBs>}) zv1De;-HNo{9xYVkdaCstDqfyHF6bUX;VcnR%;92lODs^AELEPRA43>R7DjcYcwOu( zt{I*)o-Db~=v!ADh1p;85*-Q+_N|;Yjp{Rs&(3nny2lO*i>xIS(0tqnJH&v!c{yMvF<%tOY z)fTt4M06{t;PeuTq~N%HIuN9}x~+Wp05Sc=%1!_Y2fLHxthd&Pt8Vp}zUZ^X+00FONTe>~(EKp+kf?Hc zGrQ&)sthAGr!t)dtH`Q+Rh5%7kmyz&TF|O}fZ$s}PSClY#7Ru1Ss6`HW0u^M+>n)% zeXetH7!_~2udn6y3EFzqNPk2h4wedfJ-s;Nrt(Jh<~ikj+gck!TPd^dW4Oj&NCJ6q zwzws&;`y1uK8fDC6um%uAgAiULn7>`bxwQW0g?mhvU>0qXM|!DLz5HQltl+R@Bn_( zI%un}X?7l-QaYi37F-z?9^l10-27I4z{ixDK3C_SS)yXO<>~=4h(9@2JDA)Yk}jrV zsHt92T#>y-$sMt#0yKm?3*W9Ehojzs{xS9_LYFe^XPWtfCU*QU39Ax#H>$RpAatw^ zZ~OY@0n%mK<@SgZ9!}1_&_`sMoBK=UU8dc(ALj2tgWC1LU%=q20J~q4vSUaEC3M%t zf1H+)ohPQq33yJ~Pk*$`cW6O(S;k`b-Jfl-daXr5j{p+Pq_Cp5E=e!R9gv+xyKlr& zK443$FmprAx%HA5Xc9RMb&JTb0wk+%@Nbw^dFI>IzIjv^Zg=71=%^>HG-cu7F7s0x zi67(|#&nw%MuN4{+RB_xku8>(VDPj-%0xJrMz@!^ljTA@DmFo?f~o%ZVp?35apk*n z@d6iCx6v2?m*MxP^K|aFFe7y}M#9AQ#E^M|luDpnj*GwyvC6UVo=gQCIVshr$1|u| z3`YDmKDtx$)RK+KJv^f#8DDUh{OA({yMnu9P|WC}bNkfaZs3~ZdZm4jEpm@|U*N$m z#(i(IlFak$PIf6?@!}SEF0*f*=61?K#rvzART|>_=4|nwF^U4fm3qlWH5R8K^-D_P z+30wIINmUzdfXFZW!c3(W4VhORx0*UsfrC_987iD9qgO95b@NkQ$B+%x%XF-w znd~@9^S8it&yvLxVHyHR{*`%#PS8uoj5A$H?Z0Td+f37{styUg1n3lw{Oh3Vg%?0q zZ4OUeU(rro%RGxB&ee(B+1u3Yyjb$2h>Vli&Ub^^c~-`h(`?^WYi?ne@0 zP>eMz=G_)Ro1|4M&dc3b4LXVK=6|_sK*VJ=aW;Q0jwWULceP`CrLAoUpl(o}As2AL z0HBuU8l9OBms=v%;=X^60>bb@2_TT)KyHC%lMCy+Z+tW@zHcrMmjZtLV3kZ4bVmdt zm;kny=bt}+#(CrWAo%V3cl(_Q`cR!#FA^d)y(w7;%0ed*(UN>=QuZ2!DNu2mi;5Yy zghvpDgbLHw+>HbxJ0}O|sW1=_@&$mK?3x@TlL*0Ja%n+9Cp22RIgf!7DyFSn9pj^6 zJ?}WiXBY=SH8f^;Il27nqNC3m^;dlU{{1VdtjvC~zr=iW)ZMQJ@SG$skEUCHdE>aX zn;Sk+xfyY4bZ6Z$VaWs?rx|1-;-~9tL5+OYY-f!lu0rz0flhB^IE|McAo&2=18FDv zac)l2yyiowPKyTw9EA7;)f0O4usu#I3$qZ8XV{&BO|FD08k%fR8;wsO1t0UJ9i}|C3Lb{wZ(3b zycF{hf%nX^4Q1^96r17&Cd-P5!1R`rc91K&`ug*3FoRf$vlob@G`zh%A_kBg&iWp= zhP5}W^WS|B*KKm?`jr3m>_Gz`AA@*|s@3O#_>B>AFb1Xnc+T54J8~io4cWj8Dn9BK z{Th#&YM(#vD1QGriU#=Ln#)^pzQ&BPclR*J9DV<;TkbhZ8A&XR7z;+h=!=$i>(&~| zXanKme$11LNK0#)EA>}TD9jE&8E`nBAC(?~G0SS<r&kVgVNxEGpqhfW=)d+iq`$b#87>X72;Q%(PHrWoK_M_V#Ts z%M;E98W`MpiYtzXgF_u5_wF4Q3o9!w2?3JK%RoB$o*9c)`Dq+fs1v=X??dS#V z>;#Du@u^8)4i*ngyC0Rv$+0A|V1}26LIA#4a9R^;bF+8uB|tWnlw`foOd_XFV5X4q zdGh10a^MhB3l``!w|M0Cn@_0Gl_;Y>o6|A>YjwtV0aw}Eubig4=z9X>!v3tawUzLp z6b__-XIPz$&U;zm;k_$9H_w0n#+_@jrRwbLd?E#6(W>0&frg$#F_t_sC42e5c~pd} zV(2^V`!i)7PrrqUceyCPa*}DUeK$7gx!Fh^n9T{GjM30>0-4TqVlV|s0AB|+>TLiJ ze`b-QuBS)&;>C;Aqa$p9=0a9kM_0GUK?@c>2w<3)sNg2z&l-wX_;r3 zn4G{6ZaHhQMgW>fFgl~Q8 z3xLefK6Bx^FJh;R7C^^X@Ghg{1j1~hVxe62YInBq^rWI&*i?lh10doICFgTP`#35U zJ`mcR9@Hb~=6So?_HeEr1P@&%+BpS?VcN&XW%00pbQp`1erd=oK2{l>{*II_}B4ybv;#<^$Gjo%Oe5|irB*i%q5J}mfs81 zff8+cg=TaN3?gjcO87S+PeK6ZB-uk1KuMq%W=n>LwkBL%xrL(5<4AO+_Y4nX0x;U~ z+lzH^cn4u@F%hXWd z_%Wu4cI_M(LXvIa&C9X0(pk!k_ODbwpG7KI%#Y`MxysjIvj|PDia_W2G{;!RR>Y}R zpdi&f???3wh?QM{o>fpU}porJ)1SIiUcQmK0hH<9LKms$6=_a?XI9Tt^0ZXu3rI*mFWi zig$VzygYl&W4}IfTgp8ij>hyC8?F1{9yQl;utOrmMCJHa9+vb<7kZ<;%m_7tC&6<= z^@voov?@)QN=klIEG<(~J&Zp76nedO^?3YnYvP~nP|^( zgs4Fq1?FLv!7(@-7z!{^06)s^@xhyham}$p=j>~!TrhF?d1HZZ7$v?I`@=#V4*qqa zt`XyGgyPl7u~d9B4)yrsNoQ-%jgbJZ{XRO;D>Qd^=F<{_{3Cc=cH9rHEQ9UPz%($h zljnJb4*ZP!0|c@KbKP0Zl^aet$TKq^>tcu{Js|8>C9wu|%dByF&DpVN*5d#eg|VdD zK$z)Rp|Lc84NlnG+t%#BGHzfCMEL4O^ifB=^rqpOm~1>F<>`jU<``I7LdzcSj?;Gb zjC%$W=c+AUV_-&YY_3rabie`3h-Iv7~}x06W0gQc^WBHo;mYmOo`R zR&xI^((L4~nE1bm)*ulqLI66Cp&LKk5oK|GQ!-UUoK` zuJkyZI{aRD?Dt;XT_BsdiXrhaqlxp`lq-}88xlMxHx9=sc#Wm1ngXSV20D>g1@6Qa z9>G+T`smj3k1i9Uz?uAGD7p)(sz5#6rN@O^5S$bG1@IwxmZYXRh~MN^uxs)`7;4i% zWez52RQzH8@I|Ea?^J^ zjHoopzp}GvRb?7yqGiQpGqe{E zywx%xyUAXeIm+o3lWPLLf&4WiH02TC(J=&P`7S?@zrD?= z@K04Xpj^yhWu&1m=Qg96u<6Ts8IlFZ zIZ=I!ta^cbz|Sts2qp!$>B164y4sJ6s(7&?w&T%a;pFn;vOxC zq-juHw_oipvZd$UUzvTQE!u~-bW}n^Q*tUa-K&qN?c0I+4Roe9Iy|LUm<5ppU5aJt zcAA#$(%AUna@Nnu4%P>CbY(RjU!00rzROf0K+i(;6L97N71q_^QY?NYv-YR{_dNbP=EW>yE8+2opMW|3_Ldz#NVZs?nMF^< zjDX-dy5!c?df^TB(;{esW^vLVa%KMoqTofV&kW_Dk!ND`wYT&}#dv5%NhRQQrv=0a z?u-lSoMNpk|D{IS@g>f`O2g}z@e$$4=#-fse_U<*yS^X9eu36i5;z!_TM`!5#hRg4 z)1Ic9e&++!cZD7*IDNTKEwQ1s6l1RMP0|q~}g!H!W)ykDk z>YIG`XF$wF>kN1Ruj$Uott>kh}A0S+uU32c8(q_E!X%r z#e%>Sa^uX;M5qiFG?Bh(E>da;SxQF_d>4@wT)@0I)$UpyH2a1fv<(J~U^w^n&(>tb zy2ya?s8nsFVul%IJ9py|8Vz@TVFxA(6ZMrR%s_clyHz$;6*D7D${&FSA4Oxj6|S;>%1KGn0KW zR3D5o6t&@4PCsTQUKB|(jVzTP*YUt-;X6$!s6jY@M1m?JZ)cVWko5$ktT~d5wqc17 zd>VCNn&LXLlFw49=;Ho~Ig}pOy9KFy48`6(IndNp=0{*)w3~(OhMdx%9Akhd_wXcjjId zF5)<|Vh|mDTn)Ry)%&t7@w{OJ;oobx$0x1)FNMwhwTwmjD2r?VR_%qJGBmZlwr@Bk zDhkleqtQ+Cxg~9Bs<}HQKOaA9I6a)oCuz18IB}IJ0_q>!)$Ks3n-Cn%td(3ny2L9UO0IjW&NJ^@7;(wy_eH@0*H04{-<(CbHmnAZ`NBymx2|K zeKQ7(R9O%f`Lm?d9!6wp`~i1DcHGmFXCpY$v5BhnvoSexYOzA5xlp_l6J@P5Lt_8D z3h$WrMXa4#Sgy8;Ok2F)>E&e1>ECQRT3?w^tX9uFpUfk2)8T1)hhyk~YghJMDyi@&EDUHB?$DRkbGtp0RBBG>!`y1lk8 z?`h`dN%0QSdb}cEakdG&d}w*Td~55yy_0y<-0f2kebcP7h$pUs(8Ye~XiIz8`{v0* zgp)1*67vB=I;oEN=pqo9)WPGOf0`ZV>n1E?Q&JdXFKlg< zT#6PUT-kK~P-Ct#bNUkKc*9OMPujA-OapQL{)iZ)TxbBr>ff`oZh*^@&H~pSur{?$ z0W*I8R|9@oM9h=XV03-5326U3znIz+6itv*+gKCUc91hUO;&pfv!bxyZnxgf@;znI@2_5wc~vkbkbB zPs7bhA^n9isHzIxXnn21=ib9&UPZcqGowqX#kUi1y689US0(+xAts2-T*cYp0}>_u z3k#XDjg0_gba0Sr5LN4=o}Mq@l~9(FqGe}Cv$sEH=i%v{Dx8doOAUr^6NeqO-D06) zzY#4A?>t=c%stq5-R~~Zsv7V(39IZorZOvd;gW zoOFuJH$0;jsAVJu($D^V;<-C(65DF61>V!t%IV)1sJW}zUM}+MPTQK51}xor+Dpgn)y!Moyx1g4;(q5>>?YQXj4A9Bwmt_&cn0@jp7fam4mZ-6(F z`f#NU+t}Fn>gMJJ8yj{Y;5`C-Oz4=Em6f8$l6IK={r&Ym_xu2Oc0@fx2o?q66YcKU z51`9Fiw1@(Gv2MktFC9M)D*Jf^p)YlY&!L54Gr$*<0T|IIy&PmR=hx>rLvd7bkX$K zR~m@-bD&2?4O#s;o@41LK}!n|yJo*Xw;Y&${xUz`$;S>bZ2wxZ_B+3% zd-?g2snCLWtW88vP*B}}ai1&1?^4O45?n)Ktb>qH)+b=6P`y7@^*Q$p-*g}tso z;phN@uQD3$w}8=KPK;dP0V5;8Xg%HYASzVA-RiN~+MOkmT(1Du;Nk3_yaQgAe6|26TT7e*caC>R~8K?4A0u_$}B zN47@XgPy-A~~MBd-FdYpp+1o58e&oo-UVzz(U+4vg;*q}=wZg&zO zp3u;IS!^{*I#+8Ny#a`1Ei{*+>YKSzH4QfXb@oVgIDM*fJDvDK#Ak`w6N_MxHCXm zP0jd@5jr$9BpNHm_vX#GmdY&=DoXEii|6slro4H(7acY;QOYVA zQBjI1gD0|dc1OPl*&9iL2`v%-Hfog$Cv;~rzgRq|{}^+3M*UB!z{gizRRq#z9G1+E zDuL{gk!(MRi%gGJL9b2Qet(b&PUrX);q9Ez(zzl60vMw;YaAeplVU0tI6}@|{9N%b z--&gCMxwSWDge43`BYtVlviK7 z&ISbqNusIt(>!80;#S2NMHX$B4j~&G8-Sog(EsMEus1&+k!)W;!xMZpBFgB){cXn> zdpJ#Sygdbgh7DRgRwP;?2u`Zl2cR7@k-DzYz`20O8;9UEz@C{%U{Ft#fr>>8S`Lwx^bb1{oC{+6z6~g>OI=91 z{LbPwKEfkA+pD`ohvntfus_*o&}J8kZxOj;nLmFw4{2nDW{qVri;s8SM;SW`>&=#E z4aWDUc$J05n2!zblnnJ%H0X1P1Yeq&ZISD1MKfdsJ#vLBWns2c;{=Z{roZa28S-n_ zQ&*G4l3h*~)Ly&`zReKrRgR@2fr1R+GI1D*{2&a7Y+M#1C^($1Um2nO-?d=y|MBnt z`V~YBje9Ei^d*7vKjr+gUdVF7K>wBd?^4hI|Cs-)fP~b)a=@1fTn7vE@B5z=Ch-4+ zf&6I?*e{VoPUM@>Pp3y%MwJtD^g<<2&g+hz!uRj>wkYhPn83M zh_E3bcG&-X{`zWJnLgcHP{V=BW+dWL)p>9Bh^N(LcV*B<~uoX z`|=x*R;8o`Uv)>#@ux+~#oDDD%EeDn)@jy@6aU^O zji?xKTa8s9a#O`*_uj|perR)zl-J?Um=UFO1dXz>Da*aqlShpM4hn17Vsn{q^FlQxgLSv zc;9dVFsp3h0MK~x#)b(1?{Gi*;xn%e+AF*LSE{RAD!cww5Z7xT0KO1ETx$CG zwGRNko&e6LC=OIy76nGn0Tk|?7+G_gLyefp2h2D zFDc^_&4yDgHh!ukaUDG@?@m?3r*c~d7daQtSpI@nG`b#@hC`rpyXK4eKY*+^^Kn2U zX;Y5F+kR{)4e~By&U!U{-G0Pf*yl+(E78{Ew6oUu`1k&DCjxqRlV<$jdtcz|P-`)n zzdO+o(RXCMkXyJ=Yi%X(dfA%%aIiA=M@}{M$6R)+`^PDU%LMrr&gi1GRSwglV!b7g zQ~}r0t)Z{Qwyh7TTmV$Da@)hn;3d1@I3XLf1rT63mSpb&G^O_$)|Y+c6gRH-rZB+$Z~^AGxu*BPvrR~G%`0RKgX zp7+kYO*oh3TnylYN+hDc4!WFjP%a`pSDZ;&#SgCDV5Z-TTfmgZx6tu?0VGiuX;x&T z|NYhGtM9x!H4Z4nP8&aQ4_4ar0k`--fB!fzh7e9``M*#KK~Ju3Z>@m*PaW<4QOBeJ z4M${-uNkl9P)kkroI333)1Px&AaV10*4r$z#W8TYpO~DgQ0z3KMyeOVWEqsw6XM5a z0p1FM&w@@e0Pjg$0blIK+Ffg8B!;P(nXm|s_nT>)cr%ZfaoK3Lyj}YTnitG% z1$lL9$M=ZQVfw(ZAi&4Z0ZtyA4;IuxbeoDCB;IyN9eRZ|11x}*@j)#Hi)g}~oQW2~z8!knL2|rX3dL5-iCF}tE@u3Fq zGQ<0(5IAszE2h<%k7bIH3VQ_}=a{AnFG)AKpj!SM%c|uMjwa4JC*xt{=YRV=OjakY z#_j~Ys;8NTY6rT}EjEhcQ}8x%`7b=3aq=N|gJAZ)J1o8&)5UIxijXpER^NL%N!WdW z;D>J0$oj?YEvk7}a8#|6>rtAZJ9wq@kF*~H3bBy`se_SPStRXE^;@CnT@nK{S+n=G zNi14Lo6PSS1sF8W_og-M>_R=<-GyA+QUqMnRVOF7d>;@`TUMfcQ_qqgZgbS%RyDT; zf8&FW>K$jMlf3?DQP9Dm1F+Fy>Z>0t)HG-SL|Oojuq`vb$)_VB13&2l6E&m7+JmHO z_2OB^7o2j%vnA@G9e{x`K03vN!*rwi4wha)K(M6t_K-g9)uK}hTKLQ-5wnQO7-0js zB;yAB0(5Ih6lHu03RV*UrgHz27z~segA)`K#Kg<10jMj~Q4~skHP*b`!orl)>kG0g z_4c%;KaYw$HwO|Isx9#S^SZjey&fV%VQ8Scvs z;1KddiwC!GUI;c79?j~TP3rM4?s6M|JOIW}5WRPR3SAiIT=M0MYGc59$5FUj z;K1(oJ2oy6imF^19I4&WeXSIlPJl&W^vOkuz7rVjw9#twB4D3|VhuK$YR5nXCqJ(( zJ;2KRi+Zr!Le>_j8H2fqZ~a+tt!XaKT{dHxIqFFl*w#kSa(Tp#BYz?e?rKRr)1Meka%PV!Uj&qsdjy` zwsI^N6LR!$@Lc)Ly@~o9YCK@&cn~BP5O)mjAq_FfSFMG5i>hbDqOVPUDzkC~CR6Nu zf3}ZF$=Q9SBfXBjcRoY*9+BPif_xp@s{TE21{t-o&+h0!BrHb?($2~<%q<2u1Wapt zxXN5>Jocq|geo_+Wx}*K8B^36O3!~tcY$>0vH{eKU(D=`#M(Fr2FXO(`KvL?QItZd zn6D2OeMQlM6de?#?b=UE`8bnxfaN`|)J}d~Gmq1Hx#F#n$gKYCY~1(y=0QcGi#dOMRbf$gB?t&&UB%j2 z@k@hMKyz0~L9W-Obo-e}9RQx-XDSiMJ85%$b8iy?z?!V@-rMTSOE@f8+!dJ=Iia_ z^*lErm+qaNBv!A}69p@egJ-A~ovdz^bYlq^Hc8yc2R`iD*z6~y$M)BBcnUy>GN`>G zWWc#NzJ8#|Er?mmM-2Z+B~MT6vCg0fF56|VPZoC5u$JQms}HAvI=tp%qK;c55aibk zyh=GyQM!^nR{+#8hW)*(@3{uQ+je>RY&e8jYQqxX6d~pRlmd5cvcTVKCzl|eM?Uyf zST$3kbsK0hys?P(+4M`w(L3tXkzDr*F;Q)cszL^2sz0sY;DS-)!s*z@cEzY)bn5*3 zrF-(WR?1J|QE(6rFeP4@9Iy3&2t&crW*{!YY{dE}iUiZTnJ_r}I6^Er?cR7!2q<=+ z9N{gs6ezt?Zm53=2fOa3eopS&I|w-|t4LqxCrK1-0Ocqwhs*o+0wRiKH+%%p{LCGj zB7$JoqKMrfH9!7z`>D@9lfGYKzxLPoE!m_SQ?=7aB5T4*%At^z@BZ-2eJH($kIjClQe)vz(toTGr6 za~kuiBN>R|32L#LE|O|;AGtxK`S@ye@QSN7YRN+Fjfy+ghca8!(7q~Fv@bxfoB-aA z9wE_Z?T9L0IgDQ#^oqmGM!(XYxNw;S-5rL4-9davsF+3?6y-L4R&k`HIMtu#9Y9K7 ztr33vxd}3V-??v%f*VBS<$LSk&z$w=aa*jGnB0jsThU*|HqR5fBcL2kJ#Yc>T#8diP$e!v47Tp(ZdIV0>7lC6f?L z&sz9W%TZVKzHp$d!#1D-UGgg?Vk?pvrETX&jIc1?l}wvg*?1%n`kRhAgQM1akG)~u zo!957wpQ4^Kd)>*_K-c^?DSEwN(RAcbFtD6*jErIWVNk!yUb!3dd(W6qqB!xjQ}1_ ze**~f zEz)jYEi;D#HvKu0&+&kD?6N7W(YV1oq;x(MOr2`14Z5N8LdZz?3fZ7JQOs9piO_@RSN_;-3bAy z=AaqB*C5A2$-IP1!#{X``%39}Tt4?z{#>`ZJ>OQSSEMqzxDv{C_!Gzd*uWV3VAs}W z++b9EA7+lDSV_Lu(I?l=$!YQv=LT$Oe?6$=#Z^_=U5bAh!;w(AA3l`IEiX7aGE%$g z{sLqQDm{>)^ijwyk-TzSUB{tDzD=#2KN*XTTaViJbC&}jNlMM1U0fXaM-nKen+z(E zj{aPSU5p}Dn2i`Bc||v%v@?J^zAaXoqPzG-j+O7&Za<-$F&D!>dx5cwE&DbDzV# zcC#rhv_u1B`l7xk#&Cw1l=L}lmbK#??-W=68Ta!{YIb7Or^zO8{lwY@?x!23qx zB=kM*cl&{L4kLK(QVi>S{3^?b#O@1r^LsIqoI#Osi^dihhK_ADDaDgf^jao zE_|t>l5jZS^Pd%mZHpMgay&326y-y~ds1D`FdyT;dxDba<~u=xwFg=lGyijxaM1qx z>Cc((LTqg*d;uP=HfJLjg3I`^lNzX|mWr$MM(Lot3uH4h-&QBgvN=&UhFx2eBJjwP z1QVsxZx~5?@9=C}E)~grdgDXo?jE*yvk7IhUzDJjBTEK)D1^g7c%Ur1SXo>MC}?qv z0pU|%K>04B*A3#v9z8YzC@Mzh@z?zEaorK>=zx5NFvW@5Mxoc)aFa>|HI${kvv%7b zg+C13j`FSInMN2AbJPlgXEU=?0?jK~7^rKCq+FLCI{hsv|0d_-Uayhj3No&dSXltU z#BpCm;6`E2TCyz|_tg#g>2VH?h*bIj8-Q=G-zm_6l$;6qnoZ_MK>RM-XkQRfOX(+e zW#k+#B|n^2~Z&Lq=jia&(7?)^IX zlcj4F4p*p6;A!RCAETp_>RSnnL+<5vw#0SZ>TxVHtIzg~P7mxqHp01nqn_;_N~e-_ z85QmvX2O@XcX$p}$;u$G+FgED>((11Yw`tHKNN{Y15@Bu2mAWQlG&uR(8C-6H)@=| zk%(tT0rrrHY<6&+N(Ws=elIT|3-hXU&;#<+DL>2NKqv)QwcL7hL&5FH#N##onFL5< zVh9P5q#WY}jk?X~6{ zb3hGlX^aW@6XAI;Q3CGz=2d9e3ugvv?OzhRGf(4kj+8n^k~!8I!ic|H>fg34ge-DM ztL<-izho>wiISO%?7-Yz#4SNI+=FK$TuB$GV4Q2h8_n@8CyQ9z<0_^&<@~tDIkbvl z*FgOc@4dSkB+#o)@`+jb^XX05YqpR0R@|NhyAeM`R1On; z<5T>|X~Ly2u#5V;3E7N<9xv)7Xp>L)$khwJe}DQoT&dKAd)q#%Em?5gPdBGgX6R`1 zJ6x3|k0ib*)tth4@O#=2AU&LQf>vf`I6K!Sqmk-*Wdj zDWESgPf)38=(gqWN_{k7zzoMrE(tUa+5_4`NwyD4)ZyPUp9C3F$Ex$q9VXu(<`4Kfiw4tV;zbkr_mG z-7l|LJbiRx_OiM@7%?xcj*p>um*+ZRs~Ywj4Pm4pM%gLSua6?7Ps1|8B__P(s36%J z7=dZgN|~s>5vjnzUvERh`F9fr!;*N9w9kp>7Vf9fHb1XG#v~@QPj*-BbMlY6wAPGs zcZo=0&yd5furi5;1~*+NhNS;O6}N-fT+I6$C})E^1`n3=<`&vh`IT0N{AvlwijPS zq|erR0@ZHMs=?+LmYg)V9FNS1vE*c`+z-lFzLz5{k5UXxza8BP%dw;0I zWH}l|Sr`7jQf9$ar5Z25rU#nqE@5qF=wOOA--J<&NL)Z>l0sVJv%`y>Ler~(zU^zt z`}M<-yb*d$CEKeO*bV*FjVbT&6lxVV@)Qw?Y2=S@EO#21Uz#*4c%VuurLXzqQ+VVj zbA9n4AN^fYwAj^$>uQHQ&o)9u7`nUO+aCcBTCCwoaiS1~Bbf9u_|r4;4xa}Uv3`0de=iW^%kFZas2Z$WPN+vaxEs-%OhU^j(T(%Ro&S!tfcpB}p{px!? z>XKa@3H5nh!xd~-BwjSC3nYKk9X#Kkr?_YvQhlqGeQ}*`&vN5y1xsx^$k63$7c&QB zpL4UnI-RC4*LYl`k0fJ$Rx<2oShSMb1f>JLHu9y^iSjJYjcom8TK{jYmh*nISJ`X zQA*S!0VGMzoCg<=zPsz)N)GEUH(?IhuCh-kZ}7J}$G)z2IhFp2HC+!}=l2ZWNobfP zuFUoEu<`PO-|%_8TiShS8J>Y9#uk0KbL`rm`DqrVQ3>YTdbWCA(PtY10$Y`<6|mR3UN8(b?K+&p048z zQdw}9az0rDN!c(MnD@%YZ)mT2yb&P|Z{3Yp^HBvM?DCxELGJyWUxlrF@4OkmLA^f* zH%~o5hIF@iQ(kE-9c^&~ab+4b&SLQxgos z?a8$W>dh2iNXEY8cCx~nEf7Yz?x|~ngW2_`4|nJdOJwf)HGHi7x@>cpM{ur;DYX=`$g| zjVTmyI_$A_>qR~lg|SkHw}fT=SrDq#AF)dEwo^IQtg*!q48zJ~{`$Z)mOE6UV@T0d zKDN@rsA!&h$cxfkhCIs}Rz>QUJLd?sxYEmNl{}MZxkL?w+8A{ql|0&LKAVYNjt}`) zK5yc6iU+bd;;aFeTT*Z%K6$~tIaMdF-fGIS?l^aG?=Y^=S4_<9CM}(whS5LuY7a$N z2YQVT=-TRhAqUXc0#B&Y>Kv`P+kD#Qo}Fskq{Doj)Uk{4YC4*}GJ@g3>V7!LQXVb^ z<;K5AO)nqiz~C1nBd)VIyJX0hjEi)8Rc)Nkx+VFPeqW8Ke!Hh~A`igfxblW^-G{zR zrPu$=EGGmdO`Ipm^0^@6B1EqKHIr7TSgqX8;tId5?%`K1bFQ>tCy8H&J28fmy{WK+yP5Ddz<00OK&7dU7Bp;g!MT@> zH9lGuh|EaX!Nfm73{Z-D*PUR?YqP&t*Ov{;gR$mh|2%$?Bv!Bn>xTKM0$rA@JT!t% zfw}3w=g<&$bg9F3*AI=jRuID(a4z8=s0aC|K#5SDqkW1GA{GaEB9JDL{-k_$)^E^rdXNjd zU0FY2K~S=arcpLaHXNC5a;CXgZ};<0u_W;ab=UPi)lud}WN;N&3d`7|7c2?<-^4{$CsBcG z8s^{Lxc*~iKMWO6pq;@e&mdC{JshXH(jc9{Xvn>#hk!j=p0>`i4^ESHa!mJzkT;WM zrrOEU8`X5y`gWg2G#(O6e}ZOjy@3)C$+fH1kwdja5Mi|xKk1L~f%q5yi;k*O12J*4 zsnRQy%r6D&pKz_J|-ao~{@t z-+yqfvz>LXr5<%McNCTUZ8JU!?3yv9y_d$#;bEB&u+__OeJx`%(e7znyVsS4r27~` zRC>Cp{1=c*a7@iPi|!FEY$OE>Q!v2I6!fW%zBh(im-DGN)U;rw^T9ujdL8|OU=q_Q zK3klUNywOZrt)w~lqE!4IW0$v(VSudK~LS6r5}=}SDlHN2m)Gvu5i2>7XBi(sf=sV zbEK>P2E+OW4_tNralQ2%%o1a&U02Y&W~`#UB->ixl_@CkWkyrm;NBy3*e6GISzxL= z2ee3UFXKstXX>O_oG+Uz6_)*^GIM!1unN}v-zjpXiHh1!$rsvZ5G3xyB$XCBjx_Z5 zuPK-L_+fDICb(W&AI!(b+$lZ$WkC5t&@Ta`3oSIc;4qa8u%R{}+BfJeDpRGlfXFB5cN4EI0SqK8d;x6 zAhcV!Fp_LM*RQoTXw-9I*u@dwrXKb+T7Gz(0*8AYFBi@Evv&1C1Rp=2$+m|$!FST4 ztLM4lcAp!1Dr_TXDbo^uT3Xt>x!%v8OP~bRtH(^wcp52EA8c#Z?dCe6Kl^Opqhkv6 zk^Qc5bdu)OGpuR@0#45g=TE36kW1u^&N*P7X<>F&1P~tClKx&msfm$KN0HCq7t+vG z4f{Yx+R+(?R(d`|B}V=PqrsklHab|rCT0DA5QCsGse2r}3%h6*EBTA-uIS+cngfTW z>+VNJX38f)puy(j`~{`=>f--&A(JfbFD@ibiP44DPCyi6ZEoJm<64CvQGq~%pMYb% z;(f~P4owb@U8nWBt*zSu%_r$HbkwHLPEMr`jolO!!#wCi=c(`rPu~Qkl_RT!9wAmx z-{I!CvO=Ia9IY%Y)f5mp1}UeydF}>syGRkbHSv$sqQmj~`>an1@+rX+F8{2goNi@| zY2)&zeIRUVwgL0M&q!>ra9kUcfhJ*xp`lUK&j?bruot1sBgcu#wax4-C?_wkoZgy;hdaA_z{SqK;l$Ba5zgA6XmPn8Qc2ku0Sv`b(OMjGN<021E~4GPb&hsIL5D!SI2K%o_8W&zp91Y>-8p` zanHLR#0l;r* z#Kb4S1-Boyw0^&F9_xjUh9*!Z7~yB#z)qHHMr}S|c|ar#r{>|l#a`#*?#=}sg6R6) zheW|+VhYo{7T{;EBVMHB2GrCrme$}Xm2=`m4bJ-7#YElUNtg5fd-U=Z&1_6R2^uUe z1iWXPXj|HbP;jSq-6A1qlcoU)Cj^3F+d1-zL&Z0SGHu^HMT*ZHD5kf=m;Bw&*N6(J zF#x@+q7XOh*<;O9^6=!yi9pc%gTJ&xBRA~i$-z-UUthmUuT3T(#`4_4IrQY!!G}1; z`T(N1^YdClyMvQkSZOIPA>o4Y4?i$ZS|dzMf+%Q2-0%D(3Lz6sE|);Kkm(BwDs-N=IVMsiQVLc?V6^j!vL!_F_Hs81h8+lpi=EA6EE3`i4@_l35sJJ=p@p`#k0T!+ zq3HCRk$_mTD?UB%WJGUZq54s_MBY3Ywnu#>X*Rd=Pap2?c6_<2bcY9dm217?B>eQO zsSYnf1OV+%P1AVX<%O;#ebvsg1`{fSf1_Jix0!L{1KgY(Jsg_?1skG~Bo`_{a*3#veho z4Me0|>{PBY+gfW0NV-cDb0!_XiB{`Wc+IBZ>A9R!VwU7c15=_JcbV7#)u zPzZ-Bo_fAOq3v)Slj~is-V?EpykGg;nxt|jr)U);f_v^4`pjLWJNLMxi~Tr z5G+IleE{pGnZLi8BXljLG&(gk3`pr)w*@yUDaeCK&vhHj<%{$B59M`q@YS||fciq) zej#0byuVyPk(T{q{n;$lf@1{)*A6B#ucHo1p$JQVDyh8UnjM+U;vN91Z3bW!&4Clr z(OFZE>gybcpx<_rCL9e9&j9yGSdX7S1Q{YRJk2Bn zLoganvmlll96lf8i6ju=5CD+(`X?szx$UV7Nu%d_$5%W15AJSn>wLQ?HVUV8?U|ut zR-&(&cmjh$!rW0@UbGv`DcI<;F49YeZkeiddx$YV%k2u#8FmLYeL22YEs+a}sit2s z?t~Bmj3?5{8nORfe(aTrysfw_;EVLb3&3eLJUJ;QbML`r!>?6L?iGkohyxV?4hh4A zuMDmRxQkRM7xr69e*b+Xd z&=;W*AG%noKgqZ!n$!mNYHC=B2T#B8j9~y#)7NMGsi^r%O$vVg>~aGr#xgM_8d_RY z9XvjMeq%GUL8-WZm-kQ1mZx1Ot}yYY8CR z1Qx(m8{Vh41MD;ed0Y=Km6VJr#VWN~#l$2qNQn_>UUN)5e*hU&`CtqTKbN|FV5fd# zG29R6U@TPi4!S@JR{qo;og6hQf;3oP4<_oodp9HRfiHbjo**w`*G$5{_h2Epy9`if;}3zBvprP zX^9@1kGMlrJ47aiRo2l7tq8YL0v`4cRvO_t(szL7v}(QvM}bb~Yyky{wL;AAiS>b1 zNEwVAId~cjgVUhOhpIZR#oIpuFF19>RG@57rBC*i317sLrUv-d0P=wzUPi!a$0Sp5 z9%eEZYGu*MDKoDyk82!q(C&FxQREvjxXp6|HeAg#AsFzbO%na62hxxJsoNj`!M4>7 zN{6Fz`S=bhv8Lx40rDAj6V+gK*!hdZaLSq0<7>kd)9efepg0piobkv?YP*yyLO93} z@PTRnn9IIk*0bOO93qTuZDWQmI)fMmKC%+9>2w;yhnY-6p{ELOi}AFl@k$_dd3i-( z1Zvybe(t%Mym7MfzcZ&`TSPN(bRfGZ zNH^BAmFMTV@SyK+-*70kUnY(NwLc9h`*!o2#|6T%6eaZxAJwyiA`_DAy1aZLXvhQV~&ulm*Nc{5&dWttQaA@wMdzgFyLCW9Vc zNT2&sHh#@1(lJ?mJjIIj@9nMc-GL7rN#eBy+1V3?RED}h(%g3U)1txuTaD+li|7&z zv79Ay4@q?V!=T@?9gFZ~e|$c_=^5ta{#U=I;Cw<8%2|Fe4cpltW0r%hbWwtj6GTq< z@73ElZx~AeyPh*hH1H3ch{7U0(mBavF)`?QzJC4J9we0QrrD-Ol6Ha zvxZeGsTm3SuXbLvKY<=X=gApm{f0K?h6ovi0jr&z2VjcbGL-h;LKv) zc~1Jjb)%uD4=E!o!_q=$s#w$9mNd3LMbfg_h$P$pGLJyRGdn|yq4dSRu2p+y$o)w0 z1Cfx%iqn45$NkLkL#3<6vFB;I(tT&|$6vqdbvHzM`k1rS<>kh2FI&UJ8#x+8m5IaR zC78e`pQt7&VO zSgp^C>p%S)d$nq*Lf`5tVbW*$etKayyNh5$s`pw8Y4FE^Yr0XCrJ&QJ^-Dr%SvVduf#9=e*6l9GQ` z7U3(952$1XP_37G`~=n7y&f38J2|oE?e_*iz7odqHzE)A@%KmpzGNkKrInRYm6|oz zAi|JJZh9Y9ALJK*YFV2G0ox%k=*C^PGVQtGO{ig&k3SW@lmw z&d(>?ux?b8Q3yy+Z-byL*{owA@k0`sKb-bV<97NCr*i_xANTix1?Ll5s;^Cp0Q3tt zH*qb^IE{wSjLxt3Ubk9}FrpkD159T2O(J9Cok7&m%%AftA5|U~N083qiiJa`kZ6)P zk4HC>{UZ;>=YS{ac(KkOgGHB-#{vjYe+>=>d`y2QDMaRVJBKP{$jQke)sjnRfxf!B z(rUKBgX4-;0;H_ufS;I#hDJ)Wa>OQ!^+FZGr3k%tJ(RJrvC(eOG?Iicu(!b=0*Z@2 z6%t}E*D|uQvKEz;n9NtGlUk-EC;Pwsz}*V9^-w(h0Hj98Qj<;Ai%bCB4$VQ0+}XiT zMh4+g?tHbausaU$3G(j=M~`i`TSG8_eOc@DXm}=OY%N(+R7s zb>QOdAZ4fTn&GJEhJ%Ta9>u?$X`JS@TrY~4;Xu!9u>q&xi}nR9*kHB)aswVr66P8l za`IG~mN$1l49WQUA@A=|!egR_0Sfh>;{nu^7pdu1i+-G%sDwhcVtxv8;6(zDLmzX! z_$%A1+>$Hk2k!ZBj4UAqM-Npq81=({`1ba;??k7;oIWr}w08vY1zBbNhPz&#gkVu- zZP67H?h{3q2(xn`E=-%v@WqX0foxni=(MwXnbhpty76gTwgi($*;KG!TyH%36qbJa zE|J^^~~(7Fxuf-2Pcq0jMxuoQ1JmeIW*vE zNcriLF~GJaoMTl{u_8zT1lWY zf$s3|=)l4x)-6#Fm%#2E-(p)epDWmkkuu8(&lF9=!OJZQG+YwYg?Og#{}7BS?G7A+ zbpay+2^RCI9M${@i(Fp>3Fa()JvbVf+*q3_OZkxHgwdo4z>EOK?V*}fiA{a7?%Ulr zG@h#J15I~@+0rTh9tcZ72EBQJ*SFMRji9%k z;Zr7t5_(rSkUfn8dxq~Xg0@9Fn@0_};Gyw=bPj~FAU*v2{Q4pKf?npPu_QnM>VOwv z?1@EzjlEp(b%_kV2^jA%aI-=F2Gadfn6Y6^jrAqEb-GDN>N~A*s0& z$uVwvsF|pl|4yYh+AZl!+s6ih;8H-Jw)uYoYVOmZ2PFekVm|-OOaeIC>FH@wu8`2s zZ7X%x2bCs&8NCv8vfXl#_zuY@V(P; z#Fdy?STsrnn2R}hsluk=24#Dth5%6kIuRz~`Hq(a_G5N`V<|ELXMxcJag{+si3oxE zMzlYgZ};P=lgl@41v>`SHaNCpYZHQ!Jix>ddUcqjGL_L#IUl(%Y?^@h=Ju9cP2F<} z=*mQ7WN03J{&renI*?psD#sgid0I7|&DBw)O%6Up-=g(D>JL3*kr)cT-tNTVpYb+Y zhv~n+8wH!smP`bb^rOY`r*zz&YSOD>mQpUEiR6qO4D<+lAEIdqn$^8sJa7E|zf%~v z?fT{zP%7SDU$yM}8p{y!`oZ~N9|&Jzp`rWM*NLm}jAP*Q148!XesAYx1^GfCh^_;k zo8^B>veMcI4I|+=pzurNnDwKYDC9_X*c~^gJTZK?m{|s_DZi>&4q(w6P^?_ahBQ(0 z;i}e;McKA8a&e`ZBjAgE9NT7mcXNXsRAXJpt>wxoHv^n24t~HFGTT%t?+m<zou*ZTK+Kd?eN1nNB&mVq+ZSr6LAbapR} zLdxjBFSjKB-}VQY-8<111r^+G3}AVah8232geX+CJ;OuFGNG!0Cma z75jIBJWGQq&>Qok+czEW!0%JaP;A6rJhX2L(NontMbxp<-!*!7totQXyy>cVo5K$I zm3fvHgg;35?wEI;d7&%}E&-Mo^ z@dkGV z&OKWhqIk_>lNlm7yNkc-U z`IB7TiuDepvWrs?(eXAiYCsY2VW=T3#>DrOKEwQL8`WGp%4Fi}1)Vw(R4OK{XR4W8 z8V*FG&fG{^qeIF5jZNs@zqcBskPdR%{(t}(qOny>9Q1dPv3-3MEu`&2_WKz(rS!iZ z2z5yiyNGZK1j*Yk9^;OmDpu3GWVVGL&thzcb1q0NJ`n$}1;k-}vvxLGRTUmfjkeT- z`v`SVrVv28=hX`wwi1dAc@XoS+kbn0M1uaW8$5m9q6$rB#d~%b$&n~4Q(pNx(My*b z1LC2Fhf0|{C1<1i*Or=GJq*p}fK;+rFqN^cAOi{{e1sjpACl6+Wk3avDODQWJ>mVs zqREx7`tIUFk_)1z9n^$n=snC5*{e8U*?TP`|NGZk=Dx)$cNCByesR^d;v%@>6)srt zW;vy@d6@5$tUj@4`)|+`p{9y$aVUVL!e9{{D0{EgFG}x)kHB~?IRI3H|7Jr1YPdt% zVI&A&Xd9dyce7c|J?EnkkZT&9x^fh87yj{u}Z{ zy;Oa#!cy5kI3K*C)(;e|=5?3HwX|lBx1j#7O*NxtaGv*1);${7N-#5^ipS784BehF zVRQIz9qKfk4xh!p2}P=}gA+z_RAEYuF5Pl3`^?n~^NaqkMQ#h*?xGczYAY0qR7};* z78;ujBDl=k6%d<({kM{iCk(kJHtsZVUuJIra620K4Vj-WxQ_+19d~aY@MVDCGPL&J zHZG5AHZ>lvX22cisnzq21{mxiR&4XOrdve#SB<)0N^|eVz92BM>%o^H9o7UvFK~c3 z7qIl=<6b0=@QvO(n+~re1?_tLfx*UE_Z#@WWBC%MwYEhEMyhs z11bJ87Y0F_JJ^V{zl)c;*^yu{OHFpe;V*9@hEKI=H_z~b4BH=!R&f8A)V1m!3`sdW zH@YGoP_&be?_+vD`UXioU?~0VxB%PUP7)&G_aqDu&WDQ&AL@RC6&j=+hGQmAI2>H) zj^cJ0X{vIRavaNy+R;RuzWkKOV)`sXXLtwqt_B%fBGFfeX+k^&Q%67j_z0L{u^k2Jq-2sIcH5<&>Ra zMSmIj-$LdZ3WLt^u%B9eT3Uhcx1sEP;R}DhTKTa^^P%yHy4@FrdDzw1cA-I0-6q#G zpmBD()%}M2T8i zW9J=Xwlzq6wL0?pAv{S8{ge#Wd6l)?K~K)DvfW=IoZ#E)>UT1JdvJ_T|Gt4<} zT(6@S85~_fXg=>?i^HahKp;w+ld!}>DxbjjM0RZN7=dQYFoui1u0&om{@ilIoneI` zo|m)7MZXV{R%(9}o38=dslPWH*D+t~Z?2>J{*V>^)u8*yjGDOy+W;ADbjpHIz3lr3 z?5Fl>qc)=R%dL-1+B~}SWbT$XwY6+c)q9bY6~Wo%7eacT&4$>E{E%k8DVXeMbq$Ts zrB<<}Wp0X3?D}1d+}y~nC=4UNX@%saDBB&L7+9_uj5Hq|Z7%7c)N4O5P>4DZlm}F; zwBaW=_<{z0JQzPbA$`r27uipT`kEChI@$IW3d^o9f%e7m=-#8)_DhZ*d|Bh%LjTwv zgTo48_+S*_p8^k7OHTX9J=yHd?oV(UslU}&10n|JP0w)tcvf-?94&*3(s`PkR*uef2z*T z)9diTHss?*LYB?`9m^-&j0iiStg%rJJl;B7S^$!BLlneHi`n)0Q(=oT!uXGUleXUm zMPIWA5DxhNG>r(U>~r%OViae`LQpU$I`khT>Nn#w**X79IBvQV9Sk*Fb^>(?BL7uwBh z^@E4psxB?yT5I>*5%_+uCuTGUPv^ECB`{QeXq^=ZUQ+I`sZaY!?H*-y>=d zqzkmi!pyese^Kh!6b(ZM3Dhup;yFv6G?NrOolN{gp9+S7^KFk&pXu8)7@AH=Yh0h= zKzl)P5i~#UI#&m##KU{pHgg>SAgaM^E*)h`NeM;~y-ON3lEU&MB~1@gL&Gfmy^Q0E z9e+jSaykFJB9IWtus*aL^U~|&4n+)(7%YygD_KL>`}c&33_t-fq6X=k8uQ;YoV*t= z5YYraFQE)H+V0FvCt9rxn~sl>f%v*$yGbrTWxOe}Hd>b4EjjtFJUFGbMng<7+f67n zp3Jld2-4OKG~R15)zR;2!<7k9wgVV6^a~>e+dbv!+P!JKHa;BIo19ABj0=g0>ZH*} zK5eV#n?R2G(+h*?YnI%hwmB*L0iPJM=7C+-*O;-Lfc-<|e_nc3DXL%i_y_?54hge% zz{L#!H-g3ho3mglY${ZEz#?v^=(wh_5et_=uXpwkupI*?nEimvTxjp$0Duj3&nh+9 zPa2jO7#L7W6>~#n+S=NrmFe6Z1Uxb<>D%MTRW_f*~84B5N` zJ|_#q&8l|~)378)fFGaY9TI@u!B|+}YH5u_soH8*8$f!&!Zu095|$?<@|r#)wYIkQ z&pBUjG_Y~>jipp>o^A&MoVUOi&->E|U=;cfE_3h#w7H$Q;MmG}o{-R|`BNYDhv5ENTIZd=?kFVnrsWy~*iPoqLwr+f_RbgI+il zcK!h1hlYoT_YZvoT4Qtqf~b)ZDFDkg?)3-f0@`3Tp6|PG0NolA0_h^?4Sk8jemy!l z8S4`90kHI|1&ZcSWP0$<2i={rv#Qg`Qq{A_a~OKTNKd-ENG{THVp#4pz9O_U;Ow%3NPPac_$wJ z=IrWfqE<@SkB?mr*xl9p>wEAPL$9Mx4ry=q1on9$sW{EH8v%o|ss6+GJ#QTDrxTin z&@B!1PM6OcXX@wkm-6uN@ZjuhexSt&&+c%o+h~WxPB>hDQ#lp%#zu!P-KyUq zbuO{UYf)x-rZ%eYHAXE+R4|yKp)yj3|Z1G%HF9f znF<0Mz%u~f#6S}$lhMRaq-9Kzy@t;2-oRVN1q5zL#1SI{5IY*1MwJ%0s;Vjg#cl(0 z#z%ndAtaezHQKxAwzOulGwV`C%2Gzo;XurT-|o(Mr9*J&n`(`GL?)3ulp z0tyNY*~stTQJVwQz!azNOn}*Gg&?;7Q!O~Z;T3N7deFxh!`O%Ya*8&j8b(s$ z*4YlE9WOUG1sOBYVvq%ek+QQRU%^L6$td*szrQ79{)n4vbVg${G2H>+CR44X`UUom%$++-}e{s&$Za;tYTq8g3@v zIA5#Yj9ANJ&rmqq`(?WMRek?*HOS~sd1&cMn!Py|ZWqpfMMm(n| z1HxDWj#N4AR>1;xfKV1AU6iHS+1V|?%`Z~vJ79hA50-ViScg_EJUu(ZOWEwreF23S z@%;Vo8(#t2fQ>eED4oX@NaBdbV}%J$$_wvmb$KB^T|>$1Tq+F+00$xGyVJjtZ(4gy zil6`=!p*MBWp8h9_X)W#I}MepO6b3_ z`k+us)aqh?*(4FeQ9>o9ufu?PTtOh|C-oMBb?b#h@oN`U)tJUVe%Cc=N7i5>bG_v~ zg&{PN6h9aDi{Ls^{h~o(4F4WFhuvy$)u~PAV*MvL`V%4|VI^iJCMXJe{hoIO>9P0G zBr4OB1zTXyu`r1uhxfAR_f7?e@^1?E4hj1Y0SFM(6Bm;REZ2#`p_h1RwnfJx3^e=w zLl8rac%FoU2C#7iY-k}Vh!J*M#9HioppCbwvh9rsnm{+AjAMc`HQ|4j%a@Kfn^L*HH=g7Q?fwBUfT`6a(<4jg*4 z*d-V2X|!E3ZXqES>=OX54-H1)GMkNI0q1?tG%m^^Fn^9azNqPW@82Gb>Z3;7`ZYC$ z%GMWn0uC*a4K<5n%XtASp6BS`&uzyp=z`*Ezc`F6TbrlMJHtBF$0? z&b~f?M?(7gHDq!00T9hsYnQ;;{S_k+L_Ul3Q$)8BBxL2|60iLN%1`T5MwP1pT1oodYe2>69`8_3TpGkrOjm}(%$%Li1jfS~Eu?MWf^(n}_C`4IOM38^Yw6h)Nvq~FGi5>D6&6VwTV~Rp@ z>>S9c31{Z+0}qdCs2afU26Y0T6XxO!P$Wanc4lzeMpmyh8;>QIODS)LGVLAh-JJsc z{+r920LTX}QXs%g!E1Vo4cjL=F`t#6=x0ud)HoNc0{nQNn&|wI6KCD32kLWXQ6Qou zi_6(lygxv)ky|6LDiaDhk_QF`M#3F{>ljbJu+Zr5-$6-9m{F^EwnpEu3R(7qLk`U6 z0{#f08GTEEDT@X%2L}0M#9xlQ!@*avZ?z4@k)W1DFlR8kJbOoHr$ls{@^9|zgH0Mq z)={qy4njwtXYsfo@KH4x^+Ciq)0enhfdazrXrVAAQqr!);kI1r>_tFv$^gy^kT;>+ z4FEUQOTtVJTMVUgW#AotllOy$z5U1`U)q3!!jv@>m1~^stJUth>Ue*61dQPF?p$wR zxObKwAbWo8_D~3$Y9I+$a@1G6-9XUD*)KO(F#enE!lZyfGcEjV60R}m>J4a5Psih; zwtxx{ObZDK+e!I&Ct*Su2y|gDLweyX^Pjd06wB18?u8qjG5gIX^r^>)Gdd<(m;fIn zP~WrR`-UCueyJB-R-0-b{SFcvlE>2E}UCr2AsW+@L0sa3(kx@(_9-$j0B_6ii=7D7JEm~YD$5z@}`Bei3Ev`%e&R*(bALb~f<0H1NlbQD1FVj?ey6=NEV3i@7R zP$v;|q?Lso1x(q&2c4MMqnSjs99&#Jfz@4h_E#B3r~QFSl)RG^GA2T{R)IqW>`Mb9 zo=lL~kopl0x)9PR1C?=8;KVDOW}%o%EC7qJ{7(1ms%&HV$etcSII7@Jk?3Rw9e~O5 zW0u;sOCA59$=jblN`b0(01#FJ=c|jjasN!nh#)A@!@l)TVTbso5H;nP0 zMgZEd&&~VWlaVj(bat@+j`w9dgC1aG)m~?fhg%;XIII@rEWx`&@OpTt%##RQUQWq2Z`*N(aU5oIeo)= zUi4rAI3`Y}Pu-m*8nWjmKh1Yb4l|aa-`PBp*6#RG1+?FA;bkJzw-( zyMN2XKoj*V*$~`%5?fKH|LXi!0-3rzQ8emod)IifX#hlc-_~*pmdtf>1LxlJ!tl4x zac|>DG;|2{E9h-@w2)|QAflLMVT~68;17A%K`?L5%yxrD z<4de4h?CRdMhIPuolHctuCe(ck!xYj;+1|h)3*%bliRm=)?#7ebul_E0w+%O zf1eFq`c+o6*}6M|gb55DsWDBa=SZ2!(@_3qqCl%0`pkKAo^lg~mfDTNMU4sD`EqMr zXsBabX8hgV%c)&G6-A`cuA0hU^f1$^A3&vjc%-PwBV=KK!RC-h)^YmL-^#9JB8-R0 z%%ar}o>TGVjOQqCuV-DI-ngx5m&cE`-m6Joa#tqOx@L@(VD1`lV z)LoaGN+f~@0nl>ehYiT!6D}}4!YBEx;cLuob81>fbb1-$@b&8t|G^4cz$4pqp4bl} zMGu_rniK|`c;{QaC$(@S6H%jA+$qf7$6{myF3Djmj4hMTBG)%qR(=ln(2b+{zl-J# zyzorg&Q_sdDR@wH_22b@XEl}`PJh~X_qM*{o`L`CnQgFZZ1_1S0MyZ&J;d}wQ!U`m zYCB6Sq;Woq#`SMoaXc(@*(K=zvGo>EaRg18|dr+6+Go4N4?BA(ErKODz#2H|Iu0 z!;rfzHnp4mpgMeQQC#Btd;UwEzLzwPqQ>fJ zoa5!E-uwbGt@<&1$~e9|f*LKU_qYolbQp!i?Q!(*>ilrHjfpY*$2{7u)?}e+ey9np z8KZp~D*akVfGS(S!ev~eCL18GLzc*d*d52Ip z?=@}reS!vW2Z4Fj=hLy_0E>(g#>3Y><8U{5qB&Oc44&V05tN6az zGr#Z4-WSzs->%!$5?AxtG0)_BU)~w@X40tV!#T?`N_|#YdpZ~LId$$g3F2a;h9E`? zIsB&i(NxOg&j6d=ekR*}D<^1i?lEzdO< zG{?dLZn|rwpmmL(#fDE2-SvLbFu9hhVA-;)rl6Wdouz~NLC51^)5ECZ_L1`m=jZSL{nr$MD6u`{1XGPKH>u zk7BqUpD=MBi6R&?aol_O1H05)gVhuJvU}!^*DATcF{b5sHnx@`$!nnI97W*hbUx%1 z1vUoN%&Msse^9N5`~B?@4om}wJ69GDl?*Trl3b@|Y@BXc3-9NnoM;nPz{Xq9U*Z?aAJ7P8hq? z2TAL>VZu}i$Za6y;9yZfotLYuu6{i?AS)|-W@!u?YC6?cOKVHT%gJIM;gJ&AxBOgu zJ+R0TvSw=kWW2aAU^wc-6D+m2vHdHX-RTad9Mn)Yhs-oDDxvUP5lgsF{Pp0{!NT{m zpI4ag_-6Q|C6FS{(+)n*|9MM}BmYs8&ZBB+;ZoA3G+SYr53lT4;e7Q<7<_$?!T=n{ z^Vr<_+}PL=ii~d?myi)eEmHv;z52w=#Pn+*@_J)2E$7~<`VWWv@t+@(ExD-h(C6&J z=+THQ5QTs z!dQLU#TNJj_%+eOx~Koyw?RdJ9E}uCPJ5ZO-A&?j#Kb2?#-d<$-V5-E)1NAXF0;wL8fKl86MT2@AjQ zdfdHJ*PgRq3LhOUcV`kV6BSeDd&Eyq)DHe26U6$pfmS@%nP{q`203zM^B^hIlepbd zuOiZ&;R0!dsJo-)I0Fkog+%|yp9f(EhO#e6YK^vh5o5&Yzq2%}mJkJqX-jMMz(AzW ze)*ThJ$IXRGX1No1@K1ZI*~G-=}ton0jH%Xbt_LJsA!zPl%HV4W^b~2>3k$CyXV;FWBk4f{MQuU{ACf=E=q47U^F4Cd|EmwQaiXyZ$okA6aR@MK{!X|4w%%A66^ywEsp@^6Pua@Pre&c$ZCRZHQU8BhL!oIJj(oG^9As*0Q?G7%J5 z!yfUSN$Rl1nZMocuYsZ8PDD$5Jk4uN)aVF8YVcZZ_JkMtyY>|xl1{j|va)bg_REZ1 zdzO~i<|0n2X1c;|tP4@>W*%e$7 z8w6FXsE8XKE=>w5hN{rXr8ZH0)Hmk99;q7d-tSu%D|m1IBVR*Ry?Z*(3x-~$XpM)) zV#xI%=9fVK8Gjl2K#*7U;tXaROxIN+)ad#Fq9IIvl&)~HuiZf8Ix&ulM=Vm|N5RU>RK1X^frjBg(AgvCBP!VQkl`gg3G5nKU4tN?hDw$R&`cmnkpw6Y${xSX@tN=Y(+ng@Eo8qitZpRJS7X`CT+ku;IdehCDd&C zE6Yd+L-`eT#_#%4H+hguSrmO8|5LY|GBU^1%$Ltz~5kf zyyMBHG@8_>?OsT;KY{j$Dm0bEYlh!@vU{jl+1Bq4({{Dn_nl9?$Vc_IVHICp=mKja zejDMt;S4;_Q_;|pxMmaie=30_aED~&ap1Pl{m?}c4<&zx$V@sH~Yp<75 z_JkB}8ZI0Deh$|q7}F8XA*Ne1uw090SQ$zl#mX#U^qHg0FekL*C*2Ke@LbOEBpYCYgYCAc|`rCqFh#(#h z(=|#|5=||))Ex>T4Q$*uKm_IUK=e1l8Jd0A4@ziKV6&ZX4jsV+CL3hJejJ>!w^)%0 z=^DXb&Bgy_`25|y4E`ey6Kbl`|7k5jH~qc;25-zmg|wOm29XX7Yse6kVNY?-#k-S6 zh~y8v8*LEqPk4sl`C20X78!^46;FQ>zlat7o8aA|Jk@%}8BT0IunL?*Yb>W3AH=Y+ zk}bee43Js9nU=Sf$x`m(}x>dmk5+tbxSB^QJcx9L#Z^Bu_pX&H~5}C(NLmA$9X#Xg<1yl`Y z0?|+p!O%(eZO)ywnwol${48zp(n||d(?TjAXtZl!l(K5GWCz}jA?%K9Uz@;Jc;8%I zNv(21*t_#ZGiskPZB{BABKZW{%Wy23Z^7G!7c$BgwJR9Wf5`19CS67?AYj6?w5!W5 z631}KNQp(^=|p7Mf>{ot7nl%x;xRICf6VQ8L_^6(Ez~Zi0NVv4NLKgFv@P-M zpQ=9~XS#(rimP4QR4vFxcsVC3q0!T)k|=g){e)VQR$yC;P^N;{VWHoxvh~EhKc31h zI09L}p0=6nM7MBmh$?9BDEQ|n5BlA!z+U!SfKgf9LSa~7Sly#H8Bf%G(jm-FpWFz3 z%OLyR1wz0v064XdHioZa;d`izHl~@>DQ!AB%kQqh9 zlcW=andd%X62*YzMn7gbZVy50ixwx9*M*ZJNe50$#P9+7D&!?i7e?_n6nVhhF(6E^ z-7qG$P7(Y)#k5n7ez*j3pA#W&w8+K2!UD>SC{M@fCmp=|NatqJc^FKe?6O)jE_CFd zV647ZKTE$}FZ(Bb^s{{7!Ek%t&tf5YDXO@8rij^6w2z(EFcTaP$!8UX^5ip*F+4p; zko1KEv|{?|*Fpnz*j?W=s)_uyWg#RI5|x&9{KaY^2*5lLX0L&61Z#@OV0;K?V<~t+ z;oPv0^+P)T;%Z*b*Tzz(Jf#yOmAy(IOL!>_d2uqgbcAjMXCAF}U-~*xJ*7nW$H7b9 zcNFh=SBYn5)!AQZdS?(Eg;NFmBNOH{*GW>Yx+;Uf-mD&^zJEUX%N^N^BihC|Id-2l>V7I+# zyNCE{9_iiLr6%Jkh`=esg%O+83yw;cxt(oY{hgo7B8c?Xk$DG#np5Yl!=(XDZLM5 zS$MtkmAJA4Buzq3Wpq_11u4cdN)c--XQHS^L5Cr$MdC_2bFA~k8Kkn+KlIbPvoAt{ zUe;N@(1h(ClB+FPVc|xBu1I%s5)Cqf&KbjI8kx9);cr#K($qCevC?&yF@c|ije@U!ov zdSwgwv@6Oh)=tJeWFz^NNDomUw0z5DFo?Z2g3Z2zr;!}FaQ^#yx$K^_T|Q10=hT;ST{j zX5{Dmu(?{HOS=SW3mve@Om%6na!6zD7I)Tw8$=F9khq~Yc6mU_SBigfbD7-R@5c7v zxvix8UJ^fFgtdPsIwQNXlnTEpX|pNA^6E11a(WU32KG2af{++_1H~_S`*J+ta0%_q z`AvyGVfXw(!_y(S=fg?E4#0*aHYD}>4z+!e`_GfMif?`MkXKzy!juAm%N?@oIo)m( zgv1iXNw$Jphc2IuXjC{rlXGj)%Wp5IrlQi%eA)Q1**4hl(2kX~4Aqox$lUdKK8`^# zl6k`4F4pboH1zGw4ZxN`8b;#)15EFjzT>$xXRWiGGCo5EQ}_0Q?!sON253l8Sz8^_ zQ(4T2PvhifpqA8kkdY2rPD2!^jXj5w*Smge?eUKn-4-dvE1th-mp^}&^sqZ;Ar?Pq z!hg^fx|%ur^NlQ|tIB3JBqlVXy`33`CK5KAsUahz^7+s+m^TQR#!fg{fMUc#%KYWr zA54y*+=0oAgwfPMkW|m1MLOC_U}U%Vca84|d|0cutv}i@Ie}bpAFtc?)sssw25ehQ=8S&kF1*Ly;Y)n0k43- zSjJRf8sgot*ZW}#6IXrbJ1s7*rr~yu=x~9OY504SHzoCUwgB0Qh0q4mo6O{%(j`%n z_E`h2N6wkqHL!kZ2LlQEU&`evf+jaNX?RlgmeyA{eHXe|s%O5F8~r^mZx9?Vp6zSn z!k-{pnIJySbpp{4sTKy>q<8XKN065a!e>{CGOk>{>O-E6y!iFl=0R>0d?I8Qg#n=~|*BE~7EjJlb!@!W;=K zH$$)Cp)rXPf?m}<)%k$cQ8q(_bB|DI>EQPM?(u+S6mK-O*$_^#gT+fW!dTPpq|Y`K z?#u1!RCR@m^1B^Py!5ot)57cfbwndIF3)N(hr05~$+5gTZVU11ipI}13oTz)?kITo z67Zgxk`W&-t+K^h0Kfr>nik<=UwyqAKc&rj3hS@;yAt0nXz_z?mC4?-u}FjJOabrQ zgB43^aQ_cNC16UAle(vH8BMI_A)Y)XDm1!ez(IL*hYl=Q2(aD*9*^vxLB`dyi&n}x zdHbNm4?8C>79;I_f9dNP3kDpXy?pH6dT$UN7|zK_{sS>F*B^=TMqT(uC&c*A6Mpqg zYrt1wcy+SAgb|lio{D?BEc{SQkJiKn51GfZdTHh ze7-FR2ce_y=XjfQwY1X$uA3!p@YaLg71?ZsZ)TEMNP@w~9M4hxQ-#I&Rt?v`)@uEF zWzL!fkL<-W;ab{#CA>#9!~*&nJr@ffR(uFz1ACAL(*U=J z1MW+Pv^-779%6WY^jUvVqGx23P*=xY!+6%uOt@3Ecp(Vcz2B%*x*aJktqj(@;5fR~ zh8ajM8)TvPS2Tn(tGMpZH_h}oN|l_I_Eb_==ZY~v8fXqV`S@`dUd~rkDt88p$cn*Y z>L_w4_UnD$ddO>F;#iuKMJD=*lLy$w)D%~5wJ`E3tlz^YANj#`I{$lzzgy`?AKXE?RIIn1bFlehy6i%n}v4dni@wsCZ?Y8Rd~mjYbaw$n&;j6IVVX8>hW-G)p@)pU_7=(BN6KmpWRG(?4DiQvw$`O{s8}|h{B|d z7OZgP%T&~|#>F)elYc?Q6Nx!Dso=Jd8mV688vtEy@zaam_A zap~i*_o$9ihL9FLEnVFJ30fpJYBCkzw0+U&52BEI@|g_$H5Cc|`B$olK^AM2PY|>0 zcW67?u1DFMjP4c!$Cwns*j1AhMedVFbo{Y zHL`w2@O$}+jY76a;T8; z-EEylLcts=gBJHN&?u)+8I<=WL; zDLf*gKR|-E+Vl~0B;m4)=to|^Tpfy&pzB+GzK zdYoog7|r^>Ui+Sbu_Il_~o$_ce%!LJHY*_Q!aa@G=V84urW7K z{1gX0Wtsd(qHNYP9~cC_tRq>WU3DlOIsEge4lzMi5YiWBP^sOsg?MQU#oig+~^ks0IdOI@is~{VT9zb3z+x zboF09`rR}$dwH>Pv;QExC7*$hWEszWc@+BzE^XQ)t#Ms9=WBlTICOko30hfa(OvIC znA7#9zV>x*)+XE-h+7rDvnFum__aZAfLZ)8pl@qI%}2lsA_|pwH!}(amCgM2U1@%l zHt!uY`Gnnkp~7>Ztg$f`^Rixu8jv#rhGCpVZ*%7uxx{X9UBbmBY9)Br`Es}!SJvnx z>AIB@{%zT}U=Q2F{#1N@h%Gf6+3*NWhwXIi%k&|x+vkrk-+&@GMD@ z;;O$B<9oniP9wU*-Docm`sVc&a1KM)4{cd=NL6{v1niHN*{2yVRn}OnHz;(R2HYEMe+-PrOf-;C?^!o* zL73KE2K5$TavVQ&eE@aop6km$cNVu7C__J5I!Z_5x~YFpSpR~-3&fusYO zU$Z%8)2JO>ydsaiBWT$mMp~8|fK=2IA<@w}xQ3#~o=2trNZ4>D;2DHNrkI{(a8~E| zi;u76yD6Vw(WD?r#!n^vF?jdBW&;heMeCIq!B~mT5sdVckb{HLiPT4@b6HBQl)CY> zjZNpz2+lrnlHV^zsbQlf1h2~${a&GiDnqFRU$d5CpZCbY5~rEZlUJ|L5@x^*aSd(k zvOD8clTy&jA5L&$pL!>gtz5%ZRIXs6#ZVcQrYsDroT(u#giQ`kT>bCmu@B~i)OU8b zMGDZUj>y|fjF!nQ%-|y)fPA~Y+L$Sjya!E4^Sz479-W4f{n23LkGGI%l==(CO6p90vFhQ%C#i`eFiKQC@W3&dh z#5n=)9sY6C_9QQGn3QrdKIrG^sGSlKR~+1L_5b#aRNg*--(a z5vvFv;WMpEkq~Vb61_?dSA)oc@vJ}nHH=c$Y*DZjHQKue^fHZ6HvOI=i1y_ z35QWX)DI5v%ueyJ?+bCZChuA4t0z@vugZ;m$_1aN*?M{s+*+#%)QEbXX^-PKyE0r_}F_iy^pyK_d*XNrh zb@s_o8gSlxQHWz}S@7Y-$YWY{*s)^*?ImqX{2~AG>ATam7!z=s0d+^%B-%>MG<=Ln zxS6N&u|SAH!IxI7ZVC0^$QRDa!?zuoos6j0OqJH6xO8yl`crCSuEII;xMCg;df_Qi zSPUFFH>JG%H6X7VbCUS9`QF-3+)cjsaOPX%c^>)s_-w_TxsMeXH`lswMa^jr-)baG z)nRe;YxppE39BKKB+x1HSYg?jq0l17I_quJb?%uyl=axtb21Ra@VbKn`?7!g7s8tL ze(3C~|2UK(}?pjT`tb`dgL_{YOQ7d`)lphb?LrE0~yon2=`6~#s3`*ejaw7KoRB}vQ0P$@BIw}~ z&>`YvW6z5*#?O<3Jtj&J&QoFStN0vl*!%SDkp;_J){~DM__LQoNpp8X6t|ByFNPsA zKPhe`Z3S*{+Dn?jQ8M#j(Zik(GJleBl!ElP;)F|3Pu%*nVtaHAf(>5oEKD=F$7AqD(J*!z?whYYgm`>U9#LYE%GgU=#*&NUBRH5F)K%P!$lrPpIFv zDb2x!4;_Cm@64|i?Jv5w(vIlCzIEsspFIRmS*3$;C43lkhNE>6vki}XPv14Eqnm>F z5vM(Jog@F7|IAjmEN3Vye(Fyw*3%BMrFtj@JZGimxXsKb)X!np-**h7te0J;bX2A6 zD)kklV7E0wMR)LBt-Bax?6t8DW_p~+h$wP&>MJqXA$l@Pc(V?aV zHyOKrah%hWt{mr$_wu`d{gba3_Ua(oI+)g~`P{;*oV(oF%At57CIm!*>;*U6dRQd; zU8iXmP-2##Z-XfLR#HyBB()LKN@|(0R%&8+R|nT}Z);fO?zT9c?+Bjij-O!31ieG1 z6795Fr_o<>v^^wny2#rmN%tzHUu?>Gf%6Mv*%!ZS&#{q0kWUexmsuh1vKeBh>N6f#qvUIaxy@-~Gtz#nT_rb-cEQZEUUHa#`+}XhE$I1GZUojP}>Lu1P zRAW1W2=D#S5Ny{!jkz<0L3q9koIgarobM14@Vj^E+Ul>%ABU(n!Q_)<&1yH8EfUi2(vR|Gmr;GN3HWRK; zCbmyE?XKRJPHMs0_4uy$!EnDK^HITzW4Q3SklV>*hNvDXK=Pq)#@!JJ52*~EOL|CC z7(4aE#gj8q(5mZMgEHjT8LAkt=RK23=_;#8l$6zD`mEC(ZgnKS#8ig+!vVi$*YR zEnsTN>M0T8_-DHjjAG4uw(rT#J@;Un^+GDbpwYbAj6)0%%;0ITRz6aOo!su4*zni} z1qk^y*8l9;{-7g!Ht`x^eOKpzy$LQ8ZOY)6Mp~%moa$!2%Oh z=IwgE|D7z8{1mCG4i2G?L-JzPUE=ewzDXbjIC8c4`6$Gng!WwPakcfTA^*FxuPr=@ z-U3=AO+$ZjRekonnCLiIZSv3SySr!b`@7mjc(E9NDpRj=J6&~Nl1Yiiyc&1M_g$@uxLBgX~jXIMK3(xVQ1jBg}(6vnioe@c?*8yr3{(y<5?QD56)#0@=GNOMIn zBE{+c2)XKc_indOwv0*57V-0Ks9z~#`_D{OuH9}qVm(BW2wY#=S}lZQZ3H_0SBgo>SpL#ScP zx0(>32&?5%o{!pKp%}=6b0Q<3>&+0dmly|jG^%Z!tfO8vhz*FXu`t31RB+!Pq*7`; zEu>~wE1QnQzuV{2BR8Y<%@!l*QL~&<`YA(TqGZHYth6Sk2DPumjP|DiH|!9T){)Ba zSU2p9+LzIh>nRyWt(YG(aWgh}#o|kTYwn;4RH>Di``k_4`zW2qoG&D*F#cleT(zsl_&?%Q;gn##*7Tt586*@Um|9+X_nzO*=O?0#Z6PSy()6sUe2RGID!ld3*E# zt$J-H?t&8y$|;lN7)q1zD-7r$l=s}rOrR5%w;?6n#V81^RIs6{d+eW<;^ju=;#evE zXcY0J5$c<67Jwlcc+#A1d*z}K_rnjf@Y*x*M`)0L-|qVfH{qgG#m@CnFn69C%!E&W zkN8^EL2(W^LS?3u69K6(Xmz29nA)Jy_bXtDx4N2?*)|)RBa?JG z=#~%q*Gh2(+(*A6a3l#lX|b)8?{+>!oc^w@(M1Jbr$vb@ywhJueW@OAHDOA3@suQy zCtaOB%E4}MYFVxfKB`t~eWHd1UDD;&7tPG2fkXu*qoG$&9I)S1>M;{lRN#IgRfg4o z5nj!=L!0?)El_^}ljK}i`O>cAeZaTk?@A+yhm0~_Ne1;?$}tjO`01d#E9_92-wfk( z$BB$l4S||(N0EVcE`hgH49h7*QEvv@x@1@_;enOaontX~3=<_r&iCepIx))2J6-#r zk5{hL&6&T8!nL{6V84}HC=!03qS8GtdM%wC|G|=m{mp@WWyaK zE2XY&s|e=xP_5P_IoqH7uw=H6!QupuQ_V~_k>_3^<&901$XmPoDUlHGRmgnNU&4dIp2nn;$r#=puvO0N{nh2tt^4t zClp=Q+)vg=v`2?r@WMT7TsK&Wa1%notJX)mTkrby=Ys)AKDd9OsnJZfs{ z8&-FSBp15U6tzWglKIp=_A(hE%Z#)z`K{9p;ZH%$^P{Z-ckIR0z$_MN<8y_&wfDnB z3hI+;pKuvUttRJGB*M54_J50!_GfTS>KZ^B5Ly}=vV1@}Et9fU zTt}bjkEdKpW)ly)K>Y3Ah#%>2bwR#tcpSyOz}be{nAX^5H`0icF5Fm8TCUMp6xX~r zC%X!{R{)X;J*MYaac;nF?E9)|E$Gk@6~>&jvEihACrF|{z8N>7&D)aRZIU$YanXaM zXpr7hhfjO{)Q89m=8eH0AK2XTL8%;<*}Qo|SP2n2sgf#$Zh)iQ$voG+|7IhD8s$%I^i6#fJ&$F$O?Bn8)g-9^noo6Eav#1>O~tkTr5*a--Ew?7`BYICZ#oep0~P< z#nfrw9ig>EU@G;!e*?)Oo1vd=6MHSvVc46pJa_^r>lWl6*^?Av+rHPUaaZbb#I>2$ z^P67#rpLWw%+cU3r#i2RF#6yt)swtvq-vMWUoCyBz1rAT3Q_uGP|!S7dueG|^K5jV zFhg5fU(ugwYfhEZMSOcxZ5awQyxDu7v9sfSlDZ%rc|wl8sk+aJe~A!9 zHOus3URrSGX7p1JTT)SxDN5gMTOxQ1B2y~vQr?C0L1i(Cc1^zrCb&?YikiK9i(Vcg z%P>{u%NA-?1D7388fZP&FRfXkAw6@niA@9j+P194Ni@;ZxVU&$_gnI4X=7$ep0C^~ zOPMcWY;M1~X*RV=sow1jQ1gjEmcUj8W5;PEzeD9$1yPsLDWtY#m&)3Gq5&nDQCBg+ z!plduY_sW|!ma&$tB2;c*&YirFvc3rn*je!ZHXG8t}5H_@e=nxT9! zX&nWwc3m^OUQ@HT3r&@t-dQ&16NuIY^dMpkME4VRwl)WCGshiJj?9&CP za!3pTl0l<;SeT{qFKzR7QZ5AU+!gl9c_apuT5~d)QVt!Gl9)eIb|6N!IOfW^oN^}f z?ai^%SgL6Y((h?VTv1phNVV@lTxVqz6;+SQoyw_M zP{5ZSNvTFU;N=Ad8Te=7Gr%$MYe*syqliVfw$)Std*yIEB2!b-NUCON1{~Pp^k|UJ zraCGaXP=EGVrg!`Gp*&M|B$qO$30{~&<0wu8eK31E;M~~T4>sFugq^Q$KNibf*uQW zB4AORZc?Djq6HV`Do>m)XPjeM#HKGVyN3pxUnbSQK8{sMi=o3{@*`l;{nOoeB(*i%(8wg2(M91&>}$!HlSg``4QHcb_OG*S>%uL%>_!HyyJWNj%Z$3Iqtg_>QLHNTfNgw?_ z%!NDt6og_J*j5>S9#g#!X@p2%5qVXn4x5-uNV+FbYT0aMyq+h&o~g7oc)qdz5KUYs z+F-@~;kt!3%R`){^DJ=tTKkcV4Dkd!p%-dUh5U7`hUd9KYbqK=ORG{$B=I#(3|)9% zUum(LO~+QiMKf%?L#@iFIy9E33K|}ro`+|my_23n+Irp=N8JtA`v9ePeCV!V|CA5# zSG1as7auJcJ#sMQbZ2lHtx!c1a%m#(4U{NWO_kngN_1RYr0rf;e;>CZU92ldK9vhz zi#a-qGrXO?D!7xnx+R$`^vdMVyAW*wd+Lh%H;ERwNHv~(A>*-&mN|-YUmRk=wmt9|LiqtWM z7AWmy8c6zSKbU?!UT8U7UtVr1qUYuolL^2HBo#~aECl-xzm~vVi;v~4SMVg+gwZk8 zN48Y2K^g@bh5;2JaU+1wh?k{o2wchPUY1<2Kav#iDdl&p<&Q+Qu!%oqAQ}RECgp-N zSpeNXI*Z(A0c-~22qGc($R==)8|5%uekwiNAM zLcr`0+&-Tjrt_N^eS66O8|zEaLV*8fxWe@cq>S;7`$ zxSSyuQ;7CKK{CLQo-jfcEB&WI#<%eLB%I6!-o+52kZSH*Y*s?n5x#nPvh!_XR-#EIzUS zlhY)m+S!O8^gns<0O<3ddog&WZk9_F0KNPp^d%hz{&Noli-=kK(_PS zZ<+xN88pDwe}@$48T-Tv?Ld{}TPs`)FxtC|SdLjFZyf;?#y*ym;OHUiSg|3|g`Wl11a&@qLor_J(dA*9rRM+?aNP*kX(Uod!flFDgRvgY$F6sW)Wrr-Ze zrDl5|AvM*kk;f)#ZpoFn!C^|Jz-G-VQ@6$`8VlK@M?M zn@WZ5wOZO-$4uD(9hdb|fBRa?GzDzazGyY|{>DGDvVF5f>lm}etCH|&Br`LA>+0>- zeJ_3Vd~!7^KxG_<_9x;ye|D2pPBzEL_|CGHxYvBZtA9|zDcD6G@AkjEw|9+Sw@G_w z&>7|MMMjFWag83X&Y5obq8#Y^Qj!{qmRVS;ewenW+h|ecX8V}v^(vuWx*tA3##j)$ zU^2cC320r!Zv#XsmJWK#&;?B^9+ zDKFb)@}H%hHU+ew@RWAfWg_yg3x^vJ|G)h0k(~z0s;ER1%BPt&=H(j8QJ4m7VgKO# z+E3E5YIjY{s`mGZ%jZRuaXK35>zhDY`L;uCG}OH7&eXcXR9W7L*U$1UOTZ} z_KpK~i4uUU_ZbE3rjZ5gfb#!kkplx^IvQ;58C*{n4V-tG<41N>935*kDs{@pI^gJN zXfh3DCIMrU_k&E3JvuyLRr4~hS|hhWf?SFAPx zx(V33-Z3#nmi2Q*;yvgeI6fRg0H}GP!8AW~3a-<;FDU^u9E#xzU&)cRn5pt6S?}1O zRu8(9>K{@95Fi%z2CpH{_;2^{;5*aTH@pI9og)`d8i@9(IBpEE07wfkf#Cv}BCOhf zUKejjTK)QlXK%G&)d0|a1M2^@MY)gRa#v;GkM!Kf0$^h|3jkVgAP4ZW1pxH_Gz&-p zhV&ofHwFL-z2P_T5CB1k|J^FU#Q!P@*e$@*TO+`mZ#n$`V&ESk;IR$e|LM#B@K*!+ zU!43O0dx%Whzid?=zh5DxWWgc{d?)0r#1PseD=M~*cnz-C;;ENvcA1aBG>z7$$pkS z%OzTOX#!;dQ4A2e7Z!o1llPoL0HMCIvju!F3+NtZcHn=7Q={_I*+lR>-+i=>bauJj z75lFcF0zt#wL|#UHujj?=NLIx;(E1@9s+qL1B(AdF)_Km*alA^H$ex{+h7~jvm~vz z>_$A-xLRqu3`Ck}Jf1Fh->o`*+Tj?QuXN8!f4A;w&g}b$fP0C{AVX4XfWx9ABOB%9G0dm+-XX@jB*I5S`A^ueKxeAc*~_EUO^SKz9WXog3>mKS zyE<64S1gVqqipSI5fJ@?lD0e#kAF>33XUrM5HTJF*coX-_ge!!ex6dvhY zcM_7U`FRzmdoGon&n6Yz1`i9^ev!N9M9M~%#9W60w!$9(H7=r$6o&+1nZIsT`o2RW9Oca0p86Yre{jhaJ+St&PIiDx==P}Y^+k!0!)zsUufXQ@oKhmxn=VB2ncV>W-`_B= zny}C7qsM-Ck-Lw^Nt^x1zySI4ehyAMZ~+$#WI_5~ zHX+vaaIOs)fslxMqy!Py&ga&nOxkJi*%RYby<;pX`lFQ+*jdkc_L|uj1Y9{61HwR{ zA}k=n?VAc9y{QUe#&#?p=V#%~WTEv5{_Xnai-@xAU=wuLe>#Gc5HGCv)ZQ-M=Mxga z<5RzXb^%n&F`nAQW!N2IRAb_QV^LhH`0PK_#QSo4M@Ihh0H^~n7MYcl1ZWciE{mc~ z=RYz^HE&da@{wpPRZ0LM@sR%(iA1YXVgo#i0C_-cxD0q1^&M|b17xJa{#ypfg) zpq7iro8kcv096I(IR1xU+?*|S@aRA7#bm%E{nzU^a<~lt;qw2N{Wqo=)qq+EZ#)6S z{#6Cq0UG~rfApR*W!RJ^fnagD`Joaul5J9JyQ4 zdP9^L094K?bp-T)f1cLeAM7%glE$1twX-Re51KRvyJ`oT&Ob6w!~_=ZDS255g<5Z= z%pTybPI=^ceY+VwUcVxOx*4Go{=}oCi}(dBmCctAbO(hk3cRG%c__NTR3WJSxe z6Y;&MKvml^cABg@#jp|(fa@8ZY4IUPGVGDySW|L2(0OMor1v+1k?yD8!0s=mBe^mk z`dkixUI!-9 zEDOiK=cY1HMnFs}Y?>&`?t$3#`K`A{_K2WPtadH|CC{59!r|pee3sW8a~6Zn8K0Zn z{tEUvpF z>Ix#Z&TFf$`JPGFhQ(C_DM>FPQwzhT4`8G503?O>pDOGd_!w|<*5>K_U*X=Oi5Iz3 z_&kY!{~jN@H<2Y#yWDiz)wA@;x3M`NC1xDt;BX^pWQ6Fwrd~GRJ-dqDZ|279aE9Ry zs+EZ)>sIFI+#Am@pGZprBhjSRG*mm~jxaS}0vU%;(8fWjzCa46f^S@>K%S7A(ZPuN zo&`7#GnT&RM|8<-6<8@6>fXBV$x0AXb7nxYZITRuYf&9QmHPLn8K{Uwp3k6N8V+;a zCjwN+@3n~;75U|UCe*|=mO1WSUwo6)8P+Mr31QVSn#f3+DOC5St7|eo_~Uux3H^+n zGq@&xT9>8B;ZCLy}PKZ{W6%P=8f*vYixVCO@oSIuW zWyyRzQ$kN12`N&xx}o}RHq)9bhJ-H^oAxsm-8(F^#F&fV?!lQv8ramMLQcr+S=`EY z#Z19~j-Rv*ReBu}`^l2y+l;z8Ufj6k1rNfbp4-?eBNfT#yRJ^>{k>ta`=^OexNGgT z$IE^g#N0N(uYA1B!%tO5E@V?!_g)W)Q7f*=-kbejyn7|Sge zzWcz_SojB8Zp{hS83=pDI9{xl(;t;8j?Gz;{O1(>{5i&NZuC9Hfc*)aw}3&*>0u1m zdEf*A^|O?GJ<{_dn#q`TaaE*FR!3NkN#SovIxbHxa}a|dgXv0Hz=e3U#rOma0`KSn;EAvL~xweSphQQWLHzLYk-w=pbtT3ry044d_1w1VU>qbkS~cVT!g zWeNfq=~hs{YUy@vFXVb4zH?OI7*1<7I>T$#U_5tRL+}a!Fd7m$41m zx?pDOwW&Os>6hCol&kaY+jVM9{oz#i4S&otmstNK85~%q97;=znQBDcwYiF=DL&LO zB+6M96-H$3*wYD-7Z}qUJcUQbAF|3Hm-$jIhWB)Fv~?}irC}HnZ2q79=9gKLvugEj zeNAm^&x zZk8RNrWv1#xSUw^?6I`?{H7yIN-BP{C4Zk+`{wxeoZEaXtnR>57`lLkxPHbY-id)9 zS6B%*c6Clpb9wi6^#TiStc{f8me`g=>+Uj5V7x5J|sep&H%mc{2uC9keJ9sd^l;r03b7fP3( zsZ6c?)F{SNvNik2k8N2u+2W;NTyV^Owr2~|#RvUtKmK07zvAqi>3K}6&+XD%^x*OR zTkDgh7=Xa>Z}jbh(&kPYo<>^C3~sKIQbHIEv?i%YiZb+cshnKF&=5EgJ4XVhA|XTt jsF^`R)N@iGIZXQ^ z`9mhoXWO@q8>H`y#N{=Jkj8%e6!2Gif@i2ntbruB|D z@}t$mL!7r8ZHQ|2RpM+3I_#L=Uf}rz*W| z;b3d7sc{SPVrKS6IMXt(GM9zrXtwQW9ksi5=AQz3>x9ua@~SOZl)pZG5<^lN|232! zrb8yQCP8}lYb&ZFEjZ_)=x?OqKZ15Q^X~i3Wy+SugHkB3zt7^eU%Y&DY4=^Z*|IK( zIK%cKV$yfI+NA=v?=iB2gv1O^h@R!&{kMLnZ$F6QY1j`Viz}i-GD2=8-**$83xDEm z{{1_fh53$kJU@b3tkUIUPEN!&sqos}qutxx%A2X7#5oNAEUUtc-w#H>u^@jFSF=Vy zV5ETmd*F~JUgVdcQ-Stry%b`z~L;SZRDD5&81vaB{?llR_*g z+C+O*&`U&YwW8XGL1n5LpX zzO8MQ)IFLxN&)f2#%HzsX=47*Fe612!-RCui!BOmi?um@==VfE(ZT;LFrld_bt4fk zA$r{TxFa%>sVzNHQ~O>#aQ>PNi-f|4vCHY6Kg`E(bbB zA7$XxS?rg$=x_r#A@NSf=g7>^k|4si8EKb`Y);m#9qc6yWk`E0PXAQNry?%icK}nUiNtj3x*m*YeHqjgIsN!!En56u-S^`6( zlrqW**C)bG`Kn>TksFIr;!=7Jqn^xuip%WMe1p5oFW%=_Lq9SqMdT?$1BR_O(R5rX z-zGkWn-LiT2BGhhumg>Rw%7=w_&ROH0`>Xq*RzmOHaWmZq0b8zGmw=z_Jjzm}V zo47bZ%q$zUz9jQkMQBqJEbLx_F{vIwLz!sXZvM(ZQh~6+;-+8+#5*)51+VIm`py$vHlj-d<|_5W?Z0 zP)4CgVgVWdanAg*GWJCwq#0yGn_34o;VN?SC2{|}T2`a1oE$?$1?+aM8hV}Li9$={ z<+rR`WE3n+Oi4Cg-Xj0Yh8bp^U%B-byoH&#v?if#>mBhG(KY+~A7STt>N2783~@5Q z{C-teJq~N8AtIRwNA7}l!`kqcjNseQaIxuI=VDY^WcLbJNlp&gh&R~;nx^~5!r?b7 zKLx7~qM`m;(S#}9*w&1ro~`W(w7dI?%6s@9=dCy@wL2lxO{F6tS!h}I^Y1J!JWY0z z=-!#?jAzm)G-cZ0b87jZC_Ftz{hR37E_LrOqCrTkjb=6O_kRz;a$xDYX+HRAMz@M@ zXIh%>y!8_9h}7qv9y3mes_J?C@ob6R;Q5KoO#dAEj|)ucrw3RB$q3pRt%9c5!Nm;T-dK|)|G&(Rtd4b*c| zv9@O2xI9dYcsDu8V_o;Rqy#(=`B{dskI}|Un+pYTJVSlv`#khY(7H}0@$bP&Eg?ay zObkR0bAlGNF3*mLL-Kn`MWxrbx=(7B*c*J-lM;%;@$qEbEI$56wnqjJ+lJuV>~Yj8 zA~#^4$HYxQ5T~#jm7i!SXGs&+YyQ=gk^#mz1{NzXFX|-ppkTbq^0$usHCVp znBcw$Jg~2OL-jks!f;EBp4MXTC2*-**9^;;qf)1p2ZPS%^NyeZWs9n+u$}0OM^!t& z{P(FN*sizJ-)5$gR2A8y^8Zel;`+Dh!&Dl>GN2q}%wD|)3T#cB6zb~rW5f1VcK<$3 z+p_N02+qssj~dz9j|}B;cB?^}l2!;3HXr3=q$S^7Jaipd4!-T-hA2>FeN%q^=s!!; zq{rL^;zOy^!qdpbD9|Q(2fD=?x=tTgf~+$twF@{Nv?)u?qI!giO7Y zMM6qLL`wUJ2Wgrxv71e(tEEt?H30>K;t-_W4SD(D=Qx<p_QIhTzgUxzOksa?4XKiXGBqRiM{N4XLs3d>6lW_iII+=9v`EGDiMV6T6KjWF@e0pmOf#-DCsv z+qW^C8i)}{vCx?TGLI6pU20;&1Su^ZqaQ3dTuv<-RA@HB8J-+) zMx(O|yPqW`<>e-%9FzrlIXM~Raj~(TTqnoU%%BD=$ho*&E5&YZZr-jbh=_?PtRZ7y zh?$c;UF2Gm$_+wP>ggUJ`_cuqaR2@6d4xvQSL)K{RNoL*98#=MQG&d@n%5bOByZSV zPr4r6rwWDW>O{Yint2I=8`q_X7q{DU_LD?0Bg5T6B!vxM2oM&?Xf|$zV%f9z?vi99 zVq--Us3|BORU#ogjXn}#T3xZ+Y0H=d53{qg<99#sn_M`M*`IS)CrGH>ua%6N+W|F& zn3xzzHW4dKN~--&O-iWW@eu}Ppz`Rmw6qm^+%4%5_01Lgr7(DbTNwEM=!xD}r^DsW zJC|%?9=lI#6MwZIS)mF(@8g0Tz|Oqe zU>(1urs!itN=s#wMjT}q{6uCx5AwHf0^BA~ zPwfE6V5I0}Fy*520@Y*<6^_3iF1q;o{p#+_Pc?8DVCJ{>+TIiw6E${JeafnOH~bnl z^o;P$(hhO+FB@BQ68^8a0CN2MypaU0`ur5|Hsoi%l-1mWC%c-Z3-|`#g!SmxjMUYq zOc^z`g{vyGEX>TBzYzSGcWJx;Wjz>F(k9E(fC$2oAd<1d$ofHaA&WtaX;KNLKlcjg1$vCI%1F{>&SJs{#VzH#ad}iV6YP3dg6& zUSR7GTozo^w7%7BkP81TwG=gfur5NG!Kkb}$*Uc(DC_ShlaQH`U1XbFwAzteH2w1* zfEj3?O@5pLhomidu(1Rl`|Vr#_wNzF3D#x;S7>cbOCltw@F`Tyot&(SD)967ll=U- z?i+^r*RQ$xw+$3ZnDZ_V5Imaz{66MBTIO(aZtq9^*(SOcn_y20iWaLwJNpfYG^d%L z4GnsZYPPV-HL+(g117$gmo3E87ASDM{i{6z;Cd%b{S_RLZNdAENjcCehz~)@V&&xH zQLky2TlYA5~qn z>J;+Uf~!%3etn1UD({X3Id zlpH2I`NSDnm7gPV$Fk|v?yh;!(b4nr^3K1JCCi(c5wA#So}IeKL(VUy zl_r0FG|rE_>wQIA@n@cfje>qha5Y1=RLNql($T>^Y0!2c#P6eQUpl$&5|*EzBvzRG z33^{h+wzqWe6!{uHg&&ASuMX+NcQtMCJs~^o*`$WL5?eXFc&)3hc%Xk=I$aEC&EtZ#JyA3F?PNJ>f` zUP&Ds90bhf=F(@QjPFd9OXx~TNjW&2hfs*=xrIkYDl00!SbJ7Bv(X#JF*`e}UT&V2 zq&JWv0_vrur6r`!rSS4LQP}0|_mY~L8bY~ApYPAC$)77I3TtTp z=H@CXKQa_HHXTMr`}hp)V`O}lD)@uMf-Kg?qLq)X7^>`G>6crB`}VSC!^LuLYG7g_ zW^<-UA2qHQ^i;|U3Sk>s>Sd;mHTYfsL&5N|lDzS_r_ ze;xo?{qY7ZUCx){37m+6&g6_J0g6NIT?(-LbOSsSV}7?B0%c`Ea?KfD{1CU>@6enI zC>p#$-uFDx*EYEO`=qO%_;=b>G@U8B{hYxyA zf0S~REpPE<<9g&%latAYSc$o;JiD`A{hHJNYMTEKY%Zpow|i=tmH2{Rw|L^zyT^>RbRmS>UGz(t*GTS=jv`!4*ehU1_q-{3AAKnMjh{s zT-M*eny4QWUR(D9w&3r8=+7(-RG`j=gZWCYU?Jdp{z~OZ?B8nK_y%YAwtI}I+uDBT z=QmPXbs_5ie)8$US(=#;a(^(_yDm4OL_|bY*Oo~F?pmeBBTNaBQc^j!ImElK#1X<> z1Q>SBb+okjQxjTs*;CKxx`@p{W_2W zgUP^1*XHLNj7-zg)9c*t>MAR_n3(q30tw?;oAR}4{V<5JXys1o(E@uV{9`J6%bQtO z1?`)->`jj=Epq@lA^drYJ495b``pBtXT!?I>gRnXU3PJ-xcU}3$L$XLjoEgQkK3bS z*fKs*b-c$DSd5}7DM>&fuak|!Z~qD{fP_&@={&^`Uef!y)rR2o-8%N zqbSPHf0o2UiDqnWo=)o`CsJ3J=g+GvQ(gs2EVr_(bvv!W8Tl~M!NFci$)K5-WD}!4 z4zFtnT9$R@(@)oT6+jOQ(n;%`5na-rY4lqT7XTVuA@Clptk}SFv7-q>#n75^fyX?OAkOSC~|9f{kwX&oR4c{wT@;DnKVs^ut(Scjsjmg@f zPoO28-LN{VQv0tYschTtnL| z!@fjjT#-dN8nH5uRd!I0qfhr$iM8 zht*7{ImNF7l$V&D^|2^ zI-+=ZcuoaDK^V0hG&CC-dx3KM{?!VP1zl)y{c(t~WgWFHz1I#&R;;~&Z-jaTk(%IZ z4*w1;fB0jo+4!Br z_g`QUNK9yj$XU*C)r2RFOiqp_B-u7|c=Q@vJ((u+d7akN*wd}j3Z>(wBKgmrv$;-^ zGiDGR`4Hi)`OB4ecMi-9EKu``OJ&px>oz}dIey=uTBgTQn36(XwAPWkie+THC`pd9 znr~>spjDAzL(Kg}GU=h+CX|?BaPtS=MrcCm<9nb3sJ0}2*F~%B$Vgm97+$LRSRf&X zi+ehQdRae2{?jLqAQG&%e6FWIROPCi+AOkXt$b@-sRM)~RTNona--&Ma$BG;E?@lZ z$mA4-7R;Fqo~-t&!wKC6Y}nX1ruCiS8XYzD+JeB)E^+(8z@rCCDG?ZjDHT&%DddZi zDDI&hIVwWC9uP@{sI^u%5o91pjPY9dB4#|Cxi(F ztE;Pb6BqJ|is2WAT`*Xi7zT2*`T1j)@|0{h9g&C#rQi-a7)bylwc*(wpfby-RB%$dkI{fC9sPb zuwAHGGCPU|se;}H@ULiVTU%oVcX3Bb5D3#z(8+w`BbVb~kIwaNB>5>iW|}mf%`E{| zB1WdYxE617GqY-(=hwAgZ&q@Kjc%?VNu)-U3KV}%K;nPf9{ha} z-263N@pcjqe4)gC_~orzdPI8p7%}9o(uYmFuieAbqJlN6puIN#wG!;OMmWctuZ`{HC`+tt>qLKhiU8bUD}qGl`W?F zAWHNl)^GbBDFN(M3r$WQm~HgJ{9>{<-9O&J>1bjS*PBKcAPzXbc%;MoYzyIr01v~* z$3LD0Jkx?T;=H>qz!WE?VkOVw3N-301|cS7)q4Nk4r)0Z{o`h>pqY*9odqp)Z8@G{ z!u#j-Ir;gw1F1jGojYYwlH|af9ck-dyxVr|Qw8VFJLwKtlVbzXj^5q0%*XJVq!!vW{a;7 z`RxG*4I2N(i%U(IinB9M>afcD_wVg9Kv@R>4Tq1Djt(`6=Ux%=xa+t;slzrm+#0lo z#Z2Cw!J;yMox{wy1Bgj#d2b&3Nw74r=gzhNtz}_hd3+MqwDzpw4CPFo2iMpkZ%9%t zBckY2vx(pEv->*7yW*mzs)~5+*VNp6=e*|MYp}Mu%3|kWV`;fSZwqMGj=#0+rsMqs z1K<0IfBcfSHu*?|%CTW!KG^%tlKx|F-hDq=KXGxXw6eT>?058~T%a z^@&WPfW!N~##>`OVYD?ut&}QcQf>r9wTR*^+d=$}?0C@SgFc-HHdY`hCs(Kv&%_>Q z_VsIr11o5VZ0+oR2L-wB&wo!!N(u?VTq9(pp=tDaCMZ0sy%Mj>y7%_>WqAXDGvI7) zU{O5*`dkxS^~dHLtiuQmrcAJ8obM0=H#oNePEeK$Ldx%=TJm*(saE|GjqNFxRod#P z4F~&@e+=ZG+~rmeH=p0|R8q8&iLt2IwzVA{q4fiL!LFzZDqGFJN2CPbrh50gL{Lfn z&1b5-f(U=SiQ&Yx<6vjCq`!~gJD!6BWN=Vju#G`sDJkcMb3v7vnsugSEmM=_{)yu+ z76oxLBEL!a+ecdcui^l|0flD%?ju0p-YSu=BGd#21vXaj`LH^--S)VEWgRZV=ixNp zGT@YL7*%#V1UFvO{$?Pe2Y(i5R1Rt`M=?S2A@#5u>B)%+5Za5y-mj|IHw=JDQ_#43 zMDCd&vGf8Q2gb8!vL8Rn$jC@YOZ)o=*4whK|L|&VVLl2b1x|RsS(i*B{r%5LNkMPv zw%ifodUd)pUbwW}8CF(S*4Wq>7#P@r@vl1BU@Ug;NPw{M|2v5ZXMgAIQ*zyKaCYw% zvmXw^xcPl@3nU(MzRSa{U6OIs0dmVERHI@aoGy#FSaN(YVo!#wf0OdbI>k;R$Vos! z3+HfC-mon+gPy0S1Uu|j0x^mx!Nx}F?=L05@$MUjZlUVloJxI`)70eT>5w)1yLZYe z?(5sz!cO3k4jPsiv-TY9N6(gmEK%c`8t8h$=GJ$Ju?Z6h@xsJ@1;W^P_V}R!)=_*Q zqq?{*u7`lC=!20+Ivw=CmBYb*ltVp2U{2UU*ziVk*2t5kF{89x5JZ^^txUzWz#$%{ z79FC*NvQyR4QPtb!H>t&&n~(OyJw5nnDWdL)(x*+NI=oDs(|1Txd>KTYdlk6W2G`cS4qt74DYjOn|>1 zlp33Cy^-ClD!&6t(3nN`Ac>y5bt#YuLpr>@MQIO}-+u#g1*jU1j&o3r;_z^r&616c ziQ(zO@e0qBlu#hlx;9%wnJ?T3STMj+6j=T`e+cYlPwMJ&Rc_DtXB`lSeKT%(yc~BMae!33w2j5JkQSbEUB(?4v7RkXxFmS zMRv5G%h@hp>HAQAK{Sw?HZ{2}a0l8AfZrbNm4bX$8wA)F%T!T}C|w|LAqF$P_OiG; zvH&VKN7K5n*lJ7bGSZW@P$2-4B%uD?#G=p@q<@$fN>bph-(&ooj*~}B^(oxy$w6>J zwo+#F7e(1PSXD|LG^z!wy1Hn`P0QRHh^sI~$B;EC07s~+AZ4Yhtb8zoYJH?9e0lLC zG=DLag_0BynRqW=oW=699|h(v->=vyslWgDKdNH>QM!t+RH@YkKLDI@9N3FGhvsuK z2A=2}Owu@isTtrLia(q~`C_~n4H%SAaPqaV@QtYrA-dLxD8%^`5JN5uLb}$#25@xo znh(l_eo37`_wnO;%SwvI2ASWomTP;unptF^jE6;zS0E0C#+(FWegt8H?*HKs1iX`` zQIPSvF6)ydm1{SVZ*}kYirou*VFRc@UuBtWy%a}$Oobg~yeS;9tHn4f*0f#2gFGZ~ zat7ug z9TnC0)v!<%@K3%{O6pT)rFgjhBKUfkA%)O^))Ve~owj9cWF!oZKgIbG1wZX&AKPNP zni}Xq&a-am0IIn?xrBgtj;}2?$Y)`xahafbOHY~LiS(EX0Ac@Qz#xaT0pwmC_sVYP zv*#B|NvlmA{j^@}wl}x$tft=}0re+T0q<;&C(nmkMSl2`(ge58FM4xvga!-4KjQ%_ z)k0axBZsvix@~#S1Ec^)feg*Ogm|~D#@8w-?S1$_F~eJf-WMJA7Vv0!d2=d)a8{!Y zNDytPS;#uSWz2ts{0~X)MljJouBxcdQ~jSVI#*$t_qy**6B;h+Q~Et-(eJip`n zQrir!q)F=NOYj*yR;^6qog#^GgSP(-a z(4qkC(ikFD$sNbpeL`Qt4@S=F2s#}68hN| z7hTjoPaIjK`1wnLXSMf_*QBkW;#^!{;J`N`RP}O51)ccqQU3#lt}gsH?0_r&FIt3O zdU)8ERx$Gbkp@!9izHIhT5V}LDJgfHFWl#)3UFb?jcG_9W5`F@%D)$J`{9C%;E&`(zpmo7yf={5l$n)H41v45yRxzZUkRG< zh@pXjMuXzKT;i&@BhcWBR>jB9T)dMjEwxpQ%y+&LfHAq;q|@#QrUO0A=(rwV7>N+B z`d#0NwD;utSj^VA#zVw$KC!ZwZf|cdUt+64TJ^2B}a3tpGB{pQ}0|#^K9JF^Ld>{ikp0th? zBmkg$-un_?EB#}n0`*Qu4TFJ%^G3w?@125zG@AMD8r7H29WRVrpMce(vIgz3HN9Ya z8Inz_E)lhhOvo=C1qxH8CkXJDnu@OP`y13*{icf_=bB{6A>o}^_&8##X3WQ@JI){z8TP5$R^A?1 zx{*0Lsye)j>pjJ&5PBvh8N+e$9|9*)cF1;Mm!;Bkb=5!=Pl+_}g;**tiwrgMjv&>B zpKopZIxQ{ZYfX~GI(XZ8S(|-3oShXV64+~#N1~!s{&buT@Se4OMX#%UYq4-b_{0os z?X`zJsk%`U<7?yCWcvAH0kuv;8i;9R+vso83H#ifflpyu4IF{18WyMZTBZD-D(A1v zzx-`e7)NwDHsVQDJSV$x1yPpQ-V!z)b+t@Gd_m&gPYJun!O^*0m3(h>s}@1f0I!IQ z&Ye6WW_|G70N3bJK`4jK2fIyLizzq?VDm*2I4?9#_YW^*hbJoi_3#K|dAqj@mgfA< z(eWZYsO{JBNwsvi|0y;aBPeU^4e)6d9M&hATP-2&nJXMm`G8G?i)TOH3iIz9ct zcmYyUeSK*g;lTyrn|l)0Yrw(A=6b2v4eSEb898NT`4!OZp^VAIy=Y{?CVJPYhsLI5 zN&;I4-A;|wqMVRFXUWs}jAeKTv&h`hq%`UZcc5%Dt+MxYg zB0e2Pnj}*E#MXNJssF1}aB05G_P{HwQZC^AV}1N%RNIG6M*V zd0#m1tsBxF9v0NdZNP>jn!qAnl zpyQ0`|J@U$Lt`_uRC@rf<-KZYX(7cE+n|`qCum+(khwl-PER+G=Z64A%$+sz{|Xz1 zewh!oS~h7N4&MQ#=SD}$dU!c0Qw6sGeStbwHw1Ws~+-p5$)Men>4{I@K8c9eJ9oIdK>_5KD5auxX z@k1U!<=1Hw07F9RNhBsM=48@0OBM1x>n&=)INHsXOdLgVEbW=w@h`7={m{=-F9~8{ ze4(EY@$teq^atmL8iC#_4I!p^d2fwgO?LIjpE>&BdV@AgxEs42^YV@%d}Fb$;|GN# zRqs^;9xB|ULa??0tqWArs?@q$)|p%`=h@AZI9mDGo0)3kCt@mt<_6|MBPJOd$aE$? zgM(JM{wL|13`)B<<}RW4c6|M6dT&Qon(n?YJ8{70hZ4$SDBedSN3L)23pUN!*6(@) zOsH6wI0r^pfpXqrjV>6E@+%J-)N9_Vh_V?0-;W+3lxj{sL4z}AUJk>jUc)`am-QRY zf?xn_XA665Wdab|Rnz^!1w-QZ%7|?zs22&Tk&2YAABNC6^`Qf^u%wcw9!DoqS6{Ha zkE3QQwBmZuw_z7m+b_g-qAN{1cR>%ykx827G6F_s_P;)AnAQ|Frgr_xW)Tzk1;PXx zAor2!>FG4rhCi7V;q)!3WlT_m-Tpi2IaI)9&PpV;2$&4j6Uehmo7$L1 z@gTS)ZKl;kOb&)9o~KAEfT3EP7vUeM=H&b(kifv+1%EUsJA`8A&5?2*0#&B0i~ehXRCWl>PhnZ&0{9mU(Ce zfMRmuLi&+C?&j@T;R3#O8+!AG3p^|*%uTK&OX002S}CKwk;kiKB})+sS5v#u4I`l? z6~J-t<1Q*FsxZ#kAOC7?yh-mKIqe_YvQ-N*>g{?&{aejqi1#(0v~=*{A29A(nDdmM zzwlVi!iFk9&c+%wnY{VK;7H{5X3;jDYh5&;;X$s0%hl>z4>Pj5He5Qz8Sd)N(u5FF zyMZs+NaI0%ti3>JYH(wrI~D#Ul%wz5Bo?SfyRU-2hKj}R3I?{I`x7(g&=%-$MxU0; z;(pD#vC)P6r~P+Sr&^+-GPWmA1iOSBMP36-faWt~SUYf1ncO(BGC7xX4T~0Vz6~XL zpGTS2hlh=@ma}&CrD$Ti`oK3noi^hL%-mk>IYYFn8`lqy52-Z)r*RPf;klf()D_u~ zhOw#LxrVt!nn%G?Z@?Hr$N@)k=83)n^Yk$c?b6UJGH!Ldg#Oi?RE}p2&D5gKKtKT) zOI$oQOu=JE1X8E|dJ+Vuh)Bz8svL7g0ZC5V!F--IlP1pB#_43KTL6G^=>`NWRXq$$H*7)Mbi49T z$+`C~1Nhmy>CY+mqtJjdT-VaE&!X>~z-`3w$<)a{gl_m$J_Jl{+LRxCksXacOidnw zXP8X-{$=?!|Ch$lPm}AI)}2`5kNBL84~fm?5b9)!HT6VEKTC8HmWs;q_cyF*2Y0enbalsgFi!P)X#@zk;q@<>JRfJ*H(3-V4X#?e4qm`y9$w~| zPI)f8Y?%RU^sl*7ewj}Ipv!eTfC*VWh_qUHFSzX!<}%*e9Qbg&0=Ks0Bu(_h8!Ml8E85-x&5mVWH9vG~$$s zPM6zArGfKtwC3)j>}+guaR}eC?oM_J6l5VX0NG~oJrMVA2rszY;E$e8C@3mIF(x49 zLblDcaM-Q=!jSFt=T2>aW)C#G1)sF>Z2?u_aaZwmMd%~$ZW&;KE85z0@1URXN~b99 zMlTkjKKHf>i?p0=a}TYQRD@BRwp@zOGa`Mt4i7v|juhEHLAU~S^LHW>)hdS&hZZ}|go5{&!V^?(tp84)13q4?g{6D!L) zReD^dPA#eShRM;+rAc%;lPB4&BfZ$NZzz|YRF3q+%&FMehl*)3Z^vnQqcGM`_g@#$ z8gAIJ2`aDTzSV%w0rAmvq!rDpqi=xE0VIiTCX`@5zK{Cb;fq-6`VbotZ^Pc$%FR6| z(c)225xubd(j1HhE~KWO(7f_YrnM2D#dc{8I#YZgW+2DaGicn3%)dP%VL-q!CsS+Sm*;RgEQ8|j4}Ur%Q`nB(w;<4$Ylm& zNWK!?DQlH--neX)DbwYm9MT8>MM>vNj^guxnGey3pz;1h!&aVNT^RGW=i2G?T31m>{U3skRm-qt6P*avVa|F0sLv?}ITQJ6ea3@$m zJR~$+I;6ZCq*irv+7vjpR$vufJ?^sV;wmxG9F}20%40P1OU~c>S>javp3SoI{yHeh zeD-xNE;Z#Y!h|nmpv|1q(=)4dj&`JF0m^vA_nOOIROVplFOHXl| zFHT}oDEXj;VsFv;26+Vi$7mQqwar*5_&iBzGob1`0|#`YhU(=a#;P&4sUO`>rLJuy z{Yj3i99v$H*t)ic^%1$ii3QY}tIOS=XZRPSNw}{0E>jv;7barVWjjmM021^h@<6~K zP4yNS2uine5I!W+9?Ai2Fvq6jm|-u&4%p}UM}TFivvS|Ae^<3hW)ehMFpgcQdX!#t zsnohsW{n#QQ|wQmDs~@y*IS4^dd;k}5G-g7Pi4)ENKSPa27L)kfFm0|lrYOf6}psy zcPGyyrYmP&v2#b2fEitp!|$J%zcy^+T%}~~b?R4t5DWNB*@Fz|TjZcg9&UTWmE+xU z)1$1OM~2oXrYJqri98p$j$V;-m1k7^socf$L&c%qV|$9}!5tn`SpZj6U z2rdX$VvZqm|M0d(rvFyBYj9^+oqP0hm~YsQjKs?Hg#p2l~7TNhOo(HZsW_oPkQ_oKUQ#oc8>+fF3n zimC>kU_EJ^(WX8zSCq*Ym2ZtZtvGi&;HrMlY|oy}T?7+nc?~4LbMKJUDEiTw&XH5@?v)iC z*K~AzN)8?9W`(Z_wUl{8yz960l*H+jBjCANru(Wz3}0I7GHt~aZm$H#H-!$m?YuJ0 z>yk@O{eHxrnCk1&TOK2Gk>4Rwp4jp?B3L@A2hN3Y2heh;mx9@ zxoU3CC@ttBm~%TH>?lqAZLfM!;N;aWJ2EgJr=byh`ihm8oN7nVKte)IU7c|7A#xmf z*xc>gGxn5+Tp+~HJ!s^4#*Ah%1Zq)?m20&I49-crblVDI-_)t;tk&TlQr~`tY=9Vp zSmYHbj=B8>d1#PWkd{D8GACg>A5|SBo5twH^WCjs!d1xW8Whg~}ua zHK3ccKN*|%riTgiv{_XuO;=lFWmVR0Hb>#51x|RCBFD^)s?0vksn~|NH11S>*KAy{ zu8ei6{aa_%To|A!%GJ)u%Wg?ua^SLHSKT6zO-_EXGeVl7+mGoT1761&EgiL1Wx zp0cN=>l?S**lv(L;!~Yu4C=mv#kBOehNYVk3mDyG78*C-slL?<)&Pv;v=0J;jQ3sP zd(Eo{C$2?b{r7^&4#k0pC_ay4dq=FxX~|j@Doce}Xe{8KmubxS=JI;}pdA#e@+B=u z^^uut+D3$7m7eR0Z@?^ZoEd9J-TFZu+Qdn45h$#fofgK`v*sk;0?R=_}`1vc1A*h zmAa^t&Lk3QY`e7@uI8+YDoSmBD&H0&G;_t3gF!`<9t{Y}!o}YMT2MSty$rW94 zZdnnze!e|53PWo|m`R1sDJ`p(*kiu|%ou;02Abm5OUcDur1$e`ReZs9Ls&x^~lt(;5s_sumaFjUqdTm&kvi`(B+XnqjrNfO^VRQLO1do%E>+1w* zYF1ECzQzf#{H1$q?PjocGWhyW3r{ZZ{_fU#xP2!V8}JHQfBvXCbEmt)6YHU|-_K0V zkOhAfEJX%oS@G`A<3-jH2hu_x7a0R9i{3*C!79< z4mik*tOVe|0SSMdmNP|!d}yC-3P=GxdDju){AsJwZvpy*#NTN{z_A;nrgpH}3a)y7 z$bN_m?30Gf)mS)c4F)UiZ)l00Bsg2teCSTN_M_KG+L}6@yp-HkSKsAubeKLY47mwI zHSgPT)zU<#KMBl51BGmTl7@mbfDQ^`bwhXr@XZ~4h7gyHl|LuY8x}=;;}Ve+?le{ zErdb-)GV%>Z$YXIDf4>c!YreEh26>@)+f)+z;|{IKu`L|IexdUHs&SefR|a^dcT_9 z7rGZl);!<+iQG^i-J!YP>^TiG!F}TYl9PO~)w;#Bj&ZB}b2~~uT6!Pb)okxtbxip* zo#sx-^|O}r$Ia>~=7?RvG@d@aquX&)5Xw6l#n0ka6H8zMTgSs)OO;`efztV+xPb_5 zU!{YM5g<|?CXUt8o8^KMQkb8&BGq0WB|$d*1p9}ZL;!MSGV;B{H4I%J_;fW%^B=F- zO~B?sqeH=Z*V4XW{*hIE;%nD2@sI&=Jej-B=nqz~_&#;*@-GS9;Bu+*CyaB16Le{p z&K*^$G;|m(j8iy8;zJPqX125u85HADYeng-ANpah%YVn!xE+tLz*~Gd|2;{sS_u#$yJ-|KPE@%m#EH3}=9jT=jw8gxF>++HADZ)_ zQoImxEAAvRuc?|pT?`Ofu~1U#VEA%C^7!6ehH4LdCK6>RRd9p%jBYUSdL4CWq_q$nyX`uuY&2 zBWS#2HAlLsRQYO+H;o*Y^uk^z?)ktH8@nQc*r^1ZKlH9AC6lmu0nyA?3?S?uC>u0pm^~KA?XF(F zK{2|}ykt_@2a?;U+pTi+wvuD>Qq;*tkicwr?lV~@!snWfd==Y8kdTwoHN%8NcmTLC z+FxztqPMd+xSJX*s{X15!&a{5my!^^JhR*N-YZ-v62QTl>AlhP$ z+Y~Ta|I`|iiW`*h*Wkx_I!N=BhNOvEe|UiJ?_!~XkpbLHh|-LU?#Ayw0L+gPZFpJT z0(`eG@qo-Q*&8p99Wv?JNq8T|2z30lu?IQ*tcYhBe}A>=aIlrDxEnJR7&|Es1|OBM zuPpe0%GG#aaZOH}|2T5;s;20htNGWv<#8`DXK51ijXF+F412l?2+T6 zuJ8G5R2tUhZQ{>%6Sae)X8X!+W`0#t96=&7iSK~V zMBWJp+}Q2uE5fk}!XAs*3DMG6H0a*NQO|eKHmO-{)@v|RaRWj6Z&C~dFcHkMgi;N4 z;i|vMttbK6B$jk+YEZ3GAl)4z0mXbu4LoT*=x4y7(LKCts3Os5JAWM=|MQ1r|DFn< zE`26P{jyirUZZ0qjixV;w(vQSTI~f|=%qQ&pAFtl9aqmhu`ZXB5qpAa&U+MwN#8(Ux08^{>}9kOj#5mBF9;wm~3GD2(!Sv zKdm=lGD=}$UeH}9YA^65vlS-GBc~|Fvqq?D?uLNXu#O(`Qw)#}lLa1T$625eynA8< zZw;aR!)1xqZldnX81b&E2W9v%-o=UWFx&qr$%VnJ@jW4v-%}R z&(>aUYqGKFzVYypI(f&wEjz-M{v`YE9HwC0Uxp*ogXUWop>FNwToDnGKE^h|^WB$| zsFw*zA$Q1d@aYf&A`)LAd?o5LIfKVpOm)i-%PpBCYeb_54|~A8(Iq<5>x{sEZr;h& z!!4Qr;I%kv%T*PDYFCAAs=_Q8Loh-&M^UI-vlvyqhzuA9&=PjaXJ0zQW`Fv~#S{40 zbi;e`;ONRIx12sXKA(SXg(Cbb~avfUBM?xP`T5>Ut)n`}{A3X+8 zi8LJ}cT6HG-u0=`gX`8~F0q&82h*={#ZjNXZTk(8uJ4Q(<@P^G@GgO`T-FT}Cjep$ z2CgU=p1ad*Ab}tmArqL4*d8yZn|s9QH&ZD?gkF%$VhA^m&Mun3G5O&s4S1p zi*9d@i2+G5v}f2l^84py-v7uAx*owkd$r(j*kStjxgMj2rNzNcSQ~@S}AXz{%l5+tP zBozXZljNLpK@o~rq&f@TyZh_z(|yMocibO$jN=alDc&{T73X}OXU=sb8%|S26@TTd z3(Ot1!}o*RHpI8#^Ub7SSaDuVZz@iYfnBgw$>4X7JwFJA6p5w``h}pld%ZLRrW@(R zwJr)yB(tmcYbSn`?x66#U5lVw+s|Se3N8AQsH?M2{%d?g04fAr<_zpzJpgz8{1V)L zYtBO^Os`I7FxA(w0QDyYI2Az`P_&*I0B_;fKKnWkZTR(#;gxfF3FCv~<{T|E+y##q zZT|Jii&u`cwL5DM*$spGmSKB=m}>cP+RNX0T}3A7gbEhBvybOC-@0)wo%4YA$s;mh z9p5)6nkUo<-5$`kxot z?vZ<>bo6o-N?Xv0YwDN~pZgL7Lqn7H%k~}$xs{d;tlTj5<%!Gr_hK~t-s$~&mqlv+ ziur+)KpW3qZJ#`HPHRJ7RQJ9d=Sl|H`uvv#KGx&|Sb?7R_4a3mQh#5{K7IE)Lh~N0 z1=%a6PEPBq0k~VnAblKg=qeR%VnUXZlBRA4fxXIP4`F%xZM1^P-I)^WhvM)E61nd~ z{f*9OHj|G%cX_y#a2F)Z#V}G0q3~nU2Tb)Vu%7>&Mzw+Of%AS)HOQ3F&~Y^jtA&m^ zS8&Fv-uf#>)VZAjGUO$KLpeKo!OP2SQol%NR!p}9kUG(*Sn7cH0wyyv(A z&g^zSvTxTf!&untv!O<=&m;$B31ZG`>3aXAT8>1H4($!72$u7~?fp&es1*`lmUcY`&^eV||va1Po{fyVm3A6PGIbsN~%%$8GIs8;%2uR>|?F$L}QtGAHHQSP+ zuZJK@)N?2Ac+{Z79-9*f6tRHXA$z{(f7KMi>nrd7Pz!83FWHu6C|m8fsd1}F7YN;4 zO9)a=q2?#zi%DofB{{|I$B_S4-%7k`$Kl}a-146V3krE@y1vkT2r(X;V z32cTB()ZjHMq|IJW-}Ild<*%M#cwzF93Y3FhEKb(nI}p8Ut|AM1)miq+~A(1hR*pw zn_0Z=u++@3Zk&1J^y3vxyoEKD#=nnl-q#+Z$o$Vgx5w7Y0weETxFP=0%Kn|sJYZvM zn^Cp4o;ZO2Cd(2gSY2$iN6!If-KUNN^zbaP%uGF0CHYN@iLqQyqKyNpWY1gPuhoOh zVznV()&kU_a5qNv@{aH4d~Z6yQd3K?^wGYUX7oTM!vnws*=+dRFTO{^`l#7gLKgSFd+n&tsP+4k!NBy;+CdLA5 zwfJg}O71W=q;@$82U+|B2Mgx?Rb^}cxm3}4@f&N*WZzs>MAYd;#Jc1OuP<_8(ehzM z`>nr}X~c{AzjowE+yU&(0&ji<`FC{&i-xS(EK4rZ`%Dc#8Wv!vS=)4%{U+RljF0Xh z=@|&ueq<#Gt4eD~i3;=Nh=kjLDisXQUD@}5DgvZGFTJ`MC@Wz87JZapA^^fq&tT#W zm3&&Iv)w)>$IR=03fb5sj&7Y8lVsMocLs+BfY&AVbH@m{p@@(d1|D<<_R9pB{o`ro_4$Zrc9Qf!4u9@CiS5kUX#-mrLpXWEO`$s<>#1vrG_hb9lgc9`d0i-b z=bD;UGmji#cY)}-((QgA3f0{+)KFO!%_++y$euAr{m_D2(Ytn<^Qj(P(3%aMOLO2F z5s~U!&u1X^7_zU%XpHPd;V!*r(h_mz@%}~y65UwQ{6Lp1w2uy6f!)v?>-y2I3&!X% za}1Tcm+t`aUlH$j`NAJbUi`5r7}yQF25c7QQOJo8|1e;kdHuJ_{%8pRRqY>smypo# z=gMy%jpHg>`Z+QazxNOnZpl1Se)Tx92e6|Ifq&;Vo5=M%xT%zDayD=ys7MMJTMU55 zk8Mj@w`lI=#x1YuOEoY7hB)G$kt^bFVXyA69P5ZJNNTQW4OOEHb#S0h;?mHXlJf3L za!9?z zmdpjyiO-sI0h!SJuVO*(fv&W3?&#roj5l{r8P2g^q&G#&Vf_}>wSfL z{N_~tRN zo#&SMxi%NZf_HOritMT7@Ikd8P_Tt%a$`uo_KnG4?X8S_58!T^xh9Wz92*fmSCs@B z>!$8^zH+jf=4|T&V#e=wT^+fdhZY`AUR@(xP3Q0hVXLGC&f5IFa^Qbo{E_#M|9x={ z;GsoRl$awwz0J@w(;v?=rFW9x|EOR#*4Dgnlr*|z1m_XO zpx}+Xw(E1zfT8*{;z*Nt3TO!cJ_U83`5pG2 z!E^Sp*jb71&)r+c@JvVBCrRFso%WKMQhsct^UuvB;!ubz(@^MQn8?(w^-&5b+df5v znAxAsz=~J8os424Do4+KYq5`d-IBEj_uP7&k^?sk@DyHq#Ew-@uHg&>%YxQfHbMCDt{a)zJ`PUK&IcwqOU zD#X)_M=hrPWlgyjiyHg2ar-%i&bPF2PUT?q1s2Wv5&nw+dOd6d(X}<4w@5g3cODhgG zS%gadvi?t!6_ZOjnIs2Ooxmw$3yJneo5J%~ARqI_dfE28$gFZ$5@Wd^6AQ zHD0ePWQ5#Cy2ff9vr5&c+>^q__MA#dGb~S9#%G=4;pb}iA0CBtRaw5AGdhTA+OeJd z(q^)J?nNpI#$?%MqgUIavz~(mp9CJ77^YFD@hL%LXlY})D{kN>#NTs$wvCcj!q>*k zF48e|F5(r2$tu?Ddl= zsLABxN(@io5vj2c4vwm<1pUkCNaBhnRJ3oExZ(+E4cjQ1m*^B~DtatUy&LEsc3c?I z;}=$s4Nib1i+Oxu?ij7G#hy2#>!F0*v181_Qc|t?e#eP|j?~(4_5G>2%Jm*fEj2Fd zsjKjI?8vc?anqYmvY)P}eH%;OdBH8N9eb5S`L&1RZE z#+;ljrzh+uJocRzy>?n^dW&*+LvKv+r;P`dxY^2EFM?=B_5la6*W9i*^fPP%X&#Jp zah<%o2(}xtV~BamZj@L_CFp7~1;P!oWz_;LZLkI$8swi2IPt>{w{Syo)uMyX%NJK8 zV-Gjwo;ll1ZDp{uffVSQ>lozlMl@63j~`pY&J38wYg*q~tc~hA%a6`pQg4wfhNsl+ zCw1ZwamnYTD(gluNQ~M|_lhY$NO^7Y^3A4w-94qdT+?&X>BM}PCTHX1ZRiD$@7FWu zS&xO0?Ty21o*+nbKqwyJXDW0fxgdR-(K}xa+=d@pl1a;W!{PRfYWJeJm>Z^ijwf7) zfU&9;yZMjy)siRY!7?qje)4gdtI}ZyF>zO5T7s4g785tlt-h%TI zx2Q!qp7|;tQlNA*Si=+U`}TaRR#vGm6-Vzm?C@zW(#oonpNUR-2u9K>OSmP=D#;p4@fx^u1+6`bhRR)iwYpj?OkAQFJUd>0w9Q1(D$mz$zW_F} z*W3S&xYM@WciJ}t47g+YPzi2cq_3XI+bhrRnRYwvJ8eppp6Mb=( zRl>4K0iG@|`WDU#iqTvCK>q8*)F5odNPf`Np)9;_m3vwJ?1!i#Zyb}3`MRkRpEw~h`kJk9j=`l?MrF&c>XhjV3yXGR1?o9TeEb~ca7ouy0 zoac5d_`VwTvvtdXN*NXzxi>mUKdIL}gLkN`LRP8A$+54?a6Xar<886DTF^9Vv*5#s z6i0c{%>kt7D46lOj vpX6wJUn@Aq5-ZP=JLzJJdnT1>xGhu9rZ&a9vt%l;s^siD zs^bV+QPxQXOJRO`%v*GOZTF_8I4wH|->|3~^-NmZRO!Y`eLzp$7XF?bLRKn&N z`ucL%xhyR!Cz?`MlrrsB^xwy8`E>GkTjn{jfJ$u7%(8ozEQBUGJ@#?*h+cnlzG%u72dYGn!HaIj5k|*7hnzi5Q zI7Hb_V}jMcnK~+VrkA>}86Q5qJJIqwAp+LObh(*!43?Xmec#_FC8QDU?(O9~;q=X? z4917?nieK#pN}vYMZ4930JLIS$i+U3G zfmg>WcRo%l8mt5CNYWiqy(7PHZP7&S{Cwde#rU8f8@Tl@X=!!7L{}uSD!Ch2hp-#= ztuc9>CDL9RtR=#l;nY`DmDnV?!2sELD5|0|D#$l1$XD;Qr-k_PIkHsx>DE+*%8ZbR z2y}GoT&9&|;o8A%CF&%DqfN2nek`6gmM|su1oSs>dM=F*nZD7P6Jsa{@s5jEGUp4u z#u6^>X(jePa6}%#*C&my{ozx7;Fcq@=-e;O+k?PPK$i415Mdak8#*}=iFD1X9dpAmVG^a7Kp zm3s0HDY(fcf#V%IBeyG$m{b4oG58+KaD}blkbYls12bq0*FQi}4EQs3K3CDG?BF1l zM;=|Cmh~5fXHqG)$=)XeE(p@sXgT0i~10&eP8xzv5GVBe8bF*l*QRZoW_b%W^8YAxYK15cOPrn7)SoKd{FEB#(~9xI*3&?4n_w!87aOlJ1~SjA zwGFJ8dpW>s*ih$EeyEXanW4P}S8v8&Wfw9zvx6JfQXVj2-lp#@NXtxxiK&Ul zIHD`C-;Miggy?jp7nzh5#TFN%rBr~YTIy8GWmr>Yx&8FsS96m^#ChP5#M#KXw#;GM z^5`pH|f}Sc!XJ@GvZhL zpI;&2)G6N&Z@Dp`4Q~)Vm>(1z0zIK_V1p1>i^=^Qe`!hgfEXtuKeH8No)%2cP$K7p z{zPW`QENdtyN?%V3qqvO)B=d3X?vtbo|S1aBsY`4s{$dBWnSjaQ|+NlDVBp)~}|CsqPj# zTG`ky>Kx-)SXwI5kNStiWucC?rb#J7l?sVm@Oq8pv4f(zz6b6*!bfOgt~xyCBj8hb z=XF_Q#>Ki=myi7|HL}Z@VGi)Orfn+neq2*=47kU(VEGx2{NcMqZB*0nfpENpUZcMp%m==MGq0rbU2xie+PHGNWEJ|f z@X<(a`k>F}kTWV;ZcE6Xd*Q4$33ykU;E$oo9fBAhy}7lON)CvRkEs+kckL5ob=hZ; z!!JSRTpp3OR_NrU-eA~q6xQx`F5@Gq4#JX~*zdNZ4nc%YE=O8?_5^>DD8<1Iq6J!M z{R+tv?Z>?Rx38x)?VvTYqmQm*gv5PS7aEC1w%M$Md8)LP^(J`1Ji#zR`ng2}zu9+c zw+(MdVaEd$WhrS$W{+nw120GT>kx{^yF0hK={Dsv{OSic@kNM8qibHhF`cJ<-1prG z*8biJpIE6OEP*Yd`?=wd*h=bE<^V11hIwz?Tb4&98 zU!a!?=-B)QJGa+ zQ9Z_MZAFpLMn!mP^nXh5e#U1{7=BmZgkVP9p!ocOBRUI5L-f+UnH~3j?NJ%~mvrhR zTV!pC>IZm&Va?xbM4A_O@``*k(3l>QYHeC3cCd1Wrv=enX3 zP^B$ipy;Y!#rbWmBd$EI+BE$**pH?z;UpT?828s5-8uC~py*yY3#+&63#)I7NH+^b zJFQ|pN;0DCZ`2cWmGb+~6`|SU@1F2sjvYFBdZzFCs5^aGu|L8g{#?Y}sh;vY(~S9K z%IL$|=VY(19)c%CVwkAI1ha^$!>t5APBp(Mt|<7`Xt)J7Knr72_bO&+aF$Eiu25H6 z|D4)5y`zgQ-4;uX4%yrhg6d!FGeNGHv{c$NE%WtVx?YOo@skCfRzCernkQfFgFnOE ze$w3cKCu^LMNC0jPqpD^_bzuH_$QeB7fpnWRI9ugI22l1yPq#VGu-Ckm5vT6sMVi~ zAx!b*QJ#wH9#p|0PFlOxX`OQEt96ZLuem_44@ho+T5}>EC^i$c+mXYJNtj=c{sV-; zpk|IyLr3}r1B3x`oe=^yc?F?3g_yZI*6-e!*10*KfmUnvxS*8DX9U3ovRu zX%+keViQG##52Ag!OCbzyrq6tW|CsY1x~_ua0o7v`n>X3S@NMjUlw6iM~-?mf?y9c zYNu7$+tI;df{uxfHvMW+0owdHpVA+&tKJ>uFawoult+}5h@|I5lZG&EEK@E!S|o}0 zJiFPDz_(efnYVn1+6B-+e`JS01H^cqWx)R+?#7h^N`kcGpoB%j9+}%I*-?Zg`>iKK z7zAky3w}pjf$iKW4x4b6`QA~r=ACG`M9$|A4xE&GM!2Kp%i9`>OZW&Rb^n*<8|f^M zn4e!*w4UP;D9(@W?H|Fnc)phO3-TGhG&7Pz^SjLWb;Nxb>|hgwynx~K%>QVy{935C zWcoFWGiO`WQ`)@q8G3nsIS1^wk7hS_7jvqstEHbK2xx@w*C@qT$-{CwEK}6%qqxr6 zsZ|d;?GyPnIUU{;)fCldhX0aW9959Xw_1q|gwhV7;amrqbsf?=L$dbTdy zcNTH)>e98sE76h^7mq%5esVzbUmRUecUw5F)BZ&C5R;!h%*exoIdAa#kr`&V<7<5C zp1h)F6UB8r;UNWz^Y#r6wuDApy@YLy+QL#hdwME7bku()!N10(1Z9)&CH)v48$nG) zTRP^6zRq?!R}T0vD32MlOPMZp(H_WqzRm~%r4!N*Y=uw5 za$C70}D~K98;vzWWa5 zq|ukrT;2{+Uu*PmRUhquEo}vBMR~EiJZTOD5OIUV`rpmrwk0y&h7-trnxxpuC#S1i4LdJ2>e19X42K{E;ss zmoy{ht(pp=7xImv{*W7>gLIEH&UQP8v50SmvNWKL)R$=|M^0ppv#$_ZI7&=xY;A6P z4_n6UMkDclwJ<(DJ|Yly5|G`>sKo^;sd%H^cD+yRB)R9i?8@hjMUGsEK*Ss3EqjUY zs68xno+w0&P6>G(Nk0ha8OR?(kNV}j1_ep{!zJAG88{P+uvElK&27bL6G6@@?Lpi0eS&-1qfg}5l^78S?&9J%0WK2Xyhn4>P3@p^uCMl#X&#yD_aqoH z^MFXTn>up*E+ufa5@FYdjwY&Y;bR-e9|pnF$jf8OjC=cm;ERaEhYb{DZzP1V!M-g| z0OwCwGn}o}!noE!J@zi>lsZ>w@4yd%ajBX6jQ7A7irX&KUHl8IVj{CD?Z0un-+kV2g zfeV{&j$!kss6A57tRWmaCc9Dlma%S25$%h+^}St?IsG855w>M${Nv;#A+Bv7#NrAH z995$+5wQ6j28bfbDhDWSPXeDbcO7=rZ)ni97kQCDP%_miiL7ht71^d?*>A5~zR}Pd zGFtUKD5$emBtfJtR_#H0lNKrmyiv_Nssf+M;-FeV@Zw&)^-ZT5Al7i7e3R@NFr3%_ zW}|LFc(zWSi*&UJiHo~Md@ks4%fo5L1|WguidApI7D;I$XT~ONvG) zuipZ!fY_9Gv?p!`(Z#v2Wo_M;BC5nzr=qOf3myUx*3*^H6@*Sk+6D|bVk(Y)ZuWM` zQhuWclw$Sg5AK_08ICw0_6z2H*F)=1!^M{#F=Coj6cILB{WBCL`WIYS6BF$jF_kfT zOwA+y0xM9cg?AQn_01b-fpx`~p`cuc!Pv!s-jC6QCEj7^K1*`(+%ki0>*RczAj3wF+agT@9bd9`aR{N5k=>BPrV**<#PA(8daO&oGa`#5P^7&7TG>xE5=c{a*y`@ zTmk-G;14@M9#ISUKwpiiN~;J~*(Zn&U%ew?)7<(F?>RvvVF^Gka%a>0=Aj&{`xE@0 zbCBy|wX2KwIQ*LJz)=-)k(SEH1h((6d$VCVeluG50~6fzX{I?$4thf2#3yQ74C zP7I#*Z3zj%`y%U21lZUL)(B6mozXF_Cwa&2**%kVdXBS*u6{+df2!l+NzFUl=ZT^n zW&`h~YYb%oLM=N!-`3x3fx62ybL=nMt;IMYETf!Ku2Xw}lOGsFTcMns;%({!4$a0v z4JF?*{@LD8q#J*dEt9`G(z=)Mc8z?IK$ln`K?=9o&wb6Xi-9vZ@TkrN!}EHcl=ctv zzw%G6de&U+&H!1!k3uBm`f0lng@1nlmcY$*E~6wNsJOWJdVA#3hM+?}lWrTAXrfsH zLlKI+=?2LL_b8(trx`Gf75t= zB^EE}3EIEK4j+{loYN?RElVn+TVT@72v$Ba=0vk~0LM?SJn{ba*CCisCaWqphoV?d zic=)mO2Rt>Jj??!J>g0(!EZOFHIYI-I7Drnm%(I;Joj>g} z!pnD;@_0=aC##4Luls{Iqo@4&9Y`lxa~91WacTGTKw z)X=2Dg<(1BaUj6Gp6a%$xJf$Q2o-^)mf?JlE8$^Z{9`W(Wy_g?RYwcn^#pS&g%TqUu#~qg)n%@Q{|z*_G+y>6v2?16&s#1) zWCDkI^X?sTHhT|)dga-lL(_wTtln)k2PqaL0s@uFzF0dkmqSs=kKPA_OS5l1$o%-D zVaBBsb<;~Tram%ATCzO9w7zZM^NT;DQk?lnH{KoCpjhTg(#*Si)4O!>#O;flt=rHTJguLwSv(gTbU+o$0J){o zMTDnL!{H`$UaQ))Epua~H;1I~F{gy(>NvHC%es)})z=FPFOV6#A$ONY$z`|q`gmu2 zY|w72z4axi$gLCv2t+eS`8y$l#wL}8X`~`G(BnGaa~acyx4<1(_wIcXxC9?1zh{DiQw8P%TCbvj$ZVN-DB^L}Fn=&?J%!5G@T-C)!{W|!Bsp6CHldx*nq1W<8- zE>>x$it6*ZVWx+W0TWbImBVbL-q){RvrzaSyGM(TZr#xA(7qQ9_lK+2wR;MVFh9NM zqXbU`U^bZrl$fU+$=zL{722zD<4!{WI1?@*bMEGH&~d>jK-s|qVq*vW_QtU_B9^|W z8O&I=G^F(5cR$N>VXR@Nw<|5%0j;=MHf}G9ni~q&*o!>Dqu`_X(JzOVMr*o1{*2Cz zD2>lJ!j$h(c|5FN>lp1&x1>rk;3(80>lTbgv#%$I1KO2Df0KHo z4u(;f*ytSIP{RUB&8m0UC}C2h@wnlJhiT|tPQ$)AD+Wx{Liv$S>e~P<$sAdATB)=A zk>c@+)xd2MDq-GY-GbfJnqF;`4a%~o{BA99@-*O6TI?6YxkjS`948~W1Iqn=Xoh?J z<0BL5&8vq3j)L)v5lbOU1V>SIJ<%OG#d`;bs9G^7 zVUXdil|*xM^A9Zzfc>Kp^Jc$bUVQ~iU!(eqEdPcZrAn-xEJ83;tAFE+; z4xavi+YdWVf>1}pz%N!G52l8GXkf9-d5FYzeF`sh)`Z*6gwUOPSfQt8QUir+$Lnc>A_0q`o(~LB|si?jP$&pBB63 z?GOV4;L&~8!vH$ZfO+=grZ7w15ngnZL0uGD2_bAnc!OYu^se*E&Cgy)S{{=z_R>+4 z=kB-IBuePzjUW}~u7}s_{0G>swT_KDL3OXZQMZ{V5 zebB?a%B{0-M##W`A=_r%u!Ql{*!A=SxI_<#sV+~VEQK)==aK|1O6k60YS|Ad0$ptF zgJJvy9(F@!o?rt;PL1kq3vPemHO1Fu3i6w$yX>egB6Rr!4=J1%QSVVT=lx5HdNsB# zPfAXhz~z!bBOsCoMW<`*_qnmr>}yumN>&3EcoR5C>oDrgk`%X zAkEZc8Hmm8S{q(Pz>MW3t~W1m1?eFca#G%#LNFZ)!LNt`_Fw@gAPBzp=$zt z@l(9C6w9Ta$-mw9Q6N|Iz~}8qngi*ordLSNb-ZnGs1%eLgaVHGqO|A7p+ur9Epot7 zZLXxj!}st>a5eA?86e9+Fm3U}+p8j1U#ror?+*gbD|5*<>FKA6(`s22EPi!nOC5XM zK$e^|{eb*lZ-t%KuW}hh~cYy-Occb?#YQ}vQT1fb{{;yIZ`!Ua*e7DoACEIdi z*z6@xbVyosu;CgO+}_oa`BL#>7NvKf9o~@{Z-P#lt_fp#(BNFrIdMRF+X^#S9_FnG z4V(JusP?l&w-)hgiO)>td8!lEm9j2>b*G{m_3&~KJ=$m88-|wozSiTU5mmoJ`8VE` zV8Kw>lR0jBqC1Oj^`D@Z*&dkU_p@HtM`L|=b|Sr>GxiWgAJw^^%aCJYW)VFI*kTJn zl>zz1CfdtYA|VclL;N-iKRpI6T_2ks2~utE6iWxL4$}MgZE7qmD3>}$0oDRMS_wX^ zX1PEyd}EoIKD_)rxT1k00ofsugRClA?JbSLGxCDF?uXcpWNNc;v=8S23dvr$cWYoY zdsXh}!tW2l)blL*(X@v92dyWrl;6sHJQhhN)G03>mAm(F{(e1h)zgBB;)_qBmv1Bi z*nlw%Uw^{Ifa3&))naX!_)5CnYv4@- zUAt(FC;+Oa75HOuutX(`fiyy|CPkO@l@P<$$VCQWA4JIyNS)3Cd8*=;@bBCyH4kMK zo(`;Tm%Vl=5BMS`jr>{Wl}i6EyD!=F^ypT>(`(uMj@jBjWqq{k>y7$us55b;JoYtC zHM(~x{dk7&>@!*~A5scb3!@dOhHzDybEd#ssr9G$cxu;j^7dt*?kLBcA`xs`r5~Ra zUx~#*ST{;K3fv5EJW&UWSzq#bD$Y*cz`XmtKTs{OEj%?v*vGxCw;p;(BkFQ^7EQ>@ zB?Q8fdRGh*;D)kyqqvM}(13dCIJ-%hQYYknXnnjTvh`FOu)RHBMZ_DA6=}7T>ey|+CUg~2IO!%}HDUv+Kk+Hh?w^kU8$S*Xv-Bm>FT<{S zx*gky?Mpl|q7grQ?AgXq^_@+CvX^3lh7#LCABS+uPd*ib|Fpexy2Y3Rb4Izh7L3MI z-30+fP!J?vIlLvNxBCC=vZbSv(Rd(YS@Wbg)H@vZp&_k+6=93`0K$sEnch2p+ z?)V}W0N)s!EVFMLSJL}qp!Q+8Guq#1tdPKMGhQnILkpm?LqX8>L`s3avGSO)gb1xj@kMV_@-2F z)Umn_Ha%WFlGng>mL6eSsM_?FxGlMk>sWSXiX1x!NU=uY&*^la+HktH$|!L$pw!S8v-4_0Z8fpMVoPL!u6e1g7$ zpK?rMhrg`{O;ptGirw!3Rq8cv5oC!|G_1W_#iOq8C3X5x5bliKO;n zb(fZH-*{AEo?X#<3kX@<@Pv@(D`IPXC}83lFmY$R)-V3ApY}WXM{q4W z!7M<>R@k_%oIbmpWw~QX-;V8KHG^R<%)p2Z?V9y#+xK;J)VpmDm+o1Mgo}>d^>IP1 zD8?3BuCS||+c!pXktZtg$@4e~uP^wqc(xS*Mx4_Cy1S1NL2%Jwo=N?1ehDV>sq&x9 zW@&?}eQNuKM%6yRpZ2x7(BB~771`(85C@qTg?(uf&9dZFC&0v?4IcaCM=Dis*ecvY zeeHPje4DTE=bwjfUzZ10#ysJz_GN1Rv2I3h$~3!E*8l-rN{!c%IkLK(dYABOy2G~< zNZBhfUZ`&8XAFeMSxG=quk2(9^euoM+i3k@%PS%KaqkU&Es5pv3I5tcs%6!7oZO>r z-}<%_f|P6ubI)T%Ts29H)%z1?6useLgz$})K7Vt$39_XDB$?Mt zrkfNIr?)k?u3Fz_haBjuG+eD#(mOl!F|5zmv(Mv=y1clG$iJ{KNunn@#L4b(bRYxF z4G{Q-PI(9}+fATO;XJ%v756XaLOP?68kRRMl@=(!9Lp^)w-EQF!KF3`n68#Z3Prh0 zQLsqx!0&N8r>mS25?wqk-sietmjH_~`7w6$Vo|V82gDL!w+i_LyM5vU?Ni-KKGCVb z%+7`;gaY|rTn+uD*MWocNej(y>6H)UtJ@_TPJ!F0b^B*d6mYFy%jL(_O|g-jw5OU4 z@^9+&K)53Z#w(3M7wKG+RvI7K{Gr_S8RzAskUAqutV%Taxt8x$+cAXq&j*D-ppjNO z-uOv&2=A9Q660asu}H}R@V5r;-=A6n5mYfKFMoS=oAmdy-o`_~zaJ!vR&B;aD9D=W<)pZr?|)bfbp&K)q>g4_4@T>-q} zBRNPZ=(s#d|6tMl$;;fe3`eV)@9k4==dD1$U2p^>NizTziY)aX8gJ}y>zjG^G4s-Z zcTw}hL`Pi6o>qSi$I{$T zN66`#5}$6l-h^~jmsQ^Cl02h{shw-^{1kCLROuKR5Tg)7C(wIr%ku8;Hs1qUV!?eg z5}gN&<^nK!zm0Ll!q55lfXxNjehRe)4NmGva@te|0g7(HkkCn=^??`=zbzfxLQ*h`tup%?TyoQ5ZWFho z#J>Q^0GY}IFrFQ8!e1se03{V1uZ!#$&5#Y3jxPN$ytluPeOCOyi#`r;I%84E$sGO$ zq?|^v-ZQlxkdyZy^a&UOZNK1-hASoBA5N9mP(iFvPK0Ey53&;}85;-w*uMnXK-jqX zA_{TQ8G1f!}yby=Lpx@k2JhC#jlzJe!h+3qD{2|?2$Z| zd5U?hJl_FoFAzj~d$-U$Wj7W{SiLWVZHldUc->fvRjskU8DL|)Bhg$I4>N3V;(d7V z?Pt$)ZQ4>-hgZFo0#Gqn-2|xs34rJOl$c0KS*3r*O~0F)ZfS$O(O)hmn*R+qdvse| z7EGG6TMb(1hoj%-h_^BxL<1p>X8s=s^^9Q<=0ghX=~X~wO#}Ibgn)KedxGHl!vrlM zAg7?e>~rmTDJha~P3Ko1xPU1Rh&LpZT3(I>3a*7&T3K;;HL3AJ2C!1kFVz(EmpiOf zs50WmVOp9G5_+5FIL<0rq)n?pP0_F6@orm!W;wB#t>!R^l9ACJQOP$!K|!LZm z+F&94QsiJ}y7438a(40wVr&c`+IAiugzB>e+DEg}8&NIAfNyq~rJ*H_rl5{DkV99P zcR92U0>kCd2VNc8Cn2OJrzf|KkWj;FXQlE0d%p&t(DM&Pd|AKxVDDKJocOT!R^H_@ zcZr7Q&sK7pfotbL`oYF#L!7Oq4f$Nd*EAu>tmfz)C9u)(rpSN}jDq(mB0vOmGk(tv zJw)DL1MPbQ3_t}2h7FPQ{J>-@2lT_DSE+!tiDo1Vsc#KUhHK_!?Z0i; z(~Q}GftZFVfr|R<@8vVP3NXH#N0{P0Vm}7?&6s^ZwkbufAXrXi?`U+6b$Z8kYSC|7 zGorby4~lK{?1_{@ltz|N!#;&zmIB-yEzya}5LD$O=Xhl%8VY)W0g{>wlP~Zvx3pwS zXwvLYU+)|~!ZKZX^96jg`qgfkRdCpN$M5bH#^@Pe&Uqxaaz6vdrsl!q2O zQ%*@6&=o(|mK43;n7-N(k9>9Gz+3sRNgx&r<^Y@>$XfXUw)bBwts-(9AP>9kW|^#! zjej2!@@O~I#O;1F^LjM~gSUzx?+BG*gbm_|kB%VOB>J{+uFF zhdTuqw5X(lC}*v>g)hRON4@DYS-z%U?>uQNX%QU3#>uEz)wPCY3>xMx6!E$%0i8#Ny#vK6_(&Q``=WGffD2KIg zO8z=8PC%jukdFY7Y5Kb+klf+b2a;^?m_}jHi80|kIML<1q;3zt!%&3R-iXtIuyh|F6EBPZzx=hJ z9%5M2fu!p{W>U!Yc~^)K(DJx6iU!KxBLQ09?__@;q{$%Z2ZX<-i|({aLa~vNs&akW zaHCXFFGfc9(Z~lKK-g00DCkOg?krfAN|AM+fNtl{@tRt#9@}oA%pl`w#E- zKe>(n#ku=eukZgp>%X|!|EK-+pB?M}r@=Gv4E}Xk0DJ)FSLAm&ZNb<7HiiGE?=C<0 z`R~cXiijE_gBd`Z+%SpS_`?3lzhHp~9<{a-I_M5CsRrGV#61eKS`zpKwTY|8NaTz%M4H0c2tBKgv|OyK1X z=2+j#27Uzim3xJN^vhECOEoSh$7VlBND{B_mFvzueW0e@7(urGeYPkB0H7cEYxj}P zh8vOIn?C?oc6Kq&TKSoy6x?cmd+{E9-MSy#!YXDbbUAu?mFgXSB0r~S^ zo4t0&U%;n-#>upL03xP=L#3GulT!dve$4r0OF{0*u~f)=#ah%8%%RLdO)v^@Kew`f z_mkNxXCtn=#ivKK?Ntq)k@S^tgNoQ)KG19gjQBuRwzLU|Pt#^7NZjS#Lx$O^IEqtq z5ea0#>oidXc^NaFbEUMWnG6L7tFp1;4&{5=Y6e8XL2AMWrzO#A(1VfddsI>zX;%ixW?f{Z zigL*+p0Ual$srH|Z7NA5i|u3IrjbRLvBXCF*H!X=K6CZgXT-P0xC2b6gj{N}yf=VY zI=uprC;#O+fT{s)&G_IA>u02U1dX_?a`7Nm!-Diwxoxg%eAJ7C`Ams>-)nj7j4&2= zLB#4-hm3&a*8lPx5Gw(DK93n9i=H-4N^hVIJ^f)t#0bB+D2D3SovItChv-QNd4-W%MM!FSR5&sR{i(@$OVS1|$l3HwWss-&XH)s)acB@~$B>sVSaqKTZ+3ZzBzc*X@^O1-ZR~<)o4w z%UU#OR4YiLL8)InGKck1->FCkmJ7e&wgEgej~qyczI8L&F+Awwy-7l9<(L2Y6B>yi zXbOm0xE&5Mbc^*1GC&+{q6jozmx-?bjBPr>uR)2q1u%&pFVNVT9nUq8e+!2+d9oh~KTVOqB?kLXh-pe7k zxePVQSFtgTjSFDv068E?F(%<77v;WZ!%<=hm`6O-EC1cd?8FQiMHOg%GM zxj{@omZxB_K`{kF90K~=g?Br&^T3VqVuBuy#;)DH&%D9DqKK>psYD8-_i7bc+hxUk zPLi^REw>Sp3my`F^HJU#V6>%eHTDS(Mu5IAo&Tkx9I)q)!1p4>M%u?ujf%rLckvwv z{#=>*v^c+f)PL366Ju^+L4u|STsx_l<7~CQD)#;>!-oE`9}2TSHLUDRmbccSr-z0F z^hyQ5pxrTS9LoTmI49!)SY!A|Ysb|GZZ2-OGhHuyozMfsTQEteQb8Zs;dW~$Co#EI z4iiKydLR#LC`b7txjmg8fX0G1uuMSW0n+KhRa~XTYJPB$-F1HLqV90Vb}Y>y?wNRI z_>5G)JrE8M!=*?RM~KzPS2eGso_A!(bjR}#+JGz=jSoxs;vc|{rtr=aL_(mV0m;y1 zxHr_(+!a0`^tifHQTrR%J^6~nK>}9G_Wxq;EyJSj-gaRN5fD%$l$4enBn1RSItHYh zLAtvcKv4ulK)SoTL28f~x;q4vl13P6$i48s|ND9N`|jh|ANS_q1HWNrR$c3g^E$7! zcAEL6n_NPI6U}+z>~e%%7R`GchBtmLYwKQ#fZz$}g5;!0jj>F*bHAA0ZGOHL!tzgm zXNZIT3h=97+is~awMGIPoM6^0PLLc1UFi%>{!w}S3NWY&#P_q;yC=c6Lc3m{53tr{ z9092-OyUjjr-)#Qeg>+t%oFwl@^i+eYDb?bh1gJIj;9iR4p9il%hjLr)o?DWJ|cu7 zUq}?f>0zl3&f##P6u5*09g*RMKr#;(nv~BKp_<{c>4$r;odeY~v?y;`@C~S%8=FF- zgkRDvzXFwspr#*m0|OQTr+{`}A=nui&EALecgH3{5jOz}<(N%y&6!KUqfi*CI{g8p zNVToi(m#WVg{9X35%2us8k-oV1}t!Hq9wxO{b;y%$1qTA?)xUj)=GhZ;XTr~%)-PZ z!5ls-nF^vy@)wV(2nrlE*J*4tB--Kg0Xpop*VMLhmke1tSV9Wi!`*tYR%c<}x2qu> zzOw1ag0GYclBh}{0OE*QEUvE>Aa;Dg#_OWAMMmDJ$nCNzAjuV3I{2bq8i6f?Xl=#w z{#CD#EcgWw1;l^d)bikFrpZrpvH^6Ob-Ig2SYs<43|0-A`ZK(2HRm~aZgY20V>~^waZJR4`qj)w@-2VWTh1Od8jinCI5j=h(4uJ-O$Xovz9ez2PhE`URI{1p)ZTsuBcWvktP zV{JEC(43pwGpaIP*LF|h%M0%W|A5XTX*EM<|!?U2T ze*#dlY`YCL%40l&b3DOOA1)5_8;gzAj~S_BFaRZ&dZV)JUFYY{(C35{m#3q;h$g3i zhoJHkxXluUve9L4#mui@InorMzISCkKZ3?uQ85|-=Kc92Sy;jC`KpBlHHHjZ^)4+b zDFpzl{mdp({p6WvjrDvkATJk^U$nL2A(2^kF?TC#Q5GX*g59y77-6<#-tE4CJoN0; z*vu@LvG|7&9I&Sm7DMHlw$ntzyOn5?E`R7~maa(_ZjU<=Bb zTHsuj^t^zut5K@{5mNQXn#MV?$E8@x;7y$2*@u8I-AT`HC5PW!&O&JcST4ZbSgN0(we~VrS681pdR88T2Js7^<{cdz9UmM)I%EP( z-bdyR1fDLRWdvR6IPAu)m4W(N^pQ^OuKU>?5TZORW-#sj@uTUw#Mou3@;Gf%8=tAw zRd4gx`gSS58aNT z&|h!nU-R%3=+>xHMC2$|KG=(i)esl;mJEx_OaVCQh?Uj%9XQE_p6Pmt4^I8aykfTO zn*&fSs-)P%tjSBABa)}s{e;^f;Zz?Gz7O|;)FBo?3_-d0O7_zk8_ZQU)!k;X%X!K2 z;Z}I^!Bi&vJwJfZkdkN?aX~loe4i=PHjfX#rXq_Fea;sk%C^ooLT zkN`q2Zx4*xb8~{?ux<6iIfAGVkk!9l4Y6pH_D*I+?(|7~R{9kQ0m15`w8}G>#ZDxi zM2IXxT+?W`%oJ>jd}qa!m&JLT@HyW> zT>a1B!Pz?mvtqUR?ZoRtp98-{m-;-rXg?rr5HAk^4L_^7KneP?kAd*8z&PANnceIyLW55Yc{?|%>Cf60mv$jHl|)=B!o%+ z{{0`<^dXQ)($%}2z2P$QM15zXGhF}Y3y1U9<=Kj*K_ILp;`7?)%S4}c1mXdBRfa#! zS@D~#-k&HD`Rlx#m0Y1J)<|FJD%4X(ZT~np(afNEYD|JMUhM?14>5eh!$(1Hk~Qqm zyNCW)3PrSN=9lOQSPmSXu{pV}tMu1IMU;$#b?+^Hd3wc}4Y>FITgs)bQV(f@%S?yf zS%Bke9LtWQ2ZpFfogZ~ZfP#95Q>g+1&^k1sOxmg7;7NDv!Q>h!p_dOy&ZZ$b2&C_h zT?Hiy;h_9^6acWjXD6pCLL1M7J~1dF)Tac4Ls&G5g`8jf0+m;@tu)zdqNlMoNVy4c z63^CDof%*@0kSqm@rRP`?pQ(w05XHKk?gPDw*fV#djo_T zf96O8aKr&5k=S@)68xZv4$UmPPv0yLYCwFi69-Vlaw)r(fidM{Lf4&hByc5(DtbX4 zNFtE6H32vhRQwTJwfxcoVxyz5KqDsGPD+PUvP4bf_LS4Ibj7ObI#&c_y>uAlG7D%7 zv;LVKjXD{GsX}ekr=KA0QYfZ!+3`%%F|TCWj(k zA)II5fYPz;Srlb__i^ed4+lCTCD}or=xOOjs!Cs$htovYCb-cgagi-tCS( zpMGMOdc#8vAJnn-C$d0z_6|;^&P8A#e{Ah=d_W{xa56se?ORZt^$0ZQg<}@mZfyK4 zIUTsm7@l$NI)+-%lJVhyGaveSNCiL&xsXo9m|TCtu??x?`OyixHP&oGfm`+~730 zeVw7TuH{`TAA7E+*+e7cRJe+Wc1}&OH8K&b$yoJHJ_yz=9rx9~ z&enDoGQ#$|3y1{Ko>#Mn3D5e|RDH!Afd7MTmbp*H=`@I+HU!M zj)i+$MhnxT_YXsq&c(}rYUID9mj$O500D>9tgOG|UKH`z|Khn%KWAN7DnfK{H7$s0 zCLO&B^S!$9A^y2(++dvl6S*TJGN=)_nFuNp$^=w~!aSu_@kE;Cza z^BK^@tnH*z;r-QwUT=j?{+ztgO|<((np25W(vFi${jS;WrZ+l;SXZJ_u4jMW&Gpo% zhK7ZOY&E#L#nU_OV*~DxUXJMmK~Rss1!D0IpDwXRUs&IBEy9Iy#GH@@MX1oKQ?-?ch9d6?`#d1QG z|7)@nMvskByIKv7eY0@2tAWtN$tTuANf3)2MK!4f+m0T_j{fv#a6PAAdw)9@gEj=$ zW@Cl}@g$)XqH~xA5qjx|I5U0swCFTHU-Na%x&4)oFY{gFLMw|`gSMIL#G}YWkB1%D z_*yE|sFhh0{CmC*dFV}J(MoFJ{;WZbt~yl&y-FeR+}+O%L)*Rb+liHE$9XSV+llGz zSRNR>IC~}$GV#vtsE??@)w7aDml(DnT^D>dQ?)alxtaHT#tHhxW_shL3lEH$A{(Cr zwnai89Ne48W@3Oys6#K(kM+jd5lbpH5G%7)tOm1w+G6s8LPK6WU)f$L&qT`&H4WJM zg)0rm{xc>>zN##2$I;p2ut5HS`o)+kE47Z#+SZ~1@|~ahko7_pPWrFLdq(~NMfq?3 z)V-O$-3lWY_DEnb=WQRAKZUdD*DD)baB`*&Z~qo+O{hfA`2PI*Bk7M2n-$_jTdtZ9 zCcYO;vbQHw?Y+4`{HtQhW{SbhAyu5FyVuL-Y@jKyOS48mQLjH%R%-orAIX_S_f+k| zhaEq(GA0UnX)9t^!lO4eG{Q9#BWHlnoGoQb#A9Bw9oQ+h%AQY}RtKY35~>gNw2PMQ zsv84wF#xuxfjSgbL5nlQq_zR=>pB8I7pIOat zVtD$Ij^sC?1(v87&t>2Z)&=~Dkmyr5#@#^wL*f4K@ICZiLkrlae-f>&HFtY?&Gz?`Z4m zJMeOd|8M%}!T~E58BG(Ji~RKXD&YB?plwlj5qcy0xnxalgmw9#XT$At`e$d#6L8$& zq>20elUcQbrX!hga8>f;;k(e4vNC~cNvut9d~bOqb)s;a9E zA1q;VXyv?6&Ob2JB-Dv#IpfT8K!Dvgjn(0rW0Y+#tAI4MLKGEE@;pLChwp9u%47sx zW$$CCq>!$tbh_h}%gzU@bm_GH?_C`k(Qt`}Oe?a*L8>`n=S*jc6x{25XK;Jj#0epj z{z*RAQ8uL3E_&47J1_?EGyW}NdE>6whw<}F9}lbhwbNcB*eZ1oi_ES1;sq?Q60scJ zSd4)4j^lgQA28JfM6aQ{icb7q(z_?6{lfQQA6>3o6PhaFe0MpgY4W% zhiNmPleO+yv(WcwFLxO^su<`CeY)>Rlu3}P}*p4O!>nhIs>{nO;wLBs&HK1 zL>eIA-n1+Fs+HPUo~oOJ+-to?ovp^H#z~>W%q&u1pJR9jk~(Qpc_y%(N2QgSR9fGd z_5a$OQKP?3cedQ|iMOzb+-y*HxIm)z(z|0+n%4;JBGaGM*2K9g*PVY4m3_2o1yuMc z;*-UN+T>&Awk&neEvduyAnEt;RJ$s5pqvV%@?AfW%<_>nI(sx&CURPR!ssJ8;Xol1 z=>7G-WMzk9;(Ot!Tb2pKsw{-g#P|l|-x(nE@2~dSw(-`Hj2Ef%DvMP(_eAZn&kE6=hK7ur_+pKpApUsPhSWN=jY@w zptOiXjJaaGa3P5@0bVA3u@Nc{SLL?*V=IFNyDe;3?J zt)_v>-cTyY&)*aBkSw!I3{;f%Lt7$NgAer#-zIYPBtSGKxtx3R9{QpbXG@?k&xoJj zvs`V&fsW92o~=BCVzT%sR^7Z{s95TwL~2Lllm216y1!7fEw%aOWNs}%eC<}8M2!yb zSDFmAur6DsXTKO@%c0M^v$Bf#0&LKpq4W-3{M?5c^Q2))zpXzF;qnU zo$t3Rg&HOEKSg@-)~Wk6P&_cJ$rmUgT}_W`T|21}Ys*iS#OXN2stywqioVmZ#p8rR z*1w^6`FJXOwCu`T=#^dTYkkfNsdDDr?>F{--i%!907{qQ7_ZQZq)d`h{bq}H7nb2= z4NAx+oZ*|>dPM(Lxx7UPDVneFq0wji^dO2k$5UtB-5r4{4TeHVuq|D#w`DE*w8lo{ z2yvGDW%!BB(B9d?S|-9bb`0?k(*o1w&qfPsaIXdhwSBeC!=2oH@9Yg z%2lA*y)!J6O`60uB|}R7r{L~Mk*1o|V@hFXh6Nm|RUG&`w7?3<_hb9FD-so}ELuVNF2~2eqLhiA1gaKv%x)8-s-d+gm2x&x#xf<_?(e3_Nd2r{22$R zO8IA@R#sNFylcy69XF5WNFcInnZhWoi6E7$%PIYa%Z}c!pK^NoH#RKuRZma4M?(@_ z%fg3;9k$T5J5&8Wuczy~R_&wWq-rYkV^hMl)YM$AT4)g@!hITCJg^U^>*bG}5dpD9 z=z?fc*E0`j$5BnL$RSEk0r*`Tb55)c=F4pdxL0{0n{y|bJsn>gEM7wqQ#8<{(^%FS zIzfY>cOug_bjV0rnryU>voJj6@9j%PU{UPro_C>In5^k8Zm-IX|J@;8f<3nR)Pj8O z;|R}j+sn)#Tw#aBg;YVeoxkBv071u&)4lmsnRj@=0mrM;yvW-_sz94sC*jqQ)de*G)| zp?lLe*VnHU>LPP*-8q(}BhXIk{P@(D&ZB`jS{5A+Jox{82X}l00m^j_#Q|iy+Ddvga!qa+1hH^4rcVm{T(3TnB92ne~2ff84R`w92{7 zQOXzz%pR*};6%&xyt&^jAd z#u_o*2@thh!$`b~2i@4Bb^P`}tA32Pw*?HSYM{n}i6{}lUuc-r*on#S4E4uCtne0l z*)D7_o#@U~4L3nIQ*?MKjEQ24l%u0R@K{`Lc+2sOSzz)#$fQLQZ%aH{3lrNqewwIV zA>u4pOZ6UYS@Wam?A^aZ-vR4og?NeAG%Ce(r0loFB+O$T+jPgo?EJoip{x@JtQx5s zmWo{?A^39#&CRB_lexG^fI*@GCSREGe1*N%;y~gN(N@FP1_^B!7al=Q$J*j3X}YaH z``E0U%<3E!6$L&0b8;N}Gu4UuQt+`^xRQ6sRu88Z=%}jo$Pj*b(SxX7eKWqg!k}Fd z_pFj@QOQY5vrpZmuG7i6Hcuxp^aMe`D`@#WGQ7kH{yr{`ELx1XJE>lPV8gT;0TP<2 zs-l9*$og3O{-82G9R20;MY|7vMLzwRnA_T)=W&p%8q{7H^(aYStq#Y6ZF^Zf{OYOr zSD?b66FS@qoolgfiB!Erl5L;lVdjRlL+v|*L08;!E3XfuQw7XJ$*iiJyG?gpqY*{do(CamX6DeQXi@{y5FB99lzRi#74e1@=4#{|ze z#jtV^zzyEOz1FOlSGET zFL%1#qg6SZXOL3&KR=b+#pT__`v3@vz7&1+N`D?T)~jLnqmj+rNB3AM1TQQQ0blVP z)niwMH9ljib69fi^8d58_HEW}hshk3nhJZWAdiI;2K=g^@8A9K<37LIW_kvW_T5wv zH~x}(H9Zs@o*!Fk+N=*@jonJp1#54tx&>6=k&&jJUUEt};9n*;HvT^U*=MGuI68t+ ze4NmxgIveoyb+LS3`OZltArhf`la`+dJI`nhrAKaWp2 z{xZ~VaKQfl7d-x-U%3AKjT@^tq7UwX-_^f4|Nr^;{x3`O#yj-uzyB3A_?zv&k?;}i z`Imq9&xhX${M)gA9>*TV{Vien=jpn$e>?flWBXG^G5OC#{a(X&h!86CYP_YtJgmLT{OQjqs!iIt!wrxDC`h1K>ROL`JcxJ|IS$) zi;9uYr9j;%zBW+YZ(dgD zkqxK$c!J%2v?+Ai^x@&(v5xh@iHM0;NCBC;eQ$X z)hYk|%|!_uzAiOw(qyTf>Fr+0Pf2n@R7r+bOV^R?i&@F*>COUnXpsa$4AHA|U+>Aa zSnm;Jb&^Z0CjbZ*m9F-wCD586%sGXDcUV}MxIJf;Eg9(MZM>Uebo+L@W5D+GHp^ES=+xb0 zXq4a-a)of9=I?}9;H|Q7Jo`vKy40x{4e#0(Ja*@&?+Q{eo9f!yB9~(ktZO@Jpdjul zJwLzYBu7^F;duM_I~Lz{v!o5^QvhPf#af%X%6Onmxb1L-jC)P-r>`SLNy@$Z>EXcC zUGVQw^}`s+NQ+E8t&Zg7E-k#hY1dsrhyZNk*1_o4{K%L)m<+=qv;l*ySbW!t=BcGM zLRMD)lkPpU>n|oE@(!YO9GlhP1>Ua#E%2zIw6#;a_3)KbuzJJK9pvqhNXC6dtJ=3@ zbBNjL!^;m+5)w$Je2tjI(sZ)jd9Qa)w$~lzRz_93hE!TJ#q6(IC2wDX^IXQs^I znt7KpJ&JnSth@J{$~PAo_Wq`!>(a+P2JVyZ??=ynia6h2(5!)CI<$sdcP~&op;X1^ zW<|DUPa9hqk_YAo6n_C_D2#-y? zxgGBGfLB@k##6$IgAl!r=r>+z2Wq5 zoT!m5WPlbO4kY^p{3NN=Zh3}h;Ki@M;v~-2ADcNUJWb@^lL*e;FA0t0P($=0uw~sTgyUOwE@tnOK0IgZkeIk#^#ODW>FP zXX&SJ&F-cbptX$}JoZMSMO#P+@ts^9a?N746{$#4rQP)I2h%i3s2K>l@-MYtv;S{E z2jP3=s^x9oAObgUMDA~cuz^AtzVpR5Dfc(}&=vFa;Bjx5vlC8QIIL<*Un7@8hb$I^ zZikyfDMG)2gM^E#zWc-BAkeJqs5s@*-NIR)d9vJ@zcz_G67SgTw%VpW3mc6EB$UDga8=66GqaHjh{QMp8QNZ6FU5MRNrhd|w-7QbahP_g zbA-(+;s;;f9UcAc&3AZrc3GKpOGl{LZLz5?6`xl6ko%>y!p^as)Vm<;Bjd9jjm;gr z)6M&|vO+)L=;(TS-sqrs98Xy1Wq@DX^tOp*Hs<-VZb5pBB`NxMyYCt?aNN)RIv4IL zntV9kIkW*jBXDXOHw37X9RC>nOc!ghHtGa1K(jOHk%gk`tgm2EX%6yFw{3k#OQgIJ zV|>R3DJFjE)`Z4r#zk$L{qrH!k@C%Vdkl}D$4{*9Yb|~?-}!2ec-}tdoZ8|Z8AQ>5 z_kB+^N@jtbMrY|^`at~?(a7G#oMM>|R8k+| zm~87X)07JPb8^zH!t0*8nVyh9>R^anS})&UM3H>7J+;!u>&nej$))GXWdJ#3M-S*X6OEUTLwLtk$oniq^v! z&#SYNAg#CHe=mezJt^p|DB!wHS6i!^&6-E3SPFh+wVu{BWeaen)wAMsVm|x8E!c3b zYroDOV2Bg^Iuh;AfC^?~m38BfO2vsWHCsC27DSnFm=T36l+9Nknvrg~8i|qRln7j; zN$^n$5=+*eoJz9mRZI^V@Dv_-RvImth5?C*e>_{EqpLRvU+{S#)Toz;*x4~#Ke{-( z5J^X!+WZ*kmRllRu5}Rn)l3S=*PI6PG4Y|@#Mqp6y?vp2KbyY_&~C5_AS|p+{1ATR z3*72sPgZX!EjQv>Y!Z<^Vd|o`5jp`jex+YyEBg-Vu2X9&tfPyV1I%{C2@6-BA9r1Y!GOJr_mYw;2*IW}`r2>IJI zRR8#AGiftQ;A$;y(Ww#@7TV%_6FDGv`dw?UF8<&>*Ez|XtwwzcX9x$c@>dPaxnIo* zv1rTDdb3=rs(P0vOkS~(nfOBEsgJJGbv!M;@Ouj=xGF6JxjhI|Qx64z5f`^66b7u8 z^_7~)B|ncqn6aC8gwv0m3^b5mqEu}qhWHLwlKxIL(WSn7-V_1iPRLw!!T@p9!&8A5 zhJn_^Pzq&YKImRPQ8ugXOh&$#efxvyxC6=*JL5b}FQxsE`%q8(&W9h+%BGFtG)z8w zi)hrX=>|Y5S<7dK)hX02FRyCNT1V*-))~ceT`bAJvWG&U&hq5m7Pb~D`uZ&*WVFxGwJPF?8|HfgS^rP>QV0O`))gOIKCdmGm&qE)7rDb)bwPIZO?9 z?MUzoj@7=@D)ZS|^WYvapHBedbCGT&4Fk5LOPI}u{)r>|VS}Bp>vIJd6vt$s@Z?~; z$~;h`!adyOwV$S_tF@c$wZFRxIyW8Db0*%S5vdoRMpA=WB&&_bX%YBAfq}BJ@&t!Z3Kd3-$G<=Cc>xhFyc=o( z1~YFP@aI?>{#v?Af+Y4sy+9>8oMHwy?Pjr#Jy-5k zhfY{owQ}XJ|L8BZ(C88%DJcOfs3x#$2F5bNTYE+pPz<6=^}V+;n45?0s}1&_zvd!c zjBamlUt@0X?9BZY`XM_zyQE~NSf>^w2yGV-#f60pwsZ9i&czXNL?s(_T88TGVvP|) zLvQr-^yK8gH7lf#AFpj}fD9!1_I&Io)6pDgJutnVo=7CJ=Sx^v*yO~7tFyCes%2^4 z4bUP`JsTG$Ndhji8X9gLU!D*Ii66}arq>W=>v*9?7&(7NVWHQ?Sblvs9P(KTXeWQkqa7_THQJ3sOz*n+op)P5 z_3%2^=0g{*j=~F@?wBdi=6bp8)}{fIpS!SQH6)TX(YG1{Y&o^s3JZ zx;{x0@-C{&EjQ2f4s9N_2QjWSW;SSa#Y+{ zjtjmCB>@RZDi}=JmAgy95rJm0z0iffx8#8Z#Bx+Q6Dk)Xye)xq_T}E>D9L@Rz#d4a z9wy=W>*=buBxLBe+7D|TcX?nA4twC(4MSFsySh?mRPb%E-)=pc&4A zCXVIKY|cfpcjM|I%M@l9Cd;FBZHuK7Mfzb7*)tT)(EKhIipe>E`L_DNXn@oe=eNwT_N^ zMH9WnI?NfF+0)bGrM~&nm6a?RnK0Yxzw=uPieZ^g{1} z*f=x@xytG zpiSRHjUM5+etbba#-rj448&+7@vG$zYK!otkl*4Ig=W~|Bht!EhdVB0eX zP+3_+74w~~?EWG6p#|jnvs1YP5#NFM-HQ>L@EU}0!obFAKF^Xs>p6`mkMjKb6@I{5 zF0fbwJE*9huIaH<`9MjPKrPf@)du%|hmMfVo+#wg)+!ZrpVCnf>P6o3EMU>F8yg$b zZSWcGUkXg@43CJ2^$V}r+(u)3AtE9=_^ubqUZH5!JRT0Frmu3gFNw2-rW41(MgN^% zU@!4MV>Lz`92|^nyyKCwO8Z=ymiCnS$U=LyFpX8QtZPqO|FzzS(iQrDx?Fn713L%1 z`Q+rJOwN#g!PA8kHg2K?W_%<`K<-vH|1Uq2u)}$j6_806idiO=oU#U>cqs@8vwlvt zNO8fUqocL8wXLzUv$D9wQ1tx+#H@}*fuSW<_7cuj|4bc`6w#h#c9~epVvT6?Q|@;`N)c zsg@Ar@4lK0$W=nk7b<>*PU)J~V3$kMF~u;dmwBm_R=7vc6>Tuswgp||_l4UyC5HYW zK%U0gxkxr_W50K(RCpKg+N$0zc#k%h?1^0cnf2n49p!}i#T;FH!c}{TSSU;P`*a-A z4zIQv)j(UlR!S`w^G&65-^4&?m>df?b-;%!8usxP|D+o^%M|gOzt*GmJzprr?$bD{ z$ynfFyx5OaA9W-K-}fj0(aEVuE}#jz-~$^B-5yY#I&?{#Ki{SW_j&P2@A*ydBGwh1 z#DL~U2P_cwI-9JoHhu5V3A_%-b9{i>S>Ce#ozcCMz_T~IDbBr4}M zr;zZubJKN%kh{_D9*XE8CDR%42^wSQj*-ZK%kjk)bpv^|nVU^Z-|}dE_NUcS&t@wH z%gG!_-y~)tpoK7d;GP*lWD1dT8rX1k35o2wY}`3DRaGx0A0`EP7z2IwKJ7Ios`Cpe z;G1n`y#Ha8i&M+0EX>1|#oWRdJ>Yfuz#FZQp7zUIEDmz}_U&j&HC4BbNg=2Ij}evb2O5%x%&j>tarVt;#n~<>L5Ai zdj^h+S;JLsG^hd8qSa5gP-@D`8JamPT%C7FRTUKnM@E$C2yCXx(o4b#fPf z3vvnyx#JEb^6ca!g#2>TS72E7N=p%tVJP}GINb%fKQ*gVN8jYc(k)(spK}+9#$gX#jJ}%^mxwHl-$7- z4oT~m`+XRzg)VX-Gg3_#X@Mb4?IODI{0w~5r3q%S_S4LR^FyVO znp(CG;z|!)1=lb?HeE8jmC^ifGg`=wLYCUrEL5C9Q%g@iemuFOz5UHQ(Mj1bB6{Uh zvY;;Tk!56L`aDwwJU%r^0o7e;#`f?951)pj&px@3oY;p5}KYtHFW;Rz2^Wp@m6oik7OZ~x>Q z+{xew0Z+-M!K>qq%}u-6n(e)%PV4VI(JY4t2S8QNRrP6zYNh;_ zWO<;})YWr}i*2l}lVV~_4Gmk>KYMt3_IShAn8!v(BOxWzRThs*<73!#z`K&cTdb_) z+N!FmCQ9^ll$6qc@+<(?RWc?zT1jR&T`a&D^6q$dLGh71aEIsWUCaiOe)Vg(y7Fq_ zABEh(z~G7ZgRB%Z5vux(+f7fReh;p5baZy2YDbl&C@3fh#H7L~$45s|DAbaOq-lSG zL>Lbj*P~!0*vNW%-Un++N21TICRi_j_4GZj)6~=q6whc2zz+xr7|jH`&^ULx)gNaX zQ`Ou&?>nF(-5J8a=XDXX5b*~C_K(CDEL4=%_mMQ$qnEoQ545t5Nl#sNmzFY%iz!G+ zH^3i-g@xJK$fD!b{={joD)Zrtu`$*6DuVVuZ-{t+O~t~@+}heYm049?&Bn@_kdL-J z^VnUQe|s(&^816zRP)7!kzf_ofgRT>6mwe7htX)@tCspv_o!XL89hVGqPGUe3{ zXw{HyDFuymU*ZK+p^wfSiv>8_sPv~-bs*BN#Ng55qdQkWSAt7-EtJVbMSnv+eQI`~ z3A(y$X%0F(t1u2ebMK#@NA$f7*8y7L!54lK^42P*>E}5Td0m0F zgu%%7W`q9z5<^W^>U=lRCcQj0VW_yY*9$ZyzhiB@YwMdIld|i)l)#+sA4l0xZwq=O zYHa4(go(`=8qxAU`$)W~GBb^)5B>=K8ob-+7TP`hY_58p`on418RFvAX>B(0)XhyQ ze$dp**_jn0)derEo|c7y5>|{9A*obrEG$F%U}7>gqceLU?-i=9?JR+{5L9Xhku6v(CG=CfO$MIF|k$JsR~-r)KVU+iJ^DMU=naw$nb3!7ngVw z1I{S@+iVGsg2cg9N$P(RD9Fj<+GuJsa&s9U8=06O|7)GbhKIE(P5T#-!RzxsfBx(c z2|npKiXf}$5&61{R@*J!0o^eP&Ru&-^}_xgg75$^h!0JuaJV1c12S_w{QdhoD884M z7w^v|C;6E3bGWB8&`?@hPc8(xxud9@E>2x|XL0Y}cjte-%JS@4AcFh(bI=~Hcg6a~ z25rq|2>+fa6tIU9d864g+Tk2`1b!BE$_M*^d9LGlcyZ;k5>4D21I28JSWjzv4k*!HW$2h*RtNevM8_Ms6!(7#4D?(Y7?`N992(+iDaipr`ENh5 zJmMnMpcoBprUyzw#jVW~v&JB@{l|d?PU1(jK%t=8KMhybtB53^1(qG6=2#}-^o)#{ znEvK?39t6|PRb**s-`^A$%042)@Z;dx>R}X`x(nSp zb-q(U9nsK{UQw{IoPVRG4B$Eh?cI*BFE5_^ADd^5w+As%p~qa4QEX~B2;*MF1pnmk zP%mQyup+!YZPU|Q1_)qH&d$+J`KmoLj}znKvT`R8L40=eSvq;jw2X`ah`w%*(YWTk zJn5m(+@J&q0Er8T;oULb=!Me3;@f~J2EvK!_;$kq>_hZx=1XrG1%;d^j=u*eOv%@@ zod;8d&fR@Pvr|)37ZntX#2&Gwd7U0G3AI6Oi;1K0g2XeHm-$2{-@bj@h?bR+NtZLJ zx%>Gpt9Di1-XKl)Hrqd~$=KTEFK7^vlFHig>2P+$2viLE&claWCBvncR}M|DeqiEL z4#ACfeZk}Z@LCLuM#&$$T23eVP${1#-qH5H|A-#mKg~w(IG&iV_9Bt~*UJR@8qK0n5uGdOy7e?0 zInfL508cW-iH@pJ46>Rm8P0uj7L_Jap7+bL^SHx0-y0C7k6?$7eq5?x_JhnB2$>Ru zocvcyBWJ7gov0-NS^9v1m0PdTqdNoos59|iz1O{wBh)-dUIKoNpjl1y>US9%kzKv! z-$eyGAB#saBw9FSR!~&OuEvukeQ=l4%YNAr(TmPuHfyLZ;JdHwZl8`?X6vWw8-;qL z{-|-mZ(aU5bm-oIa+fTQ)4V z*!RjUCDzmVj5PFlS%`Jbyn%>V?2)88ZvBejIlm<^p??7c^qi&#>_E3#w*p!Z88ef* z_m{CC@nXE0GBIOa%>g^MFbgjbd|NnHs6VEawSiKJ@^DmtS#AHGsCg{B9~Y>r+w9Ls z=KvOTwJwT7-P8y_d5&N_pPnu5BQGqJNhX{}(KKwEhJ%ez8MB6h1+PYY#TrRb9Z-%e> zp5kluG3)6W0CwnodvnI*(04{B@|2TPfa!UVa0_WPTALCrEh-#}_JsT%fPuWSiASBi z&{%LpL}KkuJCeSmlTio|@&(^1X=*yJY=i*9KFMp^61|3ecMFgT8wVL<+Dt&!;y9*d=SkH4G&=IiD`)6*QiD zcz6i9?EtW5MdRi0etlP0m!uU!Rme)&VmQMfK5O6N9x6KOz|O^3UjBHJEW$5IQhy7iwe(GnW zhsVdiMTE?$vmzrOiFC}*r!>t0M^MXrm`3M^tW%sDc^?u5y-OwJ*$zn4T@|&pW)zIO zKk6P45=MdJ4!hL?BN*kVYRto74EZB<)4tp=Muns_0tJlKU~hAdQqo7L0m>+232=rE z0F*&&2f90uEQr3@(a|w8Gjo77k=GaN_o&j73kFi3JDX(dZk&=fN6{LGjkzvzMA}TX zw$quS{jr*?yqp}d{l-GH^YA@Ge?97}KikcPZ`KLi=E=Dbw}XE*t_Zq)BS#5$6Q|@w z0+=HjyD$R)u1)XzCO;kS@`0Pav``v}=VW}QWB2vd{_NuD8Dmf2;|(XY*Q#ag`K`Wj zZqb^=^Q03TNX1VsG85-_VvruvPuAxxRktF+nz1%oE%aRwiOUx96&~}ce57Ik?S)rc zWT&4;)>>o_+piXa;+M-yGXT;KCgCl|3e4EKMpz-%^k!Geu9Cf9f;}|49vm~bjw|4^ zwcLS=$6D1G&Ri1}Z{#QcSR{6bC&f$wWp-3V@7#N2V^@P$rPmO0>e_wbkQVQ8(1m4+ z7Q(0E0`G|y51}p)$meBKi#3mfyDx_^d9UDX(hTKMp`vqJVMbBfk!3WSHKDIkZP;Rik3dTl$Rb6sV|MY=jP_7 zmzByyjVrnSr7m1n8VL1i7;(U4kI?nNVF!rkrx&+SD{JoWcx>K!rx_qfTj5IY@4Iw_ z+Yl%QB+tCAEQI>pCu;3VfE-PwH#e)?8cmNPU9)Y7qR&B=;(eNuX zXc*h)?J5v)Q&lY~4y4Y5R(O+}AWluf7dDr%H38ic^ykpezy#}CRjQReWK2}Z5H=!e zoGdSojY=}|1G1n0li%V?VxgI%V}-RF<7r$*{Pa<Y_RCj(iKH9|!CT2_Me6 zbCA=;11rJ2EZ#GgNOs&icsam;ufvFgI;5K3-l_+Tow7e`q%P?)i4giTczi+vAiN`} zL%+i*ggm4EKO=p3nQJ$GyV~Cr?5@YmAH#WITjhQPkB@dnmDNdoQFG80!Z^r8x(vIj zjjECowOgB1!e{HZAQt3{S2Ce!A+!?(wD!l^VzPzZz)NdweOw`mA&XSUuibE)8f&GFhervg^2O_hcUY&$Otz38>pI0^4hK*Zg3 z_dq`$?}$k605Hx)Ak8(Top%4oe=)4;G>WWsaY6vPPCwN^GY73}MN7`B?* zc@fuXVoWs&Hhp8L9EI3xcEo5w5Era!LVhU3%HV3xS|A)lPC=nY%Sgm!1TLEA7RTwd zl|0y1L*vJr{{<7{kXN1zQSLyCCF9F{t8 zJqfxugKbECHz(NW`$=5PM}~)|_t{nTjcsh8Ch2}AZs%W2R)f2Gda$vv4fRGaaDJ4{ zDAA+nqh<4%nHd;9#Rw!MCZcY;qa>{Q@63GzM?_3J)8I(DZq?sE5R{1L?@&=v62&jC zs#^YyPm~rUPBZgrVsap}U(QJR%@1-5?!9NaqX!0uJ5Hpmg^DL*6~0=XrkbeeV0-b^pCGoGP>H0dptD>U(h{)LIK(Rb^efcAdpTMaP?%e$4b!S6qEk+~;#>CyU6+ z1%VTm<%d$PCrxsZvjWt#7hie8@2>w-)%J{JwldUv@^%`C5X6=-M}wjt;IRX z5DPYIdUoO1@uJ^w+EJNHPZ^b&o7=wM1iBCW2Rs`bi7%>zXjxgmdF#Iq; zSsK9)wq{uJF6fz=b1u~S$O|7RrVwwJe67=mzGtu3Kd~)UH+d=2@M86(jgSsUQ*UQ6 zI97bOvs+498evtoA_{K-j+wxM*;xYz{Gn7yz(Pd)OeU+WqhP_RJOe#*bDZJES{K zl=3MCfOaPb*5^8z7jp9Q;RlaQiqo9$W%2esu3~(Lw)lF7kcnR7pq0oozfNXXcyl8j zv}|%amsrxHEmN@{AJUAr8q?ee4L_8%vF%JY-Q7K}UZl9FDgq*%lc6J7!3@ImDZ_3&!d|#9eJ2@oJ86~8kV5t`^ z?swm2-eS~LE?W;~IVzCp+nN*`ddU(V_M8j$aH=(lrAp(KqGDutcpAX@7i(iq1Iq#- z$Qlq+IMK!>-{q0AwFKA;lkMm#^@&?SJr?W52(R%tSqRscVwZ~I*x0_h8Zx6@zwWND zc#vm#NjFENTI3}$t=s)~@c17oeEcW@OC8Z`D zl|rC^_%oB_KM%0($S**H7+Yo{xu78IM#)pE^rE8fs=t*Go*QGOBF`T(={Bfuy6OYR zB1u|YZ0vv!NTOL=Utgb}|8~q4v0?DuWT7L*+uM6{b8~+pM<#*tZT3=sE}PyK^DmfV zo-5TCk(HzNzTR!G^#w!Uz`#V6brKZHkmPK|2cp#dq}<>LzF2s5H8p*c79ccX8^!Jz zvIE>b9_MSLB@A{hL&IU%?Phn20s^q2SgcG2ur;i$t?}@}2Xo~)Sj0PbNQ6%_#1=Z? zNAFow;w0(K;bu~Qp0Y#(y{tT~`!JD3w@6c6-Ob(oErNy%?J;-W(TT`dU0DISB&B+s zAf%9e-KjH#m_tBNP#-?T+ZZ~DNTYXNXJ7D2Nzd7y^C7J+_tp!aC2a2UBqol>=^AyN z*#{;1MlZj6Rswx##+8na4uR-b0S+*o*@1=oDC*HPg8{&I&dhNVgU}fNL<18CS}EJR z1)0foe4n%1C(_r0`tDUEW}4I&pPUJu&0rc6NrC} zwXEpYE<*Ke$(wSDogg}p(uAb(T>^c;0$Fc~l=K0|pKiN?7nVH8_=?Kg%8PlI)V7-| zg&%;cD&Rfa*K~R`m(=!R%5oCkoe;JJoO}z#en!DJ8*PO@oj&lb>)F8}2r!e)z{B!p zk@LPj0a-FN5xdbTVKCmN!**?UM|P?ZL(%eK9)mFl)e z*ajZO+^|dU=EQ^K!RJh!IqlfN&N2YW+cSvQge5&Ed)NA*Nf7W5!+sIz*!hZ#_O;#!BzJyyOVTP)_Y^3Qj^VTLsN+j zV}mVGkk9p2rv45ud!M4;w3E!LEG#Z2#>d}5HUTgFj%-PMSu~fPl`-)JTw#*>6_LB4 z;oMShT6w@A%%L08pOc?xRgrF5cU0G^LLp4$1IW>42RFbd z#)H0Pwv}QS0)o_$s?T&Naq_D{@|t1<5kA`o;NOo4>F;7>WQ+!opAQoK3iaJ=Xp3y9 z@BfgT*p$SL-YLPY8{Jyt^**gx-+Ewey#Y?t`t95HvvJc0u$YRCOrY%9QXCgGjg_0? zl~jQk8WFShcf9TG?Y{@-K$HLj_k8#9(dUEeR1A$bhjl^1=34cSwP!}(zT^iJX@rvt zMxjX0H+jh~aH^H(0lA%7_W-~e4bF|7eNVh&TnIDp0+_O#rCx3qOfKAjga>^CdxPB=s$v4@NQuV%D z0Lw{i9kp#5ee(kmMZ?C%1|plL?+Y6mPJvsf4D<*JeqSb#8%=Qa-DE}8AxIOEJaEOO z@Vf$+7Vt8t>t)L;=5s!K_KcohijlChSkX#d@Og}o=Mg}uS+J;s@f&mVe04@#Y;2I> zQ0H^ut@Ao7BGxM~mq7zfm3L6^NZz*QeF@%Q3=AOlxH?j#RR*gbJBg2tB_t*$1~SmK zzRf?$5F{`fl=9Hg1*!fdarS)=Edd>tr z3|K@#ZrgOdE9g6Uk=*5K4O!x-{rndd)dCU*0iAs#&pt|ktc;V*7SDW@y5L0|7c?>N zG!)W!Yon2T1SA=bFhMFVT+|P}agLC>wqyxrLSeekB0Y}z-s^aG35HhYhHs1+e~l}u z^BFIIfTTi@f3*OCycJ(w`?35qT1+Y6jte?)FaC?DPhMVmo-6~f?KnkK#H9BFc408u z;2hkhei7vQKVy)ZzvI&W=ghtzU_BX-Fx(GhsO|Yp^0a3>E1Da2XRozgOl%TF6`3NG zL5dzohFSz)WNusfvCQ?vW-;&9{8;5UV@bzmH0G=tHqXJAp7|RXx}~A&mg2lXeiO(k?uIeH<6$~MLPCqg4A6r}D0VmGe zg*cE{rITPp5^Pb@rj4coIdN)a54+!P_zkICz3Q0FNuR*Uhwe&$SuZUHx&IjxIEy&n z7YsbZE`Mr47;aG_-q|fsig{@-rSXpi%U^L59VM=Df+NH`PRfw$waOs(52UrlfPCn@ z1JJf*FI5jDN0p&LGCcL@B(yf$Fz!0$jRYY0d=Cy@CwhRJ#Js@^(%>^!H~cu8uYSRs zRW$nC1JdN#1SUPPJ9gZ>zhykP>|BCC9az|aOvt+=$j-&nOvC#VlQ^8t7HVAZ$!*;i z16Vzw1=U1mPS{-hT7BRRzzn$qk-DsU5`sr1z<>fFz!efKdG^p0BNC`3nSf`R7D%_| zDan~{tiye5%ia$PCffc~0{Q457d`Z;G>G?wa3_qFG9(jaOz|!MZ|f(hRM}_oe%V zN(wQitbyM6l{G=Un}LvQ99r#O*PKe2SgDY$@ELc;8NGNACcxHtV< z4BGUc<)FU{FaN8i5L3Q#?RSab?+VIa1%&?}Dh98X`(J8De;1?vA8J$Y{3`D3BD$VY3P5|wqAbx`{n<--2ZYo@bap5_J2M6@A}K%#ijqXoy+Bazx;o( z+<&a!&3M+v6kp2yx5o0cak{JN`u$~Yo9kh}Dq4jI;>xA9iv`LWA3v+bR`o}XACHiSoiQM|c*1@cdL`3I4Ll^LIRp*y2} zSC?(-4AE71+3AX6^WANR6a*{n`kBFk?`tljn6fg<+d)Yu+Xzhca-a?&c~_> z_^4>8tD-U*R*kdgRbnc%DT|_2rJ@`1$S*{Ng;YU3w*_qVyat`rH zDf7&0ngAH#tVR)UwIw)+UKi*E{ZkOqB3nbw=R;2AjHl-VIIgkD^|d_P6T+s7L`PH! z$r7wWE{J7`il(32yjUWp^{HtK4>=9xzdF4UK1+csRg3QzALlb? zi@5VB?-l-Zr4oB#=TUU&S{`m=$dO)q`i4*6vGeL~xP}PUC4q20>7W9Fwj+dy;1EYw zr`w(QqLAm*{Ou3lQ+(H5+?nq#@W|R{bcQ-pO3>x@RaeZ_MX2l>uEn=o8l)A5Lh6Lh zS8_g7FxlRpE{?vJI}`$|^xq^V<_jksPvu7REkvg8H72<(!u$IC8ZDP2%XG7hVzhgh zYg6}1((CoMSKsQ7M`i3*%sL?Z2%=R8V$@nq34JO^_^z1b+a6P|=|+HdKAV})os)b0 z>QPODT>&H$p&F~KO>NE-BXi~2f82*<5FY0;;=rKZOERk|fG{qJ^c{6Ol-~Rt+OZD~ zx2vavpbP9|#Dyrj9lV0~ZfJuYLRd^~ARFb3!~LfDu7CmjB2JIa(T&^Q7o8vVMDgqK z5{7N3-Z%LaJvOP(ZST^b)vV5+^fcMPNpyW~@pEO!m}u)Kqo__f<395x$Ly1!Es6$M zm7uEaO>;2}$X}Ycl_>4e?J1v4NB+Yfs6tpA2f+EsR>8`UX5NsAHuht-E51f6wH7(G2sz6(iY<;HoO#*uHLe<+Ne`0CT6 z{X&35&{D5&$XW>BYO0OV`LTr=w_9Ruk3(+V6E3qLjT79&ne(F)*A#!R8I6-Sp={)k z^BqTuX}#kWXJVf0q#StL7Kg{Zq-n_f6g)Fj)F*y_^vv`fGV)ba9AFjcye+GT<0B$V z6Zg2axed<6H+-r>G|Q~J%2EuwUBj!LMs#34vzpv6=O=&*$&SwoI@gE8TM)!@xu%r{$EAD!Ic$kZY zfyzBQMn1R`P_Jw^ePA~&wwJcs;`!cOwT0Kn=BSXR_0%B2+caUb);{j~pyesk*;-rkKT z^J(zI)1hgB8Gd)6YDbvug4=WlujjLqA1KCZOAV}IFeoIl_Qb)Ofh}NuLM-?oa3!hL zoOEt*1l&4o-^qDBDu%66aE=LcVo>n@iMqlSNmS%fabmL_uJgwE32Xk+Ht!8;#(_kA zE`xLb(#{lWz!9qEzOA1v-3xC!#kX^JKcYF%06-(WrOmb*mf-wjs)C$`daQ0Op7$Py zW=VeIYfhV2hfg_tHu=*51xth)ZBdO*V!^-rMXG-`w*u>xUPa8?S? z@w9SnXn#7_ln<*1>9c8jh;uuj`5ufiw83!cjC-R(okDEWbXUi%_GvydG%{9IN-CP$X`G5~ zi=-~EqPg0?_{VAH`>z3Lutromzdg;?*v3?5wL^o=2npZennv+x*@2GNq9?DTyv1U1 zbVv$fWipa|y>%rCe_*6Ncbu*wS$*RpsBF(0M!M^HBcWbc-9RQf5%biJe#G3t=jAq|E^x3tmoDAC0Sctj~M3n#_{@HWcz_}qMnZKT=!+v)wp zL8g;%y)nb(^&U#t7Jv9@-Sk&#{f9~EQDOlQ0I}{+JXWrU=FawFDm|S+?PA8&yHZi* zdf&2$blkMFW&Efz%Jyf`a0s7BU_ z9P`WfxCq)hF}n1RL%}hG-Cv<*ze3yEnY&%?_q+1sS8w)FFt~(sj_*%)#Q;F8@}6$> zoL!uz2fNhUVpZCVlW#dVa+F{86&V^}Os-2Jiqd@q?wlMJGj}jyYW-mJxUlVukWIH` z+QQN0+m6S`y-)48*jB{oG^hY!3Ng|5G8MUL(B&7mB~7h&FOY{Fm%Tow zaY`Nqvsx-wfnzyWsXWj_$d%Z&^-dTYA-y6`2t;#B z$HNtX^sdpjHGxcA7;Ei7j9=$#dm;M{7|7oM_jCyMqV2;=fk}Puywhj zIjfKes4o-*vBr&sw8eRm5$*Pgw9 ze_0J%y`wYtj#>nQ=hTJ+2v>?sD!%QV#{0NrLwtCm84OW@j-ErOB+Z5JwtY+}z&e(K4c zH|}5Hw_{y(-tm+vu(aqArvD_!&2NVqADnd{qxkhJf&urh^DFhe-%~Y1S;s?seXkxQ z#4aDyaj54`4Y6_gX@4CT_o_G0M+@}X)^H~?k|0^F+rF{SaG8;e?CLbz5rI++6(Qb? zJlvBpk@iby1~RhW&)Cgui>K3SFuq9Uaj8|BEIFAw`s?z7--SyabOyC>ml^kV_W&8F zO4Yh^{pu>;J_UA$mJ^?fovyLxY2-2<{(n75vddGS=ujD8q*!v;ChAuoqk;v{zj&=N zZ{P*)#f{C?iQ>xQ;_J5wZ%5MSeg6B}?f5YRhPt*OrXW89tf0s7AOEO&e23P6A;YP? z@1D%I_x4dwXAf;j=ErxVs9Nta-d>IyQ;ym;@V(?E&Qp<5&vD)1aQtpHGP9wncgKHW zrl!Aik9-=N?2%G9kwoqjlbp(uE_6A3FVCO+M7E6IvCLDM*@u` zFX?-OXb*t-ls9JC>2NQHD;4OcOr#ulj~5=>XAHODcTXlMQe4h|q?O0cDhvK;UH}{a zX&PuhZm@deayp>Jn5yf1JPh7ZG#qN@Yk#3YcJ+1B=7HU+fN%6DlRewU#s@L4>@SBU zy%h|lE>b+>>2E_BBt236cQ?=o%3)*|%6Gw_y*jrE1sPhg?;*i;r^A7*+#Bx3(L5L;#xZti0cja+NF3;t-LxrBH&~9}Hn%DW< zj<{i75s}irwsJqIYL&yNGHJCv&?H!glymi!*PobKP@e@P5e!Z~30V_KDeh5`O0?O( zfjP0rk&}w6xC#aTu3G5J+h2V@***GGCG}sL`P^Fgf1a_j1#uk^$5FW|epNMT?3CYTMkIQILr z*|PXAX1>NRAH`~;MVW*hW_VhjabC_-a|yoMyuZKZvNC4#b<4S~Pyg9$@7$KG({1MQA^@KsF#(CE#-d(-`V`DdKktx` zzBnfR07k83WoLu>+JRhSV`CaBs!pRaunGtlu+eESGJi(gewP-|^+*2F+9SY7=8P3J zb)TZH=gA<{f`y&VJYS!BzILj+e^$r5eTqKu7J6E~KI-LAp^9?h$SHz5u}K`!gEu$d zoaV^6oX*exlM^MEcAy5zA{#0P?B#tYQp`a6MvKY*v7XIkYXF4BY*W4#B1N)qX-w#j zu8y)a*qHahY~FHwiRH~WMm$9y^V@0xe9dVva+Fvw2ChR*G zHfG%79HO8T@Y-CzUy#Y=-9J?~E)roB<5b$BnvF1g!*V*XaCtQv4ge`9`89 zb@_{Y?_{$L&jP=Zm#e-<_|$sHxYG~ubd;2<40T_(w-1{Ky*x|u!#WmrMFIpLNvcZ1 zn2%{?;jY5lQ5@XX<8(1)mG`eH%VHZlY;AJ_wD?;7VT{qi=UqpvCzyHXc+lk>^iFbm z9;z$L1l2ERhG4}-deSvB&UA*G^lHyc_L;02yz(heeHnw!83A9@pNs$5!l6qxY?^F&dzE=NR_ z2iqAPriyS*T~k20C8cid@?eFqMY)B%>VE=kqEmRy(6g0>WR%G3sRQI}OiEQ%8a2x%Gbr&E35l z*!(I$EX<)+o2TaDQ@!2xzyd>1!mV3=&Dqfhu$5EisAG8l}RgLs1 zl&aD>{1R}M_y_Ht84P~`XkodeR8SOyD3qZw!fA%a;{ zO;mIUEK0t&{m8$0M(hspcwwzHKzi&00OPu4K0HJ zXI5`0&_%JNJZUNP?|C#;xfW7~h%FLq7*b#FXG`!lBzdPcw!F}pDg zHQ!$~rxKW2_mn|J%IGg2?W`FOlpk;q2Yo!cQHh4^Sv3+#dBvP1V6|+hDUf}$t=Og3 z0|NrWU%$Qu8h2;e?8d~#7Q59MB(V<9caCn=vF`u1oj#x-@f}}(`P5Ikl~`lGJ!JiJ zQoukL$O+OnJM%9x9;gy;Go_?Ff5`%u(Y#a@v`GJSo|DCHeRV4CW3;QH7+^d36Z!q? zq9bB-bK2A|eT3;=jK5|z>*-@>YljkDS;LMjf@YD)w>Zj;AM6lWaicdPSwstmaLZD8 z5U3C!7V)dn9`hJ6qF$XQM3qEp@1N(8Z_apo2b}2C<6(iF;fOcKwSu<71!nU4!N0zr+56) zZ(uRUo<8Y1mRCM|m@7B^@ZkFrC5~ueg9|y2HQ?M*Uc*D>c$EQN89X1gH`Ij?aRxpf zpcIEwnKt5%$fV9e^y!n-Mz`!^D%Fzl=j#!@&V<(#-0w7HEbH}1mpJWqjsqwEJI z@1#NVL5{;%_YpMMA~f>ILI8#Cg0topUBMz{)4E#polIx%wU@o2A7gqv?$;$SkEH|d z{-yFwQYBjsX6p;Fo=mRVEcd*21DpF2D|^Jm#AxJF&yEB|y=Ng~6~?)&pqH?g1_{75bsemczskYJv3(E(Pbsh-dI-v!d0F z<=O|O4&z9(t{Rb1AR5QjbXO+MWig_$gBShKrjy6^yi75YMgOq)Sv#0JH#di`VhY*| zi#(1&7*$MPQ>b-|NvvPc4^gzO`YzloOzn%2p7|-B?lpR6Q;8+FEBSFm!1&5MUD>%U zu}LZP69K{6i3blD(g15-=ePC+xBjd;#d6sA4o14tU(8$j4p#LRp&th0e0WMU>IKeA z)W96KE67uf{5~9ZO=0CzXRzl?E|Bg(#=kKR$_L8Q=;(93pnCBUXnsSl8jz{Yebl+n z0F}s;X`S1rm0V97Tk4!-=~MzocgG)VKr?%26PN%EhtiH1f%toP{erBZIWo@ zmG!D=)=50(bJzzxSo*CmAQXpakMlq;I2j@DM6Ygx(F%!&&9yv6QKR`S>`=9h?qbm_ zC7>Ral*oh9w(}ZD9DLI*I~{Pu=Dt(+qyn|U#|CV$`4;(2zpceZ5y1aqUc=a=m$Y$| zR-tX{jRQSjV=;Q;+1L5bxp`v!W=hoqbFj zkO8viLpt%GDu%1ws@9l1k6jZ~7M3Gpwbg>v>Ez*2B1Xey;jdq(-Vp%;Fxr3WqP|qk z%E}WI_o%8?ZTBI@#mpChcxmpdT&u?HZnZPpBY1HvV8U>@(;fJWC^^06OX< zRTfk;@VcW1Qqq#$$NAOERVeDLMGNCyR)rBgb78=Enlms1<^{%hf@Vlm(b9U1buv!{HUaI4FDO-+~0O{ z33j|ENF5Apy_Hn8u8dvovLQrENR%fhq-yD#| zxc6M67SJsW9tzH!K%!HzLG)yzju zD~ocMipq1h`qqKGw5?ssQUNB}M2)W1V9TYA=ruYo%^b&HjI5cm7d&IW_U`?aZO_HI z38Mu%%O}q>io=b1a4vSQRr*97(Qm86oSH6Wk4qOqfLSVFXb5cDd=_xQmSu0AS>GLAq+%4*rx4u$DQzboWURn*l(4J_nt$7rKL^wU>Tit_hLy z5gh8#?_H^e9(Zk}U|1l0!KqVjaR^WYW;XU`fr#%5z;ObQ4LDK08C?n)%ro?XKjuX- zk%|^WrX=*g9YQyH>-bV%{txHCd4lUR?fepw^3m#|O^G1iOH+BFD>N?zT^++wvhlQ3 z-yBfjyZPXQM-SfKPpamwoN#-Mn)~MM_+m7FI`H@}043nJdKkwfbjpa~vX4_$|B87_ z0mg&B7FBLZRoyey_5>VqoV`&{c*e8vNT5O8fFdrzkW zy3=_+V*CjTJpyuFx)hHyhmv@a;n+c)z(&A0y7K&;*PO{&ZR>$h2cjj>{2){4>IeUW zdjRA8DbNS*fl{pEOZNb*pR_!B_Ug#Idwg8BYnkB6x|)P%T`E4#Ud}bo@Hj{yCNl@egiw67{Ue@@Y&)Ad1}saXAi$XXa{DE7y*jdL^axMRSZ-K zjJdj(ybVitaTs>dbUbL~mvR3L(mtY$^n9hFDZ5uY<576}KFHG>yBPQungg+cG*eHn zm|g>)XmPLzmQUDCdA433yu}}4YQ;*{n6dQH4-g<9iG1HWSB9}^u!(hu&xJ^}O-fJn zgT^V6#;PK{63a|sRFe6D<+$@lz$)da@hh=Puj zvX>D(($T!55Y-q$OLw^|1Bk@blJ^c%J?YAUz|ObM`91x7p{)U1QRAuLZqMjXC;{Fj zYY$zg93I~4zeE@xNE=5#fRoiW(8^QdFGxRh#0LHw+kxFw>Lr1Y-a67GdqG8~6`hIk zFUsL@2*CU|?}q9*&}2mac41Hf2FG&RGy*Lt%IEH|YsQA&Z_iDI9QlmW`y_0wvk0d- zP=DWC-T*9L+)9w&Dy1G>20L4_UE^>rI*&INEL?PEOBzW(9D5;HsAYEFYNG6LD-<$P zoZmY6Hor(m3HoX-RaWc3reFVWK>iz{ZB8$eCR!Ydk;~bz+`<)Z)3wjp5dUIccF#TY z$>})in(5?O^jGA`N(1RnV~3G$*m-RAHOxI@f1-)-%U;k4mlEC=uwOXKV_)q?vcO1d z>HqRDv|B&;RO2N-7v3NtfZ{_pPbxPau5f3HUAIpN$1m5*nTHcCw3`rQEfSazN#Gc- zi|N+VMI*{_vhv;iN;Ph6iJ?mr9Vuu`gg^E+kTcaijMzlI=-zVKv1e_l;p08~*Ht`%jjYuQ^ilW;F;u%5 z8J>YM&tso^sed4djXebDsBbU=8w*)`OAPR|*FQV;Xp6G2DBOViW*ZMOTyfeEp6t9G z{sVRcAR41E;L{r~oT|nRM(wdmx?$+z*Urkuv%s~Ot9K{C?G!oYtM+DNyKKU(xq0XF zcykK%ft)`+nX@>bQ+a&8vB9XSt8yo^??oT0`ItH&9;7 z-NG=(%W9EJbTRM%gfHlE?vBrX{ZI(xFyKU53JWCV?$t=Zn(P`VDuq~0)-uO*(suwg zc{Iofk;Xaz0z*mkPmhHJ>}beGIfBRpph8LBTa=~G^%T7=yS#^B>^R1|$<4E3>h|Na zAMt{}ycT9`-VI08Jbb!~&7%9kdB25{F%G;xa#Iu_wT5KxC-8(*X)FwNhP^;TT}=n+ z&P@0xYdqrMTmx~IJod&~({EE`)`JfJCaL`X-6ngdD-=W-uu251U@KXnYpuXhD=$RM zI%lvvWvL&tptdWMMx@kxTi)rA0@mv~U*#CP7M{Q|Bm8&M0etYqa<~?9(8GK5)gTCL z4E7P9tF^!Ksn|S$;HLn^)9VCwXBehtl2WHba-Oc$a0gm0rZpWw9!f(?sE<0EkyED; z-`FOBY_Dd`9p-?W^jdJHS`9Tp!xCLK`$fa~4e_*zE9c&458lOT7s&~BA?ckmGpbf} z9h$WfF>wZZ^*3Z7KPyIlDT^!aVT(kSvH0iK3WaGo(3Ht|Lv({5`NfR+u1o|7#`iQx z@*c3S{3yRU+E>$!XE-AGQP-Pg;HOKr`Q6y5Ky`vY7alz-7kuur6*UWGmxt5C=?4$J zj*Id_PV5t&-W>-g*CSC`$DvfL=Hby8IgD#TrmwKGmqC`> z?wMy>cCM1Z4H~jq^ZJv4?e5$Fz(vgvsX+fZOl=Ui-H!xDAc#>6Anjzf5SBuRlz;^2 zkas)xTjbOYV=>AAZReMV#t9yL-{CckF(wH}Ai+)C1XG=6&w)e3%0;(g!pUK~pv5HE zHKA+5iql+W2UXCr==6j&8}@T~WSS|-mDO^f%oS*{Lld(_GClI5AU1b|G$N7!ELS&B zV&;PL)$~SP@_PdTUFwr|qXwdd;OsJXNsH$W?l$S1OpUBhwa6lN8i&O%rg!O3Lu=8Q zERhF-vSSY(R8X;lv<5D>MD*inrWoEV zhX`Qu*@TVH(jXBG4_4^;^|MnwQncMWDYYGHW_5?^zQ!}*8ET8n;R;Ff9Q^c9+1jpv zMg*;?1T)}2?FjEA^l2ruHFog+1H;jC39k=tX7xMPoR1lcj6O+m(}r!-<)q%Pa^kZA zR0qjqYvk_F=TTd_E3DR%13NdHJ}i-2Oyp~+JPzC9GxP7+zIA)MS1neFF4H)J(3xjoGBI%{>hatLQKKQ9G99#yRF z5kP;^PY-7T6-{jSR`y@99mwpZnGizYovP67-l$W(B}(p*>c*tFPtV0&{<7eBR(N%_ z0azV>TSc3og zRWe|c6dAC{L)xRdVLQEUJOSbBK<$DiGVv!IR_KCpgEIgd7N^~yBiTloRcYL*wWWja z5VBgR{P&Xw7ZX*wUK`@w_s^{+8)FXos*Ycz9Lul1Fmho@Y88)C#UReXVewPwRAGvs zwX1u$Ydzb7@{Z1}r97n;sa2V@C8eI5@^+1aCM8?ntto8EYCUJ(xlbO;XyppKXzVN` z-w0+|8X5xph-NRxI)wDahDx=Z>3I=Gkwg%A-UZYOjz^Bq0fqr zrkSFgl&=0TG(<+%Gpb|XQ_?{0m689EtR@mrD&Xz>Y{Y8M#E?JDbA`2I+<$0*EpZEn zJlLeK*>)N3{qiBn%I4UPcL|Oc=a}k&DoL`!j&p=F!IL?JuN1F1wRg8LDyHyPVNRKf z?hRR@I*g!iJe4WZgJvG06M5H{UpTo0u+S+Nmwlm`z|C{Ot$X*qc5YNRk(6I_NW|@_l7`{w z+JALw!kr@~z1Lo{%xjQdRqOR;?yj}-o2vCwdz_0pRNcr?C6g^1B>+(LQy_%GAC~n5 zWN&(sytf8f8e|30 z^yu%w-(d2y)dAo5ZnYNP`v~0Ev+Xv%l_!!rFVty*s<-7)?s49N^mDpaZ7tslL4-+v z#l4@ZdV47+?ix_2$Cl;KQU4FmD5I*~EGf%9jUTY+OIKseN z7(_laN^Ii%yZ3?ZV>xd8B?s9adI1U5HZoc=6L8F2p&V^uz|*i6(2&vv?Nr^t(;4uR zm|Qlv2gmJZ+r6gv50ZvdXL6iJ(?M+2c0czOuo1YR)tQSQfhM#q^5=py(29>57?8!5 zD(^fdovrT#@t)J8<*dX%&^Er5THGOz@ELQ^1-i|`BT?fZ;o6R zwTO&SP=b~=QHM!OoY%fY3P$F!@5U3!hTi&pVBean z*w+`+-#w(f2@K=rvTAp%av(S2naA|Y_cCCIN|izaWRUHGmDfZYO&mab%Z`k3T_8H7 z6cv4rejg;FU3K)za|D|@MhIoL4_U5YYcQwRY5AmV5?O@ z;2E{0X>We6?~p|D@ zOxB)=QuxGpvb=c4E}~6q=t~1q#Ue}62K;3`oR>Lz>}CtnEyLuT4%MJ3iS{e`AhQJU zU~{OgQlq|W5a`DbOx+m?lYi!or8X-i`upP~cJvlW3B>b+Vs};9WsmjRM!s%UzU`<{VLXYzo%lmt=mRbG_wnFaiDt zRer9fjU1rp>M*TeSWTuGP-1YSiJOvzKB(srut$J7TgSlZjTS^ztvTR^fhff>D;on_ z?mGi8T@3iTvR(|Xj~f5r1RSA|J0*FRI1eld)Px@@0nYv`X5-EhMI;+^)L>b_E}sSR z-U1X36m>iyY4x+0K(YZ*LIFu|5@zP0S7MAP{}%>xi?=ns+DXTGaWytfT=!!&H-;Ez z;##;NBy#Hgs;)+`+takaS6xB-u?Sg>E}XNQ8`>3W!p3L$9{}HvcDNLtbZ4h=J@eIV z4IbaGuO22J?=;x~MxXfBUW(U3r6&3CvY^nJ37;!xYTvTF*T1(Vm(Iy3xFsj!zqA%@ z{j@X~=ujXfB-zz%VsD=8E&Ri;^M?RibGU2`lYp_G)@Ys8i6+(!AGXL{4@2W=m(@f4 zyg0hOAK^a$dVTQ0J}EH!GTB>S*=vA=i%su`jey`ZVF^kKA>b(iff|y(ZcBv<5UTT# zTnVq*47hz0@E5a*lFHKQxXnx8-SEmSsh)5%*v-ENsGN97#J|XSl)N$zcmxuMC*RtM zV)UTM5=FP~!v%)iCefaX&!PUNgBA9;r2|K$w$ly#aFFjr+wj zJ|#xOU%)CT0`by1gnI`}IK;WxJo@zIr1Fj<3(iZqKt9Harb?BkoRvIVS1JHfp2Sw?jl9Yfxr;T8FRi8s=nbm_!@KWSnagVU8>I^h#icf8?jv!0q|HcQ^6FW+>^(&BWu>HgY(Jv z*e0F9Fere4g<%sb*{V1y1ClhGV6N1R*YY}Wi{wAQ#5lxgbvXm)ITTF3{f7-mX{=Ub zs-<6qM&zwfk(hK9@gq$I}my6AwP0NP_x zr3+ntO(iwjp>pov6VECD01!~dRV`i^j}_J>MR!Cgy43h2$IE(w58us8Tg#eQ zD_R%Hm{@19U;X^tEdb+52daZIW~!0|9PYg^nwO&MSPV~aM0JC|3J+dmP@sh3JIDp6`Lzze`5!9th*Ow8u|E?338fA#mT4}O0M)lmFP-)eipq0{`2sVSfJKH}n6CwH6XRhl~5+hV|Faj>Fc52Mc;^ z$)yrBK-eo0sCqW$`&2BG4dyIGRcDqewr?Pzm-nt0rc5s@Bjt_aW29u4qK}DXS7MF> zovL%QgW>bW}Q|(@yNwAe8e-_fUf4x@{F zPaZTzCd9o4NjLW`Tot>lK!*1E3V&KM?^mPOh|$8G;Kh;dCuzyGWBLqUFD~Vo7jC}t z>ioJQ`<`Nr8KUF;`#)N{KzaB=*qSh}65VNJ=RyE3#M2>XRE$E?8k{<>12Ib94tq`Q ze13Y?v^aQfkz@LqTQR~e=3YUSt>9BK0myOBQK`=%TbWLUT`=XqzzUlTo8$VjSo5p@ zF)=8881zjB6e;hpJH-1mO0&#U7K8^u+x(wfl#lMJAwFANJazr~!=WAJx+Um_Pw3r0 zsrJBJOk9k?1ldUOoGkf&%mf;+1{~z&unhd%D&tw!TcVz6TM#gwb&Hy*$7%0Psb?Sq zSv!@6mT+@|)be(Msi&_XMHdm1a>jO` zSx3#lpk*(>%`MLZ$HX=zq@)V$zUfC8ny8Lkye@th{&W<1>FRv=zv%5@>ChKjcH6i`|B6WD@;9hJ}QuwwV$n9$Gl62{eF-ZksS#_jJ zNscPYg5;QQq`6C{zK6D3yK(aqtI=ofNDz?4=s3|e4k-Um;-F7B!~GPYxrG{!IS@?u z3jhJX4++(0TXfypRR$?v8lVc4boBH=A3r`c*+e=@m@l&7$?Mae>fF4~4X#wVX&#J~ zFNsW7p~FP2?-XfPu`2hJk34zgA950s4^lgN3d4yLy1(C&;$RBsdE_6g;Y5OB^{w+Fv#MN5innog&eUd)ZIJ=W_khM{SXW1O(_~9ik^fcRcerIiAl4 zvO1kNXO|s6pq%3XhbWcOq>C!)L^gpOyfxIq=$PgXg4ydxFIBfOO{!;>)6EKxCmIkb^Eg*fi3bF8w%$t0z4ZxU z)YSBpMn1*S!DYOBrW?dPO-y1}yTqiykYEXrWb?Ea`<@4w@=#%U*wkxm1afg$oyInJ zFp)P()ym7%wx&j-n6}0~O^Jhz(ir$;j(ox|~ZK&Fy!W7YNl%DcqKKI?cu_*)t`&4Tp)E=~m}7 zko9vi9-Jlwd8@1(oyJ1=gwNJl#Vh4->zQ9ahbas+ad>p-cREi*;6GC6oO6k?1+kuV zHdV_@_zr;Rd&p%7L_iW5PCE+(YZL^9X9+(+4w99;$VH|fG%pV{>VWhN9-njg_BX}I zlDYPhL2J;D6ogVGA8~6j!mHoYAiQ>y%PA2{CfAg35vYbH8`1#5~U%c1etMotC7YGCec@prY$g>&0;? zg1HT6|Nn7P8H(HEG98T24{DOQZq|U}Nw>1|k>>igk?h^4A+)=S&c`Fcp#QX#1>vKJ zN=Bq*{J(>KRs!e@K>g4_onhJrPYpoW6bpW8F;8a6Dd%qn)Co1k*YRGO%@mY!?W& zCkuc&1(!XUYmc0P^?su}4!|LR0sVu$&wD*`&(Xc8RMEE>g8_=Nba4OxiHnJ$u#;%m zy~k$yS+{x|uzrvE0XIVGzd9QjZZO;Xf5A3@3Y^|tj}4ew2HhuMgC!SiY$l;}U^`io z{U`Nic8z_!z@sA#f4{2<_-E?>2xoSx+e`I`*XKCrk}*>#{B;2g;}Z;gw2Q283G(*? z?C{d11W^Cf>XEAviJrrb_F}j#E%3BS z<$;3(<&8c^a?mv z0bjoc;Awn|f%-gd2DDk)m0t0dVp9!%g#fmq))lmZ0cNzg;1vtR8}F-YKD{02f1U7s zR+cdY5W&7z0^(IJkrLIXPlY4RJBP)0NdO4~f>#{)XwF*^P<2oJ53K=$pc3HYfC@LF zR*T1UJY*@5OU~z5e_#X9VcJMCCa_y|+856b6J0Zyg4gfn@LuK*C9iYLfiuNBa9|O~Ly5Pk^+_%c~p+ zsesUY!UXXDzp!ZFp8mhwUo8a?QT$6i{>2#}`~vU)qd@ovFaPI*|7tD%_uu~e$^ZP@ zf1CWb{r}zM{};!SZk77KuK54^TU-CB-^Igq;`T!2K!fpS8_etBqhR#Eebj%D1#obF zJ#$nu%&;-cDBakkv#|V+u!UkxqtPWzdev`L#x~VVz-iemts z1J%@EKakS5{rBWD!bwCY4NE0M8a`3~X2l4%&J?FKp9aadtm$moO#Z)z@p%uHN@KXw zwWD@#2>CZ#^kvzcmybiGG1N0uauw(7b)=<*3UU=GhYLmL1S*T+(7U@vw6G@Y+lD+D z!x0kte_b!ALJ?I|j5wzrtKQABm~c$t#zlIqg!9>K;})f=`m5Fj?XDF~e|F(>9XCB% zH5DLT>3UlfQ&wocCPtO&ELVu;Lu2(+R0yx!=Ky)byC088Srpn%pPiWg9sI`qGtXh- z7mKXu*ZG2lXkKjzAP5dEsFg9)KIV&C?5oJen7Uz%5!{lQofs8KZo_=g%8GCzhA1x%);tE!m~NL?z+Kt?-gP=lJRQ_p1!1B^ z^JWMQhHP&tbKEGu9S81wpUt3-SJ*_4x-ZAt2&PebS0#`f0jy6%^BRBH^^*V6V!Bg8 z#n%UaJ=_BcOt7NqRotVZ}NxX$lXieadoRHZH4?w z*NLRV&zB0eaIVx|^huXAV=vR~45{)=gGH&$MW~Of<8L?~)aE>VJB*`(We2E3#hg&p zj<74Gwz;JBU*9+^po^BmH)g|$@0`O$M;RAk`1fS=$MQ!dWx=m0dSD}8^~Z>KtbFz$79JLuDI;WK_}F7K;tl^>(QuKbK$S(KDN;JDNu zZ6`yC0n#sv7D#!x3~l(;Bc09|)3Qh&dKH_y05NM}qLX6Yqz9?I{KTw*i!_IaG$*59 zMt44?|Id|$;(e#a#%;!JG_6_)N$yK_IluWDgo3uFBLnAqBGMJP4#(=K405TA)VqUc zw${XkW*WoG1M{|2WvQg=nA@uvIZSI%Bg7$m>b>DN~eJhs*2{%Fwygy0BJSZgC49 z8PIQFv)h(GEyN+iu6$?VKmq9_*0zurkd6>I&t+JWyt0kFn01sMtp}!-R6e>@lh(5? z{|38n@`aXsy>7G~g0Bf6&+jTSZZVjzEnn`xfsxiG-Jv!T*^RS19dmEotza=*_vFYu zFqOjQ$JUR~h<7dchPv(lH1+?1b?a{rGbmsXxWXJ&CudGgFLQwje^XI)%JG=+8{IB@ zK2)p(vEbHB(#kk>YQiIZ>D$#t*UE$Ew80`s+!M3uh|m0Z+{ZWaSTHMH9;m4Kluy-G zP5%5Bi@u1VVQV>7UD#+EDk`?)3Z3@HxO=*7^OVALtED(h&#rfd*|uPVz+~HPM|edV zyWd}V*=iqM*|?XL%@(Vh4yCEN2G0zYtch6%-E;;2D%SW!PCi~xkY$ZsN#>1>m(wQ} zxlw7BYv%?4Egjm2+eUK~rR^&J*{qMTLj{&dBD z2Bd}Bg++Thds&|H914b9Gf1`&vmbe0C=}uxrbT}6cIi9GrWWPeOB_Bnvd%7CZqkaZ zz2u*MQd8OWbQ8fnLDi-_qQ0;?QzleMp1C#pQgZpYrlaZZWWs~O-M*Nzh#nQrY)rRH3MoD+5V+z;C z;XLJ)fLaRcYh+O8@_>rUhH~NfwYvSB$|dewdC#Z)d)Q!{xFm>Fh^gMSh9}u+F|oxm zZs(rbD2ffc^4OVct6N6pcrZ&rX4x7dkal01Jlf^}5hsnI(Ty_|h}))l-@h4G&G65K zaL1-ysxOjVp|+*mP?hu=zLyvTI=WnBq-;jc3*VcL$3(g#(of9mOY0ggTU-4!_R$i? zDkDwl^%kk;7%huQ2*Rf)ui5M5lfK1sw2#0RJgW1a;%PkifKk-hAKpD{6JuzU#i>MA z=gOC3tRr|&V?;T(v(GhVs~+kp=W`m;k!0iPcF1Mr|0ItbQ(Wek)e_|G&5XB+gd2^77ivU)@=9(utfxHN{tK@B4;-atKrFOPG;wrBtx?YDGgp0z|Kj_ zrn`_9?`fey$6D(VAulPwN81l|#zz$`RC5F|G$?@1lwDmFgn(mg=hFoo&6ziS2`Sno7e>qa<_7r$M4% zFO`u?lb;;c$qaX~47U)0eN!c2Z8bVvAkSZmtn|68B_VR&gEwy{)FNTbQ72y_dt8ut zIQ9LGuQhI+$U{4ph-?BvP)Xq?2IYC~;=RJbH=Yw_lEdXDj;B(Qd?7h2*LT>J?s{R| z`X&5&4bMx`&h+CoY>@s=O z>|RI6k<80$_{WsW{Y>Ki)zMt3duLJGtH^(v-7_W4&mfuTz!q9GwDIcO-?&MiDL9Tb|itBFO z*#}?HC;w($Z<-Ol@w z`l1kCf{2mWRJzk<@+(U28Gtlr8_lLeg&Vu{f8+NnI+ZdsJW9Y*{rh#q&6@b>Sat)` zJXF1GD1m>wNjH(lU3rTlC(?mUaTOqDK0A)qIhmv^AR!&bJx z90(G#?!8v%qA0SYpvI@cx68rZrb1n2^sbe~=GfYIDqBGr-=;S?z8YL_Hr;JMTln0- z@oaYQrf?RpxvF9C=&yMSgDn?XR2LSTj#kf~aNR-qF7@Dp7k^H_k%g{iQcBXu-Y{uU z_k`D>60+V^HC!SXhjO+c&A9CuPc`zyTBu2ex}6(SOpAGbCw{!u3#%hQ6VRIu)&#sC zh?pfjSUR6S8Ob$0Y8A8LwwX0Ctt0J~C68@~#q2_3MBgH|`WSjOM{br1`nf(Y+O?Lh zRxI(Q&N~BYqS0i<>9eFrIFoQZhW%>dBjcT{}N5Dt-!@zI0@7w{^N<_G~$6`aQ zovjDhm4sJX^y=@KQ~8fh$+0|d$gu`X#Bk}B=)Q1%#dDG%+M;k@Q@r`s1>e?<%#+eD zi<0;Nq1KNIPU|~g58Y565eDv6ANll0z<=XDJUp~`G)1(z9W6I+&$uFmR?F1_Low#N zQ<_PsKO6QauR+~P#(vbgS>ObQlu2w2dR`Ms(x+Gs;bj_2UBC1B)5Un(OA zW{I^?Z#>{0BSVf&s~G`$auSw1yWEG<%~zPMCFR10Yr_qB7!%6^@SAZi=!xCD|ChB6 zmSvKcb<8ZabzCeHhf7DWh!l-~n$Fv3l5zyPyIU>Ak09CDW_L#SldlK+lwTYK?CPvW z8fy|!@qO}_7>tin4%FzK^lC#FBSTu4@s^tCy`OaP@abXwn|k+rCIE0q0zBw+y@B7= zgqIIIGaqkAp_THx!5Vgb^7-UEPQdGP=aR`43$TN`Lm-~0}A!x7TXwGATluTST+xT zThUS(M4mQH{N1fkfm&OOi_MB`6Qg8FZPdH1lh2U)ht(y^e6K4u7bgN%$7JdlDnTOa z(g-88SZS<6mOC=OTFek@IVvj|k{`?S zQX9hwaIcX+Gr!}u5h3GKxC4g*F@xi>jDf$TfF%YB(D$}}z==5umX0EmNaiM|#w|x1 zJhRL0$;xF<@=_488&QMgME$RwryL2P278Pjb-YOdk?dbrr>O% zLymoyNsAJjIT5qiz$NF>C11Dw?HsGxx=8V^1c!8fA#t3+EpDrhS53W?68D;DLM8&= z^_VBLQtvSAvWu6ib@m%|6E#=szT;!FqPJiM&tyRJAOO~yezzOGL2(uCw1FjSHG0W* zU7#nqsx&5Ug~l1H!iMnad*5UqCc6cm1dBY5Q^- z3j2aRz-A!DR_l!=On?aGZJ@5cs-j}ExKg7OB=!>k!{W{Hfh|!2zWQF!hK#=*o^AkQ ze0~x=jjp?S&;m%Rk=ylyXwcc!(ePp=rP<)thkW$eVvTr5vc@oXr*6qeyc9u|2ju6) zrszL^*4l23jZJnbo(_Vl1me4I&n8tZoMSIGLH(UUub=8rnGEpKuZG<>(7gp2b=I6Be{;DuVtq0TH`()UgWtvB$yrU8ar72t)R#2 z^eeSlo{NyHy=U6aj|LncS#vgp%)F+!u3Jd(PHv2?>ZVxZT0-x+pr0tQDDn3$=PsAB zsGXt4`XQ3vNKzb-BeAp}89GpaFRgnLV5up=_cm3JrEQJz1N9cT&RreeYR{Xl5}o&Z z=2p&S_c}U0gE3xe8=N2GY$fR$#3*2cF=i(JvhGud@d7D}oB1`Nvvh$d0W>DGdV`1j zr<&r|@yz(TJO=i2?8}{$%fpOz&rbpx@C6$kCvKY|{U$D}Tw`D+6ERTPw?_ICSl9U% zwdG6OfC?`jxKuZB|3J5yA}|as_MD-Tfl&>Qgv$F-rVrZnB|cQaj=N3(p2|y{TBTmn zr^{l%;UeRnQsx9UD|H@PY?br6_%MiS0U$kccMv~I-+a#9 zJl9FvDAsk$DY^^=cM=^wmE`6sl^f?HrFwGhS>8xqKMi|oR|Ai&gg*hnOr<&ukX`R* z*ihdQLg_M+o{D%HuDK1))$>`&v9nKWEup99P9M%=kS!}gz0|yk zHNPKle#^(D24NRS&$r59D~nxD0LNnv1N}x4wUBh?eFl+Ha#Pb)s6)W>rb9J@31;yP zf0-uQnVe4jOQ>+FAakZnb%WZ5@tfxHH69{Yb11X>)H&rOWaqFMd{mp`*~n&&kvW^4 zQAY1!Zi1xJJZ^_YvNCt_OmZeq;53Xe8+l2rfD`)5HtPZYu_S zFSRc?o}fWvWQ&(c&ik{PO*)-SsYK4U%Na4?mWa|lbI$VIscLXgAm`lFbB#@@0jKZQ z^4TYYWxwNA$~akS{LoFU*>2xT8tOiyEYss<+~W@y2Z^6Hlnht=I-1WXh}94gBd3|C(EC&R09y4I$mUI6qP>_BmKV)!%NpfyPH zR8C-!1M6O6K2P2bvdO_}1@(r6icXXE9{7#S_Fip$_t;3i9J=N+uCmZrdwhex)I{TclEK1LaH9{&jHFUXmoaGm)9ORzO-${L&lDc^M_h7n%_!72fQn{t zTzNAK&0RfDfJTD}4<8qAz_cp;u1=soUYq}k$C-25X1sJmr05g?9+v~be9&_D;$7*^ ztZz%&E}q}dCQqFYT!da(&!gvH$QQg$I}AdHWk=P%H}m*h#=zF!EzqY>OV8yep%brG zngb@Z*drpopr4tiz3^cv-7W|Qa6QPS-C`CJAm?9^WDE5WzL z^8I`#B$w%u7PCWcxc4HRWy>B>w)Wip;SLmi1C@ns4Su@ZS5BG-=9P~8WEj;pP=sS;Dmy&#qB7NnkHRl-V^wg5xHSE$#73BF<6sn<@4N_~76EBsP zu926{l@ZRBm2c3LDEz8@>X-B2>CoWJI%}dd`wABvIXy}dy5jvmoE$%zOI6>i&ixIL*=RoVkSLG;W)d~=zV4)xFY?+Y${Grtb9gJLM1 zUd|-eVld?8(ly+Ao6i^b9s-&PGVSYmg2=t&*>XP=y;PK!e$tfL((Dt`sG)_)+|P-C`aBi$Bpnk?_YI2v8&sX&zkl4G z6>Hu!ajp&zXd}*8)Su%+Uegp=+$<7|_x>43Ys@;@F zJiCl%8?9zEv6I9P3 zfo9>RS{!d&)jwgDH~;y~r9G!C(=DwJQ|V@q>b#08a|*1~ z$?RUQA{LqqMI21v2#wVMy9@WIEd}biT?Uq}R8KC-x4N#|837mk!wbu7xUuPH={=lu zdMu5DBZY%Iy{a~;s!4GDK;ZtQy(H*P_Y2&6=T_1$%R@PF4uA0 z0Q5t??U4X1X>=mB(UA9Wh2_4_WvSPUoWq3mXiC}g?ZQVw5_D>oA9vDeoUCl{pi~R1 z)Ph2i_E?OKjq5xUmlhdY%y26oys;H5O{Z&%fI~>i@Q+$K=#lLYuSYs`3-hCY3o*1grG{1NkwY1IW0JB|{^Uu1b z_|%4`g5CCqZ!Y_n`-AiEQGT1dPtTrL=cuy4jIg#g<0P}3N2?&pMe=8j`gCC7q*@1$ z5yGA$@%=R|q1+qnm~rgXFGI`9^))tNq(=s=mf&Vj;(tZVcSKA!lpl(7>w+sp5A~)2UvN|+FDpUQ z&{vZ1&+N6kA%M>F(2$bTB$5l0K%tPu-$->4+XWLyT%`0hqh;& z1%*?kMN2s)+NCe9y}kaZO5yv>3uXm;^1JO$Kg|&25j%pS%(J2{<>0gAtxn}_sFSb9 zwsb`3vno5J7@F`&E4YL~E?A~!g=ixmC7ya)72ZE3IX{*6D-y0b@=r-$hZ4;8NDb4$ zjQFIPZ_r_lFzSZ`R2W^flI17FG|rmoFp4KL?{&4gB7t4^AuuY3|A_vPQR9Q6GD#%>C+J;N1OQNoL& zeu4La;Y>(!BS?%9NH!REhi(`AcKa@~doDWrhIV^b+Iv^Y`xr@kXoUM{#Cu^oR*}1w zk^2WSXPiaZulw*TqnZ5<-F4GBI8z(ljqhq17p@(Smr9z57mil9xyjzw-<)k4IbW0IY+`*Wck~m^zdDD zrtJZtM6Iy$%kvVHoAMv->fMg*W@$AyY}QLK%q=bX2w+24dF|~(l8Y&@AJ@x?5QOks7If?!11m7Jl)E(=c-gM zr?eB^@h!9iKkt6e`ihKbVgg~q3b~Qwo|6N$&EgsrKlXb&%~dS%VNXQkU|{p`r*G1| zc2dLH((Sq5(YcgSVk*v3jEw}lzj~%b9K7M|7aoXdQ~B`eXkpnqA?>N$LPf4?xNl(w zelX%>EV--bpyR!zwIfB|&%xS&o92>A@LhevERBlTFZS$y2>R-x^@IVUf~HZIWQK4U z`_9}4`cdwh0tCE(H?NX>t=y**Q2`KPm^}DU@>&1O>zvy1;b*#-LjzYuh$m_hxMJyw!Fq57_l6nS_cxrKRj=*rDC0mxr&^{ISAEik1xy zF6H5MmV&;|%QcNqSBMq{Nq8&KMa%z3YjR1Xs9jd z$gQYK&1s4~G=%S?qFb+BaC}`t6&Z`oQ|HSsNtDs_mI#FgxPgS~yROH&MR2a&DSBH6 zF-%CiwXY8C?i*o>G1k=*o4_C&+XMyQA_evEgIb8YZuD)k7_^HUY_~ofvp%G3JUpHy z$DS<>fSPy-nR71hBsH$7bS(B>x1);uGfg-;|QiJF1o-O2ZgK7O5a z!r6GB#`3@%c2HhTD@kEy5?XEqKOptSMLjPGyTDDmbR2n}eG7B^we5n90&{du@pFe9 zi_GAs#ib+Xn{#t^OaM3X%zn-lT9Our+4*d#*zT*?5-&fLxR*H6yW{y-SXvl;FRL?a ztTBCHPP;5)=V}n#V22egA*5Ymy2tAXmAj%9`@Ww)h?&HTo+q82IWwsrvCUNV)`Q~H z%bk!2j}m~pme=l4EjJpvA&a;|Sdh$acVM~Z@vfVWlM`LLXITxHv(>hV=-_v?PIIkc zd!_DgKK+01J6bOUtd(7__lHIjCa+F%YFFTl2<1s$6vQnZdt|StmOS+jS5(~Rn;xjg z(uRAcM_O#0I9>p5fPM56*<_iz>KXJa?$0DVqAk;gMn){|o;@dXHYZ1$Av>0dnwav_ zW-sN{54o8n;jfX=l4-G`JBX-*(sux{j`SM~x|eq3&S?{}>|6ZvB;2-Yc*c&uQ>F|Z zEjwY*7bj0JTZ~nAQXlnv0Falk0bd6j7pB}&{LxcITU8;dxLZV@5?X`pPt%sU7}Ac%*;$CQl*LxK|U85~PZt6MIXM@1Hv2wB_*(`z@ru2G}KPHvbG}Bp12SGBM`if|Bn;h0#S54cTIm& zYlvo78Uco=-Fa9uji1~cj#i%arywoiK+a;SiC%#I)s_~M7BwkBs9qP;=d+IlHNJP+ zudf##@~VT~j>nH;hc(}MEC~KS-6D_*er=VRVDiedC;{LO&A^UJ^Ada_rhoJ}fdy>s{Y1h0y{6w(r-+i##m_y6KUoGM^p?FpJCiR(1CJ ze|XC!pHG0<<~p6aJ02bpnIFH6@XxyupszsbPC;bYevA$_a1bVEi5hHkg$}r*;^9q> zm&R!c87{|!$lum>IB(gxb)Z$V18-jC5R{VZJs$4RPCe^+0Ab z^HOzPdW(f`zJ&t4t)W+VTiY)1eLXoH;jAVUr|`!Ww3WKoH@-R`Lf_47EwCT{7IwEF z+|U7C!5C0WqmmpTzezMxB6%r*x|8p*`E)!7(8mq55{8cEUqzp{IkHm)X&(8~E|;^K zWUMl~;x=g6Qk%-aJt1#cF`ax^F}8$+@gHhqW~()!>d23*f``Bhcmw>}Ysy_)ON0NX z++g+Lp9%YrQ|{}Tnmi{}Z(i&Z%$lWbZd7+bAMgx(R<&N=p74xp<;BIa{)K*h%&FVP zF$7y=`Q{b7WaT*)d@Se*_&x&G8HD;&V4Qp3v@>`?k;}wP1icYw2If`p^4c(djqr9R-TRsw}^-o`Vv=E;iRWF9vVR*bJ{b-qT+|M+`-=*4V2FT z3z~b_5ye(UB6`Ii{s6BRdS)0 z37A1G4EZ=hmj5Ez(#>TZ@$B{6_XP@r=@UDrjKlu`{-R78^_+7S5^xKg=hjzY7+C;y z65Pxcx{lg8Q&`(mc{cv@Amxa=|1fhbdLgtBIg0*Bo76^2D(#Pc8$8e0v@e>hNO!Y5dj8BOf)_`%tq-H>{IU6ZA=v;Nn_+1Lt_Y)^1cH4+Twv z7oK5Kd-3w$UTmPgd6P4SaJWArmPo9ego!)+i-RN@Z6VaheSG@S8YgR0OXxi}iC;Db z4B2^?T4zWKwfm~o}|lY>vu z>L}diSoWg03bou#!Q4A)>XNQO(7H7Kk-}`4`Bea_-{`2P*PyX(;a#J-Mh!41D00(Y z6f5mtUI7I69q_dy`|$G!Otc&}I(@0E)J)|!F6<=rX7uBXv=ku*S;xC zrHTz;M}wnlLQgjHkn9VPIle6tQRfOjqC;HIe&`XK|6KaIWat-0g`YMkZ~s}%$B(0l zH{1>QT0EZ!6JA?beo>8WAg3w_0dhntvu}c)X;;_jDMIx&yfQjeO0Hlx_NTKG7jZW^ z??3MQKiM=ka;S0)?8p}JgMlgi>jS#P| zy{BVrtz%98UPc;$*YKf>dy`Drda@vjsFr_#Plb{&!WkfBef5eD=Xp;ymIZG+PLl1! zF-n=0Oh~w9881CG<+^tU60gNsFO%+ zAIeGJV49WDHx^TCFWl$-c#pZiD%AH^9tp4{;P@F=5?D@VYd-WHYb+cO2+McxHS$_o zcbMo4=n<0&9>g?}_zC|VR*c3)>8km~g>~zYb*rrY3vInvk`k16r{*z>?oEyC4zT?V zaz}Atu4f&@;c}{Jr>qWYPyj!wMF=@lDg|Vxj6SwVz>yqV!X0=4Z!|uuwfDa5!~d+9 z%=}=ERo3oKnB5$v)WgZsS;>>}6-&;hir-Gdjrz!YE+9Rq2XvZBUQc)KGFImJvS5)+ zNc+UXJz8o>#OL;Ri(6{5X(jM#antj;eRHGv4+k6fOvz6k8HWZ%UX-A{V>M3=J^%*A z4W+;1V)S=8kC?R}O;Mu2tO+ylcrsI9adp>~1VKGXjx6dkIg%~%3D(Phhyi}P7jgFl ze&ZtfGY&xBti+&3CEPR+}KGomyfdy99Uj% zK>O}VgUNXI|879*M?Hu)b zK9^dt8K+Vr+#@AfP|vx=8hojmo<-wndvS|6*Ot{NrGnD}4jTIw=v-W8j1DpKF~diAcpWUUjqI7HliW*3A9VKRD(|%_|MMP{5P+bX8V-!` z4PhIY{bnP835^IYE&kMWUxYzj&szsA`_p{Mg)_1BNL*h~?7XqySZNFAe8t?1zAK`; zZ}MDAYE6quJ@eemeXJebeGo9O-h4FhBtJD<-kV7`IZ(aW%R0D5cVE{HD9-NMJ~N%> zO)xHf%1$#W-1~gGu$_fsTky^^A!>1YgDZAb72600Y-*ILX=s9sK>705<+dGMK0UWV zWLTtkxSy8x$2fLe18u2~!Ptz#Ftz%%EhI`KakHFX1VHn{$+4GklN(L1lGl62aNNbI zcsdey{6fZdpUt7NTb_{=oIJxi2-|J_^seP&G{@ubXIEDhE-r|#J5Z#NPS72O6 z(+!ub&5B$jE~@N_7Lh_35jwXBv4cs%pXz&^^ARaOkKm zzEAa=j-GX$7Kf>6`yx2?2)G^_SGNJ7Y>o)N^2_e@7onEh#aqfjEkhIZ;;^t61cU`s zBvL=X@%e$<9!>d4#FB#pNJ8(w#jx>ZEmybxHb3!4(YR&q(gEyL2UYtQHC;v-i|*9$ zrMTNJFh?0t4+C{>lN^FLG22+ z-k61;9rT_JHRz09Vt}ZJcrKs60{YmAiZcNU1-(cFnBQTr(ARi*6%;62;((K24R+rJ z*5P;hhD5(fYR(v%P&r6ZFdoc1Lf$@zFfoX?EtR@1>fkMbJ=Rrlopbj1dRc=vDN~Nz(dDrodewhi|V-y{J z&nV_yV5H@8WzPy|S-&0X1L9urQGp^d;74O?tkIjQ5>=Tq37WLK2$b_!B)noiPuPOI zl*G`FnCXbhLtk}IYfB=Us@yB`^nSH>>Q3132t108SV#Z{*DLN8H!TuO->+iA=cYHN zC*HnuAK3hBD6DBmuxzgB=6z@Is#pybHv5pUMgH5umMxW#6$pk2zUKhlK~I-ke8l;c zj7Hw7n&mLaL}r^Alr9*_=N@vsqtuo8^1}Ct?3Oe+4y6yS-q14L2s#EX%rKLTh&f10 z8KAP$q(JBd!N5FWXKyK?+J+`+zGfy=^kF5Q0a1)U1`U&~P}(>ec;Wx@B?D)>l3Zb)I*`<*HiUBM!HhlZilW{k)bEUr1jWwfa~yno%!D3Ji+7< zS$xGr962ZG#HCWzVLlg^RIjSt1n0Tq5O{0pK{Q50uuK@Wfb)!TG%!R<$W%mHY?)?# zl(Ku2PE4wklBUzMUbl-qpQe=vRQ{=;ABSs>pqP%bQ^)iJT7wyv-8Zp+fGU`!YXp7l zklD!Chc91S@W)TIULdpp zbn2sLCbw+?0F3}02hxb-TToqK)aKwtp43#2)Zeh7mtd1LJj5$)fgZTpHxXX!FFthA3?-yfUo*1&WueUIyk$`GK zqdr{iVDpn~m)bEM;*y*-1+R4BPl;w{>^*6SHf(C{9nI;GgkoB{3qI@q@O+c`J9S__ z4X8C*C9=i)&BgpGj8myYG4$2taJnCOJ|oJjfCg`Q z4Mj97I-Hwvjc)jav)1a-0N`LmPcOJxuDSrid&;O^kAy$dsAgL~lD}Z^IU#D-8*DOM z9L8W75M?TAOyytb(V@$Yz*6M`N3^x|GOTxNY%y(a^r){WU|#pu@N)E&lAV}XnY(Yr zt*hO(-coU=ufOsE{FRB#%c5BkL*|HL!pL#j zzQg%dSv{Jy+PR6+r8yUvhpJA9>E%6J<-AbsB7Mnbt8ez=I^STB+FisZ+=i8HOT1~# zn%Y?3c@Z!BSkv}2V-KQnsP`-p`L3RxeMinr)l#A3zV+f)`$E-f+(&5tbeYz{%EM0A z_<{h&FCWB2oB0yiudPqfo>80Nv;qzvf7 zKN{#Lf7z@}cF)2nYQdk{xyNW4{|l+{n1 zVQfQNt{(px^J6|^pd^f}(l%HEEXmQ+V8+!W2W`vH&18=d_ zUD>Y}2Mmr!mc-}xGy}-V;9l?fpd_0R1~vFvJl7Su<>(^V+VlP7#?HjILw(~l2 z17qrZ72zu0-7|@0QM{lGWOlBlYMvC@RQw+p^_1Vw`RZQbqjtYeBKgGGi_sAl7WYg3 zdt6k%T|yxZxYrwE79~D&TMJ<%{j%a}d+xP% zA+8a;cHPia?Eh0LS-ZTTp_ndOV0iBggzKl+mQV%SXdog7fTH=wQ?FYv9^_p%-c6k1 z=$eg?GwVh-i{&}TX~+B;`<--1{j!cE^sl%7Z<_orcG3n#gg64ja51G8S(NpM#hKTC zDe)2e;7gPSLYzB{6IM-_l%Db1%yVJM&f`t!Xr^ss}UVoA3aSaRX%S z;7}t}Yl7sM4+OV-neRBILsf+*-gIgWKGs9-gJU@JAN>{p{pT)M_kQAQi@onfx^91B zxZ>YWzh8ymnc!_?8j0&toAG%=wnp1(bkc<6+hJYiABR@~B%OY#hQru85}V?yCizP> zB>s1P!;e-DWHQRmS>q;7*!>Mc6@XZV5 zTU)x#Elz`v@c7z}KEyHUGzw;tD1FES3uVmqNhP-Cem++ZPB1yIk4qiD8G(-YKEZ8K zQNw2$9T{>?F`lkl3trxGMYeQ4xySqGuS3&iW4*m$VOB9QCTgwa@cJ}Re z{qpMi>C?gZ_)CFRSBjG~H;uEy~5PtUJcFtunf}i5}EE!fz(z(C5o|K+j9n^Xp zazB%-&YCdKqCLl@w9LQA$|uCr#1Rl=|13gpKQSuH4&=If5gpu~9ajZ%-?Q!GsBge- z1^jP`Mgm0h9N3$t)X%sj)X&@`wr=C17;z{mLqA=#>XFb^fIG$lzf-V&>McLI`kT}g zg|3fM`ZF<=^|pl;*RMg&cyn=rkj5r*b09N7>16Hj~o}I%Vz`{MXhB!W!jzv z+qi~}4sMJccZYgKwYh1TjK?8?fjw6v1^&0M7y7!CVSjaUyyoV;<(m0EnY2_qS;ed}XAzp%Y|8r4fd7wuxjiV*KuJ>!pV5XkckOfe zdYScu?joN|@0Zz?Rpbd0p`ZXrV)xcwZkr18kYXWBm7s5SQo~a%_WOlkP7G7|+vxDb zu%i{b`zW3gHa0F9kN3neY}jBEfH4BRk%jX7>t;DymFjLoD%fPXh*|9}iuQSUe*wtT zKfhwfAzTc=i4}|faI9{=`p4)yr7mb$N3B~)e_U1Mq>&~04H+l#eYaIuZ=}l4dsy07 zn+JCK>|1?&iC6O|rO@0)TK$e^$d9a#`~9LDp3_UY1j4=U_X|`g6=u_W1I^!owXtMU zQ}okArT|>xVsAqw9`F-gh}U5f`^rmHo3IO(BG?8}(z<;i>?5IzPm^f)aX@nMO=Zcg zJJ;F2#nzp4>V~KOs?{Klgf(S&oQ`3Tj$xi|2ze0QOoo#i_oaa`u*FixbVVihcLpLu zp^@64mwrI#Luaq5#5U&v@(A(vu##CE_)2w0--T;hl=ppm+`h12C6K!TS-k6?VPlkf z3kvB7Uu{ETT~Fr5U1?>Vll!uI;C^LM<}b)8-GS`<%)=<6E#89fRYdsyvOw_7h@v@~ z-|?F+HKKCn#=#HEgoxqsSij4qz3311XazY-RldOc^}af2Zg(AB)2(_Dj%WxwBM8jl*U7_D-ucyoR> zfRb4)mOJz*?$D%0H!du#a4~GO3N+c4ZnLIkR5?q~$2QofJQ0T7xrUu85hlSbVcMwa zu+Do#W=gEQF`++jQ!lNV5DF|N5Y1YlU*BQ>@M>yWzG}X6(S!ygTJQhi>Mfw6?4q{e zM-fpF5D`#PLAtv^r5ouUy1N?%rMnxEl9q0euA#egKpb+&A^*ekyx)5N?^|n@t~Gj} z`HeciM9+dBH5L+K>BjCkemVc9oc@)ghT2*`K1;k!$vylr&X@EAEfdMvzR zXG0Yt7DCvoJs>S9dC|#DDISxT&pg1;T(^F>nQCU5^wSRKMhqHtlRPnxQDi)mN zpR(717f2yN^Sj05uD*q<`BM;Eo)Os-B1xy{tb%3u8Pi^l1de{4wTSvw(&`=BlTXYb zX}DWsKv|0H(jk($*6bQlV2Z>XF#t4{HnpXt1dB-k8M@a*WfP>JCaBHA2WROIiPrgO z+dw-g9Dm9f!e^D7t(o0jvt@f&{ZFquu!&m? z3a_S)zDz#@V{WxqDdVI2R}7Xzg`fvS&`lD>ganx3Vkpu zVOuVDqG%;jDs(s*);%U@eSko>@_+~kGzabKb}3r9n3O%fyXvm?3glWjwo<9>`E1*p z;p}_EC+>9d4>HAxBZ)Torv?txUqFY=U(yBVDXv4eHX9*!{Ikp=tw4(<-%>yB!LF7k zrp91%*JWgd;{PNWRWGnuigeRqbR*J`iF?0)CM1}*(T_zja-QCO5}3&GW)FHPQY>j> zB+OYVAua7@OesehO-QbzE}Bh;+=x8SuvL0cdbm%z+yA@i_VFe>+hR^$0;vC`2Dh zL2uzj-$0^=i7ohCr!uJ#GpX%&{Nys=pktZ;M(KGVeX^4HN-Qb$ae}4*W0QlhS00?} zy~v=d)Uw)r5ne(*I40|gQ1HG2FXCm@OgkF&VdN9~-!KlH>SyaZ48WD)OY69udSq%n z6>WGEROQPgXkRGFG$ApmmJt*Y>kFK=!hBQ54v$?%+ml^g{u02hzghD==WFvN$j?l@wTsKk5TGVb1!T(c+?J(^fF%?Rv3s{@I?X|b| z^KzFzhXZFZyau=X}^ zclNahbqVv@0#L9Vl7QYEkD4C0mJ+{`j-ZYPuZkkqMYi)B zqKUh*T<(Sv{<2Dn=0?WvwJ<5=0B!B1rARG)>x8NI-{$NaZbb{X7`86Qsf5-c&Roak zmDr$syt1A&O?sP6U17ZHb0aCWZQS|WdgNrChg9p~dBhDYxNGPIK3evit9j*Pu2)#b z?M{r1dLIEdY$9yMlhDg8^!2gQ6Q`yB!oSJJC!&;bT{N(Vx=0uW*hAsa%y>2V&r{+N zy?2RA4L!LZzK!WuA2oLYw^@nA4Q`h!^Y#e`aqK{#d7BwxRtt z{^59l0%l`8eMw7-y4gQ52`H4zCP}w7^iE2)9zdypRJHGw25kzC$`e;DdHKhrOjHj@ zfi5+ThAfCjI4S&1xj?MKQ`(=QFQ%V=*!ezoX}B)Fu4MXRJWeP@6(|QMiT9()yjN6U(^4RV^U)VyrK?EebS*5 zGocxE-Y@s1uc=SPPURB|2&slNBAyoXebyGqvlO^OFNr4hb9{x(4iL@aIW8wOM6H%N(kwGzJdbG-G0(Wzdy*ZE64mhf75Wq_m5QHe&ons&xEnp zamzR{^G9qAf*ci$JlUt+@WgG0p%KH>OmS{c2`=|ZCe<=(^Rxd%=pYg_pW@(!w?e9nY|% zP&i~o@lt1NkoPGfPPse@)powo=u45ssqK*Zua?lrAYic{r_;(z{ zlh4etOjU8draUYF)^m>e<%wB#eDBYWHxcsx3bQ^$FKVf?$(DbAwPzhjuiB}ax&bE!B-+KW{=+j&;vQi= z^dSyh{Ku~9DieB}nw_K8)Et^<5qRZ?C8B_MYu)2$DnDcxOkgcv_@%meMAAO${`7%x zUEQAUr$WKg-^*f)!{s)~_iV6h@Gfx;4S!VyaX}F89TB&RN$!Q{aF2403#TRcxhbmP}rj_fxdY|1HD>YwuOAn4F5 z*>v)5HvAS&#BZh{%T(C;I> zdzru8JyENXK(ih{S@>Gt^PpvCN!F-WMI`850KeUd&BjTIk+ZG1xptrhNX1iy)VV$L zO%Fv?XJo{B{7KzHQ>rkTIffO?I=xBK?@VB?kbP1B zy>DuT$&j@utQ!G78sV1WA#30r38KMV{%bUW?%24%51~P-3ZWa3_)+I_Uy`pn=0-+2 z$5;gCGRv1iX&X@gCTr^!3Zi;^Pa9H>vm%K)n#Rd($B1NBhA3b=05W9}b{pzusl;8c_dqPAf4{3V+vR;}U zNLel_T${sLR?aPC0=DnqKF_~5MuUYa%fXGffMM{;F~ zS57~vAOBV8jKVL&D!i^1s1dd$EuMJMsFqKu|2=!k;%N;1#0vp6_i4FV;zp;57p=Y; z^^Sr%r~k28D7Vdx6i-|1400edgPi=t5@BbVE%a111!X>j-UnYEZd&P9^@F-z6_O2n zfZw?D)#CR{_Ycbagc4yty@Bb5PxnOhJYU*wt5y}~E&f(;waV6u4=fN~ks59My*`}K zs&|LZGK5%IKv7!$K(2m z_wf5Wx6^T2X*F~{4z#NLR~_OJ3xH)>)TFs7lob2=ip!%ZTujW-r*K>~W?i%OM+_5- zWkX(jDPud+Fvt*ow0Q^q{cSf>yIpjrNh18HO3eL|nkWu2aH8Nq<0 zos@5p(mDww%nxs-aq+f-Pb!~(2CuaIzhtQ4QZvIXs;`IUlU-Ubf|@NH{ey>KZ-_92 zwZ2-}>-Equ8^y2b=iGT~QLN@aWiLHE_ON@nTl>?^zu>}#>NdXz-*(3IuOp18 z*e2`M`-^G;sbu&UDyyR$Q~<1YxvkH8xf|B4tQ}yF7fc!aEo34vt=+A?9xIFxOMVeY zWcL&D5c_zn<35kqY~mgs)}JK06G-7L=%w$8>u-togxh0;gPlyeQ{ujNVS(=;WYaNKDX6qjbCJ*A4?|2|BTqhBvg4;{!2 z{is3bB*?LaQ4zGT4`SP1h!VTU!saK!f#|ZZn7$+2h!*DSll;#aTv4qYK^)8&)Qp`q z$CDDb?-o8PIqklAy`yOfjKhG7it;TNg{C~e94WTbts+{ssGEx3KaEu4Ke)v#x%>(| z)LLcjikxl2MQ<@qw6Rr^bG{d#Hna6OrUQZj=Mg&*7^$pj%4P+VM*LN2Q#3i7b)256X-^w&m%U zM!k+nQyzk|%As1^L~)@~*00V+xsQiWgFMu*p;bLH*=y-|nRu8rZNKZ>JBD&uM%X@E z%wruh00FhhH!FKUIo@WNC6pYN*v^^BSU<{e@etYlHtkt)j`=|3b>u?o;=bwieWmTc zn(^5B?B<@4hm{2vB%fQXi0d(FeafFN=q}F@K&~+3?~%wBi`m`NB`&4lY8&P;y*wJY ztIMFj^chgFAL?f2)fk9$61q)O@z>Okp+zLUz`s17>acB+c=~b-FI}dF<;f67 zXSDerL7#}rfkB9U6rj3%4=!3xf=>9Do3ku~hEt;Rf= zA|!`8oj5BX{k|(d2dykd_xo19QS_P-YjogoDaiPnJ>Oin zL#mn73~7{8-N)biy&V~d>ju?x(J+t_kZfs^Ze6=oyN4SKA2X;)Ujj}&itHZ&xcWj< z$wc z7%GrJSQz<8v3pdCwVU5*e-y7w2i!$3_LrdXjC6ABYBMv5YuCMj*L08YT6hS;Y9C!O zV%joe+-HTdWMf5=N1&KA1dX|va$>CLXBio|*XKxln*|G$k6VyTRF(>sOO6Oh@W(o2 zSpVf_K`aP;HjN2HnLmmmPAS_(;D3n^Gu|Ff>{#==)7;F=XVN0RpHy zvRZX7|MHTDu6XY?z@TM4rj!tcOi2&5kOB0OO1(8rJ-=x?J< zn!52fTQ2(&`PT-K{)Njw$5|@M>SCR=2^%=$(6Dn#B43R7Fr}_OK4t*Q2w>}hZ1e(Q z2_fJ7BTpEnSV!$77tfdoUEx&(qW?a)n&N(fG97}Iljo!Y+-l7$srcMF*&(_sD|jNf z?aL@NQ})le#gcnpE#4%E&(CbUES~CK<|9@T2GfdQ*FD8+KpPF!M>IE`J>PX1X59?rb3?ad$X*O z8`Smknd^cs;;Sc`*`RE*E!j1!8~dh#LGB}+*HLN*B^!+XpBQ0;lUKS;YX!g%Vh z&6O-66tB*j4xv?gPbsd*iB))}1(aPH^qQj7s^dIlFxBT)UW>0Vw@V{I=TRh`< zLN6`8Va1`9)Sn>5^uJP~S`okTo7*-keZPk{P&|jd(JW_)sLBk1Zm%atq2}R6KBKj`ISO0um8TAH*9kT;#?Q>bDZCQ~kXF0fv z%Y?BNAP22gf<=$5pdvj_T)Vsn}neHKo;H?#%9Yd#QfDlV!PYPP&96D2pvkLs)N z;m_(MzN~vfF*eIP7YPzC%W-S!sfHM4na6+>NwR5;`b3 z>ISjNH7RL^{ixYbq~oGIf0)|bp>=Jv(7Ei|Yof30cvZ#P`Asz^K`w46gIy5CiDE;> z>6qu?mw(Qve`dYWdDO8eU~BAMXr^D*;FMo!QTfY~gNQvnc7ZJE3#Qk?9@)Y^-n1k0 z_x>4b$I{~428ap>X`b!+U|nFPE2H3YtP;kfNf0&I|L3&t=YD-Ya$r~a^lhf`i6_vf z{^r@?=?%eMEauq(n$;DD*u`!ubnpzz6@U8nNI5scd!+WC;4nW5kMriCyl%+VJM4SZ z&Lg!3GfQ{ANdT>A;=hi|<4p~{hnt1G-jsX=lTLkkeK=f+_Rcgp0Q`%R*HFRBeoEXf zrmfC<)tMhqopIq6Q}PBppiSuMwhG;5l1dk%cfNi!v(^bk^UZnO($ zhz}Z2|Fm6Oc-l+UbL;}#&g;$je;-2wC&@p-f#Ha`K{-II?&d6 zv8)aqW`^*_yP5?`AO@0Fdj;eUKoWGdW}R>TZLFG})1k21wcNo|>ws|feV` z$B{I*mL1f9hCGVo`HIx(!rJ|m)@>SOlwC^ExZ4p*aGQd#_lm_s2k*Hb)Jegl9nk}CzkJAu!;Fn zC490*-T-Z@!1PN*@Sj~>50g&Z34I<48nAkKAZk|1|CX7#RwFfiOoq2DOgBxX>E#)C z5L7j&myp{pQGLsAQ2MSNUha;k=O~5xMzlrqo6c*G4D&ggpUHClf1Jw|i(;b(GAMBP zfq(iRY3FssLme#bVqw1=9`EQi@TIcZqv4p~nCJoBY!#r|1=`&_lRAS<7ehQpv0zUp zDbz!{=9kU4(i-$nOYh{zH#g39;~1O&Qp%w#&eL8GjOoOV%thOt=(wstsd82R0*zY+ z-w^h5=-FJ;aL(_0G*E*!u-t@|K6I9xI~1y7E$vJ)03}mdIxBJUm|i6v-zA#Dzs{%U zE8Vt{hp4S7`gTidcDjSpVs@~*`e*$F%7%sZWzfJ1BPbx>Eb)JpE`&YD^x~E1LCaew zVg;v<+IA2TmQL6ft{&6&3suwC9}<9`H&ia9T63(7KdnERz+x_G$y>!|rtQeW*y>_o zKR5jrD8Guf`pa5*KkL^HEl({1CkFgJIhNEb*q4nbqh?l74w*k~1AmGC_$>V_O6N(1 zi^=|E3G~zr2hsQK$2fam>fYf=^!9-0}=YG4&O~H>ZMCP)I3G-m{#y3++=rL46E6aHZ+331 zpHhJIN%{qTHE&S%k~)!#uFB6-T~U*zzR zj`dnPrWt)r0Ff=g_CZJKLHdi^dlh{(_o5-~?y$eJ36A$~=s^e2AN<~UKjIP;*_rs* zKyJu2AhkO@w*RYtdvvI~UCrRj8Ri&T-DWxk5dUr~Cy`+zW*y+7EUJ^{*p+tK9ekEP5OJWEyi{K8Tw3c`Tya`bBo85SE*|Z#vQ7y{N!p&KKooB`F$n>ASWEDCBW8}k5`medE%~|Qvv`nMAUb| zb5Uka15`2P-WNtNbB7@fsU>%h4N)L%)P<`UT{+9lID3uAs;@A(>bKgt8vsSKv7v>x zC2z64d8wbPvle!Rho7sM`c@)zU@?%XgCxF0Eaq?N3lQIc{?RoGu9FGWT($RVE-Ke< zQ~fyMlQw2jx)Q=t^Ymb;-m=r63(;Efg42uM+NQ@`bDq26v5VS4(|Y#!<Ss(<~thcLWDncwD3tsbC-v(9iU}&F@6}gMItKYt^kt*ud*aML`>iQq?!z zl8r2o$eQw(ip%Nx&Kp5FGA!t;O@_~8ff-)i?6V`3r=ac!NQy}h}G1u|$k zuA<_o;;1yeu6};6embDKCj&2iQ^VG|uH!^6ue-A-&31~5w5E=1hF74_4PjHiJ#%p= zmIFecnR%6)d$GdiJP&OXGg8D)>-POtZ~J+-2${4vVn9Mjt(~W^+P4`fK(0Za}j%&aR-v&L4y{%6VKN^@PjfxK}?^7N4}jK+3O zAIky46^~Z+ThNn<-?EnIWq2TXTL`$Xj5Y?Bt@Oi?xJBT&iLWzEx%Wqefvgp{tO+wz zDM^!ZB`c*W4Hg8?uWW((JjfHBD7-PLm3&n0>o+AaeZ|j*-|lykyJsbKCO#xpDs%*| zz;rz=1E_mX&1;6&z@8r!5F86dm6cnG8DTMnL+VH&4B}U>E^ia6s+?k2k020J1CQ+x zyZ1gK6N%2zr7qgDwYHTlTHpEYvSe<>D=ssXD7Hh>qKZf|CxyMo{@hf;kj0TnQcDh+ zErlK^AR=^g8gUNAmFiB+wj;;-^N^_5wu@Oj0tU{8g)L_J%?9Ma_W(#O`7!By5TAPG zaafQl(1O;Pwd2_u0%vC)WVbmt%jMGu80XA>*sc*&^ym;ly=sPveXL4y7lkG zqzlFSjX#3WgNY1Q9?yc%0xY80!QB*#SN6BI)_i(3NSK7t~O2vCyWv31KU1Nv^ax0+& zrCT6w*r{lXIx0xp`T@uTlAw{_izi#VDtB@(xb+WGAOBYYDyip9XdS1Q!Qf{4+WaOf z^?W0F>Mr&o|8Vud4|D$bEL892pnL-{rE25RkWgyp>3id#W?Hxemwz}D`>yc|F}g*U{b8)k=r9>)b%8 z%grlktwz&St7I#ShAl0NeA6vPfyVwbia9zRdD3s0RJS8v zDO@p@=RDizmSkS3rdSeh77&NNZOeXLP^WxPLYv`*6thgS`N9dfT14|m`(_r|3DMvF zJzYtp=huOmeq}S`mT@y1VV}n9KNYxZIFJy=vM>QS+^^x3LV!-*+U@*sctzX&x~uRc z+!}dQwLL7{=tlj;4H0(p^S(3R>KuM#^>1QXe}*BVOhxM zb{KZxXWi~;JZe}}1ZUD~x?0*9@JHdUJkvpnBobZO@3+$KQy#06o;(vGtUod?*-vLW zA1||O6?WfMLv|OX)g5r2rPuTe3qMg{vfJO&r5;gpp!x?^46}_~dD}RpUAvL6Ac!9n zycb8s7skk}-NsmJ{3o>W+T}YjuS0X(Ea|J{-+5d@p4Jd3e1R%dTN5N&Y_FhF%(?4C)Jq zG~*`)Y}Ab}xzGISLYTUj4ceLm*en*lL3Pz#@qOA3RwDusB=LCbB=NFH3NnqmXM+(w zwLjf6&mTm6KbXEfr%a%QK%U77EUk;(bnofb71y_5&_LR5rUP9C#i~QYp^AH+jYf7A z^b8ED)+uJ-RaV)w^)kZr*jVPwNbgF)y1eh-%9DF6oiBbeaQFQC5L+SgLa&QJ8v}aDOYd*v{_rcA;5K297YSHz*6(Y#`@xAYb zt~l)--XV58V(L{A69k8qUanwf-^KClxuDGTpY1liXJtR@!MhP{w3@qouGgELmuBn@ zsjt?__TTa2hN;U}h8dau()6`xbMMh9-*LLhAI3}-aO=!%sKDLBrJBtPuNu7U^X)}D zL$=L0#h-cL?!71g|Hb5B*bns@rDhW`RX#%F@Ssuu)^bnJM?7Sfet+|Y@L%U|^D($W zDa_)&hzgWB494ZvzF1z;Z$?{q;VJ4Yy*VsAm0x+=gKRy;Ejp&{4AHZdnzfZIPozfGoWP#U3)qY&U_0?>OwUaH;r^H56DUT z@1A^3OjD7I>Kf$Y_;^XNEu-rhd~QqbO()oU$HLVkWOhkHF8h32kH{LUc9+bCb%lJ& z4kjDE#BB%qa&ccyG^A0@+K`wf@%GqW1)UA~%8Z*i<(NWG4Gb$dyUK;@y#=S%RHrB+ z#+m#`Xv)ElpPy4PAI*e>c+77!b9)!f@|#VE25GdqYiz6yl(1z%3rv`~&z7s9Jxry` zghWH(4!*TTNN?vsb(=jwFih-1LIPr5WpR`8*0Z6Y{ER0En+(sZ&Su0X7#6n8Ny-GJ zJMQ<^dNB{{$!EIFudu4>eh`$xIy^GXp5=Fqey$yN9*i;i0i}ngRdLRGHkxWsy_~c& z)2Fih0{+LmLke$qL3onn97rxU>+)o~2H0ozI!P$AiMMA|fKI zmzb5_x=m*{QNq)~ZD+@ja>2e7cC+qfMr{}G-qkds+=EUDdSvPNt>L>8E8N?qzpjBiPUVNC;DZ2nO%{j_O_(!$3hswsUiD;iilT53~j( znKPGOV(E22?R}M6NwX0yC$mpA>$z;@mutKZYWErpyFD#bRaIdb{Ojd2XcFewj+f32 zvuUxZ{cg`%8(6b`d*6QQ%FUS4OY6?fFfrv3riI*DWo(sCm$k-}GRw&?Gu}4dYzWQ^ zFLy!(ArunO=U#2shObvxFSdHT$&Zn}%gEE|S@R04C2gaehJ~=>IK*jR0&~t-a%N19 zu1}|JCOp>UT>UHSH39p%H_7E$@NAROwr#7?;ZOwf(bh4xvBJ(Ncm~~k&S5B6PIUy^ z)G#=<)97bbctCA#?xq=BrjF`BbB}1IX}c+H!)?74(-(XYYz?AOCAe%zu)$AE9RhsRp*Mn|zwRyi{CcKLj^82;O?hrsmMvPO#rXDnCh z|G67dreapIA>(w+uV={+u*jZW2M)}-f`mh!lZUhB{UXWq?GfpJwh{uR2G^3qin~R7 zt1zg#rxy!n+ z-0c!mV0q=J0C6zT()5t92K!50>&^hlW6%N3IdK*`DO%V6I}rLpDGFP-T3$$WtYvbh z_e)Fu^Fq^0p!5>A=Y@J~ zZUyihL(Of!?At5LAK&sk56xD}P~ptHYmFK{l86%oxlxIKCWzVszC0uQPJl|3^49-QRy5bmUAXgM4zZf*44- z4oBKapR22?I>g*J-;8Iz?-e*OlT{76lq4~Fi zcKm(ow|~C>+c!_?-|s*F*G(IF-zogR@5y2R_RRbD`{4gB7`Sh{N)8MAzs9}4-#@VX zmV5u*@87v}31@zJ|+ zvp>Yo&Iu?_i9yjLVwCV@T?$}+Cg+gZ5|v(!cDa052u+@TJ&_oUe9gD1ytn*`!Ys7q zST3VQ_m)p__f!uD`Rmprk?CnfNI%`T zcP+;;+_Y+usGU#QJ^tIqZ7n%CiU%`Jc*^c927efLdFGKdu^W>qGLW=6o=5*S`_o6C zX;*fNk&L!C68q4lPJ+Pv=!BaZFe}fC!%wENGPZiH$yr9d3YO=jJnkC1Lz8wB`z^Yf zv}Zkb(!LsZ0#f}JtyccfJHv|AW94hOUAV$J)SAfvrvf{D^H=a}Vg$Qvj4BbR!eWo;-g3=@w}$0Q0_uA<7%TCl&%M+yQH4tUNV5{Gz$h2Ua=VP} zf{PhQB{Yb=s)55Hv$&{eh>zuDCfl2HX3CdHSqYIaU;!P)D|GcaE5u+oMVN}P8UYYso;A@w zois2p?z-Ar^ngAwC`=do2%k}g4#IdJBHLQLP4WrSj*w=TpIQl>7H2&i2?P9NcTK(I zQku;}yzF%rxf+(b``b*=6y%pP;#3o(qX&s=-Lb%>%E-(7$&)(TfcDkZKjKJBCO{k5 z$~4ChSU5YLDeeudX!nI%@VedlC$qX?+f9{SUV1iplp(4Gd>VB)-v}9m&7MBD8>`Gk zO!?mj+l9fToVcdf#l;6ot%N!C^(yj4eSv>$7Torim7|-*>Ks)+FP6!SSkAR4F&y8A zzlM$|Uh5;UC4`I+1A{`UAWR>)GK^(FJxq5ChidC^$v`6D!gS%yj49py;wE9m6rQJ5VT*o`U0&(o!yZm5Y0mKrkX%6kHXOC0re6K5dpcX0l z6U9RC3h#tjRo^pW7(6>YE53Y1qjfRS{U$MBa%Kin@4nN~EwhD^lDGb6b9uJ>PYbFT zqRu~2PM#iYF8sfB0iQl1Febqdbu%e({|@y=T3%_m9fwW6ffb_$e#=Wuucq8@M^L4L zlhV~C09!8LKTE{^SnJn}2Ar4416VPq)$zC@YY@Evg)A26KuUlT*m_C}fJw@KYcT~j zJ(=vj%6e8jwEl(d7&fTSk_^dxOaozjWA0PmFD0}5BaV9vTI;5{zf-)Zt*lH>_Lbw+ zvv}r#B-HrwX()(WUBtGF)}C{%pMNW|u3j7|$CnEm1N)#FP*+rpy$Dkfa#f7j(Kn&U z{Gvrx-EEBgt8c=-(#|bp+azi9y75PF@W}_1-l9m{7nPg>I_I~+uQRfIe0E|-hmQCw zPxCBjQGr_nXf@kgv!+6Cw^m3%rw&RXThn58?$*)ivbNUf>my#Mv;p8Iu!7f(CMmZp2VZGh_(6E~e5I=j5WxXbkp;q|*s@dd~>IC2_* zI`)aM&Q6!2?SoV=Hs#j%`Jpp(?3sp!GOr)HBLL%eOK&pY`1~4@5ka};M!T@{4X$Gq zqPx9n*)hc0=0+SMW}|kyKNn^-(bk>A*$4bwytSmi%ob1JJw~(hxc7n&AhPFAuxI)e zNlD8v4p*SWp^Uh_%+K5Ov#eKST)1r&6_woUZLjN*hJ*B6o!ydfTM^*i{c7xVq@{i3 z)ijlqGNaU;liILyy=%UEf3pt8_xq%xQ$z@2?wian=$K(#nyrL{glwk^-fCrd7Es`e z->{sVygt=I4H5-0p5OV8q^hcml4EMYIUzW|Ak=q~8;+z~FftEuK=5m=r%=l(rM0>j%ac{z|Cy#!E{g^auddv@d=t95 zCNK9ebP8Mzms4h|cO?A2O4iSG+SX>oN~ky)ou>Y}U`5&jsFH0k2FBvlv@ZAY^BJ7Z zB7NxSc&0)0ywc`sc%crQ7QlDwl}*9-DRp!|ljf2OrXPoA4;~pjJWhtBxWjuv~FIEHqTm;N|k&$zowOv*q-t{6>9f)x4)YWRo5uCu-`m}Lyb|NB> z`jZSc$iLIwu1?ojaTqWr-4{hS>vaRvY6bKv5l|4@WHjj+FxK-?_AogQu+o0qOk#|j zMnz6r6$rAoxc|1wVYC?cY!SG={dnrI5Px9vk_e#IO{1uRZ-3JXN^po0%E|X;&V}bE zn5m1covtGZGU4UdX;=XBHPmKY4>J&o(lbN&bhCNXRpm3Qf06gOtxM-ub)%!2YyY^;YUP?w+U6See;EZ{uJ@zzXrotkOP~lX@uYZSjU` z)5&W}X!hUpM^iVe04CAaGP`P*YkeK|XeWfBha(Oy){jwWAVZ80@O<$+=-;qZSFoB~ zVOtKWi*++99B@(*49H2#Pxu~P(J{5pxfELFE(y#`lv4PnF#pd!NVM|j-%MuktNPx; zYbN&pZ2InBqspXK7ps>qL4NvznBm@3sbsyF8p}lHrNX3=lo`XwMF$b{T;|EwfG4WEe$kf5pqN{c|9Nv8f z5@y3N0bT%;6X;n6+KfOdTUzZMB0=a>Igsh~SG|}PSsIG#@Hd6}(tL0xU+%n0-P-zW zQwl>OB7LWoMv@8zSue;od0`P|81@l(Iny~uxq zHi8@a$Nc7a2*qtVL>VpCu%g7ls1sC@zs6?h$QMu$4c`xWH3y4|_wac!) z6|~!FB&LJ>{K(OZwthf2?ryuw5x0HjwRS+pCOra9&)xx%boZ3dt1A{^(t5v5068tT zT;({*%I@Askia&K1`x2l4Q8$~trjLfyR|O?L3R1Yea3I@I5bWz*=NKu7itd{YXxVV zzCr$Xmju->_Ml5uR_DvVf;D(M37B+TN9vea?!8s zVFR3V=&qUOb$SzlkZq%~w@rF_yhyoSB8+Od?gjT-LO-*}Gr$ko|N4 zagHx8-c6f`R+R58Sc1sA#+(@O^Km&{n$~HJXV!ACcLwf~*K=1CFg@&K4PNIGF-2mL zyojX=pDSrYZmNM5G&=f&U?(=S1^J`2@VF|8;o6L=vjmnPMkWX%R^M!&RM#`{T48jS zA`xG&)l^oSoLQSX(rsMmZ#@%>l-|w&;xy~L?WOidaBAPZUGAlB)%wFOZ7iY86wS<3kfQ7@4hL+|m?3&3_o6&fefWAit6{(k&S0_paC$k)6GiXty|pGm@;m>M ziVwj%Tn~(>3+ZdG3_&+N>!+AeI3Lum;pLc5aL$|hncdf)#cTU& zl>zL})3@wT4pVPG%<7CNd3uxrAfEL`X2maPBb!KI{W*;W?6kalfc=;^OT;D?C}|-YGv~nHrN>{mCjw3v z%Dc<$R~C7#HIYio7G8VXL_<(Bhzt`1K>xSoNeJzh>(ontm*x?aZI7*H61D!~(79sz zT{*!Bgnh*OA$&J~A8M&R_OQc(!M{|zXK=_Hp&4t9dA~a_odjHVK{qt*I-l=KMgf+A z;fTrHfUl9IN6|GPwB8H&6GUKn&kxmYGl=^BrA&bkLY!!7{Gt{`IN!VQMJ`?UaB}U} z`*X=@YH9hU)|=KYEzkRg1Em&s(hdRJ+ zO|GtdT+DsaKLF08>VP_~(HD*Nzin}az7$_(O}IyDT3eS5x8!`4mu_7$5yPkrfk`?T zy9ijZp$XZMk$acA;d{Uy8jXQxuhmctc#viD94*4TlO4x_B)ShpO4hb|La;%AuVvNU z6l}nLbIBmt2qUQFGZW7(EXh8}N)6pFDBCWo1oMd|(eodTG04f0w&(=7R&DJ6tOucs zn|sM0irNMh7P0Jy$-K_y6TWJ6eDE^nQ#DLx5^c|P*SBR zkaMuxrG&>b$5ng}NQk&#rK3A;D7Y+&cjMAjl8TQa3k=K;PD6(&HyZvPoVE*NbggQM ze=EEEn~-letcADEJ~noS7=E~sRkWwkAWWP`L$quH?T zC`BpWFKkQ-sl;^5?Qs3@Zt4h;XkY;lVt?;BU#-vFR$lhOHM|N?5PjPRT4qSgY2w=N z-u-twG64YxZKOdUQ$ys1E2^rVlWD%d_#PY%&hZZ+b7rRqaidQTJ0pH)P1?wAW{@~o zZh{gBkyk(8y@N3~H-9dCS&rEXTwMZUm`a8&1aZ`P+K#iH|8a^9ipVelo?0c4#RDZr zXI~<#Mwj1WfZ5b+Btso6>FfQHRB@Z#cPeKyGpYjajqY2ZSQ-Z_t*UlwyqmL9>$^I7 z`tv<{q{Y%@7Wjd3PX>qy;;7~F@)AB{M=a<{&dm%F@|)osRIl3lg$k3oRe-#BK}hLZ zvy7m;dv|?2qSLL8deoQfK9*4A-EY#?tS*|WnV_?8vrF47g_}VO845*344rKG47xT` z%4N87rn!4Mv<8&x9BX4ehue4em}=KlBp%T1&3CKq0{+uLnQ92|guO;vsUaAK22E;u zt$?kZ1m#5E?;(iO=QGFwkf$F^XM0RuR@ogDwL8At zwELl^2hik6HqMlTP)2$H z+J##2OBdk3dn#`Mh9Vcwd<-krgnRSydi|_bZmnKyP*&AAi9ooJ4RD7}Pfq5WZJKXj z!HPqiW`R)%^1^UorFGslJ|#^To%S)<;?4YWyFPXoDge>W-H_~QNzSJ^CwhFPZM*0v ztASYoUi{wT^-o6Zre0>nei?7>T+XzXQl>sIsq(P+*?&upCNS5U#1oN#g3oiwX)?~I zF$Ya;&=FcIzUh6Av0aA%Hx+~NZ*0w7alno9y#dna(|rq*nXenU3V0le7sZ~Y!exbQ zjn`wwR&U8x&HD6$AdLdDH9J3`j2`(p>t~OTg4W2%yuB{? zE6xwsa^?{(dsp!Jn&@ioojwfnJ+~JwNV)>=lt|R8b224g>BrK?zHTRg!p&$-+Pgd@ zqPhwrwl6P}PwyFcz?PU&mz})^Cu!QmZJqafR$=c8wsu}wrIlTNnP#RdE(Kwd@6Fr9 zl;5KO z)avV!as{As*OX;#Yc+s%H86M~R(U9yk9w+xtk3B0iXsYNG&-&MvU<7KDl=Kd>vUNf zM=y({R7Y|I|N3%xMhfJ}w$jR$nKC9J&yPYAy?Ue4?vCA-JWQ$NQcUA9)?~VeC;&5? z#5~n6i~Qlu`RPc8SsPNM<)gq)MO`c#9#c+=g*_8N$g9l6iWI+#y7w0U&T^B?=Tqw~ z8i>^?+8*1H^;!w^;)MhERjnhVUG=mY2_c`Y-4Tgp5#(hA%<4SzA*{ey^_q?;yVXJE zesb}NB+=VN{oLRBr%GUKcOX%MEqDB|>*`rwS7MLLmt`OLb_fdVyKUT2iuX%Y0q8so zF(ul?EC{kwQ(v>VbJq}7#8fB9L$Qbj7?P41guTjK63g+S21elUj}gF%3t=)$jvOHH z9sS&}Y>Ox=All@EtaBbBu!9nqob`&EA>oLr_{!+`crygNtXbrPcM$-#-BD>=d!wYA zEe6U2eE%PD?*Y|h_Pvdc<2V*nYzT_Tpn}o`MWv4wm8P`NBfW!wfIt8nHV{O5S7`#0 zNbkWy4@F7{9f1U-OOO)k-ERWw%>2LauKTTf*PZoS^K;;R&wI)~`#k&E&pzU!C%&X= zbA7#z!k!ndlb|GX2l@9@ucJ!eubwEt3ax9uuN>Kj|Li&jcoz`UN`LT9!+5Ew;QBw( zKYHvYpmr;pRzpvoAkN*(rQp}pzaIG?P;43kq^idMhxBlz)7LVsB&qB_sFOP4f8))r z(ezG>397n((<_`!9QqExlkHhKF!GNBs5Pj?6KenL|669i9V_EW%AvpXUtspTx_3;G z9*xm`I2?dI7_PGafd9Cw8Z}iNsw;ej4_)_05Y2un{)yoEo_RIbRv>!$w!f}F<_c+e zINk{#3*IlJs`B<+Xn_q)E%9Cq(lswa_pBWA{}!s`QQ9P3JzJ{f+n1WGR_K=<6|x{~ zc{?%I!Sq5E(JTn@990Xu%MRTFI{bz5<>I-;JLqZM(BF`TQB91g=dIota`^Cxm~nH% zZ3}=wh5iJxc*SDFEbGQ6oc(<{ypNnLN%GxHE#NR52S2Ag%P#VE254H{qg3|MCkVHq zMSC&AeTBjbE^do%$ysZ0&&43>yX@@jzQ3wNnSrU*+#9vJ&?A+a)_L*8L?n zdmC{h%Fk{W$kAfX_?*Rv1zVERLz)h~#bPz;e2?YBwx1my4vKv-d-UnWufxN`$1b&{H>`?{9HvOzB6* z%}-YAm?P+NaZF91=rYYxpQb&Uqo2?Bw8-hQ4t~C9-Y%V62Q5+Re6L9O(p&F%H_3y5 z7fsG$kF)FxZ%FeQ%T%7>faIR&g=*z0$uQAd7nc_N_OjdP?=KMdlryp;W&B3z+UUS5 z5$q?6!wBmuC$?M3R>*s5@T39451xHo<$K2Q;iJ|U5!#=vcHs94$s8CnHh44ljr$G{~=DC?>Ef@hm_O2N>1xxE|l8Zdzk~r-~x%IxD~n0 zoAVvWK~+BF$$mpe^2B;-{^fydEtb*Pcj(ybu;}|22X0fe=jf}{o}r$k%W|<>B3=+3 zD%4dXSq{0}C$S_|TuRC=E3V{jKRKG)4Xx+=3TZHp4xkFnO_bOjWg|&3gCoj$F}_Gn!L&3wzp!jC z%B9{47=nqWpxGza@DVEb2u~mgA@Fzw=rcxk{9tzvhqOK$x68uWQ`jEVhsWZ;j3mLcnP`-4YVofkUED`Ep zoP$^M+v9Z><_o|f<7BuvMv%@L3=^Ff)@FONsHn1CNnw$Ka=CD!V1}EGswF${4p42? zX`^a(BS^_-Qk{DHxLvQO>VA^f!TVk^0(dVPSe0AmBP)f%Zas&rL>`=giz$g}iTfx? zr;b{y*A*Q&T;S_1Naa3*A-`F4fuJ5G`Q@WGTB(aHC_(Io#KPpJ7~hB0Z5kTwkgld& zhLgY{evSzlGAdJv?rC|=(c`bAD}owifdZsO#vdr^Y(m*GZ`!Kf#hid?fmDLI`Ei=5 zf~%1Lg^-2#B%v+XP9aWXHps=<(5Pq*+=0cmB%yXfpSn!Cp&o|FD(f07utYZ62>DLs z?rm&wZu_)u+&H&_k5lxtY`kDb3=OgN7^0f6E69`^u9N9X&s{t%Msv%^@plT%G@}wj z5Jqfe_p#lr-;;gR4+Edef5YaUC3)en>09a(n_7x|Cu^L?Aq5>gP|G?+eW59*_D7r) z5FnCI5D=m*f)EPfMCh{2nPbPQ$Ua)9ZQ5T&g!tK@XY}@^&T}|;n_YmUv^(x`(5zFn zyD4St#$H`~gybV6IKX(`$zXZfvrZqPgvGO=i(Um%;@KrxsD<+D_=vK}{v`72FV$nz zvk#G+9|5KI9oHfY37t2^0(*UMR)FDBjjvp{=cUN2=zA(ni)KKM&v8&VY*Fp(+4Ny~ zA7JSolgvlZl}=hXaS=d#S%Rl7)-?wIV)@ z*inHN6P%u&PDk5lEN#!XcXaUZ@K{VVc10(#EjCGK%JytG{Xj|0cQik_pMRqBdd|5? z$@gXQp=F%6s#cN+fvOAgk`kt>sr+bWf?3R0BT4g4)+T9u*!X0~*lkL+OzZF9=jK1W z(VEy6**;D3*%Ik{Hs^kMZB(y_!^2VQ zZmpDXLA;Bhm1RJN5Y7wt6j0L6DVKxS@8raq9l{O#SqI-K}3x)(`#J zM~-_8_bq$K5zwPHoFm=1`Zq3*6hUC{#^IZ+{=SBi33KA_UNyZ-J*OTia!6ZhOvFqq zE3I6HXV(HV#wwY4 zNJ^J)qEj3*XAbmIp$jWSN*`-dfAgH{HHBEtFS-yRMEUZ+eO5NTlb9QMxQByK+mR{8 z?E#(krX>4#UKAmexDcp{~#^@H(dsB0ZGHJrt5by z+V#IclRz^4^nY%EPhR`;d(l_)k0Jkk$K)Jc8bJRY;Q?I$K>u^dX1Yv({%3*RjMkC= z(BxtC4f*psg=6#)Ab&>2g#179&;O4fAg@5y>=NiAN*{f-%Rh4hkv+WsbpL-Vg18KT z|EIX(Uz1Ot!C%D{46Ou1T*3JHO^PowA(aW%ZKWROy+bEh?ozY*RUT3oJ~x2 zSM;Q&N_zG+gHm_vpXZH?fL_%tobfn+em&_k^zE~DHHm#m7U(D-#s)wokvW|}2(`JL z;UPT5sY}_-Up_l5qL7_>Ke+a7H~|uV6cIoj;3GbmoCKMO3cf}a&gqGWzu?%(9MgLM z`l;Q!RL6^=z5v*Ga!)4aOHJ!nk{mlttgkt zTX~=BKqjI?h3|jZ!NOrj4J-IAAe0De_}-8}lK0{ih-`*9C+4iRh=2}S2k3mLB5I{2> zSi10xs(IkG_BVNrG{E~Q^J)tf?xkfms@+uy0%#D>7?byl-oDq_4H7v+qlehant~gM zL?|r>V=|okWPdP3+xbi2Su!k%EiEZBCdb({uv@Ot-`=)uo2Ubato>En5(i33>sRuq zfvMhc`0^dOJPdF&KKqHZaL*LIbymAev7n25<18*Q_f+rf*(>c-G4uCq=^~(x8@}JI zf8CH2xpJUlnz6KMZ?%h+n%@i$TN1HwP?ch-RL2y(`L|<+sLF@tHZ(qASr;!m^Pu7T z?EQhISk)v#ems3u1<=5CL;4=_Y0e~3|Krz_5lSRq?_t`8DOCM(qpA*mpq=*k8AAVX zOnqu_EEPh9{)SDW%Zm~|61yBBQ|7g6Wc%C`&B$;49<|4prE6CM8pbmR}xe?Cy(?G%y9sP zY>)kA>8h;%?YF;EkD;SuhmNA=R0OHhRTbL}`yVKe%a)sGU~Ck- z51)#V!nX#4U}beJ4_4ij(yj}GLgw4|NZ!k4xiKzwIf9h&Pe8`=yXx=}^3dOyN> ziN5Wx5&VhRoK{##^6BRvA6J)_2vH64?eS> z>7;QJFyu7-R1F+xbe-~nb~4CMny_|fJ!{+4N9IelD$gKAcy@f-R)y!)>fekEGk#yc8**|$ZEgnv4)v>9bw0u^@?tX%Ui-Ezk5&3hU|U(u@h|sUsYL`ChQb3Sx-29uP3l};Cb_lr!sLq zlqnG9=_)WLlmO?&tZH*YNcM+aLLE7S4$|~(p^2A}ZNl-Ux@_}w z#5fXANzTQ6hK>pc1-ZC#?+0&NJuFnN>*;j`5et=KB$_&@>L^rhqwr^P1MDt10&lLh z^srbupO?-9L;4>=lGyQ9Ngf_~r#H`^r-9_@5kF)4EokFkCliBk;CA7;OL6Imi7k+s z9li#BM@%eRR{`9>9g`5;%H4Wt;_TAS69)#cQD;2QLYgq|A%c6VNt~5kg|Y`FZXMxY z7=a8c)?%0q7H3V#IsGPtt`Yq&i~*wMCx-k*@(FFyfByd}X6>Wy`5`R*FM2?E{UaP|s;ebQSdX61pWlB6JW65G@v-~9a*T(EUk4o#sLlgY7a?>` zZ`Dk(+F?oAh54tHUWYK5IO9(bvmh2~IGFhph!^5HAs>ZG+OMUq&Jp|W;&#WIx0pa-ROwQYRRID2oLhyE+))?t+X?6|b)C{R zr;v&K{4pD(>up6riHUoqX4TN*R7l6!Ds~$=kinCn4rT%uyo9QVJTTNpu8)F!OJRB` zq7*F=XRUu#uSAlNYp`iRd%Tgu9ZR9R0<(Z~Mze+kjV z&mcu;xBgRvMhJk65w$xVkOY)rb%z&LfWoFVESEnvd?SdsS+x^?MQl6>VzVTc&zp?o zmidFsj&knC?h45#W1!BXip%ZGf4DW~FS(g<8dmBY@N_3=^j=*HNbcdWRO<^lNtppa zUKy{hqm$a%M;?8pyXozXo~25by*v4HPM$njS?Pp$aw-Ie)J=chzgxxV!prpZw%3=O zJQHIrQSaOTNJsKU;4B8)79Mj#;uQ5v;Yt;2uFDgr4}WfBJA4U5bJw4JpLx2guzPXv z3=b!AD*wi(k*0stQVq_2OB9j_M!C|&p{xV+&2#o3^GXQ-(Q4_Ko}u15a59F*a8y~6 z%jb@yk2DWC@NgnZa`U@j3P`~QR4wU&vgJa;{>kx^a6&aSxJ??7gmQ*svKb{?s_;X{ zvGLOxll=p!mpsq7`L$ApcfBXmt>ka-)WShHnL%3AuDAIK?`stgNH)baAXQk4n%C{+ z#Y8<-Gg_TS=dM8iKuo--2^lv_V>n#W`NaeS*XHDZh3~A1<=U~=8#NC{eyhTWPy_ur z;4pXu5Kq>*>12kjp7jKdcYwWOwKEsHv5P=l5~{bS1KboJEI8z|j zQaQsC@;KmPS;D0_kuyg!(l2R12S=a!wUv^=<-(rrpGOd`q0gL%h={V}Tyd{zS+{tm z1{|e+KD9e#oq;?Tqrx68#Xf#~i)SBwDHJbYS17~dyg83KL*3^sH*(5g)JD5Nqho#& z`<-czY|GMYuN*fJ;H6kllk)6CCcl+$bWuSz|0Co(M%s=pJmrjwn{M~7^e*08n3ij4 zR4nG|Ki5E>EW<)sL?WDSu;R?|1qIsJZ``c3`N@j?lX0;tZewzFQR4hFwrwdV_CEve zwNGvp@re)tN7BwQA6!DnGTh4_B-Sm;N!Htify?Vvl&fLCzQFBx;>-aS+ zM`Hak5mo#toAwV6=!^Oucr63vWtmB}IL&lCKt4kh2)hjX=f7+k+o&8X#Oki9a)R;; z@Y}r|iH5U`Hx@0Qb)ee1rh>}Lxqf`&SX@}RJN}Yi7}ty^txOaQ365~~!oiUtzv43N zHulCaN2I!8-O2Jc$3c)l2jsdT`P}wdQtFa-$K^TcEnyG7${^)~wG;rWfiUFn}S zhr%ETdoo-hYbn^_bxl&ClgZQ}8V5z1eVJt|dc87G;IjA+jCW#+KDC7ATBqn5eWn52 zc1WdMhP&ZmfzfhnBFin?!NE|s9^zGMUXdnpQyWu z@c`(hBM-88Y;s!nR!a2_V3O)=B4HUjw4+@HamLNZN2=|v#cBcrsjJe zXy8tsXmr0A&t@TM9%UJ-+nNfi44c9WHs+{#N`Q=hgCVL%W@61-*^>*64qX(N$VV65 zYOAT7Q>-#1!wIHVNdBn*=lu`nCn44f;!qSrN&s4&Ci_g*`~#NygoU>nGoylkFT%^K zyho__%jpWAF(lXwQ5tiD2%>C1O|P)EIsnAYdQzg{ulNlI=!GONDXDo67I=pn*Q=<3 zV-jgJqVZkN`(v#dX_pS4C<@5m5t_0ur(oV4YwKVAh7T_T0GD079vBe%a1!m?xP@{GK!_CP? z6WXLrhhw-aQdIM5Lpy}p4&K5iwtG4ju|eR6R47%6Ky?zIe`m5DF0b`K;9<}!X7hV< zA^gd2fO08Y(56zfss3lDZ98w>ayTu{!z-@nN-iiUfV2mXoE!FA6Lt?o*05LQZ?<*> zMylWumoM80TmfjrQ`P~DH)meHRnaXXqLmWB1sD3czGhw<8KhdegQ)62R(q0H>y_36 za?jp~OHQ5!+0Oob2X<+xsuF7GzHJiaJYp!>8%T2;!<2g(uY7b|s`bT;C*vpl!+MXq zP#~uZY*TqNbe_WW<(2BcDwV?bxz3LJgNCW9dfBZ9{{qrLX2Sqee<9s|Wxf7Us`P&g zL;nc`5$N}8yDu^JHc#o4&Hr5A^#2XDhiO(^^jbml2d#`Fr~W5ovLN*m!2x{*+Dp{ zj}C)6BBV+(yMbrp_hAtMi2HnZ4xhLRWk*hsa-<#hUoywC$(m3PVdIhRBL|R}H&jFe zy9yO6QIcLC$ai2@&FbwwQof1fKo>~-wa{q07Se-L(?{|BH}PSXsde#$<88+YPkhiw%5wRp|MTl z(on1fp#W%%>uwxB>DvJV7`FoMoHv9I`5x;}xz)Na`^ zs+EN`aw?Tr_@{4viL`BGRlo49&DRcw!-Oz43}LHI&Tv$ewA$=V3j!%Q)^1LFi1kgU zzP{)9@{IaA9{b?^>T)H3X1u{ZMgaR{`=J}AdX9F}1@$RbA{J#1|CAly2f z*SChR;vc_!5quVmL-dhY$c`P$m4)CdT^i8kbig36eB(Sm&uYh^fB`Dc+y=)Q=B`=S zqEL$@xeM0O%i;tQz#@6V_D$!{#eu8~fU6c6%DiqdBcq9HZT&70f! z%3WOTuR*OCvWFO(KH{R=r8xf1m7AI8Ml&J@-M)P31-7yw=l9>wm(3_Fog&KJJAbHb z4wx2n9e5hf6C&GMrwoBX84 zz^jMM+sd7w5X?`Gw-=*iwu2!OiCwDr^adBjYc@7%4mW|8PfxX8IUCn7w-7A+#X>H| z`H$c3$da1;6onCfo!tMNuLorL)d9HHt*jjo#rg;`3<>ej%()m~XeukX)DKEKpA)AJ zXHS&PfI>Rmn{GP5rcp*vh5EO#ULYAQ>g7Ll$V2aj%GIlQU$ny#?r8h80=+~qv55te z-KT%r!+Bw}%eb1W0GiuwZp)^v+qU`J>-2H=qoAmi4YqBGadePbw;5=c>NH&7MA4Ou_h?Id1?@W>2^vf3n(7-d6V%1YgUHPiqxuKX$bU98Z z*Hc^gFz7_xcfej@_+T7*?5R%&k26Suej{QNa@qWVPDc6ogv9ngqvGE|Ex}OxogL|2HcwER7pxUV z2Vk3GQy8f;^90HW5(muyt2vg`%`T%p>IAh7ps|sGD9O?W}p+tVX&oCGZDXzj&X-(^%h@y&`M!jFmFC8iF>_a`Kn76M@$RoLB8#0JSF7oC~uYHUq0Jk#5O!Jtq**@BozI z1j)w0kx>(X%rwH?UBfrK13Iif7kbCqBiS--zO=MR2DjX?xcUTgjvq8c^xt5S781o! z$V=3oCP;e->lGL-|8Tw9Ml{Q(kbgKmI#zWeQP4i3#0?5)m*#yfS8g*4`K_(1^mi(8 z54iObNjIs}cFJy-lYyLk%6aXKP zul@t9{1;)YJ#y?Pa9bPD_5XsL-`C*7f14&HUZ!Q-p%SxwY#@EW*|%<`h4xHe`k~Xi zjNb2;kcburL)7Ktvt7EG*~fM8T?Vxd5~intD|TBCOZA*e9Ii$|0b@-SAEAnm{ad^F zST~RvkcVY=oC%Go{s4~6v{pAJTwh>2Ad9_l_(29!$pL|w2o_Q#JDX6f-9sUE0g=M- zePzJqvpa%{q51?lYR23 z6@5FzGu9Zu0bl@K{SfLAc4sQDvGKs;t4NShI13j+i5gib!p%l<`?o#>CmQ(a){s`z zAfsumpNJt=R12R7$H0u6`$Y>xW_Li`;&molcp6md^e=^s%>ljn72rfah=jz6Yd|`@ zw=Oyb*c%h%b?32eU^aY}8{ynB5YKq|Qqwmpaxfw~vmgHcElJ1OGlfDd>{HGZ#}vkV znxs>#(mUq2>IDqf2?SECpw^aAKRmT@6nx8J((@0y$um$N#=;J%3CJMUwXKa&o)D5I z0nsNhS_^KJQE_O8c?AzJz}yPuq=!k9yOYQ>a6!q_XG(PkfyK+@K%$c%VaWc1V{JFv zr5J((CIjy8_`QWEO!fdU9)OnvW|Bxyg&eJdaI;cY{Siq2-5og% z708?Y=c*Ui5eW59?!(ZV!r!cLgk%i+iHkP^wa^4 z6dV@F?@?*`q0hq{rrT$$1CZ>hF_K+93;TnfT|LvWjvo715-F)8^$peWN>eC8fPK2S zp%J8G)Hb?;Y9Sqt=IBfglwFoVDN8zqr4&ohaMwp$4K@#rHLO^K3 zO$EScLK?2>8EAt_(*TJ&Dq?^6 z2-LFV6VMyAUD#hQsR3;~nY>c8k^o{k;65M~It?U&A?e{Zi=P$%LUK3)p(M9E&t7#Q z8Oih~&2Y}O{D(`68e4S^!&H-Ue@{=N{&R!b(0>Zkp;&92{$MIZPKKcq)tYtAYyJnS z_DqinO8zAioY=(v>=Nx>rF(=E-ZM{&%el-mJA7@AREJtT+D=o$&on^s2&6n_nMH3} z8~J#PFS{IB^VM!&DI=|ufz)h&U}fP3g}F&6)V5=CNIwqw&N^p=wO7Gw+aVAkFhu2L z6AN~xvQi2UMu=`{cAsqp!4+Dl+2GEhYJbD0d9fH$vUh& zRGDPQwl6zj=bE9il9A$^G=dwoERErYi}VrXwvHcj;f{Y1=;EU%EJZ@+FF_@OX(FqS zo*w#uF|oV=0Cd}YBRCjq4-25m9gLx-jARxBbUNJRbLNLf17iX-0mOCdHQsnKWuNR5WW6>q2N!n5zGuI(3+9WRut4kvNbk(~O+v$nXQxy|C+`aqCg$%A< zU527a)$KrwU*8_WbA$|+Q^x|=PdOu|=IyxxBl)ZwwRK2V_> z{@p5}Kg`c4TzsIlq9#kdN#TzT8_rc49r7{URCVa_<;NM7qS%(VE7)791Q(dW!PD zHYRZ9ecE|$6V;mw{an~rr2M(?AGCWIt_M5LJr~{ze=_hDd5GbvWF<4f&&W(h$e)aS zMaWEN@qeK=aXt78%|_io`^aX5JpA*y^YB|XBVVM^)%KvNAMgGT&uxNM&TZoQ1DaZE z4|-6^3O}o4gPq$9`# znFUiR;U7bSsqB1jOUkiZa9(;_anj>$oKfg$^!O=q_|bx%>1`|2McD(A+pK#(?}J`K z2azf2!d;cep^G&vrOS;)K`$``*Ifk%=Z?=mG%=xs3N2kzRb5Z}_*__$8$Hv8Ll&^i zW~Eb7IO&LRQap+9N#M_|n5DqEydqtr^am75kg=KVQr{F#N6fMLV$RL4QuZI;25WVw z8Dn(22m7}&mhVFmOz123W`7eCC7~GjUy@R6I@`OI_pjc+yf(%nV<$^)tS2)eYXSzA&f(hL?0PPF{<|BgXeRA+1)pz%qxIYL zAtR3Lz>oI^xix*i-(p_1IL3H=GEf7X6C~{Wf?UVCi#P5mZxlavrp8#*;;6TvpW-{V z@bF;zfa%s{yICEFg2ZWj{QRhF!fsWUiMCv` ziRD&qLh~YSdc@1-(iW!NE3c;Z;5v)MJ#im7fPVLLV<3&H4D=5n>9fTUxp zt!aojZN9`HFy3;}>_ip?IIa-t2BsH83AqjV^Rw(}hYFoI;`d&*Jo*?coxbMCb_~*p zH!W~yyLBS7rV4eXN+_96b0Lz&2g;EGsgK`i@+K!IUw=OGxi^lF`qA6R@@~BIJ+_~d zt|-pK(}7WZEl!J&=GRV%v8BDhR)^^Yg{r=Y$T+J%Gc=98@bD4t^TqiE!H^WvviL5B zc_UrtGRD%lb`DtWs;xqu>)VoC;3Qv?TAUi08|ahd{{gKZbH;vnJCl#@TOZws=K|_- z{?T_BJ012^j^eD_bad}0o+qC^p_(t^Lj-jK;hRBO8mMJsU;^$I2PrsjfBxe7;iMKZ z`x?TDKmPIEz$7Ks(9u0|7lg1r7}~}^B=c|AQKM7&SMpP?+T0N4&UdwnHzu@pN%&U+pL3OHB`e}#5YJXg;&AaAlI_;- z@nnyP3eY$}&3V6MYLD=SlIC!KeVN>&_wox|b-2*W z>puL_OX1>J%gM$ElYizPA!&AISg=0g;n>xOB8fo)Hl!<_kB@KtKc_){s3k3Sim8Rb zU8hiMUC<_RU4U%l*p$<>cCuQTNA3Z}AqOW(t7jF; zrQ!oDnW{>QKbuV3V#=%YJeBHbw;C7oMuVBRUnT7t-5&^Lc$GA$PzEGef9bxOEY)dw z@#3eq;wSLikG11JEv7^l&Qz=K3ombPZ+}qALZ!CadzcNtUQ{uu(c1RYDoe|XDypi zVrIp0SQ>3H$Drs5$7f|@?KA2D^|A{oB8A7`e2{b;Ilt(;_URqxo<(EA6?k}EoTjjE zixSdOz{Rk;M@x7l=H%pnn|H>$#Pq3ayXjrjQ0u(uH0A6td29B#)LZ7CUT^Wu=v2a~ zsjFACR<6#z5pGpCX1xu=OBO_<2QPN#z7qN}> zQwbnnCF-!c#gNkohs(6iY(QLvFdADOT%-hk(t?k^+^Q6kLUzC6R2+3*6K$^G%S<~~wpUk*$l|1LJOUS{3AlT=^k<+Md zg94(@-YSyS$^l+=V4GYs^5gjI+Op&=tN%>ifAXg9TSv9$so>N2GIU61Rl=h4vjKOl z8W+s;^L#)V!y3ZcN6>JLKj&My^CdPlMa>oDUvSc=%#6t%8#%y2mVleQpBCNheZ2<| z$#{Vz01f(X;i^O#IVmXQ&>}84QpIWoFQ;_xlemtWo_rLeB38!z{?(O7GR57&p}oEQ zw*rr=mjE??XZ0n|CeGjv_cUStpePeM7z=^N3SDEfZPal=VOW!V1+lPO8 z6a0FHYHdVFw5z zT+56R5G)o_PnQp2*bUtR#b_ynrG;l2R!2H=3#B;(WQ3IUb1VnmFnPkNs|jicA*M|a zhp67eiumEiSD)mF`>Rq{BDe2l+ruZEda~p06Hjc)i7N|IgY$5)wzBVOLc zQPGR>x;D4%Ci#-DDhS;9xl-FM<1H;Mn?GJU%380UI+d{c5H*?uiGb)48dyZ5!t}7D z_D-R;-c(wDbUdGQ@p0j#(l9+^Z;YT$&YwT`p4c9m1cn@TNH^nCs06lwP(i9HYa-Tm zY@tz^H!%HhMcJs?ftoizX8amAzg3(5x_s(~ zw`PSyH08~kn=yUd*%v!pG+hH!sCu-=o;A<=6I;nrt0y0{M?x*a%F;)H`3pLpqpxPf}Co;usvBj*E4YXbTSl( zUmB1qOU?RT@G!dTdGL$zgAX53hkowagIrX~M6PBEk5ZVJLD7fT?#1(dLT9)Sg8G7@9*0e6ig^-kEUUQeGdY{=<1)naq(gqF_n~3vG9*6#%XFmxzJ^TP_^Va zHSk(K)bn$qF+m0iQ zN7Jx=?cnG5Pw0+C)%p2>IbCQm6<=I8?=6{=>begWfm=|Ysg^)Zbsc10)a3E-aFkS@l(47Pai9HQFe|!l z7{Zr*hSDncFd`2hV7QEz+^^mG{?&deyyz-VpoP8ly)t2Z&D#T&p&kLaQ)%u63RKl% zM;~d=><#Xi#T1BkXTC1aeCFEyB9L^|01juZ&%FZ@rw<(>z9!D&eX~Bw*-USINN?M~ zeWn=0EYsF$KPOq|u-#6NJQBw&)ogc8C~$Fw=+X=*Fg#o*{$^(@4(t=>uIB1`u{#Ar zl+11IN9nxVShu+?!)c){bI@hH-6~8>Zi~m(<&2k~!ZIbK4wb{#WN<@x|Mp?#KWK(q zH`C6|ymhA?T+C0gbe~ibf0QdkRoBc@T;d6e%pIrL zO4HA3?e`jsb@A-e&#|rzto7<@i#KT!vUHq{{lJ=|MF7_YnM>Vh?N4(p@bs%=%34S>P%aR<9pc?nZACN>$G7`LPYHio- zn5;R4Q#4!wf@V>+JPd8iTKk{lUPAkw`bAAv1vqH`qL`T276%Rqj9M@{@8yEb zbH7f>v!z~e=Pb}BYTiJbsMCJXCPGG&-`=-78C7%5I95v)y z{i5C3%vTTcgFCwjvtLq(G^D-gGxk?g4gtVP0j7Hu;N&Rd-HPYyz8M6T0&E&Sgm(PB zFMhbJWLUY#4G@2_D2C-asid*X{$1&VKZNaCJr~(=%%8Ryx{vD-g^gx9l_raB=ulfl zu;WdpKK-6;DGr@xw(Vg76CR0%_XdPsguTDxU68xwn|}}=PI$eO`gjv2fp0Fd_0jYd zi|m>u^B1`P5f&A-ufd`bG~DT1SKrm()6bs6=|x@i&pT^f?~yrgQWK*i9>Z!a->rf< z?ozvVvgr9SS`J?)9?hP)@ZN%DcWfB92tmcSAXhuaFeqiTXj?%_(V}F@F2O68y)wJ1Ia+dIygO6aPJMZJf}|bB zzXrNU5_0GjJLBknf7w;I1-{xpu|L!dV6nDcXF-w>mF46LB)uKK`eH5XU!73N{!4T_ z*lK~#0`PY&9$9vzdc&F|PWLPCA*k2X_+%-kA(_#>vtO=dmMYykk$v4M&DqzV5SXG- zd!W{(A~fZqPlo1LrDesRTxh2uAPy|MD%3NFZoJ;ce!7RY4P$bUV2S)5nmP2na#$a~ z(ZAUv$LPkjH)`q@r%LxM>8f+9!yb6+oE4hMF#<=>nOn}`WZb*Z%s{lBK}MII^FRyY z{N8P0fG+D)2wG@{ljqiOo##<16gdV)=3X+u0iYY%5;*1wdnDI(sb=*ZF5@5Xtin8^ z2r(6IR457MK)41_dsptn?mA&fRx4Lq1vBhC=%Jz9daskFtXf=X2uSV%fbwLfI?Yvz z(BB)DcxyS5WB3Gol%x?K!!dX-ne^)3Z&m}lMAvB2c<|2A2&Zi7!}}XOcs`uKeB5_! zHHx!|#3Ubn5o?X@8BFyk^i&Z$eH<|d%l8LY0M+Yu6>*olJ_SKt1XM!v+vS-}cy3nG z3aGlnSPU-X4p@wU#mqJtGzu4dRlU=NfY>N{spWmTWeTeG9*d3kY|#jNc?IspT#1Wk z;5rrtq-)KoB8_S_xCl*1zs9aN=+qrN2VvzlVt-HJ#GQy?mi*&6MMZsBJGL`NFZ2oP z&);2r@mysNgUXd~)?FdK-Tpv?0V&7xAS}->?~{C#%^Zsno`An8R{G$449{wmy!a>p zx59oZ8Jp?5e$g-?MQ%11>F1wAlPEQ{Gs=@M+Fy@Jj#Iik=aZ?gCM@o)&a4+3jgPlY zoupO%lcoap6j(Q{lyc8u5C4f%w<`b0FNMv0Nfj|1qszWFF_>)2fnz1RDEoanvd2=Z zW4&h7+xY*YGgP;-v`<~aKh2qVo&rQzSAXGHXEsVmYiUWF@jg)2kw?*RVrK010MWNF6#T(5h0p8M10brV+XLyKLkKRO{_JXqntu#Ixd74$v z?d0||iNt%D2GXO|SPQ=mj11w=eHOL=(b4lTOZ&O78;$Y4kwWSQ+UrmxYO#0WdN8N- z0MkH7qW?EUz5|j08cfuS!kl!cxAtqK;k-iN@Ta0T!Fvq^#+Np6;dgVPzf+N~jSKmT z^gKa6QH)_Yr5&%4POU!5X2f`OZJ6-g`2XS8jFupSi8%^bd95W8`tay2Bpm;dTaBvHhAdMuY+Iv_1fUekrDj0 zI*!F53ru@#X+44VNP8IvOW=)!K;xeCb4 z2a%p%y0A7AO?3=YX8Z(ZCWb!AJ9ok)mvwoI!21aKwbtH_F)8Ik`N$WLJqAX`c;ELi zV-cSVBON#dDaN(-jQ-Ic@&S7ghqS#;Px+CvtRKA}G+MB!f(!g$|jb%G%S#265n@e`P! z$4BXFeu1&(2FUyH)isaMP&akt#jo9?FHqUz$7|aHX%4Xn`um8JxPojc#`+_BjA0=L zYwb1t+8#{kkM1Eh>=L@|IS$;XdqRa5NM%Nq(+YI_t(R{nAu&B(PZln2g~|BE97+QD z`0b*_9mku8P6P)Bw;YB<1w`mref|XR_$MDEEpH)*_wG@(#i^~CluY4rU(NQvKgks>~USc-K zcaAGfABT^-cm7_eJcPavm1X9UEZe~*d^+2ce~pEBey|?B=N3h(%!)X?sG3xNK+^e; z#l?r`w4uaL;{${o37;#zl-M_goPXqRYBH$pdtr5X8T+w~mliRw*Vx`I6zELe*;~vZ zFN8SsLtl*6q#^XjMbG2ade!I8@3uJpuMbN<*4U5Iis}vqKwNzy(;=QrrSPltjT_9R zzg4)n*S4F7!o*tEaAR#|=*DF-K?d!hdY*bk$uudXWRB#ivTS3X5u{+h`T2|b^0}|w zM+9x+YWBNl|gf)f;5nv7m7}3kLt+6+GpF9)0dIh*TC%Zmb2z&ngzViH3 z;6GgjsyO?IZT`2nQ-i{m1Yk#xP23k+mIHYbp`0*lRVGDWC zhaW2MH4ly|%2CF-K%CwHAOb30O-yYAsGuECIRsfpS8;COC2D$%zb~kA&n?aBTAcXT z920ebgWQxQS`*>8ICmwm3fOLU_=_cw#D*vQ{e@3%(KCwQzeQLq^F-$Ex$>>WrYtM` zpXcls}cXPrHMtUY0L+#t_^Qa6B>T~g!q2Ks1V;wFqYSuY^sO5~MQ z=STN8p?ZNhBtK%}d#~W*C)9;YiD@iqZn!r6Ak zy{V5w6bmmS5{47o0#srmGCsii4*0udhz^3vby8)aY!KaKx@P)xN4%RKNhY!sn@!*U9*{yo9!vVcyLy9$l%+_?j*P7++O&H5$FaqYd`eKKh8$lNRB zQ_guws~(jOHwZCRB=(hMO~pA;Ty*blp==P|IGZ<~9mDiMxOufRdDP(On7>=NVEI(FHk(Dej znz8zHE_tlQ={Y2UmNSjWCOtBTodSl2ykUQokG_Ukef{5|B`@Xg3P}hf@$e*E8S`ce z1+2Y0B%zWJC+9zMs2GEZ)|JxhDstLg0cZm`%fCEgd=^bc?QRnk^r%KT{=>iQRozZqqkC5vWq7~?7})j{$of4nOTMCiR4M93 z=tC{XtOp~N4e*y87Jrr8|1baJ@n`|)?FTyCJbQ0}AV#G%;nRo@D=vuoTZtx16q3nb zzdi)0zrP8IdJnfAjI|O7IVZkh7lMm^Ia5+{2Rt+X&I_Ixed#zTbh(#8K;0XBB=5S| zc!XsXA@uu0c=Yg?gn|OM*%%MVxWr#my8AC@FGiauOs!}F`}|p5U+D@qUDG*(6;jL| z15d{J^3E?Tx8F!Jt9u-u{jb4K-vMQpi{tFhTNF^SNtMaNYlZG?a8f6K0X@FO{cI(r zs+T|BS_Se>9ULnyvL{bA95D5+QMQKIN+=JKs{1Uw3oiRx^n6xZGl|s=V!1=F*v+Q* z^%=)7mg294PoHkl`vz+ZGN9o@nHi4%Igp2FBp`?(bF65;nN7m@+#u^l&CRwwITK%J zla!pdvx#(;Mfm}~{Rh5at}AgKZ;#C7lRY}S0IC#y$QfL{X)!citMe3cRMx`X21<0R zK``$cBwbu6fb^Wia+(*Y5E=OQC%ijYpzs5t(4ps#K*q}n6g2#qIbFoS==IIqAR`$D zGQ!g24Twqj_>4Zk7x_1GV}1i?O+o%bClQ2O&D<<3r+4i_y$OB=RLm=b>kBiS$ig6~ zc@1lhe@-G5?maz6YWt@CpcFz$IpE5DL;x7^uHx=B829=9*U~4d$fM#GWzkE^cHN6r z6<_Q`1_JJ(rJno(k9r^V0|fAYd^wE(;=fngahH^W=bnF|sDKczH_#tH+GCdmYOy_w z!;riD_W-6_z%D-?HXP0XNz^NCogCZHxvyoDDt$)Zdh#p?kYI(CWLcDO9X`3*zqPpF zCP&i;H~$?mlm(}(kH#u5AoD&J>z-Q4d?{bv)!h8hzlSsN3NDY`Qm-8omU28iD9@eE zQ-EJJ0C8-zj~DIN`n8H_Kkn^>JQ9dns18^EFV4OLs>!8m_gD~7u%Li~O79&61O!y1 zH>LN8H0eqeh+qR0q=Pg8ML>G*B`63aR6&Y#fzW%966)Q-bIy0Z^Z$3PyY5;nBqn*^ znR#dS?EUQL*#jAc65D>66Q9bC9v|JZeG|+h$!%wPupBlqlR^Lb<}I>J9PWgO8!ao9 z8W5VGBC>jP_;&S~8~|2k#(+N~TK-r}ZDp%G!~b7#g6EProBLy3lxwNy=3v*%~P=9`}6-oqu2b7{Q|@G6mkARWleyFpm;d7O{u| zccoCn0vCgS$7svB_CSfSn0#CHj@;C>!>PS0DVw|`GNPzwC!=)u5@&HZOIzx{W}-D4 z)Z+4d-0BP*Czn;!qw&-d#UDLfBjuAi3qzhatRdg{{$F3&>xL`>JL%l&qhoe>C<7jX z`=R^MXJOg1nzI<;?)N(m`YU|Lo)n4@w(n;k<*d2)qGab&B1g(~Ai3^jjMv!u)i4MV ze7ApwX`4adckwf3LqeU2F+0yk+S0BY4m2Y#fwJQkUM7D#2!95Df7&b`>f5jzLq-Is zn*fEz#!}m9>A9EZWdreOlIn`M>n-c=ojL@=MF=MU3W4?=kDQKw@TfKl_OMpkB{TCj z5IK#ftOvB${EuNe6FL9G96ox3pVNtuAZIPM!S((XL;rQbkw=a={X@F#`>uYx3#T?H zH}G5cA}S59IetC=KOSwUNzbK2x=`1GFE{e?BKP8|R+)R8VOikiMM9kZAGn|%NW6;E z-Oq_Ilt+N!DF4)+J{j5zgubW@$!fW8|LT)OSmR}qU96k4+Lc;g3^GSN3meJoeKm54=6ec;z^nhh@4iFmd1igTGkM&=l|3IwcsObAG^9b>2 z15$b2w+x5mg0J*yx#KsR9)+-kzy9~b>}59s*tKFh^7lq9oH}CT#u5PA%3lWYujtZP*db10jUZc)a4^u12{l-36e2pr5K9T_$dG;{)9FD$E`0o2o5(48WAq?8<`n2`p2Dr z$Ml3g)eai{z4whR5^yI1AV%2T|JkR1AXbDvB^})QxBFXGdBH&%MHmReQ2d^T4FlK{ zD@?e*n|p8%8S(b;|G=q)FP-_vP+f2c=TtuU#Qod15Aaw*>)=KQZTgLc5jr`!I0n7` z_pLF2JsfOx^^a+AaHE4E{N0vC9>8*bH(25*K0O@P=)GmZcp^`^GT}_w5@2 zAcd&pahzc&|H1Rwl5hr_I;scS2?~~Qa<|iUpd;ZZc(^LejwoXzq{;v=9cIxnds9j9 zOSuSXC~z!6o5IAJYu8s4a9;Hh$(h=q(H-$gf!z9#Lk`@rdnt-jKsE>6 zO&h~Gz=$||H~(-skI~jmiep563MRmeHA2=FoKF{fJS{K1OV(3*rEqF{*|@}FyH(iE zbx@>o#1NiE<_ItJ+%Pm#NXlrZ50JI-rb3BLu*9Ibyb#%J&Za z0QnV7G5z@q`-e)HafG=xBLtD+|LXdz&_1o^Ybd)*bL-g(?N7N^$YR@mW|`6z6c-CIhWQ+Ul>w|PqmvnrLUSQ`3D^v1 zf52Ub{rKvqyM@T9SVXbg(xG&t;)?f&FjR7Jq5SYHYz1_(6vtsHBVUz!9LLU$pO#3e z*~DK1$A*BNxC3@l>$(X@M}KZr-Smhc0|Q|IOkgA-dzlg#S0eAt|9^3V_9Pe?;0|aC z22(I>E{!U*bJ3x$o;MX`^-X|%)Sm(8vNG?Y(detIC%4zV)T}>wUsT*rID597@P%-G zuol*5fYc7G7w8Gl0&T3Vi?qxqCOU&jPa@2`M)OTslZCmTFzXjG~4Z={1N=n}ur-#ug@^st)_ws^+)dKwY?=-#FSUx{O| zN`+^z=e_vgcQ;nkgEk8IqO}-V5Cj*@&i+ z>Aa9nbrw}y$p|neaAhjO2+#z-T+o#$+_cQd-&bWg{kzSTU`IMt-uO4=k-r5X0&0}} z3y7!%BwG5fVe!8nLYN*N4_^an2wG?|1e6WRu> zbizdsG^77`_dqH7U(Go9FhPWQ&{sl(pkEyl^>AUDHnppB{fj=5pdJZ7;n_xha3hb~ znnp%XcDI6o!;xHTUw9O6eSx6I0*=&I`y8k2+v^_g(f&Kgch9;2Ke;pyr95AF*9uOz!>q*UfWB(9XbKOgP8AD(xTZXcbYFnY zQ9Uk?E9Jvp0yg4J`3P5@SGdS*rIO@NPyi*UWK;6^SK1t=;_=VS$SANYJFd^W+tYhClf%xq(@-O&9lr^C=O+V{rj8k~gHN0!Q(xn@#8~W?WOaTj3`!xq z&IqxG%Xzb3LCZH>;gXqy-b_*8umxO9oeD%XD)BB;ST6?$JO;S-i4tB`VeSh%A;;5Q z62{CWUG4)bF`bO`gdMbm?jb5X!1B(+=mdu5FItlGoYh-R-eC3O|k3J zPhkTxY|bofTMOJ$pjTn(19N&0rOno>n`QqARXy^Z2*}&qT4dK`GGSx%AfyfFur}sB z!kk`sm92JFJ%!OXgfxz4}j zp#xsHrqIvx*$pzNSwj9hE1Va=98Lm0@gywQZops5pCReKPIeoj<^!L(jK$A)XS5Px zA~kA65?5TF0t&D+Pgih2kS=~`Qc<6GXn*St%`tqzbS~LRW+{*t(bGW0pS;`y_(h(h z_>-B7NtMC?C2Q^it9F|Su|^V&~jiVeJk@BDs$Tlw4mHch)4_DeY_WRZKhJHyB@xnfl{7Kt8euRWHWK4i$rO zPoDjX(O6gbvvVQ55Rab5u|OyaLPv3@^>;2edM->%E^71^mZU$-^pKz1_+saa+|AJg zg$@xODA?|R{Z5)V9T_(>iFLts|H=>QDQ$j+?2Dx0Q7(-RxhOemO|1$u8qyAS3*Wgb z(|tmq!-Ukbgfq@Ob8%YvxAd?{m~EZ^j>EJW6bsdsw2WN2q+KEYjl2DU$f^LaWRcrrW)6a!wb zVi4!+0qi~UhtuEgRx%@M++cPJtD-2m&E>*MA;08Fs#HMBg)FG*8>oj2r%F6OsEzkyjmgK>2K0*H2q4x%13^?P z*^xB|2`+QqRjU2|T+pE1dLHEm{MOG3uY#ZNul8KSw0DWUr3k*T$Z*J1YOUvOP3Myb z%T+Jm6x~X1Z5brLf*K3-_RcyiNo)Bks7>>@IP{h2arv&<%!|9nG zjsO9N0k2MjLA+>b1jLuClMSCz>{^=H6;zFBeo_srw^sw*Srr9KX+jDFm_7BNKSV2L zf;@u~qXSHI#qo@%pYhKd1|>-0IW`8(?bG_meSPUw`EXIt@Kv{X} z#3{kaER@%7qijUT^I{q%de9yfPk_+Z0wiGnk<|J}IXAkWr`g<|?Gcxr{fof->;=^SXDR z9s{Eu+I{EmCz7c><>yt&$1PC_Mftd&z-cvJ3;HtvgC|in%JByMejo&(51;?|+t+>9 z!2$Y1(Dcr?iK3qNK!opgMx?JT$6h>Jz6ob_bI{e?lZGx*)DrsoYwYnhrW3S>IJVuL zfn!Z(0y4MjePPr<(yi{e(s`QPeWIxtlyHqadXo}$?H~%`vr*mYOr~vaqC*5GAfE^~ z$SwCI$>_P%R|z_Uy4@P`Be<7Blp?$FqKuu$<6^9IJc3REJOaJCwyI6GZ&c8~h*#M~ z!LaeyWPo>=pD()_k<-%O1N4MIX8Itb;i|&BPj)yK$^+G>$E$B}dv@9LP4O?#uy;w<=lVsbfyo=egq|W6EU~uf|K^r<=Ei{9R>GM|+sQ z=0f==t@OFg(!G+3_TCZk5%*i)zn^qz4;@jiQ zMv?rLXs?3g1nr?qvp_qI#6hU!Y=CxG-j=Q0{;)-bc$`CpCFC?K*5Zyj_`H)a7N;}q!YlJ4X^Dg;wqlMTlvLM+coFBb?_Mpr^$DCJ10-E z*ZU%%P3rgl1vPd0C1$$NhHSpA;k*zcI)0kT8nRkM*~?TiAP(CAt=3QOYg!kizgo37 z@D-0|i1CKTlBkL)`Ow(eeFgDt9OM?=B$`ZNy5uy0?CY<7!(PXZ2#sZDp6zLBYU^I~ zO53Y1z&WCIKC&VTlKG*W#hOMeajEOB43e)I)pMX8&mH zSW=4&gQMh1A(?W_vp>88G`yit0f=NjmDcbQVl3~S4}>xk#ih=WoDf>gd@_LIPy$~H z5JuE5(hdee;GkMl?O560Oho=NUlwWhl0Yp-y>=nE3Q7aYU}Fxv^+iW5X6uoC&aphS+8Vw}9lo#@DOMLKl-=lTpEmy{cH%ftr(#%wIT2`en zk*oU!GCj8g)TN+Z(F&W>zfXcMpv5sOQ9~vK5@8B7g-nZW>T<=TDoUuGBhOPFwpBR* z##7+bJKR-d>vN@xcc4PL2Qra4`tdc^F3*pKyTAz7abExsV22d; zB{8$-cTZbk7-Ul7UMXT7B(=@!mSb} z(x+LbC4MPzk7$nVN@yNeJ+gNPFbt^PVIzgLdAl?S^+hi`@T$mbI|(nmMPhzk3w*2WUVo6PQo3?UmQbrnXd^7Cdq(2C_X?y4o9jj6LUHWpIu&D z5>Z-XMD*+BM0v$LSZ{QIPFp|5b%R@fxV*^u2AS{3mFvUrkm+Aa@Ov5rO3NCs+N}NF z!^lb%Z?)dL(Q!hkv9S#kW&6Usg-1Zj?nZ`VU_Bw~WOGbvr~@&twWV5`L{*pZy`js* z&3iX-0%l%GvCCRiMIL*7I>lPv*4;)b-5qv;Bc&Uj>(Z$6W?j#^RuWtDEI~#H#=aF3 z;^%yue#Wf0~7q3gQu)x_p1|mY6Acl@mk_~!TEP-=@$4HFV zC$O@4n|u+c%_G^cbD<1~*(f{i%RoIJs@#YP=N0-PJmO7Y+KBjTOE)z&jlBEy=|R2E zNh*4THBHt&v!ZwZQ%wR~l9OY9Ui9wxX!l5NcU!_8&&TQ2pW6~^*tUr=&G0l8Zpg^U z7=6ot(5WP&pg{egFW&P%NWddIAuxNx8s^WsGHSLUDmYgZ->Iry4Eji5Yr)z-=*)fn zEyV=~a!3!w(US8^G2MdBO!EduyMB_7qepDS!Ai^p^YCpqpkTBY;-K@m?q#gf$qxXv zYc05PKi6-;MBO1><*9`ALMV%|43$I{&Nz?OIvZgvO_8%=e8Z%zqtmheN}v-%{{oue-7k6dxzpYsW=+_B@pPKxzjr|^^UNNwfO0O5Vj}H~~_A zN~#TjO;f-L9p2n%9G8mwpgq;cfv?CtFuc5q6U)oua!of-^Y4&W^qMmD@jiD8i~`>GWMYyRG-n9+|c1*(ID=__+*PgNjz)qJr=zD3F1=bP=qwdO}=j zLjpzzTdNzOs;DZ$is&zYE3AgP4cbePk~@2jY#~@iIcO|e^UKO|D=M}ir3XfpN4N5B zc3Ytq&ILi3aq5T&#j~LSDJO8|C$UPq_WLu9#sYbvDVC00a4>1QUCoYVqi)}jVRuil z`Vz!;bcorEHr`WZb6k-CEO@V7?$+&OApVS*t%ne$J7<*R#`>s#K(h<*tm66mfg+H; zi~Y#E#7qykWYxx^8Rz3$!pVi;IfZJcd6RqV37fZL=TPf-2pTdHmrRMVN^>Begi_L4 zp6G_G+>e@s7_D3_-ZIE*{uy$}^zH0TREq<5aV!la5!7o29DbDPRm>FpQVyEv4CO6e z(5V$TNfVkj)T(7?#JL7#nr@=HwEU0iZGXA)dL{5mJr(5b?CkE|eNAzlo~EIbcF4mO={?*?}h8r zg6U5HcAvy%+BAx^Y-kE3&aW1md~iLUVH|tF1T2=u3C%~H6P(~6qRsXMZs*mvMQQHV z@rXzx>3^_81o$EXu)q2qAkH?NoGO|hF#Y}=>R|y*G&peMT zS_GYy&_Q#fcoF&XmYSd2wX__!t&W`MDqM_>ja}-^(%^Jz-6!q4HZqBc!jq+{rfO)6 zF0K&TIx#BrT@~F6s@34jQtT%KxfMIiTn=OE1EQQQA*@=$0O|6Pj63Ad&h5QUu>ym68yhtTznwh-QcGLsh8@5MUB+ddcCNM40g zq*7)ZbgZ*^LIsIg)x5|0G5vxDcB8aEsWPqQ0^e;lzw+>peEHx@perNNJSOQdzGB1R zEY2K^#T9?h-rFOtuSNr#)YysVt%smlU4?fN%^6YA_De-9_`niB{HhCt5f+SlCF zoHCW|8rd02D6;)F>d^?di1!pg?t8d4C|{!eux^XY2gZ# zXF^)J5&6ect7N;bqX05?rv}17g9TbRtzfQh8B|xhObD+h6T-TX=@T!~Jbk?CeM&_n zwRIw|Xp!;mx9qj3E33t;^>hfRmBf82quY?AJOgTmOiUD*+W?a^`8R)7k33w37~9o5fewYFhno^IL_c63OQthhbul76n&bPosP_q2H4V+5Xr z>7zT@lZt39mT(2*E#jkbH5jO|ARrLP8JOw3eMX{5efwMUP*OGXZR@_Q6L&tHv6kzC zAiH%03Bfazc500a02*d{d<|XbY*6-EK7~NvkLTMOQ=B)>2`n0F=9J#4kXm zQPQaqJPYg~G14Na(E?6BY=Tf63L8N>lwsEaj&lg_HZ#I{gxTEX+DB2mzkgFm7y*0R zE>SB*Dhxx7j9<>p_947L`$dse! zySm3dH%(TWX9gpup88lCcX(OT=Ye+v215Ux4qIF!Xz9{=Osba+b4MQPLeY~b2E>LJ z=Pi^i2p3bn0@ABiT9oIv3)yInLnJGi4ogdWw`koj!d6Yw1EmRKPg-~q1|Rz^`9&;B z4Agpd8Z2>FVCW@a=-m|b$X-BgIKZAGE{Qp7ZkIsW(J+yYD|a4DVL1gnUUyly-xl{= zuX0c5)}Da#5x2SNGa_7M`@c_9`*+P%OB7PuMd`4GCWC_@(Ty2~Yt>d6) z>k`X?kT2j8CG1dyNm7D|(pS7L#WdEFZ7_Mrdae|J7a$q;=I*oc9+`UippNhzLq5pH z9t^p@&=VK%9{W?3g(Y4h`*`tNP2$RxegUz@W~!))nqRc+7$M4yC2{@M+)#-~=TGx} zqImVnJ0J-!br{%yY$YkI<&zh?wXEN2fQB|f!dJlrn3!B@x*EOg_kzp1Nskx%ylby>th2ym zR?n5t)XY{0?Q*o_=YD=*v<`~C^%69YDPNl#H=vv-HcMHEh6r5P-;Ybj+&pD#e-Rjx z-aqf?>6KqygF@o+`YUs$m7eXFc^EI~TiC}cr^1$Sj#Ujx)~Sci^-^VQoF+Y?rIw~o zWp!Fl{Ze0@&16jB6g=9XOA2d;CBEBbU5gS1z$lAhLW&Nt;YnC0+qQD6j6y9-WZc$?d**2+R_b3A6lx^h0w~R6 zXw^PwAMTfa3rggY$LlGv5hw7s*60v~Qhb-47p@q?{$5fd3|@KwrmJrqr%~e?bxxcW zLB(sV{z5jJ0@Yz$e4Sq_PK$zZKJ}~}j=3MiyIb2pDC9eR&1tgNfX7@WHKzo)43yLC zbZM>0Z*zLOx*jmbe|nrQk3Ws>-5myVKOi~Ku_I5m>M0%24-`J@I2MZQK#J!$O%mAE z`nEIYC`=Wonx=bwTU|xb2g+9w@61UTmzR|oayMOo$?AloxXyc%W(P_&O&aY$^`rt` zl>PAxkDaEankj2=W7cP@jF)DEWFTcU-)9dreWsAoHNt|Dsh#9iA#`=srbXv%OnB~gH3d!a z1ib+9bINK$9-{l}t}zW5e1bX^@LvZ=qy)&N@)(rJZiE^LF9?Y6srK@;t{ZhhffC?o zSU04^re~zS5V9r&PL8m{fCFG<_5OMs6q93+I+eb3)5Ru6${BE7Y1F(n94@657hu!e zo%H5~Ur=;-Zhd}DpPUtBS|*K zGvNG!6LK(sN>D}(T*rm8*r%(Rth~A!j!70UUHQ=juvMfn_hExd`;R<0n6waK%`mtv z4R07BlkCEIV-TjOf|hs4p{48}Y0RfXMb8wa5t(#Q>YSq$^%&H~=-AmU6x*Z_^76sT zYp0L*Ji$Wlxoqj}Tz^VRvjzw(Kn##}F^U}NnL5k+{R_1azG8&ycNsYwLZ=CbjM4ga zZM?52ZlSG!GNp8g&Goj%C);lzA36$!PQg!48In3aHwa|FCDQm!(3vlIRpRqy?sb*6 zqrqgIYoOWNUZ)ClE59R+hq0_)o79D}R;H3MdyqveDQNWuniZ{R?HW)(7r%SHe7Ez8 z7OVYLcnKcXQfsf&<^4WV+9e{0oKb?#Vw z0N@*k*X#joDRwwu_7NvTTrUha;7MG%mGnZ~HsDAoxz1N?)~wZ1x&R0b6Cu~AbOjW9 zv;0?Mlwn;Dl^hb4AJ02>GKxD%@H#Z-GUNi zq|G7Qs72c3N{`I+7)@{7b+wykxU*DNJkEZ(1 z=l}mM(X~I#RO=(m9!2R9fs3TJG-{uk#$BSn6f}bTm5%3!96(sf&`ykhQGg|s! z#7J?>#zI1Fyv9|A+tZ=Z4QdJ3%iWgtnxlA$`qMNswl`=EtDGl>tG78KPkeuH(6&8F z>|7?V<$S-(HHqx2(%&u)3-cE^MeAl}N*>&Du^seh{Lu=FX z+WT-vGt-vgBQ5m2#wg9V37dW0N>7nKvhxg{B3nd>k{XW+aXl;J=ElQw=!TyvAEMQy z32UcI6w|A&<9+L+cJ^Sy`JJ&>KPn~sLIVX;#c7qf?%yxl#Li{gzbKEuxD8XwPDwf5 zSU~JwdXB$(us}fHuKqpf40W;89$j^H>LiccS2%J4BWpfG(vIj6;5S6#x_|sYrzrRI z*8D7y^3-lTR1BvvD5ujCp8V`fEGGv?{QI=i9>Er_M8x%BMy7#W7|JQ1xy`-+B#!wa z4pG2)jqPpUn!ydyzBT+)2foBV7g#_j;fDu9Kef9192{IKk*M$HKOXajK-(TyGK|N)-?z>+Nr>i%^2TkDH(;F-fRU$lg zjy_Vf_7%phEt_!n6$_b(7uqareU=(W8{bnTBbcl^tV{^0HbnX34zU2MfaryxeSSV3 zo~Sz+?UEPUr5^5-=^b`K9lyiKDdn~7Z7P2PE3h$wZb(aWR!;rXIE-;_=-zAyeK+3N z9KFC1Y28gNbt`>w#QU?<^7DH>o`<{8O~J6(nAt-xey73%y$;3kC;pz^PGP+9Yc;Tt zt_q)FLBI%?lW$^~1`{!udTC;{S~Kc{Ar0YO8JqQX&(Y1yf5wNeaGaplIh^?J<@Wcw z?^CK;LX+PQ4DGHFx|g_G&WQpw&45s0KnzuoMq6&2tYOn_7#+8l+V9_`J;ER3OV&}n z9Zf3eNFyat+ahTf>-6R7)M3HxqLuHAz8A~a7EPb;%?vJX_o3NOjfgrF8pP$Z<$V>( z`|4unTevD*3IDscYs<7n3^q_d7%A~&D{B<(I@Z;c9YdIJ5vLz1Qn@()Y-gXgUE_EX3ed!mKdy2=1 z+OXnk71CwQXE|)3Z)48-o79=3xRgGLic_)Tjo~NT6xBG3WAkqtm>$A)L#N6W*Dv}7 zF9kInKjk0T7mu+cA$i?sMlF18a;+QtbS5C+=uS8GkLBDpOx0HKyGk$ZkWQ7)PQC53 z1GGCQp&P%HQJNfDUeDf~Y;$y7(PZ=P?a_UTOxNVd3EQo$Zx-HifLUB^VtS_3++bR@ zR&KPsXFnTNzgy5=EQS>37;Qs z`hKGZSvf`Jov5}irJeeWIj2^GbL=yDFUU2=wh!0QA+{Kx_>s|uarLto8Zf6aGkk`} zj-q=bGkeiIZoyh`z(M(fh`n}2MJ`>XYD9c(1hv3S@7C-_H}+2 z3<#Lmj}z0`p&z)#KykuHJ^j}}nV$0Y3t|m;N8?k=Opp1~@))B>`PbR`>+>XcVY(5n znJ~6&WHX4l#i|yVC~3KmD0MB!9o}9FVhZl5<|N0C)?CJ`r)ygI35rfmjLtaiYzV~5 zk%Z(*v(K36;4$A@a&Y0FFgZqdxA{_hNpHb)j1v=4LRa-syCvOWYq^SPYvbYL%PT4> zQm}M#a}yC16nC0@vnlO5|HH)AmMc_#Y;5dn(Z>3^u%KXOTH2k=Zp-!rAwj{_l@YNB%wYX-Rov=o>ro0CngI;T15S~_c7)KKzQ}~f;Rahwa#QRNNmP3COtKxq z6}veI_pP-V)I}RDRSC_zoWL$JMyu5wJG)Td@{XnD&6TUjn@f@`LzSl%hg}}RUoU)l zqxl45t$L_K5hvrXM?T-;=F{Bi!>yi-P)sTAR$~|lzOasPq>y=i|Mlt#em^W0%Mq#g z9BZL3#u3>xIC#CzfBn9NYR=vD&Y1A6by~c3=}iY0ny%7)`I#04_;2OHo>x2is1}{g z@25`(2>;3*IFU={Sbm-1y8jN|B(VeAaRc?Uh90k|tT>vdqi8KFE&U?;BTTq0vYJq% zwKd*o!Y|`bH@1jO70FzXFx8?JdU>C*2A>~F&&siRa7XBB8b{__(D@-e^D@)-EFp#( z7%k@K{;yx3^%e%T{p;K6+S)7yPoP+MxxXeyYilco)2s0C@Y@XZ@;O;q$_$}D1_o%p z5hiMza>ad4;i%s8Be|JYnnJ=E)JwhH5xwUdwQVh8i)FDova-I*pJ=aKv7bhic6DiL zXnfDhGY0(;TvcB=6w4FAsP}1I(##*3H0o*DZlIEqIx#t?_Z&zIGu3iO+17|? z?%46NU><#2Cepvyw@jqm|8dyH>ntvX?e4E_boA=f5f)v8-H6aonG0WDne0=z3x7&{ z>zTVex4)trx7bGZIsZjIt6+~@ybL-@ljF(lnZ4a@b8~Yj z82a+8rk2)gDFZ0Z3P*UN*WKOS$zOj3c|J1Z<4u4ST!fUvOx;!TOByDG>i_DoxxKxY zQ2**OqmVa{7c3kC5D zU$U29;ja#UX^kja8W_1n#hHKa#Bk{`d|30uj*-L0&T}k%MP;^yYxRKBk7eFi%ICjU zh-DLzn-ql|-Sr0PnyH^GaRc7CQ5|ZM*qh-6fgg5<8*JZy`v%dY}cv>e_y4g93wt7_fA=WFtU z4$)C*O7dr$iO0f=7l3d+s{QzD1oiCC`-=Vh#w$0Y;J1muQ2bW9@hoJr8~MKFRm{ zM_WFPp1QKkEYPn+hf}ICK^(?r8blo;BJxot%IVJB5fm&`;EFcnk&1XX$>+^pD#9)F zQCHj6-l8|V`Kf3j6{q6)Q1Oi&Y@RYpc&N0$dHw2wp~5($Tmc313H!<^oJ%sPhVGA? zs;a{U)oJpSG;w?;RpwA({D~9|`@uakmn<0vqLJm5+1e3oW&#&qBz39_o@e%VLEXH6 ztN~R`4A*p(;!=2}HYxe*<)&Gz@!GW5gVogIhYiY)?MezvQnM+Z_aTxwr_6QwlQ~;t zQ?boq7vqZe??c2tB;Dr!-npU`&#U(+KP$S~b$)v@P{I{$hOJp5Z1;04Gq5OpCjMBgCm#8$xm8XTZ0#-7^B>?j()L!WmF^pGih6f4dAg|qBiHgMWZHJOl!eCChR47?{MF> zp2xA#&u;2cgetQz-i|b^fKWGCMX|}GfM0xjnv-LzQ4V3qH8uUiW>%Anb${7-=F@8D z#fy4o0ZG{I3xx#_@696Dp6oZ@*WB*Z_)76J z6_2q!Io?Anhk4=n6W>Im>S-ybph<9fTpo7#EO?V#XaB2_Cqr_ zQcX?G($doLl_tkT=OSqoGIFpj)yDI+R7eg!Wkh}BKDze>@oDrYSzfn?`+H9c2o~c0 zv12A$w<#$pU#5jAIl&1-#>QsjwLT|}3=Pq84i**-9sC8oEiG?$7@3)6rc#WIj4+hx zn%0(yFrU3ibJU+LxLqEsIPbG;U(e(9qvsYv|T0`mkvz!0mY$i(na+ugHwC;khxFlW-IP({9F2Jfy4daDUqfDHS zHgxOXHFZC!Ut(3gF94nn-d5s!*Hd1vA5rZ+f*w`OIc>c{imYl0Z-Rn=dG%JFNmy9; zQXJj4XFM`$&kGqC7>=T&GBY_b2FRUF{tu*vk<4KW(+dkKd)O1hPLcIjB$4QY&cCLr zjXUVPV%7Whu+^8yi!?O3-O1SorC}DyV{tV#Qf~Lu)x&Nx#E3W~pr3sS&CSZ{ty!R; zpfFR?*N@fD*5-)Bs-iREt&6vYt3Az%Y=^62SP)?Gz>2gdNH9(-PNl@y%K0LFe0)L` zoeZt*+}%a3?&#{WIbM*yV-S+tvtF|&`qgZ{MO2E*U~(@me!=nF_|nLNDCzeHWkW+< zk$G_uMd)M&f47spt`W@>`>8z$y%g>IFjSq@C_%S*fI<@xd*;}YxIpMXPuiSZ$mA)vEj zz&(W6fM_#AKMu+L!OX#-J;k{rRML#STWW9VZY>i(Q_GF7tnkuNOPKMp6 zCpA4zz=A_~^IcG`i$A2xZY&v-^Q`-2e*Bt}KoXvt)pBX;-5m18ON`E)I~UmZWD;qy znb45v;>)J{$6r8%1Hkp?TrUH}6Ke(bLF4!%FG6w?jjCpxyaY!*I}5-qrB3gGfHt`h zfvFi;#1jq4PQjC>Qn1yGV2k!EPMmAuhRZWOd-g1MHmJTqkts|oQ~Qyp z%PG=ZC`ZR(Hg(sTPUg-6@J1QCA!GKD&=SO6e%0$urIR7NVL#X+6=VD&nanUBE z&87f$r$_nn=y zb`5*^Kc=ovi?K;aoa+l(P(`K2wX=q#!OqQeCOET-g|HmzUplvL4Zl93j3vdIPT2Af zCA{&21H2zFA@1{V-yp{C1FYR3m$W@NP7UKgRfzP7)n z^-vF7-YbDu@#Ic~Wwq-$JeW8m7!rXg+kFks1rjYT9xgvlY*1sU8mU#^UHhP&xv?~& z)-&{xW^-$6HWYal4Q7UC>rCoPQI5g6mA7BRd3oqVl|r!AUI*PJA}0QB=ep2eUmp}2 zdXAb}QH1V``Q+r}uLsF6sR{F8am2Cwo#YXPn87@gBXC0;QQfhhCbIT}Ojflm4_1g( zqc65zzSe@yZbegJ7@Z7%uJ~)%`rqM*l#vmzUwUIDHQVB9OAf3>$qY@7jfPA2`rS_9 zgz87d?ZdDKZeK5(=i+C8e~PK_{T1fKQFkv;Qsb#Ulk>x{sI#3nlpL4GFbP!1)BPw3 zkw086iC^YCbvLwIMuf=Eh7lf$3cB|L_G+Mw_?2DLYblq+TAo#ru)M{RQhr~!iMj{b znb}{8=qij#z88sY?epZCqY2nk$^Z#jU<0ra(k~_@B{7k|j*O%z-N0hP#R@OS-9}OJ z7_x=RA3l6IdOiLH!7m$4)y=1ftEatSkRKzShjn%J4COtX@v6jOq|J_s@Bjsbg(q4ZEQnu?U>X-u+As0qUPvyR4hCIfkbFX?wh9z~PxUL?UFHXgj0)f@0flRswmF*g(9 z=1mjqONH0$l?)s3)E-5lTUttD%D=tG=!~=v%j=)NxGqDCtX2%)u}vPvL_JkMb$OCH z_zHi_fc;euj_~8`*P-bQ_%MJwde+qTB$f00sky*v^jLg`cCK6FomTn*_Ol z$xf*j{o5s%6jkHy-N%IFrfW=wNCi(~eQk%z#l_wZ9xEjU@gKo*#T!IwIWTeilWr#+ zK^dngXm`)7ynTs@^6?@1voq(Zsb?oA8y=l;a&jsVGd_vwO@K@>$rB{9#J2A~><4uv$OM? zH*ZK!oM0&Z!YxgLBZ38;cW5&cbLf|5x`X#gBcTMY>2-w4sc%cWA!}>$+03Xy0jJ|s zk4vZW?4gGFro+d4^p_XujLhNw{$`iF7%1Lnab1EvnQx>`i$;LX-7NXK=%^vK9gJIY z@}*RzNMd3i1HEf!E}XqW*&4#D{$cPATBnrf$Yf5Uj9R2`+?#XuQiEofhP)QH^tP&L zPj3i~VW_C+U4BjTPhJ-zJ{Gkguk%qVHe7t?q{brCM_J|3w>YMz)>ay^#|+_~&6;Js z?lY3rzD~!xP4+tBX(mCwg{QF#9UQ1acf=SAfCwxLfd@n~iJzwQYjm!kvETQsKT`4J z&M)`f;nRAE;4b~K=Dxm|htGhClh!@^WP80s_v^qwWkv>2>HX`}k`KdKDxx|phK&E{ z9VC@tLRV;6&c6fJWs{_YUL8qNsM_LWLUvW3I}F=8)2Qd@eNS^-O@Ul)RCvT z7Sk|%0x?-xS@ZbSDYF2@6fy6;>nd#eX|S(NPE7%Y;+fJ7&%GUYs8~R?ZCX}=&^ZTa z{=qdU;1B4nohU48AY4W(rV!u@FR#5wPMu9wD_h$t_tnXK(?+bLJCx|W(r5<9BFBrn zm7T4ht`DH1;xR-+fXc}^-pNf*NLG_!AYCDlxuYC?QR2bo^Wi7T;DHWS&;5kIj*%g5 z^salfqM4+UHb{r|^99Vc@s9!vqT1d8)Qm2zAoIu^cn`y;XsMcH<9T+!v8n4}Vk{%# z!XF2|&E-3K1soQgYf3*cj52Nj7gJMfl96RJ%~rt6>3-v{@b<5S4|C3e?_!+mwQYHF z*-;3c?`hVynnJ_5ne4gj5G$We%n7Ag)NsO{Jo3kL$kCT^D-Hz|d7T`nyPVurEk9S9 zCjs^dM*7UxS3EAfom9h#M5eKvu=K0hQ=IUX3Xe5wJv}`;J8nrgf@?Y|JobNBdk=Ul_y2!f>oiC^ zArv7cGkX;xBT7T&osqpV!;Ka~_PVW9R(9FMO=OR38JRai_PovC>$=gYbI$ko`;XuG zp2z2VT=#Xouh;wae!XAw`FdZdl2=_2ezT>^hYhK+)#esKbr0flu*nb9BO;v~xXs;5 zY#^R))#2S6lmpV6QhOhlUuyzaAz|mX{uFjU?0*BY^*|rnCaBNZUOdjJsty0n-aC)Z zdM#Cvzkg`nrWZw@oqp`UN_Bh@&uyWg3OfzKXCUgHP?y~P8(}vB0C|cg&w!7 z@9xuRID1y$Ug}Ktibf^o*6q$EljLN_{)uyzohh(044-?Dt{S1mA2;`9kc7y_u8Jvz z@FhQbD=)lyL6AArzGwqe^MGRalB=0LY~p1e@^=zZaoqYZ4=l}IRX`64#7L5?u&!OD z^kkQeEMlt&?n?kzVG`4ULx*~DEp*Mz(?s9qSdHDI>@ikSBDY}#%i%QLe~nUg?(_4# z8X6kZ)YOnt@e{%Q{Mki8X1BWZ=<#FT#V4z0!Bear53JO7@;|E#PsTES|73Frg_na5 zxLsI&4y6k5$Sa2{6z!LtZVz8jITIp#@?=(Gk7Sv#MYgXm`&`RjM{exF`(f|IKMPuQ ze_UkML+AJc;s$l#SS0-<$XZd{Dt3%Z)A$U6B-fm9beG~T;LLh0|qO|nsw~f zS94$amCYYRpfb3`V}7jfP=akX95eGO56&aEbYZj7%-)E68LWmQQyw6&9GU3GrX~S$ zJVZ-7VBlvRii3lLbFLU)-yMW~1T`D&XBSw4h<)~?S7t@Hq3Ic@?RGsLJi&|_S}94o z21%zYSQ20KjTIAW>(Kol2y{Ycrv$ON%mWO?rz&Nx{Cpx0IFb#yhxt zSjEnvAlFx>NR2>)d{VO*P_$7YE~Kx2d>Z1R_;Q#^TF$WLQ-tAI8qW~XBTGx8Np-(_ z1ziw!ERVR5;^78V%g7By)x;0BkBqZDM`LMF%E}l8_CMCCc zu^`DeunWgm1 zUFM6(5i21A~KYq-UTk1SgRpei5?mTSjq-Hmv)_uwPhbzAdh? zLS@VNhmYyT{MWO_vmYGn4hEA%G;a)iggk}O1vuEpk1JF6RT;*coa-)HIu>eA)M|U7 zFvAgMl(^V$_?I-+&YDJ0^P5v4cW5gNH*a1HH6Btb!D+)N{Y!XkK2(f;9P!`av6_Hr z!V5;hkzI`wfocz!bcmp@8O}+K`KGR~mE8!RTC<$RL*03?L^!H*%;ql$6|Z3DWUv5; zA)ldl^hMI)>V=L4v9Yml-@Y}b&cb4`d3kwRS@&WTxB}6jXu0N<;o}2<(mxvMr(cgt z{P^)BG=z2KTG+8-b>0yEPDmIn^Q4rI6mF^BfA>NQYzEV=oCd$iYREL1^k5x^YC-_m z1P8dtAcR6^#3Vqipz_}O!@rdd1%Q0$`hi;fTnMKwxV)|Eg`9{kor(F3$M2aVU*$GA zsfVz`X5!mz$fib1U64Kw#r3O&&JMy4o)z^qVZ+FdAD1}YOH-V$-<0Y2E=sGi8(7M> zmLWJ;uQB8fbrcAfMQF|q7H0mnWJ(wOfV7XL;9I-Q!1&tAMp+VyEIceM?!4{n$Z_}L zXYal@d<6d`iwr-biuGc7kx^fHn}i;kzXwR&_IdYbvy&V824EEKoYNAn4G-@U`n1Su zW;Xc*XV@FZV5x|ReO#Magyb6T!z!OD_LYN2Z`=G$I_=Ep? zCwm-#Te`NNtXcK8T_1x$s-fPxQvVp>>CRW!xN3=UQ|tGGyMYt?87U&QJvnv9GL_zcDiBBGd>7*9{n4wgq_t(VrPQc_dp<>azHeti2?$JDe? zzlmXbIuL$uZ*QNNn5a>M6!X_Gp07RN=ElhMmxCY9uxPaa$OkSidfm<}<1p$K+!wcF zICGgGW(~)v9DzPZ7SL&*Tovx#4J=CU!aCT)UGV0bHB3l|?c>L%dCjh1E{zV_`~@!6 z6|5z%z{+_C7qA6}TIx(puBFUH!R9|cWceKK%cKgK|Gw;?y_(sO0eFR{hD^r~tmLMU zIMmy^uBwlImq~*RX5nZ^nHHnm5_Y^&5oBb@S#|g<@#(G+u>%JV^z=$bdO|Q$kI!Gx zI;Na+_-S{gBGec#VXKuIA$3uw7H~O5&-HuLt5A;zZqR(l)VLryS{26tyN&H6-_Nk&FSIxxZT4`$C&etv$2 z^NW3{;}uDh3qKm7ppgfV4aBO|-@e^v3Fe%;I!rZVACJX4Lh)}kL6^e20F5{A^iRDJ z#?8)()4YGk;U(1c3Kqdlfe42`(q^E{^OEYzE0ajyL{P32`wK4(`BgDLe}891;lU|) zZu8KP5UK2ZK-5F}@!desa3= z)ruWOlkEN6T-(V)fi!1awPQ-+spBzsE{tS%>G-4`T6tAxYjNVb1|$$rls62uX1GSe zlxmDmd9srU<9a{e$y-~t`aDO+`AB`|h4bf|ZIij{tfTq76yjy2WsjI_WHwwLIu>2> z41$hRxfb4OOv=$rLtbYQR7@#JFP!+lKZ&2;bmD9OWWxLF+*Vbm*>Tk+4hJ{PLeZJ| z@^f<7ZhPG?zI5&VlaNu<^ZbnZwe=xS3X`~{ug_FiJ3rPIqEnofo!ypm6y;wLtja?6 z95O=t*Md4pX6Apkb22hAPRla}N+Vjn3^&$a>QQ5S=ia>oH2qM@$@cd4j-v^2n?33S zo2$++lOC_h>m^P*Jw1KI#0iRjgc$(r?E3YW(M(m<)lE`ZWY3d4*t>V{)4P&`=DACs z($do4n;3`1uo#s=|J0yGH~1p*?C@78>V4^v*VB7n*2`M3S_hscSw$OB-_L79<0f-2 zD_57rLDh$932B#hygcQ0QGY+)ppn=~rlM`)$9-d8=8m1}ICH%H$a_Aue^4i}i-VY$*!cd7uU9YkpJPu;Pj9-fknrxEXy;kTm{FM4 zeEYTph1Fs>c*G`%0d;BeSb;yQV;ZB4Ob0d&*>shPvyQq5tQ;qkh`1ZwAJGh};x!(c z3YzW>rz}`x#sG}lpHnmdm2X*2;a7Upc!hxT+@|gr{Sm#(b_s!l&wAgOIsQc+{PbJF z*cFeFg?mB7;C9tdmVh&El#!--CF<$Z$WXSps;{gV{)eOy{XAAx;gCCyZI_iP=Vm~y z7n(erxGiWZed9(Ox6bhc&R;J$rQEsqb>g`sSUFQ@u+8tjxXMq8w}Wi_U)X(&QS3WR zWU&|gW!|5^#cVmVy0nWf<@5E*XydcKvaX=dnEcStFJhFEOw89;B!44_b#}1rz4B4&VHW$ummxCA8)w`-wytpb4AMKqkw4+dBq-qTg3AvGK(l8@Tz7)S7pSK6{UY+8S z<=AxwWnMFOCH~4bqp)je)toQ3r2vznKiKVLgPVDXMO%*Lq9d-u>Tat_`k8s~haeTf z-p8n^ejIXs@Rf;N=47bW6&H)b#)u`Sk+|%QmWpY7|NcGf4seNQW@fArTLh zwi<1YpAiu+Jfw2}e!vD3#X&*zk`G^Ca_wy*+I}cfYPh(ihJCR z8ySf=t~o_X2|L>2Yv;Fbk5?9qot&J8Y@zTc0PLIY-?Iz#!oLAS#KV9JtfU9P9UhMd z@YUNL(_T~p7*e-auZ~M$p|CG4EnTsnMi>n-%jeWv;4zjK8n4?J4A(_~hdCsiBooXs z4c*zq#OsRkbYsya%R$Uaq6FUAE=`@q=Z$w}dz%14pvK`CUwDE)no7hm+?yDrIoJIG zpb5#z$z^2&}& z1jNz9z9R3TCauVqs-3qmgwicjll9z>k4_ssr`BzS*NY%mb{+;W&FFU0-Ha9C!!6)_ z1E3A2UY0jP$!+we6VNXD&yUE~^@0nnEQbw`h`=XiO>1dDDt{?kJas$=46$c+ZM{1b zzVwMr4iFP-jSgnBe@59p zQ4qbM9rNn~yC8uS5s3y|P|NJ-b73 zOMcsAtY0bsvUJuY>k=JyTHdoe3g#o{#M4Zskk!v(mHNiANRU_5%(vWPnwWL%LddPF zO$Yhw<=@_XNfHPOYEBdz8VBCjP{xpswJa`_TbrEvrD(C4xdQQ$y%)&fxR!p&B9(m76U?vvyf=mVwa zVOEUx_Vz;=;L1FtZOb@YJvC*P_fS)lwqOz5S^hp&#ynE~La`-Wb!q9f&UlCnLrx2Y z#&BQ0yg4oScHD9Q9N3b%d3gpZZlc}}@5p9KEt4W5BFZ?Pi9`4%n{?9RTEPZlj}?a* zQMLEF*2RqtYZ~r8&5{%+?jpIZWw`6ELV+!=x?_~lxJ@(dI2Y|-5aORb8{)X*WFbXS zU&gB}MwG~>#~%BqwMK&_C(v58!VGk>D!gCEV%D@vzW{I#Fz}h=?etb#R%HZpDK=a3VoG% z_zdcR^E=2mcGSg|3pWtsHHEK6$k>|PFLYBf&bqt3%P?pz71&z!S!JiyPMp7d`A)A6 zhC;I!$m;T2s_y3WU3q(_Q}Swve;gG4s&KsAf*=;=G%B1=;NWQPry1qNlrR4APUA z347)YD%6Vik{FSJYy^icltJy13Un&X@bx46g%FtYXaa`Q+ zX|=;Q-OEk-K>qR^MI8~TXXHNra{kX>6wa72v!=d*1YRwFCtPcfSEdpYy6bd_IM^>y_x+`b~lxwh0Ea z($%DvXDQWd4w0x9e=>wZ4h}-QcrQEB%2HpPeW zy7+eNdv`C9M#%2VK_X+fNZOLYrMFVWy7u^)7$CVejHl@nDYfAH^vIATZH9iov#5@D zd*-_tFEOHIiReV2xXGa6?od?n>bp?)l?rhGLRjz@5}SegP=nirvR#V$(2k@Nt~L_qF7vDT)703}j@E zFD#Y4fz8Z}`QIeZKuqxhF9SG9r>jLDK76nkuHzz*T%9q}h^!xHHX%j5pz6*^@aKQT9L=n(t@RXsQJt&R%HA9lbbe}H!!MY8re&r_ z-q)ege8vjuHFk>P;x90rT1WFnhWE7 zQmRe4K1JhC-cj~M^zC)|ud7xAL8gq#Hk14xxGI9xTdi?50i2P>=`Z77$u-@-<|e8l z&8p^D-Bn|P=jicC7C6@L4@F&$mYgsCse4E#_$NiQ$K;lMpt$7~S)p|2oO>3V^XegL z*%N0_9R}}43gp2C2l1x9vANWrY;{J*d9NLxBFqmG@njXjax)L#s)47y+ENv&T$~Tt zHpp`b3p+N&-T(~(A%N_0KWv4foSfHEu!@6kDj+#%L>vYA`1qKajRva%t*xy)?2-y9 z$V!eZMJgK@B$(yYL+LitbBC6emW|Eg+R7pdwn&UZ=3n^6>JG1PjQJ3Z5w{3%gU~YR z7=;MER4jJ=XL~w0RldHyknsc9hAbD$G)_iW;k9xyU<{)V<=W0Nw97G?LzdrdVj;VsXM;fjrU9lWi6)NoT83JM;$q4!@`)+@nRp_S##2@0N!Q+lXa<}=+V2kl z##Skh4qx;o)R0Uh8uDLr-Q-P<(TgTMEO%l|p1IK<(~pUAvh-!;Y-;D9bgCV_vg~7P z;WW|u@QQcJ^Uzx=qq94X?G91`;0A=S?FE+z8tBGnQ(T5z1cziz#AN4+1Y1YOyB@cM4Im429aS#$bcm7ilEz6%n}tL>#>OdQ|;!Wnvv_h+3&K{|(TS%*POk^!|k zf4&VIWEYVo;+u_Qiw*j!J1+#C7>nLDehrK1H*`O`C*lLN2{=A|H)*N#J|`zSmXs(0 zXIS$-KCd#ul{IqdRe8TSY-hM)Scs@TXYATHAdKMP zw3yG7GI4VU**E1S`ZFQ4)X#si^kPm1IsrRngJsjF+Al64A$j z=UESg0kEr0YA+-O*-P6n?^*tuAtvD_5--Z{9WX`$`01I}midkYObaZJB5_e`6 zeO8Oa8Ct9OumS>>zh@YV3YwbzMmj7;i;^U?Av)zF$B0eFxdlf>+-3m`~(IwGejw9$yS2;%fGP-DY1kXld z&pk)-G{ED`l|km%W5gAd$b_fe#v`d(29(`T#6|`Ll+2~bi;!Q8temn+eE4Dj{gO8+;z_n75D+v10>o__t@|pLQa^$CzIyrcJTr4M z9h~uc$#~aHX?~DlKtzPvg9p8ng&W-yh5|?L-n-XG1~cnNT+oJ35W&4DfkJpLWa_fe zccLRocA!r zhVIP$Rmr`Cz|L65N>G>z1JHnV8B>7sXlvIf@I(T#ramUB{8gyIeOw}VZ>v1$Tvcky zu-<~kuT{kwOJuQ@B)9gSMS4FgYHRJI7)7|wc0#kWgviSZ@lwE<+*e}R*PeHqcVQf= zC{#Y^H8w+E3AxLiI=)59uBTV3Yifo>M&9BwP-|IrAJvR5m#uz(U2<80I|6Wi9rV3F zc>KMR2^bcn(pB8xOkr$1f6Sp7aNgh%t}RGa!*P0bLUSyAd+zgb(&YlK52?e=JUkE5 zLFFyK7jSYFP9vEgKep#t8A3k-gyn0rc95Aap+!m{FdqnfL_`V$0s^_944e|r9W*V-A{V<#vnC?Ii0M@Q$Z)nfulIQW{1e{SWYcLU|##7R~a z9}DSaf~F!Z!B~9!n5uIF+$QMPslVQC>BpL)7yJZ*v=K2F0Qxr6)FR9*-%7w84U*R+ zC3(Ej5VpVu5)~Ewp;k=%!CX_qTuX}%>iv+eqQZxo2uHdNJfL8^>v;UYp4;N#3vCij zBpzsd3f|MUU=cbRpPX#KBso+DFCGvPZY5uLW-4H(6-=-tR;mkInSK3z1^@H`Wvl7v z6I>#2NS54QAuLj9_w2x-SC^YVQkYf>4ghS3W`R7J%kRg7gvT>n-_ee@i9gD?$n|?? zJbNa}zSf(IrgFH@#zUO#!H8NOhYiCz8R&T9LiIJ-w&L68Wq!0DB_JHE%x0{X=kyu8 zp6eIg!LxI7>$tyc%6l~6qT!qR<%{^xyfEM)x2Pq%UH1Ax1n}HW>;C=woOP?KcngrO zef=CAKzbdy|1g02QN@~h4yn{)Ke}~J@;3*a4t@Qa=`_8hYxBrC zXj|hMQ%`zwAySd~V(Y22=$q#us{QfvMMg8vJ=4oP>4wz!M$^cQa5RES?LKk(cuM+3 ztgS_eOh_6Lpkc0JNnWDalfFQEg?>>$1{n+M+R9`hgo(K?KaleI$G1CBHt~@3)#(G?>#y{KQFtHq@0d;WaQ2k@rmbHcBB zzFzpA?J`ATJT8G0*dT+ zYmOc5e*YQ^^+a9@uZe@8FnZyewBng}({vN6Q>QxWqh}VRWBlaApqFNoozo-vb*I%` zUQpkq-a!CY@1jM4uF^d4qRBoaw0-p@n}q$sPj=>+QZpeI-J7y#)fGQh&w1}3!!6uL zPw}_b*Pl5pcdaMAZb!X3Zmc8IaE_kaxZ_-Kb?F^;)FUTJ zUh-HB(p!H6fXkcVPRV&`19iz#%sExx!f*i z3g9(!_RnUedIqv39u60AQeV0-x9r{F{v{iJ5jF$`OG87$K3|9V8W7Ol7z@or-1^3n zZsO*HRVSVv<0$R$q86$ecZULo4Sd~*SVY)=t%@eRzcSbnal&LE#qO33ZKK6GL2_2; z6Vo>Ja8Bc7*Df|4#fe zq>J`37qvlMpNqP*d8f=v`I9+c;v!!;JU=5|Zhe2Il(oH#iPo4jb0wQTd2C z!<$=LHlMs3928V`Iku1#a5S$5& zL>=y>X%vJ$t*GnQ8R7iqYjUqia`4`jB(XQ3y@A0q_}H#z085U)L(S(`d%SJ3+v<#1 z@a5K3^8K2Jc z;6onaIMoVS9;YN%17Z&P<&>0IUP52n)pw<(GmtUIfb$%r2Z7>FvUh!Ts9TCq5IxOd zIVHY+wxQvpNC#_XnriQ8e}M@1)50=(D)vQ>VLO(XTXcBZDLvDg9jPd8qx)pgsHJlM z=9kMpmD)6O)TQ20xa^whi!Zx!hjqy&OY79ZBOMtDS?z4fA#r|;m~}X~;R=-6zoA?- zZK1Qzz+k!lY>)d{6osU(=v!V)K!5h5Sz1PUo9q^QEz+q^9#^gqHX;Wvh_^yeVBr1_ zXZ;=r1_j+ySBFx;K!5*b4%QS+8(CRd6B8D)g~o;oMMpLw5MDE-Lh8ZV4bSVP9Uc6_!r16&=;Bd<&)!3f9>!y;RKOT4)zrIcp@l*ad1B##Pv$zG{2N2O4LU-@$ zMb|xIk;Tq+GEz+QJMEB;AS9S2y|j7aFG8vK{gKLfdFSXz3zL1wReGgM_lZCs5d zuuG?J%Njp+q)vQ-8J!e|{4$(51J1BKpCIXRc(FG4n8vMYDj z<~9?KCMrDq^wUm(NBu9ZJUI~ssWtW;kN7KtD}>1(UT)+vlJhC9)$2NS^4TZ3 zm^dD}LZ$3*biw24XDHd5NRJ|vT~T{eo&l_{LXmj(d&V@?j=f8!TI$fO+=PE~PSQT$ zrpDDH*&WJYCLA9em&6u}(v6Hm!+vZkN2kt_0>wA)k4-~Q=a11_6cjfX!+l@Jj|u-nC4S`i@v^(D{R4>lSFH(@ysW2plrrp1@D9j;Fm%tOS~(ofj{Nz0g%G zttu?OFepvF9<>X>GH`MA+@S0^Qjc|5!30Y{Be(GRN9N{7_s#d;Q%Ous9o{SP2xqvm zFg~{cU$<^h*@6m561=XFaw`q$T5e^QA5an!3c5<{QIB9#SKFhS;gFyq*>3+@?QBN z5|Zdnk1rk&x&ioP=M#Ov3IS^DoTrS8Ob9TmE!ScgqVo6b2mJIPR0d_qZ5#$LIoK3BE5O5F#b^(CiZb4Ng_{QfxX#5@; zJOKyRFq}K*`r_vj0x+-{0_9X_(slG`T8Zg^j$vXX0JFNLBTX84(g6$U)fovrJi%dM zHs|>+nGe6_%kseUh&(D@?7p~`@NkswA%$1h=azUsLI$ zEQ3I(f0&;+Z;=ya;ZBFK`N~^^zG77vIF}m3bp1smk5aCHOh{h z1#JxyrfGH}z~4l%c*rR7^LKQ1c0$-$S*Z^`6?D$zgM+mZk(-oc1Ys!r{mR1w01?OJ zuw!SS;wGx9+U0VP^5;f9G^L4&iUvs2Zw#@bu;G4wXQiu>3g3rnMwIr-NK+iV6%cYmwPC{`6O)sX7|i3oVrPc$-O!{7z)2w? zA;3-oKIjrNGx#ZhwOknQY_k(_SrrZ`_~|4gYP`$cQAdZFGA%-_WT*zkIZ$qO53cfP z3(V?rtvj<&+YepZkMA44sp9=3*RY9fhIql_mV<)>P-Q%$gN&_}WPDB-EiadLE#eh=hKO631- zo+^m|E3Y6pdpP3~xw1tS0U`o-5e~ydAkPFdj+}=H(gFWR7-!&U2m3>ZCq4Pt zAc8>Nh>#EG531*(@o5{82lnlIJk`4cp?h;~1gf@Z0`e!wk!~5J0eABS2%Mboia#&I z#hur-$sy1QlYonG*EaEp*dlSkpBJ~M3I`Js=1ZV^^KF~+hs#}@o1`IH`19YSZBzUl z?G|^viHvLnj^*E+9Qat~?#=AOI;VEQ6gC@HeqS#Hd<|VJHY77KskSHnUa`z@S}R;G zc^T2>@7wQ#&X#}jXR`z5&!yay3j{9z#|m$e^bdJ}NFQmL`CE37H1}^JwMF9ph6Dmh zzf-n-FYx8RE+hRp|1)K0P?)e{q^n}9`RVr&Hbvr}Qzk3~f$IMp7!k7n&HFajc-+_jFi<)sxfUWv7B#H$qlsd;gWVI3YeYoz**avJ1`c_0 zlG1$TMR(~nUuGX);}-W_K#_0^PI8e8SfFIN^{<5cF=wx@>()g7y-nE@9Om?3a5#DB zll7VlW&sYKl3D>fyWS1`0jX*<*C`HvvQP304uB&?wit_?=%|oQ^z3~Zh0>_eYT=|~ zzfWuZXMaqAKVxlN2-!HzaOxN2jL5AW-xwdzO!Dk~ifV3b`ZOF)Vt##$)EgbaZxsZ` zp;~yKcp$tzvX%MF{Ny55HD8ZvZyZ!F9BIO$;{pxnP?4)Eh9+(9s4Nm19d0;5D!7!g zA_&fWU9|Ux15^KgQ*60+r1t5`zTN=2nfcz&VsL&ED8Q_RBiR?vvd5&&EWqcM4#nyE zUaDhx4J{ER0dUwVVXuyc;|yckS_8ECjs*es$Ig-}!+!Bdo{$(8eb3o%oY+aZS{1Rb z6EBc+Ot*AVsUli5?Nj*$24)!y9L$*D>G;{w9vW`EWoSD&)6GK+eaFk4SpR%Uxz}+= z(RXZk^EJF;qfvDbuP}bJ!Rqk-y)tqvIv0AJgnPqsa=PGO@}`p-!f<%(mYnH7b|UUB zlfMp85}YR}m2TYUi=K&5h`-K@ag9548;^}0nn>VsOl(~Wq!xL~#I?0Q;jGr+2FwU& z>?K;#{cdeiSXeVZZkg{pPp)SK$zvrB@i0;b^P1{CR~pIgk$tXl%0z3-CidO<1u9!> zXLceRQXAPBtND)k#sS8c+0GNqQdn3O&o46p)XP?Bs8&63rc7WWQzrP1aXb+kH_o%Tmp1A7I-C;(T+1J%MaD^UZ$;A8J zdNRkRLR)1u=?@`yo)Mc1BkJZpuw=;pQ*;f2xtfn2uWu%)A{SbKzhci$>{loomny=V{44X;e z#=@S*=WZ4uhel`%6tksKsmNiAvm||w&I2l4F|mcBvhC?oTWLP;ZVCG+)KtOBAs?|F zR}ZIA`Ht_q8o}LpOAwz1dn&E1YElZS0kCRbXkY1>AKcVd*F_U@GfW|YgOX!~Q!FDWip65xNGHRo&OaeLd7OA>D zdsE1Tr&w(lf0iOD+MnwQG-Vm@KfRzlda~$h%IC-%f|&bXoS*+LE?i;gmgX+{9|mwV zs7aK>%=|{Xz-;09>a`80jVD#~D)QAIy{%+9g$B#D?5d`|>Dbo%)Y8#;sH4O5{`_I- zcm3EiFO!}fe#;Es?;CP)fBDRQLgk@B=*4sUyn0;KmL?{!x)P^!9uy7FPA^~8HPK;7 z$(;yWv8&5`;d0Gmp{k!oN6G zG0!jkv^{&oqrX|lt2#(Ac{Y>D$zx)k6_xw$^~`K!-6bxf2Us=~kLMKNXP7*g(*OG>2dJD@r$ zWTNi>sbh69`D@E_gMAq8MV_%Yuial>ANXTNYB^@?7Z|!RPvR{S7`Rzpy>fSx|5^bj z^^~Q2wj~f5{pxiGpNRXM0!6{a8_?zrUoAyXCI2Hbd@!7#C!3DG7HWXg_OYn}hZmSL5Pp@kyZCyI`M6V0QYABsUCcx@?TX}f}zJaai zP-vpk;MJt-$Q4%GCAI5{P~!*YqeH|*Alh4#Wew&=5fLF1CmQlNENZ5{$pcoRCx7+k zv!O7oMQAwje@k$7Y|0ykb@K`v>cs;r5fO415xf`vAY1{7{Chy;M^WSoL6#n1_nqAh zi%h$Fb`RkSY)E)!dkgF&%v0~y6FlvU!!=}^Tab8r?SKxr^4r5Zej5%1XOl^P3C4U1Y_!7krZizeE65{XbYhSkr%T&qRL5 zzgBybxGnMdwc4AcAZr1O|KBqMdj3TUL7n~o5*{`bVIjA4>OW+Hp#A=& zJO4r4FLM7wc;I{S8EU$#c{%r&Q&r3?s z5yq7D(lt4{pm{sllf~gr)R%f3+4JVAX6qxFyUaiSHw-Y$1f=P!_q*f&Ceh$IW5Hg z5!Q5Qterd6+4)j-P!BV5>N&}V;-Ap|WN#0NdHPA)cJs|-#Uwd<_5 z1Cp<52Vtc*r7Z8e*$1+fi!mqI_^OtSX6;|Qd86W~$XtFK$DCTyi&|0IP`}@NAYCWj zb|~r0cn%w)#0eY%Kj}ub8y9j~=?F7}-`>i6pRfi5Vf1U$CG zdxFOm$&r|r*7*3!y@d<(`Ngzkzt4^PNaVvu-|dvBjJm$%(qT!={P1>bnb;RTc5Yf5 z3p`1U{0nk1?13RZE`epb*e|+Ds@dxI_EuNasLikOGlrxN6spp`XqGu`KV1JodhFXu zc-b8tQHp!2b?5?o*%*QRt`S zCKX?%3m^E-cVGmX_hW>=8gXkOPBEf;U{e^yfL|E+t*YwV^0$%*&%L|%G6D~VwNGT~ ze~+qEGY;2<%~NBookf>UwO=Dk3%*8oR0UklfS`2~!84k-y7nESfwh6Awn6}s%>ql= zI(^%{YOHtbk)%_J;436Ul30Zod4yL!uV^)=(>UI25!e(DFTDBdV1nY)?;0{3h~4=x ztu^WU1GKe_hOeEq#piqTh#8r^OEo(v$od>ndN~<*13R0}6Y+Qu-HQsdlg5p5i$m8s%lwC52`U7()?|1;V;^a7N}_0ic89E&_w{0wSpE2`#Oh=$=bW)C0e+vzYDS){|niR(MQ5k`^N>64=&|7t}O>VX@{MW zpTCxweuf?Nce3X`vv63f*M1z|lk+`GwLcY(-YmfMH6LVw!+O`*|VR-M(D}x_I zMg2U#F8ok`h&5v5v!(id#LVIPOW7w*=6+lH`SiJKOM2FT$itHm;2`87Ots?lXK=Y_ zKfio2@>Hbp_o_?h&EnbJ+zeafuWd&=)PIb}$oJ4WO%Xowby?WHuekI*=CRh!*t%OH zC-T`iE-(lS(YZprxvlo|LI#;A&C@+B(%eIPW@YD{M$_dPKhz%~hZk%Ql#M{@dsz3+O6rWA2x z|8Njsi6~ltI0AL!G}|V8%eUHAAb&XP+w-{g_dWwdk3YKfU+g?%iJBKZ2EQbq>MQ=6`M) zPl6R77_wi}0>S(H=3fi7>B?*x?%&?EDeV6UQvQDYH@<9di(f$+GRn?h!btn~KI?kD z^OwTk;%sno@5r{dYECul9JdRYy-5ZvFmPngmQc>_0Xf)|7<23_Xs}-lZF>YUB;x39 zQiphj+l~j~K5kBw4fR_DxE+mdI?tPHSVOiQKW%vj1ZKlT{?GJm60!T;Bl0Gs)1hi-*bfA7()g(djRTXOr~ zl0jIBUt+%LWWz9t(;=w>O-&#&o4=)&spLXhWrv|4~jCv(f|q72m`kz z>Q)J?rs&JDkTcAMq!S9Rq zNnjL2GHb|UcgMm8QS=UN33-m!ufGYqoC-tQvFq;#pEovA6C?)KX`~3< z02$WV!S@^%Ev1{v9z$9~#-(b%eGRctTcaafM~n?sK+wXIU$YtVSh#Xf@hh5L>=>fQ zK&&A>*ZkpP^9Q>dI(nP#4P43C3v5GV_7?{bmLVGmSY`jlMJbSG`|&A`W;QO8-+yFB zR_6_k*GLgTDqva&RX3Fh^CBpVAFf)!0a$)S=n)zplmB|(avz3u>&_#ha3eqAMnvuX zdOPw0pk=Ov{a=J4Vn{G(%Y88KDyX1`uc>|g93(8s0hvCj$bL&O%=>P-e=P(ps~n#gHb z|2NxD{>FH<`$Csq#2+v7yWuRnC>y(L~e8ZOxw2=3rYb z>R?T9dgH{1;`h9Rdh?59zN(wU!!9E%onnE-!q40iS8u=rkXJe*Tt4_~{_T-YHX~$| zVG;g!1H#mj{QU1;erS%{RV(n|(+~Q_Lvbzy3b4mOmIf703pi>n?2U6Lyd z3^D47?~AM(WPqm4LD7sLgVnx|#<;JH{>OV2WNgox8sK}AcWVy_5$$7MXO?8Y9*jgNkQLCT`qe6vKRyV=^JIDH#r^)lHDS$tn6rF{ju`S1GGV!(+dt%LHFs=_t{M>v_s#5 z;?&a@B4bMDp$S8|{57LzR1GK%SrFs+J{R?p4n+$IzRAP0gJWb!G}US2Hy!^a`p!eF z^(6lDEz>wP@tTk0_X>2zRi14R@$kQfpnQd2UQIU@l#p8~#L`)L^AvnChPshe6n@VC zJ5@@->2976)->{vuJMuZ7x;`$Rw-n+84T_3kH{;p)k)t7P#Tq(UBwfVwyBd&Qr`dM z%?JtC>rqnA+dCT;mQnipcrU7{!D##$xdhiybmdQe{rg~Wm^fo%U^+2Y5A-RUy1la6 zHfH9D&3-;%Wvt!%NI|G;K}IL|okm~~MQlw#5XbG3fYw_vR#vm~OC=ExomtCSX0Fk= zG%Az?gfuGX7+@MTu?Eucai65A!Ee{FKT2*Y8(=tYD_6-Lyxk#CjpiyG4v`m`uC4l( zV8Q|s(DEWBJT6S~FqW_sFb*cw?z0iM>9-u)SHrulEJlPoY{s(2=QLm_WcWsEf^|z{ zR6{-Hp{JL3u`4Yd%rITycR01o77#)a3wn!S4M&{^7#+iTZCyy_L%D1|hoHVTy1qRm z7P7f9GGOB*mg(EssC;ElFSQMk-7~p>cNZ}F#~6Fk+rtA3q{D-=C!-;>%`J)jV}$BD z*(tR%9fpv_xD+Z}O~vhS3YjSAJAxsfzht?!2ebo|qg@PY6tOSuyKbyzJJi??lHYy<3NvVYGc0nSr=fAzfHjtUg zne;n-zZt+mQoditb7)eRDFBhGuA|HHtu+Y%gqlwepdc50yWaeRw z;;y=4pN9#Hjd_7#iGerl?q%I>!di-pE1OtP&jcJKWgZ<%MZde$D0b;}x-|~Isyp}r z%J_P50QEC?7os!*F&?=q%^UhlIt`d=*O&-*0F#JdigSAIr-~`?P^c< z+8DRJj;crOS77#)V!D%w-PHha2Szuhr$vM=#E6}gKoYF8krPGlCOVyNszk#P9EOr* zPQm9~uQ9t@Wb*f98m1mM)%ZcHcwQkYUZqWBAY5_gZcnPksOdNe2}Sj7P9xP?&6A8d zMwNhP4Q61;cHpY3uFjq;g}&bm9pmoMOxxkFs1KiBK*d=~n!`cj&3Ga6S>mYCY+(Sn zns*kOJnCUdPD=U$ZhZJdEM(7(aUWd;K84~(d%l+RYd{rRLf~HUo^d#t{lGY@LQ`Jy zuGto|v6Hid`8^$bI+IIDeuyX^AV2E&Q&_XZ=koyLvU6E^YCyR|{!X>Wz{U(~&2RNGs(KDzhrZrL>|v{0DHbe1y-=*ULvcuu zBEbozxNDFEX>kI9La?BB(S6Rj@Be(dt1LvN@mmJahgW95kl$fB|T%HDW2@dxdJ>IJ3l*XS|brwlxp>9>a-|nqpc&C;_$iYf~7y0$q z9pXNEdHh{ccr&)PyFqr%D~L?@^JlrM&SUU+>skKi04SJv^C5n?Tl3KPZ?$xWJ~v8*VF*eCuaXQg=YvEDMVUGB95BN*&o%Z%1-Gp zUE6|Nxr;h3%Mrg-e1uAs`0t)rGgh$hHMI44o+rgd>y2y;@)f&asQLQ@MOLoK-bs$u zd$4r|=(|BkkQcMU?HET8UOM$SZm3YlamZri{M`fiiCBg;Pu2ctD>SrKBh8z2eAgoSGTL#VCi2 z8QUb30H7cEfbfJ8iX^Xm7%6899BA^fm`&UdT;m*YvV|M!c)?o0KI<_c8YGNPB!b*c zZCVENIzH$3(^&5$)f+R8rQrMSAo)qyNB^}}A^4(5AQCQ^^{*0co&EE1(@(-HV6i&g z&JtK7UskP~n}P9Z%-AP4pad!RRs$J;*3}}Rp0R(frRU4f;9g*gv51}|i{5x3QXbA! z2^{zOvb*73l==NE(?BQ}#e+OmgWuJV@V;kNQ(y@LFHI*;&eOXxZ`WpqNYc}d;e7C* z2ILy1eGXM2ORVfD4jI0&cJ8mc5}lN!ovK60gM+_;4`gZO*sI2Ga;MC3`MT`X2)zI- zu&&YK+k8Gin@8qTTSLly_vrLhC8=&k6`pK@bVF!^B7{+sU}9qfd;zDUv8I9o`dCb- z8h>a+_wlc{rF#&E5^0{7(^2^xpo&qLZ`p$C{rjCpw8q0jTZ}_@w6(WJ+WleWyWnkl z_wg0$8Iq12KQ@|-q#t#Uq#a!UQReNhc46ZQ{UoTq8!^B* zfg!FE)Fr*vbVO}ZNGj{PB)wj^r0oweJ+9O-+kk!{@Qhkoxv$T)5k$-w7Gx|oXA7?k z$BmD#-GE)Fu$!9OF_1}=U?n)D-;?Yj&s516SkXIJWqmj~mKyo9wskCddJ4XLy%8M8 zSB9xQbG8_S4hz_8?IJ)@;Ts@5f#ETMv0?l%mr{~HCz^SeJGGP?0jJ&Gs9Er?le|49 z%=*kj0JBKw0O>@JZtwGb>Yr^uBC7M`#wlsP5xbw8&k=oa-Mu`7ifT+jK5?2rHgf72 zlWTmIcz9$V5rMSB9PE*Tf;(dxeJ^gJE?nIn`lN~tIAVKuXXYTas!_L}Q2ZJ#0E40& z7FWbdB`1W}{d%1MO~(m zDmf%N>vHgnuE1Jvc<~(ND4X!P+VMSScevX+&Xmsq-1WC8b#U7{a?54&f!~m`P zZHOg5pd=n#cL{e%l3@3K+>$1JXm5ehj!U#$C!L)82o_l7ZKrD~Ok9CG);%fdjWy4> z`ScEr(vqAJt3*jS%Eoi-8!myr2n(S+lyF}h+qfBZc5?-OnZuaY`nNlW@Vm`-l!AMc zd5}#lrPA8T?7b=c8cENXv>i9YXzetQG6n^xlc4@Ty38_UzD@z^qMGaVAPW>}I< z=XL1=RVsal_wNN^;4sOFF6Bs$oyJMO1E2H5)Rs9AElEdHvt6eaCFgQqy zlMj!r1KU<5U;=DrT-7@b#+f)sZ1N=58pK|N#h>$sV}%XAN68m2FEou7O#-iC#a@gZWxF}c8$< zBGwx4Dovw%Q7gA>DL1@x z)VW>*;0!8hf+~^Z=m-SBh@z*1I(6@*GO;?(dohT@*T1|r8_rYce(Udhtt5;bbvLHi zOV~!go**R))<#xpWU$6-QrtEG_*~LU*bd%*!VmGS7O(yS!f&j{t=QI%Vkc*QOvwkL zq0nR8rJjdQiStY{mcP7dKj$!7-d|L0X&QQmg%F2Fji%aKERl*5o(SW^S*C!8`qDBu zix1oh{7b2>R|gS#jZ>o?h~Qln)$VHv3=4C&Io?LCiNJtI&rNv1ZLw;38gw?)CO;RJ z>^QcPM?|@{oOdU?qyq{TQGZ z3*~9T0!Pi)+JJ{uq*O$wS#?j$C}6iJEnPV}L7b&BP!^P^V7F&0)@VjR?vXs##xJfI zfny3JK^SYannf@y3Q3sf`gnAYysdUeAR}Ek@d~0 z9Me(Lv7d=zJ__oJT1IkkCrP*Y1iDI#-oNd*2fFdHoZ`GLPcc_IhA7LflXjM#^bIco zKfVdFD)KTQ-*|NM^H@|({bx{MlV0@p z10Ll_FE!&xJ1^GmPHm`fa+n9dX>DPhGl(JO`HV7N3?^??fu@am+2o@yU(3q2CSx7s z##`HXdrfN=drE8^>@XGV80XNmK}1fjl~TFU&M^+?cNgZ1<4P1VEl?tpN6vQG^x)p) zD(F#>lNiroPrSZlnhXi$JO9z2V!m8M!>F|8xdZN#+RUcj+{*VX^97r|wF!20=JmR4 zCwcr>G5#KvfxAI*69QX6j!K&^cQPARFVl(W{)=zuT7M@O;biO4+(^R8usK6nl?6EN zTi<=)i+*d<7oXU z;h*!UKi||jG)yhYlJ&{MeH(X@rKq>pCOc`10dE7peSDhq7{vU@S%5`uJqNIF2+CFU z{34(l4PANpx!-j3*>F+`2yk}8BnrxF83zJGeJz30PHg~l3qrdFk==%9$A0t}gyEca zdJP)Aro!gTp~C+9G12~uC=fmPVs;B!9~S^(%ifCgq}ZS8i?SE`)Ca;B$lFw~oqfQ0 zQy}G-a-l3fnr(USd}LW!e5is#^=-Pn);>*@;Zn$puSHHoFhdX-qw+Gd^w;G?kqMjHHZa z#RVlJB)RV0JT93ZORh)&!M3>A`shIySU|RQNm^B(8a(mv)M~I3K2)+)0fxO#T~Yuo zAKaQ)8%9B?&xb6)aM(n*oCAio>!t?Lt`qi9Ar`rm{a5-fGe1f+Yt$rq%f){`6063`y)>qg_6(H; zFo^mkCKh8=Y>z+r3&dR!OiS@%&9Kt%Ku;0!)@%AiyCFBi;EU9QKn{eovr|;l zyhRMk-Ye4X#F@=TRjBT>1Nlq3d>C~Q!)Kz9VnFRe_0ja#Zx-W&fyHw&P4o9(r!N* zuAl(7z04v#ZCbZWN9=J~;_tb3DVgaO+%QW>cTB$R@g2!H35XGW<;HlC*>Fr6@3qC^ z!X&onuMb)?$vBg*dV3OrysD6!0x%F#{cBBL{*olaY{qdzeSOwG5CXt9PC6!ROx_B? zAof*QQJ5g}%1};sU_*lLRUR}RF;(q4_alQvkQys?$PeMwsRN|c|I?g_K>UOI%Ln_I zp>*?YrSzl1*=v?B^VctZ1yUj+j@SnzH0%%%g+WNHd9esd=8hr9vdZ}C2gI8vf9fpd z_h%}E*ys%-I!6|dj-EIri&8$uN~2G|-KYJ#NK*TP>kPc({$jV$AzFH57UZyech(_m z4!yNc6iC?3no~l+Kt4MNaHv1|4&2liraNt#Uqhf$|PFRch#Bw-&PkD=3LoVRx1r zm6*qwp%O~+($|XpQcJ7!gLH0lEUr3ikkK>vQc8k|Z2HD>S z!1*61ay(KkB$HjxO`f;c02_BXFwk}2n=4L!hPAVEH74S7lfHmJVq14osGC3LI2lUH zNe;>b81g|AVX4&E44p*Pk8YlokTOPB7y&$W?pYa#NT5}2?$ZhUtkqVt$Sb$7iTpXQ z-O4^ybaQs~-Kl*m&qBE@t04N$zOAA)d^bx zUI|R?4!G2wmH_&k32a1$5Ku}sdZT1POjc;NnD=tf6nqhc0D@j++1a{>4Gn}`I$~&F z2fzSUKtB4sab>3*dluO(CP?dV{vc3QmsIuPLg;477b5x-88qyC1Cd5@J?n}0=YBKh zKc&EXpf9}-p2qWBlZfNwn#5wa@_#H?q#*C7G!T#iuUn5a#|Hy7uTbzouV9c8?NaP` zj`~K<_-$QjPeR2gVufwC;Cx?Lz}Ex7(>2QqUc$X_1x3rWPOqBXv13qygR~8R5F}iB z;w2XTZ{xPyw~ze!-0iCtOV@Rzck`G$r2vexTTRdUG~%k^kdT|zoup!ArEY@@2p~S& znZY`2g$7ROEsS}12rZ&27gtx<>-tj}U7WODW|4>bu4`#=2Lt$8FRu==KUd-+`AE%r zhQrmuHS?nqH8Dn6a;>ME|LOoCidsEguU3V3-FdJNAecmojR*lgq*E{Ae4p`bzR10h zIuveH;qI75+zpad3KiE|O5O9H$U_<$g*jw5`>8HVVJ**D{ZI$!7_c>1kY9TY)bUP` z-Z7Bap!(^I&_NIB5PRdDIVQgSX@Tw@*Gyz65TPpUvm(kmpF=Npi^c2=Qb=}&S{$ly zguK_ASTiK+0r2Vh6wS9u7kLM$8tZAUiv`nyJyTz&4cOOeLl!2OiaRC8P8IbOtU6{a#Li|3lc0EvRPP_*D!ZjFxW-TU3>NDwm;u6ZkSn z4KF}>euJmH9z7wdGHIByd_PLwzs|WTRUCmr6?iBElyykY-qkAv-Uf2ToIHZRO(GB4 zsCgSRel`9-jIsvl{BjPmq}vk@cQfbhjn`S#j|t0{aOG};6s-;-#8*Nc3>Q(k#LA>a zRDHe4yShzvtcoUD6b1!IHs^SmdR=G(j*ql9;f}2-WISjV3?U0rS{)znp#ji7eRH zQeZ)16%ue#y!waMEStDb>ZYfqZxABgB|Y^lnXPxu)m0pbONUo`GYAt^z5&*QeNx^V z?)I2aco-o&+jGdX^f~5=d(v88N6BB##-2DkkFu()uuHm7m7aK4vuuaaA|BdYXsVj$ z2;T?dFQL99S%RNKvefUz12SEb%?ND86jTT%n5&$~Py1bHkbh)9*WIQa?}PynVI6pU zE3pg#H=-W*LhwAA5n>Fsu&V$+tt4B>8?3N-7`_72`~6LsT$03}ASnjxj{1;?4(o3~XR)S()^xwuN_Q zK8MH`Zq~S085ur{Q_^97KKRZsByRD5<`{X?`p38RP+e zwlEH?k*04^En2jCB%*V3xOLTLCUF5a}|0%KL{ZHv40A2{36}OAp znWwpasif4S`<0^)M!cj>X5QH?H4`kCK_Y3yR!l5UqeMh60x7J z_D7^krRe|y$Z>Kh`FMDc72*1mh9*TuX6<6mnF??Pd@lyE@Cj-KvmU-fRI`WXZhMnN zY3wDrz!O@U&R5({2R^VH!oo#1K$UP9awUS88Jp z=@+9vQ7U}Qn9OezGf8`Pij5|bqloun$u~8#9qwF$D38jJa@a%wK#mq@Rb!J)>Rkj^ z+o#epS0kMgw#C)_pE%a&ANu}{eHdh%{3zAU_z4+pwi`=M9b=#D#C^~#0wsF7CUxkC zaXP&QU`rVJuK`c+Kdg88DNW~FH=}X=3RAlNEa=R`NwRTo3tNYsZIN>R zhBr_-4fK7)b`CfM7JmOgc6&6kB@FU`5yzg!2dt|4-S#b@DyVDy+tB@&k4ZZle8<_> z91&-Un39I2?k!PfXOC_J2TAX?2}=lC2&9b+e3Ow>GG2XNwG(>gHkP8b?WYGTQZpy& zHpwM@snc36Amn(l`A4FO5V%}DZ|CEW%fafi?hT@1UyuSh=vpT?gJix`q(uK*Tc4gy z7!UJ$sE~$=EyGjxqSAlY<4cm2VqL6OK&>ERzsYb)0)`ZfjvA%)f9#}ReeIg2p3D61 z?BQs*mP?UY^+#FrnfeL>A;z8UxCEVzttt0;KkWg}%gpMDCZQqA+-cG3`Pgck|+#qFPUk zu9e2c1gGuuXrrG2FP1a8N>ADqUQ?f06jsr_P5ZiyWp8b&>U&HqpaR+fcdPCEN~JTt zn32YA#uh@WX<6@hscbqkzN%5eO7046i9x0!mM=#G0>gC&t#NWLa!YaP`(cNelRNEC z?{$e44t%vW@XB(tXG)N+;_(xK%-L$t%UF_hMlU2itq{Chp>k~` z%oG+9*|{fO8|hJo`f$KY&8t$CRZ-bHW^v7nS}!Rsjz7JiqZ*_&*A+pB+5%}#xpfd7 zW5fGzGuq9Fa3=7#N5!P*qy4d?=DmyvtTkK^^Az(!qrYP?jPA3*Ek0WeXit}|=u0e_ zv0xJSH4z&$@pGK@Qj9&)A28{T<=O@$!;qMM<_4a88S%0Cku^ z5UH{cUIP`Z#cq!n*_Bwi4bbZ|T7b+%N+EOVouRudj8LrmsQ!vum-$XLe2p3FrE&fxkw!-@kQ(8Ni0pTaWSpMCyPw`}fu=UF^odxoJeB3%&s6 zF`&W?fcPEfxzLJGt^>+N!kE|mTtxiXfz7T`-4d47 zGR8}sqi0OjLNhnDytHZo;=dl6^uz8MXSC?D`ovzl)L0s*e-Psr0XTFMbvsE zTP*JZDA%qm>O%mhffh$IKfkVATe%Cc6i2K#u7oufpDoQ1%)66~^m&#Ag| zu0Mqg0c@D9Ih@l9qwU!diDh4v!R;l*Ci0iPtKUvR->!DULLqU4dH%fYzYL0@tN%_k z?WK@Zv-UJsKpof**zvu=Ov7hV?~8T>c?u}npnb8Mmes3}TvjsG)!K{q8q$mP2c$Th!9JkAy}`lBDebmhtrk~-M*t93d10TddHQ1JPslUSz;X+GrKNMy+H4+U zFJXaLLM>*%J=2~29pXR&+sa?T{&6u#NZOt5UNrd$LN)Dlf+G&?w*k;HlUffS@F3kf z!wUr~LVtlNURT6|aq{|ZA-*O>< z>yyYK?PnH*E`83`iuVGzHb`hf%SAM!Dw%}(LK5csVFX!Q1(_Ll|r^ z(+%jGHAI8UDOGa#bYcB3l}Lc>S|VP9Xe*kapF@=O?TF||pkq&U6;+=smqy>tmo7Bx zIrGB}Nmj7BhAL&rkj8l7ivlp*!cQI%&$>OhFdx*V@KK}@7vMBj$YY&r>bza!QXHTp zD}+^a!M9nCa=ILU{Fv2#0veDS4_x-VMtEacRll#Q#3q_?%xHHc8q;%H;1PB1sLCIW;JBhAF8S?@=_dA7rC(uDxsYP#x0^xT~K z?@KQEiEDE^hnBh=3WdNG4*EswQfK(E)OzeU0>-@_{WhOe!%;SBjVP&HWH|qbq*w2s zhpthAX1aK$k1RPCK626nmqPUB`92|-2GY3Ir7<<0DN+EUAu$IkCb=GL(>k5EzlNeA zErdo%jv^+;oB=z`d2=s{4Wv%%q*7XQo%g20+vHcnZgU8#mI}MpROaJ&y_Wvwi*W}z zh0qf4&7Ef!bX^=P7ew?xbNm0{;pQGbiJ5SWWBmz;NZVV{E}Zi{=t@3AfY-pSQO@{F z6VZ>6s>Vxaz+6N4T6qTLR|^q^ECK5G7qv~Du29Lz5=%(Pno_!49b3ruX2tPt zzwDvH7=>BA7z#TBTLS^sT`d;5kr!~6VQW{u2-nU#Q=gs?9_|=%kYZop1VPMZns{!B z&6egPVSh5vNmJP!T?;9;W1SmI@oJk&iN^0po9bMl)QGv=-ohk)cotf>c2^u6hU{RS z0TpBsl+o(?t}J+C4c5P>4}au<8Hwn=t=Y?rSR(RcL&ZZ-83saUaIQ5a9XhgAXaQu8 zYcHhyR^eppTPt7P^BXf2rSa~J!nQ&Bh$%bn}^h+f~_>gru} znt(RnO4$zL{wz)`(k0B+yXehk<`uR%dW0-^%$f&9e6q;5& z##4P2!{;P{mh$7X%#uUwgT?TtTht(h$_dIzdq=nF0K6n`*N2LRwb zA&M|u$82I$IxOGe8=%QjMQfu4Rqefv2PvmaetP=s zwPKEoW_NtRhQT#goNHebf|VT@udAR|d%LHDYOflD76-+#a@wAwqYx@lU%cLFk(Rc$ zxw^NHFZsM$YPlPhZVKx69T4^_WVDj9eG1+kObp7aeX>%{)HWjs`g_;`8euWndP#5Dli;bprMaEI#`%?+g8_*z#zC<(jEBt60|2%=_y>ktk~Fq9?Va=ohb(yKwDZm-(s>4k`m(VYgo zS?XQe=?vqsy$e?v_P|ID9oPZ!X=n%LpYC#+OI)pt9s=z5RLNbk_vb1=*#&BSksqfSZ6OIfo|n zE>g*!#8lls1?dK0_A%B*gcWcE0QZMc?4=<-Pugq!Xqss^eSec(5|in5!5pJ|{;uri z9Jro8ee$|PQ}30buhm=|yE9l~!dZ|kq;YkDV;bY$KkZLB`Nw7-51Gh+!*36?;zdcw zD5>wpbO&v*{W-jZExQ7!^W%rjC+JlX9!+)F&T%c!4rw}E7^daq<_0a%@{_Js0UF&@ zHCGY&03@9WR1?(&_X6EBdLljUS(h96&*pBgZHK1R*B=3?+Tbd6LAi^E#t1K_9y9*`{q0$ymW6Q=wE2G-B5CZ$OGomG1Sm1?SvzkmYf zXT;;@-IXkg;YQ_lKnP>ffq-;L9X!v&srj>Bl?Glr9Ye|;G113Wc}vZEo+Ct7g2Z4V z|C5wkpk{|dCIl811+qNQD#lp=DD5oi3AFu*`B#+JFXV%?+ z)$Eg;;F7LMhEqLt%Ub}lf@S^n_%JzB%bI^b?OW<|Ohs~CYH7{-O=0KVldrHUw?@YY z1m`@u|A&UlQ&-n7E5pJ@ZMl5prb zAwJ_WgIV31DcO2F^Aor}9OGrYR*9T|iP|Noh}*F%fEj-`^7fptaQV_KVMw`OEm?4 zebsjHU#ZpEOLXl2KYc^zse_vV{crKv?6;A{#kC7(!x01W^#72B{XY?t0f9Jpkp64ZX`e@ zUk4nnzI87=Kn84=%LWFlPF?9creuK$X4k~#P9DdD`ai3`9Q%QU&2laQ5I6*ZKH%SS zHhO|;#^&aNbq(Wd|=(kQ%VcqR)PgZ>pRXAJS~A%LU%`jU;hksD(x>(3g2UKq%F%-k1Ket^htr0IAMgt@vK z)iuw#8*YFV!TvM!kb(uowLp9|&kINwfq>*RC$I@900M1t?Jb~*=2$8j)ZTgI*N;>O zM6=y)EFem@v`OcjioS5O1V{}aY<=}kh%h)S`}5=+!VzCLJ#<;8f4UYYhTC z6AUbA5}ONHV{&rY|0=&C7=-+xp}xn3p+#qc+PzCtwHWpf&cK-f;wRu;{#qK#D7`2N zUnj3DMFUD=hhY&=r@Q?+s8=U60cLyHM5%iOLt;9NW9E2qzF5X%xdX5nK|!zrim{@Z zptH)4w$)-QCruq#lofb{>})xIGOa;#myk?YjVZ3 zDbC6B1*XlXuXI1m0XRIdl29_#bEqX5R?Eg(R7X@{V6O4?IDK|E5YRo!mKDI{g4z{8 z*L{J`W>OZk;NrhpEpEd7vOsExgw_O9xjeOS-BYKTT~D8Oks?1sL?n>S>6t()Tsd;O^Kqt>?@M`%4C=CLJ^yO^% zGk=U=r~}`_W_EW1_$vU;1O?FujWz+&+#BBOlRhE*We#JYgf@-!dF*@gr;u)~y*ClE zlSX^G14nW@x>dy+1&To9qia+4=%4pN6A6tVPlCm(r{1)h^Bfx5@|5Yb>Ky~hl#zz#KzqJk0M;Nf zFPu>_<1UC0j8Z%QIxDs(dx!dN*4g7pBjyvr3;^7J(d>F;S&y!nSz3I&tSmbs~ z1K{KW%*cIb68K8;ya%IzoeSdW#PT;l#%iZWcXru*EBI|ba9T-xZ)Sf^VDNbWR3Jd| z1xU2mKp<8{DI~J;m2XM_%9RAuk{l_=`ET{yzvgtJk6A{f%}Yc-A{DiDL_saN2u30N zt^?9oJH-9cNy&!NPE3jBXYg=Auvjqcq*_-Hjn-lxf#T421_CQwV?P@S&HlSFrdnwC zu2G*c?)0-4xl6G%7U_V<0|dU{Q@z%=!zCVlNIdPIJFVQ5I8ARLg@(+UobGM3b|#-H zXDX|?4TZ1?>{hqYnYZQ#bCf;`W&0p!9{TCLvF_iJyO+513pqYz-uwG<<`6Z6&X524 zW$LdPU+a!!(>{_O_Ixknxm@?n)4!PJ1srb8@S#_F#y`yu*|71;h)C&akFYwmz{uSf zbKCZwi+>~XA&72sV~)Kws&rcC!WFvP)F*i>PM@NLXT;Bgiek6B%`NymDjUX<1k5^NF3ONrV^(3p_w_LcOp!UmX3p{_<9v`$qzR;)vs*1Hn88{>kQ(3kpJ&ET3 zS^0VV#Z#Lrj8f|4gpQ8XkLS*@T=3iPOQwI2?A5_89f`Ql%p8}`swJCnN43~KN7nYo ztxfINE>BCA_fh*cxCi7<(_Z(s`lZ3BA$-E%LF&9Vf>~$Vzy6XHb)FWn*!>Phrk;+z zXKT?BmRuFHu>-3xDfHPeOR_KDTh9rO*Dr>`Y`0>ES-pC)!JE7k*0g2V+`fI$8n)pL z3Yu*2n6RIye;QZ*;7kZoDq z{M_k#eX@l4I1hOm@;cJ|rvpD$$7y#bel<8gju-E&v4sveUO%mm65`INd5fA%9UFh| zwy@782^;x|oLq&|DgR{xg$_%ljN`hvN81tk@wC~A+f6Hw^cq18KX$a4O3HVO zM%;e4HY0#@h~lc~8Y4AKNw0ujY(F4T|S>HWumA4<*)NeR(Gf2trNC+{qNeVnM=; zzhN{^_DJ`t)1mTmWhm~6WMb; z6C}5vfFEK|XhKsVAVeTddFUb4i4@ufOPGfl&f3ciIwnls7n;Vtqi6FPKs-6oqeSZi zgMzb2Z{VqCm*SSy!#lf7K~zK`xo_F(63j5^mk-T&uHo)vIB&4F$lpHPv)YKr zNV8D?y$BPc5e0D}7CO=l1b{RkM=M2?F@1TKwf!~DwIc56?x{zY3zL21O-x*BMMA2p z(~d5yu#<+;_k>K7SNabl17rJVFtG%R%bz2ngah)!O&`E|lRU0chHJqGk;dhzZtuBb zS9SeBE_vyF_l9>P@u)6%5;;VIOy_6b;6MMjBeyUaM|~3o<%9YcSgYXVxAdmwz#>$O z*Z&?Uo{rR=dW(O+gDEn__iJnmn?f(zu=`fRo%(5;qsjyK7HLcQa#gusC={xmuJ?*t zEGTo2UZdVu$-$XlP8N|*HY-SB?USGPne z-|@*YBAte>aZY+`Y=+GZ1sXj9p!rk$;^FyQNrnYPkU$E$6)$($f#SsD9zdI6=@?`yGZ<5lJ2p0Pt<+s5PcXuuEc4M>xX zb!-<}bz4eKPOi0`9f4o5F*fCumw2^>jQ4XWCvd$tTOVaQrn^gRcW~~ZjLgrx>9_wN z3(1YL4rABiI2Do<-!b`;TcK?F$)YxI#|==_(nMLZ;GHW!C9`6LZcs9bL$i4qB#z?U zFh4U}xmzL<75p*llMU=u_3k=ivHT2%v;y%Afb>al4h0zR`tDR-GDi;>`xy`~u* zA;PcPY2bNHZ(;is>Vn!{`C(H|2g^5Id5`NqnHz38E!h#l+OrC5twv}?N2}fZYU!ES z*nW34`Sa(m!uQz4{ZEV9X4CaEqDn@KiF&coHec#2A}IAxqKF*rA_Fcg655af{*d;1 z9f?&jpO0TbIq$7EWk0 z2iWA?UzNdOh$X@5FP_r@4H;4+1~8<QZzNaod}m<6;ie77@`G7OYtW)2T20b9vyXu ze4CcGKtTD?qen)KgO@H}c9_8&N3n{JeVc2KXq7E`!U|*8rqY!+7+5*qu06M5olUsv z+weG0lx4@z9s&ONKL+{s>Q7d>fSvUz*WyCwsToUuIE=kTr}r&Fsg&xQi=c%zTT`_E8o&nwNR%xcwyz zA;dv~bfesb8%#7av)z1T=+0EG)v;uL2 zyNs8h6Qzn2*a}6|-cgjnR6CQzKMnyyWhnRbZ{MymJN(*BGJ8|ny%Ff`r(R;#TX;p@ z6Ya5&%oE$nL_9~%XlI|}h;L}njb@;zt>my>cwNk^JAAhYPeLuS^U9*|8gxwQpJQT# zz1D9oe2=>O&M*o3@=xQ#KMG;8hKu~p7A*=-o=|ce25}yv`^8H8fQLzJ>>mq`&Xd2t zEdHHae1Qp=MIj+2O;1~n$RzpE>(tcxZZ;O+OaX6P zS+QQ|K%y4FE3+LTzt~;2&-RQs!&bDbDWp>?u>4!b`-5b^e@(*8%gd|xIyyR9A1MGQ^xkB*V}}j-uYuS@u6T}(djfVUq`ylr&!lWoiF!SahHhkdk;X^L& z&Uj?bvFgSS#{*8kl8?xr{>qlu1q3Jx(M_Vr5tnBrpS7OE!U`vrN#Shk?2vR%+f6H) z;hECFEiKaCw4-HTv0kS^)3J%YsMm5Px$x}@7TGYimbKT&VO&**jN82mt$f%J@HUQD z_v(h~EE04!>|S!EzM%yUM||b_!+@3YTB2@zOLB=FVZ_z~8R5y>Ug?DK1Lu|X-EkXF zd;=-HpZ78)SEFHhM(*29TL`KAf;-<~JgjiXXbR3M!B(8DhpyO|%>3-w;2x5T{IJLB z<+$m(2|nMVeSh(gptupJwJiE4R@OP=;Ogj6cFsx&asXAV!P`ED8WB34$T|4I1^BtM zwtAyv~QC__`n@C#e!bL~(QqhE5dD>zg8M4%yeZFUnh zAY0hV(-Z=B{`0K@s5Vx24CcS)nQv<85#0XLtbt!k}ntt zGNv0G?5TgHN_v4B2mAY*7DCr}AdsETX!f}C6c^t91YIxN4A5kwx8m^)W+nWqMxn@@ z2AQJI`sxQ2je20}*2hy)Qz3Nf-rgtf%V+K8flXIdR**B#q0pq?CS3=O$c+^I|Ijsf zPk4*kH^>Uk(mOuaE6&Rbl{HNGMt7yGDL?(R4EQ}r{r$szW$_=Y^%FXbA+d<}?-;H( zh#&0iaCX?A7AdwL3BYv2@K4N>AuC+SU%s9a9Td@;zl@kgB|WWZf~q1IS6wZJy{hSLm@T3uY2~Jo z7kg1gC@T{lA|QG3;zj(^=EGguG{3q!88I2YX<~bmvB*bzDzrJ8H~DGo3bvbn6#6i* zKpz!L3axacJl=1f%=5CNLQ`C8skB=u6Ot0-8^TloHfzfyzC*Sl$XA$s;6;1_M!8pCT zq#ECM%M&&oH~cb_A?q>trPV-#ZXAR@c5G;}Mw|&IyUS4RWSmfqME_r`y>(QSTlg>T zu{er~f`p`!Qlg}^gdi(lvlbR6s(>kp`9S?m^mNXdF5ehAtU$$lo5qbH2ZO z*Sde)yI`^4<((bRerkW7=h<6#DbZ(nGhPU)Z-7HQc0V(%zp1KPRT3~Xea#?Y>2Yik zd@1>t9YSj}!A-livbn9>kXgnXotMknj>*CX^38PU(7*F#VqyZ3!l&M|$WFhHAD0+p z6>qL-gQojF(xAtzHe1q>Sc3<Y~9Lyc# zA5ipSr=^9(yhIn3+g#)M84Sb4rWUeU+RJQ7LhOLBVVmvjTDM@G+DZPT;&zjvcEo4Z za;z<7$gjQDV!UM-1x4_>_Y`ukTDJfUMcOVz)YJH~+K(@H^ctkm4?Wtxq9D2N^EB;7 z%30|YX~8zp)@7+u$tZcHxB}FN@>5(vvL5<-T?IHvXL`-lZJbbIn8ma?7YRdcw(ue< z4g(HzY6bV*>y_DNQYENR@BYlpWp*viSt33xzLD?fUB*FdHww$jH!CZvk?9ng+jUugs-)OuN!R@?xZyc4YpAa7`S*`^ z>gwty=3BQoThHB}DWnr|%m4Ca66m~|nwlodYuBy;s;TdXquO3^t;u*sQ{XfmK6tbV z;CBF4{kfzKb-a|o0ja_GCG5dIJ+wE{(1`fdGXL}EeeXTI&XkdnX?5MlqPV!@*w!<{ z6BX1`6+;uF_IJ0$VGmsm4Z#(>U%nV?XlQ_6fC={X^)-bUgR}L(RlnfSirZyzfWEV{ z1K^77I91&Xd$(f5I8*e+wPPkmqXzr5S6FwAt{GN3F>!M4ZwIK?#Y#;nSP7gbwi8C^~@N1=Uf$uYWj9h#~iWyVp%(=-!QX``9Ak}&V>t0oa+Vhrt~;9 z{!*X5Vbr1ko2R!<8M;Og329f+3-FAk^Sq`p!c%;MFjm+pV;vS8%E0`d?r_hs>`7ze zhtbN)z>UXRO#Xp^!Y_Y5>$v*7?JvRm&jDOp*xL(4m`uQ8b@dWAO}LzFM_jpmFW?`b zAL3%aN!uv4{nc;lr5PWai5S)xfdTy|+`s_H(U>Ldf>E@?p}oqvZw^VU88%ats@UijtuG&s!;0p4rT4M z9LIF%^|yhTo$3aTZM_ig{(c+s{kxsx?^13!%$=QbxFvViIilvOx!wHk)j6O!<7{lY+R;ltb_7??g4-K8iQkw|8@%E-S~T zmn>S|T)3N9_IoTgxKU`L<@Lc8rNk(;Tsn?Tzk~)Qy0#xkR4`q&u^+Pki|hvzL37D& zLVk93tDYZ&ty4zN;2gYkqOCN6p^=e%Hq(2sGJXqen`Fzw2r#0-0mM>z)^x4v;2Nqj zXSrPt0WP3sS+==GBNP#vHd4b*W?18)`PF!$<&M-le`&=%w>`HG>zkpPmw-Remj&Tk z9k;c$#lnSM7PSZGEP%XBFt;O-a;e7LbJq_Gj9Wq^U6@+s_3T?AI zNs#cgv^0P3!lELeP}sb=uzP_d2#^x%Uc|Y}3ohJ77C*`Txwyzt|97y=+WyvfVEU86 z7YacH5ju~?5nfYVx|o}-S*GnVeB5a-9UTd;dAo?iHs&=eOhAesHx+4tB;xM*-w`8!K%z^ zG=um$rg1ou9m3{1GdpWOh`!sWDrR?wfk7&p!JFgMCe#^COcbXQy%^p3sTh84IXeng za@g7)*IMGvLmvG=DZYB7%@P~T7NeQvlG&$UY>tY}+<|RX%dXm8g6%O&-9{_An1e^RC zP}KD3U7T?9;n=6Eo4?gcLJSK{BIlRwxARwxH7U9F8A;EE@sd zazOzo4d1~9vu&`8LcaiCTl=BWzTnoW3S#|B50NZigkk zS^StWpU!9Yc5XU;zIkMmNF(4siS71k({aGF^$Ylc$`=w!O~RQTDRua-_?B-4M#u=H z<6|MM>9D-J;%Ud@Bb}PjutfHQ(<>Xf(rsc_8p9ICH^^&4?#274dW%^TT|LZp8D@*L z>Wr^qG^6Mr^P*>*pC6Isxbe$684^#y$S%n=NMzgB_ITn+<8PTz81OgV`aR~i8j-VZ zd7ahWhEdos)1I|p-QP*3s2LmjZo4HfB{exLcwjQfuON;Sa-RF|(J-Ed=AM8tw%yKQ(##7_;% zM9lGA&`m6Z^S9pk`Zj#s`@OcNK7E77Y&rpdjr{w6u1v_<8)X^x66 z50xlzfMmsDZTe-N@UXDP&^R$K-Hz28TNZ?598Z~{!1e+A{ee#WzYGw?aYG=baHR*x zb3}a3RD2E)SM8ZPUxJBmtTJC#5Vy#%F#1yCI<)x< zY|0J~$9i!Dhyy%uT^@-XU5*52Kpgy-Dos}+9}^GSOP=}tLaCBc z;K$RQ4j)RF z$(xPoS!P=h_Wm3lny+!!Dol`UQ=%XYLeJpJx^+)2&EG$Lq)to^8`MEHEoc~I1=fciZoQGA^Kj|g4BLuG->Z+wVS+H3hp+)RL4U>b=Ya&bnz`m`BeY`E;{^n6 zk7E>K(>3{Z9d_;Ww}WHDVZmF`72XEF$(0;i8uterlN_XD=P;-^lwmd(oif{NVtWm` z>d{7Tv2%etjEnRenf*Tz7bhALlpGl&rPtJOEoV98T`c$WjI1f zbWI7WKBL zTHCcF87jr8qV=;C+gyrY?Gn*~1IC5;`5)X<_QbVn_R955w%h`~%fPJycJOFzI_GFL zGBciplWF!cw)eMP`FtCb)}?$1qzUnyTlkYicyhMq2CMeI`Uui!lt8Siz~Kna`eu zKp>|5^N)c`BP5ioQ^Y)u0lvHHpt)QY`u%u0@Z`+RXR~#R!otHNd&eUfh7?(#U_)i( zg?p)XBf|enVHUyDnfxM2 z$F%oZ9C+ZETe-gOWO_bZsJg~;i!GdMitiba1aEB09$pd#GQIOZ0UsD#G4Ozy*<~x? z6982+Vgd*4u$nhG9GEvGRTIcJC6|bm5X8j9JLT?_!{~|+)=c-ByZwhZE^Z73dfqWL zo^(A}!>QB|C`F67qFXm6yvH8m@Oxv2mD(*Drj=G~ycwhHLiMhUR5Yw)yD(5y*U}QO zIv0+}qUUaBW7et|&lKZRd$TH^!+)wjP{*^dOhqPR79!;z&juaHr|2@p!|+=~N)pFM zyb57iNDHl2nbE4xoBjd+gfn+U-7_qfxBguMUwA)kM^Z~UiLn9@b!Nz@krkh~jix!4 ziIUa}#1!oE=KfO9vKy|H+DrKq4U2Xh4BYT>rpwirT}#&PmXBh10#g`4Eq*4GwD5@YBgpk zfDD2Yi=TeY>fRd+!FG1V^{UlzvLhjnlhQTSqdJ})G#5F&1Ed@(vrGI)haKJp@XLF9 z-U*j|uxV=+FaY5g+{zZa9@#zpyUR1d;d$S_J(?OLq7}J&N<;r>Xe%z#U6wFrs04V9 z2T}((7L}^0uCAwomo!EOHvtA+Q4e(a)Yoe62-w_JK)_sqSp^~7e9E`>cBND5AvcfW*+X@eOaNIM6#3~X1l9VJFx#V zv6eM}!wUA+cAzL=)ISwT;w6}vgz9l1b;`21XX_oii4GUY58A2AMwPda5c{w^*e;Bf zv~0xTbCkoPqJ)NL-r(}6Cor@x+Sdidacatwn$z+&x)mT2S7NnW6BnGmxNf41HJvu) z>VrSvMM8k7is=;kR6cNx`r)UQ8DGF30XgHJ?nEwY(@N2>3|dF6*<27tH8T2Q9{Ppx&K-$s?j)|IU}0NH8=ZK<@+KIexJ{fI zy=}#mH0RVn^lP{6-@jh{bq?%?!A=%v-_^UM_LmGQoie&G3-xaa9r!;N_J#{0;nDCK zZ75$r5GLzp7*}-Ai~`s^WA|YnYsE~Btm0tNhCDMw{OBsuqR_XtMeiq!S-y+9dV2P_KjdM*#vH_-dJhuHP@OaX5)O-1in94w=` z)W7dO{WD^{Z2*6@l2$r9!;RgsN{F^WJco}EFf%c+(ml`tJIJ+}3;t<2Na5l1^icq? z6lM*EL@`0>B?gKgeD#DwHQ!fl0lNw!7Mkq+Sr_XyGW7MnLYk5APkk}F#lb*5WJ#{+ z_<&9nooD&z&p6a%jCa4-ZIJn239>gF9vs9lbp zOXt>FT^qn!HT%m{IDFhR-mgPW24W%1tp@j$8QK0!P|d|J{LLc%HD z-A3TZgNrd3I9{MUO9AS$G*+{VokB%NN5}Hpa4RD;jP<0gC~n*j;JnN7!vq8-#J%-H zrjP){ZF*Od7TNR%q!NQ831Q;RmCis>tLCP&qJZ(wZYe2R~Tf1y3Bb& zuB67*H{A;x^fjR6#$v4iTON6CUe zsEGGu!uc8{!`HSzUJ17JseD)AvcN8THbxnNusHN}(;Uo~+xzEOv%@1XS^6&J5&I|lry$612vWCXmMH447A)xp&DYb*|9&T8khDb zngS!){p(DzV(kx4mJm1od8(Fl6RuF{isKs}4AITeQeL!7pSx|F*yuG) ze;7Ftg^%cbyb)Q>9xKk3lmw_|5V)&2cwIKqba9jf4^bQMD!a!HrKSW9NS5U;1G$|C zIRG4CBIicieZGKjGt9UJ5x>NUBW_;=npZ4qRExuXBc*a;p1AhfAcI`$MQ+*aD)Fc- zU{OQA*wyqs(kC{0qKrVo7u|oI=+QUVc0Wm6^kf!?9|ej zE}2{byHNCD^8jf)hN@;%53Y-48fpdz(DhEi9sS#|f)BYk^nZY*KB5Fi4a(h%xgW27{lGc5y|x zTtL1X8keN=Zb>|QmNd(H555Ng30#MZ)6171Nvdqes#%X{2XsIa=b$eEk%=_Zaw`yU zgQvg}F^6@qLz@V@F697pt4ZgV z+QS3AYLA%?n$=D4xxhfJNWQznjI2c8;!p??Cg{6}u8}hf<*qmAizde^e4ErH6*zIk zHj@BwY2>-uWb)|2l$OX4dIGN!(|YF`pK?q=E~F{P6R!~0I!$6wg;}c7NC#OE2r_#8 zbqyKsIv!JD)bT7Ub>_LYf#@j}% zIejm8TOE)NRq~I`1p$|SAiYL;pFW*4lJEDl<0n>_n4ExLJb&-%-#53chop00ZqdN* z0s{87OK+o7Qz{+R@yH3?)^fn+mR`XN=Z_Ds;3!%P6JVPAyq#Yk^Z0qO62L@bnQ<0U z!g2@@MO0Uu>tVKppu=lSy+6I;78iB(Ob-UuWF zpp_lJzXLUnXKZvQ|p`0-g%DylMvrlFiWf>)a^1d``~JdVjtif1!b27_+0ZH%>+y`mX!8mDcIsGZJyp`> zbsT^@e1oW_$;CuVe0sJxP|zC6=in|c|6c!I(M2Mn4^4sOL{$8Wxzhlwqm8{=c*(w( z&mD`wE0X~f@D>&4TEBn4t^mS&@I7+->3NySuYgU{|uJD>AD11`6kbYMI^wz6+W7 z=0d;SRBI%_{z?7r&`Ig^g>#`#iA?GoV-mm&z33~UIOpKxw7#~chk#Xlze!C^Ee**A z`?79}VF2*=_q(poc28^xn|!}+UzTWhw0RGqu6X%N66~C&`ZOScSNKFkM2w7#XvMub zi0^`@K0b%5lP!UCrb5~M3z~MSG_M5VUKR2PtnzaH?siG>Ol1MmhOa@1V|-TA^ix%(HiTAq9XZp;86LNk zUR^X)#ZoCzv+2MPEVgo2$Y1XB7h_CU!fT-s^2&uWL#yjFGz^AI!)E2xT%Ze@n>LaeA7cp_ngeJ&mw0W?|H6T0@`3Z)3VE- zI}n&={HS=W-n-yx+pSS?@D52MzdX?RgdLrp0s?;;Hj@nWpE2cZlbwEGUsz#}WhzZl zL@4SzV+E-)J5#=CE|}&r%KXgS!8;O&JtNLrSpnajKelMwJ4YYz@OmA2P_1Okj=Ahs zIij+((S|;qp|Y(TqchsLs7@z#Q%x+B?2}vKHC7;;-RkP@={XL-sgaHVJ!ZjSRd+Kq zNXG|JHe@i^m`FKY4==B(LM4k{a4zR^>Q_k=b9Qwl&jT#@TrAiHn-yrV?-LucV<$YBZ<}Fj<-Pp9jWRGT*ou5iX?7JSo=cDwBZ&3ok zEHk6D@GqE_R$p5*PbB;H_V(Abv_MD`p9^rAq9uZ8MRnbO2?`1ZXv;_ANez%RqX2WJ zsECNK)owtYg8lygp3+I;D{z)Q`Q56I8@&e|MF;M+VZ!_mdgS>m=RgubX6Y*M`aVu( z28q)ph`1ZY!GH^S4o4Zr`+(U2|`O_D(%L_{v~qP#RddO zw{0B>g}Tdn?xS!K&IB->{!YuXeYBSwh*cM&6hV%uckcm#JrP$}o&>EiJ4m)rVu$~= zFI#3YWmFxCPquj6+d+G-Wz&A`W^i0!t=03Q=6Fi4F;#c2%yr=83&YTkpJujc@9kr% ziyVy6^H)I*WsD$Jfp5sl<+EAn&IEjHL#xbST&zL#VuD7~!pjXsFYe8Y?S+4cK{+F=`%)^T;IGGw zB2kE-Oq_K1jRm9W?_6kbJDfJ0exs=@imO&T3%pWCYv{Fm1>R7|(YKei42Btxm=kSt z+yfX!G_JyA5RH#B$06pHejNA#0ezNrq*YCapF=yHMXipT1j)W7%dfZ=@M&J<<>esg z(|V5wBuoHzZi3d35egpjP+WoEGZ+Gy^5B4bYy}Fv0OE&ROT+MwA8%6%lKb?(j);f= zC*s{*c^ql-;zfe6D@d*zmHj{)xz^Eo6@*}CXee!udvo`Dr|0?&Uh+gq2}Fp2#ZHVv zr%wRo_gTVCSN9(uBYNLYd{$9zMxy|N1vmmLAXK^IjIx6Rwl_`1l-LzSc|f|utz58W zhgP{L;TmPodf5(xaMgsXyYjQok9%o*L(3%a6Q!|}+7GSq;1d!O0$B*xP=yq0d6gg? z1%!MT$7+OGS&?m>Od!e*Mj8)x6JW*{3_hp41cIACptbc>bZSPYGf#y;T%pA9-%P~T zF+;&yI?f*ock`l<;IkU6WHr;({y;voedMAX#00g1Qp z$==UxxAT82j@MMovx);}?y8ebGEQ0@fHZ88mLMtl3ix|*i3z+Q2%!msNyz03u^DJO zmC!glYnlwW%nq{TOfHa{?26O z!8EO@U0z(!q82Z>OcR!@1LAi-Dub7ROOe#7we`Ysw0YCy`rQq+;z|K^uB|?O=O@?; zOn!yvnrPj!0#PL7g7o10m?BBu3hVgHn=AENclAbNEs%VrGnwbY@*Mbppez;KKAeJO zDt_3c2YcR7Xr{%73m^f$2nHVb=KCE#h`zC)CMM%)j}C=}!UhGizVvAJ(h_1Ta?Mcd z=3HT1yT7C@Ut10tOLPeHRv&*-uv5l+Dt=Qt>5^z`i#b=W5U_D62~dzI)r z+AcQg9*Em&9+qFIb&cKH1L;Wun==`rOGRZ6IbOnrUp*^85-aXoqt_JBzsClyh6@jT zEhERTgQgEf$b* zG~4|JiA3sC@c$ajZmzz%5{ypVDw4AUIl!SUVijK;0BQt4mUaTD7#MFC zz$YDxadQ>7>@D=ZquF)Y)W-0$_87Z-o>`RclnXs4N><^#I9xHGc2y7r<@@q-S6%FA zre-3j`}i38n83GSwpB!8c$wz{C?JTVW5k_}#XueT$DKFj4rbwmK;U=v`-|xI9g+i8 zupl`YB|Cj#Guj7u;xrETZvPy314Oe^m{$b+20|+V{aYFz+Xxrg4!OU+nO9b77g`@K zQhjzwwD8(~sxTk=Be8A=H`i@^Rfn{6*ikKT7#IF`&@ZSbIsOMD*k1hiFZ}Okj$b?e z$mwhUzVtuZ3IhxN-;eyyzwrP0Zv+3M<^S_w{trX@UmN(p7~21PI_>^wpF@3mrA)Nt z>Qi3psrZORAdO3q<*1nF8M{;2WTCP$D7}b`?qXlSoF83!*l`I-PESv-I~$h_HEpiS zjN@5n@3?|5lQ|P1w!^*RDIabYPEDBJ4to8$_Yq&)WYi4<&9#gE4IG)81$ zN%N6SRCHJ1niTe}zrQ~t6#oSpV1zz8deG)_%s`&62SXU4;0<#nzfDUyKhLAJ&nIyb zIQZHidOVf(iUgZA&YbBh`|rc0u=wKil%RvwO4#vCsE=mC5i>f(>qQCIQ#Ea@6d4&8 z1!MkF^8{a;{_SExe+@(Q>NqQ<=LViu&JJhs|GIwTM!|Q4YD%B2IE#*M{K${Dj*>^M zm)0lwd=}Wr;wiNQ<5)o)Pf0OWqL6J#_6VD=fa8*dO|5 z8ox0zecd+-`FrCN>Q0(NZBU_=aVbXOLsuW3a?v{cY-CCFuT{R&!Od-Gg8tF3A_WjE|DSiN^7=z`dgP+ChR_{&B7v#qlU^MCk{wRsFe7*%8U==dU-~HF z0;ts#{5=g#%%9ef5NwplIYf^N{s~xzZpmRj3nw#IR~=nkuyxBRftw7sRLm?!9TI2U zSU;XNN5#EwrK4*wI0kOCu(ba}xsHzZ_!+nIT8YCqCvTDoZSRt`7OdMUL;oeP-LhKW z3&7>4%i8shk2g)ghg~7-*|^;wid^}iUU)zmM&%i=_wAH$S1E?^gd4To_*eYM;WHN2 zhZyFWHyFYjH*RpQx7blfq@exj^!^>#3gcbCsN%wZ)=G0cld7t^h$Cl{(|#iEBmQK7 zS2_1hMnSenREbU>^3v(p^vC}RY2_l-^BMC$T~bLOXY~a45TXuz`$vQm7UFe>-7YJR zd63Qth7pLp2{>MhqDRGqc^&YQ8z26&_;n!L=^^AR?VP)-kfk15I|Vup#dke$f4e6> zI#RfEH7_~t#xbvt{1Pu!3rTUc7!Cp-evB82XYA_&^jO}~TGv1A4P`6)W(`-h_ONxO zox^vH*ASp*n67 zN@HUan^a*@U-eVwvwETjm`}-)@8_QxU*3%}APAuR_#BaUY=6>?A!iB)I{ zxu%3?sUyY5Pl!;f$6nc%7e5t6LL1fEUpeAc$eva^lPV+Im$p6m#9>e}eD{wkWDkF< zX@z+%uTgVdAanF(g2b+(jZ+fo>jG~Dd6qX0f*(S9Tf7T0=ofGMj#Uyp~Vz80G!&Y8_H^748t@0k#*v>W$pb;xiND2exxKa$b804=mxm zFuYX1a`^BInUh`nZl>9AhU})JFMdLRpGb#r4Yg|C8QNvKUI60XD1py=?Wh8knJbHD zn5Tx_P{Y`?g8gtkMyQJd*lvziZE+VBE;8YE%5_ombY9WGS=s_t%D13G-`4X*Kv*Ywp=Z6=AZzF8G03pIk_q@0_dG zFm6k*sNe3=7+u9${!3Z&`uC*I+iCPsPFUv^!=d=9t;@Kv;b-NZTVv5hGa&2c_qP4J z8gv!Nr!XjXYXSvU9r0D)awyN7(Y~`;>8h<0J7*_-(B;)bGJgz}H3CIifD+a-Et+D* z70T~F{RrM&r7U`iumV})Ly4uDIcxI@&R%KR8n*gVaf1uv>1wqc%+R^5l|cE`R6Q+N zTX#5$EZao3N2OsZp z-RrRej!4(H1z*T-YN)qPI8U{{BuPnI7ti~_g13Xa{WJZ2CyEP`#W?TxntG*3JG;WX zn=CZ`?Ym}n<7}cai%JXi;*p=A45p@;1LUswgL>?H29#{@&R8l9vhX~b=b@h;RXfee zBiP>nIOwSoYhZu0ecM~APvbPu{tApTtUl@}fgDdU9T#Kqhe1^J~ zztY>4E|=|jGc;L@fMWnCY0;V;G}gW)j{rpp6u22$9hzyq3R+_a9p|xd7yaaCi@3adzsfC4s`mfnifN%4pXLsk3g%>%UIb| zz!;%g*>oUFWHP{QvcZq235I;@tpNDM`RB80eKUMsxH>4BPk89ATke(ZDuA^=4qE=bTC01Weo zS<5C)_y#7+Y2J?vy6MKRZ`Ec*{_Xyw7|Xc#9H z(cm`!kNwn8wkkYM`BqV1hM~ifn0asNtWxY}r5T+BDKmdg*f7qu*N@j>doe{ps-|WS z2-_if*#i`O#s6>dVo?1Km=(5O2L}a?-95jm+#P)-r6w8biE?z-(m+{iBs5(PuYUWS zldK4*v^^j#FBqX9#~P+pC57o|kdW}43ag_<00lt=&JEbR+Y+LbQ2wK_+jf+aU5j0< zj7yIR>Nvy6o#63IzrwJ>L#evhXi5mJAm zn$PIwI18{7Vy=)U>VePYW9SLFWCj!R~P~JEH@fFE473Tka^xVbZp<4wC_)+E%4p~o_%X%v9 zK#MLoR(X-K<1G8WT5a7s_x9i*mM~MFU{6f0di`PiTEB(slWLxocF$NDp-YJQ*T9}gm(h-fF*qn>#UJGMje5&LAQzVU zbq`fI;&*-lT+fCufV56)@?ytwts9UWnPriY@?T{}Z@aqO3idNsyq;GQ9GaB~|HxR? zjHXy~#mr0#U6 zM*c7qQzs!Ix&OUVTiFL*$f~()NZ!<$h;mI_2t%}wsz47Dfe*wm23C0zfbdi`PQn@!Zz^MWqm;D!F&6n|2g5L&KMpZ^{`@tD%Vw&dCt!{z0t;EYs%w+wLb z#BeEY^@HkK6xaBT>-jcqbZdl5N_x1rF;sm^WNXw-Nt}*hT!S~P2fA)a5vTwYk{(of z_P+;A*ahKrP{Fos{8l_x;W6BWi%UEv`(X#zJOTVNtOKXtQatCh;Cl%@5FIaM(AM5g6lQP% zMnp}<;D0$!0&kgnmCpmpup_}T0tWv(BDnGm;5lS;U}kRs6NAi-_CB2^C9=OcxSQS& zyNMN`b>K7B{h7su<}@!7KjhWT=7$Y%I9`)thA#B4M16Q=z5Em8J@dIF>*Ivsbw;Tb<+}Qy`;s1`ven>mcsS)?SfaLVM-hE40M0F|C%tZsN%dc zJk_eZ^t|9VI2W+Z<@}j53vG_oS?xTXt9^zGon#!coh}^7I}%}0QM3piOJw1Hak1y;&rgp7OV1Oud}k7yB%7*g2W|=(&kdJ1%-<bFC%uo zP@jqf821lQ$QX_SXNj;z9X_z6#cy@V#F6%4u4of`X52=?n>Ku-8|oZ9 zSlg~Z1R<}12elFCSS8Sb!R+vmq+u+7UW;cwO>-|H;xSP3oaBALEanX@XiC4g} zQcUpiDmZhL9pP0LuxEWWVf@`AeRr6>tYANbm8k%JISi(wFaD_kWDA21IP?sd!@0V( zqy|>4Tr2isH@z^_Z!T`c2bB#rIGd}|G2IK#gMD~D*=#;le|#W=0$$5C*<)91BA{&i zx#(Aztn~!~$87aU_JRwb4j(K7u?^oFA3AYXIGwn?e22snxeD9r_BV$mQ{0ED;Bwg3 zEedAkm}GsB>cgOErH5DWceSw2HbsT}JR%6KKO_+RnmR_Nr(Nv!I9d^55}Wf^t%_O= zuU*H*)t*lAVE!@u`5ky2v(kkCM;C;K<=NaRz|l4onhqZc$Q$eN;)23rEUv`)(o*_s zMkrZ7(e(fR=z~wt-~k^j)3Ej9rT1Dj#ZFC>t33zj?3;(zvC%?6U4X+NHaxsQ58zyu zDNnp@V#bp;?0wC0Vk?O!lO209jpj!TYGS93dflUD;B{x?Txvf^Spz7y7Z#I&LqD-# zgaRATqyS8yYR!)v)T7m&ub1Wt-n;G%8B}AIrtA)$`(xN2K4czW35MUh$^@LMMq-DS zxRAo)%KRKFF~OBA!2)l0QFJ)&YUR={>nqyV#*X($Aam2|U^ z>LNoc;Mc(L@))%xzU`wE1jea4q4{9r3Q(QDN27HBOh7}c?I4^9c+Pag7ZtymEM&wIDD!uTfFTK@YE>V9@yOU|$!SyorMjA2c$4QgS2RR}-;Z{8&Hx?ikJ!h~T-`Zjlbv0=bmmu=oN>!%D}k1UHL~nA>QD-qcPK zuF-P$qmASub;Cyb5k~M4Hu%;1ej?CPMhv=3zh3ttzq`?!>Bsawtz8e}O0*AjsO%6> z_4#Y8bmPNBino^+mXo(XZ`|N(1Kuxb>?u=KY8Mv<+bqjp-}B_1TuB*mg-PCb!)nWe zZ%|#jB={8QTU_p%RieF7JSdllN)v-p3D}Wv86X@qH+rIZW||Z{H=8kf=E@uK>i9+h zib>UI_#wRL+D5xq!sOI9;!%SOatMxey7$s;2igUpz@l8H+$618d8KXEy!dw7u7Vd# zc>61pLMhq0^8&e26+2uQ)Vn{mBEoOIiUlAcR(X4BtHEp~M^w9sY~}h9LDZ~M{jkx^ zB-*sX3_|S+N9<>7eA^|6I_|&c6DPZ$w8orZk z?w(S2n=WW_rnc>2SEQh=A6A4HEe#eS&gDKLkm3ZfWqw}~1A8zZ<2#41mIMiU_;O0Vi z1)Q}5+K0+DmqxTXJN4*nq-Vz5y+t7*ZNW7iZ5(gCwBj&X>EQgD#wLp?{xxS%XVaF= z;i-rKB>FP%3C-5Nk($X2$-Q#;d-O#npSW9EhMTj}GZR%JWAO9X$y-wbWr)|1Ww8Tp zD@{gnzB|fB0ajaeBOQ0>jgpnuUTT2NbDAaCJnNx}$n?OD!{KFgPgmErONh8msS+sC z1|>@?<39Jza%(eV;sje(4txnR`M^;CcMaqD9lb$ULv1+Vp2hIGzW~wh#6#{W$w4J+ z^_LyKGwN!&GrUzwLiMB6XU^Pwe=y%HvPPXa!uB>EKd~npzD*$M3Uck9x)3;SKs~Kf zH^1(XeM0`O;pD|0PixesKd z=N8LA($1#3xCm@}b`KZ$;6XvvR%4u)<8qy^ADP|!VY!_I5R7jS!|V!FEr48rLk|1(3eul z!_E#s0lGL~2aiB5!u`+7Gp<|Z-+L@8{fsS^UbF_5A? zHgdnhmm`Ok<|XG;P53c%_KJAly>{d;=p|7F_mvY=WJ=z3hAYx|4j>kQEAaz86We5% zvAc$c&OTuXj|aHkyR{HM*z-6_s}4aUe@JnHVBPjhb1e+H5(*?@m7>{WX{JYWf_R-VSxB4@*~I`vfWKLb-~>U^rd{7j!DCs?C6oZ% zItJwKe_i|z93y*fB>55GrE9LB)DYwgw!px^245w5cier_>n}cTcX*OzZ5Jb}+uspL zoeW@lRA`M#M|X5^bhPy7As#NO>yD3SuqxtM>MRwdIGK3i(#mKIdrObcWEUVEe$Ri# z`t5<16F@-cSe_tW;X&7K$px(}9~)VSj&2U^_}H|c^a;rI{DDYCwDauN$c&(&w)L76 zK7ARe366$)w|W7PJ3+HLEmMQi@(zGO9lW~)K|M&-Q6xq;Ih$Z4 zmoVS{ydUmk_hnD5KpDNm2nDg#BWSgsf9BTj4GaMDPUtx-6C9a>{yvtoI5Tj<9BlfF z8$Yvwl|C%$^$rQfcLM?#i?@yt$*_j1L39B=mI@$U4PK|TG$fFVE;|=z>l4N_ZL1U2 zy<4kcjZOlqc*;cW2JRPOq9Q8T3rCn9*-(c4+!wB$MEOiX&BE-Rp> zzB&kSovIiWH^3bq!sSjmGxmq&@7v8l${pW%n?j;bklIIY>wjmu0mD zo~&iiEs-UBq-2wS=;#rExFnN>1ypombtqg;IMWE9ZZ)@<#F2x*eSUx>hg>*CtA_~y z6s9OHhi%f7z`Nz<$#k{qTRo+@g~dbs3sivu01-YKXcH5UlB-)%cDs|=3q9J?hCh#| zy8xYexF)ZJpW}&K)E2XKipcJ(A3wr}xRyq$ftuOb80HEr;tS(CisIeXT8!K*1FV_0 z%%wFTam-BGp*d<9FD5cO3X6qG>nc7`F`h^p>cOm&k0+i#XZiCNWY{VjZ= z8Q8O*JJyD#pnWOGv#i5Uc#lKM^~DRoO^tNfB&So?QY0uZe(IeukSQVc-?@Vz+p9dk z89dJ&tL@@Gf<%CCu_{q#1TfB6< z*8`^_9?8+?&$am)U^#jIykmZ%Xnrkl;d?m_WB~aPjQ|mk_#+E&Y_7b%$mbYS#hF?} zmS+|@m#LggeA>8694RCu3Dit&O*ZwPDcw!;e8^U-vG=$u>hFK%N8LVh{a{fIX% zr>6R?k(&bp`)b;e-quxnPH?OgjUL}OZ|w&hs$eU7O82`vj^3?9+2 zITj$B)i+cp{g0iBtg+F1K|=w|$p^{KX31xwc4ouMZ}8Psi{ zZyW9o5&@2q1E#uib7BEg9^3=|+^I~wJs7)TYLi-90{^#Hs7G>hXi2=Og|o+6S&9!p zGmi}FZ}BUY#y&@mVKV<8b$|+1-zif)wHg141m{CASm-5?=v0i zmrkQRKXUvU7S{3qSwq}?hkwF3auS*=hUV`-IbQ6aI>x)bi1(NU;n=sQ5@8AfIUB}j zg+xcj_g5vzfrif!x5K+BN0HU1Ll*r@A$Y+xS_~Y!=e`UY?SB z(u#@}cp`YqjrT-My%4}nT-4Y5Lse6!VhAEd^F?)5Y%lx|m!<@O-IWA>k41ePD#WL3 z1YMfdcDaV~1G5+>KxZNIe>X#>23 zBd0J)(!_8pWHw}9)f_NL;aKzO3Vn{(0}jGp#zVKr)qbrBRSJ6DBI%m@b+8PwX+B(< zH30|Qov;k)U%+n|Z6d`5EeVNAxe6~2O3@xIN2`!vT`4|Wc@NsiYOFQ1$QG9_6I057Z=SmoS1{V za0*(Mg^muSS$cm8sSC}i$PXnO?-qL(*H&fb%3oU99Au#s7Iz5a+B;l~--2q$4mXdB z-*#VQO%+8NE8bMSY1HtJ{%^9z*Ujk#RvK^4T=q}$zkB!Y>vcBzC#ugRVrXu%zV?4# zb35twUH_z?%Q|C3w|E2xi#QZU>%n2obWR$8)>h~Sb zjM>y+cb~t<;V9w7Gq~4}5YH&yJ+HuKUoz(LZPX|nuW*TxtoHfHMREKow&{)3CofS6 zv9Xs>#5d2myn;#GhTgx@kRRvvtoHe`o^!c7y5xRC=gt-Nh`XS%k6eGhzWqe*6Zu+# zyN7-owz-~0sh;TaIpIf$+n~{R&$Vf*9X1=QSZ3_iv(OhwNZGId>Fex+yu$4ZFO2db znyIhru7Rd7gzuhHMCHhWkd{%Nm_Xip*Z36wU$0B(Wo53O?rK^wc&x5Y z&ZkW3zh0lt>1;qo2gyxaavt=8dtunOe?LKcxZUpmG2UaOdOmEN+VnCBMj>EyOT6JC zQP0kFVD~XaxM!t;f7&N~$}oH!B7XtQECM2#oL^Zv4Z`#e@(9FYo|wzJNc)4e+8sry zRyb@7qU1SWn4uoEd7zP!H9oc&y-;1F;^CRNx4dBgWc@kCJK^Pa8TACFd)JX!hKbN} zMW5GUk1u1$jl@U+=YlZew>PU1O6SOvSx|IV)&&1!RCo;zCS}0I^U+MATc^#)m>Q+z*N#@R#s| z@3MSnCm|<3b_kYeUJRR(R|Qgs!x=*w?d_u-&FsuK-V($~$@!E#_b}LJ4i*p$OWaty z%^3v2&vRn6fzOS=%)VAR$R#EtV)Zr5Sw*XhHKRVP>4jWC1%^q)urFwiy~0Z?ulRYb z=#9j`#RXvLxu3)Hh9A4yEK6_4cH9aT3zd(P1*i zni^H-rHt4Q_xTbVKD1kA9&-GeDFzs=AzyO9d%w8y3PWi1{8$D~cm7KxpUKBO+wYf! zm^42Ld!C!4ri>vbbq?LrGyYNAH&#h=C2b}sKyG}2qTI4+Gni`8VAHQqbrimjCWXUN z;swXmmOr@(Y1R|wk&k>8MIDLF%?qB9%|71^nT5~`mABNlp6Ezj#Ld6UPEuEUTVFr? zb?qNt+0BQQAAR7FHP5y#UAvSvGcxrPwkO>-#jZ2M_0^A7xK76T>eXOw1}LRvkzB~9 zun04wY8A&eSWZCg(8_vp#h2;w3r5g~ZXd}Epl7fb8t!LbPvEf_iM;(Fa*-%z?yl?4 z+fajeQYWp<>olW^RqIZW0`Z+uBH5m6GHYdBBr&#wEQR^@zlp+)je3yXzPT-=5in67 zLuChP5}w#%o|(YJND+^9#(5Kwb{bGCM6z2yKTlbSID^-7Pab^gkJWpvw`r8>L7Mn< z`I`iyQiy#vTcggq^Dkrdh0nrU19ba;{nKLZSG{-Eqy9(n8a*MEmF3u?!%Jpa-;j5x zAec?jOVZuPxpQPJJ+?M;%%w5b+S-)6o?ZekeK12JMXZT*_Kox?#&}P*Fb=q z@5xR|sb8~EBK7de42y|N{Em9jPpJS3zDUC*4uOhC05Qhy)J zPy*ZEZzYY@trXZjhky{8TU*+gtw1ZH`=`--&PO`&d=TA6vbgz1xc@e)2lRD==3e-XfvQ^;QGoqh1+fU|M>a} zs3^CnZ5sp>L=lmYP5}WCX_0P_&JiR8q`Q^wmJX3_K{^I0X^^e~1cvS*hy2gL^(?BB*npp_S8Kg@DgbCd!?K6v-Jzc1 za!P=Ic^7To3ZXhrdN$>k@A80d)0UoE@HK(6x|$Tk zzKlGA**t|bf*9(w7e9G+WXo=JaOY)*tI`_;fz@CuzmOAXwY(3vY-VOSR=2g427hj? zE2K7fL85&Y7sq*0Z#9soRz)Iu(#80poACp0$l?6rG|+&g=qr^sl;TdVS@+Ecb9Q>; z89KG$T|w>5tNig8`Y;U0-rkdn5=TU7Y`zQSdB%L*+FBB2RB_hl7Bl?G&v%ekyg2*C zem>(L>}rxX==(w8n+BXJk{!Q~*^4eXf;x$c_w;nmXkLBAlSzl$w62m$IQr>}&07d| zL3=(RzHgj{BD@z*@U81*y3o~NX@!C+hAL|*LqlUqk}Mtc3^=QHSr}+q@zbxw#3IUv zSp_|V^_FKd`H6(+T^OIip3YE0-1(f+bI-(-POrL((2^s$9v>Cc{@hudU)u+aE9TrK zp4=u0nlUmV=n9Xiq`4%WoE(q?9c6=Lq7*X8vzC$pdf%aa>s*MvT_ho3)(o5W@4n_{ zBnt}$=9pSegSJa6u%OfL)m$7VbRuf{H+6?L6v^Q4y^3?n@)AZ)(LyoIVC0hcy-Bh( zqDJ0DC#xKkiSW~7A4EXRJRbASYo9)}jp(NFi{layyIPhkkR$Ho9{I)Dus1}BOOBob zP2@=gG)Lj4yHA;?%ROK3%*WM`kH?_Ka?> z0?&(_l1oO-I=?2{(Y=CJ(*in$q+?9qAtEGnj!SxUc-(q$+WXAvIr(hjD4mgMSz=@n z%w$9y*QkCG9IY(d&XLWmt@vx`2KEzPodfgt?@4`$lJ4I2ZnO(yo;@ujG3?O};-r(P z@$hJhQ0S?yb__pPR~^65`4zoN2eXf@hyCCNo7TadPqdbeVy?mS0!ywHuZZQ!K_KQe zCQrCowzd#i12u_>lg%>XCKES)Y^YtI-LUgmh@lgA%+h6DayK;%@w3_A@}r#eIm_?P zls6@Z)Yv1fR0Pwh7kdXa1Sgj7N>97;-pwNh>S;nRiRE3dL-&kZ66iomGt|b(w_E!P zSd=@0e)mXk$ za{@enu>RCo<}Ty0X&!oTL^3${YQb&H{ekJ=h?exY;OmIdq?pt4&!wwU$HXXOPgUYz zv%uY{O`-_RM*mx3?)Q@tc7G31<1dv}CdHd1+}04JU(= zoeT*lO6_}zh|5BOfD;m)kG(&!>(lDrSXpS_1ibQzSFXFt!5^D zgI2a`<6Yh$*E7c>UG%u<=zyGRYd*?FdRSAaUO*bI@9dniyBExx6ed`|mT?@Dcejr$ zfy&W21zz|nD%pjYH@?eEk+6`t+@`IuzJf7@!~Xt-UVeUN>SJ)WT}AGwB)IU^HKEM; z@bgvV$}VctlIg`>IMM)c?2v|nK2nK#fwIz)gY7%}h`XiVO4A_w{imG_40&w^;(XAC z-T8G=2$L_*Sn&Kjp01=Xd~up|eFW3Y!v)xw;_Tq;e0G5uySw}9jZw|JTMX9`L(6KP zRBd^b!k!{z05Rs1T>1jk_qkn<4oGD1AFq`kWK7V6yEdnNWs2ZAoT#_gG=74#8hdiY zj9`}vEj1roLr3Xf7~lCxlKL+h-i;CeEbQK+jlh{oK2k_h0-m33Rysxm@xyotnU-Xp z9^2`2EW($s-u=FE=VpP0EQ7IdQc#xnTcnGdq7Bg`pZ^*Kw6)J0-mtf~$@LogIyC7m zhq7WVNI$rv`&Gy2_V8S%%~JxjLfO zw_eNam1vyrlj>#05Umkz7OjCzPlTM^K~j3c=9b7yxGUvoDUo@_IkwW>3E+IFaCeQd zwS7#ijPhygk3Db%CYH1~?+86IASmE;B(cc7ZA2L59evrC+RJ^(+{W>+z5CEHAvOlz z!V&-&IRnlyLPi{ql3~r^0jH9`;BtxJM^72|*_i>1Rmd$CaR4+TcvQT}k zi_wOELqP68O!aYZuNqTzZSk-8oGSl7z)cxypGITsC2~pCn6;x6Jci$}Zp{kcERdj1 z7z%;xt7IKBy6v>Q-%ss5&TVPYFR!*g93Lt-E!eqvAqN74#=-SO?|+NPw zB`w=kG`@Sd)hQkykWAGdScGSU6N}@i@7bByTa}NFb~gF0SV^w!IH;vJDO=+U=UYtw z`XzRt;c~FSd;ANHZ~A9X@lah8a|Xo7B#HTgD?()Ua_JtxN>GlUT6&i_PFu`uL{YiH zO{^yLvxv6-HlW=K=#yiFdJJkzAo}{B+xj|yb&xQb-n5+ld>dPk1M5}@i8S?XT|M~C zV0mk?xvkXdhK4NhnjL6ZkA$HB%F*XuI(K6^@ylT1D3aJo-08%zbtDD;JciZ`R9fvS zqi+$Xfm=m*(OI2u>rd^>@6}yWNrqAo&L!V=_51FVC63IKv8>e8T8#&GR@yUD^I*|@#KE*SG!zL&(7=!i)^TWj-Gp~_#sq^L=3FywMwPAg7T}* z8GL?*uKMsfs&o7a<0!@=uQ)r?eEe2La4A|Wns4LT(dz6IX^bLHd&BJ z8UEaaa)Rv+(HG!;H$8ibt!?r$ht?n&$ZvA>FT_C(qW$A5=z|cKGCGE^+sKu@_Fu(m zi^bEFBRZ)$o>Z9_Rx(gylj;7+4sl%Z?;<6<3W907$F!X8sUwQg}%?!u$WUe9!J8XzTf09votY$1!6g@ z_jY*V+)a~~6pIKoZYsrD^`N#g+=Wg~`Pb-S>Ynq91@=9Jc@sZ=M8oObpgF9(81c57w-75rMvr3IHYl$JD?HF2z6Zq%(mXt-FDRR zA$J_gvlc1O%c6e>ZjHKtKj9Je$*Haf@4*I+zIIifm%e{M%U@q5&;UWAPj+lz$|Bs| zL@e*48d<&+Qlr9ZC|<-F%)ou2j6s5CY0cK)Nzv$o;r;HFmNW>|{S!ZnsCb%;h~j`y z7F9bNPx&AtAK2^zg9CMeZ>RrIsMAiyhZ6?M?9o4aM?Zk~@4Hw)WC&$R*tvRaA0Dg< z$udly)hT}4z=mU@E|ednyr6U-WHBu*MRlB&D*ZY$()W}%0+8e~4NnNE||cu-f;gulNKyM0pA03p`!>woS5cAm$k&3#C@D}G6zm*V^oR&Jp9p(vgWn0@~-d-h`pTTw|Y zO{z!ZI&pjV4JDOJe!UQI=j{4ZP1}a&-PfrH*sfuvw*i2@9|Ef|vkuYzk5zzpVb#vzx&Rq8H5^UT@WEv?%ML=Edd9*DL%{KW_M z-;WR8^bzvgjZ_=8lYC!g3sUdS*3M)M;(yucG(TvRxc*qBJ1%O&TrNgOF-8acLOL;~ zeZij>N=tW^Nkr9IRJG$iZ1SAUS#7m+b)2i=RIqD@a>FhdBzR89eHSA2nCI|0+w96O z0ph}*DM;o)#1wRv>hAZt#0@*89v#F5_Bi$0!Ct!dq+3FE739A>L(u|+u7HSn<0u>m z$t6=e{O+kQmkFTXle}TSe_K-5+uV$uB{<;uUwdEE^O!$$yz;G8_Gu8!HfDOLMl7%kYKrAVgC(_Oq$#~<5Y0;cZAclO_MA67bbAW&7v>tv6Iy+%lrN(i581T zi<^UPDV%)+5(ft9iW96;Auo0(Sl+F}{3&h)zwy}mYtT2=sYf3cjA+k&G88jvFrMBB z^}MMR<9&zuv(Dd?hfTX=a=EV@o@!(odW)4YzFS_tc`xLMx?YAPD>qdSxbuH_J>v9Y zR~3Hn1mePAba?9>6T2#@N7jw@R2?t=TKdEy^jtoU#jLBRY@o-vH<~)l$-13(=GWSK zUZznfNm_Hv&Hu){x1sA*X78~|no_6BG!`w^UyHrnA$=UmX$Ty5r z4QfO9LFwYT{ik>K&H7)&@@#ZMo17Z=uKtT;)e2Il3Ia$15LiA*{QTx>5jmPpyZAyk zBiX<&ioa0JB2W2T{4^99NkOzH8Tn8mQeF$2!{+-hq^-{asW+qI1xQ_RbNeO`Fy`0} zn}t*k{!Q#0j3In=ww9T$RTJqaQ@fRa;lSBHtX>2yK$LP`e$sI4ZXsNHs?Gn*J@G16a^=j@;>CY#u zBi;N=N~uR3Y$7xVz0XgTOlte_E(mmq-g^8Ml3O7;bb0|4H@qh@zG_vO+&tio#~d2r zZyG|O$z^UUVRCUGwfbG_OS8o2dv8glMTQ(~x7B(%U*u)UsI0u+`%j+o9b&%iCx4@i zhLmc=!`1|ci#)hx8cT#0)?GEZp8@TAk&Ze{qX{}}0rIIAI<`mf1~0dlkIVi%db!(s z`1f2Ft zi^7F4QiJt!v+UGX^d6f2^b&xC{`h;qfx?6NuFf3~w2c#!)pYeP)wfIzR#A>g6W1|^ zJW*B)N^>1(0-&Rtoc_Ypl+DycJ30Lp=&`jl&w7I5@wdAF2xfbBN5n&smn-J6{Nn4a z@|ESJ5WmM4*lwH$fDkEsw_Bm2BxXC12>kEd_E0eR3w`9JpaKav_H=q!8gnaV zzN9`%eF9UBOSTakC;-z;Esp%ytQjfkPhpOsk|6$Zc>#NUU**)d`w@r1gjK=ZT_iVmN zG=J11@R5CYQ+;xvWKVf~o(Mq+h#LtG~2zlNGHuw_?fEh=K6V)3Y90_uERsNHlTBjNwg!6cg9+E((MhAEoAq7uAvIvAJ^H+$AB18fGw@P5cxj7WBum(K(5lmap9`YIkIrwy#Z$i8H-m9~32>kN)QeC2! z38)pAy{ZKc%wXNweOcf3DW#?a5M$g4*ggwt4?t>iRE}w16g{^P5l95=nB%azAPD^9 zrJ}wxCK*1{W)ED ziP?!88=n9`{&&D%{P6um>0F2HXYd#>>?%FAXZ#)4#j?zVyMaYqp~<2Iv0elDt=Wh_ z-#|&`pj$tc19N^|XH?cRY}Z4MrxTvlW*_uPoY;CJz02&qJe)M&{I^lg(e>w6hl%2I zACzT-?cyB|^ql2XK=8DoX7}vGG+=*;CFOwFM-t=Ds)6SqcPx*8Ua-~8sG~-{^CJ@S zb}9rWC0Ci`_~3_PBCu+IHE&sp|B<1$k2cguP720PjN)rJ-nUluI6bKUQc$Jn>eDy$ z_Bz;@7mSHKMsQ|Vz80#R|Cpjcg^*@nKay)woW_a%iMdg88&LtaPM`TcY@E&kx3RXi zZE$WA>km}{RQ2Za2WfuIt1|y?*FU3{ku?!i4U*+{5v63s2w!nB^=)W5i(4*0k<-$o-wC5ssf3T_7QycR&5(3Far-v5m|d zyaqyA$49`WEbO`t6W^Gy892R@%lxQ}J;^D$lC;lsAGj%jHqU+C_;F(%-}<8#3j*ju zerGC4SqibOIH}NQS9kI7_Ap!hUM&2ubM5Czw}&&DHx*6XN^Ry(mC8Y!M>t=7fFW8b z+O=;?#{rxll>DL<@1S6^!Ym$ml_(`S@7?ebhaFXOA*W&JT&C$@Vw7NLt97nmF)gV2 z^PMq90$**zy!Q|AAz-gJ@ph*9=1vC~_Z9{YR-`Qmzg*EMh~-kSUaLsSn~iAv*CJSt z-qIqdf2$#Cg(~0xhR_a=_+h3PZFVb__XREkgxOF_G>Mz?;&p%D`f?Rtq{pOoJlTdG zxEyIUyIpPxtggGU%tyJub1z0kjf``nEWw(k$l5Ez(gRHtB^JKbz5P9oqDjRSH{_UXG68InMoql+E53t3a&; z5Lk6?QNF%A_M5Y(UDQAq;XR)_ae-W{vdJ$GV#%1E0@_|)0&-|CRd{xOd_PT;)N>k< z*3eW1X3^#4<9v6qA6BQ$Z8hEHf!=hmKCfxc^q7~2y*?ui@M&X)&mU{{9KqgjT|}u0G|J=)sg|W`|^6Ldb{8(@(5Q;`gm_3o>Qe#hr3)eJ&|E?3HGjL zue>P!g?sM8xAS1iMSH-Gc7P{aKKuT61Kids?UU}R+C%SQ;u%ek1iLN@$U=)zX6CEW zt%$@Fz=d`O0TdSVWdCB2@~zMlao6I)g+ki_nYE#M60^g?@0>BJ|I41b^1aR}9>s5$ z+5wkSCHY%aD+sMUw=T>`>a1#(khA>^frC=3G2b=)6LPe!{S~8Yfd4P}DxZghUG-Fj zSh~h`fShP=C$zVqzP6I^B|a9)g1d}84PINMH_YAf(&t%7t@vW$d|<(Zei>XsIR;e4 zkI&iX$2qx#o`G_& zisir`RX=LEUf)1{`4Rwc*xp){&?7lQ$FSeBzIa#Y-*>SXY9|!uU7Noc^yt?(tyrSf znY8|Q^Rrk`RVGK1C#^IEJhix$)hC>QvD|vBESON6^NdvJ4oJLi@uOfTlMleolSS)O z^Fa@zcwof)a4yaJ^c2+H=oymUh!eVkg)V~FX?;%cg6aG{8z~?tOxX!;W2H-lH675lf>zUf60VeDJ*TW zD5e8IMed0`d?|GW6xO4=r)}6qVh-=-O`!U*%gBsQx23 zO4{3ph-jC=*aWr4?~k@bfSr@i{BU>*;Axx+r_?-^fMfi(pjMth-DIy9MZC4{sum+^ z7MK}9hL(&O>}cH%hIa+<`HA&3Twkswyen;#nK#lS=s;?2Yd~+5DAfl zTotrVZkCN6x!*-Li`ww(j8iaWyMV-@K=>b755oewC@KS8Quc*xty5ByVkRa-&vSDV zRoo_^+Z~A7c(xwEtmpALU#Pev5N;2AMQ;kRWxse(ajNa$e1ki zu&OQJ27>Vq&xA4iWjltay#bC>;(Ry5lcIAvT38PVTUFLTwtl1U(0+7u3UYkN_*4={ zIZ=n6Eq0_zs#{uTIVZY@BJy)GaQOf@pfrxh=T;CNwTd8N*VZ~&Nt6d9nULQp3GLxs z<>j8T9kxW{-CSqWJR2;A6xG>Q4QF~ss&vIyzKzcWf&0ioH+c|`$TA;-o_$bFk<~B% zdH+I5!eq!zJ%I$pNZ|q60he! zDN*Qk&FcZ?3JCE|lsI$%IR=Ic5bC@P@F)Vgz0~Q@lMTrs5G{8y&~ktDH^yj*LJ!9} z4@ZVM@RONKAHvRFZs$7M!UyK0+S?c6)$kS*7~GW>+0E-!55x`&^Bo06+_WO)ew`L~ z3TnBd|2t9x@B6ZMdr0uWq=l`!Js9?b2W5S>RQHRbjZTZ-B3Msv`zZXBeZp&ynCr9h zMIHpiPXeLzm9fB@Ys3F4f(kec3W%$&xAkhZ*MC>B*p#!DKB6Jhn?=>S=F|?>uIhG6 zgD}QS4X#d;Bw2mAzfp6G7Yh4v*e~oWal8!{G>ku_N6D+)L9g@c7KRJm{;zx(Db|A6 z%caIZ-I|jBe}5#~0R%(;gC?;!L$}mfybE*Y59&Vp`!*oY@&_GIx(&pp;h6v24un)c zp_AGP1uqi)A8(=X>E97A?212X3~cp(+^O^E*1cD2DCoI}Zu~Vos7Cv13{))O53gM4 z=}UF|M;my6Sk1qR=-JaA(rcuU%DGEK^B_gu^Sjc9zwz=?ApZ9v5I4!MAiTLlE_KeM zyz^H#UO_Ed@BL#x5EDK4g#OWGCWPWb@jODU1$+RtF{sP}98(BXDB2TUD7A)fM14wo|4EubUO4WTRcMBs}}z~)4e_2+rUUCiyCy&Ua2HAMqb{#WI} zc6)wA{~a<1mVi8oIxnfO2IXBTd-5hZg7wp(r=_> z$HGU0gSD1cc4@AaGTheC*6^a@$3CFu3&z799>WW7%|Y?kZ&K207gSaUl?0-E^Pp5K zIG{Qflz>LXuCBXAB(@H)#ZMYGI;5pHYg+Y0rSm*VQCM)_fItWPjVDrLV{MM+l%G~y zLq=#*W$1$ID;7;NV<^S;8!Z3M%1w6e$R-rZr0&RE2cKx4rE<)Qj8O z*g6NGpm7w|7@auK-1T#UhL&^w!@^LaS96rs-Jac6t@f@B0eBvSS*iLN8R^H09~L`_ zYOA17I3oIRw5y2!Nx^eC=A57f4(c}GMw4l6Dro%kcMQzMqX6hg$O7;}o4O3BUFcqcj&GyaS>jM=F98J1S;Z&1B?eiYo8 zP$3wabXX~)<2!eJa7RKA`i$=eS_9w+6i@I5xY%wfK(`i5LCM+Tsjqlnp^uLUrX)8g z)CDCG{Q|TP#y7@AdkpFqub5_uf+CC5t-PqkL2&bVmK{Qa%t{deG! zkM#`}!dwQ2x&yU>UeLY_DuqBJZX&$5$zGywyhL4Jm4y&P4YJ4qaigD^!=RX_bYAg; z2dEcn2-YB9te7m5CB^aM71vXIy4)lwwm}DHprl-$<0x+08(W`tXG<>i^~n@-K!Uo? zk5{x`T`>oxNT5c#X5Dq}9h)o-oXF;OLPkaT2#p{pLNTk_d#kFdF7Za&+$| zNJs<}WkrY-nrTx$VPr0PTT$<-Av%st#6vyg=bm@=lS3@T2Abd{2ahS6dF?b zsgv-{gE~I3y~0v9{EiOo=ATrL6Vx?S$6XIiB0&MiW3CxV1b0q;K7Emcn!-+|Xc+U} zJvQ;46}xAN&V%c3UvhF)&MSV7C<&n2X=aR%G;iKj>=@KV7cn@AU)lc$;9wU@Mp^K?KCtTdnp)V?4=Mmx#+i~X% z6FEeh_YE(b9l)jF(R=J)H@?a`e$8s>m1&_qxaIP<#LK^wPigddc)h*=Hu zOD9%|cAvv!LwW`^2I!F(7!rCFkrl1v(JybkG!g_bBG^v@REiUTPOmW%W& zxYzHHuTQ(M0BdGW@M39TLR$E?t^D&;&U+GsRz7&F(l}iCgS=v~TAXfM%hK4YU)QJe9XUQPA!f ziUPH!lm{oZMdLrNKE96j{-aA-ZgeG{JSYd{R9D}x9b$vS;l&dJ18m~X;^G7-1V+)s z7}z8={3{{u9g+{VqzPB`?%s`AMp zHcxiJ6IFH4|0eE6=ml|4PdVn=39empz^&dpQ=|%ynOxzEAcY74Aj75qc;luoc$CxB zV0pX}{=+GQiUCdtRR$^K(GzmiL;yvi1uix^zruXAjesZQP<)B{0S05in#QE)8^^X0 z4oDDn9O}GySlWz^VOt-l1{C;<8U?B-YCx4h1y^_^7ShsK(sk)!7^p;x-5JUS4?&Y< zm5&ijhNbl!V@IZ8HGTYRAJmIc`{0rX`kKgS98asOGx%&U+d%P|mSw@2>|JYOAwz{Qp?}L^k&!-E^+YiC~*!V~A+kXe&qTuDAr>fI?eL zTn<~iDDm3q=sKv1mH4g$3XuNW!}%90K-E;NJb?~LNp#`WjNB;(Sj8D16?;56GWQCa zes6M|j+H)oGC3@kzS~Fo|GKO3G?cyK+h;lHpqMbJka&&J;h~{}2MAQVRzyTZT?&-& z<^F1~Xo8s~Ib+s+E6S0yn z-XfA|Q?6ocb>`C4tz};o7389%G7=WGTU3|AG%_+$?>-$C;S^G;syZ%SD2n+PQyEtU zqX^nhOG6WShHj5Noxf(%n-Zg=YjxF#79l zTGX*fJ2uL>0VT%@eDfKlpdd5a?S`63mBCO5Q?Pt{n~H*h!c6zXa~3>HU>Za~7{IaY zs5-JQGRUZyH#)6p>PPqV3iO>s3`TAqx?3eYWPZV#k%zZ*@S~ry*+z6H&dH=Xg85Dv zC_m=CdzOCMdA5??(#y;Qy6~8o?t9+9Pz`yqj?28Z9sLR{1e$Aj52G`=gtGFkEApWl z1Z)^LxwHyi)uTmIlVx(pPcv0BM5CIgddxzD0;tw^B@JYYt^jL`kXsZ>2GvC=RtOd{ z0^0Z1*ODqnP0p_#bado01#g_gIT<%ja{_*5a{?qAueIz2W+U1z!Kc(~K!sp2_|_~c zoB@r?wm1A?s?u;zBB4D#P^e?Y)1^!aG%Dt=wE)xtHa>l=V-3STvG2vb{Q2ke@=QRp z4X^XYo1gP}vdIquqlPy9FS-Q_3#e}B3B#AW>(81^C=dEv8O+@lFN-l%&B00#?o&;R4LC?E53kpCw3KmNi{ z1IWX2=-YnkltcdJqBslPLyzgxD>;Q7pwWde!1R&~KtV5%UR;gX8nLAuP6NJmWUG_& zJotT*KuerCkS({0U**zP__0=fPiZDLAW@V3E(3>hHJ9XVnQL?YY@)B6yvi zt06pTcDQAx(g&b#^-n2&1M^`eV{6OrBtJAhy`B=Z=Jf)U4?tw~PV@7H$0Wrk$|kmT z^3C4kRex8AI1S$<3r8jS=z@VUb9i{`J`Gh$_^jQ=`EDgX-d*7B{Y>yLvAImmqYoOwHV6C5nOOs%SDi8Bt z1Dz=a+8Fge+fHbuyc2oNhgJT zBXaz?``PAYRD9yO{<%Ekp3M~g>l#q|PcM21Aa`wxYNBgUt#9shpgFF278Le7Kc}S) zCz2NLn3KU`QGfe7#K$|+Zus~%Hg{xv;uG8m%3k}#+IHY)0V0vk4;_MbSX`N}ytV|( z<)cfoNbE5)-z+b&$-6!k$6Y&jILu*h&7Zpm_KRWwKGVtq`gUL@3|RW_-o2CLZ3+?X zGXu-&xOe8Jf^Bygk(6kq+&2fh14MOibCb02I*m^H60x&P8I~+hj6j2itDZPXh`*v z(IB6-Wdc*(TJ!E);+nPErpEsFHDwtZ$1)`MBa;CY2^LJ-%H5QaFfzXj1(s}cI=nN38?xHzdI97 z)1E4m_;u(Mo=0q7yBNj{T)o?cMebQda0Y!CupMkQcQ^bsDa3-XEhYt$IBLc<;AUvA@EFlj=2`c|-!gOR@q8ev_e{QaZ*MV; z3O2hwyg^fEPx-T_lg>uFDY!GKeAT03hxx} zJ%rRs7+U=tCBQ2$5cA7;q;9Itn`AW!{b9_7N=wHG+^k5fHn_mUXgfymkRI0W%SEq_ zuZ1&!hK7HZgi>U{#)6qK9SgRTzifx+9c0l*1cFR$JIu|^QujLOqm!mN107|e!diMy zPD|>!w9vqR0j-Y=XW^@eAil03|7XmDciY3I2(9_vq1!!BsXeE2C6nT(e2=t-XrreEv zViRh=ko{HyowKv;H5J#rIG^A$=lAa=-so;Ddl51BMy?Kz`e&q2C>pGl?qOg`O2YNg zZc@cR+C1Jq77q}HLWy76buQGAk%^-k{O(%;vy+_Rc>Kr#bY!x!OyT4F_+G}z`lZ*8 zc!F1Ka+i!>Mv3_A+=gA_l=9)5Z;hMl;DRJMjJkzoDckEaIV_I7c zBGP!Yqbm;Dfj8HG*FC=i8~wNZDR_Jilmn&vaSWhEm-wPNm%)f2 zCs)?#?x~t{=}#DFJ}oYeQHb10OJnBR#3b0A_CNe^6Y0U_?See?4RhC9g!`lV{qxax z_Au{BLLd2XCPgjOo<9?K7p=U%K>`gW37oPA4Y;8cZlDMs^y#O)nQjch;J$jfm(4p|WtD zkN8XmVOQp6Wxr1Va{_%j6+It%mQpQazsXA)47zvEsdevIZfAiQgsz#6iH_0YDn9VS z15}UHwoAa#s|)(zIIw-+N!R|KME9Lc<>EFK*V7u{Z);B0N_BmB`g9#kz#mv^t8=N~ z0M_*`N3euqOaE)1NMCF`&q)BS#J2kSN}z=Z{9Nn=-c+shEM84;6J&3#F!F9pf6=!I zNr_Gm!A4WNml0{oFKWO^1)H!sS?fVVu9R|OY1-P(lcq{=PL zJ(<1eM}BNXSL7h>q^wlO#OO+5^}Nw;gb$cg$Gm93u&&D~Xfb2}A=(j9M44GIaf1fn zd&WJrx0P{{P&blvTk?~{QA9hcHxz9YoL}Hr`!qZm@R;TsYF{ERsiogC=W#g|KF7J6 z^#nk3HP<}_-1oe-D@N%f@R;}?=3+~}+nf-4y#9fAxkS{ik0a02SB%10qZc&CSeokt z1o7XpM#Y;>1!-h8y9)1%j$NIh#t?uy)IPO35UvG>1nl#YU`RmGVL(03%~=O%-}szT zikHzdA~qD->#nJp*`^?2wD*yZ;?^!f-?0MT_)B1CMh7$}oL8mnT5>;PvZAG9Q7Iqc&O%| zf9)xA(V=Sg*+*_u7X=N;$FeQdzw|@bzM9|mr%Mm7D=-B9=YjGISqDq5-F;KyV_!a} zlPE2kkdo_-(g4ZS#@49qA`48#`3Y>E_RD!nWEY?8zUN zpe0{Cuza`#G5Xwj}8xv(P1Z`_J3nQSl|NS7a zo!sMJnpfBvQm}cGLP{~tUSN)ZnbZ&m92yQZ)zh@@5g}U6gzw%KKeGF+Doh5c<5x;` zPl~{`2Hv586a*<;FORE@=*CaG{gvvAVdhl)yky0?J)cC%`ME2{Cz$>K<8d3a3OVzH zO(zt*MW>t&nq7B8&!4QW7cfpPc^ez~QvqYX>@$i!Kp|~T)fpaeK0dO{q0mD7q=v}! zn5A$3XrPEG(!+yQ+S0!W*S*Un`brOzGl4k7$gn3Xsp@y-NLfbwYJd!s7RLs*>U8${ zXT~lAFvxZ>qM~_Yl!8i81ll%MW-_We|9y|qws-2F8#K2qqnZTgoot#{=bl(0B|y)T zqdMnAhXF?tQb|ioFl}mcB|O53DLJND!~lrPd%P21;DUMFyy;uqK{<5r97P#B+nros ztI)y&>(qR!yiN5K*TBO|2nqSc9Dqn~qNuWH*EgA`Vl5ad+P7F=zRy_InParr&K#5R z*%h=&fp_p2`axUzQS14MH1};?s^I_Zr56IXr_n{ai>Mb zg9c=y?QKqB7K|~$Ff7bSTx&Yfcld2t*S|3z1qTEkSAG;*YrX-V8E-=sKG9&Y|5>fB z->1hlQYmP|m;c(!Zc9wDP7s2-#?h{E2Sb9=dO&Dpb|6|i1#5ECB`Q&`#fo7+mli}6 z$!|0png43dMJoFm^_ruFfDA^qDx86SWj5yY{3@EvvB$Ee7!@f*FE>OL^iabiia;`h zczqhr(p=Paa!8kkeq(ChQcP;DfiC6 zs=Pjk8-Ok;2tJc`re|DN9%pG2za;VXkp69KDhTL>j(7-EQ-FLMiHDx*dovwL&c`*c z_=rEUzi|6j3>KVSSSVxEhOZ_5fC#q-%1RJZ)L&&@62L;b^~e!hHZUdp;q=F}8)gv| zC{w&kI!*As6^D_e^>W3WJe(33USpo?AM3+$s7Pn-vA}YXppzM#c0&6QIX<`4KYECL z?Iw(znZ{%Z!YS@EksQ((%Os0cNkLUrqvx22$S=2%P*i%p0^M|WN^oF%^>7VP+WVJa0t&k00G@e_o82^<3ps1hFd z`l{J_?&Llc9tPbo-oL^PPTI-qJ!8-Rs^`^1^X3{txWfRn*<0CTk@~)gKmbf8i+r@~ zH|Y>b;cSLpFe7a8$tb&<8ZV^H9d&%lZ3v@4-X@f!m2Y>*@Ue|mn3xgjOcwfw$gf}I zZkU;=R!DNTsYr$dcETf=_ibca$RXXE$|eL!DQ#L`E8o?iB{ULtO@YqEM-QTCSqbbq z(y8E7k`EI)X^_SyC}9>2r4Bq1db1^2&cKVx9)l=!ALq3XxB{&*z>ui=XFb_VFT?xz zh@WvhKQU1ekPy+XrB!*1TFNP2{!++Qc$j}&@GH_V@gSRKw}my~eHe~G z#h2vgchGr6xCV!Y%5D^Zw#YGGkceA?lZN*nhLZ5gKSc-&q@u%WEw)Rn!iu6n+OUlZ zvbLNEtTxcwxxw!sv`AwWL;Le*l7Ye@NIqfL9240c+>66H-r7Wq)gqKH1W|AbQ#7O% zC!7v(U%Y{NtZ?@R(qlf*rI>8c9uoQvzlbc>M-qz8GIQ6>$(7ZnUDvwbaqgD${*{Sd zW|{QGYIZw#7|-C(jR%M!R21CYVr$tP`iN1NOG83AJ(P(b956t2e|HHK$LJi&Y4z*s z)`s3`T+(}`zTege^Cl#9UdrP%`y|FmS&o<81FU|&nk|JQS)UMj4$^gi&>M_PcGrH840Bl@xh!5cJUotP6Mm>5BkI z|E#O!85Xi=LT3}ilmlaXq9gE@(>k&1YOlB7;0=F0Vxv+C&fpm%4U)N)t{)04Ka1;n z*siE^c<6kaqpuAiLHO(;nLY6I#hpPI9Yi9bZe+T|c*Lz>r{aPzM4^6DgTvZ&@e`UA zXPZV@gZs{R{j?s@;-CXZV*^&_4xaZ=T_T&@u983wHtMVUR1P>$s-4WG7Uhnd3PP8j z`V29cwml1dYE6+4@PwKum1N@i|b#1EtX&^in0l z#A@FV>2`;_S-0J0k2ZafLixEb(<%(c!36 zAI-_8w^oM$bX;+fAv}hWt3nJMKs*6#EVt!|f;C3E{g;OW;E)HE3Yb$^VDJNP7jXh3 zkcd368`$f)+<`!sJ~b==QxR9O)fPlv(A_74l&+~bc*RCAl}2#!j`!2ocXbg_Q9z=I z#P>bXLiO;d$G(Q-Yx5*UiL6Eq+)ckb08881!n2hV=A9I;kMQN3vMuu%vm2I&%SS zbhlm;!LDWk=&>W^C~>)3rNsTW zmvsZFdHPl6o)3Cd&=DBkl zrR|akje39XV!yk2m2=|qh&>_s_L03+?==)Fz_LP?NH zK5brxvsqM(ir<=)v6)WI^pL070&NP2GK7~4L049%%Y>kn^&_Yvfp3oxEhHx=TLshv zP2hZ`y-nUkNhoxQBj992zdlxX{lYi?jvHCTo@e(B!hUGJV*i6PDjyfmBz(wv(kKn7 zu{3$F2A{BCMH(a-H!)L1K|A)*LF}~D>yICnnwY#~rK$U9d6Bq|Jg=a7?-6alr}kG& zn%ftb?xAsA+Aq6$l?R+QR4O&&wJm~>f{x!al7t7kwS(?^P#oyxQjEr5Wj_! z^&0w^kU#7kL<$;schXvA&-tu<`Xh^WgQWKJX!p1uKBRlEMxM7=t>B2fxeE=P3=CG@ z%cMf0LSt!aV4IIyYRau z=J#2&IwZJ%5o3+La|0Q_jrNg(;t4Zb2V}n~sD3}{Y#U3baSa&FD}0dMSoa(*+0l9( zF6pxm;Cxd7M9~=c$RdfvQ@M@;aqw*AZzvT(Y7_uS0c|oBtvAwYD(-gXti`rnGF^_s zDS;9yNa?eIxbOJwZ(2c+431OL6XTsh?A&ohW4o5}a`GtTBiG|_wU@#Dh~%>kr0V`++N9QC-#b*oSZczW`87~aQ=Z@)+@Y? z3^E8{SW*aURE#~TV+v54MmgAVa50RbK8P1@2opK_@@z&YiVGea0n5cksT=%C>I5Z&bg=ACO21%oC8107V=j4lel)EmQNRr9U;D z3YPNTtL>uBXXxDmc8A{l1Lu04xLB;doT|NABlIU6ypLW+6W>hz3X=S&zy|k7=mVSM z{Lsf*bo)&e@#nf}!y6JJ&~$ec@9I~}anRCkcb@4QkFKs3QWG~e^*kT(IoDxDnuAl= zY9_$(NK2Z}kdzS9;8KttU%nv=7<&z3_vRru5(thNL5BRwo}9gGkt7M_sXYF)(RW6r*|@=~DeBe}7%0_=6%yiSLG@wZ-HM;jfU`9TbB)&zaOyrln!?`7s?W}{ z4*4vH*D)`<5a^Rb`uPE~lps`6jDB%jfn(Za?T5~x39rs7{~ven9o5wK?T=p1v3CWe z35bY*GywsTrYI;~KzhlMDqVUD{(0j$7(%l5US-a?X8Ei+*WMI%F5FaO^UfQC!!JzaP6)=(cdu(j!R{zmptyfv z*+rjR{epXmvV7;FWXP_@sn4${@$iSB0a*Q(Cu5_P!DrF=o?4@C4yWBE4r6(HK4vO{ zg4S7fQV4kx)3jMJRnXbq9=4`>QgV%F8}Yez_QBHi8@ioksKM*tSu@kN>VDGK07$5+ zMd_LuoRpH%mQ0=Ir>$v%^YKa?W*Hmno`{P+nNzyL`jIlrgo;o#1H0+taBgGx@3Yjr zeEH9E4)Fazx!I8IbwePYGq3&a*d`Jtu|l}8s%garZk6yCppx5mPOG(95H(h-TM zitJs!q=}Mi@=qc)4dA2}$kam0kl%f%nKoFZu9`=+osg$<;q%STZ*bO&<=>`r4b|r6 z#Qjcigo}GQ1B6as(I(D5wfFbw!Z^F`{tLm_^XL^TBe>=P0u$@qa3D+32iSza^~l(L z;N(^C?$nO0XuPe#3DfR8(p)tg6CQchCmh9nfN0Y;vW>vW>mvT_%YdlZ(*bP%z0Cj> z$*c043paM{Jbhan^(=cg9cL?WscIIXm|;)VM#86HN8G~o#fRLXDo)DjBO0Ha>{Jw@ zTMkRkx>)}wnj}27{e@%7H(oPV)5TYv|!cIz$ zHxJx?D{+HVM;}x5!MLKD6JhTwg|EaP8GSB|U0w*FDb?|qj7;;F!%^aa+7K;i>69vm zYfML+)K1+845oDY5FL?!V2Ys&jt_zzI#(Hvgighbdv)=YMGs!)=8&PP*e4Ek5`){H zgs7dHQ>u>QD`7HUkM5+HU$^UUlu+t}#_kzcuZDh~LvP^CQh0=DoB*P3_+a!kCy&|x ziVIG7@!Ev|-leGen71b1>rZirzi!Rv9mQhm8yk->+QdHXzM@d&Z;bprqb0{QQF^p= zTl{tI)G+`4hngo2Q|C-CXnbsfc&FviZmH9)d9S`LV_#i^gJ{f;9rD;@LL&>7=0j=1 zu0{qdSJp#3Fm2Ee*cb0!qK%D>_hv~C9LhNTFclD*lkB^<--YzZD}DhXNso{0-VR|j zOn9PC3bQab@s}_cMK6O%0wqbAvY&Og%Rf^-D8WSaI6Pu^9sKw)whSM#vEO%?U3t3I&IEZ)@;SE^XJ?^(%vS!A|^GAaj>R&8}= zo(lP<-G9A#M%G$T-wro%=usUFeMAD=yyx53X>w~N*|3jlVKrr4R_6rGhGnhsyRl|w zRhVOmYXy=uA&Kg2l+?w*_OtPsMGBDGSh^s{VHLtAjYxf!@chc!Jleo<267AF46I=Z zII)mc7fwAr#3mzyVjtOf5V-3QD|YHQPZ~rm1kB(YxAov_JYSZ{2kgR*Zc>+MR{UD5nw;rq;^!y5Qw#*P-n;x!*C*qrp|X1M$O`N@;n z`{MSU@ZVkgD&QIWx=uJ#@z`Bv2X2AdWnWi>`-Mct>Py=m4K4YVq2}X7_GQGlv@Dgi z6gTG>K03IW_?kPZs3zO}F=(45FCiA>Ee+wez@yk4MJOOnWb z+Lc?dk#-38`4NgdiVojLFF=sEgyT+&)Km%+#0MOf+s(e6_#8g*$m4di--pixc^80-@p-0E%XX$H&xUp^Q^w)&jQOC^~7dzreB zJZ~ytT3vrK?iUJ2oHnLNa`p zXgg@UPJ`>IOZ5mD!j%2>e$J6H*1}7~62HyrcH2(2^&xm6qb|lIJ2$uEwW_gke}Qdh zNYZ(?rOASlk_$8Ho&Z<}palj?b*t2GQ^=MtL-d{+Oy^Oof}c&<;|rcGuY5e*l{B$I zOG-hu2%pTktf;su^)qqvj*o)*^v6!y zkG<~mwZhM4o!K2oSq3>*amN}Fyict!lIKI_zg_zC^y5dp%}!c~^)=qjVQsIy%STlo zH_UCUaS?(tkR#8W8gdLHOgsy@Dyk?8u;&<_SB72wY+I&Q2HVI`O-K^$A$6sJY~1ql zOz-kR0eHM1&jaVR5RDvpIV}}rm^*I-IZq#2oG1kOT8b>6@2PRI#6>ejGcCJ;m-6l5e5i?(4*pwiN$hbX0d$o;oh+D2!^{aJ%4{&&D{rm%3T9M#i{6 zA3t^-qUTj^9j}}NXrGP+1?g~_0L^fJnvs1Mq}pcKEto|N?TX(vUv4m*>^Jkg9(soR zT6;@n8TqOix@5Jc+MKI$6k|*yX4C7542)x_S)B%V=d-sLlV3= z^y{+|?WubfO3OrR9R^|_KlZJAB7f%&Rtx8JIAR4Vh-JC2MKK^k84!nQQ<=mq#XkHA zYlxO;bCgI}?tbB?kvvN%;1V_79GZkf?B2^`&v2i=fwftPzFln9-qF$1b-|!T|9nfc zq7d0vV;(bkGCdI%)cV?v)wLb*(z?sz6C#ov9+CpiAY%is-PV&oR6rtM=jYFrRT(ec zSFl(&S0g;r;p5KBMllf<#XE3* z+ZLwd$GRnmYddJ^+05@>1lFHG9O@ybU=cwv{3SOp-!L1^2JMjgNV)BPW<#f;Ae$s_Uu`m5k~UkX*vr~W8FgG* zpeX^9>nv+!UW{4N;)}N$zu`{0ySU#pd2a3E#F}cRVWC5azfPvCy@}tEd)r}IZYOGX zkm@Youu0txkM_c)+S1v-)Wwl7A(a!x`)0~3--m{pW4m3mIZf;EPZrvfuB6qgDxT5F zbao39)DUc$5y>chX-Ln5cp9&Vf9*LU=OZ|=9EQUk*-P|3%d3CQe<>taIbNLmMMHy2 z>CEvWe#4__iffGQ*C{qbx2^d$8$J1oNFQ6kkYkxDhE=)zHz7{jsMKhL$?w{!HCdTgkUBBos4AC~$pJk^d3i zv~5kK|B$ZOkS5ZweVpQ?fV9&Q+$KL;6M1fchHjN*IgU0dbJd?`t&Do&&*x#x(Wi8k zc!oIhDjyj%eqmxihFSbf<$F*DLJhdK@Tf@wT`{kY!PBRaXZU52sW%J+67)}>525Jp zTHSqhXpPd`Ha_}H1Q)mEYjpaev+=Q0$NUKMx|1y@CZf)<;9#dJpT`8(*KM7kC(~K2 zI&#H~MY2o~jj3F{iBJ|<}FXrH68;bM=dnx7R z(V8yvU~JuSi>ULScGr_g3kWZ_!|NHvy~J`HM+V9|?^CO&MWGcg0e)=#gPIf?!rCgP zH%t)Ahtg`%CmDCWZpYBjF1RaddBe+}{l2l1K7V69RUV%Hq4OkSK!$m=0a8jT3HZo! zL}%;gLK704C$h7$!o|R)yur5uY(jaeIo#1B)v(ntavj!mpKx%UEKZvWQE?Gitrr{T z?Txo?-l5#d_C!ru*L^|&M&>f(;6-|{_|)vq9nJ=%|FKnC{@r}~$6WZ%lI3~|N=K*J z$hyzKCfSe3ac_H1b<~LVXm*37mX23oWjQ$ zmw77k4br8B3knLza7U8~Q;vZ&*OrLG2n>%!6_4*Me~l97rF9leroBBM4%&>P(@ z78FC+j@fmny|c3>>u5pQF7)VZ31a3c`P<6{M#e+U=Ouj#Rp^O(_w=(5PPe8tn0ieP z_=3CVKiyQk7-b(UP|<{Y-P9fDl4&u}zPY}lo^S!I&5nD6R4KIS5C( z-2!#>jRG5zJBT|JpYSNh_mB1lvJ#CQ91^3`Gv*xW)=~IHK{ui?=UnXsLaZ&$Yp6T1 z0qu1RPfuGP9v;6o_(?0x{(}2g_T_KSwvC)46*V+9DXXcC#>t0aETb@QR?U~56kSpB zljPH}KhT{FBR=A@3tcg`+Yk@RGAdGP(V$f%Njf6}DL)+;=IB1pM(hbe9yzHFE329$ z7N92G`O=X`TH1HG@<}zSrm?Z{-8*)6_DeWbc!w`{PK>CnPIecWNZ-o5-pfap^A;(O zfgRPZERzVA|_sL z*B>oQU&x=Eug|_$64%He%zgu_FOoo9>QQF9ay9#uOI>p_5BKWTo9+r%Jf^>WF|ZDB zYTH+ETAZs$JANi@b<~{R)I#j0=eU4xlK3R4Ok<_lcr8|y!GYd1t?Ok>^M-%0_p1dL zmxbk-bqR4U-JYaDwOIZ-wBE__vzf}rN(0EZk;UAE_Lqc$`X=Rl~RR;^4mvj~eplQuz}>=67&_2-q-%9b4SA{BD2n|60A(#sLk5q#MszaD~a#SnQ*)^Uzp3& z$kkQPdA49d`b#)gc0}uj(WLlAWI@CeWEQ3wgF4x?BfX1|jTJL(e;LydCaAPz?jTqt zAKb5MdG40^X%Skqv{+3%;@zcWIqkdmI;7wRXl#C&3))I(jSy|XELj_n`d-pRM#1aC$F%99mpL% zStH#|&)nmwzARs55z-_yj;^SvxK4*ck$qNX_gG2zZFpY1__rSGkt6JdFLQGRI%y{u z@7}w&gd`(M4RhbrVpFAxl7p1%UA~VCU>e#|0sfgJ<|jsPZr|+5x2~?PPESw2%MvDd z7rEIs9^~yh{mrlD;GFWxO>nxS&%-Mu+9Ms0r%Fosa~c+&%4%zOnJHC9c8rv_KzzHD z?9VeJ>A|?doynN-^c&84P@NpoxFeGfF_wwb`GR)W3{%?<3wP!tE-rBnRTa5>`rb~P z!2$D+7pv~CsIL3{@kimYW5;F(lai%`>_6(7V*DGJ55TeUWg=&}&t6&Cx%0k5*DLFo zfJdW6F0yO4UH4V=J~<|4I;2fKfDuUo9nw zs~V2=J9HlvKrK1U9dOuYtJS!qqo?0oPfz1ZBWA;^*p2!qTho!}!@I`aySpXH-rugP zsx~c6iG$;OWS=i`vw%zo#*^RuJv!LR$68_`+gg3ypx8O>B27>cs@!{NGLk$>7;Ru; zGchp{IQ@c2+@Wu#w`hs{D`iIE4Kj9iWu{eo4_up^DfgTomL;uzIE$aE4dbX*4|N); z-mzmxf0Z5(s+(`d!VGa&0qsSF&vQUn#sZZ%)-hMXjB$#7H2?E=vym~hYaeI#SKw^9V zQc>I_6miVvETO%$#)^q-f>$2IXX9`(5Q^VN0MY`GLO5B(cW@iA8p>G+1%#`{<=zJ< zis@uhmtU9_hYXn@Q4#B&wO$v&#mvk+*HbVh#OgyP`6??bJ82Ab=UFYG$m57>5iK)m z>wk{A_=(QkSP>EudQV^I(CBX%g#n}ZADU8K@124LqJ97gEq*;A6?=6bq7{pXlkTHu)JO~_8|Ct`i`Knnl zlHc6`qk&5|>0*%*dx7ObW+p9*f`dPRM!;Wj1g5t|JFlS&pNPb{+YOHXRbk{5o^T3L zEK#f<)9pVtI$CgqcvK(%rv5Fyp`ne9Xv0qcHG)ov5Oiqf#w3*IDTwqywASTZCtL&p zzAOO~I#4~tk;XJSwLyH;tn#Fbks}&#G)^=HI8h+>6p`6e*O$H|KXfoue0plYGP-Jdk-DDieu94m2d#$4!}UdDe*G4 zbAP?}7!)wNHD@6)nsF%|VH)UAnSSS=IN+GbvGvSHPMe3tpf_M9`7AK%Ln*3 zoN~h~XZTi>#xV5xk-95U&4SG5OnkS`j!s}ar(dVpR-Iv+yXf0R4l1W{PZ`Ua>q~Pq zOG4a0bD=6q^*udP*P{+UEmk8%!J24R zCI4(E2ciKjh^~lFOS4c?Qqs@}dpdf6sJUFc+|R+Wa&_*)f9<{QkL2k|_C3^}RCalt zwFy+?iZep!O~P5f^!#saBr{==yi}V=jFVYTC1Lf=Dd}!<&}RQanTAJy(uP;cY!erv zm248ou-sHnH!$y{7%oYRr(YCh6+jF276-cb`>(Pai+-4jPvdySb7!hbFs~`}hsK6zqg5#N6Cwi{jF}hBMdyK8#oX z6dS9cvJ-MTJC76GR%VTb-bj0XdzSxgx;rnz;uAOG(Lt7@4GHn_i{?~1*&FA~s)O6s zizIM%cYI2@nv#+NS5JAI6%i?Qod`F=0dnf0z;9UOVDCmq8|hZj%{6-R8MM&5G~O9o+J`#p}4h z9ydDr`c3?+=g9|J$>OKc4Z3rzNl$1ZUkm4v=SFe0x)Jcgk?H=V<2t)NcJJLURO^Lf za$`v%ax1%Sc(2TC+v&1+cwtofOY_~kV}8YA0tkT20CiDOZuzerurC8$OioQzJ#gmX z;W=P`*0zK10aaJUKRf3%TnUNJlXWD=8N$*x)NE{IB<;|_ZQHi(lxWdS$sJkWTp4Vi z&wl>={a?YXrZ}l1T3T(;g^nPC*XSOg&42F(DVP{<4~9q-Trj$0$4;M4J$J&Pf4j3H zVX5=wvMk%-kp(}tz>i6rgG?BABsev@jXYs}t@TLzkk-^AVq+g786m3ZkCfO;e9a*H z;lwDfI2S$9ro*lm%gZZ?Nrb(miP838@Y-F*n?=RMOy1m1t}bwMbNi$C6tM(FCgoeV zRjzKlf3R;Yk8C*79t<_~N8j9Dn$%t@C@d@lYX#5AQ%JCH-#$8mwx*_OD8a(PAsDu( ztfvx(OiGHryj2(Ndwe;zQ8^rwaO9I|op^**QOPFekx1V@)7$Q?w<99#Z%U?3DTZNm zFEH}rl~>}V+({K7uoIE)(b9tOEVOFaz+&8mg=VG88Vvu0$frY(Xfutff!kNewHqmi zu1@(Wo?d|cm&dfy@zg$JM65n{Dn)oH5(*%Mz^1-=^QL_UMY(wRvYg!Aoec}i(Yajm zxU8%!T0+{oDy!ol&UdUahCm=d92ZSA0{{kCZKR>0p_|c`ncz(A5bl2c`t`zi3#C8U zt`mK+JRyr%3p-~n_hRD#1VcP=2cV?x`;I(fV#yHw2nwnTS(H}2nHaV!EnsC1 z75wz)F5%IZXPcK-FC__zIrc=y#H77Zd3~bd1P4c3FYgxs*z={3jp(+r@;|S1dfRzo z%>;=(q)mket8Fy4lpv)eM7A!&ng#;z<)uA0WOL@))lS<=i}|CkOI`7vkPuU28XRCI zuia`_O4?i(p%qtv_wLr#Hy+#<#31Y`McK|OIdx$vev!sDY}~O#_BQZi%@>{btwX-|U$k@%af+9U|o#4`e7;W}YAoo%P>r)ha&Yr>6 za8BjGprA(wnA4xWE>BIp5^qm`V85>=wPTC)ETvycGWPV=p z!G%*Y0+|bB-wlQp_lu|F`|FQ!FLhdkqhmd7a#~w8iNw50?hr2nA(wo>g~Vk}*`aJKT2V$A0HC8LKtmt+=jnNEA)&Xc>v3CTC}wTV z+t${WC~}I6OWfQ9TC2WLSywj!>Y6F(%6d7Ai?cJ{)^VWBYk69qmzS3xV_{JdICD4_lhhdR)?gO>4J6&iM?qPk6Z_&&_3A1 zqSaPUPVTiSK0XnL`uxgq=K%&?SUOnC@@;?@u1p(>Dw4G7%s;-pIvsQA&(U6WW6{jI z!PZA?fq@~)nvcR~hDry#%PU-M5|0s`4e%Yu@XGV^>+azXr|dzojD;m>dM(ejeDp*= zRH#F@-;gxs&U*FgHguGD1xMPnsaSk8_eZ8Qz*9-fZ18eMAg|{m)+lnvTH0dC@(hZn zTwriOa`Bc+SvHt*$qN_GC^Y9;HeK*u{5sK=ktPyiP>KY=jw`88fSlu2GJI&JmlFQr zdO= zjJO9uz%6-`!A*c|&I`z|slhDX40sZFRv5slgRT5{nwJTUMYf;IR)cKj5|h*u|0?hD zT0)kljZ_{>U1 z5T2LsoZJEe9fyv~CSn>I8hmEbAhAhq_b0!ePTfL@3yH+E^Sx65R-cv~QckR|ufP20 z;0(N;d3AmSV(y*AWK2K*3Xj3Ft>FVOd2R-VABjej2@QgK_Uy5?wgzXSH7U+=@(I$o z#8vU#g-LO}7unfyuy_^z1i#hsTIIQcfn*Irnh*X0k%7RO?x)rAf-FCh1@3HrsmCG6 zw_x%EaQ4}ohL+Gh$$;yW5hkAKbyUR^HhCQiw>P{FV`R#xYfmCDqbXY*v zon6P0=Ap-I>k4>QEzE8d>UG~AA{3Wj0Z=!veB}mysw%j=l0`mkx_2dS&2sWYf#hi% z`Rdrw5!^SsmKc%afTZbTyBk>6&pkoX;ptb2J5?EE^H3F^j*VEYdhR+iHgtxMFEaPy z^haFp8>|j|s~4EW?vWiIe;oVKbR%$EIyoNOKGT26KjXsf6E2Ijb9kEG5CBYFBbBh- z_vb~zD1=Tdmq7oIARBj5ud=ISGw1R^#Q1Hm#Nn&DS27WbUbC4M=`EVC&nW4{s!C#|32CLsASNNmKgGzo zSZ=OHtVM@On&Erj2&{Zwy)Wo7o$|)=`X*CrO(>>3bAs$wkQA-Bcx3~5FMqICh~GY` zy2xG@6|>=G>QNIQ@#Ql!Ed${rl4!Dxk{BT+Ovs#dvujhc8?5F?nlz~yLtL|}kftN9 zjfBWfPfydvx`0Jl;_vV4!}m@PlpBuF3{;>HPEF6&L{mf95n^Iu9@RTQOwR96=z#KxXMvC`9{A3A6=9zOi+sURCjVPUdJ1qDs~EF=~aKhu637NUTU z-HSw`JAA?uz;AffSe24oBCxXm+u%{aN%~qePDx2=jwnw@cM;F^V5f?lOtO2bjNA4Mw__Dx||Is7VZ;7 zKMmJBG*Nbn8cvk94&j3I^)nLr6Mo` zJCA-$_jPRWcyRCDpWxit2awt`$Q$p>?kVVVQnvrhA|&e1IDPASCbKziX2L%Ns1}RF zrgB_RbS{q=unvB5dGhSV41(iH7UL^t1ve>$f05%o9*$o*6+$)~dOmwSKV6=mkZwhs z={p@sk<%WsJJAlY>!7(zB64X?++b}=hHUpd8oj=fy-6zxaLWDA>NVZ}al7x4S3w|Z z6mcy;;uwS8YuLuQqyFjc+i(k^nm-la2-<<5o zF@%Q!&-8*-ROQPG76oGHf{GUp9y~z)v0f7)XzUExLV)sD@mW&4?a{&WW(?uS@L7X& z8tXwU?Y4bBtAP{C4!pi{a_*-%)6Fd`8!lz+8MRHEIXW|UMaEEHtFE(`Ov1<2<)KSF zx9@mZnR!%1SeUuTY%BB0H4Ni)pr)_SXfyY5kK^3}iH|uwhg|E}$O<_e2boBJuH?scz`|qj%dP4&PvHTkF5P8z_Rcp}#EAAA1 z{Vh4-y&T79QLFc>F$bh4!4l}?e$$C>Pm=~BwN)TKh7&AA+XVoH(?CDo$^-iZ=N9z! zVsmq6yRc>h0|S$>DHbM_`n|7TZ&m3V_kid}MMSiP6Qa;)aW4X1!T6*A##UMb=)l;P6lgE#*-wLkY zGYxr)t!-^hO-;-`J4R{hb#LCh*-)!%ZJoJ6iu%rM>2ylGSRyWJO!~IEdTPnO!`tqo z!$m+Vt*zGqif?}EFc?W#QdO=+SFJLJT*(a#Z2b1EwvOgyaS;b4!7Nst5(`2B0sfGO zvvcc?T3R7dQHT@|?%fL(-$srIkdw_e;u#(uuT#$8%L7tE0`uP28wROM@;FuvK!A44 zbBi&^xQ3T(x3ILd?>>tAi`4pwqhgBCe9?L&MCN#Z2|l|)^3V2+d2opW9zQmD-PLc} z=Ne)10q;?Mg_^?H`jPBi0S)<*4#8GqyCjxwQf^OjB#~%sK zqN1XW3zYOy%7h@cka1Pg^}B<#A1ANttux;A_x9P9FF@3MV^ZX?%i6102%&cQ2OZrO z##D(Pni?CyyC1~mYzCf{FSPIND8VZac?0$hjr%W*P}c-4vGpUpR{i>~IH=t{l{p}}zGA_50Kd}zfmYymTQ^A|J_isd>Z1_+;W3`DNBGbL?19pJCp$HB zlhFS5<;;#l2`h`Uy?^3u^YUEqwjK&s8mv{0vK0#{&M)lia3S^_E7WposYg}xsAE-& zR(94@R%VjjCeaRSGWaBV<8O^Q6AghHF1LvAu2JmFHfId*N zs{^ggz6D7N3*KiDermbs46+gPIDO(wW)i_dxO3HJ$C!o1#1hXtnZiFsMMc=$FgH(CSU3v1u7?gC z8mvH}R8@og>O1fJxr=tLyRp#@!f8;RAk^TR`x_db8J?Rq_d<&f#p<{R6fmPc)7VhzL~#ERNhip=c16RiBkHc{k*!l zU?6?h3-4Cvo5Lo&b5OXZiAin}K^uXX`|{=42*L^qhnz-W$N1zH--C_6fS@-wf8>Q3^n&$a)IU%8nYCS!@@)Tkl$q?T#=+$=L#x{JT6{_7uE^^&V7T@3EUhKl!6CeCrw@yYI)HcY-VsK{ z9S0&Sl$@Nf$Qj3q&GgL#NJ}v8@vM*JnPhH^m(c3@i?l&JAgyj;k@o1()yt@an3!%@ z=&6~TMX=mMkvv9x{QRo(as)%glG0MBzlAhh!@18qg*cfzSnM7~#+ZqT^^_ECW-&Xa z3wYZqOBTt+r)T}fV%w+0?7Hx{9>?cZA@JQta)kqIm(ONzp7f}m9!$cbPztaC*f3^4 zs2Y<(8k1!vEQMFiGK<^I6Bd&sJ`4q+d_Vu;c!)ab$0vzIVsdh_ax@<{KR;g7Haa_d zYOEF&duI>U+ z+JQu!U9{q-~R9KUa?yuiMz?0eGqrVtb!P?FPWiE>o+eiuo7#(D|^30d;p@TN3s z(z;a63$mD5(h0QKpZ{c0Xz!!{xRw4*58!W;~!r_B?HwU0F}PC zNNMW3Uii^B3{Q?qS$qKHHfsBnj;K!O_a33B`1>p%4}Kq20zw6s_d`FF+(Kw_E9brz z(m5zR@`o|~yCsdE&rw=Zx8i#zlMLCVl+GWM0y(?5DD$E`CJ#+e#uf^B4xkqwn_@Z7Ha$AjmVyUssYyq?)k6g-6SyCChW)?2 z5O@;g@8=UY4p_%G$|V1ID)3~e;3gwip8D<@8hikh5@>9P3Dwa2GmeY6-9w&tk@Jj~ zaoj1p>vzXEOAYy`QtAuNYFgY^f#-0Y$m&qRdhWYNgkdzRCR#uxQ`$=m>@@G^@6U-+ zrc;=%v7N(Qp*C`4&!Fux1BL#ZjPhsYEbptFPyAMH39&HrOyLh@DwO8#B8B8m|1<29 z4D6sf;OVJ{6`j*U6y~gn`2Tf35P2k+3yJ9lZ{33S-Pau;x^tpb;+(9d=P;K$pLhZR z#S?))pSQ&aw1AU9Vbb9ne-MX79wIgH0rRW`c?r06t7WS24Sv6qGSgq!^4B7;`TYvh z_a{L%XrnIv;0%X3KHxTxCx}We26^gAKw`oKWng@la13+6CJHB5skBrO1gZV!Dl9h2 zXn)YsS*wBGC(!vj+c%mmVS4f?IIBY8*Smx%9lrC|GQoEDKF|dosrBfKP z0M|nW72u7+KoQEvv8`Dj5#}(j|G}cO{(mjL-yL%pxQQWxpwSXd@2l{fdAAZvp%=qH z%o_7)0@*XAy#pLd2Wk)6exDt5clt+nASw!ifuTI3TJpxHPf%D=>OHf@k(38P5@Zh4sK=K;jh3-7 z%hto}TMygI;T|4JDA_6_`P^TcS8-gz*temRy!6R`^ir$klldKxkdN3OmyQD@WXZU| zId4NkE8M^HReNd|Q4hfD%o@>hL3=O5(zWQb@t) zZvWI>kcx-5l}1Gsec*VW+C<5b&pjjs>AAiQU~U}tg+$6`K(+~cvg8?F-rrgs`nA;z z9t0%b(8+MRz1t|*+vq>wc5x&cN<4gb*P2YwW9r-9SjZXqjd#l4O!cR5g*NI7$RIm{ zDG$m7hO{(CXf$b`j!wT;8j0S!Q3B3U`MrQ@emFZ0aQCWfbQDhS22L{(g;j{c6QY`b z-*7e!3tFltu>~`luN5>52OYh!M85Sh9~;tn5PR0Ub6W$C>;Xop?wfZqs`)pe=H&f< zTXUk2#hLf~*gtnys8YJV1Z4@W)tBNv zRLWVQwPW;)Aqk(AKIx^CGWl7K>5z>_5>(Z-L?u9m?$>>k}9`tp4K)cLJmC^5BpnH;hx$9hGem*!VSyta=qCpX7*?)C_!n>M<>p4 z$Xf70BFIZ`$P^8{5he&q>N&_L3|2Ypex)>%`ka!QB29y~lcK32k00~gxg!(O<~)ndlB}Zx#O(dm)%bdF()N%w;aD-B2^sD8R4SI|gRf^gN6-Yk zf4|(-WY`ATF0CJYRv1`mQ}^!GToMtQBY)~j6Ch!Qx*=cLw)1`v!*V%13d!w`vM77K zu0(w0^RB0Mh{4B@(o9hp%M7EF*0|0b3((O!`4G%v4o7JzB^5*h>_G&KQfh<3Q}N}d zbuEng{#-}6T!6I$nA}_prsDR{J1_G~?~?ub#U1z1XV*7iZh7fC&DTM}Na^z%5MIF+ zAEdF{+p*{td!jx-_4zjtwy!l++;Z#tn4*8(SwT=I$1uTpdHb^V<1VfSV zpTcF*50MiENUt}K_V`oe9Ea?>u8c)KS=fm+Z-~Bv#Y5&APojCdzp81w)n%NhP3KaM z_^!vOwe=eA!oDMkr*-ODc4#?z>e)aJvx>^t@{F~=_50@@EKmQsnJwe{wAAqN;x|g! z3e9A;BXRRa2Go31y@!&4L*5~Fg#LBnMlf-%*oU1DgRf2t^^~mPlQb`{ z-7jifF&L!ik)^iHzyk9FD!9Uj(}!u@NE`A*0!IazJ$lYx^9d)b$y8PNRHq|%;wj|1 z05)qe#0<9K#T{-uM&%A3e%aOP7L}pLDNC;+?T}qgsq-*+?Hm<{HjOxxK}pKN>d z;Gz7rL*$XKPS$e1OZ=$jT4%&mh8~m*WlnEAI6YX7O2mZrd>l8zsb2Oq2oWt4b3JDk z@~NYpiyX<+%2j58>s%|WaV2Ia&04+W%=REy%(oj|k_`)6-vy;0&GEvs#0N@IywRY# z?{*0b;ZAU7>ZR3dqr&TG#sh+&^h}*EY?jvAtemif@;xPR2a+Oem_AI4?lg0Ck6) zg;3jLE^U>3Z$xv6tFDg!F!T5*{S(gCgp(_&>AE@t$IutEhQll6Rto%j2BV-N#v{fE z9~=6Hi^mJ&nwGkFs*cARWE^Uu{1<9Z5s&ugOYr$3s;l4f6CS{qk}0O3I+UY}dH#pd zdGjL(UQ-Wt)y)lj#ee0pKOH^YSB%(XRM<~8d6^(>`#?|l8QGKF;(4iul`{E8rZcSO z+!Un!VB+Zn7O}UV<-FyrGTd6L5h19*Jw~b)+t3-p*G0p@Q_hEceD-E2|wt3HEN0sSKr};~6TO~Q8Of7D$j3(j^Qme^E zhK9Vk9Uz3^*(}99VbTiwNj5cw5+hMVGeWuUpQo}}f_mJ1!KjXCdrj)@sLm#oxO<%? zc2<~7^B!~P4u3(~|L0l=y)C_D4*Hl{o>3|(93lW5B-@d6r)6v~%fMBtfXL%kDIP>;TNDP;Xnl6k zFJ=ER!(xG7uNlgI*w9C=$Rg84kzSR-DKyH88|}N z#~^O^xK#s3+fZew9q+NcRv~kg8KcLV8jA69(QPQoj~(NS4q+gbS9{f)_+$!#QN-48 z6RNE8Lnc{<@XvC$W2q?+m$=%pkR>XwWi|hyV+z|#1vbi+$c_7kuco@ zS_M3+a8CUe{Wm=y#G%O0Z`%kwb)g<@TI`waztDV!*D)XnJR4dy%F^r)&t(?D&{niL?|7$%?zkGmr@3{r=?&ncQl?NwE+dP z&3cxfbEg0j;nawwRMuE-sx)$HiLgm8gc0bNQ#Ky(v$7sPo{@r7ef28Jktg9{2WAch z#u^;)rg^HL3x9gQzqZgZ7w8|=?3tCDJHS|M7^`9OS9G)sj#Amtk)CF?;g&g)l)T?Uy<4vz@^~6P8b63L|#SRZgw2yabGIV!@vOvq64Smq^=oJ046ew0X-r?EY+3m6w z?*dt%QHAD>;;$D%S=-bclUl?~n5oV=q zTHQn%ZV{QZ3w`n748*pWX!H&UZy)ZX%Cf}^!jjK~#>9QWr2??%rZb=5@jT0eDb_np;|DiOVlQ?Q4VDp&v5u~xQfBsiqss%X-B;5ejN?i)JF z0wtb$vm-3Y=k*)igX4zjAnEQz|IiU2umLH71EE?lNR<={y~k?HeYE9};Q8}>9QSi8 z_{KMJ3Zs?5+Bh)!y3g3p8jl^}svfJjgEEW_$*Z_nn+gib zKqb)u_oA*ZRWvATNDfDwE&h7nj@LLGX?5_JrL@%$l$}E1I4BO- z!v+_=wHmT8FH=PMXAi;`iIY$k-@17W!YS}m?+Yl3TOmhx&{&V;8b7QRkM@{2iXyfN zyjlo_)O0H)&G|q!qx=e9e1L`kq1|6)+t$(m>3I)mopQUyRS0aP&L_aMr>`5|;*$-8^^GGso` zF(cmGu5${@Hf?|kv?@zbyAUbDK>+@gAPq%aD!PhGYiGp`pM%yZ^~=a1uu`;Zr;Y#i zTD_L3K)iq=JqJ^h5))7SmDteT=ZeOwE%72gX*0*g7e0yjl&!=>2SMfeEkY&H#lDXZ z7n_o6rU}WCt8S}ok;zTPC;{Y71p7I;o8s?^eTao{2Be47Tj(#EeaVY5mn9cIn6$CU1bf(T@ z_~}~>Dk%Ct4dDAYj#S%ypVd}-!av&E8c!|#i209+2BdJq{51acz=?nN$o;*?o^Yh- z%J_ZiL;v)mPOu)L&h)z#`-O-f=>Z8Ti4GP>K+Cw#fjF z_}fG#>gIo2T3hu0hjbKLQCR=$h<+Od2=?!KEL8A4b>`5o|^EJiSwb*OV?%2;{m#PwSib*Pm%mSUYlrD)Pap_FYTu3QcbVCev!AB- zUyT1Q_5qIPzRS?>LVEYn|H2S|WC1JD#yCaw9}0le&&6DbEXe(I`iERnX!VmqTg#G4 z%3rkrKQAK3DgOzefkYeI&Og5MA*_(^KfnIJq*!7h+jl1XkfP0bj_>36#rXV6yq`?_ z-MajX@&ER3{^Rn$oBW-qKUe+_LHmDq`5z*0$vQ}5!}a~YlY1YrmF>e%CGsEkV=dA$n}D{S<;jhDmD^!8yGS{^$RQ zBwJ&Azc}lFXFxfmGl%-HZFzETfmei*(;4mCm_mViU(Yq{S}nSB|NB>Py)$_?3s)!W z&zRj`%jg?WQ5o9#{$s_?Xc~MEf^_2zGSjV{;F@aMZWhR7%+sy(*!i3VE<^V9_5Bi* z1AvP8v9oIyuphc-a7DSs(R~O43bU)Epsa_++b|Uta#-v3v&I7Xt_|QBK*_kP=MJ%0 z(p4BcG*iIb|FrFWpfl04vu3~_4lX34kb>DTVNkvd)Gh;|2;eclT} zsd$YYWo6Sfu3Wq3`%~185G%}y8|t7;gsR}pWEl^^oxvm;P}(Z0bHBBD)8xuG>LOJZ zorOia&4)AP1*;7WXAZmo;JW*tcsLJ%k8G8i8bI&eM{`@XTjWD4`ard^8(wq)lXLyz z{yvv~Zv*6b6-)5PX(zDemA;FAS6WL{(?=|4o`^T{8lqUJt zlN2XPU(*7wf`MOPt|6%CW{L}-0@4Mjg45s z+zKenHdva`@va&T*d91&9YSUhzzYkiT-h2ZY79_Sx|mNOv^Ewwgcu$If8MN#!3ZdN zCZoFpf*6295qWqN9P@6V*oUB_^Qgxjt}-7O5(M8sVK3m={1b_5l5ijZ{myyBtB&Ql z8){MPGfd4Nm?m>J>e}LT)%-lcB}+w%tCz2R7_bG!-ts?yvZ0Z@#AJ!{b7UWxr9nI` zA~bYiq3|mRoJGW{w#Hacd8b7iPudJaZakKD-ynJD+&e{>b&`L_Oa)425WX0~6vC+A?IdETNd|X+ra(iGvK!DBm!dU`-x4iTJm_|6g z$tdX7e@i5@h8QS>oLKx4OoVw`ZnA-tYCr_EvjgQ zWq|{hs->`4K z$28N8W+xI-(iG<>s_0TNkESQ_G#NU$bSYrsd3&cu2Dgy(*ldS=>tXV3`x?rvjn3F@ zu8oOc%fJI0nzgVi7F@o726L-mQQ;K|(Y^VG^kDJ5lja~c23$xW?7=|gTvM@C>k~)? zH)si@ATem!x=`yMsH^U>*I|MwuDW{9T3$xYpDY4_G*b2O2n7Hq>0j!u-{*7HiFpKZ zZvz#kh7enfxDp3Uf}Tk&nAyZ>=2V^yySz5T$-z6lQ_eYTOV}Cs>MPWco3`loEzjb` z{akIs#KqG4qa!YMo{b4R`ME0$sB3OHMjI}6(7M>Ad{-vO?$)0Af4&%Gtb=#}xV-(U z^RhOa<&jW7h`tv=fp0YbOQY-L-2T=>o#W+SMr2sd<4N`J75$$=X%C45*PWNRe4u`= zE>?;B!$!ju53wKyaTB=a$xv zx^P_hDjyG`?wJ=gVJ4a9c<`5nuDT%4!d!_27I?U9b=JsK%2}MqdaQ+&;H|A}pXY-x zgeWE|1}e9u5mEJf2?7pUB1X|Eh1qKgXPVMLvFLt9IPi^2nfS)@VKdgeLD;Ap)cE)# zn3h%+r@Uhd;=2zE!~C)^Kmi}lT!-jOoTCLHwS%}?Hl;SAFGy~)LO~ARpNB_Gb?Zeh z&E(v6mb`!VslMr!7~}GXyVCXGk~@~Lt0herzU9d$v0KmzVozYl42yJfF%Qw$>k*^& zfr7L~c26x3R5ZZqQ1Av82IGMXh#@d~sIGe~pCS3`2cWjKy_G%W76_ zxRxu5QvZ?|HX-_iKw&V6IjD7}K63+763GaDN>t8Q-UQ8sn$CsJa2u*tR(Y5LoFTE)W;(P>-}a2CXXuPU6# zF@b9kA^~p<*1bM#_v5is($03!{nW|TsT|_gY&Em<2QyuVgn-7Q9{Zd?HF=6#^E>)(8<}mLa$lfuEG~z4j+qt}9(3V!87ls8ohDaoTU1u!V zsY78ugtr}zR|b&59=7pX5|Fgo*+K5Ye@%f~+q)&L#1hgks(0^t7Y%I+K_Zy$Tw5Gx zBxoRNlyx62@_j^f)uTYMo_eo^u0Jz78Z?iN8WRtL>FT3Bd~C|*tuBOs%2Z7=*IxCf zt^gbP0Q5tgU5AuNz`MJY}p-ofgm0=7kGW3vJR{ z?o@9Re%8?i-Ktr_pyhI_VG;PgZHxW?!Ad`T*n8!b<7VIOA~y`xU$ASA8nj|ReR@ir zn42svLc7B#7m?P(CA{msTVpQxDJy4nLQ2M4)N|7#+MUC%g-UV*LL-H@lD3V5E<%0@H2B_Z*3d+K?5 z>e+plLfwk&Ed0D0yyafp)Aqjwp(>o3yS6%6Xb>1W0m`h%2sA-kri{gY9~E>#Y*MCY z?|J7hW88H$n}YktH6kK1a@R7G;C$5d49aLTTUI+fia)|(qze0dIU_nwPe5Y6?{f3E z>R-4m;6|$st${{|fO=Q^^OhOnv&x=~l(-}6eS?Kf*w>=D_j_l!P}885PV$|e{wl1D zk7&chS~rIQEd4H<4#6)r)24wm$iZ-HZlZ@!q6l^1_5md{^$O>1J=`ob3FdGxFD90r z>d=L`Cjb)TYx|y$SybugXLuUCJPr6cYyrFEANWRU{U^DPAXGiqf|z7R>>$pV4>}ZN z+s4Z+rKCCREXi};}n~0cH27#AD7);`VfJ~c7mlpHeHagqCWCF>8Rm$#r zr>WWIzEh<9Z9DJWLm8Q<#Vn<)pu~q4SAF~vzRiM0bv`$(AJ^VY3^h!5?$AsHv*n!& zA%#1yFga;F{K1wq(KvU{B#I5vCk3YxfwHiURG*dew z?S;y|wcO@K{iV}xOTE^8$(ZLJ%IRfnlmnh-*;Cbf>sI%he%!u)fS*d6mKx2UOpcb8 zldH5@L65lSpD_&9serD(qgxFF7yfVaWBb1vu8dv!DjD1`TIC`rDhkonI+PKM8;(cZ zQ1?rmaa6@&AN0WcT?6?X@nUu=-2CVpv7>K{1V_06U*m?=9t0@xBcfSySTJ$dEiIrQP$qTEB- zx3}^DQ^3M*K?v@?zYh6(iGQsaJRSm{JupIWK()z-{|pDV6Stki;ch?(?*A`_`v=FM zf6}kz{fny(c;atfI$GmZtgCV&=Jq}%`u$)t!ztr#lm;)@n6MOw4;30FAtor?T zV&nFLzZvEBME2&k1+C}_f&*BP+wnDwW~UEU^~m%({+jZC#-zW&cOCLK?G82EAFuq9 zfy3GUX1AZP{KCfn053nK@ejiPvzWgS0sO6h0dyW)0Pfcg34x|Pzi}QggFL4jI+TAK z{W#&jz&qr!-zP(IVVSNbC|#3HD(YDIXP0;hjW~@~3^mAN%mK< z>B%_!{*Hzct|sC?FnL7Ff1~{nZ4F()(r{0!ZD1QQxrlA0tC4&hofA76(pCkniq`qG zv2+dm*LzJam+5g0!snN8{$i8g0l=}?PolfM-s%WrmlP&NtGeR0yq}b!m`NOLh`$e? z2Q`*Er%(PH-v6#-exv{22);cLkihf{9vs*Ft^6CeM| zE(wLc&8}-laO7;Op$x%x@efU3pFSA+AE=T=Kr=$P%?u4>O=ZD6i2mT`!~Yp#7|!nc zVT1dK42lQD23KknNDhWSd8d>wGWOE^USp2{fjs^+f#qE*@Xnb%1%Q?9VF5Vd*f_oAR2!n{d2_g6*ieuSK@f*N8 z5Kp{t#H6@q92Z6WnjJ^NnJgmiiR^*qD4O*y98_kCIHCJ$;sr$tVr`@Ma61(a1Tf{V zbsT}@`T>CO&-}7SBjXmRb@_lfkcY|`EDOwpV-7!@P4n{Up#}uk?z#?l*~8afL2IAC z#=S7!0Y;6x3sg#g2nF~Q#|4T3VsId`N6)x7aI1cuz@+$d(<){-K!4#+;^Cgbr^y+= zP>CA{;NP7GM=9J-q#$V4Om_bDFN_><`5}t_Us?!Y5*(ob)L##6)qhj=)CrtmPT)8M z$LxTJ%Cu%6V|XHaZS8N;ieQ;&cX4+10i^(Cjwtnua)*@qiRS17G&{>*hw#Y4odplc zC9Ddz5*(QRlv ze~k)+fuK3+mD|RZO2M1=61DGai&xlr2~ZwCkz$w}{yZ4&VkPb(_rzRU zhTM8+7|T0BCvv7mSnYJ_|#vw3?idGH1=9)v1obEl2G# zXCLV_oQ%)_eE)(Z&RyLq*iRls;s_lXT1Q#+zAyZ!-QYy-?c0POXTCRdAy;e73RM={ z_9!^BSy^l>^O7D;q#o$zsQW@MaVK5@tC2o|1zrk$0KQdE)!xwMT%Qcs!bU@C<7mC2w63sh{l=+}W+) zUQ5s@bj`;5UR`PxI7}Q-=D3izS0k6VDSslPpwrzm{>KtE6^RQI6Z&n9=VsTiglSPi zWzaH)5Q8CveN(|?Q15HN?PXLZvf>4UyP_AjC#QAeS_Kf9{RSg(4!|1&ctcEVe5yke zqd!S^sGkyulc$IQUBF2R_VxRaM9@3i`Aw<%%7#WtlCubKA}^4u)A)#&xA>~-quIJZ zB8mC9LV~OCRKb~2Mz|DiH6&^8MHY?tGu)_%6XjF(6@u;&0{|XE1lp<6R zuJmaw7gA7^`UR}&6{b^3dglQM%1?bau*UGcwIYM zT7WqL)GCez4~gANt!~M*oTJv^c6FrCscWS!f$hF<>ZB?&H)(6BWdIlSw0>!^xsxC9 zEphe@f&`9XbwPKHrG)Pd^%?SdbeB703*}1&6EZ)8v}nm!iEkr(y+7|(8qhF%=yZq2 zZhZ!w!XH@TtCLA@etsRJ@FtUTdq7DZUQk$gDgl&Uv8;DXkbQW0<4vI8P1dds_Zx4! zHqbm^N?z*G;_;JGUn!3BT901Jix-)HB9`pD2|SERHa%01kX9*8%18FoIls&j&VUQGG@8M!`nm^R*vOE>tOmw>0rvti~# zDbbnNno-b*4?4yVDSgxg1SRuF0QVx`0loYN6@q@7+12843NkX#Ux?P|3FROmQ7gEr6t*~oL8w2>8!p{_QYzp&p)->( z{t*U?-T2ZeQo`s=T}=lTbNHt@3OFog?lRrrRr}J&+HLA3c8>L)bee7PsB3)md~4sF zM2QhtDx1+0+$vhhSl1&Kp*Q#5KJr-5DwtQpEDACVD_`4i*zVL_m^WM{V@W|AfRDr5 z1uPT)_NE1iiJ-p^h<@l)JSluc1wsVvXX$c|Grp-fclNc$7%>s4ql!1AUquXZJhcD;>YzI?9KR8MS< zi=JLRS8d6U|N2h3&5D0cj>WSs<&3V^%gi+2T|zC9?*p|{eHa-PywUF4hJm*r1(mwh zj$Z%y{v-+%&EZxgKKOGVZqc?nl}DzPXsLy9V4AyjtxA2f5Ot>GiCgE|a*v+BB1GFU za+=(9%)|i_h$YAR=1*j!-N@UxxAKMvu*tuu3St`9A*a`-(?ir(FTiTztjivc*^YI! z=dd6XZX{I}MH%!WB8P#8SZi~W8ckwy3)DjGdB`wTdKxYMi)1$-8;?sF+kE;>fGc=} zee`bosr2e;45jZ`?Tj)uALv)}n@9W!EC&)_$3+xtkqEdqulxSd>+(-U7*H3+|0B21 zP4eHy^s874gOPT4;1LEB5(a~ga4{SG&!3-7TGuRA`hHH{!N=3rhq7;EwW*V>u3!JY z@m=^2?%&YU-jl2CL|54nH_x-We2FqU7_bbnRw7VlZ>7_gmu9H!iZMc-dto2B7ry{| z{vQ#V?UsQ9Rr}yt3oe?{Ef+|!%V2>58uU?t;#+zWfS;v3e{{1_!p}MrT zw2(;JW~ngEq;F%W&&3W6ReOga^+sT?o)3rlPVEa&?tykP!0L;6eaPxDnKJCS5JHv9 z>aiq0P@__@P{JJS{3LO+juxT}VB3GRXJ|sE-vulLpRnOec)9|WDmEYHRQk)!(i(yC z_eO)LsyDFT{#gJHkQiRitS_H+7QbUySaoyNm?K(cqF_OZw{;mraceeFSrbWm@-llH ziysBhp_SX&;eM$?Sckz06Gwj;*gpSYGD;7vTB;^^$rf+t;f|B6efPP9T zCmUFZ>>zmE`tf8)YWxl}JG&S$&538K^U$97CIV^mHfB2~nuJ<0e0t?o~0qVN|)PYuf zWVmH=fV2+WQtKG|*d?!v$R+QYHxP{qtC~uvvVDu3bzRQ*4FIu*!9u9Q~jyo$OJm zvj9TzRy`FGw5n<(VTDfeG81i%#;Gs|u z3FU|Og8e+0I%BBHfu4)2ZKTHh-ptI^uI}!DAyzKtISF)bhJteLChMScFH-~)E9)*O z>-pW-Y7yTpcx$Go7aT^!^%T>Tgxw;I+iAugDheuD8bf$H}Rk{x_ea~8PA`;j{b40c5G}#CdwiYvMpFIxiI7+L?>VhVyCor{6IV4PoKf_y_4Bf z`y$2aQO5npkBiDoWbKu}Dc~#3G`N2zTp6HczaAWeuWqqn#Oq$&6v2G|X1#*+2}mhh zfyBBR!L?!#o(1QONO4LcA_NfM%7Cr8bYXCo#5|z&S05sd;B)IoVcOdKK7sgk49LdV zat1bOHV6T3XvAKnE~e=-Zj`jtw^XZpw!5;O6B5FQY#RXbIHyN|_IcBrA{iXDy$R$? zeECV~ySe@|AeL&j$-wIb12M_@VW*Ez*fP|zc~4uD5J*Y6jDJ!*Jd`R8*@1H%5VXOsVw_Ra@ z!T)gaSXsKfUiy+%Q?Tx19E>3x6+lT8ouENE6qv;9ja_MJDfJ#s#>}(7Xv^xGAK;vC zyvEjE7RP5Ki#k>C5eKU}G~-3t^iDYi!1yp=&Zs1+aRjQ;{E_qJk<>xb#RIY0_}J4QFy(nIMC*# zJJ-{1kQzX?i!5$irVFefm=|?$dhqfQpLM6ev*}5h($|o=PkYLPMT>$i-9#(P#t;Xm z=1j`;U+a{45(;S9^d@F7-C-0=zP0TeQ0t*r6JE>)QoO~bvsC0AV;S!ZxvS+!3D_;} z_{iL&D6N`plwEaQxvAjz@P*hjftC49yq=C9y3x=0aoVJtEyTxNJT_1(>CtPq)BEMD zAT&N)vk3NrOR!37&z$N9td#8}g_!r7!!u9r_6Sd%(12vLRXC63&aNvdn*VU(36V{d6tdm5feTK8BEi&l$FsOu9j0 z$uk={T175$@!Dk?;rju`H5&5wf#3k;#+AO^I<*3pY0w+XOC8b~2^zt;j(@vem{Etc z=#@8$7cW92yC|4q`*ZWfu)Yzo1LD2mbSy+c=(v2X$dl4SV>Kg|KY)RhVCVL1An1-| zkF~pwk1a@j+CY0#{Gqx!fO}wCqm407#s^({B13Zy>N0@(G7e!v-YXNq(fZq9#!aV)dXY<+`r ztiS~-a5d!0I!G)^D@+61O+)QH(vYvl zDUQH3_4fP^UU5ev{muHt*C*ZlP#_0tz#PEEZ zRb6^o0B;M=`aB2Sty^rjZsmck+3}LYqc2qMnO4|>+-`-(L($l}#QSF|=dNK&!Ku9Y zyrv`B@0$i*i2Gc>h9=g;LGYZ(YRsf{E>LHWLbZx|F{(>*&-^Vu`}5I@vw$q0_fkD~ zS*qePGk>_(^#k>Lzla$V17kGG$Sv*-cF z6{$Rb5i)aW&p~0J$fKSPnGT331oFP(s+WOzTKU>_Y@B54QM~6Ti5dEf)h0E|(@FJB z_Cebe!kxLFhCWa5Q2YtHBwzH4cc&1>InCSeu11 z>r}BcTt(rNz4o%o)2keNtSBgJX{^*6*=tODO&xH!&BGrXHpujBgw@$t;2-)dCIgfx z6RV8CEQJHwR;guN4z`uqr}fkt*owhf9qwFg7?4Zn{q>kO4oMvqS>& zSy`st`kaw~QG{mi`vyxzaogKrh{E;V*fq1_d761rc>Ipd^c2svj7zSxf2&B`xUz1+ zZhb?s)R{u*jOEZxik+vDiUCB^`4#1Ec(kWaZ|hV!iw{&dL2?cSFH132H?|sC)|pUQ zM#EAE{N5aH?!fsbJ_2Ir=0!_BblU@81!CsEH?iFg(HVL(1<#7wE=FXxa0356L+o{9 zDahBx6ksl?$K9k~1^&MQnO@Q`7;td_8-xC|2=Mnc1!zUy5WKUt459{N_Xz`Nr{tE4 zd@|!(1w1v%{i4^U&es68Ylxdf`M%~lW+IDmNIkI3xXlX93wbG`mZSsS2nd6DKlY!T zz}LiO4_}U%cQYV(YE8n0{vpd|1<=*o<`-@x|G9>I$uI&(!(0`n21Z*>NV)5!`15xv+`HsfPQe&?*HTueqI|l&G*#O^~{gnPCp%n)@<9OZ6 zCpvZy-QkbS#+=;3+0=mpLf`(=2i3u1Wg5+H^`gm4(L9t&97hp76UX)I2Eeq7?v)so zvbb#~)2tq==H5U{dFnqZz)aaIEQP$RDj=NW%Kwy9b#Nw9NDrwQ1ud0!a@ zUuVcCUg9w_Hp24((q2SZg>_~8^fA8j2*LiSFdTx51SaRQYqHH9Op_ae;hhSFB-BlURf3%|^q z2_osr;wlcz6}P0qe%MpA%&aPI6-VLIQK zAi4VHWQ#H*P&iX_J3i{!SFiCo4}>QFIvWC=zWqVMHKCl%CY(>080{12;N?nrVM0k0 zxW7NH_XO8)WR+!_;^Sn57 z>JKL{OUu4)onq`gcqgRn7Nt-D{nT@$U*7ypGZ=q>x13l%eHMuN;l<*NB6da4u>;s@ z-FOC4CY`2}qzj9Y)+T;O)4B18V5`eX;RtjI$uLbNgac^uC+_oYG)0N(H^{?t5b# zFL=`q3QpQLJiNl`*gU{dLSRWQuIYpOdRBN; z^;S*{#{N*!j}EbOr6S=#!}`9W%9|e2+x9Lr$>si71@5A2>W(D6qg?Zu7e*B70DPbpB^V#_4Ji|FzC?>T9^bx<-LYvkH%c+zI5|IREneb z8Q2v@;z`LG2Cr20=_L~kUS;&~0#?_W`}J`lwT0}ZbHPMB!&MGVzp)^2Pk{X$B*ZUq znD6yuWTEJXDp=b;p@Tx$a|XrwBZL+G3Lu5qp1nFxJ8+RhEoGrMH98%$xsmL{$(GNe z+fl`p;Gdk}I4kL2@lsiLtn1^)6cjynWnJeZ@SKAKR3q1W;G-kq(w161iTqA%1?^4X zQp1mp0b*Q|1;S3=a`n1G3pZzj7S8z1gxJg9?V+;o`5Jq_r;kz-rKt!K*Y;Wcjw_YX; zXNyWm7^@M{7#zQS6~r9(=DcWbV)&GLrPGu)?JAmdDDNkC*2LhGI{m=uOQ933ot?lW z{srn_Ne%giEwD>%)od3?nE9``4X`D{?Xe%C38bb^-dVWE+oGiz?p-7eJWITSxv`cK z3y+K6g(_<6#YQ~Q0m$}<4stlWl;C_)1_Hi+3 z-Q{6G*a@r{E#0%woZP`W`;CEMs(?}hSj&7Ho`C&k^yIr|7W`&6z!_Pe-C!{zme+a^ zN6G6POI_d~Grx<+D>6G+x^ym9ZELHI2fLZ)?$8@w2~6T>k(S#VVG;}cZb@%#{1EGe z15epUi&uVgO5A@taPU@fsac6uT>T7L zXRbjs`&ZKyvYQO!_77I$E+l2>m$brw+ff<6#VPFNm-A~g15NJYB3C?tS47;(0y5;y z3Evc8GSj@x^PQG`J*P!rJ9;!Q%{{TC8qYFt;H_JZTV8f{hm6{gbE z0N=9HXdVL0!S|zUo*mVgf-}Pp-FcjOz@#S)cVUH;6dMQj*L^HrLJ?e4caGy228A4? zWpN&th!SwsL$9itn2T7!#sQJwZzP37tmeV)5`eS=2{VZ`Hd4`T;j!B{?cK^AEiUpa zOrNBtcmt>n!etlrd-hKF5;RhQ81@Ur4XWa|HkN0H;=;pI)UsF6=u(T}6|;wJ{@lRn zfM0J10#Ut~b;>uwEK{6h>KObjyFnnxz_C2du0wQY_uZ~Ia32#W<6NsgIPsyCo0_El zxT2|5aob`6L~X~<1rIuT--mxR-5cB1-%{$b2Ql(dMPs{Tt89lj*9F!NF5H@H(Ct(! zN8wbMk{JkmD2wzb9OKIdz##>A-8F}Ux|h^9tmBolEpE>eGV^lK1*^_Q!fbExBP?k0 z%o$g~WfV6Tm|P%=!;C9DxulARxrJ9DIP&#+wryw@Rw z-J)68?M>*q6fTQq>QSW4F)lWfbsW>_Vyh*TGgzY5E4?R|$+>rG7n9k-j;R7)B8R)F z44b8wV!$3qxkA83S@9h~ro_VJvIWm9!NM8x)eF+1FTiCbke8%W;)UDUXwA-K;;dCP zD(BYd5M7`rk)*TKf{0~Wrz+(QNM@OXz{;B(1w5qChbjK76 zJfc2c8v$XZdA8Y`S3|}f=q&0>Cc1g96lb=#=cKi%wY<~?X%cSyLa~8c=m_&hs8_eb zx34LeL3mip#x9t$&)E3E!hee2WgV!fiCA#)^~5vps9wRkn+|!iXMrszk9pd=dNbNlzP6x0hPYsyk`-F8Bq+#DKRUPbwwPIAga2NjREcW3Eh}<1i;+0P;rS z1ux_#d3wZs7aztT{0t?#mXL;Tiq%#p@JeeBT;iO0z%Z=Y%&`l$N@)yyC;D-}x1V(z zsxir&4LJpT{87?ruFKyPErvpO&k)1|Nf})lbadsf3;=YU28#kwd2pU5A|hHE_I&J! zvX0$drrfUNkpi-3(it~eD!N$L&~|#NiC?c5oIe-*_-zDMWE~wH8T~3Qi;UsIBUhu8 zvY^Y$iU!?Ca61#IzM4=dv!Gy8Mbz`dVAN5#>6-FUsOrzy)X}fMf@OdH3Q`;Yd*tf3 zK-)=d-TyhzhCGF>@Hz~4;RXt!0T)pIdBnkV5Mev`Ya;q6{&o0d@eLSPE@T3c>BH%slVJGsj~;$Eo-G76z8li6DP zrn^{^_!!=~#%Zsg@ljm3bYN;{ad3UM&lHjGUUTCFy<7sHQ+kuql8*_ z$%(!@Uu#JJJ^VZZ62-2oAYElMzBx1CMW3AV-SJg}1@hWrC1-QJ`^vJua^?P=`B>v& zb9Yq1OJzzCn?ItjY9)4oY9Q7*k8qk-L13BHPcEJh;CG)LO7Uf+)#(v-LC=pjn4clM zHd??BMRq&TNR~N09W8Y&o`T-H0?L*hkQ;}xKr~sR!|bS24(51`@YiQfOGE4|EJZ8i z%gDmD@D-_Aih7|TvVD~KlW+-95CUn#y#BdnTwFJ87+kyjQeo8fmBu(nw{Yh3%4cvO zZOSCI)~TuHVlm$8^`WfU&QO zN~6t>SrCtv6J7rSLG54U5_~)8F=(FN)D83><7J<;szzA_Pq^oP=&4n;-R@lsNa6}H zIRQe_2Mfamju*Nh?%40CetMV2wz)VHloe-{=WB@}pY9c6#6+K~ugr{8`!Yj$ind8lzWU>(sMoRX>pfNF@F zwIf!eICtN0PQIVL=Z)6OL@%b-Y0pKpWS@hvvsMYzEO*P+n>3@>+7r0wo80s}yJ^dr z)hF`S+wjk|j$T!}=yvznmi^eed23U!N_n}pP&cSY@4~)pK9WNbObw#@fcDMCs;(&G zgBX8$`MvlJU&028rTfq5H@@LFW z6J8BtVneo`kQyT-v+sj?F3kJbD}@A+C$Bj=H@^qBGb)3!@@?z7?@C?l?#;iblZjHv z%A$pgjg)!JZ7jHDD8v&(d^_V$Us+wpvS_or`$e*Blx`6dkx_VlZ?vopAj>WG@pW8? z=`d)1K_Ql90q}c+W_=#XrJ#JrZmPZ9ZW`18-vfQ5te5dr7%s!%@DpbUEV@&r%55h> zvn=I2o${R>DEtd=H&2^zf4zxPibs4lciyU1`Tll|o(JVV#?y!zi!>fI-o`9NiS)gA z@uKmX!~UK-a?a*^;{`*4p%Tm3wMt0mkn&9is7tdejcFzIf_@gSjq6rw&N^+>ADRhF4`GB5u;pAcurY? zVIQUC?C|2|iqnOvv?d?2^z3sEJ6joi++Ub-nX7a2F3}VicXh5qV#z>KvrWPBBBiRH z9-ew_{uzZUtHM*$WDkQY+%WJyYLXe+&csRsd41`Ay5gk7~JEv;ogH=8=s$c@lx--6^02pW!;YysICFVdFquVQ;Dwv8i}%8@RRt z5>;YA_HIGiFXeJ?ns@!&FAa>U>#RdX~r?%XN*yjZSR?J8h>0=+JQGIq$W$z7deutFP24O;B) z?G{v4yRMssg8q_hx=$nlDRY`rl$4a7NRl-Dhr#U@gp5t+wM(wI_sJ1Suup`rQ=+wZ zr(>)2&s>L)FyFZ%YCMH3jPi%|Kbjg+6nVo`m9O;7@#R%Z#&;1daM!FavDYD-CSCEd zr7ndxMf9+niYxA^ety$ULFgO}IJ|Soelaeh08~#voIy_l*A6$g+)&c{yZ04xCM zl-wNbs!{MnHfYT~PSE#3_51LH5cc`z36QTe`W*k<<Cm) zQp?%u(+8aBV2!#^_0vX1Mr3VEzU)+tiPxaWWNG{SD)F>?aHWkl&ks;n4HuIXboyx9 z*kkJo2io=3mG8Fhk<;RmBqQaz*QjmPj5j_+P{eZ2Fl`%y{_rWsPLlXEtnA!{-v*gQ zXXqfEr&V*cxKAw4%_9pN-0Ok76pR_~?d|2~=hG`BOboJMOEg2K)yW}Eg8K{88x10( z{Y{AC;*}E3wn)}AClUJ}kLsN$C@8X5-?4LM^#fr}-B!<1O5=kY07VDv`pOArkY4jp zwvf>|V`FW5uymhkkz%A~DRa%gEh?`N1N(;1qcPmLR^YMzC`2#XwQ5=I`FOj=TuCNK z#cVuv;Uf07wBgNE*5bT7T3W>POw>c{>8>vO@RVIo3VM$k&KQ?TXiXt z1Xp_`TpsP?p_a2f791N~>m`Gqw)5{#PLDZmwWw#Kdfm5@Cn(e?JyV$;rPDJl?PT$Z zrfq7eC}nfP9>O5bmif9xdELI}Tky{@^`o$h!`oKMWYDdzhyt{MK{3xmxc?p8)t-w5 zH?c%-qoXq~)cD8k7$q6EN8hL(0_}6LM5B)fEl}SC$i4P>oIXaCAVqRhbr~5MPcN!L z9LoWe9Qj%lw;>)C7v&`cUt_FH+!6j-Zmz~Wu8^5qdeY4}9lA9e z6)1qaiv;Y2M;xK-@yee-ry9kuiMg*Sl2AYEkCt>a5RBvgQ+CTjdau)MRKvNt9$yeV zZp+_ZypV!NvCVY6bDJOF2;U?J8wc)2B)@uYug1nB@|tGDQyCQ(W{Y5&)#7RA65q+e zWho8R3S9$$^4|S1Dwl(viSW#p4{y{Z=l-Dq>Qit;?WJpC`rx&VEZr8VZ?BTQZOJCV zJHcXci?Q8j3f~$v26Y<<&{CSJSOM@L2==CR~3ToD|!*in7 zXQCi^J1BaGK1i}Lf0C8EG)1N7Xp>rux57U zI>g1r1vGQyciYJE`Oc9j?B)ohq0(tdE89;02DV@k-v^}m4PL~CP3GgGZZ{NPVfO2d zP%}N#sgw>k7MyI+@hy3Fqiz`q@Xs5SG=%d(Lf6}3>^C1(J%S70(SrEyR64qEG+yg$ zX^Gf9voRqx`yt|9B6OgA`9c$w(2aCv@?OuEk2bfzWP$kIxF=W75GlE*srj9`J=1nZ zc|z_=MOA10S4^uhTB`3I_QV|a3hR1_xB9!)(&s(-?L~zZRWmQe%wmm_bg=VJ?m^iL zwbhY&dOo~)H9PJK8`R~}X{~OG&Kt5*Z)PG(^Yls*Q>Q!KlDOF{dILUP@L!$IU9T2~ zMjL!{;ackZA_)gc&DTG9%4li5nztaN78)tVJY3KkC11s*fVzQ`!TkI+%>dAUY`ZmL z;#;8L`H$t|Bj(;tc1{z=5{>2>(8TmaKBZEQ@++*`mBxi|JFQJNoMD^x0@{Msh+Lh`kp;BCr?PyZD?wOWR{ibfmgnl`<|YB9!0T{f%)+3_x(vtx3Jibv zi4-I%GBEsTlW=G#6b{}-&X*u_ZG7`x{;)d4aaU>tCV_;Z-SMOsJ*+*d$eMM5X zqwvVmjwxPCCSh#Ul6p6SXKt_*X5TeGKM(Yczo+AmFZUpCbni^7R8&-G?c&gU`CLO| zAjM#bC9~jQm*~C_$Pr&#vo{=BEGjAj77(v#_X8dnuFq=C{+`?2yU&mDkdcy>Y!;VT z4$?&`#PY~Fry5OPre6Q{?XmlG(Xy@t(7X$;pi*b7s$}EKwiHfO_e%yRT=7U>UB#CO zj!tsV5mVHd*nR}8I&5YLc`iVs`h>L?g;xp1mByQvMV82Gdmv+!h-jkimT5SQtn#geMJxwaz0sAS&i8fXIfQ;9jI!8VzQt=>$9??4=g>9x8m zT*peK9XsFT8x}dWZ4Nj1d)1&<@gv#rGBvAxiuEqUPh?B-lGRtKCNbQx;Q`0y{k(yv zCK|G#qBo46JnJ4gE=Ab*e75?8BV}jd9m^agp-c@*^otiW#Cr*@TS(%L7pJoE?KEDI>hyyN2l=#Yv_jPpLO@T4cev&bnD$rwIO!i+8Gul)bmdh4jDzBg|4YoUUGN`rvXQbQvxBHi7L zNO$)PC@4rbNK3=e4Fe1+5<@o(DcwE9koTbe*8ASO?ppi-Yn{W{dq4GgKF_oFzF`64 zpB~Vgs0HDz8@)LLZkv}p&XQD2;%aj~INF<+fa)S^MiJ0+;4W+$PNRe!kjARE^Ic01*)zX?6)^HVYf8{^4dC&=L|1p}#zkU#>I@Z>cC_(e~vS zfSev}(GLxgsuLf!;!ifVS#cG%v9rU%&;tW1t!wHfT43O=a`)Dxq$Djr-fCpx@nbe< zvVcn-Fm8#!N1O)+EJ4zjh`P&6xp6yMQOE3`q34;b|Vbv!h4qT}Unl z;9C0brw8!~2|%jD8(TV&DG}uFf4dd92S_0IcdK4vLUdW=bqU48Byj}1=IZqc*XP}f zIz-XMV78P~Y*}@t#74_WX`i~LhqpfUlg(pUH~C5PnIb-Q5MayQ$(l=|e+(OfNi|W2|xNEs;6dyCi zv<5BU0?IkazP{eCuBPU9=Jcihy4eSxEy$oNE}*M1<hu@XfT0 zez1Hq5B&D<AE}*mXI*bBGdCn&t47405_4v(KS`6MQD{8 z2<#gIKFXc5xf|G9QeF~U2B2AM3kG0MfV5Blf7fi4*Q&04;b#p~94KaCU0sx9>2|^4 zte^+^^TvuaW6sHL&{*-HTmlGOq6KX583e#?Obqj82GByb1JH`2MM&ZoWz+WojU>#+ zYR-`#C*Gu5j&oD2{gm}`hdza?P|cL(siEsu63?65&bSJ`?N29_HI&N%-3nHQFL&q0 zNqyZe>UVOfq$4zJd~HCtZ}-?6nt_byOp?~wTXTd=;YvfNd(Ja+I@-@ zK>0cO%;(_ibJSzp2=_WaKU~D3f&4VjQK;0Aq91)~+&w0WLRTQkUGM=SfOb5yX2dgr z_rUb;;SkGsymDQOa@|Z7aB=m8;!_DnHIrkKhhL(jL8|S=+m=A80_0o1+)MI>8d&%2 z$5+JyTHoWR*L(8{2^A_d~MF03+VLj42*=5tkrk1Wnh><^WQ zz#GL`Lp4`xC zvuO~j|1q>fFqb_(bsJGM&-{k_xmkaaGL=@b0Keb$)Dp zQRxK4qt+7wGAH2BP(qW=@wF%1Jg=qtLgk1=xvvOh6cxD@5L{ebWHb&1)C;!(3JMwQ7ybKOeQ;E#h$?NMbW9TBn~mJ{WfK)!uN@K|ey`!zzZ*0yk0gV+cT z9qt04&G~>gac!@u3n^^^#KiNOsFb`l+1uly{>2E(xrrY*+izhVBTtZD*|{jKfO@cU}&0Lne;SnE|D*iS*9#OP|Qm>oudYnj$@TaL{RplGv;4<$**L{X_2-$elY&MZ0C$x#|^4?Tks64KFjO zREw~AUMPVtm*fEm+!K=*PqUBTd-yUpaTwZ(DXjEi5Qa#T)7}6vq#id{RW*u_^e*}F|oTBlQuc~Wr1-JWV_=! zI(U&>Oup2xN_XxHN3I&GarFWB266YFsoVfJbW|A-dYO(`@o2ZF5ei83Qt18Pyqretu5Qe8-Ce!*2YqQm`Mbh-MtT^u%nUjC9j~0>hh|GffXUcN zarqPuuVrCjJwTDM1nRq<9EL5K$yrCY-D-0Z6iNr?x3|pk9B3HJ>8TWF zXKPu{j0E~;<(!CD&)lYZuIjPXBU$>Cp|TOqS3^vGY34>L5Ua>KuF=oqiB=KM8%=vu znRDAW?uKxiga$*%7JHDfhcrLU4hh)kz`DsuMa|Ej7xGf+$-(0Dx$@4|c}Y|YZGpIB zy?)e$^_SVqV6sDN8UA&JC`Ok#u(UjgkmOuh^i=$k(Q*z61YC87{#f=5z1vIO8@pTp z=dJ;3ht$}jxM*o5&M$^|$%=q)hb6n=X3e5GC)d za$XI+pRzsezmBGIX1TZzFn>Nx@r6nkheGQQEgo@O-_>0dB;RDq+uGJsSn4L7TOW7W z^q51gFzU%5*ssru(6-dgM+pelciiOs36zalW;pA3_kAx^Ew0YF%(_xVd};wXtTUuN zJTMjX*hxifod*X8PlD=0L%ToTxqqNw<*280W8ycM+93?Gyu7^W;_LenF^BKQzNJ%Q zt&S2^ZNw+GLcORA(~|^t=>KY6E0~}uW779Nz)!R~>m0ALSbu}Pw@Q{|j;O&{!Fr0i z&~!g4A%|TlS7)7xT#HSgOISuP9dUoT_yws-FWcl~X&5A_b1kvh9B*Bu8Q)`6W_Fm- z$P-atT`f9V+AWWQH0Nl1CT|fn>rKUA+op}kgq^*g5yUigH@NVU_a=f`Ywpfo8ypZQJ^)&8CO?`$E4GoLhdW>>By^+^=WL=#{w02xcna9GfhtQ=W z==m|0sDcUmwulYdKiG~W;!43WAbHu$hIWG%>>@Q%S8i7e{n-8{Rfq&?(xci^eJ0hUDUtsm-k0g_HVi)5d|UuWH&u zLJa-lC_O8*9oF%N5vOmM{5TvxR9}=_ANn0cP`w<}mXJf7o$P{_LNgK)@*K>hKEHX< z-3!tL=$_`LrU*(Q26=t0zw`W45U>$S04UqtbXuj1G0t+x2=&g8h#$tQepwlF|N3l* z?jRS`Qn(*eQpPAU-`ql#{wiGuQdWJ?$I!gQV%7qP&kWxFtLG;LOBfAUfLv^aDOMXu z&AUiB-#no%8^YHK4S>A79{R#5W_`j!ldx~_23wP?rE%?>c?{>&f@^0}Zwl}8#krT? zE6sbD2J}oi^=^bkDN5+j)9CQK&0+Au;?AD@2vElt?H<#yY9t!#Dj|H!w6$rY{Tj8c zwuF4q(e0*Ey=K(+#v!Ye+v`!PVy+44Dl)ei>{4_uN26ju%F4>wXUAvY3m|Kz_yEp= zyKMr@SuH@w{T=%azcNJ+&T4hviWZ5Mj--?E(BbflUsm?&B`*nM1mkW(EignDUaVF2 zCsTJ1+(0=%6lB(>J&aqJew!W91nULBRuVzBwo_Vs z7ckS#MB7^(oYxu6hY_I*ldV^mi_p1#{g{-Llwas+;6R7zw+;#~{Bc#I@?3M|L439o z;WQQPvu#gt+@Dami~k73&T@^K_1V=oKe>$3?LeVsP=;SM-M!NL4}*5nU$SyrvE z>|X3isK0v`-a>sTndo<|zfhCazKot-?P9TZLF(4hBm@369-+%EW6Dr;)urx>`o zU4TR%9i|YiRc6%tcj*36kROxL5Ke1+PB|N8oESZ_@`eUp(_^_BVYjZQHO$j~d+aWr zZ)a!&dyFvs%0VtMkSF1?KeK49b@zB)2Pg~GHh?k6Ca;AB&9UcFd17nZ%dhpBpWe5@3q-j|9nFw$ys7P6gl zj{;aQf)lPsv>1P^HwSG6BEOhQE>HJOq=+ugtv8SaE3xNW$V3$;(~ETKzQ$AUGc2lITK~MfUI8AX>u}K9GEsxaLIXNaIZ>5IX)Q0 zY{k~i#>_Blc?)XJIpDfwxZ7G;WoCQ_4n~=nvM@8-o@pFMp^}y#{wgS7!ixndPIo{4 zw1hJjv1B9no#t#M%p%Vh<8=FSW^(cjkx@P*2%ecyd(!T+3z^$AfnHTyAqhx)pnhC$ zXlfGQF9~B{;jxp(RyoZ2!IIS&QJNRrB#TU#r@Xvec^+;Vg1KKlP4YV|2xHz0f1FS+ z2<^A%xvj4AJcF-Q{_W#5pJR?n4uPX{iNvFdlSl;Np@ZH>HaC{(sVS_16LTO3CDu3MeD+N=Vs{o=-$nz-*6}^ULJyFV90;xMr7`F_o9& z+F|R4^_6$38XBz>`EpNHZH%TPM_Ub`Y2En<*8(e7F_nNdd5(O9c&L>Q}rd+cpx zkUg-(EYqt?O9RU9PIhKs5j6yFot+PWc(5i-x4gC0WBkWl|LHtggmYZibJHtGZvW%x z^Nx~K6cd=@lH*rc^;R5iE>hb|m#Fz;MRd^+?bYG%{K%7*%gHq}uPZD1wqg{zG2Gs+*Xw}Dj{eBj zLYinxKtkxWN8~(Trj|kveaQYv1sBuzX<2y=@cPqZ3`fPOp~J4nl;juh6&*lAK9W`k z@p~%Ffv=#<)W+wv0oHR7cOzA0Jpxa^eanA|BcF{-d~R2W9?y=t zHm!`2rqs{rQhl<0FIfhmN6Z@4H-0L&Vv(EUm=3A=^r<|Rx%+N)x-_rH&O4OWph--Y zec|T{L66-HSv0(Hw0URjnyOC*@#}p>iaf`;*&OPHo2&Hs^MfPgj+)zLKt7wv96oL8 znei90AS4OnKWC(OFgh~w>ma{Ohn0$+65G_&w0yT54o{vnaz73kT4LehiJN^lhk$NL z69&HpcwH0B6AeYggV_TCJha5Fu5efy#52<12&*Mohi7f(x@2&vXsL39z#Z&+rj=N! zYt?-xmssRc(nT6WOc@t-;eD*2rV}b5=@K&0)WfCF{Q;UP75KtKOCVZArlsoCYNEg9 z{0O2ROc6=u2~O*saKLSURE&0|7ntlHa+$8Iq7O?;PG)w~ilnO84SJ$9C?9zwf?2pQ z3VconE_bH`Q{$f{4K{L;o0`dqywx%=Xh*b$p`Ur5i{YiJ@na^Nx&3EfKY#2iyk?O= z%k`$Ta;PgON25l)41RuL@#F20+j?L6V><6D5nmlQO_-Nx>D2oi> zu>@KvNy)*f^Yil)8Vn6;YecV*d^-d8%#RX3RrmL5k6@wB!1x)MToD0CZ4S7oC;-tP zn$l5Ty({OKDYh}8UU>QGGaxEclEQovX$blW&OJ@cIVZyxC*ZE^dsyVY2fP2*>jy+b8X6l<{x`2j4sPtn;->oU4#| zP@gqs<1#q#?Pu=t7z++(`mCk6z*vxWmN=Zb3?s!$PveE~VdCv2={$zH`S^{OuHhAHgOP(r(*3a2~SoJV06Rup-1P$tj+Ehq>; zS9drt?~5NZ>WAi+mq!i$MpapaxC7O&c1r-d7TX`Rtsasse{|oT%w79ZQc?nj(rX$s z^YLkwEQR)&1M+D(KX5=d+hvsHKZqsYRd~N7$L}6KYp$ibMt+pQ~SuRKwXcSGaX?+xe-=)sv-SkA*NMW7Z9 zcu5ADUfOD9fSS-QW?`kv;OYD_cY3959(pXQ1fFZD+X{yZwtp)7`ju3&@oXi<;qL8^ zAuh$fSGv{_{(8v7X^d{_+~2^T3>fZ+;H4Ae(7sb78OcsU?|st~m$lzyQdPx0(?%Ng zeyb%vLRZSnwl-9Ms-r?AfxRK?CR_Bd`kt_akfb}AZ>MljLD<3m(69-4)`i0iPisNU zQ@XRRXWC4iMl235It|Rf#MVhjAhr8bU#{=dWHl9AZ4jb zNgb1C+_xr$i6a~5x@AeQY4@aaCE0ePgF&Jx#AS7lT6k@d|JS@kbXd3VlB17Q!pPtt zvL1ABn0sYkR#?b?+NNh;c;54EhYZB!RT5}ZwWO^j! zHyu0z6lqBPVl%}2jNHYfBdN@IQbeI}Tkc$Bq7G|BWTeHGHRfQsk|;D?*z4!1y4T+C zAC-QqRlp&Fw!{?nKVPBMT3%G*6EQsFGW%sT2gTI&1@$E>AtrZ)I3v!N^Bv4GYGUjf zI)liTg+=U3Gl8oKIiie|(plq2A9tpjA6X93wG;Tqc0>$rOEh^DZ|^fb zqOemNosht)&qjHSlYPmluCB|czC0GCh`2gPYI3)8dzN6z%X{)ye_i%jC?yyyGC9rFFyUd$~W*z+6!*rhk8E<4ehMtUw8D?prvw##7C0ly3 zGKkjdpY@6vznIVr*T#tI!m`-p`ZzR z$nir9GA@$*b#t$VgRV!8{FZ+u7L(qr{`&vqe>!MMp=Emx1TtZbkX| z`L=3NNl8emZB--*PD;bq%h(G2<{!Ik`;^Ys+np>^VSN1<6!d3eWss7HUEz8SrEJEW zW#=pO6wr|Esqa_gG7lo*j})kJU$U)p@VhwP4dbgd5ld|3FO4bF6}$NUY5||Rsb$X7 zAgpA&Etr5moQj_Rkml$}$WLGB{jZ1IRo?fw+caDaKeS9=ig~zc!tJ8#>Za}FArPHf z82ZpmxItElQ$MrJul?u3rz8|M1%)~-t)@M01Cj(oI1hA_0C{>jKyjLwn4qvK)mxoi zT#~dqryLxn>-T}i2LSp>1{)2s+`q z`vT)%!+^;W+o2;4t*SaSn_>l=@=U0{DjS3-7SyU5k*sf#SkTz5_Im7kyAB1& z!B7%7#8YIT)j^AUm6otX9jSRRTKVpy%)T0LW#(5Iqng3mc$Ra$4fz!^iD;E?8?{`h z)PhF&b*-jDRfjzmI_|~K(^ISNTM}*_^ykmA06YXaQEh01m6mQUHa~Ns!-filE#Z)N zB1tZt@>?#JLBn~9v33Lm1cxNNxdp_C5Tv%GWZO6KfDyrk`PQI#C2QJPkUJksgRRgF zSQ^W`*0F!yNR3MmzUU|&lgcP`^S%kzA!CJ0%oygw{mWJGHEaQMvG?P=RW$CfyZ89( zv@~DJUcX;gyEU^tOG+;pPPXUkcI>0{K5*ib+rcN z+s7i9r^3*#i|x3C0zC!=^XH+S(b-*rGZuYcB(uh^FQYTStmhNY*Ol*Iz5)Hr)c_e0 zUR;)4Yw}~xTn9kTv}{rbxjW5}^#wN9EshwFcN;Sf8%J8N($;Z zATcP*NmG25p;P<~q?xU*P+f-DULR>@CZ3d5NCCKxPX;78d1x?yGFMc;?F@ys*M|CG zB;#>G`ic;M@#q)*Ls|fh@aU&{Axo>Pj2awIdlvUKP_0Gz>H+?y*9U6JkbO_#hG=41 z%);IuaJpwx85%nxv3_(EzOgeu)TZB4s`3NwEET8}_Vmr8hj)J#Y1`vd+IBhDPkg=4 z%mChP;yndlla7X>SZpigwLinwhlXFit%?~94UTxp?!qI|Z18Wj3pAGTg#CI=%`v__$WR%PI-YbyDr$7olLHWY{)ycmDjBXsDRU=THT=N4u!S!H`L6k!799IV# z)ujerUIN*l9=q5NT4Vt2l9IJ*q=tY?1SEKNNRcVAz7-!86$Ko~laMxW{R-dxTvhVa zD%eAh*N*8t)1nc|QrAwrzE!2AMwIPK-TNYCpQ?ch%&WFOT}`AOSo=$;V$0$POvf`G3_Sz6KgEHYV$gX=dgNelA&7s8NP-vvFMmMP7bdLnKFm_ zcwVfEv9^3sp7pjVsc=eLfE7ywA>b2z=_1{$hpj(<5}Ne}VByB-+eC5-JQo%=u7pBIkL)GoUbrIJ~!37AT5fo~1haG^;su~l}OTEJ|vKV~EvlzW`J0~Yp)e;&8 zn+y!h^Y@SW6r{Y`ZEng@rExePd$koSuekO;iAJ*TdB{6}Vjc>hc^& zNtP0NH{L%}DxoBMcT%&yryPbB9l72;KW@+HcRp7>eR_GO)4|_oZg-Muze7dBg%Rpj z&A2$-o@=>4vt3>z9PH32h4E{HS;0V&!=Yy>lKQ$OTpW(qD-;3vVqBODmtEla)XcK$ zPNb}RT1N^WAB8k9$l z$?fUw1-v=}XhOCbFFk6W#Swo@Pfrh=Cn*Y)wq0G(iye{6#HWjY9S=uObGVd{nMEPz z>Fa8e2i#gsPEUuVP9jR*xqH~oF~Ew{FK;W!$&H@>c*-w&gLt2(J(+l9n>T8UB@U3= zq+`X<=2c{=Y)7D0{P=&e--@nQRvKLH%F4pP?KL$=$9%WyFaOAC{ms@rzB?&aVkzP` z^k5+Ga`^z8^~}4UKU<&E4QRITf;Niv#t*lC6Rq8ScOzJO8>hdu%ooFZL#=gBCe*y;>6b0$O72Cm zxKjT8qU7H%dj9)j73y`rAgE47vl`Zf_1|s7b*^_a!Rq@)GRoaR3!jAR^FMFRI{ta< zWAF0^Zw~IYvQizS$@&^ahww)hT+poDcg;Ny#h$4zU7*}w+OGoOfWQ6S8z~Q@JOxw` z>wllZght|~)8`inX6blit=)l>GkqX}%C?=;?DVy^G>hC#dw8R_-}pJEZsc(1pZ=jJ zNfN&?>k(1jJNZzGMf^@u66Wb)(BMq*@9}X;pBp*9`=@@5Aj76y;PH!FYqtz>UwcrC zl`e=p^;*G(6aEob8R+-*NCjCv@W$_*=|<@`heVOa$Sj|a(GWm0pX1&rcfhDI z_n+0eGqO3hr50TLDb0VY<{jk#(KI3HM1@OG2$&;)RB>|I=9^jQK!N3= z19J%fZZe(UW&TMtfbDuuKAe4Lu4uudr>op<&HC@Sz8wC(S*8G=4)Z^DdOylS;Zn0L zQCy3*hf)rTd_Wgl%{YnQ{aL-`$G&ia&M?o@`40pkHY z&k@%jS-vYpJ-Tr{<#^u1fl%g5O*`RoEZ2KQX1^)caFS@>7 zMTz{x_3ilI^Qyl$vkSz5tGh$;SGoIvgZ*zY?^N-97yHq=xNmyW{(MqzvLgcKJY0f3 z6@iESe}-1BEB4P0^sM|cFtBN?x4ML+GA=uiwXBo;CWdgWk-V!~Zj^amohoR}dZXUS z+uK_yFnf;G(2G2L(5KK91ajkNlGCn>$tZ#15aK2;c;lbEC=*=TQ z7J=B_fVtLfGAKNsvheYdFUf^&!Nc(SpQiG84{hI<#>CWd;2tt!zbU{Nv=K( zou^%k?E$8_U0s`}6eg}sW@NOq8F+REd@$WhNeR6-A#Rf)>{U4pB|bZixf36b{{|A0LbZd}*_N8r zq#U#F>eJKHr$}2RSMrwn55CW&N!+Z_+DwCpqes38bwDZJ1PV#{29T060@1J4H}Kv> zvV95zM@0|Nt#vs3BMEL|NmjeoC>~_ook>r)>dU1WpbmwL3;l_VM$Im|BdJj#Oo!78Tnm z9@UYGzDE>VRaeD^+$GrDkgFK%O+4)JtEyHRxylThItwNc4sU-IMnz<8?EAw?4f^f_ ztKsN9thWb;l4k9TtQqm9_Z)x3G>a$3PJ^ zBQ~}S!VX0VC_ML@x@P`S``25|!a(>QbRBZE@EH*55bn}TW z|Ne$;$mWS;l0+bCZe7uJkZx>tQ}zpQt}*#M-&i9w)Vz1sGmJCtoHjLz%4gb?HyUyY ztKweNIaKgbvTgdY$0a7#;97IMoFDhX@c8Jedr$_IMJk(4HKMW6+^;sTp9* zw}$u=0Ka`?z44Z|V`YD}$npB<3d$Itt=Vc)`XKPaI*HFqL5y`l#mz-+=U&Ip?ud<{ z(U2qtz`I0f(blo@#kz@Cn+B!f8*DR#MR5QHtPz>U)I+@0I^CqOcomJMyoavvm=A*m z#`%0Yd8xHxEpE4KFvz0>zzi!>!()emvOqRa1@-su)CP7p=&o7Uh2x@njL`)qczA$B zrMI?cjDB`m%geXdYKVMxq(~W#z?1LoDJ1E>xR@A(_4F${A22X1v1G2SggCA;lpI)o z{fv2d|6EavU|o`o2|j5}|5B;qdk;D$cG%G4eEEY7xygE_ooK!Wh`X{mrqG=hjO?8vdDH?%b*U;MELGxWWG&(bd(d%&Lqw$6rm+O&mw+=x*Q#5|hP)-w zy^r+>j*ZJ_UOino5!Po^>1t+eJ^Avot;wVV?|{wv$8#*h&n?e1ns$CZ8_TW_Vip!3 z)XWMR`ERl$@y>_n2swt)*jMih%D_aAUuz2IS_VgWXowHWY#f@3tG^2$xc`()Q~o7NkyO>CTed{+=?R|fYtvSU`ayi4P>jO>x=JpA zECj`<3&vdVv7Bx8?#IYZUa<#0g2QVPk;eP??NIAC6`U~eLOhFhXI(nNU?fRgdkNwx z0fnM?JqliQwB?zj?QoBd$k?iynl*I01lxvVlc|*bpf$Om- z?7uYB4BrFp39w6Q@A^Un_E2CjL8slio96P6W=#J5U?(~yHUK)A+RG6e(TfpVFK-!8 zQ#<3!_ZnU1Fb`>-9NE10S6LP+gu$>3$pGN$iH*zjCu6C)0#ezV6#G0nAB$a8G!a1` zd-!m>IgjOO{&8S(#>_PL8yUt&7AdMvY*_0+y!i=}4e;&|QK0{qbjhByaqeuNv(aRe zHDH?FXQFzbI?`3LH>jm~&V2aI@N*9d>7wY+d~)gH3fl+|^AXrL7vt4C5B1m{#DtAd z8rmSgQh?otW%GW2Cb+Z!Kju-Y4Pjn9@jP5nbcY}CkW1hdA}{mu6Y8}zg8W_6AMJGV zYIgik0nY))bC_8h3=Ug98vV+=rAMQl@y7k~+cRp15ND&&JW2=WvB7Agds<^76YHw? zh0Zpe*R78|2`cyTY;3TlHgDf4kRzt@^Hn+ecncvVMfY(qvNW|cPnof+d*n` z$O9A7A^e_Q=|^fG8QJBtiSs>0O^nsXO;XmTFzG)Y3{f?%XL57a&&UzAiKiG`%mJ za{G=MzV^y$UH{k^(vim`Xc0GX^_1yZM~bhze@+u7)%-RV2B2Rq{5L#6jJAoE?ltL={8hsWZ?anzCbiqWENag9;^*(%GBC@d6AHqHda1%j@*y1-ViW?pg%YukL_>Tbc*Y2wa-h-$-*W5hKNJ{O76w7Ko*k>K5@fNmW1g3OWs_wONtdz(c2%YV~ntnvV=` z)~W^VCG#Z11jS2v-um9g@oz6lHG7lJ@e=!1M|d>H4*+eV);IcYr67ihY8>4Pdw#iv zJaw1TR^6sFRK0jhWbjR>qay`2_&Q=T&Drst#*6qgEM=;l&yoE``cuudwZQz*=DEJU zbnnPEHo2v4zof3M!>uZh;&tO%@*8dvE*$+*z#F)h$1rN)?L%~W+BK7ZJy9`oFl$Uq zd~R#!!z`UDK)Z5ye$Wdryu3?d?Q7EjIC`AZ{WlBc8>adj*)A9^F&$@aZn$#hLpVYJ z$7U5*>a8lD#is>>y_v{RFnMK7n%!&w?|Nm^^4#$muSZ%bVp#JWx|*!76gIs1GVtts zd}?)Be!etu{Hq#qH8SJcU7fQbNe{dUl~oBXH#fgvgM>v~xiZD9-P-N+5%?t9yP`R- zC>E4hiI=E*n#5Yp+-L_{gDow~e6yv*?i%@Y_(?4BTsB=;ckq$BHAj@NL2_b#RyK$` zabzy{c;GRq%5^@`K5_FGtmcHbny>%k?M+wB$m08+k&K*s?rtA?FTfhh)0$Fjp$bYNCaP#*{aQg1MxQhOY%2GhykK(*w2t8*wE;4?#iPq=PK%> z^QQeizU)_-EX3+X24Z3}+)U(K^x{E*Q$01!9-zcj(;h_ny?_KoAKuMb=O*9~Y^~3U zl$-C<2xx5i*?4kiCo4M@j;prs8IEF|s>_RKI6FR{|Hk*-ufLn9#v)Hqz>$A%BQjMd1>+fwj5ZZAG^a*K*z3%A8R_Hl7W~wQYM(MrcrgdjyPN zX%kI$q(MJk)YoS{2;lwStOQ7oN}W&3K;%HL?1sJZKo=6S4dwz#MWYLXib{FZ>7h39chUmvx)E3O~=1>vqny$<`; z9|>Fzm5C6&L>Eg(6ktD4`CKZu(_VCb)XMmF3m5339PIuxgOj@eI{VmL9rqVSwA`9& za?;klo}u$3&yjbnVbt({85x1%)JqQIT@x}idyASUwuCiXl|fWE9fG6=H;#r!12K6com9=bKjo8E z6H7fKy~qCBkaK)7K5rl4$Ezn3t|Q0SvL;jVLQ=r%W=fedY0v5e^J}Qx+TQih5Ot`DX&p*r@->~yP zk9C%sQMTl8$GDYNF`GzIdu*kZc1)-8w5Qvx@?1vSf?s|`sUL?_Udyo{)GcC?E83_~ zoDB~5kWn)-{sR`RVmoBCK0PGYcB{%?u=4PiA9B)no>o&<-ZlQjhB`QfKO7OKmYPt5 z)SfK=UNsFGG*=q+pyBNso zo$;huDQB@%Ae+Gc36w{S#nse62!~P<9yJ3=%yg)CE`@h}@7w(QHS#CnZWw7(NmTsoAaRqQ{plt|*WT1q0^Cym&c$WR-~TCnK#1g%@Ba^7 zUjda>^X;voBBCH5ph%}k2?$7cOAAOhNH@|A(%s$N%|i*&-5t{1-QPLS<9qM_-tWC@ zxpd)T&g|K<_iyjnF@pkx;3pPadxi*8CFl0TIwGn3_t8(E6beOuqIj!#W85ZZ+c%A(=HZFKM;d-#!nLSg#@+VldBBP&K^w( z{vIR&;`I1Jh@?={c<|tFz&3%IsamotMYEr@_Yd364QDU%u|A z=+$uCVD9I)Z=H?b%qVWL!_Z(YdFhRH8v15Np4=IlrFBw}Gb%IO|ckhV-*$+rms!bR_|Be;`1&S@?uX0SA7|Q6s zL`fr8h$%Kgv^^jSm`t(>=NXdMnLv ze?uPmi|DCJqgn-Lgc^(7e}K)nYIS902pxN-!R-L8Y4Q z;BQnMtEi}Gw-3F~6aa2aVhOltAahhDoA2W-V7;F@9JQA?Kyd}97+SRZr!>J>UjAGU z4~h3D0w`B^6yS*nSLkmZN!G!ke|P(%mT~<@C+3aERt)NWO+VxdjNG0n%#rKwaRRa_ z;tY4qOruhP>qH7#;|lfXZ$J|QONN8FD3Xr$`E~EoxDij9Dt9R^dARPvCTf(iJa&|Z zyg~<4105G$P~CfQUn3$gesK(yapgdRVrRGu^f*edq6bTje7Njh{f1O*Atjhw^4|Tv z6{qA8WZ3Rl)5I5nXU<{8S;3NX|L$!o@10fwN;_(W z?}s$tF!M-(OP*yDC};4=6S3a+halZGpXA*I$N_FfHCv(jJ-NvoBsd95&vf)(dT?}L z^oU?*t>p!6`Q_Bn^ge^DaV@ek_qHjs>l@OVr0Ojx!MV74I&AOQM$N<6Gg)vs><^_v`6=0Ue%>Aoj7buz=ryxv$ zo;Wnil)n|ca9>*&Z@iI`!tBpO(fva-UCA~uVHUaNO3=MP7RaT_a{f5)3fD}U_AnaA zpK%s_KO|idhpBe4eXEJG{d}7B2R1j&b5K+#U_pGaMgT~97kKOSJ=1AYEk?(V&ZHQ| zRNX1or&(SpdR4jh>e7LW5vW?x*Vsd}rrD%^XwH}|?ojJzVIaoZ6Re;p?WXz~6u4pq z7(@Tc{!7l9DOeSWltOhg#MXuSl|=2s?9O1H_tx%>qT#*2OCU z(`RGBqSg-z*V-_XI`cH{H44ctQi!|&!!>A#2Gt3;_*61aFx`xWtFPYST*{H(m>*H} zp0l{NqfdnQvBWng(U7uNDR2<`atv+l9EZc_d};o*r;ujZ49t0|B^0CbE#w_m-$od@ zVt>hP?}ve3X1(z?_nH6c*KwP%O}~@GCCk3K*{`a^SZGhCwq03M@|iv+ylE61Ejs&h zlyKF5>Z=3sl*>q#tt`D6Wf-&G5Cz5aWEysG`lY+`mk-^M=wp=f2K-8)knjALM*T(I zRhp$S9*fVUlyId=kOu*3oqqccB%d$wG=wdrI4JY85T?i7>Lssyd@@H4%BrfzUs?Tv z4%;lsLtCvMXA}%YD~`ngrTu!MmhWUdJzYJny(hRLlF->+KDu=+`n29prNl>7xTPBZ zBv3^uNp9nVV(8xMSCq-WhI}kHq@d(t{X=fv-#oT2P_f-*5sOMlcyn3CF^s;N9r=Uh ziSn0jbYGvi8TSejb^Jl}^))h%%{CId^b)D+T0bkzC-1C)3cVCTaI-?Pz#=9PdOnoF zyf$Av65?{@tf^CpT0ms0{rW%Ij9I|Bh;_9jh~X0qqLZ1Z)p>t6l0GM-)Zd#wEYQSH z8LPi&;T+DJ{;m>U8zeu?xRnxC>tVF)l_Pvc`^;KLg#@6`sP7|$Qg2n(T%oMA=K*$`9}y;ph9rK^@IP(jC4)# z2a`rdVD*Iu-+0NG@{dvb^jk2M9tx*W@S7w7RYG!gbUb44`@t1?5B=pb-a#fw9~CIp z;;2wSmrwl9@}r>u!fEC+t%rJt!=@alWv(JtY1>W$)k440bU+_X=mRmH1 z0#aA3hK6RKrjFdBw6;Kn{pULaP2unsPZ_DxpvzJa@`W}F=WIwlVZLNkP>IW*eMc)FfKM@5zic?Q-m`taGIWRypO!x=5 z?O}!rH{~pj?dR>Ix#Y4kwITFP4}C+wc*|$v-CwL^U$v24_^Li2Pt4BWqt|P7tVDF- z$TvWA`t~R!Y}+BzXq6Z>nN1My|DY6)<8_yXwOkeYId4T8Yb9f<(qz{|Ed*BIynOd{ zf?wn+nG_nTMG$%ZY}e1>Du|w%hpAR1+m5%(;fou(pk}qE{?Y|}=?CMOe@tHcD;W@iy3C=%Il#t*z-)}`2bHw^J)dV%KdK?}Jc`EGd4idL$ZTk8i&qXGgWCF^ z-`qol?foyi(P!{y`Nu~6CWR^gZC)6)NBw{UIC73Gf-|r1J(UM4}rI?naae;OeP2`((0K=J~fetzd~SEFWAFMTdBbB zLbl2bv>K~*Db6Y9ol~>7aq8HY=>GL3k2R~tclEeeXnIw43@h)#wxt4~K|9C}T{I$q~8b75U`dM@Lm}^3sp7xJ0+?)kH|Hv#)lU zmItRmd+mb;1F4#Q7@cmbSN2s`h}C|Cm2pKv3*;OVvva??8bm&kJ};YaE4pG^ zH87SrkB*<2tYyx{&KYGrMnLJ&d$&>jDv=6Q($COBFh-ASn4QAq!eyC^xE*GTfhfXn z_?=88s6-mKY0|>DyKCn(dFb zUz-m&4(2skC)a-~fABs#qpC`7XuV$VTqfu6hU#S|7;-^U&1G8_VCS z^!4?jqoebrzQUmdTi(U$YJ1hUAJ@IJdRq8?-?8dbH7&o;v(Gi=b}#uh6`Duz2P4-K zwl;ImvtOK^Zo|R7W&rAq1Q=N>^n$-plHNDy^k8H*{r2&BR(2SV6Je=bFSnn`#(0yu zx3=PKl7DVy&4Js5_tE@hFukjF==YENCsR?DMcJ&>%3=)k3=FrY6Kdh%;ct_V=Pt;= z1_6JGru)U8$+_(d&etQD$j@2`xWVm0hD33S*UOn)nxv*;=hs` zifu1a6gSa=9jUC^YJ(?d!qt9LP*JTg*04LVOyT3>yRu~hCE`Fu1<=75H9~E;x@)J( z9oqUXgJR(p^UW{X<(p+DetGBX{&0s8JmzU9FWETTz{l@lRAB{~i+9F&o zeP)gRwc7!_3lN0ME>a0pS!Z(W0x!FT(cGPk4BTHBZ3yloUoMU8|8%}byCl?ghK8E? z|JwDpz-1iYzuT_$#sU#6pj3OR>84LWP%yp83vl@$%RsOqYWqmU*|Q(Oq;LhL9wkIR z<%n4PX@5^Icy4)Y2vF~!BhAiv*AFyBjopR?Q5b6mq?*&Qy+M^9^nXeAw3l?CncNET z5_x?!zBU8kecpbzhTF>T1e>d(6ZK_Apv^lzIHdTonh>$tTVq{j;93d5u6v6&0?moO zz65G&<+?8!qLUuw26MdOIpxH=xoukU=lyvXFb|U%Sh1>GUyV+AMa8GBYDq;!k;d;@ zT12R+TpXb6Bit{e!JTa%nO#91^2kS&zYDv3ob2Hcw*YkN(Fi3yg)Ftwi+$-VUSusQ zCLM!CmX2-NfG*C6>+x~9qXU>9@&whEa}%Dy<(5Nu z%!(2c1K-_uTV1DQg61@LsQv_h2iOV{fqUud=#@agIX~rp>6YN|1-DIO$lwUQddvYR z*I~jTRqHAUFOc3}T;xU~II?9c{RTWc$6IxCKEX+6pIY1)!S?8K@tSv#41^M)+`mpw z052nOm$;TP8&E|?w$R<%%NLCZ)caaDqfyp>qwc2WzUJbk=nkeZu|80$jn!3qNApDu z39^-*o|s6iHh{6VLQx;j)cTkJ!ykBQUZ}BBy9;$ILfcUI69dEL#YHCu-JAU#5>fg2 zI`MGHmXO~!3u|*-+0_a4hat09&jiqnvXg4F6&r?cS4cVP22Khde_{@~DW*gKVtpsG zR^QIP0StU&#lS?WB;^Z#Zhf7ZSKUbIy4A3KlKf8OzK>0%h`B$m}6kM)vJuOe|Vt8Sm$)j zxV%*Ba?f!&4s^o}ZSw#T0+jv3N7q%XX2?!v%tpwILy-O$WN{MEuV`?My0Ud zu$&>YfnhK?Xn&O^|Ld?U^R9EKpQ7ptr{=TWF^ZpcK*5e|Y`3^(2=M>nfESlq#tA~R zsid*t$Mdoc&soXQuA0NF&{~ zz*BxBg6d;!=7Q{RJE=XR{v-VyDJ8yX6ugKOWvy^H`&qcbc6M@g8M>o1GduN0#{vGn z7Cm(=w-9spdrAX4B9`N>BAW^VDV_#lVd0fJDJdzMWJ$JM6=3_+K1EuCL&+HI15QkEPJ8ej{Y{{J;Y!S1G}dn)%%qP4SQtXvKd7@ z4_f;ca~ZnuTT?0e-d$d~k3GDz-C0@NhRJ?w{unPMD=nAk*YUX0lE)3u8$ z%kOC?&?E2?1&ZmZiR$#u|4?f9+3&tnl>~9+I5GIH!2ocJVOZ!Pg%es*ND5{!@RES* zH_Ee~m*xh{)rV}5Xum$AE%B$RRv~Npx z6j_U7y>;(QhW9Cw^(vVbH;C@bgsuMxgg+I~cpKasHJrcX}V? z`UnQ@(X?II?D6A!g;D=K!xlB%Jw`3g=IA844Zo#w6oK|2M0t4JS`PWuyrLH-^vBOW zmX&2cFw7{`A1qCJds<$cDNMQx-YWwCR=+?^tgP5|n=1+1kp>&ek(9U~%d$ z_6sZCZ@fitq66K-$$yS6vt@5Zj~JY;tWF@WfIGFe*$q75W+tP39tf3QSllf_f}V?; zI7^9Uef&YT0bIc0?s&xIaK4ur9hj0eGBY#NbK62Hc$33#rw#vLy$w^^UpD-{GPYDm zBDR<9(Z(rOPAVg$FsqknA<>du1*J|BE)po>094|AFk^X!YBpmvB0?m#xP4AY#;2z$ zPt3X9)8CetB>eDHyW?*=1B&6W|Mq2`D(fK3M}32Z1sGRAT4ZI> zFR3Mj_!@H3zw^=+*%E~-S_)!dVXxf_WK$TN7>!3pgv{7kh((bmR#Jbn8QGS%}E!{=pnUhy^qFA^{9;sRSnUJUKxwH-NAeZ?BH9`xAh;7S; z562Z(nB(p7aq31Cxcq;@QN`hXo%h3$QKWVT!0q1Q8@2?%^)%zG9Mo>Be)URNFLk9S zz}RQqJLXLk&(q+?3i(edRjhGuct^>T<%o!ga!F#lHcw=LXYCid3%0+V*936%3y7s= zkK0D!z-6>|zae?|C|Fq!si3XV3}I%kUX!8=V-$4)aB=A;VuQLuRg`{e0EWDi5l~{C zg+x4guD*OS?hdWrcq=XqHc8t3y_{yD;_~#=q%6ggTlJdTfJM)+qYivbc^jI(8sv2r zQ95b!rOI_Xzj>HB)v6`^m05SG(%1M^WWUWeqGxG(qqlcXU4wgv%N_TZn`ZWcCu7l^ zA*L^{u3d(xK-cFVZ&H;$p4K^ardsrQJ~{?Q+A`=2EAC&}Ga`LH*Tnmt`=jwd(?!hT zE!nMm4#UsR1^U4ak&vi%ivn-&r|qu~0Sx!!TN1T9Eu-%xhot5C0oI$(RG{!7-;gZe z!%scW%9xYej|%D76T0GaqW|F{AUYuSQ{m~AQ24f`%(hvN{cxDIHXLv?aTsslK$k#K z^7-^Gw)T1iSuinXXK0n}i5Xdw-q!Ml zUv9FgSno}fn;6Ppx%DQpMvKdn>sZI5_Nys(=iU$+Hz*^0z%;pmHm1fom|wn?*a1o)efq`D#20Ah_Ri;V-OC^3v|3mVSgc zarQ?@46CXZHNR>{9|@G3YKOtad>!(W|7=Z`jLnIyZ^UwH`$ATq0q~EzSVSt`o{kRB zfnMfv>?l{h^+A}zP}d3)9I{$wxAf;*h*T8H?z&fBP0Z(g@uUSe|MdIE^Y7c}ICe zM;UY}RC0Vqf$RD=nix2e!3)c4so-7Cm+MT^m7tBQKzArKuzUp<|K!ON1TP+|dYGLX z8jfGJDA1>Qf^NRe+O{57_wMs1rB6E__ZbTissb)D;qRl$b9tnqqT)>>Smb!FCK*~} z-%Wedn0(l6UmW=qUZZqlguy1mh zX_y9?avX7h2M~B2ie;?(){!6-`y_qCz**Vt*w45OTkE^Vs>?@36OFI-hd#M_dtKCQ zqx5MtMrh2ABIiJS<*Dn|<|Yoi{ntGjYGPu~p`-X>7svDBjc^e8GWhd)*ajoSRs z0dhC2LDZw39B{zxS^YMe@C0|*b6{mB&xiuUpC9{6xoHp4^RvwdDhRloTW!HE`8m0m zhMeJ|yB9b$D^)h8zfyZFO?1nclFVs`m~INL( zPEItxGxu@F%1ro7T%>Nl;sG3lZB2Y*a3epe9hR;sOPs$9wos|JQAu^$jwQyX&@fUe4=_ zYvg$x_y2WT{?w|AgM$M++Q$rdE?>TU;pcyHr37?T6|kz79sG#up>5bh5E8PSzckV} z(eev+v?RaX0ss;SI2Zr6Jw3YC;i&4%*(DezFa zfxw)^5^q?pk7c`1=}x^CJNaw7yPK*k9Kh7oTToYgPEhz8FL3_wy>HLc51! ztR#Kv(Rcd|xsjAjt?L7HgV6YvkP6H~f8&MaAreo4>lqcOJ8HrZxsoT=l=$_q>T2Hp zB!~<1Vtxli_$sLt2=fZ1&IR)gw&&v&5zL037fWa>F*iaWNbJxi-%)gEddq{M6`F|} zS6B#g>a<{1rTYAQ!>*4bwz9ImlB<04T2u`F=&kQwq{e5d_?vAf z61!#xmuuWa*!TW6|1!Wr&*Ng*+3O|BL3)-pa6jh%i93jU0da>qe4(UqiH$tFJ#4AW zX|%#^mJ9fi{9hD`>*5dJ@w(j4*;=(gLr$VF;T*??#&f?hsVFH8STN%X-{V9a>)zHZ z$-y^80vQSqBz7DDUHUeHWY8Y@N|>cr?}L^0 zSP#0~Z@WyCt~F4_ z)U!Wfc!YiO``-wJznyF9C{y;IYY|r$YqH>L_a2T?4)yUM?@kMn))+#$Lpz_~m9IZu z=X+F%`Aj0uK*gr%jceMNvtk$HhsN)Vihn<=@^{_uVe5uB{xt2os%W&6_hj%yLT{Yp z$P@d^R}6${KJ=j$J$eQac|IVYOE%t)meiZ~ByPjiH2PEdOB8WkcWGbfrX2LVH zP@$=ch~Y>GBw^vf-JtP(C~!6H!`YyQ|7&Y$1UuY|tmYkLc#h-g5JE%X+PBt>0&-GH z4SPnO|N7YvBoD(@>1+@1QDDmofmTMD{q5S_PAOK_m1rb%C55c4Gn_*nuL;7dT@ZxFJD95+eWc`=^e#ifj}rI8R+(yy7gZA0hwF zdym*a?sR?n&8ics%>p=Brsj~l&T}uAL z-5qajj%LB^7y62i+#WR0f@kZme^W1ie>+C$oLjzxP_37Ba!|oT{OxdsqSDOZJE*%3 z^Z*0W4Q&O+zx30HKendb$A6~v>q^0z4WhMinv(@V`p=KTuJ{}(q`%kHyY*p zjh3F0_K1+5B}cv4+z0c%B34v5{bldOe;p^D zP{O52*}kqys1Z|u@)o#cCSP`Dr0Zo)>%pybTXQ%1;=c|$n*uTcLn9GLqVr7id-^fwje|vcdy0rNR=z zFLGwLyPlx_&Xp+scT%0Nn-YoJHM@E=)4UPvDem)5h-LdtroIW%m-~|le8r@|`_~yc z?eAGP7i%bOu=Rgu%*K}q*o0l(8Znwb1j=)lEPPQ;=c*ZDta%072}nP5CyY4kZoX=M zHW7;9|MQW2pHnnCDK&|Mf`~#r@dVe2-(J$`5+;0FkLM=b+zdM$^HbDP!#(`$BI@nwh%~CuLdD? zAdb?vv#<8{kZaeuveJHW1$!Ay$+iv>+J74gG2N&2U3?Q-8a}B(D4>@dk(lJJt4c

Ja9u+T98{o>0>&9KuM6R3sUK;@Hl5MX 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

aFJ*EYoL84W!lN566D&buvAoFMUlr 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

g+d(6A`a&8oFq2_&T=smuw&4SDRD{c`d* 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 XZ~-$O07xkY00000NkvXXu0mjf=gwEf literal 0 HcmV?d00001 diff --git a/examples/demo/main.go b/examples/demo/main.go index 4ab6b04..e10c7c0 100644 --- a/examples/demo/main.go +++ b/examples/demo/main.go @@ -25,7 +25,6 @@ var html = ` padding: 0; } .charts { - width: 810px; margin: 10px auto; overflow: hidden; } diff --git a/theme.go b/theme.go index 23a010c..d5d51cd 100644 --- a/theme.go +++ b/theme.go @@ -22,124 +22,178 @@ package charts -import "github.com/wcharczuk/go-chart/v2/drawing" +import ( + "github.com/wcharczuk/go-chart/v2/drawing" +) const ThemeDark = "dark" const ThemeLight = "light" +const ThemeGrafana = "grafana" type Theme struct { - mode string + palette *themeColorPalette } -func NewTheme(mode string) *Theme { - return &Theme{ - mode: mode, +type themeColorPalette struct { + isDarkMode bool + axisStrokeColor drawing.Color + axisSplitLineColor drawing.Color + backgroundColor drawing.Color + textColor drawing.Color + seriesColors []drawing.Color +} + +var palettes = map[string]*themeColorPalette{} + +func init() { + echartSeriesColors := []drawing.Color{ + parseColor("#5470c6"), + parseColor("#91cc75"), + parseColor("#fac858"), + parseColor("#ee6666"), + parseColor("#73c0de"), + parseColor("#3ba272"), + parseColor("#fc8452"), + parseColor("#9a60b4"), + parseColor("#ea7ccc"), } -} - -func (t *Theme) IsDark() bool { - return t.mode == ThemeDark -} - -func (t *Theme) GetAxisStrokeColor() drawing.Color { - if t.IsDark() { - return drawing.Color{ + grafanaSeriesColors := []drawing.Color{ + parseColor("#7EB26D"), + parseColor("#EAB839"), + parseColor("#6ED0E0"), + parseColor("#EF843C"), + parseColor("#E24D42"), + parseColor("#1F78C1"), + parseColor("#705DA0"), + parseColor("#508642"), + } + AddTheme( + ThemeDark, + true, + drawing.Color{ R: 185, G: 184, B: 206, A: 255, - } - } - return drawing.Color{ - R: 110, - G: 112, - B: 121, - A: 255, - } -} - -func (t *Theme) GetAxisSplitLineColor() drawing.Color { - if t.IsDark() { - return drawing.Color{ + }, + drawing.Color{ R: 72, G: 71, B: 83, A: 255, - } - } - return drawing.Color{ - R: 224, - G: 230, - B: 242, - A: 255, - } -} - -func (t *Theme) GetSeriesColor(index int) drawing.Color { - colors := t.GetSeriesColors() - return colors[index%len(colors)] -} - -func (t *Theme) GetSeriesColors() []drawing.Color { - return []drawing.Color{ - { - R: 84, - G: 112, - B: 198, - A: 255, }, - { - R: 145, - G: 204, - B: 117, - A: 255, - }, - { - R: 250, - G: 200, - B: 88, - A: 255, - }, - { - R: 238, - G: 102, - B: 102, - A: 255, - }, - { - R: 115, - G: 192, - B: 222, - A: 255, - }, - } -} - -func (t *Theme) GetBackgroundColor() drawing.Color { - if t.IsDark() { - return drawing.Color{ + drawing.Color{ R: 16, G: 12, B: 42, A: 255, - } - } - return drawing.ColorWhite -} - -func (t *Theme) GetTextColor() drawing.Color { - if t.IsDark() { - return drawing.Color{ + }, + drawing.Color{ R: 238, G: 238, B: 238, A: 255, - } - } - return drawing.Color{ - R: 70, - G: 70, - B: 70, - A: 255, + }, + echartSeriesColors, + ) + + AddTheme( + ThemeLight, + false, + drawing.Color{ + R: 110, + G: 112, + B: 121, + A: 255, + }, + drawing.Color{ + R: 224, + G: 230, + B: 242, + A: 255, + }, + drawing.ColorWhite, + drawing.Color{ + R: 70, + G: 70, + B: 70, + A: 255, + }, + echartSeriesColors, + ) + AddTheme( + ThemeGrafana, + true, + drawing.Color{ + R: 185, + G: 184, + B: 206, + A: 255, + }, + drawing.Color{ + R: 68, + G: 67, + B: 67, + A: 255, + }, + drawing.Color{ + R: 31, + G: 29, + B: 29, + A: 255, + }, + drawing.Color{ + R: 216, + G: 217, + B: 218, + A: 255, + }, + grafanaSeriesColors, + ) +} + +func AddTheme(name string, isDarkMode bool, axisStrokeColor, axisSplitLineColor, backgroundColor, textColor drawing.Color, seriesColors []drawing.Color) { + palettes[name] = &themeColorPalette{ + isDarkMode: isDarkMode, + axisStrokeColor: axisStrokeColor, + axisSplitLineColor: axisSplitLineColor, + backgroundColor: backgroundColor, + textColor: textColor, + seriesColors: seriesColors, } } + +func NewTheme(name string) *Theme { + p, ok := palettes[name] + if !ok { + p = palettes[ThemeLight] + } + return &Theme{ + palette: p, + } +} + +func (t *Theme) IsDark() bool { + return t.palette.isDarkMode +} + +func (t *Theme) GetAxisStrokeColor() drawing.Color { + return t.palette.axisStrokeColor +} + +func (t *Theme) GetAxisSplitLineColor() drawing.Color { + return t.palette.axisSplitLineColor +} + +func (t *Theme) GetSeriesColor(index int) drawing.Color { + colors := t.palette.seriesColors + return colors[index%len(colors)] +} + +func (t *Theme) GetBackgroundColor() drawing.Color { + return t.palette.backgroundColor +} + +func (t *Theme) GetTextColor() drawing.Color { + return t.palette.textColor +} diff --git a/theme_test.go b/theme_test.go index 7caf273..bf22afd 100644 --- a/theme_test.go +++ b/theme_test.go @@ -64,71 +64,6 @@ func TestTheme(t *testing.T) { A: 255, }, lightTheme.GetAxisSplitLineColor()) - assert.Equal([]drawing.Color{ - { - R: 84, - G: 112, - B: 198, - A: 255, - }, - { - R: 145, - G: 204, - B: 117, - A: 255, - }, - { - R: 250, - G: 200, - B: 88, - A: 255, - }, - { - R: 238, - G: 102, - B: 102, - A: 255, - }, - { - R: 115, - G: 192, - B: 222, - A: 255, - }, - }, darkTheme.GetSeriesColors()) - assert.Equal([]drawing.Color{ - { - R: 84, - G: 112, - B: 198, - A: 255, - }, - { - R: 145, - G: 204, - B: 117, - A: 255, - }, - { - R: 250, - G: 200, - B: 88, - A: 255, - }, - { - R: 238, - G: 102, - B: 102, - A: 255, - }, - { - R: 115, - G: 192, - B: 222, - A: 255, - }, - }, lightTheme.GetSeriesColors()) - assert.Equal(drawing.Color{ R: 16, G: 12, From 7ea306b7f46ee1d718201ca792c82f12b23ec805 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 09:26:11 +0800 Subject: [PATCH 088/251] test: fix test --- echarts.go | 2 +- echarts_test.go | 12 ++++++++---- go.mod | 2 +- line_chart_test.go | 3 ++- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/echarts.go b/echarts.go index dc2e761..db50e5d 100644 --- a/echarts.go +++ b/echarts.go @@ -76,7 +76,7 @@ type EChartsSeriesData struct { } type _EChartsSeriesData EChartsSeriesData -var numericRep = regexp.MustCompile("^[-+]?[0-9]+(?:\\.[0-9]+)?$") +var numericRep = regexp.MustCompile(`^[-+]?[0-9]+(?:\\.[0-9]+)?$`) func (es *EChartsSeriesData) UnmarshalJSON(data []byte) error { data = bytes.TrimSpace(data) diff --git a/echarts_test.go b/echarts_test.go index d80ecbb..67fabf6 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -165,7 +165,8 @@ func TestEChartsPadding(t *testing.T) { ep := EChartsPadding{} - ep.UnmarshalJSON([]byte(`10`)) + err := ep.UnmarshalJSON([]byte(`10`)) + assert.Nil(err) assert.Equal(EChartsPadding{ Box: chart.Box{ Top: 10, @@ -176,7 +177,8 @@ func TestEChartsPadding(t *testing.T) { }, ep) ep = EChartsPadding{} - ep.UnmarshalJSON([]byte(`[10, 20]`)) + err = ep.UnmarshalJSON([]byte(`[10, 20]`)) + assert.Nil(err) assert.Equal(EChartsPadding{ Box: chart.Box{ Top: 10, @@ -187,7 +189,8 @@ func TestEChartsPadding(t *testing.T) { }, ep) ep = EChartsPadding{} - ep.UnmarshalJSON([]byte(`[10, 20, 30]`)) + err = ep.UnmarshalJSON([]byte(`[10, 20, 30]`)) + assert.Nil(err) assert.Equal(EChartsPadding{ Box: chart.Box{ Top: 10, @@ -198,7 +201,8 @@ func TestEChartsPadding(t *testing.T) { }, ep) ep = EChartsPadding{} - ep.UnmarshalJSON([]byte(`[10, 20, 30, 40]`)) + err = ep.UnmarshalJSON([]byte(`[10, 20, 30, 40]`)) + assert.Nil(err) assert.Equal(EChartsPadding{ Box: chart.Box{ Top: 10, diff --git a/go.mod b/go.mod index b21ce18..5f58f2d 100644 --- a/go.mod +++ b/go.mod @@ -4,13 +4,13 @@ go 1.17 require ( github.com/dustin/go-humanize v1.0.0 + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 github.com/stretchr/testify v1.7.0 github.com/wcharczuk/go-chart/v2 v2.1.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect diff --git a/line_chart_test.go b/line_chart_test.go index 62d0a40..9f5d9af 100644 --- a/line_chart_test.go +++ b/line_chart_test.go @@ -60,7 +60,7 @@ func TestLineChartRender(t *testing.T) { d: d, } f, _ := chart.GetDefaultFont() - lineChartRender(lineChartOption{ + _, err = lineChartRender(lineChartOption{ Font: f, SeriesList: SeriesList{ { @@ -90,6 +90,7 @@ func TestLineChartRender(t *testing.T) { }), }, }, &result) + assert.Nil(err) data, err := d.Bytes() assert.Nil(err) assert.Equal("\\n56.66206090", string(data)) From c39306034c90a000608bcc4ff549ca59b5e44ccf Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 10:23:13 +0800 Subject: [PATCH 089/251] docs: update readme --- .gitignore | 3 +- README.md | 129 ++++++++++++++++++++++++------ assets/go-line-chart.png | Bin 40531 -> 0 bytes echarts.go | 6 +- examples/basic/main.go | 91 +++++++++++++++++++++ examples/{demo => charts}/main.go | 0 6 files changed, 199 insertions(+), 30 deletions(-) delete mode 100644 assets/go-line-chart.png create mode 100644 examples/basic/main.go rename examples/{demo => charts}/main.go (100%) diff --git a/.gitignore b/.gitignore index 2ac8a25..2e33342 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ # Dependency directories (remove the comment below to include it) # vendor/ *.png -*.svg \ No newline at end of file +*.svg +tmp diff --git a/README.md b/README.md index b349d5b..c6be480 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,9 @@ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-charts/blob/master/LICENSE) [![Build Status](https://github.com/vicanso/go-charts/workflows/Test/badge.svg)](https://github.com/vicanso/go-charts/actions) -`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,无其它模块的依赖纯golang的实现,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可,`go-charts`兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图(两种模式): +`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,支持`svg`与`png`两种方式的输出,支持三种主题`light`, `dark`以及`grafana`。 +`Apache ECharts`在前端开发中得到众多开发者的认可,因此`go-charts`提供了兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的图表截图(主题为light与grafana): + ![go-charts](./assets/go-charts.png) @@ -14,24 +16,74 @@ ## 示例 -`go-charts`兼容了`echarts`的参数配置,可简单的使用json形式的配置字符串则可快速生成图表。 + +下面的示例为`go-charts`两种方式的参数配置:golang的参数配置、echarts的JSON配置,输出相同的折线图。 +更多的示例参考:`./examples/`目录 ```go package main import ( "os" + "path/filepath" charts "github.com/vicanso/go-charts" ) -func main() { - buf, err := charts.RenderEChartsToPNG(`{ +func writeFile(file string, buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file = filepath.Join(tmpPath, file) + err = os.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func chartsRender() ([]byte, error) { + d, err := charts.Render(charts.ChartOption{ + Type: charts.ChartOutputPNG, + Title: charts.TitleOption{ + Text: "Line", + }, + XAxis: charts.NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + SeriesList: charts.SeriesList{ + charts.NewSeriesFromValues([]float64{ + 150, + 230, + 224, + 218, + 135, + 147, + 260, + }), + }, + }) + if err != nil { + return nil, err + } + return d.Bytes() +} + +func echartsRender() ([]byte, error) { + return charts.RenderEChartsToPNG(`{ "title": { "text": "Line" }, "xAxis": { - "type": "category", "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] }, "series": [ @@ -40,27 +92,50 @@ func main() { } ] }`) - if err != nil { - panic(err) - } - os.WriteFile("output.png", buf, 0600) } + +type Render func() ([]byte, error) + +func main() { + m := map[string]Render{ + "charts-line.png": chartsRender, + "echarts-line.png": echartsRender, + } + for name, fn := range m { + buf, err := fn() + if err != nil { + panic(err) + } + err = writeFile(name, buf) + if err != nil { + panic(err) + } + } +} + ``` -## 参数说明 +## ECharts参数说明 -- `theme` 颜色主题,支持`dark`与`light`模式,默认为`light` -- `padding` 图表的内边距,单位px。支持以下几种模式的设置 +标记为[非echarts配置]的参数为新增参数,可根据实际使用场景添加。 + +- `type` 画布类型,支持`svg`与`png`,默认为`svg` +- `theme` 颜色主题,支持`dark`、`light`以及`grafana`模式,默认为`light` +- `fontFamily` 字体,全局的字体设置[非echarts配置] +- `padding` 图表的内边距,单位px。支持以下几种模式的设置[非echarts配置] - `padding: 5` 设置内边距为5 - `padding: [5, 10]` 设置上下的内边距为 5,左右的内边距为 10 - `padding:[5, 10, 5, 10]` 分别设置`上右下左`边距 +- `box` 图表的区域,以{"left": Int, "right": Int, "top": Int, "bottom": Int}的形式配置,[非echarts配置] +- `width` 画布宽度,默认为600[非echarts配置] +- `height` 画布高度,默认为400[非echarts配置] - `title` 图表标题,包括标题内容、高度、颜色等 - - `title.text` 标题内容 + - `title.text` 标题文本,支持以`\n`的形式换行 + - `title.subtext` 副标题文本,支持以`\n`的形式换行 - `title.left` 标题与容器左侧的距离,可设置为`left`, `right`, `center`, `20%` 以及 `20` 这样的具体数值 - `title.top` 标题与容器顶部的距离,暂仅支持具体数值,如`20` - `title.textStyle.color` 标题文字颜色 - `title.textStyle.fontSize` 标题文字字体大小 - - `title.textStyle.height` 标题高度 - `title.textStyle.fontFamily` 标题文字的字体系列,需要注意此配置是会影响整个图表的字体 - `xAxis` 直角坐标系grid中的x轴,由于go-charts仅支持单一个x轴,因此若参数为数组多个x轴,只使用第一个配置 - `xAxis.boundaryGap` 坐标轴两边留白策略,仅支持三种设置方式`null`, `true`或者`false`。`null`或`true`时则数据点展示在两个刻度中间 @@ -70,21 +145,27 @@ func main() { - `yAxis.min` 坐标轴刻度最小值,若不设置则自动计算 - `yAxis.max` 坐标轴刻度最大值,若不设置则自动计算 - `yAxis.axisLabel.formatter` 刻度标签的内容格式器,如`"formatter": "{value} kg"` + - `yAxis.axisLine.lineStyle.color` 坐标轴颜色 - `legend` 图表中不同系列的标记 + - `legend.show` 图例是否显示,如果不需要展示需要设置为`false` - `legend.data` 图例的数据数组,为字符串数组,如["Email", "Video Ads"] - - `legend.align` 图例标记和文本的对齐,默认为标记靠左`left` + - `legend.align` 图例标记和文本的对齐,可设置为`left`或者`right`,默认为标记靠左`left` - `legend.padding` legend的padding,配置方式与图表的`padding`一致 - - `legend.left` legend离容器左侧的距离,其值可以为具体的像素值(20)或百分比(20%) - - `legend.right` legend离容器右侧的距离,其值可以为具体的像素值(20)或百分比(20%) + - `legend.left` legend离容器左侧的距离,其值可以为具体的像素值(20)或百分比(20%)、`left`或者`right` + - `legend.top` legend离容器顶部的距离,暂仅支持数值形式 - `series` 图表的数据项列表 + - `series.name` 图表的名称,与`legend.data`对应,两者只只设置其一 - `series.type` 图表的展示类型,暂支持`line`, `bar`以及`pie`,需要注意`pie`只能单独使用 + - `series.radius` 饼图的半径值,如`50%`,默认为`40%` + - `series.yAxisIndex` 该数据项使用的y轴,默认为0,对yAxis的配置对应 - `series.label.show` 是否显示文本标签(默认为对应的值) - `series.label.distance` 距离图形元素的距离 - - `series.yAxisIndex` 该数据项使用的y轴,默认为0,对yAxis的配置对应 - - `series.itemStyle.color` 该数据项展示时使用的颜色 + - `series.label.color` 文本标签的颜色 + - `series.itemStyle.color` 该数据项展示时使用的颜色 - `series.data` 数据项对应的数据数组,支持以下形式的数据: - `数值` 常用形式,数组数据为浮点数组,如[1.1, 2,3, 5.2] - `结构体` pie图表或bar图表中指定样式使用,如[{"value": 1048, "name": "Search Engine"},{"value": 735,"name": "Direct"}] +- `children` 嵌套的子图表参数列表,图表支持嵌套的形式非echarts配置] ## 性能 @@ -92,15 +173,11 @@ func main() { 简单的图表生成PNG在20ms左右,而SVG的性能则更快,性能上比起使用`chrome headless`加载`echarts`图表展示页面再截图生成的方式大幅度提升,满足简单的图表生成需求。 ```bash -goos: darwin -goarch: amd64 -pkg: github.com/vicanso/go-charts -cpu: Intel(R) Core(TM) i5-8257U CPU @ 1.40GHz -BenchmarkEChartsRenderPNG-8 60 17765045 ns/op 2492854 B/op 1007 allocs/op -BenchmarkEChartsRenderSVG-8 282 4303042 ns/op 32622688 B/op 2983 allocs/op +BenchmarkMultiChartPNGRender-8 78 15216336 ns/op 2298308 B/op 1148 allocs/op +BenchmarkMultiChartSVGRender-8 367 3356325 ns/op 20597282 B/op 3088 allocs/op ``` ## 中文字符 -默认使用的字符为`Roboto`为英文字体库,因此如果需要显示中文字符需要增加中文字体库,`InstallFont`函数可添加对应的字体库,成功添加之后则指定`title.textStyle.fontFamily`即可。 +默认使用的字符为`roboto`为英文字体库,因此如果需要显示中文字符需要增加中文字体库,`InstallFont`函数可添加对应的字体库,成功添加之后则指定`title.textStyle.fontFamily`即可。 在浏览器中使用`svg`时,如果指定的`fontFamily`不支持中文字符,展示的中文并不会乱码,但是会导致在计算字符宽度等错误。 diff --git a/assets/go-line-chart.png b/assets/go-line-chart.png deleted file mode 100644 index 71c9eb14d6197450572322797e4852159f557f8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40531 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

aFJ*EYoL84W!lN566D&buvAoFMUlr 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

g+d(6A`a&8oFq2_&T=smuw&4SDRD{c`d* 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 XZ~-$O07xkY00000NkvXXu0mjf=gwEf diff --git a/echarts.go b/echarts.go index db50e5d..6de8dc4 100644 --- a/echarts.go +++ b/echarts.go @@ -128,9 +128,9 @@ type EChartsYAxisData struct { AxisLabel EChartsAxisLabel `json:"axisLabel"` AxisLine struct { LineStyle struct { - Color string - } - } + Color string `json:"color"` + } `json:"lineStyle"` + } `json:"axisLine"` } type EChartsYAxis struct { Data []EChartsYAxisData `json:"data"` diff --git a/examples/basic/main.go b/examples/basic/main.go new file mode 100644 index 0000000..035a7b4 --- /dev/null +++ b/examples/basic/main.go @@ -0,0 +1,91 @@ +package main + +import ( + "os" + "path/filepath" + + charts "github.com/vicanso/go-charts" +) + +func writeFile(file string, buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file = filepath.Join(tmpPath, file) + err = os.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func chartsRender() ([]byte, error) { + d, err := charts.Render(charts.ChartOption{ + Type: charts.ChartOutputPNG, + Title: charts.TitleOption{ + Text: "Line", + }, + XAxis: charts.NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + SeriesList: charts.SeriesList{ + charts.NewSeriesFromValues([]float64{ + 150, + 230, + 224, + 218, + 135, + 147, + 260, + }), + }, + }) + if err != nil { + return nil, err + } + return d.Bytes() +} + +func echartsRender() ([]byte, error) { + return charts.RenderEChartsToPNG(`{ + "title": { + "text": "Line" + }, + "xAxis": { + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "data": [150, 230, 224, 218, 135, 147, 260] + } + ] + }`) +} + +type Render func() ([]byte, error) + +func main() { + m := map[string]Render{ + "charts-line.png": chartsRender, + "echarts-line.png": echartsRender, + } + for name, fn := range m { + buf, err := fn() + if err != nil { + panic(err) + } + err = writeFile(name, buf) + if err != nil { + panic(err) + } + } +} diff --git a/examples/demo/main.go b/examples/charts/main.go similarity index 100% rename from examples/demo/main.go rename to examples/charts/main.go From ae02450bb4916ddb6688fe129c2c88bc03d1f5fe Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 10:29:39 +0800 Subject: [PATCH 090/251] docs: update readme --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index c6be480..d0d9a8c 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ [![Build Status](https://github.com/vicanso/go-charts/workflows/Test/badge.svg)](https://github.com/vicanso/go-charts/actions) `go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,支持`svg`与`png`两种方式的输出,支持三种主题`light`, `dark`以及`grafana`。 + `Apache ECharts`在前端开发中得到众多开发者的认可,因此`go-charts`提供了兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的图表截图(主题为light与grafana): @@ -162,6 +163,11 @@ func main() { - `series.label.distance` 距离图形元素的距离 - `series.label.color` 文本标签的颜色 - `series.itemStyle.color` 该数据项展示时使用的颜色 + - `series.markPoint` 图表的标注配置 + - `series.markPoint.symbolSize` 标注的大小,默认为30 + - `series.markPoint.data` 标注类型,仅支持数组形式,其类型只支持`max`与`min`,如:`[{"type": "max"}, {"type": "min"}] + - `series.markLine` 图表的标线配置 + - `series.markPoint.data` 标线类型,仅支持数组形式,其类型只支持`max`、`min`以及`average`,如:`[{"type": "max"}, {"type": "min"}, {"type": "average"}] - `series.data` 数据项对应的数据数组,支持以下形式的数据: - `数值` 常用形式,数组数据为浮点数组,如[1.1, 2,3, 5.2] - `结构体` pie图表或bar图表中指定样式使用,如[{"value": 1048, "name": "Search Engine"},{"value": 735,"name": "Direct"}] From 7f91f2d5ef4792621aeb42082541899a00441a0f Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 10:38:38 +0800 Subject: [PATCH 091/251] fix: fix write file for go version < 1.16 --- examples/basic/main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/basic/main.go b/examples/basic/main.go index 035a7b4..12c0fd6 100644 --- a/examples/basic/main.go +++ b/examples/basic/main.go @@ -1,6 +1,7 @@ package main import ( + "io/ioutil" "os" "path/filepath" @@ -15,7 +16,7 @@ func writeFile(file string, buf []byte) error { } file = filepath.Join(tmpPath, file) - err = os.WriteFile(file, buf, 0600) + err = ioutil.WriteFile(file, buf, 0600) if err != nil { return err } From edc01d3b37e97f8e8616dc33f9e3565ac5f5707f Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 12:35:11 +0800 Subject: [PATCH 092/251] docs: update readme --- README.md | 86 +++-------------------- README_zh.md | 188 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 198 insertions(+), 76 deletions(-) create mode 100644 README_zh.md diff --git a/README.md b/README.md index d0d9a8c..ce52559 100644 --- a/README.md +++ b/README.md @@ -3,23 +3,23 @@ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-charts/blob/master/LICENSE) [![Build Status](https://github.com/vicanso/go-charts/workflows/Test/badge.svg)](https://github.com/vicanso/go-charts/actions) -`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,支持`svg`与`png`两种方式的输出,支持三种主题`light`, `dark`以及`grafana`。 +[中文](./README_zh.md) -`Apache ECharts`在前端开发中得到众多开发者的认可,因此`go-charts`提供了兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的图表截图(主题为light与grafana): +`go-charts` base on [go-chart](https://github.com/wcharczuk/go-chart),it is simpler way for generating charts, which supports `svg` and `png` format and three themes: `light`, `dark` and `grafana`. +`Apache ECharts` is popular among Front-end developers, so `go-charts` supports the option of `Apache ECharts`. Developers can generate charts almost the same as `Apache ECharts`. + +Screenshot of common charts, the left part is light theme, the right part is grafana theme. ![go-charts](./assets/go-charts.png) -## 支持图表类型 +## Chart Type -暂仅支持三种的图表类型:`line`, `bar` 以及 `pie` +Support three chart types: `line`, `bar` and `pie`. +## Example -## 示例 - - -下面的示例为`go-charts`两种方式的参数配置:golang的参数配置、echarts的JSON配置,输出相同的折线图。 -更多的示例参考:`./examples/`目录 +The example is for `golang option` and `echarts option`, more examples can be found in the `./examples/` directory. ```go package main @@ -113,77 +113,11 @@ func main() { } } } - ``` -## ECharts参数说明 - -标记为[非echarts配置]的参数为新增参数,可根据实际使用场景添加。 - -- `type` 画布类型,支持`svg`与`png`,默认为`svg` -- `theme` 颜色主题,支持`dark`、`light`以及`grafana`模式,默认为`light` -- `fontFamily` 字体,全局的字体设置[非echarts配置] -- `padding` 图表的内边距,单位px。支持以下几种模式的设置[非echarts配置] - - `padding: 5` 设置内边距为5 - - `padding: [5, 10]` 设置上下的内边距为 5,左右的内边距为 10 - - `padding:[5, 10, 5, 10]` 分别设置`上右下左`边距 -- `box` 图表的区域,以{"left": Int, "right": Int, "top": Int, "bottom": Int}的形式配置,[非echarts配置] -- `width` 画布宽度,默认为600[非echarts配置] -- `height` 画布高度,默认为400[非echarts配置] -- `title` 图表标题,包括标题内容、高度、颜色等 - - `title.text` 标题文本,支持以`\n`的形式换行 - - `title.subtext` 副标题文本,支持以`\n`的形式换行 - - `title.left` 标题与容器左侧的距离,可设置为`left`, `right`, `center`, `20%` 以及 `20` 这样的具体数值 - - `title.top` 标题与容器顶部的距离,暂仅支持具体数值,如`20` - - `title.textStyle.color` 标题文字颜色 - - `title.textStyle.fontSize` 标题文字字体大小 - - `title.textStyle.fontFamily` 标题文字的字体系列,需要注意此配置是会影响整个图表的字体 -- `xAxis` 直角坐标系grid中的x轴,由于go-charts仅支持单一个x轴,因此若参数为数组多个x轴,只使用第一个配置 - - `xAxis.boundaryGap` 坐标轴两边留白策略,仅支持三种设置方式`null`, `true`或者`false`。`null`或`true`时则数据点展示在两个刻度中间 - - `xAxis.splitNumber` 坐标轴的分割段数,需要注意的是这个分割段数只是个预估值,最后实际显示的段数会在这个基础上根据分割后坐标轴刻度显示的易读程度作调整 - - `xAxis.data` x轴的展示文案,暂只支持字符串数组,如["Mon", "Tue"],其数量需要与展示点一致 -- `yAxis` 直角坐标系grid中的y轴,最多支持两个y轴 - - `yAxis.min` 坐标轴刻度最小值,若不设置则自动计算 - - `yAxis.max` 坐标轴刻度最大值,若不设置则自动计算 - - `yAxis.axisLabel.formatter` 刻度标签的内容格式器,如`"formatter": "{value} kg"` - - `yAxis.axisLine.lineStyle.color` 坐标轴颜色 -- `legend` 图表中不同系列的标记 - - `legend.show` 图例是否显示,如果不需要展示需要设置为`false` - - `legend.data` 图例的数据数组,为字符串数组,如["Email", "Video Ads"] - - `legend.align` 图例标记和文本的对齐,可设置为`left`或者`right`,默认为标记靠左`left` - - `legend.padding` legend的padding,配置方式与图表的`padding`一致 - - `legend.left` legend离容器左侧的距离,其值可以为具体的像素值(20)或百分比(20%)、`left`或者`right` - - `legend.top` legend离容器顶部的距离,暂仅支持数值形式 -- `series` 图表的数据项列表 - - `series.name` 图表的名称,与`legend.data`对应,两者只只设置其一 - - `series.type` 图表的展示类型,暂支持`line`, `bar`以及`pie`,需要注意`pie`只能单独使用 - - `series.radius` 饼图的半径值,如`50%`,默认为`40%` - - `series.yAxisIndex` 该数据项使用的y轴,默认为0,对yAxis的配置对应 - - `series.label.show` 是否显示文本标签(默认为对应的值) - - `series.label.distance` 距离图形元素的距离 - - `series.label.color` 文本标签的颜色 - - `series.itemStyle.color` 该数据项展示时使用的颜色 - - `series.markPoint` 图表的标注配置 - - `series.markPoint.symbolSize` 标注的大小,默认为30 - - `series.markPoint.data` 标注类型,仅支持数组形式,其类型只支持`max`与`min`,如:`[{"type": "max"}, {"type": "min"}] - - `series.markLine` 图表的标线配置 - - `series.markPoint.data` 标线类型,仅支持数组形式,其类型只支持`max`、`min`以及`average`,如:`[{"type": "max"}, {"type": "min"}, {"type": "average"}] - - `series.data` 数据项对应的数据数组,支持以下形式的数据: - - `数值` 常用形式,数组数据为浮点数组,如[1.1, 2,3, 5.2] - - `结构体` pie图表或bar图表中指定样式使用,如[{"value": 1048, "name": "Search Engine"},{"value": 735,"name": "Direct"}] -- `children` 嵌套的子图表参数列表,图表支持嵌套的形式非echarts配置] - -## 性能 - - -简单的图表生成PNG在20ms左右,而SVG的性能则更快,性能上比起使用`chrome headless`加载`echarts`图表展示页面再截图生成的方式大幅度提升,满足简单的图表生成需求。 +## Performance ```bash BenchmarkMultiChartPNGRender-8 78 15216336 ns/op 2298308 B/op 1148 allocs/op BenchmarkMultiChartSVGRender-8 367 3356325 ns/op 20597282 B/op 3088 allocs/op ``` - -## 中文字符 - -默认使用的字符为`roboto`为英文字体库,因此如果需要显示中文字符需要增加中文字体库,`InstallFont`函数可添加对应的字体库,成功添加之后则指定`title.textStyle.fontFamily`即可。 -在浏览器中使用`svg`时,如果指定的`fontFamily`不支持中文字符,展示的中文并不会乱码,但是会导致在计算字符宽度等错误。 diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..15c1c9f --- /dev/null +++ b/README_zh.md @@ -0,0 +1,188 @@ +# go-charts + +[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-charts/blob/master/LICENSE) +[![Build Status](https://github.com/vicanso/go-charts/workflows/Test/badge.svg)](https://github.com/vicanso/go-charts/actions) + +`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart),更简单方便的形式生成数据图表,支持`svg`与`png`两种方式的输出,支持三种主题`light`, `dark`以及`grafana`。 + +`Apache ECharts`在前端开发中得到众多开发者的认可,因此`go-charts`提供了兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的图表截图(主题为light与grafana): + + +![go-charts](./assets/go-charts.png) + +## 支持图表类型 + +暂仅支持三种的图表类型:`line`, `bar` 以及 `pie` + + +## 示例 + + +下面的示例为`go-charts`两种方式的参数配置:golang的参数配置、echarts的JSON配置,输出相同的折线图。 +更多的示例参考:`./examples/`目录 + +```go +package main + +import ( + "os" + "path/filepath" + + charts "github.com/vicanso/go-charts" +) + +func writeFile(file string, buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file = filepath.Join(tmpPath, file) + err = os.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func chartsRender() ([]byte, error) { + d, err := charts.Render(charts.ChartOption{ + Type: charts.ChartOutputPNG, + Title: charts.TitleOption{ + Text: "Line", + }, + XAxis: charts.NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + SeriesList: charts.SeriesList{ + charts.NewSeriesFromValues([]float64{ + 150, + 230, + 224, + 218, + 135, + 147, + 260, + }), + }, + }) + if err != nil { + return nil, err + } + return d.Bytes() +} + +func echartsRender() ([]byte, error) { + return charts.RenderEChartsToPNG(`{ + "title": { + "text": "Line" + }, + "xAxis": { + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "data": [150, 230, 224, 218, 135, 147, 260] + } + ] + }`) +} + +type Render func() ([]byte, error) + +func main() { + m := map[string]Render{ + "charts-line.png": chartsRender, + "echarts-line.png": echartsRender, + } + for name, fn := range m { + buf, err := fn() + if err != nil { + panic(err) + } + err = writeFile(name, buf) + if err != nil { + panic(err) + } + } +} +``` + +## ECharts参数说明 + +标记为[非echarts配置]的参数为新增参数,可根据实际使用场景添加。 + +- `type` 画布类型,支持`svg`与`png`,默认为`svg` +- `theme` 颜色主题,支持`dark`、`light`以及`grafana`模式,默认为`light` +- `fontFamily` 字体,全局的字体设置[非echarts配置] +- `padding` 图表的内边距,单位px。支持以下几种模式的设置[非echarts配置] + - `padding: 5` 设置内边距为5 + - `padding: [5, 10]` 设置上下的内边距为 5,左右的内边距为 10 + - `padding:[5, 10, 5, 10]` 分别设置`上右下左`边距 +- `box` 图表的区域,以{"left": Int, "right": Int, "top": Int, "bottom": Int}的形式配置,[非echarts配置] +- `width` 画布宽度,默认为600[非echarts配置] +- `height` 画布高度,默认为400[非echarts配置] +- `title` 图表标题,包括标题内容、高度、颜色等 + - `title.text` 标题文本,支持以`\n`的形式换行 + - `title.subtext` 副标题文本,支持以`\n`的形式换行 + - `title.left` 标题与容器左侧的距离,可设置为`left`, `right`, `center`, `20%` 以及 `20` 这样的具体数值 + - `title.top` 标题与容器顶部的距离,暂仅支持具体数值,如`20` + - `title.textStyle.color` 标题文字颜色 + - `title.textStyle.fontSize` 标题文字字体大小 + - `title.textStyle.fontFamily` 标题文字的字体系列,需要注意此配置是会影响整个图表的字体 +- `xAxis` 直角坐标系grid中的x轴,由于go-charts仅支持单一个x轴,因此若参数为数组多个x轴,只使用第一个配置 + - `xAxis.boundaryGap` 坐标轴两边留白策略,仅支持三种设置方式`null`, `true`或者`false`。`null`或`true`时则数据点展示在两个刻度中间 + - `xAxis.splitNumber` 坐标轴的分割段数,需要注意的是这个分割段数只是个预估值,最后实际显示的段数会在这个基础上根据分割后坐标轴刻度显示的易读程度作调整 + - `xAxis.data` x轴的展示文案,暂只支持字符串数组,如["Mon", "Tue"],其数量需要与展示点一致 +- `yAxis` 直角坐标系grid中的y轴,最多支持两个y轴 + - `yAxis.min` 坐标轴刻度最小值,若不设置则自动计算 + - `yAxis.max` 坐标轴刻度最大值,若不设置则自动计算 + - `yAxis.axisLabel.formatter` 刻度标签的内容格式器,如`"formatter": "{value} kg"` + - `yAxis.axisLine.lineStyle.color` 坐标轴颜色 +- `legend` 图表中不同系列的标记 + - `legend.show` 图例是否显示,如果不需要展示需要设置为`false` + - `legend.data` 图例的数据数组,为字符串数组,如["Email", "Video Ads"] + - `legend.align` 图例标记和文本的对齐,可设置为`left`或者`right`,默认为标记靠左`left` + - `legend.padding` legend的padding,配置方式与图表的`padding`一致 + - `legend.left` legend离容器左侧的距离,其值可以为具体的像素值(20)或百分比(20%)、`left`或者`right` + - `legend.top` legend离容器顶部的距离,暂仅支持数值形式 +- `series` 图表的数据项列表 + - `series.name` 图表的名称,与`legend.data`对应,两者只只设置其一 + - `series.type` 图表的展示类型,暂支持`line`, `bar`以及`pie`,需要注意`pie`只能单独使用 + - `series.radius` 饼图的半径值,如`50%`,默认为`40%` + - `series.yAxisIndex` 该数据项使用的y轴,默认为0,对yAxis的配置对应 + - `series.label.show` 是否显示文本标签(默认为对应的值) + - `series.label.distance` 距离图形元素的距离 + - `series.label.color` 文本标签的颜色 + - `series.itemStyle.color` 该数据项展示时使用的颜色 + - `series.markPoint` 图表的标注配置 + - `series.markPoint.symbolSize` 标注的大小,默认为30 + - `series.markPoint.data` 标注类型,仅支持数组形式,其类型只支持`max`与`min`,如:`[{"type": "max"}, {"type": "min"}] + - `series.markLine` 图表的标线配置 + - `series.markPoint.data` 标线类型,仅支持数组形式,其类型只支持`max`、`min`以及`average`,如:`[{"type": "max"}, {"type": "min"}, {"type": "average"}] + - `series.data` 数据项对应的数据数组,支持以下形式的数据: + - `数值` 常用形式,数组数据为浮点数组,如[1.1, 2,3, 5.2] + - `结构体` pie图表或bar图表中指定样式使用,如[{"value": 1048, "name": "Search Engine"},{"value": 735,"name": "Direct"}] +- `children` 嵌套的子图表参数列表,图表支持嵌套的形式非echarts配置] + +## 性能 + + +简单的图表生成PNG在20ms左右,而SVG的性能则更快,性能上比起使用`chrome headless`加载`echarts`图表展示页面再截图生成的方式大幅度提升,满足简单的图表生成需求。 + +```bash +BenchmarkMultiChartPNGRender-8 78 15216336 ns/op 2298308 B/op 1148 allocs/op +BenchmarkMultiChartSVGRender-8 367 3356325 ns/op 20597282 B/op 3088 allocs/op +``` + +## 中文字符 + +默认使用的字符为`roboto`为英文字体库,因此如果需要显示中文字符需要增加中文字体库,`InstallFont`函数可添加对应的字体库,成功添加之后则指定`title.textStyle.fontFamily`即可。 +在浏览器中使用`svg`时,如果指定的`fontFamily`不支持中文字符,展示的中文并不会乱码,但是会导致在计算字符宽度等错误。 From 78ba3017ae76f1e6447546e6e288f95f6dac8e2f Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 13:55:39 +0800 Subject: [PATCH 093/251] docs: update readme --- README.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++- README_zh.md | 22 ++++++++++--------- 2 files changed, 72 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ce52559..6710cdd 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,9 @@ Screenshot of common charts, the left part is light theme, the right part is grafana theme. -![go-charts](./assets/go-charts.png) +

+ go-charts +

## Chart Type @@ -115,8 +117,65 @@ func main() { } ``` +## ECharts Option + +The name with `[]` is new parameter, others are the same as `echarts`. + +- `[type]` The canvas type, support `svg` and `png`, default is `svg` +- `[theme]` The theme, support `dark`, `light` and `grafana`, default is `light` +- `[fontFamily]` The font family for chart +- `[padding]` The padding of chart +- `[box]` The canvas box of chart +- `[width]` The width of chart +- `[height]` The height of chart +- `title` Title component, including main title and subtitle + - `title.text` The main title text, supporting for \n for newlines + - `title.subtext`Subtitle text, supporting for \n for newlines + - `title.left` Distance between title component and the left side of the container. Left value can be instant pixel value like 20; it can also be a percentage value relative to container width like '20%'; and it can also be 'left', 'center', or 'right'. + - `title.top` Distance between title component and the top side of the container. Top value can be instant pixel value like 20 + - `title.textStyle.color` Text color for title + - `title.textStyle.fontSize` Text font size for title + - `title.textStyle.fontFamily` Text font family for title, it will change the font family for chart +- `xAxis` The x axis in cartesian(rectangular) coordinate. `go-charts` only support one x axis. + - `xAxis.boundaryGap` The boundary gap on both sides of a coordinate axis. The setting and behavior of category axes and non-category axes are different. If set `null` or `true`, the label appear in the center part of two axis ticks. + - `xAxis.splitNumber` Number of segments that the axis is split into. Note that this number serves only as a recommendation, and the true segments may be adjusted based on readability + - `xAxis.data` Category data, only support string array. +- `yAxis` The y axis in cartesian(rectangular) coordinate, it support 2 y axis + - `yAxis.min` The minimum value of axis. It will be automatically computed to make sure axis tick is equally distributed when not set + - `yAxis.max` The maximum value of axis. It will be automatically computed to make sure axis tick is equally distributed when not se. + - `yAxis.axisLabel.formatter` Formatter of axis label, which supports string template: `"formatter": "{value} kg"` + - `yAxis.axisLine.lineStyle.color` The color for line +- `legend` Legend component + - `legend.show` Whether to show legend + - `legend.data` Data array of legend, only support string array: ["Email", "Video Ads"] + - `legend.align` Legend marker and text aligning. Support `left` and `right`, default is `left` + - `legend.padding` legend space around content + - `legend.left` Distance between legend component and the left side of the container. Left value can be instant pixel value like 20; it can also be a percentage value relative to container width like '20%'; and it can also be 'left', 'center', or 'right'. + - `legend.top` Distance between legend component and the top side of the container. Top value can be instant pixel value like 20 +- `series` The series for chart + - `series.name` Series name used for displaying in legend. + - `series.type` Series type: `line`, `bar` or`pie` + - `series.radius` Radius of Pie chart:`50%`, default is `40%` + - `series.yAxisIndex` Index of y axis to combine with, which is useful for multiple y axes in one chart + - `series.label.show` Whether to show label + - `series.label.distance` Distance to the host graphic element + - `series.label.color` Label color + - `series.itemStyle.color` Color for the series's item + - `series.markPoint` Mark point in a chart. + - `series.markPoint.symbolSize` Symbol size, default is `30` + - `series.markPoint.data` Data array for mark points, each of which is an object and the type only support `max` and `min`: `[{"type": "max"}, {"type": "min"}]` + - `series.markLine` Mark line in a chart + - `series.markPoint.data` Data array for mark points, each of which is an object and the type only support `max`, `min` and `average`: `[{"type": "max"}, {"type": "min"}, {"type": "average"}]`` + - `series.data` Data array of series, which can be in the following forms: + - `value` It's a float array: [1.1, 2,3, 5.2] + - `object` It's a object value array: [{"value": 1048, "name": "Search Engine"},{"value": 735,"name": "Direct"}] +- `[children]` The options of children chart + + ## Performance +Generate a png chart will be less than 20ms. It's better than using `chrome headless` with `echarts`. + ```bash BenchmarkMultiChartPNGRender-8 78 15216336 ns/op 2298308 B/op 1148 allocs/op BenchmarkMultiChartSVGRender-8 367 3356325 ns/op 20597282 B/op 3088 allocs/op diff --git a/README_zh.md b/README_zh.md index 15c1c9f..f4f5d4a 100644 --- a/README_zh.md +++ b/README_zh.md @@ -8,7 +8,9 @@ `Apache ECharts`在前端开发中得到众多开发者的认可,因此`go-charts`提供了兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的图表截图(主题为light与grafana): -![go-charts](./assets/go-charts.png) +

+ go-charts +

## 支持图表类型 @@ -117,18 +119,18 @@ func main() { ## ECharts参数说明 -标记为[非echarts配置]的参数为新增参数,可根据实际使用场景添加。 +名称有[]的参数非echarts的原有参数,为`go-charts`的新增参数,可根据实际使用场景添加。 -- `type` 画布类型,支持`svg`与`png`,默认为`svg` -- `theme` 颜色主题,支持`dark`、`light`以及`grafana`模式,默认为`light` -- `fontFamily` 字体,全局的字体设置[非echarts配置] -- `padding` 图表的内边距,单位px。支持以下几种模式的设置[非echarts配置] +- `[type]` 画布类型,支持`svg`与`png`,默认为`svg` +- `[theme]` 颜色主题,支持`dark`、`light`以及`grafana`模式,默认为`light` +- `[fontFamily]` 字体,全局的字体设置 +- `[padding]` 图表的内边距,单位px。支持以下几种模式的设置 - `padding: 5` 设置内边距为5 - `padding: [5, 10]` 设置上下的内边距为 5,左右的内边距为 10 - `padding:[5, 10, 5, 10]` 分别设置`上右下左`边距 -- `box` 图表的区域,以{"left": Int, "right": Int, "top": Int, "bottom": Int}的形式配置,[非echarts配置] -- `width` 画布宽度,默认为600[非echarts配置] -- `height` 画布高度,默认为400[非echarts配置] +- `[box]` 图表的区域,以{"left": Int, "right": Int, "top": Int, "bottom": Int}的形式配置 +- `[width]` 画布宽度,默认为600 +- `[height]` 画布高度,默认为400 - `title` 图表标题,包括标题内容、高度、颜色等 - `title.text` 标题文本,支持以`\n`的形式换行 - `title.subtext` 副标题文本,支持以`\n`的形式换行 @@ -170,7 +172,7 @@ func main() { - `series.data` 数据项对应的数据数组,支持以下形式的数据: - `数值` 常用形式,数组数据为浮点数组,如[1.1, 2,3, 5.2] - `结构体` pie图表或bar图表中指定样式使用,如[{"value": 1048, "name": "Search Engine"},{"value": 735,"name": "Direct"}] -- `children` 嵌套的子图表参数列表,图表支持嵌套的形式非echarts配置] +- `[children]` 嵌套的子图表参数列表,图表支持嵌套的形式= ## 性能 From edee23a6ddd17252de9484b0a678c356b15c818a Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 16:12:53 +0800 Subject: [PATCH 094/251] fix: fix numberic regexp --- echarts.go | 2 +- echarts_test.go | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/echarts.go b/echarts.go index 6de8dc4..19659a8 100644 --- a/echarts.go +++ b/echarts.go @@ -76,7 +76,7 @@ type EChartsSeriesData struct { } type _EChartsSeriesData EChartsSeriesData -var numericRep = regexp.MustCompile(`^[-+]?[0-9]+(?:\\.[0-9]+)?$`) +var numericRep = regexp.MustCompile(`^[-+]?[0-9]+(?:\.[0-9]+)?$`) func (es *EChartsSeriesData) UnmarshalJSON(data []byte) error { data = bytes.TrimSpace(data) diff --git a/echarts_test.go b/echarts_test.go index 67fabf6..e484b85 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -256,6 +256,13 @@ func TestEChartsSeriesData(t *testing.T) { Value: 123, }, esd) + esd = EChartsSeriesData{} + err = esd.UnmarshalJSON([]byte(`2.1`)) + assert.Nil(err) + assert.Equal(EChartsSeriesData{ + Value: 2.1, + }, esd) + esd = EChartsSeriesData{} err = esd.UnmarshalJSON([]byte(`{ "value": 123.12, From 513c93e2090a89f7e2fb41ba015736befa2f8c52 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 16:22:57 +0800 Subject: [PATCH 095/251] refactor: enhance echarts mark data --- echarts.go | 30 ++++++++++++++++++++++++++---- echarts_test.go | 14 ++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/echarts.go b/echarts.go index 19659a8..ecad892 100644 --- a/echarts.go +++ b/echarts.go @@ -209,11 +209,33 @@ type EChartsLegend struct { TextStyle EChartsTextStyle `json:"textStyle"` } +type EChartsMarkData struct { + Type string `json:"type"` +} +type _EChartsMarkData EChartsMarkData + +func (emd *EChartsMarkData) UnmarshalJSON(data []byte) error { + data = bytes.TrimSpace(data) + if len(data) == 0 { + return nil + } + data = convertToArray(data) + ds := make([]*_EChartsMarkData, 0) + err := json.Unmarshal(data, &ds) + if err != nil { + return err + } + for _, d := range ds { + if d.Type != "" { + emd.Type = d.Type + } + } + return nil +} + type EChartsMarkPoint struct { - SymbolSize int `json:"symbolSize"` - Data []struct { - Type string `json:"type"` - } `json:"data"` + SymbolSize int `json:"symbolSize"` + Data []EChartsMarkData `json:"data"` } func (emp *EChartsMarkPoint) ToSeriesMarkPoint() SeriesMarkPoint { diff --git a/echarts_test.go b/echarts_test.go index e484b85..f3b70f1 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -330,6 +330,20 @@ func TestEChartsSeries(t *testing.T) { }, esList) } +func TestEChartsMarkData(t *testing.T) { + assert := assert.New(t) + + emd := EChartsMarkData{} + err := emd.UnmarshalJSON([]byte(`{"type": "average"}`)) + assert.Nil(err) + assert.Equal("average", emd.Type) + + emd = EChartsMarkData{} + err = emd.UnmarshalJSON([]byte(`[{}, {"type": "average"}]`)) + assert.Nil(err) + assert.Equal("average", emd.Type) +} + func TestEChartsMarkPoint(t *testing.T) { assert := assert.New(t) From bbbdbe7c5eb7fa124735ff203998f2a893abd8d9 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 16:28:39 +0800 Subject: [PATCH 096/251] refactor: fix go lint --- echarts.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/echarts.go b/echarts.go index ecad892..926ab5f 100644 --- a/echarts.go +++ b/echarts.go @@ -247,18 +247,14 @@ func (emp *EChartsMarkPoint) ToSeriesMarkPoint() SeriesMarkPoint { } data := make([]SeriesMarkData, len(emp.Data)) for index, item := range emp.Data { - data[index] = SeriesMarkData{ - Type: item.Type, - } + data[index].Type = item.Type } sp.Data = data return sp } type EChartsMarkLine struct { - Data []struct { - Type string `json:"type"` - } `json:"data"` + Data []EChartsMarkData `json:"data"` } func (eml *EChartsMarkLine) ToSeriesMarkLine() SeriesMarkLine { @@ -268,9 +264,7 @@ func (eml *EChartsMarkLine) ToSeriesMarkLine() SeriesMarkLine { } data := make([]SeriesMarkData, len(eml.Data)) for index, item := range eml.Data { - data[index] = SeriesMarkData{ - Type: item.Type, - } + data[index].Type = item.Type } sl.Data = data return sl From aaf70295323092cc2c104752b923ed0cd313ac49 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 17:06:43 +0800 Subject: [PATCH 097/251] refactor: update go charts version --- go.mod | 2 +- go.sum | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ed3b24a..1031e57 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/vicanso/elton v1.8.1 - github.com/vicanso/go-charts v0.0.3-0.20220102014512-72896d1c3f54 + github.com/vicanso/go-charts v0.0.5-0.20220219082839-bbbdbe7c5eb7 ) require ( diff --git a/go.sum b/go.sum index 6f9acb1..19349e8 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,10 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/vicanso/elton v1.8.1 h1:axrPozxBaTn9qqCJJ+aSGK+/Y8oLuEm0uXM5wm/glIs= github.com/vicanso/elton v1.8.1/go.mod h1:BWQknlDpKtw2L5oer3mtBJo/vpBUYUHAjZL3yFV1+ak= -github.com/vicanso/go-charts v0.0.3-0.20220102014512-72896d1c3f54 h1:Ij1XVU2Ov6661PtxSdYwyjXha7TC8z0Dm01bYzj2ZNs= -github.com/vicanso/go-charts v0.0.3-0.20220102014512-72896d1c3f54/go.mod h1:Kylthw+IZk7hDvhrj4CTN+DAsLzG01y91FOOElGv7vk= +github.com/vicanso/go-charts v0.0.5-0.20220219055539-78ba3017ae76 h1:+mfdJmjYyw6yWcuazs1nOBwLeWfbVEnHmGb+vxpc7Pw= +github.com/vicanso/go-charts v0.0.5-0.20220219055539-78ba3017ae76/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= +github.com/vicanso/go-charts v0.0.5-0.20220219082839-bbbdbe7c5eb7 h1:m4JSIyERta0T35GdPPivly30yDtBkebvKL6Cg6pFH0k= +github.com/vicanso/go-charts v0.0.5-0.20220219082839-bbbdbe7c5eb7/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= github.com/vicanso/hes v0.4.1 h1:lq27wDXAljoROtYbFDTL5gY51SdeY+9L0ohEiRadwTU= github.com/vicanso/hes v0.4.1/go.mod h1:B0l1NIQM/nYw7owAd+hyHuNnAD8Nsx0T6duhVxmXUBY= github.com/vicanso/intranet-ip v0.0.1 h1:cYS+mExFsKqewWSuHtFwAqw/CO66GsheB/P1BPmSTx0= From 28bb9c57bcca0fd5d63ff6d1983de15694c451d2 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 17:44:46 +0800 Subject: [PATCH 098/251] fix: fix overflow point --- bar_chart.go | 2 +- examples/charts/main.go | 3 +++ line_chart.go | 9 ++++++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index e008baf..32373b1 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -98,7 +98,7 @@ func barChartRender(opt barChartOption, result *basicRenderResult) ([]markPointR }) divideValues := xRange.AutoDivide() for j, item := range series.Data { - if j >= len(divideValues) { + if j >= xRange.divideCount { continue } x := divideValues[j] diff --git a/examples/charts/main.go b/examples/charts/main.go index e10c7c0..cac7c10 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -423,6 +423,7 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { 20.0, 6.4, 3.3, + 10.2, }), YAxisIndex: 1, }, @@ -441,6 +442,7 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { 18.8, 6.0, 2.3, + 20.2, }), YAxisIndex: 1, }, @@ -458,6 +460,7 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { 16.5, 12.0, 6.2, + 30.3, }), }, }, diff --git a/line_chart.go b/line_chart.go index 78790d3..c51997f 100644 --- a/line_chart.go +++ b/line_chart.go @@ -63,7 +63,7 @@ func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]markPoin seriesColor := theme.GetSeriesColor(index) yRange := result.getYRange(series.YAxisIndex) - points := make([]Point, len(series.Data)) + points := make([]Point, 0, len(series.Data)) // mark line markLineRender(markLineRenderOption{ Draw: d, @@ -76,12 +76,15 @@ func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]markPoin }) for j, item := range series.Data { + if j >= xRange.divideCount { + continue + } y := yRange.getRestHeight(item.Value) x := xRange.getWidth(float64(j)) - points[j] = Point{ + points = append(points, Point{ Y: y, X: x, - } + }) if !series.Label.Show { continue } From 549d852e8301164ae8f1c68f0ac2edaa19edaca8 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Feb 2022 21:18:13 +0800 Subject: [PATCH 099/251] refactor: update modules --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 1031e57..1905035 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/vicanso/elton v1.8.1 - github.com/vicanso/go-charts v0.0.5-0.20220219082839-bbbdbe7c5eb7 + github.com/vicanso/go-charts v0.0.5-0.20220219094446-28bb9c57bcca ) require ( diff --git a/go.sum b/go.sum index 19349e8..303052b 100644 --- a/go.sum +++ b/go.sum @@ -23,10 +23,8 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/vicanso/elton v1.8.1 h1:axrPozxBaTn9qqCJJ+aSGK+/Y8oLuEm0uXM5wm/glIs= github.com/vicanso/elton v1.8.1/go.mod h1:BWQknlDpKtw2L5oer3mtBJo/vpBUYUHAjZL3yFV1+ak= -github.com/vicanso/go-charts v0.0.5-0.20220219055539-78ba3017ae76 h1:+mfdJmjYyw6yWcuazs1nOBwLeWfbVEnHmGb+vxpc7Pw= -github.com/vicanso/go-charts v0.0.5-0.20220219055539-78ba3017ae76/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= -github.com/vicanso/go-charts v0.0.5-0.20220219082839-bbbdbe7c5eb7 h1:m4JSIyERta0T35GdPPivly30yDtBkebvKL6Cg6pFH0k= -github.com/vicanso/go-charts v0.0.5-0.20220219082839-bbbdbe7c5eb7/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= +github.com/vicanso/go-charts v0.0.5-0.20220219094446-28bb9c57bcca h1:11TMrOVTh2aWkGDXp4F4vgt9fOmod0powqcaFvzsXHQ= +github.com/vicanso/go-charts v0.0.5-0.20220219094446-28bb9c57bcca/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= github.com/vicanso/hes v0.4.1 h1:lq27wDXAljoROtYbFDTL5gY51SdeY+9L0ohEiRadwTU= github.com/vicanso/hes v0.4.1/go.mod h1:B0l1NIQM/nYw7owAd+hyHuNnAD8Nsx0T6duhVxmXUBY= github.com/vicanso/intranet-ip v0.0.1 h1:cYS+mExFsKqewWSuHtFwAqw/CO66GsheB/P1BPmSTx0= From 9de17f6cf2809359ad0413ba1936f984603bc314 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 20 Feb 2022 18:09:21 +0800 Subject: [PATCH 100/251] feat: add baidu tongji --- web/index.html | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/web/index.html b/web/index.html index 54b0ee8..0fb964e 100644 --- a/web/index.html +++ b/web/index.html @@ -5,6 +5,15 @@ + From 6209a9ce630b323bac89885576e83d93c4f5b5bf Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 28 Feb 2022 20:42:25 +0800 Subject: [PATCH 101/251] feat: add theme of ant design --- theme.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/theme.go b/theme.go index d5d51cd..e3f9773 100644 --- a/theme.go +++ b/theme.go @@ -29,6 +29,7 @@ import ( const ThemeDark = "dark" const ThemeLight = "light" const ThemeGrafana = "grafana" +const ThemeAnt = "ant" type Theme struct { palette *themeColorPalette @@ -67,6 +68,16 @@ func init() { parseColor("#705DA0"), parseColor("#508642"), } + antSeriesColors := []drawing.Color{ + parseColor("#5b8ff9"), + parseColor("#5ad8a6"), + parseColor("#5d7092"), + parseColor("#f6bd16"), + parseColor("#6f5ef9"), + parseColor("#6dc8ec"), + parseColor("#945fb9"), + parseColor("#ff9845"), + } AddTheme( ThemeDark, true, @@ -121,6 +132,30 @@ func init() { }, echartSeriesColors, ) + AddTheme( + ThemeAnt, + false, + drawing.Color{ + R: 110, + G: 112, + B: 121, + A: 255, + }, + drawing.Color{ + R: 224, + G: 230, + B: 242, + A: 255, + }, + drawing.ColorWhite, + drawing.Color{ + R: 70, + G: 70, + B: 70, + A: 255, + }, + antSeriesColors, + ) AddTheme( ThemeGrafana, true, From 570828d35fafd9038eef04d9f02f2b09fdd39a0b Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 2 Mar 2022 23:20:41 +0800 Subject: [PATCH 102/251] feat: support radar chart --- chart.go | 32 +++++-- draw.go | 13 +++ examples/charts/main.go | 60 +++++++++++++ line_chart.go | 2 +- pie_chart.go | 21 +---- pie_chart_test.go | 8 -- radar_chart.go | 183 ++++++++++++++++++++++++++++++++++++++++ util.go | 45 ++++++++++ util_test.go | 8 ++ 9 files changed, 337 insertions(+), 35 deletions(-) create mode 100644 radar_chart.go diff --git a/chart.go b/chart.go index 5178b04..2903051 100644 --- a/chart.go +++ b/chart.go @@ -33,9 +33,10 @@ import ( ) const ( - ChartTypeLine = "line" - ChartTypeBar = "bar" - ChartTypePie = "pie" + ChartTypeLine = "line" + ChartTypeBar = "bar" + ChartTypePie = "pie" + ChartTypeRadar = "radar" ) const ( @@ -49,6 +50,8 @@ type Point struct { } const labelFontSize = 10 +const defaultDotWidth = 2.0 +const defaultStrokeWidth = 2.0 var defaultChartWidth = 600 var defaultChartHeight = 400 @@ -82,6 +85,8 @@ type ChartOption struct { Box chart.Box // The series list SeriesList SeriesList + // The radar indicator list + RadarIndicators []RadarIndicator // The background color of chart BackgroundColor drawing.Color // The child charts @@ -283,11 +288,14 @@ func Render(opt ChartOption) (*Draw, error) { lineSeries := make([]Series, 0) barSeries := make([]Series, 0) isPieChart := false + isRadarChart := false for index, item := range opt.SeriesList { item.index = index switch item.Type { case ChartTypePie: isPieChart = true + case ChartTypeRadar: + isRadarChart = true case ChartTypeBar: barSeries = append(barSeries, item) default: @@ -296,7 +304,8 @@ func Render(opt ChartOption) (*Draw, error) { } // 如果指定了pie,则以pie的形式处理,pie不支持多类型图表 // pie不需要axis - if isPieChart { + // radar 同样处理 + if isPieChart || isRadarChart { opt.XAxis.Hidden = true for index := range opt.YAxisList { opt.YAxisList[index].Hidden = true @@ -313,12 +322,23 @@ func Render(opt ChartOption) (*Draw, error) { if !isPieChart { return nil } - err := pieChartRender(pieChartOption{ + return pieChartRender(pieChartOption{ SeriesList: opt.SeriesList, Theme: opt.Theme, Font: opt.Font, }, result) - return err + }, + // radar render + func() error { + if !isRadarChart { + return nil + } + return radarChartRender(radarChartOption{ + SeriesList: opt.SeriesList, + Theme: opt.Theme, + Font: opt.Font, + Indicators: opt.RadarIndicators, + }, result) }, // bar render func() error { diff --git a/draw.go b/draw.go index bc3d9e8..ae52f05 100644 --- a/draw.go +++ b/draw.go @@ -309,3 +309,16 @@ func (d *Draw) setBackground(width, height int, color drawing.Color) { r.LineTo(0, 0) r.FillStroke() } + +func (d *Draw) polygon(center Point, radius float64, sides int) { + points := getPolygonPoints(center, radius, sides) + for i, p := range points { + if i == 0 { + d.moveTo(p.X, p.Y) + } else { + d.lineTo(p.X, p.Y) + } + } + d.lineTo(points[0].X, points[0].Y) + d.Render.Stroke() +} diff --git a/examples/charts/main.go b/examples/charts/main.go index cac7c10..b175126 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -496,6 +496,66 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { Radius: "35%", }), }, + // 雷达图 + { + Title: charts.TitleOption{ + Text: "Basic Radar Chart", + }, + Legend: charts.NewLegendOption([]string{ + "Allocated Budget", + "Actual Spending", + }), + RadarIndicators: []charts.RadarIndicator{ + { + Name: "Sales", + Max: 6500, + }, + { + Name: "Administration", + Max: 16000, + }, + { + Name: "Information Technology", + Max: 30000, + }, + { + Name: "Customer Support", + Max: 38000, + }, + { + Name: "Development", + Max: 52000, + }, + { + Name: "Marketing", + Max: 25000, + }, + }, + SeriesList: charts.SeriesList{ + { + Type: charts.ChartTypeRadar, + Data: charts.NewSeriesDataFromValues([]float64{ + 4200, + 3000, + 20000, + 35000, + 50000, + 18000, + }), + }, + { + Type: charts.ChartTypeRadar, + Data: charts.NewSeriesDataFromValues([]float64{ + 5000, + 14000, + 28000, + 26000, + 42000, + 21000, + }), + }, + }, + }, // 多图展示 { Legend: charts.LegendOption{ diff --git a/line_chart.go b/line_chart.go index c51997f..ac9091c 100644 --- a/line_chart.go +++ b/line_chart.go @@ -114,7 +114,7 @@ func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]markPoin StrokeColor: seriesColor, StrokeWidth: 2, DotColor: seriesColor, - DotWidth: 2, + DotWidth: defaultDotWidth, DotFillColor: dotFillColor, }) // draw mark point diff --git a/pie_chart.go b/pie_chart.go index f581273..4833c34 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -24,14 +24,11 @@ package charts import ( "math" - "strconv" "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" ) -const defaultRadiusPercent = 0.4 - func getPieStyle(theme *Theme, index int) chart.Style { seriesColor := theme.GetSeriesColor(index) return chart.Style{ @@ -47,22 +44,6 @@ type pieChartOption struct { SeriesList SeriesList } -func getPieRadius(diameter float64, radiusValue string) float64 { - var radius float64 - if len(radiusValue) != 0 { - v := convertPercent(radiusValue) - if v != -1 { - radius = float64(diameter) * v - } else { - radius, _ = strconv.ParseFloat(radiusValue, 64) - } - } - if radius <= 0 { - radius = float64(diameter) * defaultRadiusPercent - } - return radius -} - func pieChartRender(opt pieChartOption, result *basicRenderResult) error { d, err := NewDraw(DrawOption{ Parent: result.d, @@ -95,7 +76,7 @@ func pieChartRender(opt pieChartOption, result *basicRenderResult) error { cy := box.Height() >> 1 diameter := chart.MinInt(box.Width(), box.Height()) - radius := getPieRadius(float64(diameter), radiusValue) + radius := getRadius(float64(diameter), radiusValue) labelLineWidth := 15 if radius < 50 { diff --git a/pie_chart_test.go b/pie_chart_test.go index 92ef6d0..7cb9fde 100644 --- a/pie_chart_test.go +++ b/pie_chart_test.go @@ -30,14 +30,6 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) -func TestGetPieRadius(t *testing.T) { - assert := assert.New(t) - - assert.Equal(50.0, getPieRadius(100, "50%")) - assert.Equal(30.0, getPieRadius(100, "30")) - assert.Equal(40.0, getPieRadius(100, "")) -} - func TestPieChartRender(t *testing.T) { assert := assert.New(t) diff --git a/radar_chart.go b/radar_chart.go new file mode 100644 index 0000000..667e3a0 --- /dev/null +++ b/radar_chart.go @@ -0,0 +1,183 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "errors" + + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +// 线 E0E6F1 +// 填充 rgb(210,219,238) fill-opacity="0.2" + +type RadarIndicator struct { + Name string + Max float64 +} + +type radarChartOption struct { + Theme string + Font *truetype.Font + SeriesList SeriesList + Indicators []RadarIndicator +} + +func radarChartRender(opt radarChartOption, result *basicRenderResult) error { + sides := len(opt.Indicators) + if sides < 3 { + return errors.New("The count of indicator should be >= 3") + } + for _, indicator := range opt.Indicators { + if indicator.Max <= 0 { + return errors.New("The max of indicator should be > 0") + } + } + d, err := NewDraw(DrawOption{ + Parent: result.d, + }, PaddingOption(chart.Box{ + Top: result.titleBox.Height(), + })) + if err != nil { + return err + } + radiusValue := "" + for _, series := range opt.SeriesList { + if len(series.Radius) != 0 { + radiusValue = series.Radius + } + } + + box := d.Box + cx := box.Width() >> 1 + cy := box.Height() >> 1 + diameter := chart.MinInt(box.Width(), box.Height()) + radius := getRadius(float64(diameter), radiusValue) + + theme := NewTheme(opt.Theme) + + divideCount := 5 + divideRadius := float64(int(radius / float64(divideCount))) + radius = divideRadius * float64(divideCount) + + style := chart.Style{ + StrokeColor: theme.GetAxisSplitLineColor(), + StrokeWidth: 1, + } + r := d.Render + style.WriteToRenderer(r) + center := Point{ + X: cx, + Y: cy, + } + for i := 0; i < divideCount; i++ { + d.polygon(center, divideRadius*float64(i+1), sides) + } + points := getPolygonPoints(center, radius, sides) + for _, p := range points { + d.moveTo(center.X, center.Y) + d.lineTo(p.X, p.Y) + d.Render.Stroke() + } + // 文本 + textStyle := chart.Style{ + FontColor: theme.GetTextColor(), + FontSize: labelFontSize, + Font: opt.Font, + } + textStyle.GetTextOptions().WriteToRenderer(r) + offset := 5 + // 文本生成 + for index, p := range points { + name := opt.Indicators[index].Name + b := r.MeasureText(name) + isXCenter := p.X == center.X + isYCenter := p.Y == center.Y + isRight := p.X > center.X + isLeft := p.X < center.X + isTop := p.Y < center.Y + isBottom := p.Y > center.Y + x := p.X + y := p.Y + if isXCenter { + x -= b.Width() >> 1 + if isTop { + y -= b.Height() + } else { + y += b.Height() + } + } + if isYCenter { + y += b.Height() >> 1 + } + if isTop { + y += offset + } + if isBottom { + y += offset + } + if isRight { + x += offset + } + if isLeft { + x -= (b.Width() + offset) + } + d.text(name, x, y) + } + + // 雷达图 + angles := getPolygonPointAngles(sides) + maxCount := len(opt.Indicators) + for i, series := range opt.SeriesList { + linePoints := make([]Point, 0, maxCount) + for j, item := range series.Data { + if j >= maxCount { + continue + } + percent := item.Value / opt.Indicators[j].Max + r := percent * radius + p := getPolygonPoint(center, r, angles[j]) + linePoints = append(linePoints, p) + } + color := theme.GetSeriesColor(i) + dotFillColor := drawing.ColorWhite + if theme.IsDark() { + dotFillColor = color + } + linePoints = append(linePoints, linePoints[0]) + s := LineStyle{ + StrokeColor: color, + StrokeWidth: defaultStrokeWidth, + DotWidth: defaultDotWidth, + DotColor: color, + DotFillColor: dotFillColor, + FillColor: color.WithAlpha(20), + } + d.lineStroke(linePoints, s) + d.lineFill(linePoints, s) + d.lineDot(linePoints[0:len(linePoints)-1], s) + } + return nil +} diff --git a/util.go b/util.go index 2adaba8..c895cc3 100644 --- a/util.go +++ b/util.go @@ -23,6 +23,7 @@ package charts import ( + "math" "regexp" "strconv" "strings" @@ -168,3 +169,47 @@ func parseColor(color string) drawing.Color { } return c } + +const defaultRadiusPercent = 0.4 + +func getRadius(diameter float64, radiusValue string) float64 { + var radius float64 + if len(radiusValue) != 0 { + v := convertPercent(radiusValue) + if v != -1 { + radius = float64(diameter) * v + } else { + radius, _ = strconv.ParseFloat(radiusValue, 64) + } + } + if radius <= 0 { + radius = float64(diameter) * defaultRadiusPercent + } + return radius +} + +func getPolygonPointAngles(sides int) []float64 { + angles := make([]float64, sides) + for i := 0; i < sides; i++ { + angle := 2*math.Pi/float64(sides)*float64(i) - (math.Pi / 2) + angles[i] = angle + } + return angles +} + +func getPolygonPoint(center Point, radius, angle float64) Point { + x := center.X + int(radius*math.Cos(angle)) + y := center.Y + int(radius*math.Sin(angle)) + return Point{ + X: x, + Y: y, + } +} + +func getPolygonPoints(center Point, radius float64, sides int) []Point { + points := make([]Point, sides) + for i, angle := range getPolygonPointAngles(sides) { + points[i] = getPolygonPoint(center, radius, angle) + } + return points +} diff --git a/util_test.go b/util_test.go index dc5d98e..6489ab3 100644 --- a/util_test.go +++ b/util_test.go @@ -70,6 +70,14 @@ func TestAutoDivide(t *testing.T) { }, autoDivide(600, 7)) } +func TestGetRadius(t *testing.T) { + assert := assert.New(t) + + assert.Equal(50.0, getRadius(100, "50%")) + assert.Equal(30.0, getRadius(100, "30")) + assert.Equal(40.0, getRadius(100, "")) +} + func TestMeasureTextMaxWidthHeight(t *testing.T) { assert := assert.New(t) r, err := chart.SVG(400, 300) From b93d0966335862e20cf951d043ef3de7de9d2b8e Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 3 Mar 2022 23:01:42 +0800 Subject: [PATCH 103/251] feat: support radar option of echarts --- README.md | 5 ++ chart_test.go | 65 ++++++++++++++++++++++++- draw.go | 19 ++++++++ draw_test.go | 50 ++++++++++++++++++++ echarts.go | 69 +++++++++++++++++++++------ echarts_test.go | 38 +++++++++------ examples/charts/main.go | 69 +++++++++++++++++++++++++++ line.go | 32 ++++++------- radar_chart.go | 18 +++---- radar_chart_test.go | 102 ++++++++++++++++++++++++++++++++++++++++ 10 files changed, 411 insertions(+), 56 deletions(-) create mode 100644 radar_chart_test.go diff --git a/README.md b/README.md index 6710cdd..30d9675 100644 --- a/README.md +++ b/README.md @@ -152,6 +152,11 @@ The name with `[]` is new parameter, others are the same as `echarts`. - `legend.padding` legend space around content - `legend.left` Distance between legend component and the left side of the container. Left value can be instant pixel value like 20; it can also be a percentage value relative to container width like '20%'; and it can also be 'left', 'center', or 'right'. - `legend.top` Distance between legend component and the top side of the container. Top value can be instant pixel value like 20 +- `radar` Coordinate for radar charts + - `radar.indicator` Indicator of radar chart, which is used to assign multiple variables(dimensions) in radar chart + - `radar.indicator.name` Indicator's name + - `radar.indicator.max` The maximum value of indicator + - `radar.indicator.min` The minimum value of indicator, default value is 0. - `series` The series for chart - `series.name` Series name used for displaying in legend. - `series.type` Series type: `line`, `bar` or`pie` diff --git a/chart_test.go b/chart_test.go index 4fc3d20..1f4d1f4 100644 --- a/chart_test.go +++ b/chart_test.go @@ -270,12 +270,75 @@ func TestChartRender(t *testing.T) { Radius: "35%", }), }, + { + Legend: NewLegendOption([]string{ + "Allocated Budget", + "Actual Spending", + }), + Box: chart.Box{ + Top: 20, + Left: 0, + Right: 200, + Bottom: 120, + }, + RadarIndicators: []RadarIndicator{ + { + Name: "Sales", + Max: 6500, + }, + { + Name: "Administration", + Max: 16000, + }, + { + Name: "Information Technology", + Max: 30000, + }, + { + Name: "Customer Support", + Max: 38000, + }, + { + Name: "Development", + Max: 52000, + }, + { + Name: "Marketing", + Max: 25000, + }, + }, + SeriesList: SeriesList{ + { + Type: ChartTypeRadar, + Data: NewSeriesDataFromValues([]float64{ + 4200, + 3000, + 20000, + 35000, + 50000, + 18000, + }), + }, + { + Type: ChartTypeRadar, + index: 1, + Data: NewSeriesDataFromValues([]float64{ + 5000, + 14000, + 28000, + 26000, + 42000, + 21000, + }), + }, + }, + }, }, }) assert.Nil(err) data, err := d.Bytes() assert.Nil(err) - assert.Equal("\\n2012201320142015201620170153045607590Milk TeaMatcha LatteCheese CocoaWalnut BrownieMilk Tea: 34.03%Matcha Latte: 27.66%Cheese Cocoa: 22.32%Walnut Brownie: 15.96%", string(data)) + assert.Equal("\\n2012201320142015201620170153045607590Milk TeaMatcha LatteCheese CocoaWalnut BrownieMilk Tea: 34.03%Matcha Latte: 27.66%Cheese Cocoa: 22.32%Walnut Brownie: 15.96%SalesAdministrationInformation TechnologyCustomer SupportDevelopmentMarketingAllocated BudgetActual Spending", string(data)) } func BenchmarkMultiChartPNGRender(b *testing.B) { diff --git a/draw.go b/draw.go index ae52f05..f6ee73c 100644 --- a/draw.go +++ b/draw.go @@ -322,3 +322,22 @@ func (d *Draw) polygon(center Point, radius float64, sides int) { d.lineTo(points[0].X, points[0].Y) d.Render.Stroke() } + +func (d *Draw) fill(points []Point, s chart.Style) { + if !s.ShouldDrawFill() { + return + } + r := d.Render + var x, y int + s.GetFillOptions().WriteDrawingOptionsToRenderer(r) + for index, point := range points { + x = point.X + y = point.Y + if index == 0 { + d.moveTo(x, y) + } else { + d.lineTo(x, y) + } + } + r.Fill() +} diff --git a/draw_test.go b/draw_test.go index 712641a..694d72a 100644 --- a/draw_test.go +++ b/draw_test.go @@ -409,6 +409,56 @@ func TestDraw(t *testing.T) { }, result: "\\n", }, + // polygon + { + fn: func(d *Draw) { + chart.Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }.WriteToRenderer(d.Render) + d.polygon(Point{ + X: 100, + Y: 100, + }, 50, 6) + }, + result: "\\n", + }, + // fill + { + fn: func(d *Draw) { + d.fill([]Point{ + { + X: 0, + Y: 0, + }, + { + X: 0, + Y: 100, + }, + { + X: 100, + Y: 100, + }, + { + X: 0, + Y: 0, + }, + }, chart.Style{ + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }) + }, + result: "\\n", + }, } for _, tt := range tests { d, err := NewDraw(DrawOption{ diff --git a/echarts.go b/echarts.go index 926ab5f..086dc45 100644 --- a/echarts.go +++ b/echarts.go @@ -69,10 +69,30 @@ func (es *EChartStyle) ToStyle() chart.Style { } } +type EChartsSeriesDataValue struct { + values []float64 +} + +func (value *EChartsSeriesDataValue) UnmarshalJSON(data []byte) error { + data = convertToArray(data) + return json.Unmarshal(data, &value.values) +} +func (value *EChartsSeriesDataValue) First() float64 { + if len(value.values) == 0 { + return 0 + } + return value.values[0] +} +func NewEChartsSeriesDataValue(values ...float64) EChartsSeriesDataValue { + return EChartsSeriesDataValue{ + values: values, + } +} + type EChartsSeriesData struct { - Value float64 `json:"value"` - Name string `json:"name"` - ItemStyle EChartStyle `json:"itemStyle"` + Value EChartsSeriesDataValue `json:"value"` + Name string `json:"name"` + ItemStyle EChartStyle `json:"itemStyle"` } type _EChartsSeriesData EChartsSeriesData @@ -88,7 +108,11 @@ func (es *EChartsSeriesData) UnmarshalJSON(data []byte) error { if err != nil { return err } - es.Value = v + es.Value = EChartsSeriesDataValue{ + values: []float64{ + v, + }, + } return nil } v := _EChartsSeriesData{} @@ -291,7 +315,7 @@ func (esList EChartsSeriesList) ToSeriesList() SeriesList { if item.Type == ChartTypePie { for _, dataItem := range item.Data { seriesList = append(seriesList, Series{ - Type: ChartTypePie, + Type: item.Type, Name: dataItem.Name, Label: SeriesLabel{ Show: true, @@ -299,17 +323,28 @@ func (esList EChartsSeriesList) ToSeriesList() SeriesList { Radius: item.Radius, Data: []SeriesData{ { - Value: dataItem.Value, + Value: dataItem.Value.First(), }, }, }) } continue } + // 如果是radar + if item.Type == ChartTypeRadar { + for _, dataItem := range item.Data { + seriesList = append(seriesList, Series{ + Name: dataItem.Name, + Type: item.Type, + Data: NewSeriesDataFromValues(dataItem.Value.values), + }) + } + continue + } data := make([]SeriesData, len(item.Data)) for j, dataItem := range item.Data { data[j] = SeriesData{ - Value: dataItem.Value, + Value: dataItem.Value.First(), Style: dataItem.ItemStyle.ToStyle(), } } @@ -364,9 +399,12 @@ type EChartsOption struct { TextStyle EChartsTextStyle `json:"textStyle"` SubtextStyle EChartsTextStyle `json:"subtextStyle"` } `json:"title"` - XAxis EChartsXAxis `json:"xAxis"` - YAxis EChartsYAxis `json:"yAxis"` - Legend EChartsLegend `json:"legend"` + XAxis EChartsXAxis `json:"xAxis"` + YAxis EChartsYAxis `json:"yAxis"` + Legend EChartsLegend `json:"legend"` + Radar struct { + Indicator []RadarIndicator `json:"indicator"` + } `json:"radar"` Series EChartsSeriesList `json:"series"` Children []EChartsOption `json:"children"` } @@ -397,11 +435,12 @@ func (eo *EChartsOption) ToOption() ChartOption { Align: eo.Legend.Align, Orient: eo.Legend.Orient, }, - Width: eo.Width, - Height: eo.Height, - Padding: eo.Padding.Box, - Box: eo.Box, - SeriesList: eo.Series.ToSeriesList(), + RadarIndicators: eo.Radar.Indicator, + Width: eo.Width, + Height: eo.Height, + Padding: eo.Padding.Box, + Box: eo.Box, + SeriesList: eo.Series.ToSeriesList(), } if len(eo.XAxis.Data) != 0 { xAxisData := eo.XAxis.Data[0] diff --git a/echarts_test.go b/echarts_test.go index f3b70f1..05c2a40 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -253,14 +253,14 @@ func TestEChartsSeriesData(t *testing.T) { err := esd.UnmarshalJSON([]byte(`123`)) assert.Nil(err) assert.Equal(EChartsSeriesData{ - Value: 123, + Value: NewEChartsSeriesDataValue(123), }, esd) esd = EChartsSeriesData{} err = esd.UnmarshalJSON([]byte(`2.1`)) assert.Nil(err) assert.Equal(EChartsSeriesData{ - Value: 2.1, + Value: NewEChartsSeriesDataValue(2.1), }, esd) esd = EChartsSeriesData{} @@ -273,7 +273,7 @@ func TestEChartsSeriesData(t *testing.T) { }`)) assert.Nil(err) assert.Equal(EChartsSeriesData{ - Value: 123.12, + Value: NewEChartsSeriesDataValue(123.12), Name: "test", ItemStyle: EChartStyle{ Color: "#aaa", @@ -308,10 +308,10 @@ func TestEChartsSeries(t *testing.T) { Name: "Email", Data: []EChartsSeriesData{ { - Value: 120, + Value: NewEChartsSeriesDataValue(120), }, { - Value: 132, + Value: NewEChartsSeriesDataValue(132), }, }, }, @@ -320,10 +320,10 @@ func TestEChartsSeries(t *testing.T) { Type: "bar", Data: []EChartsSeriesData{ { - Value: 220, + Value: NewEChartsSeriesDataValue(220), }, { - Value: 182, + Value: NewEChartsSeriesDataValue(182), }, }, }, @@ -430,12 +430,20 @@ func TestEChartsSeriesList(t *testing.T) { Radius: "30%", Data: []EChartsSeriesData{ { - Name: "1", - Value: 1, + Name: "1", + Value: EChartsSeriesDataValue{ + values: []float64{ + 1, + }, + }, }, { - Name: "2", - Value: 2, + Name: "2", + Value: EChartsSeriesDataValue{ + values: []float64{ + 2, + }, + }, }, }, }, @@ -474,13 +482,13 @@ func TestEChartsSeriesList(t *testing.T) { Type: ChartTypeBar, Data: []EChartsSeriesData{ { - Value: 1, + Value: NewEChartsSeriesDataValue(1), ItemStyle: EChartStyle{ Color: "#aaa", }, }, { - Value: 2, + Value: NewEChartsSeriesDataValue(2), }, }, YAxisIndex: 1, @@ -488,10 +496,10 @@ func TestEChartsSeriesList(t *testing.T) { { Data: []EChartsSeriesData{ { - Value: 3, + Value: NewEChartsSeriesDataValue(3), }, { - Value: 4, + Value: NewEChartsSeriesDataValue(4), }, }, ItemStyle: EChartStyle{ diff --git a/examples/charts/main.go b/examples/charts/main.go index b175126..3ecb711 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -1483,6 +1483,75 @@ func echartsHandler(w http.ResponseWriter, req *http.Request) { } ] }`, + `{ + "title": { + "text": "Basic Radar Chart" + }, + "legend": { + "data": [ + "Allocated Budget", + "Actual Spending" + ] + }, + "radar": { + "indicator": [ + { + "name": "Sales", + "max": 6500 + }, + { + "name": "Administration", + "max": 16000 + }, + { + "name": "Information Technology", + "max": 30000 + }, + { + "name": "Customer Support", + "max": 38000 + }, + { + "name": "Development", + "max": 52000 + }, + { + "name": "Marketing", + "max": 25000 + } + ] + }, + "series": [ + { + "name": "Budget vs spending", + "type": "radar", + "data": [ + { + "value": [ + 4200, + 3000, + 20000, + 35000, + 50000, + 18000 + ], + "name": "Allocated Budget" + }, + { + "value": [ + 5000, + 14000, + 28000, + 26000, + 42000, + 21000 + ], + "name": "Actual Spending" + } + ] + } + ] + }`, `{ "legend": { "top": "-140", diff --git a/line.go b/line.go index e1f3583..0fc25d6 100644 --- a/line.go +++ b/line.go @@ -55,25 +55,23 @@ func (d *Draw) lineFill(points []Point, style LineStyle) { if !(s.ShouldDrawStroke() && s.ShouldDrawFill()) { return } - r := d.Render - var x, y int - s.GetFillOptions().WriteDrawingOptionsToRenderer(r) - for index, point := range points { - x = point.X - y = point.Y - if index == 0 { - d.moveTo(x, y) - } else { - d.lineTo(x, y) - } - } - height := d.Box.Height() - d.lineTo(x, height) + + newPoints := make([]Point, len(points)) + copy(newPoints, points) x0 := points[0].X y0 := points[0].Y - d.lineTo(x0, height) - d.lineTo(x0, y0) - r.Fill() + height := d.Box.Height() + newPoints = append(newPoints, Point{ + X: points[len(points)-1].X, + Y: height, + }, Point{ + X: x0, + Y: height, + }, Point{ + X: x0, + Y: y0, + }) + d.fill(newPoints, style.Style()) } func (d *Draw) lineDot(points []Point, style LineStyle) { diff --git a/radar_chart.go b/radar_chart.go index 667e3a0..c0f61b0 100644 --- a/radar_chart.go +++ b/radar_chart.go @@ -30,12 +30,13 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) -// 线 E0E6F1 -// 填充 rgb(210,219,238) fill-opacity="0.2" - type RadarIndicator struct { + // Indicator's name Name string - Max float64 + // The maximum value of indicator + Max float64 + // The minimum value of indicator + Min float64 } type radarChartOption struct { @@ -150,18 +151,19 @@ func radarChartRender(opt radarChartOption, result *basicRenderResult) error { // 雷达图 angles := getPolygonPointAngles(sides) maxCount := len(opt.Indicators) - for i, series := range opt.SeriesList { + for _, series := range opt.SeriesList { linePoints := make([]Point, 0, maxCount) for j, item := range series.Data { if j >= maxCount { continue } - percent := item.Value / opt.Indicators[j].Max + indicator := opt.Indicators[j] + percent := (item.Value - indicator.Min) / (indicator.Max - indicator.Min) r := percent * radius p := getPolygonPoint(center, r, angles[j]) linePoints = append(linePoints, p) } - color := theme.GetSeriesColor(i) + color := theme.GetSeriesColor(series.index) dotFillColor := drawing.ColorWhite if theme.IsDark() { dotFillColor = color @@ -176,7 +178,7 @@ func radarChartRender(opt radarChartOption, result *basicRenderResult) error { FillColor: color.WithAlpha(20), } d.lineStroke(linePoints, s) - d.lineFill(linePoints, s) + d.fill(linePoints, s.Style()) d.lineDot(linePoints[0:len(linePoints)-1], s) } return nil diff --git a/radar_chart_test.go b/radar_chart_test.go new file mode 100644 index 0000000..c5d2aa9 --- /dev/null +++ b/radar_chart_test.go @@ -0,0 +1,102 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestRadarChartRender(t *testing.T) { + assert := assert.New(t) + + d, err := NewDraw(DrawOption{ + Width: 250, + Height: 150, + }) + assert.Nil(err) + + f, _ := chart.GetDefaultFont() + err = radarChartRender(radarChartOption{ + Font: f, + Indicators: []RadarIndicator{ + { + Name: "Sales", + Max: 6500, + }, + { + Name: "Administration", + Max: 16000, + }, + { + Name: "Information Technology", + Max: 30000, + }, + { + Name: "Customer Support", + Max: 38000, + }, + { + Name: "Development", + Max: 52000, + }, + { + Name: "Marketing", + Max: 25000, + }, + }, + SeriesList: SeriesList{ + { + Type: ChartTypeRadar, + Data: NewSeriesDataFromValues([]float64{ + 4200, + 3000, + 20000, + 35000, + 50000, + 18000, + }), + }, + { + Type: ChartTypeRadar, + index: 1, + Data: NewSeriesDataFromValues([]float64{ + 5000, + 14000, + 28000, + 26000, + 42000, + 21000, + }), + }, + }, + }, &basicRenderResult{ + d: d, + }) + assert.Nil(err) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\nSalesAdministrationInformation TechnologyCustomer SupportDevelopmentMarketing", string(data)) +} From 5519d2eca6b43805b073439d611ae353c0882036 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 5 Mar 2022 07:22:32 +0800 Subject: [PATCH 104/251] feat: support funnel chart --- README.md | 6 +- README_zh.md | 11 +++- chart.go | 44 ++++++++++--- echarts.go | 5 +- examples/charts/main.go | 136 ++++++++++++++++++++++++++++++++++++++ funnel.go | 141 ++++++++++++++++++++++++++++++++++++++++ funnel_test.go | 91 ++++++++++++++++++++++++++ radar_chart.go | 12 +++- series.go | 4 ++ 9 files changed, 432 insertions(+), 18 deletions(-) create mode 100644 funnel.go create mode 100644 funnel_test.go diff --git a/README.md b/README.md index 30d9675..6cafc68 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [中文](./README_zh.md) -`go-charts` base on [go-chart](https://github.com/wcharczuk/go-chart),it is simpler way for generating charts, which supports `svg` and `png` format and three themes: `light`, `dark` and `grafana`. +`go-charts` base on [go-chart](https://github.com/wcharczuk/go-chart),it is simpler way for generating charts, which supports `svg` and `png` format and themes: `light`, `dark`, `grafana` and `ant`. `Apache ECharts` is popular among Front-end developers, so `go-charts` supports the option of `Apache ECharts`. Developers can generate charts almost the same as `Apache ECharts`. @@ -17,7 +17,7 @@ Screenshot of common charts, the left part is light theme, the right part is gra ## Chart Type -Support three chart types: `line`, `bar` and `pie`. +These chart types are supported: `line`, `bar`, `pie`, `radar` or `funnel`. ## Example @@ -159,7 +159,7 @@ The name with `[]` is new parameter, others are the same as `echarts`. - `radar.indicator.min` The minimum value of indicator, default value is 0. - `series` The series for chart - `series.name` Series name used for displaying in legend. - - `series.type` Series type: `line`, `bar` or`pie` + - `series.type` Series type: `line`, `bar`, `pie`, `radar` or `funnel` - `series.radius` Radius of Pie chart:`50%`, default is `40%` - `series.yAxisIndex` Index of y axis to combine with, which is useful for multiple y axes in one chart - `series.label.show` Whether to show label diff --git a/README_zh.md b/README_zh.md index f4f5d4a..e3747e7 100644 --- a/README_zh.md +++ b/README_zh.md @@ -3,7 +3,7 @@ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-charts/blob/master/LICENSE) [![Build Status](https://github.com/vicanso/go-charts/workflows/Test/badge.svg)](https://github.com/vicanso/go-charts/actions) -`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart),更简单方便的形式生成数据图表,支持`svg`与`png`两种方式的输出,支持三种主题`light`, `dark`以及`grafana`。 +`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart),更简单方便的形式生成数据图表,支持`svg`与`png`两种方式的输出,支持主题`light`, `dark`, `grafana`以及`ant`。 `Apache ECharts`在前端开发中得到众多开发者的认可,因此`go-charts`提供了兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的图表截图(主题为light与grafana): @@ -14,7 +14,7 @@ ## 支持图表类型 -暂仅支持三种的图表类型:`line`, `bar` 以及 `pie` +支持以下的图表类型:`line`, `bar`, `pie`, `radar` 以及 `funnel` ## 示例 @@ -155,9 +155,14 @@ func main() { - `legend.padding` legend的padding,配置方式与图表的`padding`一致 - `legend.left` legend离容器左侧的距离,其值可以为具体的像素值(20)或百分比(20%)、`left`或者`right` - `legend.top` legend离容器顶部的距离,暂仅支持数值形式 +- `radar` 雷达图的坐标系 + - `radar.indicator` 雷达图的指示器,用来指定雷达图中的多个变量(维度) + - `radar.indicator.name` 指示器名称 + - `radar.indicator.max` 指示器的最大值,可选,建议设置 + - `radar.indicator.min` 指示器的最小值,可选,默认为 0 - `series` 图表的数据项列表 - `series.name` 图表的名称,与`legend.data`对应,两者只只设置其一 - - `series.type` 图表的展示类型,暂支持`line`, `bar`以及`pie`,需要注意`pie`只能单独使用 + - `series.type` 图表的展示类型,暂支持`line`, `bar`, `pie`, `radar` 以及 `funnel`。需要注意只有`line`与`bar`可以混用 - `series.radius` 饼图的半径值,如`50%`,默认为`40%` - `series.yAxisIndex` 该数据项使用的y轴,默认为0,对yAxis的配置对应 - `series.label.show` 是否显示文本标签(默认为对应的值) diff --git a/chart.go b/chart.go index 2903051..e169387 100644 --- a/chart.go +++ b/chart.go @@ -25,6 +25,7 @@ package charts import ( "errors" "math" + "sort" "strings" "github.com/golang/freetype/truetype" @@ -33,10 +34,11 @@ import ( ) const ( - ChartTypeLine = "line" - ChartTypeBar = "bar" - ChartTypePie = "pie" - ChartTypeRadar = "radar" + ChartTypeLine = "line" + ChartTypeBar = "bar" + ChartTypePie = "pie" + ChartTypeRadar = "radar" + ChartTypeFunnel = "funnel" ) const ( @@ -161,10 +163,19 @@ func (o *ChartOption) FillDefault(theme string) { } else { seriesCount := len(o.SeriesList) for index, name := range o.Legend.Data { - if index < seriesCount { + if index < seriesCount && + len(o.SeriesList[index].Name) == 0 { o.SeriesList[index].Name = name } } + nameIndexDict := map[string]int{} + for index, name := range o.Legend.Data { + nameIndexDict[name] = index + } + // 保证series的顺序与legend一致 + sort.Slice(o.SeriesList, func(i, j int) bool { + return nameIndexDict[o.SeriesList[i].Name] < nameIndexDict[o.SeriesList[j].Name] + }) } // 如果无legend数据,则隐藏 if len(strings.Join(o.Legend.Data, "")) == 0 { @@ -289,13 +300,17 @@ func Render(opt ChartOption) (*Draw, error) { barSeries := make([]Series, 0) isPieChart := false isRadarChart := false - for index, item := range opt.SeriesList { - item.index = index + isFunnelChart := false + for index := range opt.SeriesList { + opt.SeriesList[index].index = index + item := opt.SeriesList[index] switch item.Type { case ChartTypePie: isPieChart = true case ChartTypeRadar: isRadarChart = true + case ChartTypeFunnel: + isFunnelChart = true case ChartTypeBar: barSeries = append(barSeries, item) default: @@ -305,7 +320,9 @@ func Render(opt ChartOption) (*Draw, error) { // 如果指定了pie,则以pie的形式处理,pie不支持多类型图表 // pie不需要axis // radar 同样处理 - if isPieChart || isRadarChart { + if isPieChart || + isRadarChart || + isFunnelChart { opt.XAxis.Hidden = true for index := range opt.YAxisList { opt.YAxisList[index].Hidden = true @@ -340,6 +357,17 @@ func Render(opt ChartOption) (*Draw, error) { Indicators: opt.RadarIndicators, }, result) }, + // funnel render + func() error { + if !isFunnelChart { + return nil + } + return funnelChartRender(funnelChartOption{ + SeriesList: opt.SeriesList, + Theme: opt.Theme, + Font: opt.Font, + }, result) + }, // bar render func() error { // 如果是pie或者无bar类型的series diff --git a/echarts.go b/echarts.go index 086dc45..fd38376 100644 --- a/echarts.go +++ b/echarts.go @@ -330,8 +330,9 @@ func (esList EChartsSeriesList) ToSeriesList() SeriesList { } continue } - // 如果是radar - if item.Type == ChartTypeRadar { + // 如果是radar或funnel + if item.Type == ChartTypeRadar || + item.Type == ChartTypeFunnel { for _, dataItem := range item.Data { seriesList = append(seriesList, Series{ Name: dataItem.Name, diff --git a/examples/charts/main.go b/examples/charts/main.go index 3ecb711..1d591fc 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -556,6 +556,57 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, }, }, + // 漏斗图 + { + Title: charts.TitleOption{ + Text: "Funnel", + }, + Legend: charts.NewLegendOption([]string{ + "Show", + "Click", + "Visit", + "Inquiry", + "Order", + }), + SeriesList: []charts.Series{ + { + Type: charts.ChartTypeFunnel, + Name: "Visit", + Data: charts.NewSeriesDataFromValues([]float64{ + 60, + }), + Max: charts.NewFloatPoint(120), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Inquiry", + Data: charts.NewSeriesDataFromValues([]float64{ + 40, + }), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Order", + Data: charts.NewSeriesDataFromValues([]float64{ + 20, + }), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Click", + Data: charts.NewSeriesDataFromValues([]float64{ + 80, + }), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Show", + Data: charts.NewSeriesDataFromValues([]float64{ + 100, + }), + }, + }, + }, // 多图展示 { Legend: charts.LegendOption{ @@ -1552,6 +1603,91 @@ func echartsHandler(w http.ResponseWriter, req *http.Request) { } ] }`, + `{ + "title": { + "text": "Funnel" + }, + "tooltip": { + "trigger": "item", + "formatter": "{a}
{b} : {c}%" + }, + "toolbox": { + "feature": { + "dataView": { + "readOnly": false + }, + "restore": {}, + "saveAsImage": {} + } + }, + "legend": { + "data": [ + "Show", + "Click", + "Visit", + "Inquiry", + "Order" + ] + }, + "series": [ + { + "name": "Funnel", + "type": "funnel", + "left": "10%", + "top": 60, + "bottom": 60, + "width": "80%", + "min": 0, + "max": 100, + "minSize": "0%", + "maxSize": "100%", + "sort": "descending", + "gap": 2, + "label": { + "show": true, + "position": "inside" + }, + "labelLine": { + "length": 10, + "lineStyle": { + "width": 1, + "type": "solid" + } + }, + "itemStyle": { + "borderColor": "#fff", + "borderWidth": 1 + }, + "emphasis": { + "label": { + "fontSize": 20 + } + }, + "data": [ + { + "value": 60, + "name": "Visit" + }, + { + "value": 40, + "name": "Inquiry" + }, + { + "value": 20, + "name": "Order" + }, + { + "value": 80, + "name": "Click" + }, + { + "value": 100, + "name": "Show" + } + ] + } + ] + }`, `{ "legend": { "top": "-140", diff --git a/funnel.go b/funnel.go new file mode 100644 index 0000000..2307fea --- /dev/null +++ b/funnel.go @@ -0,0 +1,141 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "fmt" + "sort" + + "github.com/dustin/go-humanize" + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" +) + +type funnelChartOption struct { + Theme string + Font *truetype.Font + SeriesList SeriesList +} + +func funnelChartRender(opt funnelChartOption, result *basicRenderResult) error { + d, err := NewDraw(DrawOption{ + Parent: result.d, + }, PaddingOption(chart.Box{ + Top: result.titleBox.Height(), + })) + if err != nil { + return err + } + seriesList := make([]Series, len(opt.SeriesList)) + copy(seriesList, opt.SeriesList) + sort.Slice(seriesList, func(i, j int) bool { + // 大的数据在前 + return seriesList[i].Data[0].Value > seriesList[j].Data[0].Value + }) + max := float64(100) + min := float64(0) + for _, item := range seriesList { + if item.Max != nil { + max = *item.Max + } + if item.Min != nil { + min = *item.Min + } + } + + theme := NewTheme(opt.Theme) + gap := 2 + height := d.Box.Height() + width := d.Box.Width() + count := len(seriesList) + + h := (height - gap*(count-1)) / count + + y := 0 + widthList := make([]int, len(seriesList)) + textList := make([]string, len(seriesList)) + for index, item := range seriesList { + value := item.Data[0].Value + percent := (item.Data[0].Value - min) / (max - min) + w := int(percent * float64(width)) + widthList[index] = w + p := humanize.CommafWithDigits(value, 2) + "%" + textList[index] = fmt.Sprintf("%s(%s)", item.Name, p) + } + + for index, w := range widthList { + series := seriesList[index] + nextWidth := 0 + if index+1 < len(widthList) { + nextWidth = widthList[index+1] + } + topStartX := (width - w) >> 1 + topEndX := topStartX + w + bottomStartX := (width - nextWidth) >> 1 + bottomEndX := bottomStartX + nextWidth + points := []Point{ + { + X: topStartX, + Y: y, + }, + { + X: topEndX, + Y: y, + }, + { + X: bottomEndX, + Y: y + h, + }, + { + X: bottomStartX, + Y: y + h, + }, + { + X: topStartX, + Y: y, + }, + } + color := theme.GetSeriesColor(series.index) + d.fill(points, chart.Style{ + FillColor: color, + }) + + // 文本 + text := textList[index] + r := d.Render + textStyle := chart.Style{ + FontColor: theme.GetTextColor(), + FontSize: labelFontSize, + Font: opt.Font, + } + textStyle.GetTextOptions().WriteToRenderer(r) + textBox := r.MeasureText(text) + textX := width>>1 - textBox.Width()>>1 + textY := y + h>>1 + d.text(text, textX, textY) + + y += (h + gap) + } + + return nil +} diff --git a/funnel_test.go b/funnel_test.go new file mode 100644 index 0000000..530fa53 --- /dev/null +++ b/funnel_test.go @@ -0,0 +1,91 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" +) + +func TestFunnelChartRender(t *testing.T) { + assert := assert.New(t) + + d, err := NewDraw(DrawOption{ + Width: 250, + Height: 150, + }) + assert.Nil(err) + f, _ := chart.GetDefaultFont() + err = funnelChartRender(funnelChartOption{ + Font: f, + SeriesList: []Series{ + { + Type: ChartTypeFunnel, + Name: "Visit", + Data: NewSeriesDataFromValues([]float64{ + 60, + }), + }, + { + Type: ChartTypeFunnel, + Name: "Inquiry", + Data: NewSeriesDataFromValues([]float64{ + 40, + }), + index: 1, + }, + { + Type: ChartTypeFunnel, + Name: "Order", + Data: NewSeriesDataFromValues([]float64{ + 20, + }), + index: 2, + }, + { + Type: ChartTypeFunnel, + Name: "Click", + Data: NewSeriesDataFromValues([]float64{ + 80, + }), + index: 3, + }, + { + Type: ChartTypeFunnel, + Name: "Show", + Data: NewSeriesDataFromValues([]float64{ + 100, + }), + index: 4, + }, + }, + }, &basicRenderResult{ + d: d, + }) + assert.Nil(err) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\nShow(100%)Click(80%)Visit(60%)Inquiry(40%)Order(20%)", string(data)) +} diff --git a/radar_chart.go b/radar_chart.go index c0f61b0..364213d 100644 --- a/radar_chart.go +++ b/radar_chart.go @@ -51,9 +51,17 @@ func radarChartRender(opt radarChartOption, result *basicRenderResult) error { if sides < 3 { return errors.New("The count of indicator should be >= 3") } - for _, indicator := range opt.Indicators { + maxValues := make([]float64, len(opt.Indicators)) + for _, series := range opt.SeriesList { + for index, item := range series.Data { + if index < len(maxValues) && item.Value > maxValues[index] { + maxValues[index] = item.Value + } + } + } + for index, indicator := range opt.Indicators { if indicator.Max <= 0 { - return errors.New("The max of indicator should be > 0") + opt.Indicators[index].Max = maxValues[index] } } d, err := NewDraw(DrawOption{ diff --git a/series.go b/series.go index 8a9ba73..a1b7486 100644 --- a/series.go +++ b/series.go @@ -115,6 +115,10 @@ type Series struct { MarkPoint SeriesMarkPoint // Make line for series MarkLine SeriesMarkLine + // Max value of series + Min *float64 + // Min value of series + Max *float64 } type SeriesList []Series From 1894670c2a4e985ffc1d2acfd818448571428a86 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 5 Mar 2022 08:16:56 +0800 Subject: [PATCH 105/251] fix: fix funnel percent value --- examples/charts/main.go | 1 - funnel.go | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/charts/main.go b/examples/charts/main.go index 1d591fc..bac7106 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -575,7 +575,6 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { Data: charts.NewSeriesDataFromValues([]float64{ 60, }), - Max: charts.NewFloatPoint(120), }, { Type: charts.ChartTypeFunnel, diff --git a/funnel.go b/funnel.go index 2307fea..f083306 100644 --- a/funnel.go +++ b/funnel.go @@ -52,7 +52,7 @@ func funnelChartRender(opt funnelChartOption, result *basicRenderResult) error { // 大的数据在前 return seriesList[i].Data[0].Value > seriesList[j].Data[0].Value }) - max := float64(100) + max := seriesList[0].Data[0].Value min := float64(0) for _, item := range seriesList { if item.Max != nil { @@ -76,10 +76,10 @@ func funnelChartRender(opt funnelChartOption, result *basicRenderResult) error { textList := make([]string, len(seriesList)) for index, item := range seriesList { value := item.Data[0].Value - percent := (item.Data[0].Value - min) / (max - min) - w := int(percent * float64(width)) + widthPercent := (value - min) / (max - min) + w := int(widthPercent * float64(width)) widthList[index] = w - p := humanize.CommafWithDigits(value, 2) + "%" + p := humanize.CommafWithDigits(value/max*100, 2) + "%" textList[index] = fmt.Sprintf("%s(%s)", item.Name, p) } From 939c43204015c7f1f34a25a335ef26b3624ef968 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 5 Mar 2022 08:19:54 +0800 Subject: [PATCH 106/251] chore: update go modules --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1905035..aeaf617 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/vicanso/elton v1.8.1 - github.com/vicanso/go-charts v0.0.5-0.20220219094446-28bb9c57bcca + github.com/vicanso/go-charts v1.0.1-0.20220305001656-1894670c2a4e ) require ( diff --git a/go.sum b/go.sum index 303052b..932081c 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/vicanso/elton v1.8.1 h1:axrPozxBaTn9qqCJJ+aSGK+/Y8oLuEm0uXM5wm/glIs= github.com/vicanso/elton v1.8.1/go.mod h1:BWQknlDpKtw2L5oer3mtBJo/vpBUYUHAjZL3yFV1+ak= -github.com/vicanso/go-charts v0.0.5-0.20220219094446-28bb9c57bcca h1:11TMrOVTh2aWkGDXp4F4vgt9fOmod0powqcaFvzsXHQ= -github.com/vicanso/go-charts v0.0.5-0.20220219094446-28bb9c57bcca/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= +github.com/vicanso/go-charts v1.0.1-0.20220305001656-1894670c2a4e h1:vfN8mUGd4w6XGp3JrjvP3o17FGNiaF55Hb+5tLxCZCE= +github.com/vicanso/go-charts v1.0.1-0.20220305001656-1894670c2a4e/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= github.com/vicanso/hes v0.4.1 h1:lq27wDXAljoROtYbFDTL5gY51SdeY+9L0ohEiRadwTU= github.com/vicanso/hes v0.4.1/go.mod h1:B0l1NIQM/nYw7owAd+hyHuNnAD8Nsx0T6duhVxmXUBY= github.com/vicanso/intranet-ip v0.0.1 h1:cYS+mExFsKqewWSuHtFwAqw/CO66GsheB/P1BPmSTx0= From e5e5677720d2626c586b389d2834eacf7976c2ca Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 5 Mar 2022 08:20:54 +0800 Subject: [PATCH 107/251] chore: update elton version --- go.mod | 6 +++--- go.sum | 13 ++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index aeaf617..fcc1a4c 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/vicanso/go-charts-web go 1.17 require ( - github.com/vicanso/elton v1.8.1 + github.com/vicanso/elton v1.8.3 github.com/vicanso/go-charts v1.0.1-0.20220305001656-1894670c2a4e ) @@ -11,10 +11,10 @@ require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/tidwall/gjson v1.12.1 // indirect + github.com/tidwall/gjson v1.13.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect - github.com/vicanso/hes v0.4.1 // indirect + github.com/vicanso/hes v0.5.0 // indirect github.com/vicanso/intranet-ip v0.0.1 // indirect github.com/vicanso/keygrip v1.2.1 // indirect github.com/wcharczuk/go-chart/v2 v2.1.0 // indirect diff --git a/go.sum b/go.sum index 932081c..95caccc 100644 --- a/go.sum +++ b/go.sum @@ -14,19 +14,18 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tidwall/gjson v1.12.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.12.1 h1:ikuZsLdhr8Ws0IdROXUS1Gi4v9Z4pGqpX/CvJkxvfpo= -github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.13.0 h1:3TFY9yxOQShrvmjdM76K+jc66zJeT6D3/VFFYCGQf7M= +github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/vicanso/elton v1.8.1 h1:axrPozxBaTn9qqCJJ+aSGK+/Y8oLuEm0uXM5wm/glIs= -github.com/vicanso/elton v1.8.1/go.mod h1:BWQknlDpKtw2L5oer3mtBJo/vpBUYUHAjZL3yFV1+ak= +github.com/vicanso/elton v1.8.3 h1:4Zgkz5iBMocui2CdhzQC57ufJa+gYIpp3ZMSL4cSypc= +github.com/vicanso/elton v1.8.3/go.mod h1:kRFBJUwOyowPf2m2QHiOceWqqLPPV6/gClwTlkAIjyw= github.com/vicanso/go-charts v1.0.1-0.20220305001656-1894670c2a4e h1:vfN8mUGd4w6XGp3JrjvP3o17FGNiaF55Hb+5tLxCZCE= github.com/vicanso/go-charts v1.0.1-0.20220305001656-1894670c2a4e/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= -github.com/vicanso/hes v0.4.1 h1:lq27wDXAljoROtYbFDTL5gY51SdeY+9L0ohEiRadwTU= -github.com/vicanso/hes v0.4.1/go.mod h1:B0l1NIQM/nYw7owAd+hyHuNnAD8Nsx0T6duhVxmXUBY= +github.com/vicanso/hes v0.5.0 h1:CLbjbJl5lvVyAD44Dai0EXatGL7L5UWpvNwVtMyS2Eg= +github.com/vicanso/hes v0.5.0/go.mod h1:B0l1NIQM/nYw7owAd+hyHuNnAD8Nsx0T6duhVxmXUBY= github.com/vicanso/intranet-ip v0.0.1 h1:cYS+mExFsKqewWSuHtFwAqw/CO66GsheB/P1BPmSTx0= github.com/vicanso/intranet-ip v0.0.1/go.mod h1:bqQ6VUhxdz0ipSb1kzd6aoZStlp+pB7CTlVmVhgLAxA= github.com/vicanso/keygrip v1.2.1 h1:876fXDwGJqxdi4JxZ1lNGBxYswyLZotrs7AA2QWcLeY= From 58aa096ae1a705848ef73a4586cb9b9644408b7a Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 5 Mar 2022 13:43:31 +0800 Subject: [PATCH 108/251] docs: update screenshot --- assets/go-charts.png | Bin 227978 -> 372652 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/go-charts.png b/assets/go-charts.png index 12d0cad34bb68d2d7ad9855cf156d7bea93724db..5ead96171cd7989ba1666b8492f341425a701a95 100644 GIT binary patch literal 372652 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Ȧ@}U3x+-;Jv|;DY=kz{9BKN5wNwjfH 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

jh85;|DNbP7O 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⁡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 jsF^`R)N@iG Date: Sat, 5 Mar 2022 20:20:12 +0800 Subject: [PATCH 109/251] chore: update go modules --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index fcc1a4c..8348982 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/vicanso/elton v1.8.3 - github.com/vicanso/go-charts v1.0.1-0.20220305001656-1894670c2a4e + github.com/vicanso/go-charts v1.0.1-0.20220305054331-58aa096ae1a7 ) require ( diff --git a/go.sum b/go.sum index 95caccc..ab9b25f 100644 --- a/go.sum +++ b/go.sum @@ -24,6 +24,8 @@ github.com/vicanso/elton v1.8.3 h1:4Zgkz5iBMocui2CdhzQC57ufJa+gYIpp3ZMSL4cSypc= github.com/vicanso/elton v1.8.3/go.mod h1:kRFBJUwOyowPf2m2QHiOceWqqLPPV6/gClwTlkAIjyw= github.com/vicanso/go-charts v1.0.1-0.20220305001656-1894670c2a4e h1:vfN8mUGd4w6XGp3JrjvP3o17FGNiaF55Hb+5tLxCZCE= github.com/vicanso/go-charts v1.0.1-0.20220305001656-1894670c2a4e/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= +github.com/vicanso/go-charts v1.0.1-0.20220305054331-58aa096ae1a7 h1:SFs8NcxSqjtJDCYck9rlePKfl7if07T1b/davnoK5AI= +github.com/vicanso/go-charts v1.0.1-0.20220305054331-58aa096ae1a7/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= github.com/vicanso/hes v0.5.0 h1:CLbjbJl5lvVyAD44Dai0EXatGL7L5UWpvNwVtMyS2Eg= github.com/vicanso/hes v0.5.0/go.mod h1:B0l1NIQM/nYw7owAd+hyHuNnAD8Nsx0T6duhVxmXUBY= github.com/vicanso/intranet-ip v0.0.1 h1:cYS+mExFsKqewWSuHtFwAqw/CO66GsheB/P1BPmSTx0= From 82e05eec64796df3ba7dcc47bb49354ac22d9458 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 5 Mar 2022 20:42:49 +0800 Subject: [PATCH 110/251] refactor: support max and min echarts option for funnel --- echarts.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/echarts.go b/echarts.go index fd38376..4ebb9ad 100644 --- a/echarts.go +++ b/echarts.go @@ -305,6 +305,8 @@ type EChartsSeries struct { Label EChartsLabelOption `json:"label"` MarkPoint EChartsMarkPoint `json:"markPoint"` MarkLine EChartsMarkLine `json:"markLine"` + Max *float64 `json:"max"` + Min *float64 `json:"min"` } type EChartsSeriesList []EChartsSeries @@ -338,6 +340,8 @@ func (esList EChartsSeriesList) ToSeriesList() SeriesList { Name: dataItem.Name, Type: item.Type, Data: NewSeriesDataFromValues(dataItem.Value.values), + Max: item.Max, + Min: item.Min, }) } continue From f8a18793c444471be70d3b3969a7cfdaa6918bb4 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 5 Mar 2022 21:31:35 +0800 Subject: [PATCH 111/251] chore: update modules --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 8348982..ad50c49 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/vicanso/elton v1.8.3 - github.com/vicanso/go-charts v1.0.1-0.20220305054331-58aa096ae1a7 + github.com/vicanso/go-charts v1.0.1-0.20220305124249-82e05eec6479 ) require ( diff --git a/go.sum b/go.sum index ab9b25f..096648f 100644 --- a/go.sum +++ b/go.sum @@ -22,10 +22,8 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/vicanso/elton v1.8.3 h1:4Zgkz5iBMocui2CdhzQC57ufJa+gYIpp3ZMSL4cSypc= github.com/vicanso/elton v1.8.3/go.mod h1:kRFBJUwOyowPf2m2QHiOceWqqLPPV6/gClwTlkAIjyw= -github.com/vicanso/go-charts v1.0.1-0.20220305001656-1894670c2a4e h1:vfN8mUGd4w6XGp3JrjvP3o17FGNiaF55Hb+5tLxCZCE= -github.com/vicanso/go-charts v1.0.1-0.20220305001656-1894670c2a4e/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= -github.com/vicanso/go-charts v1.0.1-0.20220305054331-58aa096ae1a7 h1:SFs8NcxSqjtJDCYck9rlePKfl7if07T1b/davnoK5AI= -github.com/vicanso/go-charts v1.0.1-0.20220305054331-58aa096ae1a7/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= +github.com/vicanso/go-charts v1.0.1-0.20220305124249-82e05eec6479 h1:C4fiwWrTi0pQyp3VtlZT0xJspWqCEQ+wewCzK2YTEig= +github.com/vicanso/go-charts v1.0.1-0.20220305124249-82e05eec6479/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= github.com/vicanso/hes v0.5.0 h1:CLbjbJl5lvVyAD44Dai0EXatGL7L5UWpvNwVtMyS2Eg= github.com/vicanso/hes v0.5.0/go.mod h1:B0l1NIQM/nYw7owAd+hyHuNnAD8Nsx0T6duhVxmXUBY= github.com/vicanso/intranet-ip v0.0.1 h1:cYS+mExFsKqewWSuHtFwAqw/CO66GsheB/P1BPmSTx0= From 981e5a0d27ac2f3c72f0154c22161b35f1fd3a1d Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 7 Mar 2022 20:48:19 +0800 Subject: [PATCH 112/251] fix: fix padding of chart --- chart.go | 10 +++++----- chart_test.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/chart.go b/chart.go index e169387..9748a95 100644 --- a/chart.go +++ b/chart.go @@ -370,8 +370,8 @@ func Render(opt ChartOption) (*Draw, error) { }, // bar render func() error { - // 如果是pie或者无bar类型的series - if isPieChart || len(barSeries) == 0 { + // 如果无bar类型的series + if len(barSeries) == 0 { return nil } options, err := barChartRender(barChartOption{ @@ -387,8 +387,8 @@ func Render(opt ChartOption) (*Draw, error) { }, // line render func() error { - // 如果是pie或者无line类型的series - if isPieChart || len(lineSeries) == 0 { + // 如果无line类型的series + if len(lineSeries) == 0 { return nil } options, err := lineChartRender(lineChartOption{ @@ -444,8 +444,8 @@ func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { Width: opt.getWidth(), Height: opt.getHeight(), }, - PaddingOption(opt.Padding), BoxOption(opt.Box), + PaddingOption(opt.Padding), ) if err != nil { return nil, err diff --git a/chart_test.go b/chart_test.go index 1f4d1f4..c73745e 100644 --- a/chart_test.go +++ b/chart_test.go @@ -338,7 +338,7 @@ func TestChartRender(t *testing.T) { assert.Nil(err) data, err := d.Bytes() assert.Nil(err) - assert.Equal("\\n2012201320142015201620170153045607590Milk TeaMatcha LatteCheese CocoaWalnut BrownieMilk Tea: 34.03%Matcha Latte: 27.66%Cheese Cocoa: 22.32%Walnut Brownie: 15.96%SalesAdministrationInformation TechnologyCustomer SupportDevelopmentMarketingAllocated BudgetActual Spending", string(data)) + assert.Equal("\\n2012201320142015201620170153045607590Milk TeaMatcha LatteCheese CocoaWalnut BrownieMilk Tea: 34.03%Matcha Latte: 27.66%Cheese Cocoa: 22.32%Walnut Brownie: 15.96%SalesAdministrationInformation TechnologyCustomer SupportDevelopmentMarketingAllocated BudgetActual Spending", string(data)) } func BenchmarkMultiChartPNGRender(b *testing.B) { From 1be8d43405cf646624d4f8e3dde1906e40f18489 Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 7 Mar 2022 21:00:32 +0800 Subject: [PATCH 113/251] refactor: return error if sum value of pie is not gt 0 --- pie_chart.go | 4 ++++ pie_chart_test.go | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/pie_chart.go b/pie_chart.go index 4833c34..099a91c 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -23,6 +23,7 @@ package charts import ( + "errors" "math" "github.com/golang/freetype/truetype" @@ -68,6 +69,9 @@ func pieChartRender(opt pieChartOption, result *basicRenderResult) error { values[index] = value total += value } + if total <= 0 { + return errors.New("The sum value of pie chart should gt 0") + } r := d.Render theme := NewTheme(opt.Theme) diff --git a/pie_chart_test.go b/pie_chart_test.go index 7cb9fde..84072be 100644 --- a/pie_chart_test.go +++ b/pie_chart_test.go @@ -46,10 +46,12 @@ func TestPieChartRender(t *testing.T) { SeriesList: NewPieSeriesList([]float64{ 5, 10, + 0, }, PieSeriesOption{ Names: []string{ "a", "b", + "c", }, Label: SeriesLabel{ Show: true, @@ -63,5 +65,5 @@ func TestPieChartRender(t *testing.T) { assert.Nil(err) data, err := d.Bytes() assert.Nil(err) - assert.Equal("\\na: 33.33%b: 66.66%", string(data)) + assert.Equal("\\na: 33.33%b: 66.66%c: 0%", string(data)) } From 2316689ce59ecb25889dd4b9c3d2165354eec962 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 8 Mar 2022 23:33:16 +0800 Subject: [PATCH 114/251] feat: support option function for chart render --- chart.go | 5 +- chart_option.go | 185 +++++++++++++++++++++++++++++++++ chart_option_test.go | 238 +++++++++++++++++++++++++++++++++++++++++++ series.go | 2 +- series_test.go | 2 +- 5 files changed, 429 insertions(+), 3 deletions(-) create mode 100644 chart_option.go create mode 100644 chart_option_test.go diff --git a/chart.go b/chart.go index 9748a95..6f4740f 100644 --- a/chart.go +++ b/chart.go @@ -283,7 +283,10 @@ func (r *basicRenderResult) getYRange(index int) *Range { } // Render renders the chart by option -func Render(opt ChartOption) (*Draw, error) { +func Render(opt ChartOption, optFuncs ...OptionFunc) (*Draw, error) { + for _, optFunc := range optFuncs { + optFunc(&opt) + } if len(opt.SeriesList) == 0 { return nil, errors.New("series can not be nil") } diff --git a/chart_option.go b/chart_option.go new file mode 100644 index 0000000..1bbf4cf --- /dev/null +++ b/chart_option.go @@ -0,0 +1,185 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +// OptionFunc option function +type OptionFunc func(opt *ChartOption) + +// TypeOptionFunc set type of chart's output +func TypeOptionFunc(t string) OptionFunc { + return func(opt *ChartOption) { + opt.Type = t + } +} + +// FontFamilyOptionFunc set font family of chart +func FontFamilyOptionFunc(fontFamily string) OptionFunc { + return func(opt *ChartOption) { + opt.FontFamily = fontFamily + } +} + +// ThemeOptionFunc set them of chart +func ThemeOptionFunc(theme string) OptionFunc { + return func(opt *ChartOption) { + opt.Theme = theme + } +} + +// TitleOptionFunc set title of chart +func TitleOptionFunc(title TitleOption) OptionFunc { + return func(opt *ChartOption) { + opt.Title = title + } +} + +// LegendOptionFunc set legend of chart +func LegendOptionFunc(legend LegendOption) OptionFunc { + return func(opt *ChartOption) { + opt.Legend = legend + } +} + +// XAxisOptionFunc set x axis of chart +func XAxisOptionFunc(xAxisOption XAxisOption) OptionFunc { + return func(opt *ChartOption) { + opt.XAxis = xAxisOption + } +} + +// YAxisOptionFunc set y axis of chart, support two y axis +func YAxisOptionFunc(yAxisOption ...YAxisOption) OptionFunc { + return func(opt *ChartOption) { + opt.YAxisList = yAxisOption + } +} + +// WidthOptionFunc set width of chart +func WidthOptionFunc(width int) OptionFunc { + return func(opt *ChartOption) { + opt.Width = width + } +} + +// HeightOptionFunc set height of chart +func HeightOptionFunc(height int) OptionFunc { + return func(opt *ChartOption) { + opt.Height = height + } +} + +// PaddingOptionFunc set padding of chart +func PaddingOptionFunc(padding chart.Box) OptionFunc { + return func(opt *ChartOption) { + opt.Padding = padding + } +} + +// BoxOptionFunc set box of chart +func BoxOptionFunc(box chart.Box) OptionFunc { + return func(opt *ChartOption) { + opt.Box = box + } +} + +// ChildOptionFunc add child chart +func ChildOptionFunc(child ...ChartOption) OptionFunc { + return func(opt *ChartOption) { + if opt.Children == nil { + opt.Children = make([]ChartOption, 0) + } + opt.Children = append(opt.Children, child...) + } +} + +// RadarIndicatorOptionFunc set radar indicator of chart +func RadarIndicatorOptionFunc(radarIndicator ...RadarIndicator) OptionFunc { + return func(opt *ChartOption) { + opt.RadarIndicators = radarIndicator + } +} + +// BackgroundColorOptionFunc set background color of chart +func BackgroundColorOptionFunc(color drawing.Color) OptionFunc { + return func(opt *ChartOption) { + opt.BackgroundColor = color + } +} + +// LineRender line chart render +func LineRender(values [][]float64, opts ...OptionFunc) (*Draw, error) { + seriesList := make(SeriesList, len(values)) + for index, value := range values { + seriesList[index] = NewSeriesFromValues(value, ChartTypeLine) + } + return Render(ChartOption{ + SeriesList: seriesList, + }, opts...) +} + +// BarRender bar chart render +func BarRender(values [][]float64, opts ...OptionFunc) (*Draw, error) { + seriesList := make(SeriesList, len(values)) + for index, value := range values { + seriesList[index] = NewSeriesFromValues(value, ChartTypeBar) + } + return Render(ChartOption{ + SeriesList: seriesList, + }, opts...) +} + +// PieRender pie chart render +func PieRender(values []float64, opts ...OptionFunc) (*Draw, error) { + return Render(ChartOption{ + SeriesList: NewPieSeriesList(values), + }, opts...) +} + +// RadarRender radar chart render +func RadarRender(values [][]float64, opts ...OptionFunc) (*Draw, error) { + seriesList := make(SeriesList, len(values)) + for index, value := range values { + seriesList[index] = NewSeriesFromValues(value, ChartTypeRadar) + } + return Render(ChartOption{ + SeriesList: seriesList, + }, opts...) +} + +// FunnelRender funnel chart render +func FunnelRender(values []float64, opts ...OptionFunc) (*Draw, error) { + seriesList := make(SeriesList, len(values)) + for index, value := range values { + seriesList[index] = NewSeriesFromValues([]float64{ + value, + }, ChartTypeFunnel) + } + return Render(ChartOption{ + SeriesList: seriesList, + }, opts...) +} diff --git a/chart_option_test.go b/chart_option_test.go new file mode 100644 index 0000000..41e8d50 --- /dev/null +++ b/chart_option_test.go @@ -0,0 +1,238 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestOptionFunc(t *testing.T) { + assert := assert.New(t) + + fns := []OptionFunc{ + TypeOptionFunc(ChartOutputPNG), + FontFamilyOptionFunc("fontFamily"), + ThemeOptionFunc("black"), + TitleOptionFunc(TitleOption{ + Text: "title", + }), + LegendOptionFunc(LegendOption{ + Data: []string{ + "a", + "b", + }, + }), + XAxisOptionFunc(NewXAxisOption([]string{ + "Mon", + "Tue", + })), + YAxisOptionFunc(YAxisOption{ + Min: NewFloatPoint(0), + Max: NewFloatPoint(100), + }), + WidthOptionFunc(400), + HeightOptionFunc(300), + PaddingOptionFunc(chart.Box{ + Top: 10, + }), + BoxOptionFunc(chart.Box{ + Left: 0, + Right: 300, + }), + ChildOptionFunc(ChartOption{}), + RadarIndicatorOptionFunc(RadarIndicator{ + Min: 0, + Max: 10, + }), + BackgroundColorOptionFunc(drawing.ColorBlack), + } + + opt := ChartOption{} + for _, fn := range fns { + fn(&opt) + } + + assert.Equal("png", opt.Type) + assert.Equal("fontFamily", opt.FontFamily) + assert.Equal("black", opt.Theme) + assert.Equal(TitleOption{ + Text: "title", + }, opt.Title) + assert.Equal(LegendOption{ + Data: []string{ + "a", + "b", + }, + }, opt.Legend) + assert.Equal(NewXAxisOption([]string{ + "Mon", + "Tue", + }), opt.XAxis) + assert.Equal([]YAxisOption{ + { + Min: NewFloatPoint(0), + Max: NewFloatPoint(100), + }, + }, opt.YAxisList) + assert.Equal(400, opt.Width) + assert.Equal(300, opt.Height) + assert.Equal(chart.Box{ + Top: 10, + }, opt.Padding) + assert.Equal(chart.Box{ + Left: 0, + Right: 300, + }, opt.Box) + assert.Equal(1, len(opt.Children)) + assert.Equal([]RadarIndicator{ + { + Min: 0, + Max: 10, + }, + }, opt.RadarIndicators) + assert.Equal(drawing.ColorBlack, opt.BackgroundColor) +} + +func TestLineRender(t *testing.T) { + assert := assert.New(t) + + d, err := LineRender([][]float64{ + { + 1, + 2, + 3, + }, + { + 1, + 5, + 2, + }, + }, + XAxisOptionFunc(NewXAxisOption([]string{ + "01", + "02", + "03", + })), + ) + assert.Nil(err) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\n010203024681012", string(data)) +} + +func TestBarRender(t *testing.T) { + assert := assert.New(t) + + d, err := BarRender([][]float64{ + { + 1, + 2, + 3, + }, + { + 1, + 5, + 2, + }, + }, + XAxisOptionFunc(NewXAxisOption([]string{ + "01", + "02", + "03", + })), + ) + assert.Nil(err) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\n010203024681012", string(data)) +} + +func TestPieRender(t *testing.T) { + assert := assert.New(t) + + d, err := PieRender([]float64{ + 1, + 3, + 5, + }) + assert.Nil(err) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\n", string(data)) +} + +func TestRadarRender(t *testing.T) { + assert := assert.New(t) + d, err := RadarRender([][]float64{ + { + 1, + 2, + 3, + }, + { + 1, + 5, + 2, + }, + }, + RadarIndicatorOptionFunc([]RadarIndicator{ + { + Name: "A", + Min: 0, + Max: 10, + }, + { + Name: "B", + Min: 0, + Max: 10, + }, + { + Name: "C", + Min: 0, + Max: 10, + }, + }...), + ) + assert.Nil(err) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\nABC", string(data)) +} + +func TestFunnelRender(t *testing.T) { + assert := assert.New(t) + + d, err := FunnelRender([]float64{ + 5, + 3, + 1, + }) + assert.Nil(err) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal("\\n(100%)(60%)(20%)", string(data)) +} diff --git a/series.go b/series.go index a1b7486..14227d1 100644 --- a/series.go +++ b/series.go @@ -128,7 +128,7 @@ type PieSeriesOption struct { Names []string } -func NewPieSeriesList(values []float64, opts ...PieSeriesOption) []Series { +func NewPieSeriesList(values []float64, opts ...PieSeriesOption) SeriesList { result := make([]Series, len(values)) var opt PieSeriesOption if len(opts) != 0 { diff --git a/series_test.go b/series_test.go index aae83de..1460180 100644 --- a/series_test.go +++ b/series_test.go @@ -66,7 +66,7 @@ func TestNewSeriesDataFromValues(t *testing.T) { func TestNewPieSeriesList(t *testing.T) { assert := assert.New(t) - assert.Equal([]Series{ + assert.Equal(SeriesList{ { Type: ChartTypePie, Name: "a", From 1258262f2c7698ea0e8a3ec8d9c3195593300380 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 9 Mar 2022 20:58:37 +0800 Subject: [PATCH 115/251] refactor: update examples --- README.md | 38 ++++++++++++++++++++------------------ README_zh.md | 38 ++++++++++++++++++++------------------ chart_option.go | 5 +++++ examples/basic/main.go | 38 ++++++++++++++++++++------------------ 4 files changed, 65 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 6cafc68..22d3205 100644 --- a/README.md +++ b/README.md @@ -49,12 +49,25 @@ func writeFile(file string, buf []byte) error { } func chartsRender() ([]byte, error) { - d, err := charts.Render(charts.ChartOption{ - Type: charts.ChartOutputPNG, - Title: charts.TitleOption{ - Text: "Line", + d, err := charts.LineRender([][]float64{ + { + 150, + 230, + 224, + 218, + 135, + 147, + 260, }, - XAxis: charts.NewXAxisOption([]string{ + }, + // output type + charts.PNGTypeOption(), + // title + charts.TitleOptionFunc(charts.TitleOption{ + Text: "Line", + }), + // x axis + charts.XAxisOptionFunc(charts.NewXAxisOption([]string{ "Mon", "Tue", "Wed", @@ -62,19 +75,8 @@ func chartsRender() ([]byte, error) { "Fri", "Sat", "Sun", - }), - SeriesList: charts.SeriesList{ - charts.NewSeriesFromValues([]float64{ - 150, - 230, - 224, - 218, - 135, - 147, - 260, - }), - }, - }) + })), + ) if err != nil { return nil, err } diff --git a/README_zh.md b/README_zh.md index e3747e7..ad7a4d9 100644 --- a/README_zh.md +++ b/README_zh.md @@ -49,12 +49,25 @@ func writeFile(file string, buf []byte) error { } func chartsRender() ([]byte, error) { - d, err := charts.Render(charts.ChartOption{ - Type: charts.ChartOutputPNG, - Title: charts.TitleOption{ - Text: "Line", + d, err := charts.LineRender([][]float64{ + { + 150, + 230, + 224, + 218, + 135, + 147, + 260, }, - XAxis: charts.NewXAxisOption([]string{ + }, + // output type + charts.PNGTypeOption(), + // title + charts.TitleOptionFunc(charts.TitleOption{ + Text: "Line", + }), + // x axis + charts.XAxisOptionFunc(charts.NewXAxisOption([]string{ "Mon", "Tue", "Wed", @@ -62,19 +75,8 @@ func chartsRender() ([]byte, error) { "Fri", "Sat", "Sun", - }), - SeriesList: charts.SeriesList{ - charts.NewSeriesFromValues([]float64{ - 150, - 230, - 224, - 218, - 135, - 147, - 260, - }), - }, - }) + })), + ) if err != nil { return nil, err } diff --git a/chart_option.go b/chart_option.go index 1bbf4cf..5e25873 100644 --- a/chart_option.go +++ b/chart_option.go @@ -30,6 +30,11 @@ import ( // OptionFunc option function type OptionFunc func(opt *ChartOption) +// PNGTypeOption set png type of chart's output +func PNGTypeOption() OptionFunc { + return TypeOptionFunc(ChartOutputPNG) +} + // TypeOptionFunc set type of chart's output func TypeOptionFunc(t string) OptionFunc { return func(opt *ChartOption) { diff --git a/examples/basic/main.go b/examples/basic/main.go index 12c0fd6..1e7af8d 100644 --- a/examples/basic/main.go +++ b/examples/basic/main.go @@ -24,12 +24,25 @@ func writeFile(file string, buf []byte) error { } func chartsRender() ([]byte, error) { - d, err := charts.Render(charts.ChartOption{ - Type: charts.ChartOutputPNG, - Title: charts.TitleOption{ - Text: "Line", + d, err := charts.LineRender([][]float64{ + { + 150, + 230, + 224, + 218, + 135, + 147, + 260, }, - XAxis: charts.NewXAxisOption([]string{ + }, + // output type + charts.PNGTypeOption(), + // title + charts.TitleOptionFunc(charts.TitleOption{ + Text: "Line", + }), + // x axis + charts.XAxisOptionFunc(charts.NewXAxisOption([]string{ "Mon", "Tue", "Wed", @@ -37,19 +50,8 @@ func chartsRender() ([]byte, error) { "Fri", "Sat", "Sun", - }), - SeriesList: charts.SeriesList{ - charts.NewSeriesFromValues([]float64{ - 150, - 230, - 224, - 218, - 135, - 147, - 260, - }), - }, - }) + })), + ) if err != nil { return nil, err } From 054839b0b7b5c16dd0d020e84287cbe877341cbf Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 19 Mar 2022 07:50:12 +0800 Subject: [PATCH 116/251] chore: update modules --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 5f58f2d..be8fc27 100644 --- a/go.mod +++ b/go.mod @@ -5,13 +5,13 @@ go 1.17 require ( github.com/dustin/go-humanize v1.0.0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 - github.com/stretchr/testify v1.7.0 + github.com/stretchr/testify v1.7.1 github.com/wcharczuk/go-chart/v2 v2.1.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect + golang.org/x/image v0.0.0-20220302094943-723b81ca9867 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/go.sum b/go.sum index 51e8735..ab2ecae 100644 --- a/go.sum +++ b/go.sum @@ -8,13 +8,13 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From a5754bb1b37bfcab3d06e107fbf46213ee030461 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 5 Apr 2022 09:29:10 +0800 Subject: [PATCH 117/251] docs: update document --- README_zh.md | 24 ++++++++++++++++++++++++ go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/README_zh.md b/README_zh.md index ad7a4d9..6d794e0 100644 --- a/README_zh.md +++ b/README_zh.md @@ -119,6 +119,30 @@ func main() { } ``` +## 常用函数 + +`go-charts`针对常用的几种图表提供了简单的调用方式以及几种常用的Option设置,便捷的生成常用图表。 + +- `LineRender`: 折线图表,第一个参数为二维浮点数,对应图表中的点,支持不定长的OptionFunc参数,用于指定其它的属性 +- `BarRender`: 柱状图表,第一个参数为二维浮点数,对应柱状图的高度,支持不定长的OptionFunc参数,用于指定其它的属性 +- `PieRender`: 饼图表,第一个参数为浮点数数组,对应各占比,支持不定长的OptionFunc参数,用于指定其它的属性 +- `RadarRender`: 雷达图,第一个参数为二维浮点数,对应雷达图中的各值,支持不定长的OptionFunc参数,用于指定其它的属性 +- `FunnelRender`: 漏斗图,第一个参数为浮点数数组,对应各占比,支持不定长的OptionFunc参数,用于指定其它的属性 +- `PNGTypeOption`: 指定输出PNG +- `FontFamilyOptionFunc`: 指定使用的字体 +- `ThemeOptionFunc`: 指定使用的主题类型 +- `TitleOptionFunc`: 指定标题相关属性 +- `LegendOptionFunc`: 指定图例相关属性 +- `XAxisOptionFunc`: 指定x轴的相关属性 +- `YAxisOptionFunc`: 指定y轴的相关属性 +- `WidthOptionFunc`: 指定宽度 +- `HeightOptionFunc`: 指定高度 +- `PaddingOptionFunc`: 指定空白填充区域 +- `BoxOptionFunc`: 指定内容区域 +- `ChildOptionFunc`: 指定子图表 +- `RadarIndicatorOptionFunc`: 雷达图指示器相关属性 +- `BackgroundColorOptionFunc`: 设置背景图颜色 + ## ECharts参数说明 名称有[]的参数非echarts的原有参数,为`go-charts`的新增参数,可根据实际使用场景添加。 diff --git a/go.mod b/go.mod index be8fc27..ff855cc 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,6 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.0.0-20220302094943-723b81ca9867 // indirect + golang.org/x/image v0.0.0-20220321031419-a8550c1d254a // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/go.sum b/go.sum index ab2ecae..56d77f9 100644 --- a/go.sum +++ b/go.sum @@ -13,8 +13,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220321031419-a8550c1d254a h1:LnH9RNcpPv5Kzi15lXg42lYMPUf0x8CuPv1YnvBWZAg= +golang.org/x/image v0.0.0-20220321031419-a8550c1d254a/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= From a713c3023e2de6b2191ad29a767cad8f96493b5b Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 14 Apr 2022 20:43:32 +0800 Subject: [PATCH 118/251] feat: support rect legend --- examples/charts/main.go | 11 +++++---- go.mod | 2 +- go.sum | 4 ++-- legend.go | 52 +++++++++++++++++++++++++++-------------- 4 files changed, 45 insertions(+), 24 deletions(-) diff --git a/examples/charts/main.go b/examples/charts/main.go index bac7106..fddbe6d 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -235,10 +235,13 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { "Sat", "Sun", }), - Legend: charts.NewLegendOption([]string{ - "Rainfall", - "Evaporation", - }), + Legend: charts.LegendOption{ + Data: []string{ + "Rainfall", + "Evaporation", + }, + Icon: charts.LegendIconRect, + }, SeriesList: []charts.Series{ charts.NewSeriesFromValues([]float64{ 120, diff --git a/go.mod b/go.mod index ff855cc..610af22 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,6 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.0.0-20220321031419-a8550c1d254a // indirect + golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/go.sum b/go.sum index 56d77f9..d88f473 100644 --- a/go.sum +++ b/go.sum @@ -13,8 +13,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20220321031419-a8550c1d254a h1:LnH9RNcpPv5Kzi15lXg42lYMPUf0x8CuPv1YnvBWZAg= -golang.org/x/image v0.0.0-20220321031419-a8550c1d254a/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 h1:LRtI4W37N+KFebI/qV0OFiLUv4GLOWeEW5hn/KEJvxE= +golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/legend.go b/legend.go index 7eb33b3..df72757 100644 --- a/legend.go +++ b/legend.go @@ -48,8 +48,14 @@ type LegendOption struct { Align string // The layout orientation of legend, it can be horizontal or vertical, default is horizontal. Orient string + // Icon of the legend. + Icon string } +const ( + LegendIconRect = "rect" +) + // NewLegendOption creates a new legend option by legend text list func NewLegendOption(data []string, position ...string) LegendOption { opt := LegendOption{ @@ -143,18 +149,6 @@ func (l *legend) Render() (chart.Box, error) { } x = left for index, text := range opt.Data { - seriesColor := theme.GetSeriesColor(index) - fillColor := seriesColor - if !theme.IsDark() { - fillColor = theme.GetBackgroundColor() - } - style := chart.Style{ - StrokeColor: seriesColor, - FillColor: fillColor, - StrokeWidth: 3, - } - style.GetFillAndStrokeOptions().WriteDrawingOptionsToRenderer(r) - textBox := r.MeasureText(text) var renderText func() if opt.Orient == OrientVertical { @@ -183,12 +177,36 @@ func (l *legend) Render() (chart.Box, error) { if opt.Align == PositionRight { renderText() } + seriesColor := theme.GetSeriesColor(index) + fillColor := seriesColor + if !theme.IsDark() { + fillColor = theme.GetBackgroundColor() + } + style := chart.Style{ + StrokeColor: seriesColor, + FillColor: fillColor, + StrokeWidth: 3, + } + if opt.Icon == LegendIconRect { + style.FillColor = seriesColor + style.StrokeWidth = 1 + } + style.GetFillAndStrokeOptions().WriteDrawingOptionsToRenderer(r) - legendDraw.moveTo(x, y) - legendDraw.lineTo(x+legendWidth, y) - r.Stroke() - legendDraw.circle(float64(legendDotHeight), x+legendWidth>>1, y) - r.FillStroke() + if opt.Icon == LegendIconRect { + legendDraw.moveTo(x, y-legendDotHeight) + legendDraw.lineTo(x+legendWidth, y-legendDotHeight) + legendDraw.lineTo(x+legendWidth, y+legendDotHeight) + legendDraw.lineTo(x, y+legendDotHeight) + legendDraw.lineTo(x, y-legendDotHeight) + r.FillStroke() + } else { + legendDraw.moveTo(x, y) + legendDraw.lineTo(x+legendWidth, y) + r.Stroke() + legendDraw.circle(float64(legendDotHeight), x+legendWidth>>1, y) + r.FillStroke() + } x += legendWidth if opt.Align != PositionRight { From cad8296e28d7c233088e9e0ddc814440c528394f Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 1 May 2022 11:15:13 +0800 Subject: [PATCH 119/251] fix: support chinese for axis, #4 --- README_zh.md | 2 ++ chart.go | 1 + xaxis.go | 3 +++ yaxis.go | 1 + 4 files changed, 7 insertions(+) diff --git a/README_zh.md b/README_zh.md index 6d794e0..57d9db4 100644 --- a/README_zh.md +++ b/README_zh.md @@ -219,3 +219,5 @@ BenchmarkMultiChartSVGRender-8 367 3356325 ns/op 默认使用的字符为`roboto`为英文字体库,因此如果需要显示中文字符需要增加中文字体库,`InstallFont`函数可添加对应的字体库,成功添加之后则指定`title.textStyle.fontFamily`即可。 在浏览器中使用`svg`时,如果指定的`fontFamily`不支持中文字符,展示的中文并不会乱码,但是会导致在计算字符宽度等错误。 + +[中文字库noto-cjk](https://github.com/googlefonts/noto-cjk) \ No newline at end of file diff --git a/chart.go b/chart.go index 6f4740f..21f2071 100644 --- a/chart.go +++ b/chart.go @@ -190,6 +190,7 @@ func (o *ChartOption) FillDefault(theme string) { if o.XAxis.Theme == "" { o.XAxis.Theme = theme } + o.XAxis.Font = o.Font } func (o *ChartOption) getWidth() int { diff --git a/xaxis.go b/xaxis.go index 1dca7bb..bd9d951 100644 --- a/xaxis.go +++ b/xaxis.go @@ -23,10 +23,12 @@ package charts import ( + "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" ) type XAxisOption struct { + Font *truetype.Font // The boundary gap on both sides of a coordinate axis. // Nil or *true means the center part of two axis ticks BoundaryGap *bool @@ -66,6 +68,7 @@ func drawXAxis(p *Draw, opt *XAxisOption, yAxisCount int) (int, *Range, error) { Right: right, }), ) + dXAxis.Font = opt.Font if err != nil { return 0, nil, err } diff --git a/yaxis.go b/yaxis.go index 99093ec..1505d39 100644 --- a/yaxis.go +++ b/yaxis.go @@ -96,6 +96,7 @@ func drawYAxis(p *Draw, opt *ChartOption, axisIndex, xAxisHeight int, padding ch if err != nil { return nil, err } + dYAxis.Font = opt.Font NewAxis(dYAxis, data, style).Render() yRange.Size = dYAxis.Box.Height() return &yRange, nil From cf2eb91690ea1d50dd55bf53e2d1ddf5e165499d Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 1 May 2022 11:26:53 +0800 Subject: [PATCH 120/251] fix: fix the font option of axis --- xaxis.go | 4 +++- yaxis.go | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/xaxis.go b/xaxis.go index bd9d951..edd017f 100644 --- a/xaxis.go +++ b/xaxis.go @@ -68,7 +68,9 @@ func drawXAxis(p *Draw, opt *XAxisOption, yAxisCount int) (int, *Range, error) { Right: right, }), ) - dXAxis.Font = opt.Font + if opt.Font != nil { + dXAxis.Font = opt.Font + } if err != nil { return 0, nil, err } diff --git a/yaxis.go b/yaxis.go index 1505d39..a14e409 100644 --- a/yaxis.go +++ b/yaxis.go @@ -96,7 +96,9 @@ func drawYAxis(p *Draw, opt *ChartOption, axisIndex, xAxisHeight int, padding ch if err != nil { return nil, err } - dYAxis.Font = opt.Font + if opt.Font != nil { + dYAxis.Font = opt.Font + } NewAxis(dYAxis, data, style).Render() yRange.Size = dYAxis.Box.Height() return &yRange, nil From e64498a06133480a2f404f21e1671ec5285e9166 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 1 May 2022 11:30:26 +0800 Subject: [PATCH 121/251] chore: support go1.18 for test --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ebc9a02..22e77a8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,6 +14,7 @@ jobs: strategy: matrix: go: + - '1.18' - '1.17' - '1.16' - '1.15' From 7e2f112eea11f272b49dd586d91d3f4bf99018db Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 11 May 2022 20:29:39 +0800 Subject: [PATCH 122/251] feat: add multi line text draw --- draw.go | 29 +++++++++++ draw_test.go | 30 +++++++++++ table.go | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 204 insertions(+) create mode 100644 table.go diff --git a/draw.go b/draw.go index f6ee73c..1708662 100644 --- a/draw.go +++ b/draw.go @@ -277,6 +277,35 @@ func (d *Draw) text(body string, x, y int) { d.Render.Text(body, x+d.Box.Left, y+d.Box.Top) } +func (d *Draw) textFit(body string, x, y, width int, style chart.Style) chart.Box { + style.TextWrap = chart.TextWrapWord + r := d.Render + lines := chart.Text.WrapFit(r, body, width, style) + style.WriteTextOptionsToRenderer(r) + var output chart.Box + + for index, line := range lines { + x0 := x + y0 := y + output.Height() + d.text(line, x0, y0) + lineBox := r.MeasureText(line) + output.Right = chart.MaxInt(lineBox.Right, output.Right) + output.Bottom += lineBox.Height() + if index < len(lines)-1 { + output.Bottom += +style.GetTextLineSpacing() + } + } + return output +} + +func (d *Draw) measureTextFit(body string, x, y, width int, style chart.Style) chart.Box { + style.TextWrap = chart.TextWrapWord + r := d.Render + lines := chart.Text.WrapFit(r, body, width, style) + style.WriteTextOptionsToRenderer(r) + return chart.Text.MeasureLines(r, lines, style) +} + func (d *Draw) lineStroke(points []Point, style LineStyle) { s := style.Style() if !s.ShouldDrawStroke() { diff --git a/draw_test.go b/draw_test.go index 694d72a..f6a3dd1 100644 --- a/draw_test.go +++ b/draw_test.go @@ -475,3 +475,33 @@ func TestDraw(t *testing.T) { assert.Equal(tt.result, string(data)) } } + +func TestDrawTextFit(t *testing.T) { + assert := assert.New(t) + d, err := NewDraw(DrawOption{ + Width: 400, + Height: 300, + }) + assert.Nil(err) + f, _ := chart.GetDefaultFont() + style := chart.Style{ + FontSize: 12, + FontColor: chart.ColorBlack, + Font: f, + } + box := d.textFit("Hello World!", 0, 20, 80, style) + assert.Equal(chart.Box{ + Right: 45, + Bottom: 35, + }, box) + + box = d.textFit("Hello World!", 0, 100, 200, style) + assert.Equal(chart.Box{ + Right: 84, + Bottom: 15, + }, box) + + buf, err := d.Bytes() + assert.Nil(err) + assert.Equal(`\nHelloWorld!Hello World!`, string(buf)) +} diff --git a/table.go b/table.go new file mode 100644 index 0000000..9cfc6b1 --- /dev/null +++ b/table.go @@ -0,0 +1,145 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "errors" + + "github.com/wcharczuk/go-chart/v2" +) + +type TableOption struct { + // draw + Draw *Draw + // The width of table + Width int + // The header of table + Header []string + // The style of table + Style chart.Style + ColumnWidths []float64 + // 是否仅测量高度 + measurement bool +} + +var ErrTableColumnWidthInvalid = errors.New("table column width is invalid") + +func tableDivideWidth(width, size int, columnWidths []float64) ([]int, error) { + widths := make([]int, size) + + autoFillCount := size + restWidth := width + if len(columnWidths) != 0 { + for index, v := range columnWidths { + if v <= 0 { + continue + } + autoFillCount-- + // 小于1的表示占比 + if v < 1 { + widths[index] = int(v * float64(width)) + } else { + widths[index] = int(v) + } + restWidth -= widths[index] + } + } + if restWidth < 0 { + return nil, ErrTableColumnWidthInvalid + } + // 填充其它未指定的宽度 + if autoFillCount > 0 { + autoWidth := restWidth / autoFillCount + for index, v := range widths { + if v == 0 { + widths[index] = autoWidth + } + } + } + widthSum := 0 + for _, v := range widths { + widthSum += v + } + if widthSum > width { + return nil, ErrTableColumnWidthInvalid + } + return widths, nil +} + +func TableMeasure(opt TableOption) (chart.Box, error) { + d, err := NewDraw(DrawOption{ + Width: opt.Width, + Height: 600, + }) + if err != nil { + return chart.BoxZero, err + } + opt.Draw = d + opt.measurement = true + return tableRender(opt) +} + +func tableRender(opt TableOption) (chart.Box, error) { + if opt.Draw == nil { + return chart.BoxZero, errors.New("draw can not be nil") + } + if len(opt.Header) == 0 { + return chart.BoxZero, errors.New("header can not be nil") + } + width := opt.Width + if width == 0 { + width = opt.Draw.Box.Width() + } + + columnWidths, err := tableDivideWidth(width, len(opt.Header), opt.ColumnWidths) + if err != nil { + return chart.BoxZero, err + } + + d := opt.Draw + style := opt.Style + y := 0 + x := 0 + + headerMaxHeight := 0 + for index, text := range opt.Header { + var box chart.Box + w := columnWidths[index] + y0 := y + int(opt.Style.FontSize) + if opt.measurement { + box = d.measureTextFit(text, x, y0, w, style) + } else { + box = d.textFit(text, x, y0, w, style) + } + if box.Height() > headerMaxHeight { + headerMaxHeight = box.Height() + } + x += w + } + y += headerMaxHeight + + return chart.Box{ + Right: width, + Bottom: y, + }, nil +} From 5068828ca703411491661d4218d5055ab8cdc890 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 15 May 2022 15:07:03 +0800 Subject: [PATCH 123/251] feat: support painter for chart draw function --- alias.go | 33 +++++ line.go | 9 +- painer.go | 394 +++++++++++++++++++++++++++++++++++++++++++++++++ painer_test.go | 371 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 802 insertions(+), 5 deletions(-) create mode 100644 alias.go create mode 100644 painer.go create mode 100644 painer_test.go diff --git a/alias.go b/alias.go new file mode 100644 index 0000000..3a09919 --- /dev/null +++ b/alias.go @@ -0,0 +1,33 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +type Box = chart.Box +type Renderer = chart.Renderer +type Style = chart.Style +type Color = drawing.Color diff --git a/line.go b/line.go index 0fc25d6..15ab575 100644 --- a/line.go +++ b/line.go @@ -24,18 +24,17 @@ package charts import ( "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" ) type LineStyle struct { ClassName string StrokeDashArray []float64 - StrokeColor drawing.Color + StrokeColor Color StrokeWidth float64 - FillColor drawing.Color + FillColor Color DotWidth float64 - DotColor drawing.Color - DotFillColor drawing.Color + DotColor Color + DotFillColor Color } func (ls *LineStyle) Style() chart.Style { diff --git a/painer.go b/painer.go new file mode 100644 index 0000000..670f6f6 --- /dev/null +++ b/painer.go @@ -0,0 +1,394 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "bytes" + "errors" + "math" + + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" +) + +type Painter struct { + render Renderer + box Box + font *truetype.Font + parent *Painter + style Style + previousStyle Style +} + +type PainterOptions struct { + // Draw type, "svg" or "png", default type is "svg" + Type string + // The width of draw canvas + Width int + // The height of draw canvas + Height int + // The font for painter + Font *truetype.Font +} + +type PainterOption func(*Painter) + +// PainterPaddingOption sets the padding of draw canvas +func PainterPaddingOption(padding Box) PainterOption { + return func(p *Painter) { + p.box.Left += padding.Left + p.box.Top += padding.Top + p.box.Right -= padding.Right + p.box.Bottom -= padding.Bottom + } +} + +// PainterBoxOption sets the box of draw canvas +func PainterBoxOption(box Box) PainterOption { + return func(p *Painter) { + if box.IsZero() { + return + } + p.box = box + } +} + +// PainterFontOption sets the font of draw canvas +func PainterFontOption(font *truetype.Font) PainterOption { + return func(p *Painter) { + p.font = font + } +} + +// PainterStyleOption sets the style of draw canvas +func PainterStyleOption(style Style) PainterOption { + return func(p *Painter) { + p.SetDrawingStyle(style) + } +} + +// NewPainter creates a new Painter +func NewPainter(opts PainterOptions, opt ...PainterOption) (*Painter, error) { + if opts.Width <= 0 || opts.Height <= 0 { + return nil, errors.New("width/height can not be nil") + } + font := opts.Font + if font == nil { + f, err := chart.GetDefaultFont() + if err != nil { + return nil, err + } + font = f + } + fn := chart.SVG + if opts.Type == ChartOutputPNG { + fn = chart.PNG + } + width := opts.Width + height := opts.Height + r, err := fn(width, height) + if err != nil { + return nil, err + } + p := &Painter{ + render: r, + box: Box{ + Right: opts.Width, + Bottom: opts.Height, + }, + font: font, + } + p.setOptions(opt...) + return p, nil +} +func (p *Painter) setOptions(opts ...PainterOption) { + for _, fn := range opts { + fn(p) + } +} + +func (p *Painter) Child(opt ...PainterOption) *Painter { + child := &Painter{ + render: p.render, + box: p.box.Clone(), + font: p.font, + parent: p, + style: p.style, + previousStyle: p.previousStyle, + } + child.setOptions(opt...) + return child +} + +func (p *Painter) SetStyle(style Style) { + p.previousStyle = p.style + p.style = style + style.WriteToRenderer(p.render) +} + +func (p *Painter) SetDrawingStyle(style Style) { + p.previousStyle = p.style + p.style = style + style.WriteDrawingOptionsToRenderer(p.render) +} + +func (p *Painter) SetTextStyle(style Style) { + p.previousStyle = p.style + p.style = style + style.WriteTextOptionsToRenderer(p.render) +} + +func (p *Painter) RestoreStyle() { + p.style = p.previousStyle +} + +// Bytes returns the data of draw canvas +func (p *Painter) Bytes() ([]byte, error) { + buffer := bytes.Buffer{} + err := p.render.Save(&buffer) + if err != nil { + return nil, err + } + return buffer.Bytes(), err +} + +// MoveTo moves the cursor to a given point +func (p *Painter) MoveTo(x, y int) { + p.render.MoveTo(x+p.box.Left, y+p.box.Top) +} + +func (p *Painter) ArcTo(cx, cy int, rx, ry, startAngle, delta float64) { + p.render.ArcTo(cx+p.box.Left, cy+p.box.Top, rx, ry, startAngle, delta) +} + +func (p *Painter) LineTo(x, y int) { + p.render.LineTo(x+p.box.Left, y+p.box.Top) +} + +func (p *Painter) Pin(x, y, width int) { + r := float64(width) / 2 + y -= width / 4 + angle := chart.DegreesToRadians(15) + box := p.box + + startAngle := math.Pi/2 + angle + delta := 2*math.Pi - 2*angle + p.ArcTo(x, y, r, r, startAngle, delta) + p.LineTo(x, y) + p.Close() + p.FillStroke() + + startX := x - int(r) + startY := y + endX := x + int(r) + endY := y + p.MoveTo(startX, startY) + + left := box.Left + top := box.Top + cx := x + cy := y + int(r*2.5) + p.render.QuadCurveTo(cx+left, cy+top, endX+left, endY+top) + p.Close() + p.Fill() +} + +func (p *Painter) arrow(x, y, width, height int, direction string) { + halfWidth := width >> 1 + halfHeight := height >> 1 + if direction == PositionTop || direction == PositionBottom { + x0 := x - halfWidth + x1 := x0 + width + dy := -height / 3 + y0 := y + y1 := y0 - height + if direction == PositionBottom { + y0 = y - height + y1 = y + dy = 2 * dy + } + p.MoveTo(x0, y0) + p.LineTo(x0+halfWidth, y1) + p.LineTo(x1, y0) + p.LineTo(x0+halfWidth, y+dy) + p.LineTo(x0, y0) + } else { + x0 := x + width + x1 := x0 - width + y0 := y - halfHeight + dx := -width / 3 + if direction == PositionRight { + x0 = x - width + dx = -dx + x1 = x0 + width + } + p.MoveTo(x0, y0) + p.LineTo(x1, y0+halfHeight) + p.LineTo(x0, y0+height) + p.LineTo(x0+dx, y0+halfHeight) + p.LineTo(x0, y0) + } + p.FillStroke() +} + +func (p *Painter) ArrowLeft(x, y, width, height int) { + p.arrow(x, y, width, height, PositionLeft) +} + +func (p *Painter) ArrowRight(x, y, width, height int) { + p.arrow(x, y, width, height, PositionRight) +} + +func (p *Painter) ArrowTop(x, y, width, height int) { + p.arrow(x, y, width, height, PositionTop) +} +func (p *Painter) ArrowBottom(x, y, width, height int) { + p.arrow(x, y, width, height, PositionBottom) +} + +func (p *Painter) Circle(radius float64, x, y int) { + p.render.Circle(radius, x+p.box.Left, y+p.box.Top) +} + +func (p *Painter) Stroke() { + p.render.Stroke() +} + +func (p *Painter) Close() { + p.render.Close() +} + +func (p *Painter) FillStroke() { + p.render.FillStroke() +} + +func (p *Painter) Fill() { + p.render.Fill() +} + +func (p *Painter) LineStroke(points []Point, style LineStyle) { + s := style.Style() + if !s.ShouldDrawStroke() { + return + } + defer p.RestoreStyle() + p.SetDrawingStyle(s.GetStrokeOptions()) + for index, point := range points { + x := point.X + y := point.Y + if index == 0 { + p.MoveTo(x, y) + } else { + p.LineTo(x, y) + } + } + p.Stroke() +} + +func (p *Painter) SetBackground(width, height int, color Color) { + r := p.render + s := chart.Style{ + FillColor: color, + } + defer p.RestoreStyle() + p.SetStyle(s) + // 设置背景色不使用box,因此不直接使用Painter + r.MoveTo(0, 0) + r.LineTo(width, 0) + r.LineTo(width, height) + r.LineTo(0, height) + r.LineTo(0, 0) + p.FillStroke() +} +func (p *Painter) MarkLine(x, y, width int) { + arrowWidth := 16 + arrowHeight := 10 + endX := x + width + p.Circle(3, x, y) + p.render.Fill() + p.MoveTo(x+5, y) + p.LineTo(endX-arrowWidth, y) + p.Stroke() + p.render.SetStrokeDashArray([]float64{}) + p.ArrowRight(endX, y, arrowWidth, arrowHeight) +} + +func (p *Painter) Polygon(center Point, radius float64, sides int) { + points := getPolygonPoints(center, radius, sides) + for i, item := range points { + if i == 0 { + p.MoveTo(item.X, item.Y) + } else { + p.LineTo(item.X, item.Y) + } + } + p.LineTo(points[0].X, points[0].Y) + p.Stroke() +} + +func (p *Painter) FillArea(points []Point, s Style) { + if !s.ShouldDrawFill() { + return + } + defer p.RestoreStyle() + var x, y int + p.SetDrawingStyle(s.GetFillOptions()) + for index, point := range points { + x = point.X + y = point.Y + if index == 0 { + p.MoveTo(x, y) + } else { + p.LineTo(x, y) + } + } + p.Fill() +} + +func (p *Painter) Text(body string, x, y int) { + p.render.Text(body, x+p.box.Left, y+p.box.Top) +} + +func (p *Painter) TextFit(body string, x, y, width int) chart.Box { + style := p.style + textWarp := style.TextWrap + style.TextWrap = chart.TextWrapWord + r := p.render + lines := chart.Text.WrapFit(r, body, width, style) + p.SetTextStyle(style) + var output chart.Box + + for index, line := range lines { + x0 := x + y0 := y + output.Height() + p.Text(line, x0, y0) + lineBox := r.MeasureText(line) + output.Right = chart.MaxInt(lineBox.Right, output.Right) + output.Bottom += lineBox.Height() + if index < len(lines)-1 { + output.Bottom += +style.GetTextLineSpacing() + } + } + p.style.TextWrap = textWarp + return output +} diff --git a/painer_test.go b/painer_test.go new file mode 100644 index 0000000..425dbbe --- /dev/null +++ b/painer_test.go @@ -0,0 +1,371 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "math" + "testing" + + "github.com/golang/freetype/truetype" + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestPainterOption(t *testing.T) { + assert := assert.New(t) + + font := &truetype.Font{} + d, err := NewPainter(PainterOptions{ + Width: 800, + Height: 600, + }, + PainterBoxOption(Box{ + Right: 400, + Bottom: 300, + }), + PainterPaddingOption(Box{ + Left: 1, + Top: 2, + Right: 3, + Bottom: 4, + }), + PainterFontOption(font), + PainterStyleOption(Style{ + ClassName: "test", + }), + ) + assert.Nil(err) + assert.Equal(Box{ + Left: 1, + Top: 2, + Right: 397, + Bottom: 296, + }, d.box) + assert.Equal(font, d.font) + assert.Equal("test", d.style.ClassName) +} + +func TestPainter(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + fn func(*Painter) + result string + }{ + // moveTo, lineTo + { + fn: func(p *Painter) { + p.MoveTo(1, 1) + p.LineTo(2, 2) + p.Stroke() + }, + result: "\\n", + }, + // circle + { + fn: func(p *Painter) { + p.Circle(5, 2, 3) + }, + result: "\\n", + }, + // text + { + fn: func(p *Painter) { + p.Text("hello world!", 3, 6) + }, + result: "\\nhello world!", + }, + // line stroke + { + fn: func(p *Painter) { + p.LineStroke([]Point{ + { + X: 1, + Y: 2, + }, + { + X: 3, + Y: 4, + }, + }, LineStyle{ + StrokeColor: drawing.ColorBlack, + StrokeWidth: 1, + }) + }, + result: "\\n", + }, + // set background + { + fn: func(p *Painter) { + p.SetBackground(400, 300, chart.ColorWhite) + }, + result: "\\n", + }, + // arcTo + { + fn: func(p *Painter) { + p.SetStyle(Style{ + StrokeWidth: 1, + StrokeColor: drawing.ColorBlack, + FillColor: drawing.ColorBlue, + }) + p.ArcTo(100, 100, 100, 100, 0, math.Pi/2) + p.Close() + p.FillStroke() + }, + result: "\\n", + }, + // pin + { + fn: func(p *Painter) { + p.SetStyle(Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }) + p.Pin(30, 30, 30) + }, + result: "\\n", + }, + // arrow left + { + fn: func(p *Painter) { + p.SetStyle(Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }) + p.ArrowLeft(30, 30, 16, 10) + }, + result: "\\n", + }, + // arrow right + { + fn: func(p *Painter) { + p.SetStyle(Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }) + p.ArrowRight(30, 30, 16, 10) + }, + result: "\\n", + }, + // arrow top + { + fn: func(p *Painter) { + p.SetStyle(Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }) + p.ArrowTop(30, 30, 10, 16) + }, + result: "\\n", + }, + // arrow bottom + { + fn: func(p *Painter) { + p.SetStyle(Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }) + p.ArrowBottom(30, 30, 10, 16) + }, + result: "\\n", + }, + // mark line + { + fn: func(p *Painter) { + p.SetStyle(Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + StrokeDashArray: []float64{ + 4, + 2, + }, + }) + p.MarkLine(0, 20, 300) + }, + result: "\\n", + }, + // polygon + { + fn: func(p *Painter) { + p.SetStyle(Style{ + StrokeWidth: 1, + StrokeColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }) + p.Polygon(Point{ + X: 100, + Y: 100, + }, 50, 6) + }, + result: "\\n", + }, + // FillArea + { + fn: func(p *Painter) { + p.FillArea([]Point{ + { + X: 0, + Y: 0, + }, + { + X: 0, + Y: 100, + }, + { + X: 100, + Y: 100, + }, + { + X: 0, + Y: 0, + }, + }, Style{ + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }) + }, + result: "\\n", + }, + } + for _, tt := range tests { + d, err := NewPainter(PainterOptions{ + Width: 400, + Height: 300, + }, PainterPaddingOption(chart.Box{ + Left: 5, + Top: 10, + })) + assert.Nil(err) + tt.fn(d) + data, err := d.Bytes() + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} + +func TestPainterTextFit(t *testing.T) { + assert := assert.New(t) + p, err := NewPainter(PainterOptions{ + Width: 400, + Height: 300, + }) + assert.Nil(err) + f, _ := chart.GetDefaultFont() + style := Style{ + FontSize: 12, + FontColor: chart.ColorBlack, + Font: f, + } + p.SetStyle(style) + box := p.TextFit("Hello World!", 0, 20, 80) + assert.Equal(chart.Box{ + Right: 45, + Bottom: 35, + }, box) + + box = p.TextFit("Hello World!", 0, 100, 200) + assert.Equal(chart.Box{ + Right: 84, + Bottom: 15, + }, box) + + buf, err := p.Bytes() + assert.Nil(err) + assert.Equal(`\nHelloWorld!Hello World!`, string(buf)) +} From 7e80e9a8481d73b4a10d6257a1c07450f886cd9e Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 16 May 2022 20:41:13 +0800 Subject: [PATCH 124/251] refactor: adjust axis function --- axis.go | 118 +++++++++++++++--------------- axis_test.go | 14 ++-- painer.go => painter.go | 56 ++++++++++++-- painer_test.go => painter_test.go | 0 util.go | 4 +- xaxis.go | 21 ++---- yaxis.go | 28 +++---- 7 files changed, 134 insertions(+), 107 deletions(-) rename painer.go => painter.go (88%) rename painer_test.go => painter_test.go (100%) diff --git a/axis.go b/axis.go index 46292e4..5881f5e 100644 --- a/axis.go +++ b/axis.go @@ -27,7 +27,6 @@ import ( "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" ) type AxisOption struct { @@ -42,7 +41,7 @@ type AxisOption struct { SplitNumber int ClassName string // The line color of axis - StrokeColor drawing.Color + StrokeColor Color // The line width StrokeWidth float64 // The length of the axis tick @@ -56,17 +55,17 @@ type AxisOption struct { // The font of label Font *truetype.Font // The color of label - FontColor drawing.Color + FontColor Color // The flag for show axis split line, set this to true will show axis split line SplitLineShow bool // The color of split line - SplitLineColor drawing.Color + SplitLineColor Color } type axis struct { - d *Draw - data *AxisDataList - option *AxisOption + painter *Painter + data *AxisDataList + option *AxisOption } type axisMeasurement struct { Width int @@ -74,11 +73,11 @@ type axisMeasurement struct { } // NewAxis creates a new axis with data and style options -func NewAxis(d *Draw, data AxisDataList, option AxisOption) *axis { +func NewAxis(p *Painter, data AxisDataList, option AxisOption) *axis { return &axis{ - d: d, - data: &data, - option: &option, + painter: p, + data: &data, + option: &option, } } @@ -149,17 +148,19 @@ func NewAxisDataListFromStringList(textList []string) AxisDataList { func (a *axis) axisLabel(renderOpt *axisRenderOption) { option := a.option data := *a.data - d := a.d + // d := a.d if option.FontColor.IsZero() || len(data) == 0 { return } - r := d.Render + // r := d.Render - s := option.Style(d.Font) - s.GetTextOptions().WriteTextOptionsToRenderer(r) + // s.GetTextOptions().WriteTextOptionsToRenderer(r) + p := a.painter + s := option.Style(p.font) + p.SetTextStyle(s) - width := d.Box.Width() - height := d.Box.Height() + width := p.Width() + height := p.Height() textList := data.TextList() count := len(textList) @@ -188,7 +189,7 @@ func (a *axis) axisLabel(renderOpt *axisRenderOption) { reverseIntSlice(values) for index, text := range textList { y := values[index] - 2 - b := r.MeasureText(text) + b := p.MeasureText(text) if boundaryGap { height := y - values[index+1] y -= (height - b.Height()) >> 1 @@ -200,7 +201,7 @@ func (a *axis) axisLabel(renderOpt *axisRenderOption) { if position == PositionLeft { x = labelWidth - b.Width() - 1 } - d.text(text, x, y) + p.Text(text, x, y) } default: // 定位bottom,重新计算y0的定位 @@ -215,7 +216,7 @@ func (a *axis) axisLabel(renderOpt *axisRenderOption) { } x := values[index] leftOffset := 0 - b := r.MeasureText(text) + b := p.MeasureText(text) if boundaryGap { width := values[index+1] - x leftOffset = (width - b.Width()) >> 1 @@ -223,24 +224,25 @@ func (a *axis) axisLabel(renderOpt *axisRenderOption) { // 左移文本长度 leftOffset = -b.Width() >> 1 } - d.text(text, x+leftOffset, y0) + p.Text(text, x+leftOffset, y0) } } } func (a *axis) axisLine(renderOpt *axisRenderOption) { - d := a.d - r := d.Render + // d := a.d + // r := d.Render + p := a.painter option := a.option - s := option.Style(d.Font) - s.GetStrokeOptions().WriteDrawingOptionsToRenderer(r) + s := option.Style(p.font) + p.SetDrawingStyle(s.GetStrokeOptions()) x0 := 0 y0 := 0 x1 := 0 y1 := 0 - width := d.Box.Width() - height := d.Box.Height() + width := p.Width() + height := p.Height() labelMargin := option.GetLabelMargin() // 轴线 @@ -271,21 +273,22 @@ func (a *axis) axisLine(renderOpt *axisRenderOption) { y1 = y0 } - d.moveTo(x0, y0) - d.lineTo(x1, y1) - r.FillStroke() + p.MoveTo(x0, y0) + p.LineTo(x1, y1) + p.FillStroke() } func (a *axis) axisTick(renderOpt *axisRenderOption) { - d := a.d - r := d.Render + // d := a.d + // r := d.Render + p := a.painter option := a.option - s := option.Style(d.Font) - s.GetStrokeOptions().WriteDrawingOptionsToRenderer(r) + s := option.Style(p.font) + p.SetDrawingStyle(s.GetStrokeOptions()) - width := d.Box.Width() - height := d.Box.Height() + width := p.Width() + height := p.Height() data := *a.data tickCount := len(data) if tickCount == 0 { @@ -319,14 +322,14 @@ func (a *axis) axisTick(renderOpt *axisRenderOption) { for _, v := range values { x := x0 y := v - d.moveTo(x, y) - d.lineTo(x+tickLengthValue, y) - r.Stroke() + p.MoveTo(x, y) + p.LineTo(x+tickLengthValue, y) + p.Stroke() } } // 辅助线 if option.SplitLineShow && !option.SplitLineColor.IsZero() { - r.SetStrokeColor(option.SplitLineColor) + p.SetStrokeColor(option.SplitLineColor) splitLineWidth := width - labelWidth - tickLengthValue x0 = labelWidth + tickLengthValue if position == PositionRight { @@ -336,9 +339,9 @@ func (a *axis) axisTick(renderOpt *axisRenderOption) { for _, v := range values[0 : len(values)-1] { x := x0 y := v - d.moveTo(x, y) - d.lineTo(x+splitLineWidth, y) - r.Stroke() + p.MoveTo(x, y) + p.LineTo(x+splitLineWidth, y) + p.Stroke() } } default: @@ -355,14 +358,14 @@ func (a *axis) axisTick(renderOpt *axisRenderOption) { } x := v y := y0 - d.moveTo(x, y-tickLengthValue) - d.lineTo(x, y) - r.Stroke() + p.MoveTo(x, y-tickLengthValue) + p.LineTo(x, y) + p.Stroke() } } // 辅助线 if option.SplitLineShow && !option.SplitLineColor.IsZero() { - r.SetStrokeColor(option.SplitLineColor) + p.SetStrokeColor(option.SplitLineColor) y0 = 0 splitLineHeight := height - labelHeight - tickLengthValue if position == PositionTop { @@ -377,22 +380,23 @@ func (a *axis) axisTick(renderOpt *axisRenderOption) { x := v y := y0 - d.moveTo(x, y) - d.lineTo(x, y0+splitLineHeight) - r.Stroke() + p.MoveTo(x, y) + p.LineTo(x, y0+splitLineHeight) + p.Stroke() } } } } func (a *axis) measureTextMaxWidthHeight() (int, int) { - d := a.d - r := d.Render - s := a.option.Style(d.Font) + // d := a.d + // r := d.Render + p := a.painter + s := a.option.Style(p.font) data := a.data - s.GetStrokeOptions().WriteDrawingOptionsToRenderer(r) - s.GetTextOptions().WriteTextOptionsToRenderer(r) - return measureTextMaxWidthHeight(data.TextList(), r) + p.SetDrawingStyle(s.GetStrokeOptions()) + p.SetTextStyle(s.GetTextOptions()) + return measureTextMaxWidthHeight(data.TextList(), p) } // measure returns the measurement of axis. @@ -429,7 +433,7 @@ func (a *axis) Render() { } unitCount := chart.MaxInt(option.SplitNumber, 1) - width := a.d.Box.Width() + width := a.painter.Width() textList := a.data.TextList() count := len(textList) diff --git a/axis_test.go b/axis_test.go index 37c8314..fe253e9 100644 --- a/axis_test.go +++ b/axis_test.go @@ -207,10 +207,10 @@ func TestAxis(t *testing.T) { }, } for _, tt := range tests { - d, err := NewDraw(DrawOption{ + p, err := NewPainter(PainterOptions{ Width: 400, Height: 300, - }, PaddingOption(chart.Box{ + }, PainterPaddingOption(chart.Box{ Left: 5, Top: 5, Right: 5, @@ -222,9 +222,9 @@ func TestAxis(t *testing.T) { if tt.newData != nil { data = tt.newData() } - NewAxis(d, data, style).Render() + NewAxis(p, data, style).Render() - result, err := d.Bytes() + result, err := p.Bytes() assert.Nil(err) assert.Equal(tt.result, string(result)) } @@ -233,7 +233,7 @@ func TestAxis(t *testing.T) { func TestMeasureAxis(t *testing.T) { assert := assert.New(t) - d, err := NewDraw(DrawOption{ + p, err := NewPainter(PainterOptions{ Width: 400, Height: 300, }) @@ -243,14 +243,14 @@ func TestMeasureAxis(t *testing.T) { "Sun", }) f, _ := chart.GetDefaultFont() - width := NewAxis(d, data, AxisOption{ + width := NewAxis(p, data, AxisOption{ FontSize: 12, Font: f, Position: PositionLeft, }).measure().Width assert.Equal(44, width) - height := NewAxis(d, data, AxisOption{ + height := NewAxis(p, data, AxisOption{ FontSize: 12, Font: f, Position: PositionTop, diff --git a/painer.go b/painter.go similarity index 88% rename from painer.go rename to painter.go index 670f6f6..639371e 100644 --- a/painer.go +++ b/painter.go @@ -38,14 +38,15 @@ type Painter struct { parent *Painter style Style previousStyle Style + theme *Theme } type PainterOptions struct { // Draw type, "svg" or "png", default type is "svg" Type string - // The width of draw canvas + // The width of draw painter Width int - // The height of draw canvas + // The height of draw painter Height int // The font for painter Font *truetype.Font @@ -53,7 +54,7 @@ type PainterOptions struct { type PainterOption func(*Painter) -// PainterPaddingOption sets the padding of draw canvas +// PainterPaddingOption sets the padding of draw painter func PainterPaddingOption(padding Box) PainterOption { return func(p *Painter) { p.box.Left += padding.Left @@ -63,7 +64,7 @@ func PainterPaddingOption(padding Box) PainterOption { } } -// PainterBoxOption sets the box of draw canvas +// PainterBoxOption sets the box of draw painter func PainterBoxOption(box Box) PainterOption { return func(p *Painter) { if box.IsZero() { @@ -73,21 +74,45 @@ func PainterBoxOption(box Box) PainterOption { } } -// PainterFontOption sets the font of draw canvas +// PainterFontOption sets the font of draw painter func PainterFontOption(font *truetype.Font) PainterOption { return func(p *Painter) { + if font == nil { + return + } p.font = font } } -// PainterStyleOption sets the style of draw canvas +// PainterStyleOption sets the style of draw painter func PainterStyleOption(style Style) PainterOption { return func(p *Painter) { p.SetDrawingStyle(style) } } -// NewPainter creates a new Painter +// PainterThemeOption sets the theme of draw painter +func PainterThemeOption(theme *Theme) PainterOption { + return func(p *Painter) { + if theme == nil { + return + } + p.theme = theme + } +} + +func PainterWidthHeightOption(width, height int) PainterOption { + return func(p *Painter) { + if width > 0 { + p.box.Right = p.box.Left + width + } + if height > 0 { + p.box.Bottom = p.box.Top + height + } + } +} + +// NewPainter creates a new painter func NewPainter(opts PainterOptions, opt ...PainterOption) (*Painter, error) { if opts.Width <= 0 || opts.Height <= 0 { return nil, errors.New("width/height can not be nil") @@ -135,6 +160,7 @@ func (p *Painter) Child(opt ...PainterOption) *Painter { parent: p, style: p.style, previousStyle: p.previousStyle, + theme: p.theme, } child.setOptions(opt...) return child @@ -286,6 +312,22 @@ func (p *Painter) Fill() { p.render.Fill() } +func (p *Painter) Width() int { + return p.box.Width() +} + +func (p *Painter) Height() int { + return p.box.Height() +} + +func (p *Painter) MeasureText(text string) Box { + return p.render.MeasureText(text) +} + +func (p *Painter) SetStrokeColor(color Color) { + p.render.SetStrokeColor(color) +} + func (p *Painter) LineStroke(points []Point, style LineStyle) { s := style.Style() if !s.ShouldDrawStroke() { diff --git a/painer_test.go b/painter_test.go similarity index 100% rename from painer_test.go rename to painter_test.go diff --git a/util.go b/util.go index c895cc3..d35b4b0 100644 --- a/util.go +++ b/util.go @@ -76,11 +76,11 @@ func autoDivide(max, size int) []int { } // measureTextMaxWidthHeight returns maxWidth and maxHeight of text list -func measureTextMaxWidthHeight(textList []string, r chart.Renderer) (int, int) { +func measureTextMaxWidthHeight(textList []string, p *Painter) (int, int) { maxWidth := 0 maxHeight := 0 for _, text := range textList { - box := r.MeasureText(text) + box := p.MeasureText(text) maxWidth = chart.MaxInt(maxWidth, box.Width()) maxHeight = chart.MaxInt(maxHeight, box.Height()) } diff --git a/xaxis.go b/xaxis.go index edd017f..d79f40e 100644 --- a/xaxis.go +++ b/xaxis.go @@ -24,7 +24,6 @@ package charts import ( "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" ) type XAxisOption struct { @@ -53,27 +52,19 @@ func NewXAxisOption(data []string, boundaryGap ...*bool) XAxisOption { } // drawXAxis draws x axis, and returns the height, range of if. -func drawXAxis(p *Draw, opt *XAxisOption, yAxisCount int) (int, *Range, error) { +func drawXAxis(p *Painter, opt *XAxisOption, yAxisCount int) (int, *Range, error) { if opt.Hidden { return 0, nil, nil } left := YAxisWidth right := (yAxisCount - 1) * YAxisWidth - dXAxis, err := NewDraw( - DrawOption{ - Parent: p, - }, - PaddingOption(chart.Box{ + pXAxis := p.Child( + PainterPaddingOption(Box{ Left: left, Right: right, }), + PainterFontOption(opt.Font), ) - if opt.Font != nil { - dXAxis.Font = opt.Font - } - if err != nil { - return 0, nil, err - } theme := NewTheme(opt.Theme) data := NewAxisDataListFromStringList(opt.Data) style := AxisOption{ @@ -90,13 +81,13 @@ func drawXAxis(p *Draw, opt *XAxisOption, yAxisCount int) (int, *Range, error) { boundary = false max-- } - axis := NewAxis(dXAxis, data, style) + axis := NewAxis(pXAxis, data, style) axis.Render() return axis.measure().Height, &Range{ divideCount: len(opt.Data), Min: 0, Max: max, - Size: dXAxis.Box.Width(), + Size: pXAxis.Width(), Boundary: boundary, }, nil } diff --git a/yaxis.go b/yaxis.go index a14e409..5d55440 100644 --- a/yaxis.go +++ b/yaxis.go @@ -45,7 +45,7 @@ type YAxisOption struct { // TODO 长度是否可以变化 const YAxisWidth = 40 -func drawYAxis(p *Draw, opt *ChartOption, axisIndex, xAxisHeight int, padding chart.Box) (*Range, error) { +func drawYAxis(p *Painter, opt *ChartOption, axisIndex, xAxisHeight int, padding chart.Box) (*Range, error) { theme := NewTheme(opt.Theme) yRange := opt.newYRange(axisIndex) values := yRange.Values() @@ -74,32 +74,22 @@ func drawYAxis(p *Draw, opt *ChartOption, axisIndex, xAxisHeight int, padding ch width := NewAxis(p, data, style).measure().Width yAxisCount := len(opt.YAxisList) - boxWidth := p.Box.Width() + boxWidth := p.Width() if axisIndex > 0 { style.SplitLineShow = false style.Position = PositionRight padding.Right += (axisIndex - 1) * YAxisWidth } else { - boxWidth = p.Box.Width() - (yAxisCount-1)*YAxisWidth + boxWidth = p.Width() - (yAxisCount-1)*YAxisWidth padding.Left += (YAxisWidth - width) } - dYAxis, err := NewDraw( - DrawOption{ - Parent: p, - Width: boxWidth, - // 减去x轴的高 - Height: p.Box.Height() - xAxisHeight, - }, - PaddingOption(padding), + pYAxis := p.Child( + PainterWidthHeightOption(boxWidth, p.Height()-xAxisHeight), + PainterPaddingOption(padding), + PainterFontOption(opt.Font), ) - if err != nil { - return nil, err - } - if opt.Font != nil { - dYAxis.Font = opt.Font - } - NewAxis(dYAxis, data, style).Render() - yRange.Size = dYAxis.Box.Height() + NewAxis(pYAxis, data, style).Render() + yRange.Size = pYAxis.Height() return &yRange, nil } From c363d1d5e37e08d01ddee82160ff5a0d4abded71 Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 16 May 2022 20:58:41 +0800 Subject: [PATCH 125/251] refactor: reset --- alias.go | 31 + axis.go | 472 ---------- axis_test.go | 259 ------ bar.go | 58 -- bar_chart.go | 163 ---- bar_chart_test.go | 131 --- bar_test.go | 78 -- chart.go | 502 ----------- chart_option.go | 190 ---- chart_option_test.go | 238 ----- chart_test.go | 567 ------------ draw.go | 372 -------- draw_test.go | 507 ----------- echarts.go | 499 ----------- echarts_test.go | 592 ------------- examples/basic/main.go | 94 -- examples/charts/main.go | 1809 --------------------------------------- funnel.go | 141 --- funnel_test.go | 91 -- legend.go | 226 ----- legend_test.go | 185 ---- line.go | 60 +- line_chart.go | 131 --- line_chart_test.go | 97 --- line_test.go | 165 ---- mark_line.go | 92 -- mark_line_test.go | 99 --- mark_point.go | 89 -- mark_point_test.go | 103 --- painter.go | 8 + painter_test.go | 2 +- pie_chart.go | 159 ---- pie_chart_test.go | 69 -- radar_chart.go | 193 ----- radar_chart_test.go | 102 --- range.go | 109 --- range_test.go | 94 -- series.go | 233 ----- series_test.go | 166 ---- table.go | 145 ---- theme.go | 203 +---- theme_test.go | 87 -- title.go | 155 ---- title_test.go | 142 --- util.go | 4 +- util_test.go | 10 +- xaxis.go | 93 -- xaxis_test.go | 108 --- yaxis.go | 95 -- yaxis_test.go | 119 --- 50 files changed, 55 insertions(+), 10282 deletions(-) delete mode 100644 axis.go delete mode 100644 axis_test.go delete mode 100644 bar.go delete mode 100644 bar_chart.go delete mode 100644 bar_chart_test.go delete mode 100644 bar_test.go delete mode 100644 chart.go delete mode 100644 chart_option.go delete mode 100644 chart_option_test.go delete mode 100644 chart_test.go delete mode 100644 draw.go delete mode 100644 draw_test.go delete mode 100644 echarts.go delete mode 100644 echarts_test.go delete mode 100644 examples/basic/main.go delete mode 100644 examples/charts/main.go delete mode 100644 funnel.go delete mode 100644 funnel_test.go delete mode 100644 legend.go delete mode 100644 legend_test.go delete mode 100644 line_chart.go delete mode 100644 line_chart_test.go delete mode 100644 line_test.go delete mode 100644 mark_line.go delete mode 100644 mark_line_test.go delete mode 100644 mark_point.go delete mode 100644 mark_point_test.go delete mode 100644 pie_chart.go delete mode 100644 pie_chart_test.go delete mode 100644 radar_chart.go delete mode 100644 radar_chart_test.go delete mode 100644 range.go delete mode 100644 range_test.go delete mode 100644 series.go delete mode 100644 series_test.go delete mode 100644 table.go delete mode 100644 theme_test.go delete mode 100644 title.go delete mode 100644 title_test.go delete mode 100644 xaxis.go delete mode 100644 xaxis_test.go delete mode 100644 yaxis.go delete mode 100644 yaxis_test.go diff --git a/alias.go b/alias.go index 3a09919..3bacc67 100644 --- a/alias.go +++ b/alias.go @@ -31,3 +31,34 @@ type Box = chart.Box type Renderer = chart.Renderer type Style = chart.Style type Color = drawing.Color + +type Point struct { + X int + Y int +} + +const ( + ChartTypeLine = "line" + ChartTypeBar = "bar" + ChartTypePie = "pie" + ChartTypeRadar = "radar" + ChartTypeFunnel = "funnel" +) + +const ( + ChartOutputSVG = "svg" + ChartOutputPNG = "png" +) + +const ( + PositionLeft = "left" + PositionRight = "right" + PositionCenter = "center" + PositionTop = "top" + PositionBottom = "bottom" +) + +const ( + OrientHorizontal = "horizontal" + OrientVertical = "vertical" +) diff --git a/axis.go b/axis.go deleted file mode 100644 index 5881f5e..0000000 --- a/axis.go +++ /dev/null @@ -1,472 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "math" - - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" -) - -type AxisOption struct { - // The boundary gap on both sides of a coordinate axis. - // Nil or *true means the center part of two axis ticks - BoundaryGap *bool - // The flag for show axis, set this to *false will hide axis - Show *bool - // The position of axis, it can be 'left', 'top', 'right' or 'bottom' - Position string - // Number of segments that the axis is split into. Note that this number serves only as a recommendation. - SplitNumber int - ClassName string - // The line color of axis - StrokeColor Color - // The line width - StrokeWidth float64 - // The length of the axis tick - TickLength int - // The flag for show axis tick, set this to *false will hide axis tick - TickShow *bool - // The margin value of label - LabelMargin int - // The font size of label - FontSize float64 - // The font of label - Font *truetype.Font - // The color of label - FontColor Color - // The flag for show axis split line, set this to true will show axis split line - SplitLineShow bool - // The color of split line - SplitLineColor Color -} - -type axis struct { - painter *Painter - data *AxisDataList - option *AxisOption -} -type axisMeasurement struct { - Width int - Height int -} - -// NewAxis creates a new axis with data and style options -func NewAxis(p *Painter, data AxisDataList, option AxisOption) *axis { - return &axis{ - painter: p, - data: &data, - option: &option, - } - -} - -// GetLabelMargin returns the label margin value -func (as *AxisOption) GetLabelMargin() int { - return getDefaultInt(as.LabelMargin, 8) -} - -// GetTickLength returns the tick length value -func (as *AxisOption) GetTickLength() int { - return getDefaultInt(as.TickLength, 5) -} - -// Style returns the style of axis -func (as *AxisOption) Style(f *truetype.Font) chart.Style { - s := chart.Style{ - ClassName: as.ClassName, - StrokeColor: as.StrokeColor, - StrokeWidth: as.StrokeWidth, - FontSize: as.FontSize, - FontColor: as.FontColor, - Font: as.Font, - } - if s.FontSize == 0 { - s.FontSize = chart.DefaultFontSize - } - if s.Font == nil { - s.Font = f - } - return s -} - -type AxisData struct { - // The text value of axis - Text string -} -type AxisDataList []AxisData - -// TextList returns the text list of axis data -func (l AxisDataList) TextList() []string { - textList := make([]string, len(l)) - for index, item := range l { - textList[index] = item.Text - } - return textList -} - -type axisRenderOption struct { - textMaxWith int - textMaxHeight int - boundaryGap bool - unitCount int - modValue int -} - -// NewAxisDataListFromStringList creates a new axis data list from string list -func NewAxisDataListFromStringList(textList []string) AxisDataList { - list := make(AxisDataList, len(textList)) - for index, text := range textList { - list[index] = AxisData{ - Text: text, - } - } - return list -} - -func (a *axis) axisLabel(renderOpt *axisRenderOption) { - option := a.option - data := *a.data - // d := a.d - if option.FontColor.IsZero() || len(data) == 0 { - return - } - // r := d.Render - - // s.GetTextOptions().WriteTextOptionsToRenderer(r) - p := a.painter - s := option.Style(p.font) - p.SetTextStyle(s) - - width := p.Width() - height := p.Height() - textList := data.TextList() - count := len(textList) - - boundaryGap := renderOpt.boundaryGap - if !boundaryGap { - count-- - } - - unitCount := renderOpt.unitCount - modValue := renderOpt.modValue - labelMargin := option.GetLabelMargin() - - // 轴线 - labelHeight := labelMargin + renderOpt.textMaxHeight - labelWidth := labelMargin + renderOpt.textMaxWith - - // 坐标轴文本 - position := option.Position - switch position { - case PositionLeft: - fallthrough - case PositionRight: - values := autoDivide(height, count) - textList := data.TextList() - // 由下往上 - reverseIntSlice(values) - for index, text := range textList { - y := values[index] - 2 - b := p.MeasureText(text) - if boundaryGap { - height := y - values[index+1] - y -= (height - b.Height()) >> 1 - } else { - y += b.Height() >> 1 - } - // 左右位置的x不一样 - x := width - renderOpt.textMaxWith - if position == PositionLeft { - x = labelWidth - b.Width() - 1 - } - p.Text(text, x, y) - } - default: - // 定位bottom,重新计算y0的定位 - y0 := height - labelMargin - if position == PositionTop { - y0 = labelHeight - labelMargin - } - values := autoDivide(width, count) - for index, text := range data.TextList() { - if unitCount != 0 && index%unitCount != modValue { - continue - } - x := values[index] - leftOffset := 0 - b := p.MeasureText(text) - if boundaryGap { - width := values[index+1] - x - leftOffset = (width - b.Width()) >> 1 - } else { - // 左移文本长度 - leftOffset = -b.Width() >> 1 - } - p.Text(text, x+leftOffset, y0) - } - } -} - -func (a *axis) axisLine(renderOpt *axisRenderOption) { - // d := a.d - // r := d.Render - p := a.painter - option := a.option - s := option.Style(p.font) - p.SetDrawingStyle(s.GetStrokeOptions()) - - x0 := 0 - y0 := 0 - x1 := 0 - y1 := 0 - width := p.Width() - height := p.Height() - labelMargin := option.GetLabelMargin() - - // 轴线 - labelHeight := labelMargin + renderOpt.textMaxHeight - labelWidth := labelMargin + renderOpt.textMaxWith - tickLength := option.GetTickLength() - switch option.Position { - case PositionLeft: - x0 = tickLength + labelWidth - x1 = x0 - y0 = 0 - y1 = height - case PositionRight: - x0 = width - labelWidth - x1 = x0 - y0 = 0 - y1 = height - case PositionTop: - x0 = 0 - x1 = width - y0 = labelHeight - y1 = y0 - // bottom - default: - x0 = 0 - x1 = width - y0 = height - tickLength - labelHeight - y1 = y0 - } - - p.MoveTo(x0, y0) - p.LineTo(x1, y1) - p.FillStroke() -} - -func (a *axis) axisTick(renderOpt *axisRenderOption) { - // d := a.d - // r := d.Render - - p := a.painter - option := a.option - s := option.Style(p.font) - p.SetDrawingStyle(s.GetStrokeOptions()) - - width := p.Width() - height := p.Height() - data := *a.data - tickCount := len(data) - if tickCount == 0 { - return - } - if !renderOpt.boundaryGap { - tickCount-- - } - labelMargin := option.GetLabelMargin() - tickShow := true - if isFalse(option.TickShow) { - tickShow = false - } - unitCount := renderOpt.unitCount - - tickLengthValue := option.GetTickLength() - labelHeight := labelMargin + renderOpt.textMaxHeight - labelWidth := labelMargin + renderOpt.textMaxWith - position := option.Position - switch position { - case PositionLeft: - fallthrough - case PositionRight: - values := autoDivide(height, tickCount) - // 左右仅是x0的位置不一样 - x0 := width - labelWidth - if option.Position == PositionLeft { - x0 = labelWidth - } - if tickShow { - for _, v := range values { - x := x0 - y := v - p.MoveTo(x, y) - p.LineTo(x+tickLengthValue, y) - p.Stroke() - } - } - // 辅助线 - if option.SplitLineShow && !option.SplitLineColor.IsZero() { - p.SetStrokeColor(option.SplitLineColor) - splitLineWidth := width - labelWidth - tickLengthValue - x0 = labelWidth + tickLengthValue - if position == PositionRight { - x0 = 0 - splitLineWidth = width - labelWidth - 1 - } - for _, v := range values[0 : len(values)-1] { - x := x0 - y := v - p.MoveTo(x, y) - p.LineTo(x+splitLineWidth, y) - p.Stroke() - } - } - default: - values := autoDivide(width, tickCount) - // 上下仅是y0的位置不一样 - y0 := height - labelHeight - if position == PositionTop { - y0 = labelHeight - } - if tickShow { - for index, v := range values { - if index%unitCount != 0 { - continue - } - x := v - y := y0 - p.MoveTo(x, y-tickLengthValue) - p.LineTo(x, y) - p.Stroke() - } - } - // 辅助线 - if option.SplitLineShow && !option.SplitLineColor.IsZero() { - p.SetStrokeColor(option.SplitLineColor) - y0 = 0 - splitLineHeight := height - labelHeight - tickLengthValue - if position == PositionTop { - y0 = labelHeight - splitLineHeight = height - labelHeight - } - - for index, v := range values { - if index%unitCount != 0 { - continue - } - x := v - y := y0 - - p.MoveTo(x, y) - p.LineTo(x, y0+splitLineHeight) - p.Stroke() - } - } - } -} - -func (a *axis) measureTextMaxWidthHeight() (int, int) { - // d := a.d - // r := d.Render - p := a.painter - s := a.option.Style(p.font) - data := a.data - p.SetDrawingStyle(s.GetStrokeOptions()) - p.SetTextStyle(s.GetTextOptions()) - return measureTextMaxWidthHeight(data.TextList(), p) -} - -// measure returns the measurement of axis. -// Width will be textMaxWidth + labelMargin + tickLength for position left or right. -// Height will be textMaxHeight + labelMargin + tickLength for position top or bottom. -func (a *axis) measure() axisMeasurement { - option := a.option - value := option.GetLabelMargin() + option.GetTickLength() - textMaxWidth, textMaxHeight := a.measureTextMaxWidthHeight() - info := axisMeasurement{} - if option.Position == PositionLeft || - option.Position == PositionRight { - info.Width = textMaxWidth + value - } else { - info.Height = textMaxHeight + value - } - return info -} - -// Render renders the axis for chart -func (a *axis) Render() { - option := a.option - if isFalse(option.Show) { - return - } - textMaxWidth, textMaxHeight := a.measureTextMaxWidthHeight() - opt := &axisRenderOption{ - textMaxWith: textMaxWidth, - textMaxHeight: textMaxHeight, - boundaryGap: true, - } - if isFalse(option.BoundaryGap) { - opt.boundaryGap = false - } - - unitCount := chart.MaxInt(option.SplitNumber, 1) - width := a.painter.Width() - textList := a.data.TextList() - count := len(textList) - - position := option.Position - switch position { - case PositionLeft: - fallthrough - case PositionRight: - default: - maxCount := width / (opt.textMaxWith + 10) - // 可以显示所有 - if maxCount >= count { - unitCount = 1 - } else if maxCount < count/unitCount { - unitCount = int(math.Ceil(float64(count) / float64(maxCount))) - } - } - - boundaryGap := opt.boundaryGap - modValue := 0 - if boundaryGap && unitCount > 1 { - // 如果是居中,unit count需要设置为奇数 - if unitCount%2 == 0 { - unitCount++ - } - modValue = unitCount / 2 - } - opt.modValue = modValue - opt.unitCount = unitCount - - // 坐标轴线 - a.axisLine(opt) - a.axisTick(opt) - // 坐标文本 - a.axisLabel(opt) -} diff --git a/axis_test.go b/axis_test.go deleted file mode 100644 index fe253e9..0000000 --- a/axis_test.go +++ /dev/null @@ -1,259 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/golang/freetype/truetype" - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestAxisOption(t *testing.T) { - assert := assert.New(t) - - as := AxisOption{} - - assert.Equal(8, as.GetLabelMargin()) - as.LabelMargin = 10 - assert.Equal(10, as.GetLabelMargin()) - - assert.Equal(5, as.GetTickLength()) - as.TickLength = 6 - assert.Equal(6, as.GetTickLength()) - - f := &truetype.Font{} - style := as.Style(f) - assert.Equal(float64(10), style.FontSize) - assert.Equal(f, style.Font) -} - -func TestAxisDataList(t *testing.T) { - assert := assert.New(t) - - textList := []string{ - "a", - "b", - } - data := NewAxisDataListFromStringList(textList) - assert.Equal(textList, data.TextList()) -} - -func TestAxis(t *testing.T) { - assert := assert.New(t) - - axisData := NewAxisDataListFromStringList([]string{ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun", - }) - getDefaultOption := func() AxisOption { - return AxisOption{ - StrokeColor: drawing.ColorBlack, - StrokeWidth: 1, - FontColor: drawing.ColorBlack, - Show: TrueFlag(), - TickShow: TrueFlag(), - SplitLineShow: true, - SplitLineColor: drawing.ColorBlack.WithAlpha(60), - } - } - tests := []struct { - newOption func() AxisOption - newData func() AxisDataList - result string - }{ - // 文本按起始位置展示 - // axis位于bottom - { - newOption: func() AxisOption { - opt := getDefaultOption() - opt.BoundaryGap = FalseFlag() - return opt - }, - result: "\\nMonTueWedThuFriSatSun", - }, - // 文本居中展示 - // axis位于bottom - { - newOption: func() AxisOption { - opt := getDefaultOption() - return opt - }, - result: "\\nMonTueWedThuFriSatSun", - }, - // 文本按起始位置展示 - // axis位于top - { - newOption: func() AxisOption { - opt := getDefaultOption() - opt.Position = PositionTop - opt.BoundaryGap = FalseFlag() - return opt - }, - result: "\\nMonTueWedThuFriSatSun", - }, - // 文本居中展示 - // axis位于top - { - newOption: func() AxisOption { - opt := getDefaultOption() - opt.Position = PositionTop - return opt - }, - result: "\\nMonTueWedThuFriSatSun", - }, - // 文本按起始位置展示 - // axis位于left - { - newOption: func() AxisOption { - opt := getDefaultOption() - opt.Position = PositionLeft - opt.BoundaryGap = FalseFlag() - return opt - }, - result: "\\nMonTueWedThuFriSatSun", - }, - // 文本居中展示 - // axis位于left - { - newOption: func() AxisOption { - opt := getDefaultOption() - opt.Position = PositionLeft - return opt - }, - result: "\\nMonTueWedThuFriSatSun", - }, - // 文本按起始位置展示 - // axis位于right - { - newOption: func() AxisOption { - opt := getDefaultOption() - opt.Position = PositionRight - opt.BoundaryGap = FalseFlag() - return opt - }, - result: "\\nMonTueWedThuFriSatSun", - }, - // 文本居中展示 - // axis位于right - { - newOption: func() AxisOption { - opt := getDefaultOption() - opt.Position = PositionRight - return opt - }, - result: "\\nMonTueWedThuFriSatSun", - }, - // text较多,仅展示部分 - { - newOption: func() AxisOption { - opt := getDefaultOption() - opt.Position = PositionBottom - return opt - }, - newData: func() AxisDataList { - return NewAxisDataListFromStringList([]string{ - "01-01", - "01-02", - "01-03", - "01-04", - "01-05", - "01-06", - "01-07", - "01-08", - "01-09", - "01-10", - "01-11", - "01-12", - "01-13", - "01-14", - "01-15", - "01-16", - "01-17", - "01-18", - "01-19", - "01-20", - "01-21", - }) - }, - result: "\\n01-0201-0501-0801-1101-1401-1701-20", - }, - } - for _, tt := range tests { - p, err := NewPainter(PainterOptions{ - Width: 400, - Height: 300, - }, PainterPaddingOption(chart.Box{ - Left: 5, - Top: 5, - Right: 5, - Bottom: 5, - })) - assert.Nil(err) - style := tt.newOption() - data := axisData - if tt.newData != nil { - data = tt.newData() - } - NewAxis(p, data, style).Render() - - result, err := p.Bytes() - assert.Nil(err) - assert.Equal(tt.result, string(result)) - } -} - -func TestMeasureAxis(t *testing.T) { - assert := assert.New(t) - - p, err := NewPainter(PainterOptions{ - Width: 400, - Height: 300, - }) - assert.Nil(err) - data := NewAxisDataListFromStringList([]string{ - "Mon", - "Sun", - }) - f, _ := chart.GetDefaultFont() - width := NewAxis(p, data, AxisOption{ - FontSize: 12, - Font: f, - Position: PositionLeft, - }).measure().Width - assert.Equal(44, width) - - height := NewAxis(p, data, AxisOption{ - FontSize: 12, - Font: f, - Position: PositionTop, - }).measure().Height - assert.Equal(28, height) -} diff --git a/bar.go b/bar.go deleted file mode 100644 index 1090f6b..0000000 --- a/bar.go +++ /dev/null @@ -1,58 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -type BarStyle struct { - ClassName string - StrokeDashArray []float64 - FillColor drawing.Color -} - -func (bs *BarStyle) Style() chart.Style { - return chart.Style{ - ClassName: bs.ClassName, - StrokeDashArray: bs.StrokeDashArray, - StrokeColor: bs.FillColor, - StrokeWidth: 1, - FillColor: bs.FillColor, - } -} - -// Bar renders bar for chart -func (d *Draw) Bar(b chart.Box, style BarStyle) { - s := style.Style() - - r := d.Render - s.GetFillAndStrokeOptions().WriteToRenderer(r) - d.moveTo(b.Left, b.Top) - d.lineTo(b.Right, b.Top) - d.lineTo(b.Right, b.Bottom) - d.lineTo(b.Left, b.Bottom) - d.lineTo(b.Left, b.Top) - d.Render.FillStroke() -} diff --git a/bar_chart.go b/bar_chart.go deleted file mode 100644 index 32373b1..0000000 --- a/bar_chart.go +++ /dev/null @@ -1,163 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" -) - -type barChartOption struct { - // The series list fo bar chart - SeriesList SeriesList - // The theme - Theme string - // The font - Font *truetype.Font -} - -func barChartRender(opt barChartOption, result *basicRenderResult) ([]markPointRenderOption, error) { - d, err := NewDraw(DrawOption{ - Parent: result.d, - }, PaddingOption(chart.Box{ - Top: result.titleBox.Height(), - // TODO 后续考虑是否需要根据左侧是否展示y轴再生成对应的left - Left: YAxisWidth, - })) - if err != nil { - return nil, err - } - xRange := result.xRange - x0, x1 := xRange.GetRange(0) - width := int(x1 - x0) - // 每一块之间的margin - margin := 10 - // 每一个bar之间的margin - barMargin := 5 - if width < 20 { - margin = 2 - barMargin = 2 - } else if width < 50 { - margin = 5 - barMargin = 3 - } - - seriesCount := len(opt.SeriesList) - // 总的宽度-两个margin-(总数-1)的barMargin - barWidth := (width - 2*margin - barMargin*(seriesCount-1)) / len(opt.SeriesList) - - barMaxHeight := result.getYRange(0).Size - theme := NewTheme(opt.Theme) - - seriesNames := opt.SeriesList.Names() - - r := d.Render - - markPointRenderOptions := make([]markPointRenderOption, 0) - - for i, s := range opt.SeriesList { - // 由于series是for range,为同一个数据,因此需要clone - // 后续需要使用,如mark point - series := s - yRange := result.getYRange(series.YAxisIndex) - points := make([]Point, len(series.Data)) - index := series.index - if index == 0 { - index = i - } - seriesColor := theme.GetSeriesColor(index) - // mark line - markLineRender(markLineRenderOption{ - Draw: d, - FillColor: seriesColor, - FontColor: theme.GetTextColor(), - StrokeColor: seriesColor, - Font: opt.Font, - Series: &series, - Range: yRange, - }) - divideValues := xRange.AutoDivide() - for j, item := range series.Data { - if j >= xRange.divideCount { - continue - } - x := divideValues[j] - x += margin - if i != 0 { - x += i * (barWidth + barMargin) - } - - h := int(yRange.getHeight(item.Value)) - fillColor := seriesColor - if !item.Style.FillColor.IsZero() { - fillColor = item.Style.FillColor - } - top := barMaxHeight - h - d.Bar(chart.Box{ - Top: top, - Left: x, - Right: x + barWidth, - Bottom: barMaxHeight - 1, - }, BarStyle{ - FillColor: fillColor, - }) - // 用于生成marker point - points[j] = Point{ - // 居中的位置 - X: x + barWidth>>1, - Y: top, - } - // 如果label不需要展示,则返回 - if !series.Label.Show { - continue - } - distance := series.Label.Distance - if distance == 0 { - distance = 5 - } - text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(i, item.Value, -1) - labelStyle := chart.Style{ - FontColor: theme.GetTextColor(), - FontSize: labelFontSize, - Font: opt.Font, - } - if !series.Label.Color.IsZero() { - labelStyle.FontColor = series.Label.Color - } - labelStyle.GetTextOptions().WriteToRenderer(r) - textBox := r.MeasureText(text) - d.text(text, x+(barWidth-textBox.Width())>>1, barMaxHeight-h-distance) - } - - // 生成mark point的参数 - markPointRenderOptions = append(markPointRenderOptions, markPointRenderOption{ - Draw: d, - FillColor: seriesColor, - Font: opt.Font, - Points: points, - Series: &series, - }) - } - - return markPointRenderOptions, nil -} diff --git a/bar_chart_test.go b/bar_chart_test.go deleted file mode 100644 index f10a1bc..0000000 --- a/bar_chart_test.go +++ /dev/null @@ -1,131 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestBarChartRender(t *testing.T) { - assert := assert.New(t) - - width := 400 - height := 300 - d, err := NewDraw(DrawOption{ - Width: width, - Height: height, - }) - assert.Nil(err) - - result := basicRenderResult{ - xRange: &Range{ - Min: 0, - Max: 4, - divideCount: 4, - Size: width, - Boundary: true, - }, - yRangeList: []*Range{ - { - divideCount: 6, - Max: 100, - Min: 0, - Size: height, - }, - }, - d: d, - } - f, _ := chart.GetDefaultFont() - - markPointOptions, err := barChartRender(barChartOption{ - Font: f, - SeriesList: SeriesList{ - { - Label: SeriesLabel{ - Show: true, - Color: drawing.ColorBlue, - }, - MarkLine: NewMarkLine( - SeriesMarkDataTypeMin, - ), - Data: []SeriesData{ - { - Value: 20, - }, - { - Value: 60, - Style: chart.Style{ - FillColor: drawing.ColorRed, - }, - }, - { - Value: 90, - }, - }, - }, - NewSeriesFromValues([]float64{ - 80, - 30, - 70, - }), - }, - }, &result) - assert.Nil(err) - assert.Equal(2, len(markPointOptions)) - assert.Equal([]Point{ - { - X: 28, - Y: 240, - }, - { - X: 128, - Y: 120, - }, - { - X: 228, - Y: 30, - }, - }, markPointOptions[0].Points) - assert.Equal([]Point{ - { - X: 70, - Y: 60, - }, - { - X: 170, - Y: 210, - }, - { - X: 270, - Y: 90, - }, - }, markPointOptions[1].Points) - - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n20206090", string(data)) -} diff --git a/bar_test.go b/bar_test.go deleted file mode 100644 index 01b6d3c..0000000 --- a/bar_test.go +++ /dev/null @@ -1,78 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestBarStyle(t *testing.T) { - assert := assert.New(t) - - bs := BarStyle{ - ClassName: "test", - StrokeDashArray: []float64{ - 1.0, - }, - FillColor: drawing.ColorBlack, - } - - assert.Equal(chart.Style{ - ClassName: "test", - StrokeDashArray: []float64{ - 1.0, - }, - StrokeWidth: 1, - FillColor: drawing.ColorBlack, - StrokeColor: drawing.ColorBlack, - }, bs.Style()) -} - -func TestDrawBar(t *testing.T) { - assert := assert.New(t) - d, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }, PaddingOption(chart.Box{ - Left: 10, - Top: 20, - Right: 30, - Bottom: 40, - })) - assert.Nil(err) - d.Bar(chart.Box{ - Left: 0, - Top: 0, - Right: 20, - Bottom: 200, - }, BarStyle{ - FillColor: drawing.ColorBlack, - }) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n", string(data)) -} diff --git a/chart.go b/chart.go deleted file mode 100644 index 21f2071..0000000 --- a/chart.go +++ /dev/null @@ -1,502 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "errors" - "math" - "sort" - "strings" - - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -const ( - ChartTypeLine = "line" - ChartTypeBar = "bar" - ChartTypePie = "pie" - ChartTypeRadar = "radar" - ChartTypeFunnel = "funnel" -) - -const ( - ChartOutputSVG = "svg" - ChartOutputPNG = "png" -) - -type Point struct { - X int - Y int -} - -const labelFontSize = 10 -const defaultDotWidth = 2.0 -const defaultStrokeWidth = 2.0 - -var defaultChartWidth = 600 -var defaultChartHeight = 400 - -type ChartOption struct { - // The output type of chart, "svg" or "png", default value is "svg" - Type string - // The font family, which should be installed first - FontFamily string - // The font of chart, the default font is "roboto" - Font *truetype.Font - // The theme of chart, "light" and "dark". - // The default theme is "light" - Theme string - // The title option - Title TitleOption - // The legend option - Legend LegendOption - // The x axis option - XAxis XAxisOption - // The y axis option list - YAxisList []YAxisOption - // The width of chart, default width is 600 - Width int - // The height of chart, default height is 400 - Height int - Parent *Draw - // The padding for chart, default padding is [20, 10, 10, 10] - Padding chart.Box - // The canvas box for chart - Box chart.Box - // The series list - SeriesList SeriesList - // The radar indicator list - RadarIndicators []RadarIndicator - // The background color of chart - BackgroundColor drawing.Color - // The child charts - Children []ChartOption -} - -// FillDefault fills the default value for chart option -func (o *ChartOption) FillDefault(theme string) { - t := NewTheme(theme) - // 如果为空,初始化 - yAxisCount := 1 - for _, series := range o.SeriesList { - if series.YAxisIndex >= yAxisCount { - yAxisCount++ - } - } - yAxisList := make([]YAxisOption, yAxisCount) - copy(yAxisList, o.YAxisList) - o.YAxisList = yAxisList - - if o.Font == nil { - o.Font, _ = chart.GetDefaultFont() - } - if o.BackgroundColor.IsZero() { - o.BackgroundColor = t.GetBackgroundColor() - } - if o.Padding.IsZero() { - o.Padding = chart.Box{ - Top: 10, - Right: 10, - Bottom: 10, - Left: 10, - } - } - - // 标题的默认值 - if o.Title.Style.FontColor.IsZero() { - o.Title.Style.FontColor = t.GetTextColor() - } - if o.Title.Style.FontSize == 0 { - o.Title.Style.FontSize = 14 - } - if o.Title.Style.Font == nil { - o.Title.Style.Font = o.Font - } - if o.Title.Style.Padding.IsZero() { - o.Title.Style.Padding = chart.Box{ - Bottom: 10, - } - } - // 副标题 - if o.Title.SubtextStyle.FontColor.IsZero() { - o.Title.SubtextStyle.FontColor = o.Title.Style.FontColor.WithAlpha(180) - } - if o.Title.SubtextStyle.FontSize == 0 { - o.Title.SubtextStyle.FontSize = labelFontSize - } - if o.Title.SubtextStyle.Font == nil { - o.Title.SubtextStyle.Font = o.Font - } - - o.Legend.theme = theme - if o.Legend.Style.FontSize == 0 { - o.Legend.Style.FontSize = labelFontSize - } - if o.Legend.Left == "" { - o.Legend.Left = PositionCenter - } - // legend与series name的关联 - if len(o.Legend.Data) == 0 { - o.Legend.Data = o.SeriesList.Names() - } else { - seriesCount := len(o.SeriesList) - for index, name := range o.Legend.Data { - if index < seriesCount && - len(o.SeriesList[index].Name) == 0 { - o.SeriesList[index].Name = name - } - } - nameIndexDict := map[string]int{} - for index, name := range o.Legend.Data { - nameIndexDict[name] = index - } - // 保证series的顺序与legend一致 - sort.Slice(o.SeriesList, func(i, j int) bool { - return nameIndexDict[o.SeriesList[i].Name] < nameIndexDict[o.SeriesList[j].Name] - }) - } - // 如果无legend数据,则隐藏 - if len(strings.Join(o.Legend.Data, "")) == 0 { - o.Legend.Show = FalseFlag() - } - if o.Legend.Style.Font == nil { - o.Legend.Style.Font = o.Font - } - if o.Legend.Style.FontColor.IsZero() { - o.Legend.Style.FontColor = t.GetTextColor() - } - if o.XAxis.Theme == "" { - o.XAxis.Theme = theme - } - o.XAxis.Font = o.Font -} - -func (o *ChartOption) getWidth() int { - if o.Width != 0 { - return o.Width - } - if o.Parent != nil { - return o.Parent.Box.Width() - } - return defaultChartWidth -} - -func SetDefaultWidth(width int) { - if width > 0 { - defaultChartWidth = width - } -} -func SetDefaultHeight(height int) { - if height > 0 { - defaultChartHeight = height - } -} - -func (o *ChartOption) getHeight() int { - - if o.Height != 0 { - return o.Height - } - if o.Parent != nil { - return o.Parent.Box.Height() - } - return defaultChartHeight -} - -func (o *ChartOption) newYRange(axisIndex int) Range { - min := math.MaxFloat64 - max := -math.MaxFloat64 - if axisIndex >= len(o.YAxisList) { - axisIndex = 0 - } - yAxis := o.YAxisList[axisIndex] - - for _, series := range o.SeriesList { - if series.YAxisIndex != axisIndex { - continue - } - for _, item := range series.Data { - if item.Value > max { - max = item.Value - } - if item.Value < min { - min = item.Value - } - } - } - min = min * 0.9 - max = max * 1.1 - if yAxis.Min != nil { - min = *yAxis.Min - } - if yAxis.Max != nil { - max = *yAxis.Max - } - divideCount := 6 - // y轴分设置默认划分为6块 - r := NewRange(min, max, divideCount) - - // 由于NewRange会重新计算min max - if yAxis.Min != nil { - r.Min = min - } - if yAxis.Max != nil { - r.Max = max - } - - return r -} - -type basicRenderResult struct { - xRange *Range - yRangeList []*Range - d *Draw - titleBox chart.Box -} - -func (r *basicRenderResult) getYRange(index int) *Range { - if index >= len(r.yRangeList) { - index = 0 - } - return r.yRangeList[index] -} - -// Render renders the chart by option -func Render(opt ChartOption, optFuncs ...OptionFunc) (*Draw, error) { - for _, optFunc := range optFuncs { - optFunc(&opt) - } - if len(opt.SeriesList) == 0 { - return nil, errors.New("series can not be nil") - } - if len(opt.FontFamily) != 0 { - f, err := GetFont(opt.FontFamily) - if err != nil { - return nil, err - } - opt.Font = f - } - opt.FillDefault(opt.Theme) - - lineSeries := make([]Series, 0) - barSeries := make([]Series, 0) - isPieChart := false - isRadarChart := false - isFunnelChart := false - for index := range opt.SeriesList { - opt.SeriesList[index].index = index - item := opt.SeriesList[index] - switch item.Type { - case ChartTypePie: - isPieChart = true - case ChartTypeRadar: - isRadarChart = true - case ChartTypeFunnel: - isFunnelChart = true - case ChartTypeBar: - barSeries = append(barSeries, item) - default: - lineSeries = append(lineSeries, item) - } - } - // 如果指定了pie,则以pie的形式处理,pie不支持多类型图表 - // pie不需要axis - // radar 同样处理 - if isPieChart || - isRadarChart || - isFunnelChart { - opt.XAxis.Hidden = true - for index := range opt.YAxisList { - opt.YAxisList[index].Hidden = true - } - } - result, err := chartBasicRender(&opt) - if err != nil { - return nil, err - } - markPointRenderOptions := make([]markPointRenderOption, 0) - fns := []func() error{ - // pie render - func() error { - if !isPieChart { - return nil - } - return pieChartRender(pieChartOption{ - SeriesList: opt.SeriesList, - Theme: opt.Theme, - Font: opt.Font, - }, result) - }, - // radar render - func() error { - if !isRadarChart { - return nil - } - return radarChartRender(radarChartOption{ - SeriesList: opt.SeriesList, - Theme: opt.Theme, - Font: opt.Font, - Indicators: opt.RadarIndicators, - }, result) - }, - // funnel render - func() error { - if !isFunnelChart { - return nil - } - return funnelChartRender(funnelChartOption{ - SeriesList: opt.SeriesList, - Theme: opt.Theme, - Font: opt.Font, - }, result) - }, - // bar render - func() error { - // 如果无bar类型的series - if len(barSeries) == 0 { - return nil - } - options, err := barChartRender(barChartOption{ - SeriesList: barSeries, - Theme: opt.Theme, - Font: opt.Font, - }, result) - if err != nil { - return err - } - markPointRenderOptions = append(markPointRenderOptions, options...) - return nil - }, - // line render - func() error { - // 如果无line类型的series - if len(lineSeries) == 0 { - return nil - } - options, err := lineChartRender(lineChartOption{ - Theme: opt.Theme, - SeriesList: lineSeries, - Font: opt.Font, - }, result) - if err != nil { - return err - } - markPointRenderOptions = append(markPointRenderOptions, options...) - return nil - }, - // legend需要在顶层,因此此处render - func() error { - _, err := NewLegend(result.d, opt.Legend).Render() - return err - }, - // mark point最后render - func() error { - // mark point render不会出错 - for _, opt := range markPointRenderOptions { - markPointRender(opt) - } - return nil - }, - } - - for _, fn := range fns { - err = fn() - if err != nil { - return nil, err - } - } - for _, child := range opt.Children { - child.Parent = result.d - if len(child.Theme) == 0 { - child.Theme = opt.Theme - } - _, err = Render(child) - if err != nil { - return nil, err - } - } - return result.d, nil -} - -func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { - d, err := NewDraw( - DrawOption{ - Type: opt.Type, - Parent: opt.Parent, - Width: opt.getWidth(), - Height: opt.getHeight(), - }, - BoxOption(opt.Box), - PaddingOption(opt.Padding), - ) - if err != nil { - return nil, err - } - - if len(opt.YAxisList) > 2 { - return nil, errors.New("y axis should not be gt 2") - } - if opt.Parent == nil { - d.setBackground(opt.getWidth(), opt.getHeight(), opt.BackgroundColor) - } - - // 标题 - titleBox, err := drawTitle(d, &opt.Title) - if err != nil { - return nil, err - } - - xAxisHeight := 0 - var xRange *Range - - if !opt.XAxis.Hidden { - // xAxis - xAxisHeight, xRange, err = drawXAxis(d, &opt.XAxis, len(opt.YAxisList)) - if err != nil { - return nil, err - } - } - - yRangeList := make([]*Range, len(opt.YAxisList)) - - for index, yAxis := range opt.YAxisList { - var yRange *Range - if !yAxis.Hidden { - yRange, err = drawYAxis(d, opt, index, xAxisHeight, chart.Box{ - Top: titleBox.Height(), - }) - if err != nil { - return nil, err - } - yRangeList[index] = yRange - } - } - return &basicRenderResult{ - xRange: xRange, - yRangeList: yRangeList, - d: d, - titleBox: titleBox, - }, nil -} diff --git a/chart_option.go b/chart_option.go deleted file mode 100644 index 5e25873..0000000 --- a/chart_option.go +++ /dev/null @@ -1,190 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -// OptionFunc option function -type OptionFunc func(opt *ChartOption) - -// PNGTypeOption set png type of chart's output -func PNGTypeOption() OptionFunc { - return TypeOptionFunc(ChartOutputPNG) -} - -// TypeOptionFunc set type of chart's output -func TypeOptionFunc(t string) OptionFunc { - return func(opt *ChartOption) { - opt.Type = t - } -} - -// FontFamilyOptionFunc set font family of chart -func FontFamilyOptionFunc(fontFamily string) OptionFunc { - return func(opt *ChartOption) { - opt.FontFamily = fontFamily - } -} - -// ThemeOptionFunc set them of chart -func ThemeOptionFunc(theme string) OptionFunc { - return func(opt *ChartOption) { - opt.Theme = theme - } -} - -// TitleOptionFunc set title of chart -func TitleOptionFunc(title TitleOption) OptionFunc { - return func(opt *ChartOption) { - opt.Title = title - } -} - -// LegendOptionFunc set legend of chart -func LegendOptionFunc(legend LegendOption) OptionFunc { - return func(opt *ChartOption) { - opt.Legend = legend - } -} - -// XAxisOptionFunc set x axis of chart -func XAxisOptionFunc(xAxisOption XAxisOption) OptionFunc { - return func(opt *ChartOption) { - opt.XAxis = xAxisOption - } -} - -// YAxisOptionFunc set y axis of chart, support two y axis -func YAxisOptionFunc(yAxisOption ...YAxisOption) OptionFunc { - return func(opt *ChartOption) { - opt.YAxisList = yAxisOption - } -} - -// WidthOptionFunc set width of chart -func WidthOptionFunc(width int) OptionFunc { - return func(opt *ChartOption) { - opt.Width = width - } -} - -// HeightOptionFunc set height of chart -func HeightOptionFunc(height int) OptionFunc { - return func(opt *ChartOption) { - opt.Height = height - } -} - -// PaddingOptionFunc set padding of chart -func PaddingOptionFunc(padding chart.Box) OptionFunc { - return func(opt *ChartOption) { - opt.Padding = padding - } -} - -// BoxOptionFunc set box of chart -func BoxOptionFunc(box chart.Box) OptionFunc { - return func(opt *ChartOption) { - opt.Box = box - } -} - -// ChildOptionFunc add child chart -func ChildOptionFunc(child ...ChartOption) OptionFunc { - return func(opt *ChartOption) { - if opt.Children == nil { - opt.Children = make([]ChartOption, 0) - } - opt.Children = append(opt.Children, child...) - } -} - -// RadarIndicatorOptionFunc set radar indicator of chart -func RadarIndicatorOptionFunc(radarIndicator ...RadarIndicator) OptionFunc { - return func(opt *ChartOption) { - opt.RadarIndicators = radarIndicator - } -} - -// BackgroundColorOptionFunc set background color of chart -func BackgroundColorOptionFunc(color drawing.Color) OptionFunc { - return func(opt *ChartOption) { - opt.BackgroundColor = color - } -} - -// LineRender line chart render -func LineRender(values [][]float64, opts ...OptionFunc) (*Draw, error) { - seriesList := make(SeriesList, len(values)) - for index, value := range values { - seriesList[index] = NewSeriesFromValues(value, ChartTypeLine) - } - return Render(ChartOption{ - SeriesList: seriesList, - }, opts...) -} - -// BarRender bar chart render -func BarRender(values [][]float64, opts ...OptionFunc) (*Draw, error) { - seriesList := make(SeriesList, len(values)) - for index, value := range values { - seriesList[index] = NewSeriesFromValues(value, ChartTypeBar) - } - return Render(ChartOption{ - SeriesList: seriesList, - }, opts...) -} - -// PieRender pie chart render -func PieRender(values []float64, opts ...OptionFunc) (*Draw, error) { - return Render(ChartOption{ - SeriesList: NewPieSeriesList(values), - }, opts...) -} - -// RadarRender radar chart render -func RadarRender(values [][]float64, opts ...OptionFunc) (*Draw, error) { - seriesList := make(SeriesList, len(values)) - for index, value := range values { - seriesList[index] = NewSeriesFromValues(value, ChartTypeRadar) - } - return Render(ChartOption{ - SeriesList: seriesList, - }, opts...) -} - -// FunnelRender funnel chart render -func FunnelRender(values []float64, opts ...OptionFunc) (*Draw, error) { - seriesList := make(SeriesList, len(values)) - for index, value := range values { - seriesList[index] = NewSeriesFromValues([]float64{ - value, - }, ChartTypeFunnel) - } - return Render(ChartOption{ - SeriesList: seriesList, - }, opts...) -} diff --git a/chart_option_test.go b/chart_option_test.go deleted file mode 100644 index 41e8d50..0000000 --- a/chart_option_test.go +++ /dev/null @@ -1,238 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestOptionFunc(t *testing.T) { - assert := assert.New(t) - - fns := []OptionFunc{ - TypeOptionFunc(ChartOutputPNG), - FontFamilyOptionFunc("fontFamily"), - ThemeOptionFunc("black"), - TitleOptionFunc(TitleOption{ - Text: "title", - }), - LegendOptionFunc(LegendOption{ - Data: []string{ - "a", - "b", - }, - }), - XAxisOptionFunc(NewXAxisOption([]string{ - "Mon", - "Tue", - })), - YAxisOptionFunc(YAxisOption{ - Min: NewFloatPoint(0), - Max: NewFloatPoint(100), - }), - WidthOptionFunc(400), - HeightOptionFunc(300), - PaddingOptionFunc(chart.Box{ - Top: 10, - }), - BoxOptionFunc(chart.Box{ - Left: 0, - Right: 300, - }), - ChildOptionFunc(ChartOption{}), - RadarIndicatorOptionFunc(RadarIndicator{ - Min: 0, - Max: 10, - }), - BackgroundColorOptionFunc(drawing.ColorBlack), - } - - opt := ChartOption{} - for _, fn := range fns { - fn(&opt) - } - - assert.Equal("png", opt.Type) - assert.Equal("fontFamily", opt.FontFamily) - assert.Equal("black", opt.Theme) - assert.Equal(TitleOption{ - Text: "title", - }, opt.Title) - assert.Equal(LegendOption{ - Data: []string{ - "a", - "b", - }, - }, opt.Legend) - assert.Equal(NewXAxisOption([]string{ - "Mon", - "Tue", - }), opt.XAxis) - assert.Equal([]YAxisOption{ - { - Min: NewFloatPoint(0), - Max: NewFloatPoint(100), - }, - }, opt.YAxisList) - assert.Equal(400, opt.Width) - assert.Equal(300, opt.Height) - assert.Equal(chart.Box{ - Top: 10, - }, opt.Padding) - assert.Equal(chart.Box{ - Left: 0, - Right: 300, - }, opt.Box) - assert.Equal(1, len(opt.Children)) - assert.Equal([]RadarIndicator{ - { - Min: 0, - Max: 10, - }, - }, opt.RadarIndicators) - assert.Equal(drawing.ColorBlack, opt.BackgroundColor) -} - -func TestLineRender(t *testing.T) { - assert := assert.New(t) - - d, err := LineRender([][]float64{ - { - 1, - 2, - 3, - }, - { - 1, - 5, - 2, - }, - }, - XAxisOptionFunc(NewXAxisOption([]string{ - "01", - "02", - "03", - })), - ) - assert.Nil(err) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n010203024681012", string(data)) -} - -func TestBarRender(t *testing.T) { - assert := assert.New(t) - - d, err := BarRender([][]float64{ - { - 1, - 2, - 3, - }, - { - 1, - 5, - 2, - }, - }, - XAxisOptionFunc(NewXAxisOption([]string{ - "01", - "02", - "03", - })), - ) - assert.Nil(err) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n010203024681012", string(data)) -} - -func TestPieRender(t *testing.T) { - assert := assert.New(t) - - d, err := PieRender([]float64{ - 1, - 3, - 5, - }) - assert.Nil(err) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n", string(data)) -} - -func TestRadarRender(t *testing.T) { - assert := assert.New(t) - d, err := RadarRender([][]float64{ - { - 1, - 2, - 3, - }, - { - 1, - 5, - 2, - }, - }, - RadarIndicatorOptionFunc([]RadarIndicator{ - { - Name: "A", - Min: 0, - Max: 10, - }, - { - Name: "B", - Min: 0, - Max: 10, - }, - { - Name: "C", - Min: 0, - Max: 10, - }, - }...), - ) - assert.Nil(err) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\nABC", string(data)) -} - -func TestFunnelRender(t *testing.T) { - assert := assert.New(t) - - d, err := FunnelRender([]float64{ - 5, - 3, - 1, - }) - assert.Nil(err) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n(100%)(60%)(20%)", string(data)) -} diff --git a/chart_test.go b/chart_test.go deleted file mode 100644 index c73745e..0000000 --- a/chart_test.go +++ /dev/null @@ -1,567 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "errors" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestChartSetDefaultWidthHeight(t *testing.T) { - assert := assert.New(t) - - width := defaultChartWidth - height := defaultChartHeight - defer SetDefaultWidth(width) - defer SetDefaultHeight(height) - - SetDefaultWidth(60) - assert.Equal(60, defaultChartWidth) - SetDefaultHeight(40) - assert.Equal(40, defaultChartHeight) -} - -func TestChartFillDefault(t *testing.T) { - assert := assert.New(t) - // default value - opt := ChartOption{} - opt.FillDefault("") - // padding - assert.Equal(chart.Box{ - Top: 10, - Right: 10, - Bottom: 10, - Left: 10, - }, opt.Padding) - // background color - assert.Equal(drawing.ColorWhite, opt.BackgroundColor) - // title font color - assert.Equal(drawing.Color{ - R: 70, - G: 70, - B: 70, - A: 255, - }, opt.Title.Style.FontColor) - // title font size - assert.Equal(float64(14), opt.Title.Style.FontSize) - // sub title font color - assert.Equal(drawing.Color{ - R: 70, - G: 70, - B: 70, - A: 180, - }, opt.Title.SubtextStyle.FontColor) - // sub title font size - assert.Equal(float64(10), opt.Title.SubtextStyle.FontSize) - // legend font size - assert.Equal(float64(10), opt.Legend.Style.FontSize) - // legend position - assert.Equal("center", opt.Legend.Left) - assert.Equal(drawing.Color{ - R: 70, - G: 70, - B: 70, - A: 255, - }, opt.Legend.Style.FontColor) - - // y axis - opt = ChartOption{ - SeriesList: SeriesList{ - { - YAxisIndex: 1, - }, - }, - } - opt.FillDefault("") - assert.Equal([]YAxisOption{ - {}, - {}, - }, opt.YAxisList) - opt = ChartOption{} - opt.FillDefault("") - assert.Equal([]YAxisOption{ - {}, - }, opt.YAxisList) - - // legend get from series's name - - opt = ChartOption{ - SeriesList: SeriesList{ - { - Name: "a", - }, - { - Name: "b", - }, - }, - } - opt.FillDefault("") - assert.Equal([]string{ - "a", - "b", - }, opt.Legend.Data) - // series name set by legend - opt = ChartOption{ - Legend: LegendOption{ - Data: []string{ - "a", - "b", - }, - }, - SeriesList: SeriesList{ - {}, - {}, - }, - } - opt.FillDefault("") - assert.Equal("a", opt.SeriesList[0].Name) - assert.Equal("b", opt.SeriesList[1].Name) -} - -func TestChartGetWidthHeight(t *testing.T) { - assert := assert.New(t) - - opt := ChartOption{ - Width: 10, - } - assert.Equal(10, opt.getWidth()) - opt.Width = 0 - assert.Equal(600, opt.getWidth()) - opt.Parent = &Draw{ - Box: chart.Box{ - Left: 10, - Right: 50, - }, - } - assert.Equal(40, opt.getWidth()) - - opt = ChartOption{ - Height: 20, - } - assert.Equal(20, opt.getHeight()) - opt.Height = 0 - assert.Equal(400, opt.getHeight()) - opt.Parent = &Draw{ - Box: chart.Box{ - Top: 20, - Bottom: 80, - }, - } - assert.Equal(60, opt.getHeight()) -} - -func TestChartRender(t *testing.T) { - assert := assert.New(t) - - d, err := Render(ChartOption{ - Width: 800, - Height: 600, - Legend: LegendOption{ - Top: "-90", - Data: []string{ - "Milk Tea", - "Matcha Latte", - "Cheese Cocoa", - "Walnut Brownie", - }, - }, - Padding: chart.Box{ - Top: 100, - }, - XAxis: NewXAxisOption([]string{ - "2012", - "2013", - "2014", - "2015", - "2016", - "2017", - }), - YAxisList: []YAxisOption{ - { - - Min: NewFloatPoint(0), - Max: NewFloatPoint(90), - }, - }, - SeriesList: []Series{ - NewSeriesFromValues([]float64{ - 56.5, - 82.1, - 88.7, - 70.1, - 53.4, - 85.1, - }), - NewSeriesFromValues([]float64{ - 51.1, - 51.4, - 55.1, - 53.3, - 73.8, - 68.7, - }), - NewSeriesFromValues([]float64{ - 40.1, - 62.2, - 69.5, - 36.4, - 45.2, - 32.5, - }, ChartTypeBar), - NewSeriesFromValues([]float64{ - 25.2, - 37.1, - 41.2, - 18, - 33.9, - 49.1, - }, ChartTypeBar), - }, - Children: []ChartOption{ - { - Legend: LegendOption{ - Show: FalseFlag(), - Data: []string{ - "Milk Tea", - "Matcha Latte", - "Cheese Cocoa", - "Walnut Brownie", - }, - }, - Box: chart.Box{ - Top: 20, - Left: 400, - Right: 500, - Bottom: 120, - }, - SeriesList: NewPieSeriesList([]float64{ - 435.9, - 354.3, - 285.9, - 204.5, - }, PieSeriesOption{ - Label: SeriesLabel{ - Show: true, - }, - Radius: "35%", - }), - }, - { - Legend: NewLegendOption([]string{ - "Allocated Budget", - "Actual Spending", - }), - Box: chart.Box{ - Top: 20, - Left: 0, - Right: 200, - Bottom: 120, - }, - RadarIndicators: []RadarIndicator{ - { - Name: "Sales", - Max: 6500, - }, - { - Name: "Administration", - Max: 16000, - }, - { - Name: "Information Technology", - Max: 30000, - }, - { - Name: "Customer Support", - Max: 38000, - }, - { - Name: "Development", - Max: 52000, - }, - { - Name: "Marketing", - Max: 25000, - }, - }, - SeriesList: SeriesList{ - { - Type: ChartTypeRadar, - Data: NewSeriesDataFromValues([]float64{ - 4200, - 3000, - 20000, - 35000, - 50000, - 18000, - }), - }, - { - Type: ChartTypeRadar, - index: 1, - Data: NewSeriesDataFromValues([]float64{ - 5000, - 14000, - 28000, - 26000, - 42000, - 21000, - }), - }, - }, - }, - }, - }) - assert.Nil(err) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n2012201320142015201620170153045607590Milk TeaMatcha LatteCheese CocoaWalnut BrownieMilk Tea: 34.03%Matcha Latte: 27.66%Cheese Cocoa: 22.32%Walnut Brownie: 15.96%SalesAdministrationInformation TechnologyCustomer SupportDevelopmentMarketingAllocated BudgetActual Spending", string(data)) -} - -func BenchmarkMultiChartPNGRender(b *testing.B) { - for i := 0; i < b.N; i++ { - opt := ChartOption{ - Type: ChartOutputPNG, - Legend: LegendOption{ - Top: "-90", - Data: []string{ - "Milk Tea", - "Matcha Latte", - "Cheese Cocoa", - "Walnut Brownie", - }, - }, - Padding: chart.Box{ - Top: 100, - Right: 10, - Bottom: 10, - Left: 10, - }, - XAxis: NewXAxisOption([]string{ - "2012", - "2013", - "2014", - "2015", - "2016", - "2017", - }), - YAxisList: []YAxisOption{ - { - - Min: NewFloatPoint(0), - Max: NewFloatPoint(90), - }, - }, - SeriesList: []Series{ - NewSeriesFromValues([]float64{ - 56.5, - 82.1, - 88.7, - 70.1, - 53.4, - 85.1, - }), - NewSeriesFromValues([]float64{ - 51.1, - 51.4, - 55.1, - 53.3, - 73.8, - 68.7, - }), - NewSeriesFromValues([]float64{ - 40.1, - 62.2, - 69.5, - 36.4, - 45.2, - 32.5, - }, ChartTypeBar), - NewSeriesFromValues([]float64{ - 25.2, - 37.1, - 41.2, - 18, - 33.9, - 49.1, - }, ChartTypeBar), - }, - Children: []ChartOption{ - { - Legend: LegendOption{ - Show: FalseFlag(), - Data: []string{ - "Milk Tea", - "Matcha Latte", - "Cheese Cocoa", - "Walnut Brownie", - }, - }, - Box: chart.Box{ - Top: 20, - Left: 400, - Right: 500, - Bottom: 120, - }, - SeriesList: NewPieSeriesList([]float64{ - 435.9, - 354.3, - 285.9, - 204.5, - }, PieSeriesOption{ - Label: SeriesLabel{ - Show: true, - }, - Radius: "35%", - }), - }, - }, - } - d, err := Render(opt) - if err != nil { - panic(err) - } - buf, err := d.Bytes() - if err != nil { - panic(err) - } - if len(buf) == 0 { - panic(errors.New("data is nil")) - } - } -} - -func BenchmarkMultiChartSVGRender(b *testing.B) { - for i := 0; i < b.N; i++ { - opt := ChartOption{ - Legend: LegendOption{ - Top: "-90", - Data: []string{ - "Milk Tea", - "Matcha Latte", - "Cheese Cocoa", - "Walnut Brownie", - }, - }, - Padding: chart.Box{ - Top: 100, - Right: 10, - Bottom: 10, - Left: 10, - }, - XAxis: NewXAxisOption([]string{ - "2012", - "2013", - "2014", - "2015", - "2016", - "2017", - }), - YAxisList: []YAxisOption{ - { - - Min: NewFloatPoint(0), - Max: NewFloatPoint(90), - }, - }, - SeriesList: []Series{ - NewSeriesFromValues([]float64{ - 56.5, - 82.1, - 88.7, - 70.1, - 53.4, - 85.1, - }), - NewSeriesFromValues([]float64{ - 51.1, - 51.4, - 55.1, - 53.3, - 73.8, - 68.7, - }), - NewSeriesFromValues([]float64{ - 40.1, - 62.2, - 69.5, - 36.4, - 45.2, - 32.5, - }, ChartTypeBar), - NewSeriesFromValues([]float64{ - 25.2, - 37.1, - 41.2, - 18, - 33.9, - 49.1, - }, ChartTypeBar), - }, - Children: []ChartOption{ - { - Legend: LegendOption{ - Show: FalseFlag(), - Data: []string{ - "Milk Tea", - "Matcha Latte", - "Cheese Cocoa", - "Walnut Brownie", - }, - }, - Box: chart.Box{ - Top: 20, - Left: 400, - Right: 500, - Bottom: 120, - }, - SeriesList: NewPieSeriesList([]float64{ - 435.9, - 354.3, - 285.9, - 204.5, - }, PieSeriesOption{ - Label: SeriesLabel{ - Show: true, - }, - Radius: "35%", - }), - }, - }, - } - d, err := Render(opt) - if err != nil { - panic(err) - } - buf, err := d.Bytes() - if err != nil { - panic(err) - } - if len(buf) == 0 { - panic(errors.New("data is nil")) - } - } -} diff --git a/draw.go b/draw.go deleted file mode 100644 index 1708662..0000000 --- a/draw.go +++ /dev/null @@ -1,372 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "bytes" - "errors" - "math" - - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -const ( - PositionLeft = "left" - PositionRight = "right" - PositionCenter = "center" - PositionTop = "top" - PositionBottom = "bottom" -) - -const ( - OrientHorizontal = "horizontal" - OrientVertical = "vertical" -) - -type Draw struct { - // Render - Render chart.Renderer - // The canvas box - Box chart.Box - // The font for draw - Font *truetype.Font - // The parent of draw - parent *Draw -} - -type DrawOption struct { - // Draw type, "svg" or "png", default type is "svg" - Type string - // Parent of draw - Parent *Draw - // The width of draw canvas - Width int - // The height of draw canvas - Height int -} - -type Option func(*Draw) error - -// PaddingOption sets the padding of draw canvas -func PaddingOption(padding chart.Box) Option { - return func(d *Draw) error { - d.Box.Left += padding.Left - d.Box.Top += padding.Top - d.Box.Right -= padding.Right - d.Box.Bottom -= padding.Bottom - return nil - } -} - -// BoxOption set the box of draw canvas -func BoxOption(box chart.Box) Option { - return func(d *Draw) error { - if box.IsZero() { - return nil - } - d.Box = box - return nil - } -} - -// NewDraw returns a new draw canvas -func NewDraw(opt DrawOption, opts ...Option) (*Draw, error) { - if opt.Parent == nil && (opt.Width <= 0 || opt.Height <= 0) { - return nil, errors.New("parent and width/height can not be nil") - } - font, _ := chart.GetDefaultFont() - d := &Draw{ - Font: font, - } - width := opt.Width - height := opt.Height - if opt.Parent != nil { - d.parent = opt.Parent - d.Render = d.parent.Render - d.Box = opt.Parent.Box.Clone() - } - if width != 0 && height != 0 { - d.Box.Right = width + d.Box.Left - d.Box.Bottom = height + d.Box.Top - } - // 创建render - if d.parent == nil { - fn := chart.SVG - if opt.Type == ChartOutputPNG { - fn = chart.PNG - } - r, err := fn(d.Box.Right, d.Box.Bottom) - if err != nil { - return nil, err - } - d.Render = r - } - - for _, o := range opts { - err := o(d) - if err != nil { - return nil, err - } - } - return d, nil -} - -// Parent returns the parent of draw -func (d *Draw) Parent() *Draw { - return d.parent -} - -// Top returns the top parent of draw -func (d *Draw) Top() *Draw { - if d.parent == nil { - return nil - } - t := d.parent - // 限制最多查询次数,避免嵌套引用 - for i := 50; i > 0; i-- { - if t.parent == nil { - break - } - t = t.parent - } - return t -} - -// Bytes returns the data of draw canvas -func (d *Draw) Bytes() ([]byte, error) { - buffer := bytes.Buffer{} - err := d.Render.Save(&buffer) - if err != nil { - return nil, err - } - return buffer.Bytes(), err -} - -func (d *Draw) moveTo(x, y int) { - d.Render.MoveTo(x+d.Box.Left, y+d.Box.Top) -} - -func (d *Draw) arcTo(cx, cy int, rx, ry, startAngle, delta float64) { - d.Render.ArcTo(cx+d.Box.Left, cy+d.Box.Top, rx, ry, startAngle, delta) -} - -func (d *Draw) lineTo(x, y int) { - d.Render.LineTo(x+d.Box.Left, y+d.Box.Top) -} - -func (d *Draw) pin(x, y, width int) { - r := float64(width) / 2 - y -= width / 4 - angle := chart.DegreesToRadians(15) - - startAngle := math.Pi/2 + angle - delta := 2*math.Pi - 2*angle - d.arcTo(x, y, r, r, startAngle, delta) - d.lineTo(x, y) - d.Render.Close() - d.Render.FillStroke() - - startX := x - int(r) - startY := y - endX := x + int(r) - endY := y - d.moveTo(startX, startY) - - left := d.Box.Left - top := d.Box.Top - cx := x - cy := y + int(r*2.5) - d.Render.QuadCurveTo(cx+left, cy+top, endX+left, endY+top) - d.Render.Close() - d.Render.Fill() -} - -func (d *Draw) arrowLeft(x, y, width, height int) { - d.arrow(x, y, width, height, PositionLeft) -} - -func (d *Draw) arrowRight(x, y, width, height int) { - d.arrow(x, y, width, height, PositionRight) -} - -func (d *Draw) arrowTop(x, y, width, height int) { - d.arrow(x, y, width, height, PositionTop) -} -func (d *Draw) arrowBottom(x, y, width, height int) { - d.arrow(x, y, width, height, PositionBottom) -} - -func (d *Draw) arrow(x, y, width, height int, direction string) { - halfWidth := width >> 1 - halfHeight := height >> 1 - if direction == PositionTop || direction == PositionBottom { - x0 := x - halfWidth - x1 := x0 + width - dy := -height / 3 - y0 := y - y1 := y0 - height - if direction == PositionBottom { - y0 = y - height - y1 = y - dy = 2 * dy - } - d.moveTo(x0, y0) - d.lineTo(x0+halfWidth, y1) - d.lineTo(x1, y0) - d.lineTo(x0+halfWidth, y+dy) - d.lineTo(x0, y0) - } else { - x0 := x + width - x1 := x0 - width - y0 := y - halfHeight - dx := -width / 3 - if direction == PositionRight { - x0 = x - width - dx = -dx - x1 = x0 + width - } - d.moveTo(x0, y0) - d.lineTo(x1, y0+halfHeight) - d.lineTo(x0, y0+height) - d.lineTo(x0+dx, y0+halfHeight) - d.lineTo(x0, y0) - } - d.Render.FillStroke() -} - -func (d *Draw) makeLine(x, y, width int) { - arrowWidth := 16 - arrowHeight := 10 - endX := x + width - d.circle(3, x, y) - d.Render.Fill() - d.moveTo(x+5, y) - d.lineTo(endX-arrowWidth, y) - d.Render.Stroke() - d.Render.SetStrokeDashArray([]float64{}) - d.arrowRight(endX, y, arrowWidth, arrowHeight) -} - -func (d *Draw) circle(radius float64, x, y int) { - d.Render.Circle(radius, x+d.Box.Left, y+d.Box.Top) -} - -func (d *Draw) text(body string, x, y int) { - d.Render.Text(body, x+d.Box.Left, y+d.Box.Top) -} - -func (d *Draw) textFit(body string, x, y, width int, style chart.Style) chart.Box { - style.TextWrap = chart.TextWrapWord - r := d.Render - lines := chart.Text.WrapFit(r, body, width, style) - style.WriteTextOptionsToRenderer(r) - var output chart.Box - - for index, line := range lines { - x0 := x - y0 := y + output.Height() - d.text(line, x0, y0) - lineBox := r.MeasureText(line) - output.Right = chart.MaxInt(lineBox.Right, output.Right) - output.Bottom += lineBox.Height() - if index < len(lines)-1 { - output.Bottom += +style.GetTextLineSpacing() - } - } - return output -} - -func (d *Draw) measureTextFit(body string, x, y, width int, style chart.Style) chart.Box { - style.TextWrap = chart.TextWrapWord - r := d.Render - lines := chart.Text.WrapFit(r, body, width, style) - style.WriteTextOptionsToRenderer(r) - return chart.Text.MeasureLines(r, lines, style) -} - -func (d *Draw) lineStroke(points []Point, style LineStyle) { - s := style.Style() - if !s.ShouldDrawStroke() { - return - } - r := d.Render - s.GetStrokeOptions().WriteDrawingOptionsToRenderer(r) - for index, point := range points { - x := point.X - y := point.Y - if index == 0 { - d.moveTo(x, y) - } else { - d.lineTo(x, y) - } - } - r.Stroke() -} - -func (d *Draw) setBackground(width, height int, color drawing.Color) { - r := d.Render - s := chart.Style{ - FillColor: color, - } - s.WriteToRenderer(r) - r.MoveTo(0, 0) - r.LineTo(width, 0) - r.LineTo(width, height) - r.LineTo(0, height) - r.LineTo(0, 0) - r.FillStroke() -} - -func (d *Draw) polygon(center Point, radius float64, sides int) { - points := getPolygonPoints(center, radius, sides) - for i, p := range points { - if i == 0 { - d.moveTo(p.X, p.Y) - } else { - d.lineTo(p.X, p.Y) - } - } - d.lineTo(points[0].X, points[0].Y) - d.Render.Stroke() -} - -func (d *Draw) fill(points []Point, s chart.Style) { - if !s.ShouldDrawFill() { - return - } - r := d.Render - var x, y int - s.GetFillOptions().WriteDrawingOptionsToRenderer(r) - for index, point := range points { - x = point.X - y = point.Y - if index == 0 { - d.moveTo(x, y) - } else { - d.lineTo(x, y) - } - } - r.Fill() -} diff --git a/draw_test.go b/draw_test.go deleted file mode 100644 index f6a3dd1..0000000 --- a/draw_test.go +++ /dev/null @@ -1,507 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "math" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestParentOption(t *testing.T) { - assert := assert.New(t) - p, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - assert.Nil(err) - - d, err := NewDraw(DrawOption{ - Parent: p, - }) - assert.Nil(err) - assert.Equal(p, d.parent) -} - -func TestWidthHeightOption(t *testing.T) { - assert := assert.New(t) - - // no parent - width := 300 - height := 200 - d, err := NewDraw(DrawOption{ - Width: width, - Height: height, - }) - assert.Nil(err) - assert.Equal(chart.Box{ - Top: 0, - Left: 0, - Right: width, - Bottom: height, - }, d.Box) - - width = 500 - height = 600 - // with parent - p, err := NewDraw( - DrawOption{ - Width: width, - Height: height, - }, - PaddingOption(chart.NewBox(5, 5, 5, 5)), - ) - assert.Nil(err) - d, err = NewDraw( - DrawOption{ - Parent: p, - }, - PaddingOption(chart.NewBox(1, 2, 3, 4)), - ) - assert.Nil(err) - assert.Equal(chart.Box{ - Top: 6, - Left: 7, - Right: 492, - Bottom: 591, - }, d.Box) -} - -func TestBoxOption(t *testing.T) { - assert := assert.New(t) - - d, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - assert.Nil(err) - - err = BoxOption(chart.Box{ - Left: 10, - Top: 20, - Right: 50, - Bottom: 100, - })(d) - assert.Nil(err) - assert.Equal(chart.Box{ - Left: 10, - Top: 20, - Right: 50, - Bottom: 100, - }, d.Box) - - // zero box will be ignored - err = BoxOption(chart.Box{})(d) - assert.Nil(err) - assert.Equal(chart.Box{ - Left: 10, - Top: 20, - Right: 50, - Bottom: 100, - }, d.Box) -} - -func TestPaddingOption(t *testing.T) { - assert := assert.New(t) - - d, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - assert.Nil(err) - - // 默认的box - assert.Equal(chart.Box{ - Right: 400, - Bottom: 300, - }, d.Box) - - // 设置padding之后的box - d, err = NewDraw(DrawOption{ - Width: 400, - Height: 300, - }, PaddingOption(chart.Box{ - Left: 1, - Top: 2, - Right: 3, - Bottom: 4, - })) - assert.Nil(err) - assert.Equal(chart.Box{ - Top: 2, - Left: 1, - Right: 397, - Bottom: 296, - }, d.Box) - - p := d - // 设置父元素之后的box - d, err = NewDraw( - DrawOption{ - Parent: p, - }, - PaddingOption(chart.Box{ - Left: 1, - Top: 2, - Right: 3, - Bottom: 4, - }), - ) - assert.Nil(err) - assert.Equal(chart.Box{ - Top: 4, - Left: 2, - Right: 394, - Bottom: 292, - }, d.Box) -} - -func TestParentTop(t *testing.T) { - assert := assert.New(t) - d1, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - assert.Nil(err) - - d2, err := NewDraw(DrawOption{ - Parent: d1, - }) - assert.Nil(err) - - d3, err := NewDraw(DrawOption{ - Parent: d2, - }) - assert.Nil(err) - - assert.Equal(d2, d3.Parent()) - assert.Equal(d1, d2.Parent()) - assert.Equal(d1, d3.Top()) - assert.Equal(d1, d2.Top()) -} - -func TestDraw(t *testing.T) { - assert := assert.New(t) - - tests := []struct { - fn func(d *Draw) - result string - }{ - // moveTo, lineTo - { - fn: func(d *Draw) { - d.moveTo(1, 1) - d.lineTo(2, 2) - d.Render.Stroke() - }, - result: "\\n", - }, - // circle - { - fn: func(d *Draw) { - d.circle(5, 2, 3) - }, - result: "\\n", - }, - // text - { - fn: func(d *Draw) { - d.text("hello world!", 3, 6) - }, - result: "\\nhello world!", - }, - // line stroke - { - fn: func(d *Draw) { - d.lineStroke([]Point{ - { - X: 1, - Y: 2, - }, - { - X: 3, - Y: 4, - }, - }, LineStyle{ - StrokeColor: drawing.ColorBlack, - StrokeWidth: 1, - }) - }, - result: "\\n", - }, - // set background - { - fn: func(d *Draw) { - d.setBackground(400, 300, chart.ColorWhite) - }, - result: "\\n", - }, - // arcTo - { - fn: func(d *Draw) { - chart.Style{ - StrokeWidth: 1, - StrokeColor: drawing.ColorBlack, - FillColor: drawing.ColorBlue, - }.WriteToRenderer(d.Render) - d.arcTo(100, 100, 100, 100, 0, math.Pi/2) - d.Render.Close() - d.Render.FillStroke() - }, - result: "\\n", - }, - // pin - { - fn: func(d *Draw) { - chart.Style{ - StrokeWidth: 1, - StrokeColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - FillColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - }.WriteToRenderer(d.Render) - d.pin(30, 30, 30) - }, - result: "\\n", - }, - // arrow left - { - fn: func(d *Draw) { - chart.Style{ - StrokeWidth: 1, - StrokeColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - FillColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - }.WriteToRenderer(d.Render) - d.arrowLeft(30, 30, 16, 10) - }, - result: "\\n", - }, - // arrow right - { - fn: func(d *Draw) { - chart.Style{ - StrokeWidth: 1, - StrokeColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - FillColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - }.WriteToRenderer(d.Render) - d.arrowRight(30, 30, 16, 10) - }, - result: "\\n", - }, - // arrow top - { - fn: func(d *Draw) { - chart.Style{ - StrokeWidth: 1, - StrokeColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - FillColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - }.WriteToRenderer(d.Render) - d.arrowTop(30, 30, 10, 16) - }, - result: "\\n", - }, - // arrow bottom - { - fn: func(d *Draw) { - chart.Style{ - StrokeWidth: 1, - StrokeColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - FillColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - }.WriteToRenderer(d.Render) - d.arrowBottom(30, 30, 10, 16) - }, - result: "\\n", - }, - // mark line - { - fn: func(d *Draw) { - chart.Style{ - StrokeWidth: 1, - StrokeColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - FillColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - StrokeDashArray: []float64{ - 4, - 2, - }, - }.WriteToRenderer(d.Render) - d.makeLine(0, 20, 300) - }, - result: "\\n", - }, - // polygon - { - fn: func(d *Draw) { - chart.Style{ - StrokeWidth: 1, - StrokeColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - }.WriteToRenderer(d.Render) - d.polygon(Point{ - X: 100, - Y: 100, - }, 50, 6) - }, - result: "\\n", - }, - // fill - { - fn: func(d *Draw) { - d.fill([]Point{ - { - X: 0, - Y: 0, - }, - { - X: 0, - Y: 100, - }, - { - X: 100, - Y: 100, - }, - { - X: 0, - Y: 0, - }, - }, chart.Style{ - FillColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - }) - }, - result: "\\n", - }, - } - for _, tt := range tests { - d, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }, PaddingOption(chart.Box{ - Left: 5, - Top: 10, - })) - assert.Nil(err) - tt.fn(d) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal(tt.result, string(data)) - } -} - -func TestDrawTextFit(t *testing.T) { - assert := assert.New(t) - d, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - assert.Nil(err) - f, _ := chart.GetDefaultFont() - style := chart.Style{ - FontSize: 12, - FontColor: chart.ColorBlack, - Font: f, - } - box := d.textFit("Hello World!", 0, 20, 80, style) - assert.Equal(chart.Box{ - Right: 45, - Bottom: 35, - }, box) - - box = d.textFit("Hello World!", 0, 100, 200, style) - assert.Equal(chart.Box{ - Right: 84, - Bottom: 15, - }, box) - - buf, err := d.Bytes() - assert.Nil(err) - assert.Equal(`\nHelloWorld!Hello World!`, string(buf)) -} diff --git a/echarts.go b/echarts.go deleted file mode 100644 index 4ebb9ad..0000000 --- a/echarts.go +++ /dev/null @@ -1,499 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "bytes" - "encoding/json" - "fmt" - "regexp" - "strconv" - - "github.com/wcharczuk/go-chart/v2" -) - -func convertToArray(data []byte) []byte { - data = bytes.TrimSpace(data) - if len(data) == 0 { - return nil - } - if data[0] != '[' { - data = []byte("[" + string(data) + "]") - } - return data -} - -type EChartsPosition string - -func (p *EChartsPosition) UnmarshalJSON(data []byte) error { - if len(data) == 0 { - return nil - } - if regexp.MustCompile(`^\d+`).Match(data) { - data = []byte(fmt.Sprintf(`"%s"`, string(data))) - } - s := (*string)(p) - return json.Unmarshal(data, s) -} - -type EChartStyle struct { - Color string `json:"color"` -} - -func (es *EChartStyle) ToStyle() chart.Style { - color := parseColor(es.Color) - return chart.Style{ - FillColor: color, - FontColor: color, - StrokeColor: color, - } -} - -type EChartsSeriesDataValue struct { - values []float64 -} - -func (value *EChartsSeriesDataValue) UnmarshalJSON(data []byte) error { - data = convertToArray(data) - return json.Unmarshal(data, &value.values) -} -func (value *EChartsSeriesDataValue) First() float64 { - if len(value.values) == 0 { - return 0 - } - return value.values[0] -} -func NewEChartsSeriesDataValue(values ...float64) EChartsSeriesDataValue { - return EChartsSeriesDataValue{ - values: values, - } -} - -type EChartsSeriesData struct { - Value EChartsSeriesDataValue `json:"value"` - Name string `json:"name"` - ItemStyle EChartStyle `json:"itemStyle"` -} -type _EChartsSeriesData EChartsSeriesData - -var numericRep = regexp.MustCompile(`^[-+]?[0-9]+(?:\.[0-9]+)?$`) - -func (es *EChartsSeriesData) UnmarshalJSON(data []byte) error { - data = bytes.TrimSpace(data) - if len(data) == 0 { - return nil - } - if numericRep.Match(data) { - v, err := strconv.ParseFloat(string(data), 64) - if err != nil { - return err - } - es.Value = EChartsSeriesDataValue{ - values: []float64{ - v, - }, - } - return nil - } - v := _EChartsSeriesData{} - err := json.Unmarshal(data, &v) - if err != nil { - return err - } - es.Name = v.Name - es.Value = v.Value - es.ItemStyle = v.ItemStyle - return nil -} - -type EChartsXAxisData struct { - BoundaryGap *bool `json:"boundaryGap"` - SplitNumber int `json:"splitNumber"` - Data []string `json:"data"` -} -type EChartsXAxis struct { - Data []EChartsXAxisData -} - -func (ex *EChartsXAxis) UnmarshalJSON(data []byte) error { - data = convertToArray(data) - if len(data) == 0 { - return nil - } - return json.Unmarshal(data, &ex.Data) -} - -type EChartsAxisLabel struct { - Formatter string `json:"formatter"` -} -type EChartsYAxisData struct { - Min *float64 `json:"min"` - Max *float64 `json:"max"` - AxisLabel EChartsAxisLabel `json:"axisLabel"` - AxisLine struct { - LineStyle struct { - Color string `json:"color"` - } `json:"lineStyle"` - } `json:"axisLine"` -} -type EChartsYAxis struct { - Data []EChartsYAxisData `json:"data"` -} - -func (ey *EChartsYAxis) UnmarshalJSON(data []byte) error { - data = convertToArray(data) - if len(data) == 0 { - return nil - } - return json.Unmarshal(data, &ey.Data) -} - -type EChartsPadding struct { - Box chart.Box -} - -func (eb *EChartsPadding) UnmarshalJSON(data []byte) error { - data = convertToArray(data) - if len(data) == 0 { - return nil - } - arr := make([]int, 0) - err := json.Unmarshal(data, &arr) - if err != nil { - return err - } - if len(arr) == 0 { - return nil - } - switch len(arr) { - case 1: - eb.Box = chart.Box{ - Left: arr[0], - Top: arr[0], - Bottom: arr[0], - Right: arr[0], - } - case 2: - eb.Box = chart.Box{ - Top: arr[0], - Bottom: arr[0], - Left: arr[1], - Right: arr[1], - } - default: - result := make([]int, 4) - copy(result, arr) - if len(arr) == 3 { - result[3] = result[1] - } - // 上右下左 - eb.Box = chart.Box{ - Top: result[0], - Right: result[1], - Bottom: result[2], - Left: result[3], - } - } - return nil -} - -type EChartsLabelOption struct { - Show bool `json:"show"` - Distance int `json:"distance"` - Color string `json:"color"` -} -type EChartsLegend struct { - Show *bool `json:"show"` - Data []string `json:"data"` - Align string `json:"align"` - Orient string `json:"orient"` - Padding EChartsPadding `json:"padding"` - Left EChartsPosition `json:"left"` - Top EChartsPosition `json:"top"` - TextStyle EChartsTextStyle `json:"textStyle"` -} - -type EChartsMarkData struct { - Type string `json:"type"` -} -type _EChartsMarkData EChartsMarkData - -func (emd *EChartsMarkData) UnmarshalJSON(data []byte) error { - data = bytes.TrimSpace(data) - if len(data) == 0 { - return nil - } - data = convertToArray(data) - ds := make([]*_EChartsMarkData, 0) - err := json.Unmarshal(data, &ds) - if err != nil { - return err - } - for _, d := range ds { - if d.Type != "" { - emd.Type = d.Type - } - } - return nil -} - -type EChartsMarkPoint struct { - SymbolSize int `json:"symbolSize"` - Data []EChartsMarkData `json:"data"` -} - -func (emp *EChartsMarkPoint) ToSeriesMarkPoint() SeriesMarkPoint { - sp := SeriesMarkPoint{ - SymbolSize: emp.SymbolSize, - } - if len(emp.Data) == 0 { - return sp - } - data := make([]SeriesMarkData, len(emp.Data)) - for index, item := range emp.Data { - data[index].Type = item.Type - } - sp.Data = data - return sp -} - -type EChartsMarkLine struct { - Data []EChartsMarkData `json:"data"` -} - -func (eml *EChartsMarkLine) ToSeriesMarkLine() SeriesMarkLine { - sl := SeriesMarkLine{} - if len(eml.Data) == 0 { - return sl - } - data := make([]SeriesMarkData, len(eml.Data)) - for index, item := range eml.Data { - data[index].Type = item.Type - } - sl.Data = data - return sl -} - -type EChartsSeries struct { - Data []EChartsSeriesData `json:"data"` - Name string `json:"name"` - Type string `json:"type"` - Radius string `json:"radius"` - YAxisIndex int `json:"yAxisIndex"` - ItemStyle EChartStyle `json:"itemStyle"` - // label的配置 - Label EChartsLabelOption `json:"label"` - MarkPoint EChartsMarkPoint `json:"markPoint"` - MarkLine EChartsMarkLine `json:"markLine"` - Max *float64 `json:"max"` - Min *float64 `json:"min"` -} -type EChartsSeriesList []EChartsSeries - -func (esList EChartsSeriesList) ToSeriesList() SeriesList { - seriesList := make(SeriesList, 0, len(esList)) - for _, item := range esList { - // 如果是pie,则每个子荐生成一个series - if item.Type == ChartTypePie { - for _, dataItem := range item.Data { - seriesList = append(seriesList, Series{ - Type: item.Type, - Name: dataItem.Name, - Label: SeriesLabel{ - Show: true, - }, - Radius: item.Radius, - Data: []SeriesData{ - { - Value: dataItem.Value.First(), - }, - }, - }) - } - continue - } - // 如果是radar或funnel - if item.Type == ChartTypeRadar || - item.Type == ChartTypeFunnel { - for _, dataItem := range item.Data { - seriesList = append(seriesList, Series{ - Name: dataItem.Name, - Type: item.Type, - Data: NewSeriesDataFromValues(dataItem.Value.values), - Max: item.Max, - Min: item.Min, - }) - } - continue - } - data := make([]SeriesData, len(item.Data)) - for j, dataItem := range item.Data { - data[j] = SeriesData{ - Value: dataItem.Value.First(), - Style: dataItem.ItemStyle.ToStyle(), - } - } - seriesList = append(seriesList, Series{ - Type: item.Type, - Data: data, - YAxisIndex: item.YAxisIndex, - Style: item.ItemStyle.ToStyle(), - Label: SeriesLabel{ - Color: parseColor(item.Label.Color), - Show: item.Label.Show, - Distance: item.Label.Distance, - }, - Name: item.Name, - MarkPoint: item.MarkPoint.ToSeriesMarkPoint(), - MarkLine: item.MarkLine.ToSeriesMarkLine(), - }) - } - return seriesList -} - -type EChartsTextStyle struct { - Color string `json:"color"` - FontFamily string `json:"fontFamily"` - FontSize float64 `json:"fontSize"` -} - -func (et *EChartsTextStyle) ToStyle() chart.Style { - s := chart.Style{ - FontSize: et.FontSize, - FontColor: parseColor(et.Color), - } - if et.FontFamily != "" { - s.Font, _ = GetFont(et.FontFamily) - } - return s -} - -type EChartsOption struct { - Type string `json:"type"` - Theme string `json:"theme"` - FontFamily string `json:"fontFamily"` - Padding EChartsPadding `json:"padding"` - Box chart.Box `json:"box"` - Width int `json:"width"` - Height int `json:"height"` - Title struct { - Text string `json:"text"` - Subtext string `json:"subtext"` - Left EChartsPosition `json:"left"` - Top EChartsPosition `json:"top"` - TextStyle EChartsTextStyle `json:"textStyle"` - SubtextStyle EChartsTextStyle `json:"subtextStyle"` - } `json:"title"` - XAxis EChartsXAxis `json:"xAxis"` - YAxis EChartsYAxis `json:"yAxis"` - Legend EChartsLegend `json:"legend"` - Radar struct { - Indicator []RadarIndicator `json:"indicator"` - } `json:"radar"` - Series EChartsSeriesList `json:"series"` - Children []EChartsOption `json:"children"` -} - -func (eo *EChartsOption) ToOption() ChartOption { - fontFamily := eo.FontFamily - if len(fontFamily) == 0 { - fontFamily = eo.Title.TextStyle.FontFamily - } - o := ChartOption{ - Type: eo.Type, - FontFamily: fontFamily, - Theme: eo.Theme, - Title: TitleOption{ - Text: eo.Title.Text, - Subtext: eo.Title.Subtext, - Style: eo.Title.TextStyle.ToStyle(), - SubtextStyle: eo.Title.SubtextStyle.ToStyle(), - Left: string(eo.Title.Left), - Top: string(eo.Title.Top), - }, - Legend: LegendOption{ - Show: eo.Legend.Show, - Style: eo.Legend.TextStyle.ToStyle(), - Data: eo.Legend.Data, - Left: string(eo.Legend.Left), - Top: string(eo.Legend.Top), - Align: eo.Legend.Align, - Orient: eo.Legend.Orient, - }, - RadarIndicators: eo.Radar.Indicator, - Width: eo.Width, - Height: eo.Height, - Padding: eo.Padding.Box, - Box: eo.Box, - SeriesList: eo.Series.ToSeriesList(), - } - if len(eo.XAxis.Data) != 0 { - xAxisData := eo.XAxis.Data[0] - o.XAxis = XAxisOption{ - BoundaryGap: xAxisData.BoundaryGap, - Data: xAxisData.Data, - SplitNumber: xAxisData.SplitNumber, - } - } - yAxisOptions := make([]YAxisOption, len(eo.YAxis.Data)) - for index, item := range eo.YAxis.Data { - yAxisOptions[index] = YAxisOption{ - Min: item.Min, - Max: item.Max, - Formatter: item.AxisLabel.Formatter, - Color: parseColor(item.AxisLine.LineStyle.Color), - } - } - o.YAxisList = yAxisOptions - - if len(eo.Children) != 0 { - o.Children = make([]ChartOption, len(eo.Children)) - for index, item := range eo.Children { - o.Children[index] = item.ToOption() - } - } - return o -} - -func renderEcharts(options, outputType string) ([]byte, error) { - o := EChartsOption{} - err := json.Unmarshal([]byte(options), &o) - if err != nil { - return nil, err - } - opt := o.ToOption() - opt.Type = outputType - d, err := Render(opt) - if err != nil { - return nil, err - } - return d.Bytes() -} - -func RenderEChartsToPNG(options string) ([]byte, error) { - return renderEcharts(options, "png") -} - -func RenderEChartsToSVG(options string) ([]byte, error) { - return renderEcharts(options, "svg") -} diff --git a/echarts_test.go b/echarts_test.go deleted file mode 100644 index 05c2a40..0000000 --- a/echarts_test.go +++ /dev/null @@ -1,592 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestEChartsPosition(t *testing.T) { - assert := assert.New(t) - - var p EChartsPosition - err := p.UnmarshalJSON([]byte("12")) - assert.Nil(err) - assert.Equal("12", string(p)) - - err = p.UnmarshalJSON([]byte(`"12%"`)) - assert.Nil(err) - assert.Equal("12%", string(p)) -} -func TestEChartStyle(t *testing.T) { - assert := assert.New(t) - - s := EChartStyle{ - Color: "#aaa", - } - r := drawing.Color{ - R: 170, - G: 170, - B: 170, - A: 255, - } - assert.Equal(chart.Style{ - FillColor: r, - FontColor: r, - StrokeColor: r, - }, s.ToStyle()) -} - -func TestEChartsXAxis(t *testing.T) { - assert := assert.New(t) - ex := EChartsXAxis{} - err := ex.UnmarshalJSON([]byte(`{ - "boundaryGap": false, - "splitNumber": 5, - "data": [ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun" - ] - }`)) - assert.Nil(err) - assert.Equal(EChartsXAxis{ - Data: []EChartsXAxisData{ - { - BoundaryGap: FalseFlag(), - SplitNumber: 5, - Data: []string{ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun", - }, - }, - }, - }, ex) -} - -func TestEChartsYAxis(t *testing.T) { - assert := assert.New(t) - ey := EChartsYAxis{} - - err := ey.UnmarshalJSON([]byte(`{ - "min": 1, - "max": 10, - "axisLabel": { - "formatter": "ab" - } - }`)) - assert.Nil(err) - assert.Equal(EChartsYAxis{ - Data: []EChartsYAxisData{ - { - Min: NewFloatPoint(1), - Max: NewFloatPoint(10), - AxisLabel: EChartsAxisLabel{ - Formatter: "ab", - }, - }, - }, - }, ey) - - ey = EChartsYAxis{} - err = ey.UnmarshalJSON([]byte(`[ - { - "min": 1, - "max": 10, - "axisLabel": { - "formatter": "ab" - } - }, - { - "min": 2, - "max": 20, - "axisLabel": { - "formatter": "cd" - } - } - ]`)) - assert.Nil(err) - assert.Equal(EChartsYAxis{ - Data: []EChartsYAxisData{ - { - Min: NewFloatPoint(1), - Max: NewFloatPoint(10), - AxisLabel: EChartsAxisLabel{ - Formatter: "ab", - }, - }, - { - Min: NewFloatPoint(2), - Max: NewFloatPoint(20), - AxisLabel: EChartsAxisLabel{ - Formatter: "cd", - }, - }, - }, - }, ey) -} - -func TestEChartsPadding(t *testing.T) { - assert := assert.New(t) - - ep := EChartsPadding{} - - err := ep.UnmarshalJSON([]byte(`10`)) - assert.Nil(err) - assert.Equal(EChartsPadding{ - Box: chart.Box{ - Top: 10, - Right: 10, - Bottom: 10, - Left: 10, - }, - }, ep) - - ep = EChartsPadding{} - err = ep.UnmarshalJSON([]byte(`[10, 20]`)) - assert.Nil(err) - assert.Equal(EChartsPadding{ - Box: chart.Box{ - Top: 10, - Right: 20, - Bottom: 10, - Left: 20, - }, - }, ep) - - ep = EChartsPadding{} - err = ep.UnmarshalJSON([]byte(`[10, 20, 30]`)) - assert.Nil(err) - assert.Equal(EChartsPadding{ - Box: chart.Box{ - Top: 10, - Right: 20, - Bottom: 30, - Left: 20, - }, - }, ep) - - ep = EChartsPadding{} - err = ep.UnmarshalJSON([]byte(`[10, 20, 30, 40]`)) - assert.Nil(err) - assert.Equal(EChartsPadding{ - Box: chart.Box{ - Top: 10, - Right: 20, - Bottom: 30, - Left: 40, - }, - }, ep) - -} -func TestEChartsLegend(t *testing.T) { - assert := assert.New(t) - - el := EChartsLegend{} - - err := json.Unmarshal([]byte(`{ - "data": ["a", "b", "c"], - "align": "right", - "padding": [10], - "left": "20%", - "top": 10 - }`), &el) - assert.Nil(err) - assert.Equal(EChartsLegend{ - Data: []string{ - "a", - "b", - "c", - }, - Align: "right", - Padding: EChartsPadding{ - Box: chart.Box{ - Left: 10, - Top: 10, - Right: 10, - Bottom: 10, - }, - }, - Left: EChartsPosition("20%"), - Top: EChartsPosition("10"), - }, el) -} - -func TestEChartsSeriesData(t *testing.T) { - assert := assert.New(t) - - esd := EChartsSeriesData{} - err := esd.UnmarshalJSON([]byte(`123`)) - assert.Nil(err) - assert.Equal(EChartsSeriesData{ - Value: NewEChartsSeriesDataValue(123), - }, esd) - - esd = EChartsSeriesData{} - err = esd.UnmarshalJSON([]byte(`2.1`)) - assert.Nil(err) - assert.Equal(EChartsSeriesData{ - Value: NewEChartsSeriesDataValue(2.1), - }, esd) - - esd = EChartsSeriesData{} - err = esd.UnmarshalJSON([]byte(`{ - "value": 123.12, - "name": "test", - "itemStyle": { - "color": "#aaa" - } - }`)) - assert.Nil(err) - assert.Equal(EChartsSeriesData{ - Value: NewEChartsSeriesDataValue(123.12), - Name: "test", - ItemStyle: EChartStyle{ - Color: "#aaa", - }, - }, esd) -} - -func TestEChartsSeries(t *testing.T) { - assert := assert.New(t) - - esList := make([]EChartsSeries, 0) - err := json.Unmarshal([]byte(`[ - { - "name": "Email", - "data": [ - 120, - 132 - ] - }, - { - "name": "Union Ads", - "type": "bar", - "data": [ - 220, - 182 - ] - } - ]`), &esList) - assert.Nil(err) - assert.Equal([]EChartsSeries{ - { - Name: "Email", - Data: []EChartsSeriesData{ - { - Value: NewEChartsSeriesDataValue(120), - }, - { - Value: NewEChartsSeriesDataValue(132), - }, - }, - }, - { - Name: "Union Ads", - Type: "bar", - Data: []EChartsSeriesData{ - { - Value: NewEChartsSeriesDataValue(220), - }, - { - Value: NewEChartsSeriesDataValue(182), - }, - }, - }, - }, esList) -} - -func TestEChartsMarkData(t *testing.T) { - assert := assert.New(t) - - emd := EChartsMarkData{} - err := emd.UnmarshalJSON([]byte(`{"type": "average"}`)) - assert.Nil(err) - assert.Equal("average", emd.Type) - - emd = EChartsMarkData{} - err = emd.UnmarshalJSON([]byte(`[{}, {"type": "average"}]`)) - assert.Nil(err) - assert.Equal("average", emd.Type) -} - -func TestEChartsMarkPoint(t *testing.T) { - assert := assert.New(t) - - p := EChartsMarkPoint{} - - err := json.Unmarshal([]byte(`{ - "symbolSize": 30, - "data": [ - { - "type": "max" - }, - { - "type": "min" - } - ] - }`), &p) - assert.Nil(err) - assert.Equal(SeriesMarkPoint{ - SymbolSize: 30, - Data: []SeriesMarkData{ - { - Type: "max", - }, - { - Type: "min", - }, - }, - }, p.ToSeriesMarkPoint()) -} - -func TestEChartsMarkLine(t *testing.T) { - assert := assert.New(t) - l := EChartsMarkLine{} - - err := json.Unmarshal([]byte(`{ - "data": [ - { - "type": "max" - }, - { - "type": "min" - } - ] - }`), &l) - assert.Nil(err) - assert.Equal(SeriesMarkLine{ - Data: []SeriesMarkData{ - { - Type: "max", - }, - { - Type: "min", - }, - }, - }, l.ToSeriesMarkLine()) -} - -func TestEChartsTextStyle(t *testing.T) { - assert := assert.New(t) - - s := EChartsTextStyle{ - Color: "#aaa", - FontFamily: "test", - FontSize: 14, - } - assert.Equal(chart.Style{ - FontColor: drawing.Color{ - R: 170, - G: 170, - B: 170, - A: 255, - }, - FontSize: 14, - }, s.ToStyle()) -} - -func TestEChartsSeriesList(t *testing.T) { - assert := assert.New(t) - - // pie - es := EChartsSeriesList{ - { - Type: ChartTypePie, - Radius: "30%", - Data: []EChartsSeriesData{ - { - Name: "1", - Value: EChartsSeriesDataValue{ - values: []float64{ - 1, - }, - }, - }, - { - Name: "2", - Value: EChartsSeriesDataValue{ - values: []float64{ - 2, - }, - }, - }, - }, - }, - } - assert.Equal(SeriesList{ - { - Type: ChartTypePie, - Name: "1", - Label: SeriesLabel{ - Show: true, - }, - Radius: "30%", - Data: []SeriesData{ - { - Value: 1, - }, - }, - }, - { - Type: ChartTypePie, - Name: "2", - Label: SeriesLabel{ - Show: true, - }, - Radius: "30%", - Data: []SeriesData{ - { - Value: 2, - }, - }, - }, - }, es.ToSeriesList()) - - es = EChartsSeriesList{ - { - Type: ChartTypeBar, - Data: []EChartsSeriesData{ - { - Value: NewEChartsSeriesDataValue(1), - ItemStyle: EChartStyle{ - Color: "#aaa", - }, - }, - { - Value: NewEChartsSeriesDataValue(2), - }, - }, - YAxisIndex: 1, - }, - { - Data: []EChartsSeriesData{ - { - Value: NewEChartsSeriesDataValue(3), - }, - { - Value: NewEChartsSeriesDataValue(4), - }, - }, - ItemStyle: EChartStyle{ - Color: "#ccc", - }, - Label: EChartsLabelOption{ - Color: "#ddd", - Show: true, - Distance: 5, - }, - }, - } - assert.Equal(SeriesList{ - { - Type: ChartTypeBar, - Data: []SeriesData{ - { - Value: 1, - Style: chart.Style{ - FontColor: drawing.Color{ - R: 170, - G: 170, - B: 170, - A: 255, - }, - StrokeColor: drawing.Color{ - R: 170, - G: 170, - B: 170, - A: 255, - }, - FillColor: drawing.Color{ - R: 170, - G: 170, - B: 170, - A: 255, - }, - }, - }, - { - Value: 2, - }, - }, - YAxisIndex: 1, - }, - { - Data: []SeriesData{ - { - Value: 3, - }, - { - Value: 4, - }, - }, - Style: chart.Style{ - FontColor: drawing.Color{ - R: 204, - G: 204, - B: 204, - A: 255, - }, - StrokeColor: drawing.Color{ - R: 204, - G: 204, - B: 204, - A: 255, - }, - FillColor: drawing.Color{ - R: 204, - G: 204, - B: 204, - A: 255, - }, - }, - Label: SeriesLabel{ - Color: drawing.Color{ - R: 221, - G: 221, - B: 221, - A: 255, - }, - Show: true, - Distance: 5, - }, - MarkPoint: SeriesMarkPoint{}, - MarkLine: SeriesMarkLine{}, - }, - }, es.ToSeriesList()) - -} diff --git a/examples/basic/main.go b/examples/basic/main.go deleted file mode 100644 index 1e7af8d..0000000 --- a/examples/basic/main.go +++ /dev/null @@ -1,94 +0,0 @@ -package main - -import ( - "io/ioutil" - "os" - "path/filepath" - - charts "github.com/vicanso/go-charts" -) - -func writeFile(file string, buf []byte) error { - tmpPath := "./tmp" - err := os.MkdirAll(tmpPath, 0700) - if err != nil { - return err - } - - file = filepath.Join(tmpPath, file) - err = ioutil.WriteFile(file, buf, 0600) - if err != nil { - return err - } - return nil -} - -func chartsRender() ([]byte, error) { - d, err := charts.LineRender([][]float64{ - { - 150, - 230, - 224, - 218, - 135, - 147, - 260, - }, - }, - // output type - charts.PNGTypeOption(), - // title - charts.TitleOptionFunc(charts.TitleOption{ - Text: "Line", - }), - // x axis - charts.XAxisOptionFunc(charts.NewXAxisOption([]string{ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun", - })), - ) - if err != nil { - return nil, err - } - return d.Bytes() -} - -func echartsRender() ([]byte, error) { - return charts.RenderEChartsToPNG(`{ - "title": { - "text": "Line" - }, - "xAxis": { - "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - }, - "series": [ - { - "data": [150, 230, 224, 218, 135, 147, 260] - } - ] - }`) -} - -type Render func() ([]byte, error) - -func main() { - m := map[string]Render{ - "charts-line.png": chartsRender, - "echarts-line.png": echartsRender, - } - for name, fn := range m { - buf, err := fn() - if err != nil { - panic(err) - } - err = writeFile(name, buf) - if err != nil { - panic(err) - } - } -} diff --git a/examples/charts/main.go b/examples/charts/main.go deleted file mode 100644 index fddbe6d..0000000 --- a/examples/charts/main.go +++ /dev/null @@ -1,1809 +0,0 @@ -package main - -import ( - "bytes" - "net/http" - "strconv" - - charts "github.com/vicanso/go-charts" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -var html = ` - - - - - - - go-charts - - -

- - -` - -func handler(w http.ResponseWriter, req *http.Request, chartOptions []charts.ChartOption, echartsOptions []string) { - if req.URL.Path != "/" && - req.URL.Path != "/echarts" { - return - } - query := req.URL.Query() - theme := query.Get("theme") - width, _ := strconv.Atoi(query.Get("width")) - height, _ := strconv.Atoi(query.Get("height")) - charts.SetDefaultWidth(width) - charts.SetDefaultWidth(height) - bytesList := make([][]byte, 0) - for _, opt := range chartOptions { - opt.Theme = theme - d, err := charts.Render(opt) - if err != nil { - panic(err) - } - buf, err := d.Bytes() - if err != nil { - panic(err) - } - bytesList = append(bytesList, buf) - } - for _, opt := range echartsOptions { - buf, err := charts.RenderEChartsToSVG(opt) - if err != nil { - panic(err) - } - bytesList = append(bytesList, buf) - } - - data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), bytes.Join(bytesList, []byte(""))) - w.Header().Set("Content-Type", "text/html") - w.Write(data) -} - -func indexHandler(w http.ResponseWriter, req *http.Request) { - chartOptions := []charts.ChartOption{ - // 普通折线图 - { - Title: charts.TitleOption{ - Text: "Line", - }, - Legend: charts.NewLegendOption([]string{ - "Email", - "Union Ads", - "Video Ads", - "Direct", - "Search Engine", - }), - XAxis: charts.NewXAxisOption([]string{ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun", - }), - SeriesList: []charts.Series{ - charts.NewSeriesFromValues([]float64{ - 120, - 132, - 101, - 134, - 90, - 230, - 210, - }), - charts.NewSeriesFromValues([]float64{ - 220, - 182, - 191, - 234, - 290, - 330, - 310, - }), - charts.NewSeriesFromValues([]float64{ - 150, - 232, - 201, - 154, - 190, - 330, - 410, - }), - charts.NewSeriesFromValues([]float64{ - 320, - 332, - 301, - 334, - 390, - 330, - 320, - }), - charts.NewSeriesFromValues([]float64{ - 820, - 932, - 901, - 934, - 1290, - 1330, - 1320, - }), - }, - }, - // 温度折线图 - { - Title: charts.TitleOption{ - Text: "Temperature Change in the Coming Week", - }, - Padding: chart.Box{ - Top: 20, - Left: 20, - Right: 30, - Bottom: 20, - }, - Legend: charts.NewLegendOption([]string{ - "Highest", - "Lowest", - }, charts.PositionRight), - XAxis: charts.NewXAxisOption([]string{ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun", - }, charts.FalseFlag()), - SeriesList: []charts.Series{ - { - Data: charts.NewSeriesDataFromValues([]float64{ - 14, - 11, - 13, - 11, - 12, - 12, - 7, - }), - MarkPoint: charts.NewMarkPoint(charts.SeriesMarkDataTypeMax, charts.SeriesMarkDataTypeMin), - MarkLine: charts.NewMarkLine(charts.SeriesMarkDataTypeAverage), - }, - { - Data: charts.NewSeriesDataFromValues([]float64{ - 1, - -2, - 2, - 5, - 3, - 2, - 0, - }), - MarkLine: charts.NewMarkLine(charts.SeriesMarkDataTypeAverage), - }, - }, - }, - // 柱状图 - { - Title: charts.TitleOption{ - Text: "Bar", - }, - XAxis: charts.NewXAxisOption([]string{ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun", - }), - Legend: charts.LegendOption{ - Data: []string{ - "Rainfall", - "Evaporation", - }, - Icon: charts.LegendIconRect, - }, - SeriesList: []charts.Series{ - charts.NewSeriesFromValues([]float64{ - 120, - 200, - 150, - 80, - 70, - 110, - 130, - }, charts.ChartTypeBar), - { - Type: charts.ChartTypeBar, - Data: []charts.SeriesData{ - { - Value: 100, - }, - { - Value: 190, - Style: chart.Style{ - FillColor: drawing.Color{ - R: 169, - G: 0, - B: 0, - A: 255, - }, - }, - }, - { - Value: 230, - }, - { - Value: 140, - }, - { - Value: 100, - }, - { - Value: 200, - }, - { - Value: 180, - }, - }, - }, - }, - }, - // 柱状图+mark - { - Title: charts.TitleOption{ - Text: "Rainfall vs Evaporation", - Subtext: "Fake Data", - }, - Padding: chart.Box{ - Top: 20, - Right: 20, - Bottom: 20, - Left: 20, - }, - XAxis: charts.NewXAxisOption([]string{ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - }), - Legend: charts.NewLegendOption([]string{ - "Rainfall", - "Evaporation", - }, charts.PositionRight), - SeriesList: []charts.Series{ - { - Type: charts.ChartTypeBar, - Data: charts.NewSeriesDataFromValues([]float64{ - 2.0, - 4.9, - 7.0, - 23.2, - 25.6, - 76.7, - 135.6, - 162.2, - 32.6, - 20.0, - 6.4, - 3.3, - }), - MarkPoint: charts.NewMarkPoint( - charts.SeriesMarkDataTypeMax, - charts.SeriesMarkDataTypeMin, - ), - MarkLine: charts.NewMarkLine( - charts.SeriesMarkDataTypeAverage, - ), - }, - { - Type: charts.ChartTypeBar, - Data: charts.NewSeriesDataFromValues([]float64{ - 2.6, - 5.9, - 9.0, - 26.4, - 28.7, - 70.7, - 175.6, - 182.2, - 48.7, - 18.8, - 6.0, - 2.3, - }), - MarkPoint: charts.NewMarkPoint( - charts.SeriesMarkDataTypeMax, - charts.SeriesMarkDataTypeMin, - ), - MarkLine: charts.NewMarkLine( - charts.SeriesMarkDataTypeAverage, - ), - }, - }, - }, - // 双Y轴示例 - { - XAxis: charts.NewXAxisOption([]string{ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", - }), - Legend: charts.NewLegendOption([]string{ - "Evaporation", - "Precipitation", - "Temperature", - }), - YAxisList: []charts.YAxisOption{ - { - Formatter: "{value}°C", - Color: drawing.Color{ - R: 250, - G: 200, - B: 88, - A: 255, - }, - }, - { - Formatter: "{value}ml", - Color: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, - }, - }, - SeriesList: []charts.Series{ - { - Type: charts.ChartTypeBar, - Data: charts.NewSeriesDataFromValues([]float64{ - 2.0, - 4.9, - 7.0, - 23.2, - 25.6, - 76.7, - 135.6, - 162.2, - 32.6, - 20.0, - 6.4, - 3.3, - 10.2, - }), - YAxisIndex: 1, - }, - { - Type: charts.ChartTypeBar, - Data: charts.NewSeriesDataFromValues([]float64{ - 2.6, - 5.9, - 9.0, - 26.4, - 28.7, - 70.7, - 175.6, - 182.2, - 48.7, - 18.8, - 6.0, - 2.3, - 20.2, - }), - YAxisIndex: 1, - }, - { - Data: charts.NewSeriesDataFromValues([]float64{ - 2.0, - 2.2, - 3.3, - 4.5, - 6.3, - 10.2, - 20.3, - 23.4, - 23.0, - 16.5, - 12.0, - 6.2, - 30.3, - }), - }, - }, - }, - // 饼图 - { - Title: charts.TitleOption{ - Text: "Referer of a Website", - Subtext: "Fake Data", - Left: charts.PositionCenter, - }, - Legend: charts.LegendOption{ - Orient: charts.OrientVertical, - Data: []string{ - "Search Engine", - "Direct", - "Email", - "Union Ads", - "Video Ads", - }, - Left: charts.PositionLeft, - }, - SeriesList: charts.NewPieSeriesList([]float64{ - 1048, - 735, - 580, - 484, - 300, - }, charts.PieSeriesOption{ - Label: charts.SeriesLabel{ - Show: true, - }, - Radius: "35%", - }), - }, - // 雷达图 - { - Title: charts.TitleOption{ - Text: "Basic Radar Chart", - }, - Legend: charts.NewLegendOption([]string{ - "Allocated Budget", - "Actual Spending", - }), - RadarIndicators: []charts.RadarIndicator{ - { - Name: "Sales", - Max: 6500, - }, - { - Name: "Administration", - Max: 16000, - }, - { - Name: "Information Technology", - Max: 30000, - }, - { - Name: "Customer Support", - Max: 38000, - }, - { - Name: "Development", - Max: 52000, - }, - { - Name: "Marketing", - Max: 25000, - }, - }, - SeriesList: charts.SeriesList{ - { - Type: charts.ChartTypeRadar, - Data: charts.NewSeriesDataFromValues([]float64{ - 4200, - 3000, - 20000, - 35000, - 50000, - 18000, - }), - }, - { - Type: charts.ChartTypeRadar, - Data: charts.NewSeriesDataFromValues([]float64{ - 5000, - 14000, - 28000, - 26000, - 42000, - 21000, - }), - }, - }, - }, - // 漏斗图 - { - Title: charts.TitleOption{ - Text: "Funnel", - }, - Legend: charts.NewLegendOption([]string{ - "Show", - "Click", - "Visit", - "Inquiry", - "Order", - }), - SeriesList: []charts.Series{ - { - Type: charts.ChartTypeFunnel, - Name: "Visit", - Data: charts.NewSeriesDataFromValues([]float64{ - 60, - }), - }, - { - Type: charts.ChartTypeFunnel, - Name: "Inquiry", - Data: charts.NewSeriesDataFromValues([]float64{ - 40, - }), - }, - { - Type: charts.ChartTypeFunnel, - Name: "Order", - Data: charts.NewSeriesDataFromValues([]float64{ - 20, - }), - }, - { - Type: charts.ChartTypeFunnel, - Name: "Click", - Data: charts.NewSeriesDataFromValues([]float64{ - 80, - }), - }, - { - Type: charts.ChartTypeFunnel, - Name: "Show", - Data: charts.NewSeriesDataFromValues([]float64{ - 100, - }), - }, - }, - }, - // 多图展示 - { - Legend: charts.LegendOption{ - Top: "-90", - Data: []string{ - "Milk Tea", - "Matcha Latte", - "Cheese Cocoa", - "Walnut Brownie", - }, - }, - Padding: chart.Box{ - Top: 100, - Right: 10, - Bottom: 10, - Left: 10, - }, - XAxis: charts.NewXAxisOption([]string{ - "2012", - "2013", - "2014", - "2015", - "2016", - "2017", - }), - YAxisList: []charts.YAxisOption{ - { - - Min: charts.NewFloatPoint(0), - Max: charts.NewFloatPoint(90), - }, - }, - SeriesList: []charts.Series{ - charts.NewSeriesFromValues([]float64{ - 56.5, - 82.1, - 88.7, - 70.1, - 53.4, - 85.1, - }), - charts.NewSeriesFromValues([]float64{ - 51.1, - 51.4, - 55.1, - 53.3, - 73.8, - 68.7, - }), - charts.NewSeriesFromValues([]float64{ - 40.1, - 62.2, - 69.5, - 36.4, - 45.2, - 32.5, - }, charts.ChartTypeBar), - charts.NewSeriesFromValues([]float64{ - 25.2, - 37.1, - 41.2, - 18, - 33.9, - 49.1, - }, charts.ChartTypeBar), - }, - Children: []charts.ChartOption{ - { - Legend: charts.LegendOption{ - Show: charts.FalseFlag(), - Data: []string{ - "Milk Tea", - "Matcha Latte", - "Cheese Cocoa", - "Walnut Brownie", - }, - }, - Box: chart.Box{ - Top: 20, - Left: 400, - Right: 500, - Bottom: 120, - }, - SeriesList: charts.NewPieSeriesList([]float64{ - 435.9, - 354.3, - 285.9, - 204.5, - }, charts.PieSeriesOption{ - Label: charts.SeriesLabel{ - Show: true, - }, - Radius: "35%", - }), - }, - }, - }, - } - handler(w, req, chartOptions, nil) -} - -func echartsHandler(w http.ResponseWriter, req *http.Request) { - echartsOptions := []string{ - `{ - "xAxis": { - "type": "category", - "data": [ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun" - ] - }, - "yAxis": { - "type": "value" - }, - "series": [ - { - "data": [ - 150, - 230, - 224, - 218, - 135, - 147, - 260 - ], - "type": "line" - } - ] - }`, - `{ - "title": { - "text": "Multiple Line" - }, - "tooltip": { - "trigger": "axis" - }, - "legend": { - "left": "right", - "data": [ - "Email", - "Union Ads", - "Video Ads", - "Direct", - "Search Engine" - ] - }, - "grid": { - "left": "3%", - "right": "4%", - "bottom": "3%", - "containLabel": true - }, - "toolbox": { - "feature": { - "saveAsImage": {} - } - }, - "xAxis": { - "type": "category", - "boundaryGap": false, - "data": [ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun" - ] - }, - "yAxis": { - "type": "value" - }, - "series": [ - { - "name": "Email", - "type": "line", - "data": [ - 120, - 132, - 101, - 134, - 90, - 230, - 210 - ] - }, - { - "name": "Union Ads", - "type": "line", - "data": [ - 220, - 182, - 191, - 234, - 290, - 330, - 310 - ] - }, - { - "name": "Video Ads", - "type": "line", - "data": [ - 150, - 232, - 201, - 154, - 190, - 330, - 410 - ] - }, - { - "name": "Direct", - "type": "line", - "data": [ - 320, - 332, - 301, - 334, - 390, - 330, - 320 - ] - }, - { - "name": "Search Engine", - "type": "line", - "data": [ - 820, - 932, - 901, - 934, - 1290, - 1330, - 1320 - ] - } - ] - }`, - `{ - "title": { - "text": "Temperature Change in the Coming Week" - }, - "legend": { - "left": "right" - }, - "padding": [10, 30, 10, 10], - "xAxis": { - "type": "category", - "boundaryGap": false, - "data": [ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun" - ] - }, - "yAxis": { - "axisLabel": { - "formatter": "{value} °C" - } - }, - "series": [ - { - "name": "Highest", - "type": "line", - "data": [ - 10, - 11, - 13, - 11, - 12, - 12, - 9 - ], - "markPoint": { - "data": [ - { - "type": "max" - }, - { - "type": "min" - } - ] - }, - "markLine": { - "data": [ - { - "type": "average" - } - ] - } - }, - { - "name": "Lowest", - "type": "line", - "data": [ - 1, - -2, - 2, - 5, - 3, - 2, - 0 - ], - "markPoint": { - "data": [ - { - "type": "min" - } - ] - }, - "markLine": { - "data": [ - { - "type": "average" - }, - { - "type": "max" - } - ] - } - } - ] - }`, - `{ - "xAxis": { - "type": "category", - "data": [ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun" - ] - }, - "yAxis": { - "type": "value" - }, - "series": [ - { - "data": [ - 120, - 200, - 150, - 80, - 70, - 110, - 130 - ], - "type": "bar" - } - ] - }`, - `{ - "xAxis": { - "type": "category", - "data": [ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun" - ] - }, - "yAxis": { - "type": "value" - }, - "series": [ - { - "data": [ - 120, - { - "value": 200, - "itemStyle": { - "color": "#a90000" - } - }, - 150, - 80, - 70, - 110, - 130 - ], - "type": "bar" - } - ] - }`, - `{ - "title": { - "text": "Rainfall vs Evaporation", - "subtext": "Fake Data" - }, - "legend": { - "data": [ - "Rainfall", - "Evaporation" - ] - }, - "padding": [10, 30, 10, 10], - "xAxis": [ - { - "type": "category", - "data": [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" - ] - } - ], - "series": [ - { - "name": "Rainfall", - "type": "bar", - "data": [ - 2, - 4.9, - 7, - 23.2, - 25.6, - 76.7, - 135.6, - 162.2, - 32.6, - 20, - 6.4, - 3.3 - ], - "markPoint": { - "data": [ - { - "type": "max" - }, - { - "type": "min" - } - ] - }, - "markLine": { - "data": [ - { - "type": "average" - } - ] - } - }, - { - "name": "Evaporation", - "type": "bar", - "data": [ - 2.6, - 5.9, - 9, - 26.4, - 28.7, - 70.7, - 175.6, - 182.2, - 48.7, - 18.8, - 6, - 2.3 - ], - "markPoint": { - "data": [ - { - "type": "max" - }, - { - "type": "min" - } - ] - }, - "markLine": { - "data": [ - { - "type": "average" - } - ] - } - } - ] - }`, - `{ - "legend": { - "data": [ - "Evaporation", - "Precipitation", - "Temperature" - ] - }, - "xAxis": [ - { - "type": "category", - "data": [ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun" - ], - "axisPointer": { - "type": "shadow" - } - } - ], - "yAxis": [ - { - "type": "value", - "name": "Precipitation", - "min": 0, - "max": 240, - "axisLabel": { - "formatter": "{value} ml" - } - }, - { - "type": "value", - "name": "Temperature", - "min": 0, - "max": 24, - "axisLabel": { - "formatter": "{value} °C" - } - } - ], - "series": [ - { - "name": "Evaporation", - "type": "bar", - "tooltip": {}, - "data": [ - 2, - 4.9, - 7, - 23.2, - 25.6, - 76.7, - 135.6, - 162.2, - 32.6, - 20, - 6.4, - 3.3 - ] - }, - { - "name": "Precipitation", - "type": "bar", - "tooltip": {}, - "data": [ - 2.6, - 5.9, - 9, - 26.4, - 28.7, - 70.7, - 175.6, - 182.2, - 48.7, - 18.8, - 6, - 2.3 - ] - }, - { - "name": "Temperature", - "type": "line", - "yAxisIndex": 1, - "tooltip": {}, - "data": [ - 2, - 2.2, - 3.3, - 4.5, - 6.3, - 10.2, - 20.3, - 23.4, - 23, - 16.5, - 12, - 6.2 - ] - } - ] - }`, - `{ - "tooltip": { - "trigger": "axis", - "axisPointer": { - "type": "cross" - } - }, - "grid": { - "right": "20%" - }, - "toolbox": { - "feature": { - "dataView": { - "show": true, - "readOnly": false - }, - "restore": { - "show": true - }, - "saveAsImage": { - "show": true - } - } - }, - "legend": { - "data": [ - "Evaporation", - "Precipitation", - "Temperature" - ] - }, - "xAxis": [ - { - "type": "category", - "axisTick": { - "alignWithLabel": true - }, - "data": [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" - ] - } - ], - "yAxis": [ - { - "type": "value", - "name": "温度", - "position": "left", - "alignTicks": true, - "axisLine": { - "show": true, - "lineStyle": { - "color": "#EE6666" - } - }, - "axisLabel": { - "formatter": "{value} °C" - } - }, - { - "type": "value", - "name": "Evaporation", - "position": "right", - "alignTicks": true, - "axisLine": { - "show": true, - "lineStyle": { - "color": "#5470C6" - } - }, - "axisLabel": { - "formatter": "{value} ml" - } - } - ], - "series": [ - { - "name": "Evaporation", - "type": "bar", - "yAxisIndex": 1, - "data": [ - 2, - 4.9, - 7, - 23.2, - 25.6, - 76.7, - 135.6, - 162.2, - 32.6, - 20, - 6.4, - 3.3 - ] - }, - { - "name": "Precipitation", - "type": "bar", - "yAxisIndex": 1, - "data": [ - 2.6, - 5.9, - 9, - 26.4, - 28.7, - 70.7, - 175.6, - 182.2, - 48.7, - 18.8, - 6, - 2.3 - ] - }, - { - "name": "Temperature", - "type": "line", - "data": [ - 2, - 2.2, - 3.3, - 4.5, - 6.3, - 10.2, - 20.3, - 23.4, - 23, - 16.5, - 12, - 6.2 - ] - } - ] - }`, - `{ - "title": { - "text": "Referer of a Website", - "subtext": "Fake Data", - "left": "center" - }, - "tooltip": { - "trigger": "item" - }, - "legend": { - "orient": "vertical", - "left": "left" - }, - "series": [ - { - "name": "Access From", - "type": "pie", - "radius": "50%", - "data": [ - { - "value": 1048, - "name": "Search Engine" - }, - { - "value": 735, - "name": "Direct" - }, - { - "value": 580, - "name": "Email" - }, - { - "value": 484, - "name": "Union Ads" - }, - { - "value": 300, - "name": "Video Ads" - } - ] - } - ] - }`, - `{ - "title": { - "text": "Rainfall" - }, - "padding": [10, 10, 10, 30], - "legend": { - "data": [ - "GZ", - "SH" - ] - }, - "xAxis": { - "type": "category", - "splitNumber": 6, - "data": [ - "01-01", - "01-02", - "01-03", - "01-04", - "01-05", - "01-06", - "01-07", - "01-08", - "01-09", - "01-10", - "01-11", - "01-12", - "01-13", - "01-14", - "01-15", - "01-16", - "01-17", - "01-18", - "01-19", - "01-20", - "01-21", - "01-22", - "01-23", - "01-24", - "01-25", - "01-26", - "01-27", - "01-28", - "01-29", - "01-30", - "01-31" - ] - }, - "yAxis": { - "axisLabel": { - "formatter": "{value} mm" - } - }, - "series": [ - { - "type": "bar", - "data": [ - 928, - 821, - 889, - 600, - 547, - 783, - 197, - 853, - 430, - 346, - 63, - 465, - 309, - 334, - 141, - 538, - 792, - 58, - 922, - 807, - 298, - 243, - 744, - 885, - 812, - 231, - 330, - 220, - 984, - 221, - 429 - ] - }, - { - "type": "bar", - "data": [ - 749, - 201, - 296, - 579, - 255, - 159, - 902, - 246, - 149, - 158, - 507, - 776, - 186, - 79, - 390, - 222, - 601, - 367, - 221, - 411, - 714, - 620, - 966, - 73, - 203, - 631, - 833, - 610, - 487, - 677, - 596 - ] - } - ] - }`, - `{ - "title": { - "text": "Basic Radar Chart" - }, - "legend": { - "data": [ - "Allocated Budget", - "Actual Spending" - ] - }, - "radar": { - "indicator": [ - { - "name": "Sales", - "max": 6500 - }, - { - "name": "Administration", - "max": 16000 - }, - { - "name": "Information Technology", - "max": 30000 - }, - { - "name": "Customer Support", - "max": 38000 - }, - { - "name": "Development", - "max": 52000 - }, - { - "name": "Marketing", - "max": 25000 - } - ] - }, - "series": [ - { - "name": "Budget vs spending", - "type": "radar", - "data": [ - { - "value": [ - 4200, - 3000, - 20000, - 35000, - 50000, - 18000 - ], - "name": "Allocated Budget" - }, - { - "value": [ - 5000, - 14000, - 28000, - 26000, - 42000, - 21000 - ], - "name": "Actual Spending" - } - ] - } - ] - }`, - `{ - "title": { - "text": "Funnel" - }, - "tooltip": { - "trigger": "item", - "formatter": "{a}
{b} : {c}%" - }, - "toolbox": { - "feature": { - "dataView": { - "readOnly": false - }, - "restore": {}, - "saveAsImage": {} - } - }, - "legend": { - "data": [ - "Show", - "Click", - "Visit", - "Inquiry", - "Order" - ] - }, - "series": [ - { - "name": "Funnel", - "type": "funnel", - "left": "10%", - "top": 60, - "bottom": 60, - "width": "80%", - "min": 0, - "max": 100, - "minSize": "0%", - "maxSize": "100%", - "sort": "descending", - "gap": 2, - "label": { - "show": true, - "position": "inside" - }, - "labelLine": { - "length": 10, - "lineStyle": { - "width": 1, - "type": "solid" - } - }, - "itemStyle": { - "borderColor": "#fff", - "borderWidth": 1 - }, - "emphasis": { - "label": { - "fontSize": 20 - } - }, - "data": [ - { - "value": 60, - "name": "Visit" - }, - { - "value": 40, - "name": "Inquiry" - }, - { - "value": 20, - "name": "Order" - }, - { - "value": 80, - "name": "Click" - }, - { - "value": 100, - "name": "Show" - } - ] - } - ] - }`, - `{ - "legend": { - "top": "-140", - "data": [ - "Milk Tea", - "Matcha Latte", - "Cheese Cocoa", - "Walnut Brownie" - ] - }, - "padding": [ - 150, - 10, - 10, - 10 - ], - "xAxis": [ - { - "data": [ - "2012", - "2013", - "2014", - "2015", - "2016", - "2017" - ] - } - ], - "series": [ - { - "data": [ - 56.5, - 82.1, - 88.7, - 70.1, - 53.4, - 85.1 - ] - }, - { - "data": [ - 51.1, - 51.4, - 55.1, - 53.3, - 73.8, - 68.7 - ] - }, - { - "data": [ - 40.1, - 62.2, - 69.5, - 36.4, - 45.2, - 32.5 - ] - }, - { - "data": [ - 25.2, - 37.1, - 41.2, - 18, - 33.9, - 49.1 - ] - } - ], - "children": [ - { - "box": { - "left": 0, - "top": 30, - "right": 600, - "bottom": 150 - }, - "legend": { - "show": false - }, - "series": [ - { - "type": "pie", - "radius": "50%", - "data": [ - { - "value": 435.9, - "name": "Milk Tea" - }, - { - "value": 354.3, - "name": "Matcha Latte" - }, - { - "value": 285.9, - "name": "Cheese Cocoa" - }, - { - "value": 204.5, - "name": "Walnut Brownie" - } - ] - } - ] - } - ] - }`, - } - handler(w, req, nil, echartsOptions) -} - -func main() { - http.HandleFunc("/", indexHandler) - http.HandleFunc("/echarts", echartsHandler) - http.ListenAndServe(":3012", nil) -} diff --git a/funnel.go b/funnel.go deleted file mode 100644 index f083306..0000000 --- a/funnel.go +++ /dev/null @@ -1,141 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "fmt" - "sort" - - "github.com/dustin/go-humanize" - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" -) - -type funnelChartOption struct { - Theme string - Font *truetype.Font - SeriesList SeriesList -} - -func funnelChartRender(opt funnelChartOption, result *basicRenderResult) error { - d, err := NewDraw(DrawOption{ - Parent: result.d, - }, PaddingOption(chart.Box{ - Top: result.titleBox.Height(), - })) - if err != nil { - return err - } - seriesList := make([]Series, len(opt.SeriesList)) - copy(seriesList, opt.SeriesList) - sort.Slice(seriesList, func(i, j int) bool { - // 大的数据在前 - return seriesList[i].Data[0].Value > seriesList[j].Data[0].Value - }) - max := seriesList[0].Data[0].Value - min := float64(0) - for _, item := range seriesList { - if item.Max != nil { - max = *item.Max - } - if item.Min != nil { - min = *item.Min - } - } - - theme := NewTheme(opt.Theme) - gap := 2 - height := d.Box.Height() - width := d.Box.Width() - count := len(seriesList) - - h := (height - gap*(count-1)) / count - - y := 0 - widthList := make([]int, len(seriesList)) - textList := make([]string, len(seriesList)) - for index, item := range seriesList { - value := item.Data[0].Value - widthPercent := (value - min) / (max - min) - w := int(widthPercent * float64(width)) - widthList[index] = w - p := humanize.CommafWithDigits(value/max*100, 2) + "%" - textList[index] = fmt.Sprintf("%s(%s)", item.Name, p) - } - - for index, w := range widthList { - series := seriesList[index] - nextWidth := 0 - if index+1 < len(widthList) { - nextWidth = widthList[index+1] - } - topStartX := (width - w) >> 1 - topEndX := topStartX + w - bottomStartX := (width - nextWidth) >> 1 - bottomEndX := bottomStartX + nextWidth - points := []Point{ - { - X: topStartX, - Y: y, - }, - { - X: topEndX, - Y: y, - }, - { - X: bottomEndX, - Y: y + h, - }, - { - X: bottomStartX, - Y: y + h, - }, - { - X: topStartX, - Y: y, - }, - } - color := theme.GetSeriesColor(series.index) - d.fill(points, chart.Style{ - FillColor: color, - }) - - // 文本 - text := textList[index] - r := d.Render - textStyle := chart.Style{ - FontColor: theme.GetTextColor(), - FontSize: labelFontSize, - Font: opt.Font, - } - textStyle.GetTextOptions().WriteToRenderer(r) - textBox := r.MeasureText(text) - textX := width>>1 - textBox.Width()>>1 - textY := y + h>>1 - d.text(text, textX, textY) - - y += (h + gap) - } - - return nil -} diff --git a/funnel_test.go b/funnel_test.go deleted file mode 100644 index 530fa53..0000000 --- a/funnel_test.go +++ /dev/null @@ -1,91 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" -) - -func TestFunnelChartRender(t *testing.T) { - assert := assert.New(t) - - d, err := NewDraw(DrawOption{ - Width: 250, - Height: 150, - }) - assert.Nil(err) - f, _ := chart.GetDefaultFont() - err = funnelChartRender(funnelChartOption{ - Font: f, - SeriesList: []Series{ - { - Type: ChartTypeFunnel, - Name: "Visit", - Data: NewSeriesDataFromValues([]float64{ - 60, - }), - }, - { - Type: ChartTypeFunnel, - Name: "Inquiry", - Data: NewSeriesDataFromValues([]float64{ - 40, - }), - index: 1, - }, - { - Type: ChartTypeFunnel, - Name: "Order", - Data: NewSeriesDataFromValues([]float64{ - 20, - }), - index: 2, - }, - { - Type: ChartTypeFunnel, - Name: "Click", - Data: NewSeriesDataFromValues([]float64{ - 80, - }), - index: 3, - }, - { - Type: ChartTypeFunnel, - Name: "Show", - Data: NewSeriesDataFromValues([]float64{ - 100, - }), - index: 4, - }, - }, - }, &basicRenderResult{ - d: d, - }) - assert.Nil(err) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\nShow(100%)Click(80%)Visit(60%)Inquiry(40%)Order(20%)", string(data)) -} diff --git a/legend.go b/legend.go deleted file mode 100644 index df72757..0000000 --- a/legend.go +++ /dev/null @@ -1,226 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "strconv" - "strings" - - "github.com/wcharczuk/go-chart/v2" -) - -type LegendOption struct { - theme string - // Legend show flag, if nil or true, the legend will be shown - Show *bool - // Legend text style - Style chart.Style - // Text array of legend - Data []string - // Distance between legend component and the left side of the container. - // It can be pixel value: 20, percentage value: 20%, - // or position value: right, center. - Left string - // Distance between legend component and the top side of the container. - // It can be pixel value: 20. - Top string - // Legend marker and text aligning, it can be left or right, default is left. - Align string - // The layout orientation of legend, it can be horizontal or vertical, default is horizontal. - Orient string - // Icon of the legend. - Icon string -} - -const ( - LegendIconRect = "rect" -) - -// NewLegendOption creates a new legend option by legend text list -func NewLegendOption(data []string, position ...string) LegendOption { - opt := LegendOption{ - Data: data, - } - if len(position) != 0 { - opt.Left = position[0] - } - return opt -} - -type legend struct { - d *Draw - opt *LegendOption -} - -func NewLegend(d *Draw, opt LegendOption) *legend { - return &legend{ - d: d, - opt: &opt, - } -} - -func (l *legend) Render() (chart.Box, error) { - d := l.d - opt := l.opt - if len(opt.Data) == 0 || isFalse(opt.Show) { - return chart.BoxZero, nil - } - theme := NewTheme(opt.theme) - padding := opt.Style.Padding - legendDraw, err := NewDraw(DrawOption{ - Parent: d, - }, PaddingOption(padding)) - if err != nil { - return chart.BoxZero, err - } - r := legendDraw.Render - opt.Style.GetTextOptions().WriteToRenderer(r) - - x := 0 - y := 0 - top := 0 - // TODO TOP 暂只支持数值 - if opt.Top != "" { - top, _ = strconv.Atoi(opt.Top) - y += top - } - legendWidth := 30 - legendDotHeight := 5 - textPadding := 5 - legendMargin := 10 - // 往下移2倍dot的高度 - y += 2 * legendDotHeight - - widthCount := 0 - maxTextWidth := 0 - // 文本宽度 - for _, text := range opt.Data { - b := r.MeasureText(text) - if b.Width() > maxTextWidth { - maxTextWidth = b.Width() - } - widthCount += b.Width() - } - if opt.Orient == OrientVertical { - widthCount = maxTextWidth + legendWidth + textPadding - } else { - // 加上标记 - widthCount += legendWidth * len(opt.Data) - // 文本的padding - widthCount += 2 * textPadding * len(opt.Data) - // margin的宽度 - widthCount += legendMargin * (len(opt.Data) - 1) - } - - left := 0 - switch opt.Left { - case PositionRight: - left = legendDraw.Box.Width() - widthCount - case PositionCenter: - left = (legendDraw.Box.Width() - widthCount) >> 1 - default: - if strings.HasSuffix(opt.Left, "%") { - value, _ := strconv.Atoi(strings.ReplaceAll(opt.Left, "%", "")) - left = legendDraw.Box.Width() * value / 100 - } else { - value, _ := strconv.Atoi(opt.Left) - left = value - } - } - x = left - for index, text := range opt.Data { - textBox := r.MeasureText(text) - var renderText func() - if opt.Orient == OrientVertical { - // 垂直 - // 重置x的位置 - x = left - renderText = func() { - x += textPadding - legendDraw.text(text, x, y+legendDotHeight) - x += textBox.Width() - y += (2*legendDotHeight + legendMargin) - } - - } else { - // 水平 - if index != 0 { - x += legendMargin - } - renderText = func() { - x += textPadding - legendDraw.text(text, x, y+legendDotHeight) - x += textBox.Width() - x += textPadding - } - } - if opt.Align == PositionRight { - renderText() - } - seriesColor := theme.GetSeriesColor(index) - fillColor := seriesColor - if !theme.IsDark() { - fillColor = theme.GetBackgroundColor() - } - style := chart.Style{ - StrokeColor: seriesColor, - FillColor: fillColor, - StrokeWidth: 3, - } - if opt.Icon == LegendIconRect { - style.FillColor = seriesColor - style.StrokeWidth = 1 - } - style.GetFillAndStrokeOptions().WriteDrawingOptionsToRenderer(r) - - if opt.Icon == LegendIconRect { - legendDraw.moveTo(x, y-legendDotHeight) - legendDraw.lineTo(x+legendWidth, y-legendDotHeight) - legendDraw.lineTo(x+legendWidth, y+legendDotHeight) - legendDraw.lineTo(x, y+legendDotHeight) - legendDraw.lineTo(x, y-legendDotHeight) - r.FillStroke() - } else { - legendDraw.moveTo(x, y) - legendDraw.lineTo(x+legendWidth, y) - r.Stroke() - legendDraw.circle(float64(legendDotHeight), x+legendWidth>>1, y) - r.FillStroke() - } - x += legendWidth - - if opt.Align != PositionRight { - renderText() - } - } - legendBox := padding.Clone() - // 计算展示区域 - if opt.Orient == OrientVertical { - legendBox.Right = legendBox.Left + left + maxTextWidth + legendWidth + textPadding - legendBox.Bottom = legendBox.Top + y - } else { - legendBox.Right = legendBox.Left + x - legendBox.Bottom = legendBox.Top + 2*legendDotHeight + top + textPadding - } - return legendBox, nil -} diff --git a/legend_test.go b/legend_test.go deleted file mode 100644 index c5d7e50..0000000 --- a/legend_test.go +++ /dev/null @@ -1,185 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestNewLegendOption(t *testing.T) { - assert := assert.New(t) - - opt := NewLegendOption([]string{ - "a", - "b", - }, PositionRight) - assert.Equal(LegendOption{ - Data: []string{ - "a", - "b", - }, - Left: PositionRight, - }, opt) -} - -func TestLegendRender(t *testing.T) { - assert := assert.New(t) - - newDraw := func() *Draw { - d, _ := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - return d - } - style := chart.Style{ - FontSize: 10, - FontColor: drawing.ColorBlack, - } - style.Font, _ = chart.GetDefaultFont() - - tests := []struct { - newDraw func() *Draw - newLegend func(*Draw) *legend - box chart.Box - result string - }{ - { - newDraw: newDraw, - newLegend: func(d *Draw) *legend { - return NewLegend(d, LegendOption{ - Top: "10", - Data: []string{ - "Mon", - "Tue", - "Wed", - }, - Style: style, - }) - }, - result: "\\nMonTueWed", - box: chart.Box{ - Right: 214, - Bottom: 25, - }, - }, - { - newDraw: newDraw, - newLegend: func(d *Draw) *legend { - return NewLegend(d, LegendOption{ - Top: "10", - Left: PositionRight, - Align: PositionRight, - Data: []string{ - "Mon", - "Tue", - "Wed", - }, - Style: style, - }) - }, - result: "\\nMonTueWed", - box: chart.Box{ - Right: 400, - Bottom: 25, - }, - }, - { - newDraw: newDraw, - newLegend: func(d *Draw) *legend { - return NewLegend(d, LegendOption{ - Top: "10", - Left: PositionCenter, - Data: []string{ - "Mon", - "Tue", - "Wed", - }, - Style: style, - }) - }, - result: "\\nMonTueWed", - box: chart.Box{ - Right: 307, - Bottom: 25, - }, - }, - { - newDraw: newDraw, - newLegend: func(d *Draw) *legend { - return NewLegend(d, LegendOption{ - Top: "10", - Left: PositionLeft, - Data: []string{ - "Mon", - "Tue", - "Wed", - }, - Style: style, - Orient: OrientVertical, - }) - }, - result: "\\nMonTueWed", - box: chart.Box{ - Right: 61, - Bottom: 80, - }, - }, - { - newDraw: newDraw, - newLegend: func(d *Draw) *legend { - return NewLegend(d, LegendOption{ - Top: "10", - Left: "10%", - Data: []string{ - "Mon", - "Tue", - "Wed", - }, - Style: style, - Orient: OrientVertical, - }) - }, - box: chart.Box{ - Right: 101, - Bottom: 80, - }, - result: "\\nMonTueWed", - }, - } - - for _, tt := range tests { - d := tt.newDraw() - b, err := tt.newLegend(d).Render() - assert.Nil(err) - assert.Equal(tt.box, b) - data, err := d.Bytes() - assert.Nil(err) - assert.NotEmpty(data) - assert.Equal(tt.result, string(data)) - } -} diff --git a/line.go b/line.go index 15ab575..e4b1f18 100644 --- a/line.go +++ b/line.go @@ -22,10 +22,6 @@ package charts -import ( - "github.com/wcharczuk/go-chart/v2" -) - type LineStyle struct { ClassName string StrokeDashArray []float64 @@ -37,8 +33,8 @@ type LineStyle struct { DotFillColor Color } -func (ls *LineStyle) Style() chart.Style { - return chart.Style{ +func (ls *LineStyle) Style() Style { + return Style{ ClassName: ls.ClassName, StrokeDashArray: ls.StrokeDashArray, StrokeColor: ls.StrokeColor, @@ -48,55 +44,3 @@ func (ls *LineStyle) Style() chart.Style { DotColor: ls.DotColor, } } - -func (d *Draw) lineFill(points []Point, style LineStyle) { - s := style.Style() - if !(s.ShouldDrawStroke() && s.ShouldDrawFill()) { - return - } - - newPoints := make([]Point, len(points)) - copy(newPoints, points) - x0 := points[0].X - y0 := points[0].Y - height := d.Box.Height() - newPoints = append(newPoints, Point{ - X: points[len(points)-1].X, - Y: height, - }, Point{ - X: x0, - Y: height, - }, Point{ - X: x0, - Y: y0, - }) - d.fill(newPoints, style.Style()) -} - -func (d *Draw) lineDot(points []Point, style LineStyle) { - s := style.Style() - if !s.ShouldDrawDot() { - return - } - r := d.Render - dotWith := s.GetDotWidth() - - s.GetDotOptions().WriteDrawingOptionsToRenderer(r) - for _, point := range points { - if !style.DotFillColor.IsZero() { - r.SetFillColor(style.DotFillColor) - } - r.SetStrokeColor(s.DotColor) - d.circle(dotWith, point.X, point.Y) - r.FillStroke() - } -} - -func (d *Draw) Line(points []Point, style LineStyle) { - if len(points) == 0 { - return - } - d.lineFill(points, style) - d.lineStroke(points, style) - d.lineDot(points, style) -} diff --git a/line_chart.go b/line_chart.go deleted file mode 100644 index ac9091c..0000000 --- a/line_chart.go +++ /dev/null @@ -1,131 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -type lineChartOption struct { - Theme string - SeriesList SeriesList - Font *truetype.Font -} - -func lineChartRender(opt lineChartOption, result *basicRenderResult) ([]markPointRenderOption, error) { - - theme := NewTheme(opt.Theme) - - d, err := NewDraw(DrawOption{ - Parent: result.d, - }, PaddingOption(chart.Box{ - Top: result.titleBox.Height(), - Left: YAxisWidth, - })) - if err != nil { - return nil, err - } - seriesNames := opt.SeriesList.Names() - - r := d.Render - xRange := result.xRange - markPointRenderOptions := make([]markPointRenderOption, 0) - for i, s := range opt.SeriesList { - // 由于series是for range,为同一个数据,因此需要clone - // 后续需要使用,如mark point - series := s - index := series.index - if index == 0 { - index = i - } - seriesColor := theme.GetSeriesColor(index) - - yRange := result.getYRange(series.YAxisIndex) - points := make([]Point, 0, len(series.Data)) - // mark line - markLineRender(markLineRenderOption{ - Draw: d, - FillColor: seriesColor, - FontColor: theme.GetTextColor(), - StrokeColor: seriesColor, - Font: opt.Font, - Series: &series, - Range: yRange, - }) - - for j, item := range series.Data { - if j >= xRange.divideCount { - continue - } - y := yRange.getRestHeight(item.Value) - x := xRange.getWidth(float64(j)) - points = append(points, Point{ - Y: y, - X: x, - }) - if !series.Label.Show { - continue - } - distance := series.Label.Distance - if distance == 0 { - distance = 5 - } - text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(i, item.Value, -1) - labelStyle := chart.Style{ - FontColor: theme.GetTextColor(), - FontSize: labelFontSize, - Font: opt.Font, - } - if !series.Label.Color.IsZero() { - labelStyle.FontColor = series.Label.Color - } - labelStyle.GetTextOptions().WriteToRenderer(r) - textBox := r.MeasureText(text) - d.text(text, x-textBox.Width()>>1, y-distance) - } - - dotFillColor := drawing.ColorWhite - if theme.IsDark() { - dotFillColor = seriesColor - } - d.Line(points, LineStyle{ - StrokeColor: seriesColor, - StrokeWidth: 2, - DotColor: seriesColor, - DotWidth: defaultDotWidth, - DotFillColor: dotFillColor, - }) - // draw mark point - markPointRenderOptions = append(markPointRenderOptions, markPointRenderOption{ - Draw: d, - FillColor: seriesColor, - Font: opt.Font, - Points: points, - Series: &series, - }) - } - - return markPointRenderOptions, nil -} diff --git a/line_chart_test.go b/line_chart_test.go deleted file mode 100644 index 9f5d9af..0000000 --- a/line_chart_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestLineChartRender(t *testing.T) { - assert := assert.New(t) - - width := 400 - height := 300 - d, err := NewDraw(DrawOption{ - Width: width, - Height: height, - }) - assert.Nil(err) - - result := basicRenderResult{ - xRange: &Range{ - Min: 0, - Max: 4, - divideCount: 4, - Size: width, - Boundary: true, - }, - yRangeList: []*Range{ - { - divideCount: 6, - Max: 100, - Min: 0, - Size: height, - }, - }, - d: d, - } - f, _ := chart.GetDefaultFont() - _, err = lineChartRender(lineChartOption{ - Font: f, - SeriesList: SeriesList{ - { - Label: SeriesLabel{ - Show: true, - Color: drawing.ColorBlue, - }, - MarkLine: NewMarkLine( - SeriesMarkDataTypeAverage, - ), - Data: []SeriesData{ - { - Value: 20, - }, - { - Value: 60, - }, - { - Value: 90, - }, - }, - }, - NewSeriesFromValues([]float64{ - 40, - 60, - 70, - }), - }, - }, &result) - assert.Nil(err) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n56.66206090", string(data)) -} diff --git a/line_test.go b/line_test.go deleted file mode 100644 index e10b806..0000000 --- a/line_test.go +++ /dev/null @@ -1,165 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestLineStyle(t *testing.T) { - assert := assert.New(t) - - ls := LineStyle{ - ClassName: "test", - StrokeDashArray: []float64{ - 1.0, - }, - StrokeColor: drawing.ColorBlack, - StrokeWidth: 1, - FillColor: drawing.ColorBlack.WithAlpha(60), - DotWidth: 2, - DotColor: drawing.ColorBlack, - DotFillColor: drawing.ColorWhite, - } - - assert.Equal(chart.Style{ - ClassName: "test", - StrokeDashArray: []float64{ - 1.0, - }, - StrokeColor: drawing.ColorBlack, - StrokeWidth: 1, - FillColor: drawing.ColorBlack.WithAlpha(60), - DotWidth: 2, - DotColor: drawing.ColorBlack, - }, ls.Style()) -} - -func TestDrawLineFill(t *testing.T) { - assert := assert.New(t) - - ls := LineStyle{ - StrokeColor: drawing.ColorBlack, - StrokeWidth: 1, - FillColor: drawing.ColorBlack.WithAlpha(60), - DotWidth: 2, - DotColor: drawing.ColorBlack, - DotFillColor: drawing.ColorWhite, - } - d, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - assert.Nil(err) - d.lineFill([]Point{ - { - X: 0, - Y: 0, - }, - { - X: 10, - Y: 20, - }, - { - X: 50, - Y: 60, - }, - }, ls) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n", string(data)) -} - -func TestDrawLineDot(t *testing.T) { - assert := assert.New(t) - - ls := LineStyle{ - StrokeColor: drawing.ColorBlack, - StrokeWidth: 1, - FillColor: drawing.ColorBlack.WithAlpha(60), - DotWidth: 2, - DotColor: drawing.ColorBlack, - DotFillColor: drawing.ColorWhite, - } - d, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - assert.Nil(err) - d.lineDot([]Point{ - { - X: 0, - Y: 0, - }, - { - X: 10, - Y: 20, - }, - { - X: 50, - Y: 60, - }, - }, ls) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n", string(data)) -} - -func TestDrawLine(t *testing.T) { - assert := assert.New(t) - - ls := LineStyle{ - StrokeColor: drawing.ColorBlack, - StrokeWidth: 1, - FillColor: drawing.ColorBlack.WithAlpha(60), - DotWidth: 2, - DotColor: drawing.ColorBlack, - DotFillColor: drawing.ColorWhite, - } - d, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - assert.Nil(err) - d.Line([]Point{ - { - X: 0, - Y: 0, - }, - { - X: 10, - Y: 20, - }, - { - X: 50, - Y: 60, - }, - }, ls) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n", string(data)) -} diff --git a/mark_line.go b/mark_line.go deleted file mode 100644 index 464fe71..0000000 --- a/mark_line.go +++ /dev/null @@ -1,92 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func NewMarkLine(markLineTypes ...string) SeriesMarkLine { - data := make([]SeriesMarkData, len(markLineTypes)) - for index, t := range markLineTypes { - data[index] = SeriesMarkData{ - Type: t, - } - } - return SeriesMarkLine{ - Data: data, - } -} - -type markLineRenderOption struct { - Draw *Draw - FillColor drawing.Color - FontColor drawing.Color - StrokeColor drawing.Color - Font *truetype.Font - Series *Series - Range *Range -} - -func markLineRender(opt markLineRenderOption) { - d := opt.Draw - s := opt.Series - if len(s.MarkLine.Data) == 0 { - return - } - r := d.Render - summary := s.Summary() - for _, markLine := range s.MarkLine.Data { - // 由于mark line会修改style,因此每次重新设置 - chart.Style{ - FillColor: opt.FillColor, - FontColor: opt.FontColor, - FontSize: labelFontSize, - StrokeColor: opt.StrokeColor, - StrokeWidth: 1, - Font: opt.Font, - StrokeDashArray: []float64{ - 4, - 2, - }, - }.WriteToRenderer(r) - value := float64(0) - switch markLine.Type { - case SeriesMarkDataTypeMax: - value = summary.MaxValue - case SeriesMarkDataTypeMin: - value = summary.MinValue - default: - value = summary.AverageValue - } - y := opt.Range.getRestHeight(value) - width := d.Box.Width() - text := commafWithDigits(value) - textBox := r.MeasureText(text) - d.makeLine(0, y, width-2) - d.text(text, width, y+textBox.Height()>>1-2) - } - -} diff --git a/mark_line_test.go b/mark_line_test.go deleted file mode 100644 index abb3308..0000000 --- a/mark_line_test.go +++ /dev/null @@ -1,99 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestNewMarkLine(t *testing.T) { - assert := assert.New(t) - - markLine := NewMarkLine( - SeriesMarkDataTypeMax, - SeriesMarkDataTypeMin, - SeriesMarkDataTypeAverage, - ) - - assert.Equal(SeriesMarkLine{ - Data: []SeriesMarkData{ - { - Type: SeriesMarkDataTypeMax, - }, - { - Type: SeriesMarkDataTypeMin, - }, - { - Type: SeriesMarkDataTypeAverage, - }, - }, - }, markLine) -} - -func TestMarkLineRender(t *testing.T) { - assert := assert.New(t) - - d, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }, PaddingOption(chart.Box{ - Left: 20, - Right: 20, - })) - assert.Nil(err) - f, _ := chart.GetDefaultFont() - - markLineRender(markLineRenderOption{ - Draw: d, - FillColor: drawing.ColorBlack, - FontColor: drawing.ColorBlack, - StrokeColor: drawing.ColorBlack, - Font: f, - Series: &Series{ - MarkLine: NewMarkLine( - SeriesMarkDataTypeMax, - SeriesMarkDataTypeMin, - SeriesMarkDataTypeAverage, - ), - Data: NewSeriesDataFromValues([]float64{ - 1, - 3, - 5, - 7, - 9, - }), - }, - Range: &Range{ - Min: 0, - Max: 10, - Size: 200, - }, - }) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n915", string(data)) -} diff --git a/mark_point.go b/mark_point.go deleted file mode 100644 index 5fd34c4..0000000 --- a/mark_point.go +++ /dev/null @@ -1,89 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func NewMarkPoint(markPointTypes ...string) SeriesMarkPoint { - data := make([]SeriesMarkData, len(markPointTypes)) - for index, t := range markPointTypes { - data[index] = SeriesMarkData{ - Type: t, - } - } - return SeriesMarkPoint{ - Data: data, - } -} - -type markPointRenderOption struct { - Draw *Draw - FillColor drawing.Color - Font *truetype.Font - Series *Series - Points []Point -} - -func markPointRender(opt markPointRenderOption) { - d := opt.Draw - s := opt.Series - if len(s.MarkPoint.Data) == 0 { - return - } - points := opt.Points - summary := s.Summary() - symbolSize := s.MarkPoint.SymbolSize - if symbolSize == 0 { - symbolSize = 30 - } - r := d.Render - // 设置填充样式 - chart.Style{ - FillColor: opt.FillColor, - }.WriteToRenderer(r) - // 设置文本样式 - chart.Style{ - FontColor: NewTheme(ThemeDark).GetTextColor(), - FontSize: labelFontSize, - StrokeWidth: 1, - Font: opt.Font, - }.WriteTextOptionsToRenderer(r) - for _, markPointData := range s.MarkPoint.Data { - p := points[summary.MinIndex] - value := summary.MinValue - switch markPointData.Type { - case SeriesMarkDataTypeMax: - p = points[summary.MaxIndex] - value = summary.MaxValue - } - - d.pin(p.X, p.Y-symbolSize>>1, symbolSize) - text := commafWithDigits(value) - textBox := r.MeasureText(text) - d.text(text, p.X-textBox.Width()>>1, p.Y-symbolSize>>1-2) - } -} diff --git a/mark_point_test.go b/mark_point_test.go deleted file mode 100644 index 2cd8fdd..0000000 --- a/mark_point_test.go +++ /dev/null @@ -1,103 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestNewMarkPoint(t *testing.T) { - assert := assert.New(t) - - markPoint := NewMarkPoint( - SeriesMarkDataTypeMax, - SeriesMarkDataTypeMin, - SeriesMarkDataTypeAverage, - ) - - assert.Equal(SeriesMarkPoint{ - Data: []SeriesMarkData{ - { - Type: SeriesMarkDataTypeMax, - }, - { - Type: SeriesMarkDataTypeMin, - }, - { - Type: SeriesMarkDataTypeAverage, - }, - }, - }, markPoint) -} - -func TestMarkPointRender(t *testing.T) { - assert := assert.New(t) - - d, err := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }, PaddingOption(chart.Box{ - Left: 20, - Right: 20, - })) - assert.Nil(err) - f, _ := chart.GetDefaultFont() - - markPointRender(markPointRenderOption{ - Draw: d, - FillColor: drawing.ColorBlack, - Font: f, - Series: &Series{ - MarkPoint: NewMarkPoint( - SeriesMarkDataTypeMax, - SeriesMarkDataTypeMin, - ), - Data: NewSeriesDataFromValues([]float64{ - 1, - 3, - 5, - }), - }, - Points: []Point{ - { - X: 1, - Y: 50, - }, - { - X: 100, - Y: 100, - }, - { - X: 200, - Y: 200, - }, - }, - }) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\n51", string(data)) -} diff --git a/painter.go b/painter.go index 639371e..d762e86 100644 --- a/painter.go +++ b/painter.go @@ -135,6 +135,8 @@ func NewPainter(opts PainterOptions, opt ...PainterOption) (*Painter, error) { if err != nil { return nil, err } + r.SetFont(font) + p := &Painter{ render: r, box: Box{ @@ -167,6 +169,9 @@ func (p *Painter) Child(opt ...PainterOption) *Painter { } func (p *Painter) SetStyle(style Style) { + if style.Font == nil { + style.Font = p.font + } p.previousStyle = p.style p.style = style style.WriteToRenderer(p.render) @@ -179,6 +184,9 @@ func (p *Painter) SetDrawingStyle(style Style) { } func (p *Painter) SetTextStyle(style Style) { + if style.Font == nil { + style.Font = p.font + } p.previousStyle = p.style p.style = style style.WriteTextOptionsToRenderer(p.render) diff --git a/painter_test.go b/painter_test.go index 425dbbe..1cc08be 100644 --- a/painter_test.go +++ b/painter_test.go @@ -94,7 +94,7 @@ func TestPainter(t *testing.T) { fn: func(p *Painter) { p.Text("hello world!", 3, 6) }, - result: "\\nhello world!", + result: "\\nhello world!", }, // line stroke { diff --git a/pie_chart.go b/pie_chart.go deleted file mode 100644 index 099a91c..0000000 --- a/pie_chart.go +++ /dev/null @@ -1,159 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "errors" - "math" - - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" -) - -func getPieStyle(theme *Theme, index int) chart.Style { - seriesColor := theme.GetSeriesColor(index) - return chart.Style{ - StrokeColor: seriesColor, - StrokeWidth: 1, - FillColor: seriesColor, - } -} - -type pieChartOption struct { - Theme string - Font *truetype.Font - SeriesList SeriesList -} - -func pieChartRender(opt pieChartOption, result *basicRenderResult) error { - d, err := NewDraw(DrawOption{ - Parent: result.d, - }, PaddingOption(chart.Box{ - Top: result.titleBox.Height(), - })) - if err != nil { - return err - } - - values := make([]float64, len(opt.SeriesList)) - total := float64(0) - radiusValue := "" - for index, series := range opt.SeriesList { - if len(series.Radius) != 0 { - radiusValue = series.Radius - } - value := float64(0) - for _, item := range series.Data { - value += item.Value - } - values[index] = value - total += value - } - if total <= 0 { - return errors.New("The sum value of pie chart should gt 0") - } - r := d.Render - theme := NewTheme(opt.Theme) - - box := d.Box - cx := box.Width() >> 1 - cy := box.Height() >> 1 - - diameter := chart.MinInt(box.Width(), box.Height()) - radius := getRadius(float64(diameter), radiusValue) - - labelLineWidth := 15 - if radius < 50 { - labelLineWidth = 10 - } - labelRadius := radius + float64(labelLineWidth) - - seriesNames := opt.SeriesList.Names() - - if len(values) == 1 { - getPieStyle(theme, 0).WriteToRenderer(r) - d.moveTo(cx, cy) - d.circle(radius, cx, cy) - } else { - currentValue := float64(0) - for index, v := range values { - - pieStyle := getPieStyle(theme, index) - pieStyle.WriteToRenderer(r) - d.moveTo(cx, cy) - start := chart.PercentToRadians(currentValue/total) - math.Pi/2 - currentValue += v - percent := (v / total) - delta := chart.PercentToRadians(percent) - d.arcTo(cx, cy, radius, radius, start, delta) - d.lineTo(cx, cy) - r.Close() - r.FillStroke() - - series := opt.SeriesList[index] - // 是否显示label - showLabel := series.Label.Show - if !showLabel { - continue - } - - // label的角度为饼块中间 - angle := start + delta/2 - startx := cx + int(radius*math.Cos(angle)) - starty := cy + int(radius*math.Sin(angle)) - - endx := cx + int(labelRadius*math.Cos(angle)) - endy := cy + int(labelRadius*math.Sin(angle)) - d.moveTo(startx, starty) - d.lineTo(endx, endy) - offset := labelLineWidth - if endx < cx { - offset *= -1 - } - d.moveTo(endx, endy) - endx += offset - d.lineTo(endx, endy) - r.Stroke() - textStyle := chart.Style{ - FontColor: theme.GetTextColor(), - FontSize: labelFontSize, - Font: opt.Font, - } - if !series.Label.Color.IsZero() { - textStyle.FontColor = series.Label.Color - } - textStyle.GetTextOptions().WriteToRenderer(r) - text := NewPieLabelFormatter(seriesNames, series.Label.Formatter)(index, v, percent) - textBox := r.MeasureText(text) - textMargin := 3 - x := endx + textMargin - y := endy + textBox.Height()>>1 - 1 - if offset < 0 { - textWidth := textBox.Width() - x = endx - textWidth - textMargin - } - d.text(text, x, y) - } - } - return nil -} diff --git a/pie_chart_test.go b/pie_chart_test.go deleted file mode 100644 index 84072be..0000000 --- a/pie_chart_test.go +++ /dev/null @@ -1,69 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestPieChartRender(t *testing.T) { - assert := assert.New(t) - - d, err := NewDraw(DrawOption{ - Width: 250, - Height: 150, - }) - assert.Nil(err) - - f, _ := chart.GetDefaultFont() - - err = pieChartRender(pieChartOption{ - Font: f, - SeriesList: NewPieSeriesList([]float64{ - 5, - 10, - 0, - }, PieSeriesOption{ - Names: []string{ - "a", - "b", - "c", - }, - Label: SeriesLabel{ - Show: true, - Color: drawing.ColorRed, - }, - Radius: "20%", - }), - }, &basicRenderResult{ - d: d, - }) - assert.Nil(err) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\na: 33.33%b: 66.66%c: 0%", string(data)) -} diff --git a/radar_chart.go b/radar_chart.go deleted file mode 100644 index 364213d..0000000 --- a/radar_chart.go +++ /dev/null @@ -1,193 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "errors" - - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -type RadarIndicator struct { - // Indicator's name - Name string - // The maximum value of indicator - Max float64 - // The minimum value of indicator - Min float64 -} - -type radarChartOption struct { - Theme string - Font *truetype.Font - SeriesList SeriesList - Indicators []RadarIndicator -} - -func radarChartRender(opt radarChartOption, result *basicRenderResult) error { - sides := len(opt.Indicators) - if sides < 3 { - return errors.New("The count of indicator should be >= 3") - } - maxValues := make([]float64, len(opt.Indicators)) - for _, series := range opt.SeriesList { - for index, item := range series.Data { - if index < len(maxValues) && item.Value > maxValues[index] { - maxValues[index] = item.Value - } - } - } - for index, indicator := range opt.Indicators { - if indicator.Max <= 0 { - opt.Indicators[index].Max = maxValues[index] - } - } - d, err := NewDraw(DrawOption{ - Parent: result.d, - }, PaddingOption(chart.Box{ - Top: result.titleBox.Height(), - })) - if err != nil { - return err - } - radiusValue := "" - for _, series := range opt.SeriesList { - if len(series.Radius) != 0 { - radiusValue = series.Radius - } - } - - box := d.Box - cx := box.Width() >> 1 - cy := box.Height() >> 1 - diameter := chart.MinInt(box.Width(), box.Height()) - radius := getRadius(float64(diameter), radiusValue) - - theme := NewTheme(opt.Theme) - - divideCount := 5 - divideRadius := float64(int(radius / float64(divideCount))) - radius = divideRadius * float64(divideCount) - - style := chart.Style{ - StrokeColor: theme.GetAxisSplitLineColor(), - StrokeWidth: 1, - } - r := d.Render - style.WriteToRenderer(r) - center := Point{ - X: cx, - Y: cy, - } - for i := 0; i < divideCount; i++ { - d.polygon(center, divideRadius*float64(i+1), sides) - } - points := getPolygonPoints(center, radius, sides) - for _, p := range points { - d.moveTo(center.X, center.Y) - d.lineTo(p.X, p.Y) - d.Render.Stroke() - } - // 文本 - textStyle := chart.Style{ - FontColor: theme.GetTextColor(), - FontSize: labelFontSize, - Font: opt.Font, - } - textStyle.GetTextOptions().WriteToRenderer(r) - offset := 5 - // 文本生成 - for index, p := range points { - name := opt.Indicators[index].Name - b := r.MeasureText(name) - isXCenter := p.X == center.X - isYCenter := p.Y == center.Y - isRight := p.X > center.X - isLeft := p.X < center.X - isTop := p.Y < center.Y - isBottom := p.Y > center.Y - x := p.X - y := p.Y - if isXCenter { - x -= b.Width() >> 1 - if isTop { - y -= b.Height() - } else { - y += b.Height() - } - } - if isYCenter { - y += b.Height() >> 1 - } - if isTop { - y += offset - } - if isBottom { - y += offset - } - if isRight { - x += offset - } - if isLeft { - x -= (b.Width() + offset) - } - d.text(name, x, y) - } - - // 雷达图 - angles := getPolygonPointAngles(sides) - maxCount := len(opt.Indicators) - for _, series := range opt.SeriesList { - linePoints := make([]Point, 0, maxCount) - for j, item := range series.Data { - if j >= maxCount { - continue - } - indicator := opt.Indicators[j] - percent := (item.Value - indicator.Min) / (indicator.Max - indicator.Min) - r := percent * radius - p := getPolygonPoint(center, r, angles[j]) - linePoints = append(linePoints, p) - } - color := theme.GetSeriesColor(series.index) - dotFillColor := drawing.ColorWhite - if theme.IsDark() { - dotFillColor = color - } - linePoints = append(linePoints, linePoints[0]) - s := LineStyle{ - StrokeColor: color, - StrokeWidth: defaultStrokeWidth, - DotWidth: defaultDotWidth, - DotColor: color, - DotFillColor: dotFillColor, - FillColor: color.WithAlpha(20), - } - d.lineStroke(linePoints, s) - d.fill(linePoints, s.Style()) - d.lineDot(linePoints[0:len(linePoints)-1], s) - } - return nil -} diff --git a/radar_chart_test.go b/radar_chart_test.go deleted file mode 100644 index c5d2aa9..0000000 --- a/radar_chart_test.go +++ /dev/null @@ -1,102 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" -) - -func TestRadarChartRender(t *testing.T) { - assert := assert.New(t) - - d, err := NewDraw(DrawOption{ - Width: 250, - Height: 150, - }) - assert.Nil(err) - - f, _ := chart.GetDefaultFont() - err = radarChartRender(radarChartOption{ - Font: f, - Indicators: []RadarIndicator{ - { - Name: "Sales", - Max: 6500, - }, - { - Name: "Administration", - Max: 16000, - }, - { - Name: "Information Technology", - Max: 30000, - }, - { - Name: "Customer Support", - Max: 38000, - }, - { - Name: "Development", - Max: 52000, - }, - { - Name: "Marketing", - Max: 25000, - }, - }, - SeriesList: SeriesList{ - { - Type: ChartTypeRadar, - Data: NewSeriesDataFromValues([]float64{ - 4200, - 3000, - 20000, - 35000, - 50000, - 18000, - }), - }, - { - Type: ChartTypeRadar, - index: 1, - Data: NewSeriesDataFromValues([]float64{ - 5000, - 14000, - 28000, - 26000, - 42000, - 21000, - }), - }, - }, - }, &basicRenderResult{ - d: d, - }) - assert.Nil(err) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal("\\nSalesAdministrationInformation TechnologyCustomer SupportDevelopmentMarketing", string(data)) -} diff --git a/range.go b/range.go deleted file mode 100644 index 255a51b..0000000 --- a/range.go +++ /dev/null @@ -1,109 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "math" -) - -type Range struct { - divideCount int - Min float64 - Max float64 - Size int - Boundary bool -} - -func NewRange(min, max float64, divideCount int) Range { - r := math.Abs(max - min) - - // 最小单位计算 - unit := 2 - if r > 10 { - unit = 4 - } - if r > 30 { - unit = 5 - } - if r > 100 { - unit = 10 - } - if r > 200 { - unit = 20 - } - unit = int((r/float64(divideCount))/float64(unit))*unit + unit - - if min != 0 { - isLessThanZero := min < 0 - min = float64(int(min/float64(unit)) * unit) - // 如果是小于0,int的时候向上取整了,因此调整 - if min < 0 || - (isLessThanZero && min == 0) { - min -= float64(unit) - } - } - max = min + float64(unit*divideCount) - return Range{ - Min: min, - Max: max, - divideCount: divideCount, - } -} - -func (r Range) Values() []string { - offset := (r.Max - r.Min) / float64(r.divideCount) - values := make([]string, 0) - for i := 0; i <= r.divideCount; i++ { - v := r.Min + float64(i)*offset - value := commafWithDigits(v) - values = append(values, value) - } - return values -} - -func (r *Range) getHeight(value float64) int { - v := (value - r.Min) / (r.Max - r.Min) - return int(v * float64(r.Size)) -} - -func (r *Range) getRestHeight(value float64) int { - return r.Size - r.getHeight(value) -} - -func (r *Range) GetRange(index int) (float64, float64) { - unit := float64(r.Size) / float64(r.divideCount) - return unit * float64(index), unit * float64(index+1) -} -func (r *Range) AutoDivide() []int { - return autoDivide(r.Size, r.divideCount) -} - -func (r *Range) getWidth(value float64) int { - v := value / (r.Max - r.Min) - // 移至居中 - if r.Boundary && - r.divideCount != 0 { - v += 1 / float64(r.divideCount*2) - } - return int(v * float64(r.Size)) -} diff --git a/range_test.go b/range_test.go deleted file mode 100644 index d1aea8f..0000000 --- a/range_test.go +++ /dev/null @@ -1,94 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestRange(t *testing.T) { - assert := assert.New(t) - - r := NewRange(0, 8, 6) - assert.Equal(0.0, r.Min) - assert.Equal(12.0, r.Max) - - r = NewRange(0, 12, 6) - assert.Equal(0.0, r.Min) - assert.Equal(24.0, r.Max) - - r = NewRange(-13, 18, 6) - assert.Equal(-20.0, r.Min) - assert.Equal(40.0, r.Max) - - r = NewRange(0, 150, 6) - assert.Equal(0.0, r.Min) - assert.Equal(180.0, r.Max) - - r = NewRange(0, 400, 6) - assert.Equal(0.0, r.Min) - assert.Equal(480.0, r.Max) -} - -func TestRangeHeightWidth(t *testing.T) { - assert := assert.New(t) - r := NewRange(0, 8, 6) - r.Size = 100 - - assert.Equal(33, r.getHeight(4)) - assert.Equal(67, r.getRestHeight(4)) - - assert.Equal(33, r.getWidth(4)) - r.Boundary = true - assert.Equal(41, r.getWidth(4)) -} - -func TestRangeGetRange(t *testing.T) { - assert := assert.New(t) - r := NewRange(0, 8, 6) - r.Size = 120 - - f1, f2 := r.GetRange(0) - assert.Equal(0.0, f1) - assert.Equal(20.0, f2) - - f1, f2 = r.GetRange(2) - assert.Equal(40.0, f1) - assert.Equal(60.0, f2) -} - -func TestRangeAutoDivide(t *testing.T) { - assert := assert.New(t) - - r := Range{ - Size: 120, - divideCount: 6, - } - - assert.Equal([]int{0, 20, 40, 60, 80, 100, 120}, r.AutoDivide()) - - r.Size = 130 - assert.Equal([]int{0, 22, 44, 66, 88, 109, 130}, r.AutoDivide()) -} diff --git a/series.go b/series.go deleted file mode 100644 index 14227d1..0000000 --- a/series.go +++ /dev/null @@ -1,233 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "math" - "strings" - - "github.com/dustin/go-humanize" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -type SeriesData struct { - // The value of series data - Value float64 - // The style of series data - Style chart.Style -} - -func NewSeriesFromValues(values []float64, chartType ...string) Series { - s := Series{ - Data: NewSeriesDataFromValues(values), - } - if len(chartType) != 0 { - s.Type = chartType[0] - } - return s -} - -func NewSeriesDataFromValues(values []float64) []SeriesData { - data := make([]SeriesData, len(values)) - for index, value := range values { - data[index] = SeriesData{ - Value: value, - } - } - return data -} - -type SeriesLabel struct { - // Data label formatter, which supports string template. - // {b}: the name of a data item. - // {c}: the value of a data item. - // {d}: the percent of a data item(pie chart). - Formatter string - // The color for label - Color drawing.Color - // Show flag for label - Show bool - // Distance to the host graphic element. - Distance int -} - -const ( - SeriesMarkDataTypeMax = "max" - SeriesMarkDataTypeMin = "min" - SeriesMarkDataTypeAverage = "average" -) - -type SeriesMarkData struct { - // The mark data type, it can be "max", "min", "average". - // The "average" is only for mark line - Type string -} -type SeriesMarkPoint struct { - // The width of symbol, default value is 30 - SymbolSize int - // The mark data of series mark point - Data []SeriesMarkData -} -type SeriesMarkLine struct { - // The mark data of series mark line - Data []SeriesMarkData -} -type Series struct { - index int - // The type of series, it can be "line", "bar" or "pie". - // Default value is "line" - Type string - // The data list of series - Data []SeriesData - // The Y axis index, it should be 0 or 1. - // Default value is 1 - YAxisIndex int - // The style for series - Style chart.Style - // The label for series - Label SeriesLabel - // The name of series - Name string - // Radius for Pie chart, e.g.: 40%, default is "40%" - Radius string - // Mark point for series - MarkPoint SeriesMarkPoint - // Make line for series - MarkLine SeriesMarkLine - // Max value of series - Min *float64 - // Min value of series - Max *float64 -} -type SeriesList []Series - -type PieSeriesOption struct { - Radius string - Label SeriesLabel - Names []string -} - -func NewPieSeriesList(values []float64, opts ...PieSeriesOption) SeriesList { - result := make([]Series, len(values)) - var opt PieSeriesOption - if len(opts) != 0 { - opt = opts[0] - } - for index, v := range values { - name := "" - if index < len(opt.Names) { - name = opt.Names[index] - } - s := Series{ - Type: ChartTypePie, - Data: []SeriesData{ - { - Value: v, - }, - }, - Radius: opt.Radius, - Label: opt.Label, - Name: name, - } - result[index] = s - } - return result -} - -type seriesSummary struct { - MaxIndex int - MaxValue float64 - MinIndex int - MinValue float64 - AverageValue float64 -} - -func (s *Series) Summary() seriesSummary { - minIndex := -1 - maxIndex := -1 - minValue := math.MaxFloat64 - maxValue := -math.MaxFloat64 - sum := float64(0) - for j, item := range s.Data { - if item.Value < minValue { - minIndex = j - minValue = item.Value - } - if item.Value > maxValue { - maxIndex = j - maxValue = item.Value - } - sum += item.Value - } - return seriesSummary{ - MaxIndex: maxIndex, - MaxValue: maxValue, - MinIndex: minIndex, - MinValue: minValue, - AverageValue: sum / float64(len(s.Data)), - } -} - -func (sl SeriesList) Names() []string { - names := make([]string, len(sl)) - for index, s := range sl { - names[index] = s.Name - } - return names -} - -type LabelFormatter func(index int, value float64, percent float64) string - -func NewPieLabelFormatter(seriesNames []string, layout string) LabelFormatter { - if len(layout) == 0 { - layout = "{b}: {d}" - } - return NewLabelFormatter(seriesNames, layout) -} - -func NewValueLabelFormater(seriesNames []string, layout string) LabelFormatter { - if len(layout) == 0 { - layout = "{c}" - } - return NewLabelFormatter(seriesNames, layout) -} - -func NewLabelFormatter(seriesNames []string, layout string) LabelFormatter { - return func(index int, value, percent float64) string { - // 如果无percent的则设置为<0 - percentText := "" - if percent >= 0 { - percentText = humanize.FtoaWithDigits(percent*100, 2) + "%" - } - valueText := humanize.FtoaWithDigits(value, 2) - name := "" - if len(seriesNames) > index { - name = seriesNames[index] - } - text := strings.ReplaceAll(layout, "{c}", valueText) - text = strings.ReplaceAll(text, "{d}", percentText) - text = strings.ReplaceAll(text, "{b}", name) - return text - } -} diff --git a/series_test.go b/series_test.go deleted file mode 100644 index 1460180..0000000 --- a/series_test.go +++ /dev/null @@ -1,166 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestNewSeriesFromValues(t *testing.T) { - assert := assert.New(t) - - assert.Equal(Series{ - Data: []SeriesData{ - { - Value: 1, - }, - { - Value: 2, - }, - }, - Type: ChartTypeBar, - }, NewSeriesFromValues([]float64{ - 1, - 2, - }, ChartTypeBar)) -} - -func TestNewSeriesDataFromValues(t *testing.T) { - assert := assert.New(t) - - assert.Equal([]SeriesData{ - { - Value: 1, - }, - { - Value: 2, - }, - }, NewSeriesDataFromValues([]float64{ - 1, - 2, - })) -} - -func TestNewPieSeriesList(t *testing.T) { - assert := assert.New(t) - - assert.Equal(SeriesList{ - { - Type: ChartTypePie, - Name: "a", - Label: SeriesLabel{ - Show: true, - }, - Radius: "30%", - Data: []SeriesData{ - { - Value: 1, - }, - }, - }, - { - Type: ChartTypePie, - Name: "b", - Label: SeriesLabel{ - Show: true, - }, - Radius: "30%", - Data: []SeriesData{ - { - Value: 2, - }, - }, - }, - }, NewPieSeriesList([]float64{ - 1, - 2, - }, PieSeriesOption{ - Radius: "30%", - Label: SeriesLabel{ - Show: true, - }, - Names: []string{ - "a", - "b", - }, - })) -} - -func TestSeriesSummary(t *testing.T) { - assert := assert.New(t) - - s := Series{ - Data: NewSeriesDataFromValues([]float64{ - 1, - 3, - 5, - 7, - 9, - }), - } - assert.Equal(seriesSummary{ - MaxIndex: 4, - MaxValue: 9, - MinIndex: 0, - MinValue: 1, - AverageValue: 5, - }, s.Summary()) -} - -func TestGetSeriesNames(t *testing.T) { - assert := assert.New(t) - - sl := SeriesList{ - { - Name: "a", - }, - { - Name: "b", - }, - } - assert.Equal([]string{ - "a", - "b", - }, sl.Names()) -} - -func TestNewPieLabelFormatter(t *testing.T) { - assert := assert.New(t) - - fn := NewPieLabelFormatter([]string{ - "a", - "b", - }, "") - assert.Equal("a: 35%", fn(0, 1.2, 0.35)) -} - -func TestNewValueLabelFormater(t *testing.T) { - assert := assert.New(t) - fn := NewValueLabelFormater([]string{ - "a", - "b", - }, "") - assert.Equal("1.2", fn(0, 1.2, 0.35)) -} diff --git a/table.go b/table.go deleted file mode 100644 index 9cfc6b1..0000000 --- a/table.go +++ /dev/null @@ -1,145 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "errors" - - "github.com/wcharczuk/go-chart/v2" -) - -type TableOption struct { - // draw - Draw *Draw - // The width of table - Width int - // The header of table - Header []string - // The style of table - Style chart.Style - ColumnWidths []float64 - // 是否仅测量高度 - measurement bool -} - -var ErrTableColumnWidthInvalid = errors.New("table column width is invalid") - -func tableDivideWidth(width, size int, columnWidths []float64) ([]int, error) { - widths := make([]int, size) - - autoFillCount := size - restWidth := width - if len(columnWidths) != 0 { - for index, v := range columnWidths { - if v <= 0 { - continue - } - autoFillCount-- - // 小于1的表示占比 - if v < 1 { - widths[index] = int(v * float64(width)) - } else { - widths[index] = int(v) - } - restWidth -= widths[index] - } - } - if restWidth < 0 { - return nil, ErrTableColumnWidthInvalid - } - // 填充其它未指定的宽度 - if autoFillCount > 0 { - autoWidth := restWidth / autoFillCount - for index, v := range widths { - if v == 0 { - widths[index] = autoWidth - } - } - } - widthSum := 0 - for _, v := range widths { - widthSum += v - } - if widthSum > width { - return nil, ErrTableColumnWidthInvalid - } - return widths, nil -} - -func TableMeasure(opt TableOption) (chart.Box, error) { - d, err := NewDraw(DrawOption{ - Width: opt.Width, - Height: 600, - }) - if err != nil { - return chart.BoxZero, err - } - opt.Draw = d - opt.measurement = true - return tableRender(opt) -} - -func tableRender(opt TableOption) (chart.Box, error) { - if opt.Draw == nil { - return chart.BoxZero, errors.New("draw can not be nil") - } - if len(opt.Header) == 0 { - return chart.BoxZero, errors.New("header can not be nil") - } - width := opt.Width - if width == 0 { - width = opt.Draw.Box.Width() - } - - columnWidths, err := tableDivideWidth(width, len(opt.Header), opt.ColumnWidths) - if err != nil { - return chart.BoxZero, err - } - - d := opt.Draw - style := opt.Style - y := 0 - x := 0 - - headerMaxHeight := 0 - for index, text := range opt.Header { - var box chart.Box - w := columnWidths[index] - y0 := y + int(opt.Style.FontSize) - if opt.measurement { - box = d.measureTextFit(text, x, y0, w, style) - } else { - box = d.textFit(text, x, y0, w, style) - } - if box.Height() > headerMaxHeight { - headerMaxHeight = box.Height() - } - x += w - } - y += headerMaxHeight - - return chart.Box{ - Right: width, - Bottom: y, - }, nil -} diff --git a/theme.go b/theme.go index e3f9773..88c73df 100644 --- a/theme.go +++ b/theme.go @@ -22,10 +22,6 @@ package charts -import ( - "github.com/wcharczuk/go-chart/v2/drawing" -) - const ThemeDark = "dark" const ThemeLight = "light" const ThemeGrafana = "grafana" @@ -37,198 +33,9 @@ type Theme struct { type themeColorPalette struct { isDarkMode bool - axisStrokeColor drawing.Color - axisSplitLineColor drawing.Color - backgroundColor drawing.Color - textColor drawing.Color - seriesColors []drawing.Color -} - -var palettes = map[string]*themeColorPalette{} - -func init() { - echartSeriesColors := []drawing.Color{ - parseColor("#5470c6"), - parseColor("#91cc75"), - parseColor("#fac858"), - parseColor("#ee6666"), - parseColor("#73c0de"), - parseColor("#3ba272"), - parseColor("#fc8452"), - parseColor("#9a60b4"), - parseColor("#ea7ccc"), - } - grafanaSeriesColors := []drawing.Color{ - parseColor("#7EB26D"), - parseColor("#EAB839"), - parseColor("#6ED0E0"), - parseColor("#EF843C"), - parseColor("#E24D42"), - parseColor("#1F78C1"), - parseColor("#705DA0"), - parseColor("#508642"), - } - antSeriesColors := []drawing.Color{ - parseColor("#5b8ff9"), - parseColor("#5ad8a6"), - parseColor("#5d7092"), - parseColor("#f6bd16"), - parseColor("#6f5ef9"), - parseColor("#6dc8ec"), - parseColor("#945fb9"), - parseColor("#ff9845"), - } - AddTheme( - ThemeDark, - true, - drawing.Color{ - R: 185, - G: 184, - B: 206, - A: 255, - }, - drawing.Color{ - R: 72, - G: 71, - B: 83, - A: 255, - }, - drawing.Color{ - R: 16, - G: 12, - B: 42, - A: 255, - }, - drawing.Color{ - R: 238, - G: 238, - B: 238, - A: 255, - }, - echartSeriesColors, - ) - - AddTheme( - ThemeLight, - false, - drawing.Color{ - R: 110, - G: 112, - B: 121, - A: 255, - }, - drawing.Color{ - R: 224, - G: 230, - B: 242, - A: 255, - }, - drawing.ColorWhite, - drawing.Color{ - R: 70, - G: 70, - B: 70, - A: 255, - }, - echartSeriesColors, - ) - AddTheme( - ThemeAnt, - false, - drawing.Color{ - R: 110, - G: 112, - B: 121, - A: 255, - }, - drawing.Color{ - R: 224, - G: 230, - B: 242, - A: 255, - }, - drawing.ColorWhite, - drawing.Color{ - R: 70, - G: 70, - B: 70, - A: 255, - }, - antSeriesColors, - ) - AddTheme( - ThemeGrafana, - true, - drawing.Color{ - R: 185, - G: 184, - B: 206, - A: 255, - }, - drawing.Color{ - R: 68, - G: 67, - B: 67, - A: 255, - }, - drawing.Color{ - R: 31, - G: 29, - B: 29, - A: 255, - }, - drawing.Color{ - R: 216, - G: 217, - B: 218, - A: 255, - }, - grafanaSeriesColors, - ) -} - -func AddTheme(name string, isDarkMode bool, axisStrokeColor, axisSplitLineColor, backgroundColor, textColor drawing.Color, seriesColors []drawing.Color) { - palettes[name] = &themeColorPalette{ - isDarkMode: isDarkMode, - axisStrokeColor: axisStrokeColor, - axisSplitLineColor: axisSplitLineColor, - backgroundColor: backgroundColor, - textColor: textColor, - seriesColors: seriesColors, - } -} - -func NewTheme(name string) *Theme { - p, ok := palettes[name] - if !ok { - p = palettes[ThemeLight] - } - return &Theme{ - palette: p, - } -} - -func (t *Theme) IsDark() bool { - return t.palette.isDarkMode -} - -func (t *Theme) GetAxisStrokeColor() drawing.Color { - return t.palette.axisStrokeColor -} - -func (t *Theme) GetAxisSplitLineColor() drawing.Color { - return t.palette.axisSplitLineColor -} - -func (t *Theme) GetSeriesColor(index int) drawing.Color { - colors := t.palette.seriesColors - return colors[index%len(colors)] -} - -func (t *Theme) GetBackgroundColor() drawing.Color { - return t.palette.backgroundColor -} - -func (t *Theme) GetTextColor() drawing.Color { - return t.palette.textColor + axisStrokeColor Color + axisSplitLineColor Color + backgroundColor Color + textColor Color + seriesColors []Color } diff --git a/theme_test.go b/theme_test.go deleted file mode 100644 index bf22afd..0000000 --- a/theme_test.go +++ /dev/null @@ -1,87 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestTheme(t *testing.T) { - assert := assert.New(t) - - darkTheme := NewTheme(ThemeDark) - lightTheme := NewTheme(ThemeLight) - - assert.True(darkTheme.IsDark()) - assert.False(lightTheme.IsDark()) - - assert.Equal(drawing.Color{ - R: 185, - G: 184, - B: 206, - A: 255, - }, darkTheme.GetAxisStrokeColor()) - assert.Equal(drawing.Color{ - R: 110, - G: 112, - B: 121, - A: 255, - }, lightTheme.GetAxisStrokeColor()) - - assert.Equal(drawing.Color{ - R: 72, - G: 71, - B: 83, - A: 255, - }, darkTheme.GetAxisSplitLineColor()) - assert.Equal(drawing.Color{ - R: 224, - G: 230, - B: 242, - A: 255, - }, lightTheme.GetAxisSplitLineColor()) - - assert.Equal(drawing.Color{ - R: 16, - G: 12, - B: 42, - A: 255, - }, darkTheme.GetBackgroundColor()) - assert.Equal(drawing.ColorWhite, lightTheme.GetBackgroundColor()) - - assert.Equal(drawing.Color{ - R: 238, - G: 238, - B: 238, - A: 255, - }, darkTheme.GetTextColor()) - assert.Equal(drawing.Color{ - R: 70, - G: 70, - B: 70, - A: 255, - }, lightTheme.GetTextColor()) -} diff --git a/title.go b/title.go deleted file mode 100644 index 07a2eef..0000000 --- a/title.go +++ /dev/null @@ -1,155 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "strconv" - "strings" - - "github.com/wcharczuk/go-chart/v2" -) - -type TitleOption struct { - // Title text, support \n for new line - Text string - // Subtitle text, support \n for new line - Subtext string - // Title style - Style chart.Style - // Subtitle style - SubtextStyle chart.Style - // Distance between title component and the left side of the container. - // It can be pixel value: 20, percentage value: 20%, - // or position value: right, center. - Left string - // Distance between title component and the top side of the container. - // It can be pixel value: 20. - Top string -} -type titleMeasureOption struct { - width int - height int - text string - style chart.Style -} - -func splitTitleText(text string) []string { - arr := strings.Split(text, "\n") - result := make([]string, 0) - for _, v := range arr { - v = strings.TrimSpace(v) - if v == "" { - continue - } - result = append(result, v) - } - return result -} - -func drawTitle(p *Draw, opt *TitleOption) (chart.Box, error) { - if len(opt.Text) == 0 { - return chart.BoxZero, nil - } - - padding := opt.Style.Padding - d, err := NewDraw(DrawOption{ - Parent: p, - }, PaddingOption(padding)) - if err != nil { - return chart.BoxZero, err - } - - r := d.Render - - measureOptions := make([]titleMeasureOption, 0) - - // 主标题 - for _, v := range splitTitleText(opt.Text) { - measureOptions = append(measureOptions, titleMeasureOption{ - text: v, - style: opt.Style.GetTextOptions(), - }) - } - // 副标题 - for _, v := range splitTitleText(opt.Subtext) { - measureOptions = append(measureOptions, titleMeasureOption{ - text: v, - style: opt.SubtextStyle.GetTextOptions(), - }) - } - - textMaxWidth := 0 - textMaxHeight := 0 - width := 0 - for index, item := range measureOptions { - item.style.WriteTextOptionsToRenderer(r) - textBox := r.MeasureText(item.text) - - w := textBox.Width() - h := textBox.Height() - if w > textMaxWidth { - textMaxWidth = w - } - if h > textMaxHeight { - textMaxHeight = h - } - measureOptions[index].height = h - measureOptions[index].width = w - } - width = textMaxWidth - titleX := 0 - b := d.Box - switch opt.Left { - case PositionRight: - titleX = b.Width() - textMaxWidth - case PositionCenter: - titleX = b.Width()>>1 - (textMaxWidth >> 1) - default: - if strings.HasSuffix(opt.Left, "%") { - value, _ := strconv.Atoi(strings.ReplaceAll(opt.Left, "%", "")) - titleX = b.Width() * value / 100 - } else { - value, _ := strconv.Atoi(opt.Left) - titleX = value - } - } - titleY := 0 - // TODO TOP 暂只支持数值 - if opt.Top != "" { - value, _ := strconv.Atoi(opt.Top) - titleY += value - } - for _, item := range measureOptions { - item.style.WriteTextOptionsToRenderer(r) - x := titleX + (textMaxWidth-item.width)>>1 - y := titleY + item.height - d.text(item.text, x, y) - titleY += item.height - } - height := titleY + padding.Top + padding.Bottom - box := padding.Clone() - box.Right = box.Left + titleX + width - box.Bottom = box.Top + height - - return box, nil -} diff --git a/title_test.go b/title_test.go deleted file mode 100644 index 23573c3..0000000 --- a/title_test.go +++ /dev/null @@ -1,142 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -func TestSplitTitleText(t *testing.T) { - assert := assert.New(t) - - assert.Equal([]string{ - "a", - "b", - }, splitTitleText("a\nb")) - assert.Equal([]string{ - "a", - }, splitTitleText("a\n ")) -} - -func TestDrawTitle(t *testing.T) { - assert := assert.New(t) - - newOption := func() *TitleOption { - f, _ := chart.GetDefaultFont() - return &TitleOption{ - Text: "title\nHello", - Subtext: "subtitle\nWorld!", - Style: chart.Style{ - FontSize: 14, - Font: f, - FontColor: drawing.ColorBlack, - }, - SubtextStyle: chart.Style{ - FontSize: 10, - Font: f, - FontColor: drawing.ColorBlue, - }, - } - } - newDraw := func() *Draw { - d, _ := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - return d - } - - tests := []struct { - newDraw func() *Draw - newOption func() *TitleOption - result string - box chart.Box - }{ - { - newDraw: newDraw, - newOption: newOption, - result: "\\ntitleHellosubtitleWorld!", - box: chart.Box{ - Right: 43, - Bottom: 58, - }, - }, - { - newDraw: newDraw, - newOption: func() *TitleOption { - opt := newOption() - opt.Left = PositionRight - opt.Top = "50" - return opt - }, - result: "\\ntitleHellosubtitleWorld!", - box: chart.Box{ - Right: 400, - Bottom: 108, - }, - }, - { - newDraw: newDraw, - newOption: func() *TitleOption { - opt := newOption() - opt.Left = PositionCenter - opt.Top = "10" - return opt - }, - result: "\\ntitleHellosubtitleWorld!", - box: chart.Box{ - Right: 222, - Bottom: 68, - }, - }, - { - newDraw: newDraw, - newOption: func() *TitleOption { - opt := newOption() - opt.Left = "10%" - opt.Top = "10" - return opt - }, - result: "\\ntitleHellosubtitleWorld!", - box: chart.Box{ - Right: 83, - Bottom: 68, - }, - }, - } - for _, tt := range tests { - d := tt.newDraw() - o := tt.newOption() - b, err := drawTitle(d, o) - assert.Nil(err) - assert.Equal(tt.box, b) - data, err := d.Bytes() - assert.Nil(err) - assert.NotEmpty(data) - assert.Equal(tt.result, string(data)) - } -} diff --git a/util.go b/util.go index d35b4b0..5fee163 100644 --- a/util.go +++ b/util.go @@ -134,8 +134,8 @@ func commafWithDigits(value float64) string { return humanize.CommafWithDigits(value, decimals) } -func parseColor(color string) drawing.Color { - c := drawing.Color{} +func parseColor(color string) Color { + c := Color{} if color == "" { return c } diff --git a/util_test.go b/util_test.go index 6489ab3..fefbabc 100644 --- a/util_test.go +++ b/util_test.go @@ -80,13 +80,15 @@ func TestGetRadius(t *testing.T) { func TestMeasureTextMaxWidthHeight(t *testing.T) { assert := assert.New(t) - r, err := chart.SVG(400, 300) + p, err := NewPainter(PainterOptions{ + Width: 400, + Height: 300, + }) assert.Nil(err) style := chart.Style{ FontSize: 10, } - style.Font, _ = chart.GetDefaultFont() - style.WriteToRenderer(r) + p.SetStyle(style) maxWidth, maxHeight := measureTextMaxWidthHeight([]string{ "Mon", @@ -96,7 +98,7 @@ func TestMeasureTextMaxWidthHeight(t *testing.T) { "Fri", "Sat", "Sun", - }, r) + }, p) assert.Equal(26, maxWidth) assert.Equal(12, maxHeight) } diff --git a/xaxis.go b/xaxis.go deleted file mode 100644 index d79f40e..0000000 --- a/xaxis.go +++ /dev/null @@ -1,93 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "github.com/golang/freetype/truetype" -) - -type XAxisOption struct { - Font *truetype.Font - // The boundary gap on both sides of a coordinate axis. - // Nil or *true means the center part of two axis ticks - BoundaryGap *bool - // The data value of x axis - Data []string - // The theme of chart - Theme string - // Hidden x axis - Hidden bool - // Number of segments that the axis is split into. Note that this number serves only as a recommendation. - SplitNumber int -} - -func NewXAxisOption(data []string, boundaryGap ...*bool) XAxisOption { - opt := XAxisOption{ - Data: data, - } - if len(boundaryGap) != 0 { - opt.BoundaryGap = boundaryGap[0] - } - return opt -} - -// drawXAxis draws x axis, and returns the height, range of if. -func drawXAxis(p *Painter, opt *XAxisOption, yAxisCount int) (int, *Range, error) { - if opt.Hidden { - return 0, nil, nil - } - left := YAxisWidth - right := (yAxisCount - 1) * YAxisWidth - pXAxis := p.Child( - PainterPaddingOption(Box{ - Left: left, - Right: right, - }), - PainterFontOption(opt.Font), - ) - theme := NewTheme(opt.Theme) - data := NewAxisDataListFromStringList(opt.Data) - style := AxisOption{ - BoundaryGap: opt.BoundaryGap, - StrokeColor: theme.GetAxisStrokeColor(), - FontColor: theme.GetAxisStrokeColor(), - StrokeWidth: 1, - SplitNumber: opt.SplitNumber, - } - - boundary := true - max := float64(len(opt.Data)) - if isFalse(opt.BoundaryGap) { - boundary = false - max-- - } - axis := NewAxis(pXAxis, data, style) - axis.Render() - return axis.measure().Height, &Range{ - divideCount: len(opt.Data), - Min: 0, - Max: max, - Size: pXAxis.Width(), - Boundary: boundary, - }, nil -} diff --git a/xaxis_test.go b/xaxis_test.go deleted file mode 100644 index 267cdb1..0000000 --- a/xaxis_test.go +++ /dev/null @@ -1,108 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestNewXAxisOption(t *testing.T) { - assert := assert.New(t) - - opt := NewXAxisOption([]string{ - "a", - "b", - }, FalseFlag()) - - assert.Equal(XAxisOption{ - Data: []string{ - "a", - "b", - }, - BoundaryGap: FalseFlag(), - }, opt) - -} -func TestDrawXAxis(t *testing.T) { - assert := assert.New(t) - - newDraw := func() *Draw { - d, _ := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - return d - } - - tests := []struct { - newDraw func() *Draw - newOption func() *XAxisOption - result string - }{ - { - newDraw: newDraw, - newOption: func() *XAxisOption { - return &XAxisOption{ - BoundaryGap: FalseFlag(), - Data: []string{ - "Mon", - "Tue", - }, - } - }, - result: "\\nMonTue", - }, - { - newDraw: newDraw, - newOption: func() *XAxisOption { - return &XAxisOption{ - Data: []string{ - "01-01", - "01-02", - "01-03", - "01-04", - "01-05", - "01-06", - "01-07", - "01-08", - "01-09", - }, - SplitNumber: 3, - } - }, - result: "\\n01-0201-0501-08", - }, - } - - for _, tt := range tests { - d := tt.newDraw() - height, _, err := drawXAxis(d, tt.newOption(), 1) - assert.Nil(err) - assert.Equal(25, height) - data, err := d.Bytes() - assert.Nil(err) - assert.Equal(tt.result, string(data)) - } -} diff --git a/yaxis.go b/yaxis.go deleted file mode 100644 index 5d55440..0000000 --- a/yaxis.go +++ /dev/null @@ -1,95 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "strings" - - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" -) - -type YAxisOption struct { - // The minimun value of axis. - Min *float64 - // The maximum value of axis. - Max *float64 - // Hidden y axis - Hidden bool - // Formatter for y axis text value - Formatter string - // Color for y axis - Color drawing.Color -} - -// TODO 长度是否可以变化 -const YAxisWidth = 40 - -func drawYAxis(p *Painter, opt *ChartOption, axisIndex, xAxisHeight int, padding chart.Box) (*Range, error) { - theme := NewTheme(opt.Theme) - yRange := opt.newYRange(axisIndex) - values := yRange.Values() - yAxis := opt.YAxisList[axisIndex] - formatter := yAxis.Formatter - if len(formatter) != 0 { - for index, text := range values { - values[index] = strings.ReplaceAll(formatter, "{value}", text) - } - } - - data := NewAxisDataListFromStringList(values) - style := AxisOption{ - Position: PositionLeft, - BoundaryGap: FalseFlag(), - FontColor: theme.GetAxisStrokeColor(), - TickShow: FalseFlag(), - StrokeWidth: 1, - SplitLineColor: theme.GetAxisSplitLineColor(), - SplitLineShow: true, - } - if !yAxis.Color.IsZero() { - style.FontColor = yAxis.Color - style.StrokeColor = yAxis.Color - } - width := NewAxis(p, data, style).measure().Width - - yAxisCount := len(opt.YAxisList) - boxWidth := p.Width() - if axisIndex > 0 { - style.SplitLineShow = false - style.Position = PositionRight - padding.Right += (axisIndex - 1) * YAxisWidth - } else { - boxWidth = p.Width() - (yAxisCount-1)*YAxisWidth - padding.Left += (YAxisWidth - width) - } - - pYAxis := p.Child( - PainterWidthHeightOption(boxWidth, p.Height()-xAxisHeight), - PainterPaddingOption(padding), - PainterFontOption(opt.Font), - ) - NewAxis(pYAxis, data, style).Render() - yRange.Size = pYAxis.Height() - return &yRange, nil -} diff --git a/yaxis_test.go b/yaxis_test.go deleted file mode 100644 index 0bbef7a..0000000 --- a/yaxis_test.go +++ /dev/null @@ -1,119 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" -) - -func TestDrawYAxis(t *testing.T) { - assert := assert.New(t) - newDraw := func() *Draw { - d, _ := NewDraw(DrawOption{ - Width: 400, - Height: 300, - }) - return d - } - - tests := []struct { - newDraw func() *Draw - newOption func() *ChartOption - axisIndex int - xAxisHeight int - result string - }{ - { - newDraw: newDraw, - newOption: func() *ChartOption { - return &ChartOption{ - YAxisList: []YAxisOption{ - { - Max: NewFloatPoint(20), - }, - }, - SeriesList: []Series{ - { - Data: []SeriesData{ - { - Value: 1, - }, - { - Value: 2, - }, - }, - }, - }, - } - }, - result: "\\n03.336.661013.3316.6620", - }, - { - newDraw: newDraw, - newOption: func() *ChartOption { - return &ChartOption{ - YAxisList: []YAxisOption{ - {}, - { - Max: NewFloatPoint(20), - Formatter: "{value} C", - }, - }, - SeriesList: []Series{ - { - YAxisIndex: 1, - Data: []SeriesData{ - { - Value: 1, - }, - { - Value: 2, - }, - }, - }, - }, - } - }, - axisIndex: 1, - result: "\\n0 C3.33 C6.66 C10 C13.33 C16.66 C20 C", - }, - } - - for _, tt := range tests { - d := tt.newDraw() - r, err := drawYAxis(d, tt.newOption(), tt.axisIndex, tt.xAxisHeight, chart.NewBox(10, 10, 10, 10)) - assert.Nil(err) - assert.Equal(&Range{ - divideCount: 6, - Max: 20, - Size: 280, - }, r) - - data, err := d.Bytes() - assert.Nil(err) - assert.Equal(tt.result, string(data)) - } -} From e82fe34a2b8ba38644a541a05cb1fb9f5e122157 Mon Sep 17 00:00:00 2001 From: darcy Date: Thu, 19 May 2022 21:58:08 +0800 Subject: [PATCH 126/251] docs: add example of using chinese --- README_zh.md | 4 +++- examples/basic/chinese.go | 50 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 examples/basic/chinese.go diff --git a/README_zh.md b/README_zh.md index 57d9db4..1589923 100644 --- a/README_zh.md +++ b/README_zh.md @@ -220,4 +220,6 @@ BenchmarkMultiChartSVGRender-8 367 3356325 ns/op 默认使用的字符为`roboto`为英文字体库,因此如果需要显示中文字符需要增加中文字体库,`InstallFont`函数可添加对应的字体库,成功添加之后则指定`title.textStyle.fontFamily`即可。 在浏览器中使用`svg`时,如果指定的`fontFamily`不支持中文字符,展示的中文并不会乱码,但是会导致在计算字符宽度等错误。 -[中文字库noto-cjk](https://github.com/googlefonts/noto-cjk) \ No newline at end of file +字体文件可以在[中文字库noto-cjk](https://github.com/googlefonts/noto-cjk)下载,注意下载时选择字体格式为 `ttf` 格式,如果选用 `otf` 格式可能会加载失败。 + +示例见 [examples/basic/chinese.go](examples/basic/chinese.go) \ No newline at end of file diff --git a/examples/basic/chinese.go b/examples/basic/chinese.go new file mode 100644 index 0000000..4380349 --- /dev/null +++ b/examples/basic/chinese.go @@ -0,0 +1,50 @@ +package main + +import ( + "log" + "os" + + charts "github.com/vicanso/go-charts" +) + +func echartsRender() ([]byte, error) { + return charts.RenderEChartsToPNG(`{ + "title": { + "text": "用户访问次数", + "textStyle": { + "fontFamily": "chinese" + } + }, + "xAxis": { + "data": ["周一", "周二", "周三", "周四", "周五", "周六", "周日"] + }, + "series": [ + { + "data": [150, 230, 224, 218, 135, 147, 260], + "label": { + "show": true + } + } + ] + }`) +} + +func main() { + fontData, err := os.ReadFile("/Users/darcy/Downloads/NotoSansCJKsc-VF.ttf") + if err != nil { + log.Fatalln("Error when reading font file:", err) + } + + if err := charts.InstallFont("chinese", fontData); err != nil { + log.Fatalln("Error when instaling font:", err) + } + + fileData, err := echartsRender() + + if err != nil { + log.Fatalln("Error when rendering image:", err) + } + if err := os.WriteFile("chinese.png", fileData, 0644); err != nil { + log.Fatalln("Error when save image to chinese.png:", err) + } +} From ddd5cf6d4314b254099585d5a51aaef78413b5f8 Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 23 May 2022 21:00:10 +0800 Subject: [PATCH 127/251] refactor: enhance painter --- painter.go | 23 ++---- painter_test.go | 22 +++--- theme.go | 198 +++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 215 insertions(+), 28 deletions(-) diff --git a/painter.go b/painter.go index d762e86..47c494f 100644 --- a/painter.go +++ b/painter.go @@ -38,7 +38,7 @@ type Painter struct { parent *Painter style Style previousStyle Style - theme *Theme + theme ColorPalette } type PainterOptions struct { @@ -92,7 +92,7 @@ func PainterStyleOption(style Style) PainterOption { } // PainterThemeOption sets the theme of draw painter -func PainterThemeOption(theme *Theme) PainterOption { +func PainterThemeOption(theme ColorPalette) PainterOption { return func(p *Painter) { if theme == nil { return @@ -194,6 +194,7 @@ func (p *Painter) SetTextStyle(style Style) { func (p *Painter) RestoreStyle() { p.style = p.previousStyle + p.style.WriteToRenderer(p.render) } // Bytes returns the data of draw canvas @@ -336,13 +337,7 @@ func (p *Painter) SetStrokeColor(color Color) { p.render.SetStrokeColor(color) } -func (p *Painter) LineStroke(points []Point, style LineStyle) { - s := style.Style() - if !s.ShouldDrawStroke() { - return - } - defer p.RestoreStyle() - p.SetDrawingStyle(s.GetStrokeOptions()) +func (p *Painter) LineStroke(points []Point) { for index, point := range points { x := point.X y := point.Y @@ -360,8 +355,9 @@ func (p *Painter) SetBackground(width, height int, color Color) { s := chart.Style{ FillColor: color, } - defer p.RestoreStyle() + // 背景色 p.SetStyle(s) + defer p.RestoreStyle() // 设置背景色不使用box,因此不直接使用Painter r.MoveTo(0, 0) r.LineTo(width, 0) @@ -396,13 +392,8 @@ func (p *Painter) Polygon(center Point, radius float64, sides int) { p.Stroke() } -func (p *Painter) FillArea(points []Point, s Style) { - if !s.ShouldDrawFill() { - return - } - defer p.RestoreStyle() +func (p *Painter) FillArea(points []Point) { var x, y int - p.SetDrawingStyle(s.GetFillOptions()) for index, point := range points { x = point.X y = point.Y diff --git a/painter_test.go b/painter_test.go index 1cc08be..34c0c05 100644 --- a/painter_test.go +++ b/painter_test.go @@ -99,6 +99,10 @@ func TestPainter(t *testing.T) { // line stroke { fn: func(p *Painter) { + p.SetDrawingStyle(Style{ + StrokeColor: drawing.ColorBlack, + StrokeWidth: 1, + }) p.LineStroke([]Point{ { X: 1, @@ -108,9 +112,6 @@ func TestPainter(t *testing.T) { X: 3, Y: 4, }, - }, LineStyle{ - StrokeColor: drawing.ColorBlack, - StrokeWidth: 1, }) }, result: "\\n", @@ -294,6 +295,14 @@ func TestPainter(t *testing.T) { // FillArea { fn: func(p *Painter) { + p.SetDrawingStyle(Style{ + FillColor: drawing.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }) p.FillArea([]Point{ { X: 0, @@ -311,13 +320,6 @@ func TestPainter(t *testing.T) { X: 0, Y: 0, }, - }, Style{ - FillColor: drawing.Color{ - R: 84, - G: 112, - B: 198, - A: 255, - }, }) }, result: "\\n", diff --git a/theme.go b/theme.go index 88c73df..bb05249 100644 --- a/theme.go +++ b/theme.go @@ -22,13 +22,20 @@ package charts +import "github.com/wcharczuk/go-chart/v2/drawing" + const ThemeDark = "dark" const ThemeLight = "light" const ThemeGrafana = "grafana" const ThemeAnt = "ant" -type Theme struct { - palette *themeColorPalette +type ColorPalette interface { + IsDark() bool + GetAxisStrokeColor() Color + GetAxisSplitLineColor() Color + GetSeriesColor(int) Color + GetBackgroundColor() Color + GetTextColor() Color } type themeColorPalette struct { @@ -39,3 +46,190 @@ type themeColorPalette struct { textColor Color seriesColors []Color } + +var palettes = map[string]ColorPalette{} + +func init() { + echartSeriesColors := []Color{ + parseColor("#5470c6"), + parseColor("#91cc75"), + parseColor("#fac858"), + parseColor("#ee6666"), + parseColor("#73c0de"), + parseColor("#3ba272"), + parseColor("#fc8452"), + parseColor("#9a60b4"), + parseColor("#ea7ccc"), + } + grafanaSeriesColors := []Color{ + parseColor("#7EB26D"), + parseColor("#EAB839"), + parseColor("#6ED0E0"), + parseColor("#EF843C"), + parseColor("#E24D42"), + parseColor("#1F78C1"), + parseColor("#705DA0"), + parseColor("#508642"), + } + antSeriesColors := []Color{ + parseColor("#5b8ff9"), + parseColor("#5ad8a6"), + parseColor("#5d7092"), + parseColor("#f6bd16"), + parseColor("#6f5ef9"), + parseColor("#6dc8ec"), + parseColor("#945fb9"), + parseColor("#ff9845"), + } + AddTheme( + ThemeDark, + true, + Color{ + R: 185, + G: 184, + B: 206, + A: 255, + }, + Color{ + R: 72, + G: 71, + B: 83, + A: 255, + }, + Color{ + R: 16, + G: 12, + B: 42, + A: 255, + }, + Color{ + R: 238, + G: 238, + B: 238, + A: 255, + }, + echartSeriesColors, + ) + + AddTheme( + ThemeLight, + false, + Color{ + R: 110, + G: 112, + B: 121, + A: 255, + }, + Color{ + R: 224, + G: 230, + B: 242, + A: 255, + }, + drawing.ColorWhite, + drawing.Color{ + R: 70, + G: 70, + B: 70, + A: 255, + }, + echartSeriesColors, + ) + AddTheme( + ThemeAnt, + false, + Color{ + R: 110, + G: 112, + B: 121, + A: 255, + }, + Color{ + R: 224, + G: 230, + B: 242, + A: 255, + }, + drawing.ColorWhite, + drawing.Color{ + R: 70, + G: 70, + B: 70, + A: 255, + }, + antSeriesColors, + ) + AddTheme( + ThemeGrafana, + true, + drawing.Color{ + R: 185, + G: 184, + B: 206, + A: 255, + }, + drawing.Color{ + R: 68, + G: 67, + B: 67, + A: 255, + }, + drawing.Color{ + R: 31, + G: 29, + B: 29, + A: 255, + }, + drawing.Color{ + R: 216, + G: 217, + B: 218, + A: 255, + }, + grafanaSeriesColors, + ) +} + +func AddTheme(name string, isDarkMode bool, axisStrokeColor, axisSplitLineColor, backgroundColor, textColor drawing.Color, seriesColors []drawing.Color) { + palettes[name] = &themeColorPalette{ + isDarkMode: isDarkMode, + axisStrokeColor: axisStrokeColor, + axisSplitLineColor: axisSplitLineColor, + backgroundColor: backgroundColor, + textColor: textColor, + seriesColors: seriesColors, + } +} + +func NewTheme(name string) ColorPalette { + p, ok := palettes[name] + if !ok { + p = palettes[ThemeLight] + } + return p +} + +func (t *themeColorPalette) IsDark() bool { + return t.isDarkMode +} + +func (t *themeColorPalette) GetAxisStrokeColor() Color { + return t.axisStrokeColor +} + +func (t *themeColorPalette) GetAxisSplitLineColor() Color { + return t.axisSplitLineColor +} + +func (t *themeColorPalette) GetSeriesColor(index int) Color { + colors := t.seriesColors + return colors[index%len(colors)] +} + +func (t *themeColorPalette) GetBackgroundColor() Color { + return t.backgroundColor +} + +func (t *themeColorPalette) GetTextColor() Color { + return t.textColor +} From 4201c7d4393caec7f6c15725ead9602274e41d41 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 24 May 2022 23:25:08 +0800 Subject: [PATCH 128/251] chore: support axias ticks render --- painter.go | 217 +++++++++++++++++++++++++++++++++++------------- painter_test.go | 2 +- util.go | 15 ++-- 3 files changed, 165 insertions(+), 69 deletions(-) diff --git a/painter.go b/painter.go index 47c494f..971a028 100644 --- a/painter.go +++ b/painter.go @@ -32,13 +32,12 @@ import ( ) type Painter struct { - render Renderer - box Box - font *truetype.Font - parent *Painter - style Style - previousStyle Style - theme ColorPalette + render Renderer + box Box + font *truetype.Font + parent *Painter + style Style + theme ColorPalette } type PainterOptions struct { @@ -54,6 +53,12 @@ type PainterOptions struct { type PainterOption func(*Painter) +type TicksOption struct { + Length int + Orient string + Count int +} + // PainterPaddingOption sets the padding of draw painter func PainterPaddingOption(padding Box) PainterOption { return func(p *Painter) { @@ -87,7 +92,7 @@ func PainterFontOption(font *truetype.Font) PainterOption { // PainterStyleOption sets the style of draw painter func PainterStyleOption(style Style) PainterOption { return func(p *Painter) { - p.SetDrawingStyle(style) + p.SetStyle(style) } } @@ -156,13 +161,12 @@ func (p *Painter) setOptions(opts ...PainterOption) { func (p *Painter) Child(opt ...PainterOption) *Painter { child := &Painter{ - render: p.render, - box: p.box.Clone(), - font: p.font, - parent: p, - style: p.style, - previousStyle: p.previousStyle, - theme: p.theme, + render: p.render, + box: p.box.Clone(), + font: p.font, + parent: p, + style: p.style, + theme: p.theme, } child.setOptions(opt...) return child @@ -172,29 +176,65 @@ func (p *Painter) SetStyle(style Style) { if style.Font == nil { style.Font = p.font } - p.previousStyle = p.style p.style = style style.WriteToRenderer(p.render) } -func (p *Painter) SetDrawingStyle(style Style) { - p.previousStyle = p.style - p.style = style - style.WriteDrawingOptionsToRenderer(p.render) -} - -func (p *Painter) SetTextStyle(style Style) { - if style.Font == nil { - style.Font = p.font +func overrideStyle(defaultStyle Style, style Style) Style { + if style.StrokeWidth == 0 { + style.StrokeWidth = defaultStyle.StrokeWidth } - p.previousStyle = p.style - p.style = style - style.WriteTextOptionsToRenderer(p.render) + if style.StrokeColor.IsZero() { + style.StrokeColor = defaultStyle.StrokeColor + } + if style.StrokeDashArray == nil { + style.StrokeDashArray = defaultStyle.StrokeDashArray + } + if style.DotColor.IsZero() { + style.DotColor = defaultStyle.DotColor + } + if style.DotWidth == 0 { + style.DotWidth = defaultStyle.DotWidth + } + if style.FillColor.IsZero() { + style.FillColor = defaultStyle.FillColor + } + if style.FontSize == 0 { + style.FontSize = defaultStyle.FontSize + } + if style.FontColor.IsZero() { + style.FontColor = defaultStyle.FontColor + } + if style.Font == nil { + style.Font = defaultStyle.Font + } + return style } -func (p *Painter) RestoreStyle() { - p.style = p.previousStyle +func (p *Painter) OverrideDrawingStyle(style Style) *Painter { + s := overrideStyle(p.style, style) + p.SetDrawingStyle(s) + return p +} + +func (p *Painter) SetDrawingStyle(style Style) *Painter { + style.WriteDrawingOptionsToRenderer(p.render) + return p +} + +func (p *Painter) SetTextStyle(style Style) *Painter { + style.WriteTextOptionsToRenderer(p.render) + return p +} +func (p *Painter) OverrideTextStyle(style Style) *Painter { + s := overrideStyle(p.style, style) + p.SetTextStyle(s) + return p +} + +func (p *Painter) ResetStyle() *Painter { p.style.WriteToRenderer(p.render) + return p } // Bytes returns the data of draw canvas @@ -208,19 +248,22 @@ func (p *Painter) Bytes() ([]byte, error) { } // MoveTo moves the cursor to a given point -func (p *Painter) MoveTo(x, y int) { +func (p *Painter) MoveTo(x, y int) *Painter { p.render.MoveTo(x+p.box.Left, y+p.box.Top) + return p } -func (p *Painter) ArcTo(cx, cy int, rx, ry, startAngle, delta float64) { +func (p *Painter) ArcTo(cx, cy int, rx, ry, startAngle, delta float64) *Painter { p.render.ArcTo(cx+p.box.Left, cy+p.box.Top, rx, ry, startAngle, delta) + return p } -func (p *Painter) LineTo(x, y int) { +func (p *Painter) LineTo(x, y int) *Painter { p.render.LineTo(x+p.box.Left, y+p.box.Top) + return p } -func (p *Painter) Pin(x, y, width int) { +func (p *Painter) Pin(x, y, width int) *Painter { r := float64(width) / 2 y -= width / 4 angle := chart.DegreesToRadians(15) @@ -246,9 +289,10 @@ func (p *Painter) Pin(x, y, width int) { p.render.QuadCurveTo(cx+left, cy+top, endX+left, endY+top) p.Close() p.Fill() + return p } -func (p *Painter) arrow(x, y, width, height int, direction string) { +func (p *Painter) arrow(x, y, width, height int, direction string) *Painter { halfWidth := width >> 1 halfHeight := height >> 1 if direction == PositionTop || direction == PositionBottom { @@ -284,41 +328,51 @@ func (p *Painter) arrow(x, y, width, height int, direction string) { p.LineTo(x0, y0) } p.FillStroke() + return p } -func (p *Painter) ArrowLeft(x, y, width, height int) { +func (p *Painter) ArrowLeft(x, y, width, height int) *Painter { p.arrow(x, y, width, height, PositionLeft) + return p } -func (p *Painter) ArrowRight(x, y, width, height int) { +func (p *Painter) ArrowRight(x, y, width, height int) *Painter { p.arrow(x, y, width, height, PositionRight) + return p } -func (p *Painter) ArrowTop(x, y, width, height int) { +func (p *Painter) ArrowTop(x, y, width, height int) *Painter { p.arrow(x, y, width, height, PositionTop) + return p } -func (p *Painter) ArrowBottom(x, y, width, height int) { +func (p *Painter) ArrowBottom(x, y, width, height int) *Painter { p.arrow(x, y, width, height, PositionBottom) + return p } -func (p *Painter) Circle(radius float64, x, y int) { +func (p *Painter) Circle(radius float64, x, y int) *Painter { p.render.Circle(radius, x+p.box.Left, y+p.box.Top) + return p } -func (p *Painter) Stroke() { +func (p *Painter) Stroke() *Painter { p.render.Stroke() + return p } -func (p *Painter) Close() { +func (p *Painter) Close() *Painter { p.render.Close() + return p } -func (p *Painter) FillStroke() { +func (p *Painter) FillStroke() *Painter { p.render.FillStroke() + return p } -func (p *Painter) Fill() { +func (p *Painter) Fill() *Painter { p.render.Fill() + return p } func (p *Painter) Width() int { @@ -333,11 +387,7 @@ func (p *Painter) MeasureText(text string) Box { return p.render.MeasureText(text) } -func (p *Painter) SetStrokeColor(color Color) { - p.render.SetStrokeColor(color) -} - -func (p *Painter) LineStroke(points []Point) { +func (p *Painter) LineStroke(points []Point) *Painter { for index, point := range points { x := point.X y := point.Y @@ -348,16 +398,17 @@ func (p *Painter) LineStroke(points []Point) { } } p.Stroke() + return p } -func (p *Painter) SetBackground(width, height int, color Color) { +func (p *Painter) SetBackground(width, height int, color Color) *Painter { r := p.render s := chart.Style{ FillColor: color, } // 背景色 - p.SetStyle(s) - defer p.RestoreStyle() + p.SetDrawingStyle(s) + defer p.ResetStyle() // 设置背景色不使用box,因此不直接使用Painter r.MoveTo(0, 0) r.LineTo(width, 0) @@ -365,21 +416,23 @@ func (p *Painter) SetBackground(width, height int, color Color) { r.LineTo(0, height) r.LineTo(0, 0) p.FillStroke() + return p } -func (p *Painter) MarkLine(x, y, width int) { +func (p *Painter) MarkLine(x, y, width int) *Painter { arrowWidth := 16 arrowHeight := 10 endX := x + width - p.Circle(3, x, y) + radius := 3 + p.Circle(3, x+radius, y) p.render.Fill() - p.MoveTo(x+5, y) + p.MoveTo(x+radius*3, y) p.LineTo(endX-arrowWidth, y) p.Stroke() - p.render.SetStrokeDashArray([]float64{}) p.ArrowRight(endX, y, arrowWidth, arrowHeight) + return p } -func (p *Painter) Polygon(center Point, radius float64, sides int) { +func (p *Painter) Polygon(center Point, radius float64, sides int) *Painter { points := getPolygonPoints(center, radius, sides) for i, item := range points { if i == 0 { @@ -390,9 +443,10 @@ func (p *Painter) Polygon(center Point, radius float64, sides int) { } p.LineTo(points[0].X, points[0].Y) p.Stroke() + return p } -func (p *Painter) FillArea(points []Point) { +func (p *Painter) FillArea(points []Point) *Painter { var x, y int for index, point := range points { x = point.X @@ -404,10 +458,12 @@ func (p *Painter) FillArea(points []Point) { } } p.Fill() + return p } -func (p *Painter) Text(body string, x, y int) { +func (p *Painter) Text(body string, x, y int) *Painter { p.render.Text(body, x+p.box.Left, y+p.box.Top) + return p } func (p *Painter) TextFit(body string, x, y, width int) chart.Box { @@ -433,3 +489,46 @@ func (p *Painter) TextFit(body string, x, y, width int) chart.Box { p.style.TextWrap = textWarp return output } + +func (p *Painter) Ticks(opt TicksOption) *Painter { + if opt.Count <= 0 || opt.Length <= 0 { + return p + } + count := opt.Count - 1 + width := p.Width() + height := p.Height() + var values []int + if opt.Orient == OrientHorizontal { + values = autoDivide(height, count) + } else { + values = autoDivide(width, count) + } + + for _, value := range values { + if opt.Orient == OrientVertical { + p.LineStroke([]Point{ + { + X: 0, + Y: value, + }, + { + X: opt.Length, + Y: value, + }, + }) + } else { + p.LineStroke([]Point{ + { + X: value, + Y: opt.Length, + }, + { + X: value, + Y: 0, + }, + }) + } + } + + return p +} diff --git a/painter_test.go b/painter_test.go index 34c0c05..c847aff 100644 --- a/painter_test.go +++ b/painter_test.go @@ -271,7 +271,7 @@ func TestPainter(t *testing.T) { }) p.MarkLine(0, 20, 300) }, - result: "\\n", + result: "\\n", }, // polygon { diff --git a/util.go b/util.go index 5fee163..7306919 100644 --- a/util.go +++ b/util.go @@ -59,19 +59,16 @@ func getDefaultInt(value, defaultValue int) int { } func autoDivide(max, size int) []int { - unit := max / size + unit := float64(max) / float64(size) - rest := max - unit*size values := make([]int, size+1) - value := 0 - for i := 0; i < size; i++ { - values[i] = value - if i < rest { - value++ + for i := 0; i < size+1; i++ { + if i == size { + values[i] = max + } else { + values[i] = int(float64(i) * unit) } - value += unit } - values[size] = max return values } From 1dcd50ba9a06c83f57414e017bdae1d4718d71b0 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 25 May 2022 23:09:33 +0800 Subject: [PATCH 129/251] feat: support multi text draw --- painter.go | 74 +++++++++++++++++++++++++++++++++++++++++++++++----- util_test.go | 12 ++++----- 2 files changed, 74 insertions(+), 12 deletions(-) diff --git a/painter.go b/painter.go index 971a028..37c60bd 100644 --- a/painter.go +++ b/painter.go @@ -57,6 +57,15 @@ type TicksOption struct { Length int Orient string Count int + Unit int +} + +type MultiTextOption struct { + TextList []string + Orient string + Unit int + Position string + Align string } // PainterPaddingOption sets the padding of draw painter @@ -223,6 +232,9 @@ func (p *Painter) SetDrawingStyle(style Style) *Painter { } func (p *Painter) SetTextStyle(style Style) *Painter { + if style.Font == nil { + style.Font = p.font + } style.WriteTextOptionsToRenderer(p.render) return p } @@ -494,18 +506,25 @@ func (p *Painter) Ticks(opt TicksOption) *Painter { if opt.Count <= 0 || opt.Length <= 0 { return p } - count := opt.Count - 1 + count := opt.Count width := p.Width() height := p.Height() + unit := 1 + if opt.Unit > 1 { + unit = opt.Unit + } var values []int - if opt.Orient == OrientHorizontal { + isVertical := opt.Orient == OrientVertical + if isVertical { values = autoDivide(height, count) } else { values = autoDivide(width, count) } - - for _, value := range values { - if opt.Orient == OrientVertical { + for index, value := range values { + if index%unit != 0 { + continue + } + if isVertical { p.LineStroke([]Point{ { X: 0, @@ -529,6 +548,49 @@ func (p *Painter) Ticks(opt TicksOption) *Painter { }) } } - + return p +} + +func (p *Painter) MultiText(opt MultiTextOption) *Painter { + if len(opt.TextList) == 0 { + return p + } + count := len(opt.TextList) + positionCenter := true + if opt.Position == PositionLeft { + positionCenter = false + } + width := p.Width() + height := p.Height() + var values []int + isVertical := opt.Orient == OrientVertical + if isVertical { + values = autoDivide(height, count) + } else { + values = autoDivide(width, count) + } + for index, text := range opt.TextList { + box := p.MeasureText(text) + start := values[index] + if positionCenter { + start = (values[index] + values[index+1]) >> 1 + } + x := 0 + y := 0 + if isVertical { + y = start - box.Height()>>1 + switch opt.Align { + case AlignRight: + x = width - box.Width() + case AlignCenter: + x = width - box.Width()>>1 + default: + x = 0 + } + } else { + x = start - box.Width()>>1 + } + p.Text(text, x, y) + } return p } diff --git a/util_test.go b/util_test.go index fefbabc..b25c60d 100644 --- a/util_test.go +++ b/util_test.go @@ -60,12 +60,12 @@ func TestAutoDivide(t *testing.T) { assert.Equal([]int{ 0, - 86, - 172, - 258, - 344, - 430, - 515, + 85, + 171, + 257, + 342, + 428, + 514, 600, }, autoDivide(600, 7)) } From 7e4de64a0ddca62a275c47f8085b202cc92d1f05 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 26 May 2022 23:21:02 +0800 Subject: [PATCH 130/251] feat: support grid render function --- alias.go | 6 ++++ painter.go | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++- util.go | 18 ++++++++++++ 3 files changed, 109 insertions(+), 1 deletion(-) diff --git a/alias.go b/alias.go index 3bacc67..d19c1f9 100644 --- a/alias.go +++ b/alias.go @@ -58,6 +58,12 @@ const ( PositionBottom = "bottom" ) +const ( + AlignLeft = "left" + AlignRight = "right" + AlignCenter = "center" +) + const ( OrientHorizontal = "horizontal" OrientVertical = "vertical" diff --git a/painter.go b/painter.go index 37c60bd..0120d68 100644 --- a/painter.go +++ b/painter.go @@ -68,6 +68,15 @@ type MultiTextOption struct { Align string } +type GridOption struct { + Column int + Row int + // 忽略不展示的column + IgnoreColumnLines []int + // 忽略不展示的row + IgnoreRowLines []int +} + // PainterPaddingOption sets the padding of draw painter func PainterPaddingOption(padding Box) PainterOption { return func(p *Painter) { @@ -275,6 +284,11 @@ func (p *Painter) LineTo(x, y int) *Painter { return p } +func (p *Painter) QuadCurveTo(cx, cy, x, y int) *Painter { + p.render.QuadCurveTo(cx+p.box.Left, cy+p.box.Top, x+p.box.Left, y+p.box.Top) + return p +} + func (p *Painter) Pin(x, y, width int) *Painter { r := float64(width) / 2 y -= width / 4 @@ -413,6 +427,27 @@ func (p *Painter) LineStroke(points []Point) *Painter { return p } +func (p *Painter) SmoothLineStroke(points []Point) *Painter { + prevX := 0 + prevY := 0 + // TODO 如何生成平滑的折线 + for index, point := range points { + x := point.X + y := point.Y + if index == 0 { + p.MoveTo(x, y) + } else { + cx := prevX + (x-prevX)/5 + cy := y + (y-prevY)/2 + p.QuadCurveTo(cx, cy, x, y) + } + prevX = x + prevY = y + } + p.Stroke() + return p +} + func (p *Painter) SetBackground(width, height int, color Color) *Painter { r := p.render s := chart.Style{ @@ -557,8 +592,12 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { } count := len(opt.TextList) positionCenter := true - if opt.Position == PositionLeft { + if containsString([]string{ + PositionLeft, + PositionTop, + }, opt.Position) { positionCenter = false + count-- } width := p.Width() height := p.Height() @@ -594,3 +633,48 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { } return p } + +func (p *Painter) Grid(opt GridOption) *Painter { + width := p.Width() + height := p.Height() + drawLines := func(values []int, ignoreIndexList []int, isVertical bool) { + for index, v := range values { + if containsInt(ignoreIndexList, index) { + continue + } + x0 := 0 + y0 := 0 + x1 := 0 + y1 := 0 + if isVertical { + + x0 = v + x1 = v + y1 = height + } else { + x1 = width + y0 = v + y1 = v + } + p.LineStroke([]Point{ + { + X: x0, + Y: y0, + }, + { + X: x1, + Y: y1, + }, + }) + } + } + if opt.Column > 0 { + values := autoDivide(width, opt.Column) + drawLines(values, opt.IgnoreColumnLines, true) + } + if opt.Row > 0 { + values := autoDivide(height, opt.Row) + drawLines(values, opt.IgnoreRowLines, false) + } + return p +} diff --git a/util.go b/util.go index 7306919..adfa9fd 100644 --- a/util.go +++ b/util.go @@ -43,6 +43,24 @@ func FalseFlag() *bool { return &f } +func containsInt(values []int, value int) bool { + for _, v := range values { + if v == value { + return true + } + } + return false +} + +func containsString(values []string, value string) bool { + for _, v := range values { + if v == value { + return true + } + } + return false +} + func ceilFloatToInt(value float64) int { i := int(value) if value == float64(i) { From 8314a2cb372e8ba852c841969b822b3bfbcb1f91 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 31 May 2022 20:25:14 +0800 Subject: [PATCH 131/251] feat: support dots render function --- examples/painter/main.go | 384 +++++++++++++++++++++++++++++++++++++++ line.go | 46 ----- painter.go | 9 + 3 files changed, 393 insertions(+), 46 deletions(-) create mode 100644 examples/painter/main.go delete mode 100644 line.go diff --git a/examples/painter/main.go b/examples/painter/main.go new file mode 100644 index 0000000..d0eec73 --- /dev/null +++ b/examples/painter/main.go @@ -0,0 +1,384 @@ +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + + charts "github.com/vicanso/go-charts" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func writeFile(buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file := filepath.Join(tmpPath, "painter.png") + err = ioutil.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func main() { + p, err := charts.NewPainter(charts.PainterOptions{ + Width: 400, + Height: 1200, + Type: charts.ChartOutputPNG, + }) + if err != nil { + panic(err) + } + // 背景色 + p.SetBackground(p.Width(), p.Height(), drawing.ColorWhite) + + top := 0 + + // 画线 + p.SetDrawingStyle(charts.Style{ + StrokeColor: drawing.ColorBlack, + FillColor: drawing.ColorBlack, + StrokeWidth: 1, + }) + p.LineStroke([]charts.Point{ + { + X: 0, + Y: 0, + }, + { + X: 100, + Y: 10, + }, + { + X: 200, + Y: 0, + }, + { + X: 300, + Y: 10, + }, + }) + + // 圆滑曲线 + // top += 50 + // p.Child(charts.PainterPaddingOption(charts.Box{ + // Top: top, + // })).SetDrawingStyle(charts.Style{ + // StrokeColor: drawing.ColorBlack, + // FillColor: drawing.ColorBlack, + // StrokeWidth: 1, + // }).SmoothLineStroke([]charts.Point{ + // { + // X: 0, + // Y: 0, + // }, + // { + // X: 100, + // Y: 10, + // }, + // { + // X: 200, + // Y: 0, + // }, + // { + // X: 300, + // Y: 10, + // }, + // }) + + // 标线 + top += 50 + p.Child(charts.PainterPaddingOption(charts.Box{ + Top: top, + })).SetDrawingStyle(charts.Style{ + StrokeColor: drawing.ColorBlack, + FillColor: drawing.ColorBlack, + StrokeWidth: 1, + StrokeDashArray: []float64{ + 4, + 2, + }, + }).MarkLine(0, 0, p.Width()) + + top += 60 + // Polygon + p.Child(charts.PainterBoxOption(charts.Box{ + Top: top, + })).SetDrawingStyle(charts.Style{ + StrokeColor: drawing.ColorBlack, + FillColor: drawing.ColorBlack, + StrokeWidth: 1, + }).Polygon(charts.Point{ + X: 100, + Y: 0, + }, 50, 6) + + // FillArea + top += 60 + p.Child(charts.PainterPaddingOption(charts.Box{ + Top: top, + })).SetDrawingStyle(charts.Style{ + FillColor: drawing.ColorBlack, + }).FillArea([]charts.Point{ + { + X: 0, + Y: 0, + }, + { + X: 100, + Y: 0, + }, + { + X: 150, + Y: 40, + }, + { + X: 80, + Y: 30, + }, + { + X: 0, + Y: 0, + }, + }) + + // 坐标轴的点 + top += 50 + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: 20, + }), + ).SetDrawingStyle(charts.Style{ + StrokeColor: drawing.ColorBlack, + FillColor: drawing.ColorBlack, + StrokeWidth: 1, + }).Ticks(charts.TicksOption{ + Count: 7, + Length: 5, + }) + + // 坐标轴的点,每2格显示一个 + top += 20 + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: 20, + }), + ).SetDrawingStyle(charts.Style{ + StrokeColor: drawing.ColorBlack, + FillColor: drawing.ColorBlack, + StrokeWidth: 1, + }).Ticks(charts.TicksOption{ + Unit: 2, + Count: 7, + Length: 5, + }) + + // 坐标轴的点,纵向 + top += 20 + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: top + 100, + }), + ).SetDrawingStyle(charts.Style{ + StrokeColor: drawing.ColorBlack, + FillColor: drawing.ColorBlack, + StrokeWidth: 1, + }).Ticks(charts.TicksOption{ + Orient: charts.OrientVertical, + Count: 7, + Length: 5, + }) + + // 横向展示文本 + top += 120 + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: 20, + }), + ).OverrideTextStyle(charts.Style{ + FontColor: drawing.ColorBlack, + FontSize: 10, + }).MultiText(charts.MultiTextOption{ + TextList: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + }) + + // 横向显示文本,靠左 + top += 20 + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: 20, + }), + ).OverrideTextStyle(charts.Style{ + FontColor: drawing.ColorBlack, + FontSize: 10, + }).MultiText(charts.MultiTextOption{ + Position: charts.PositionLeft, + TextList: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + }) + + // 纵向显示文本 + top += 20 + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: 50, + Bottom: top + 150, + }), + ).OverrideTextStyle(charts.Style{ + FontColor: drawing.ColorBlack, + FontSize: 10, + }).MultiText(charts.MultiTextOption{ + Orient: charts.OrientVertical, + Align: charts.AlignRight, + TextList: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + }) + // 纵向 文本居中 + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 50, + Right: 100, + Bottom: top + 150, + }), + ).OverrideTextStyle(charts.Style{ + FontColor: drawing.ColorBlack, + FontSize: 10, + }).MultiText(charts.MultiTextOption{ + Orient: charts.OrientVertical, + Align: charts.AlignCenter, + TextList: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + }) + // 纵向 文本置顶 + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 100, + Right: 150, + Bottom: top + 150, + }), + ).OverrideTextStyle(charts.Style{ + FontColor: drawing.ColorBlack, + FontSize: 10, + }).MultiText(charts.MultiTextOption{ + Orient: charts.OrientVertical, + Position: charts.PositionTop, + Align: charts.AlignCenter, + TextList: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + }) + + // grid + top += 150 + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: top + 100, + }), + ).OverrideTextStyle(charts.Style{ + FontColor: drawing.ColorBlack, + FontSize: 10, + }).Grid(charts.GridOption{ + Column: 8, + IgnoreColumnLines: []int{0, 8}, + Row: 8, + IgnoreRowLines: []int{0, 8}, + }) + + // dots + top += 100 + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: top + 20, + }), + ).OverrideDrawingStyle(charts.Style{ + FillColor: drawing.ColorWhite, + StrokeColor: drawing.ColorBlack, + StrokeWidth: 1, + }).Dots([]charts.Point{ + { + X: 0, + Y: 0, + }, + { + X: 50, + Y: 0, + }, + { + X: 100, + Y: 10, + }, + }) + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + err = writeFile(buf) + if err != nil { + panic(err) + } +} diff --git a/line.go b/line.go deleted file mode 100644 index e4b1f18..0000000 --- a/line.go +++ /dev/null @@ -1,46 +0,0 @@ -// MIT License - -// Copyright (c) 2022 Tree Xie - -// 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. - -package charts - -type LineStyle struct { - ClassName string - StrokeDashArray []float64 - StrokeColor Color - StrokeWidth float64 - FillColor Color - DotWidth float64 - DotColor Color - DotFillColor Color -} - -func (ls *LineStyle) Style() Style { - return Style{ - ClassName: ls.ClassName, - StrokeDashArray: ls.StrokeDashArray, - StrokeColor: ls.StrokeColor, - StrokeWidth: ls.StrokeWidth, - FillColor: ls.FillColor, - DotWidth: ls.DotWidth, - DotColor: ls.DotColor, - } -} diff --git a/painter.go b/painter.go index 0120d68..78d8925 100644 --- a/painter.go +++ b/painter.go @@ -124,6 +124,7 @@ func PainterThemeOption(theme ColorPalette) PainterOption { } } +// PainterWidthHeightOption set width or height of draw painter func PainterWidthHeightOption(width, height int) PainterOption { return func(p *Painter) { if width > 0 { @@ -678,3 +679,11 @@ func (p *Painter) Grid(opt GridOption) *Painter { } return p } + +func (p *Painter) Dots(points []Point) *Painter { + for _, item := range points { + p.Circle(5, item.X, item.Y) + } + p.FillStroke() + return p +} From e090622326f8181d1ae33a95a35bf20dbd1e0ba2 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 31 May 2022 20:26:58 +0800 Subject: [PATCH 132/251] fix: fix example of chinese --- examples/{basic/chinese.go => chinese/main.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{basic/chinese.go => chinese/main.go} (100%) diff --git a/examples/basic/chinese.go b/examples/chinese/main.go similarity index 100% rename from examples/basic/chinese.go rename to examples/chinese/main.go From 6041098d33d5e1f2ca670a08535381ed0278f2bc Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 31 May 2022 20:36:01 +0800 Subject: [PATCH 133/251] fix: fix write file --- examples/chinese/main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/chinese/main.go b/examples/chinese/main.go index 4380349..e0125b4 100644 --- a/examples/chinese/main.go +++ b/examples/chinese/main.go @@ -1,8 +1,8 @@ package main import ( + "io/ioutil" "log" - "os" charts "github.com/vicanso/go-charts" ) @@ -30,7 +30,7 @@ func echartsRender() ([]byte, error) { } func main() { - fontData, err := os.ReadFile("/Users/darcy/Downloads/NotoSansCJKsc-VF.ttf") + fontData, err := ioutil.ReadFile("/Users/darcy/Downloads/NotoSansCJKsc-VF.ttf") if err != nil { log.Fatalln("Error when reading font file:", err) } @@ -44,7 +44,7 @@ func main() { if err != nil { log.Fatalln("Error when rendering image:", err) } - if err := os.WriteFile("chinese.png", fileData, 0644); err != nil { + if err := ioutil.WriteFile("chinese.png", fileData, 0644); err != nil { log.Fatalln("Error when save image to chinese.png:", err) } } From 622bd8491b778aeeec7209b76e36f93415ad88ac Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 1 Jun 2022 20:27:46 +0800 Subject: [PATCH 134/251] feat: support rect and legend line point render --- examples/painter/main.go | 36 ++++++++++++++++++++++++++++++++++++ painter.go | 26 ++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/examples/painter/main.go b/examples/painter/main.go index d0eec73..8b0a157 100644 --- a/examples/painter/main.go +++ b/examples/painter/main.go @@ -373,6 +373,42 @@ func main() { }, }) + // rect + top += 30 + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: 200, + Bottom: top + 50, + }), + ).OverrideDrawingStyle(charts.Style{ + StrokeColor: drawing.ColorBlack, + FillColor: drawing.ColorBlack, + }).Rect(charts.Box{ + Left: 10, + Top: 0, + Right: 110, + Bottom: 20, + }) + // legend line dot + p.Child( + charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 200, + Right: p.Width() - 1, + Bottom: top + 50, + }), + ).OverrideDrawingStyle(charts.Style{ + StrokeColor: drawing.ColorBlack, + FillColor: drawing.ColorBlack, + }).LegendLineDot(charts.Box{ + Left: 10, + Top: 0, + Right: 50, + Bottom: 20, + }) + buf, err := p.Bytes() if err != nil { panic(err) diff --git a/painter.go b/painter.go index 78d8925..95469f3 100644 --- a/painter.go +++ b/painter.go @@ -687,3 +687,29 @@ func (p *Painter) Dots(points []Point) *Painter { p.FillStroke() return p } + +func (p *Painter) Rect(box Box) *Painter { + p.MoveTo(box.Left, box.Top) + p.LineTo(box.Right, box.Top) + p.LineTo(box.Right, box.Bottom) + p.LineTo(box.Left, box.Bottom) + p.LineTo(box.Left, box.Top) + p.FillStroke() + return p +} + +func (p *Painter) LegendLineDot(box Box) *Painter { + width := box.Width() + height := box.Height() + strokeWidth := 3 + dotHeight := 5 + + p.render.SetStrokeWidth(float64(strokeWidth)) + center := (height - strokeWidth) >> 1 + p.MoveTo(box.Left, box.Top+center) + p.LineTo(box.Right, box.Top+center) + p.Stroke() + p.Circle(float64(dotHeight), box.Left+width>>1, center) + p.FillStroke() + return p +} From 4bec97baa59d916359dd1890af0559406ab0b43c Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 1 Jun 2022 21:09:46 +0800 Subject: [PATCH 135/251] fix: fix label position of pie, #9 --- pie_chart.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pie_chart.go b/pie_chart.go index 099a91c..15c0d35 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -96,6 +96,8 @@ func pieChartRender(opt pieChartOption, result *basicRenderResult) error { d.circle(radius, cx, cy) } else { currentValue := float64(0) + prevEndX := 0 + prevEndY := 0 for index, v := range values { pieStyle := getPieStyle(theme, index) @@ -124,6 +126,14 @@ func pieChartRender(opt pieChartOption, result *basicRenderResult) error { endx := cx + int(labelRadius*math.Cos(angle)) endy := cy + int(labelRadius*math.Sin(angle)) + // 计算是否有重叠,如果有则调整y坐标位置 + if index != 0 && + math.Abs(float64(endx-prevEndX)) < labelFontSize && + math.Abs(float64(endy-prevEndY)) < labelFontSize { + endy -= (labelFontSize << 1) + } + prevEndX = endx + prevEndY = endy d.moveTo(startx, starty) d.lineTo(endx, endy) offset := labelLineWidth From 7ee13fe9143b34280b12af28efc52602b9482fb8 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 3 Jun 2022 21:06:40 +0800 Subject: [PATCH 136/251] chore: supper grid renderer --- alias.go | 1 - charts.go | 27 ++++++++++++++ examples/painter/main.go | 13 +++++++ grid.go | 80 ++++++++++++++++++++++++++++++++++++++++ painter.go | 2 +- 5 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 charts.go create mode 100644 grid.go diff --git a/alias.go b/alias.go index d19c1f9..0b161e6 100644 --- a/alias.go +++ b/alias.go @@ -28,7 +28,6 @@ import ( ) type Box = chart.Box -type Renderer = chart.Renderer type Style = chart.Style type Color = drawing.Color diff --git a/charts.go b/charts.go new file mode 100644 index 0000000..445dd7e --- /dev/null +++ b/charts.go @@ -0,0 +1,27 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +type Renderer interface { + Render() (Box, error) +} diff --git a/examples/painter/main.go b/examples/painter/main.go index 8b0a157..4614f10 100644 --- a/examples/painter/main.go +++ b/examples/painter/main.go @@ -409,6 +409,19 @@ func main() { Bottom: 20, }) + top += 50 + charts.NewGridPainter(p.Child(charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: top + 100, + })), charts.GridPainterOption{ + Row: 5, + IgnoreFirstRow: true, + IgnoreLastRow: true, + StrokeColor: drawing.ColorBlue, + }).Render() + buf, err := p.Bytes() if err != nil { panic(err) diff --git a/grid.go b/grid.go new file mode 100644 index 0000000..1a00381 --- /dev/null +++ b/grid.go @@ -0,0 +1,80 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +type GridPainter struct { + p *Painter + opt *GridPainterOption +} + +type GridPainterOption struct { + StrokeWidth float64 + StrokeColor Color + Column int + Row int + IgnoreFirstRow bool + IgnoreLastRow bool + IgnoreFirstColumn bool + IgnoreLastColumn bool +} + +func NewGridPainter(p *Painter, opt GridPainterOption) *GridPainter { + return &GridPainter{ + p: p, + opt: &opt, + } +} + +func (g *GridPainter) Render() (Box, error) { + opt := g.opt + ignoreColumnLines := make([]int, 0) + if opt.IgnoreFirstColumn { + ignoreColumnLines = append(ignoreColumnLines, 0) + } + if opt.IgnoreLastColumn { + ignoreColumnLines = append(ignoreColumnLines, opt.Column) + } + ignoreRowLines := make([]int, 0) + if opt.IgnoreFirstRow { + ignoreRowLines = append(ignoreRowLines, 0) + } + if opt.IgnoreLastRow { + ignoreRowLines = append(ignoreRowLines, opt.Row) + } + strokeWidth := opt.StrokeWidth + if strokeWidth <= 0 { + strokeWidth = 1 + } + + g.p.SetDrawingStyle(Style{ + StrokeWidth: strokeWidth, + StrokeColor: opt.StrokeColor, + }) + g.p.Grid(GridOption{ + Column: opt.Column, + Row: opt.Row, + IgnoreColumnLines: ignoreColumnLines, + IgnoreRowLines: ignoreRowLines, + }) + return g.p.box, nil +} diff --git a/painter.go b/painter.go index 95469f3..851fe11 100644 --- a/painter.go +++ b/painter.go @@ -32,7 +32,7 @@ import ( ) type Painter struct { - render Renderer + render chart.Renderer box Box font *truetype.Font parent *Painter From 4cf494088e029f30563ff40ab7dbd799b9c00f39 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 7 Jun 2022 23:04:39 +0800 Subject: [PATCH 137/251] feat: support legend render --- examples/painter/main.go | 56 +++++++++++++- legend.go | 154 +++++++++++++++++++++++++++++++++++++++ painter.go | 11 ++- 3 files changed, 216 insertions(+), 5 deletions(-) create mode 100644 legend.go diff --git a/examples/painter/main.go b/examples/painter/main.go index 4614f10..094b98e 100644 --- a/examples/painter/main.go +++ b/examples/painter/main.go @@ -26,7 +26,7 @@ func writeFile(buf []byte) error { func main() { p, err := charts.NewPainter(charts.PainterOptions{ - Width: 400, + Width: 600, Height: 1200, Type: charts.ChartOutputPNG, }) @@ -422,6 +422,60 @@ func main() { StrokeColor: drawing.ColorBlue, }).Render() + top += 100 + charts.NewLegendPainter(p.Child(charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: top + 30, + })), charts.LegendPainterOption{ + Data: []string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + }, + FontSize: 12, + FontColor: drawing.ColorBlack, + }).Render() + + top += 30 + charts.NewLegendPainter(p.Child(charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: top + 30, + })), charts.LegendPainterOption{ + Data: []string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + }, + Align: charts.AlignRight, + FontSize: 16, + Icon: charts.IconRect, + FontColor: drawing.ColorBlack, + }).Render() + + top += 30 + charts.NewLegendPainter(p.Child(charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: top + 100, + })), charts.LegendPainterOption{ + Data: []string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + }, + Orient: charts.OrientVertical, + FontSize: 12, + FontColor: drawing.ColorBlack, + }).Render() + buf, err := p.Bytes() if err != nil { panic(err) diff --git a/legend.go b/legend.go new file mode 100644 index 0000000..d128272 --- /dev/null +++ b/legend.go @@ -0,0 +1,154 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +type LegendPainter struct { + p *Painter + opt *LegendPainterOption +} + +const IconRect = "rect" +const IconLineDot = "lineDot" + +type LegendPainterOption struct { + Theme ColorPalette + // Text array of legend + Data []string + // Distance between legend component and the left side of the container. + // It can be pixel value: 20, percentage value: 20%, + // or position value: right, center. + Left string + // Distance between legend component and the top side of the container. + // It can be pixel value: 20. + Top string + // Legend marker and text aligning, it can be left or right, default is left. + Align string + // The layout orientation of legend, it can be horizontal or vertical, default is horizontal. + Orient string + // Icon of the legend. + Icon string + // Font size of legend text + FontSize float64 + // FontColor color of legend text + FontColor Color +} + +func NewLegendPainter(p *Painter, opt LegendPainterOption) *LegendPainter { + return &LegendPainter{ + p: p, + opt: &opt, + } +} + +func (l *LegendPainter) Render() (Box, error) { + opt := l.opt + theme := opt.Theme + if theme == nil { + theme = l.p.theme + } + p := l.p + p.SetTextStyle(Style{ + FontSize: opt.FontSize, + FontColor: opt.FontColor, + }) + measureList := make([]Box, len(opt.Data)) + maxTextWidth := 0 + for index, text := range opt.Data { + b := p.MeasureText(text) + if b.Width() > maxTextWidth { + maxTextWidth = b.Width() + } + measureList[index] = b + } + x := 0 + y := 0 + offset := 20 + textOffset := 2 + legendWidth := 30 + legendHeight := 20 + drawIcon := func(top, left int) int { + if opt.Icon == IconRect { + p.Rect(Box{ + Top: top - legendHeight + 4, + Left: left, + Right: left + legendWidth, + Bottom: top - 2, + }) + } else { + p.LegendLineDot(Box{ + Top: top, + Left: left, + Right: left + legendWidth, + Bottom: top + legendHeight, + }) + } + return left + legendWidth + } + for index, text := range opt.Data { + color := theme.GetSeriesColor(index) + p.SetDrawingStyle(Style{ + FillColor: color, + StrokeColor: color, + }) + if opt.Align != AlignRight { + x = drawIcon(y, x) + x += textOffset + } + p.Text(text, x, y) + x += measureList[index].Width() + if opt.Align == AlignRight { + x += textOffset + x = drawIcon(0, x) + } + if opt.Orient == OrientVertical { + y += offset + x = 0 + } else { + x += offset + y = 0 + } + } + width := 0 + height := 0 + for _, item := range measureList { + if opt.Orient == OrientVertical { + height += item.Height() + } else { + width += item.Width() + } + } + if opt.Orient == OrientVertical { + width = maxTextWidth + textOffset + legendWidth + height = offset * len(opt.Data) + } else { + height = legendHeight + offsetValue := (len(opt.Data) - 1) * (offset + textOffset) + allLegendWidth := len(opt.Data) * legendWidth + width += (offsetValue + allLegendWidth) + } + + return Box{ + Right: width, + Bottom: height, + }, nil +} diff --git a/painter.go b/painter.go index 851fe11..61a8e95 100644 --- a/painter.go +++ b/painter.go @@ -170,6 +170,9 @@ func NewPainter(opts PainterOptions, opt ...PainterOption) (*Painter, error) { font: font, } p.setOptions(opt...) + if p.theme == nil { + p.theme = NewTheme(ThemeLight) + } return p, nil } func (p *Painter) setOptions(opts ...PainterOption) { @@ -705,11 +708,11 @@ func (p *Painter) LegendLineDot(box Box) *Painter { dotHeight := 5 p.render.SetStrokeWidth(float64(strokeWidth)) - center := (height - strokeWidth) >> 1 - p.MoveTo(box.Left, box.Top+center) - p.LineTo(box.Right, box.Top+center) + center := (height-strokeWidth)>>1 - 1 + p.MoveTo(box.Left, box.Top-center) + p.LineTo(box.Right, box.Top-center) p.Stroke() - p.Circle(float64(dotHeight), box.Left+width>>1, center) + p.Circle(float64(dotHeight), box.Left+width>>1, box.Top-center) p.FillStroke() return p } From b394e1b49f9965a06b3be4e9121301fad81b144a Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 8 Jun 2022 23:19:03 +0800 Subject: [PATCH 138/251] feat: support axis render --- axis.go | 192 +++++++++++++++++++++++++++++++++++++++ examples/painter/main.go | 71 ++++++++++++++- grid.go | 8 +- legend.go | 97 +++++++++++++------- painter.go | 15 +++ 5 files changed, 344 insertions(+), 39 deletions(-) create mode 100644 axis.go diff --git a/axis.go b/axis.go new file mode 100644 index 0000000..d2b559b --- /dev/null +++ b/axis.go @@ -0,0 +1,192 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/golang/freetype/truetype" +) + +type axisPainter struct { + p *Painter + opt *AxisPainterOption +} + +func NewAxisPainter(p *Painter, opt AxisPainterOption) *axisPainter { + return &axisPainter{ + p: p, + opt: &opt, + } +} + +type AxisPainterOption struct { + // The label of axis + Data []string + // The boundary gap on both sides of a coordinate axis. + // Nil or *true means the center part of two axis ticks + BoundaryGap *bool + // The position of axis, it can be 'left', 'top', 'right' or 'bottom' + Position string + // Number of segments that the axis is split into. Note that this number serves only as a recommendation. + SplitNumber int + // The line color of axis + StrokeColor Color + // The line width + StrokeWidth float64 + // The length of the axis tick + TickLength int + // The margin value of label + LabelMargin int + // The font size of label + FontSize float64 + // The font of label + Font *truetype.Font + // The color of label + FontColor Color + // The flag for show axis split line, set this to true will show axis split line + SplitLineShow bool + // The color of split line + SplitLineColor Color +} + +func (a *axisPainter) Render() (Box, error) { + opt := a.opt + p := a.p + + strokeWidth := opt.StrokeWidth + if strokeWidth == 0 { + strokeWidth = 1 + } + + tickCount := opt.SplitNumber + if tickCount == 0 { + tickCount = len(opt.Data) + } + + boundaryGap := true + if opt.BoundaryGap != nil && !*opt.BoundaryGap { + boundaryGap = false + } + + labelPosition := "" + if !boundaryGap { + tickCount-- + labelPosition = PositionLeft + } + + // TODO 计算unit + unit := 1 + // 如果小于0,则表示不处理 + tickLength := getDefaultInt(opt.TickLength, 5) + labelMargin := getDefaultInt(opt.LabelMargin, 5) + + textMaxWidth, textMaxHeight := p.MeasureTextMaxWidthHeight(opt.Data) + + width := 0 + height := 0 + // 垂直 + if opt.Position == PositionLeft || + opt.Position == PositionRight { + width = textMaxWidth + tickLength<<1 + height = p.Height() + } else { + width = p.Width() + height = tickLength<<1 + textMaxHeight + } + padding := Box{} + switch opt.Position { + case PositionTop: + padding.Top = p.Height() - height + case PositionLeft: + padding.Right = p.Width() - width + } + p = p.Child(PainterPaddingOption(padding)) + p.SetDrawingStyle(Style{ + StrokeColor: opt.StrokeColor, + StrokeWidth: strokeWidth, + }).OverrideTextStyle(Style{ + Font: opt.Font, + FontColor: opt.FontColor, + FontSize: opt.FontSize, + }) + + x0 := 0 + y0 := 0 + x1 := 0 + y1 := 0 + ticksPadding := 0 + labelPadding := 0 + orient := "" + textAlign := "" + + switch opt.Position { + case PositionTop: + labelPadding = labelMargin + x1 = p.Width() + y0 = labelMargin + int(opt.FontSize) + ticksPadding = int(opt.FontSize) + y1 = y0 + orient = OrientHorizontal + case PositionLeft: + orient = OrientVertical + textAlign = AlignRight + default: + labelPadding = height + x1 = p.Width() + orient = OrientHorizontal + } + + p.Child(PainterPaddingOption(Box{ + Top: ticksPadding, + })).Ticks(TicksOption{ + Count: tickCount, + Length: tickLength, + Unit: unit, + Orient: orient, + }) + + p.LineStroke([]Point{ + { + X: x0, + Y: y0, + }, + { + X: x1, + Y: y1, + }, + }) + + p.Child(PainterPaddingOption(Box{ + Top: labelPadding, + })).MultiText(MultiTextOption{ + Align: textAlign, + TextList: opt.Data, + Orient: orient, + Unit: unit, + Position: labelPosition, + }) + + return Box{ + Bottom: height, + Right: width, + }, nil +} diff --git a/examples/painter/main.go b/examples/painter/main.go index 094b98e..acbb3ef 100644 --- a/examples/painter/main.go +++ b/examples/painter/main.go @@ -27,7 +27,7 @@ func writeFile(buf []byte) error { func main() { p, err := charts.NewPainter(charts.PainterOptions{ Width: 600, - Height: 1200, + Height: 2000, Type: charts.ChartOutputPNG, }) if err != nil { @@ -429,6 +429,7 @@ func main() { Right: p.Width() - 1, Bottom: top + 30, })), charts.LegendPainterOption{ + Left: "10", Data: []string{ "Email", "Union Ads", @@ -446,6 +447,7 @@ func main() { Right: p.Width() - 1, Bottom: top + 30, })), charts.LegendPainterOption{ + Left: charts.PositionRight, Data: []string{ "Email", "Union Ads", @@ -465,6 +467,7 @@ func main() { Right: p.Width() - 1, Bottom: top + 100, })), charts.LegendPainterOption{ + Top: "10", Data: []string{ "Email", "Union Ads", @@ -476,6 +479,72 @@ func main() { FontColor: drawing.ColorBlack, }).Render() + top += 100 + charts.NewAxisPainter(p.Child(charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: top + 50, + })), charts.AxisPainterOption{ + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + StrokeColor: drawing.ColorBlack, + FontSize: 12, + FontColor: drawing.ColorBlack, + }).Render() + + top += 50 + charts.NewAxisPainter(p.Child(charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 1, + Right: p.Width() - 1, + Bottom: top + 50, + })), charts.AxisPainterOption{ + Position: charts.PositionTop, + BoundaryGap: charts.FalseFlag(), + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + StrokeColor: drawing.ColorBlack, + FontSize: 12, + FontColor: drawing.ColorBlack, + }).Render() + + top += 50 + charts.NewAxisPainter(p.Child(charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 10, + Right: p.Width() - 1, + Bottom: top + 200, + })), charts.AxisPainterOption{ + Position: charts.PositionLeft, + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + StrokeColor: drawing.ColorBlack, + FontSize: 12, + FontColor: drawing.ColorBlack, + }).Render() + buf, err := p.Bytes() if err != nil { panic(err) diff --git a/grid.go b/grid.go index 1a00381..252fe2e 100644 --- a/grid.go +++ b/grid.go @@ -22,7 +22,7 @@ package charts -type GridPainter struct { +type gridPainter struct { p *Painter opt *GridPainterOption } @@ -38,14 +38,14 @@ type GridPainterOption struct { IgnoreLastColumn bool } -func NewGridPainter(p *Painter, opt GridPainterOption) *GridPainter { - return &GridPainter{ +func NewGridPainter(p *Painter, opt GridPainterOption) *gridPainter { + return &gridPainter{ p: p, opt: &opt, } } -func (g *GridPainter) Render() (Box, error) { +func (g *gridPainter) Render() (Box, error) { opt := g.opt ignoreColumnLines := make([]int, 0) if opt.IgnoreFirstColumn { diff --git a/legend.go b/legend.go index d128272..16341e4 100644 --- a/legend.go +++ b/legend.go @@ -22,7 +22,12 @@ package charts -type LegendPainter struct { +import ( + "strconv" + "strings" +) + +type legendPainter struct { p *Painter opt *LegendPainterOption } @@ -53,14 +58,14 @@ type LegendPainterOption struct { FontColor Color } -func NewLegendPainter(p *Painter, opt LegendPainterOption) *LegendPainter { - return &LegendPainter{ +func NewLegendPainter(p *Painter, opt LegendPainterOption) *legendPainter { + return &legendPainter{ p: p, opt: &opt, } } -func (l *LegendPainter) Render() (Box, error) { +func (l *legendPainter) Render() (Box, error) { opt := l.opt theme := opt.Theme if theme == nil { @@ -80,12 +85,54 @@ func (l *LegendPainter) Render() (Box, error) { } measureList[index] = b } - x := 0 - y := 0 + + // 计算展示的宽高 + width := 0 + height := 0 offset := 20 textOffset := 2 legendWidth := 30 legendHeight := 20 + for _, item := range measureList { + if opt.Orient == OrientVertical { + height += item.Height() + } else { + width += item.Width() + } + } + if opt.Orient == OrientVertical { + width = maxTextWidth + textOffset + legendWidth + height = offset * len(opt.Data) + } else { + height = legendHeight + offsetValue := (len(opt.Data) - 1) * (offset + textOffset) + allLegendWidth := len(opt.Data) * legendWidth + width += (offsetValue + allLegendWidth) + } + + // 计算开始的位置 + left := 0 + switch opt.Left { + case PositionRight: + left = p.Width() - width + case PositionCenter: + left = (p.Width() - width) >> 1 + default: + if strings.HasSuffix(opt.Left, "%") { + value, _ := strconv.Atoi(strings.ReplaceAll(opt.Left, "%", "")) + left = p.Width() * value / 100 + } else { + value, _ := strconv.Atoi(opt.Left) + left = value + } + } + top, _ := strconv.Atoi(opt.Top) + + x := int(left) + y := int(top) + x0 := x + y0 := y + drawIcon := func(top, left int) int { if opt.Icon == IconRect { p.Rect(Box{ @@ -111,41 +158,23 @@ func (l *LegendPainter) Render() (Box, error) { StrokeColor: color, }) if opt.Align != AlignRight { - x = drawIcon(y, x) - x += textOffset + x0 = drawIcon(y0, x0) + x0 += textOffset } - p.Text(text, x, y) - x += measureList[index].Width() + p.Text(text, x0, y0) + x0 += measureList[index].Width() if opt.Align == AlignRight { - x += textOffset - x = drawIcon(0, x) + x0 += textOffset + x0 = drawIcon(0, x0) } if opt.Orient == OrientVertical { - y += offset - x = 0 + y0 += offset + x0 = x } else { - x += offset - y = 0 + x0 += offset + y0 = y } } - width := 0 - height := 0 - for _, item := range measureList { - if opt.Orient == OrientVertical { - height += item.Height() - } else { - width += item.Width() - } - } - if opt.Orient == OrientVertical { - width = maxTextWidth + textOffset + legendWidth - height = offset * len(opt.Data) - } else { - height = legendHeight - offsetValue := (len(opt.Data) - 1) * (offset + textOffset) - allLegendWidth := len(opt.Data) * legendWidth - width += (offsetValue + allLegendWidth) - } return Box{ Right: width, diff --git a/painter.go b/painter.go index 61a8e95..fb18510 100644 --- a/painter.go +++ b/painter.go @@ -417,6 +417,21 @@ func (p *Painter) MeasureText(text string) Box { return p.render.MeasureText(text) } +func (p *Painter) MeasureTextMaxWidthHeight(textList []string) (int, int) { + maxWidth := 0 + maxHeight := 0 + for _, text := range textList { + box := p.MeasureText(text) + if maxWidth < box.Width() { + maxWidth = box.Width() + } + if maxHeight < box.Height() { + maxHeight = box.Height() + } + } + return maxWidth, maxHeight +} + func (p *Painter) LineStroke(points []Point) *Painter { for index, point := range points { x := point.X From c4045cfbbee1f8b8125ed8ee30e1c90f5f884eb1 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 12 Jun 2022 11:55:37 +0800 Subject: [PATCH 139/251] feat: support line chart render function --- axis.go | 154 ++++++++++++++------ charts.go | 23 +++ examples/line_chart/main.go | 111 +++++++++++++++ examples/painter/main.go | 54 +++++++- line_chart.go | 134 ++++++++++++++++++ painter.go | 4 +- range.go | 127 +++++++++++++++++ series.go | 270 ++++++++++++++++++++++++++++++++++++ theme.go | 27 +++- xaxis.go | 88 ++++++++++++ yaxis.go | 66 +++++++++ 11 files changed, 1012 insertions(+), 46 deletions(-) create mode 100644 examples/line_chart/main.go create mode 100644 line_chart.go create mode 100644 range.go create mode 100644 series.go create mode 100644 xaxis.go create mode 100644 yaxis.go diff --git a/axis.go b/axis.go index d2b559b..bb2e6a3 100644 --- a/axis.go +++ b/axis.go @@ -39,6 +39,8 @@ func NewAxisPainter(p *Painter, opt AxisPainterOption) *axisPainter { } type AxisPainterOption struct { + // The theme of chart + Theme ColorPalette // The label of axis Data []string // The boundary gap on both sides of a coordinate axis. @@ -70,13 +72,31 @@ type AxisPainterOption struct { func (a *axisPainter) Render() (Box, error) { opt := a.opt - p := a.p + top := a.p + theme := opt.Theme strokeWidth := opt.StrokeWidth if strokeWidth == 0 { strokeWidth = 1 } + font := opt.Font + if font == nil { + font = theme.GetFont() + } + fontColor := opt.FontColor + if fontColor.IsZero() { + fontColor = theme.GetTextColor() + } + fontSize := opt.FontSize + if fontSize == 0 { + fontSize = theme.GetFontSize() + } + strokeColor := opt.StrokeColor + if strokeColor.IsZero() { + strokeColor = theme.GetAxisStrokeColor() + } + tickCount := opt.SplitNumber if tickCount == 0 { tickCount = len(opt.Data) @@ -86,12 +106,17 @@ func (a *axisPainter) Render() (Box, error) { if opt.BoundaryGap != nil && !*opt.BoundaryGap { boundaryGap = false } + isVertical := opt.Position == PositionLeft || + opt.Position == PositionRight labelPosition := "" if !boundaryGap { tickCount-- labelPosition = PositionLeft } + if isVertical && boundaryGap { + labelPosition = PositionCenter + } // TODO 计算unit unit := 1 @@ -99,84 +124,104 @@ func (a *axisPainter) Render() (Box, error) { tickLength := getDefaultInt(opt.TickLength, 5) labelMargin := getDefaultInt(opt.LabelMargin, 5) - textMaxWidth, textMaxHeight := p.MeasureTextMaxWidthHeight(opt.Data) + style := Style{ + StrokeColor: strokeColor, + StrokeWidth: strokeWidth, + Font: font, + FontColor: fontColor, + FontSize: fontSize, + } + top.SetDrawingStyle(style).OverrideTextStyle(style) + + textMaxWidth, textMaxHeight := top.MeasureTextMaxWidthHeight(opt.Data) width := 0 height := 0 // 垂直 - if opt.Position == PositionLeft || - opt.Position == PositionRight { + if isVertical { width = textMaxWidth + tickLength<<1 - height = p.Height() + height = top.Height() } else { - width = p.Width() + width = top.Width() height = tickLength<<1 + textMaxHeight } padding := Box{} switch opt.Position { case PositionTop: - padding.Top = p.Height() - height + padding.Top = top.Height() - height case PositionLeft: - padding.Right = p.Width() - width + padding.Right = top.Width() - width + case PositionRight: + padding.Left = top.Width() - width } - p = p.Child(PainterPaddingOption(padding)) - p.SetDrawingStyle(Style{ - StrokeColor: opt.StrokeColor, - StrokeWidth: strokeWidth, - }).OverrideTextStyle(Style{ - Font: opt.Font, - FontColor: opt.FontColor, - FontSize: opt.FontSize, - }) + + p := top.Child(PainterPaddingOption(padding)) x0 := 0 y0 := 0 x1 := 0 y1 := 0 - ticksPadding := 0 - labelPadding := 0 + ticksPaddingTop := 0 + ticksPaddingLeft := 0 + labelPaddingTop := 0 + labelPaddingLeft := 0 + labelPaddingRight := 0 orient := "" textAlign := "" switch opt.Position { case PositionTop: - labelPadding = labelMargin + labelPaddingTop = labelMargin x1 = p.Width() y0 = labelMargin + int(opt.FontSize) - ticksPadding = int(opt.FontSize) + ticksPaddingTop = int(opt.FontSize) y1 = y0 orient = OrientHorizontal case PositionLeft: + x0 = p.Width() + y0 = 0 + x1 = p.Width() + y1 = p.Height() orient = OrientVertical textAlign = AlignRight + ticksPaddingLeft = textMaxWidth + tickLength + labelPaddingRight = width - textMaxWidth + case PositionRight: + orient = OrientVertical + y1 = p.Height() + labelPaddingLeft = width - textMaxWidth default: - labelPadding = height + labelPaddingTop = height x1 = p.Width() orient = OrientHorizontal } - p.Child(PainterPaddingOption(Box{ - Top: ticksPadding, - })).Ticks(TicksOption{ - Count: tickCount, - Length: tickLength, - Unit: unit, - Orient: orient, - }) - - p.LineStroke([]Point{ - { - X: x0, - Y: y0, - }, - { - X: x1, - Y: y1, - }, - }) + if strokeWidth > 0 { + p.Child(PainterPaddingOption(Box{ + Top: ticksPaddingTop, + Left: ticksPaddingLeft, + })).Ticks(TicksOption{ + Count: tickCount, + Length: tickLength, + Unit: unit, + Orient: orient, + }) + p.LineStroke([]Point{ + { + X: x0, + Y: y0, + }, + { + X: x1, + Y: y1, + }, + }) + } p.Child(PainterPaddingOption(Box{ - Top: labelPadding, + Left: labelPaddingLeft, + Top: labelPaddingTop, + Right: labelPaddingRight, })).MultiText(MultiTextOption{ Align: textAlign, TextList: opt.Data, @@ -184,6 +229,31 @@ func (a *axisPainter) Render() (Box, error) { Unit: unit, Position: labelPosition, }) + // 显示辅助线 + if opt.SplitLineShow { + style.StrokeColor = opt.SplitLineColor + top.OverrideDrawingStyle(style) + if isVertical { + x0 := p.Width() + x1 := top.Width() + if opt.Position == PositionRight { + x0 = 0 + x1 = top.Width() - p.Width() + } + for _, y := range autoDivide(height, tickCount) { + top.LineStroke([]Point{ + { + X: x0, + Y: y, + }, + { + X: x1, + Y: y, + }, + }) + } + } + } return Box{ Bottom: height, diff --git a/charts.go b/charts.go index 445dd7e..591ebea 100644 --- a/charts.go +++ b/charts.go @@ -25,3 +25,26 @@ package charts type Renderer interface { Render() (Box, error) } + +type defaultRenderOption struct { + Theme ColorPalette + Padding Box +} + +func defaultRender(p *Painter, opt defaultRenderOption) *Painter { + p.SetBackground(p.Width(), p.Height(), opt.Theme.GetBackgroundColor()) + if !opt.Padding.IsZero() { + p = p.Child(PainterPaddingOption(opt.Padding)) + } + return p +} + +func doRender(renderers ...Renderer) error { + for _, r := range renderers { + _, err := r.Render() + if err != nil { + return err + } + } + return nil +} diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go new file mode 100644 index 0000000..e15500c --- /dev/null +++ b/examples/line_chart/main.go @@ -0,0 +1,111 @@ +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + + "github.com/vicanso/go-charts" +) + +func writeFile(buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file := filepath.Join(tmpPath, "line-chart.png") + err = ioutil.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func main() { + p, err := charts.NewPainter(charts.PainterOptions{ + Width: 800, + Height: 600, + Type: charts.ChartOutputPNG, + }) + if err != nil { + panic(err) + } + _, err = charts.NewLineChart(p, charts.LineChartOption{ + Padding: charts.Box{ + Left: 10, + Top: 10, + Right: 10, + Bottom: 10, + }, + XAxis: charts.NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + SeriesList: charts.SeriesList{ + charts.NewSeriesFromValues([]float64{ + 120, + 132, + 101, + 134, + 90, + 230, + 210, + }), + charts.NewSeriesFromValues([]float64{ + 220, + 182, + 191, + 234, + 290, + 330, + 310, + }), + charts.NewSeriesFromValues([]float64{ + 150, + 232, + 201, + 154, + 190, + 330, + 410, + }), + charts.NewSeriesFromValues([]float64{ + 320, + 332, + 301, + 334, + 390, + 330, + 320, + }), + charts.NewSeriesFromValues([]float64{ + 820, + 932, + 901, + 934, + 1290, + 1330, + 1320, + }), + }, + }).Render() + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + err = writeFile(buf) + if err != nil { + panic(err) + } +} diff --git a/examples/painter/main.go b/examples/painter/main.go index acbb3ef..5022584 100644 --- a/examples/painter/main.go +++ b/examples/painter/main.go @@ -409,6 +409,7 @@ func main() { Bottom: 20, }) + // grid top += 50 charts.NewGridPainter(p.Child(charts.PainterBoxOption(charts.Box{ Top: top, @@ -422,6 +423,7 @@ func main() { StrokeColor: drawing.ColorBlue, }).Render() + // legend top += 100 charts.NewLegendPainter(p.Child(charts.PainterBoxOption(charts.Box{ Top: top, @@ -440,6 +442,7 @@ func main() { FontColor: drawing.ColorBlack, }).Render() + // legend top += 30 charts.NewLegendPainter(p.Child(charts.PainterBoxOption(charts.Box{ Top: top, @@ -460,6 +463,7 @@ func main() { FontColor: drawing.ColorBlack, }).Render() + // legend top += 30 charts.NewLegendPainter(p.Child(charts.PainterBoxOption(charts.Box{ Top: top, @@ -479,6 +483,7 @@ func main() { FontColor: drawing.ColorBlack, }).Render() + // axis bottom top += 100 charts.NewAxisPainter(p.Child(charts.PainterBoxOption(charts.Box{ Top: top, @@ -500,6 +505,7 @@ func main() { FontColor: drawing.ColorBlack, }).Render() + // axis top top += 50 charts.NewAxisPainter(p.Child(charts.PainterBoxOption(charts.Box{ Top: top, @@ -523,11 +529,12 @@ func main() { FontColor: drawing.ColorBlack, }).Render() + // axis left top += 50 charts.NewAxisPainter(p.Child(charts.PainterBoxOption(charts.Box{ Top: top, Left: 10, - Right: p.Width() - 1, + Right: 60, Bottom: top + 200, })), charts.AxisPainterOption{ Position: charts.PositionLeft, @@ -544,6 +551,51 @@ func main() { FontSize: 12, FontColor: drawing.ColorBlack, }).Render() + // axis right + charts.NewAxisPainter(p.Child(charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 100, + Right: 150, + Bottom: top + 200, + })), charts.AxisPainterOption{ + Position: charts.PositionRight, + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + StrokeColor: drawing.ColorBlack, + FontSize: 12, + FontColor: drawing.ColorBlack, + }).Render() + + // axis left no tick + charts.NewAxisPainter(p.Child(charts.PainterBoxOption(charts.Box{ + Top: top, + Left: 150, + Right: 300, + Bottom: top + 200, + })), charts.AxisPainterOption{ + BoundaryGap: charts.FalseFlag(), + Position: charts.PositionLeft, + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + FontSize: 12, + FontColor: drawing.ColorBlack, + SplitLineShow: true, + SplitLineColor: drawing.ColorBlack.WithAlpha(100), + }).Render() buf, err := p.Bytes() if err != nil { diff --git a/line_chart.go b/line_chart.go new file mode 100644 index 0000000..9640087 --- /dev/null +++ b/line_chart.go @@ -0,0 +1,134 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/wcharczuk/go-chart/v2" +) + +type lineChart struct { + p *Painter + opt *LineChartOption +} + +func NewLineChart(p *Painter, opt LineChartOption) *lineChart { + if opt.Theme == nil { + opt.Theme = NewTheme("") + } + return &lineChart{ + p: p, + opt: &opt, + } +} + +type LineChartOption struct { + Theme ColorPalette + // The data series list + SeriesList SeriesList + // The x axis option + XAxis XAxisOption + // The padding of line chart + Padding Box + // The y axis option + YAxis YAxisOption +} + +func (l *lineChart) Render() (Box, error) { + p := l.p + opt := l.opt + p = defaultRender(p, defaultRenderOption{ + Theme: opt.Theme, + Padding: opt.Padding, + }) + + seriesList := opt.SeriesList + seriesList.init() + // 过滤前先计算最大最小值 + max, min := seriesList.GetMaxMin() + + seriesList = seriesList.Filter(ChartTypeLine) + + // Y轴 + yr := NewRange(AxisRangeOption{ + Min: min, + Max: max, + // 高度需要减去x轴的高度 + Size: p.Height() - defaultXAxisHeight, + DivideCount: defaultAxisDivideCount, + }) + if opt.YAxis.Theme == nil { + opt.YAxis.Theme = opt.Theme + } + opt.YAxis.Data = yr.Values() + reverseStringSlice(opt.YAxis.Data) + yAxis := NewLeftYAxis(p, opt.YAxis) + yAxisBox, err := yAxis.Render() + if err != nil { + return chart.BoxZero, err + } + seriesPainter := p.Child(PainterPaddingOption(Box{ + Bottom: defaultXAxisHeight, + Left: yAxisBox.Width(), + })) + + if opt.XAxis.Theme == nil { + opt.XAxis.Theme = opt.Theme + } + xAxis := NewBottomXAxis(p.Child(PainterPaddingOption(Box{ + Left: yAxisBox.Width(), + })), opt.XAxis) + + xDivideValues := autoDivide(seriesPainter.Width(), len(opt.XAxis.Data)) + xValues := make([]int, len(xDivideValues)-1) + for i := 0; i < len(xDivideValues)-1; i++ { + xValues[i] = (xDivideValues[i] + xDivideValues[i+1]) >> 1 + } + for index, series := range seriesList { + seriesColor := opt.Theme.GetSeriesColor(index) + seriesPainter.SetDrawingStyle(Style{ + StrokeColor: seriesColor, + StrokeWidth: 2, + FillColor: seriesColor, + }) + points := make([]Point, 0) + for i, item := range series.Data { + h := yr.getRestHeight(item.Value) + p := Point{ + X: xValues[i], + Y: h, + } + points = append(points, p) + } + seriesPainter.LineStroke(points) + seriesPainter.Dots(points) + } + + err = doRender( + xAxis, + ) + if err != nil { + return chart.BoxZero, err + } + + return p.box, nil +} diff --git a/painter.go b/painter.go index fb18510..75d4a38 100644 --- a/painter.go +++ b/painter.go @@ -636,7 +636,7 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { x := 0 y := 0 if isVertical { - y = start - box.Height()>>1 + y = start + box.Height()>>1 switch opt.Align { case AlignRight: x = width - box.Width() @@ -700,7 +700,7 @@ func (p *Painter) Grid(opt GridOption) *Painter { func (p *Painter) Dots(points []Point) *Painter { for _, item := range points { - p.Circle(5, item.X, item.Y) + p.Circle(3, item.X, item.Y) } p.FillStroke() return p diff --git a/range.go b/range.go new file mode 100644 index 0000000..399c449 --- /dev/null +++ b/range.go @@ -0,0 +1,127 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "math" +) + +const defaultAxisDivideCount = 6 + +type axisRange struct { + divideCount int + min float64 + max float64 + size int + boundary bool +} + +type AxisRangeOption struct { + Min float64 + Max float64 + Size int + Boundary bool + DivideCount int +} + +func NewRange(opt AxisRangeOption) axisRange { + max := opt.Max + min := opt.Min + + max += math.Abs(max * 0.1) + min -= math.Abs(min * 0.1) + divideCount := opt.DivideCount + r := math.Abs(max - min) + + // 最小单位计算 + unit := 2 + if r > 10 { + unit = 4 + } + if r > 30 { + unit = 5 + } + if r > 100 { + unit = 10 + } + if r > 200 { + unit = 20 + } + unit = int((r/float64(divideCount))/float64(unit))*unit + unit + + if min != 0 { + isLessThanZero := min < 0 + min = float64(int(min/float64(unit)) * unit) + // 如果是小于0,int的时候向上取整了,因此调整 + if min < 0 || + (isLessThanZero && min == 0) { + min -= float64(unit) + } + } + max = min + float64(unit*divideCount) + return axisRange{ + divideCount: divideCount, + min: min, + max: max, + size: opt.Size, + boundary: opt.Boundary, + } +} + +func (r axisRange) Values() []string { + offset := (r.max - r.min) / float64(r.divideCount) + values := make([]string, 0) + for i := 0; i <= r.divideCount; i++ { + v := r.min + float64(i)*offset + value := commafWithDigits(v) + values = append(values, value) + } + return values +} + +func (r *axisRange) getHeight(value float64) int { + v := (value - r.min) / (r.max - r.min) + return int(v * float64(r.size)) +} + +func (r *axisRange) getRestHeight(value float64) int { + return r.size - r.getHeight(value) +} + +func (r *axisRange) GetRange(index int) (float64, float64) { + unit := float64(r.size) / float64(r.divideCount) + return unit * float64(index), unit * float64(index+1) +} +func (r *axisRange) AutoDivide() []int { + return autoDivide(r.size, r.divideCount) +} + +func (r *axisRange) getWidth(value float64) int { + v := value / (r.max - r.min) + // 移至居中 + if r.boundary && + r.divideCount != 0 { + v += 1 / float64(r.divideCount*2) + } + return int(v * float64(r.size)) +} diff --git a/series.go b/series.go new file mode 100644 index 0000000..07bd5d9 --- /dev/null +++ b/series.go @@ -0,0 +1,270 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. +package charts + +import ( + "math" + "strings" + + "github.com/dustin/go-humanize" + "github.com/wcharczuk/go-chart/v2" +) + +type SeriesData struct { + // The value of series data + Value float64 + // The style of series data + Style Style +} + +func NewSeriesFromValues(values []float64, chartType ...string) Series { + s := Series{ + Data: NewSeriesDataFromValues(values), + } + if len(chartType) != 0 { + s.Type = chartType[0] + } + return s +} + +func NewSeriesDataFromValues(values []float64) []SeriesData { + data := make([]SeriesData, len(values)) + for index, value := range values { + data[index] = SeriesData{ + Value: value, + } + } + return data +} + +type SeriesLabel struct { + // Data label formatter, which supports string template. + // {b}: the name of a data item. + // {c}: the value of a data item. + // {d}: the percent of a data item(pie chart). + Formatter string + // The color for label + Color Color + // Show flag for label + Show bool + // Distance to the host graphic element. + Distance int +} + +const ( + SeriesMarkDataTypeMax = "max" + SeriesMarkDataTypeMin = "min" + SeriesMarkDataTypeAverage = "average" +) + +type SeriesMarkData struct { + // The mark data type, it can be "max", "min", "average". + // The "average" is only for mark line + Type string +} +type SeriesMarkPoint struct { + // The width of symbol, default value is 30 + SymbolSize int + // The mark data of series mark point + Data []SeriesMarkData +} +type SeriesMarkLine struct { + // The mark data of series mark line + Data []SeriesMarkData +} +type Series struct { + index int + // The type of series, it can be "line", "bar" or "pie". + // Default value is "line" + Type string + // The data list of series + Data []SeriesData + // The Y axis index, it should be 0 or 1. + // Default value is 1 + YAxisIndex int + // The style for series + Style chart.Style + // The label for series + Label SeriesLabel + // The name of series + Name string + // Radius for Pie chart, e.g.: 40%, default is "40%" + Radius string + // Mark point for series + MarkPoint SeriesMarkPoint + // Make line for series + MarkLine SeriesMarkLine + // Max value of series + Min *float64 + // Min value of series + Max *float64 +} +type SeriesList []Series + +func (sl SeriesList) init() { + if sl[len(sl)-1].index != 0 { + return + } + for i := 0; i < len(sl); i++ { + if sl[i].Type == "" { + sl[i].Type = ChartTypeLine + } + sl[i].index = i + } +} + +func (sl SeriesList) Filter(chartType string) SeriesList { + arr := make(SeriesList, 0) + for index, item := range sl { + if item.Type == chartType { + arr = append(arr, sl[index]) + } + } + return arr +} + +// GetMaxMin get max and min value of series list +func (sl SeriesList) GetMaxMin() (float64, float64) { + min := math.MaxFloat64 + max := -math.MaxFloat64 + for _, series := range sl { + for _, item := range series.Data { + if item.Value > max { + max = item.Value + } + if item.Value < min { + min = item.Value + } + } + } + return max, min +} + +type PieSeriesOption struct { + Radius string + Label SeriesLabel + Names []string +} + +func NewPieSeriesList(values []float64, opts ...PieSeriesOption) SeriesList { + result := make([]Series, len(values)) + var opt PieSeriesOption + if len(opts) != 0 { + opt = opts[0] + } + for index, v := range values { + name := "" + if index < len(opt.Names) { + name = opt.Names[index] + } + s := Series{ + Type: ChartTypePie, + Data: []SeriesData{ + { + Value: v, + }, + }, + Radius: opt.Radius, + Label: opt.Label, + Name: name, + } + result[index] = s + } + return result +} + +type seriesSummary struct { + MaxIndex int + MaxValue float64 + MinIndex int + MinValue float64 + AverageValue float64 +} + +func (s *Series) Summary() seriesSummary { + minIndex := -1 + maxIndex := -1 + minValue := math.MaxFloat64 + maxValue := -math.MaxFloat64 + sum := float64(0) + for j, item := range s.Data { + if item.Value < minValue { + minIndex = j + minValue = item.Value + } + if item.Value > maxValue { + maxIndex = j + maxValue = item.Value + } + sum += item.Value + } + return seriesSummary{ + MaxIndex: maxIndex, + MaxValue: maxValue, + MinIndex: minIndex, + MinValue: minValue, + AverageValue: sum / float64(len(s.Data)), + } +} + +func (sl SeriesList) Names() []string { + names := make([]string, len(sl)) + for index, s := range sl { + names[index] = s.Name + } + return names +} + +type LabelFormatter func(index int, value float64, percent float64) string + +func NewPieLabelFormatter(seriesNames []string, layout string) LabelFormatter { + if len(layout) == 0 { + layout = "{b}: {d}" + } + return NewLabelFormatter(seriesNames, layout) +} + +func NewValueLabelFormater(seriesNames []string, layout string) LabelFormatter { + if len(layout) == 0 { + layout = "{c}" + } + return NewLabelFormatter(seriesNames, layout) +} + +func NewLabelFormatter(seriesNames []string, layout string) LabelFormatter { + return func(index int, value, percent float64) string { + // 如果无percent的则设置为<0 + percentText := "" + if percent >= 0 { + percentText = humanize.FtoaWithDigits(percent*100, 2) + "%" + } + valueText := humanize.FtoaWithDigits(value, 2) + name := "" + if len(seriesNames) > index { + name = seriesNames[index] + } + text := strings.ReplaceAll(layout, "{c}", valueText) + text = strings.ReplaceAll(text, "{d}", percentText) + text = strings.ReplaceAll(text, "{b}", name) + return text + } +} diff --git a/theme.go b/theme.go index bb05249..544588a 100644 --- a/theme.go +++ b/theme.go @@ -22,7 +22,11 @@ package charts -import "github.com/wcharczuk/go-chart/v2/drawing" +import ( + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) const ThemeDark = "dark" const ThemeLight = "light" @@ -36,6 +40,8 @@ type ColorPalette interface { GetSeriesColor(int) Color GetBackgroundColor() Color GetTextColor() Color + GetFontSize() float64 + GetFont() *truetype.Font } type themeColorPalette struct { @@ -45,10 +51,14 @@ type themeColorPalette struct { backgroundColor Color textColor Color seriesColors []Color + fontSize float64 + font *truetype.Font } var palettes = map[string]ColorPalette{} +const defaultFontSize = 12.0 + func init() { echartSeriesColors := []Color{ parseColor("#5470c6"), @@ -233,3 +243,18 @@ func (t *themeColorPalette) GetBackgroundColor() Color { func (t *themeColorPalette) GetTextColor() Color { return t.textColor } + +func (t *themeColorPalette) GetFontSize() float64 { + if t.fontSize != 0 { + return t.fontSize + } + return defaultFontSize +} + +func (t *themeColorPalette) GetFont() *truetype.Font { + if t.font != nil { + return t.font + } + f, _ := chart.GetDefaultFont() + return f +} diff --git a/xaxis.go b/xaxis.go new file mode 100644 index 0000000..a8c28c0 --- /dev/null +++ b/xaxis.go @@ -0,0 +1,88 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/golang/freetype/truetype" +) + +type XAxisOption struct { + // The font of x axis + Font *truetype.Font + // The boundary gap on both sides of a coordinate axis. + // Nil or *true means the center part of two axis ticks + BoundaryGap *bool + // The data value of x axis + Data []string + // The theme of chart + Theme ColorPalette + // The font size of x axis label + FontSize float64 + // Hidden x axis + Hidden bool + // Number of segments that the axis is split into. Note that this number serves only as a recommendation. + SplitNumber int + // The position of axis, it can be 'top' or 'bottom' + Position string + // The line color of axis + StrokeColor Color + // The color of label + FontColor Color +} + +const defaultXAxisHeight = 30 + +func NewXAxisOption(data []string, boundaryGap ...*bool) XAxisOption { + opt := XAxisOption{ + Data: data, + } + if len(boundaryGap) != 0 { + opt.BoundaryGap = boundaryGap[0] + } + return opt +} + +func (opt *XAxisOption) ToAxisPainterOption() AxisPainterOption { + position := PositionBottom + if opt.Position == PositionTop { + position = PositionTop + } + return AxisPainterOption{ + Theme: opt.Theme, + Data: opt.Data, + BoundaryGap: opt.BoundaryGap, + Position: position, + SplitNumber: opt.SplitNumber, + StrokeColor: opt.StrokeColor, + FontSize: opt.FontSize, + Font: opt.Font, + FontColor: opt.FontColor, + } +} + +func NewBottomXAxis(p *Painter, opt XAxisOption) *axisPainter { + p = p.Child(PainterPaddingOption(Box{ + Top: p.Height() - defaultXAxisHeight, + })) + return NewAxisPainter(p, opt.ToAxisPainterOption()) +} diff --git a/yaxis.go b/yaxis.go new file mode 100644 index 0000000..653f6ec --- /dev/null +++ b/yaxis.go @@ -0,0 +1,66 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import "github.com/golang/freetype/truetype" + +type YAxisOption struct { + // The font of y axis + Font *truetype.Font + // The data value of x axis + Data []string + // The theme of chart + Theme ColorPalette + // The font size of x axis label + FontSize float64 + // The position of axis, it can be 'left' or 'right' + Position string + // The color of label + FontColor Color +} + +func (opt *YAxisOption) ToAxisPainterOption() AxisPainterOption { + position := PositionLeft + if opt.Position == PositionRight { + position = PositionRight + } + return AxisPainterOption{ + Theme: opt.Theme, + Data: opt.Data, + Position: position, + FontSize: opt.FontSize, + StrokeWidth: -1, + Font: opt.Font, + FontColor: opt.FontColor, + BoundaryGap: FalseFlag(), + SplitLineShow: true, + SplitLineColor: opt.Theme.GetAxisSplitLineColor(), + } +} + +func NewLeftYAxis(p *Painter, opt YAxisOption) *axisPainter { + p = p.Child(PainterPaddingOption(Box{ + Bottom: defaultXAxisHeight, + })) + return NewAxisPainter(p, opt.ToAxisPainterOption()) +} From 72e11e49b17a39e897e5e6dd3bb88aabf54c29e4 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 12 Jun 2022 19:58:36 +0800 Subject: [PATCH 140/251] refactor: default render function for axis --- charts.go | 84 ++++++++++++++++++++++++++++++++++++++++++++++++--- line_chart.go | 53 +++++++------------------------- series.go | 9 ++++-- 3 files changed, 97 insertions(+), 49 deletions(-) diff --git a/charts.go b/charts.go index 591ebea..6a2f5f2 100644 --- a/charts.go +++ b/charts.go @@ -27,16 +27,92 @@ type Renderer interface { } type defaultRenderOption struct { - Theme ColorPalette - Padding Box + Theme ColorPalette + Padding Box + SeriesList SeriesList + // The y axis option + YAxisOptions []YAxisOption + // The x axis option + XAxis XAxisOption } -func defaultRender(p *Painter, opt defaultRenderOption) *Painter { +type defaultRenderResult struct { + axisRanges map[int]axisRange + p *Painter +} + +func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, error) { p.SetBackground(p.Width(), p.Height(), opt.Theme.GetBackgroundColor()) if !opt.Padding.IsZero() { p = p.Child(PainterPaddingOption(opt.Padding)) } - return p + result := defaultRenderResult{ + axisRanges: make(map[int]axisRange), + } + + // 计算图表对应的轴有哪些 + axisIndexList := make([]int, 0) + for _, series := range opt.SeriesList { + if containsInt(axisIndexList, series.AxisIndex) { + continue + } + axisIndexList = append(axisIndexList, series.index) + } + // 高度需要减去x轴的高度 + rangeHeight := p.Height() - defaultXAxisHeight + rangeWidth := 0 + + // 计算对应的axis range + for _, index := range axisIndexList { + max, min := opt.SeriesList.GetMaxMin(index) + r := NewRange(AxisRangeOption{ + Min: min, + Max: max, + // 高度需要减去x轴的高度 + Size: rangeHeight, + // 分隔数量 + DivideCount: defaultAxisDivideCount, + }) + result.axisRanges[index] = r + yAxisOption := YAxisOption{} + if len(opt.YAxisOptions) > index { + yAxisOption = opt.YAxisOptions[index] + } + if yAxisOption.Theme == nil { + yAxisOption.Theme = opt.Theme + } + yAxisOption.Data = r.Values() + reverseStringSlice(yAxisOption.Data) + // TODO生成其它位置既yAxis + yAxis := NewLeftYAxis(p, yAxisOption) + yAxisBox, err := yAxis.Render() + if err != nil { + return nil, err + } + rangeWidth += yAxisBox.Width() + } + + if opt.XAxis.Theme == nil { + opt.XAxis.Theme = opt.Theme + } + xAxis := NewBottomXAxis(p.Child(PainterPaddingOption(Box{ + Left: rangeWidth, + })), opt.XAxis) + _, err := xAxis.Render() + if err != nil { + return nil, err + } + + // // 生成Y轴 + // for _, yAxisOption := range opt.YAxisOptions { + + // } + + result.p = p.Child(PainterPaddingOption(Box{ + Bottom: rangeHeight, + Left: rangeWidth, + })) + return &result, nil } func doRender(renderers ...Renderer) error { diff --git a/line_chart.go b/line_chart.go index 9640087..3d93341 100644 --- a/line_chart.go +++ b/line_chart.go @@ -50,53 +50,28 @@ type LineChartOption struct { // The padding of line chart Padding Box // The y axis option - YAxis YAxisOption + YAxisOptions []YAxisOption } func (l *lineChart) Render() (Box, error) { p := l.p opt := l.opt - p = defaultRender(p, defaultRenderOption{ - Theme: opt.Theme, - Padding: opt.Padding, - }) - seriesList := opt.SeriesList seriesList.init() - // 过滤前先计算最大最小值 - max, min := seriesList.GetMaxMin() - - seriesList = seriesList.Filter(ChartTypeLine) - - // Y轴 - yr := NewRange(AxisRangeOption{ - Min: min, - Max: max, - // 高度需要减去x轴的高度 - Size: p.Height() - defaultXAxisHeight, - DivideCount: defaultAxisDivideCount, + renderResult, err := defaultRender(p, defaultRenderOption{ + Theme: opt.Theme, + Padding: opt.Padding, + SeriesList: seriesList, + XAxis: opt.XAxis, + YAxisOptions: opt.YAxisOptions, }) - if opt.YAxis.Theme == nil { - opt.YAxis.Theme = opt.Theme - } - opt.YAxis.Data = yr.Values() - reverseStringSlice(opt.YAxis.Data) - yAxis := NewLeftYAxis(p, opt.YAxis) - yAxisBox, err := yAxis.Render() if err != nil { return chart.BoxZero, err } - seriesPainter := p.Child(PainterPaddingOption(Box{ - Bottom: defaultXAxisHeight, - Left: yAxisBox.Width(), - })) - if opt.XAxis.Theme == nil { - opt.XAxis.Theme = opt.Theme - } - xAxis := NewBottomXAxis(p.Child(PainterPaddingOption(Box{ - Left: yAxisBox.Width(), - })), opt.XAxis) + seriesList = seriesList.Filter(ChartTypeLine) + + seriesPainter := renderResult.p xDivideValues := autoDivide(seriesPainter.Width(), len(opt.XAxis.Data)) xValues := make([]int, len(xDivideValues)-1) @@ -110,6 +85,7 @@ func (l *lineChart) Render() (Box, error) { StrokeWidth: 2, FillColor: seriesColor, }) + yr := renderResult.axisRanges[series.AxisIndex] points := make([]Point, 0) for i, item := range series.Data { h := yr.getRestHeight(item.Value) @@ -123,12 +99,5 @@ func (l *lineChart) Render() (Box, error) { seriesPainter.Dots(points) } - err = doRender( - xAxis, - ) - if err != nil { - return chart.BoxZero, err - } - return p.box, nil } diff --git a/series.go b/series.go index 07bd5d9..2888f30 100644 --- a/series.go +++ b/series.go @@ -99,8 +99,8 @@ type Series struct { // The data list of series Data []SeriesData // The Y axis index, it should be 0 or 1. - // Default value is 1 - YAxisIndex int + // Default value is 0 + AxisIndex int // The style for series Style chart.Style // The label for series @@ -143,10 +143,13 @@ func (sl SeriesList) Filter(chartType string) SeriesList { } // GetMaxMin get max and min value of series list -func (sl SeriesList) GetMaxMin() (float64, float64) { +func (sl SeriesList) GetMaxMin(axisIndex int) (float64, float64) { min := math.MaxFloat64 max := -math.MaxFloat64 for _, series := range sl { + if series.AxisIndex != axisIndex { + continue + } for _, item := range series.Data { if item.Value > max { max = item.Value From 8a5990fe8fd8ce0f3b40538ed645840c3e587f47 Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 13 Jun 2022 23:22:15 +0800 Subject: [PATCH 141/251] feat: support mark line and mark point render --- chart_option.go | 120 ++++ charts.go | 117 +++- examples/charts/main.go | 1321 +++++++++++++++++++++++++++++++++++ examples/line_chart/main.go | 13 + legend.go | 24 +- line_chart.go | 56 +- mark_line.go | 118 ++++ mark_point.go | 102 +++ painter.go | 2 +- title.go | 192 +++++ 10 files changed, 2046 insertions(+), 19 deletions(-) create mode 100644 chart_option.go create mode 100644 examples/charts/main.go create mode 100644 mark_line.go create mode 100644 mark_point.go create mode 100644 title.go diff --git a/chart_option.go b/chart_option.go new file mode 100644 index 0000000..6ca7cd7 --- /dev/null +++ b/chart_option.go @@ -0,0 +1,120 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "sort" + + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" +) + +type ChartOption struct { + theme ColorPalette + font *truetype.Font + // The output type of chart, "svg" or "png", default value is "svg" + Type string + // The font family, which should be installed first + FontFamily string + // The theme of chart, "light" and "dark". + // The default theme is "light" + Theme string + // The title option + Title TitleOption + // The legend option + Legend LegendOption + // The x axis option + XAxis XAxisOption + // The y axis option list + YAxisOptions []YAxisOption + // The width of chart, default width is 600 + Width int + // The height of chart, default height is 400 + Height int + Parent *Painter + // The padding for chart, default padding is [20, 10, 10, 10] + Padding Box + // The canvas box for chart + Box Box + // The series list + SeriesList SeriesList + // The radar indicator list + // RadarIndicators []RadarIndicator + // The background color of chart + BackgroundColor Color + // The child charts + Children []ChartOption +} + +func (o *ChartOption) fillDefault() { + t := NewTheme(o.Theme) + o.theme = t + // 如果为空,初始化 + axisCount := 1 + for _, series := range o.SeriesList { + if series.AxisIndex >= axisCount { + axisCount++ + } + } + o.Width = getDefaultInt(o.Width, defaultChartWidth) + o.Height = getDefaultInt(o.Height, defaultChartHeight) + yAxisOptions := make([]YAxisOption, axisCount) + copy(yAxisOptions, o.YAxisOptions) + o.YAxisOptions = yAxisOptions + o.font, _ = GetFont(o.FontFamily) + + if o.font == nil { + o.font, _ = chart.GetDefaultFont() + } + if o.BackgroundColor.IsZero() { + o.BackgroundColor = t.GetBackgroundColor() + } + if o.Padding.IsZero() { + o.Padding = chart.Box{ + Top: 10, + Right: 10, + Bottom: 10, + Left: 10, + } + } + // legend与series name的关联 + if len(o.Legend.Data) == 0 { + o.Legend.Data = o.SeriesList.Names() + } else { + seriesCount := len(o.SeriesList) + for index, name := range o.Legend.Data { + if index < seriesCount && + len(o.SeriesList[index].Name) == 0 { + o.SeriesList[index].Name = name + } + } + nameIndexDict := map[string]int{} + for index, name := range o.Legend.Data { + nameIndexDict[name] = index + } + // 保证series的顺序与legend一致 + sort.Slice(o.SeriesList, func(i, j int) bool { + return nameIndexDict[o.SeriesList[i].Name] < nameIndexDict[o.SeriesList[j].Name] + }) + } +} diff --git a/charts.go b/charts.go index 6a2f5f2..947fa8d 100644 --- a/charts.go +++ b/charts.go @@ -22,6 +22,24 @@ package charts +const labelFontSize = 10 +const defaultDotWidth = 2.0 +const defaultStrokeWidth = 2.0 + +var defaultChartWidth = 600 +var defaultChartHeight = 400 + +func SetDefaultWidth(width int) { + if width > 0 { + defaultChartWidth = width + } +} +func SetDefaultHeight(height int) { + if height > 0 { + defaultChartHeight = height + } +} + type Renderer interface { Render() (Box, error) } @@ -34,6 +52,10 @@ type defaultRenderOption struct { YAxisOptions []YAxisOption // The x axis option XAxis XAxisOption + // The title option + TitleOption TitleOption + // The legend option + LegendOption LegendOption } type defaultRenderResult struct { @@ -42,10 +64,37 @@ type defaultRenderResult struct { } func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, error) { - p.SetBackground(p.Width(), p.Height(), opt.Theme.GetBackgroundColor()) if !opt.Padding.IsZero() { p = p.Child(PainterPaddingOption(opt.Padding)) } + + if len(opt.LegendOption.Data) != 0 { + if opt.LegendOption.Theme == nil { + opt.LegendOption.Theme = opt.Theme + } + _, err := NewLegendPainter(p, opt.LegendOption).Render() + if err != nil { + return nil, err + } + } + + // 如果有标题 + if opt.TitleOption.Text != "" { + if opt.TitleOption.Theme == nil { + opt.TitleOption.Theme = opt.Theme + } + titlePainter := NewTitlePainter(p, opt.TitleOption) + + titleBox, err := titlePainter.Render() + if err != nil { + return nil, err + } + p = p.Child(PainterPaddingOption(Box{ + // 标题下留白 + Top: titleBox.Height() + 20, + })) + } + result := defaultRenderResult{ axisRanges: make(map[int]axisRange), } @@ -60,7 +109,8 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e } // 高度需要减去x轴的高度 rangeHeight := p.Height() - defaultXAxisHeight - rangeWidth := 0 + rangeWidthLeft := 0 + rangeWidthRight := 0 // 计算对应的axis range for _, index := range axisIndexList { @@ -89,28 +139,28 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e if err != nil { return nil, err } - rangeWidth += yAxisBox.Width() + if index == 0 { + rangeWidthLeft += yAxisBox.Width() + } else { + rangeWidthRight += yAxisBox.Width() + } } if opt.XAxis.Theme == nil { opt.XAxis.Theme = opt.Theme } xAxis := NewBottomXAxis(p.Child(PainterPaddingOption(Box{ - Left: rangeWidth, + Left: rangeWidthLeft, })), opt.XAxis) _, err := xAxis.Render() if err != nil { return nil, err } - // // 生成Y轴 - // for _, yAxisOption := range opt.YAxisOptions { - - // } - result.p = p.Child(PainterPaddingOption(Box{ Bottom: rangeHeight, - Left: rangeWidth, + Left: rangeWidthLeft, + Right: rangeWidthRight, })) return &result, nil } @@ -124,3 +174,50 @@ func doRender(renderers ...Renderer) error { } return nil } + +func Render(opt ChartOption) (*Painter, error) { + opt.fillDefault() + + if opt.Parent == nil { + p, err := NewPainter(PainterOptions{ + Type: opt.Type, + Width: opt.Width, + Height: opt.Height, + }) + if err != nil { + return nil, err + } + opt.Parent = p + } + p := opt.Parent + p.SetBackground(p.Width(), p.Height(), opt.BackgroundColor) + seriesList := opt.SeriesList + seriesList.init() + + rendererList := make([]Renderer, 0) + + // line chart + lineChartSeriesList := seriesList.Filter(ChartTypeLine) + if len(lineChartSeriesList) != 0 { + renderer := NewLineChart(p, LineChartOption{ + Theme: opt.theme, + Font: opt.font, + SeriesList: lineChartSeriesList, + XAxis: opt.XAxis, + Padding: opt.Padding, + YAxisOptions: opt.YAxisOptions, + TitleOption: opt.Title, + LegendOption: opt.Legend, + }) + rendererList = append(rendererList, renderer) + } + + for _, renderer := range rendererList { + _, err := renderer.Render() + if err != nil { + return nil, err + } + } + + return p, nil +} diff --git a/examples/charts/main.go b/examples/charts/main.go new file mode 100644 index 0000000..18f5a95 --- /dev/null +++ b/examples/charts/main.go @@ -0,0 +1,1321 @@ +package main + +import ( + "bytes" + "net/http" + "strconv" + + charts "github.com/vicanso/go-charts" +) + +var html = ` + + + + + + + go-charts + + +
{{body}}
+ + +` + +func handler(w http.ResponseWriter, req *http.Request, chartOptions []charts.ChartOption, echartsOptions []string) { + if req.URL.Path != "/" && + req.URL.Path != "/echarts" { + return + } + query := req.URL.Query() + theme := query.Get("theme") + width, _ := strconv.Atoi(query.Get("width")) + height, _ := strconv.Atoi(query.Get("height")) + charts.SetDefaultWidth(width) + charts.SetDefaultWidth(height) + bytesList := make([][]byte, 0) + for _, opt := range chartOptions { + opt.Theme = theme + d, err := charts.Render(opt) + if err != nil { + panic(err) + } + buf, err := d.Bytes() + if err != nil { + panic(err) + } + bytesList = append(bytesList, buf) + } + // for _, opt := range echartsOptions { + // buf, err := charts.RenderEChartsToSVG(opt) + // if err != nil { + // panic(err) + // } + // bytesList = append(bytesList, buf) + // } + + data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), bytes.Join(bytesList, []byte(""))) + w.Header().Set("Content-Type", "text/html") + w.Write(data) +} + +func indexHandler(w http.ResponseWriter, req *http.Request) { + chartOptions := []charts.ChartOption{ + { + Title: charts.TitleOption{ + Text: "Line", + }, + Legend: charts.NewLegendOption([]string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", + }), + XAxis: charts.NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + SeriesList: []charts.Series{ + charts.NewSeriesFromValues([]float64{ + 120, + 132, + 101, + 134, + 90, + 230, + 210, + }), + charts.NewSeriesFromValues([]float64{ + 220, + 182, + 191, + 234, + 290, + 330, + 310, + }), + charts.NewSeriesFromValues([]float64{ + 150, + 232, + 201, + 154, + 190, + 330, + 410, + }), + charts.NewSeriesFromValues([]float64{ + 320, + 332, + 301, + 334, + 390, + 330, + 320, + }), + charts.NewSeriesFromValues([]float64{ + 820, + 932, + 901, + 934, + 1290, + 1330, + 1320, + }), + }, + }, + // 温度折线图 + { + Title: charts.TitleOption{ + Text: "Temperature Change in the Coming Week", + }, + Padding: charts.Box{ + Top: 20, + Left: 20, + Right: 30, + Bottom: 20, + }, + Legend: charts.NewLegendOption([]string{ + "Highest", + "Lowest", + }, charts.PositionRight), + XAxis: charts.NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, charts.FalseFlag()), + SeriesList: []charts.Series{ + { + Data: charts.NewSeriesDataFromValues([]float64{ + 14, + 11, + 13, + 11, + 12, + 12, + 7, + }), + MarkPoint: charts.NewMarkPoint(charts.SeriesMarkDataTypeMax, charts.SeriesMarkDataTypeMin), + MarkLine: charts.NewMarkLine(charts.SeriesMarkDataTypeAverage), + }, + { + Data: charts.NewSeriesDataFromValues([]float64{ + 1, + -2, + 2, + 5, + 3, + 2, + 0, + }), + MarkLine: charts.NewMarkLine(charts.SeriesMarkDataTypeAverage), + }, + }, + }, + } + handler(w, req, chartOptions, nil) +} + +func echartsHandler(w http.ResponseWriter, req *http.Request) { + echartsOptions := []string{ + `{ + "xAxis": { + "type": "category", + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }, + "yAxis": { + "type": "value" + }, + "series": [ + { + "data": [ + 150, + 230, + 224, + 218, + 135, + 147, + 260 + ], + "type": "line" + } + ] + }`, + `{ + "title": { + "text": "Multiple Line" + }, + "tooltip": { + "trigger": "axis" + }, + "legend": { + "left": "right", + "data": [ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine" + ] + }, + "grid": { + "left": "3%", + "right": "4%", + "bottom": "3%", + "containLabel": true + }, + "toolbox": { + "feature": { + "saveAsImage": {} + } + }, + "xAxis": { + "type": "category", + "boundaryGap": false, + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }, + "yAxis": { + "type": "value" + }, + "series": [ + { + "name": "Email", + "type": "line", + "data": [ + 120, + 132, + 101, + 134, + 90, + 230, + 210 + ] + }, + { + "name": "Union Ads", + "type": "line", + "data": [ + 220, + 182, + 191, + 234, + 290, + 330, + 310 + ] + }, + { + "name": "Video Ads", + "type": "line", + "data": [ + 150, + 232, + 201, + 154, + 190, + 330, + 410 + ] + }, + { + "name": "Direct", + "type": "line", + "data": [ + 320, + 332, + 301, + 334, + 390, + 330, + 320 + ] + }, + { + "name": "Search Engine", + "type": "line", + "data": [ + 820, + 932, + 901, + 934, + 1290, + 1330, + 1320 + ] + } + ] + }`, + `{ + "title": { + "text": "Temperature Change in the Coming Week" + }, + "legend": { + "left": "right" + }, + "padding": [10, 30, 10, 10], + "xAxis": { + "type": "category", + "boundaryGap": false, + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }, + "yAxis": { + "axisLabel": { + "formatter": "{value} °C" + } + }, + "series": [ + { + "name": "Highest", + "type": "line", + "data": [ + 10, + 11, + 13, + 11, + 12, + 12, + 9 + ], + "markPoint": { + "data": [ + { + "type": "max" + }, + { + "type": "min" + } + ] + }, + "markLine": { + "data": [ + { + "type": "average" + } + ] + } + }, + { + "name": "Lowest", + "type": "line", + "data": [ + 1, + -2, + 2, + 5, + 3, + 2, + 0 + ], + "markPoint": { + "data": [ + { + "type": "min" + } + ] + }, + "markLine": { + "data": [ + { + "type": "average" + }, + { + "type": "max" + } + ] + } + } + ] + }`, + `{ + "xAxis": { + "type": "category", + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }, + "yAxis": { + "type": "value" + }, + "series": [ + { + "data": [ + 120, + 200, + 150, + 80, + 70, + 110, + 130 + ], + "type": "bar" + } + ] + }`, + `{ + "xAxis": { + "type": "category", + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }, + "yAxis": { + "type": "value" + }, + "series": [ + { + "data": [ + 120, + { + "value": 200, + "itemStyle": { + "color": "#a90000" + } + }, + 150, + 80, + 70, + 110, + 130 + ], + "type": "bar" + } + ] + }`, + `{ + "title": { + "text": "Rainfall vs Evaporation", + "subtext": "Fake Data" + }, + "legend": { + "data": [ + "Rainfall", + "Evaporation" + ] + }, + "padding": [10, 30, 10, 10], + "xAxis": [ + { + "type": "category", + "data": [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ] + } + ], + "series": [ + { + "name": "Rainfall", + "type": "bar", + "data": [ + 2, + 4.9, + 7, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20, + 6.4, + 3.3 + ], + "markPoint": { + "data": [ + { + "type": "max" + }, + { + "type": "min" + } + ] + }, + "markLine": { + "data": [ + { + "type": "average" + } + ] + } + }, + { + "name": "Evaporation", + "type": "bar", + "data": [ + 2.6, + 5.9, + 9, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6, + 2.3 + ], + "markPoint": { + "data": [ + { + "type": "max" + }, + { + "type": "min" + } + ] + }, + "markLine": { + "data": [ + { + "type": "average" + } + ] + } + } + ] + }`, + `{ + "legend": { + "data": [ + "Evaporation", + "Precipitation", + "Temperature" + ] + }, + "xAxis": [ + { + "type": "category", + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ], + "axisPointer": { + "type": "shadow" + } + } + ], + "yAxis": [ + { + "type": "value", + "name": "Precipitation", + "min": 0, + "max": 240, + "axisLabel": { + "formatter": "{value} ml" + } + }, + { + "type": "value", + "name": "Temperature", + "min": 0, + "max": 24, + "axisLabel": { + "formatter": "{value} °C" + } + } + ], + "series": [ + { + "name": "Evaporation", + "type": "bar", + "tooltip": {}, + "data": [ + 2, + 4.9, + 7, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20, + 6.4, + 3.3 + ] + }, + { + "name": "Precipitation", + "type": "bar", + "tooltip": {}, + "data": [ + 2.6, + 5.9, + 9, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6, + 2.3 + ] + }, + { + "name": "Temperature", + "type": "line", + "yAxisIndex": 1, + "tooltip": {}, + "data": [ + 2, + 2.2, + 3.3, + 4.5, + 6.3, + 10.2, + 20.3, + 23.4, + 23, + 16.5, + 12, + 6.2 + ] + } + ] + }`, + `{ + "tooltip": { + "trigger": "axis", + "axisPointer": { + "type": "cross" + } + }, + "grid": { + "right": "20%" + }, + "toolbox": { + "feature": { + "dataView": { + "show": true, + "readOnly": false + }, + "restore": { + "show": true + }, + "saveAsImage": { + "show": true + } + } + }, + "legend": { + "data": [ + "Evaporation", + "Precipitation", + "Temperature" + ] + }, + "xAxis": [ + { + "type": "category", + "axisTick": { + "alignWithLabel": true + }, + "data": [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ] + } + ], + "yAxis": [ + { + "type": "value", + "name": "温度", + "position": "left", + "alignTicks": true, + "axisLine": { + "show": true, + "lineStyle": { + "color": "#EE6666" + } + }, + "axisLabel": { + "formatter": "{value} °C" + } + }, + { + "type": "value", + "name": "Evaporation", + "position": "right", + "alignTicks": true, + "axisLine": { + "show": true, + "lineStyle": { + "color": "#5470C6" + } + }, + "axisLabel": { + "formatter": "{value} ml" + } + } + ], + "series": [ + { + "name": "Evaporation", + "type": "bar", + "yAxisIndex": 1, + "data": [ + 2, + 4.9, + 7, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20, + 6.4, + 3.3 + ] + }, + { + "name": "Precipitation", + "type": "bar", + "yAxisIndex": 1, + "data": [ + 2.6, + 5.9, + 9, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6, + 2.3 + ] + }, + { + "name": "Temperature", + "type": "line", + "data": [ + 2, + 2.2, + 3.3, + 4.5, + 6.3, + 10.2, + 20.3, + 23.4, + 23, + 16.5, + 12, + 6.2 + ] + } + ] + }`, + `{ + "title": { + "text": "Referer of a Website", + "subtext": "Fake Data", + "left": "center" + }, + "tooltip": { + "trigger": "item" + }, + "legend": { + "orient": "vertical", + "left": "left" + }, + "series": [ + { + "name": "Access From", + "type": "pie", + "radius": "50%", + "data": [ + { + "value": 1048, + "name": "Search Engine" + }, + { + "value": 735, + "name": "Direct" + }, + { + "value": 580, + "name": "Email" + }, + { + "value": 484, + "name": "Union Ads" + }, + { + "value": 300, + "name": "Video Ads" + } + ] + } + ] + }`, + `{ + "title": { + "text": "Rainfall" + }, + "padding": [10, 10, 10, 30], + "legend": { + "data": [ + "GZ", + "SH" + ] + }, + "xAxis": { + "type": "category", + "splitNumber": 6, + "data": [ + "01-01", + "01-02", + "01-03", + "01-04", + "01-05", + "01-06", + "01-07", + "01-08", + "01-09", + "01-10", + "01-11", + "01-12", + "01-13", + "01-14", + "01-15", + "01-16", + "01-17", + "01-18", + "01-19", + "01-20", + "01-21", + "01-22", + "01-23", + "01-24", + "01-25", + "01-26", + "01-27", + "01-28", + "01-29", + "01-30", + "01-31" + ] + }, + "yAxis": { + "axisLabel": { + "formatter": "{value} mm" + } + }, + "series": [ + { + "type": "bar", + "data": [ + 928, + 821, + 889, + 600, + 547, + 783, + 197, + 853, + 430, + 346, + 63, + 465, + 309, + 334, + 141, + 538, + 792, + 58, + 922, + 807, + 298, + 243, + 744, + 885, + 812, + 231, + 330, + 220, + 984, + 221, + 429 + ] + }, + { + "type": "bar", + "data": [ + 749, + 201, + 296, + 579, + 255, + 159, + 902, + 246, + 149, + 158, + 507, + 776, + 186, + 79, + 390, + 222, + 601, + 367, + 221, + 411, + 714, + 620, + 966, + 73, + 203, + 631, + 833, + 610, + 487, + 677, + 596 + ] + } + ] + }`, + `{ + "title": { + "text": "Basic Radar Chart" + }, + "legend": { + "data": [ + "Allocated Budget", + "Actual Spending" + ] + }, + "radar": { + "indicator": [ + { + "name": "Sales", + "max": 6500 + }, + { + "name": "Administration", + "max": 16000 + }, + { + "name": "Information Technology", + "max": 30000 + }, + { + "name": "Customer Support", + "max": 38000 + }, + { + "name": "Development", + "max": 52000 + }, + { + "name": "Marketing", + "max": 25000 + } + ] + }, + "series": [ + { + "name": "Budget vs spending", + "type": "radar", + "data": [ + { + "value": [ + 4200, + 3000, + 20000, + 35000, + 50000, + 18000 + ], + "name": "Allocated Budget" + }, + { + "value": [ + 5000, + 14000, + 28000, + 26000, + 42000, + 21000 + ], + "name": "Actual Spending" + } + ] + } + ] + }`, + `{ + "title": { + "text": "Funnel" + }, + "tooltip": { + "trigger": "item", + "formatter": "{a}
{b} : {c}%" + }, + "toolbox": { + "feature": { + "dataView": { + "readOnly": false + }, + "restore": {}, + "saveAsImage": {} + } + }, + "legend": { + "data": [ + "Show", + "Click", + "Visit", + "Inquiry", + "Order" + ] + }, + "series": [ + { + "name": "Funnel", + "type": "funnel", + "left": "10%", + "top": 60, + "bottom": 60, + "width": "80%", + "min": 0, + "max": 100, + "minSize": "0%", + "maxSize": "100%", + "sort": "descending", + "gap": 2, + "label": { + "show": true, + "position": "inside" + }, + "labelLine": { + "length": 10, + "lineStyle": { + "width": 1, + "type": "solid" + } + }, + "itemStyle": { + "borderColor": "#fff", + "borderWidth": 1 + }, + "emphasis": { + "label": { + "fontSize": 20 + } + }, + "data": [ + { + "value": 60, + "name": "Visit" + }, + { + "value": 40, + "name": "Inquiry" + }, + { + "value": 20, + "name": "Order" + }, + { + "value": 80, + "name": "Click" + }, + { + "value": 100, + "name": "Show" + } + ] + } + ] + }`, + `{ + "legend": { + "top": "-140", + "data": [ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie" + ] + }, + "padding": [ + 150, + 10, + 10, + 10 + ], + "xAxis": [ + { + "data": [ + "2012", + "2013", + "2014", + "2015", + "2016", + "2017" + ] + } + ], + "series": [ + { + "data": [ + 56.5, + 82.1, + 88.7, + 70.1, + 53.4, + 85.1 + ] + }, + { + "data": [ + 51.1, + 51.4, + 55.1, + 53.3, + 73.8, + 68.7 + ] + }, + { + "data": [ + 40.1, + 62.2, + 69.5, + 36.4, + 45.2, + 32.5 + ] + }, + { + "data": [ + 25.2, + 37.1, + 41.2, + 18, + 33.9, + 49.1 + ] + } + ], + "children": [ + { + "box": { + "left": 0, + "top": 30, + "right": 600, + "bottom": 150 + }, + "legend": { + "show": false + }, + "series": [ + { + "type": "pie", + "radius": "50%", + "data": [ + { + "value": 435.9, + "name": "Milk Tea" + }, + { + "value": 354.3, + "name": "Matcha Latte" + }, + { + "value": 285.9, + "name": "Cheese Cocoa" + }, + { + "value": 204.5, + "name": "Walnut Brownie" + } + ] + } + ] + } + ] + }`, + } + handler(w, req, nil, echartsOptions) +} + +func main() { + http.HandleFunc("/", indexHandler) + http.HandleFunc("/echarts", echartsHandler) + http.ListenAndServe(":3012", nil) +} diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go index e15500c..c168f08 100644 --- a/examples/line_chart/main.go +++ b/examples/line_chart/main.go @@ -39,6 +39,19 @@ func main() { Right: 10, Bottom: 10, }, + TitleOption: charts.TitleOption{ + Text: "Line", + }, + LegendOption: charts.LegendOption{ + Data: []string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", + }, + Left: charts.PositionCenter, + }, XAxis: charts.NewXAxisOption([]string{ "Mon", "Tue", diff --git a/legend.go b/legend.go index 16341e4..b8a6fdc 100644 --- a/legend.go +++ b/legend.go @@ -29,13 +29,13 @@ import ( type legendPainter struct { p *Painter - opt *LegendPainterOption + opt *LegendOption } const IconRect = "rect" const IconLineDot = "lineDot" -type LegendPainterOption struct { +type LegendOption struct { Theme ColorPalette // Text array of legend Data []string @@ -58,7 +58,17 @@ type LegendPainterOption struct { FontColor Color } -func NewLegendPainter(p *Painter, opt LegendPainterOption) *legendPainter { +func NewLegendOption(labels []string, left ...string) LegendOption { + opt := LegendOption{ + Data: labels, + } + if len(left) != 0 { + opt.Left = left[0] + } + return opt +} + +func NewLegendPainter(p *Painter, opt LegendOption) *legendPainter { return &legendPainter{ p: p, opt: &opt, @@ -71,6 +81,12 @@ func (l *legendPainter) Render() (Box, error) { if theme == nil { theme = l.p.theme } + if opt.FontSize == 0 { + opt.FontSize = theme.GetFontSize() + } + if opt.FontColor.IsZero() { + opt.FontColor = theme.GetTextColor() + } p := l.p p.SetTextStyle(Style{ FontSize: opt.FontSize, @@ -129,7 +145,7 @@ func (l *legendPainter) Render() (Box, error) { top, _ := strconv.Atoi(opt.Top) x := int(left) - y := int(top) + y := int(top) + 10 x0 := x y0 := y diff --git a/line_chart.go b/line_chart.go index 3d93341..5f4ea4f 100644 --- a/line_chart.go +++ b/line_chart.go @@ -23,7 +23,9 @@ package charts import ( + "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" ) type lineChart struct { @@ -43,6 +45,8 @@ func NewLineChart(p *Painter, opt LineChartOption) *lineChart { type LineChartOption struct { Theme ColorPalette + // The font size + Font *truetype.Font // The data series list SeriesList SeriesList // The x axis option @@ -51,6 +55,10 @@ type LineChartOption struct { Padding Box // The y axis option YAxisOptions []YAxisOption + // The option of title + TitleOption TitleOption + // The legend option + LegendOption LegendOption } func (l *lineChart) Render() (Box, error) { @@ -64,6 +72,8 @@ func (l *lineChart) Render() (Box, error) { SeriesList: seriesList, XAxis: opt.XAxis, YAxisOptions: opt.YAxisOptions, + TitleOption: opt.TitleOption, + LegendOption: opt.LegendOption, }) if err != nil { return chart.BoxZero, err @@ -78,13 +88,20 @@ func (l *lineChart) Render() (Box, error) { for i := 0; i < len(xDivideValues)-1; i++ { xValues[i] = (xDivideValues[i] + xDivideValues[i+1]) >> 1 } + markPointPainter := NewMarkPointPainter(seriesPainter) + markLinePainter := NewMarkLinePainter(seriesPainter) + rendererList := []Renderer{ + markPointPainter, + markLinePainter, + } for index, series := range seriesList { seriesColor := opt.Theme.GetSeriesColor(index) - seriesPainter.SetDrawingStyle(Style{ + drawingStyle := Style{ StrokeColor: seriesColor, - StrokeWidth: 2, - FillColor: seriesColor, - }) + StrokeWidth: defaultStrokeWidth, + } + + seriesPainter.SetDrawingStyle(drawingStyle) yr := renderResult.axisRanges[series.AxisIndex] points := make([]Point, 0) for i, item := range series.Data { @@ -95,8 +112,39 @@ func (l *lineChart) Render() (Box, error) { } points = append(points, p) } + // 画线 seriesPainter.LineStroke(points) + + // 画点 + if opt.Theme.IsDark() { + drawingStyle.FillColor = drawingStyle.StrokeColor + } else { + drawingStyle.FillColor = drawing.ColorWhite + } + drawingStyle.StrokeWidth = 1 + seriesPainter.SetDrawingStyle(drawingStyle) seriesPainter.Dots(points) + markPointPainter.Add(markPointRenderOption{ + FillColor: seriesColor, + Font: opt.Font, + Points: points, + Series: series, + }) + markLinePainter.Add(markLineRenderOption{ + FillColor: seriesColor, + FontColor: opt.Theme.GetTextColor(), + StrokeColor: seriesColor, + Font: opt.Font, + Series: series, + Range: yr, + }) + } + // 最大、最小的mark point + for _, renderer := range rendererList { + _, err = renderer.Render() + if err != nil { + return chart.BoxZero, err + } } return p.box, nil diff --git a/mark_line.go b/mark_line.go new file mode 100644 index 0000000..9a9d568 --- /dev/null +++ b/mark_line.go @@ -0,0 +1,118 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" +) + +func NewMarkLine(markLineTypes ...string) SeriesMarkLine { + data := make([]SeriesMarkData, len(markLineTypes)) + for index, t := range markLineTypes { + data[index] = SeriesMarkData{ + Type: t, + } + } + return SeriesMarkLine{ + Data: data, + } +} + +type markLinePainter struct { + p *Painter + options []markLineRenderOption +} + +func (m *markLinePainter) Add(opt markLineRenderOption) { + m.options = append(m.options, opt) +} + +func NewMarkLinePainter(p *Painter) *markLinePainter { + return &markLinePainter{ + p: p, + options: make([]markLineRenderOption, 0), + } +} + +type markLineRenderOption struct { + FillColor Color + FontColor Color + StrokeColor Color + Font *truetype.Font + Series Series + Range axisRange +} + +func (m *markLinePainter) Render() (Box, error) { + painter := m.p + for _, opt := range m.options { + s := opt.Series + if len(s.MarkLine.Data) == 0 { + continue + } + summary := s.Summary() + for _, markLine := range s.MarkLine.Data { + // 由于mark line会修改style,因此每次重新设置 + painter.OverrideDrawingStyle(Style{ + FillColor: opt.FillColor, + StrokeColor: opt.StrokeColor, + StrokeWidth: 1, + StrokeDashArray: []float64{ + 4, + 2, + }, + }).OverrideTextStyle(Style{ + Font: opt.Font, + FontColor: opt.FontColor, + FontSize: labelFontSize, + }) + value := float64(0) + switch markLine.Type { + case SeriesMarkDataTypeMax: + value = summary.MaxValue + case SeriesMarkDataTypeMin: + value = summary.MinValue + default: + value = summary.AverageValue + } + y := opt.Range.getRestHeight(value) + width := painter.Width() + text := commafWithDigits(value) + textBox := painter.MeasureText(text) + painter.MarkLine(0, y, width-2) + painter.Text(text, width, y+textBox.Height()>>1-2) + } + } + return chart.BoxZero, nil +} + +func markLineRender(opt markLineRenderOption) { + // d := opt.Draw + // s := opt.Series + // if len(s.MarkLine.Data) == 0 { + // return + // } + // r := d.Render + +} diff --git a/mark_point.go b/mark_point.go new file mode 100644 index 0000000..ce3cb0f --- /dev/null +++ b/mark_point.go @@ -0,0 +1,102 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" +) + +func NewMarkPoint(markPointTypes ...string) SeriesMarkPoint { + data := make([]SeriesMarkData, len(markPointTypes)) + for index, t := range markPointTypes { + data[index] = SeriesMarkData{ + Type: t, + } + } + return SeriesMarkPoint{ + Data: data, + } +} + +type markPointPainter struct { + p *Painter + options []markPointRenderOption +} + +func (m *markPointPainter) Add(opt markPointRenderOption) { + m.options = append(m.options, opt) +} + +type markPointRenderOption struct { + FillColor Color + Font *truetype.Font + Series Series + Points []Point +} + +func NewMarkPointPainter(p *Painter) *markPointPainter { + return &markPointPainter{ + p: p, + options: make([]markPointRenderOption, 0), + } +} + +func (m *markPointPainter) Render() (Box, error) { + painter := m.p + for _, opt := range m.options { + s := opt.Series + if len(s.MarkPoint.Data) == 0 { + continue + } + points := opt.Points + summary := s.Summary() + symbolSize := s.MarkPoint.SymbolSize + if symbolSize == 0 { + symbolSize = 30 + } + painter.OverrideDrawingStyle(Style{ + FillColor: opt.FillColor, + }).OverrideTextStyle(Style{ + FontColor: NewTheme(ThemeDark).GetTextColor(), + FontSize: labelFontSize, + StrokeWidth: 1, + Font: opt.Font, + }) + for _, markPointData := range s.MarkPoint.Data { + p := points[summary.MinIndex] + value := summary.MinValue + switch markPointData.Type { + case SeriesMarkDataTypeMax: + p = points[summary.MaxIndex] + value = summary.MaxValue + } + + painter.Pin(p.X, p.Y-symbolSize>>1, symbolSize) + text := commafWithDigits(value) + textBox := painter.MeasureText(text) + painter.Text(text, p.X-textBox.Width()>>1, p.Y-symbolSize>>1-2) + } + } + return chart.BoxZero, nil +} diff --git a/painter.go b/painter.go index 75d4a38..fff6ca7 100644 --- a/painter.go +++ b/painter.go @@ -700,7 +700,7 @@ func (p *Painter) Grid(opt GridOption) *Painter { func (p *Painter) Dots(points []Point) *Painter { for _, item := range points { - p.Circle(3, item.X, item.Y) + p.Circle(2, item.X, item.Y) } p.FillStroke() return p diff --git a/title.go b/title.go new file mode 100644 index 0000000..30831ac --- /dev/null +++ b/title.go @@ -0,0 +1,192 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "strconv" + "strings" + + "github.com/golang/freetype/truetype" +) + +type TitleOption struct { + // The theme of chart + Theme ColorPalette + // Title text, support \n for new line + Text string + // Subtitle text, support \n for new line + Subtext string + // // Title style + // Style Style + // // Subtitle style + // SubtextStyle Style + // Distance between title component and the left side of the container. + // It can be pixel value: 20, percentage value: 20%, + // or position value: right, center. + Left string + // Distance between title component and the top side of the container. + // It can be pixel value: 20. + Top string + // The font of label + Font *truetype.Font + // The font size of label + FontSize float64 + // The color of label + FontColor Color + // The subtext font size of label + SubtextFontSize float64 + // The subtext font color of label + SubtextFontColor Color +} + +type titleMeasureOption struct { + width int + height int + text string + style Style +} + +func splitTitleText(text string) []string { + arr := strings.Split(text, "\n") + result := make([]string, 0) + for _, v := range arr { + v = strings.TrimSpace(v) + if v == "" { + continue + } + result = append(result, v) + } + return result +} + +type titlePainter struct { + p *Painter + opt *TitleOption +} + +func NewTitlePainter(p *Painter, opt TitleOption) *titlePainter { + return &titlePainter{ + p: p, + opt: &opt, + } +} + +func (t *titlePainter) Render() (Box, error) { + opt := t.opt + p := t.p + theme := opt.Theme + measureOptions := make([]titleMeasureOption, 0) + + if opt.Font == nil { + opt.Font = theme.GetFont() + } + if opt.FontColor.IsZero() { + opt.FontColor = theme.GetTextColor() + } + if opt.FontSize == 0 { + opt.FontSize = theme.GetFontSize() + } + if opt.SubtextFontColor.IsZero() { + opt.SubtextFontColor = opt.FontColor + } + if opt.SubtextFontSize == 0 { + opt.SubtextFontSize = opt.FontSize + } + + titleTextStyle := Style{ + Font: opt.Font, + FontSize: opt.FontSize, + FontColor: opt.FontColor, + } + // 主标题 + for _, v := range splitTitleText(opt.Text) { + measureOptions = append(measureOptions, titleMeasureOption{ + text: v, + style: titleTextStyle, + }) + } + subtextStyle := Style{ + Font: opt.Font, + FontSize: opt.SubtextFontSize, + FontColor: opt.SubtextFontColor, + } + // 副标题 + for _, v := range splitTitleText(opt.Subtext) { + measureOptions = append(measureOptions, titleMeasureOption{ + text: v, + style: subtextStyle, + }) + } + textMaxWidth := 0 + textMaxHeight := 0 + for index, item := range measureOptions { + p.OverrideTextStyle(item.style) + textBox := p.MeasureText(item.text) + + w := textBox.Width() + h := textBox.Height() + if w > textMaxWidth { + textMaxWidth = w + } + if h > textMaxHeight { + textMaxHeight = h + } + measureOptions[index].height = h + measureOptions[index].width = w + } + width := textMaxWidth + + titleX := 0 + switch opt.Left { + case PositionRight: + titleX = p.Width() - textMaxWidth + case PositionCenter: + titleX = p.Width()>>1 - (textMaxWidth >> 1) + default: + if strings.HasSuffix(opt.Left, "%") { + value, _ := strconv.Atoi(strings.ReplaceAll(opt.Left, "%", "")) + titleX = p.Width() * value / 100 + } else { + value, _ := strconv.Atoi(opt.Left) + titleX = value + } + } + titleY := 0 + // TODO TOP 暂只支持数值 + if opt.Top != "" { + value, _ := strconv.Atoi(opt.Top) + titleY += value + } + for _, item := range measureOptions { + p.OverrideTextStyle(item.style) + x := titleX + (textMaxWidth-item.width)>>1 + y := titleY + item.height + p.Text(item.text, x, y) + titleY += item.height + } + + return Box{ + Bottom: titleY, + Right: titleX + width, + }, nil +} From b69728dd1260336d9816b654e69797b7187dbbc6 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 14 Jun 2022 23:07:11 +0800 Subject: [PATCH 142/251] feat: support bar chart render --- axis.go | 6 +- bar_chart.go | 205 ++++++++++++++++++++++++++++++++++++ charts.go | 30 ++++-- examples/bar_chart/main.go | 127 ++++++++++++++++++++++ examples/line_chart/main.go | 4 +- examples/painter/main.go | 10 +- legend.go | 3 + line_chart.go | 58 ++++++---- mark_point.go | 3 +- xaxis.go | 6 +- yaxis.go | 6 +- 11 files changed, 408 insertions(+), 50 deletions(-) create mode 100644 bar_chart.go create mode 100644 examples/bar_chart/main.go diff --git a/axis.go b/axis.go index bb2e6a3..bd760b6 100644 --- a/axis.go +++ b/axis.go @@ -28,17 +28,17 @@ import ( type axisPainter struct { p *Painter - opt *AxisPainterOption + opt *AxisOption } -func NewAxisPainter(p *Painter, opt AxisPainterOption) *axisPainter { +func NewAxisPainter(p *Painter, opt AxisOption) *axisPainter { return &axisPainter{ p: p, opt: &opt, } } -type AxisPainterOption struct { +type AxisOption struct { // The theme of chart Theme ColorPalette // The label of axis diff --git a/bar_chart.go b/bar_chart.go new file mode 100644 index 0000000..9dadb1e --- /dev/null +++ b/bar_chart.go @@ -0,0 +1,205 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" +) + +type barChart struct { + p *Painter + opt *BarChartOption +} + +func NewBarChart(p *Painter, opt BarChartOption) *barChart { + if opt.Theme == nil { + opt.Theme = NewTheme("") + } + return &barChart{ + p: p, + opt: &opt, + } +} + +type BarChartOption struct { + Theme ColorPalette + // The font size + Font *truetype.Font + // The data series list + SeriesList SeriesList + // The x axis option + XAxis XAxisOption + // The padding of line chart + Padding Box + // The y axis option + YAxisOptions []YAxisOption + // The option of title + Title TitleOption + // The legend option + Legend LegendOption +} + +func (b *barChart) Render() (Box, error) { + p := b.p + opt := b.opt + seriesList := opt.SeriesList + seriesList.init() + renderResult, err := defaultRender(p, defaultRenderOption{ + Theme: opt.Theme, + Padding: opt.Padding, + SeriesList: seriesList, + XAxis: opt.XAxis, + YAxisOptions: opt.YAxisOptions, + TitleOption: opt.Title, + LegendOption: opt.Legend, + }) + if err != nil { + return chart.BoxZero, err + } + seriesPainter := renderResult.seriesPainter + seriesList = seriesList.Filter(ChartTypeBar) + + xRange := NewRange(AxisRangeOption{ + DivideCount: len(opt.XAxis.Data), + Size: seriesPainter.Width(), + }) + x0, x1 := xRange.GetRange(0) + width := int(x1 - x0) + // 每一块之间的margin + margin := 10 + // 每一个bar之间的margin + barMargin := 5 + if width < 20 { + margin = 2 + barMargin = 2 + } else if width < 50 { + margin = 5 + barMargin = 3 + } + seriesCount := len(seriesList) + // 总的宽度-两个margin-(总数-1)的barMargin + barWidth := (width - 2*margin - barMargin*(seriesCount-1)) / len(seriesList) + barMaxHeight := seriesPainter.Height() + theme := opt.Theme + seriesNames := seriesList.Names() + + markPointPainter := NewMarkPointPainter(seriesPainter) + markLinePainter := NewMarkLinePainter(seriesPainter) + rendererList := []Renderer{ + markPointPainter, + markLinePainter, + } + for i := range seriesList { + series := seriesList[i] + yRange := renderResult.axisRanges[series.AxisIndex] + index := series.index + if index == 0 { + index = i + } + seriesColor := theme.GetSeriesColor(index) + + divideValues := xRange.AutoDivide() + points := make([]Point, len(series.Data)) + for j, item := range series.Data { + if j >= xRange.divideCount { + continue + } + x := divideValues[j] + x += margin + if i != 0 { + x += i * (barWidth + barMargin) + } + + h := int(yRange.getHeight(item.Value)) + fillColor := seriesColor + if !item.Style.FillColor.IsZero() { + fillColor = item.Style.FillColor + } + top := barMaxHeight - h + + seriesPainter.OverrideDrawingStyle(Style{ + FillColor: fillColor, + }).Rect(chart.Box{ + Top: top, + Left: x, + Right: x + barWidth, + Bottom: barMaxHeight - 1, + }) + // 用于生成marker point + points[j] = Point{ + // 居中的位置 + X: x + barWidth>>1, + Y: top, + } + // 用于生成marker point + points[j] = Point{ + // 居中的位置 + X: x + barWidth>>1, + Y: top, + } + // 如果label不需要展示,则返回 + if !series.Label.Show { + continue + } + distance := series.Label.Distance + if distance == 0 { + distance = 5 + } + text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(i, item.Value, -1) + labelStyle := Style{ + FontColor: theme.GetTextColor(), + FontSize: labelFontSize, + Font: opt.Font, + } + if !series.Label.Color.IsZero() { + labelStyle.FontColor = series.Label.Color + } + seriesPainter.OverrideTextStyle(labelStyle) + textBox := seriesPainter.MeasureText(text) + seriesPainter.Text(text, x+(barWidth-textBox.Width())>>1, barMaxHeight-h-distance) + } + + markPointPainter.Add(markPointRenderOption{ + FillColor: seriesColor, + Font: opt.Font, + Series: series, + Points: points, + }) + markLinePainter.Add(markLineRenderOption{ + FillColor: seriesColor, + FontColor: opt.Theme.GetTextColor(), + StrokeColor: seriesColor, + Font: opt.Font, + Series: series, + Range: yRange, + }) + } + // 最大、最小的mark point + err = doRender(rendererList...) + if err != nil { + return chart.BoxZero, err + } + + return chart.BoxZero, nil +} diff --git a/charts.go b/charts.go index 947fa8d..09dfc3f 100644 --- a/charts.go +++ b/charts.go @@ -56,14 +56,21 @@ type defaultRenderOption struct { TitleOption TitleOption // The legend option LegendOption LegendOption + // background is filled + backgroundIsFilled bool } type defaultRenderResult struct { axisRanges map[int]axisRange - p *Painter + // 图例区域 + seriesPainter *Painter } func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, error) { + if !opt.backgroundIsFilled { + p.SetBackground(p.Width(), p.Height(), opt.Theme.GetBackgroundColor()) + } + if !opt.Padding.IsZero() { p = p.Child(PainterPaddingOption(opt.Padding)) } @@ -157,8 +164,8 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e return nil, err } - result.p = p.Child(PainterPaddingOption(Box{ - Bottom: rangeHeight, + result.seriesPainter = p.Child(PainterPaddingOption(Box{ + Bottom: defaultXAxisHeight, Left: rangeWidthLeft, Right: rangeWidthRight, })) @@ -200,14 +207,15 @@ func Render(opt ChartOption) (*Painter, error) { lineChartSeriesList := seriesList.Filter(ChartTypeLine) if len(lineChartSeriesList) != 0 { renderer := NewLineChart(p, LineChartOption{ - Theme: opt.theme, - Font: opt.font, - SeriesList: lineChartSeriesList, - XAxis: opt.XAxis, - Padding: opt.Padding, - YAxisOptions: opt.YAxisOptions, - TitleOption: opt.Title, - LegendOption: opt.Legend, + Theme: opt.theme, + Font: opt.font, + SeriesList: lineChartSeriesList, + XAxis: opt.XAxis, + Padding: opt.Padding, + YAxisOptions: opt.YAxisOptions, + Title: opt.Title, + Legend: opt.Legend, + backgroundIsFilled: true, }) rendererList = append(rendererList, renderer) } diff --git a/examples/bar_chart/main.go b/examples/bar_chart/main.go new file mode 100644 index 0000000..5d5da2a --- /dev/null +++ b/examples/bar_chart/main.go @@ -0,0 +1,127 @@ +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + + "github.com/vicanso/go-charts" +) + +func writeFile(buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file := filepath.Join(tmpPath, "bar-chart.png") + err = ioutil.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func main() { + p, err := charts.NewPainter(charts.PainterOptions{ + Width: 800, + Height: 600, + Type: charts.ChartOutputPNG, + }) + if err != nil { + panic(err) + } + _, err = charts.NewBarChart(p, charts.BarChartOption{ + Title: charts.TitleOption{ + Text: "Rainfall vs Evaporation", + Subtext: "Fake Data", + }, + Padding: charts.Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }, + XAxis: charts.NewXAxisOption([]string{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + }), + Legend: charts.NewLegendOption([]string{ + "Rainfall", + "Evaporation", + }, charts.PositionRight), + SeriesList: []charts.Series{ + { + Type: charts.ChartTypeBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20.0, + 6.4, + 3.3, + }), + MarkPoint: charts.NewMarkPoint( + charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin, + ), + MarkLine: charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ), + }, + { + Type: charts.ChartTypeBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 2.6, + 5.9, + 9.0, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6.0, + 2.3, + }), + MarkPoint: charts.NewMarkPoint( + charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin, + ), + MarkLine: charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ), + }, + }, + }).Render() + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + err = writeFile(buf) + if err != nil { + panic(err) + } +} diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go index c168f08..414f676 100644 --- a/examples/line_chart/main.go +++ b/examples/line_chart/main.go @@ -39,10 +39,10 @@ func main() { Right: 10, Bottom: 10, }, - TitleOption: charts.TitleOption{ + Title: charts.TitleOption{ Text: "Line", }, - LegendOption: charts.LegendOption{ + Legend: charts.LegendOption{ Data: []string{ "Email", "Union Ads", diff --git a/examples/painter/main.go b/examples/painter/main.go index 5022584..cf2bb81 100644 --- a/examples/painter/main.go +++ b/examples/painter/main.go @@ -490,7 +490,7 @@ func main() { Left: 1, Right: p.Width() - 1, Bottom: top + 50, - })), charts.AxisPainterOption{ + })), charts.AxisOption{ Data: []string{ "Mon", "Tue", @@ -512,7 +512,7 @@ func main() { Left: 1, Right: p.Width() - 1, Bottom: top + 50, - })), charts.AxisPainterOption{ + })), charts.AxisOption{ Position: charts.PositionTop, BoundaryGap: charts.FalseFlag(), Data: []string{ @@ -536,7 +536,7 @@ func main() { Left: 10, Right: 60, Bottom: top + 200, - })), charts.AxisPainterOption{ + })), charts.AxisOption{ Position: charts.PositionLeft, Data: []string{ "Mon", @@ -557,7 +557,7 @@ func main() { Left: 100, Right: 150, Bottom: top + 200, - })), charts.AxisPainterOption{ + })), charts.AxisOption{ Position: charts.PositionRight, Data: []string{ "Mon", @@ -579,7 +579,7 @@ func main() { Left: 150, Right: 300, Bottom: top + 200, - })), charts.AxisPainterOption{ + })), charts.AxisOption{ BoundaryGap: charts.FalseFlag(), Position: charts.PositionLeft, Data: []string{ diff --git a/legend.go b/legend.go index b8a6fdc..e645e17 100644 --- a/legend.go +++ b/legend.go @@ -87,6 +87,9 @@ func (l *legendPainter) Render() (Box, error) { if opt.FontColor.IsZero() { opt.FontColor = theme.GetTextColor() } + if opt.Left == "" { + opt.Left = PositionCenter + } p := l.p p.SetTextStyle(Style{ FontSize: opt.FontSize, diff --git a/line_chart.go b/line_chart.go index 5f4ea4f..451edfe 100644 --- a/line_chart.go +++ b/line_chart.go @@ -56,9 +56,11 @@ type LineChartOption struct { // The y axis option YAxisOptions []YAxisOption // The option of title - TitleOption TitleOption + Title TitleOption // The legend option - LegendOption LegendOption + Legend LegendOption + // background is filled + backgroundIsFilled bool } func (l *lineChart) Render() (Box, error) { @@ -67,26 +69,39 @@ func (l *lineChart) Render() (Box, error) { seriesList := opt.SeriesList seriesList.init() renderResult, err := defaultRender(p, defaultRenderOption{ - Theme: opt.Theme, - Padding: opt.Padding, - SeriesList: seriesList, - XAxis: opt.XAxis, - YAxisOptions: opt.YAxisOptions, - TitleOption: opt.TitleOption, - LegendOption: opt.LegendOption, + Theme: opt.Theme, + Padding: opt.Padding, + SeriesList: seriesList, + XAxis: opt.XAxis, + YAxisOptions: opt.YAxisOptions, + TitleOption: opt.Title, + LegendOption: opt.Legend, + backgroundIsFilled: opt.backgroundIsFilled, }) if err != nil { return chart.BoxZero, err } + boundaryGap := true + if opt.XAxis.BoundaryGap != nil && !*opt.XAxis.BoundaryGap { + boundaryGap = false + } seriesList = seriesList.Filter(ChartTypeLine) - seriesPainter := renderResult.p + seriesPainter := renderResult.seriesPainter - xDivideValues := autoDivide(seriesPainter.Width(), len(opt.XAxis.Data)) + xDivideCount := len(opt.XAxis.Data) + if !boundaryGap { + xDivideCount-- + } + xDivideValues := autoDivide(seriesPainter.Width(), xDivideCount) xValues := make([]int, len(xDivideValues)-1) - for i := 0; i < len(xDivideValues)-1; i++ { - xValues[i] = (xDivideValues[i] + xDivideValues[i+1]) >> 1 + if boundaryGap { + for i := 0; i < len(xDivideValues)-1; i++ { + xValues[i] = (xDivideValues[i] + xDivideValues[i+1]) >> 1 + } + } else { + xValues = xDivideValues } markPointPainter := NewMarkPointPainter(seriesPainter) markLinePainter := NewMarkLinePainter(seriesPainter) @@ -94,7 +109,8 @@ func (l *lineChart) Render() (Box, error) { markPointPainter, markLinePainter, } - for index, series := range seriesList { + for index := range seriesList { + series := seriesList[index] seriesColor := opt.Theme.GetSeriesColor(index) drawingStyle := Style{ StrokeColor: seriesColor, @@ -102,10 +118,10 @@ func (l *lineChart) Render() (Box, error) { } seriesPainter.SetDrawingStyle(drawingStyle) - yr := renderResult.axisRanges[series.AxisIndex] + yRange := renderResult.axisRanges[series.AxisIndex] points := make([]Point, 0) for i, item := range series.Data { - h := yr.getRestHeight(item.Value) + h := yRange.getRestHeight(item.Value) p := Point{ X: xValues[i], Y: h, @@ -136,15 +152,13 @@ func (l *lineChart) Render() (Box, error) { StrokeColor: seriesColor, Font: opt.Font, Series: series, - Range: yr, + Range: yRange, }) } // 最大、最小的mark point - for _, renderer := range rendererList { - _, err = renderer.Render() - if err != nil { - return chart.BoxZero, err - } + err = doRender(rendererList...) + if err != nil { + return chart.BoxZero, err } return p.box, nil diff --git a/mark_point.go b/mark_point.go index ce3cb0f..07daf57 100644 --- a/mark_point.go +++ b/mark_point.go @@ -64,6 +64,7 @@ func NewMarkPointPainter(p *Painter) *markPointPainter { func (m *markPointPainter) Render() (Box, error) { painter := m.p + theme := m.p.theme for _, opt := range m.options { s := opt.Series if len(s.MarkPoint.Data) == 0 { @@ -78,7 +79,7 @@ func (m *markPointPainter) Render() (Box, error) { painter.OverrideDrawingStyle(Style{ FillColor: opt.FillColor, }).OverrideTextStyle(Style{ - FontColor: NewTheme(ThemeDark).GetTextColor(), + FontColor: theme.GetTextColor(), FontSize: labelFontSize, StrokeWidth: 1, Font: opt.Font, diff --git a/xaxis.go b/xaxis.go index a8c28c0..d8f6700 100644 --- a/xaxis.go +++ b/xaxis.go @@ -62,12 +62,12 @@ func NewXAxisOption(data []string, boundaryGap ...*bool) XAxisOption { return opt } -func (opt *XAxisOption) ToAxisPainterOption() AxisPainterOption { +func (opt *XAxisOption) ToAxisOption() AxisOption { position := PositionBottom if opt.Position == PositionTop { position = PositionTop } - return AxisPainterOption{ + return AxisOption{ Theme: opt.Theme, Data: opt.Data, BoundaryGap: opt.BoundaryGap, @@ -84,5 +84,5 @@ func NewBottomXAxis(p *Painter, opt XAxisOption) *axisPainter { p = p.Child(PainterPaddingOption(Box{ Top: p.Height() - defaultXAxisHeight, })) - return NewAxisPainter(p, opt.ToAxisPainterOption()) + return NewAxisPainter(p, opt.ToAxisOption()) } diff --git a/yaxis.go b/yaxis.go index 653f6ec..b011a74 100644 --- a/yaxis.go +++ b/yaxis.go @@ -39,12 +39,12 @@ type YAxisOption struct { FontColor Color } -func (opt *YAxisOption) ToAxisPainterOption() AxisPainterOption { +func (opt *YAxisOption) ToAxisOption() AxisOption { position := PositionLeft if opt.Position == PositionRight { position = PositionRight } - return AxisPainterOption{ + return AxisOption{ Theme: opt.Theme, Data: opt.Data, Position: position, @@ -62,5 +62,5 @@ func NewLeftYAxis(p *Painter, opt YAxisOption) *axisPainter { p = p.Child(PainterPaddingOption(Box{ Bottom: defaultXAxisHeight, })) - return NewAxisPainter(p, opt.ToAxisPainterOption()) + return NewAxisPainter(p, opt.ToAxisOption()) } From 3f245215931296b1de0f5c30fd7363a147a3c79a Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 15 Jun 2022 23:30:37 +0800 Subject: [PATCH 143/251] feat: support horizontal bar chart --- alias.go | 4 + axis.go | 25 +++- bar_chart.go | 46 +++--- charts.go | 119 +++++++++++++--- examples/charts/main.go | 195 ++++++++++++++++++++++++++ examples/horizontal_bar_chart/main.go | 94 +++++++++++++ horizontal_bar_chart.go | 152 ++++++++++++++++++++ legend.go | 8 +- line_chart.go | 50 ++++--- mark_line.go | 3 +- mark_point.go | 3 +- series.go | 6 + title.go | 5 + xaxis.go | 33 +++-- yaxis.go | 25 +++- 15 files changed, 677 insertions(+), 91 deletions(-) create mode 100644 examples/horizontal_bar_chart/main.go create mode 100644 horizontal_bar_chart.go diff --git a/alias.go b/alias.go index 0b161e6..a96f50b 100644 --- a/alias.go +++ b/alias.go @@ -31,6 +31,8 @@ type Box = chart.Box type Style = chart.Style type Color = drawing.Color +var BoxZero = chart.BoxZero + type Point struct { X int Y int @@ -42,6 +44,8 @@ const ( ChartTypePie = "pie" ChartTypeRadar = "radar" ChartTypeFunnel = "funnel" + // horizontal bar + ChartTypeHorizontalBar = "horizontalBar" ) const ( diff --git a/axis.go b/axis.go index bd760b6..d069c39 100644 --- a/axis.go +++ b/axis.go @@ -153,6 +153,8 @@ func (a *axisPainter) Render() (Box, error) { padding.Right = top.Width() - width case PositionRight: padding.Left = top.Width() - width + default: + padding.Top = top.Height() - defaultXAxisHeight } p := top.Child(PainterPaddingOption(padding)) @@ -240,7 +242,10 @@ func (a *axisPainter) Render() (Box, error) { x0 = 0 x1 = top.Width() - p.Width() } - for _, y := range autoDivide(height, tickCount) { + for index, y := range autoDivide(height, tickCount) { + if index == 0 { + continue + } top.LineStroke([]Point{ { X: x0, @@ -252,6 +257,24 @@ func (a *axisPainter) Render() (Box, error) { }, }) } + } else { + y0 := p.Height() - defaultXAxisHeight + y1 := top.Height() - defaultXAxisHeight + for index, x := range autoDivide(width, tickCount) { + if index == 0 { + continue + } + top.LineStroke([]Point{ + { + X: x, + Y: y0, + }, + { + X: x, + Y: y1, + }, + }) + } } } diff --git a/bar_chart.go b/bar_chart.go index 9dadb1e..8fae4df 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -60,25 +60,10 @@ type BarChartOption struct { Legend LegendOption } -func (b *barChart) Render() (Box, error) { +func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { p := b.p opt := b.opt - seriesList := opt.SeriesList - seriesList.init() - renderResult, err := defaultRender(p, defaultRenderOption{ - Theme: opt.Theme, - Padding: opt.Padding, - SeriesList: seriesList, - XAxis: opt.XAxis, - YAxisOptions: opt.YAxisOptions, - TitleOption: opt.Title, - LegendOption: opt.Legend, - }) - if err != nil { - return chart.BoxZero, err - } - seriesPainter := renderResult.seriesPainter - seriesList = seriesList.Filter(ChartTypeBar) + seriesPainter := result.seriesPainter xRange := NewRange(AxisRangeOption{ DivideCount: len(opt.XAxis.Data), @@ -112,7 +97,7 @@ func (b *barChart) Render() (Box, error) { } for i := range seriesList { series := seriesList[i] - yRange := renderResult.axisRanges[series.AxisIndex] + yRange := result.axisRanges[series.AxisIndex] index := series.index if index == 0 { index = i @@ -196,10 +181,29 @@ func (b *barChart) Render() (Box, error) { }) } // 最大、最小的mark point - err = doRender(rendererList...) + err := doRender(rendererList...) if err != nil { - return chart.BoxZero, err + return BoxZero, err } - return chart.BoxZero, nil + return p.box, nil +} + +func (b *barChart) Render() (Box, error) { + p := b.p + opt := b.opt + renderResult, err := defaultRender(p, defaultRenderOption{ + Theme: opt.Theme, + Padding: opt.Padding, + SeriesList: opt.SeriesList, + XAxis: opt.XAxis, + YAxisOptions: opt.YAxisOptions, + TitleOption: opt.Title, + LegendOption: opt.Legend, + }) + if err != nil { + return BoxZero, err + } + seriesList := opt.SeriesList.Filter(ChartTypeLine) + return b.render(renderResult, seriesList) } diff --git a/charts.go b/charts.go index 09dfc3f..ae14c8d 100644 --- a/charts.go +++ b/charts.go @@ -22,6 +22,8 @@ package charts +import "errors" + const labelFontSize = 10 const defaultDotWidth = 2.0 const defaultStrokeWidth = 2.0 @@ -44,6 +46,28 @@ type Renderer interface { Render() (Box, error) } +type renderHandler struct { + list []func() error +} + +func (rh *renderHandler) Add(fn func() error) { + list := rh.list + if len(list) == 0 { + list = make([]func() error, 0) + } + rh.list = append(list, fn) +} + +func (rh *renderHandler) Do() error { + for _, fn := range rh.list { + err := fn() + if err != nil { + return err + } + } + return nil +} + type defaultRenderOption struct { Theme ColorPalette Padding Box @@ -58,6 +82,8 @@ type defaultRenderOption struct { LegendOption LegendOption // background is filled backgroundIsFilled bool + // x y axis is reversed + axisReversed bool } type defaultRenderResult struct { @@ -67,6 +93,8 @@ type defaultRenderResult struct { } func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, error) { + seriesList := opt.SeriesList + seriesList.init() if !opt.backgroundIsFilled { p.SetBackground(p.Width(), p.Height(), opt.Theme.GetBackgroundColor()) } @@ -138,7 +166,13 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e if yAxisOption.Theme == nil { yAxisOption.Theme = opt.Theme } - yAxisOption.Data = r.Values() + if !opt.axisReversed { + yAxisOption.Data = r.Values() + } else { + yAxisOption.isCategoryAxis = true + opt.XAxis.Data = r.Values() + opt.XAxis.isValueAxis = true + } reverseStringSlice(yAxisOption.Data) // TODO生成其它位置既yAxis yAxis := NewLeftYAxis(p, yAxisOption) @@ -201,30 +235,71 @@ func Render(opt ChartOption) (*Painter, error) { seriesList := opt.SeriesList seriesList.init() - rendererList := make([]Renderer, 0) - // line chart - lineChartSeriesList := seriesList.Filter(ChartTypeLine) - if len(lineChartSeriesList) != 0 { - renderer := NewLineChart(p, LineChartOption{ - Theme: opt.theme, - Font: opt.font, - SeriesList: lineChartSeriesList, - XAxis: opt.XAxis, - Padding: opt.Padding, - YAxisOptions: opt.YAxisOptions, - Title: opt.Title, - Legend: opt.Legend, - backgroundIsFilled: true, - }) - rendererList = append(rendererList, renderer) + lineSeriesList := seriesList.Filter(ChartTypeLine) + barSeriesList := seriesList.Filter(ChartTypeBar) + horizontalBarSeriesList := seriesList.Filter(ChartTypeHorizontalBar) + if len(horizontalBarSeriesList) != 0 && len(horizontalBarSeriesList) != len(seriesList) { + return nil, errors.New("Horizontal bar can not mix other charts") } - for _, renderer := range rendererList { - _, err := renderer.Render() - if err != nil { - return nil, err - } + axisReversed := len(horizontalBarSeriesList) != 0 + + renderResult, err := defaultRender(p, defaultRenderOption{ + Theme: opt.theme, + Padding: opt.Padding, + SeriesList: opt.SeriesList, + XAxis: opt.XAxis, + YAxisOptions: opt.YAxisOptions, + TitleOption: opt.Title, + LegendOption: opt.Legend, + axisReversed: axisReversed, + }) + if err != nil { + return nil, err + } + + handler := renderHandler{} + + if len(lineSeriesList) != 0 { + handler.Add(func() error { + _, err := NewLineChart(p, LineChartOption{ + Theme: opt.theme, + Font: opt.font, + XAxis: opt.XAxis, + }).render(renderResult, lineSeriesList) + return err + }) + } + + // bar chart + if len(barSeriesList) != 0 { + handler.Add(func() error { + _, err := NewBarChart(p, BarChartOption{ + Theme: opt.theme, + Font: opt.font, + XAxis: opt.XAxis, + }).render(renderResult, barSeriesList) + return err + }) + } + + // horizontal bar chart + if len(horizontalBarSeriesList) != 0 { + handler.Add(func() error { + _, err := NewHorizontalBarChart(p, HorizontalBarChartOption{ + Theme: opt.theme, + Font: opt.font, + YAxisOptions: opt.YAxisOptions, + }).render(renderResult, horizontalBarSeriesList) + return err + }) + } + + err = handler.Do() + + if err != nil { + return nil, err } return p, nil diff --git a/examples/charts/main.go b/examples/charts/main.go index 18f5a95..c7986a4 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -218,6 +218,201 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, }, }, + // 柱状图 + { + Title: charts.TitleOption{ + Text: "Bar", + }, + XAxis: charts.NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + Legend: charts.LegendOption{ + Data: []string{ + "Rainfall", + "Evaporation", + }, + Icon: charts.IconRect, + }, + SeriesList: []charts.Series{ + charts.NewSeriesFromValues([]float64{ + 120, + 200, + 150, + 80, + 70, + 110, + 130, + }, charts.ChartTypeBar), + { + Type: charts.ChartTypeBar, + Data: []charts.SeriesData{ + { + Value: 100, + }, + { + Value: 190, + Style: charts.Style{ + FillColor: charts.Color{ + R: 169, + G: 0, + B: 0, + A: 255, + }, + }, + }, + { + Value: 230, + }, + { + Value: 140, + }, + { + Value: 100, + }, + { + Value: 200, + }, + { + Value: 180, + }, + }, + }, + }, + }, + // 水平柱状图 + { + Title: charts.TitleOption{ + Text: "World Population", + }, + Padding: charts.Box{ + Top: 20, + Right: 40, + Bottom: 20, + Left: 20, + }, + Legend: charts.NewLegendOption([]string{ + "2011", + "2012", + }), + YAxisOptions: charts.NewYAxisOptions([]string{ + "Brazil", + "Indonesia", + "USA", + "India", + "China", + "World", + }), + SeriesList: []charts.Series{ + { + Type: charts.ChartTypeHorizontalBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 18203, + 23489, + 29034, + 104970, + 131744, + 630230, + }), + }, + { + Type: charts.ChartTypeHorizontalBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 19325, + 23438, + 31000, + 121594, + 134141, + 681807, + }), + }, + }, + }, + { + Title: charts.TitleOption{ + Text: "Rainfall vs Evaporation", + Subtext: "Fake Data", + }, + Padding: charts.Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }, + XAxis: charts.NewXAxisOption([]string{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + }), + Legend: charts.NewLegendOption([]string{ + "Rainfall", + "Evaporation", + }, charts.PositionRight), + SeriesList: []charts.Series{ + { + Type: charts.ChartTypeBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20.0, + 6.4, + 3.3, + }), + MarkPoint: charts.NewMarkPoint( + charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin, + ), + MarkLine: charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ), + }, + { + Type: charts.ChartTypeBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 2.6, + 5.9, + 9.0, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6.0, + 2.3, + }), + MarkPoint: charts.NewMarkPoint( + charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin, + ), + MarkLine: charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ), + }, + }, + }, } handler(w, req, chartOptions, nil) } diff --git a/examples/horizontal_bar_chart/main.go b/examples/horizontal_bar_chart/main.go new file mode 100644 index 0000000..eecd9ec --- /dev/null +++ b/examples/horizontal_bar_chart/main.go @@ -0,0 +1,94 @@ +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + + "github.com/vicanso/go-charts" +) + +func writeFile(buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file := filepath.Join(tmpPath, "horizontal-bar-chart.png") + err = ioutil.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func main() { + p, err := charts.NewPainter(charts.PainterOptions{ + Width: 800, + Height: 600, + Type: charts.ChartOutputPNG, + }) + if err != nil { + panic(err) + } + _, err = charts.NewHorizontalBarChart(p, charts.HorizontalBarChartOption{ + Title: charts.TitleOption{ + Text: "World Population", + }, + Padding: charts.Box{ + Top: 20, + Right: 40, + Bottom: 20, + Left: 20, + }, + Legend: charts.NewLegendOption([]string{ + "2011", + "2012", + }), + YAxisOptions: charts.NewYAxisOptions([]string{ + "Brazil", + "Indonesia", + "USA", + "India", + "China", + "World", + }), + SeriesList: []charts.Series{ + { + Type: charts.ChartTypeHorizontalBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 18203, + 23489, + 29034, + 104970, + 131744, + 630230, + }), + }, + { + Type: charts.ChartTypeHorizontalBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 19325, + 23438, + 31000, + 121594, + 134141, + 681807, + }), + }, + }, + }).Render() + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + err = writeFile(buf) + if err != nil { + panic(err) + } +} diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go new file mode 100644 index 0000000..87ca9ae --- /dev/null +++ b/horizontal_bar_chart.go @@ -0,0 +1,152 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" +) + +type horizontalBarChart struct { + p *Painter + opt *HorizontalBarChartOption +} + +type HorizontalBarChartOption struct { + Theme ColorPalette + // The font size + Font *truetype.Font + // The data series list + SeriesList SeriesList + // The x axis option + XAxis XAxisOption + // The padding of line chart + Padding Box + // The y axis option + YAxisOptions []YAxisOption + // The option of title + Title TitleOption + // The legend option + Legend LegendOption +} + +func NewHorizontalBarChart(p *Painter, opt HorizontalBarChartOption) *horizontalBarChart { + if opt.Theme == nil { + opt.Theme = NewTheme("") + } + return &horizontalBarChart{ + p: p, + opt: &opt, + } +} + +func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { + p := h.p + opt := h.opt + seriesPainter := result.seriesPainter + yRange := result.axisRanges[0] + y0, y1 := yRange.GetRange(0) + height := int(y1 - y0) + // 每一块之间的margin + margin := 10 + // 每一个bar之间的margin + barMargin := 5 + if height < 20 { + margin = 2 + barMargin = 2 + } else if height < 50 { + margin = 5 + barMargin = 3 + } + seriesCount := len(seriesList) + // 总的高度-两个margin-(总数-1)的barMargin + barHeight := (height - 2*margin - barMargin*(seriesCount-1)) / len(seriesList) + + theme := opt.Theme + + max, min := seriesList.GetMaxMin(0) + xRange := NewRange(AxisRangeOption{ + Min: min, + Max: max, + DivideCount: defaultAxisDivideCount, + Size: seriesPainter.Width(), + }) + + for i := range seriesList { + series := seriesList[i] + index := series.index + if index == 0 { + index = i + } + seriesColor := theme.GetSeriesColor(index) + divideValues := yRange.AutoDivide() + for j, item := range series.Data { + if j >= yRange.divideCount { + continue + } + // 显示位置切换 + j = yRange.divideCount - j - 1 + y := divideValues[j] + y += margin + if i != 0 { + y += i * (barHeight + barMargin) + } + + w := int(xRange.getHeight(item.Value)) + fillColor := seriesColor + if !item.Style.FillColor.IsZero() { + fillColor = item.Style.FillColor + } + right := w + seriesPainter.OverrideDrawingStyle(Style{ + FillColor: fillColor, + }).Rect(chart.Box{ + Top: y, + Left: 0, + Right: right, + Bottom: y + barHeight, + }) + } + } + return p.box, nil +} + +func (h *horizontalBarChart) Render() (Box, error) { + p := h.p + opt := h.opt + renderResult, err := defaultRender(p, defaultRenderOption{ + Theme: opt.Theme, + Padding: opt.Padding, + SeriesList: opt.SeriesList, + XAxis: opt.XAxis, + YAxisOptions: opt.YAxisOptions, + TitleOption: opt.Title, + LegendOption: opt.Legend, + axisReversed: true, + }) + if err != nil { + return BoxZero, err + } + seriesList := opt.SeriesList.Filter(ChartTypeHorizontalBar) + return h.render(renderResult, seriesList) +} diff --git a/legend.go b/legend.go index e645e17..65793c9 100644 --- a/legend.go +++ b/legend.go @@ -155,17 +155,17 @@ func (l *legendPainter) Render() (Box, error) { drawIcon := func(top, left int) int { if opt.Icon == IconRect { p.Rect(Box{ - Top: top - legendHeight + 4, + Top: top - legendHeight + 8, Left: left, Right: left + legendWidth, - Bottom: top - 2, + Bottom: top + 1, }) } else { p.LegendLineDot(Box{ - Top: top, + Top: top + 1, Left: left, Right: left + legendWidth, - Bottom: top + legendHeight, + Bottom: top + legendHeight + 1, }) } return left + legendWidth diff --git a/line_chart.go b/line_chart.go index 451edfe..47a497f 100644 --- a/line_chart.go +++ b/line_chart.go @@ -24,7 +24,6 @@ package charts import ( "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" ) @@ -63,32 +62,15 @@ type LineChartOption struct { backgroundIsFilled bool } -func (l *lineChart) Render() (Box, error) { +func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { p := l.p opt := l.opt - seriesList := opt.SeriesList - seriesList.init() - renderResult, err := defaultRender(p, defaultRenderOption{ - Theme: opt.Theme, - Padding: opt.Padding, - SeriesList: seriesList, - XAxis: opt.XAxis, - YAxisOptions: opt.YAxisOptions, - TitleOption: opt.Title, - LegendOption: opt.Legend, - backgroundIsFilled: opt.backgroundIsFilled, - }) - if err != nil { - return chart.BoxZero, err - } boundaryGap := true if opt.XAxis.BoundaryGap != nil && !*opt.XAxis.BoundaryGap { boundaryGap = false } - seriesList = seriesList.Filter(ChartTypeLine) - - seriesPainter := renderResult.seriesPainter + seriesPainter := result.seriesPainter xDivideCount := len(opt.XAxis.Data) if !boundaryGap { @@ -118,7 +100,7 @@ func (l *lineChart) Render() (Box, error) { } seriesPainter.SetDrawingStyle(drawingStyle) - yRange := renderResult.axisRanges[series.AxisIndex] + yRange := result.axisRanges[series.AxisIndex] points := make([]Point, 0) for i, item := range series.Data { h := yRange.getRestHeight(item.Value) @@ -156,10 +138,32 @@ func (l *lineChart) Render() (Box, error) { }) } // 最大、最小的mark point - err = doRender(rendererList...) + err := doRender(rendererList...) if err != nil { - return chart.BoxZero, err + return BoxZero, err } return p.box, nil } + +func (l *lineChart) Render() (Box, error) { + p := l.p + opt := l.opt + + renderResult, err := defaultRender(p, defaultRenderOption{ + Theme: opt.Theme, + Padding: opt.Padding, + SeriesList: opt.SeriesList, + XAxis: opt.XAxis, + YAxisOptions: opt.YAxisOptions, + TitleOption: opt.Title, + LegendOption: opt.Legend, + backgroundIsFilled: opt.backgroundIsFilled, + }) + if err != nil { + return BoxZero, err + } + seriesList := opt.SeriesList.Filter(ChartTypeLine) + + return l.render(renderResult, seriesList) +} diff --git a/mark_line.go b/mark_line.go index 9a9d568..bb1b602 100644 --- a/mark_line.go +++ b/mark_line.go @@ -24,7 +24,6 @@ package charts import ( "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" ) func NewMarkLine(markLineTypes ...string) SeriesMarkLine { @@ -104,7 +103,7 @@ func (m *markLinePainter) Render() (Box, error) { painter.Text(text, width, y+textBox.Height()>>1-2) } } - return chart.BoxZero, nil + return BoxZero, nil } func markLineRender(opt markLineRenderOption) { diff --git a/mark_point.go b/mark_point.go index 07daf57..3d43a73 100644 --- a/mark_point.go +++ b/mark_point.go @@ -24,7 +24,6 @@ package charts import ( "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" ) func NewMarkPoint(markPointTypes ...string) SeriesMarkPoint { @@ -99,5 +98,5 @@ func (m *markPointPainter) Render() (Box, error) { painter.Text(text, p.X-textBox.Width()>>1, p.Y-symbolSize>>1-2) } } - return chart.BoxZero, nil + return BoxZero, nil } diff --git a/series.go b/series.go index 2888f30..4808bcb 100644 --- a/series.go +++ b/series.go @@ -132,6 +132,12 @@ func (sl SeriesList) init() { } } +func (sl SeriesList) reverse() { + for i, j := 0, len(sl)-1; i < j; i, j = i+1, j-1 { + sl[i], sl[j] = sl[j], sl[i] + } +} + func (sl SeriesList) Filter(chartType string) SeriesList { arr := make(SeriesList, 0) for index, item := range sl { diff --git a/title.go b/title.go index 30831ac..a805c55 100644 --- a/title.go +++ b/title.go @@ -95,6 +95,11 @@ func (t *titlePainter) Render() (Box, error) { opt := t.opt p := t.p theme := opt.Theme + + if opt.Text == "" && opt.Subtext == "" { + return BoxZero, nil + } + measureOptions := make([]titleMeasureOption, 0) if opt.Font == nil { diff --git a/xaxis.go b/xaxis.go index d8f6700..f06d71f 100644 --- a/xaxis.go +++ b/xaxis.go @@ -47,7 +47,8 @@ type XAxisOption struct { // The line color of axis StrokeColor Color // The color of label - FontColor Color + FontColor Color + isValueAxis bool } const defaultXAxisHeight = 30 @@ -67,22 +68,26 @@ func (opt *XAxisOption) ToAxisOption() AxisOption { if opt.Position == PositionTop { position = PositionTop } - return AxisOption{ - Theme: opt.Theme, - Data: opt.Data, - BoundaryGap: opt.BoundaryGap, - Position: position, - SplitNumber: opt.SplitNumber, - StrokeColor: opt.StrokeColor, - FontSize: opt.FontSize, - Font: opt.Font, - FontColor: opt.FontColor, + axisOpt := AxisOption{ + Theme: opt.Theme, + Data: opt.Data, + BoundaryGap: opt.BoundaryGap, + Position: position, + SplitNumber: opt.SplitNumber, + StrokeColor: opt.StrokeColor, + FontSize: opt.FontSize, + Font: opt.Font, + FontColor: opt.FontColor, + SplitLineColor: opt.Theme.GetAxisSplitLineColor(), } + if opt.isValueAxis { + axisOpt.SplitLineShow = true + axisOpt.StrokeWidth = -1 + axisOpt.BoundaryGap = FalseFlag() + } + return axisOpt } func NewBottomXAxis(p *Painter, opt XAxisOption) *axisPainter { - p = p.Child(PainterPaddingOption(Box{ - Top: p.Height() - defaultXAxisHeight, - })) return NewAxisPainter(p, opt.ToAxisOption()) } diff --git a/yaxis.go b/yaxis.go index b011a74..609924f 100644 --- a/yaxis.go +++ b/yaxis.go @@ -36,7 +36,22 @@ type YAxisOption struct { // The position of axis, it can be 'left' or 'right' Position string // The color of label - FontColor Color + FontColor Color + isCategoryAxis bool +} + +func NewYAxisOptions(data []string, others ...[]string) []YAxisOption { + arr := [][]string{ + data, + } + arr = append(arr, others...) + opts := make([]YAxisOption, 0) + for _, data := range arr { + opts = append(opts, YAxisOption{ + Data: data, + }) + } + return opts } func (opt *YAxisOption) ToAxisOption() AxisOption { @@ -44,7 +59,7 @@ func (opt *YAxisOption) ToAxisOption() AxisOption { if opt.Position == PositionRight { position = PositionRight } - return AxisOption{ + axisOpt := AxisOption{ Theme: opt.Theme, Data: opt.Data, Position: position, @@ -56,6 +71,12 @@ func (opt *YAxisOption) ToAxisOption() AxisOption { SplitLineShow: true, SplitLineColor: opt.Theme.GetAxisSplitLineColor(), } + if opt.isCategoryAxis { + axisOpt.BoundaryGap = TrueFlag() + axisOpt.StrokeWidth = 1 + axisOpt.SplitLineShow = false + } + return axisOpt } func NewLeftYAxis(p *Painter, opt YAxisOption) *axisPainter { From 65a1cb11adfda2466a77ecb333fd3f216467993d Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 16 Jun 2022 23:08:20 +0800 Subject: [PATCH 144/251] feat: support pie, radar and funnel chart --- axis.go | 34 ++- bar_chart.go | 16 +- chart_option.go | 2 +- charts.go | 150 ++++++++-- echarts.go | 505 ++++++++++++++++++++++++++++++++++ examples/charts/main.go | 372 +++++++++++++++++++++++-- examples/funnel_chart/main.go | 97 +++++++ examples/pie_chart/main.go | 83 ++++++ examples/radar_chart/main.go | 112 ++++++++ funnel_chart.go | 172 ++++++++++++ horizontal_bar_chart.go | 14 +- legend.go | 21 +- line_chart.go | 2 +- painter.go | 3 + pie_chart.go | 211 ++++++++++++++ radar_chart.go | 245 +++++++++++++++++ xaxis.go | 5 +- yaxis.go | 28 +- 18 files changed, 1987 insertions(+), 85 deletions(-) create mode 100644 echarts.go create mode 100644 examples/funnel_chart/main.go create mode 100644 examples/pie_chart/main.go create mode 100644 examples/radar_chart/main.go create mode 100644 funnel_chart.go create mode 100644 pie_chart.go create mode 100644 radar_chart.go diff --git a/axis.go b/axis.go index d069c39..7b828d2 100644 --- a/axis.go +++ b/axis.go @@ -23,7 +23,10 @@ package charts import ( + "strings" + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" ) type axisPainter struct { @@ -41,11 +44,15 @@ func NewAxisPainter(p *Painter, opt AxisOption) *axisPainter { type AxisOption struct { // The theme of chart Theme ColorPalette + // Formatter for y axis text value + Formatter string // The label of axis Data []string // The boundary gap on both sides of a coordinate axis. // Nil or *true means the center part of two axis ticks BoundaryGap *bool + // The flag for show axis, set this to *false will hide axis + Show *bool // The position of axis, it can be 'left', 'top', 'right' or 'bottom' Position string // Number of segments that the axis is split into. Note that this number serves only as a recommendation. @@ -74,6 +81,9 @@ func (a *axisPainter) Render() (Box, error) { opt := a.opt top := a.p theme := opt.Theme + if opt.Show != nil && !*opt.Show { + return BoxZero, nil + } strokeWidth := opt.StrokeWidth if strokeWidth == 0 { @@ -97,10 +107,15 @@ func (a *axisPainter) Render() (Box, error) { strokeColor = theme.GetAxisStrokeColor() } - tickCount := opt.SplitNumber - if tickCount == 0 { - tickCount = len(opt.Data) + data := opt.Data + formatter := opt.Formatter + if len(formatter) != 0 { + for index, text := range data { + data[index] = strings.ReplaceAll(formatter, "{value}", text) + } } + dataCount := len(data) + tickCount := dataCount boundaryGap := true if opt.BoundaryGap != nil && !*opt.BoundaryGap { @@ -118,8 +133,6 @@ func (a *axisPainter) Render() (Box, error) { labelPosition = PositionCenter } - // TODO 计算unit - unit := 1 // 如果小于0,则表示不处理 tickLength := getDefaultInt(opt.TickLength, 5) labelMargin := getDefaultInt(opt.LabelMargin, 5) @@ -133,7 +146,9 @@ func (a *axisPainter) Render() (Box, error) { } top.SetDrawingStyle(style).OverrideTextStyle(style) - textMaxWidth, textMaxHeight := top.MeasureTextMaxWidthHeight(opt.Data) + textMaxWidth, textMaxHeight := top.MeasureTextMaxWidthHeight(data) + textCount := ceilFloatToInt(float64(top.Width()) / float64(textMaxWidth)) + unit := ceilFloatToInt(float64(dataCount) / float64(chart.MaxInt(textCount, opt.SplitNumber))) width := 0 height := 0 @@ -226,7 +241,7 @@ func (a *axisPainter) Render() (Box, error) { Right: labelPaddingRight, })).MultiText(MultiTextOption{ Align: textAlign, - TextList: opt.Data, + TextList: data, Orient: orient, Unit: unit, Position: labelPosition, @@ -242,10 +257,7 @@ func (a *axisPainter) Render() (Box, error) { x0 = 0 x1 = top.Width() - p.Width() } - for index, y := range autoDivide(height, tickCount) { - if index == 0 { - continue - } + for _, y := range autoDivide(height, tickCount) { top.LineStroke([]Point{ { X: x0, diff --git a/bar_chart.go b/bar_chart.go index 8fae4df..8330542 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -95,14 +95,10 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B markPointPainter, markLinePainter, } - for i := range seriesList { - series := seriesList[i] + for index := range seriesList { + series := seriesList[index] yRange := result.axisRanges[series.AxisIndex] - index := series.index - if index == 0 { - index = i - } - seriesColor := theme.GetSeriesColor(index) + seriesColor := theme.GetSeriesColor(series.index) divideValues := xRange.AutoDivide() points := make([]Point, len(series.Data)) @@ -112,8 +108,8 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B } x := divideValues[j] x += margin - if i != 0 { - x += i * (barWidth + barMargin) + if index != 0 { + x += index * (barWidth + barMargin) } h := int(yRange.getHeight(item.Value)) @@ -151,7 +147,7 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B if distance == 0 { distance = 5 } - text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(i, item.Value, -1) + text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(index, item.Value, -1) labelStyle := Style{ FontColor: theme.GetTextColor(), FontSize: labelFontSize, diff --git a/chart_option.go b/chart_option.go index 6ca7cd7..0cea754 100644 --- a/chart_option.go +++ b/chart_option.go @@ -59,7 +59,7 @@ type ChartOption struct { // The series list SeriesList SeriesList // The radar indicator list - // RadarIndicators []RadarIndicator + RadarIndicators []RadarIndicator // The background color of chart BackgroundColor Color // The child charts diff --git a/charts.go b/charts.go index ae14c8d..51e247a 100644 --- a/charts.go +++ b/charts.go @@ -22,7 +22,10 @@ package charts -import "errors" +import ( + "errors" + "sort" +) const labelFontSize = 10 const defaultDotWidth = 2.0 @@ -140,16 +143,29 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e if containsInt(axisIndexList, series.AxisIndex) { continue } - axisIndexList = append(axisIndexList, series.index) + axisIndexList = append(axisIndexList, series.AxisIndex) } // 高度需要减去x轴的高度 rangeHeight := p.Height() - defaultXAxisHeight rangeWidthLeft := 0 rangeWidthRight := 0 + // 倒序 + sort.Sort(sort.Reverse(sort.IntSlice(axisIndexList))) + // 计算对应的axis range for _, index := range axisIndexList { + yAxisOption := YAxisOption{} + if len(opt.YAxisOptions) > index { + yAxisOption = opt.YAxisOptions[index] + } max, min := opt.SeriesList.GetMaxMin(index) + if yAxisOption.Min != nil { + min = *yAxisOption.Min + } + if yAxisOption.Max != nil { + max = *yAxisOption.Max + } r := NewRange(AxisRangeOption{ Min: min, Max: max, @@ -159,10 +175,7 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e DivideCount: defaultAxisDivideCount, }) result.axisRanges[index] = r - yAxisOption := YAxisOption{} - if len(opt.YAxisOptions) > index { - yAxisOption = opt.YAxisOptions[index] - } + if yAxisOption.Theme == nil { yAxisOption.Theme = opt.Theme } @@ -175,7 +188,16 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e } reverseStringSlice(yAxisOption.Data) // TODO生成其它位置既yAxis - yAxis := NewLeftYAxis(p, yAxisOption) + var yAxis *axisPainter + child := p.Child(PainterPaddingOption(Box{ + Left: rangeWidthLeft, + Right: rangeWidthRight, + })) + if index == 0 { + yAxis = NewLeftYAxis(child, yAxisOption) + } else { + yAxis = NewRightYAxis(child, yAxisOption) + } yAxisBox, err := yAxis.Render() if err != nil { return nil, err @@ -191,7 +213,8 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e opt.XAxis.Theme = opt.Theme } xAxis := NewBottomXAxis(p.Child(PainterPaddingOption(Box{ - Left: rangeWidthLeft, + Left: rangeWidthLeft, + Right: rangeWidthRight, })), opt.XAxis) _, err := xAxis.Render() if err != nil { @@ -219,7 +242,9 @@ func doRender(renderers ...Renderer) error { func Render(opt ChartOption) (*Painter, error) { opt.fillDefault() + isChild := true if opt.Parent == nil { + isChild = false p, err := NewPainter(PainterOptions{ Type: opt.Type, Width: opt.Width, @@ -231,21 +256,40 @@ func Render(opt ChartOption) (*Painter, error) { opt.Parent = p } p := opt.Parent - p.SetBackground(p.Width(), p.Height(), opt.BackgroundColor) + if !opt.Box.IsZero() { + p = p.Child(PainterBoxOption(opt.Box)) + } + if !isChild { + p.SetBackground(p.Width(), p.Height(), opt.BackgroundColor) + } seriesList := opt.SeriesList seriesList.init() + seriesCount := len(seriesList) + // line chart lineSeriesList := seriesList.Filter(ChartTypeLine) barSeriesList := seriesList.Filter(ChartTypeBar) horizontalBarSeriesList := seriesList.Filter(ChartTypeHorizontalBar) - if len(horizontalBarSeriesList) != 0 && len(horizontalBarSeriesList) != len(seriesList) { + pieSeriesList := seriesList.Filter(ChartTypePie) + radarSeriesList := seriesList.Filter(ChartTypeRadar) + funnelSeriesList := seriesList.Filter(ChartTypeFunnel) + + if len(horizontalBarSeriesList) != 0 && len(horizontalBarSeriesList) != seriesCount { return nil, errors.New("Horizontal bar can not mix other charts") } + if len(pieSeriesList) != 0 && len(pieSeriesList) != seriesCount { + return nil, errors.New("Pie can not mix other charts") + } + if len(radarSeriesList) != 0 && len(radarSeriesList) != seriesCount { + return nil, errors.New("Radar can not mix other charts") + } + if len(funnelSeriesList) != 0 && len(funnelSeriesList) != seriesCount { + return nil, errors.New("Funnel can not mix other charts") + } axisReversed := len(horizontalBarSeriesList) != 0 - - renderResult, err := defaultRender(p, defaultRenderOption{ + renderOpt := defaultRenderOption{ Theme: opt.theme, Padding: opt.Padding, SeriesList: opt.SeriesList, @@ -254,24 +298,28 @@ func Render(opt ChartOption) (*Painter, error) { TitleOption: opt.Title, LegendOption: opt.Legend, axisReversed: axisReversed, - }) + } + if isChild { + renderOpt.backgroundIsFilled = true + } + if len(pieSeriesList) != 0 || + len(radarSeriesList) != 0 || + len(funnelSeriesList) != 0 { + renderOpt.XAxis.Show = FalseFlag() + renderOpt.YAxisOptions = []YAxisOption{ + { + Show: FalseFlag(), + }, + } + } + + renderResult, err := defaultRender(p, renderOpt) if err != nil { return nil, err } handler := renderHandler{} - if len(lineSeriesList) != 0 { - handler.Add(func() error { - _, err := NewLineChart(p, LineChartOption{ - Theme: opt.theme, - Font: opt.font, - XAxis: opt.XAxis, - }).render(renderResult, lineSeriesList) - return err - }) - } - // bar chart if len(barSeriesList) != 0 { handler.Add(func() error { @@ -296,11 +344,65 @@ func Render(opt ChartOption) (*Painter, error) { }) } + // pie chart + if len(pieSeriesList) != 0 { + handler.Add(func() error { + _, err := NewPieChart(p, PieChartOption{ + Theme: opt.theme, + Font: opt.font, + }).render(renderResult, pieSeriesList) + return err + }) + } + + // line chart + if len(lineSeriesList) != 0 { + handler.Add(func() error { + _, err := NewLineChart(p, LineChartOption{ + Theme: opt.theme, + Font: opt.font, + XAxis: opt.XAxis, + }).render(renderResult, lineSeriesList) + return err + }) + } + + // radar chart + if len(radarSeriesList) != 0 { + handler.Add(func() error { + _, err := NewRadarChart(p, RadarChartOption{ + Theme: opt.theme, + Font: opt.font, + // 相应值 + RadarIndicators: opt.RadarIndicators, + }).render(renderResult, radarSeriesList) + return err + }) + } + + // funnel chart + if len(funnelSeriesList) != 0 { + handler.Add(func() error { + _, err := NewFunnelChart(p, FunnelChartOption{ + Theme: opt.theme, + Font: opt.font, + }).render(renderResult, funnelSeriesList) + return err + }) + } + err = handler.Do() if err != nil { return nil, err } + for _, item := range opt.Children { + item.Parent = p + _, err = Render(item) + if err != nil { + return nil, err + } + } return p, nil } diff --git a/echarts.go b/echarts.go new file mode 100644 index 0000000..ac28436 --- /dev/null +++ b/echarts.go @@ -0,0 +1,505 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "bytes" + "encoding/json" + "fmt" + "regexp" + "strconv" + + "github.com/wcharczuk/go-chart/v2" +) + +func convertToArray(data []byte) []byte { + data = bytes.TrimSpace(data) + if len(data) == 0 { + return nil + } + if data[0] != '[' { + data = []byte("[" + string(data) + "]") + } + return data +} + +type EChartsPosition string + +func (p *EChartsPosition) UnmarshalJSON(data []byte) error { + if len(data) == 0 { + return nil + } + if regexp.MustCompile(`^\d+`).Match(data) { + data = []byte(fmt.Sprintf(`"%s"`, string(data))) + } + s := (*string)(p) + return json.Unmarshal(data, s) +} + +type EChartStyle struct { + Color string `json:"color"` +} + +func (es *EChartStyle) ToStyle() chart.Style { + color := parseColor(es.Color) + return chart.Style{ + FillColor: color, + FontColor: color, + StrokeColor: color, + } +} + +type EChartsSeriesDataValue struct { + values []float64 +} + +func (value *EChartsSeriesDataValue) UnmarshalJSON(data []byte) error { + data = convertToArray(data) + return json.Unmarshal(data, &value.values) +} +func (value *EChartsSeriesDataValue) First() float64 { + if len(value.values) == 0 { + return 0 + } + return value.values[0] +} +func NewEChartsSeriesDataValue(values ...float64) EChartsSeriesDataValue { + return EChartsSeriesDataValue{ + values: values, + } +} + +type EChartsSeriesData struct { + Value EChartsSeriesDataValue `json:"value"` + Name string `json:"name"` + ItemStyle EChartStyle `json:"itemStyle"` +} +type _EChartsSeriesData EChartsSeriesData + +var numericRep = regexp.MustCompile(`^[-+]?[0-9]+(?:\.[0-9]+)?$`) + +func (es *EChartsSeriesData) UnmarshalJSON(data []byte) error { + data = bytes.TrimSpace(data) + if len(data) == 0 { + return nil + } + if numericRep.Match(data) { + v, err := strconv.ParseFloat(string(data), 64) + if err != nil { + return err + } + es.Value = EChartsSeriesDataValue{ + values: []float64{ + v, + }, + } + return nil + } + v := _EChartsSeriesData{} + err := json.Unmarshal(data, &v) + if err != nil { + return err + } + es.Name = v.Name + es.Value = v.Value + es.ItemStyle = v.ItemStyle + return nil +} + +type EChartsXAxisData struct { + BoundaryGap *bool `json:"boundaryGap"` + SplitNumber int `json:"splitNumber"` + Data []string `json:"data"` +} +type EChartsXAxis struct { + Data []EChartsXAxisData +} + +func (ex *EChartsXAxis) UnmarshalJSON(data []byte) error { + data = convertToArray(data) + if len(data) == 0 { + return nil + } + return json.Unmarshal(data, &ex.Data) +} + +type EChartsAxisLabel struct { + Formatter string `json:"formatter"` +} +type EChartsYAxisData struct { + Min *float64 `json:"min"` + Max *float64 `json:"max"` + AxisLabel EChartsAxisLabel `json:"axisLabel"` + AxisLine struct { + LineStyle struct { + Color string `json:"color"` + } `json:"lineStyle"` + } `json:"axisLine"` +} +type EChartsYAxis struct { + Data []EChartsYAxisData `json:"data"` +} + +func (ey *EChartsYAxis) UnmarshalJSON(data []byte) error { + data = convertToArray(data) + if len(data) == 0 { + return nil + } + return json.Unmarshal(data, &ey.Data) +} + +type EChartsPadding struct { + Box chart.Box +} + +func (eb *EChartsPadding) UnmarshalJSON(data []byte) error { + data = convertToArray(data) + if len(data) == 0 { + return nil + } + arr := make([]int, 0) + err := json.Unmarshal(data, &arr) + if err != nil { + return err + } + if len(arr) == 0 { + return nil + } + switch len(arr) { + case 1: + eb.Box = chart.Box{ + Left: arr[0], + Top: arr[0], + Bottom: arr[0], + Right: arr[0], + } + case 2: + eb.Box = chart.Box{ + Top: arr[0], + Bottom: arr[0], + Left: arr[1], + Right: arr[1], + } + default: + result := make([]int, 4) + copy(result, arr) + if len(arr) == 3 { + result[3] = result[1] + } + // 上右下左 + eb.Box = chart.Box{ + Top: result[0], + Right: result[1], + Bottom: result[2], + Left: result[3], + } + } + return nil +} + +type EChartsLabelOption struct { + Show bool `json:"show"` + Distance int `json:"distance"` + Color string `json:"color"` +} +type EChartsLegend struct { + Show *bool `json:"show"` + Data []string `json:"data"` + Align string `json:"align"` + Orient string `json:"orient"` + Padding EChartsPadding `json:"padding"` + Left EChartsPosition `json:"left"` + Top EChartsPosition `json:"top"` + TextStyle EChartsTextStyle `json:"textStyle"` +} + +type EChartsMarkData struct { + Type string `json:"type"` +} +type _EChartsMarkData EChartsMarkData + +func (emd *EChartsMarkData) UnmarshalJSON(data []byte) error { + data = bytes.TrimSpace(data) + if len(data) == 0 { + return nil + } + data = convertToArray(data) + ds := make([]*_EChartsMarkData, 0) + err := json.Unmarshal(data, &ds) + if err != nil { + return err + } + for _, d := range ds { + if d.Type != "" { + emd.Type = d.Type + } + } + return nil +} + +type EChartsMarkPoint struct { + SymbolSize int `json:"symbolSize"` + Data []EChartsMarkData `json:"data"` +} + +func (emp *EChartsMarkPoint) ToSeriesMarkPoint() SeriesMarkPoint { + sp := SeriesMarkPoint{ + SymbolSize: emp.SymbolSize, + } + if len(emp.Data) == 0 { + return sp + } + data := make([]SeriesMarkData, len(emp.Data)) + for index, item := range emp.Data { + data[index].Type = item.Type + } + sp.Data = data + return sp +} + +type EChartsMarkLine struct { + Data []EChartsMarkData `json:"data"` +} + +func (eml *EChartsMarkLine) ToSeriesMarkLine() SeriesMarkLine { + sl := SeriesMarkLine{} + if len(eml.Data) == 0 { + return sl + } + data := make([]SeriesMarkData, len(eml.Data)) + for index, item := range eml.Data { + data[index].Type = item.Type + } + sl.Data = data + return sl +} + +type EChartsSeries struct { + Data []EChartsSeriesData `json:"data"` + Name string `json:"name"` + Type string `json:"type"` + Radius string `json:"radius"` + YAxisIndex int `json:"yAxisIndex"` + ItemStyle EChartStyle `json:"itemStyle"` + // label的配置 + Label EChartsLabelOption `json:"label"` + MarkPoint EChartsMarkPoint `json:"markPoint"` + MarkLine EChartsMarkLine `json:"markLine"` + Max *float64 `json:"max"` + Min *float64 `json:"min"` +} +type EChartsSeriesList []EChartsSeries + +func (esList EChartsSeriesList) ToSeriesList() SeriesList { + seriesList := make(SeriesList, 0, len(esList)) + for _, item := range esList { + // 如果是pie,则每个子荐生成一个series + if item.Type == ChartTypePie { + for _, dataItem := range item.Data { + seriesList = append(seriesList, Series{ + Type: item.Type, + Name: dataItem.Name, + Label: SeriesLabel{ + Show: true, + }, + Radius: item.Radius, + Data: []SeriesData{ + { + Value: dataItem.Value.First(), + }, + }, + }) + } + continue + } + // 如果是radar或funnel + if item.Type == ChartTypeRadar || + item.Type == ChartTypeFunnel { + for _, dataItem := range item.Data { + seriesList = append(seriesList, Series{ + Name: dataItem.Name, + Type: item.Type, + Data: NewSeriesDataFromValues(dataItem.Value.values), + Max: item.Max, + Min: item.Min, + }) + } + continue + } + data := make([]SeriesData, len(item.Data)) + for j, dataItem := range item.Data { + data[j] = SeriesData{ + Value: dataItem.Value.First(), + Style: dataItem.ItemStyle.ToStyle(), + } + } + seriesList = append(seriesList, Series{ + Type: item.Type, + Data: data, + AxisIndex: item.YAxisIndex, + Style: item.ItemStyle.ToStyle(), + Label: SeriesLabel{ + Color: parseColor(item.Label.Color), + Show: item.Label.Show, + Distance: item.Label.Distance, + }, + Name: item.Name, + MarkPoint: item.MarkPoint.ToSeriesMarkPoint(), + MarkLine: item.MarkLine.ToSeriesMarkLine(), + }) + } + return seriesList +} + +type EChartsTextStyle struct { + Color string `json:"color"` + FontFamily string `json:"fontFamily"` + FontSize float64 `json:"fontSize"` +} + +func (et *EChartsTextStyle) ToStyle() chart.Style { + s := chart.Style{ + FontSize: et.FontSize, + FontColor: parseColor(et.Color), + } + if et.FontFamily != "" { + s.Font, _ = GetFont(et.FontFamily) + } + return s +} + +type EChartsOption struct { + Type string `json:"type"` + Theme string `json:"theme"` + FontFamily string `json:"fontFamily"` + Padding EChartsPadding `json:"padding"` + Box chart.Box `json:"box"` + Width int `json:"width"` + Height int `json:"height"` + Title struct { + Text string `json:"text"` + Subtext string `json:"subtext"` + Left EChartsPosition `json:"left"` + Top EChartsPosition `json:"top"` + TextStyle EChartsTextStyle `json:"textStyle"` + SubtextStyle EChartsTextStyle `json:"subtextStyle"` + } `json:"title"` + XAxis EChartsXAxis `json:"xAxis"` + YAxis EChartsYAxis `json:"yAxis"` + Legend EChartsLegend `json:"legend"` + Radar struct { + Indicator []RadarIndicator `json:"indicator"` + } `json:"radar"` + Series EChartsSeriesList `json:"series"` + Children []EChartsOption `json:"children"` +} + +func (eo *EChartsOption) ToOption() ChartOption { + fontFamily := eo.FontFamily + if len(fontFamily) == 0 { + fontFamily = eo.Title.TextStyle.FontFamily + } + titleTextStyle := eo.Title.TextStyle.ToStyle() + titleSubtextStyle := eo.Title.SubtextStyle.ToStyle() + legendTextStyle := eo.Legend.TextStyle.ToStyle() + o := ChartOption{ + Type: eo.Type, + FontFamily: fontFamily, + Theme: eo.Theme, + Title: TitleOption{ + Text: eo.Title.Text, + Subtext: eo.Title.Subtext, + FontColor: titleTextStyle.FontColor, + FontSize: titleTextStyle.FontSize, + SubtextFontSize: titleSubtextStyle.FontSize, + SubtextFontColor: titleSubtextStyle.FontColor, + Left: string(eo.Title.Left), + Top: string(eo.Title.Top), + }, + Legend: LegendOption{ + Show: eo.Legend.Show, + FontSize: legendTextStyle.FontSize, + FontColor: legendTextStyle.FontColor, + Data: eo.Legend.Data, + Left: string(eo.Legend.Left), + Top: string(eo.Legend.Top), + Align: eo.Legend.Align, + Orient: eo.Legend.Orient, + }, + RadarIndicators: eo.Radar.Indicator, + Width: eo.Width, + Height: eo.Height, + Padding: eo.Padding.Box, + Box: eo.Box, + SeriesList: eo.Series.ToSeriesList(), + } + if len(eo.XAxis.Data) != 0 { + xAxisData := eo.XAxis.Data[0] + o.XAxis = XAxisOption{ + BoundaryGap: xAxisData.BoundaryGap, + Data: xAxisData.Data, + SplitNumber: xAxisData.SplitNumber, + } + } + yAxisOptions := make([]YAxisOption, len(eo.YAxis.Data)) + for index, item := range eo.YAxis.Data { + yAxisOptions[index] = YAxisOption{ + Min: item.Min, + Max: item.Max, + Formatter: item.AxisLabel.Formatter, + Color: parseColor(item.AxisLine.LineStyle.Color), + } + } + o.YAxisOptions = yAxisOptions + + if len(eo.Children) != 0 { + o.Children = make([]ChartOption, len(eo.Children)) + for index, item := range eo.Children { + o.Children[index] = item.ToOption() + } + } + return o +} + +func renderEcharts(options, outputType string) ([]byte, error) { + o := EChartsOption{} + err := json.Unmarshal([]byte(options), &o) + if err != nil { + return nil, err + } + opt := o.ToOption() + opt.Type = outputType + d, err := Render(opt) + if err != nil { + return nil, err + } + return d.Bytes() +} + +func RenderEChartsToPNG(options string) ([]byte, error) { + return renderEcharts(options, "png") +} + +func RenderEChartsToSVG(options string) ([]byte, error) { + return renderEcharts(options, "svg") +} diff --git a/examples/charts/main.go b/examples/charts/main.go index c7986a4..3a625f7 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -83,13 +83,13 @@ func handler(w http.ResponseWriter, req *http.Request, chartOptions []charts.Cha } bytesList = append(bytesList, buf) } - // for _, opt := range echartsOptions { - // buf, err := charts.RenderEChartsToSVG(opt) - // if err != nil { - // panic(err) - // } - // bytesList = append(bytesList, buf) - // } + for _, opt := range echartsOptions { + buf, err := charts.RenderEChartsToSVG(opt) + if err != nil { + panic(err) + } + bytesList = append(bytesList, buf) + } data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), bytes.Join(bytesList, []byte(""))) w.Header().Set("Content-Type", "text/html") @@ -333,6 +333,7 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, }, }, + // 柱状图+标记 { Title: charts.TitleOption{ Text: "Rainfall vs Evaporation", @@ -413,6 +414,342 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, }, }, + // 双Y轴示例 + { + Title: charts.TitleOption{ + Text: "Temperature", + }, + XAxis: charts.NewXAxisOption([]string{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + }), + Legend: charts.NewLegendOption([]string{ + "Evaporation", + "Precipitation", + "Temperature", + }), + YAxisOptions: []charts.YAxisOption{ + { + Formatter: "{value}ml", + Color: charts.Color{ + R: 84, + G: 112, + B: 198, + A: 255, + }, + }, + { + Formatter: "{value}°C", + Color: charts.Color{ + R: 250, + G: 200, + B: 88, + A: 255, + }, + }, + }, + SeriesList: []charts.Series{ + { + Type: charts.ChartTypeBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20.0, + 6.4, + 3.3, + }), + }, + { + Type: charts.ChartTypeBar, + Data: charts.NewSeriesDataFromValues([]float64{ + 2.6, + 5.9, + 9.0, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6.0, + 2.3, + }), + }, + { + Data: charts.NewSeriesDataFromValues([]float64{ + 2.0, + 2.2, + 3.3, + 4.5, + 6.3, + 10.2, + 20.3, + 23.4, + 23.0, + 16.5, + 12.0, + 6.2, + }), + AxisIndex: 1, + }, + }, + }, + // 饼图 + { + Title: charts.TitleOption{ + Text: "Referer of a Website", + Subtext: "Fake Data", + Left: charts.PositionCenter, + }, + Legend: charts.LegendOption{ + Orient: charts.OrientVertical, + Data: []string{ + "Search Engine", + "Direct", + "Email", + "Union Ads", + "Video Ads", + }, + Left: charts.PositionLeft, + }, + SeriesList: charts.NewPieSeriesList([]float64{ + 1048, + 735, + 580, + 484, + 300, + }, charts.PieSeriesOption{ + Label: charts.SeriesLabel{ + Show: true, + }, + Radius: "35%", + }), + }, + // 雷达图 + { + Title: charts.TitleOption{ + Text: "Basic Radar Chart", + }, + Legend: charts.NewLegendOption([]string{ + "Allocated Budget", + "Actual Spending", + }), + RadarIndicators: []charts.RadarIndicator{ + { + Name: "Sales", + Max: 6500, + }, + { + Name: "Administration", + Max: 16000, + }, + { + Name: "Information Technology", + Max: 30000, + }, + { + Name: "Customer Support", + Max: 38000, + }, + { + Name: "Development", + Max: 52000, + }, + { + Name: "Marketing", + Max: 25000, + }, + }, + SeriesList: charts.SeriesList{ + { + Type: charts.ChartTypeRadar, + Data: charts.NewSeriesDataFromValues([]float64{ + 4200, + 3000, + 20000, + 35000, + 50000, + 18000, + }), + }, + { + Type: charts.ChartTypeRadar, + Data: charts.NewSeriesDataFromValues([]float64{ + 5000, + 14000, + 28000, + 26000, + 42000, + 21000, + }), + }, + }, + }, + // 漏斗图 + { + Title: charts.TitleOption{ + Text: "Funnel", + }, + Legend: charts.NewLegendOption([]string{ + "Show", + "Click", + "Visit", + "Inquiry", + "Order", + }), + SeriesList: []charts.Series{ + { + Type: charts.ChartTypeFunnel, + Name: "Show", + Data: charts.NewSeriesDataFromValues([]float64{ + 100, + }), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Click", + Data: charts.NewSeriesDataFromValues([]float64{ + 80, + }), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Visit", + Data: charts.NewSeriesDataFromValues([]float64{ + 60, + }), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Inquiry", + Data: charts.NewSeriesDataFromValues([]float64{ + 40, + }), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Order", + Data: charts.NewSeriesDataFromValues([]float64{ + 20, + }), + }, + }, + }, + // 多图展示 + { + Legend: charts.LegendOption{ + Top: "-90", + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Padding: charts.Box{ + Top: 100, + Right: 10, + Bottom: 10, + Left: 10, + }, + XAxis: charts.NewXAxisOption([]string{ + "2012", + "2013", + "2014", + "2015", + "2016", + "2017", + }), + YAxisOptions: []charts.YAxisOption{ + { + + Min: charts.NewFloatPoint(0), + Max: charts.NewFloatPoint(90), + }, + }, + SeriesList: []charts.Series{ + charts.NewSeriesFromValues([]float64{ + 56.5, + 82.1, + 88.7, + 70.1, + 53.4, + 85.1, + }), + charts.NewSeriesFromValues([]float64{ + 51.1, + 51.4, + 55.1, + 53.3, + 73.8, + 68.7, + }), + charts.NewSeriesFromValues([]float64{ + 40.1, + 62.2, + 69.5, + 36.4, + 45.2, + 32.5, + }, charts.ChartTypeBar), + charts.NewSeriesFromValues([]float64{ + 25.2, + 37.1, + 41.2, + 18, + 33.9, + 49.1, + }, charts.ChartTypeBar), + }, + Children: []charts.ChartOption{ + { + Legend: charts.LegendOption{ + Show: charts.FalseFlag(), + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Box: charts.Box{ + Top: 20, + Left: 400, + Right: 500, + Bottom: 120, + }, + SeriesList: charts.NewPieSeriesList([]float64{ + 435.9, + 354.3, + 285.9, + 204.5, + }, charts.PieSeriesOption{ + Label: charts.SeriesLabel{ + Show: true, + }, + Radius: "35%", + }), + }, + }, + }, } handler(w, req, chartOptions, nil) } @@ -879,12 +1216,7 @@ func echartsHandler(w http.ResponseWriter, req *http.Request) { 23.2, 25.6, 76.7, - 135.6, - 162.2, - 32.6, - 20, - 6.4, - 3.3 + 135.6 ] }, { @@ -898,12 +1230,7 @@ func echartsHandler(w http.ResponseWriter, req *http.Request) { 26.4, 28.7, 70.7, - 175.6, - 182.2, - 48.7, - 18.8, - 6, - 2.3 + 175.6 ] }, { @@ -918,12 +1245,7 @@ func echartsHandler(w http.ResponseWriter, req *http.Request) { 4.5, 6.3, 10.2, - 20.3, - 23.4, - 23, - 16.5, - 12, - 6.2 + 20.3 ] } ] diff --git a/examples/funnel_chart/main.go b/examples/funnel_chart/main.go new file mode 100644 index 0000000..eb753fd --- /dev/null +++ b/examples/funnel_chart/main.go @@ -0,0 +1,97 @@ +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + + "github.com/vicanso/go-charts" +) + +func writeFile(buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file := filepath.Join(tmpPath, "funnel-chart.png") + err = ioutil.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func main() { + p, err := charts.NewPainter(charts.PainterOptions{ + Width: 800, + Height: 600, + Type: charts.ChartOutputPNG, + }) + if err != nil { + panic(err) + } + _, err = charts.NewFunnelChart(p, charts.FunnelChartOption{ + Title: charts.TitleOption{ + Text: "Funnel", + }, + Legend: charts.NewLegendOption([]string{ + "Show", + "Click", + "Visit", + "Inquiry", + "Order", + }), + SeriesList: []charts.Series{ + + { + Type: charts.ChartTypeFunnel, + Name: "Show", + Data: charts.NewSeriesDataFromValues([]float64{ + 100, + }), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Click", + Data: charts.NewSeriesDataFromValues([]float64{ + 80, + }), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Visit", + Data: charts.NewSeriesDataFromValues([]float64{ + 60, + }), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Inquiry", + Data: charts.NewSeriesDataFromValues([]float64{ + 40, + }), + }, + { + Type: charts.ChartTypeFunnel, + Name: "Order", + Data: charts.NewSeriesDataFromValues([]float64{ + 20, + }), + }, + }, + }).Render() + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + err = writeFile(buf) + if err != nil { + panic(err) + } +} diff --git a/examples/pie_chart/main.go b/examples/pie_chart/main.go new file mode 100644 index 0000000..e69bf60 --- /dev/null +++ b/examples/pie_chart/main.go @@ -0,0 +1,83 @@ +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + + "github.com/vicanso/go-charts" +) + +func writeFile(buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file := filepath.Join(tmpPath, "pie-chart.png") + err = ioutil.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func main() { + p, err := charts.NewPainter(charts.PainterOptions{ + Width: 800, + Height: 600, + Type: charts.ChartOutputPNG, + }) + if err != nil { + panic(err) + } + _, err = charts.NewPieChart(p, charts.PieChartOption{ + Title: charts.TitleOption{ + Text: "Rainfall vs Evaporation", + Subtext: "Fake Data", + Left: charts.PositionCenter, + }, + Padding: charts.Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }, + Legend: charts.LegendOption{ + Orient: charts.OrientVertical, + Data: []string{ + "Search Engine", + "Direct", + "Email", + "Union Ads", + "Video Ads", + }, + Left: charts.PositionLeft, + }, + SeriesList: charts.NewPieSeriesList([]float64{ + 1048, + 735, + 580, + 484, + 300, + }, charts.PieSeriesOption{ + Label: charts.SeriesLabel{ + Show: true, + }, + Radius: "35%", + }), + }).Render() + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + err = writeFile(buf) + if err != nil { + panic(err) + } +} diff --git a/examples/radar_chart/main.go b/examples/radar_chart/main.go new file mode 100644 index 0000000..077fa48 --- /dev/null +++ b/examples/radar_chart/main.go @@ -0,0 +1,112 @@ +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + + "github.com/vicanso/go-charts" +) + +func writeFile(buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file := filepath.Join(tmpPath, "radar-chart.png") + err = ioutil.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func main() { + p, err := charts.NewPainter(charts.PainterOptions{ + Width: 800, + Height: 600, + Type: charts.ChartOutputPNG, + }) + if err != nil { + panic(err) + } + _, err = charts.NewRadarChart(p, charts.RadarChartOption{ + Padding: charts.Box{ + Left: 10, + Top: 10, + Right: 10, + Bottom: 10, + }, + Title: charts.TitleOption{ + Text: "Basic Radar Chart", + }, + Legend: charts.NewLegendOption([]string{ + "Allocated Budget", + "Actual Spending", + }), + RadarIndicators: []charts.RadarIndicator{ + { + Name: "Sales", + Max: 6500, + }, + { + Name: "Administration", + Max: 16000, + }, + { + Name: "Information Technology", + Max: 30000, + }, + { + Name: "Customer Support", + Max: 38000, + }, + { + Name: "Development", + Max: 52000, + }, + { + Name: "Marketing", + Max: 25000, + }, + }, + SeriesList: charts.SeriesList{ + { + Type: charts.ChartTypeRadar, + Data: charts.NewSeriesDataFromValues([]float64{ + 4200, + 3000, + 20000, + 35000, + 50000, + 18000, + }), + }, + { + Type: charts.ChartTypeRadar, + Data: charts.NewSeriesDataFromValues([]float64{ + 5000, + 14000, + 28000, + 26000, + 42000, + 21000, + }), + }, + }, + }).Render() + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + err = writeFile(buf) + if err != nil { + panic(err) + } +} diff --git a/funnel_chart.go b/funnel_chart.go new file mode 100644 index 0000000..c8457dd --- /dev/null +++ b/funnel_chart.go @@ -0,0 +1,172 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "fmt" + + "github.com/dustin/go-humanize" + "github.com/golang/freetype/truetype" +) + +type funnelChart struct { + p *Painter + opt *FunnelChartOption +} + +func NewFunnelChart(p *Painter, opt FunnelChartOption) *funnelChart { + if opt.Theme == nil { + opt.Theme = NewTheme("") + } + return &funnelChart{ + p: p, + opt: &opt, + } +} + +type FunnelChartOption struct { + Theme ColorPalette + // The font size + Font *truetype.Font + // The data series list + SeriesList SeriesList + // The padding of line chart + Padding Box + // The option of title + Title TitleOption + // The legend option + Legend LegendOption +} + +func (f *funnelChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { + opt := f.opt + seriesPainter := result.seriesPainter + max := seriesList[0].Data[0].Value + min := float64(0) + for _, item := range seriesList { + if item.Max != nil { + max = *item.Max + } + if item.Min != nil { + min = *item.Min + } + } + theme := opt.Theme + gap := 2 + height := seriesPainter.Height() + width := seriesPainter.Width() + count := len(seriesList) + + h := (height - gap*(count-1)) / count + + y := 0 + widthList := make([]int, len(seriesList)) + textList := make([]string, len(seriesList)) + for index, item := range seriesList { + value := item.Data[0].Value + widthPercent := (value - min) / (max - min) + w := int(widthPercent * float64(width)) + widthList[index] = w + p := humanize.CommafWithDigits(value/max*100, 2) + "%" + textList[index] = fmt.Sprintf("%s(%s)", item.Name, p) + } + + for index, w := range widthList { + series := seriesList[index] + nextWidth := 0 + if index+1 < len(widthList) { + nextWidth = widthList[index+1] + } + topStartX := (width - w) >> 1 + topEndX := topStartX + w + bottomStartX := (width - nextWidth) >> 1 + bottomEndX := bottomStartX + nextWidth + points := []Point{ + { + X: topStartX, + Y: y, + }, + { + X: topEndX, + Y: y, + }, + { + X: bottomEndX, + Y: y + h, + }, + { + X: bottomStartX, + Y: y + h, + }, + { + X: topStartX, + Y: y, + }, + } + color := theme.GetSeriesColor(series.index) + + seriesPainter.OverrideDrawingStyle(Style{ + FillColor: color, + }).FillArea(points) + + // 文本 + text := textList[index] + seriesPainter.OverrideTextStyle(Style{ + FontColor: theme.GetTextColor(), + FontSize: labelFontSize, + Font: opt.Font, + }) + textBox := seriesPainter.MeasureText(text) + textX := width>>1 - textBox.Width()>>1 + textY := y + h>>1 + seriesPainter.Text(text, textX, textY) + y += (h + gap) + } + + return f.p.box, nil +} + +func (f *funnelChart) Render() (Box, error) { + p := f.p + opt := f.opt + renderResult, err := defaultRender(p, defaultRenderOption{ + Theme: opt.Theme, + Padding: opt.Padding, + SeriesList: opt.SeriesList, + XAxis: XAxisOption{ + Show: FalseFlag(), + }, + YAxisOptions: []YAxisOption{ + { + Show: FalseFlag(), + }, + }, + TitleOption: opt.Title, + LegendOption: opt.Legend, + }) + if err != nil { + return BoxZero, err + } + seriesList := opt.SeriesList.Filter(ChartTypeFunnel) + return f.render(renderResult, seriesList) +} diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index 87ca9ae..c98d688 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -92,13 +92,9 @@ func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList Seri Size: seriesPainter.Width(), }) - for i := range seriesList { - series := seriesList[i] - index := series.index - if index == 0 { - index = i - } - seriesColor := theme.GetSeriesColor(index) + for index := range seriesList { + series := seriesList[index] + seriesColor := theme.GetSeriesColor(series.index) divideValues := yRange.AutoDivide() for j, item := range series.Data { if j >= yRange.divideCount { @@ -108,8 +104,8 @@ func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList Seri j = yRange.divideCount - j - 1 y := divideValues[j] y += margin - if i != 0 { - y += i * (barHeight + barMargin) + if index != 0 { + y += index * (barHeight + barMargin) } w := int(xRange.getHeight(item.Value)) diff --git a/legend.go b/legend.go index 65793c9..cf8d417 100644 --- a/legend.go +++ b/legend.go @@ -56,6 +56,8 @@ type LegendOption struct { FontSize float64 // FontColor color of legend text FontColor Color + // The flag for show legend, set this to *false will hide legend + Show *bool } func NewLegendOption(labels []string, left ...string) LegendOption { @@ -68,6 +70,17 @@ func NewLegendOption(labels []string, left ...string) LegendOption { return opt } +func (opt *LegendOption) IsEmpty() bool { + isEmpty := true + for _, v := range opt.Data { + if v != "" { + isEmpty = false + break + } + } + return isEmpty +} + func NewLegendPainter(p *Painter, opt LegendOption) *legendPainter { return &legendPainter{ p: p, @@ -78,6 +91,10 @@ func NewLegendPainter(p *Painter, opt LegendOption) *legendPainter { func (l *legendPainter) Render() (Box, error) { opt := l.opt theme := opt.Theme + if opt.IsEmpty() || + (opt.Show != nil && !*opt.Show) { + return BoxZero, nil + } if theme == nil { theme = l.p.theme } @@ -90,7 +107,9 @@ func (l *legendPainter) Render() (Box, error) { if opt.Left == "" { opt.Left = PositionCenter } - p := l.p + p := l.p.Child(PainterPaddingOption(Box{ + Top: 5, + })) p.SetTextStyle(Style{ FontSize: opt.FontSize, FontColor: opt.FontColor, diff --git a/line_chart.go b/line_chart.go index 47a497f..c505a91 100644 --- a/line_chart.go +++ b/line_chart.go @@ -93,7 +93,7 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( } for index := range seriesList { series := seriesList[index] - seriesColor := opt.Theme.GetSeriesColor(index) + seriesColor := opt.Theme.GetSeriesColor(series.index) drawingStyle := Style{ StrokeColor: seriesColor, StrokeWidth: defaultStrokeWidth, diff --git a/painter.go b/painter.go index fff6ca7..5a8dd89 100644 --- a/painter.go +++ b/painter.go @@ -628,6 +628,9 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { values = autoDivide(width, count) } for index, text := range opt.TextList { + if index%opt.Unit != 0 { + continue + } box := p.MeasureText(text) start := values[index] if positionCenter { diff --git a/pie_chart.go b/pie_chart.go new file mode 100644 index 0000000..c5a2ff2 --- /dev/null +++ b/pie_chart.go @@ -0,0 +1,211 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "errors" + "math" + + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" +) + +type pieChart struct { + p *Painter + opt *PieChartOption +} + +type PieChartOption struct { + Theme ColorPalette + // The font size + Font *truetype.Font + // The data series list + SeriesList SeriesList + // The padding of line chart + Padding Box + // The option of title + Title TitleOption + // The legend option + Legend LegendOption + // background is filled + backgroundIsFilled bool +} + +func NewPieChart(p *Painter, opt PieChartOption) *pieChart { + if opt.Theme == nil { + opt.Theme = NewTheme("") + } + return &pieChart{ + p: p, + opt: &opt, + } +} + +func (p *pieChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { + opt := p.opt + values := make([]float64, len(seriesList)) + total := float64(0) + radiusValue := "" + for index, series := range seriesList { + if len(series.Radius) != 0 { + radiusValue = series.Radius + } + value := float64(0) + for _, item := range series.Data { + value += item.Value + } + values[index] = value + total += value + } + if total <= 0 { + return BoxZero, errors.New("The sum value of pie chart should gt 0") + } + seriesPainter := result.seriesPainter + cx := seriesPainter.Width() >> 1 + cy := seriesPainter.Height() >> 1 + + diameter := chart.MinInt(seriesPainter.Width(), seriesPainter.Height()) + radius := getRadius(float64(diameter), radiusValue) + + labelLineWidth := 15 + if radius < 50 { + labelLineWidth = 10 + } + labelRadius := radius + float64(labelLineWidth) + seriesNames := opt.Legend.Data + if len(seriesNames) == 0 { + seriesNames = seriesList.Names() + } + theme := opt.Theme + if len(values) == 1 { + seriesPainter.OverrideDrawingStyle(Style{ + StrokeWidth: 1, + StrokeColor: theme.GetSeriesColor(0), + FillColor: theme.GetSeriesColor(0), + }) + seriesPainter.MoveTo(cx, cy). + Circle(radius, cx, cy) + } else { + currentValue := float64(0) + prevEndX := 0 + prevEndY := 0 + for index, v := range values { + seriesPainter.OverrideDrawingStyle(Style{ + StrokeWidth: 1, + StrokeColor: theme.GetSeriesColor(index), + FillColor: theme.GetSeriesColor(index), + }) + seriesPainter.MoveTo(cx, cy) + start := chart.PercentToRadians(currentValue/total) - math.Pi/2 + currentValue += v + percent := (v / total) + delta := chart.PercentToRadians(percent) + seriesPainter.ArcTo(cx, cy, radius, radius, start, delta). + LineTo(cx, cy). + Close(). + FillStroke() + + series := seriesList[index] + // 是否显示label + showLabel := series.Label.Show + if !showLabel { + continue + } + + // label的角度为饼块中间 + angle := start + delta/2 + startx := cx + int(radius*math.Cos(angle)) + starty := cy + int(radius*math.Sin(angle)) + + endx := cx + int(labelRadius*math.Cos(angle)) + endy := cy + int(labelRadius*math.Sin(angle)) + // 计算是否有重叠,如果有则调整y坐标位置 + if index != 0 && + math.Abs(float64(endx-prevEndX)) < labelFontSize && + math.Abs(float64(endy-prevEndY)) < labelFontSize { + endy -= (labelFontSize << 1) + } + prevEndX = endx + prevEndY = endy + + seriesPainter.MoveTo(startx, starty) + seriesPainter.LineTo(endx, endy) + offset := labelLineWidth + if endx < cx { + offset *= -1 + } + seriesPainter.MoveTo(endx, endy) + endx += offset + seriesPainter.LineTo(endx, endy) + seriesPainter.Stroke() + + textStyle := Style{ + FontColor: theme.GetTextColor(), + FontSize: labelFontSize, + Font: opt.Font, + } + if !series.Label.Color.IsZero() { + textStyle.FontColor = series.Label.Color + } + seriesPainter.OverrideTextStyle(textStyle) + text := NewPieLabelFormatter(seriesNames, series.Label.Formatter)(index, v, percent) + textBox := seriesPainter.MeasureText(text) + textMargin := 3 + x := endx + textMargin + y := endy + textBox.Height()>>1 - 1 + if offset < 0 { + textWidth := textBox.Width() + x = endx - textWidth - textMargin + } + seriesPainter.Text(text, x, y) + } + } + + return p.p.box, nil +} + +func (p *pieChart) Render() (Box, error) { + opt := p.opt + + renderResult, err := defaultRender(p.p, defaultRenderOption{ + Theme: opt.Theme, + Padding: opt.Padding, + SeriesList: opt.SeriesList, + XAxis: XAxisOption{ + Show: FalseFlag(), + }, + YAxisOptions: []YAxisOption{ + { + Show: FalseFlag(), + }, + }, + TitleOption: opt.Title, + LegendOption: opt.Legend, + backgroundIsFilled: opt.backgroundIsFilled, + }) + if err != nil { + return BoxZero, err + } + seriesList := opt.SeriesList.Filter(ChartTypePie) + return p.render(renderResult, seriesList) +} diff --git a/radar_chart.go b/radar_chart.go new file mode 100644 index 0000000..dc93ca8 --- /dev/null +++ b/radar_chart.go @@ -0,0 +1,245 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "errors" + + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +type radarChart struct { + p *Painter + opt *RadarChartOption +} + +type RadarIndicator struct { + // Indicator's name + Name string + // The maximum value of indicator + Max float64 + // The minimum value of indicator + Min float64 +} + +type RadarChartOption struct { + Theme ColorPalette + // The font size + Font *truetype.Font + // The data series list + SeriesList SeriesList + // The padding of line chart + Padding Box + // The option of title + Title TitleOption + // The legend option + Legend LegendOption + // The radar indicator list + RadarIndicators []RadarIndicator + // background is filled + backgroundIsFilled bool +} + +func NewRadarChart(p *Painter, opt RadarChartOption) *radarChart { + if opt.Theme == nil { + opt.Theme = NewTheme("") + } + return &radarChart{ + p: p, + opt: &opt, + } +} + +func (r *radarChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { + opt := r.opt + indicators := opt.RadarIndicators + sides := len(indicators) + if sides < 3 { + return BoxZero, errors.New("The count of indicator should be >= 3") + } + maxValues := make([]float64, len(indicators)) + for _, series := range seriesList { + for index, item := range series.Data { + if index < len(maxValues) && item.Value > maxValues[index] { + maxValues[index] = item.Value + } + } + } + for index, indicator := range indicators { + if indicator.Max <= 0 { + indicators[index].Max = maxValues[index] + } + } + + radiusValue := "" + for _, series := range seriesList { + if len(series.Radius) != 0 { + radiusValue = series.Radius + } + } + + seriesPainter := result.seriesPainter + theme := opt.Theme + + cx := seriesPainter.Width() >> 1 + cy := seriesPainter.Height() >> 1 + diameter := chart.MinInt(seriesPainter.Width(), seriesPainter.Height()) + radius := getRadius(float64(diameter), radiusValue) + + divideCount := 5 + divideRadius := float64(int(radius / float64(divideCount))) + radius = divideRadius * float64(divideCount) + + seriesPainter.OverrideDrawingStyle(Style{ + StrokeColor: theme.GetAxisSplitLineColor(), + StrokeWidth: 1, + }) + center := Point{ + X: cx, + Y: cy, + } + for i := 0; i < divideCount; i++ { + seriesPainter.Polygon(center, divideRadius*float64(i+1), sides) + } + points := getPolygonPoints(center, radius, sides) + for _, p := range points { + seriesPainter.MoveTo(center.X, center.Y) + seriesPainter.LineTo(p.X, p.Y) + seriesPainter.Stroke() + } + seriesPainter.OverrideTextStyle(Style{ + FontColor: theme.GetTextColor(), + FontSize: labelFontSize, + Font: opt.Font, + }) + offset := 5 + // 文本生成 + for index, p := range points { + name := indicators[index].Name + b := seriesPainter.MeasureText(name) + isXCenter := p.X == center.X + isYCenter := p.Y == center.Y + isRight := p.X > center.X + isLeft := p.X < center.X + isTop := p.Y < center.Y + isBottom := p.Y > center.Y + x := p.X + y := p.Y + if isXCenter { + x -= b.Width() >> 1 + if isTop { + y -= b.Height() + } else { + y += b.Height() + } + } + if isYCenter { + y += b.Height() >> 1 + } + if isTop { + y += offset + } + if isBottom { + y += offset + } + if isRight { + x += offset + } + if isLeft { + x -= (b.Width() + offset) + } + seriesPainter.Text(name, x, y) + } + + // 雷达图 + angles := getPolygonPointAngles(sides) + maxCount := len(indicators) + for _, series := range seriesList { + linePoints := make([]Point, 0, maxCount) + for j, item := range series.Data { + if j >= maxCount { + continue + } + indicator := indicators[j] + percent := (item.Value - indicator.Min) / (indicator.Max - indicator.Min) + r := percent * radius + p := getPolygonPoint(center, r, angles[j]) + linePoints = append(linePoints, p) + } + color := theme.GetSeriesColor(series.index) + dotFillColor := drawing.ColorWhite + if theme.IsDark() { + dotFillColor = color + } + linePoints = append(linePoints, linePoints[0]) + seriesPainter.OverrideDrawingStyle(Style{ + StrokeColor: color, + StrokeWidth: defaultStrokeWidth, + DotWidth: defaultDotWidth, + DotColor: color, + FillColor: color.WithAlpha(20), + }) + seriesPainter.LineStroke(linePoints). + FillArea(linePoints) + dotWith := 2.0 + seriesPainter.OverrideDrawingStyle(Style{ + StrokeWidth: defaultStrokeWidth, + StrokeColor: color, + FillColor: dotFillColor, + }) + for _, point := range linePoints { + seriesPainter.Circle(dotWith, point.X, point.Y) + seriesPainter.FillStroke() + } + } + + return r.p.box, nil +} + +func (r *radarChart) Render() (Box, error) { + p := r.p + opt := r.opt + renderResult, err := defaultRender(p, defaultRenderOption{ + Theme: opt.Theme, + Padding: opt.Padding, + SeriesList: opt.SeriesList, + XAxis: XAxisOption{ + Show: FalseFlag(), + }, + YAxisOptions: []YAxisOption{ + { + Show: FalseFlag(), + }, + }, + TitleOption: opt.Title, + LegendOption: opt.Legend, + backgroundIsFilled: opt.backgroundIsFilled, + }) + if err != nil { + return BoxZero, err + } + seriesList := opt.SeriesList.Filter(ChartTypeRadar) + return r.render(renderResult, seriesList) +} diff --git a/xaxis.go b/xaxis.go index f06d71f..bfb57cb 100644 --- a/xaxis.go +++ b/xaxis.go @@ -38,8 +38,8 @@ type XAxisOption struct { Theme ColorPalette // The font size of x axis label FontSize float64 - // Hidden x axis - Hidden bool + // The flag for show axis, set this to *false will hide axis + Show *bool // Number of segments that the axis is split into. Note that this number serves only as a recommendation. SplitNumber int // The position of axis, it can be 'top' or 'bottom' @@ -78,6 +78,7 @@ func (opt *XAxisOption) ToAxisOption() AxisOption { FontSize: opt.FontSize, Font: opt.Font, FontColor: opt.FontColor, + Show: opt.Show, SplitLineColor: opt.Theme.GetAxisSplitLineColor(), } if opt.isValueAxis { diff --git a/yaxis.go b/yaxis.go index 609924f..265ac59 100644 --- a/yaxis.go +++ b/yaxis.go @@ -25,6 +25,10 @@ package charts import "github.com/golang/freetype/truetype" type YAxisOption struct { + // The minimun value of axis. + Min *float64 + // The maximum value of axis. + Max *float64 // The font of y axis Font *truetype.Font // The data value of x axis @@ -36,7 +40,13 @@ type YAxisOption struct { // The position of axis, it can be 'left' or 'right' Position string // The color of label - FontColor Color + FontColor Color + // Formatter for y axis text value + Formatter string + // Color for y axis + Color Color + // The flag for show axis, set this to *false will hide axis + Show *bool isCategoryAxis bool } @@ -60,6 +70,7 @@ func (opt *YAxisOption) ToAxisOption() AxisOption { position = PositionRight } axisOpt := AxisOption{ + Formatter: opt.Formatter, Theme: opt.Theme, Data: opt.Data, Position: position, @@ -70,6 +81,11 @@ func (opt *YAxisOption) ToAxisOption() AxisOption { BoundaryGap: FalseFlag(), SplitLineShow: true, SplitLineColor: opt.Theme.GetAxisSplitLineColor(), + Show: opt.Show, + } + if !opt.Color.IsZero() { + axisOpt.FontColor = opt.Color + axisOpt.StrokeColor = opt.Color } if opt.isCategoryAxis { axisOpt.BoundaryGap = TrueFlag() @@ -85,3 +101,13 @@ func NewLeftYAxis(p *Painter, opt YAxisOption) *axisPainter { })) return NewAxisPainter(p, opt.ToAxisOption()) } + +func NewRightYAxis(p *Painter, opt YAxisOption) *axisPainter { + p = p.Child(PainterPaddingOption(Box{ + Bottom: defaultXAxisHeight, + })) + axisOpt := opt.ToAxisOption() + axisOpt.Position = PositionRight + axisOpt.SplitLineShow = false + return NewAxisPainter(p, axisOpt) +} From 38c4978e44d8f92906d192041637d7ecad7c89d3 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 17 Jun 2022 23:37:21 +0800 Subject: [PATCH 145/251] refactor: enhance chart render function --- README.md | 32 ++-- bar_chart.go | 2 +- chart_option.go | 238 +++++++++++++++++++++++++- charts.go | 11 +- echarts.go | 18 ++ examples/bar_chart/main.go | 116 +++++-------- examples/charts/main.go | 59 +++++++ examples/funnel_chart/main.go | 62 ++----- examples/horizontal_bar_chart/main.go | 65 +++---- examples/line_chart/main.go | 135 +++++++-------- examples/pie_chart/main.go | 41 ++--- examples/radar_chart/main.go | 106 ++++-------- funnel_chart.go | 2 +- horizontal_bar_chart.go | 2 +- line_chart.go | 2 +- painter.go | 6 +- pie_chart.go | 2 +- radar_chart.go | 2 +- series.go | 8 + theme.go | 218 ++++++++++++----------- 20 files changed, 665 insertions(+), 462 deletions(-) diff --git a/README.md b/README.md index 22d3205..7affa30 100644 --- a/README.md +++ b/README.md @@ -49,25 +49,21 @@ func writeFile(file string, buf []byte) error { } func chartsRender() ([]byte, error) { - d, err := charts.LineRender([][]float64{ + values := [][]float64{ { - 150, + 120, + 132, + 101, + 134, + 90, 230, - 224, - 218, - 135, - 147, - 260, + 210, }, - }, - // output type - charts.PNGTypeOption(), - // title - charts.TitleOptionFunc(charts.TitleOption{ - Text: "Line", - }), - // x axis - charts.XAxisOptionFunc(charts.NewXAxisOption([]string{ + } + p, err := charts.LineRender( + values, + charts.TitleTextOptionFunc("Line"), + charts.XAxisDataOptionFunc([]string{ "Mon", "Tue", "Wed", @@ -75,12 +71,12 @@ func chartsRender() ([]byte, error) { "Fri", "Sat", "Sun", - })), + }), ) if err != nil { return nil, err } - return d.Bytes() + return p.Bytes() } func echartsRender() ([]byte, error) { diff --git a/bar_chart.go b/bar_chart.go index 8330542..2982829 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -34,7 +34,7 @@ type barChart struct { func NewBarChart(p *Painter, opt BarChartOption) *barChart { if opt.Theme == nil { - opt.Theme = NewTheme("") + opt.Theme = defaultTheme } return &barChart{ p: p, diff --git a/chart_option.go b/chart_option.go index 0cea754..0bc0a34 100644 --- a/chart_option.go +++ b/chart_option.go @@ -66,6 +66,182 @@ type ChartOption struct { Children []ChartOption } +// OptionFunc option function +type OptionFunc func(opt *ChartOption) + +// PNGTypeOption set png type of chart's output +func PNGTypeOption() OptionFunc { + return TypeOptionFunc(ChartOutputPNG) +} + +// TypeOptionFunc set type of chart's output +func TypeOptionFunc(t string) OptionFunc { + return func(opt *ChartOption) { + opt.Type = t + } +} + +// FontFamilyOptionFunc set font family of chart +func FontFamilyOptionFunc(fontFamily string) OptionFunc { + return func(opt *ChartOption) { + opt.FontFamily = fontFamily + } +} + +// ThemeOptionFunc set them of chart +func ThemeOptionFunc(theme string) OptionFunc { + return func(opt *ChartOption) { + opt.Theme = theme + } +} + +// TitleOptionFunc set title of chart +func TitleOptionFunc(title TitleOption) OptionFunc { + return func(opt *ChartOption) { + opt.Title = title + } +} + +// TitleTextOptionFunc set title text of chart +func TitleTextOptionFunc(text string) OptionFunc { + return func(opt *ChartOption) { + opt.Title.Text = text + } +} + +// LegendOptionFunc set legend of chart +func LegendOptionFunc(legend LegendOption) OptionFunc { + return func(opt *ChartOption) { + opt.Legend = legend + } +} + +// LegendLabelsOptionFunc set legend labels of chart +func LegendLabelsOptionFunc(labels []string, left ...string) OptionFunc { + return func(opt *ChartOption) { + opt.Legend = NewLegendOption(labels, left...) + } +} + +// XAxisOptionFunc set x axis of chart +func XAxisOptionFunc(xAxisOption XAxisOption) OptionFunc { + return func(opt *ChartOption) { + opt.XAxis = xAxisOption + } +} + +// XAxisDataOptionFunc set x axis data of chart +func XAxisDataOptionFunc(data []string, boundaryGap ...*bool) OptionFunc { + return func(opt *ChartOption) { + opt.XAxis = NewXAxisOption(data, boundaryGap...) + } +} + +// YAxisOptionFunc set y axis of chart, support two y axis +func YAxisOptionFunc(yAxisOption ...YAxisOption) OptionFunc { + return func(opt *ChartOption) { + opt.YAxisOptions = yAxisOption + } +} + +// YAxisDataOptionFunc set y axis data of chart +func YAxisDataOptionFunc(data []string) OptionFunc { + return func(opt *ChartOption) { + opt.YAxisOptions = NewYAxisOptions(data) + } +} + +// WidthOptionFunc set width of chart +func WidthOptionFunc(width int) OptionFunc { + return func(opt *ChartOption) { + opt.Width = width + } +} + +// HeightOptionFunc set height of chart +func HeightOptionFunc(height int) OptionFunc { + return func(opt *ChartOption) { + opt.Height = height + } +} + +// PaddingOptionFunc set padding of chart +func PaddingOptionFunc(padding Box) OptionFunc { + return func(opt *ChartOption) { + opt.Padding = padding + } +} + +// BoxOptionFunc set box of chart +func BoxOptionFunc(box Box) OptionFunc { + return func(opt *ChartOption) { + opt.Box = box + } +} + +// PieSeriesShowLabel set pie series show label +func PieSeriesShowLabel() OptionFunc { + return func(opt *ChartOption) { + for index := range opt.SeriesList { + opt.SeriesList[index].Label.Show = true + } + } +} + +// ChildOptionFunc add child chart +func ChildOptionFunc(child ...ChartOption) OptionFunc { + return func(opt *ChartOption) { + if opt.Children == nil { + opt.Children = make([]ChartOption, 0) + } + opt.Children = append(opt.Children, child...) + } +} + +// RadarIndicatorOptionFunc set radar indicator of chart +func RadarIndicatorOptionFunc(names []string, values []float64) OptionFunc { + return func(opt *ChartOption) { + if len(names) != len(values) { + return + } + indicators := make([]RadarIndicator, len(names)) + for index, name := range names { + indicators[index] = RadarIndicator{ + Name: name, + Max: values[index], + } + } + opt.RadarIndicators = indicators + } +} + +// BackgroundColorOptionFunc set background color of chart +func BackgroundColorOptionFunc(color Color) OptionFunc { + return func(opt *ChartOption) { + opt.BackgroundColor = color + } +} + +// MarkLineOptionFunc set mark line for series of chart +func MarkLineOptionFunc(seriesIndex int, markLineTypes ...string) OptionFunc { + return func(opt *ChartOption) { + if len(opt.SeriesList) <= seriesIndex { + return + } + opt.SeriesList[seriesIndex].MarkLine = NewMarkLine(markLineTypes...) + } +} + +// MarkPointOptionFunc set mark point for series of chart +func MarkPointOptionFunc(seriesIndex int, markPointTypes ...string) OptionFunc { + return func(opt *ChartOption) { + if len(opt.SeriesList) <= seriesIndex { + return + } + opt.SeriesList[seriesIndex].MarkPoint = NewMarkPoint(markPointTypes...) + } +} + func (o *ChartOption) fillDefault() { t := NewTheme(o.Theme) o.theme = t @@ -90,11 +266,11 @@ func (o *ChartOption) fillDefault() { o.BackgroundColor = t.GetBackgroundColor() } if o.Padding.IsZero() { - o.Padding = chart.Box{ - Top: 10, - Right: 10, - Bottom: 10, - Left: 10, + o.Padding = Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, } } // legend与series name的关联 @@ -118,3 +294,55 @@ func (o *ChartOption) fillDefault() { }) } } + +// LineRender line chart render +func LineRender(values [][]float64, opts ...OptionFunc) (*Painter, error) { + seriesList := NewSeriesListDataFromValues(values, ChartTypeLine) + return Render(ChartOption{ + SeriesList: seriesList, + }, opts...) +} + +// BarRender bar chart render +func BarRender(values [][]float64, opts ...OptionFunc) (*Painter, error) { + seriesList := NewSeriesListDataFromValues(values, ChartTypeBar) + return Render(ChartOption{ + SeriesList: seriesList, + }, opts...) +} + +// HorizontalBarRender horizontal bar chart render +func HorizontalBarRender(values [][]float64, opts ...OptionFunc) (*Painter, error) { + seriesList := NewSeriesListDataFromValues(values, ChartTypeHorizontalBar) + return Render(ChartOption{ + SeriesList: seriesList, + }, opts...) +} + +// PieRender pie chart render +func PieRender(values []float64, opts ...OptionFunc) (*Painter, error) { + return Render(ChartOption{ + SeriesList: NewPieSeriesList(values), + }, opts...) +} + +// RadarRender radar chart render +func RadarRender(values [][]float64, opts ...OptionFunc) (*Painter, error) { + seriesList := NewSeriesListDataFromValues(values, ChartTypeRadar) + return Render(ChartOption{ + SeriesList: seriesList, + }, opts...) +} + +// FunnelRender funnel chart render +func FunnelRender(values []float64, opts ...OptionFunc) (*Painter, error) { + seriesList := make(SeriesList, len(values)) + for index, value := range values { + seriesList[index] = NewSeriesFromValues([]float64{ + value, + }, ChartTypeFunnel) + } + return Render(ChartOption{ + SeriesList: seriesList, + }, opts...) +} diff --git a/charts.go b/charts.go index 51e247a..5759367 100644 --- a/charts.go +++ b/charts.go @@ -239,7 +239,10 @@ func doRender(renderers ...Renderer) error { return nil } -func Render(opt ChartOption) (*Painter, error) { +func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { + for _, fn := range opts { + fn(&opt) + } opt.fillDefault() isChild := true @@ -398,6 +401,12 @@ func Render(opt ChartOption) (*Painter, error) { } for _, item := range opt.Children { item.Parent = p + if item.Theme == "" { + item.Theme = opt.Theme + } + if item.FontFamily == "" { + item.FontFamily = opt.FontFamily + } _, err = Render(item) if err != nil { return nil, err diff --git a/echarts.go b/echarts.go index ac28436..d2602b3 100644 --- a/echarts.go +++ b/echarts.go @@ -130,6 +130,7 @@ type EChartsXAxisData struct { BoundaryGap *bool `json:"boundaryGap"` SplitNumber int `json:"splitNumber"` Data []string `json:"data"` + Type string `json:"type"` } type EChartsXAxis struct { Data []EChartsXAxisData @@ -155,6 +156,7 @@ type EChartsYAxisData struct { Color string `json:"color"` } `json:"lineStyle"` } `json:"axisLine"` + Data []string `json:"data"` } type EChartsYAxis struct { Data []EChartsYAxisData `json:"data"` @@ -453,6 +455,21 @@ func (eo *EChartsOption) ToOption() ChartOption { Box: eo.Box, SeriesList: eo.Series.ToSeriesList(), } + isHorizontalChart := false + for _, item := range eo.XAxis.Data { + if item.Type == "value" { + isHorizontalChart = true + } + } + if isHorizontalChart { + for index := range o.SeriesList { + series := o.SeriesList[index] + if series.Type == ChartTypeBar { + o.SeriesList[index].Type = ChartTypeHorizontalBar + } + } + } + if len(eo.XAxis.Data) != 0 { xAxisData := eo.XAxis.Data[0] o.XAxis = XAxisOption{ @@ -468,6 +485,7 @@ func (eo *EChartsOption) ToOption() ChartOption { Max: item.Max, Formatter: item.AxisLabel.Formatter, Color: parseColor(item.AxisLine.LineStyle.Color), + Data: item.Data, } } o.YAxisOptions = yAxisOptions diff --git a/examples/bar_chart/main.go b/examples/bar_chart/main.go index 5d5da2a..c9f1d58 100644 --- a/examples/bar_chart/main.go +++ b/examples/bar_chart/main.go @@ -24,26 +24,39 @@ func writeFile(buf []byte) error { } func main() { - p, err := charts.NewPainter(charts.PainterOptions{ - Width: 800, - Height: 600, - Type: charts.ChartOutputPNG, - }) - if err != nil { - panic(err) + values := [][]float64{ + { + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20.0, + 6.4, + 3.3, + }, + { + 2.6, + 5.9, + 9.0, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6.0, + 2.3, + }, } - _, err = charts.NewBarChart(p, charts.BarChartOption{ - Title: charts.TitleOption{ - Text: "Rainfall vs Evaporation", - Subtext: "Fake Data", - }, - Padding: charts.Box{ - Top: 20, - Right: 20, - Bottom: 20, - Left: 20, - }, - XAxis: charts.NewXAxisOption([]string{ + p, err := charts.BarRender( + values, + charts.XAxisDataOptionFunc([]string{ "Jan", "Feb", "Mar", @@ -57,61 +70,24 @@ func main() { "Nov", "Dec", }), - Legend: charts.NewLegendOption([]string{ + charts.LegendLabelsOptionFunc([]string{ "Rainfall", "Evaporation", }, charts.PositionRight), - SeriesList: []charts.Series{ - { - Type: charts.ChartTypeBar, - Data: charts.NewSeriesDataFromValues([]float64{ - 2.0, - 4.9, - 7.0, - 23.2, - 25.6, - 76.7, - 135.6, - 162.2, - 32.6, - 20.0, - 6.4, - 3.3, - }), - MarkPoint: charts.NewMarkPoint( - charts.SeriesMarkDataTypeMax, - charts.SeriesMarkDataTypeMin, - ), - MarkLine: charts.NewMarkLine( - charts.SeriesMarkDataTypeAverage, - ), - }, - { - Type: charts.ChartTypeBar, - Data: charts.NewSeriesDataFromValues([]float64{ - 2.6, - 5.9, - 9.0, - 26.4, - 28.7, - 70.7, - 175.6, - 182.2, - 48.7, - 18.8, - 6.0, - 2.3, - }), - MarkPoint: charts.NewMarkPoint( - charts.SeriesMarkDataTypeMax, - charts.SeriesMarkDataTypeMin, - ), - MarkLine: charts.NewMarkLine( - charts.SeriesMarkDataTypeAverage, - ), - }, + charts.MarkLineOptionFunc(0, charts.SeriesMarkDataTypeAverage), + charts.MarkPointOptionFunc(0, charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin), + // custom option func + func(opt *charts.ChartOption) { + opt.SeriesList[1].MarkPoint = charts.NewMarkPoint( + charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin, + ) + opt.SeriesList[1].MarkLine = charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ) }, - }).Render() + ) if err != nil { panic(err) } diff --git a/examples/charts/main.go b/examples/charts/main.go index 3a625f7..b370b69 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -73,6 +73,7 @@ func handler(w http.ResponseWriter, req *http.Request, chartOptions []charts.Cha bytesList := make([][]byte, 0) for _, opt := range chartOptions { opt.Theme = theme + opt.Type = charts.ChartOutputSVG d, err := charts.Render(opt) if err != nil { panic(err) @@ -1055,6 +1056,64 @@ func echartsHandler(w http.ResponseWriter, req *http.Request) { } ] }`, + `{ + "title": { + "text": "World Population" + }, + "tooltip": { + "trigger": "axis", + "axisPointer": { + "type": "shadow" + } + }, + "legend": {}, + "grid": { + "left": "3%", + "right": "4%", + "bottom": "3%", + "containLabel": true + }, + "xAxis": { + "type": "value" + }, + "yAxis": { + "type": "category", + "data": [ + "Brazil", + "Indonesia", + "USA", + "India", + "China", + "World" + ] + }, + "series": [ + { + "name": "2011", + "type": "bar", + "data": [ + 18203, + 23489, + 29034, + 104970, + 131744, + 630230 + ] + }, + { + "name": "2012", + "type": "bar", + "data": [ + 19325, + 23438, + 31000, + 121594, + 134141, + 681807 + ] + } + ] + }`, `{ "title": { "text": "Rainfall vs Evaporation", diff --git a/examples/funnel_chart/main.go b/examples/funnel_chart/main.go index eb753fd..6b17614 100644 --- a/examples/funnel_chart/main.go +++ b/examples/funnel_chart/main.go @@ -24,64 +24,24 @@ func writeFile(buf []byte) error { } func main() { - p, err := charts.NewPainter(charts.PainterOptions{ - Width: 800, - Height: 600, - Type: charts.ChartOutputPNG, - }) - if err != nil { - panic(err) + values := []float64{ + 100, + 80, + 60, + 40, + 20, } - _, err = charts.NewFunnelChart(p, charts.FunnelChartOption{ - Title: charts.TitleOption{ - Text: "Funnel", - }, - Legend: charts.NewLegendOption([]string{ + p, err := charts.FunnelRender( + values, + charts.TitleTextOptionFunc("Funnel"), + charts.LegendLabelsOptionFunc([]string{ "Show", "Click", "Visit", "Inquiry", "Order", }), - SeriesList: []charts.Series{ - - { - Type: charts.ChartTypeFunnel, - Name: "Show", - Data: charts.NewSeriesDataFromValues([]float64{ - 100, - }), - }, - { - Type: charts.ChartTypeFunnel, - Name: "Click", - Data: charts.NewSeriesDataFromValues([]float64{ - 80, - }), - }, - { - Type: charts.ChartTypeFunnel, - Name: "Visit", - Data: charts.NewSeriesDataFromValues([]float64{ - 60, - }), - }, - { - Type: charts.ChartTypeFunnel, - Name: "Inquiry", - Data: charts.NewSeriesDataFromValues([]float64{ - 40, - }), - }, - { - Type: charts.ChartTypeFunnel, - Name: "Order", - Data: charts.NewSeriesDataFromValues([]float64{ - 20, - }), - }, - }, - }).Render() + ) if err != nil { panic(err) } diff --git a/examples/horizontal_bar_chart/main.go b/examples/horizontal_bar_chart/main.go index eecd9ec..6b206b0 100644 --- a/examples/horizontal_bar_chart/main.go +++ b/examples/horizontal_bar_chart/main.go @@ -24,29 +24,38 @@ func writeFile(buf []byte) error { } func main() { - p, err := charts.NewPainter(charts.PainterOptions{ - Width: 800, - Height: 600, - Type: charts.ChartOutputPNG, - }) - if err != nil { - panic(err) - } - _, err = charts.NewHorizontalBarChart(p, charts.HorizontalBarChartOption{ - Title: charts.TitleOption{ - Text: "World Population", + values := [][]float64{ + { + 18203, + 23489, + 29034, + 104970, + 131744, + 630230, }, - Padding: charts.Box{ + { + 19325, + 23438, + 31000, + 121594, + 134141, + 681807, + }, + } + p, err := charts.HorizontalBarRender( + values, + charts.TitleTextOptionFunc("World Population"), + charts.PaddingOptionFunc(charts.Box{ Top: 20, Right: 40, Bottom: 20, Left: 20, - }, - Legend: charts.NewLegendOption([]string{ + }), + charts.LegendLabelsOptionFunc([]string{ "2011", "2012", }), - YAxisOptions: charts.NewYAxisOptions([]string{ + charts.YAxisDataOptionFunc([]string{ "Brazil", "Indonesia", "USA", @@ -54,31 +63,7 @@ func main() { "China", "World", }), - SeriesList: []charts.Series{ - { - Type: charts.ChartTypeHorizontalBar, - Data: charts.NewSeriesDataFromValues([]float64{ - 18203, - 23489, - 29034, - 104970, - 131744, - 630230, - }), - }, - { - Type: charts.ChartTypeHorizontalBar, - Data: charts.NewSeriesDataFromValues([]float64{ - 19325, - 23438, - 31000, - 121594, - 134141, - 681807, - }), - }, - }, - }).Render() + ) if err != nil { panic(err) } diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go index 414f676..435da78 100644 --- a/examples/line_chart/main.go +++ b/examples/line_chart/main.go @@ -24,35 +24,57 @@ func writeFile(buf []byte) error { } func main() { - p, err := charts.NewPainter(charts.PainterOptions{ - Width: 800, - Height: 600, - Type: charts.ChartOutputPNG, - }) - if err != nil { - panic(err) + values := [][]float64{ + { + 120, + 132, + 101, + 134, + 90, + 230, + 210, + }, + { + 220, + 182, + 191, + 234, + 290, + 330, + 310, + }, + { + 150, + 232, + 201, + 154, + 190, + 330, + 410, + }, + { + 320, + 332, + 301, + 334, + 390, + 330, + 320, + }, + { + 820, + 932, + 901, + 934, + 1290, + 1330, + 1320, + }, } - _, err = charts.NewLineChart(p, charts.LineChartOption{ - Padding: charts.Box{ - Left: 10, - Top: 10, - Right: 10, - Bottom: 10, - }, - Title: charts.TitleOption{ - Text: "Line", - }, - Legend: charts.LegendOption{ - Data: []string{ - "Email", - "Union Ads", - "Video Ads", - "Direct", - "Search Engine", - }, - Left: charts.PositionCenter, - }, - XAxis: charts.NewXAxisOption([]string{ + p, err := charts.LineRender( + values, + charts.TitleTextOptionFunc("Line"), + charts.XAxisDataOptionFunc([]string{ "Mon", "Tue", "Wed", @@ -61,54 +83,15 @@ func main() { "Sat", "Sun", }), - SeriesList: charts.SeriesList{ - charts.NewSeriesFromValues([]float64{ - 120, - 132, - 101, - 134, - 90, - 230, - 210, - }), - charts.NewSeriesFromValues([]float64{ - 220, - 182, - 191, - 234, - 290, - 330, - 310, - }), - charts.NewSeriesFromValues([]float64{ - 150, - 232, - 201, - 154, - 190, - 330, - 410, - }), - charts.NewSeriesFromValues([]float64{ - 320, - 332, - 301, - 334, - 390, - 330, - 320, - }), - charts.NewSeriesFromValues([]float64{ - 820, - 932, - 901, - 934, - 1290, - 1330, - 1320, - }), - }, - }).Render() + charts.LegendLabelsOptionFunc([]string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", + }, charts.PositionCenter), + ) + if err != nil { panic(err) } diff --git a/examples/pie_chart/main.go b/examples/pie_chart/main.go index e69bf60..8a98e57 100644 --- a/examples/pie_chart/main.go +++ b/examples/pie_chart/main.go @@ -24,27 +24,27 @@ func writeFile(buf []byte) error { } func main() { - p, err := charts.NewPainter(charts.PainterOptions{ - Width: 800, - Height: 600, - Type: charts.ChartOutputPNG, - }) - if err != nil { - panic(err) + values := []float64{ + 1048, + 735, + 580, + 484, + 300, } - _, err = charts.NewPieChart(p, charts.PieChartOption{ - Title: charts.TitleOption{ + p, err := charts.PieRender( + values, + charts.TitleOptionFunc(charts.TitleOption{ Text: "Rainfall vs Evaporation", Subtext: "Fake Data", Left: charts.PositionCenter, - }, - Padding: charts.Box{ + }), + charts.PaddingOptionFunc(charts.Box{ Top: 20, Right: 20, Bottom: 20, Left: 20, - }, - Legend: charts.LegendOption{ + }), + charts.LegendOptionFunc(charts.LegendOption{ Orient: charts.OrientVertical, Data: []string{ "Search Engine", @@ -54,20 +54,9 @@ func main() { "Video Ads", }, Left: charts.PositionLeft, - }, - SeriesList: charts.NewPieSeriesList([]float64{ - 1048, - 735, - 580, - 484, - 300, - }, charts.PieSeriesOption{ - Label: charts.SeriesLabel{ - Show: true, - }, - Radius: "35%", }), - }).Render() + charts.PieSeriesShowLabel(), + ) if err != nil { panic(err) } diff --git a/examples/radar_chart/main.go b/examples/radar_chart/main.go index 077fa48..9550951 100644 --- a/examples/radar_chart/main.go +++ b/examples/radar_chart/main.go @@ -24,79 +24,47 @@ func writeFile(buf []byte) error { } func main() { - p, err := charts.NewPainter(charts.PainterOptions{ - Width: 800, - Height: 600, - Type: charts.ChartOutputPNG, - }) - if err != nil { - panic(err) + values := [][]float64{ + { + 4200, + 3000, + 20000, + 35000, + 50000, + 18000, + }, + { + 5000, + 14000, + 28000, + 26000, + 42000, + 21000, + }, } - _, err = charts.NewRadarChart(p, charts.RadarChartOption{ - Padding: charts.Box{ - Left: 10, - Top: 10, - Right: 10, - Bottom: 10, - }, - Title: charts.TitleOption{ - Text: "Basic Radar Chart", - }, - Legend: charts.NewLegendOption([]string{ + p, err := charts.RadarRender( + values, + charts.TitleTextOptionFunc("Basic Radar Chart"), + charts.LegendLabelsOptionFunc([]string{ "Allocated Budget", "Actual Spending", }), - RadarIndicators: []charts.RadarIndicator{ - { - Name: "Sales", - Max: 6500, - }, - { - Name: "Administration", - Max: 16000, - }, - { - Name: "Information Technology", - Max: 30000, - }, - { - Name: "Customer Support", - Max: 38000, - }, - { - Name: "Development", - Max: 52000, - }, - { - Name: "Marketing", - Max: 25000, - }, - }, - SeriesList: charts.SeriesList{ - { - Type: charts.ChartTypeRadar, - Data: charts.NewSeriesDataFromValues([]float64{ - 4200, - 3000, - 20000, - 35000, - 50000, - 18000, - }), - }, - { - Type: charts.ChartTypeRadar, - Data: charts.NewSeriesDataFromValues([]float64{ - 5000, - 14000, - 28000, - 26000, - 42000, - 21000, - }), - }, - }, - }).Render() + charts.RadarIndicatorOptionFunc([]string{ + "Sales", + "Administration", + "Information Technology", + "Customer Support", + "Development", + "Marketing", + }, []float64{ + 6500, + 16000, + 30000, + 38000, + 52000, + 25000, + }), + ) if err != nil { panic(err) } diff --git a/funnel_chart.go b/funnel_chart.go index c8457dd..63b3504 100644 --- a/funnel_chart.go +++ b/funnel_chart.go @@ -36,7 +36,7 @@ type funnelChart struct { func NewFunnelChart(p *Painter, opt FunnelChartOption) *funnelChart { if opt.Theme == nil { - opt.Theme = NewTheme("") + opt.Theme = defaultTheme } return &funnelChart{ p: p, diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index c98d688..fb23734 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -52,7 +52,7 @@ type HorizontalBarChartOption struct { func NewHorizontalBarChart(p *Painter, opt HorizontalBarChartOption) *horizontalBarChart { if opt.Theme == nil { - opt.Theme = NewTheme("") + opt.Theme = defaultTheme } return &horizontalBarChart{ p: p, diff --git a/line_chart.go b/line_chart.go index c505a91..0dc0fd8 100644 --- a/line_chart.go +++ b/line_chart.go @@ -34,7 +34,7 @@ type lineChart struct { func NewLineChart(p *Painter, opt LineChartOption) *lineChart { if opt.Theme == nil { - opt.Theme = NewTheme("") + opt.Theme = defaultTheme } return &lineChart{ p: p, diff --git a/painter.go b/painter.go index 5a8dd89..0bacd3c 100644 --- a/painter.go +++ b/painter.go @@ -149,9 +149,9 @@ func NewPainter(opts PainterOptions, opt ...PainterOption) (*Painter, error) { } font = f } - fn := chart.SVG - if opts.Type == ChartOutputPNG { - fn = chart.PNG + fn := chart.PNG + if opts.Type == ChartOutputSVG { + fn = chart.SVG } width := opts.Width height := opts.Height diff --git a/pie_chart.go b/pie_chart.go index c5a2ff2..972b4c1 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -53,7 +53,7 @@ type PieChartOption struct { func NewPieChart(p *Painter, opt PieChartOption) *pieChart { if opt.Theme == nil { - opt.Theme = NewTheme("") + opt.Theme = defaultTheme } return &pieChart{ p: p, diff --git a/radar_chart.go b/radar_chart.go index dc93ca8..610d5f7 100644 --- a/radar_chart.go +++ b/radar_chart.go @@ -64,7 +64,7 @@ type RadarChartOption struct { func NewRadarChart(p *Painter, opt RadarChartOption) *radarChart { if opt.Theme == nil { - opt.Theme = NewTheme("") + opt.Theme = defaultTheme } return &radarChart{ p: p, diff --git a/series.go b/series.go index 4808bcb..905c140 100644 --- a/series.go +++ b/series.go @@ -36,6 +36,14 @@ type SeriesData struct { Style Style } +func NewSeriesListDataFromValues(values [][]float64, chartType ...string) SeriesList { + seriesList := make(SeriesList, len(values)) + for index, value := range values { + seriesList[index] = NewSeriesFromValues(value, chartType...) + } + return seriesList +} + func NewSeriesFromValues(values []float64, chartType ...string) Series { s := Series{ Data: NewSeriesDataFromValues(values), diff --git a/theme.go b/theme.go index 544588a..26786b9 100644 --- a/theme.go +++ b/theme.go @@ -55,10 +55,21 @@ type themeColorPalette struct { font *truetype.Font } +type ThemeOption struct { + IsDarkMode bool + AxisStrokeColor Color + AxisSplitLineColor Color + BackgroundColor Color + TextColor Color + SeriesColors []Color +} + var palettes = map[string]ColorPalette{} const defaultFontSize = 12.0 +var defaultTheme ColorPalette + func init() { echartSeriesColors := []Color{ parseColor("#5470c6"), @@ -93,121 +104,134 @@ func init() { } AddTheme( ThemeDark, - true, - Color{ - R: 185, - G: 184, - B: 206, - A: 255, + ThemeOption{ + IsDarkMode: true, + AxisStrokeColor: Color{ + R: 185, + G: 184, + B: 206, + A: 255, + }, + AxisSplitLineColor: Color{ + R: 72, + G: 71, + B: 83, + A: 255, + }, + BackgroundColor: Color{ + R: 16, + G: 12, + B: 42, + A: 255, + }, + TextColor: Color{ + R: 238, + G: 238, + B: 238, + A: 255, + }, + SeriesColors: echartSeriesColors, }, - Color{ - R: 72, - G: 71, - B: 83, - A: 255, - }, - Color{ - R: 16, - G: 12, - B: 42, - A: 255, - }, - Color{ - R: 238, - G: 238, - B: 238, - A: 255, - }, - echartSeriesColors, ) AddTheme( ThemeLight, - false, - Color{ - R: 110, - G: 112, - B: 121, - A: 255, + ThemeOption{ + IsDarkMode: false, + AxisStrokeColor: Color{ + R: 110, + G: 112, + B: 121, + A: 255, + }, + AxisSplitLineColor: Color{ + R: 224, + G: 230, + B: 242, + A: 255, + }, + BackgroundColor: drawing.ColorWhite, + TextColor: Color{ + R: 70, + G: 70, + B: 70, + A: 255, + }, + SeriesColors: echartSeriesColors, }, - Color{ - R: 224, - G: 230, - B: 242, - A: 255, - }, - drawing.ColorWhite, - drawing.Color{ - R: 70, - G: 70, - B: 70, - A: 255, - }, - echartSeriesColors, ) AddTheme( ThemeAnt, - false, - Color{ - R: 110, - G: 112, - B: 121, - A: 255, + ThemeOption{ + IsDarkMode: false, + AxisStrokeColor: Color{ + R: 110, + G: 112, + B: 121, + A: 255, + }, + AxisSplitLineColor: Color{ + R: 224, + G: 230, + B: 242, + A: 255, + }, + BackgroundColor: drawing.ColorWhite, + TextColor: drawing.Color{ + R: 70, + G: 70, + B: 70, + A: 255, + }, + SeriesColors: antSeriesColors, }, - Color{ - R: 224, - G: 230, - B: 242, - A: 255, - }, - drawing.ColorWhite, - drawing.Color{ - R: 70, - G: 70, - B: 70, - A: 255, - }, - antSeriesColors, ) AddTheme( ThemeGrafana, - true, - drawing.Color{ - R: 185, - G: 184, - B: 206, - A: 255, + ThemeOption{ + IsDarkMode: true, + AxisStrokeColor: Color{ + R: 185, + G: 184, + B: 206, + A: 255, + }, + AxisSplitLineColor: Color{ + R: 68, + G: 67, + B: 67, + A: 255, + }, + BackgroundColor: drawing.Color{ + R: 31, + G: 29, + B: 29, + A: 255, + }, + TextColor: Color{ + R: 216, + G: 217, + B: 218, + A: 255, + }, + SeriesColors: grafanaSeriesColors, }, - drawing.Color{ - R: 68, - G: 67, - B: 67, - A: 255, - }, - drawing.Color{ - R: 31, - G: 29, - B: 29, - A: 255, - }, - drawing.Color{ - R: 216, - G: 217, - B: 218, - A: 255, - }, - grafanaSeriesColors, ) + SetDefaultTheme(ThemeLight) } -func AddTheme(name string, isDarkMode bool, axisStrokeColor, axisSplitLineColor, backgroundColor, textColor drawing.Color, seriesColors []drawing.Color) { +func SetDefaultTheme(name string) { + defaultTheme = NewTheme(name) +} + +func AddTheme(name string, opt ThemeOption) { palettes[name] = &themeColorPalette{ - isDarkMode: isDarkMode, - axisStrokeColor: axisStrokeColor, - axisSplitLineColor: axisSplitLineColor, - backgroundColor: backgroundColor, - textColor: textColor, - seriesColors: seriesColors, + isDarkMode: opt.IsDarkMode, + axisStrokeColor: opt.AxisStrokeColor, + axisSplitLineColor: opt.AxisSplitLineColor, + backgroundColor: opt.BackgroundColor, + textColor: opt.TextColor, + seriesColors: opt.SeriesColors, } } From 5db24de7ed177121f13cd2a8d62b18426e420a46 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 18 Jun 2022 08:55:46 +0800 Subject: [PATCH 146/251] refactor: add example for chinese --- README_zh.md | 4 +- assets/go-charts.png | Bin 372652 -> 340210 bytes axis.go | 3 + charts.go | 1 + examples/chinese/main.go | 118 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 examples/chinese/main.go diff --git a/README_zh.md b/README_zh.md index 57d9db4..2d16b04 100644 --- a/README_zh.md +++ b/README_zh.md @@ -220,4 +220,6 @@ BenchmarkMultiChartSVGRender-8 367 3356325 ns/op 默认使用的字符为`roboto`为英文字体库,因此如果需要显示中文字符需要增加中文字体库,`InstallFont`函数可添加对应的字体库,成功添加之后则指定`title.textStyle.fontFamily`即可。 在浏览器中使用`svg`时,如果指定的`fontFamily`不支持中文字符,展示的中文并不会乱码,但是会导致在计算字符宽度等错误。 -[中文字库noto-cjk](https://github.com/googlefonts/noto-cjk) \ No newline at end of file +字体文件可以在[中文字库noto-cjk](https://github.com/googlefonts/noto-cjk)下载,注意下载时选择字体格式为 `ttf` 格式,如果选用 `otf` 格式可能会加载失败。 + +示例见 [examples/chinese/main.go](examples/chinese/main.go) \ No newline at end of file diff --git a/assets/go-charts.png b/assets/go-charts.png index 5ead96171cd7989ba1666b8492f341425a701a95..a80e24112b8cb0717c1866b20152a56f3a50cf21 100644 GIT binary patch literal 340210 zcmZ_0byyrt@GywGli=6Z_Rnt;cvtcSq(x^xTNDvSZsIoE=KOi8W86Y5#1`wdYHM-u!br7(uZL$)gKi${P zS9BG0T_A>Ux~88{<#hx5a#Y=BUHwZ<*$IqMxMp~tJgrh(u(YzPbuPcN@1Pa(|N2GToZh`Wf;&=**U z2^I=tAISgDC%+d-i2)E4#33#w8!#0BkqVHIm|%f0^ufdg!~d_R4iYdTaAOaM;y*7}#r0zjlP5VrHxFsP8k?Ra91$RaD$oAn+Kd(~;CD zsKYkf_~27K6hGr)&7%)c58+YvA6~Tzp2H;UNVMOmgsavNKibQbM0m4t?Z~()?23AL zJ!QHliuy8crrK~15uon4?9Yi7kkj%rFpZU3_yn;7508#Yii-ndW@lB8-e+HjE(4H> zgItJ71xQd(gfaa`htXeVvh5-_|3D$ji&`?d=(Nct~B+ZCo(`ap<$mY+`^a zDYOz092^|>E$dJ2`!%+%t{NR**0je-!^lRDR(S;+T=6f>lKIv7 z`2xCdgebwYj}M<6X)h7W{ja*~ebq@JoZQ@xq|+>2N}2{5*&lN0t}%S%y~cH!U5Gb2{4fA)^!MIPZSrK;52q$TMSc~RlnlCp{PGoN zbT3i5NFQnS?(J!LVL{@29rs`M%t?89xucUKXj*6U)6x30c{*jBcGvR)e?Ese`weuR zLuzIqkkB}~7om*%t5fn|)ZE* zC7a$eVR$%A;c@)&R}G+Lm6;?o3iW0YSt*NwkrCyd(j%- zxtW`jGqmKVdR0veZl(==vx{X`_1W>8w+4)gwzjs8j^|_9;o+g-$M9j(s;wh7Cl^;! zOG^X>ipa~J_3~S{_lC>Kj(Z70Ze5+K0rf>?MMXtONJtQANI$s;FRE2f5Um&2FJVC5l@3f3JYMf1|VW*KR!9B-(s)N z)u4G3r#o6;Pp!MzvM@bH$*RXIEZzf8&dTa=FqQ-=!Y?g&d4AqMI8f)Lo-a{usjZ!H zT?q>d`&XO3dUiOOqrv!Dla#bp&Bq6c%fDArSg1njbTpO4ZZ_rz3EgbJA;<3vx*5LQ z=+Hd&B9Et(j{eDZqYd~JWVx)58hgei`^F;N#BDr)z`|1V^_#}b^7p#(KLTy`v-v^1 zOZGXDC-<h7fKShhrise)q;HxVq`o50xw*%nT@0I$8T|0oSDhx? zU%7W^k%G9)24iDWn8{fQ9c#ZI_F_5&L}(gg#+rKP1HNnE@;uKb;n2xh%6N2FWV_y3rb1P&Bl|}DT6q9PRz4nIljGxuh9?*ESAcu5$kEy81$9RXJ^CHJ3yvbo!~1eDOp*a zB!J)Mj{ev&%8pR?NreC2^4ndHu%^XPU9+NVMs{G^svo-zoW$oL(Yot;vlyH#u%@P_RINNFpX^4CpHE3qaghe%G|uCwB*$kAbuoPx zY*Rff_H?GKj*5IgH5drDZWtU`Xk}e@@p%*os1pT;9XK;sK{#m>!e?> zXpZ_Aj9p~%^gF!*7TE#|QbHH(||GZPMAn!kVOG_m<~_N03i3HMpI+PZTtJ+?9b z)$XADJt0rF;Hu|rz9gJk!{ZPt;T(Yb*QTK9NUYbrq2YH;>(x#Vb8{TJ$JU6*s~uHR z){ftkFkV(#YyQy`0b?*e4>YS|``I=F{Zo%6?l7EY!krv|Pm3HP3{?odnt+9%sCb~EG>Xx4|T zEAr3p?~slJ9)6 z6^9H@2(Hp)snz%EOH9l(wi5~x+q*I^Vd@V?tI(=$Dt}Azyz(~Mg58{B^|Q@2qKq1W z0+OX(th;sIg6{Umr|dC*D(XL-&L%K!RZJ=i6MyVD&?HmYZu|L1M@N5&kSX*jkcz-z z+U#6KghV&v0X^S{hoH6CFP_$|mz%FF)KwX>pdz2Hwtf6%gOy{}Yh@LpysP5b^vlM~ zNaKzqViQA{Mngku6hD=h$*`PO(#;%|7Z(!3umiQ;g#K{udUZLS8P9C7Z>X=QNY8ll z@e7+^M`*E|mx==Ti;6NcSIYr>9*S@?cxq|~l>$kIZ6ky+U`6BsjfSOFFD5mRjnEutXOj~Vf+nyvd&Xeb$ z<`9^hw~aYpm-ZgsDTYMz5Vn~PWELKrfi|yxu^m$m=k*5*v`JJsO{!i;K(^e+^zcT^ zQ@2Fg=MELhCg7oQ+pWRGZLc_VftQKM$jHXJI=(;8tZ^@2EHqR>x6@nL&YSvdK#+b< zveMn?dT}(q*0yWIzLdxFR}vB>t{Q``^ysmlF)@Z}ApA|(o#pB27^%JU^9c`4O-*M6 zTwL6GQY@@|CGg(rU$^(0!^-31W8WDJJUqwa#adHDr`nfmqUG1Ow*tZ6^-#4B^GWee zQ|MYt#)k4CMUnKQPM&0kFW&z|3k4Y&6K4${r8e#C?6jL9fIVo9 zZfHK!AkbL1`VXL(}Znt-jkHrqnzqXW2yP?X(d4xUh z=?bXWz6CM@i%UMwcOAF%^nEkAkT>U=N$qSybDOsuow%+ezWbEPVFbnn__o-sOHo)s zW1uAHhllz@2Svsh+Ux0m{|@nu*fj05AczXmBL?>v-HW~3dHhwb&d%ynqmTs^(pLHv zn$67^2-nk4>F{4r@?M(l=+-NmF zLdnllz)@;vY%B)<59s^3-TT*S-5Rv(NKiGG#nN_dr3;*xJDQhy4#v^WeW%|6(+Ka<_5!1iCfwXwlu>^I0=_F(*xh z_^7#rcYb<$O37GiRq<>I5)e6_-s4O8R;LSl!!gIEUM*GVl7rR+D?GA)(KhKLal$n> zURb;1Mx~a$2`p6VGy71}P!~iKp`yW2`c+la=);7zwqFLQ$#Nqh9qG2%1|6ovr{jEa z{^BOXp)&V4$1xq75`=s~RtuIG2{9@a5piE2ZXy6MLYo-b(t^I#WczYEToSue4Np5* zxY2Ulh+igoo!qP_&o^CiI%1xo*9vVbv2Fk@t7HWr8^rzlVB zwohOn3Uzabz8(Mdo95D=cb9q$LR?%NSCn8imUYoZQ&h;vXF?vkU4>JiAulv_SxI3Z zU6+%8+$P`Ao4%r5qS{)m7m<6j!#QgXqa1Il$}}{x1-AG8h2vUWzS^o0;lOutati0? zEu#CN$+hCQgn3>CBcvw= zaSqGrYyo@&m(EmN&-Yy~clRZaw+riGmd0vb=;3n`TQ>CeSCg`viQK$|o*MGx3bv^X zWmMuB;PQw^8RKfIvVc^k(cT7}?!=YAi<^!yna}6@lh+0^hO4sPmwvWAmODeZ*Uc`k zJ-kpUjo;7;xi=J%}}~scnXIZabv7 zZ4(SUt?WI@I-PKAC#R{G^~1jgPJLiPZpN`2ZIm&Oi2lWZPT6U|5sFMiS%ZM0{JKEGb}@x-rntc zqZM=%J|SU5m5FJrzi!tXd=Ok)kh0aT*q2^>6c*7GO zf~$qH8qX!v^5=QsZf6T!&TXmbQY1hx8@}s)T!Vx-nVC8$^jktz zRT<_V4iAg`(tQHapj5`io0HQ;o9m@d_nntz10Q@5R2h0i=#B5+%3X3Y1ahI3J6hYN zvUo)aEoUq7G5ny$h(~ypygxuMjUhU} zdmN*hs3FXF{c$=gJU@OR)cy5r9Hqa)9OxbTQuV>4!fjJuz)vHoA>qnx2kqB#W!SCr z>4McO?nWStnpv%Y)<2aR(Icg-se>a*x*u*6TVx!5@x>7u@F?WJRbdU6f>8Gjv&c3;@= zi*7I1-gx;lC6m29of)%Hw)+ANNYO}dARqHy0>d;kKb^!?fioeTuJh39##}I#*h&F6 zP@j|RFedyRoHJilpT9)`whVx;7Z1O_nCzuEwMQwfv|qpTQIskQehI^d<^5uwUlVWJ z$-=CWX}bg->)>@iO$VJZ13JS97ouzAt3F_D;;sooWzz%L#H6%)0Qsoj4gY0|VO%OQ z3I_)VLs?9$gWolcxDt^4X4^;8n!WE=T{PRtR;P<`cuL=b^A_=V)0@yoR7v`0Sl3M6 z-(r~6J#vX6+t3Q+scC7d?1kFeUO_F1&X{T8QpQHM6lk!>rr%osY6OZD!(ep1K3)je zEHQRh8>1tBfSeE`7Q(&nCS5dfvua&7`u`$Wf9rBpBm}CQ#D-!-eF0G*8_yG-Q`9Sb zDl@wm?cFJRW7pK6v{C@T*a`6rO`#rt2|wcZbf{@}2pStF z$8QUuYSGR3?z_}u4ww3RoQs`vA5M8{KMb_X1Z)nccZ;wMh5p^`RG9uJUO8MT`L#R( zhpkg^MWles5Zf7#ErM;58LIu+;7!FeaKz(xaAu$N7zri2jDKNaaUbV1Q*%n)ayai7 zC@)}szLLt7;HBRu^z$>n>FqFl99r_8=Y&qK)>9htP{`0(V3jfyMOZF3rIY;c1dlsg zIwuVgOb(qUOZsc%+FS#P%~4!~HvRQxOT$>~;9ybjw#zleGz`&1WlKvu_yF|lVO}rC zNyS#C3RMh|rutDi<2sn!68Hi6|pX#mhr%fcazh=-^>tmvmF8xcV_5w^gWhTs| zmNSdF{xm*Zmfs1szrq3~-mym5)4pmK%YJ8K4bcjMQ79Ar^n;M7A6D)x^6$m3{AE`NLYQ9#L#YxE@lQaeZ)<9n^>?C4={!lr-o2tHg!MHUgUp z({)6uB|n^E`VabNW~9CS3?cr(tj^?*jAqUq-agNQj} zn|e<98Ezl zBG}(IV7k2a=3`kGf4=G3X5pe{M6wOC1X(dHggSa5_{^GVaj1{w80C4kY({he#?sjKn6&Lc#K8Q^z2)BT=mRKhtkwD*X#RmC z)}S9-I3O{C7iggISJ3P8o-$taDzVrf*J4cqVB=(~V*j{54Z-=KJu8owc$QZk;RzSj z9?DwZ+4f&q+9F7FQCfm$N$Zygv`LRKBz)zXj}HEu@lre8>j1V@+gg0WZLJ`q9E_Im zsHlD?p3=`tq25s=dSR5BrQT8@dG5*y3L16(y)JX61@oG;6Wpla^b|MQi25v71V?wp zR*7DgrM(%mFh5_+HfT8oMR-TQ+ZL;Nb0Wb7EucLyN;}lIK~#8j0u)Q7XIrQ?^Sv+Q z$_P{lv_`{y9-;9T4BFuV=>ImZs!AyR9hk;Dc1Op?Rs|lmkXzX2hH3(Wh9Dwb|Db~M z!(~~;E4Y0`5!FhR_8{0I^;IgCD@FSxzI!%HMU9kVYiJ~V1(i3V+OMUS5Ob|WY#3Io z5uQc@?bclh!d9R@4=ZZsN-agCq5h(|yT?x9S})|5rp5k^n4sYO+gP@ZD;)4zBxUKM zr!-xJV_Chgvtzq2%jE+;kLtc(aQ^f>_69jR-CYaf;o(V`QkjO!M*%p?c>rGO+sg}9 z^D}bV4TrkfWvczd%Pl)OEf3kK6xF^knKMwj>%Z?P7oHa@q)X!0pORx&DgslA_`;3! zwf{)Ss9gF5{2=jRb7*Lk77>N@Z(l)^RNz-=+QtPweEoe>J5# z8s*MeBM9nSS52|4+yT__Xw&-iYOxB8#XhHu{|-D>kSGo%!{hYDAytJ`O>zhiRWQxD zEnDO8+Y*v7B;8>48JJ@DF@o)DOd1maa7c3RL`#va@&}kkQDC*f)k-L2vgrlb59cTS zh~FommIaMNihp&Pyk(XnSMbAw_EAMM&H1XUQQ11W!4R@FH_x?lrtvaey8D4?IKyb= ze{O1wh^{D42-NB;7}H8VKzU2%756e9^j8=Bt_^aAO+nsinA;huTJK;7{%A;%o>~Sb zCnn?O%oWV5K6B#b;&Z8DP+1G=ht;Kqp|*K+pyWapoE0xS4%x;< z9*_eRQ~PNUJi~scY?!4A^;>zw0Oh}P*z9}Ba$BPoh(7G%R;SFS1(8Q)@h4Q#`~|rB zFIj^pEr*p-MS(xu5z>*J6J}-7us{ej=6y#ao25!7bfD!9FXCm-96E<%wedGuumZR} z+_4*(xx8TQEJJ3BIM`*4wF46yq7WsK-XSn7+-hljTt0|_TE|A_(?bOD7ma4fUO?wv zT&{>cOx-*-oZ8Ts_$W%#Gll0Hgl>d~h?0x=`1l*Ge+f3DJ_o+Oc^ZnYs}0KrMm6{+ zxNj>fBBm~poe9LZQ$NFfVSQ$~@P>A%evy(s{}8KNkU+`>OkFM3 zNJ|$2S@nKW-yp9yb{Z~8Pa1S6t}Qc`jIEpx{)B8pHsa#v5B`9sax zmrHW4$5*v&9auyH?V_Cz6~MJ+zUnu)GMz4qUw`9bQal;YGa6n|tnmjFFiGDnTIMtw zSub@Gf%@oK0CiAV8CV6nupxo0YasgPAb181SSjVh*Ja;I!6641X=t3Z-hX8~TMlN018z+;;NjDu3XR~w?ixjv{7St;ABl-v%rvD(IF40OT zjUs~}NF33Ll!&k!W9CbdH2L2QjL0=wbxG)N@7!mPDYWuHCGdvvPFjk#p-}C`S|v;( ze8`U`u%{pYrjP-?)xtWQF%((bvY054tnfSS>cX=NoStwKOLj9fT5Ak%Or}&C@=3*M z-hIcFkD_chKJJsQjt;#xok%Q6Q5eI6r23EXfcC_>Tu2oJh>%iCsB6V^SamhDMx5Uv z{KvmW}z=5`+cXSZPF8GtaH2C-2B=L_B>C=(hW;;}0s3++7r$TJV)jXwQfBtEbJ_%qP3(cFP-M(|~Lt z&)Phs2UyuKFQk)-@JEgJr{oN7bfPV8XXAAy(q>c21@Ta)rOMTOZ)Ssf)8klj3dsG$ zW<{4!ox_RoX(0=n4nGUDRL#zhv2VLPax0#aV^*hTtPAMnI8lWRO90?a^wb4ZyW5(L zF=us<=*I1DZBD8Y68&&fm3U+PxPkd3US;S#l#B4WL+zGFDXCHps*G%E63Zex$^+Y# z*1F1v?y!9Y@dH7ZcH33QW@~ytAXUxfI44ShtCXNLg>X@F8WDwOo-=y{8GE2~!nUA( zHi=?hSlfUgVTOT_SDXx)?fT=z7w|E@lNrEI^%sR*@TG?c8WznvV)9`^&0p|kj@)Xl z@coK#JBVax3etxP#VR%@FYfA3q9`2xhY}#o=>shP4;0VTUEI5 z02k}!LrM4KFQX>(#EKS=yH94N2Plxn!sN4Jxf5cPah9{PV+{lEf=_3m;# zc0zR29z*>yS%~h@4SBIFiKuu^(Ig!j9CR{2O)QIyCGrDwu2y-01Ir2u_t~D(6ku{d z0-)CS{h(HG5OnQ%u*2oz{2T-Vxp#H)_MiE9bajS=NdNqq7y#(hbsI~hCpzx*9le;l z^6jJt!Q-adMIaw8`g;lB9; z;9eEoe{o*kg>}3kwSc1c&x>>%b!e zK9Dm!A6#8cNA%9m&0UU>fi(tdiimlQA}}*Iv)N8DI$JVax<8r!`&S&s=XYjYoYhLX zx`sw`0N`x-*T~pZ8t?BpaRlZ6D7CSD0WChe9E^SC;ArUU6KnQR%;dd^VChCcN0+Ah z#?0*MHS4fMg!u#o-UT{9bACDl3_&_ zrZm*l0{qp{k^H^DVM>bW1Kfe3!5BiG%Rff5rK$y3*a?E@Bw*X@3jNQTX|Ivzeuzwm zLeSulCSl;<6mPz{98D4XF;Y0}8fg#N7gL-57<=jvO~``sWeB)i#7 zU65!4I8K72-^%L)wuX|;IGF^Ri_z_6aO_z7`%kIw2dUTn=pwZ|02BTACYj$352xyN z)H$>iSO00~b9!nOp38gd_n*)E82b*F3Kz8(Au4jjKno8agjlj%3QM<+^~)uJU%D-u z59doE>Qy#*#I9Lq=X#6Dn}^n<(^1V%P3X;M+&u^=wMYn|NFHQ6eBZ^$FvyIqV8%BN zFPcRvrT5?4mk*3@$FH6!eUHzCw`yWDQUP+>;DAj~exI0N%$#*axdAvyM%SmMv(tFF z8b0~6)&63wUphM3{@eQ)?yt}HI+2k8I@^{1azj*A$!lJHW$21PRZoE!hqy(F>_7za zz!ypSq6ro;gu93za%q4-j6P8Q|GUA+NA>?|_;HB)e?g3(4)0`JHFpSh2T2|-mwyUm z%{i!klMR`}LNBH%r4D-;1W{0-ATTmdy+Cu^`7BTT8#J0O8>igcY}>Q@TlM$yF>iDV zbK30a=k!XWOJ4*#;q7zgyzue_DDhXX0PYvk%&ez397Bksv?q8RC`ez3k}jj|z)e0u zRv=wbK2S3YeFK-TF6Ysxg zpN6C^7Oa4TRWH#R?@WrOX*%jeWt^pnt8$X%VsW{#1!mgRviVe1*n=G~Hx&U6C1jOf z1AigxdXl@hA*g;CAj1NEUSjW;eF=(_i+hnADTfsb^b=)>@;LGw?y7>mB)HRZIdWJm ziH449c1(CEX*z_r@pM~Gn||u}4GN3Sdw*yynbP?-r9;Z2{g_pEE@aZ%!F#^59d}6j zS%4ek9jD?G8Nj`k{cf?9SKLi`M5KO1Jgft6U`6_; z!KAd^=GpXVM(3PauhGQ;>t>mY-DQx^j^t@gkK;X|p{zQ%ZeB2P?S7R%X@Z`yh`v~k9*%HtDOm`myonpH9hf2J1lrj6tS5IK z?*4nF@U}C0q=j82C1_B>XIDD3=uAj4$jW%6^*#;D{PJ%i0$+Bzh*~%c>vLeJRT|rb zG<10b7dJ{*@>HE>cyDfLE&#d=5p0$A7eh$7b*vF$O=QNx7jBflRRmcwodoACz5bc% zGn5Fq;7EL3L(snKO;Tm#qVRmBwGeE$J8qa4nlizC?T{{kf{e^!okYsU?q|xxxiUuL z5^C|A#YG!xv~^zNIZkWpuwcYCP#C!`n=(Q-H^+thcSKZ8^Cr<{M|5!iJLaxyyx__? zD)X4gv&kES{&Cl1_>SrEucCJ-u!PVy>0#+pM(E#ufy<$^^(6XYsxA>T$ho8@njJ{j zwMZcUh0P&6zUW-VfKz1J|2pI`vnD!BsEjtx)Rpcu!za;Rn<#I=(B0zZt5+C zA00Vsq>2B`-G#OUkQi)Z;*Y02rpn-INpTgkOspXPTp;}Qj!Ml)X?V%dBu}3;MXV`R zJZkZ0=35?HgHDbsuaK3p@kAH@g=-XpY@QY+oF*I_UWX4X#(10?VqcX0K_D3gXSgmc z0st3A50>YeTC|l(tW_VQn3J zCj%Gn2*#+a+Rv_Ou6efeUX+uK%Q($-IP{j4C!Q5nqE}f(7AbAZO2>o)!vtbVYLs@? z%RZ2mgQKfsSsg2|ow`SJCwovFoSb@swCbHy7Rxhs`vaPZCtM6`&s4VN=N}HacSEs> z*?X${dHCRoU<&Wyr9Yg>2U~;{d0L;{mbHvZ$-*-h z8TN~Nx&VQdbgXM0e7xz7VvH+`Izu0StoGg4d-BZRrqAqFRDy;)sTQ=9QyHhZ*0)-D z@1Hj7?x5`%8PPndxp0D|z?1sPp)j3^F7C+7}%#tt6Uu zA!>5csO2|5a*In5D6k6dE2gnvPn)=O#eBc4JtWe8nyG)yf(2fWz8Rd`4YL~qEZttZ z3$Z17k0JF-QLKPl7vSLRnySm zf{pjuhQ)SAhw8u9sxEHn@_qGBJ60fqkryVIKu*p2ssWgOUu#$U3b-J*YLEz?%N5Bn z487QZbY@`k-;2X{l8&b+-$(WHJ?G#M^0^e5rLJRkDd`1O*(fr zlf-TaXUl-kSKx|3M{4sJD})J1c7n5=k=qbnn!A481KR$~nSFPVD$uq7V;c^uM_^*V zBsCllmkb4`78E>%Y>JYg8j34Hs}QHfx^~+z>#7hy4!O(S(=!+%ad4Qq+CM+9 zoV8pyapvOU0w)P8l{9pBZ$e|pwOX-!Jxbwbur|ClH`;kySMDajx8eri6XvuE9URx) z3ln0_uCFi8&6SsaeE5?etWt&$TaYv@3pA$i-`UvNRTUIaQd6558unZjou8k_#l<~5 zxOj+LSd>I2(Im)D{j#@bW@fgxwRMLO%k2ucVo^WTG&4Jxyz0*BezQ?koqfEM+LOjk zXsNHSpL;mr?&vCSfAx$hDl5}A;P*M#a&&Z@==~dhdPR+Q{urL{m|obmkO`|oEnb{U1Atp{jtUWog8f9r&-&j~!SXrUNJY4M^Dt_x76CZ$Z_dVE2Q3H;5 zrns2D^paWw3CIs}eA}R70WU8v>gtQ!Z>azu^`C!!=xWl!#}Q0M{en-=(CvIl%El`q}l2S3yTvAo6mc*{JcYyWaN`H%rs(osE)G z{C0e9T|k)atpv#y8bTePE%Ct2zW3m1gBKOT5^*f}_oj`2oo1m@kc zss(VF|KyhXpu+w=_Si}{!Lo^F6c#22GB7Z-cXYJi;8O#~#>WqKh64iw+uHchzhAFa z1pbF`KLsVYep^dLW!quQ@Btj#=-w7$c`@t0_0ZK_p9Zeva}r2C@L-{YTXjG3D|*EN zIu11ffE+A}a+a>S5zgoYIz;sQ1=4siQrKV~WJ$KM@m&6LbU z3z9B^v9V4sV73>7*p!=oM{((gRDh^e4gFdKXl)b(>by^W(lT!bpDQ#pG=`eV)d1kk zWpHx)rv8g-hqs5vDm2D-ZY!4Cv#o9%Y|4%+H8r&^-R@Inz|z@+nHgz10bvUxoqJ7d zD-{ci@@7Ip!d=>EA)mu{)%PwK=(5dagRn;27g&t!iwD9BNgwiHeXkAA1%tZq(;B!J z*zaDDFF|;@kDeLe0fDe&Ap>GOtvQ1^gF-laWGLzyVUbuv9%b?CX-o+M_rU0H?oygH z*vAD+x{ph75d<#TMDOG7eo700kweZHeD@*0&7_P6KnNZo?BmWE$o#L$5BPaYmRn>p zh2QgFaN}p69LoOyuJzZz5O6(r(z`@|awz{7Lo#0EFR<79kGC`b^eUT&q)(S);ZY&_wYs(-6+$RDQ;9y@v4wgU+6w<|k9)8>1@6LZg zWydKio51;dYvUkUeCj|i*`y5y`gB30(b_J4)Kq~9A4-P|h&Mwm;}P={lp|mr-r#p8qE!jUSJ#azj_LDGkURLS2}t!85!|}E3gP$IgYxpg z^1}4N^od)LZx}G3>SL+*tk=BYUv@NR=>y;K>GjL&0|o@(V!fwFKe#*Q|LPvyg%#Q* z69_PMx%2$%b$+0DF8K_;DIO`n$VLYYO#4`{tbR{2g#Aw^V;1%u+%SoANeU1}g74}F z@_AG8O2jqzF7!E97yqAnY_B*(AkN8nT2@+G@18HQYP<}XqoiIIZy_NyY;0oT&yUc& z?hgVrHGR8_H%gkJA-sJX5L2MSxugaYsNL)7GEY1N>`Z`yhNi|slnM?BK_}wfzPNZ_ zv#D8JUN$N0>;x@p0ybKIn>af+#!G-%Eram6SO8X2 zpD*?6=H}-5`ue)fw)9L)OmuXm6%`rj>EQ1okkHV~-DDIM6%`bIG8dPXrA=*OvTJV& zVCmEQeygCbsjI0_p05cm_Aqwzw7MRj>&x%Xi`zg$MxP#MS?PG{%GVtf746-@wD_p^ z?%<9|x!-u|VSk**Hibjby)UX{WXh7HV1KD$&Tn_ISNFNp)zi=9`mnZ4ZzG!ev8M@k zOG!w;%+=iAJJ)Ib+uXD_GO7cA0?^pl=;!BGSXkKC*LQvG;A%m1*%yQ?hjo(T5_iZK zPa^DtPk@&@<-XrA4WqF{$CaF<8JH~yJ|`z7B@ts2dX;n=O=r9P_)$$H;sYg6zdIK>HjV9knz!8;jE<*sat; z64n4eUcEuLx3{Oq$JY-Jl3%eXjf{-I0?DDOseM{P-wgOJY=oVZ%JJ3VTG7wf1P(|D z=<5DKp`kJW^Mr(iR9;;+nDT6|V5?`V_wNOHHiemb=SnATrc88hfA_pn^$CSi_%kqT zP=gX0Y#YM3TruPNgAVA(6VyJt8oq8ix=Ec2&q--%Z5GocKS^e{)%Elu<2pM#H#*#C zX=$%EI&k;!_ylY2j;4RDH>09H%PIa)KT>IK1lHPZTbulv9@!tbucZ0hBO6@#Io_kC zxV+J)At|M{rTid-xR_NU$1gl$b4i#rAdG274A$e$9&U2-_uZgkuL)wY<0h;5;-kjK z`g*6iIgZ`kJ+^hsgeJH16@P~P!H5*cyIVF`$HfR1>nYSd{NT}hjOLdP`S*d(T27al zdGGLX?|35vLp&)HW~h7V;1}YMom-FY;MZT;sekN#c^J^iI5&5l9>$)X{A^v)K0QKv z446i&dLfv`-!C$FssMkKBOvhR11+541=+WPg3`A?4EBZXn<52?IUQbdJx1x-9KW-+ zc-VTHTbpx}iQhh6oxQSC-o4wmZqpiOlf{vay#{ zBNs*~PdlS3Zx4){{e58y=ak)waciH}9E-tef~<9Tb=dCwjrrkHz?H9;{HKJrrcI9Nz2CJQ0|zwL0mvK0xH;1_f2YB)4&5( z;151lp9P*`t1?8@gmWXXzNPc>65-LfH{YZy#I_5b}8NN@j`i%~nG z4PQYCb;q-W*M@&AG`%M@WYmZUSBIgjxLdKsfwI}qRz0PG-LG6ZNkLr2!i(7LR44D` zHgV_N_rm=g_WSkvJ;I@1*LiZ|#tXOOS5Uwg9{5MGuC}4jnww0~V)d&O#U4fp0l)Gm zr;J`*T6uo^W_lHkx8@(r>XEK73e9MdT=yuNV(Z{O{me63Bc zo?P@T#!N%(o4d0%8o!BS)f!&oOns|v=MbNBD^ORZA?(}`ikz2*;pJ~a08qSJt4B^T z$WrM%_>{d<^tYa!Ng-A>2nCWMQt^v~5$8*C(^V9CA#|ZWxTfOym|77SoA}I4-BuR3 z5WNHhrB+tjW9Gu^QECbkoH zIFd#CYZ&%+y;pIBf2c`h4vs7H|1&cuvbKQi3IDoE)v;#Lj_e3Vg4g|yg$-pqrK0s;7Y>atH~Y3V=oe<% zwGBQeJ0EJNOyxng=`^fwIIvwwL$1E< z-QRmthTlhrwUaXTMjyOtZi{ze>eMe!l{4=0FZPw_ORCk~i|rrSh3|T z0|NqIUdaqdA9~kWwgmViQU9cgkOJPfjop;!cj^v^AEPFSqs!uIM~_En&LGgPE26WLnE z30B|_x;tlcJ_W-lvyKj7Pd8 zCt8D!wAY^XU!lXH?~OI*jMHR6j$%k=@Dk&aNKI2;)dg{8w;vx!w8W9G6A$=8EKBbp zu^WW4YLy#+UYR3sh3@+2v3nza8R0Rg1=mY#qvx}8_$H0(i0|Cyo59#0<5Lxq)RvAk)=m$aMe++RCweOqt2s1 z+NB&Bb7Zi>SE%SlJTWS8S8{J#-Q7?CvukW`IX^;_Xh5D43zc}2@sD}C!9z3)kh7Z6 zIvM;Lt13hi0y@qvv>F2{|HDo-ABuZ$%q~Gb+324HjqDV@kkMIFeqlF=WYf8?V$1e={h)n=Ya+0w4hX1}~vtRO}nA49q1{VvZ{_ox1vNQD)4 zEwBDgi1t?tnFD(kGbk7N_p*9jKbtOcC3RhRJq3H(wR}>AqgE}F4K+j?gaNn^bpgGn zCWjR!@m$nbb?P=SJ2(74p zbtrSglJjj}yg-e!Ek=R@^g~tLGHvUZRk&=#c|BSxg!|~~qn#5rQ?R`Lk?AdP73?&j zt7b(R&T!m|vQi7ucUAq)s6}b0rTcd&Ukio1xJ-v$#)ix)KY2;+M*#wAAg8112hLC9 zD7i#K+ePk5ka`|-F4VV?_FO1P(e#-)jF-=KpG%2d$qO@l_UQy#)2RuX&B@N}yR0h= z;6lW`eJr))Nd~o({@lXpazH?+uq=g()Q6^RDTY;s$VQ@~XSgzumqHFIyA3tnYEf6Fpy)>Jet zR!yE2wps2wlDdVrV}t?9CDGcGQ6uMa-ZL_Y0UO7$cQ{3FrHzA*P!KorgOd6=)z_08 zRn?xVa-X^@9UjF!E}QZX>7Rw-Yl1BK`8lNVoqW6_MtC z>?n2_$m#=Np0f-H7iy^+hh1cpR)^f!mnwBm%nD197Wo0T=p3*gsBSuaSt@QjSdy754x5d8H0dH1vD5_(+k)B_U>K!SQ#O`vZ z=n@WLHrg253ToG1B?vN~N%)jwp(|U&r1M40wi`+j(t<+~&Cr3G7ipW%nSPOwEQs%* zbdg}jJANyq#Ow#DN#6?a=s`dXut-Sk;zC%G?BY^j0U^NJ3I*!}jF9|)Kgxh8z<(fc zgNzyX3=2jg2Bz-I%Erd_fi*ur@91Q0ZSC%^MZyPQ<>uyQXWxZ^P>}}dU=xAr9fwUu z@j*sHasilU-}(FEF@ zj?n06S6-sqjI}i#4}z~>lX7xII5_rTAX4X_zkb1U2M%s7`~j#|3km(3&JysgDbsFT zT984|Jv>l1P%Q&(hfFB^Z}ikoI{yb(?-*W5*MyD6#>AS~wkNi2+qP}n$;7s8dt%$R zle3@i{eGNt`bS;Y?%ut+7phjTs{5`bL}$&m@%{B-GD6MDx@6fr!IJ*@-}6pS%f^k* zudh?Z!VqvPYHI=AK4tN#X~|-{(L&3l7)?W2pUtO7F&GwyH~B;OrPigQsY<3mL%w2N zU9N+I`uNlzRBeL@&$UH8JGFd)q%b+7akX-IXzcCnt)`Zyt=HjfVQ()_XG|uoYr_Pb znx1~@te~r_tF8Tc6P2E{;PW*YUS={%R`PwaUJD?_EwZ!Fy*#C`uSTGd@2EG4pIm=G zq*P+ip^xt@l=>-e=gP=TkH(VrS`yg^nNtv1t~_1vxOB7wuuD-#muroULK+6iFGhd` zn~RGJU?nLa5a6iy-42LTlLPs~NZxeAg=S{1Cnw(|W6^j7^mIEOg+yUoA^!Gy9!gcG z(a>1CH_y+~Qc-EvW_}6@r^@_FbQu9GhXEYlwWG1AsVTsU7C?5Nlt(8uDf?4VRYgNZ z1<`RhP(@sW#;s0W%@$T7!BDl@uf!}X)$Lrj3miaHIy$q~P(T=s zHP_tQT3TE@9XE5@6!6B=aTD@}8tUrl){)5%?Q7Yk+LQPFpkf#E zg%Yq^x=9ucLAvxudTKSg59(d+N~yVL7~1 z7VYxYJ*=>~ddTtXIj1v?{zv!*T3A`_6B`pVo=&e3Ho?co$FD2+AI_9*>m=3TLmu#d zEiis8meGQE`=S=Q(Q21Q!FDl|!(GfIZHvd3OQ>Wx+sb44O&u8S+zkl?P%)xA*l&Z@ zZ{UAPy@#0St#n5X0L3>hayf0_Zjt@_4Q$7e{0y z1xSHgIX(_{gFBB`_>&K3-V^XCdI_dppa-c$K-La`d;{0_mH3|ooc{k^oTBghOeA@L z1xRCG;B>wJEB|-r|L0tM^pXJNOz!{d$Nx$O$m6s(a6n0qJ2SOM zj_q5vNhi~$%vsZkMuyFr(FPmvcJ@X|BX-A4jU%So{SzixZ}l$h6v`XRsu>KH%7Mg?AEPUuTrL}R<&x~zy+2y z@@?MO@%wqh(G4x9c)xr6MDP9aj)J7G)nm?}cXRvtCIC1UV({=c*jH9s&3*_IoCP1O zdUx2dV-(Air)o_bu}1Iq>`z@gb7alBbxRk{&YZDr&!67yIsSnBta2lkmCZE8C2d(Z z?3gCWIH6&35p_#uDHu(WFTvHPBV;1x0i*-dL~bds^j`Q3|7 zr#`p5ZD4HOT$7!wz@nTYij5i8033Q09YJJ$q8mRB2F+Dt9CzlXY|h5^Vpa~zZbCLD+C1JW8bOi zspF|!8DU|TjA9TFum0Di`T4zz3u@$ufx*F}R~3M@0Fc}Oo*<8h<2{8{9e|GA$2hbB z{6dV#B;xVzYu9R?BPk1J`^~H@N3X0pQWv7n)9W3c#yC=w6F+xrW&q;gXe{n%s-Mrt z6~NQCb|sM~N=QVM`DSxns8y>lv9SR(Nw#Id z{ak>N)}Q=e&B|X{Uy|esj0^#sI>KEHstX5V`rh4HyKjeyFnryPujP3XlN^aC{Q|cZr?| za0Kf8*W1&ATuc;a^a(I)V7-8QbqRf1Xiq2q%DceB|L+gYf>cL{5n2Gxt*^p^LLea7 zkZ`Skatdox6Gn)rb;U(Msz@I3t4JVN1T?;4gz~L0lRS|nH+2Opa%v4K-_-Edeyr1f zMU#d9sz~zv<%<*&n5P*!qI~isWi-R7H@zdj3Uqs4eii!rpCgoS0s&)vc22^@3TLTo z#K$|?8-H{JxT0uK+et+kqqO=S8I1-FO(O^mRSR*qCX)LdQ{pWIVhIEqYZ-_2gNd-+>&NH4CH zHEJA*05uqz6r&So;-ILiJt--PU0#Zf5YA2_7ptr!MZ}Aa7 z`_%=WCZ&8tYAY8Hry|jgI6CC5=qV@6;!spvVOUXp%qDeGm80PGcluTrTltKg`4Q)f zKAP2KQF)PkkfW@^;ta?4ywS!(yFtn{UrgbkE_K}bfwg&Z}PV2+`qrB zz6vyYQQ0k4W}Cb4^hj~@jb)0d@g^QPBn6ZItB<6t>i786AsJ}{LNF5#52h>v9J^Xc zD+c-J>sYl`p^8dD4ISWH)2Ohpq1W8{@Z>~l)q3rPjRCVDH+TNLBH_|{W>07e{(%4Z zlBJ6{9v5eDQv4(>Ih>oj2&BK#*r9%%6wx+HOD?K{9a^dfEw$#?(rZ-b0*RcZybK>1 zQsM}TurR$E#a_X=#pSCa`}7)zS&&CgugM1j&O08KGH^9lPwVtUQ`@1nw{!hBqTZDM zeDSRt8naEaG33EQWi+q+0Nvv9zb2vHWhreVXRkt!Nmra_j(GTxIn7orwbz-hmSq;x z;yos*D>ZXz=V%$;oqDt3jHnt7k=)|xtn&|kof#}Q^sv0pVUs^MQYn1B`4t>7EV%$X z84^Ylz~K+JKbEu66;*yYhBBzt%J3W4xFz*N^Ld-+FR6e+WdUi<0Qk9u+2;HYr|UvN+995en=a$%HnNdopZ+2 zK9w74v#|JkR8dtdBVp9z7ZH)CMtZTd!u-6vOI~%7zL~R4HP%$cF_0C9diGaipL9@X zd2vtbihvX~oS$})m0k5$LS)4NYGlEEEe}{oLBXxtgcqs`xz-h^-o@|+*4DbduU!_a zYpf8^*|lA(K+k+=yS`0gCtdQgaSuxk+IQ97sq|oVDY6(`;s`N;DuAAYK}}6 zzT?=)ypE7Y#C^ZlY9ip(1onqRl7|yXe?>*P^XcpjjS>fp**oNObAp8O3vRwLe|EYl z43nOpg#*5>smAl)Y@ zD{+9=-M`%dbgLgPdGK*{jMLTm@K{FK1bSng1Qb-9Ko*PzEFSnfe&}#ygu$oFp~4v` zqm`Zek2Zwyo5w&28K%W-Gvc{Wl@O|%F6t6wz9k-dTG@cgrYpo2QBl%S-^fKT4@~71RsqdR48eBR&WE$jwb?#+aQcf?p zFSSTc+yAro*G{gGLRv+`FdsbZa*?VK=VGejtNPGva-AKveD-`gwT*dre)VGk3)`|n zDLGdt3D!TEOT?q4b0x7%*g0@DUJrCTaJZSR)A+3%Rb4xk`cmcRzGNafPGZFixtCBF z7k6NJnGyMiaR^|}w>!hADod{rNI<^|;o(2Kv~@kXxX%ykeoQ$eoXyBrH7|Jx$F89x zBX7yg;Rqj+bQAb%lolZgDi1JF?GFwNqWAa;xVij^*Te?f(iUFZ+Y4W?NrZ%YO)f=A z9w9I_3sNZzLK^E{xed-7=exW2AvxRda}>tY5RkqQ&dke1=-Hj?=2f#Eh3@iPtm^}2 zH?e>)PJKl9lg{5c8^HGEY)eRa(O+6L3-56+LH0!3=~qQkw_rbHXEQ3k=tNZZj7WZw zJF7nG0Ii`;2r5<2)w;-4Gfg?NSKl^zA`^{{YUJ!}EL*n(+oYbG|Go{WsYzY;itG)< zr9_?B*=Edm86KFsRe?_1vPJb$a|3GsGpTv0RO9EvVOg^iiv=M%Vb>c#3wYavS2RL& zsdjD396FCjC|-C;zgKqK=)=QXSXi+dog|_+k$nyHgt``0)i@Qk(TLdNzjS!e!sKH7 z(2n8i0b@K)o+R{Y@+zd4r~EpfR?A-k69)kVViy+)nTNSjhBh0KKbjE6*H#8M4h#R} z``I-0Ao&n+oE{oEDaQkAOetH%{^?O%iz6*T{I$fRODmfY+RUKAqDgV|93cU@&xsSB zO+IhK4|?;BL_V^ML~WxfgB&<~=M`D9?|A=XG@YWlz;itFYS5#*g-*S!i*34QlXoGz zqCCpBsvE(y_Td3S^Ian>FmsIpdfZtYU6o72C9imG+_8`}Zfai6ItQD9E@{ zn@>ONcQ#uk&1(EA2EC`n1ttgL`KBanXMLj_=b-M_cG2j&KhzA#NI3MAia_4Y` z_k#2#?cfsXs62{U0YeH%ky3uwy>)=YcVz*bL^JD>s;1mdr}#}*_dF?i zlC)c+pdD-xLKa9BK7_&%@w0PsW{bw)bs(qnE>3rdspjhgpG->JNYUJ=Bx)b2ik{I8 z$kysns9Ltn#1~Dywm)sBF9R=MCAFuOhokXX$XLN)*=F$Vln{4a0rQeCS4}bOvnb{X z828}V5rnx~C?ZhS@iaeq-ZJL%%jSr(YzV!wSV zn84+JgX106egyl=5di01TtC&pBYcsc2!p*?|DmUa_x2|P zU*)`n5pZCPi~(a^5>JY0X&T$D?Zj~+?}BmHA7hEY=K(2m0Ia9*=&r9s&=uu%Xn{gD zd#1bH6P#G!N(tRO39=#H3F>-w0+J4OJA%=nIbfdo)>p$zpv!(`)@?PC`1q)chezNK zOA~8oY(6^6E=s^LIel@xV|V(+Re*A!Ee`XzAsOYwY4h@dKNrBh3*6W;gY!u+7(G3hz4!&w&+Zh;`E2|A-^s=L&C#>_pk~L%x&g+E0mi4Zk>E^?v>8T867#}%#NO$c zy}kbG2J>yvYPD&fk=8|IL%RW=-tse$>l~dogFZg*P(=9d(1;^4a$7m&W;EQk9N!*V zaHRu@mg&(z%pfH4+C^m%Cak!FO&lAmqfr60@0YENl4?1AYbJw^0iL7_OZ%l^VEb>< zS#xxGiouc$G~ZO#Z&i4$>Ur+J7m!+yu7>)CA0ZjO{bW!g3%fxrxGk$aj*Tkyv(m~K z{SocW{ctf5eZ~MSNx%3NpTATkl&JHSzWWy$j)Mvl*%jk?Phx<&dmQZnS6>Mzg48 zTU=d}ANq#OOj^RV1T7y;Y6O0Jp`4-tk*VuswyQU|8OJDQ7N&>~8_mp*(nk5Sa(ED7 zNed^E8}_!;Tv8Sur(@x6UH?78$raYKH0l)a6a*X1N;dxwm^8(Ww}|31z|ittNopvVhB!#1??C!4>h_+TT|cQSqx6f%6&T^YXGkaNLD;`@*i&sk59~J zpiFRrnAbq5K>g=2nu1VIX$uYsT~#vsU|i&>%{shT?As%=2RN{YS^Rcr=mxAiRRq<~ zeih^xj4Y|Qz@JzjQb9`OKOzKVy-mS>A8a@8F1GjJQwxLN-{}K>oIGl3%ZNKpvZ96q zBP6sGbOTVZ8`nWK3>6JUdn5=w;oM_BtK;StzpE;|)#X>Sa@Kqa@3!|2RJ0INz3{1C z0_?fV@5EijEZ2fI*8~2geh<`?6jo8mDU35M&P(B?#VMmdFx5iiKY!~jxJi#8Ih_{D zL5Si#J9ctw*w{RlEC*yB_uP-v6pXZdjvQ|^yYQu?kZ*V6IGj9xXK8FSGW}`z$F|wk zcBdM7l4D%^`LOMlG}HYc-;K8U+fcixa*s;aNB zN1!sS)KW2|56wJR&d;9bxvMq!&C|Qe{sxAB=ZAAf)P$sMzsyr{EESy1O^+BWk14XY z8(X4LsZbzED$;#7u_du@sa=Nn)^MjqnN?2hD}@ z7r(m~!#c|ej>-G^diSY(%#c4ld5<=-S1}h636q{Yk8Xs^JU|FyCvZyw0~4~d7#>y) z4vyD)uej39q}hSy5S)4Zf51wE_2T2M3@H2EL4kN^<#DjYC>VB>UO_#HfFq00CKh+? z{Z;q;{PlqS>T2sAN^c>FmfULPr1h)2d=*y-bu%yI>c-w!9kjj4q`bnQuCSmN{Xl=!>C}1x zVb4&_N|%3Uul#jQy!4%)qMM(>3t8cfsBD8!d3zH9BQUP%GXO}z^YdTs;sUOP=h+w1 z&b4XV2C@-|!8xy+>CCczU4bfPSe0L}Acl6B0+BG`Fd*p3RDT0;i{Rk8Ux-vZ&1R-v zduOBf^0w&5OZ+2eyt>o8(m9<>kADxmU43ode0^qU>5Per0Kphj*`gsHn`~Z!gZ1&F z++X|^kF@J&m+;q9H*fCXz(nc_Kb#duDHh{a_D|8z3H5^{xc$}C@tAWipZ@C@VGd4{ z9?=nmPk{pnY>06g-D@bqh@e|ci2+=}y*ZostP=u~JcUyn`&QrNiYN_z-#c~yzli1! z2sjc4POl0Ug{w<<*Q}*RJT&My zY2`=;zMp*~JTgYPOIYkVQ-|VNG>x1LKQ3UjE_x0l2oq$OSiL@+kqkXWG-Kh^8T5@7 z$$@FX3Afhh-X!h6QQo%#Az7nncW)@&Dfl^R9@n+0z9Pgo9i}SDt{b2^GhrR+xQH%X ziO%ar&Yhc29dc(T?qzqkQS9HZyZ0#0WMwjQg9P#dI2WD2S3&Qrlk*rjKNq|0=ofia z-PjH5+a5zl+h<)foenEuF(3>JfDMZ1X|rZ1XieDcPp^n^c9DNUM@@es8lT~wS)W%{ zUQ*DR7Y8Whu53rqbvknXtgcPv0MXDHy&ZLI(Y3#}k%bypr9R$22ZrXJ*W{~7qu*6# zZ^eNr6Wst2y8yZ*a7j|gZTMy0U>y4z=gb!0x<4(l8jA9UDy9a6?#C^UGjn!gmT3(+E7zk~_jsNAM2SDlssfi=h9jh~yx(0irKoOdHB zv|tXP`5NqTd`%kAHyCWpWQJXWzqiEd>_Cc0U9oo4;&6-|}cDhZl75_XuCPr0&t@Y5J+i;3RKwt32Mj!9w$^CR+#QWD8=a=#Ln zn$Gx~5WsuiG#Bhq3{U6h*6BJuh14&9Z}0@_c|XtWA&V#i=F?vr-xEh{?xZ0n7Lhi( zG!APj`8*PkC^&yU_hTGzqyx9UVZN=DHNz~hz6e(^RZ{GwU)-}p#<rPUaM?_8SzxdL{U7w%<@2W?9Vi2xTf953a9E0D6u5gGfiy3<`X`_ zxe>Vhyoj}^#yhHY5C*kmXy6Fd=w=fb`Om9uX^iN{+yX|%Xw@Yt|C=$k1`hyBKg^5@ zoF5!eR-x0>{`#cfX*nipdvzb<4W6FGqS^VWPQD5ikL0P2B&qTNn$u~Pa=;@#QUGbS zIBMyH1^Y9Qo`O-5f&3RDg5ncwTzxy137wi0wMgXlzE`@yf5X=ZuREN;kAQK1m#Rt`+Oc(pdonKdbsH^{8}B&Jn;A{Y|k9uq5V7$=)?>bLcEr5JAf zc5=453pvA0nOKRB61_!zBqeMtC9J1z7QfdUOK*tkngZAv?D{O`nRs{6W=bc%fsXJz zma5jVl|7u@e|7b<%{&X|Yf%mvlzuJbLrbT44oE$=jLdCG?Q!Jioe?@4CVdK3zfwbV z-klhzYAXaE@!T!;zTg;FH*=e?)+PbOrJ~h*II)Va_z0H)8Frt^mrrQ>9==deyqZ7L}cn7Rp^#+wyUAq;}1MjMKhc91LCOQgPZ@fa#ojA!o}9K z8fKjn9@S*?nD>gKdL=qyWVuiOH(q77KcTICzFEP2pO7U{8kv(LcjUgG|<>G&~R!- z&oi{3Wxpj)3wzaXFniOb|3kqW86Eij(N$1j?ATgfR@Kw{$z*po%7&Z>r1!Fv(mgWm z@kZD2U1Hxjvo7H|3z_Bg$0mYo`DfKRSucD?>&NhKOT{H9^(7ybS8hNz2Ewvvwb4I>Z} zjGYGgr72Ay<@THNs7hZ(84+0P3eh==L-+NRS+d{uo_kqb_MlV{x=?W&1`5D5my)38 zJ+kq=0Y^Tc$2Jc!^KT0VTZ01B&He_jx1*zjhL#o)?~l2qCHAjh4Darel92!`vl}-Z z9fDu)Z(Q7Z98iaiu6`UN7SB*_z30U~f;jL{q+;Oh$8POam@yvb)<0l%;9}lBa-{oc z+d3td>>Z#;YY4`Af06N*E2~x*jvq$6{Pju!dmK>GdcB@9e!Dn19q_)s$nko-U#{hZ zLs?&#Ta^}AqEXaM*Q z@n>XobeHQDHXDGpfkCSYh6T4#U0n^J7Xbp7tD-%?994ydpc`VbzkyS`kKwmpi3wF` zNCa5o>r!%-ZyCA{yVRC#eY?{pN3hEVN>LSfgJG4hXZH-Bd#39Wk~d zRq$Ut+pbvcy4YVy>8KBKOkizI zkBp3=6JI?Z*w!V0|wUK)y1rRSEtLXpZ89^J2xfp{im;SUgL=Yjf~R z5|IBQduY!4^;Yc(&eM|}kba_myFCX`E|f@8PzYQ%xW~6J_ikTqM-`jVK}Ci03^u4*eiM2jZboEy7VtZCbuQ7 zR<`4vFyYo?&l986xlr|dzBguiWjvh~)1t{-@z~rf9obr1)64vxXo7HOl$?2CHEwc+ zi(b>HxR98%@K{^_$^XWVW=OY#>?Ii*;#ce7>hLGuc{pi2U3>L1H!_NX_xl0b#lVY; zh=7M`8~VD)$Vu`#Je|+uNser|r{U>Fv_C(u*}Qn(s%UOBof(SjdTRs(>}Fj)v>Tfn z%^X|M79V?ZxUG7JH>2ntuG?lk&>1?349Or{oN*2~91znMjbJ-t+u1= z0;H-+Yg#r9@+8!!W;Qi1q8nt`51v}rrWTiQlMZGVm$Z6J<{M<*S6>PI;O#*K^lwHy z5wp@_Vr0a{p;~~|@5GhO8u`8+l|G^FzVDAFH@9wG^Yim-`AYiFsSH#@nXHJ^W#m?c zcdU%v??-wO4>O4#f$ucyMu=g*J#;`c@3JRBtU29Hxxg^mb}HK<*uq6@)@Z-rr(Ryb z8pPeyhE-xWO$Mu?j1b+T9g3Ud_8i(@Ei?~OHjZp?g>-m`zl0cc8$8Ze@N*Rtk$ru? zMTSW!c+byI{kyBGtLU}cpgxh)83D=Yw>jzUE}v&-dA*)5+c8>3SzS}&m|WIB6zTSU z^mrd5>xplMim@TGhJr(0-(DFglY02W-^6Uckakbh58mdcB`7|FkpuBGug`=#sd>0+ zRnhX7W&&uz02x^<{=6u~a1J|VbuFLa=Q za)PKYj#R;!7U6W6GTP_H8_kGoO^P#MuvrjwKr--m`|^`AUIgV=lKbS12Dj$@8GC7D!mA}Tr9oT?HnS#JN;g8Z{P|DEe6U)Afk!lT&WI zTr2Y`qf?S^AEb#54IE0${G@uHGWP4r!Kl)Ym+oNk`y1jBuvk+VPK+skOlS{INWugS z3R*2q<3}btjR%(Hgj#;td!7{SOIT%iXcnLbylmh9yp=Myu3>?1t!1c%HN8Kr+*H)E zVSnsgl_%fGm~n?{{BE-fk`Pq?!&&b@Ff+pW&(bYCWQ){DDlY~d??QTO#g?;YV$6h+ z!Y1VEla%}TOlwM`&g6J11^e6y?MS(3NLYj-39RH!ChPmnIiU89asdo%Tr@j54z(8< z8Tk(nPri#m)&)?|CivmR)ReNke4nV3QzL-rBbns>d^ipePi-;eto7nMc%}$CGu*j~ ze)#ZD_N8{0<-uh+!-cm8Bcd@q$o!LRV{F? za-0_`Y?YK)h)k8X$VX`rhWJFYF@Lp^w!Re8`g7ogiS=^pGsavTcL!*f*^u9n$(EfjBF}y^Bl^Qx>vAx`L^^1XKRGD+d|9xM-e7#JD;b zDQ;P98gItZ-L0_UYrs^*>5)HD|u*n{)rz80v3f z??i4F0a@1Xzc{RIt^in8#)AWtTwb3Rzn||)wIJjqynV``W{4xS6e7Vzhxd!mGZIOq z&#X@O5i}R3?z6vvoz>ADAJKxEb(BU`-v0E;s#Q6?Kj8wq(^qm% z_T-`q>D6&eD`CUdZAf7@;Y6CDS;v~(bS`|o>-1o{*1KurTV}@*XB&8C8YQR%E>30w zpb_RCPXuh0O@EjP*pMH25>MU+A}3VazV0>3b)Yk-z$!T&Dlni{J{laQ4BQ2y~kje z+^=h~y;M0r+xD@z*9h3bwL2rBs$F1*$iP$wcsGE zKts~(w7cUjSs4jH6kmDB8*)Lc|D6C@ z|Bk<$msm!>xIyCVlrWXl6FS5-Rt?El!S^b{nT@*+f4dMPB9GEXY_0dAUi&qesmE}E zG8Ym$F4FWlDBOa(KF{z^)&AGCe}e7M*lI9jMhJO&idx3gOMMqY<+-}f@MVuD0X7ar z-w^KIi3o!CpXa$szP7|TPB4dhpTEU5oyZ27YclkS6*rp{&m--)CN%i(+thF5wiqAe z%A4-0IAV5^0t-UH!-WFy9~iR`S>BdJaN2IB3n)ZZke*2tl+t z>Tji#gbD$a96K&hWikI@4IL{;9udw-H*8c?+b z^yxRp@N>kXFrW6bGF1}RDJ+`Fd*;;$YW_S3)s#4{B7tu{=}ePUuSCwOV!U0fDEIWn zZ^il<8Ngn>1((Xqv#r(m9YO}D6t+NFHVoM~Ne zvUi}jlkIZ#*#=zPwIj?h)8a0!REZ^-nu~$(H_5%l(}*195t6(fWSr#Xn{>(8KD+f+ zR&cvu8{+zF1g=XCkWIF6rP4G=BxF6k24bsXw~%xh(0pp)z>oX`GZL7Hd=q#(W(+Ch zHipB9tQ>=p2#1Q4_dBK~5dj|#CKntSPRpC!v~A@j$t*g2Onfq^ub5PIs(n(I^%WS? z0U`!kxUQ?l*-V|Jkl1xVLaL~{wez7jpu%=Z{D=yNiim`rq>`wZR!wgfeDFG0tHkZu zu{VD^E~Ji;t77Ccs@t;aZpQyR{RrQrvm*(jm%QXRW?l4*Zgqg#Ge|hLIpR0zdIRs8 zCes#}{iZPpt?m7J_DZR#`d~0Zo`-v)u%)57q4K=|F^&nf9oz|ZWjLn@!2-n8 zsp5SnxeXmG=wUxL#cj3oW{trxG?)o>3r3|kXQ!VIkrBfX=I6*x%+L0#fIyOwsWkyp zctaSqgW0NZtqszsf6E;hEGyd@y}T{jx$dK44fm}~lL-fpp>ohqxTz4X2*)_n{?(ck za(+39N;8#I!9JYgMTlGg%C3qHyOK16qBD4Q%F^?bTE@Lky%s{#o(bs!DCXREX?l)G zE}QhGs#|;HetH`}+3#Ie0?1m6!J4oO)vT@g=ZJxEY@`qJyAPtq*NszQANJhPm^&~| zff5h0JxW7<-C>m+amZ7ESw1b0%gv2!)n=4@J z0oyGu>$rOj>a5nQ7Ta@xt+^)rnX|y53TaOp367 zMfV4Ma395MBL2xj%g4R&+hK(?a+~N#7hf(%(9fY~knxL@?$wgP_KlGiS8**^u0%Se zwFr}~9WD9?6KDs-tLk-?Skx&9Ydij_$T;*sM@B|RLrF+Zl~+{ItP@9EJ#n>M3ehK6 zf1fiyC=)}MXtI$zTT zW7>#!@e^dKKm*8^`n&C?ZFddBQ+3LWSbmI@wV+|*z(1J%i4Mn(sHJ1OIW1eBozuPs z88KDB$KU!CAQg7$e9bQ>I^V0?tv;!4zsVr4AOm=$AcD|}8N<23hYt6qzwJtwam_9# zjX9k85MK22FI&Yow3Hm%SvMnN45lSGPsMiTvkliZa5(35zJ67Y+KY!o*b(4gE(C(E zR%9BTRT0K2VD*wS%&@YIPC4PxG1i7aAIwaxOy;Kk%+9@7w%*&ydE%8&u{0b$3D=IX z*M}0C4VU!BonR+*lx%~{VyS(meIcuH&UmiB_#n?=c@H6wVgE-K~wVp?9@IJ|gR_Rmlmh%T7%JnZx-RJW{SUEHAG@LWw# z@Os@nNLvuNeUgGj)Z;FaF|~6{Pn_zI?jkCSkm(Ack-<@8B&BovfwGdy!o!z%B8RH+ z(Bt(94}MvkeO`r28Hbs_6;D(J$!g8<`3cP<1;az^B=3IKA>=dYOlT)8a-%tr*#V94 z3_dPu{q$64VR;8`8crFKYmXnVvWf>km5l6yopbh<%6(BDP9z2qQov0R_3~ZJbFcgy z>pGCH+o-O(y0^T&cF)94#>dS>Mvan%Tz&KJ>K-U+pY>LDfNH4tNFdQu85zJ*Rd=GT z6ik2&O3~@k-^0!DVae=BCA$}jXG(3zPS#OOGgwSE;1%5%8)ph|;z%%K%CetNvs}>q z;nnub;}>YG%{^el`A%QW?#HtxmF!CA09|`7qd{5oQip$8i|%3ctIRhr^_Ae3^rgO1 zBy=-5Y+=Ie(pJR-ASiH>`VQ@aOQe^#%p2}+DJ!++y&5F19xN4}Hok+e(Q$BnUX&FU z|Gjs5ZYq+Ug3a7j5yU`lSKKBB?GgN}Vn^0yQ&Z8C26Jukkt?OnB6a&J_YX^BheIgl z_Z>xpTQZMnZm%ef=T7JO3^U4p$ zb9I%4cDb)AxB?}l2AWY4gRGsb5KJ*h$UnBFU=hW;d+9kB-beS3Yq~PKIaBCn6|HSW zusq)Aot;IC6-}4_oU0|shi(?(=*TXta(%T{jB`wmZgHc=#h{vF>F!(5mD=uAI2&vUv}yjDO}47%SEg84H5)4l5s zOaB~20Ur#EK#P!nLaMsutBmqhMMqcsE#Ns=D7G};E;Ig=Q;b+K&>6-Bh2B5pwm)Gy z=jB{?nqqTEQVmW$8Jqm-ZoD`YHR347<~K819))IE z0tm9XTm3Hjj0J!xryK0211~rlJl{>84uP6SF_ck!l<#`%yN0tBLdU}7mOk|rCWAb# zTO6Yvg`3d8j)uSpvLz_Wsb*I4jL!U@(nb4`O73P``DO<#d9&ef!{ECeHwvYjD20n% zdKL_-7L@<#k&)5KzHR)#$Yz01WIzR?^HEiUvFq(cQlHbWtT(u%77q%h9Z+}I z>Jy%q+=8+6g_a|TXw_l3Wo~-~*hSKFw2Xl)bo8wK*7~6>+Z4EFa@HiOCW#&8d;h@$ zn8Xc8CrlW~O3oCDClg~^v!ZHIMg&nh%!)pA@yJ)uVLp2}Wb`@c()>~wN7SpMg$t4G z?jlS!An{0=?%!H?zx9w{L|}l`)Pdu*{ScW{Ob;5fOO&D1{5fert4=9~B>Ot9VNSKC zzu?OrUEsUVaj)@=ADPpMIe5*GrLT>dHPZV=ca&g;`t!&4RC-N(@Q3)H^-<8l81#6B zYtR6wPJvd)TtTX!*60Ki5mdZUDq#2dRUJ~}=Gare7gh~60l^1x`Yz9G@KR^Tev4@v z({hZ2i>a|D<2h-dHHPs7(Hd!3(PvwtACAVMG!37eH>QZC%<*d)0?8RhtHN~po4EQ; ztMm+|*NG)!4AW<$lZP|#T6aeb#9m)7MBa&$yop)8V6B_=zAW|BvG%QHfs<8la)*qt zyorA*hD;6W|6a3Vp9@P!$)-q|tG<&s%n4CE)q&fB4yow=py{pze}kdHXeuYxp7YS7 z+2dHBm7R)YD+(_T#1!5K%-nCsI+9nLY)zTC+9kFy#j|M9MUaJB^`L06X({Wex%Z^b zX|odYm=MZ<6RK!b6riezW>Zm0qJ`)Rf{X7P#cLokzwR7X9s~(E4i-6*pMX|Q!h&~< zaoQ%oyUb#(RMXSdQgEMe=g1tZ`#`^7Ql)I<9RvU~SrIUH|D*ii*vi->|G~ zu*4k`y`Aheasion(31V~=OBMwN^5J2uQhft&G!sHLV9q$)^gl*x+=!G5Gs%^z)wPG zuY#e|51`3^(0GmbpQ45!VViQ6@_xk(BT4)#j zFlEo8J)MB(>Id4{7{8R+Z!K=D3V{?t9$_t(SQ-#IcV!=8p)YJjG@4<2anEn61Lx6x zSN?7}23|3Rbl>qq6VZ^N@BBH7IiV9C(>EaitA@Rd)8cl2NC%iUUnHnlm`f_FSU$I} z7CUyK==lFOfdxRi9fj149`%0c3aev+jIXLPBc@AXY|n)|s(rJQ41mGOu&kh_jmNhW zP?6GBvqJ)_!9L>#^0)1c=oDG2m!La@2r*=+h?bvinTb!UyDrCJbKj0FqM$LSW3GOQRbbGf9&3dA#${(q|?SOL>oah?b`u-d6EssVriUvx|l*8TwUBcGWFw3kN==wL+wOW@1JqGZdd_l=o8 z-W#5d+SW;s7(NzyONh=aZ<(aN|7xcrAY7ztCqhYR#6WbMNYl9N(Nr%NeS<*4o148o z=*>rrWn1jOE;nvIsmoMMZ%)uRLC%pV%^b!7M>y`1c7oUfF2}dGGEksW=4$w}t}}pV z9RMK;f}Z6bCZb4VD$JD@B{q|pQ`8BYp!ugA;M)F4L!|h5A3cTFy}j_0prEqC#44;X z|D6Fw8ZdKXg`2;5a=Z+(aMX40Do!6Q*A&<)iW>-a0NzCKyoKyYx zIa>IAv4%HO8zlK}E)+G1^~~gYLK=wse{P*Rtjjn-zQV)9;N(7pHGiXP!gsD6K)(gq zP_iH86p)ZC;BAIUsaaRDcKxGbzkz0ih9FcOK#JyOAz{#gurW}lAjSS{L%9ekBPs}K zyYRXPJSgZK*t{|@HTI&Z$p_Zwa2?^88v(VoPJb~|j9ssLJEN&x3l1z#p+i(0R_}*Qbh^|{ zfGgn=O@)WdRZSA%f2RY>s>jB!|G=pasM8=a<8$p(+GUH)Ziz@}20h1Cun*M0>r1Is zFT6*iqo}+2nj8&l2x0h#!8}j zWe78AwNxKOrjRy~$}+nQJolWT2Sr{ghYj4BTA-sU^(@m`%X>3Pt7kJo5y*GHB2J$P zD!$E9yAUlh$P}6~)nfQ}U&RpdDm(^~f5`i8nRm!Duak|dRn10Koq2mxD%~OVEk3fj z!1m2}O2{TD9chF6g?1;u5m+`?sAkn#^=wk7`|Fb)L?czU%wr=KPxRt&^b{@tQenEl z{LD{WUU)n5q1t1N0G!5oG^t!Q6bz1sjh5gSPOQiCt%KTn`g1Hhhs(1bWF!s*T zl?3nJ?@T;#CN?IvZB1-z$F`kJY&)6Q$pjPIwr$(S-2R<&&--4iyVmXgV^?<{!X+gORx4UI-9I};Dn5jFTKiP@4lUwulkKL3j|x0ZQyA?={N6f( z@*^0B-`o3#=;s@EqEthjiNEd)dGze-Q_Rc|pP3&!GLIHN54 zZzkfpf&})2CBDs4@wB?bJVypHG3&%TH?r(GE4!SC$|ZPhtg|EIs0y{V>6pXZSYGXp z=mM>&E7S}O67d!{hu?JCWy+Ft`?`PnpzY!lbLPq!`tcA9+#^?g$!>(UW(J9Aw)ok^ z^wg~aU=wv(tiDBkrpgkz?c`T)KJdw3?(QsIEvo2K2b94TmDaZAkvwOHlhRLG_MylT zV5(KQJjHa2>#i+>)HVV;z07yO8ur9Y=lYVM>NndwnqE(TN5JJ35u`?1BbvE5BNdF) z_I=}CUpy`gO}0gE;LByggB>ExJoaG)r${7{|AC4CVTJSR7|CNln@>2OUt*xDdj%8d zGfZ=}ndr$HAub{kM-#}zG>NoN-#_Ps$&%fyprAA}@?Y7YjT{V2%^ftuwDC1^DyN@Z z!?l!!5}8gP_d7cJ_f)j_B-BK;l(@M#rTJvV-#@Aw6igN!qwS)dQ3z{#U4P}x8Oq^s zmON}?Gb7{0ADE8^FjC0H8sm~$;^gQU?YCOTui$MISxT{(IIu3)-W0ntv{SM3>vRW@ zi)PEC7!XTpDrSi+=N;l4Z@2fL1p_+Z*B8*2S_I8j!7Pm@*P{a%cl8gd`)oyDScTV@ zls3<{X&yWxic6MA+TgZL4sBstBDn*9{^!Mg6jYc&C?$e4EabO_ajka~Py@5T14X@- zuE$b-mA`H#j9#|y##FX9vU-ly-HWf^8cckPt`faM+p;1v1CNx`8y7fFZu=+0UNds4 zP@E2Dv$yFSsB1xUu7s)GA&A+Y+*oEcjNxv9`&5X{QvN=!8yfi`HNwY}Ku>BL%nigzrKb>X}CijL*|G z(`=nK>=^eAF?1+QH+E-lzZTxm{uc~;2=|D@sKbflAv_G_15_RFaSFSoZ>?o42vGs3 z&5Qi#faEsPbe8WhpKIr~q@}X-+P2;k-caI7@!K2%-fT_m%%$^Mfu=igm4&quK2}p@ zG4%0cwmuELtnyiRL)h)Vp-qo3VlH+Dymp(JXJMImS?zZRCF328*Y z2aLYC+V#?8q;t&7NOPKXI#ls2 zZ8%MFd->h{{`W!nCVN7!4WVwQ9zP`c{BUG^&Odcj7`frfqK|rce+%mvK}}+vkzdNL z>oGe1?HKliHly6G%toJMY}qC|_(^!}PcfGIdGpZsCV6!kT7Kg;?s?yhrx<>U-%M5R zdzwwrineKfO}In;7Nb(-w|hc%rlqG?vbw`dO^A#_HtLs6dT+nMPg|%g(Xk*?V*?nAL?EvjiP$?0 z%Y#mL(Ay`o_6UDeBE6H=UthDOdyWs?XNG4`OO;c?Q{SnLk^F6wQJ;E>Kwi~-{!X{Z zpz>SB6?12aMsz;;t(l|A<=&vSZV7Yca*gHXD|VyriFA7~0HD@tCm%4>rM7)%#|>Hz zn#%%*uqCm+g@y>iz~fW|0}J$dxVr#d6)upP%@-Z9_EwKFSkU=Q>nSd1u1#;OF0O6P zK!aD-wRN?*eQ8VSLkGY3h~EMq23PqCk*;pxa^oY;E>03;DxGEAylEuy`(mePTC2Qwni_xA@kEpV2 zG^2_)-pA!d+~m2%(f{xfyd|5bF6FI=MI@uA_>1yX?zk>7B+AT_Evae&B4m+`YJ=`D z;li2Mtz9HcAfloT8tPCfy43vYCl)(#R?V5@LSD((d*}Fpo!n2^>%(n*@9C-^9yM6C zP8M3Od*n9bK!Ps{` zqcI)a;G@tDl+XS2=dSi4>U&4cs~P#b;hrI3z$3Vzw0kH1K5{_ir#DXp4m5P@xy3xd ze~@Xl9?mtumzW=y$!1lRGb<_z2_b?f6!m+oBXQ|4Azq=d$Sv_IUnaI$fZ+Bh`ql5IA$g|_bY9>$OfxyNb;FWaW}o@x%z6=dAT zI-?_xe12uYkcAAOtT2$wq@~w^FthtoBlxS=!k-cBR~=5>yeY#ByS9-(b)HVQtc(?u zK0>r50T`_y1$gSCkm=zWyaMdJ{p4;UV0LV2@3 z$Y{2+FU)|x2w2EVY|aoy8f+LK|0OEv2Fvu~XLJ6kqN^`U4coa6*J!UkHViJ6$NBKO$Fr@3vE=;%?6r=8 zhnMo%UWvTe-Zlu@2Q0%cimK@jyxFXuLM?Ga3_wn+H6v-tHfqZl{J^fx2z`6<=Gow4 zXSq+cILVM5^2c=1Wn)7yF~O2{e*_6fynPM5`x^Sjq%H;4=kGo%Tya8I-`Z`d^qqGy z6pt%=9Kyw9d&8Q>rupZgUdSWQL^pkf$ayzYE;e!2SF-9V$OC^D`;kon&R@RWl#gxW zGn1J%WzkkD*`@xIbvC6C1-IJM$RBY3ZI?v91Yc_AoD-RC5#jtarnt zhHr!0>U|~5nrMetA*YV}&$C(uLxji(56~I3e6@laXW{f-?#*qjg0qoIbBgkK9B2y8 z7SgP_uUst2s7BZFQNx{8hc>YhaDUPlRqStZY!;O~Y1nQ#?@a+m88~*?lq#E`v5=i8 zkL`G&`Sjcm-QD{Z6trniXsU_YBCpR}q^$BpyY|M}JOkSs&K6W1?_J0&OW2T#To z9R{Gc)*Mv6N56EXn|b@AfSX0V1kn>r_fyP5`p93SQjVHNehY(*tmvlcPJ(o;8|TIB z?hNn?yjbdxyXMGp4c=-z=snGYqM7U`$YadO>e32fp=(FLCsy zjOkWIEShI5kS1KjDU$!brXX}s{`kY?2WvUJtm|Hm;+i^7VeE$DtJr?&{+RVOp8uQ^ zat+BwnNzTqgF03;#rFM_KI6|Kf0;PJ2;)D0JjUphKk|^Z9#NWNMLbfzrfDo-x+80-c^{5~`&-*8 zO1t>T`*p>QUdsrY8#`FKf}hiCgYq_9SXx5P>3bPwtiyIIafyJz}jfBTtuw{TPMf>!7uTh3<<&o_*OB+d6D+hp z1Eu>tQVWO#2=p-Z!H~WlXUITTNygv|;f_IeM~5l-D-X0}J#m&>N^z6V!M}JCQMcin zR&8nI1;gTiCxDHmsakdYL2KVXsaXSa#r(`W5Bt|8`YhHH(LMS!c(^GPk^12J%cS8! zw@LY|rXJ2`^8;ld5G@Eq${t36;AHi8GALdz^j}6M>0hLulDj=H7r{8)f7yoA8J`=R z3*zA?B#7SgbFp0G)z=-*QY~p6a0`jvN#aAoRVb)-;}?oD`G>0P{{HC12?C)38xSub zs0m2P2LuFMM~ePOnv)XPV7eqozwclIbT`QVNY4X8tBMK=$iDIaUuS0}2C4zQi?LJ& zP?v89ptcnU#AnF4y|lIEK|#vO%FTVa-6L`pi$lh<3-CR@TX62E8yOX(q%8jCaRcP7 zz`?Zm%#rE{nnN8IM@@K0)`0*%-_RV6Bg#?#t7bf8H_JC+VOb;?As|gImyUWg>~NjCgT(1Ya1LMxA0_0 z;>9b$*rB^PPVw1ym&%k&0IF-65y0Wj%F4o=l9Z7GZUW#)7{ulq(VLha)KC|}VH%+( zCTJ!rtuH)V-Ee3m&;D5pPo*EKr7pU^A5XhW)l8n|JZ?Y&D(u$%)ipIWfI|G?^3)UqAl5zL zl#rkVOc~=IE|!pO|1Pm zj%1#c%)@fQ^%X-6T~R@(eC+48U8R)8zaQ(Ys7$_gK4|mwg7w7&>9#xWB~llOu_$L4MF&i9(=V<%irQ+ zawevkjg60@BS5c_-|y2qPIhK_etv6fsyqn*oV2!iEkj{kT;NwqeVbmNogFPtdVPJ( z$jH!4{*GbD&dT~1q3iVYbR`g^q;m;qr&oP?Pt5c%@e>oD>fA>jd2_o)O}$=l>c_g{ zNp2ws@lJB8nH=olQ!=@-Rw!xhwRlu6djbD%L5gs)SzaSKp>9q~^EYS#AH(tD*KSD=nq;-QYhx-`?Ke z*7q6gnT!FZ!u{zb{mH`2+K2$-x0$CjQ@qDgL+dTPriOqjVNi1_B`$03u*;x!zJ+TkHI+EyMpY1b{ot=3L=si8#{e~jEp`e#_UWTc_PoQ%^;&C2S{05@G_ zvFs1KkBW+!ygSE@PftI%8E4_xV@c)M)VSK+HxA(Y3WqUmj7jg>RG-CdPjvhF=3D*z z00)qUEC!>n0n&rx^UG0ATU*;+k+s#r5TW0Az-Qb<&^OfUxg--WGVO0(d_qNN*AoDJ z{Xg=BS)fMi^vVD)ny*oU2z`r_&pd2SulE)p5U7>#;B2XS4Np}}!((!5s|$c)7>Ra% zJZhiW>{aWwnHKZq_`aT0YSuk3=gvk%L>x}#_|1*Y&dp7f@jX^80|NaNIo`b_%x_Ou zQ^0)V_tzHUh{0l0wJ9W6*c6r(E-pNAu_1|hvu=F1b*H1>x2U$^HD7y@e?6`D<>d+e zuBmZ*x>!S!&#J5_sSzMCob3-6$;#@drttD=Nnp_!1{u^>_sU*w;L2eum*$LDp7Zy@ zoWESpnsacB(sr|(Z+9%BOVb&!Om5Eg_2t%>m>;`RQ_#?4wka$(2^ikw5BxrAEB5j- zs;esiPh}G8Q__tgheGM=?JcdBa19Y~hKY{yMk*gPwa!H*AedB7OxNY3;HZ8y#;<%o z1?kyXTju8|qtDvUCljS6{@!Rf0hXH_O}TZvUDBV$$o}dh zo}8p)dt7U~RC<54dq)5MJ%A&jsCS!j+V|u20r*OUr0RKwPob(^^r~(*0UXt5&h5Sp zh_%l5TWNK5bxmQ6can3`qZQk%V@Rk#{*(BEB3Q!j-*gKB4d2aoum?+Kg?bnYmU>9??;e&wW5mzFOe%1j_=j^2F1orx`@^khr4TAitEq@Ic$)GIYm z@bGABnM8`3n}Lc&WwalX3r(YBO4{#7jTH3Q@Gwz+i{%1!HV=3EuDZaxA<|XUxXh@z z(^y&E(P|IFuEEaEo7`{P1DWH;i{`JZ9Q5?rCJd*zI2?AHh5;UclB8&Czw9l>fsLTS zPH(Ws3*@u3j=I4PN|d~$?Au)$6VzftXs*zXNN zGUes++Z%3|@CAq)1U{^6Y=81<0l>>|`^fE7hgOHZ;>E?rJo?F`oNQj~canUMst)kX z9Piz4YR%)5leM_s{|G}6#>S>7Jk4-?U7Ve@3ZnkCdjy@C|9yraMFHuXs+asS+}pjp ztP92TGBo_I(Z`e5`U>Hqs-OWwGp9#um6Zb$JmSDPuGZ-ghfjY05gPX~S;N?joKVcu zbEASr+F>-r^DSJ`JBXEy<4#C8Rr$S@%XcRmsDi00!faOlie+(_l&67i)`1lD0} zwo@|$snoY&Tg3~|nk~9}7>e1}`8t;A1dUJAHecx|> z!UB@iSy3@D#Xej{^?b{M^XZH%P2_xZ9jPiPXq56~=W<(*kB^6uFj0d~ams4%r=cJS z3K*4Zu}HX&iw~Ezue&q(e72e(IF+HXv*S_{>g#b)$HXc zMGd*`x|UwY8F`AzM$60NG#G_cULF|{fzYtu5eR)Vx1JQ8{eC!k07}s8HJ)Pd?mX)i z+kB}|tIE$`PW-}?sjX$76Z|vAanSfZpGtD$_4T=TBD5gC$p)_Iy6r1?NL%Y)S+H&c z9ADk`<=@%aUsnpe)w^y-X}~xb+OK=VGgjR;S1e4`Dc;4G|K`=kZ{p&$hj6Zg2SWWC z&dOo*1>?oXM-`cmJ6B%!h|@3i>D7!4Fhx?_z?M-L3SV;Fa~`P*sF*B1`>E%06`4Ty;A5-KE#~YM2Q^9bVXu2sIVE6kZf+J97M>+A%FUiAv zZ|1I1Ke579?{_c+GWU_CMw^?+U*-=!!q<}5(xv!BEZANBg)uQPK-TH*7Thf9W=(^f zo7Mvecy^W zZOn9(QAcceG*sNkJsALfgIsfb`4U%|gK#r8)))9Jq~ctCjrtgfIjAZ83T7sW{)^c- z;7jL5+mpXqmcg{S)fzUf(1;~d`8SD!gDJm*gOl(#R_rc)p{^ER6&xXka3^!!l!Zrtn)(??I2eP1TS2f?4u-J2rtpvLB^>-#(_pj4o}g@q1u2Yak5yY` zmg9rb+x`8Mj9Y@Yk2wii9QXr>1iX|5sS?BAnQI3bb~Cn95fWqVk@A!?w=vy}t${hR z%`k-MLDV-}ye;Pimdw68o<-E8FA~GB9%5^~s$o>+xzadPqTd zv#5fDK>fTh8wu*dX7c8Y`|7(w{Q}6mMl^i$b@*vY+C8mw7;OKr>O$L-ZDe8+CBLW6 za&vZYz>ui4FK&p$7utf)8`5lWo1GQ93fVPW_vF|fTC%(JubTljN-2ZI4ACebvdi~* z2YN6KwW7NX)!6Wy>x;1nAafh&AqWNTTr86g2FE-dL1n%CGV_y=POp7=T6Zw`-!R5E zbxG3{_;Z0bXD%Sbax+?(nzil zBE)`~*nC{4Z2Eqct)?yC%rSG2HH*QR3TNz5%onUj{l0dOJI-%&cQ|=el8Hb=RrEdM zN+3sZzu8Q$HvohTMQ9>}Y&48m4It8q)^^oR)i6+r%%(DuK?;KPlHL?M;|@kcV0=Sc z9ImMjpGWXnV9!_ueZ=x#(`m8t?TBWePNV(joUcyoiBBNOUzs!$9n{Coe+ZjuzmuGW zB8;c4G+1#w{^P!hTqRPKm0L7>JTKGJ6WuQ*%UR(U#0tZ!A@V1HJmch94g~3C>xr-3 zEvGT@+7_aDbYAmZ{ks4kL}S)VNii%$0M!{=pm+I}BY!7?B2um;V#H>jMAnD3$LhOw z*kq=KLPJ#$!SWl{UJJV6=Ct0SzR|!E!9i1paNJ>Iih>R-nTNm#a@_R3lO2l=bJ4T} zHwr6e#1A=2Ny7L{V3Kd1jmG6jfMspXH^<@bFwr9(VGH>^f&)twjLd!^L7S-77n~Ua za;C7Z;g{?ixkZJCEa*yKU$8(EZxTFp#_E;+zF3rQ&eNPuy&E_5D}XUSuQzTK=y5RO zyHZrs-3emTN`wxzCncdlf%{)Ytpbf7N6BWnn=za&_lLW@0A?CFr;<8&E%E;`F zhi7DjgowutEA%ZwRR1zHE@K~z1)m`0D`VYGhVn61WI%qj@9`lZzG#0A!vDEuV)=Kc>{XR~EKf(Vfp)Z>4$N3d?j8{^IXFG2B(iOqUzxO}D z*@r5{9Z*X8g)to2zc&wQZb;GlckhGg@YD^CYf{X4qL5eOe3asv!hq)~>?zChzr;mi zuYs8V&Ae6*LYW3?QM!&F&lnMU!Nbv+5fF03z%`FUgt$7^G_lLTuHz?%;O-rU*s#`W zY6m;2W1e+&Y()@9u^xdXwsEs{<5)XmS&q*Zv!XtT7|ajH8x~qTHuK+K7fL1`vt#L7 zFgN`q$cru|jM|^RMHMZDlP?9f<6;q@bJ}_m2Xr?gc2fa&`EKg}-TB|AcT@kr&i_9` z{*U+n$Laq|-2da_|7V2%33=MJ!gZHcTE!SKCmIbmR>Q!OwyI%eEo)gRo+p_|{i~b` z8IG80Sz!5lH<}bm0F$_meX1A?5s}i2kl=I#7@2=W*tmYMnsP-R8alESWbJtzLC1u# zXc|1_@$%i+$bRP2W!qKTQ|HsAhg(9P^MWrrCZ+&+5b|%~JcYuNk`feQVD0T@*#7=L z>v!QWxnEC%#l^+q!Z03tc^@P})4nLeFc$#y{yz@$E*RpV$4KP=?RXP|A+84nAu}Vs zsVXVWO2QCx2P>7y02@(I90$SY1vPPyUz?O7+JIjNMG*2TLqz`n8A(26#DB*`8Icd9 z^Iw-JR~i13n3y8kf2XL3CiVvGFnJ$<@BiiN{}#b*SLkD8{(lAhU%sY&fq*mredA(^ z^&sE|qomxX1UI6)Ce^npS{8v}qNfY<`R(cLjUm7JrbQjQijTI6i$6`EIumAG8XA`o zYis9&vS^i()02rTZq?+vhG0l7R-ux*WGS15Gd$-#>oS#ot(2Vn5;I00ZaJnHIl;ss z6@u?f89y2tF_^xq4P=leh8uFz)T=bk-xxI^fZT0e9Bx0YFQJ`S5n8p}guFz<`g z)849Zs1o1X{gJVG1$A{y6qKF4y})`vogj?v;o$*j)S)KX1MEd5rG(-aJNufB4*Z^r zwI-nPTVLsFZVp&%s7Xotx3&amXet1ktBfWa8yjE=umE)edJo{yjYPip$0%As^6}!1 zj<9c%Q{F9sAFtLjTw0gu{xZMFjdjLi?2F8BDW54FE6 z$i;lX!mTMN*i#dZGIUcUB_&y#*z(`h1&0^d%x5(Ub++1XTj zP38;yj>H#8xtJK#Bqw9z{YySCRXz1-rIs*}xUwaPlvy65;3MWxKTwEbRm z7e6lJ&`b}@esDH1nJEWt^Lir?jDHu5i~Gmh+4;U|qfPbjbGs*KcsLs9CXG;0F<`j5 zIi;GJX=`ej=fw7nCIg59_mwB)vJ2C#7q=-|D;h0&=d1C*e?ISuX5+^~LqiFrWZ78Q zeGfLywzvHcWy(K#=RkQ10MS{$ba!_bdD{vE+9Dkf-~?Eo=gml=CO6mDf{jmCTT@e0 zPxtrz_3Cnp=`Cfj7?6;W#%El!vmNa(cDO9=f^*h&0tGK z^cuB*rR_(`&!*LD_6B*ao1&M zXGOmHSSG`;=vS9!VZlOtz_fZWs#OZ0J0vIXrIEOQ_(MmB{G(aL1-ny-wyTU`Ul1lP za5)C+t{)in>q}=DrI`dZYXH4bG-PD|}`{wX?6ieijaIzdT zr&yVW-e2$odaA33*rBGLPTEeH>tCC`!M|qJ9IUus4AUC@$`*-!tUg zqK%aDTBl7xhHmO&%`G=I3gI3_T}|)x;_zy6axzRldwgnQ3{{pTQNq6RHO(;cSkTVy z>Xe4fu%AiXumI7*rW6%;m^N{59RgP!C}V`FW&kcV0t;MAMI}l##YOK75ihITPqXeOHz#99HI*NNz3lM+=#4Eu_RJxHGA>cjE9jk!cSX29@h@)td{5(G1YaQCfH&Co9=yyz=z~6 z(6nEx1t$+W%JC!Ufsk?<0qm5sY6~{2^^yaKVyks#Nbebp2EEM=d*ehAr|pi^Q7b}_ zH|cN8rsi2Zm(50i)d}NFsD#={O)X{C_kQN5Tz+Xfpj^bpdm@@{x%&*=4NUDSHj z`Id&P6s@{lCKic-BN_smi{ZBEQ8Eax_LZGlU_*sT$)HrVLXB2qBpon_&PD<&qNp2t zX%g;ey|t7I_&)CEs@rcP(#N7n=bR~}*v!V$zDjNg2PiOHI9+u-oi5gAQnw@_QdYlR zbqUnpMWEBHul8ixb-r|iBk{gp_eqvD+N>3GuiE_k{P^Ze)grgj>SD!jN~iny6f5vT z!Ztaw8QSDH#FXgfcY6X-R`z{-*>c=VB}aHRaqeb_&dm%#z%}*fyiSxjLzHHnK$nT~ zR5r3yVpkN9MB~EdwBHVZgxeQU8-ZWpBwc>Jug)nPY}(x7p|ABS>JQ~Wdfl%3un52F zXK*2&4TM6#;q$D&OJRjQX=fs!?c86-9(h-XD^v~5)e^%Z63;;ob8zl|^i?g>Nyjb& zj0iC-r;ESYFC6Ob?oZO$ruf%nTFn(3Upzlv5g275`1Xe6IqO8j@pwj`Z-CFAUc)Q) z?fGh}%W1PzfMg=YQkibsr^nGmHj6q=F`IzdRJw>0gI@c7#N)*k4l@J<@4t7gTrR)Q zfVv8Gw}Kl~@^yEkEnM4X#m{q%Cq%+c0APKH?L2Ur8z=coa_mz5alTxU<(GselL9u+qqk(qY1yumZQ*3AC8OJ8lgUH`EdxD zr!9d5bcE6d^G&cw-nVn70`X{i?N(<;Wj(NvIBA9s=fNn7B(sZEOahPn83^T7J>M4b zwZATF8*WHmrV}_RTmq@|+OC?J?4M`laYx5YMx)78iTf|pB3(}50l_%{2u$@m`iZ@2 zXpwZP1^q&qQki28zYpt4V%<@twwY_Im1nWIo>gZNB)U>h6r@ifSwpggtlH5$kJ(`* z#R0qNICvc5c(69B&Fp#Fs2Cr%YDc-FJ_p z>Ejo^7S9kSj%q)-0^CyRC&YH#RIi}o%EZd_)AgMYelLp^ZkEt zQYKKlaM;argW!KcRT_zC*Cyv!vQU#T+E-3ctCi|U8=OnX97#=g`S~gR;eJ|ovJ0)K zQoP7j80W}RnIxOZ?jne-tf=$r%W#66 zl-p99W1pqBC13;>cKprl!kp=}Rd2O)IVUgRLd?nNgX`!{!ilP=C`fbH_O1wK$g($Q zWBWTP#j{kUOv#o8<^6QIc5k!83q3n|0o(dlJ|)ure$3_AX5Y}zY4;(-=lUxA@%Q=J zN=+6n2Hn^o@~8mGLuM-7)_U-b5SRl&7QUDLL`g8%@XL7ccgOBrvQoIjgj*}v zh13#L8TuY>I_<{71;@;OnFjlxJ0h7njw58J`Jk%iUDzT=VzjkphXU#-LV;}Xc#M+U zRZX6Lnf5}AKty?ROrHDygSD(-WzEq+tw5E4*7fyG-N+r5N$wzBgb ztpZWbwqpys9Sa_nY@nj-P0ufQT$Lbox!p8d9MKVG3KjQs+dz41t*#ePY|gM54%-;E z5ZjY>%gDrZ+MQX|aiihN>-S*)bc+}LL{ z9-h7i(Uz)6)UPo3*1o2*-N%&~eFi|r(5RQ!d)%dbL#23ZucA1E(U&?Wxx?gTb2_Y4 zksdi2h?rfOrLioD`JGETEFxhWv7nzb*wcJ@HXbX_ubFv=nTYp*!?eqvUg6kKuIloG zR)L}1VeXKwmvnagWV_iNg|6%#J7@3T?7!ym7YPKT$6>WTIfMKcmf#Dgj!jo3tzU~YF0K2=LT z!1uVX9~x9$Im7nP%_A@=tR4|-PRTU3EE%^ew}sfwL%$#UbC7cdX6#G8upxF+ZlmXo zGtb-~t0pStV(wDyHg+aKOwOL^wpNi)NO?XsvrC=6Q}bQSLP2UgC9w1mwQHK?bV^+A z<*$3lfl^-@L<`=kzd-7Q2`C`q_23~>r}=Gq9O3^nGzNn$9TO!aB9eb+uH(tgH|JOX z+Wh)(Hb%U1t<1z&%J+U01L~e+IY=@^##Zau-Ueq zFQyGn%BO{{7pw5n7SAS&gQ|$Rl8oPj1a)=2Zw77^ebD83eQeFR=h|;ozFVOE(8=Ge z_sVcmK&*G)-Bwm^61SLd&$(}X$4~Qe`AO|-@%6~U&8};h z+>a4j+kxd?^n2bD6Gs900k_BP{&We@Wa?z)1c$Yn@}AV|mDc{})qO2nR(tk`;V>NJ z>W_eT6P+ZT?Lo7h+Bl0CBsyJQ_FO~*&ZViV;eO0RiNxQFWkBYVCr;jh6Su05Wwgas zz~qKv`VwdS-BBXh^B==M4wttN<)&Df-Ga4Ceq>+S6@C)7q8yLiRK*mmnuoUd(z%ts zFs3&=NoDI@<8iP6MuHi?(ioE{2MP}4YW#rO>)}1jyM@W$ZKbfwOfIXe*Ty*BK3lj5 zXB@d*R8gHiZw~VIDbaXbu)eZWStzFR{|x^mCHxs{*#0KCyg&j?&T5e+35D41(cAy? z3v40d!<*OHpFsN7>-_cS27|uHA#`e$z4N;Gtw1C`(!NTuNIeNftVY5f9_W$A8>iC+ z~%$QUoY)j4qtU#Y|pDrQ0_jtV}va8a;02j~Ha;u83(xAX` zj!ZhGl>yoi$M?eHf$eE`%h*VHs}M^~Sw>BO?*PqPvX2W~)k(id+fB>zyxHNl@Cc2T z^GXGqluElCTDb=b9!o;9EtqAGz#E3(Zz)wKiwq*p%CDNMXpXbRvftaO)r3T5M@zpBXXJaBAQsuqN_`SY9AJP$@Q zD0bjrYumFNI87Oi?3z7JojaVhZ<7Fn-#iFGsZmY<3B-t9)>qQ2+% z#%Y?*j$^Zc`JQmH_VJZW0OOS5CkD}rEa2OFdL5pL(1VIlw=~tw`AP$I8W?mEh-G?C zmw#>+d+(I?+9L0O$r&T{Nq6G&!_lB2OzQi=OuJfnow_kVVTuv2+==yOjI&?6Sj*tybb;OJ*+LHf*(6(b zfPv=Fz9l@30ew1zjB5%=7 zs#b;9@`)eOyCD($u}DknwCu`ef|{y7seATAV0|IzbCRpqv}3nl1KJ z|EVAh^e|N+FIh8Wuf761h+&8+J^dsm$A@n8aJ=~gy^CBv9jDl?+n83uLi1cJUUIz3 z(6d!(Ai^A+PLVf}Tt07b{G{cYCXjFcX=Ty90vyq8%C3V_s2wrK!&kfARLG{rTSFoud%qq@dA4}j_jo%fi3}D?fWPedFgPm$zz@t zZGz`yACWOzSyGAUqR#^3Y_G2G@2v+Z+MEr2h!W>yAswK`trIGYpX|goW3E_Q@}Nvu z2{wUds3oDUmkES_P`>Cq9V$CHsWQ9a0yODd^`_a+Y)%>zsB(1a8OseVHx;fE8P_!1 z{74qaj7G>7bl%)!O4K}FOuyhOXw{DVB7Ty8ts~HnC(E)Y%s7I3zvVc$%`;!Ij_YaK z#w0^i>*!H3R0;vBg47#-W>pRVJ=4BN8lB}w(&y**K2lL{!DbR9guneoF5Jb09DIYq zwEvRYHI@jbtS@5%dm>zK@EGcB@hoQ0oZ98OlZzomg3zT?+G%agT)T@j`EwL%u^E$X z1Yi^h?WXoJ3XM=(cgSClU5uMA56IJvxTRZi%!(>V21;O9f2(g^QHYdesMr<@2GIsU zhl4yp%EM~eQGS>@_Cl-R$=<C!c~?-_t12BvrAts!u6Jry)g`z7NdN&zd zN{C5mG@c)x{JcG`p7AZt4}^x11U`2aZpP#-8N%p=Owh)oL25AjDaKL-d-t6)g(vq( z{D0L9zynu9LDdicT1cWhzO3*N;$MFYZ*@6472UuD(*#@bOpo#a>xquiFH_*HI18E-rX$wf-~lc4MTBA2lnwhaZ;7m-ZkXW#p6tGk+D ztD7OweFBHAc}F8kj_)8;1@TGrpl%WjVVpNB_G_2UrT+Eyn#b{S;&y5Y8a9-Dh@#Q1 zDPimT-?2CaYTsX^G0E*NQti=|&dkoEcd@hp9h4W2-*FGKAfC=@p+YrL zz+B;(^_>}OL0z|58ZGUv*0AOF%l%T<kvzi0*$gcCo(cV8wvFxrQ|PF5#> z56UKg-mE)KE*!2>XZ1tV&!|a35;_DxgDv-^nQfSyHQKQ6oG4GdI?%0D6~1LH>ENm6 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

D!I1{Rz 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≈kK5r4!2Copr|{}UV54CsWxJ_fI742yP3c!t+r{T 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

jh85;|DNbP7O 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 Date: Sat, 18 Jun 2022 09:17:16 +0800 Subject: [PATCH 147/251] docs: update documents --- README.md | 378 +++++++++++++++++++++--- README_zh.md | 405 ++++++++++++++++++++++---- examples/bar_chart/main.go | 2 +- examples/charts/main.go | 2 +- examples/chinese/main.go | 2 +- examples/funnel_chart/main.go | 2 +- examples/horizontal_bar_chart/main.go | 2 +- examples/line_chart/main.go | 2 +- examples/painter/main.go | 2 +- examples/pie_chart/main.go | 2 +- examples/radar_chart/main.go | 2 +- go.mod | 8 +- go.sum | 15 +- 13 files changed, 695 insertions(+), 129 deletions(-) diff --git a/README.md b/README.md index 7affa30..a58adb4 100644 --- a/README.md +++ b/README.md @@ -21,35 +21,19 @@ These chart types are supported: `line`, `bar`, `pie`, `radar` or `funnel`. ## Example -The example is for `golang option` and `echarts option`, more examples can be found in the `./examples/` directory. +More examples can be found in the [./examples/](./examples/) directory. + +### Line Chart ```go package main import ( - "os" - "path/filepath" - - charts "github.com/vicanso/go-charts" + charts "github.com/vicanso/go-charts/v2" ) -func writeFile(file string, buf []byte) error { - tmpPath := "./tmp" - err := os.MkdirAll(tmpPath, 0700) - if err != nil { - return err - } - - file = filepath.Join(tmpPath, file) - err = os.WriteFile(file, buf, 0600) - if err != nil { - return err - } - return nil -} - -func chartsRender() ([]byte, error) { - values := [][]float64{ +func main() { +values := [][]float64{ { 120, 132, @@ -59,6 +43,18 @@ func chartsRender() ([]byte, error) { 230, 210, }, + { + // snip... + }, + { + // snip... + }, + { + // snip... + }, + { + // snip... + }, } p, err := charts.LineRender( values, @@ -72,15 +68,323 @@ func chartsRender() ([]byte, error) { "Sat", "Sun", }), + charts.LegendLabelsOptionFunc([]string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", + }, charts.PositionCenter), + ) + + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### Bar Chart + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + values := [][]float64{ + { + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20.0, + 6.4, + 3.3, + }, + { + // snip... + }, + } + p, err := charts.BarRender( + values, + charts.XAxisDataOptionFunc([]string{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + }), + charts.LegendLabelsOptionFunc([]string{ + "Rainfall", + "Evaporation", + }, charts.PositionRight), + charts.MarkLineOptionFunc(0, charts.SeriesMarkDataTypeAverage), + charts.MarkPointOptionFunc(0, charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin), + // custom option func + func(opt *charts.ChartOption) { + opt.SeriesList[1].MarkPoint = charts.NewMarkPoint( + charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin, + ) + opt.SeriesList[1].MarkLine = charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ) + }, ) if err != nil { - return nil, err + panic(err) } - return p.Bytes() -} -func echartsRender() ([]byte, error) { - return charts.RenderEChartsToPNG(`{ + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### Horizontal Bar Chart + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + values := [][]float64{ + { + 18203, + 23489, + 29034, + 104970, + 131744, + 630230, + }, + { + // snip... + }, + } + p, err := charts.HorizontalBarRender( + values, + charts.TitleTextOptionFunc("World Population"), + charts.PaddingOptionFunc(charts.Box{ + Top: 20, + Right: 40, + Bottom: 20, + Left: 20, + }), + charts.LegendLabelsOptionFunc([]string{ + "2011", + "2012", + }), + charts.YAxisDataOptionFunc([]string{ + "Brazil", + "Indonesia", + "USA", + "India", + "China", + "World", + }), + ) + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### Pie Chart + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + values := []float64{ + 1048, + 735, + 580, + 484, + 300, + } + p, err := charts.PieRender( + values, + charts.TitleOptionFunc(charts.TitleOption{ + Text: "Rainfall vs Evaporation", + Subtext: "Fake Data", + Left: charts.PositionCenter, + }), + charts.PaddingOptionFunc(charts.Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }), + charts.LegendOptionFunc(charts.LegendOption{ + Orient: charts.OrientVertical, + Data: []string{ + "Search Engine", + "Direct", + "Email", + "Union Ads", + "Video Ads", + }, + Left: charts.PositionLeft, + }), + charts.PieSeriesShowLabel(), + ) + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### Radar Chart + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + values := [][]float64{ + { + 4200, + 3000, + 20000, + 35000, + 50000, + 18000, + }, + { + // snip... + }, + } + p, err := charts.RadarRender( + values, + charts.TitleTextOptionFunc("Basic Radar Chart"), + charts.LegendLabelsOptionFunc([]string{ + "Allocated Budget", + "Actual Spending", + }), + charts.RadarIndicatorOptionFunc([]string{ + "Sales", + "Administration", + "Information Technology", + "Customer Support", + "Development", + "Marketing", + }, []float64{ + 6500, + 16000, + 30000, + 38000, + 52000, + 25000, + }), + ) + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### Funnel Chart + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + values := []float64{ + 100, + 80, + 60, + 40, + 20, + } + p, err := charts.FunnelRender( + values, + charts.TitleTextOptionFunc("Funnel"), + charts.LegendLabelsOptionFunc([]string{ + "Show", + "Click", + "Visit", + "Inquiry", + "Order", + }), + ) + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### ECharts Render + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + buf, err := charts.RenderEChartsToPNG(`{ "title": { "text": "Line" }, @@ -93,25 +397,7 @@ func echartsRender() ([]byte, error) { } ] }`) -} - -type Render func() ([]byte, error) - -func main() { - m := map[string]Render{ - "charts-line.png": chartsRender, - "echarts-line.png": echartsRender, - } - for name, fn := range m { - buf, err := fn() - if err != nil { - panic(err) - } - err = writeFile(name, buf) - if err != nil { - panic(err) - } - } + // snip... } ``` diff --git a/README_zh.md b/README_zh.md index 2d16b04..0e883bf 100644 --- a/README_zh.md +++ b/README_zh.md @@ -21,53 +21,44 @@ 下面的示例为`go-charts`两种方式的参数配置:golang的参数配置、echarts的JSON配置,输出相同的折线图。 -更多的示例参考:`./examples/`目录 +更多的示例参考:[./examples/](./examples/)目录 +### Line Chart ```go package main import ( - "os" - "path/filepath" - - charts "github.com/vicanso/go-charts" + charts "github.com/vicanso/go-charts/v2" ) -func writeFile(file string, buf []byte) error { - tmpPath := "./tmp" - err := os.MkdirAll(tmpPath, 0700) - if err != nil { - return err - } - - file = filepath.Join(tmpPath, file) - err = os.WriteFile(file, buf, 0600) - if err != nil { - return err - } - return nil -} - -func chartsRender() ([]byte, error) { - d, err := charts.LineRender([][]float64{ +func main() { +values := [][]float64{ { - 150, + 120, + 132, + 101, + 134, + 90, 230, - 224, - 218, - 135, - 147, - 260, + 210, }, - }, - // output type - charts.PNGTypeOption(), - // title - charts.TitleOptionFunc(charts.TitleOption{ - Text: "Line", - }), - // x axis - charts.XAxisOptionFunc(charts.NewXAxisOption([]string{ + { + // snip... + }, + { + // snip... + }, + { + // snip... + }, + { + // snip... + }, + } + p, err := charts.LineRender( + values, + charts.TitleTextOptionFunc("Line"), + charts.XAxisDataOptionFunc([]string{ "Mon", "Tue", "Wed", @@ -75,16 +66,324 @@ func chartsRender() ([]byte, error) { "Fri", "Sat", "Sun", - })), + }), + charts.LegendLabelsOptionFunc([]string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", + }, charts.PositionCenter), + ) + + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### Bar Chart + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + values := [][]float64{ + { + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20.0, + 6.4, + 3.3, + }, + { + // snip... + }, + } + p, err := charts.BarRender( + values, + charts.XAxisDataOptionFunc([]string{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + }), + charts.LegendLabelsOptionFunc([]string{ + "Rainfall", + "Evaporation", + }, charts.PositionRight), + charts.MarkLineOptionFunc(0, charts.SeriesMarkDataTypeAverage), + charts.MarkPointOptionFunc(0, charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin), + // custom option func + func(opt *charts.ChartOption) { + opt.SeriesList[1].MarkPoint = charts.NewMarkPoint( + charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin, + ) + opt.SeriesList[1].MarkLine = charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ) + }, ) if err != nil { - return nil, err + panic(err) } - return d.Bytes() -} -func echartsRender() ([]byte, error) { - return charts.RenderEChartsToPNG(`{ + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### Horizontal Bar Chart + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + values := [][]float64{ + { + 18203, + 23489, + 29034, + 104970, + 131744, + 630230, + }, + { + // snip... + }, + } + p, err := charts.HorizontalBarRender( + values, + charts.TitleTextOptionFunc("World Population"), + charts.PaddingOptionFunc(charts.Box{ + Top: 20, + Right: 40, + Bottom: 20, + Left: 20, + }), + charts.LegendLabelsOptionFunc([]string{ + "2011", + "2012", + }), + charts.YAxisDataOptionFunc([]string{ + "Brazil", + "Indonesia", + "USA", + "India", + "China", + "World", + }), + ) + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### Pie Chart + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + values := []float64{ + 1048, + 735, + 580, + 484, + 300, + } + p, err := charts.PieRender( + values, + charts.TitleOptionFunc(charts.TitleOption{ + Text: "Rainfall vs Evaporation", + Subtext: "Fake Data", + Left: charts.PositionCenter, + }), + charts.PaddingOptionFunc(charts.Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }), + charts.LegendOptionFunc(charts.LegendOption{ + Orient: charts.OrientVertical, + Data: []string{ + "Search Engine", + "Direct", + "Email", + "Union Ads", + "Video Ads", + }, + Left: charts.PositionLeft, + }), + charts.PieSeriesShowLabel(), + ) + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### Radar Chart + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + values := [][]float64{ + { + 4200, + 3000, + 20000, + 35000, + 50000, + 18000, + }, + { + // snip... + }, + } + p, err := charts.RadarRender( + values, + charts.TitleTextOptionFunc("Basic Radar Chart"), + charts.LegendLabelsOptionFunc([]string{ + "Allocated Budget", + "Actual Spending", + }), + charts.RadarIndicatorOptionFunc([]string{ + "Sales", + "Administration", + "Information Technology", + "Customer Support", + "Development", + "Marketing", + }, []float64{ + 6500, + 16000, + 30000, + 38000, + 52000, + 25000, + }), + ) + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### Funnel Chart + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + values := []float64{ + 100, + 80, + 60, + 40, + 20, + } + p, err := charts.FunnelRender( + values, + charts.TitleTextOptionFunc("Funnel"), + charts.LegendLabelsOptionFunc([]string{ + "Show", + "Click", + "Visit", + "Inquiry", + "Order", + }), + ) + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + +### ECharts Render + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + buf, err := charts.RenderEChartsToPNG(`{ "title": { "text": "Line" }, @@ -97,25 +396,7 @@ func echartsRender() ([]byte, error) { } ] }`) -} - -type Render func() ([]byte, error) - -func main() { - m := map[string]Render{ - "charts-line.png": chartsRender, - "echarts-line.png": echartsRender, - } - for name, fn := range m { - buf, err := fn() - if err != nil { - panic(err) - } - err = writeFile(name, buf) - if err != nil { - panic(err) - } - } + // snip... } ``` diff --git a/examples/bar_chart/main.go b/examples/bar_chart/main.go index c9f1d58..c559a76 100644 --- a/examples/bar_chart/main.go +++ b/examples/bar_chart/main.go @@ -5,7 +5,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts" + "github.com/vicanso/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/charts/main.go b/examples/charts/main.go index b370b69..0e1d48e 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -5,7 +5,7 @@ import ( "net/http" "strconv" - charts "github.com/vicanso/go-charts" + charts "github.com/vicanso/go-charts/v2" ) var html = ` diff --git a/examples/chinese/main.go b/examples/chinese/main.go index 13724aa..bb7cc00 100644 --- a/examples/chinese/main.go +++ b/examples/chinese/main.go @@ -5,7 +5,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts" + "github.com/vicanso/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/funnel_chart/main.go b/examples/funnel_chart/main.go index 6b17614..8f21db6 100644 --- a/examples/funnel_chart/main.go +++ b/examples/funnel_chart/main.go @@ -5,7 +5,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts" + "github.com/vicanso/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/horizontal_bar_chart/main.go b/examples/horizontal_bar_chart/main.go index 6b206b0..8b996b6 100644 --- a/examples/horizontal_bar_chart/main.go +++ b/examples/horizontal_bar_chart/main.go @@ -5,7 +5,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts" + "github.com/vicanso/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go index 435da78..45ff894 100644 --- a/examples/line_chart/main.go +++ b/examples/line_chart/main.go @@ -5,7 +5,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts" + "github.com/vicanso/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/painter/main.go b/examples/painter/main.go index cf2bb81..304361d 100644 --- a/examples/painter/main.go +++ b/examples/painter/main.go @@ -5,7 +5,7 @@ import ( "os" "path/filepath" - charts "github.com/vicanso/go-charts" + charts "github.com/vicanso/go-charts/v2" "github.com/wcharczuk/go-chart/v2/drawing" ) diff --git a/examples/pie_chart/main.go b/examples/pie_chart/main.go index 8a98e57..3721ed1 100644 --- a/examples/pie_chart/main.go +++ b/examples/pie_chart/main.go @@ -5,7 +5,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts" + "github.com/vicanso/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/radar_chart/main.go b/examples/radar_chart/main.go index 9550951..51f7409 100644 --- a/examples/radar_chart/main.go +++ b/examples/radar_chart/main.go @@ -5,7 +5,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts" + "github.com/vicanso/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/go.mod b/go.mod index 610af22..66145c7 100644 --- a/go.mod +++ b/go.mod @@ -1,17 +1,17 @@ -module github.com/vicanso/go-charts +module github.com/vicanso/go-charts/v2 go 1.17 require ( github.com/dustin/go-humanize v1.0.0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 - github.com/stretchr/testify v1.7.1 + github.com/stretchr/testify v1.7.2 github.com/wcharczuk/go-chart/v2 v2.1.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + golang.org/x/image v0.0.0-20220617043117-41969df76e82 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index d88f473..5f953b0 100644 --- a/go.sum +++ b/go.sum @@ -8,18 +8,17 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 h1:LRtI4W37N+KFebI/qV0OFiLUv4GLOWeEW5hn/KEJvxE= -golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220617043117-41969df76e82 h1:KpZB5pUSBvrHltNEdK/tw0xlPeD13M6M6aGP32gKqiw= +golang.org/x/image v0.0.0-20220617043117-41969df76e82/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From d3c6649cd9e152daf3f6a7ea0780825db2695c17 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 18 Jun 2022 10:38:46 +0800 Subject: [PATCH 148/251] test: add test for axis --- README.md | 2 +- README_zh.md | 2 +- axis.go | 7 ++- axis_test.go | 129 +++++++++++++++++++++++++++++++++++++++ examples/chinese/main.go | 5 +- examples/painter/main.go | 6 +- legend.go | 2 +- line_chart.go | 2 +- mark_line.go | 10 --- painter.go | 4 +- range.go | 10 --- series.go | 6 -- 12 files changed, 145 insertions(+), 40 deletions(-) create mode 100644 axis_test.go diff --git a/README.md b/README.md index a58adb4..8183871 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ import ( ) func main() { -values := [][]float64{ + values := [][]float64{ { 120, 132, diff --git a/README_zh.md b/README_zh.md index 9c0be5b..fed2d61 100644 --- a/README_zh.md +++ b/README_zh.md @@ -32,7 +32,7 @@ import ( ) func main() { -values := [][]float64{ + values := [][]float64{ { 120, 132, diff --git a/axis.go b/axis.go index aa7cf7d..00a3332 100644 --- a/axis.go +++ b/axis.go @@ -81,7 +81,10 @@ func (a *axisPainter) Render() (Box, error) { opt := a.opt top := a.p theme := opt.Theme - if opt.Show != nil && !*opt.Show { + if theme == nil { + theme = top.theme + } + if isFalse(opt.Show) { return BoxZero, nil } @@ -121,7 +124,7 @@ func (a *axisPainter) Render() (Box, error) { tickCount := dataCount boundaryGap := true - if opt.BoundaryGap != nil && !*opt.BoundaryGap { + if isFalse(opt.BoundaryGap) { boundaryGap = false } isVertical := opt.Position == PositionLeft || diff --git a/axis_test.go b/axis_test.go new file mode 100644 index 0000000..fe7f874 --- /dev/null +++ b/axis_test.go @@ -0,0 +1,129 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestAxis(t *testing.T) { + assert := assert.New(t) + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + // 底部x轴 + { + render: func(p *Painter) ([]byte, error) { + _, _ = NewAxisPainter(p, AxisOption{ + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + }).Render() + return p.Bytes() + }, + result: "\\nMonTueWedThuFriSatSun", + }, + // 底部x轴文本居左 + { + render: func(p *Painter) ([]byte, error) { + _, _ = NewAxisPainter(p, AxisOption{ + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + BoundaryGap: FalseFlag(), + }).Render() + return p.Bytes() + }, + result: "\\nMonTueWedThuFriSatSun", + }, + // 左侧y轴 + { + render: func(p *Painter) ([]byte, error) { + _, _ = NewAxisPainter(p, AxisOption{ + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + Position: PositionLeft, + }).Render() + return p.Bytes() + }, + result: "\\nMonTueWedThuFriSatSun", + }, + // 左侧y轴居中 + { + render: func(p *Painter) ([]byte, error) { + _, _ = NewAxisPainter(p, AxisOption{ + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + Position: PositionLeft, + BoundaryGap: FalseFlag(), + SplitLineShow: true, + SplitLineColor: drawing.ColorBlack, + }).Render() + return p.Bytes() + }, + result: "\\nMonTueWedThuFriSatSun", + }, + } + + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} diff --git a/examples/chinese/main.go b/examples/chinese/main.go index 9c2d6a5..bb7cc00 100644 --- a/examples/chinese/main.go +++ b/examples/chinese/main.go @@ -114,6 +114,5 @@ func main() { err = writeFile(buf) if err != nil { panic(err) - } -) - + } +} diff --git a/examples/painter/main.go b/examples/painter/main.go index 304361d..3c31ce4 100644 --- a/examples/painter/main.go +++ b/examples/painter/main.go @@ -430,7 +430,7 @@ func main() { Left: 1, Right: p.Width() - 1, Bottom: top + 30, - })), charts.LegendPainterOption{ + })), charts.LegendOption{ Left: "10", Data: []string{ "Email", @@ -449,7 +449,7 @@ func main() { Left: 1, Right: p.Width() - 1, Bottom: top + 30, - })), charts.LegendPainterOption{ + })), charts.LegendOption{ Left: charts.PositionRight, Data: []string{ "Email", @@ -470,7 +470,7 @@ func main() { Left: 1, Right: p.Width() - 1, Bottom: top + 100, - })), charts.LegendPainterOption{ + })), charts.LegendOption{ Top: "10", Data: []string{ "Email", diff --git a/legend.go b/legend.go index cf8d417..65db102 100644 --- a/legend.go +++ b/legend.go @@ -92,7 +92,7 @@ func (l *legendPainter) Render() (Box, error) { opt := l.opt theme := opt.Theme if opt.IsEmpty() || - (opt.Show != nil && !*opt.Show) { + isFalse(opt.Show) { return BoxZero, nil } if theme == nil { diff --git a/line_chart.go b/line_chart.go index 0dc0fd8..f171813 100644 --- a/line_chart.go +++ b/line_chart.go @@ -66,7 +66,7 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( p := l.p opt := l.opt boundaryGap := true - if opt.XAxis.BoundaryGap != nil && !*opt.XAxis.BoundaryGap { + if isFalse(opt.XAxis.BoundaryGap) { boundaryGap = false } diff --git a/mark_line.go b/mark_line.go index bb1b602..00a37f2 100644 --- a/mark_line.go +++ b/mark_line.go @@ -105,13 +105,3 @@ func (m *markLinePainter) Render() (Box, error) { } return BoxZero, nil } - -func markLineRender(opt markLineRenderOption) { - // d := opt.Draw - // s := opt.Series - // if len(s.MarkLine.Data) == 0 { - // return - // } - // r := d.Render - -} diff --git a/painter.go b/painter.go index 0bacd3c..da07007 100644 --- a/painter.go +++ b/painter.go @@ -41,7 +41,7 @@ type Painter struct { } type PainterOptions struct { - // Draw type, "svg" or "png", default type is "svg" + // Draw type, "svg" or "png", default type is "png" Type string // The width of draw painter Width int @@ -628,7 +628,7 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { values = autoDivide(width, count) } for index, text := range opt.TextList { - if index%opt.Unit != 0 { + if opt.Unit != 0 && index%opt.Unit != 0 { continue } box := p.MeasureText(text) diff --git a/range.go b/range.go index 399c449..d5a9ef7 100644 --- a/range.go +++ b/range.go @@ -115,13 +115,3 @@ func (r *axisRange) GetRange(index int) (float64, float64) { func (r *axisRange) AutoDivide() []int { return autoDivide(r.size, r.divideCount) } - -func (r *axisRange) getWidth(value float64) int { - v := value / (r.max - r.min) - // 移至居中 - if r.boundary && - r.divideCount != 0 { - v += 1 / float64(r.divideCount*2) - } - return int(v * float64(r.size)) -} diff --git a/series.go b/series.go index 905c140..44c4749 100644 --- a/series.go +++ b/series.go @@ -140,12 +140,6 @@ func (sl SeriesList) init() { } } -func (sl SeriesList) reverse() { - for i, j := 0, len(sl)-1; i < j; i, j = i+1, j-1 { - sl[i], sl[j] = sl[j], sl[i] - } -} - func (sl SeriesList) Filter(chartType string) SeriesList { arr := make(SeriesList, 0) for index, item := range sl { From 29c9281d7c878f438a37b27a89f27b47de25d44d Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 18 Jun 2022 10:49:39 +0800 Subject: [PATCH 149/251] test: fix test --- painter_test.go | 3 +++ util_test.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/painter_test.go b/painter_test.go index c847aff..8892563 100644 --- a/painter_test.go +++ b/painter_test.go @@ -39,6 +39,7 @@ func TestPainterOption(t *testing.T) { d, err := NewPainter(PainterOptions{ Width: 800, Height: 600, + Type: ChartOutputSVG, }, PainterBoxOption(Box{ Right: 400, @@ -329,6 +330,7 @@ func TestPainter(t *testing.T) { d, err := NewPainter(PainterOptions{ Width: 400, Height: 300, + Type: ChartOutputSVG, }, PainterPaddingOption(chart.Box{ Left: 5, Top: 10, @@ -346,6 +348,7 @@ func TestPainterTextFit(t *testing.T) { p, err := NewPainter(PainterOptions{ Width: 400, Height: 300, + Type: ChartOutputSVG, }) assert.Nil(err) f, _ := chart.GetDefaultFont() diff --git a/util_test.go b/util_test.go index b25c60d..7c2ab2f 100644 --- a/util_test.go +++ b/util_test.go @@ -99,7 +99,7 @@ func TestMeasureTextMaxWidthHeight(t *testing.T) { "Sat", "Sun", }, p) - assert.Equal(26, maxWidth) + assert.Equal(31, maxWidth) assert.Equal(12, maxHeight) } From ad70a4894472b5b5b66c0d76b82cd753e2ebf354 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 18 Jun 2022 20:46:12 +0800 Subject: [PATCH 150/251] test: add test for funnel chart --- axis.go | 2 +- axis_test.go | 46 ++++++++++++++++- bar_chart.go | 22 +++++++- bar_chart_test.go | 120 +++++++++++++++++++++++++++++++++++++++++++ chart_option.go | 7 +-- funnel_chart.go | 10 ++++ funnel_chart_test.go | 79 ++++++++++++++++++++++++++++ 7 files changed, 276 insertions(+), 10 deletions(-) create mode 100644 bar_chart_test.go create mode 100644 funnel_chart_test.go diff --git a/axis.go b/axis.go index 00a3332..53b5362 100644 --- a/axis.go +++ b/axis.go @@ -194,7 +194,7 @@ func (a *axisPainter) Render() (Box, error) { switch opt.Position { case PositionTop: - labelPaddingTop = labelMargin + labelPaddingTop = 0 x1 = p.Width() y0 = labelMargin + int(opt.FontSize) ticksPaddingTop = int(opt.FontSize) diff --git a/axis_test.go b/axis_test.go index fe7f874..17fe8d6 100644 --- a/axis_test.go +++ b/axis_test.go @@ -48,10 +48,12 @@ func TestAxis(t *testing.T) { "Sat", "Sun", }, + SplitLineShow: true, + SplitLineColor: drawing.ColorBlack, }).Render() return p.Bytes() }, - result: "\\nMonTueWedThuFriSatSun", + result: "\\nMonTueWedThuFriSatSun", }, // 底部x轴文本居左 { @@ -113,6 +115,48 @@ func TestAxis(t *testing.T) { }, result: "\\nMonTueWedThuFriSatSun", }, + // 右侧 + { + render: func(p *Painter) ([]byte, error) { + _, _ = NewAxisPainter(p, AxisOption{ + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + Position: PositionRight, + BoundaryGap: FalseFlag(), + SplitLineShow: true, + SplitLineColor: drawing.ColorBlack, + }).Render() + return p.Bytes() + }, + result: "\\nMonTueWedThuFriSatSun", + }, + // 顶部 + { + render: func(p *Painter) ([]byte, error) { + _, _ = NewAxisPainter(p, AxisOption{ + Data: []string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, + Formatter: "{value} --", + Position: PositionTop, + }).Render() + return p.Bytes() + }, + result: "\\nMon --Tue --Wed --Thu --Fri --Sat --Sun --", + }, } for _, tt := range tests { diff --git a/bar_chart.go b/bar_chart.go index 2982829..0ac9f47 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -60,6 +60,13 @@ type BarChartOption struct { Legend LegendOption } +type barChartLabelRenderOption struct { + Text string + Style Style + X int + Y int +} + func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { p := b.p opt := b.opt @@ -95,6 +102,7 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B markPointPainter, markLinePainter, } + labelRenderOptions := make([]barChartLabelRenderOption, 0) for index := range seriesList { series := seriesList[index] yRange := result.axisRanges[series.AxisIndex] @@ -156,9 +164,15 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B if !series.Label.Color.IsZero() { labelStyle.FontColor = series.Label.Color } - seriesPainter.OverrideTextStyle(labelStyle) + textBox := seriesPainter.MeasureText(text) - seriesPainter.Text(text, x+(barWidth-textBox.Width())>>1, barMaxHeight-h-distance) + + labelRenderOptions = append(labelRenderOptions, barChartLabelRenderOption{ + Text: text, + Style: labelStyle, + X: x + (barWidth-textBox.Width())>>1, + Y: barMaxHeight - h - distance, + }) } markPointPainter.Add(markPointRenderOption{ @@ -176,6 +190,10 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B Range: yRange, }) } + for _, labelOpt := range labelRenderOptions { + seriesPainter.OverrideTextStyle(labelOpt.Style) + seriesPainter.Text(labelOpt.Text, labelOpt.X, labelOpt.Y) + } // 最大、最小的mark point err := doRender(rendererList...) if err != nil { diff --git a/bar_chart_test.go b/bar_chart_test.go new file mode 100644 index 0000000..138b3ca --- /dev/null +++ b/bar_chart_test.go @@ -0,0 +1,120 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBarChart(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + seriesList := NewSeriesListDataFromValues([][]float64{ + { + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20.0, + 6.4, + 3.3, + }, + { + 2.6, + 5.9, + 9.0, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6.0, + 2.3, + }, + }) + for index := range seriesList { + seriesList[index].Label.Show = true + } + _, err := NewBarChart(p, BarChartOption{ + Padding: Box{ + Left: 10, + Top: 10, + Right: 10, + Bottom: 10, + }, + SeriesList: seriesList, + XAxis: NewXAxisOption([]string{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + }), + YAxisOptions: NewYAxisOptions([]string{ + "Rainfall", + "Evaporation", + }), + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\n24020016012080400JanFebMarAprMayJunJulAugSepOctNovDec24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", + }, + } + + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} diff --git a/chart_option.go b/chart_option.go index 0bc0a34..643c4e7 100644 --- a/chart_option.go +++ b/chart_option.go @@ -336,12 +336,7 @@ func RadarRender(values [][]float64, opts ...OptionFunc) (*Painter, error) { // FunnelRender funnel chart render func FunnelRender(values []float64, opts ...OptionFunc) (*Painter, error) { - seriesList := make(SeriesList, len(values)) - for index, value := range values { - seriesList[index] = NewSeriesFromValues([]float64{ - value, - }, ChartTypeFunnel) - } + seriesList := NewFunnelSeriesList(values) return Render(ChartOption{ SeriesList: seriesList, }, opts...) diff --git a/funnel_chart.go b/funnel_chart.go index 63b3504..7c04bfe 100644 --- a/funnel_chart.go +++ b/funnel_chart.go @@ -34,6 +34,16 @@ type funnelChart struct { opt *FunnelChartOption } +func NewFunnelSeriesList(values []float64) SeriesList { + seriesList := make(SeriesList, len(values)) + for index, value := range values { + seriesList[index] = NewSeriesFromValues([]float64{ + value, + }, ChartTypeFunnel) + } + return seriesList +} + func NewFunnelChart(p *Painter, opt FunnelChartOption) *funnelChart { if opt.Theme == nil { opt.Theme = defaultTheme diff --git a/funnel_chart_test.go b/funnel_chart_test.go new file mode 100644 index 0000000..d260bfb --- /dev/null +++ b/funnel_chart_test.go @@ -0,0 +1,79 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestFunnelChart(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + _, err := NewFunnelChart(p, FunnelChartOption{ + SeriesList: NewFunnelSeriesList([]float64{ + 100, + 80, + 60, + 40, + 20, + }), + Legend: NewLegendOption([]string{ + "Show", + "Click", + "Visit", + "Inquiry", + "Order", + }), + Title: TitleOption{ + Text: "Funnel", + }, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nShowClickVisitInquiryOrderFunnel(100%)(80%)(60%)(40%)(20%)", + }, + } + + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} From 368add795f8832f7397fce743141b9921d3a149d Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 19 Jun 2022 19:28:09 +0800 Subject: [PATCH 151/251] test: add test for horizontal bar --- horizontal_bar_chart_test.go | 100 +++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 horizontal_bar_chart_test.go diff --git a/horizontal_bar_chart_test.go b/horizontal_bar_chart_test.go new file mode 100644 index 0000000..5555df6 --- /dev/null +++ b/horizontal_bar_chart_test.go @@ -0,0 +1,100 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestHorizontalBarChart(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + _, err := NewHorizontalBarChart(p, HorizontalBarChartOption{ + Padding: Box{ + Top: 10, + Right: 10, + Bottom: 10, + Left: 10, + }, + SeriesList: NewSeriesListDataFromValues([][]float64{ + { + 18203, + 23489, + 29034, + 104970, + 131744, + 630230, + }, + { + 19325, + 23438, + 31000, + 121594, + 134141, + 681807, + }, + }, ChartTypeHorizontalBar), + Title: TitleOption{ + Text: "World Population", + }, + Legend: NewLegendOption([]string{ + "2011", + "2012", + }), + YAxisOptions: NewYAxisOptions([]string{ + "Brazil", + "Indonesia", + "USA", + "India", + "China", + "World", + }), + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} From a6b92f1d4746c6e5d6350f627160961399cf7283 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 19 Jun 2022 20:02:54 +0800 Subject: [PATCH 152/251] test: add test for legend --- legend_test.go | 107 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 legend_test.go diff --git a/legend_test.go b/legend_test.go new file mode 100644 index 0000000..e10b538 --- /dev/null +++ b/legend_test.go @@ -0,0 +1,107 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewLegend(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + _, err := NewLegendPainter(p, LegendOption{ + Data: []string{ + "One", + "Two", + "Three", + }, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nOneTwoThree", + }, + { + render: func(p *Painter) ([]byte, error) { + _, err := NewLegendPainter(p, LegendOption{ + Data: []string{ + "One", + "Two", + "Three", + }, + Left: PositionLeft, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nOneTwoThree", + }, + { + render: func(p *Painter) ([]byte, error) { + _, err := NewLegendPainter(p, LegendOption{ + Data: []string{ + "One", + "Two", + "Three", + }, + Orient: OrientVertical, + Icon: IconRect, + Left: "10%", + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nOneTwoThree", + }, + } + for index, tt := range tests { + if index != 0 { + continue + } + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p) + assert.Nil(err) + fmt.Println(string(data)) + assert.Equal(tt.result, string(data)) + } +} From 212a51083f290aaa7770b7762ea8ee0992b24b5f Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 20 Jun 2022 23:23:21 +0800 Subject: [PATCH 153/251] test: add test for charts --- chart_option.go | 12 +- echarts_test.go | 263 ++++++++++++++++++++++++++++++++++++++++++++ grid_test.go | 69 ++++++++++++ legend_test.go | 5 +- line_chart_test.go | 219 ++++++++++++++++++++++++++++++++++++ mark_line.go | 7 +- mark_line_test.go | 89 +++++++++++++++ mark_point_test.go | 92 ++++++++++++++++ pie_chart_test.go | 100 +++++++++++++++++ radar_chart.go | 14 +++ radar_chart_test.go | 109 ++++++++++++++++++ 11 files changed, 963 insertions(+), 16 deletions(-) create mode 100644 echarts_test.go create mode 100644 grid_test.go create mode 100644 line_chart_test.go create mode 100644 mark_line_test.go create mode 100644 mark_point_test.go create mode 100644 pie_chart_test.go create mode 100644 radar_chart_test.go diff --git a/chart_option.go b/chart_option.go index 643c4e7..db2f57b 100644 --- a/chart_option.go +++ b/chart_option.go @@ -201,17 +201,7 @@ func ChildOptionFunc(child ...ChartOption) OptionFunc { // RadarIndicatorOptionFunc set radar indicator of chart func RadarIndicatorOptionFunc(names []string, values []float64) OptionFunc { return func(opt *ChartOption) { - if len(names) != len(values) { - return - } - indicators := make([]RadarIndicator, len(names)) - for index, name := range names { - indicators[index] = RadarIndicator{ - Name: name, - Max: values[index], - } - } - opt.RadarIndicators = indicators + opt.RadarIndicators = NewRadarIndicators(names, values) } } diff --git a/echarts_test.go b/echarts_test.go new file mode 100644 index 0000000..1ed14d3 --- /dev/null +++ b/echarts_test.go @@ -0,0 +1,263 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestConvertToArray(t *testing.T) { + assert := assert.New(t) + + assert.Equal([]byte(`[1]`), convertToArray([]byte("1"))) + assert.Equal([]byte(`[1]`), convertToArray([]byte("[1]"))) +} + +func TestEChartsPosition(t *testing.T) { + assert := assert.New(t) + var p EChartsPosition + err := p.UnmarshalJSON([]byte("1")) + assert.Nil(err) + assert.Equal(EChartsPosition("1"), p) + err = p.UnmarshalJSON([]byte(`"left"`)) + assert.Nil(err) + assert.Equal(EChartsPosition("left"), p) +} + +func TestEChartsSeriesDataValue(t *testing.T) { + assert := assert.New(t) + + es := EChartsSeriesDataValue{} + err := es.UnmarshalJSON([]byte(`[1, 2]`)) + assert.Nil(err) + assert.Equal(EChartsSeriesDataValue{ + values: []float64{ + 1, + 2, + }, + }, es) + assert.Equal(1.0, es.First()) +} + +func TestEChartsSeriesData(t *testing.T) { + assert := assert.New(t) + es := EChartsSeriesData{} + err := es.UnmarshalJSON([]byte("1.1")) + assert.Nil(err) + assert.Equal(EChartsSeriesDataValue{ + values: []float64{ + 1.1, + }, + }, es.Value) + + err = es.UnmarshalJSON([]byte(`{"value":200,"itemStyle":{"color":"#a90000"}}`)) + assert.Nil(err) + assert.Nil(err) + assert.Equal(EChartsSeriesData{ + Value: EChartsSeriesDataValue{ + values: []float64{ + 200.0, + }, + }, + ItemStyle: EChartStyle{ + Color: "#a90000", + }, + }, es) +} + +func TestEChartsXAxis(t *testing.T) { + assert := assert.New(t) + ex := EChartsXAxis{} + err := ex.UnmarshalJSON([]byte(`{"boundaryGap": true, "splitNumber": 5, "data": ["a", "b"], "type": "value"}`)) + assert.Nil(err) + + assert.Equal(EChartsXAxis{ + Data: []EChartsXAxisData{ + { + BoundaryGap: TrueFlag(), + SplitNumber: 5, + Data: []string{ + "a", + "b", + }, + Type: "value", + }, + }, + }, ex) +} + +func TestEChartsOption(t *testing.T) { + assert := assert.New(t) + + opt := EChartsOption{} + err := json.Unmarshal([]byte(`{ + "title": { + "text": "Rainfall vs Evaporation", + "subtext": "Fake Data" + }, + "tooltip": { + "trigger": "axis" + }, + "legend": { + "data": [ + "Rainfall", + "Evaporation" + ] + }, + "toolbox": { + "show": true, + "feature": { + "dataView": { + "show": true, + "readOnly": false + }, + "magicType": { + "show": true, + "type": [ + "line", + "bar" + ] + }, + "restore": { + "show": true + }, + "saveAsImage": { + "show": true + } + } + }, + "calculable": true, + "xAxis": [ + { + "type": "category", + "data": [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ] + } + ], + "yAxis": [ + { + "type": "value" + } + ], + "series": [ + { + "name": "Rainfall", + "type": "bar", + "data": [ + 2, + 4.9, + 7, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20, + 6.4, + 3.3 + ], + "markPoint": { + "data": [ + { + "type": "max", + "name": "Max" + }, + { + "type": "min", + "name": "Min" + } + ] + }, + "markLine": { + "data": [ + { + "type": "average", + "name": "Avg" + } + ] + } + }, + { + "name": "Evaporation", + "type": "bar", + "data": [ + 2.6, + 5.9, + 9, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6, + 2.3 + ], + "markPoint": { + "data": [ + { + "name": "Max", + "value": 182.2, + "xAxis": 7, + "yAxis": 183 + }, + { + "name": "Min", + "value": 2.3, + "xAxis": 11, + "yAxis": 3 + } + ] + }, + "markLine": { + "data": [ + { + "type": "average", + "name": "Avg" + } + ] + } + } + ] + }`), &opt) + + assert.Nil(err) + assert.NotEmpty(opt.Series) +} diff --git a/grid_test.go b/grid_test.go new file mode 100644 index 0000000..f6880dc --- /dev/null +++ b/grid_test.go @@ -0,0 +1,69 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestGrid(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + _, err := NewGridPainter(p, GridPainterOption{ + StrokeColor: drawing.ColorBlack, + Column: 6, + Row: 6, + IgnoreFirstRow: true, + IgnoreLastRow: true, + IgnoreFirstColumn: true, + IgnoreLastColumn: true, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\n", + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} diff --git a/legend_test.go b/legend_test.go index e10b538..9078006 100644 --- a/legend_test.go +++ b/legend_test.go @@ -89,10 +89,7 @@ func TestNewLegend(t *testing.T) { result: "\\nOneTwoThree", }, } - for index, tt := range tests { - if index != 0 { - continue - } + for _, tt := range tests { p, err := NewPainter(PainterOptions{ Type: ChartOutputSVG, Width: 600, diff --git a/line_chart_test.go b/line_chart_test.go new file mode 100644 index 0000000..856cdf3 --- /dev/null +++ b/line_chart_test.go @@ -0,0 +1,219 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestLineChart(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + values := [][]float64{ + { + 120, + 132, + 101, + 134, + 90, + 230, + 210, + }, + { + 220, + 182, + 191, + 234, + 290, + 330, + 310, + }, + { + 150, + 232, + 201, + 154, + 190, + 330, + 410, + }, + { + 320, + 332, + 301, + 334, + 390, + 330, + 320, + }, + { + 820, + 932, + 901, + 934, + 1290, + 1330, + 1320, + }, + } + _, err := NewLineChart(p, LineChartOption{ + Title: TitleOption{ + Text: "Line", + }, + Padding: Box{ + Top: 10, + Right: 10, + Bottom: 10, + Left: 10, + }, + XAxis: NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + Legend: NewLegendOption([]string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", + }, PositionCenter), + SeriesList: NewSeriesListDataFromValues(values), + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + }, + { + render: func(p *Painter) ([]byte, error) { + values := [][]float64{ + { + 120, + 132, + 101, + 134, + 90, + 230, + 210, + }, + { + 220, + 182, + 191, + 234, + 290, + 330, + 310, + }, + { + 150, + 232, + 201, + 154, + 190, + 330, + 410, + }, + { + 320, + 332, + 301, + 334, + 390, + 330, + 320, + }, + { + 820, + 932, + 901, + 934, + 1290, + 1330, + 1320, + }, + } + _, err := NewLineChart(p, LineChartOption{ + Title: TitleOption{ + Text: "Line", + }, + Padding: Box{ + Top: 10, + Right: 10, + Bottom: 10, + Left: 10, + }, + XAxis: NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }, FalseFlag()), + Legend: NewLegendOption([]string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", + }, PositionCenter), + SeriesList: NewSeriesListDataFromValues(values), + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + }, + } + + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} diff --git a/mark_line.go b/mark_line.go index 00a37f2..a0efcfb 100644 --- a/mark_line.go +++ b/mark_line.go @@ -24,6 +24,7 @@ package charts import ( "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" ) func NewMarkLine(markLineTypes ...string) SeriesMarkLine { @@ -70,6 +71,10 @@ func (m *markLinePainter) Render() (Box, error) { if len(s.MarkLine.Data) == 0 { continue } + font := opt.Font + if font == nil { + font, _ = chart.GetDefaultFont() + } summary := s.Summary() for _, markLine := range s.MarkLine.Data { // 由于mark line会修改style,因此每次重新设置 @@ -82,7 +87,7 @@ func (m *markLinePainter) Render() (Box, error) { 2, }, }).OverrideTextStyle(Style{ - Font: opt.Font, + Font: font, FontColor: opt.FontColor, FontSize: labelFontSize, }) diff --git a/mark_line_test.go b/mark_line_test.go new file mode 100644 index 0000000..84152ce --- /dev/null +++ b/mark_line_test.go @@ -0,0 +1,89 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestMarkLine(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + markLine := NewMarkLinePainter(p) + series := NewSeriesFromValues([]float64{ + 1, + 2, + 3, + }) + series.MarkLine = NewMarkLine( + SeriesMarkDataTypeMax, + SeriesMarkDataTypeAverage, + SeriesMarkDataTypeMin, + ) + markLine.Add(markLineRenderOption{ + FillColor: drawing.ColorBlack, + FontColor: drawing.ColorBlack, + StrokeColor: drawing.ColorBlack, + Series: series, + Range: NewRange(AxisRangeOption{ + Min: 0, + Max: 5, + Size: p.Height(), + DivideCount: 6, + }), + }) + _, err := markLine.Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\n321", + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p.Child(PainterPaddingOption(Box{ + Left: 20, + Top: 20, + Right: 20, + Bottom: 20, + }))) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} diff --git a/mark_point_test.go b/mark_point_test.go new file mode 100644 index 0000000..1a810cf --- /dev/null +++ b/mark_point_test.go @@ -0,0 +1,92 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestMarkPoint(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + series := NewSeriesFromValues([]float64{ + 1, + 2, + 3, + }) + series.MarkPoint = NewMarkPoint(SeriesMarkDataTypeMax) + markPoint := NewMarkPointPainter(p) + markPoint.Add(markPointRenderOption{ + FillColor: drawing.ColorBlack, + Series: series, + Points: []Point{ + { + X: 10, + Y: 10, + }, + { + X: 30, + Y: 30, + }, + { + X: 50, + Y: 50, + }, + }, + }) + _, err := markPoint.Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\n3", + }, + } + + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p.Child(PainterPaddingOption(Box{ + Left: 20, + Top: 20, + Right: 20, + Bottom: 20, + }))) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} diff --git a/pie_chart_test.go b/pie_chart_test.go new file mode 100644 index 0000000..c373a7e --- /dev/null +++ b/pie_chart_test.go @@ -0,0 +1,100 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestPieChart(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + values := []float64{ + 1048, + 735, + 580, + 484, + 300, + } + _, err := NewPieChart(p, PieChartOption{ + SeriesList: NewPieSeriesList(values, PieSeriesOption{ + Label: SeriesLabel{ + Show: true, + }, + }), + Title: TitleOption{ + Text: "Rainfall vs Evaporation", + Subtext: "Fake Data", + Left: PositionCenter, + }, + Padding: Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }, + Legend: LegendOption{ + Orient: OrientVertical, + Data: []string{ + "Search Engine", + "Direct", + "Email", + "Union Ads", + "Video Ads", + }, + Left: PositionLeft, + }, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p.Child(PainterPaddingOption(Box{ + Left: 20, + Top: 20, + Right: 20, + Bottom: 20, + }))) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} diff --git a/radar_chart.go b/radar_chart.go index 610d5f7..5b8aa85 100644 --- a/radar_chart.go +++ b/radar_chart.go @@ -62,6 +62,20 @@ type RadarChartOption struct { backgroundIsFilled bool } +func NewRadarIndicators(names []string, values []float64) []RadarIndicator { + if len(names) != len(values) { + return nil + } + indicators := make([]RadarIndicator, len(names)) + for index, name := range names { + indicators[index] = RadarIndicator{ + Name: name, + Max: values[index], + } + } + return indicators +} + func NewRadarChart(p *Painter, opt RadarChartOption) *radarChart { if opt.Theme == nil { opt.Theme = defaultTheme diff --git a/radar_chart_test.go b/radar_chart_test.go new file mode 100644 index 0000000..baf616d --- /dev/null +++ b/radar_chart_test.go @@ -0,0 +1,109 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestRadarChart(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + values := [][]float64{ + { + 4200, + 3000, + 20000, + 35000, + 50000, + 18000, + }, + { + 5000, + 14000, + 28000, + 26000, + 42000, + 21000, + }, + } + _, err := NewRadarChart(p, RadarChartOption{ + SeriesList: NewSeriesListDataFromValues(values, ChartTypeRadar), + Title: TitleOption{ + Text: "Basic Radar Chart", + }, + Legend: NewLegendOption([]string{ + "Allocated Budget", + "Actual Spending", + }), + RadarIndicators: NewRadarIndicators([]string{ + "Sales", + "Administration", + "Information Technology", + "Customer Support", + "Development", + "Marketing", + }, []float64{ + 6500, + 16000, + 30000, + 38000, + 52000, + 25000, + }), + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nAllocated BudgetActual SpendingBasic Radar ChartSalesAdministrationInformation TechnologyCustomer SupportDevelopmentMarketing", + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p.Child(PainterPaddingOption(Box{ + Left: 20, + Top: 20, + Right: 20, + Bottom: 20, + }))) + assert.Nil(err) + fmt.Println(string(data)) + assert.Equal(tt.result, string(data)) + } +} From 6695a3a062ed2091b706c2d206c55605a769610f Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 21 Jun 2022 20:18:27 +0800 Subject: [PATCH 154/251] test: add test for charts --- chart_option.go | 6 +- chart_option_test.go | 451 +++++++++++++++++++++++++++++++++++++++++++ echarts.go | 4 +- echarts_test.go | 423 +++++++++++++++++++++++++++++++++++----- legend_test.go | 2 - radar_chart_test.go | 2 - 6 files changed, 827 insertions(+), 61 deletions(-) create mode 100644 chart_option_test.go diff --git a/chart_option.go b/chart_option.go index db2f57b..94574a1 100644 --- a/chart_option.go +++ b/chart_option.go @@ -69,9 +69,9 @@ type ChartOption struct { // OptionFunc option function type OptionFunc func(opt *ChartOption) -// PNGTypeOption set png type of chart's output -func PNGTypeOption() OptionFunc { - return TypeOptionFunc(ChartOutputPNG) +// SVGTypeOption set svg type of chart's output +func SVGTypeOption() OptionFunc { + return TypeOptionFunc(ChartOutputSVG) } // TypeOptionFunc set type of chart's output diff --git a/chart_option_test.go b/chart_option_test.go new file mode 100644 index 0000000..c77bb4f --- /dev/null +++ b/chart_option_test.go @@ -0,0 +1,451 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2/drawing" +) + +func TestChartOption(t *testing.T) { + assert := assert.New(t) + + fns := []OptionFunc{ + SVGTypeOption(), + FontFamilyOptionFunc("fontFamily"), + ThemeOptionFunc("theme"), + TitleTextOptionFunc("title"), + LegendLabelsOptionFunc([]string{ + "label", + }), + XAxisDataOptionFunc([]string{ + "xaxis", + }), + YAxisDataOptionFunc([]string{ + "yaxis", + }), + WidthOptionFunc(800), + HeightOptionFunc(600), + PaddingOptionFunc(Box{ + Left: 10, + Top: 10, + Right: 10, + Bottom: 10, + }), + BackgroundColorOptionFunc(drawing.ColorBlack), + } + opt := ChartOption{} + for _, fn := range fns { + fn(&opt) + } + assert.Equal(ChartOption{ + Type: ChartOutputSVG, + FontFamily: "fontFamily", + Theme: "theme", + Title: TitleOption{ + Text: "title", + }, + Legend: LegendOption{ + Data: []string{ + "label", + }, + }, + XAxis: XAxisOption{ + Data: []string{ + "xaxis", + }, + }, + YAxisOptions: []YAxisOption{ + { + Data: []string{ + "yaxis", + }, + }, + }, + Width: 800, + Height: 600, + Padding: Box{ + Left: 10, + Top: 10, + Right: 10, + Bottom: 10, + }, + BackgroundColor: drawing.ColorBlack, + }, opt) +} + +func TestChartOptionPieSeriesShowLabel(t *testing.T) { + assert := assert.New(t) + + opt := ChartOption{ + SeriesList: NewPieSeriesList([]float64{ + 1, + 2, + }), + } + PieSeriesShowLabel()(&opt) + assert.True(opt.SeriesList[0].Label.Show) +} + +func TestChartOptionMarkLine(t *testing.T) { + assert := assert.New(t) + opt := ChartOption{ + SeriesList: NewSeriesListDataFromValues([][]float64{ + {1, 2}, + }), + } + MarkLineOptionFunc(0, "min", "max")(&opt) + assert.Equal(NewMarkLine("min", "max"), opt.SeriesList[0].MarkLine) +} + +func TestChartOptionMarkPoint(t *testing.T) { + assert := assert.New(t) + opt := ChartOption{ + SeriesList: NewSeriesListDataFromValues([][]float64{ + {1, 2}, + }), + } + MarkPointOptionFunc(0, "min", "max")(&opt) + assert.Equal(NewMarkPoint("min", "max"), opt.SeriesList[0].MarkPoint) +} + +func TestLineRender(t *testing.T) { + assert := assert.New(t) + values := [][]float64{ + { + 120, + 132, + 101, + 134, + 90, + 230, + 210, + }, + { + 220, + 182, + 191, + 234, + 290, + 330, + 310, + }, + { + 150, + 232, + 201, + 154, + 190, + 330, + 410, + }, + { + 320, + 332, + 301, + 334, + 390, + 330, + 320, + }, + { + 820, + 932, + 901, + 934, + 1290, + 1330, + 1320, + }, + } + p, err := LineRender( + values, + SVGTypeOption(), + TitleTextOptionFunc("Line"), + XAxisDataOptionFunc([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + LegendLabelsOptionFunc([]string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", + }, PositionCenter), + ) + assert.Nil(err) + data, err := p.Bytes() + assert.Nil(err) + assert.Equal("\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", string(data)) +} + +func TestBarRender(t *testing.T) { + assert := assert.New(t) + values := [][]float64{ + { + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20.0, + 6.4, + 3.3, + }, + { + 2.6, + 5.9, + 9.0, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6.0, + 2.3, + }, + } + p, err := BarRender( + values, + SVGTypeOption(), + XAxisDataOptionFunc([]string{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + }), + LegendLabelsOptionFunc([]string{ + "Rainfall", + "Evaporation", + }, PositionRight), + MarkLineOptionFunc(0, SeriesMarkDataTypeAverage), + MarkPointOptionFunc(0, SeriesMarkDataTypeMax, + SeriesMarkDataTypeMin), + // custom option func + func(opt *ChartOption) { + opt.SeriesList[1].MarkPoint = NewMarkPoint( + SeriesMarkDataTypeMax, + SeriesMarkDataTypeMin, + ) + opt.SeriesList[1].MarkLine = NewMarkLine( + SeriesMarkDataTypeAverage, + ) + }, + ) + assert.Nil(err) + data, err := p.Bytes() + assert.Nil(err) + assert.Equal("\\nRainfallEvaporation24020016012080400JanFebMarAprMayJunJulAugSepOctNovDec162.22182.22.341.6248.07", string(data)) +} + +func TestHorizontalBarRender(t *testing.T) { + assert := assert.New(t) + values := [][]float64{ + { + 18203, + 23489, + 29034, + 104970, + 131744, + 630230, + }, + { + 19325, + 23438, + 31000, + 121594, + 134141, + 681807, + }, + } + p, err := HorizontalBarRender( + values, + SVGTypeOption(), + TitleTextOptionFunc("World Population"), + PaddingOptionFunc(Box{ + Top: 20, + Right: 40, + Bottom: 20, + Left: 20, + }), + LegendLabelsOptionFunc([]string{ + "2011", + "2012", + }), + YAxisDataOptionFunc([]string{ + "Brazil", + "Indonesia", + "USA", + "India", + "China", + "World", + }), + ) + assert.Nil(err) + data, err := p.Bytes() + assert.Nil(err) + assert.Equal("\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", string(data)) +} + +func TestPieRender(t *testing.T) { + assert := assert.New(t) + values := []float64{ + 1048, + 735, + 580, + 484, + 300, + } + p, err := PieRender( + values, + SVGTypeOption(), + TitleOptionFunc(TitleOption{ + Text: "Rainfall vs Evaporation", + Subtext: "Fake Data", + Left: PositionCenter, + }), + PaddingOptionFunc(Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }), + LegendOptionFunc(LegendOption{ + Orient: OrientVertical, + Data: []string{ + "Search Engine", + "Direct", + "Email", + "Union Ads", + "Video Ads", + }, + Left: PositionLeft, + }), + PieSeriesShowLabel(), + ) + assert.Nil(err) + data, err := p.Bytes() + assert.Nil(err) + assert.Equal("\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", string(data)) +} + +func TestRadarRender(t *testing.T) { + assert := assert.New(t) + + values := [][]float64{ + { + 4200, + 3000, + 20000, + 35000, + 50000, + 18000, + }, + { + 5000, + 14000, + 28000, + 26000, + 42000, + 21000, + }, + } + p, err := RadarRender( + values, + SVGTypeOption(), + TitleTextOptionFunc("Basic Radar Chart"), + LegendLabelsOptionFunc([]string{ + "Allocated Budget", + "Actual Spending", + }), + RadarIndicatorOptionFunc([]string{ + "Sales", + "Administration", + "Information Technology", + "Customer Support", + "Development", + "Marketing", + }, []float64{ + 6500, + 16000, + 30000, + 38000, + 52000, + 25000, + }), + ) + assert.Nil(err) + data, err := p.Bytes() + assert.Nil(err) + assert.Equal("\\nAllocated BudgetActual SpendingBasic Radar ChartSalesAdministrationInformation TechnologyCustomer SupportDevelopmentMarketing", string(data)) +} + +func TestFunnelRender(t *testing.T) { + assert := assert.New(t) + + values := []float64{ + 100, + 80, + 60, + 40, + 20, + } + p, err := FunnelRender( + values, + SVGTypeOption(), + TitleTextOptionFunc("Funnel"), + LegendLabelsOptionFunc([]string{ + "Show", + "Click", + "Visit", + "Inquiry", + "Order", + }), + ) + assert.Nil(err) + data, err := p.Bytes() + assert.Nil(err) + assert.Equal("\\nShowClickVisitInquiryOrderFunnelShow(100%)Click(80%)Visit(60%)Inquiry(40%)Order(20%)", string(data)) +} diff --git a/echarts.go b/echarts.go index d2602b3..fbe9a36 100644 --- a/echarts.go +++ b/echarts.go @@ -60,9 +60,9 @@ type EChartStyle struct { Color string `json:"color"` } -func (es *EChartStyle) ToStyle() chart.Style { +func (es *EChartStyle) ToStyle() Style { color := parseColor(es.Color) - return chart.Style{ + return Style{ FillColor: color, FontColor: color, StrokeColor: color, diff --git a/echarts_test.go b/echarts_test.go index 1ed14d3..9c31286 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -27,6 +27,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/wcharczuk/go-chart/v2/drawing" ) func TestConvertToArray(t *testing.T) { @@ -59,6 +60,7 @@ func TestEChartsSeriesDataValue(t *testing.T) { 2, }, }, es) + assert.Equal(NewEChartsSeriesDataValue(1, 2), es) assert.Equal(1.0, es.First()) } @@ -109,47 +111,380 @@ func TestEChartsXAxis(t *testing.T) { }, ex) } +func TestEChartStyle(t *testing.T) { + assert := assert.New(t) + + es := EChartStyle{ + Color: "#999", + } + color := drawing.Color{ + R: 153, + G: 153, + B: 153, + A: 255, + } + assert.Equal(Style{ + FillColor: color, + FontColor: color, + StrokeColor: color, + }, es.ToStyle()) +} + +func TestEChartsPadding(t *testing.T) { + assert := assert.New(t) + + eb := EChartsPadding{} + + err := eb.UnmarshalJSON([]byte(`1`)) + assert.Nil(err) + assert.Equal(Box{ + Left: 1, + Top: 1, + Right: 1, + Bottom: 1, + }, eb.Box) + + err = eb.UnmarshalJSON([]byte(`[2, 3]`)) + assert.Nil(err) + assert.Equal(Box{ + Left: 3, + Top: 2, + Right: 3, + Bottom: 2, + }, eb.Box) + + err = eb.UnmarshalJSON([]byte(`[4, 5, 6]`)) + assert.Nil(err) + assert.Equal(Box{ + Left: 5, + Top: 4, + Right: 5, + Bottom: 6, + }, eb.Box) + + err = eb.UnmarshalJSON([]byte(`[4, 5, 6, 7]`)) + assert.Nil(err) + assert.Equal(Box{ + Left: 7, + Top: 4, + Right: 5, + Bottom: 6, + }, eb.Box) +} + +func TestEChartsMarkPoint(t *testing.T) { + assert := assert.New(t) + + emp := EChartsMarkPoint{ + SymbolSize: 30, + Data: []EChartsMarkData{ + { + Type: "test", + }, + }, + } + assert.Equal(SeriesMarkPoint{ + SymbolSize: 30, + Data: []SeriesMarkData{ + { + Type: "test", + }, + }, + }, emp.ToSeriesMarkPoint()) +} + +func TestEChartsMarkLine(t *testing.T) { + assert := assert.New(t) + + eml := EChartsMarkLine{ + Data: []EChartsMarkData{ + { + Type: "min", + }, + { + Type: "max", + }, + }, + } + assert.Equal(SeriesMarkLine{ + Data: []SeriesMarkData{ + { + Type: "min", + }, + { + Type: "max", + }, + }, + }, eml.ToSeriesMarkLine()) +} + func TestEChartsOption(t *testing.T) { assert := assert.New(t) - opt := EChartsOption{} - err := json.Unmarshal([]byte(`{ + tests := []struct { + option string + }{ + { + option: `{ + "xAxis": { + "type": "category", + "data": [ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun" + ] + }, + "yAxis": { + "type": "value" + }, + "series": [ + { + "data": [ + 120, + { + "value": 200, + "itemStyle": { + "color": "#a90000" + } + }, + 150, + 80, + 70, + 110, + 130 + ], + "type": "bar" + } + ] + }`, + }, + { + option: `{ + "title": { + "text": "Referer of a Website", + "subtext": "Fake Data", + "left": "center" + }, + "tooltip": { + "trigger": "item" + }, + "legend": { + "orient": "vertical", + "left": "left" + }, + "series": [ + { + "name": "Access From", + "type": "pie", + "radius": "50%", + "data": [ + { + "value": 1048, + "name": "Search Engine" + }, + { + "value": 735, + "name": "Direct" + }, + { + "value": 580, + "name": "Email" + }, + { + "value": 484, + "name": "Union Ads" + }, + { + "value": 300, + "name": "Video Ads" + } + ], + "emphasis": { + "itemStyle": { + "shadowBlur": 10, + "shadowOffsetX": 0, + "shadowColor": "rgba(0, 0, 0, 0.5)" + } + } + } + ] + }`, + }, + { + option: `{ + "title": { + "text": "Rainfall vs Evaporation", + "subtext": "Fake Data" + }, + "tooltip": { + "trigger": "axis" + }, + "legend": { + "data": [ + "Rainfall", + "Evaporation" + ] + }, + "toolbox": { + "show": true, + "feature": { + "dataView": { + "show": true, + "readOnly": false + }, + "magicType": { + "show": true, + "type": [ + "line", + "bar" + ] + }, + "restore": { + "show": true + }, + "saveAsImage": { + "show": true + } + } + }, + "calculable": true, + "xAxis": [ + { + "type": "category", + "data": [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ] + } + ], + "yAxis": [ + { + "type": "value" + } + ], + "series": [ + { + "name": "Rainfall", + "type": "bar", + "data": [ + 2, + 4.9, + 7, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20, + 6.4, + 3.3 + ], + "markPoint": { + "data": [ + { + "type": "max", + "name": "Max" + }, + { + "type": "min", + "name": "Min" + } + ] + }, + "markLine": { + "data": [ + { + "type": "average", + "name": "Avg" + } + ] + } + }, + { + "name": "Evaporation", + "type": "bar", + "data": [ + 2.6, + 5.9, + 9, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6, + 2.3 + ], + "markPoint": { + "data": [ + { + "name": "Max", + "value": 182.2, + "xAxis": 7, + "yAxis": 183 + }, + { + "name": "Min", + "value": 2.3, + "xAxis": 11, + "yAxis": 3 + } + ] + }, + "markLine": { + "data": [ + { + "type": "average", + "name": "Avg" + } + ] + } + } + ] + }`, + }, + } + for _, tt := range tests { + opt := EChartsOption{} + err := json.Unmarshal([]byte(tt.option), &opt) + assert.Nil(err) + assert.NotEmpty(opt.Series) + assert.NotEmpty(opt.ToOption().SeriesList) + } +} + +func TestRenderEChartsToSVG(t *testing.T) { + assert := assert.New(t) + + data, err := RenderEChartsToSVG(`{ "title": { "text": "Rainfall vs Evaporation", "subtext": "Fake Data" }, - "tooltip": { - "trigger": "axis" - }, "legend": { "data": [ "Rainfall", "Evaporation" ] }, - "toolbox": { - "show": true, - "feature": { - "dataView": { - "show": true, - "readOnly": false - }, - "magicType": { - "show": true, - "type": [ - "line", - "bar" - ] - }, - "restore": { - "show": true - }, - "saveAsImage": { - "show": true - } - } - }, - "calculable": true, + "padding": [10, 30, 10, 10], "xAxis": [ { "type": "category", @@ -169,11 +504,6 @@ func TestEChartsOption(t *testing.T) { ] } ], - "yAxis": [ - { - "type": "value" - } - ], "series": [ { "name": "Rainfall", @@ -195,20 +525,17 @@ func TestEChartsOption(t *testing.T) { "markPoint": { "data": [ { - "type": "max", - "name": "Max" + "type": "max" }, { - "type": "min", - "name": "Min" + "type": "min" } ] }, "markLine": { "data": [ { - "type": "average", - "name": "Avg" + "type": "average" } ] } @@ -233,31 +560,23 @@ func TestEChartsOption(t *testing.T) { "markPoint": { "data": [ { - "name": "Max", - "value": 182.2, - "xAxis": 7, - "yAxis": 183 + "type": "max" }, { - "name": "Min", - "value": 2.3, - "xAxis": 11, - "yAxis": 3 + "type": "min" } ] }, "markLine": { "data": [ { - "type": "average", - "name": "Avg" + "type": "average" } ] } } ] - }`), &opt) - + }`) assert.Nil(err) - assert.NotEmpty(opt.Series) + assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400JanFebMarAprMayJunJulAugSepOctNovDec162.22182.22.341.6248.07", string(data)) } diff --git a/legend_test.go b/legend_test.go index 9078006..526f178 100644 --- a/legend_test.go +++ b/legend_test.go @@ -23,7 +23,6 @@ package charts import ( - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -98,7 +97,6 @@ func TestNewLegend(t *testing.T) { assert.Nil(err) data, err := tt.render(p) assert.Nil(err) - fmt.Println(string(data)) assert.Equal(tt.result, string(data)) } } diff --git a/radar_chart_test.go b/radar_chart_test.go index baf616d..79fd9ac 100644 --- a/radar_chart_test.go +++ b/radar_chart_test.go @@ -23,7 +23,6 @@ package charts import ( - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -103,7 +102,6 @@ func TestRadarChart(t *testing.T) { Bottom: 20, }))) assert.Nil(err) - fmt.Println(string(data)) assert.Equal(tt.result, string(data)) } } From 4121829e6e9c483ac2c659b56a1762192a3f74ea Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 21 Jun 2022 20:19:37 +0800 Subject: [PATCH 155/251] chore: add png type option function --- chart_option.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/chart_option.go b/chart_option.go index 94574a1..f2f3b51 100644 --- a/chart_option.go +++ b/chart_option.go @@ -74,6 +74,11 @@ func SVGTypeOption() OptionFunc { return TypeOptionFunc(ChartOutputSVG) } +// PNGTypeOption set png type of chart's output +func PNGTypeOption() OptionFunc { + return TypeOptionFunc(ChartOutputPNG) +} + // TypeOptionFunc set type of chart's output func TypeOptionFunc(t string) OptionFunc { return func(opt *ChartOption) { From 1c60bc93800837ff6ccebe314e93cb157473821b Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 21 Jun 2022 20:29:39 +0800 Subject: [PATCH 156/251] chore: update modules --- go.mod | 12 ++++++------ go.sum | 37 +++++++++++++++++++------------------ main.go | 2 +- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index ad50c49..93fc351 100644 --- a/go.mod +++ b/go.mod @@ -3,20 +3,20 @@ module github.com/vicanso/go-charts-web go 1.17 require ( - github.com/vicanso/elton v1.8.3 - github.com/vicanso/go-charts v1.0.1-0.20220305124249-82e05eec6479 + github.com/vicanso/elton v1.9.3 + github.com/vicanso/go-charts/v2 v2.0.0-alpha ) require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/tidwall/gjson v1.13.0 // indirect + github.com/tidwall/gjson v1.14.1 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect - github.com/vicanso/hes v0.5.0 // indirect - github.com/vicanso/intranet-ip v0.0.1 // indirect + github.com/vicanso/hes v0.6.0 // indirect + github.com/vicanso/intranet-ip v0.1.0 // indirect github.com/vicanso/keygrip v1.2.1 // indirect github.com/wcharczuk/go-chart/v2 v2.1.0 // indirect - golang.org/x/image v0.0.0-20211028202545-6944b10bf410 // indirect + golang.org/x/image v0.0.0-20220617043117-41969df76e82 // indirect ) diff --git a/go.sum b/go.sum index 096648f..29d935c 100644 --- a/go.sum +++ b/go.sum @@ -10,36 +10,37 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tidwall/gjson v1.13.0 h1:3TFY9yxOQShrvmjdM76K+jc66zJeT6D3/VFFYCGQf7M= -github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= +github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/vicanso/elton v1.8.3 h1:4Zgkz5iBMocui2CdhzQC57ufJa+gYIpp3ZMSL4cSypc= -github.com/vicanso/elton v1.8.3/go.mod h1:kRFBJUwOyowPf2m2QHiOceWqqLPPV6/gClwTlkAIjyw= -github.com/vicanso/go-charts v1.0.1-0.20220305124249-82e05eec6479 h1:C4fiwWrTi0pQyp3VtlZT0xJspWqCEQ+wewCzK2YTEig= -github.com/vicanso/go-charts v1.0.1-0.20220305124249-82e05eec6479/go.mod h1:F5TpQhzNsyAupghCR2wtCXLPlNn4aEqxCBq08NUkZo8= -github.com/vicanso/hes v0.5.0 h1:CLbjbJl5lvVyAD44Dai0EXatGL7L5UWpvNwVtMyS2Eg= -github.com/vicanso/hes v0.5.0/go.mod h1:B0l1NIQM/nYw7owAd+hyHuNnAD8Nsx0T6duhVxmXUBY= -github.com/vicanso/intranet-ip v0.0.1 h1:cYS+mExFsKqewWSuHtFwAqw/CO66GsheB/P1BPmSTx0= -github.com/vicanso/intranet-ip v0.0.1/go.mod h1:bqQ6VUhxdz0ipSb1kzd6aoZStlp+pB7CTlVmVhgLAxA= +github.com/vicanso/elton v1.9.3 h1:BLYIZXakMQuNx96fUrz06pFH0PjIgNbzEX5n1QSRCYY= +github.com/vicanso/elton v1.9.3/go.mod h1:F0PIgeDHpvg0+pAUMHHNFOlmdL29SEpyRhWPuc7e53k= +github.com/vicanso/go-charts/v2 v2.0.0-alpha h1:3bH0pW+/OD3dQpx9TIF4q/kXGIq+N7j3peWpToG2i/4= +github.com/vicanso/go-charts/v2 v2.0.0-alpha/go.mod h1:OlgbGdGfxTfx/PPym1atWf6DKFiu/cmGN7Pn/H8cfYE= +github.com/vicanso/hes v0.6.0 h1:rmLhJw1PkZ+BTlJXt91i12mr7vpIC65S5KRCD4uF9HU= +github.com/vicanso/hes v0.6.0/go.mod h1:bO1pAVgzuwBJAv76LXx8YN6jXLWcCYVyNx4qzPw9h6Y= +github.com/vicanso/intranet-ip v0.1.0 h1:UeoxilO2VDIkeZZxmu6aT+f5o79mfGdsSdwoEv75nYo= +github.com/vicanso/intranet-ip v0.1.0/go.mod h1:N1yrHdDYWNsOs5V374DuAJHba+d2dxUDcjVALgIlfOg= github.com/vicanso/keygrip v1.2.1 h1:876fXDwGJqxdi4JxZ1lNGBxYswyLZotrs7AA2QWcLeY= github.com/vicanso/keygrip v1.2.1/go.mod h1:tfB5az1yqold78zotkzNugk3sV+QW5m71CFz3zg9eeo= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220617043117-41969df76e82 h1:KpZB5pUSBvrHltNEdK/tw0xlPeD13M6M6aGP32gKqiw= +golang.org/x/image v0.0.0-20220617043117-41969df76e82/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20220512140231-539c8e751b99/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index 8b52a14..7bda2a0 100644 --- a/main.go +++ b/main.go @@ -8,7 +8,7 @@ import ( "github.com/vicanso/elton" "github.com/vicanso/elton/middleware" - "github.com/vicanso/go-charts" + "github.com/vicanso/go-charts/v2" ) //go:embed web From 92458aece27cff52dc3f6b4a2de1df677cf13276 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 22 Jun 2022 20:30:10 +0800 Subject: [PATCH 157/251] refactor: adjust font size of mark point --- README.md | 2 +- README_zh.md | 2 +- chart_option_test.go | 2 +- charts.go | 1 + echarts_test.go | 2 +- mark_point.go | 25 +++++++++++++++++++------ mark_point_test.go | 2 +- 7 files changed, 25 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 8183871..d7d94f7 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [中文](./README_zh.md) -`go-charts` base on [go-chart](https://github.com/wcharczuk/go-chart),it is simpler way for generating charts, which supports `svg` and `png` format and themes: `light`, `dark`, `grafana` and `ant`. +`go-charts` base on [go-chart](https://github.com/wcharczuk/go-chart),it is simpler way for generating charts, which supports `svg` and `png` format and themes: `light`, `dark`, `grafana` and `ant`. The default format is `png` and the default theme is `light`. `Apache ECharts` is popular among Front-end developers, so `go-charts` supports the option of `Apache ECharts`. Developers can generate charts almost the same as `Apache ECharts`. diff --git a/README_zh.md b/README_zh.md index fed2d61..dbdaaf3 100644 --- a/README_zh.md +++ b/README_zh.md @@ -3,7 +3,7 @@ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-charts/blob/master/LICENSE) [![Build Status](https://github.com/vicanso/go-charts/workflows/Test/badge.svg)](https://github.com/vicanso/go-charts/actions) -`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart),更简单方便的形式生成数据图表,支持`svg`与`png`两种方式的输出,支持主题`light`, `dark`, `grafana`以及`ant`。 +`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart),更简单方便的形式生成数据图表,支持`svg`与`png`两种方式的输出,支持主题`light`, `dark`, `grafana`以及`ant`。默认的输入格式为`png`,默认主题为`light`。 `Apache ECharts`在前端开发中得到众多开发者的认可,因此`go-charts`提供了兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的图表截图(主题为light与grafana): diff --git a/chart_option_test.go b/chart_option_test.go index c77bb4f..5e53e46 100644 --- a/chart_option_test.go +++ b/chart_option_test.go @@ -277,7 +277,7 @@ func TestBarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nRainfallEvaporation24020016012080400JanFebMarAprMayJunJulAugSepOctNovDec162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporation24020016012080400JanFebMarAprMayJunJulAugSepOctNovDec162.22182.22.341.6248.07", string(data)) } func TestHorizontalBarRender(t *testing.T) { diff --git a/charts.go b/charts.go index cd1ac2b..a2e0ec0 100644 --- a/charts.go +++ b/charts.go @@ -28,6 +28,7 @@ import ( ) const labelFontSize = 10 +const smallLabelFontSize = 8 const defaultDotWidth = 2.0 const defaultStrokeWidth = 2.0 diff --git a/echarts_test.go b/echarts_test.go index 9c31286..4d50d9e 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -578,5 +578,5 @@ func TestRenderEChartsToSVG(t *testing.T) { ] }`) assert.Nil(err) - assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400JanFebMarAprMayJunJulAugSepOctNovDec162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400JanFebMarAprMayJunJulAugSepOctNovDec162.22182.22.341.6248.07", string(data)) } diff --git a/mark_point.go b/mark_point.go index 3d43a73..014b17f 100644 --- a/mark_point.go +++ b/mark_point.go @@ -24,6 +24,7 @@ package charts import ( "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2/drawing" ) func NewMarkPoint(markPointTypes ...string) SeriesMarkPoint { @@ -63,7 +64,6 @@ func NewMarkPointPainter(p *Painter) *markPointPainter { func (m *markPointPainter) Render() (Box, error) { painter := m.p - theme := m.p.theme for _, opt := range m.options { s := opt.Series if len(s.MarkPoint.Data) == 0 { @@ -75,15 +75,23 @@ func (m *markPointPainter) Render() (Box, error) { if symbolSize == 0 { symbolSize = 30 } - painter.OverrideDrawingStyle(Style{ - FillColor: opt.FillColor, - }).OverrideTextStyle(Style{ - FontColor: theme.GetTextColor(), + textStyle := Style{ + FontColor: drawing.Color{ + R: 238, + G: 238, + B: 238, + A: 255, + }, FontSize: labelFontSize, StrokeWidth: 1, Font: opt.Font, - }) + } + painter.OverrideDrawingStyle(Style{ + FillColor: opt.FillColor, + }).OverrideTextStyle(textStyle) for _, markPointData := range s.MarkPoint.Data { + textStyle.FontSize = labelFontSize + painter.OverrideTextStyle(textStyle) p := points[summary.MinIndex] value := summary.MinValue switch markPointData.Type { @@ -95,6 +103,11 @@ func (m *markPointPainter) Render() (Box, error) { painter.Pin(p.X, p.Y-symbolSize>>1, symbolSize) text := commafWithDigits(value) textBox := painter.MeasureText(text) + if textBox.Width() > symbolSize { + textStyle.FontSize = smallLabelFontSize + painter.OverrideTextStyle(textStyle) + textBox = painter.MeasureText(text) + } painter.Text(text, p.X-textBox.Width()>>1, p.Y-symbolSize>>1-2) } } diff --git a/mark_point_test.go b/mark_point_test.go index 1a810cf..ffa01a7 100644 --- a/mark_point_test.go +++ b/mark_point_test.go @@ -69,7 +69,7 @@ func TestMarkPoint(t *testing.T) { } return p.Bytes() }, - result: "\\n3", + result: "\\n3", }, } From 706896737b5f46a3581b061cb6ca25169032d847 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 22 Jun 2022 21:04:16 +0800 Subject: [PATCH 158/251] docs: update documents --- bar_chart.go | 4 +++- charts.go | 3 +++ funnel_chart.go | 3 +++ grid.go | 23 ++++++++++++++++------- horizontal_bar_chart.go | 2 ++ legend.go | 4 ++++ line_chart.go | 2 ++ mark_line.go | 2 ++ mark_point.go | 2 ++ painter.go | 2 +- pie_chart.go | 2 ++ radar_chart.go | 3 +++ range.go | 18 ++++++++++++++---- series.go | 24 +++++++++++++++++++----- theme.go | 1 + title.go | 1 + xaxis.go | 2 ++ yaxis.go | 3 +++ 18 files changed, 83 insertions(+), 18 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index 0ac9f47..26f8da5 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -32,6 +32,7 @@ type barChart struct { opt *BarChartOption } +// NewBarChart returns a bar chart renderer func NewBarChart(p *Painter, opt BarChartOption) *barChart { if opt.Theme == nil { opt.Theme = defaultTheme @@ -43,6 +44,7 @@ func NewBarChart(p *Painter, opt BarChartOption) *barChart { } type BarChartOption struct { + // The theme Theme ColorPalette // The font size Font *truetype.Font @@ -155,7 +157,7 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B if distance == 0 { distance = 5 } - text := NewValueLabelFormater(seriesNames, series.Label.Formatter)(index, item.Value, -1) + text := NewValueLabelFormatter(seriesNames, series.Label.Formatter)(index, item.Value, -1) labelStyle := Style{ FontColor: theme.GetTextColor(), FontSize: labelFontSize, diff --git a/charts.go b/charts.go index a2e0ec0..6c1c92b 100644 --- a/charts.go +++ b/charts.go @@ -35,11 +35,14 @@ const defaultStrokeWidth = 2.0 var defaultChartWidth = 600 var defaultChartHeight = 400 +// SetDefaultWidth sets default width of chart func SetDefaultWidth(width int) { if width > 0 { defaultChartWidth = width } } + +// SetDefaultHeight sets default height of chart func SetDefaultHeight(height int) { if height > 0 { defaultChartHeight = height diff --git a/funnel_chart.go b/funnel_chart.go index 7c04bfe..719853a 100644 --- a/funnel_chart.go +++ b/funnel_chart.go @@ -34,6 +34,7 @@ type funnelChart struct { opt *FunnelChartOption } +// NewFunnelSeriesList returns a series list for funnel func NewFunnelSeriesList(values []float64) SeriesList { seriesList := make(SeriesList, len(values)) for index, value := range values { @@ -44,6 +45,7 @@ func NewFunnelSeriesList(values []float64) SeriesList { return seriesList } +// NewFunnelChart returns a funnel chart renderer func NewFunnelChart(p *Painter, opt FunnelChartOption) *funnelChart { if opt.Theme == nil { opt.Theme = defaultTheme @@ -55,6 +57,7 @@ func NewFunnelChart(p *Painter, opt FunnelChartOption) *funnelChart { } type FunnelChartOption struct { + // The theme Theme ColorPalette // The font size Font *truetype.Font diff --git a/grid.go b/grid.go index 252fe2e..fb5dad6 100644 --- a/grid.go +++ b/grid.go @@ -28,16 +28,25 @@ type gridPainter struct { } type GridPainterOption struct { - StrokeWidth float64 - StrokeColor Color - Column int - Row int - IgnoreFirstRow bool - IgnoreLastRow bool + // The stroke width + StrokeWidth float64 + // The stroke color + StrokeColor Color + // The column of grid + Column int + // The row of grid + Row int + // Ignore first row + IgnoreFirstRow bool + // Ignore last row + IgnoreLastRow bool + // Ignore first column IgnoreFirstColumn bool - IgnoreLastColumn bool + // Ignore last column + IgnoreLastColumn bool } +// NewGridPainter returns new a grid renderer func NewGridPainter(p *Painter, opt GridPainterOption) *gridPainter { return &gridPainter{ p: p, diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index fb23734..30a9b7d 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -33,6 +33,7 @@ type horizontalBarChart struct { } type HorizontalBarChartOption struct { + // The theme Theme ColorPalette // The font size Font *truetype.Font @@ -50,6 +51,7 @@ type HorizontalBarChartOption struct { Legend LegendOption } +// NewHorizontalBarChart returns a horizontal bar chart renderer func NewHorizontalBarChart(p *Painter, opt HorizontalBarChartOption) *horizontalBarChart { if opt.Theme == nil { opt.Theme = defaultTheme diff --git a/legend.go b/legend.go index 65db102..2acd35b 100644 --- a/legend.go +++ b/legend.go @@ -36,6 +36,7 @@ const IconRect = "rect" const IconLineDot = "lineDot" type LegendOption struct { + // The theme Theme ColorPalette // Text array of legend Data []string @@ -60,6 +61,7 @@ type LegendOption struct { Show *bool } +// NewLegendOption returns a legend option func NewLegendOption(labels []string, left ...string) LegendOption { opt := LegendOption{ Data: labels, @@ -70,6 +72,7 @@ func NewLegendOption(labels []string, left ...string) LegendOption { return opt } +// IsEmpty checks legend is empty func (opt *LegendOption) IsEmpty() bool { isEmpty := true for _, v := range opt.Data { @@ -81,6 +84,7 @@ func (opt *LegendOption) IsEmpty() bool { return isEmpty } +// NewLegendPainter returns a legend renderer func NewLegendPainter(p *Painter, opt LegendOption) *legendPainter { return &legendPainter{ p: p, diff --git a/line_chart.go b/line_chart.go index f171813..0770447 100644 --- a/line_chart.go +++ b/line_chart.go @@ -32,6 +32,7 @@ type lineChart struct { opt *LineChartOption } +// NewLineChart returns a line chart render func NewLineChart(p *Painter, opt LineChartOption) *lineChart { if opt.Theme == nil { opt.Theme = defaultTheme @@ -43,6 +44,7 @@ func NewLineChart(p *Painter, opt LineChartOption) *lineChart { } type LineChartOption struct { + // The theme Theme ColorPalette // The font size Font *truetype.Font diff --git a/mark_line.go b/mark_line.go index a0efcfb..af1062d 100644 --- a/mark_line.go +++ b/mark_line.go @@ -27,6 +27,7 @@ import ( "github.com/wcharczuk/go-chart/v2" ) +// NewMarkLine returns a series mark line func NewMarkLine(markLineTypes ...string) SeriesMarkLine { data := make([]SeriesMarkData, len(markLineTypes)) for index, t := range markLineTypes { @@ -48,6 +49,7 @@ func (m *markLinePainter) Add(opt markLineRenderOption) { m.options = append(m.options, opt) } +// NewMarkLinePainter returns a mark line renderer func NewMarkLinePainter(p *Painter) *markLinePainter { return &markLinePainter{ p: p, diff --git a/mark_point.go b/mark_point.go index 014b17f..f6c93f3 100644 --- a/mark_point.go +++ b/mark_point.go @@ -27,6 +27,7 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) +// NewMarkPoint returns a series mark point func NewMarkPoint(markPointTypes ...string) SeriesMarkPoint { data := make([]SeriesMarkData, len(markPointTypes)) for index, t := range markPointTypes { @@ -55,6 +56,7 @@ type markPointRenderOption struct { Points []Point } +// NewMarkPointPainter returns a mark point renderer func NewMarkPointPainter(p *Painter) *markPointPainter { return &markPointPainter{ p: p, diff --git a/painter.go b/painter.go index da07007..c250369 100644 --- a/painter.go +++ b/painter.go @@ -136,7 +136,7 @@ func PainterWidthHeightOption(width, height int) PainterOption { } } -// NewPainter creates a new painter +// NewPainter creates a painter func NewPainter(opts PainterOptions, opt ...PainterOption) (*Painter, error) { if opts.Width <= 0 || opts.Height <= 0 { return nil, errors.New("width/height can not be nil") diff --git a/pie_chart.go b/pie_chart.go index 972b4c1..6382140 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -36,6 +36,7 @@ type pieChart struct { } type PieChartOption struct { + // The theme Theme ColorPalette // The font size Font *truetype.Font @@ -51,6 +52,7 @@ type PieChartOption struct { backgroundIsFilled bool } +// NewPieChart returns a pie chart renderer func NewPieChart(p *Painter, opt PieChartOption) *pieChart { if opt.Theme == nil { opt.Theme = defaultTheme diff --git a/radar_chart.go b/radar_chart.go index 5b8aa85..eab70d5 100644 --- a/radar_chart.go +++ b/radar_chart.go @@ -45,6 +45,7 @@ type RadarIndicator struct { } type RadarChartOption struct { + // The theme Theme ColorPalette // The font size Font *truetype.Font @@ -62,6 +63,7 @@ type RadarChartOption struct { backgroundIsFilled bool } +// NewRadarIndicators returns a radar indicator list func NewRadarIndicators(names []string, values []float64) []RadarIndicator { if len(names) != len(values) { return nil @@ -76,6 +78,7 @@ func NewRadarIndicators(names []string, values []float64) []RadarIndicator { return indicators } +// NewRadarChart returns a radar chart renderer func NewRadarChart(p *Painter, opt RadarChartOption) *radarChart { if opt.Theme == nil { opt.Theme = defaultTheme diff --git a/range.go b/range.go index d5a9ef7..579a77f 100644 --- a/range.go +++ b/range.go @@ -37,13 +37,19 @@ type axisRange struct { } type AxisRangeOption struct { - Min float64 - Max float64 - Size int - Boundary bool + // The min value of axis + Min float64 + // The max value of axis + Max float64 + // The size of axis + Size int + // Boundary gap + Boundary bool + // The count of divide DivideCount int } +// NewRange returns a axis range func NewRange(opt AxisRangeOption) axisRange { max := opt.Max min := opt.Min @@ -88,6 +94,7 @@ func NewRange(opt AxisRangeOption) axisRange { } } +// Values returns values of range func (r axisRange) Values() []string { offset := (r.max - r.min) / float64(r.divideCount) values := make([]string, 0) @@ -108,10 +115,13 @@ func (r *axisRange) getRestHeight(value float64) int { return r.size - r.getHeight(value) } +// GetRange returns a range of index func (r *axisRange) GetRange(index int) (float64, float64) { unit := float64(r.size) / float64(r.divideCount) return unit * float64(index), unit * float64(index+1) } + +// AutoDivide divides the axis func (r *axisRange) AutoDivide() []int { return autoDivide(r.size, r.divideCount) } diff --git a/series.go b/series.go index 44c4749..87a719f 100644 --- a/series.go +++ b/series.go @@ -36,6 +36,7 @@ type SeriesData struct { Style Style } +// NewSeriesListDataFromValues returns a series list func NewSeriesListDataFromValues(values [][]float64, chartType ...string) SeriesList { seriesList := make(SeriesList, len(values)) for index, value := range values { @@ -44,6 +45,7 @@ func NewSeriesListDataFromValues(values [][]float64, chartType ...string) Series return seriesList } +// NewSeriesFromValues returns a series func NewSeriesFromValues(values []float64, chartType ...string) Series { s := Series{ Data: NewSeriesDataFromValues(values), @@ -54,6 +56,7 @@ func NewSeriesFromValues(values []float64, chartType ...string) Series { return s } +// NewSeriesDataFromValues return a series data func NewSeriesDataFromValues(values []float64) []SeriesData { data := make([]SeriesData, len(values)) for index, value := range values { @@ -204,13 +207,19 @@ func NewPieSeriesList(values []float64, opts ...PieSeriesOption) SeriesList { } type seriesSummary struct { - MaxIndex int - MaxValue float64 - MinIndex int - MinValue float64 + // The index of max value + MaxIndex int + // The max value + MaxValue float64 + // The index of min value + MinIndex int + // The min value + MinValue float64 + // THe average value AverageValue float64 } +// Summary get summary of series func (s *Series) Summary() seriesSummary { minIndex := -1 maxIndex := -1 @@ -237,6 +246,7 @@ func (s *Series) Summary() seriesSummary { } } +// Names returns the names of series list func (sl SeriesList) Names() []string { names := make([]string, len(sl)) for index, s := range sl { @@ -245,8 +255,10 @@ func (sl SeriesList) Names() []string { return names } +// LabelFormatter label formatter type LabelFormatter func(index int, value float64, percent float64) string +// NewPieLabelFormatter returns a pie label formatter func NewPieLabelFormatter(seriesNames []string, layout string) LabelFormatter { if len(layout) == 0 { layout = "{b}: {d}" @@ -254,13 +266,15 @@ func NewPieLabelFormatter(seriesNames []string, layout string) LabelFormatter { return NewLabelFormatter(seriesNames, layout) } -func NewValueLabelFormater(seriesNames []string, layout string) LabelFormatter { +// NewValueLabelFormatter returns a value formatter +func NewValueLabelFormatter(seriesNames []string, layout string) LabelFormatter { if len(layout) == 0 { layout = "{c}" } return NewLabelFormatter(seriesNames, layout) } +// NewLabelFormatter returns a label formaatter func NewLabelFormatter(seriesNames []string, layout string) LabelFormatter { return func(index int, value, percent float64) string { // 如果无percent的则设置为<0 diff --git a/theme.go b/theme.go index 26786b9..31c3bf8 100644 --- a/theme.go +++ b/theme.go @@ -220,6 +220,7 @@ func init() { SetDefaultTheme(ThemeLight) } +// SetDefaultTheme sets default theme func SetDefaultTheme(name string) { defaultTheme = NewTheme(name) } diff --git a/title.go b/title.go index a805c55..5af4c39 100644 --- a/title.go +++ b/title.go @@ -84,6 +84,7 @@ type titlePainter struct { opt *TitleOption } +// NewTitlePainter returns a title renderer func NewTitlePainter(p *Painter, opt TitleOption) *titlePainter { return &titlePainter{ p: p, diff --git a/xaxis.go b/xaxis.go index bfb57cb..00636a5 100644 --- a/xaxis.go +++ b/xaxis.go @@ -53,6 +53,7 @@ type XAxisOption struct { const defaultXAxisHeight = 30 +// NewXAxisOption returns a x axis option func NewXAxisOption(data []string, boundaryGap ...*bool) XAxisOption { opt := XAxisOption{ Data: data, @@ -89,6 +90,7 @@ func (opt *XAxisOption) ToAxisOption() AxisOption { return axisOpt } +// NewBottomXAxis returns a bottom x axis renderer func NewBottomXAxis(p *Painter, opt XAxisOption) *axisPainter { return NewAxisPainter(p, opt.ToAxisOption()) } diff --git a/yaxis.go b/yaxis.go index 265ac59..b0bfa86 100644 --- a/yaxis.go +++ b/yaxis.go @@ -50,6 +50,7 @@ type YAxisOption struct { isCategoryAxis bool } +// NewYAxisOptions returns a y axis option func NewYAxisOptions(data []string, others ...[]string) []YAxisOption { arr := [][]string{ data, @@ -95,6 +96,7 @@ func (opt *YAxisOption) ToAxisOption() AxisOption { return axisOpt } +// NewLeftYAxis returns a left y axis renderer func NewLeftYAxis(p *Painter, opt YAxisOption) *axisPainter { p = p.Child(PainterPaddingOption(Box{ Bottom: defaultXAxisHeight, @@ -102,6 +104,7 @@ func NewLeftYAxis(p *Painter, opt YAxisOption) *axisPainter { return NewAxisPainter(p, opt.ToAxisOption()) } +// NewRightYAxis returns a right y axis renderer func NewRightYAxis(p *Painter, opt YAxisOption) *axisPainter { p = p.Child(PainterPaddingOption(Box{ Bottom: defaultXAxisHeight, From 8c5647f65f160118c285a28b4e59a8ec6700ecc6 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 23 Jun 2022 20:32:25 +0800 Subject: [PATCH 159/251] test: add test for axis --- grid.go | 3 ++ grid_test.go | 18 ++++++++++ painter.go | 16 ++++++--- series_test.go | 89 +++++++++++++++++++++++++++++++++++++++++++++++ table.go | 53 ++++++++++++++++++++++++++++ title.go | 3 ++ title_test.go | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++ util.go | 24 +++++++++++++ yaxis.go | 14 +++++--- yaxis_test.go | 70 +++++++++++++++++++++++++++++++++++++ 10 files changed, 374 insertions(+), 9 deletions(-) create mode 100644 series_test.go create mode 100644 table.go create mode 100644 title_test.go create mode 100644 yaxis_test.go diff --git a/grid.go b/grid.go index fb5dad6..0ebd226 100644 --- a/grid.go +++ b/grid.go @@ -32,6 +32,8 @@ type GridPainterOption struct { StrokeWidth float64 // The stroke color StrokeColor Color + // The spans of column + ColumnSpans []int // The column of grid Column int // The row of grid @@ -81,6 +83,7 @@ func (g *gridPainter) Render() (Box, error) { }) g.p.Grid(GridOption{ Column: opt.Column, + ColumnSpans: opt.ColumnSpans, Row: opt.Row, IgnoreColumnLines: ignoreColumnLines, IgnoreRowLines: ignoreRowLines, diff --git a/grid_test.go b/grid_test.go index f6880dc..3110a2b 100644 --- a/grid_test.go +++ b/grid_test.go @@ -54,6 +54,24 @@ func TestGrid(t *testing.T) { }, result: "\\n", }, + { + render: func(p *Painter) ([]byte, error) { + _, err := NewGridPainter(p, GridPainterOption{ + StrokeColor: drawing.ColorBlack, + ColumnSpans: []int{ + 2, + 5, + 3, + }, + Row: 6, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\n", + }, } for _, tt := range tests { p, err := NewPainter(PainterOptions{ diff --git a/painter.go b/painter.go index c250369..1f9d418 100644 --- a/painter.go +++ b/painter.go @@ -69,8 +69,9 @@ type MultiTextOption struct { } type GridOption struct { - Column int - Row int + Column int + Row int + ColumnSpans []int // 忽略不展示的column IgnoreColumnLines []int // 忽略不展示的row @@ -542,6 +543,9 @@ func (p *Painter) TextFit(body string, x, y, width int) chart.Box { var output chart.Box for index, line := range lines { + if line == "" { + continue + } x0 := x y0 := y + output.Height() p.Text(line, x0, y0) @@ -690,8 +694,12 @@ func (p *Painter) Grid(opt GridOption) *Painter { }) } } - if opt.Column > 0 { - values := autoDivide(width, opt.Column) + columnCount := sumInt(opt.ColumnSpans) + if columnCount == 0 { + columnCount = opt.Column + } + if columnCount > 0 { + values := autoDivideSpans(width, columnCount, opt.ColumnSpans) drawLines(values, opt.IgnoreColumnLines, true) } if opt.Row > 0 { diff --git a/series_test.go b/series_test.go new file mode 100644 index 0000000..40d2f91 --- /dev/null +++ b/series_test.go @@ -0,0 +1,89 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewSeriesListDataFromValues(t *testing.T) { + assert := assert.New(t) + + assert.Equal(SeriesList{ + { + Type: ChartTypeBar, + Data: []SeriesData{ + { + Value: 1.0, + }, + }, + }, + }, NewSeriesListDataFromValues([][]float64{ + { + 1, + }, + }, ChartTypeBar)) +} + +func TestSeriesLists(t *testing.T) { + assert := assert.New(t) + seriesList := NewSeriesListDataFromValues([][]float64{ + { + 1, + 2, + }, + { + 10, + }, + }, ChartTypeBar) + + assert.Equal(2, len(seriesList.Filter(ChartTypeBar))) + assert.Equal(0, len(seriesList.Filter(ChartTypeLine))) + + max, min := seriesList.GetMaxMin(0) + assert.Equal(float64(10), max) + assert.Equal(float64(1), min) + + assert.Equal(seriesSummary{ + MaxIndex: 1, + MaxValue: 2, + MinIndex: 0, + MinValue: 1, + AverageValue: 1.5, + }, seriesList[0].Summary()) +} + +func TestFormatter(t *testing.T) { + assert := assert.New(t) + + assert.Equal("a: 12%", NewPieLabelFormatter([]string{ + "a", + "b", + }, "")(0, 10, 0.12)) + + assert.Equal("10", NewValueLabelFormatter([]string{ + "a", + "b", + }, "")(0, 10, 0.12)) +} diff --git a/table.go b/table.go new file mode 100644 index 0000000..e47914c --- /dev/null +++ b/table.go @@ -0,0 +1,53 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +type tableChart struct { + p *Painter + opt *TableChartOption +} + +func NewTableChart(p *Painter, opt TableChartOption) *tableChart { + if opt.Theme == nil { + opt.Theme = defaultTheme + } + return &tableChart{ + p: p, + opt: &opt, + } +} + +type TableChartOption struct { + // The theme + Theme ColorPalette + // The padding of table cell + Padding Box + // The header data of table + HeaderData []string + // The data of table + Data [][]string +} + +func (c *tableChart) Render() (Box, error) { + return BoxZero, nil +} diff --git a/title.go b/title.go index 5af4c39..5cdd161 100644 --- a/title.go +++ b/title.go @@ -97,6 +97,9 @@ func (t *titlePainter) Render() (Box, error) { p := t.p theme := opt.Theme + if theme == nil { + theme = p.theme + } if opt.Text == "" && opt.Subtext == "" { return BoxZero, nil } diff --git a/title_test.go b/title_test.go new file mode 100644 index 0000000..add8163 --- /dev/null +++ b/title_test.go @@ -0,0 +1,93 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestTitleRenderer(t *testing.T) { + assert := assert.New(t) + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + _, err := NewTitlePainter(p, TitleOption{ + Text: "title", + Subtext: "subTitle", + Left: "20", + Top: "20", + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\ntitlesubTitle", + }, + { + render: func(p *Painter) ([]byte, error) { + _, err := NewTitlePainter(p, TitleOption{ + Text: "title", + Subtext: "subTitle", + Left: "20%", + Top: "20", + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\ntitlesubTitle", + }, + { + render: func(p *Painter) ([]byte, error) { + _, err := NewTitlePainter(p, TitleOption{ + Text: "title", + Subtext: "subTitle", + Left: PositionRight, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\ntitlesubTitle", + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} diff --git a/util.go b/util.go index adfa9fd..a33c6d2 100644 --- a/util.go +++ b/util.go @@ -90,6 +90,30 @@ func autoDivide(max, size int) []int { return values } +func autoDivideSpans(max, size int, spans []int) []int { + values := autoDivide(max, size) + // 重新合并 + if len(spans) != 0 { + newValues := make([]int, len(spans)+1) + newValues[0] = 0 + end := 0 + for index, v := range spans { + end += v + newValues[index+1] = values[end] + } + values = newValues + } + return values +} + +func sumInt(values []int) int { + sum := 0 + for _, v := range values { + sum += v + } + return sum +} + // measureTextMaxWidthHeight returns maxWidth and maxHeight of text list func measureTextMaxWidthHeight(textList []string, p *Painter) (int, int) { maxWidth := 0 diff --git a/yaxis.go b/yaxis.go index b0bfa86..eb9034c 100644 --- a/yaxis.go +++ b/yaxis.go @@ -65,14 +65,18 @@ func NewYAxisOptions(data []string, others ...[]string) []YAxisOption { return opts } -func (opt *YAxisOption) ToAxisOption() AxisOption { +func (opt *YAxisOption) ToAxisOption(p *Painter) AxisOption { position := PositionLeft if opt.Position == PositionRight { position = PositionRight } + theme := opt.Theme + if theme == nil { + theme = p.theme + } axisOpt := AxisOption{ Formatter: opt.Formatter, - Theme: opt.Theme, + Theme: theme, Data: opt.Data, Position: position, FontSize: opt.FontSize, @@ -81,7 +85,7 @@ func (opt *YAxisOption) ToAxisOption() AxisOption { FontColor: opt.FontColor, BoundaryGap: FalseFlag(), SplitLineShow: true, - SplitLineColor: opt.Theme.GetAxisSplitLineColor(), + SplitLineColor: theme.GetAxisSplitLineColor(), Show: opt.Show, } if !opt.Color.IsZero() { @@ -101,7 +105,7 @@ func NewLeftYAxis(p *Painter, opt YAxisOption) *axisPainter { p = p.Child(PainterPaddingOption(Box{ Bottom: defaultXAxisHeight, })) - return NewAxisPainter(p, opt.ToAxisOption()) + return NewAxisPainter(p, opt.ToAxisOption(p)) } // NewRightYAxis returns a right y axis renderer @@ -109,7 +113,7 @@ func NewRightYAxis(p *Painter, opt YAxisOption) *axisPainter { p = p.Child(PainterPaddingOption(Box{ Bottom: defaultXAxisHeight, })) - axisOpt := opt.ToAxisOption() + axisOpt := opt.ToAxisOption(p) axisOpt.Position = PositionRight axisOpt.SplitLineShow = false return NewAxisPainter(p, axisOpt) diff --git a/yaxis_test.go b/yaxis_test.go new file mode 100644 index 0000000..0f565ac --- /dev/null +++ b/yaxis_test.go @@ -0,0 +1,70 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestRightYAxis(t *testing.T) { + assert := assert.New(t) + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + opt := NewYAxisOptions([]string{ + "a", + "b", + "c", + "d", + })[0] + _, err := NewRightYAxis(p, opt).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nabcd", + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme), PainterPaddingOption(Box{ + Top: 10, + Right: 10, + Bottom: 10, + Left: 10, + })) + assert.Nil(err) + data, err := tt.render(p) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} From 2fb0ebcbf7a5f8efd8c4f14c1b3056e2e29af688 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 23 Jun 2022 23:29:13 +0800 Subject: [PATCH 160/251] feat: support table render --- chart_option.go | 69 ++++++++++++++ examples/table/main.go | 79 ++++++++++++++++ painter.go | 22 +++-- painter_test.go | 28 +++--- table.go | 201 ++++++++++++++++++++++++++++++++++++++++- table_test.go | 100 ++++++++++++++++++++ 6 files changed, 476 insertions(+), 23 deletions(-) create mode 100644 examples/table/main.go create mode 100644 table_test.go diff --git a/chart_option.go b/chart_option.go index f2f3b51..b7b4714 100644 --- a/chart_option.go +++ b/chart_option.go @@ -23,6 +23,7 @@ package charts import ( + "fmt" "sort" "github.com/golang/freetype/truetype" @@ -336,3 +337,71 @@ func FunnelRender(values []float64, opts ...OptionFunc) (*Painter, error) { SeriesList: seriesList, }, opts...) } + +func TableRender(opt TableChartOption) (*Painter, error) { + if opt.Type == "" { + opt.Type = ChartOutputPNG + } + if opt.Width <= 0 { + opt.Width = defaultChartWidth + } + if opt.Height <= 0 { + opt.Height = defaultChartHeight + } + if opt.Font == nil { + opt.Font, _ = chart.GetDefaultFont() + } + + p, err := NewPainter(PainterOptions{ + Type: opt.Type, + Width: opt.Width, + Height: opt.Height, + Font: opt.Font, + }) + if err != nil { + return nil, err + } + info, err := NewTableChart(p, opt).render() + if err != nil { + return nil, err + } + fmt.Println(*info) + fmt.Println(info.Height) + + p, err = NewPainter(PainterOptions{ + Type: opt.Type, + Width: info.Width, + Height: info.Height, + Font: opt.Font, + }) + if err != nil { + return nil, err + } + _, err = NewTableChart(p, opt).Render() + if err != nil { + return nil, err + } + + // opt := ChartOption{} + // for _, fn := range opts { + // fn(&opt) + // } + // opt.fillDefault() + // p, err := NewPainter(PainterOptions{ + // Type: opt.Type, + // Width: opt.Width, + // Height: opt.Height, + // Font: opt.font, + // }) + // if err != nil { + // return nil, err + // } + // _, err = NewTableChart(p, TableChartOption{ + // Header: header, + // Data: data, + // }).Render() + // if err != nil { + // return nil, err + // } + return p, nil +} diff --git a/examples/table/main.go b/examples/table/main.go new file mode 100644 index 0000000..650566c --- /dev/null +++ b/examples/table/main.go @@ -0,0 +1,79 @@ +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + + "github.com/vicanso/go-charts/v2" +) + +func writeFile(buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file := filepath.Join(tmpPath, "table.png") + err = ioutil.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func main() { + p, err := charts.TableRender(charts.TableChartOption{ + Header: []string{ + "Name", + "Age", + "Address", + "Tag", + "Action", + }, + Spans: []int{ + 1, + 1, + 2, + 1, + 1, + }, + Data: [][]string{ + { + "John Brown", + "32", + "New York No. 1 Lake Park", + "nice, developer", + "Send Mail", + }, + { + "Jim Green ", + "42", + "London No. 1 Lake Park", + "wow", + "Send Mail", + }, + { + "Joe Black ", + "32", + "Sidney No. 1 Lake Park", + "cool, teacher", + "Send Mail", + }, + }, + }, + ) + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + err = writeFile(buf) + if err != nil { + panic(err) + } +} diff --git a/painter.go b/painter.go index 1f9d418..c787315 100644 --- a/painter.go +++ b/painter.go @@ -468,7 +468,7 @@ func (p *Painter) SmoothLineStroke(points []Point) *Painter { return p } -func (p *Painter) SetBackground(width, height int, color Color) *Painter { +func (p *Painter) SetBackground(width, height int, color Color, inside ...bool) *Painter { r := p.render s := chart.Style{ FillColor: color, @@ -476,12 +476,20 @@ func (p *Painter) SetBackground(width, height int, color Color) *Painter { // 背景色 p.SetDrawingStyle(s) defer p.ResetStyle() - // 设置背景色不使用box,因此不直接使用Painter - r.MoveTo(0, 0) - r.LineTo(width, 0) - r.LineTo(width, height) - r.LineTo(0, height) - r.LineTo(0, 0) + if len(inside) != 0 && inside[0] { + p.MoveTo(0, 0) + p.LineTo(width, 0) + p.LineTo(width, height) + p.LineTo(0, height) + p.LineTo(0, 0) + } else { + // 设置背景色不使用box,因此不直接使用Painter + r.MoveTo(0, 0) + r.LineTo(width, 0) + r.LineTo(width, height) + r.LineTo(0, height) + r.LineTo(0, 0) + } p.FillStroke() return p } diff --git a/painter_test.go b/painter_test.go index 8892563..96e41ef 100644 --- a/painter_test.go +++ b/painter_test.go @@ -143,13 +143,13 @@ func TestPainter(t *testing.T) { fn: func(p *Painter) { p.SetStyle(Style{ StrokeWidth: 1, - StrokeColor: drawing.Color{ + StrokeColor: Color{ R: 84, G: 112, B: 198, A: 255, }, - FillColor: drawing.Color{ + FillColor: Color{ R: 84, G: 112, B: 198, @@ -165,13 +165,13 @@ func TestPainter(t *testing.T) { fn: func(p *Painter) { p.SetStyle(Style{ StrokeWidth: 1, - StrokeColor: drawing.Color{ + StrokeColor: Color{ R: 84, G: 112, B: 198, A: 255, }, - FillColor: drawing.Color{ + FillColor: Color{ R: 84, G: 112, B: 198, @@ -187,13 +187,13 @@ func TestPainter(t *testing.T) { fn: func(p *Painter) { p.SetStyle(Style{ StrokeWidth: 1, - StrokeColor: drawing.Color{ + StrokeColor: Color{ R: 84, G: 112, B: 198, A: 255, }, - FillColor: drawing.Color{ + FillColor: Color{ R: 84, G: 112, B: 198, @@ -209,13 +209,13 @@ func TestPainter(t *testing.T) { fn: func(p *Painter) { p.SetStyle(Style{ StrokeWidth: 1, - StrokeColor: drawing.Color{ + StrokeColor: Color{ R: 84, G: 112, B: 198, A: 255, }, - FillColor: drawing.Color{ + FillColor: Color{ R: 84, G: 112, B: 198, @@ -231,13 +231,13 @@ func TestPainter(t *testing.T) { fn: func(p *Painter) { p.SetStyle(Style{ StrokeWidth: 1, - StrokeColor: drawing.Color{ + StrokeColor: Color{ R: 84, G: 112, B: 198, A: 255, }, - FillColor: drawing.Color{ + FillColor: Color{ R: 84, G: 112, B: 198, @@ -253,13 +253,13 @@ func TestPainter(t *testing.T) { fn: func(p *Painter) { p.SetStyle(Style{ StrokeWidth: 1, - StrokeColor: drawing.Color{ + StrokeColor: Color{ R: 84, G: 112, B: 198, A: 255, }, - FillColor: drawing.Color{ + FillColor: Color{ R: 84, G: 112, B: 198, @@ -279,7 +279,7 @@ func TestPainter(t *testing.T) { fn: func(p *Painter) { p.SetStyle(Style{ StrokeWidth: 1, - StrokeColor: drawing.Color{ + StrokeColor: Color{ R: 84, G: 112, B: 198, @@ -297,7 +297,7 @@ func TestPainter(t *testing.T) { { fn: func(p *Painter) { p.SetDrawingStyle(Style{ - FillColor: drawing.Color{ + FillColor: Color{ R: 84, G: 112, B: 198, diff --git a/table.go b/table.go index e47914c..34dee67 100644 --- a/table.go +++ b/table.go @@ -22,6 +22,14 @@ package charts +import ( + "errors" + + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" + "github.com/wcharczuk/go-chart/v2/drawing" +) + type tableChart struct { p *Painter opt *TableChartOption @@ -38,16 +46,205 @@ func NewTableChart(p *Painter, opt TableChartOption) *tableChart { } type TableChartOption struct { + // The output type + Type string + // The width of table + Width int + // The height of table + Height int // The theme Theme ColorPalette // The padding of table cell Padding Box // The header data of table - HeaderData []string + Header []string // The data of table Data [][]string + // The span of table column + Spans []int + // The font size of table + FontSize float64 + Font *truetype.Font + // The font color of table + FontColor Color + // The background color of header + HeaderBackgroundColor Color + // The header font color + HeaderFontColor Color + // The background color of row + RowBackgroundColors []Color + // The background color + BackgroundColor Color +} + +var defaultTableHeaderColor = Color{ + R: 34, + G: 34, + B: 34, + A: 255, +} +var defaultTableRowColors = []Color{ + drawing.ColorWhite, + { + R: 242, + G: 242, + B: 242, + A: 255, + }, +} +var defaultTablePadding = Box{ + Left: 10, + Top: 10, + Right: 10, + Bottom: 10, +} + +type renderInfo struct { + Width int + Height int + HeaderHeight int + RowHeights []int +} + +func (c *tableChart) render() (*renderInfo, error) { + info := renderInfo{ + RowHeights: make([]int, 0), + } + p := c.p + opt := c.opt + if len(opt.Header) == 0 { + return nil, errors.New("header can not be nil") + } + theme := opt.Theme + if theme == nil { + theme = p.theme + } + fontSize := opt.FontSize + if fontSize == 0 { + fontSize = 12 + } + fontColor := opt.FontColor + if fontColor.IsZero() { + fontColor = theme.GetTextColor() + } + font := opt.Font + if font == nil { + font = theme.GetFont() + } + headerFontColor := opt.HeaderFontColor + if opt.HeaderFontColor.IsZero() { + headerFontColor = drawing.ColorWhite + } + + spans := opt.Spans + if len(spans) != 0 && len(spans) != len(opt.Header) { + newSpans := make([]int, len(opt.Header)) + for index := range opt.Header { + if len(spans) < index { + newSpans[index] = 1 + } else { + newSpans[index] = spans[index] + } + } + spans = newSpans + } + + values := autoDivideSpans(p.Width(), len(opt.Header)+1, spans) + height := 0 + textStyle := Style{ + FontSize: fontSize, + FontColor: headerFontColor, + FillColor: headerFontColor, + Font: font, + } + p.SetStyle(textStyle) + + headerHeight := 0 + padding := opt.Padding + if padding.IsZero() { + padding = defaultTablePadding + } + + renderTableCells := func(textList []string, currentHeight int, cellPadding Box) int { + cellMaxHeight := 0 + paddingHeight := cellPadding.Top + cellPadding.Bottom + paddingWidth := cellPadding.Left + cellPadding.Right + for index, text := range textList { + x := values[index] + y := currentHeight + cellPadding.Top + width := values[index+1] - x + x += cellPadding.Left + width -= paddingWidth + box := p.TextFit(text, x, y+int(fontSize), width) + if box.Height()+paddingHeight > cellMaxHeight { + cellMaxHeight = box.Height() + paddingHeight + } + } + return cellMaxHeight + } + + headerHeight = renderTableCells(opt.Header, height, padding) + height += headerHeight + info.HeaderHeight = headerHeight + + textStyle.FontColor = fontColor + textStyle.FillColor = fontColor + p.SetStyle(textStyle) + for _, textList := range opt.Data { + cellHeight := renderTableCells(textList, height, padding) + info.RowHeights = append(info.RowHeights, cellHeight) + height += cellHeight + } + + info.Width = p.Width() + info.Height = height + return &info, nil } func (c *tableChart) Render() (Box, error) { - return BoxZero, nil + p := c.p + opt := c.opt + if !opt.BackgroundColor.IsZero() { + p.SetBackground(p.Width(), p.Height(), opt.BackgroundColor) + } + headerBGColor := opt.HeaderBackgroundColor + if headerBGColor.IsZero() { + headerBGColor = defaultTableHeaderColor + } + + r := p.render + newRender, err := chart.SVG(p.Width(), 100) + if err != nil { + return BoxZero, err + } + p.render = newRender + info, err := c.render() + if err != nil { + return BoxZero, err + } + p.render = r + // 如果设置表头背景色 + p.SetBackground(info.Width, info.HeaderHeight, headerBGColor, true) + currentHeight := info.HeaderHeight + rowColors := opt.RowBackgroundColors + if len(rowColors) == 0 { + rowColors = defaultTableRowColors + } + for index, h := range info.RowHeights { + color := rowColors[index%len(rowColors)] + child := p.Child(PainterPaddingOption(Box{ + Top: currentHeight, + })) + child.SetBackground(p.Width(), h, color, true) + currentHeight += h + } + _, err = c.render() + if err != nil { + return BoxZero, err + } + + return Box{ + Right: info.Width, + Bottom: info.Height, + }, nil } diff --git a/table_test.go b/table_test.go new file mode 100644 index 0000000..c54de25 --- /dev/null +++ b/table_test.go @@ -0,0 +1,100 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestTableChart(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + _, err := NewTableChart(p, TableChartOption{ + Header: []string{ + "Name", + "Age", + "Address", + "Tag", + "Action", + }, + Spans: []int{ + 1, + 1, + 2, + 1, + 1, + }, + Data: [][]string{ + { + "John Brown", + "32", + "New York No. 1 Lake Park", + "nice, developer", + "Send Mail", + }, + { + "Jim Green ", + "42", + "London No. 1 Lake Park", + "wow", + "Send Mail", + }, + { + "Joe Black ", + "32", + "Sidney No. 1 Lake Park", + "cool, teacher", + "Send Mail", + }, + }, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 600, + Height: 400, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p) + assert.Nil(err) + fmt.Println(string(data)) + assert.Equal(tt.result, string(data)) + } + +} From 7894d999538273f05ccdcf8a367542b9418cfd4b Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 24 Jun 2022 20:25:31 +0800 Subject: [PATCH 161/251] feat: support png output type --- main.go | 13 ++++++++++++- web/index.css | 6 +++++- web/index.html | 8 +++++++- web/index.js | 10 ++++++++-- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index 7bda2a0..3f367a1 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "bytes" "embed" + "encoding/base64" "fmt" "time" @@ -50,10 +51,20 @@ func main() { return nil }) e.POST("/", func(c *elton.Context) error { - buf, err := charts.RenderEChartsToSVG(string(c.RequestBody)) + outputType := c.QueryParam("outputType") + fn := charts.RenderEChartsToSVG + isPNG := false + if outputType == "png" { + isPNG = true + fn = charts.RenderEChartsToPNG + } + buf, err := fn(string(c.RequestBody)) if err != nil { return err } + if isPNG { + buf = []byte(base64.StdEncoding.EncodeToString(buf)) + } c.BodyBuffer = bytes.NewBuffer(buf) return nil }) diff --git a/web/index.css b/web/index.css index e5f5994..7709f9b 100644 --- a/web/index.css +++ b/web/index.css @@ -11,6 +11,10 @@ body { background-color: #383838; text-indent: 2em; } +.header span { + margin-left: 50px; + margin-right: 5px; +} .codeWrapper { position: fixed; left: 0; @@ -61,7 +65,7 @@ body { top: 50%; margin-top: -200px; } -svg { +#svg svg, #svg img { display: block; margin: auto; } \ No newline at end of file diff --git a/web/index.html b/web/index.html index 0fb964e..4de3b5c 100644 --- a/web/index.html +++ b/web/index.html @@ -20,7 +20,13 @@ -

+
Go Charts + 选择图表输出格式: + +
ECharts配置
diff --git a/web/index.js b/web/index.js index e82c2a3..7cfe3bb 100644 --- a/web/index.js +++ b/web/index.js @@ -35,9 +35,15 @@ function run() { alert(err.message); return; } + var dom = document.getElementById("outputType") + var outputType = dom.value; - axios.post("/", data).then(function(resp) { - document.getElementById("svg").innerHTML = resp; + axios.post("/?outputType=" + outputType, data).then(function(resp) { + if (outputType == "png") { + document.getElementById("svg").innerHTML = ''; + } else { + document.getElementById("svg").innerHTML = resp; + } }).catch(function(err) { alert(err.message); }); From b3a3018ea2eb6f71b126ce053f1d9410225a0689 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Jun 2022 08:21:27 +0800 Subject: [PATCH 162/251] feat: support table redner --- README.md | 68 +++++++++++++++ README_zh.md | 64 ++++++++++++++ chart_option.go | 61 ++++++------- examples/charts/main.go | 42 +++++++++ examples/table/main.go | 76 ++++++++-------- painter.go | 4 + table.go | 188 ++++++++++++++++++++++++++++++---------- table_test.go | 46 +++++++++- 8 files changed, 433 insertions(+), 116 deletions(-) diff --git a/README.md b/README.md index d7d94f7..d0549f0 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,9 @@ Screenshot of common charts, the left part is light theme, the right part is gra go-charts

+

+ go-table +

## Chart Type These chart types are supported: `line`, `bar`, `pie`, `radar` or `funnel`. @@ -374,6 +377,71 @@ func main() { } ``` +### Table + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + header := []string{ + "Name", + "Age", + "Address", + "Tag", + "Action", + } + data := [][]string{ + { + "John Brown", + "32", + "New York No. 1 Lake Park", + "nice, developer", + "Send Mail", + }, + { + "Jim Green ", + "42", + "London No. 1 Lake Park", + "wow", + "Send Mail", + }, + { + "Joe Black ", + "32", + "Sidney No. 1 Lake Park", + "cool, teacher", + "Send Mail", + }, + } + spans := map[int]int{ + 0: 2, + 1: 1, + // 设置第三列的span + 2: 3, + 3: 2, + 4: 2, + } + p, err := charts.TableRender( + header, + data, + spans, + ) + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` + ### ECharts Render ```go diff --git a/README_zh.md b/README_zh.md index dbdaaf3..487a365 100644 --- a/README_zh.md +++ b/README_zh.md @@ -373,6 +373,70 @@ func main() { } ``` +### Table + +```go +package main + +import ( + "github.com/vicanso/go-charts/v2" +) + +func main() { + header := []string{ + "Name", + "Age", + "Address", + "Tag", + "Action", + } + data := [][]string{ + { + "John Brown", + "32", + "New York No. 1 Lake Park", + "nice, developer", + "Send Mail", + }, + { + "Jim Green ", + "42", + "London No. 1 Lake Park", + "wow", + "Send Mail", + }, + { + "Joe Black ", + "32", + "Sidney No. 1 Lake Park", + "cool, teacher", + "Send Mail", + }, + } + spans := map[int]int{ + 0: 2, + 1: 1, + // 设置第三列的span + 2: 3, + 3: 2, + 4: 2, + } + p, err := charts.TableRender( + header, + data, + spans, + ) + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + // snip... +} +``` ### ECharts Render ```go diff --git a/chart_option.go b/chart_option.go index b7b4714..39de686 100644 --- a/chart_option.go +++ b/chart_option.go @@ -23,7 +23,6 @@ package charts import ( - "fmt" "sort" "github.com/golang/freetype/truetype" @@ -338,24 +337,44 @@ func FunnelRender(values []float64, opts ...OptionFunc) (*Painter, error) { }, opts...) } -func TableRender(opt TableChartOption) (*Painter, error) { +// TableRender table chart render +func TableRender(header []string, data [][]string, spanMaps ...map[int]int) (*Painter, error) { + opt := TableChartOption{ + Header: header, + Data: data, + } + if len(spanMaps) != 0 { + spanMap := spanMaps[0] + spans := make([]int, len(opt.Header)) + for index := range spans { + v, ok := spanMap[index] + if !ok { + v = 1 + } + spans[index] = v + } + opt.Spans = spans + } + return TableOptionRender(opt) +} + +// TableOptionRender table render with option +func TableOptionRender(opt TableChartOption) (*Painter, error) { if opt.Type == "" { opt.Type = ChartOutputPNG } if opt.Width <= 0 { opt.Width = defaultChartWidth } - if opt.Height <= 0 { - opt.Height = defaultChartHeight - } if opt.Font == nil { opt.Font, _ = chart.GetDefaultFont() } p, err := NewPainter(PainterOptions{ - Type: opt.Type, - Width: opt.Width, - Height: opt.Height, + Type: opt.Type, + Width: opt.Width, + // 仅用于计算表格高度,因此随便设置即可 + Height: 100, Font: opt.Font, }) if err != nil { @@ -365,8 +384,6 @@ func TableRender(opt TableChartOption) (*Painter, error) { if err != nil { return nil, err } - fmt.Println(*info) - fmt.Println(info.Height) p, err = NewPainter(PainterOptions{ Type: opt.Type, @@ -377,31 +394,9 @@ func TableRender(opt TableChartOption) (*Painter, error) { if err != nil { return nil, err } - _, err = NewTableChart(p, opt).Render() + _, err = NewTableChart(p, opt).renderWithInfo(info) if err != nil { return nil, err } - - // opt := ChartOption{} - // for _, fn := range opts { - // fn(&opt) - // } - // opt.fillDefault() - // p, err := NewPainter(PainterOptions{ - // Type: opt.Type, - // Width: opt.Width, - // Height: opt.Height, - // Font: opt.font, - // }) - // if err != nil { - // return nil, err - // } - // _, err = NewTableChart(p, TableChartOption{ - // Header: header, - // Data: data, - // }).Render() - // if err != nil { - // return nil, err - // } return p, nil } diff --git a/examples/charts/main.go b/examples/charts/main.go index 0e1d48e..7b14919 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -92,6 +92,48 @@ func handler(w http.ResponseWriter, req *http.Request, chartOptions []charts.Cha bytesList = append(bytesList, buf) } + p, err := charts.TableOptionRender(charts.TableChartOption{ + Type: charts.ChartOutputSVG, + Header: []string{ + "Name", + "Age", + "Address", + "Tag", + "Action", + }, + Data: [][]string{ + { + "John Brown", + "32", + "New York No. 1 Lake Park", + "nice, developer", + "Send Mail", + }, + { + "Jim Green ", + "42", + "London No. 1 Lake Park", + "wow", + "Send Mail", + }, + { + "Joe Black ", + "32", + "Sidney No. 1 Lake Park", + "cool, teacher", + "Send Mail", + }, + }, + }) + if err != nil { + panic(err) + } + buf, err := p.Bytes() + if err != nil { + panic(err) + } + bytesList = append(bytesList, buf) + data := bytes.ReplaceAll([]byte(html), []byte("{{body}}"), bytes.Join(bytesList, []byte(""))) w.Header().Set("Content-Type", "text/html") w.Write(data) diff --git a/examples/table/main.go b/examples/table/main.go index 650566c..ee8147e 100644 --- a/examples/table/main.go +++ b/examples/table/main.go @@ -24,45 +24,49 @@ func writeFile(buf []byte) error { } func main() { - p, err := charts.TableRender(charts.TableChartOption{ - Header: []string{ - "Name", - "Age", - "Address", - "Tag", - "Action", + charts.SetDefaultWidth(810) + header := []string{ + "Name", + "Age", + "Address", + "Tag", + "Action", + } + data := [][]string{ + { + "John Brown", + "32", + "New York No. 1 Lake Park", + "nice, developer", + "Send Mail", }, - Spans: []int{ - 1, - 1, - 2, - 1, - 1, + { + "Jim Green ", + "42", + "London No. 1 Lake Park", + "wow", + "Send Mail", }, - Data: [][]string{ - { - "John Brown", - "32", - "New York No. 1 Lake Park", - "nice, developer", - "Send Mail", - }, - { - "Jim Green ", - "42", - "London No. 1 Lake Park", - "wow", - "Send Mail", - }, - { - "Joe Black ", - "32", - "Sidney No. 1 Lake Park", - "cool, teacher", - "Send Mail", - }, + { + "Joe Black ", + "32", + "Sidney No. 1 Lake Park", + "cool, teacher", + "Send Mail", }, - }, + } + spans := map[int]int{ + 0: 2, + 1: 1, + // 设置第三列的span + 2: 3, + 3: 2, + 4: 2, + } + p, err := charts.TableRender( + header, + data, + spans, ) if err != nil { panic(err) diff --git a/painter.go b/painter.go index c787315..06973b6 100644 --- a/painter.go +++ b/painter.go @@ -38,6 +38,8 @@ type Painter struct { parent *Painter style Style theme ColorPalette + // 类型 + outputType string } type PainterOptions struct { @@ -169,6 +171,8 @@ func NewPainter(opts PainterOptions, opt ...PainterOption) (*Painter, error) { Bottom: opts.Height, }, font: font, + // 类型 + outputType: opts.Type, } p.setOptions(opt...) if p.theme == nil { diff --git a/table.go b/table.go index 34dee67..ffa7013 100644 --- a/table.go +++ b/table.go @@ -35,6 +35,7 @@ type tableChart struct { opt *TableChartOption } +// NewTableChart returns a table chart render func NewTableChart(p *Painter, opt TableChartOption) *tableChart { if opt.Theme == nil { opt.Theme = defaultTheme @@ -50,8 +51,6 @@ type TableChartOption struct { Type string // The width of table Width int - // The height of table - Height int // The theme Theme ColorPalette // The padding of table cell @@ -64,7 +63,9 @@ type TableChartOption struct { Spans []int // The font size of table FontSize float64 - Font *truetype.Font + // The font family, which should be installed first + FontFamily string + Font *truetype.Font // The font color of table FontColor Color // The background color of header @@ -77,26 +78,101 @@ type TableChartOption struct { BackgroundColor Color } -var defaultTableHeaderColor = Color{ - R: 34, - G: 34, - B: 34, - A: 255, +type TableSetting struct { + // The color of header + HeaderColor Color + // The color of heder text + HeaderFontColor Color + // The color of table text + FontColor Color + // The color list of row + RowColors []Color + // The padding of cell + Padding Box } -var defaultTableRowColors = []Color{ - drawing.ColorWhite, - { - R: 242, - G: 242, - B: 242, + +var TableLightThemeSetting = TableSetting{ + HeaderColor: Color{ + R: 240, + G: 240, + B: 240, A: 255, }, + HeaderFontColor: Color{ + R: 98, + G: 105, + B: 118, + A: 255, + }, + FontColor: Color{ + R: 70, + G: 70, + B: 70, + A: 255, + }, + RowColors: []Color{ + drawing.ColorWhite, + { + R: 247, + G: 247, + B: 247, + A: 255, + }, + }, + Padding: Box{ + Left: 10, + Top: 10, + Right: 10, + Bottom: 10, + }, } -var defaultTablePadding = Box{ - Left: 10, - Top: 10, - Right: 10, - Bottom: 10, + +var TableDarkThemeSetting = TableSetting{ + HeaderColor: Color{ + R: 38, + G: 38, + B: 42, + A: 255, + }, + HeaderFontColor: Color{ + R: 216, + G: 217, + B: 218, + A: 255, + }, + FontColor: Color{ + R: 216, + G: 217, + B: 218, + A: 255, + }, + RowColors: []Color{ + { + R: 24, + G: 24, + B: 28, + A: 255, + }, + { + R: 38, + G: 38, + B: 42, + A: 255, + }, + }, + Padding: Box{ + Left: 10, + Top: 10, + Right: 10, + Bottom: 10, + }, +} + +var tableDefaultSetting = TableLightThemeSetting + +// SetDefaultTableSetting sets the default setting for table +func SetDefaultTableSetting(setting TableSetting) { + tableDefaultSetting = setting } type renderInfo struct { @@ -106,12 +182,12 @@ type renderInfo struct { RowHeights []int } -func (c *tableChart) render() (*renderInfo, error) { +func (t *tableChart) render() (*renderInfo, error) { info := renderInfo{ RowHeights: make([]int, 0), } - p := c.p - opt := c.opt + p := t.p + opt := t.opt if len(opt.Header) == 0 { return nil, errors.New("header can not be nil") } @@ -125,7 +201,7 @@ func (c *tableChart) render() (*renderInfo, error) { } fontColor := opt.FontColor if fontColor.IsZero() { - fontColor = theme.GetTextColor() + fontColor = tableDefaultSetting.FontColor } font := opt.Font if font == nil { @@ -133,14 +209,14 @@ func (c *tableChart) render() (*renderInfo, error) { } headerFontColor := opt.HeaderFontColor if opt.HeaderFontColor.IsZero() { - headerFontColor = drawing.ColorWhite + headerFontColor = tableDefaultSetting.HeaderFontColor } spans := opt.Spans - if len(spans) != 0 && len(spans) != len(opt.Header) { + if len(spans) != len(opt.Header) { newSpans := make([]int, len(opt.Header)) for index := range opt.Header { - if len(spans) < index { + if index >= len(spans) { newSpans[index] = 1 } else { newSpans[index] = spans[index] @@ -149,7 +225,8 @@ func (c *tableChart) render() (*renderInfo, error) { spans = newSpans } - values := autoDivideSpans(p.Width(), len(opt.Header)+1, spans) + sum := sumInt(spans) + values := autoDivideSpans(p.Width(), sum, spans) height := 0 textStyle := Style{ FontSize: fontSize, @@ -162,7 +239,7 @@ func (c *tableChart) render() (*renderInfo, error) { headerHeight := 0 padding := opt.Padding if padding.IsZero() { - padding = defaultTablePadding + padding = tableDefaultSetting.Padding } renderTableCells := func(textList []string, currentHeight int, cellPadding Box) int { @@ -201,34 +278,23 @@ func (c *tableChart) render() (*renderInfo, error) { return &info, nil } -func (c *tableChart) Render() (Box, error) { - p := c.p - opt := c.opt +func (t *tableChart) renderWithInfo(info *renderInfo) (Box, error) { + p := t.p + opt := t.opt if !opt.BackgroundColor.IsZero() { p.SetBackground(p.Width(), p.Height(), opt.BackgroundColor) } headerBGColor := opt.HeaderBackgroundColor if headerBGColor.IsZero() { - headerBGColor = defaultTableHeaderColor + headerBGColor = tableDefaultSetting.HeaderColor } - r := p.render - newRender, err := chart.SVG(p.Width(), 100) - if err != nil { - return BoxZero, err - } - p.render = newRender - info, err := c.render() - if err != nil { - return BoxZero, err - } - p.render = r // 如果设置表头背景色 p.SetBackground(info.Width, info.HeaderHeight, headerBGColor, true) currentHeight := info.HeaderHeight rowColors := opt.RowBackgroundColors if len(rowColors) == 0 { - rowColors = defaultTableRowColors + rowColors = tableDefaultSetting.RowColors } for index, h := range info.RowHeights { color := rowColors[index%len(rowColors)] @@ -238,7 +304,7 @@ func (c *tableChart) Render() (Box, error) { child.SetBackground(p.Width(), h, color, true) currentHeight += h } - _, err = c.render() + _, err := t.render() if err != nil { return BoxZero, err } @@ -248,3 +314,35 @@ func (c *tableChart) Render() (Box, error) { Bottom: info.Height, }, nil } + +func (t *tableChart) Render() (Box, error) { + p := t.p + opt := t.opt + if !opt.BackgroundColor.IsZero() { + p.SetBackground(p.Width(), p.Height(), opt.BackgroundColor) + } + headerBGColor := opt.HeaderBackgroundColor + if headerBGColor.IsZero() { + headerBGColor = tableDefaultSetting.HeaderColor + } + if opt.Font == nil && opt.FontFamily != "" { + opt.Font, _ = GetFont(opt.FontFamily) + } + + r := p.render + fn := chart.PNG + if p.outputType == ChartOutputSVG { + fn = chart.SVG + } + newRender, err := fn(p.Width(), 100) + if err != nil { + return BoxZero, err + } + p.render = newRender + info, err := t.render() + if err != nil { + return BoxZero, err + } + p.render = r + return t.renderWithInfo(info) +} diff --git a/table_test.go b/table_test.go index c54de25..41a857c 100644 --- a/table_test.go +++ b/table_test.go @@ -51,7 +51,8 @@ func TestTableChart(t *testing.T) { 1, 2, 1, - 1, + // span和header不匹配,最后自动设置为1 + // 1, }, Data: [][]string{ { @@ -82,6 +83,48 @@ func TestTableChart(t *testing.T) { } return p.Bytes() }, + result: "\\nNameAgeAddressTagActionJohnBrown32New York No. 1 Lake Parknice,developerSend MailJim Green42London No. 1 Lake ParkwowSend MailJoe Black32Sidney No. 1 Lake Parkcool,teacherSend Mail", + }, + { + render: func(p *Painter) ([]byte, error) { + _, err := NewTableChart(p, TableChartOption{ + Header: []string{ + "Name", + "Age", + "Address", + "Tag", + "Action", + }, + Data: [][]string{ + { + "John Brown", + "32", + "New York No. 1 Lake Park", + "nice, developer", + "Send Mail", + }, + { + "Jim Green ", + "42", + "London No. 1 Lake Park", + "wow", + "Send Mail", + }, + { + "Joe Black ", + "32", + "Sidney No. 1 Lake Park", + "cool, teacher", + "Send Mail", + }, + }, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nNameAgeAddressTagActionJohn Brown32New York No.1 Lake Parknice,developerSend MailJim Green42London No. 1Lake ParkwowSend MailJoe Black32Sidney No. 1Lake Parkcool, teacherSend Mail", }, } for _, tt := range tests { @@ -96,5 +139,4 @@ func TestTableChart(t *testing.T) { fmt.Println(string(data)) assert.Equal(tt.result, string(data)) } - } From da3ad16c23abb669361295e92a38680409dbe01e Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Jun 2022 08:23:50 +0800 Subject: [PATCH 163/251] chore: upload table preview --- assets/go-table.png | Bin 0 -> 17387 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/go-table.png diff --git a/assets/go-table.png b/assets/go-table.png new file mode 100644 index 0000000000000000000000000000000000000000..5848ad88b41c8266171e4211002499fea1244304 GIT binary patch literal 17387 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 literal 0 HcmV?d00001 From f1276067d763e612b927c839c7e29b5af9ff7a23 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Jun 2022 08:33:05 +0800 Subject: [PATCH 164/251] fix: fix lint --- README.md | 3 ++- README_zh.md | 6 +++++- table.go | 4 ---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d0549f0..3e713a6 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,10 @@ Screenshot of common charts, the left part is light theme, the right part is gra

go-table

+ ## Chart Type -These chart types are supported: `line`, `bar`, `pie`, `radar` or `funnel`. +These chart types are supported: `line`, `bar`, `pie`, `radar` or `funnel` and `table`. ## Example diff --git a/README_zh.md b/README_zh.md index 487a365..94a9e14 100644 --- a/README_zh.md +++ b/README_zh.md @@ -12,9 +12,13 @@ go-charts

+

+ go-table +

Date: Sat, 25 Jun 2022 08:49:00 +0800 Subject: [PATCH 165/251] test: add bench mark --- charts_test.go | 255 +++++++++++++++++++++++++++++++++++++++++++++++++ table_test.go | 2 - 2 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 charts_test.go diff --git a/charts_test.go b/charts_test.go new file mode 100644 index 0000000..da75ee5 --- /dev/null +++ b/charts_test.go @@ -0,0 +1,255 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import ( + "errors" + "testing" + + "github.com/wcharczuk/go-chart/v2" +) + +func BenchmarkMultiChartPNGRender(b *testing.B) { + for i := 0; i < b.N; i++ { + opt := ChartOption{ + Type: ChartOutputPNG, + Legend: LegendOption{ + Top: "-90", + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Padding: chart.Box{ + Top: 100, + Right: 10, + Bottom: 10, + Left: 10, + }, + XAxis: NewXAxisOption([]string{ + "2012", + "2013", + "2014", + "2015", + "2016", + "2017", + }), + YAxisOptions: []YAxisOption{ + { + + Min: NewFloatPoint(0), + Max: NewFloatPoint(90), + }, + }, + SeriesList: []Series{ + NewSeriesFromValues([]float64{ + 56.5, + 82.1, + 88.7, + 70.1, + 53.4, + 85.1, + }), + NewSeriesFromValues([]float64{ + 51.1, + 51.4, + 55.1, + 53.3, + 73.8, + 68.7, + }), + NewSeriesFromValues([]float64{ + 40.1, + 62.2, + 69.5, + 36.4, + 45.2, + 32.5, + }, ChartTypeBar), + NewSeriesFromValues([]float64{ + 25.2, + 37.1, + 41.2, + 18, + 33.9, + 49.1, + }, ChartTypeBar), + }, + Children: []ChartOption{ + { + Legend: LegendOption{ + Show: FalseFlag(), + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Box: chart.Box{ + Top: 20, + Left: 400, + Right: 500, + Bottom: 120, + }, + SeriesList: NewPieSeriesList([]float64{ + 435.9, + 354.3, + 285.9, + 204.5, + }, PieSeriesOption{ + Label: SeriesLabel{ + Show: true, + }, + Radius: "35%", + }), + }, + }, + } + d, err := Render(opt) + if err != nil { + panic(err) + } + buf, err := d.Bytes() + if err != nil { + panic(err) + } + if len(buf) == 0 { + panic(errors.New("data is nil")) + } + } +} + +func BenchmarkMultiChartSVGRender(b *testing.B) { + for i := 0; i < b.N; i++ { + opt := ChartOption{ + Legend: LegendOption{ + Top: "-90", + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Padding: chart.Box{ + Top: 100, + Right: 10, + Bottom: 10, + Left: 10, + }, + XAxis: NewXAxisOption([]string{ + "2012", + "2013", + "2014", + "2015", + "2016", + "2017", + }), + YAxisOptions: []YAxisOption{ + { + + Min: NewFloatPoint(0), + Max: NewFloatPoint(90), + }, + }, + SeriesList: []Series{ + NewSeriesFromValues([]float64{ + 56.5, + 82.1, + 88.7, + 70.1, + 53.4, + 85.1, + }), + NewSeriesFromValues([]float64{ + 51.1, + 51.4, + 55.1, + 53.3, + 73.8, + 68.7, + }), + NewSeriesFromValues([]float64{ + 40.1, + 62.2, + 69.5, + 36.4, + 45.2, + 32.5, + }, ChartTypeBar), + NewSeriesFromValues([]float64{ + 25.2, + 37.1, + 41.2, + 18, + 33.9, + 49.1, + }, ChartTypeBar), + }, + Children: []ChartOption{ + { + Legend: LegendOption{ + Show: FalseFlag(), + Data: []string{ + "Milk Tea", + "Matcha Latte", + "Cheese Cocoa", + "Walnut Brownie", + }, + }, + Box: chart.Box{ + Top: 20, + Left: 400, + Right: 500, + Bottom: 120, + }, + SeriesList: NewPieSeriesList([]float64{ + 435.9, + 354.3, + 285.9, + 204.5, + }, PieSeriesOption{ + Label: SeriesLabel{ + Show: true, + }, + Radius: "35%", + }), + }, + }, + } + d, err := Render(opt) + if err != nil { + panic(err) + } + buf, err := d.Bytes() + if err != nil { + panic(err) + } + if len(buf) == 0 { + panic(errors.New("data is nil")) + } + } +} diff --git a/table_test.go b/table_test.go index 41a857c..a958c95 100644 --- a/table_test.go +++ b/table_test.go @@ -23,7 +23,6 @@ package charts import ( - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -136,7 +135,6 @@ func TestTableChart(t *testing.T) { assert.Nil(err) data, err := tt.render(p) assert.Nil(err) - fmt.Println(string(data)) assert.Equal(tt.result, string(data)) } } From aed2250cb847817cf46508c4798cc17816f53ef5 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Jun 2022 08:51:49 +0800 Subject: [PATCH 166/251] docs: update documents --- README.md | 2 +- README_zh.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3e713a6..1e4ea8b 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Screenshot of common charts, the left part is light theme, the right part is gra ## Chart Type -These chart types are supported: `line`, `bar`, `pie`, `radar` or `funnel` and `table`. +These chart types are supported: `line`, `bar`, `horizontal bar`, `pie`, `radar` or `funnel` and `table`. ## Example diff --git a/README_zh.md b/README_zh.md index 94a9e14..87c42fa 100644 --- a/README_zh.md +++ b/README_zh.md @@ -18,7 +18,7 @@ ## 支持图表类型 -支持以下的图表类型:`line`, `bar`, `pie`, `radar`, `funnel` 以及 `table` +支持以下的图表类型:`line`, `bar`, `horizontal bar`, `pie`, `radar`, `funnel` 以及 `table` ## 示例 From 0eecb6c5b7002dba33c8b2d7a9c06341f8395d25 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Jun 2022 09:06:50 +0800 Subject: [PATCH 167/251] docs: update document --- assets/go-table.png | Bin 17387 -> 37028 bytes examples/table/main.go | 1 + 2 files changed, 1 insertion(+) diff --git a/assets/go-table.png b/assets/go-table.png index 5848ad88b41c8266171e4211002499fea1244304..b05a3d02eac00825c3125810803aab41e4d70a4e 100644 GIT binary patch literal 37028 zcmaI7bx<5Z*YJzG6WoF)xVr@nZoy@7ch@BlT!Onh!QEkTcY?cH2oQW>;oIlA@B7uQ z`^W8?+M4d|nQA$G`kY^%iBeOM!$c!RgMop;l>aKN0Rsci1Oo%hf&vFEDR!JIfq_Y| zmzVzX%?I|+GAAqy3Xon008r!+yAEo z$7@Eit)m!qa78~no@8JOnw~QTp}#)p@0zOb^NG2#HCp_xJayXh1M>U#e`b1xU9hm@ z&$EoxXJ%(@{fas+DT+6QyWV)&fApIO2nn^a@A=Kw{W~v97)!|+P-uG#Ng@S{2VRyr zwR7t3tV&m>OxHMOH9&d(H4#qZ!#bZB&T8V zZ9lf7h@Jcf(&t~Isl3zwGWvPEe3aHF=R!-5v~01k-oJqGG;V7T=;DA|{-muzE3cVmHn@+sy8_vb?+ffdsAhv>#8#= z0d)1esKTzYzgQO+Zqr?yTb|#VO4Qr)BO1 zM0_6zv3(r`t z6_OIkhS;N`_WkNmGb2PuK)|Bqgi!1L4igvW__s|UJZ*sBD`aa+v^P1i;j>UbbVvaz zUO+)7NdF$^*|%$0CcCUEI|GLDlg;quW&S4sVkz%y-N6BVUAY4X*wfE%M4RO&-`LPDC)@J&|M}gKIoWH6V0k`ZTyroA>*F42Ys`OqUuWb1r)FurPUfbsHZU?+ zi=3sC^MN)4%WVr|Ui{AO63%@nARuseqgoV*jlndmx zWM@On1Q~b{H1pn{XV8I-D`nQlJsEZVrz-;s6EzY2Dn`?6bLw{-%xYl0h{E|_-vqWG zPT;bJ4z_*c5`f~j0EQBU*Ho-w0{Su>Q#U)*7?m+M;jnV+6H6XuP!8pCxDC_iSG|0t zg;Syx*ASs!2%+>YD(&;^bl?F`tU&OBr<>clxB$(<{1?hi?)( zVN5u~`{^uXXP!2~+uB?F#9P}~Q2D7vesaY&aPAkCv*^b5w&hM^9S}ry*xXo;gfo=< zotTfw!Jq@>PO6{{9j93yb7(M(ji|MS4yQgn;|f z`4JwH0?ZsC%nFlm6^c`x36(CLE14mQOZxJchZAt)y?K^?eoK^iO7FmS&9@||0D6j- zvGioFy3if4K?-AhwyTr{?P_e^FI69v03ylHgr?)a;Eu<7Jz`aU6jbrx`N)!(7k<2A zr=5r{8YCA)BvcoJad}PmalPb76D2cJdBRJdf6d=XLu$@XR0CXEoTc9qNgRpImZpEr&InAmkcb7t&p1hT{x(BBnuLN`-Se4l!rV^d$@8>(i+uh@aOfP209-i z8t&28+$+OsdpS9|eKix5tc&3kOj(ewO3LD*rmfX++Kq0qVpW~9LkHUkHQ0_oJ1c*I zeR1`g+ONGyKAD+j0vYpwi6=dnmh8-_=Bd(P&IuP%h@};cHB_3-GWlcyiE>Ojrxro1;5TK2cQ7vXW`-o>O?HE7|n%nrsI zOZ&-z68M+Doww^>-wU9Z|3saV!-1!x|3njIq+CdIY)RAWYvK@~FEa33^o%HtBd=S{ zu0##mGy3Y(@5AWaRH)LaLd*}&3+yzxXV3Re-#2tpa*PX>Th2SRG3%uW%uW}G-=V4x zsS9JUah_#)X_o>raG@+-jSdd0wOYH7q`&+jbVl)}0#Y)Mk5yI>Dj~Wu3>HJt0B5}RO$a=#8HNY9bVb#&f;p8c3thmOui zM%i~tzszEBC=dEABBimdoYhEdrnjAUr|9^S5&F∓=KP*rXQ_7C$MY4kkTJ>x@hK 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%0A4C`wRf5K}TaGSwU<#E097z}`w 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 diff --git a/examples/table/main.go b/examples/table/main.go index ee8147e..4207b01 100644 --- a/examples/table/main.go +++ b/examples/table/main.go @@ -24,6 +24,7 @@ func writeFile(buf []byte) error { } func main() { + // charts.SetDefaultTableSetting(charts.TableDarkThemeSetting) charts.SetDefaultWidth(810) header := []string{ "Name", From 3d20bda9ccfa7c63129d4c7493d2be076d8a8649 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Jun 2022 09:35:26 +0800 Subject: [PATCH 168/251] chore: update go modules --- go.mod | 4 ++-- go.sum | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 93fc351..c00068c 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/vicanso/go-charts-web go 1.17 require ( - github.com/vicanso/elton v1.9.3 - github.com/vicanso/go-charts/v2 v2.0.0-alpha + github.com/vicanso/elton v1.9.4 + github.com/vicanso/go-charts/v2 v2.0.0 ) require ( diff --git a/go.sum b/go.sum index 29d935c..d3bd50c 100644 --- a/go.sum +++ b/go.sum @@ -10,21 +10,23 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.7.5 h1:s5PTfem8p8EbKQOctVV53k6jCJt3UX4IEJzwh+C324Q= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/vicanso/elton v1.9.3 h1:BLYIZXakMQuNx96fUrz06pFH0PjIgNbzEX5n1QSRCYY= -github.com/vicanso/elton v1.9.3/go.mod h1:F0PIgeDHpvg0+pAUMHHNFOlmdL29SEpyRhWPuc7e53k= -github.com/vicanso/go-charts/v2 v2.0.0-alpha h1:3bH0pW+/OD3dQpx9TIF4q/kXGIq+N7j3peWpToG2i/4= -github.com/vicanso/go-charts/v2 v2.0.0-alpha/go.mod h1:OlgbGdGfxTfx/PPym1atWf6DKFiu/cmGN7Pn/H8cfYE= +github.com/vicanso/elton v1.9.4 h1:IR9DYxE09/cVcWRgGAnY6ASQCIWIpsB3CDMHMuuCnbc= +github.com/vicanso/elton v1.9.4/go.mod h1:0axxJGicftnWnEjIYLT8U4Wm+3g/+Cubjop0531ZTWs= +github.com/vicanso/go-charts/v2 v2.0.0 h1:j9XuTzOUNTtIgNeTyMZUqD8QBJiKHQhM93rBPvBAfZs= +github.com/vicanso/go-charts/v2 v2.0.0/go.mod h1:OlgbGdGfxTfx/PPym1atWf6DKFiu/cmGN7Pn/H8cfYE= github.com/vicanso/hes v0.6.0 h1:rmLhJw1PkZ+BTlJXt91i12mr7vpIC65S5KRCD4uF9HU= github.com/vicanso/hes v0.6.0/go.mod h1:bO1pAVgzuwBJAv76LXx8YN6jXLWcCYVyNx4qzPw9h6Y= github.com/vicanso/intranet-ip v0.1.0 h1:UeoxilO2VDIkeZZxmu6aT+f5o79mfGdsSdwoEv75nYo= From ada6d0503e7cf801e26f20d7a20ff094551d291a Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Jun 2022 10:51:52 +0800 Subject: [PATCH 169/251] refactor: update cache maxage --- main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 3f367a1..b858393 100644 --- a/main.go +++ b/main.go @@ -29,7 +29,9 @@ func main() { assetFS := middleware.NewEmbedStaticFS(webFS, "web") e.GET("/static/*", middleware.NewStaticServe(assetFS, middleware.StaticServeConfig{ - // 缓存服务器缓存一个小时 + // 客户端缓存 + MaxAge: 10 * time.Minute, + // 缓存服务器缓存 SMaxAge: 5 * time.Minute, DenyQueryString: true, DisableLastModified: true, From 7a5173ce7ff7c6fb838534c423c86df0bbccaf5a Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Jun 2022 11:00:42 +0800 Subject: [PATCH 170/251] refactor: set no cache as default setting --- main.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/main.go b/main.go index b858393..113a3ed 100644 --- a/main.go +++ b/main.go @@ -26,6 +26,10 @@ func main() { })) e.Use(middleware.NewDefaultError()) e.Use(middleware.NewDefaultBodyParser()) + e.Use(func(c *elton.Context) error { + c.NoCache() + return c.Next() + }) assetFS := middleware.NewEmbedStaticFS(webFS, "web") e.GET("/static/*", middleware.NewStaticServe(assetFS, middleware.StaticServeConfig{ From d53fa1a329bed63efb02afdcfbb4cc338f233990 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 28 Jun 2022 20:21:06 +0800 Subject: [PATCH 171/251] feat: support customize table cell style --- examples/table/main.go | 55 ++++++++++++++++++++++-- table.go | 96 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 142 insertions(+), 9 deletions(-) diff --git a/examples/table/main.go b/examples/table/main.go index 4207b01..f332851 100644 --- a/examples/table/main.go +++ b/examples/table/main.go @@ -4,18 +4,20 @@ import ( "io/ioutil" "os" "path/filepath" + "strconv" "github.com/vicanso/go-charts/v2" + "github.com/wcharczuk/go-chart/v2/drawing" ) -func writeFile(buf []byte) error { +func writeFile(buf []byte, filename string) error { tmpPath := "./tmp" err := os.MkdirAll(tmpPath, 0700) if err != nil { return err } - file := filepath.Join(tmpPath, "table.png") + file := filepath.Join(tmpPath, filename) err = ioutil.WriteFile(file, buf, 0600) if err != nil { return err @@ -77,7 +79,54 @@ func main() { if err != nil { panic(err) } - err = writeFile(buf) + err = writeFile(buf, "table.png") + if err != nil { + panic(err) + } + + p, err = charts.TableOptionRender(charts.TableChartOption{ + Header: header, + Data: data, + CellTextStyle: func(tc charts.TableCell) *charts.Style { + row := tc.Row + column := tc.Column + style := tc.Style + if column == 1 && row != 0 { + age, _ := strconv.Atoi(tc.Text) + if age < 40 { + style.FontColor = drawing.ColorGreen + } else { + style.FontColor = drawing.ColorRed + } + return &style + } + return nil + }, + CellStyle: func(tc charts.TableCell) *charts.Style { + row := tc.Row + column := tc.Column + if row == 2 && column == 1 { + return &charts.Style{ + FillColor: drawing.ColorBlue, + } + } + if row == 3 && column == 4 { + return &charts.Style{ + FillColor: drawing.ColorRed.WithAlpha(100), + } + } + return nil + }, + }) + if err != nil { + panic(err) + } + + buf, err = p.Bytes() + if err != nil { + panic(err) + } + err = writeFile(buf, "table-color.png") if err != nil { panic(err) } diff --git a/table.go b/table.go index 0e72be5..d1af5f9 100644 --- a/table.go +++ b/table.go @@ -46,6 +46,17 @@ func NewTableChart(p *Painter, opt TableChartOption) *tableChart { } } +type TableCell struct { + // Text the text of table cell + Text string + // Style the current style of table cell + Style Style + // Row the row index of table cell + Row int + // Column the column index of table cell + Column int +} + type TableChartOption struct { // The output type Type string @@ -76,6 +87,10 @@ type TableChartOption struct { RowBackgroundColors []Color // The background color BackgroundColor Color + // CellTextStyle customize text style of table cell + CellTextStyle func(TableCell) *Style + // CellStyle customize drawing style of table cell + CellStyle func(TableCell) *Style } type TableSetting struct { @@ -180,6 +195,7 @@ type renderInfo struct { Height int HeaderHeight int RowHeights []int + ColumnWidths []int } func (t *tableChart) render() (*renderInfo, error) { @@ -227,6 +243,15 @@ func (t *tableChart) render() (*renderInfo, error) { sum := sumInt(spans) values := autoDivideSpans(p.Width(), sum, spans) + columnWidths := make([]int, 0) + for index, v := range values { + if index == len(values)-1 { + break + } + columnWidths = append(columnWidths, values[index+1]-v) + } + info.ColumnWidths = columnWidths + height := 0 textStyle := Style{ FontSize: fontSize, @@ -234,25 +259,48 @@ func (t *tableChart) render() (*renderInfo, error) { FillColor: headerFontColor, Font: font, } - p.SetStyle(textStyle) headerHeight := 0 padding := opt.Padding if padding.IsZero() { padding = tableDefaultSetting.Padding } + getCellTextStyle := opt.CellTextStyle + if getCellTextStyle == nil { + getCellTextStyle = func(_ TableCell) *Style { + return nil + } + } - renderTableCells := func(textList []string, currentHeight int, cellPadding Box) int { + // 表格单元的处理 + renderTableCells := func( + currentStyle Style, + rowIndex int, + textList []string, + currentHeight int, + cellPadding Box, + ) int { cellMaxHeight := 0 paddingHeight := cellPadding.Top + cellPadding.Bottom paddingWidth := cellPadding.Left + cellPadding.Right for index, text := range textList { + cellStyle := getCellTextStyle(TableCell{ + Text: text, + Row: rowIndex, + Column: index, + Style: currentStyle, + }) + if cellStyle == nil { + cellStyle = ¤tStyle + } + p.SetStyle(*cellStyle) x := values[index] y := currentHeight + cellPadding.Top width := values[index+1] - x x += cellPadding.Left width -= paddingWidth box := p.TextFit(text, x, y+int(fontSize), width) + // 计算最高的高度 if box.Height()+paddingHeight > cellMaxHeight { cellMaxHeight = box.Height() + paddingHeight } @@ -260,15 +308,16 @@ func (t *tableChart) render() (*renderInfo, error) { return cellMaxHeight } - headerHeight = renderTableCells(opt.Header, height, padding) + // 表头的处理 + headerHeight = renderTableCells(textStyle, 0, opt.Header, height, padding) height += headerHeight info.HeaderHeight = headerHeight + // 表格内容的处理 textStyle.FontColor = fontColor textStyle.FillColor = fontColor - p.SetStyle(textStyle) - for _, textList := range opt.Data { - cellHeight := renderTableCells(textList, height, padding) + for index, textList := range opt.Data { + cellHeight := renderTableCells(textStyle, index+1, textList, height, padding) info.RowHeights = append(info.RowHeights, cellHeight) height += cellHeight } @@ -304,6 +353,41 @@ func (t *tableChart) renderWithInfo(info *renderInfo) (Box, error) { child.SetBackground(p.Width(), h, color, true) currentHeight += h } + // 根据是否有设置表格样式调整背景色 + getCellStyle := opt.CellStyle + if getCellStyle != nil { + arr := [][]string{ + opt.Header, + } + arr = append(arr, opt.Data...) + top := 0 + heights := []int{ + info.HeaderHeight, + } + heights = append(heights, info.RowHeights...) + // 循环所有表格单元,生成背景色 + for i, textList := range arr { + left := 0 + for j, v := range textList { + style := getCellStyle(TableCell{ + Text: v, + Row: i, + Column: j, + }) + if style != nil && !style.FillColor.IsZero() { + child := p.Child(PainterPaddingOption(Box{ + Top: top, + Left: left, + })) + w := info.ColumnWidths[j] + h := heights[i] + child.SetBackground(w, h, style.FillColor, true) + } + left += info.ColumnWidths[j] + } + top += heights[i] + } + } _, err := t.render() if err != nil { return BoxZero, err From f483e2a850e363b848fd09d4521266fdc608e41a Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 29 Jun 2022 20:15:58 +0800 Subject: [PATCH 172/251] feat: support text align for table cell --- assets/go-table.png | Bin 37028 -> 30679 bytes examples/table/main.go | 98 ++++++++++++++++++++++++++++++----------- painter.go | 14 +++++- table.go | 24 +++++++--- 4 files changed, 101 insertions(+), 35 deletions(-) diff --git a/assets/go-table.png b/assets/go-table.png index b05a3d02eac00825c3125810803aab41e4d70a4e..88ec49c43ae25b60269ad5800bc06154d491c194 100644 GIT binary patch literal 30679 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 RhT9cA%JLd=r84Fp{|_XcF>?R_ literal 37028 zcmaI7bx<5Z*YJzG6WoF)xVr@nZoy@7ch@BlT!Onh!QEkTcY?cH2oQW>;oIlA@B7uQ z`^W8?+M4d|nQA$G`kY^%iBeOM!$c!RgMop;l>aKN0Rsci1Oo%hf&vFEDR!JIfq_Y| zmzVzX%?I|+GAAqy3Xon008r!+yAEo z$7@Eit)m!qa78~no@8JOnw~QTp}#)p@0zOb^NG2#HCp_xJayXh1M>U#e`b1xU9hm@ z&$EoxXJ%(@{fas+DT+6QyWV)&fApIO2nn^a@A=Kw{W~v97)!|+P-uG#Ng@S{2VRyr zwR7t3tV&m>OxHMOH9&d(H4#qZ!#bZB&T8V zZ9lf7h@Jcf(&t~Isl3zwGWvPEe3aHF=R!-5v~01k-oJqGG;V7T=;DA|{-muzE3cVmHn@+sy8_vb?+ffdsAhv>#8#= z0d)1esKTzYzgQO+Zqr?yTb|#VO4Qr)BO1 zM0_6zv3(r`t z6_OIkhS;N`_WkNmGb2PuK)|Bqgi!1L4igvW__s|UJZ*sBD`aa+v^P1i;j>UbbVvaz zUO+)7NdF$^*|%$0CcCUEI|GLDlg;quW&S4sVkz%y-N6BVUAY4X*wfE%M4RO&-`LPDC)@J&|M}gKIoWH6V0k`ZTyroA>*F42Ys`OqUuWb1r)FurPUfbsHZU?+ zi=3sC^MN)4%WVr|Ui{AO63%@nARuseqgoV*jlndmx zWM@On1Q~b{H1pn{XV8I-D`nQlJsEZVrz-;s6EzY2Dn`?6bLw{-%xYl0h{E|_-vqWG zPT;bJ4z_*c5`f~j0EQBU*Ho-w0{Su>Q#U)*7?m+M;jnV+6H6XuP!8pCxDC_iSG|0t zg;Syx*ASs!2%+>YD(&;^bl?F`tU&OBr<>clxB$(<{1?hi?)( zVN5u~`{^uXXP!2~+uB?F#9P}~Q2D7vesaY&aPAkCv*^b5w&hM^9S}ry*xXo;gfo=< zotTfw!Jq@>PO6{{9j93yb7(M(ji|MS4yQgn;|f z`4JwH0?ZsC%nFlm6^c`x36(CLE14mQOZxJchZAt)y?K^?eoK^iO7FmS&9@||0D6j- zvGioFy3if4K?-AhwyTr{?P_e^FI69v03ylHgr?)a;Eu<7Jz`aU6jbrx`N)!(7k<2A zr=5r{8YCA)BvcoJad}PmalPb76D2cJdBRJdf6d=XLu$@XR0CXEoTc9qNgRpImZpEr&InAmkcb7t&p1hT{x(BBnuLN`-Se4l!rV^d$@8>(i+uh@aOfP209-i z8t&28+$+OsdpS9|eKix5tc&3kOj(ewO3LD*rmfX++Kq0qVpW~9LkHUkHQ0_oJ1c*I zeR1`g+ONGyKAD+j0vYpwi6=dnmh8-_=Bd(P&IuP%h@};cHB_3-GWlcyiE>Ojrxro1;5TK2cQ7vXW`-o>O?HE7|n%nrsI zOZ&-z68M+Doww^>-wU9Z|3saV!-1!x|3njIq+CdIY)RAWYvK@~FEa33^o%HtBd=S{ zu0##mGy3Y(@5AWaRH)LaLd*}&3+yzxXV3Re-#2tpa*PX>Th2SRG3%uW%uW}G-=V4x zsS9JUah_#)X_o>raG@+-jSdd0wOYH7q`&+jbVl)}0#Y)Mk5yI>Dj~Wu3>HJt0B5}RO$a=#8HNY9bVb#&f;p8c3thmOui zM%i~tzszEBC=dEABBimdoYhEdrnjAUr|9^S5&F∓=KP*rXQ_7C$MY4kkTJ>x@hK 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%0A4C`wRf5K}TaGSwU<#E097z}`w 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 0 { + style.FillColor = charts.Color{ + R: 179, + G: 53, + B: 20, + A: 255, + } + } else if value < 0 { + style.FillColor = charts.Color{ + R: 33, + G: 124, + B: 50, + A: 255, } } - if row == 3 && column == 4 { - return &charts.Style{ - FillColor: drawing.ColorRed.WithAlpha(100), - } - } - return nil + return &style }, }) if err != nil { diff --git a/painter.go b/painter.go index 06973b6..62a4378 100644 --- a/painter.go +++ b/painter.go @@ -545,7 +545,7 @@ func (p *Painter) Text(body string, x, y int) *Painter { return p } -func (p *Painter) TextFit(body string, x, y, width int) chart.Box { +func (p *Painter) TextFit(body string, x, y, width int, textAligns ...string) chart.Box { style := p.style textWarp := style.TextWrap style.TextWrap = chart.TextWrapWord @@ -554,14 +554,24 @@ func (p *Painter) TextFit(body string, x, y, width int) chart.Box { p.SetTextStyle(style) var output chart.Box + textAlign := "" + if len(textAligns) != 0 { + textAlign = textAligns[0] + } for index, line := range lines { if line == "" { continue } x0 := x y0 := y + output.Height() - p.Text(line, x0, y0) lineBox := r.MeasureText(line) + switch textAlign { + case AlignRight: + x0 += width - lineBox.Width() + case AlignCenter: + x0 += (width - lineBox.Width()) >> 1 + } + p.Text(line, x0, y0) output.Right = chart.MaxInt(lineBox.Right, output.Right) output.Bottom += lineBox.Height() if index < len(lines)-1 { diff --git a/table.go b/table.go index d1af5f9..86ef569 100644 --- a/table.go +++ b/table.go @@ -70,8 +70,10 @@ type TableChartOption struct { Header []string // The data of table Data [][]string - // The span of table column + // The span list of table column Spans []int + // The text align list of table cell + TextAligns []string // The font size of table FontSize float64 // The font family, which should be installed first @@ -271,6 +273,13 @@ func (t *tableChart) render() (*renderInfo, error) { return nil } } + // textAligns := opt.TextAligns + getTextAlign := func(index int) string { + if len(opt.TextAligns) <= index { + return "" + } + return opt.TextAligns[index] + } // 表格单元的处理 renderTableCells := func( @@ -299,7 +308,7 @@ func (t *tableChart) render() (*renderInfo, error) { width := values[index+1] - x x += cellPadding.Left width -= paddingWidth - box := p.TextFit(text, x, y+int(fontSize), width) + box := p.TextFit(text, x, y+int(fontSize), width, getTextAlign(index)) // 计算最高的高度 if box.Height()+paddingHeight > cellMaxHeight { cellMaxHeight = box.Height() + paddingHeight @@ -342,7 +351,7 @@ func (t *tableChart) renderWithInfo(info *renderInfo) (Box, error) { p.SetBackground(info.Width, info.HeaderHeight, headerBGColor, true) currentHeight := info.HeaderHeight rowColors := opt.RowBackgroundColors - if len(rowColors) == 0 { + if rowColors == nil { rowColors = tableDefaultSetting.RowColors } for index, h := range info.RowHeights { @@ -375,12 +384,13 @@ func (t *tableChart) renderWithInfo(info *renderInfo) (Box, error) { Column: j, }) if style != nil && !style.FillColor.IsZero() { + padding := style.Padding child := p.Child(PainterPaddingOption(Box{ - Top: top, - Left: left, + Top: top + padding.Top, + Left: left + padding.Left, })) - w := info.ColumnWidths[j] - h := heights[i] + w := info.ColumnWidths[j] - padding.Left - padding.Top + h := heights[i] - padding.Top - padding.Bottom child.SetBackground(w, h, style.FillColor, true) } left += info.ColumnWidths[j] From c862467a5bc1a07f21c3d022c8f2368655dbb650 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 1 Jul 2022 20:41:55 +0800 Subject: [PATCH 173/251] fix: fix only one data of pie chart, #12 --- pie_chart.go | 145 ++++++++++++++++++++++++--------------------------- 1 file changed, 68 insertions(+), 77 deletions(-) diff --git a/pie_chart.go b/pie_chart.go index 6382140..0075ffc 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -99,88 +99,79 @@ func (p *pieChart) render(result *defaultRenderResult, seriesList SeriesList) (B seriesNames = seriesList.Names() } theme := opt.Theme - if len(values) == 1 { + + currentValue := float64(0) + prevEndX := 0 + prevEndY := 0 + for index, v := range values { seriesPainter.OverrideDrawingStyle(Style{ StrokeWidth: 1, - StrokeColor: theme.GetSeriesColor(0), - FillColor: theme.GetSeriesColor(0), + StrokeColor: theme.GetSeriesColor(index), + FillColor: theme.GetSeriesColor(index), }) - seriesPainter.MoveTo(cx, cy). - Circle(radius, cx, cy) - } else { - currentValue := float64(0) - prevEndX := 0 - prevEndY := 0 - for index, v := range values { - seriesPainter.OverrideDrawingStyle(Style{ - StrokeWidth: 1, - StrokeColor: theme.GetSeriesColor(index), - FillColor: theme.GetSeriesColor(index), - }) - seriesPainter.MoveTo(cx, cy) - start := chart.PercentToRadians(currentValue/total) - math.Pi/2 - currentValue += v - percent := (v / total) - delta := chart.PercentToRadians(percent) - seriesPainter.ArcTo(cx, cy, radius, radius, start, delta). - LineTo(cx, cy). - Close(). - FillStroke() + seriesPainter.MoveTo(cx, cy) + start := chart.PercentToRadians(currentValue/total) - math.Pi/2 + currentValue += v + percent := (v / total) + delta := chart.PercentToRadians(percent) + seriesPainter.ArcTo(cx, cy, radius, radius, start, delta). + LineTo(cx, cy). + Close(). + FillStroke() - series := seriesList[index] - // 是否显示label - showLabel := series.Label.Show - if !showLabel { - continue - } - - // label的角度为饼块中间 - angle := start + delta/2 - startx := cx + int(radius*math.Cos(angle)) - starty := cy + int(radius*math.Sin(angle)) - - endx := cx + int(labelRadius*math.Cos(angle)) - endy := cy + int(labelRadius*math.Sin(angle)) - // 计算是否有重叠,如果有则调整y坐标位置 - if index != 0 && - math.Abs(float64(endx-prevEndX)) < labelFontSize && - math.Abs(float64(endy-prevEndY)) < labelFontSize { - endy -= (labelFontSize << 1) - } - prevEndX = endx - prevEndY = endy - - seriesPainter.MoveTo(startx, starty) - seriesPainter.LineTo(endx, endy) - offset := labelLineWidth - if endx < cx { - offset *= -1 - } - seriesPainter.MoveTo(endx, endy) - endx += offset - seriesPainter.LineTo(endx, endy) - seriesPainter.Stroke() - - textStyle := Style{ - FontColor: theme.GetTextColor(), - FontSize: labelFontSize, - Font: opt.Font, - } - if !series.Label.Color.IsZero() { - textStyle.FontColor = series.Label.Color - } - seriesPainter.OverrideTextStyle(textStyle) - text := NewPieLabelFormatter(seriesNames, series.Label.Formatter)(index, v, percent) - textBox := seriesPainter.MeasureText(text) - textMargin := 3 - x := endx + textMargin - y := endy + textBox.Height()>>1 - 1 - if offset < 0 { - textWidth := textBox.Width() - x = endx - textWidth - textMargin - } - seriesPainter.Text(text, x, y) + series := seriesList[index] + // 是否显示label + showLabel := series.Label.Show + if !showLabel { + continue } + + // label的角度为饼块中间 + angle := start + delta/2 + startx := cx + int(radius*math.Cos(angle)) + starty := cy + int(radius*math.Sin(angle)) + + endx := cx + int(labelRadius*math.Cos(angle)) + endy := cy + int(labelRadius*math.Sin(angle)) + // 计算是否有重叠,如果有则调整y坐标位置 + if index != 0 && + math.Abs(float64(endx-prevEndX)) < labelFontSize && + math.Abs(float64(endy-prevEndY)) < labelFontSize { + endy -= (labelFontSize << 1) + } + prevEndX = endx + prevEndY = endy + + seriesPainter.MoveTo(startx, starty) + seriesPainter.LineTo(endx, endy) + offset := labelLineWidth + if endx < cx { + offset *= -1 + } + seriesPainter.MoveTo(endx, endy) + endx += offset + seriesPainter.LineTo(endx, endy) + seriesPainter.Stroke() + + textStyle := Style{ + FontColor: theme.GetTextColor(), + FontSize: labelFontSize, + Font: opt.Font, + } + if !series.Label.Color.IsZero() { + textStyle.FontColor = series.Label.Color + } + seriesPainter.OverrideTextStyle(textStyle) + text := NewPieLabelFormatter(seriesNames, series.Label.Formatter)(index, v, percent) + textBox := seriesPainter.MeasureText(text) + textMargin := 3 + x := endx + textMargin + y := endy + textBox.Height()>>1 - 1 + if offset < 0 { + textWidth := textBox.Width() + x = endx - textWidth - textMargin + } + seriesPainter.Text(text, x, y) } return p.p.box, nil From f455e1ae1c7cf88eaa561baac5898a6a4fed5e03 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 1 Jul 2022 20:46:59 +0800 Subject: [PATCH 174/251] chore: update modules --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c00068c..2323fb4 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.17 require ( github.com/vicanso/elton v1.9.4 - github.com/vicanso/go-charts/v2 v2.0.0 + github.com/vicanso/go-charts/v2 v2.0.1 ) require ( diff --git a/go.sum b/go.sum index d3bd50c..13446cc 100644 --- a/go.sum +++ b/go.sum @@ -25,8 +25,8 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/vicanso/elton v1.9.4 h1:IR9DYxE09/cVcWRgGAnY6ASQCIWIpsB3CDMHMuuCnbc= github.com/vicanso/elton v1.9.4/go.mod h1:0axxJGicftnWnEjIYLT8U4Wm+3g/+Cubjop0531ZTWs= -github.com/vicanso/go-charts/v2 v2.0.0 h1:j9XuTzOUNTtIgNeTyMZUqD8QBJiKHQhM93rBPvBAfZs= -github.com/vicanso/go-charts/v2 v2.0.0/go.mod h1:OlgbGdGfxTfx/PPym1atWf6DKFiu/cmGN7Pn/H8cfYE= +github.com/vicanso/go-charts/v2 v2.0.1 h1:de1k8z3IXTd79J3xpwxOdY6su0o8Y8o4MTnlNqyf7mQ= +github.com/vicanso/go-charts/v2 v2.0.1/go.mod h1:OlgbGdGfxTfx/PPym1atWf6DKFiu/cmGN7Pn/H8cfYE= github.com/vicanso/hes v0.6.0 h1:rmLhJw1PkZ+BTlJXt91i12mr7vpIC65S5KRCD4uF9HU= github.com/vicanso/hes v0.6.0/go.mod h1:bO1pAVgzuwBJAv76LXx8YN6jXLWcCYVyNx4qzPw9h6Y= github.com/vicanso/intranet-ip v0.1.0 h1:UeoxilO2VDIkeZZxmu6aT+f5o79mfGdsSdwoEv75nYo= From b56d0c546028facd0790ce334336129c88cba0e8 Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 4 Jul 2022 20:39:10 +0800 Subject: [PATCH 175/251] fix: fix init fail for empty series list --- series.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/series.go b/series.go index 87a719f..ea71869 100644 --- a/series.go +++ b/series.go @@ -132,6 +132,9 @@ type Series struct { type SeriesList []Series func (sl SeriesList) init() { + if len(sl) == 0 { + return + } if sl[len(sl)-1].index != 0 { return } From eef3a2f97b1ca9d1e337a025a493ee24c8832af4 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 6 Jul 2022 20:28:46 +0800 Subject: [PATCH 176/251] fix: fix label overflow, #13 --- legend.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/legend.go b/legend.go index 2acd35b..d3b135e 100644 --- a/legend.go +++ b/legend.go @@ -135,7 +135,11 @@ func (l *legendPainter) Render() (Box, error) { textOffset := 2 legendWidth := 30 legendHeight := 20 + itemMaxHeight := 0 for _, item := range measureList { + if item.Height() > itemMaxHeight { + itemMaxHeight = item.Height() + } if opt.Orient == OrientVertical { height += item.Height() } else { @@ -170,6 +174,10 @@ func (l *legendPainter) Render() (Box, error) { } top, _ := strconv.Atoi(opt.Top) + if left < 0 { + left = 0 + } + x := int(left) y := int(top) + 10 x0 := x @@ -199,6 +207,10 @@ func (l *legendPainter) Render() (Box, error) { FillColor: color, StrokeColor: color, }) + if x0+measureList[index].Width() > p.Width() { + x0 = 0 + y0 += itemMaxHeight + } if opt.Align != AlignRight { x0 = drawIcon(y0, x0) x0 += textOffset From 0a3ac7096a30b41861faa8cb96bfa1bf84a7465c Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 6 Jul 2022 20:44:52 +0800 Subject: [PATCH 177/251] refactor: adjust text render of axis --- axis.go | 8 +++++++- painter.go | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/axis.go b/axis.go index 53b5362..17e8e9f 100644 --- a/axis.go +++ b/axis.go @@ -153,8 +153,14 @@ func (a *axisPainter) Render() (Box, error) { top.SetDrawingStyle(style).OverrideTextStyle(style) textMaxWidth, textMaxHeight := top.MeasureTextMaxWidthHeight(data) - textCount := ceilFloatToInt(float64(top.Width()) / float64(textMaxWidth)) + + textFillWidth := float64(textMaxWidth) * 1.3 + textCount := ceilFloatToInt(float64(top.Width()) / textFillWidth) unit := ceilFloatToInt(float64(dataCount) / float64(chart.MaxInt(textCount, opt.SplitNumber))) + // 偶数 + if unit%2 == 0 && dataCount%(unit+1) == 0 { + unit++ + } width := 0 height := 0 diff --git a/painter.go b/painter.go index 62a4378..0771288 100644 --- a/painter.go +++ b/painter.go @@ -653,8 +653,9 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { } else { values = autoDivide(width, count) } + showIndex := opt.Unit / 2 for index, text := range opt.TextList { - if opt.Unit != 0 && index%opt.Unit != 0 { + if opt.Unit != 0 && index%opt.Unit != showIndex { continue } box := p.MeasureText(text) From c220b10ae600c68112792277c5a1103499964e38 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 7 Jul 2022 20:50:29 +0800 Subject: [PATCH 178/251] refactor: adjust label padding of axis --- axis.go | 3 ++- bar_chart_test.go | 2 +- chart_option_test.go | 2 +- echarts_test.go | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/axis.go b/axis.go index 17e8e9f..ebc6782 100644 --- a/axis.go +++ b/axis.go @@ -154,7 +154,8 @@ func (a *axisPainter) Render() (Box, error) { textMaxWidth, textMaxHeight := top.MeasureTextMaxWidthHeight(data) - textFillWidth := float64(textMaxWidth) * 1.3 + // 增加30px来计算文本展示区域 + textFillWidth := float64(textMaxWidth + 20) textCount := ceilFloatToInt(float64(top.Width()) / textFillWidth) unit := ceilFloatToInt(float64(dataCount) / float64(chart.MaxInt(textCount, opt.SplitNumber))) // 偶数 diff --git a/bar_chart_test.go b/bar_chart_test.go index 138b3ca..f1bd688 100644 --- a/bar_chart_test.go +++ b/bar_chart_test.go @@ -102,7 +102,7 @@ func TestBarChart(t *testing.T) { } return p.Bytes() }, - result: "\\n24020016012080400JanFebMarAprMayJunJulAugSepOctNovDec24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", + result: "\\n24020016012080400FebMayAugNov24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", }, } diff --git a/chart_option_test.go b/chart_option_test.go index 5e53e46..1238422 100644 --- a/chart_option_test.go +++ b/chart_option_test.go @@ -277,7 +277,7 @@ func TestBarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nRainfallEvaporation24020016012080400JanFebMarAprMayJunJulAugSepOctNovDec162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporation24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) } func TestHorizontalBarRender(t *testing.T) { diff --git a/echarts_test.go b/echarts_test.go index 4d50d9e..8deda2d 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -578,5 +578,5 @@ func TestRenderEChartsToSVG(t *testing.T) { ] }`) assert.Nil(err) - assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400JanFebMarAprMayJunJulAugSepOctNovDec162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) } From 959377542e2a1fa1daaec7defdfd56195d3ea4d9 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 8 Jul 2022 21:11:47 +0800 Subject: [PATCH 179/251] fix: fix multi line label --- chart_option_test.go | 4 ++-- legend.go | 7 +++++-- line_chart_test.go | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/chart_option_test.go b/chart_option_test.go index 1238422..0cdc2aa 100644 --- a/chart_option_test.go +++ b/chart_option_test.go @@ -204,7 +204,7 @@ func TestLineRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", string(data)) + assert.Equal("\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", string(data)) } func TestBarRender(t *testing.T) { @@ -277,7 +277,7 @@ func TestBarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nRainfallEvaporation24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporation24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) } func TestHorizontalBarRender(t *testing.T) { diff --git a/legend.go b/legend.go index d3b135e..820f1b5 100644 --- a/legend.go +++ b/legend.go @@ -146,6 +146,8 @@ func (l *legendPainter) Render() (Box, error) { width += item.Width() } } + // 增加padding + itemMaxHeight += 10 if opt.Orient == OrientVertical { width = maxTextWidth + textOffset + legendWidth height = offset * len(opt.Data) @@ -207,9 +209,10 @@ func (l *legendPainter) Render() (Box, error) { FillColor: color, StrokeColor: color, }) - if x0+measureList[index].Width() > p.Width() { + if x0+measureList[index].Width()+textOffset+offset+legendWidth > p.Width() { x0 = 0 - y0 += itemMaxHeight + y += itemMaxHeight + y0 = y } if opt.Align != AlignRight { x0 = drawIcon(y0, x0) diff --git a/line_chart_test.go b/line_chart_test.go index 856cdf3..ff80741 100644 --- a/line_chart_test.go +++ b/line_chart_test.go @@ -117,7 +117,7 @@ func TestLineChart(t *testing.T) { } return p.Bytes() }, - result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", }, { render: func(p *Painter) ([]byte, error) { @@ -201,7 +201,7 @@ func TestLineChart(t *testing.T) { } return p.Bytes() }, - result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", }, } From 5111ea0ae7764bd3010093dcec2a457016f225a0 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 10 Jul 2022 19:32:13 +0800 Subject: [PATCH 180/251] chore: update go modules --- go.mod | 4 ++-- go.sum | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 2323fb4..cdccb50 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/vicanso/go-charts-web go 1.17 require ( - github.com/vicanso/elton v1.9.4 - github.com/vicanso/go-charts/v2 v2.0.1 + github.com/vicanso/elton v1.9.5 + github.com/vicanso/go-charts/v2 v2.0.4 ) require ( diff --git a/go.sum b/go.sum index 13446cc..a7da04d 100644 --- a/go.sum +++ b/go.sum @@ -15,18 +15,18 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.7.5 h1:s5PTfem8p8EbKQOctVV53k6jCJt3UX4IEJzwh+C324Q= -github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/vicanso/elton v1.9.4 h1:IR9DYxE09/cVcWRgGAnY6ASQCIWIpsB3CDMHMuuCnbc= -github.com/vicanso/elton v1.9.4/go.mod h1:0axxJGicftnWnEjIYLT8U4Wm+3g/+Cubjop0531ZTWs= -github.com/vicanso/go-charts/v2 v2.0.1 h1:de1k8z3IXTd79J3xpwxOdY6su0o8Y8o4MTnlNqyf7mQ= -github.com/vicanso/go-charts/v2 v2.0.1/go.mod h1:OlgbGdGfxTfx/PPym1atWf6DKFiu/cmGN7Pn/H8cfYE= +github.com/vicanso/elton v1.9.5 h1:vWCota4myz2BXT40RqbxMZlSTTvxiSPR06rJ/VWXEqQ= +github.com/vicanso/elton v1.9.5/go.mod h1:KIEn5zohLKfKo3d/Rlww5j2/jbOXDdNlO/UTwxrc+wk= +github.com/vicanso/go-charts/v2 v2.0.4 h1:xq56GvtwvMW7YHkBNfHrCHo/RGEdHmepHLCT/LtIdzc= +github.com/vicanso/go-charts/v2 v2.0.4/go.mod h1:OlgbGdGfxTfx/PPym1atWf6DKFiu/cmGN7Pn/H8cfYE= github.com/vicanso/hes v0.6.0 h1:rmLhJw1PkZ+BTlJXt91i12mr7vpIC65S5KRCD4uF9HU= github.com/vicanso/hes v0.6.0/go.mod h1:bO1pAVgzuwBJAv76LXx8YN6jXLWcCYVyNx4qzPw9h6Y= github.com/vicanso/intranet-ip v0.1.0 h1:UeoxilO2VDIkeZZxmu6aT+f5o79mfGdsSdwoEv75nYo= From 805f4381a31f3f46c0a711623ed6f7b94ac98ffa Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 11 Jul 2022 20:20:41 +0800 Subject: [PATCH 181/251] fix: fix multi line legend --- chart_option_test.go | 6 +++--- charts.go | 9 +++++++-- legend.go | 9 ++++++++- line_chart_test.go | 4 ++-- pie_chart_test.go | 2 +- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/chart_option_test.go b/chart_option_test.go index 0cdc2aa..a025c25 100644 --- a/chart_option_test.go +++ b/chart_option_test.go @@ -204,7 +204,7 @@ func TestLineRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", string(data)) + assert.Equal("\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", string(data)) } func TestBarRender(t *testing.T) { @@ -277,7 +277,7 @@ func TestBarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nRainfallEvaporation24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporation24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) } func TestHorizontalBarRender(t *testing.T) { @@ -368,7 +368,7 @@ func TestPieRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", string(data)) + assert.Equal("\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", string(data)) } func TestRadarRender(t *testing.T) { diff --git a/charts.go b/charts.go index 6c1c92b..41802d9 100644 --- a/charts.go +++ b/charts.go @@ -25,6 +25,8 @@ package charts import ( "errors" "sort" + + "github.com/wcharczuk/go-chart/v2" ) const labelFontSize = 10 @@ -110,14 +112,16 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e p = p.Child(PainterPaddingOption(opt.Padding)) } + legendHeight := 0 if len(opt.LegendOption.Data) != 0 { if opt.LegendOption.Theme == nil { opt.LegendOption.Theme = opt.Theme } - _, err := NewLegendPainter(p, opt.LegendOption).Render() + legendResult, err := NewLegendPainter(p, opt.LegendOption).Render() if err != nil { return nil, err } + legendHeight = legendResult.Height() } // 如果有标题 @@ -131,9 +135,10 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e if err != nil { return nil, err } + p = p.Child(PainterPaddingOption(Box{ // 标题下留白 - Top: titleBox.Height() + 20, + Top: chart.MaxInt(legendHeight, titleBox.Height()) + 20, })) } diff --git a/legend.go b/legend.go index 820f1b5..4e2bc82 100644 --- a/legend.go +++ b/legend.go @@ -182,6 +182,7 @@ func (l *legendPainter) Render() (Box, error) { x := int(left) y := int(top) + 10 + startY := y x0 := x y0 := y @@ -203,13 +204,18 @@ func (l *legendPainter) Render() (Box, error) { } return left + legendWidth } + lastIndex := len(opt.Data) - 1 for index, text := range opt.Data { color := theme.GetSeriesColor(index) p.SetDrawingStyle(Style{ FillColor: color, StrokeColor: color, }) - if x0+measureList[index].Width()+textOffset+offset+legendWidth > p.Width() { + itemWidth := x0 + measureList[index].Width() + textOffset + offset + legendWidth + if lastIndex == index { + itemWidth = x0 + measureList[index].Width() + legendWidth + } + if itemWidth > p.Width() { x0 = 0 y += itemMaxHeight y0 = y @@ -231,6 +237,7 @@ func (l *legendPainter) Render() (Box, error) { x0 += offset y0 = y } + height = y0 - startY + 10 } return Box{ diff --git a/line_chart_test.go b/line_chart_test.go index ff80741..856cdf3 100644 --- a/line_chart_test.go +++ b/line_chart_test.go @@ -117,7 +117,7 @@ func TestLineChart(t *testing.T) { } return p.Bytes() }, - result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", }, { render: func(p *Painter) ([]byte, error) { @@ -201,7 +201,7 @@ func TestLineChart(t *testing.T) { } return p.Bytes() }, - result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", }, } diff --git a/pie_chart_test.go b/pie_chart_test.go index c373a7e..070fb03 100644 --- a/pie_chart_test.go +++ b/pie_chart_test.go @@ -78,7 +78,7 @@ func TestPieChart(t *testing.T) { } return p.Bytes() }, - result: "\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", + result: "\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", }, } for _, tt := range tests { From b5b2d37e875cf765e04ba2a312a8b1efdc6d5d03 Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 11 Jul 2022 20:44:28 +0800 Subject: [PATCH 182/251] fix: fix axis boundary gap, #13 --- painter.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/painter.go b/painter.go index 0771288..1a954e2 100644 --- a/painter.go +++ b/painter.go @@ -637,12 +637,15 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { } count := len(opt.TextList) positionCenter := true + showIndex := opt.Unit / 2 if containsString([]string{ PositionLeft, PositionTop, }, opt.Position) { positionCenter = false count-- + // 非居中 + showIndex = 0 } width := p.Width() height := p.Height() @@ -653,7 +656,6 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { } else { values = autoDivide(width, count) } - showIndex := opt.Unit / 2 for index, text := range opt.TextList { if opt.Unit != 0 && index%opt.Unit != showIndex { continue From 3af0d4d4450652f132a8f5482aa30e0eb39ba9d4 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 14 Jul 2022 20:14:32 +0800 Subject: [PATCH 183/251] fix: fix pie chart legend --- chart_option_test.go | 2 +- charts.go | 7 ++++++- pie_chart_test.go | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/chart_option_test.go b/chart_option_test.go index a025c25..1238422 100644 --- a/chart_option_test.go +++ b/chart_option_test.go @@ -368,7 +368,7 @@ func TestPieRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", string(data)) + assert.Equal("\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", string(data)) } func TestRadarRender(t *testing.T) { diff --git a/charts.go b/charts.go index 41802d9..36bb17e 100644 --- a/charts.go +++ b/charts.go @@ -136,9 +136,14 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e return nil, err } + top := chart.MaxInt(legendHeight, titleBox.Height()) + // 如果是垂直方式,则不计算legend高度 + if opt.LegendOption.Orient == OrientVertical { + top = titleBox.Height() + } p = p.Child(PainterPaddingOption(Box{ // 标题下留白 - Top: chart.MaxInt(legendHeight, titleBox.Height()) + 20, + Top: top + 20, })) } diff --git a/pie_chart_test.go b/pie_chart_test.go index 070fb03..c373a7e 100644 --- a/pie_chart_test.go +++ b/pie_chart_test.go @@ -78,7 +78,7 @@ func TestPieChart(t *testing.T) { } return p.Bytes() }, - result: "\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", + result: "\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", }, } for _, tt := range tests { From 8740c55a1a90f6f895f6601a6afd8f3c4fcf0cbd Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 19 Jul 2022 20:12:31 +0800 Subject: [PATCH 184/251] feat: support padding for legend --- examples/line_chart/main.go | 8 +++++++- legend.go | 12 ++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go index 45ff894..a941bca 100644 --- a/examples/line_chart/main.go +++ b/examples/line_chart/main.go @@ -89,7 +89,13 @@ func main() { "Video Ads", "Direct", "Search Engine", - }, charts.PositionCenter), + }, "50"), + func(opt *charts.ChartOption) { + opt.Legend.Padding = charts.Box{ + Top: 5, + Bottom: 10, + } + }, ) if err != nil { diff --git a/legend.go b/legend.go index 4e2bc82..8f21afb 100644 --- a/legend.go +++ b/legend.go @@ -59,6 +59,8 @@ type LegendOption struct { FontColor Color // The flag for show legend, set this to *false will hide legend Show *bool + // The padding of legend + Padding Box } // NewLegendOption returns a legend option @@ -111,9 +113,11 @@ func (l *legendPainter) Render() (Box, error) { if opt.Left == "" { opt.Left = PositionCenter } - p := l.p.Child(PainterPaddingOption(Box{ - Top: 5, - })) + padding := opt.Padding + if padding.IsZero() { + padding.Top = 5 + } + p := l.p.Child(PainterPaddingOption(padding)) p.SetTextStyle(Style{ FontSize: opt.FontSize, FontColor: opt.FontColor, @@ -242,6 +246,6 @@ func (l *legendPainter) Render() (Box, error) { return Box{ Right: width, - Bottom: height, + Bottom: height + padding.Bottom + padding.Top, }, nil } From 3d20bea84663801858ac28067bdbe2f536bb7408 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 22 Jul 2022 20:25:12 +0800 Subject: [PATCH 185/251] refactor: remove unused code --- title.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/title.go b/title.go index 5cdd161..74ab4f9 100644 --- a/title.go +++ b/title.go @@ -36,10 +36,6 @@ type TitleOption struct { Text string // Subtitle text, support \n for new line Subtext string - // // Title style - // Style Style - // // Subtitle style - // SubtextStyle Style // Distance between title component and the left side of the container. // It can be pixel value: 20, percentage value: 20%, // or position value: right, center. From cac6fd03d31477505f3c0e2fdeb62a546e0c8f3b Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 26 Jul 2022 20:44:50 +0800 Subject: [PATCH 186/251] fix: fix unit count of xasix --- axis.go | 7 +++++-- chart_option.go | 5 ++++- legend.go | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/axis.go b/axis.go index ebc6782..8e5bfda 100644 --- a/axis.go +++ b/axis.go @@ -156,8 +156,11 @@ func (a *axisPainter) Render() (Box, error) { // 增加30px来计算文本展示区域 textFillWidth := float64(textMaxWidth + 20) - textCount := ceilFloatToInt(float64(top.Width()) / textFillWidth) - unit := ceilFloatToInt(float64(dataCount) / float64(chart.MaxInt(textCount, opt.SplitNumber))) + // 根据文本宽度计算较为符合的展示项 + fitTextCount := ceilFloatToInt(float64(top.Width()) / textFillWidth) + + unit := ceilFloatToInt(float64(dataCount) / float64(fitTextCount)) + unit = chart.MaxInt(unit, opt.SplitNumber) // 偶数 if unit%2 == 0 && dataCount%(unit+1) == 0 { unit++ diff --git a/chart_option.go b/chart_option.go index 39de686..41fda46 100644 --- a/chart_option.go +++ b/chart_option.go @@ -108,9 +108,12 @@ func TitleOptionFunc(title TitleOption) OptionFunc { } // TitleTextOptionFunc set title text of chart -func TitleTextOptionFunc(text string) OptionFunc { +func TitleTextOptionFunc(text string, subtext ...string) OptionFunc { return func(opt *ChartOption) { opt.Title.Text = text + if len(subtext) != 0 { + opt.Title.Subtext = subtext[0] + } } } diff --git a/legend.go b/legend.go index 8f21afb..035642c 100644 --- a/legend.go +++ b/legend.go @@ -232,7 +232,7 @@ func (l *legendPainter) Render() (Box, error) { x0 += measureList[index].Width() if opt.Align == AlignRight { x0 += textOffset - x0 = drawIcon(0, x0) + x0 = drawIcon(y0, x0) } if opt.Orient == OrientVertical { y0 += offset From 1713bc283f6e742cf45cbed65cce010509945130 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 26 Jul 2022 20:45:04 +0800 Subject: [PATCH 187/251] docs: add doc --- start_zh.md | 254 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 start_zh.md diff --git a/start_zh.md b/start_zh.md new file mode 100644 index 0000000..ee8359c --- /dev/null +++ b/start_zh.md @@ -0,0 +1,254 @@ +# go-charts + +`go-charts`主要分为了下几个模块: + +- `标题`:图表的标题,包括主副标题,位置为图表的顶部 +- `图例`:图表的图例列表,用于标识每个图例对应的颜色与名称信息,默认为图表的顶部,可自定义位置 +- `X轴`:图表的x轴,用于折线图、柱状图中,表示每个点对应的时间,位置图表的底部 +- `Y轴`:图表的y轴,用于折线图、柱状图中,最多可使用两组y轴(一左一右),默认位置图表的左侧 +- `内容`: 图表的内容,折线图、柱状图、饼图等,在图表的中间区域 + +## 标题 + +### 常用设置 + +标题一般仅需要设置主副标题即可,其它的属性均会设置默认值,常用的方式是使用`TitleTextOptionFunc`设置,其中副标题为可选值,方式如下: + +```go + charts.TitleTextOptionFunc("Text", "Subtext"), +``` + +### 个性化设置 + +```go +func(opt *charts.ChartOption) { + opt.Title = charts.TitleOption{ + // 主标题 + Text: "Text", + // 副标题 + Subtext: "Subtext", + // 标题左侧位置,可设置为"center","right",数值("20")或百份比("20%") + Left: charts.PositionRight, + // 标题顶部位置,只可调为数值 + Top: "20", + // 主标题文字大小 + FontSize: 14, + // 副标题文字大小 + SubtextFontSize: 12, + // 主标题字体颜色 + FontColor: charts.Color{ + R: 100, + G: 100, + B: 100, + A: 255, + }, + // 副标题字体影响 + SubtextFontColor: charts.Color{ + R: 200, + G: 200, + B: 200, + A: 255, + }, + } +}, +``` + +### 部分属性个性化设置 + +```go +charts.TitleTextOptionFunc("Text", "Subtext"), +func(opt *charts.ChartOption) { + // 修改top的值 + opt.Title.Top = "20" +}, +``` + +## 图例 + +### 常用设置 + +图例组件与图表中的数据一一对应,常用仅设置其名称及左侧的值即可(可选),方式如下: + + +```go +charts.LegendLabelsOptionFunc([]string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", +}, "50"), +``` + +### 个性化设置 + +```go +func(opt *charts.ChartOption) { + opt.Legend = charts.LegendOption{ + // 图例名称 + Data: []string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", + }, + // 图例左侧位置,可设置为"center","right",数值("20")或百份比("20%") + // 如果示例有多行,只影响第一行,而且对于多行的示例,设置"center", "right"无效 + Left: "50", + // 图例顶部位置,只可调为数值 + Top: "10", + // 图例图标的位置,默认为左侧,只允许左或右 + Align: charts.AlignRight, + // 图例排列方式,默认为水平,只允许水平或垂直 + Orient: charts.OrientVertical, + // 图标类型,提供"rect"与"lineDot"两种类型 + Icon: charts.IconRect, + // 字体大小 + FontSize: 14, + // 字体颜色 + FontColor: charts.Color{ + R: 150, + G: 150, + B: 150, + A: 255, + }, + // 是否展示,如果不需要展示则设置 + // Show: charts.FalseFlag(), + // 图例区域的padding值 + Padding: charts.Box{ + Top: 10, + Left: 10, + }, + } +}, +``` + +### 部分属性个性化设置 + +```go +charts.LegendLabelsOptionFunc([]string{ + "Email", + "Union Ads", + "Video Ads", + "Direct", + "Search Engine", +}, "50"), +func(opt *charts.ChartOption) { + opt.Legend.Top = "10" +}, +``` + +## X轴 + +### 常用设置 + +图表中X轴的展示,常用的设置方式是指定数组即可: + +```go +charts.XAxisDataOptionFunc([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", +}), +``` + +### 个性化设置 + +```go +func(opt *charts.ChartOption) { + opt.XAxis = charts.XAxisOption{ + // X轴内容 + Data: []string{ + "01", + "02", + "03", + "04", + "05", + "06", + "07", + "08", + "09", + }, + // 如果数据点不居中,则设置为false + BoundaryGap: charts.FalseFlag(), + // 字体大小 + FontSize: 14, + // 是否展示,如果不需要展示则设置 + // Show: charts.FalseFlag(), + // 会根据文本内容以及此值选择适合的分块大小,一般不需要设置 + // SplitNumber: 3, + // 线条颜色 + StrokeColor: charts.Color{ + R: 200, + G: 200, + B: 200, + A: 255, + }, + // 文字颜色 + FontColor: charts.Color{ + R: 100, + G: 100, + B: 100, + A: 255, + }, + } +}, +``` + +### 部分属性个性化设置 + +```go +charts.XAxisDataOptionFunc([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", +}), +func(opt *charts.ChartOption) { + opt.XAxis.FontColor = charts.Color{ + R: 100, + G: 100, + B: 100, + A: 255, + }, +}, +``` + +## Y轴 + +图表中的y轴展示的相关数据会根据图表中的数据自动生成适合的值,如果需要自定义,则可自定义以下部分数据: + +```go +func(opt *charts.ChartOption) { + opt.YAxisOptions = []charts.YAxisOption{ + { + // 字体大小 + FontSize: 16, + // 字体颜色 + FontColor: charts.Color{ + R: 100, + G: 100, + B: 100, + A: 255, + }, + // 内容,{value}会替换为对应的值 + Formatter: "{value} ml", + // Y轴颜色,如果设置此值,会覆盖font color + Color: charts.Color{ + R: 255, + G: 0, + B: 0, + A: 255, + }, + }, + } +}, +``` From e095223705464e4724ca3fb29512def0daecde55 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 27 Jul 2022 20:27:49 +0800 Subject: [PATCH 188/251] fix: fix font setting for title, #15 --- .gitignore | 1 + chart_option.go | 3 +++ examples/chinese/main.go | 5 +++-- theme.go | 39 +++++++++++++++++++++++++++++++++++++-- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 2e33342..4a7b0d9 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ *.png *.svg tmp +NotoSansSC.ttf diff --git a/chart_option.go b/chart_option.go index 41fda46..cb3bd3f 100644 --- a/chart_option.go +++ b/chart_option.go @@ -259,6 +259,9 @@ func (o *ChartOption) fillDefault() { if o.font == nil { o.font, _ = chart.GetDefaultFont() + } else { + // 如果指定了字体,则设置主题的字体 + t.SetFont(o.font) } if o.BackgroundColor.IsZero() { o.BackgroundColor = t.GetBackgroundColor() diff --git a/examples/chinese/main.go b/examples/chinese/main.go index bb7cc00..9068a08 100644 --- a/examples/chinese/main.go +++ b/examples/chinese/main.go @@ -25,7 +25,8 @@ func writeFile(buf []byte) error { func main() { // 字体文件需要自行下载 - buf, err := ioutil.ReadFile("../NotoSansSC.ttf") + // https://github.com/googlefonts/noto-cjk + buf, err := ioutil.ReadFile("./NotoSansSC.ttf") if err != nil { panic(err) } @@ -83,7 +84,7 @@ func main() { } p, err := charts.LineRender( values, - charts.TitleTextOptionFunc("Line"), + charts.TitleTextOptionFunc("测试"), charts.FontFamilyOptionFunc("noto"), charts.XAxisDataOptionFunc([]string{ "星期一", diff --git a/theme.go b/theme.go index 31c3bf8..8068687 100644 --- a/theme.go +++ b/theme.go @@ -36,12 +36,19 @@ const ThemeAnt = "ant" type ColorPalette interface { IsDark() bool GetAxisStrokeColor() Color + SetAxisStrokeColor(Color) GetAxisSplitLineColor() Color + SetAxisSplitLineColor(Color) GetSeriesColor(int) Color + SetSeriesColor([]Color) GetBackgroundColor() Color + SetBackgroundColor(Color) GetTextColor() Color + SetTextColor(Color) GetFontSize() float64 + SetFontSize(float64) GetFont() *truetype.Font + SetFont(*truetype.Font) } type themeColorPalette struct { @@ -64,7 +71,7 @@ type ThemeOption struct { SeriesColors []Color } -var palettes = map[string]ColorPalette{} +var palettes = map[string]*themeColorPalette{} const defaultFontSize = 12.0 @@ -241,7 +248,8 @@ func NewTheme(name string) ColorPalette { if !ok { p = palettes[ThemeLight] } - return p + clone := *p + return &clone } func (t *themeColorPalette) IsDark() bool { @@ -252,23 +260,42 @@ func (t *themeColorPalette) GetAxisStrokeColor() Color { return t.axisStrokeColor } +func (t *themeColorPalette) SetAxisStrokeColor(c Color) { + t.axisStrokeColor = c +} + func (t *themeColorPalette) GetAxisSplitLineColor() Color { return t.axisSplitLineColor } +func (t *themeColorPalette) SetAxisSplitLineColor(c Color) { + t.axisSplitLineColor = c +} + func (t *themeColorPalette) GetSeriesColor(index int) Color { colors := t.seriesColors return colors[index%len(colors)] } +func (t *themeColorPalette) SetSeriesColor(colors []Color) { + t.seriesColors = colors +} func (t *themeColorPalette) GetBackgroundColor() Color { return t.backgroundColor } +func (t *themeColorPalette) SetBackgroundColor(c Color) { + t.backgroundColor = c +} + func (t *themeColorPalette) GetTextColor() Color { return t.textColor } +func (t *themeColorPalette) SetTextColor(c Color) { + t.textColor = c +} + func (t *themeColorPalette) GetFontSize() float64 { if t.fontSize != 0 { return t.fontSize @@ -276,6 +303,10 @@ func (t *themeColorPalette) GetFontSize() float64 { return defaultFontSize } +func (t *themeColorPalette) SetFontSize(fontSize float64) { + t.fontSize = fontSize +} + func (t *themeColorPalette) GetFont() *truetype.Font { if t.font != nil { return t.font @@ -283,3 +314,7 @@ func (t *themeColorPalette) GetFont() *truetype.Font { f, _ := chart.GetDefaultFont() return f } + +func (t *themeColorPalette) SetFont(f *truetype.Font) { + t.font = f +} From 817fceff73798bba9450192a3dfa844319d08e8d Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 27 Jul 2022 20:32:31 +0800 Subject: [PATCH 189/251] feat: support hide symbol of line chart --- chart_option.go | 2 ++ charts.go | 7 ++++--- examples/line_chart/main.go | 1 + line_chart.go | 6 +++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/chart_option.go b/chart_option.go index cb3bd3f..71e9dfc 100644 --- a/chart_option.go +++ b/chart_option.go @@ -62,6 +62,8 @@ type ChartOption struct { RadarIndicators []RadarIndicator // The background color of chart BackgroundColor Color + // The flag for show symbol of line, set this to *false will hide symbol + SymbolShow *bool // The child charts Children []ChartOption } diff --git a/charts.go b/charts.go index 36bb17e..92a7e54 100644 --- a/charts.go +++ b/charts.go @@ -377,9 +377,10 @@ func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { if len(lineSeriesList) != 0 { handler.Add(func() error { _, err := NewLineChart(p, LineChartOption{ - Theme: opt.theme, - Font: opt.font, - XAxis: opt.XAxis, + Theme: opt.theme, + Font: opt.font, + XAxis: opt.XAxis, + SymbolShow: opt.SymbolShow, }).render(renderResult, lineSeriesList) return err }) diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go index a941bca..5edf65b 100644 --- a/examples/line_chart/main.go +++ b/examples/line_chart/main.go @@ -95,6 +95,7 @@ func main() { Top: 5, Bottom: 10, } + opt.SymbolShow = charts.FalseFlag() }, ) diff --git a/line_chart.go b/line_chart.go index 0770447..dee122f 100644 --- a/line_chart.go +++ b/line_chart.go @@ -60,6 +60,8 @@ type LineChartOption struct { Title TitleOption // The legend option Legend LegendOption + // The flag for show symbol of line, set this to *false will hide symbol + SymbolShow *bool // background is filled backgroundIsFilled bool } @@ -123,7 +125,9 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( } drawingStyle.StrokeWidth = 1 seriesPainter.SetDrawingStyle(drawingStyle) - seriesPainter.Dots(points) + if !isFalse(opt.SymbolShow) { + seriesPainter.Dots(points) + } markPointPainter.Add(markPointRenderOption{ FillColor: seriesColor, Font: opt.Font, From e530adccb66738e41d8eb9c7d042e38d3221f869 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 28 Jul 2022 20:49:00 +0800 Subject: [PATCH 190/251] feat: support stroke width of line chart --- chart_option.go | 2 ++ charts.go | 9 +++++---- examples/line_chart/main.go | 1 + line_chart.go | 8 +++++++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/chart_option.go b/chart_option.go index 71e9dfc..58001bd 100644 --- a/chart_option.go +++ b/chart_option.go @@ -64,6 +64,8 @@ type ChartOption struct { BackgroundColor Color // The flag for show symbol of line, set this to *false will hide symbol SymbolShow *bool + // The stroke width of line chart + LineStrokeWidth float64 // The child charts Children []ChartOption } diff --git a/charts.go b/charts.go index 92a7e54..d65f3c9 100644 --- a/charts.go +++ b/charts.go @@ -377,10 +377,11 @@ func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { if len(lineSeriesList) != 0 { handler.Add(func() error { _, err := NewLineChart(p, LineChartOption{ - Theme: opt.theme, - Font: opt.font, - XAxis: opt.XAxis, - SymbolShow: opt.SymbolShow, + Theme: opt.theme, + Font: opt.font, + XAxis: opt.XAxis, + SymbolShow: opt.SymbolShow, + StrokeWidth: opt.LineStrokeWidth, }).render(renderResult, lineSeriesList) return err }) diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go index 5edf65b..36eabee 100644 --- a/examples/line_chart/main.go +++ b/examples/line_chart/main.go @@ -96,6 +96,7 @@ func main() { Bottom: 10, } opt.SymbolShow = charts.FalseFlag() + opt.LineStrokeWidth = 1 }, ) diff --git a/line_chart.go b/line_chart.go index dee122f..3942d70 100644 --- a/line_chart.go +++ b/line_chart.go @@ -62,6 +62,8 @@ type LineChartOption struct { Legend LegendOption // The flag for show symbol of line, set this to *false will hide symbol SymbolShow *bool + // The stroke width of line + StrokeWidth float64 // background is filled backgroundIsFilled bool } @@ -95,12 +97,16 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( markPointPainter, markLinePainter, } + strokeWidth := opt.StrokeWidth + if strokeWidth == 0 { + strokeWidth = defaultStrokeWidth + } for index := range seriesList { series := seriesList[index] seriesColor := opt.Theme.GetSeriesColor(series.index) drawingStyle := Style{ StrokeColor: seriesColor, - StrokeWidth: defaultStrokeWidth, + StrokeWidth: strokeWidth, } seriesPainter.SetDrawingStyle(drawingStyle) From 550b9874d23dc966e54248455a6e639c29affd26 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 29 Jul 2022 20:42:13 +0800 Subject: [PATCH 191/251] refactor: remove unused path --- axis.go | 5 ++++- axis_test.go | 4 ++-- bar_chart_test.go | 2 +- chart_option_test.go | 12 ++++++------ charts.go | 5 ++--- echarts_test.go | 2 +- horizontal_bar_chart_test.go | 2 +- line_chart_test.go | 4 ++-- 8 files changed, 19 insertions(+), 17 deletions(-) diff --git a/axis.go b/axis.go index 8e5bfda..3c0484c 100644 --- a/axis.go +++ b/axis.go @@ -265,6 +265,7 @@ func (a *axisPainter) Render() (Box, error) { // 显示辅助线 if opt.SplitLineShow { style.StrokeColor = opt.SplitLineColor + style.StrokeWidth = 1 top.OverrideDrawingStyle(style) if isVertical { x0 := p.Width() @@ -273,7 +274,9 @@ func (a *axisPainter) Render() (Box, error) { x0 = 0 x1 = top.Width() - p.Width() } - for _, y := range autoDivide(height, tickCount) { + yValues := autoDivide(height, tickCount) + yValues = yValues[0 : len(yValues)-1] + for _, y := range yValues { top.LineStroke([]Point{ { X: x0, diff --git a/axis_test.go b/axis_test.go index 17fe8d6..d0cff41 100644 --- a/axis_test.go +++ b/axis_test.go @@ -113,7 +113,7 @@ func TestAxis(t *testing.T) { }).Render() return p.Bytes() }, - result: "\\nMonTueWedThuFriSatSun", + result: "\\nMonTueWedThuFriSatSun", }, // 右侧 { @@ -135,7 +135,7 @@ func TestAxis(t *testing.T) { }).Render() return p.Bytes() }, - result: "\\nMonTueWedThuFriSatSun", + result: "\\nMonTueWedThuFriSatSun", }, // 顶部 { diff --git a/bar_chart_test.go b/bar_chart_test.go index f1bd688..bee0583 100644 --- a/bar_chart_test.go +++ b/bar_chart_test.go @@ -102,7 +102,7 @@ func TestBarChart(t *testing.T) { } return p.Bytes() }, - result: "\\n24020016012080400FebMayAugNov24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", + result: "\\n24020016012080400FebMayAugNov24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", }, } diff --git a/chart_option_test.go b/chart_option_test.go index 1238422..6f331b3 100644 --- a/chart_option_test.go +++ b/chart_option_test.go @@ -204,7 +204,7 @@ func TestLineRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", string(data)) + assert.Equal("\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", string(data)) } func TestBarRender(t *testing.T) { @@ -277,7 +277,7 @@ func TestBarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nRainfallEvaporation24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporation24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) } func TestHorizontalBarRender(t *testing.T) { @@ -326,7 +326,7 @@ func TestHorizontalBarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", string(data)) + assert.Equal("\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", string(data)) } func TestPieRender(t *testing.T) { @@ -368,7 +368,7 @@ func TestPieRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", string(data)) + assert.Equal("\\nSearch EngineDirectEmailUnion AdsVideo AdsRainfall vs EvaporationFake DataSearch Engine: 33.3%Direct: 23.35%Email: 18.43%Union Ads: 15.37%Video Ads: 9.53%", string(data)) } func TestRadarRender(t *testing.T) { @@ -419,7 +419,7 @@ func TestRadarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nAllocated BudgetActual SpendingBasic Radar ChartSalesAdministrationInformation TechnologyCustomer SupportDevelopmentMarketing", string(data)) + assert.Equal("\\nAllocated BudgetActual SpendingBasic Radar ChartSalesAdministrationInformation TechnologyCustomer SupportDevelopmentMarketing", string(data)) } func TestFunnelRender(t *testing.T) { @@ -447,5 +447,5 @@ func TestFunnelRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nShowClickVisitInquiryOrderFunnelShow(100%)Click(80%)Visit(60%)Inquiry(40%)Order(20%)", string(data)) + assert.Equal("\\nShowClickVisitInquiryOrderFunnelShow(100%)Click(80%)Visit(60%)Inquiry(40%)Order(20%)", string(data)) } diff --git a/charts.go b/charts.go index d65f3c9..185e638 100644 --- a/charts.go +++ b/charts.go @@ -316,9 +316,8 @@ func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { TitleOption: opt.Title, LegendOption: opt.Legend, axisReversed: axisReversed, - } - if isChild { - renderOpt.backgroundIsFilled = true + // 前置已设置背景色 + backgroundIsFilled: true, } if len(pieSeriesList) != 0 || len(radarSeriesList) != 0 || diff --git a/echarts_test.go b/echarts_test.go index 8deda2d..5c2dbad 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -578,5 +578,5 @@ func TestRenderEChartsToSVG(t *testing.T) { ] }`) assert.Nil(err) - assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) } diff --git a/horizontal_bar_chart_test.go b/horizontal_bar_chart_test.go index 5555df6..e078c4a 100644 --- a/horizontal_bar_chart_test.go +++ b/horizontal_bar_chart_test.go @@ -83,7 +83,7 @@ func TestHorizontalBarChart(t *testing.T) { } return p.Bytes() }, - result: "\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", + result: "\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", }, } for _, tt := range tests { diff --git a/line_chart_test.go b/line_chart_test.go index 856cdf3..e169f90 100644 --- a/line_chart_test.go +++ b/line_chart_test.go @@ -117,7 +117,7 @@ func TestLineChart(t *testing.T) { } return p.Bytes() }, - result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", }, { render: func(p *Painter) ([]byte, error) { @@ -201,7 +201,7 @@ func TestLineChart(t *testing.T) { } return p.Bytes() }, - result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", }, } From 93e03856cac44d574178f85f70fff4d4bc2ac1b3 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 10 Aug 2022 20:39:14 +0800 Subject: [PATCH 192/251] fix: fix NaN of radar chart, #17 --- radar_chart.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/radar_chart.go b/radar_chart.go index eab70d5..429850d 100644 --- a/radar_chart.go +++ b/radar_chart.go @@ -200,7 +200,11 @@ func (r *radarChart) render(result *defaultRenderResult, seriesList SeriesList) continue } indicator := indicators[j] - percent := (item.Value - indicator.Min) / (indicator.Max - indicator.Min) + var percent float64 + offset := indicator.Max - indicator.Min + if offset > 0 { + percent = (item.Value - indicator.Min) / offset + } r := percent * radius p := getPolygonPoint(center, r, angles[j]) linePoints = append(linePoints, p) From dc1a89d3ff8937afc58a4f90a6c935d11aa859ab Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 25 Aug 2022 20:19:05 +0800 Subject: [PATCH 193/251] feat: support fill area of line chart --- .gitignore | 1 + chart_option.go | 2 + charts.go | 1 + examples/area_line_chart/main.go | 74 ++++++++++++++++++++++++++++++++ examples/charts/main.go | 31 +++++++++++++ line_chart.go | 22 +++++++++- 6 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 examples/area_line_chart/main.go diff --git a/.gitignore b/.gitignore index 4a7b0d9..57206ee 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ *.svg tmp NotoSansSC.ttf +.vscode \ No newline at end of file diff --git a/chart_option.go b/chart_option.go index 58001bd..93b81ba 100644 --- a/chart_option.go +++ b/chart_option.go @@ -66,6 +66,8 @@ type ChartOption struct { SymbolShow *bool // The stroke width of line chart LineStrokeWidth float64 + // Fill the area of line chart + FillArea bool // The child charts Children []ChartOption } diff --git a/charts.go b/charts.go index 185e638..849f0c7 100644 --- a/charts.go +++ b/charts.go @@ -381,6 +381,7 @@ func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { XAxis: opt.XAxis, SymbolShow: opt.SymbolShow, StrokeWidth: opt.LineStrokeWidth, + FillArea: opt.FillArea, }).render(renderResult, lineSeriesList) return err }) diff --git a/examples/area_line_chart/main.go b/examples/area_line_chart/main.go new file mode 100644 index 0000000..7a84df0 --- /dev/null +++ b/examples/area_line_chart/main.go @@ -0,0 +1,74 @@ +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + + "github.com/vicanso/go-charts/v2" +) + +func writeFile(buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file := filepath.Join(tmpPath, "area-line-chart.png") + err = ioutil.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func main() { + values := [][]float64{ + { + 120, + 132, + 101, + 134, + 90, + 230, + 210, + }, + } + p, err := charts.LineRender( + values, + charts.TitleTextOptionFunc("Line"), + charts.XAxisDataOptionFunc([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + charts.LegendLabelsOptionFunc([]string{ + "Email", + }, "50"), + func(opt *charts.ChartOption) { + opt.Legend.Padding = charts.Box{ + Top: 5, + Bottom: 10, + } + opt.FillArea = true + }, + ) + + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + err = writeFile(buf) + if err != nil { + panic(err) + } +} diff --git a/examples/charts/main.go b/examples/charts/main.go index 7b14919..c3bb486 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -2,6 +2,7 @@ package main import ( "bytes" + "fmt" "net/http" "strconv" @@ -261,6 +262,35 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { }, }, }, + { + Title: charts.TitleOption{ + Text: "Line Area", + }, + Legend: charts.NewLegendOption([]string{ + "Email", + }), + XAxis: charts.NewXAxisOption([]string{ + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sun", + }), + SeriesList: []charts.Series{ + charts.NewSeriesFromValues([]float64{ + 120, + 132, + 101, + 134, + 90, + 230, + 210, + }), + }, + FillArea: true, + }, // 柱状图 { Title: charts.TitleOption{ @@ -1935,5 +1965,6 @@ func echartsHandler(w http.ResponseWriter, req *http.Request) { func main() { http.HandleFunc("/", indexHandler) http.HandleFunc("/echarts", echartsHandler) + fmt.Println("http://127.0.0.1:3012/") http.ListenAndServe(":3012", nil) } diff --git a/line_chart.go b/line_chart.go index 3942d70..0b44cdf 100644 --- a/line_chart.go +++ b/line_chart.go @@ -64,6 +64,8 @@ type LineChartOption struct { SymbolShow *bool // The stroke width of line StrokeWidth float64 + // Fill the area of line + FillArea bool // background is filled backgroundIsFilled bool } @@ -109,7 +111,6 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( StrokeWidth: strokeWidth, } - seriesPainter.SetDrawingStyle(drawingStyle) yRange := result.axisRanges[series.AxisIndex] points := make([]Point, 0) for i, item := range series.Data { @@ -120,6 +121,25 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( } points = append(points, p) } + // 如果需要填充区域 + if opt.FillArea { + areaPoints := make([]Point, len(points)) + copy(areaPoints, points) + bottomY := yRange.getRestHeight(yRange.min) + areaPoints = append(areaPoints, Point{ + X: areaPoints[len(areaPoints)-1].X, + Y: bottomY, + }, Point{ + X: areaPoints[0].X, + Y: bottomY, + }, areaPoints[0]) + seriesPainter.SetDrawingStyle(Style{ + FillColor: seriesColor.WithAlpha(200), + }) + seriesPainter.FillArea(areaPoints) + } + seriesPainter.SetDrawingStyle(drawingStyle) + // 画线 seriesPainter.LineStroke(points) From 128d5b277410e3c8c5a016dfcfade05f4bbd5cfb Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 28 Aug 2022 09:43:18 +0800 Subject: [PATCH 194/251] refactor: adjust max value of axis, #19 --- mark_line_test.go | 2 +- range.go | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/mark_line_test.go b/mark_line_test.go index 84152ce..ef29e6f 100644 --- a/mark_line_test.go +++ b/mark_line_test.go @@ -67,7 +67,7 @@ func TestMarkLine(t *testing.T) { } return p.Bytes() }, - result: "\\n321", + result: "\\n321", }, } for _, tt := range tests { diff --git a/range.go b/range.go index 579a77f..ebd0b2d 100644 --- a/range.go +++ b/range.go @@ -60,7 +60,10 @@ func NewRange(opt AxisRangeOption) axisRange { r := math.Abs(max - min) // 最小单位计算 - unit := 2 + unit := 1 + if r > 5 { + unit = 2 + } if r > 10 { unit = 4 } @@ -85,6 +88,10 @@ func NewRange(opt AxisRangeOption) axisRange { } } max = min + float64(unit*divideCount) + expectMax := opt.Max * 2 + if max > expectMax { + max = float64(ceilFloatToInt(expectMax)) + } return axisRange{ divideCount: divideCount, min: min, From 4a1ff8055656382652b49cafc7ee22132884ebcc Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 1 Sep 2022 20:20:51 +0800 Subject: [PATCH 195/251] fix: fix min and max option of y axis --- .github/workflows/test.yml | 1 + charts.go | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 22e77a8..61449a3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,6 +14,7 @@ jobs: strategy: matrix: go: + - '1.19' - '1.18' - '1.17' - '1.16' diff --git a/charts.go b/charts.go index 849f0c7..6d5dc56 100644 --- a/charts.go +++ b/charts.go @@ -174,12 +174,6 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e yAxisOption = opt.YAxisOptions[index] } max, min := opt.SeriesList.GetMaxMin(index) - if yAxisOption.Min != nil { - min = *yAxisOption.Min - } - if yAxisOption.Max != nil { - max = *yAxisOption.Max - } r := NewRange(AxisRangeOption{ Min: min, Max: max, @@ -188,6 +182,12 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e // 分隔数量 DivideCount: defaultAxisDivideCount, }) + if yAxisOption.Min != nil && *yAxisOption.Min <= min { + r.min = *yAxisOption.Min + } + if yAxisOption.Max != nil && *yAxisOption.Max >= max { + r.max = *yAxisOption.Max + } result.axisRanges[index] = r if yAxisOption.Theme == nil { From bb9af986be59b6c3be100e81ae54a4b713bf0a6c Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 2 Sep 2022 20:42:10 +0800 Subject: [PATCH 196/251] chore: update go modules --- go.mod | 4 ++-- go.sum | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 66145c7..de0bb9c 100644 --- a/go.mod +++ b/go.mod @@ -5,13 +5,13 @@ go 1.17 require ( github.com/dustin/go-humanize v1.0.0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 - github.com/stretchr/testify v1.7.2 + github.com/stretchr/testify v1.8.0 github.com/wcharczuk/go-chart/v2 v2.1.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.0.0-20220617043117-41969df76e82 // indirect + golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 5f953b0..e0b1547 100644 --- a/go.sum +++ b/go.sum @@ -8,17 +8,20 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20220617043117-41969df76e82 h1:KpZB5pUSBvrHltNEdK/tw0xlPeD13M6M6aGP32gKqiw= -golang.org/x/image v0.0.0-20220617043117-41969df76e82/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= +golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY= +golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 50605907c761ba72f14f9f666775b394202195c8 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 15 Sep 2022 20:09:00 +0800 Subject: [PATCH 197/251] feat: support null value for line chart --- charts.go | 13 +++++++++++++ examples/line_chart/main.go | 3 ++- line_chart.go | 5 +++++ painter.go | 9 ++++++++- series.go | 4 ++++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/charts.go b/charts.go index 6d5dc56..f7e52e4 100644 --- a/charts.go +++ b/charts.go @@ -24,6 +24,7 @@ package charts import ( "errors" + "math" "sort" "github.com/wcharczuk/go-chart/v2" @@ -51,6 +52,18 @@ func SetDefaultHeight(height int) { } } +var nullValue = math.MaxFloat64 + +// SetNullValue sets the null value, default is MaxFloat64 +func SetNullValue(v float64) { + nullValue = v +} + +// GetNullValue gets the null value +func GetNullValue() float64 { + return nullValue +} + type Renderer interface { Render() (Box, error) } diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go index 36eabee..97d5859 100644 --- a/examples/line_chart/main.go +++ b/examples/line_chart/main.go @@ -29,7 +29,8 @@ func main() { 120, 132, 101, - 134, + // 134, + charts.GetNullValue(), 90, 230, 210, diff --git a/line_chart.go b/line_chart.go index 0b44cdf..839aa6f 100644 --- a/line_chart.go +++ b/line_chart.go @@ -23,6 +23,8 @@ package charts import ( + "math" + "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2/drawing" ) @@ -115,6 +117,9 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( points := make([]Point, 0) for i, item := range series.Data { h := yRange.getRestHeight(item.Value) + if item.Value == nullValue { + h = math.MaxInt + } p := Point{ X: xValues[i], Y: h, diff --git a/painter.go b/painter.go index 1a954e2..f172cb3 100644 --- a/painter.go +++ b/painter.go @@ -438,11 +438,18 @@ func (p *Painter) MeasureTextMaxWidthHeight(textList []string) (int, int) { } func (p *Painter) LineStroke(points []Point) *Painter { + shouldMoveTo := false for index, point := range points { x := point.X y := point.Y - if index == 0 { + if y == math.MaxInt { + p.Stroke() + shouldMoveTo = true + continue + } + if shouldMoveTo || index == 0 { p.MoveTo(x, y) + shouldMoveTo = false } else { p.LineTo(x, y) } diff --git a/series.go b/series.go index ea71869..7bd6834 100644 --- a/series.go +++ b/series.go @@ -165,6 +165,10 @@ func (sl SeriesList) GetMaxMin(axisIndex int) (float64, float64) { continue } for _, item := range series.Data { + // 如果为空值,忽略 + if item.Value == nullValue { + continue + } if item.Value > max { max = item.Value } From 825e65d93078aee8ae99916ff916daf7a425a56d Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 15 Sep 2022 20:15:05 +0800 Subject: [PATCH 198/251] refactor: use MaxInt32 instead of MaxInt --- line_chart.go | 2 +- painter.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/line_chart.go b/line_chart.go index 839aa6f..cdec280 100644 --- a/line_chart.go +++ b/line_chart.go @@ -118,7 +118,7 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( for i, item := range series.Data { h := yRange.getRestHeight(item.Value) if item.Value == nullValue { - h = math.MaxInt + h = int(math.MaxInt32) } p := Point{ X: xValues[i], diff --git a/painter.go b/painter.go index f172cb3..b7122b7 100644 --- a/painter.go +++ b/painter.go @@ -442,7 +442,7 @@ func (p *Painter) LineStroke(points []Point) *Painter { for index, point := range points { x := point.X y := point.Y - if y == math.MaxInt { + if y == int(math.MaxInt32) { p.Stroke() shouldMoveTo = true continue From de49ef8c68ea47881d103d6f650c17ac5a1ea14a Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 22 Sep 2022 20:10:45 +0800 Subject: [PATCH 199/251] feat: support label for line chart, #23 --- bar_chart.go | 17 +++------------ line_chart.go | 30 ++++++++++++++++++++++++++ series_label.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 14 deletions(-) create mode 100644 series_label.go diff --git a/bar_chart.go b/bar_chart.go index 26f8da5..797f710 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -62,13 +62,6 @@ type BarChartOption struct { Legend LegendOption } -type barChartLabelRenderOption struct { - Text string - Style Style - X int - Y int -} - func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { p := b.p opt := b.opt @@ -100,11 +93,12 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B markPointPainter := NewMarkPointPainter(seriesPainter) markLinePainter := NewMarkLinePainter(seriesPainter) + labelPainter := NewSeriesLabelPainter(seriesPainter) rendererList := []Renderer{ + labelPainter, markPointPainter, markLinePainter, } - labelRenderOptions := make([]barChartLabelRenderOption, 0) for index := range seriesList { series := seriesList[index] yRange := result.axisRanges[series.AxisIndex] @@ -168,8 +162,7 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B } textBox := seriesPainter.MeasureText(text) - - labelRenderOptions = append(labelRenderOptions, barChartLabelRenderOption{ + labelPainter.Add(LabelValue{ Text: text, Style: labelStyle, X: x + (barWidth-textBox.Width())>>1, @@ -192,10 +185,6 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B Range: yRange, }) } - for _, labelOpt := range labelRenderOptions { - seriesPainter.OverrideTextStyle(labelOpt.Style) - seriesPainter.Text(labelOpt.Text, labelOpt.X, labelOpt.Y) - } // 最大、最小的mark point err := doRender(rendererList...) if err != nil { diff --git a/line_chart.go b/line_chart.go index cdec280..bf39ae2 100644 --- a/line_chart.go +++ b/line_chart.go @@ -97,7 +97,9 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( } markPointPainter := NewMarkPointPainter(seriesPainter) markLinePainter := NewMarkLinePainter(seriesPainter) + labelPainter := NewSeriesLabelPainter(seriesPainter) rendererList := []Renderer{ + labelPainter, markPointPainter, markLinePainter, } @@ -105,6 +107,8 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( if strokeWidth == 0 { strokeWidth = defaultStrokeWidth } + seriesNames := seriesList.Names() + theme := opt.Theme for index := range seriesList { series := seriesList[index] seriesColor := opt.Theme.GetSeriesColor(series.index) @@ -125,6 +129,32 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( Y: h, } points = append(points, p) + + // 如果label不需要展示,则返回 + if !series.Label.Show { + continue + } + distance := series.Label.Distance + if distance == 0 { + distance = 5 + } + text := NewValueLabelFormatter(seriesNames, series.Label.Formatter)(index, item.Value, -1) + labelStyle := Style{ + FontColor: theme.GetTextColor(), + FontSize: labelFontSize, + Font: opt.Font, + } + if !series.Label.Color.IsZero() { + labelStyle.FontColor = series.Label.Color + } + + textBox := seriesPainter.MeasureText(text) + labelPainter.Add(LabelValue{ + Text: text, + Style: labelStyle, + X: p.X - textBox.Width()>>1, + Y: p.Y - distance, + }) } // 如果需要填充区域 if opt.FillArea { diff --git a/series_label.go b/series_label.go new file mode 100644 index 0000000..c1850bb --- /dev/null +++ b/series_label.go @@ -0,0 +1,56 @@ +// MIT License + +// Copyright (c) 2022 Tree Xie + +// 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. + +package charts + +import "github.com/wcharczuk/go-chart/v2" + +type LabelValue struct { + Text string + Style Style + X int + Y int +} + +type SeriesLabelPainter struct { + p *Painter + values []LabelValue +} + +func NewSeriesLabelPainter(p *Painter) *SeriesLabelPainter { + return &SeriesLabelPainter{ + p: p, + values: make([]LabelValue, 0), + } +} + +func (o *SeriesLabelPainter) Add(value LabelValue) { + o.values = append(o.values, value) +} + +func (o *SeriesLabelPainter) Render() (Box, error) { + for _, item := range o.values { + o.p.OverrideTextStyle(item.Style) + o.p.Text(item.Text, item.X, item.Y) + } + return chart.BoxZero, nil +} From 1f5b9d513ee4387b2fc5a0f8a2b3ccb3836ad42f Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 23 Sep 2022 20:50:42 +0800 Subject: [PATCH 200/251] refactor: adjust series label render --- bar_chart.go | 39 ++++++++++++--------------- bar_chart_test.go | 2 +- line_chart.go | 39 +++++++++++---------------- series_label.go | 69 ++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 94 insertions(+), 55 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index 797f710..8826ffb 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -93,9 +93,7 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B markPointPainter := NewMarkPointPainter(seriesPainter) markLinePainter := NewMarkLinePainter(seriesPainter) - labelPainter := NewSeriesLabelPainter(seriesPainter) rendererList := []Renderer{ - labelPainter, markPointPainter, markLinePainter, } @@ -106,6 +104,18 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B divideValues := xRange.AutoDivide() points := make([]Point, len(series.Data)) + var labelPainter *SeriesLabelPainter + if series.Label.Show { + labelPainter = NewSeriesLabelPainter(SeriesLabelPainterParams{ + P: seriesPainter, + SeriesNames: seriesNames, + Label: series.Label, + Theme: opt.Theme, + Font: opt.Font, + }) + rendererList = append(rendererList, labelPainter) + } + for j, item := range series.Data { if j >= xRange.divideCount { continue @@ -144,29 +154,14 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B Y: top, } // 如果label不需要展示,则返回 - if !series.Label.Show { + if labelPainter == nil { continue } - distance := series.Label.Distance - if distance == 0 { - distance = 5 - } - text := NewValueLabelFormatter(seriesNames, series.Label.Formatter)(index, item.Value, -1) - labelStyle := Style{ - FontColor: theme.GetTextColor(), - FontSize: labelFontSize, - Font: opt.Font, - } - if !series.Label.Color.IsZero() { - labelStyle.FontColor = series.Label.Color - } - - textBox := seriesPainter.MeasureText(text) labelPainter.Add(LabelValue{ - Text: text, - Style: labelStyle, - X: x + (barWidth-textBox.Width())>>1, - Y: barMaxHeight - h - distance, + Index: index, + Value: item.Value, + X: x + barWidth>>1, + Y: barMaxHeight - h, }) } diff --git a/bar_chart_test.go b/bar_chart_test.go index bee0583..e1522d6 100644 --- a/bar_chart_test.go +++ b/bar_chart_test.go @@ -102,7 +102,7 @@ func TestBarChart(t *testing.T) { } return p.Bytes() }, - result: "\\n24020016012080400FebMayAugNov24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", + result: "\\n24020016012080400FebMayAugNov24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", }, } diff --git a/line_chart.go b/line_chart.go index bf39ae2..26f94a4 100644 --- a/line_chart.go +++ b/line_chart.go @@ -97,9 +97,7 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( } markPointPainter := NewMarkPointPainter(seriesPainter) markLinePainter := NewMarkLinePainter(seriesPainter) - labelPainter := NewSeriesLabelPainter(seriesPainter) rendererList := []Renderer{ - labelPainter, markPointPainter, markLinePainter, } @@ -108,7 +106,6 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( strokeWidth = defaultStrokeWidth } seriesNames := seriesList.Names() - theme := opt.Theme for index := range seriesList { series := seriesList[index] seriesColor := opt.Theme.GetSeriesColor(series.index) @@ -119,6 +116,17 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( yRange := result.axisRanges[series.AxisIndex] points := make([]Point, 0) + var labelPainter *SeriesLabelPainter + if series.Label.Show { + labelPainter = NewSeriesLabelPainter(SeriesLabelPainterParams{ + P: seriesPainter, + SeriesNames: seriesNames, + Label: series.Label, + Theme: opt.Theme, + Font: opt.Font, + }) + rendererList = append(rendererList, labelPainter) + } for i, item := range series.Data { h := yRange.getRestHeight(item.Value) if item.Value == nullValue { @@ -131,29 +139,14 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( points = append(points, p) // 如果label不需要展示,则返回 - if !series.Label.Show { + if labelPainter == nil { continue } - distance := series.Label.Distance - if distance == 0 { - distance = 5 - } - text := NewValueLabelFormatter(seriesNames, series.Label.Formatter)(index, item.Value, -1) - labelStyle := Style{ - FontColor: theme.GetTextColor(), - FontSize: labelFontSize, - Font: opt.Font, - } - if !series.Label.Color.IsZero() { - labelStyle.FontColor = series.Label.Color - } - - textBox := seriesPainter.MeasureText(text) labelPainter.Add(LabelValue{ - Text: text, - Style: labelStyle, - X: p.X - textBox.Width()>>1, - Y: p.Y - distance, + Index: index, + Value: item.Value, + X: p.X, + Y: p.Y, }) } // 如果需要填充区域 diff --git a/series_label.go b/series_label.go index c1850bb..57bd1bf 100644 --- a/series_label.go +++ b/series_label.go @@ -22,29 +22,80 @@ package charts -import "github.com/wcharczuk/go-chart/v2" +import ( + "github.com/golang/freetype/truetype" + "github.com/wcharczuk/go-chart/v2" +) -type LabelValue struct { +type labelRenderValue struct { Text string Style Style X int Y int } -type SeriesLabelPainter struct { - p *Painter - values []LabelValue +type LabelValue struct { + Index int + Value float64 + X int + Y int } -func NewSeriesLabelPainter(p *Painter) *SeriesLabelPainter { +type SeriesLabelPainter struct { + p *Painter + seriesNames []string + label *SeriesLabel + theme ColorPalette + font *truetype.Font + values []labelRenderValue +} + +type SeriesLabelPainterParams struct { + P *Painter + SeriesNames []string + Label SeriesLabel + Theme ColorPalette + Font *truetype.Font +} + +func NewSeriesLabelPainter(params SeriesLabelPainterParams) *SeriesLabelPainter { return &SeriesLabelPainter{ - p: p, - values: make([]LabelValue, 0), + p: params.P, + seriesNames: params.SeriesNames, + label: ¶ms.Label, + theme: params.Theme, + font: params.Font, + values: make([]labelRenderValue, 0), } } func (o *SeriesLabelPainter) Add(value LabelValue) { - o.values = append(o.values, value) + label := o.label + distance := label.Distance + if distance == 0 { + distance = 5 + } + text := NewValueLabelFormatter(o.seriesNames, label.Formatter)(value.Index, value.Value, -1) + labelStyle := Style{ + FontColor: o.theme.GetTextColor(), + FontSize: labelFontSize, + Font: o.font, + } + if !label.Color.IsZero() { + labelStyle.FontColor = label.Color + } + o.p.OverrideDrawingStyle(labelStyle) + textBox := o.p.MeasureText(text) + renderValue := labelRenderValue{ + Text: text, + Style: labelStyle, + X: value.X - textBox.Width()>>1, + Y: value.Y - distance, + } + if textBox.Width()%2 != 0 { + renderValue.X++ + } + o.values = append(o.values, renderValue) } func (o *SeriesLabelPainter) Render() (Box, error) { From a6935111d06b0a477ea41b5e93d9605f905e07ae Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 25 Sep 2022 15:22:34 +0800 Subject: [PATCH 201/251] chore: update go modules --- go.mod | 8 ++++---- go.sum | 16 ++++++---------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index cdccb50..dd501e5 100644 --- a/go.mod +++ b/go.mod @@ -1,22 +1,22 @@ module github.com/vicanso/go-charts-web -go 1.17 +go 1.18 require ( github.com/vicanso/elton v1.9.5 - github.com/vicanso/go-charts/v2 v2.0.4 + github.com/vicanso/go-charts/v2 v2.3.0 ) require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/tidwall/gjson v1.14.1 // indirect + github.com/tidwall/gjson v1.14.3 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect github.com/vicanso/hes v0.6.0 // indirect github.com/vicanso/intranet-ip v0.1.0 // indirect github.com/vicanso/keygrip v1.2.1 // indirect github.com/wcharczuk/go-chart/v2 v2.1.0 // indirect - golang.org/x/image v0.0.0-20220617043117-41969df76e82 // indirect + golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 // indirect ) diff --git a/go.sum b/go.sum index a7da04d..d13d097 100644 --- a/go.sum +++ b/go.sum @@ -10,23 +10,20 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= -github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= +github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/vicanso/elton v1.9.5 h1:vWCota4myz2BXT40RqbxMZlSTTvxiSPR06rJ/VWXEqQ= github.com/vicanso/elton v1.9.5/go.mod h1:KIEn5zohLKfKo3d/Rlww5j2/jbOXDdNlO/UTwxrc+wk= -github.com/vicanso/go-charts/v2 v2.0.4 h1:xq56GvtwvMW7YHkBNfHrCHo/RGEdHmepHLCT/LtIdzc= -github.com/vicanso/go-charts/v2 v2.0.4/go.mod h1:OlgbGdGfxTfx/PPym1atWf6DKFiu/cmGN7Pn/H8cfYE= +github.com/vicanso/go-charts/v2 v2.3.0 h1:+YbtMsPdhrhbdiPzyLx6OVnHbhIbl4aEmmfaQlufNp8= +github.com/vicanso/go-charts/v2 v2.3.0/go.mod h1:j9h9EbZk5t2sXk9rhw4pXxrzy5G/LncABf2hXWOE3WU= github.com/vicanso/hes v0.6.0 h1:rmLhJw1PkZ+BTlJXt91i12mr7vpIC65S5KRCD4uF9HU= github.com/vicanso/hes v0.6.0/go.mod h1:bO1pAVgzuwBJAv76LXx8YN6jXLWcCYVyNx4qzPw9h6Y= github.com/vicanso/intranet-ip v0.1.0 h1:UeoxilO2VDIkeZZxmu6aT+f5o79mfGdsSdwoEv75nYo= @@ -36,8 +33,8 @@ github.com/vicanso/keygrip v1.2.1/go.mod h1:tfB5az1yqold78zotkzNugk3sV+QW5m71CFz github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20220617043117-41969df76e82 h1:KpZB5pUSBvrHltNEdK/tw0xlPeD13M6M6aGP32gKqiw= -golang.org/x/image v0.0.0-20220617043117-41969df76e82/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= +golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY= +golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -45,4 +42,3 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20220512140231-539c8e751b99/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 0a80e7056f69f21d1561f4426877ab7fa376dd4f Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 28 Sep 2022 20:29:22 +0800 Subject: [PATCH 202/251] feat: support setting bar width for bar chart, #24 --- bar_chart.go | 10 ++++++++-- chart_option.go | 2 ++ charts.go | 7 ++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index 8826ffb..2addd17 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -59,7 +59,8 @@ type BarChartOption struct { // The option of title Title TitleOption // The legend option - Legend LegendOption + Legend LegendOption + BarWidth int } func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { @@ -86,7 +87,12 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B } seriesCount := len(seriesList) // 总的宽度-两个margin-(总数-1)的barMargin - barWidth := (width - 2*margin - barMargin*(seriesCount-1)) / len(seriesList) + barWidth := (width - 2*margin - barMargin*(seriesCount-1)) / seriesCount + if opt.BarWidth > 0 && opt.BarWidth < barWidth { + barWidth = opt.BarWidth + // 重新计算margin + margin = (width - len(seriesList)*barWidth - barMargin*(seriesCount-1)) / 2 + } barMaxHeight := seriesPainter.Height() theme := opt.Theme seriesNames := seriesList.Names() diff --git a/chart_option.go b/chart_option.go index 93b81ba..447ef52 100644 --- a/chart_option.go +++ b/chart_option.go @@ -66,6 +66,8 @@ type ChartOption struct { SymbolShow *bool // The stroke width of line chart LineStrokeWidth float64 + // The bar with of bar chart + BarWidth int // Fill the area of line chart FillArea bool // The child charts diff --git a/charts.go b/charts.go index f7e52e4..f8c94a3 100644 --- a/charts.go +++ b/charts.go @@ -354,9 +354,10 @@ func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { if len(barSeriesList) != 0 { handler.Add(func() error { _, err := NewBarChart(p, BarChartOption{ - Theme: opt.theme, - Font: opt.font, - XAxis: opt.XAxis, + Theme: opt.theme, + Font: opt.font, + XAxis: opt.XAxis, + BarWidth: opt.BarWidth, }).render(renderResult, barSeriesList) return err }) From 6652ece0fed83a33ea6dbe7bd0d99c8b14e945bc Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 29 Sep 2022 20:20:54 +0800 Subject: [PATCH 203/251] feat: support bar height for horizontal bar chart --- bar_chart.go | 2 +- chart_option.go | 2 ++ charts.go | 1 + horizontal_bar_chart.go | 9 +++++++-- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index 2addd17..d798c07 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -91,7 +91,7 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B if opt.BarWidth > 0 && opt.BarWidth < barWidth { barWidth = opt.BarWidth // 重新计算margin - margin = (width - len(seriesList)*barWidth - barMargin*(seriesCount-1)) / 2 + margin = (width - seriesCount*barWidth - barMargin*(seriesCount-1)) / 2 } barMaxHeight := seriesPainter.Height() theme := opt.Theme diff --git a/chart_option.go b/chart_option.go index 447ef52..f3bf2cb 100644 --- a/chart_option.go +++ b/chart_option.go @@ -68,6 +68,8 @@ type ChartOption struct { LineStrokeWidth float64 // The bar with of bar chart BarWidth int + // The bar height of horizontal bar chart + BarHeight int // Fill the area of line chart FillArea bool // The child charts diff --git a/charts.go b/charts.go index f8c94a3..c7923f1 100644 --- a/charts.go +++ b/charts.go @@ -369,6 +369,7 @@ func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { _, err := NewHorizontalBarChart(p, HorizontalBarChartOption{ Theme: opt.theme, Font: opt.font, + BarHeight: opt.BarHeight, YAxisOptions: opt.YAxisOptions, }).render(renderResult, horizontalBarSeriesList) return err diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index 30a9b7d..8ffac44 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -48,7 +48,8 @@ type HorizontalBarChartOption struct { // The option of title Title TitleOption // The legend option - Legend LegendOption + Legend LegendOption + BarHeight int } // NewHorizontalBarChart returns a horizontal bar chart renderer @@ -82,7 +83,11 @@ func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList Seri } seriesCount := len(seriesList) // 总的高度-两个margin-(总数-1)的barMargin - barHeight := (height - 2*margin - barMargin*(seriesCount-1)) / len(seriesList) + barHeight := (height - 2*margin - barMargin*(seriesCount-1)) / seriesCount + if opt.BarHeight > 0 && opt.BarHeight < barHeight { + barHeight = opt.BarHeight + margin = (height - seriesCount*barHeight - barMargin*(seriesCount-1)) / 2 + } theme := opt.Theme From 0a1061a8db90cf3829279afae2c72ca4968b7c8d Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 11 Oct 2022 20:17:22 +0800 Subject: [PATCH 204/251] docs: update document --- README_zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_zh.md b/README_zh.md index 87c42fa..c31cf77 100644 --- a/README_zh.md +++ b/README_zh.md @@ -569,7 +569,7 @@ BenchmarkMultiChartSVGRender-8 367 3356325 ns/op 默认使用的字符为`roboto`为英文字体库,因此如果需要显示中文字符需要增加中文字体库,`InstallFont`函数可添加对应的字体库,成功添加之后则指定`title.textStyle.fontFamily`即可。 在浏览器中使用`svg`时,如果指定的`fontFamily`不支持中文字符,展示的中文并不会乱码,但是会导致在计算字符宽度等错误。 -字体文件可以在[中文字库noto-cjk](https://github.com/googlefonts/noto-cjk)下载,注意下载时选择字体格式为 `ttf` 格式,如果选用 `otf` 格式可能会加载失败。 +字体文件可以在[中文字库noto-cjk](https://github.com/googlefonts/noto-cjk)下载,注意下载时选择字体格式为 `ttf` 格式,如果选用 `otf` 格式可能会加载失败,字体尽量选择Bold类型,否则生成的图片会有点模糊。 示例见 [examples/chinese/main.go](examples/chinese/main.go) From 74a47a9858bd82972d25f39ae64bae7783721353 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 20 Oct 2022 20:27:42 +0800 Subject: [PATCH 205/251] refactor: enhance value format, #28 --- util.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/util.go b/util.go index a33c6d2..f8a451e 100644 --- a/util.go +++ b/util.go @@ -160,15 +160,25 @@ func NewFloatPoint(f float64) *float64 { v := f return &v } + +const K_VALUE = float64(1000) +const M_VALUE = K_VALUE * K_VALUE +const G_VALUE = M_VALUE * K_VALUE +const T_VALUE = G_VALUE * K_VALUE + func commafWithDigits(value float64) string { decimals := 2 - m := float64(1000 * 1000) - if value >= m { - return humanize.CommafWithDigits(value/m, decimals) + "M" + if value >= T_VALUE { + return humanize.CommafWithDigits(value/T_VALUE, decimals) + "T" } - k := float64(1000) - if value >= k { - return humanize.CommafWithDigits(value/k, decimals) + "k" + if value >= G_VALUE { + return humanize.CommafWithDigits(value/G_VALUE, decimals) + "G" + } + if value >= M_VALUE { + return humanize.CommafWithDigits(value/M_VALUE, decimals) + "M" + } + if value >= K_VALUE { + return humanize.CommafWithDigits(value/K_VALUE, decimals) + "k" } return humanize.CommafWithDigits(value, decimals) } From a88e607bfc83b27502a54879ae749050683c9123 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 21 Oct 2022 20:37:09 +0800 Subject: [PATCH 206/251] refactor: support custom value formatter --- bar_chart.go | 1 + chart_option.go | 2 ++ charts.go | 8 ++++++-- examples/line_chart/main.go | 4 ++++ horizontal_bar_chart.go | 1 + mark_line_test.go | 1 + painter.go | 8 +++++++- range.go | 9 ++++++++- 8 files changed, 30 insertions(+), 4 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index d798c07..19c1664 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -69,6 +69,7 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B seriesPainter := result.seriesPainter xRange := NewRange(AxisRangeOption{ + Painter: b.p, DivideCount: len(opt.XAxis.Data), Size: seriesPainter.Width(), }) diff --git a/chart_option.go b/chart_option.go index f3bf2cb..d4605a1 100644 --- a/chart_option.go +++ b/chart_option.go @@ -74,6 +74,8 @@ type ChartOption struct { FillArea bool // The child charts Children []ChartOption + // The value formatter + ValueFormatter ValueFormatter } // OptionFunc option function diff --git a/charts.go b/charts.go index c7923f1..b66437c 100644 --- a/charts.go +++ b/charts.go @@ -188,8 +188,9 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e } max, min := opt.SeriesList.GetMaxMin(index) r := NewRange(AxisRangeOption{ - Min: min, - Max: max, + Painter: p, + Min: min, + Max: max, // 高度需要减去x轴的高度 Size: rangeHeight, // 分隔数量 @@ -287,6 +288,9 @@ func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { opt.Parent = p } p := opt.Parent + if opt.ValueFormatter != nil { + p.valueFormatter = opt.ValueFormatter + } if !opt.Box.IsZero() { p = p.Child(PainterBoxOption(opt.Box)) } diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go index 97d5859..c1478a6 100644 --- a/examples/line_chart/main.go +++ b/examples/line_chart/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "io/ioutil" "os" "path/filepath" @@ -98,6 +99,9 @@ func main() { } opt.SymbolShow = charts.FalseFlag() opt.LineStrokeWidth = 1 + opt.ValueFormatter = func(f float64) string { + return fmt.Sprintf("%.0f", f) + } }, ) diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index 8ffac44..58c6e19 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -93,6 +93,7 @@ func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList Seri max, min := seriesList.GetMaxMin(0) xRange := NewRange(AxisRangeOption{ + Painter: p, Min: min, Max: max, DivideCount: defaultAxisDivideCount, diff --git a/mark_line_test.go b/mark_line_test.go index ef29e6f..00d19ef 100644 --- a/mark_line_test.go +++ b/mark_line_test.go @@ -55,6 +55,7 @@ func TestMarkLine(t *testing.T) { StrokeColor: drawing.ColorBlack, Series: series, Range: NewRange(AxisRangeOption{ + Painter: p, Min: 0, Max: 5, Size: p.Height(), diff --git a/painter.go b/painter.go index b7122b7..efd5045 100644 --- a/painter.go +++ b/painter.go @@ -31,6 +31,8 @@ import ( "github.com/wcharczuk/go-chart/v2" ) +type ValueFormatter func(float64) string + type Painter struct { render chart.Renderer box Box @@ -39,7 +41,8 @@ type Painter struct { style Style theme ColorPalette // 类型 - outputType string + outputType string + valueFormatter ValueFormatter } type PainterOptions struct { @@ -188,6 +191,9 @@ func (p *Painter) setOptions(opts ...PainterOption) { func (p *Painter) Child(opt ...PainterOption) *Painter { child := &Painter{ + // 格式化 + valueFormatter: p.valueFormatter, + // render render: p.render, box: p.box.Clone(), font: p.font, diff --git a/range.go b/range.go index ebd0b2d..51d3332 100644 --- a/range.go +++ b/range.go @@ -29,6 +29,7 @@ import ( const defaultAxisDivideCount = 6 type axisRange struct { + p *Painter divideCount int min float64 max float64 @@ -37,6 +38,7 @@ type axisRange struct { } type AxisRangeOption struct { + Painter *Painter // The min value of axis Min float64 // The max value of axis @@ -93,6 +95,7 @@ func NewRange(opt AxisRangeOption) axisRange { max = float64(ceilFloatToInt(expectMax)) } return axisRange{ + p: opt.Painter, divideCount: divideCount, min: min, max: max, @@ -105,9 +108,13 @@ func NewRange(opt AxisRangeOption) axisRange { func (r axisRange) Values() []string { offset := (r.max - r.min) / float64(r.divideCount) values := make([]string, 0) + formatter := commafWithDigits + if r.p != nil && r.p.valueFormatter != nil { + formatter = r.p.valueFormatter + } for i := 0; i <= r.divideCount; i++ { v := r.min + float64(i)*offset - value := commafWithDigits(v) + value := formatter(v) values = append(values, value) } return values From bdcc871ab194dcaeeae1d934cc088bcffdff5fd2 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 3 Nov 2022 21:31:53 +0800 Subject: [PATCH 207/251] fix: fix series render of horizontal bar, #31 --- axis.go | 15 ++++++++++----- charts.go | 10 +++++++++- examples/horizontal_bar_chart/main.go | 3 +++ yaxis.go | 3 +++ 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/axis.go b/axis.go index 3c0484c..578813c 100644 --- a/axis.go +++ b/axis.go @@ -75,6 +75,7 @@ type AxisOption struct { SplitLineShow bool // The color of split line SplitLineColor Color + Unit int } func (a *axisPainter) Render() (Box, error) { @@ -159,11 +160,15 @@ func (a *axisPainter) Render() (Box, error) { // 根据文本宽度计算较为符合的展示项 fitTextCount := ceilFloatToInt(float64(top.Width()) / textFillWidth) - unit := ceilFloatToInt(float64(dataCount) / float64(fitTextCount)) - unit = chart.MaxInt(unit, opt.SplitNumber) - // 偶数 - if unit%2 == 0 && dataCount%(unit+1) == 0 { - unit++ + unit := opt.Unit + if unit <= 0 { + + unit = ceilFloatToInt(float64(dataCount) / float64(fitTextCount)) + unit = chart.MaxInt(unit, opt.SplitNumber) + // 偶数 + if unit%2 == 0 && dataCount%(unit+1) == 0 { + unit++ + } } width := 0 diff --git a/charts.go b/charts.go index b66437c..d6745d3 100644 --- a/charts.go +++ b/charts.go @@ -186,6 +186,10 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e if len(opt.YAxisOptions) > index { yAxisOption = opt.YAxisOptions[index] } + divideCount := yAxisOption.DivideCount + if divideCount <= 0 { + divideCount = defaultAxisDivideCount + } max, min := opt.SeriesList.GetMaxMin(index) r := NewRange(AxisRangeOption{ Painter: p, @@ -194,7 +198,7 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e // 高度需要减去x轴的高度 Size: rangeHeight, // 分隔数量 - DivideCount: defaultAxisDivideCount, + DivideCount: divideCount, }) if yAxisOption.Min != nil && *yAxisOption.Min <= min { r.min = *yAxisOption.Min @@ -346,6 +350,10 @@ func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { }, } } + if len(horizontalBarSeriesList) != 0 { + renderOpt.YAxisOptions[0].DivideCount = len(renderOpt.YAxisOptions[0].Data) + renderOpt.YAxisOptions[0].Unit = 1 + } renderResult, err := defaultRender(p, renderOpt) if err != nil { diff --git a/examples/horizontal_bar_chart/main.go b/examples/horizontal_bar_chart/main.go index 8b996b6..a0f5bda 100644 --- a/examples/horizontal_bar_chart/main.go +++ b/examples/horizontal_bar_chart/main.go @@ -26,6 +26,7 @@ func writeFile(buf []byte) error { func main() { values := [][]float64{ { + 8203, 18203, 23489, 29034, @@ -34,6 +35,7 @@ func main() { 630230, }, { + 9325, 19325, 23438, 31000, @@ -56,6 +58,7 @@ func main() { "2012", }), charts.YAxisDataOptionFunc([]string{ + "UN", "Brazil", "Indonesia", "USA", diff --git a/yaxis.go b/yaxis.go index eb9034c..bece2cc 100644 --- a/yaxis.go +++ b/yaxis.go @@ -47,6 +47,8 @@ type YAxisOption struct { Color Color // The flag for show axis, set this to *false will hide axis Show *bool + DivideCount int + Unit int isCategoryAxis bool } @@ -87,6 +89,7 @@ func (opt *YAxisOption) ToAxisOption(p *Painter) AxisOption { SplitLineShow: true, SplitLineColor: theme.GetAxisSplitLineColor(), Show: opt.Show, + Unit: opt.Unit, } if !opt.Color.IsZero() { axisOpt.FontColor = opt.Color From 6f6d6c344730f48b5297bb9695a16f9ecc7874f1 Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 7 Nov 2022 20:34:28 +0800 Subject: [PATCH 208/251] fix: fix label render of pie chart, #34 --- pie_chart.go | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/pie_chart.go b/pie_chart.go index 0075ffc..b4714ac 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -101,8 +101,23 @@ func (p *pieChart) render(result *defaultRenderResult, seriesList SeriesList) (B theme := opt.Theme currentValue := float64(0) - prevEndX := 0 - prevEndY := 0 + prevPoints := make([]Point, 0) + + isOverride := func(x, y int) bool { + for _, p := range prevPoints { + if math.Abs(float64(p.Y-y)) > labelFontSize { + continue + } + // label可能较多内容,不好计算横向占用空间 + // 因此x的位置需要中间位置两侧,否则认为override + if (p.X <= cx && x <= cx) || + (p.X > cx && x > cx) { + return true + } + } + return false + } + for index, v := range values { seriesPainter.OverrideDrawingStyle(Style{ StrokeWidth: 1, @@ -134,13 +149,17 @@ func (p *pieChart) render(result *defaultRenderResult, seriesList SeriesList) (B endx := cx + int(labelRadius*math.Cos(angle)) endy := cy + int(labelRadius*math.Sin(angle)) // 计算是否有重叠,如果有则调整y坐标位置 - if index != 0 && - math.Abs(float64(endx-prevEndX)) < labelFontSize && - math.Abs(float64(endy-prevEndY)) < labelFontSize { + // 最多只尝试5次 + for i := 0; i < 5; i++ { + if !isOverride(endx, endy) { + break + } endy -= (labelFontSize << 1) } - prevEndX = endx - prevEndY = endy + prevPoints = append(prevPoints, Point{ + X: endx, + Y: endy, + }) seriesPainter.MoveTo(startx, starty) seriesPainter.LineTo(endx, endy) From 2ed86a81d018bcf9d0105bf217a9c424aa42bf5e Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Nov 2022 10:48:24 +0800 Subject: [PATCH 209/251] fix: fix setting font family for table render --- chart_option.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/chart_option.go b/chart_option.go index d4605a1..3c8ac4b 100644 --- a/chart_option.go +++ b/chart_option.go @@ -384,6 +384,9 @@ func TableOptionRender(opt TableChartOption) (*Painter, error) { if opt.Width <= 0 { opt.Width = defaultChartWidth } + if opt.FontFamily != "" { + opt.Font, _ = GetFont(opt.FontFamily) + } if opt.Font == nil { opt.Font, _ = chart.GetDefaultFont() } From de4250f60bfad7d22847b089bef62f2dce30091b Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Nov 2022 20:01:36 +0800 Subject: [PATCH 210/251] feat: support get and set default font --- chart_option.go | 5 ++--- font.go | 19 ++++++++++++++++++- mark_line.go | 3 +-- painter.go | 2 +- painter_test.go | 2 +- theme.go | 3 +-- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/chart_option.go b/chart_option.go index 3c8ac4b..ee6851f 100644 --- a/chart_option.go +++ b/chart_option.go @@ -26,7 +26,6 @@ import ( "sort" "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" ) type ChartOption struct { @@ -270,7 +269,7 @@ func (o *ChartOption) fillDefault() { o.font, _ = GetFont(o.FontFamily) if o.font == nil { - o.font, _ = chart.GetDefaultFont() + o.font, _ = GetDefaultFont() } else { // 如果指定了字体,则设置主题的字体 t.SetFont(o.font) @@ -388,7 +387,7 @@ func TableOptionRender(opt TableChartOption) (*Painter, error) { opt.Font, _ = GetFont(opt.FontFamily) } if opt.Font == nil { - opt.Font, _ = chart.GetDefaultFont() + opt.Font, _ = GetDefaultFont() } p, err := NewPainter(PainterOptions{ diff --git a/font.go b/font.go index c40b51e..dae5141 100644 --- a/font.go +++ b/font.go @@ -32,9 +32,13 @@ import ( var fonts = sync.Map{} var ErrFontNotExists = errors.New("font is not exists") +var defaultFontFamily = "defaultFontFamily" func init() { - _ = InstallFont("roboto", roboto.Roboto) + name := "roboto" + _ = InstallFont(name, roboto.Roboto) + font, _ := GetFont(name) + SetDefaultFont(font) } // InstallFont installs the font for charts @@ -47,6 +51,19 @@ func InstallFont(fontFamily string, data []byte) error { return nil } +// GetDefaultFont get default font +func GetDefaultFont() (*truetype.Font, error) { + return GetFont(defaultFontFamily) +} + +// SetDefaultFont set default font +func SetDefaultFont(font *truetype.Font) { + if font == nil { + return + } + fonts.Store(defaultFontFamily, font) +} + // GetFont get the font by font family func GetFont(fontFamily string) (*truetype.Font, error) { value, ok := fonts.Load(fontFamily) diff --git a/mark_line.go b/mark_line.go index af1062d..bc850bb 100644 --- a/mark_line.go +++ b/mark_line.go @@ -24,7 +24,6 @@ package charts import ( "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" ) // NewMarkLine returns a series mark line @@ -75,7 +74,7 @@ func (m *markLinePainter) Render() (Box, error) { } font := opt.Font if font == nil { - font, _ = chart.GetDefaultFont() + font, _ = GetDefaultFont() } summary := s.Summary() for _, markLine := range s.MarkLine.Data { diff --git a/painter.go b/painter.go index efd5045..97ad205 100644 --- a/painter.go +++ b/painter.go @@ -149,7 +149,7 @@ func NewPainter(opts PainterOptions, opt ...PainterOption) (*Painter, error) { } font := opts.Font if font == nil { - f, err := chart.GetDefaultFont() + f, err := GetDefaultFont() if err != nil { return nil, err } diff --git a/painter_test.go b/painter_test.go index 96e41ef..2392d5b 100644 --- a/painter_test.go +++ b/painter_test.go @@ -351,7 +351,7 @@ func TestPainterTextFit(t *testing.T) { Type: ChartOutputSVG, }) assert.Nil(err) - f, _ := chart.GetDefaultFont() + f, _ := GetDefaultFont() style := Style{ FontSize: 12, FontColor: chart.ColorBlack, diff --git a/theme.go b/theme.go index 8068687..17706ad 100644 --- a/theme.go +++ b/theme.go @@ -24,7 +24,6 @@ package charts import ( "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" ) @@ -311,7 +310,7 @@ func (t *themeColorPalette) GetFont() *truetype.Font { if t.font != nil { return t.font } - f, _ := chart.GetDefaultFont() + f, _ := GetDefaultFont() return f } From 7e1f003be85d09216e71a89337634bd38e4abed2 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 12 Nov 2022 20:18:02 +0800 Subject: [PATCH 211/251] refactor: update demo --- examples/chinese/main.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/chinese/main.go b/examples/chinese/main.go index 9068a08..d77216a 100644 --- a/examples/chinese/main.go +++ b/examples/chinese/main.go @@ -34,6 +34,8 @@ func main() { if err != nil { panic(err) } + font, _ := charts.GetFont("noto") + charts.SetDefaultFont(font) values := [][]float64{ { @@ -85,7 +87,6 @@ func main() { p, err := charts.LineRender( values, charts.TitleTextOptionFunc("测试"), - charts.FontFamilyOptionFunc("noto"), charts.XAxisDataOptionFunc([]string{ "星期一", "星期二", From a42d0727df41f5f788ae015c9472a5675bf27774 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 15 Nov 2022 20:09:29 +0800 Subject: [PATCH 212/251] feat: support text rotation --- painter.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/painter.go b/painter.go index 97ad205..6743b37 100644 --- a/painter.go +++ b/painter.go @@ -558,6 +558,12 @@ func (p *Painter) Text(body string, x, y int) *Painter { return p } +func (p *Painter) TextRotation(body string, x, y int, radians float64) { + p.render.SetTextRotation(radians) + p.render.Text(body, x, y) + p.render.ClearTextRotation() +} + func (p *Painter) TextFit(body string, x, y, width int, textAligns ...string) chart.Box { style := p.style textWarp := style.TextWrap From 55eca7b0b9331b660ea1f1c03fab3d803769e815 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 16 Nov 2022 20:46:19 +0800 Subject: [PATCH 213/251] feat: support detect color dark or light --- chart_option_test.go | 2 +- echarts_test.go | 2 +- mark_point.go | 12 +++++------- theme.go | 13 +++++++++++++ util.go | 7 +++++++ util_test.go | 32 ++++++++++++++++++++++++++++++++ 6 files changed, 59 insertions(+), 9 deletions(-) diff --git a/chart_option_test.go b/chart_option_test.go index 6f331b3..ff17750 100644 --- a/chart_option_test.go +++ b/chart_option_test.go @@ -277,7 +277,7 @@ func TestBarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nRainfallEvaporation24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporation24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) } func TestHorizontalBarRender(t *testing.T) { diff --git a/echarts_test.go b/echarts_test.go index 5c2dbad..2ce1715 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -578,5 +578,5 @@ func TestRenderEChartsToSVG(t *testing.T) { ] }`) assert.Nil(err) - assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) } diff --git a/mark_point.go b/mark_point.go index f6c93f3..fd8a88b 100644 --- a/mark_point.go +++ b/mark_point.go @@ -24,7 +24,6 @@ package charts import ( "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2/drawing" ) // NewMarkPoint returns a series mark point @@ -78,16 +77,15 @@ func (m *markPointPainter) Render() (Box, error) { symbolSize = 30 } textStyle := Style{ - FontColor: drawing.Color{ - R: 238, - G: 238, - B: 238, - A: 255, - }, FontSize: labelFontSize, StrokeWidth: 1, Font: opt.Font, } + if isLightColor(opt.FillColor) { + textStyle.FontColor = defaultLightFontColor + } else { + textStyle.FontColor = defaultDarkFontColor + } painter.OverrideDrawingStyle(Style{ FillColor: opt.FillColor, }).OverrideTextStyle(textStyle) diff --git a/theme.go b/theme.go index 17706ad..a6d624f 100644 --- a/theme.go +++ b/theme.go @@ -76,6 +76,19 @@ const defaultFontSize = 12.0 var defaultTheme ColorPalette +var defaultLightFontColor = drawing.Color{ + R: 70, + G: 70, + B: 70, + A: 255, +} +var defaultDarkFontColor = drawing.Color{ + R: 238, + G: 238, + B: 238, + A: 255, +} + func init() { echartSeriesColors := []Color{ parseColor("#5470c6"), diff --git a/util.go b/util.go index f8a451e..b333e6d 100644 --- a/util.go +++ b/util.go @@ -262,3 +262,10 @@ func getPolygonPoints(center Point, radius float64, sides int) []Point { } return points } + +func isLightColor(c Color) bool { + r := float64(c.R) * float64(c.R) * 0.299 + g := float64(c.G) * float64(c.G) * 0.587 + b := float64(c.B) * float64(c.B) * 0.114 + return math.Sqrt(r+g+b) > 127.5 +} diff --git a/util_test.go b/util_test.go index 7c2ab2f..62fd08d 100644 --- a/util_test.go +++ b/util_test.go @@ -189,3 +189,35 @@ func TestParseColor(t *testing.T) { A: 250, }, c) } + +func TestIsLightColor(t *testing.T) { + assert := assert.New(t) + + assert.True(isLightColor(drawing.Color{ + R: 255, + G: 255, + B: 255, + })) + assert.True(isLightColor(drawing.Color{ + R: 145, + G: 204, + B: 117, + })) + + assert.False(isLightColor(drawing.Color{ + R: 88, + G: 112, + B: 198, + })) + + assert.False(isLightColor(drawing.Color{ + R: 0, + G: 0, + B: 0, + })) + assert.False(isLightColor(drawing.Color{ + R: 16, + G: 12, + B: 42, + })) +} From 4fc250aefc0ec4e50099ca483b2a7a3f497b33a8 Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 22 Nov 2022 22:41:56 +0800 Subject: [PATCH 214/251] feat: support rotate series label --- bar_chart.go | 19 +++++++++++++++++- examples/charts/main.go | 4 ++++ painter.go | 9 ++++++++- series.go | 2 ++ series_label.go | 44 +++++++++++++++++++++++++++++++---------- 5 files changed, 66 insertions(+), 12 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index 19c1664..695b9fd 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -23,6 +23,8 @@ package charts import ( + "math" + "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" ) @@ -164,11 +166,26 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B if labelPainter == nil { continue } + y := barMaxHeight - h + radians := float64(0) + var fontColor Color + if series.Label.Position == PositionBottom { + y = barMaxHeight + radians = -math.Pi / 2 + if isLightColor(fillColor) { + fontColor = defaultLightFontColor + } else { + fontColor = defaultDarkFontColor + } + } labelPainter.Add(LabelValue{ Index: index, Value: item.Value, X: x + barWidth>>1, - Y: barMaxHeight - h, + Y: y, + // 旋转 + Radians: radians, + FontColor: fontColor, }) } diff --git a/examples/charts/main.go b/examples/charts/main.go index c3bb486..76aa42c 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -355,6 +355,10 @@ func indexHandler(w http.ResponseWriter, req *http.Request) { Value: 180, }, }, + Label: charts.SeriesLabel{ + Show: true, + Position: charts.PositionBottom, + }, }, }, }, diff --git a/painter.go b/painter.go index 6743b37..a0f81ed 100644 --- a/painter.go +++ b/painter.go @@ -560,7 +560,14 @@ func (p *Painter) Text(body string, x, y int) *Painter { func (p *Painter) TextRotation(body string, x, y int, radians float64) { p.render.SetTextRotation(radians) - p.render.Text(body, x, y) + p.render.Text(body, x+p.box.Left, y+p.box.Top) + p.render.ClearTextRotation() +} + +func (p *Painter) SetTextRotation(radians float64) { + p.render.SetTextRotation(radians) +} +func (p *Painter) ClearTextRotation() { p.render.ClearTextRotation() } diff --git a/series.go b/series.go index 7bd6834..373c7dc 100644 --- a/series.go +++ b/series.go @@ -79,6 +79,8 @@ type SeriesLabel struct { Show bool // Distance to the host graphic element. Distance int + // The position of label + Position string } const ( diff --git a/series_label.go b/series_label.go index 57bd1bf..f2dd40f 100644 --- a/series_label.go +++ b/series_label.go @@ -32,6 +32,8 @@ type labelRenderValue struct { Style Style X int Y int + // 旋转 + Radians float64 } type LabelValue struct { @@ -39,6 +41,10 @@ type LabelValue struct { Value float64 X int Y int + // 旋转 + Radians float64 + // 字体颜色 + FontColor Color } type SeriesLabelPainter struct { @@ -81,19 +87,33 @@ func (o *SeriesLabelPainter) Add(value LabelValue) { FontSize: labelFontSize, Font: o.font, } + if !value.FontColor.IsZero() { + label.Color = value.FontColor + } if !label.Color.IsZero() { labelStyle.FontColor = label.Color } - o.p.OverrideDrawingStyle(labelStyle) - textBox := o.p.MeasureText(text) - renderValue := labelRenderValue{ - Text: text, - Style: labelStyle, - X: value.X - textBox.Width()>>1, - Y: value.Y - distance, + p := o.p + p.OverrideDrawingStyle(labelStyle) + rotated := value.Radians != 0 + if rotated { + p.SetTextRotation(value.Radians) } - if textBox.Width()%2 != 0 { - renderValue.X++ + textBox := p.MeasureText(text) + renderValue := labelRenderValue{ + Text: text, + Style: labelStyle, + X: value.X - textBox.Width()>>1, + Y: value.Y - distance, + Radians: value.Radians, + } + if rotated { + renderValue.X = value.X + textBox.Width()>>1 - 1 + p.ClearTextRotation() + } else { + if textBox.Width()%2 != 0 { + renderValue.X++ + } } o.values = append(o.values, renderValue) } @@ -101,7 +121,11 @@ func (o *SeriesLabelPainter) Add(value LabelValue) { func (o *SeriesLabelPainter) Render() (Box, error) { for _, item := range o.values { o.p.OverrideTextStyle(item.Style) - o.p.Text(item.Text, item.X, item.Y) + if item.Radians != 0 { + o.p.TextRotation(item.Text, item.X, item.Y, item.Radians) + } else { + o.p.Text(item.Text, item.X, item.Y) + } } return chart.BoxZero, nil } From 6db8e2c8dc5f5ead957474fddb4af20787b82b95 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 23 Nov 2022 23:01:52 +0800 Subject: [PATCH 215/251] feat: support series label for horizontal bar --- bar_chart.go | 1 + horizontal_bar_chart.go | 41 +++++++++++++++++++++++++++++++++++++++++ series.go | 2 ++ series_label.go | 16 ++++++++++++++-- 4 files changed, 58 insertions(+), 2 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index 695b9fd..8219472 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -186,6 +186,7 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B // 旋转 Radians: radians, FontColor: fontColor, + Offset: series.Label.Offset, }) } diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index 58c6e19..5e433a6 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -99,11 +99,25 @@ func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList Seri DivideCount: defaultAxisDivideCount, Size: seriesPainter.Width(), }) + seriesNames := seriesList.Names() + rendererList := []Renderer{} for index := range seriesList { series := seriesList[index] seriesColor := theme.GetSeriesColor(series.index) divideValues := yRange.AutoDivide() + + var labelPainter *SeriesLabelPainter + if series.Label.Show { + labelPainter = NewSeriesLabelPainter(SeriesLabelPainterParams{ + P: seriesPainter, + SeriesNames: seriesNames, + Label: series.Label, + Theme: opt.Theme, + Font: opt.Font, + }) + rendererList = append(rendererList, labelPainter) + } for j, item := range series.Data { if j >= yRange.divideCount { continue @@ -130,8 +144,35 @@ func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList Seri Right: right, Bottom: y + barHeight, }) + // 如果label不需要展示,则返回 + if labelPainter == nil { + continue + } + x := right + var fontColor Color + if series.Label.Position == PositionLeft { + x = 0 + if isLightColor(fillColor) { + fontColor = defaultLightFontColor + } else { + fontColor = defaultDarkFontColor + } + } + labelPainter.Add(LabelValue{ + Orient: OrientHorizontal, + Index: index, + Value: item.Value, + X: x, + Y: y + barHeight>>1, + FontColor: fontColor, + Offset: series.Label.Offset, + }) } } + err := doRender(rendererList...) + if err != nil { + return BoxZero, err + } return p.box, nil } diff --git a/series.go b/series.go index 373c7dc..c36fa8b 100644 --- a/series.go +++ b/series.go @@ -81,6 +81,8 @@ type SeriesLabel struct { Distance int // The position of label Position string + // The offset of label's position + Offset Box } const ( diff --git a/series_label.go b/series_label.go index f2dd40f..f0fb2ec 100644 --- a/series_label.go +++ b/series_label.go @@ -45,6 +45,8 @@ type LabelValue struct { Radians float64 // 字体颜色 FontColor Color + Orient string + Offset Box } type SeriesLabelPainter struct { @@ -103,10 +105,18 @@ func (o *SeriesLabelPainter) Add(value LabelValue) { renderValue := labelRenderValue{ Text: text, Style: labelStyle, - X: value.X - textBox.Width()>>1, - Y: value.Y - distance, + X: value.X, + Y: value.Y, Radians: value.Radians, } + if value.Orient != OrientHorizontal { + renderValue.X -= textBox.Width() >> 1 + renderValue.Y -= distance + } else { + renderValue.X += distance + renderValue.Y += textBox.Height() >> 1 + renderValue.Y -= 2 + } if rotated { renderValue.X = value.X + textBox.Width()>>1 - 1 p.ClearTextRotation() @@ -115,6 +125,8 @@ func (o *SeriesLabelPainter) Add(value LabelValue) { renderValue.X++ } } + renderValue.X += value.Offset.Left + renderValue.Y += value.Offset.Top o.values = append(o.values, renderValue) } From 5f0aec60d3d3300316bd9d4d1ad58e357f7c4caf Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 24 Nov 2022 20:12:19 +0800 Subject: [PATCH 216/251] refactor: adjust label value of horizontal bar --- horizontal_bar_chart.go | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index 5e433a6..1340103 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -148,25 +148,23 @@ func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList Seri if labelPainter == nil { continue } - x := right - var fontColor Color + labelValue := LabelValue{ + Orient: OrientHorizontal, + Index: index, + Value: item.Value, + X: right, + Y: y + barHeight>>1, + Offset: series.Label.Offset, + } if series.Label.Position == PositionLeft { - x = 0 + labelValue.X = 0 if isLightColor(fillColor) { - fontColor = defaultLightFontColor + labelValue.FontColor = defaultLightFontColor } else { - fontColor = defaultDarkFontColor + labelValue.FontColor = defaultDarkFontColor } } - labelPainter.Add(LabelValue{ - Orient: OrientHorizontal, - Index: index, - Value: item.Value, - X: x, - Y: y + barHeight>>1, - FontColor: fontColor, - Offset: series.Label.Offset, - }) + labelPainter.Add(labelValue) } } err := doRender(rendererList...) From df6180e59aea0a7d3d45be72a9b49bb4a09df0c9 Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 28 Nov 2022 19:55:14 +0800 Subject: [PATCH 217/251] fix: fix zero max value of nan, #37 --- range.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/range.go b/range.go index 51d3332..ec64c2d 100644 --- a/range.go +++ b/range.go @@ -121,6 +121,9 @@ func (r axisRange) Values() []string { } func (r *axisRange) getHeight(value float64) int { + if r.max <= r.min { + return 0 + } v := (value - r.min) / (r.max - r.min) return int(v * float64(r.size)) } From f9a534ea02fe56f1c4ec79c73839664ba8cb51a6 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 7 Dec 2022 19:57:35 +0800 Subject: [PATCH 218/251] fix: fix the color of series label, #37 --- bar_chart.go | 12 +++++++----- horizontal_bar_chart.go | 23 +++++++++++++---------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index 8219472..d8a307e 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -168,14 +168,16 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B } y := barMaxHeight - h radians := float64(0) - var fontColor Color + fontColor := series.Label.Color if series.Label.Position == PositionBottom { y = barMaxHeight radians = -math.Pi / 2 - if isLightColor(fillColor) { - fontColor = defaultLightFontColor - } else { - fontColor = defaultDarkFontColor + if fontColor.IsZero() { + if isLightColor(fillColor) { + fontColor = defaultLightFontColor + } else { + fontColor = defaultDarkFontColor + } } } labelPainter.Add(LabelValue{ diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index 1340103..95d9a3d 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -149,19 +149,22 @@ func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList Seri continue } labelValue := LabelValue{ - Orient: OrientHorizontal, - Index: index, - Value: item.Value, - X: right, - Y: y + barHeight>>1, - Offset: series.Label.Offset, + Orient: OrientHorizontal, + Index: index, + Value: item.Value, + X: right, + Y: y + barHeight>>1, + Offset: series.Label.Offset, + FontColor: series.Label.Color, } if series.Label.Position == PositionLeft { labelValue.X = 0 - if isLightColor(fillColor) { - labelValue.FontColor = defaultLightFontColor - } else { - labelValue.FontColor = defaultDarkFontColor + if labelValue.FontColor.IsZero() { + if isLightColor(fillColor) { + labelValue.FontColor = defaultLightFontColor + } else { + labelValue.FontColor = defaultDarkFontColor + } } } labelPainter.Add(labelValue) From ef04ac14abcfe6380464fdc4b3d923448286e198 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 9 Dec 2022 20:08:02 +0800 Subject: [PATCH 219/251] feat: support font size for series label, #38 --- bar_chart.go | 1 + horizontal_bar_chart.go | 1 + line_chart.go | 2 ++ series.go | 2 ++ series_label.go | 9 +++++++-- 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index d8a307e..efeb465 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -189,6 +189,7 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B Radians: radians, FontColor: fontColor, Offset: series.Label.Offset, + FontSize: series.Label.FontSize, }) } diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index 95d9a3d..2ab4c03 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -156,6 +156,7 @@ func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList Seri Y: y + barHeight>>1, Offset: series.Label.Offset, FontColor: series.Label.Color, + FontSize: series.Label.FontSize, } if series.Label.Position == PositionLeft { labelValue.X = 0 diff --git a/line_chart.go b/line_chart.go index 26f94a4..9f350bd 100644 --- a/line_chart.go +++ b/line_chart.go @@ -147,6 +147,8 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( Value: item.Value, X: p.X, Y: p.Y, + // 字体大小 + FontSize: series.Label.FontSize, }) } // 如果需要填充区域 diff --git a/series.go b/series.go index c36fa8b..13c637e 100644 --- a/series.go +++ b/series.go @@ -83,6 +83,8 @@ type SeriesLabel struct { Position string // The offset of label's position Offset Box + // The font size of label + FontSize float64 } const ( diff --git a/series_label.go b/series_label.go index f0fb2ec..10fd148 100644 --- a/series_label.go +++ b/series_label.go @@ -45,8 +45,10 @@ type LabelValue struct { Radians float64 // 字体颜色 FontColor Color - Orient string - Offset Box + // 字体大小 + FontSize float64 + Orient string + Offset Box } type SeriesLabelPainter struct { @@ -89,6 +91,9 @@ func (o *SeriesLabelPainter) Add(value LabelValue) { FontSize: labelFontSize, Font: o.font, } + if value.FontSize != 0 { + labelStyle.FontSize = value.FontSize + } if !value.FontColor.IsZero() { label.Color = value.FontColor } From d5533447f565ed55b604a59d0578375c61d496cd Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 11 Dec 2022 14:57:05 +0800 Subject: [PATCH 220/251] feat: support text rotation for series label, #38 --- axis.go | 26 ++++++++++++++++++++------ painter.go | 9 +++++++++ xaxis.go | 8 +++++++- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/axis.go b/axis.go index 578813c..3f71451 100644 --- a/axis.go +++ b/axis.go @@ -75,7 +75,11 @@ type AxisOption struct { SplitLineShow bool // The color of split line SplitLineColor Color - Unit int + // The text rotation of label + TextRotation float64 + // The offset of label + LabelOffset Box + Unit int } func (a *axisPainter) Render() (Box, error) { @@ -153,7 +157,15 @@ func (a *axisPainter) Render() (Box, error) { } top.SetDrawingStyle(style).OverrideTextStyle(style) + isTextRotation := opt.TextRotation != 0 + + if isTextRotation { + top.SetTextRotation(opt.TextRotation) + } textMaxWidth, textMaxHeight := top.MeasureTextMaxWidthHeight(data) + if isTextRotation { + top.ClearTextRotation() + } // 增加30px来计算文本展示区域 textFillWidth := float64(textMaxWidth + 20) @@ -261,11 +273,13 @@ func (a *axisPainter) Render() (Box, error) { Top: labelPaddingTop, Right: labelPaddingRight, })).MultiText(MultiTextOption{ - Align: textAlign, - TextList: data, - Orient: orient, - Unit: unit, - Position: labelPosition, + Align: textAlign, + TextList: data, + Orient: orient, + Unit: unit, + Position: labelPosition, + TextRotation: opt.TextRotation, + Offset: opt.LabelOffset, }) // 显示辅助线 if opt.SplitLineShow { diff --git a/painter.go b/painter.go index a0f81ed..71d205f 100644 --- a/painter.go +++ b/painter.go @@ -71,6 +71,9 @@ type MultiTextOption struct { Unit int Position string Align string + // The text rotation of label + TextRotation float64 + Offset Box } type GridOption struct { @@ -682,10 +685,13 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { } else { values = autoDivide(width, count) } + offset := opt.Offset for index, text := range opt.TextList { if opt.Unit != 0 && index%opt.Unit != showIndex { continue } + p.ClearTextRotation() + p.SetTextRotation(opt.TextRotation) box := p.MeasureText(text) start := values[index] if positionCenter { @@ -706,8 +712,11 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { } else { x = start - box.Width()>>1 } + x += offset.Left + y += offset.Top p.Text(text, x, y) } + p.ClearTextRotation() return p } diff --git a/xaxis.go b/xaxis.go index 00636a5..95578ff 100644 --- a/xaxis.go +++ b/xaxis.go @@ -47,7 +47,11 @@ type XAxisOption struct { // The line color of axis StrokeColor Color // The color of label - FontColor Color + FontColor Color + // The text rotation of label + TextRotation float64 + // The offset of label + LabelOffset Box isValueAxis bool } @@ -81,6 +85,8 @@ func (opt *XAxisOption) ToAxisOption() AxisOption { FontColor: opt.FontColor, Show: opt.Show, SplitLineColor: opt.Theme.GetAxisSplitLineColor(), + TextRotation: opt.TextRotation, + LabelOffset: opt.LabelOffset, } if opt.isValueAxis { axisOpt.SplitLineShow = true From 830d4bdd21201985bba34404086e7fbdcf8134fd Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 11 Dec 2022 14:59:37 +0800 Subject: [PATCH 221/251] fix: fix test for text roration --- painter.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/painter.go b/painter.go index 71d205f..8f43940 100644 --- a/painter.go +++ b/painter.go @@ -685,13 +685,16 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { } else { values = autoDivide(width, count) } + isTextRotation := opt.TextRotation != 0 offset := opt.Offset for index, text := range opt.TextList { if opt.Unit != 0 && index%opt.Unit != showIndex { continue } - p.ClearTextRotation() - p.SetTextRotation(opt.TextRotation) + if isTextRotation { + p.ClearTextRotation() + p.SetTextRotation(opt.TextRotation) + } box := p.MeasureText(text) start := values[index] if positionCenter { @@ -716,7 +719,9 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { y += offset.Top p.Text(text, x, y) } - p.ClearTextRotation() + if isTextRotation { + p.ClearTextRotation() + } return p } From a767b3e1af4fc0a275b97a68483292ae53445a54 Mon Sep 17 00:00:00 2001 From: Thomas Knierim Date: Mon, 26 Dec 2022 15:06:53 +0700 Subject: [PATCH 222/251] added option for line chart bg fill opacity --- chart_option.go | 2 ++ charts.go | 1 + line_chart.go | 8 +++++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/chart_option.go b/chart_option.go index ee6851f..5311d50 100644 --- a/chart_option.go +++ b/chart_option.go @@ -71,6 +71,8 @@ type ChartOption struct { BarHeight int // Fill the area of line chart FillArea bool + // background fill (alpha) opacity + Opacity uint8 // The child charts Children []ChartOption // The value formatter diff --git a/charts.go b/charts.go index d6745d3..8613050 100644 --- a/charts.go +++ b/charts.go @@ -409,6 +409,7 @@ func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { SymbolShow: opt.SymbolShow, StrokeWidth: opt.LineStrokeWidth, FillArea: opt.FillArea, + Opacity: opt.Opacity, }).render(renderResult, lineSeriesList) return err }) diff --git a/line_chart.go b/line_chart.go index 9f350bd..bdbd38e 100644 --- a/line_chart.go +++ b/line_chart.go @@ -70,6 +70,8 @@ type LineChartOption struct { FillArea bool // background is filled backgroundIsFilled bool + // background fill (alpha) opacity + Opacity uint8 } func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { @@ -156,6 +158,10 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( areaPoints := make([]Point, len(points)) copy(areaPoints, points) bottomY := yRange.getRestHeight(yRange.min) + var opacity uint8 = 200 + if opt.Opacity != 0 { + opacity = opt.Opacity + } areaPoints = append(areaPoints, Point{ X: areaPoints[len(areaPoints)-1].X, Y: bottomY, @@ -164,7 +170,7 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( Y: bottomY, }, areaPoints[0]) seriesPainter.SetDrawingStyle(Style{ - FillColor: seriesColor.WithAlpha(200), + FillColor: seriesColor.WithAlpha(opacity), }) seriesPainter.FillArea(areaPoints) } From e10175594b517f9a12217478b440faecc8d3c455 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 5 Jan 2023 19:15:58 +0800 Subject: [PATCH 223/251] feat: support label format for funnel chart, #41 --- funnel_chart.go | 8 +++----- series.go | 8 ++++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/funnel_chart.go b/funnel_chart.go index 719853a..300b539 100644 --- a/funnel_chart.go +++ b/funnel_chart.go @@ -23,9 +23,6 @@ package charts import ( - "fmt" - - "github.com/dustin/go-humanize" "github.com/golang/freetype/truetype" ) @@ -95,13 +92,14 @@ func (f *funnelChart) render(result *defaultRenderResult, seriesList SeriesList) y := 0 widthList := make([]int, len(seriesList)) textList := make([]string, len(seriesList)) + seriesNames := seriesList.Names() for index, item := range seriesList { value := item.Data[0].Value widthPercent := (value - min) / (max - min) w := int(widthPercent * float64(width)) widthList[index] = w - p := humanize.CommafWithDigits(value/max*100, 2) + "%" - textList[index] = fmt.Sprintf("%s(%s)", item.Name, p) + percent := value / max + textList[index] = NewFunnelLabelFormatter(seriesNames, item.Label.Formatter)(index, value, percent) } for index, w := range widthList { diff --git a/series.go b/series.go index 13c637e..f28bfa9 100644 --- a/series.go +++ b/series.go @@ -279,6 +279,14 @@ func NewPieLabelFormatter(seriesNames []string, layout string) LabelFormatter { return NewLabelFormatter(seriesNames, layout) } +// NewFunnelLabelFormatter returns a funner label formatter +func NewFunnelLabelFormatter(seriesNames []string, layout string) LabelFormatter { + if len(layout) == 0 { + layout = "{b}({d})" + } + return NewLabelFormatter(seriesNames, layout) +} + // NewValueLabelFormatter returns a value formatter func NewValueLabelFormatter(seriesNames []string, layout string) LabelFormatter { if len(layout) == 0 { From 8ba9e2e1b207e0ead3826ba28b3bbd15304651e8 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 11 Jan 2023 20:41:16 +0800 Subject: [PATCH 224/251] fix: fix x axis label of horizontal bar chart, #42 --- charts.go | 11 ++++++++++- examples/horizontal_bar_chart/main.go | 28 +++++++++++++-------------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/charts.go b/charts.go index 8613050..74db733 100644 --- a/charts.go +++ b/charts.go @@ -215,7 +215,16 @@ func defaultRender(p *Painter, opt defaultRenderOption) (*defaultRenderResult, e yAxisOption.Data = r.Values() } else { yAxisOption.isCategoryAxis = true - opt.XAxis.Data = r.Values() + // 由于x轴为value部分,因此计算其label单独处理 + opt.XAxis.Data = NewRange(AxisRangeOption{ + Painter: p, + Min: min, + Max: max, + // 高度需要减去x轴的高度 + Size: rangeHeight, + // 分隔数量 + DivideCount: defaultAxisDivideCount, + }).Values() opt.XAxis.isValueAxis = true } reverseStringSlice(yAxisOption.Data) diff --git a/examples/horizontal_bar_chart/main.go b/examples/horizontal_bar_chart/main.go index a0f5bda..a1c50a7 100644 --- a/examples/horizontal_bar_chart/main.go +++ b/examples/horizontal_bar_chart/main.go @@ -26,22 +26,22 @@ func writeFile(buf []byte) error { func main() { values := [][]float64{ { - 8203, - 18203, - 23489, - 29034, - 104970, - 131744, - 630230, + 10, + 30, + 50, + 70, + 90, + 110, + 130, }, { - 9325, - 19325, - 23438, - 31000, - 121594, - 134141, - 681807, + 20, + 40, + 60, + 80, + 100, + 120, + 140, }, } p, err := charts.HorizontalBarRender( From d3f7a773afc152f3be5b6237baa23bd2f40177db Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 12 Jan 2023 20:20:36 +0800 Subject: [PATCH 225/251] fix: fix zero value of funnel chart, #43 --- examples/funnel_chart/main.go | 4 ++++ funnel_chart.go | 13 +++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/examples/funnel_chart/main.go b/examples/funnel_chart/main.go index 8f21db6..24f8afe 100644 --- a/examples/funnel_chart/main.go +++ b/examples/funnel_chart/main.go @@ -30,6 +30,8 @@ func main() { 60, 40, 20, + 10, + 0, } p, err := charts.FunnelRender( values, @@ -40,6 +42,8 @@ func main() { "Visit", "Inquiry", "Order", + "Pay", + "Cancel", }), ) if err != nil { diff --git a/funnel_chart.go b/funnel_chart.go index 300b539..d4a8bdd 100644 --- a/funnel_chart.go +++ b/funnel_chart.go @@ -93,12 +93,21 @@ func (f *funnelChart) render(result *defaultRenderResult, seriesList SeriesList) widthList := make([]int, len(seriesList)) textList := make([]string, len(seriesList)) seriesNames := seriesList.Names() + offset := max - min for index, item := range seriesList { value := item.Data[0].Value - widthPercent := (value - min) / (max - min) + // 最大最小值一致则为100% + widthPercent := 100.0 + if offset != 0 { + widthPercent = (value - min) / offset + } w := int(widthPercent * float64(width)) widthList[index] = w - percent := value / max + // 如果最大值为0,则占比100% + percent := 1.0 + if max != 0 { + percent = value / max + } textList[index] = NewFunnelLabelFormatter(seriesNames, item.Label.Formatter)(index, value, percent) } From 29a5ece5458638b95f3d85218f96be56abdadb0d Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 14 Feb 2023 20:35:54 +0800 Subject: [PATCH 226/251] chore: update go modules --- .github/workflows/test.yml | 1 + go.mod | 6 +++--- go.sum | 13 ++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 61449a3..f591a3a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,6 +14,7 @@ jobs: strategy: matrix: go: + - '1.20' - '1.19' - '1.18' - '1.17' diff --git a/go.mod b/go.mod index de0bb9c..e265627 100644 --- a/go.mod +++ b/go.mod @@ -3,15 +3,15 @@ module github.com/vicanso/go-charts/v2 go 1.17 require ( - github.com/dustin/go-humanize v1.0.0 + github.com/dustin/go-humanize v1.0.1 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 - github.com/stretchr/testify v1.8.0 + github.com/stretchr/testify v1.8.1 github.com/wcharczuk/go-chart/v2 v2.1.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 // indirect + golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index e0b1547..ef2a000 100644 --- a/go.sum +++ b/go.sum @@ -1,25 +1,24 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY= -golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 20e8d4a078b7b17d373aea3a75e95d4119b5c12f Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Feb 2023 14:04:30 +0800 Subject: [PATCH 227/251] feat: support to set the first axis --- axis.go | 4 ++ examples/time_line_chart/main.go | 82 ++++++++++++++++++++++++++++++++ painter.go | 15 +++++- xaxis.go | 3 ++ 4 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 examples/time_line_chart/main.go diff --git a/axis.go b/axis.go index 3f71451..762a6a2 100644 --- a/axis.go +++ b/axis.go @@ -63,6 +63,8 @@ type AxisOption struct { StrokeWidth float64 // The length of the axis tick TickLength int + // The first axis + FirstAxis int // The margin value of label LabelMargin int // The font size of label @@ -255,6 +257,7 @@ func (a *axisPainter) Render() (Box, error) { Length: tickLength, Unit: unit, Orient: orient, + First: opt.FirstAxis, }) p.LineStroke([]Point{ { @@ -273,6 +276,7 @@ func (a *axisPainter) Render() (Box, error) { Top: labelPaddingTop, Right: labelPaddingRight, })).MultiText(MultiTextOption{ + First: opt.FirstAxis, Align: textAlign, TextList: data, Orient: orient, diff --git a/examples/time_line_chart/main.go b/examples/time_line_chart/main.go new file mode 100644 index 0000000..10932cd --- /dev/null +++ b/examples/time_line_chart/main.go @@ -0,0 +1,82 @@ +package main + +import ( + "crypto/rand" + "fmt" + "io/ioutil" + "math/big" + "os" + "path/filepath" + "time" + + "github.com/vicanso/go-charts/v2" +) + +func writeFile(buf []byte) error { + tmpPath := "./tmp" + err := os.MkdirAll(tmpPath, 0700) + if err != nil { + return err + } + + file := filepath.Join(tmpPath, "time-line-chart.png") + err = ioutil.WriteFile(file, buf, 0600) + if err != nil { + return err + } + return nil +} + +func main() { + xAxisValue := []string{} + values := []float64{} + now := time.Now() + firstAxis := 0 + for i := 0; i < 300; i++ { + // 设置首个axis为xx:00的时间点 + if firstAxis == 0 && now.Minute() == 0 { + firstAxis = i + } + xAxisValue = append(xAxisValue, now.Format("15:04")) + now = now.Add(time.Minute) + value, _ := rand.Int(rand.Reader, big.NewInt(100)) + values = append(values, float64(value.Int64())) + } + p, err := charts.LineRender( + [][]float64{ + values, + }, + charts.TitleTextOptionFunc("Line"), + charts.XAxisDataOptionFunc(xAxisValue, charts.FalseFlag()), + charts.LegendLabelsOptionFunc([]string{ + "Demo", + }, "50"), + func(opt *charts.ChartOption) { + opt.XAxis.FirstAxis = firstAxis + // 必须要比计算得来的最小值更大(每60分钟) + opt.XAxis.SplitNumber = 60 + opt.Legend.Padding = charts.Box{ + Top: 5, + Bottom: 10, + } + opt.SymbolShow = charts.FalseFlag() + opt.LineStrokeWidth = 1 + opt.ValueFormatter = func(f float64) string { + return fmt.Sprintf("%.0f", f) + } + }, + ) + + if err != nil { + panic(err) + } + + buf, err := p.Bytes() + if err != nil { + panic(err) + } + err = writeFile(buf) + if err != nil { + panic(err) + } +} diff --git a/painter.go b/painter.go index 8f43940..18496fd 100644 --- a/painter.go +++ b/painter.go @@ -59,6 +59,8 @@ type PainterOptions struct { type PainterOption func(*Painter) type TicksOption struct { + // the first tick + First int Length int Orient string Count int @@ -74,6 +76,8 @@ type MultiTextOption struct { // The text rotation of label TextRotation float64 Offset Box + // The first text index + First int } type GridOption struct { @@ -616,6 +620,7 @@ func (p *Painter) Ticks(opt TicksOption) *Painter { return p } count := opt.Count + first := opt.First width := p.Width() height := p.Height() unit := 1 @@ -630,7 +635,10 @@ func (p *Painter) Ticks(opt TicksOption) *Painter { values = autoDivide(width, count) } for index, value := range values { - if index%unit != 0 { + if index < first { + continue + } + if (index-first)%unit != 0 { continue } if isVertical { @@ -688,7 +696,10 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { isTextRotation := opt.TextRotation != 0 offset := opt.Offset for index, text := range opt.TextList { - if opt.Unit != 0 && index%opt.Unit != showIndex { + if index < opt.First { + continue + } + if opt.Unit != 0 && (index-opt.First)%opt.Unit != showIndex { continue } if isTextRotation { diff --git a/xaxis.go b/xaxis.go index 95578ff..61698d7 100644 --- a/xaxis.go +++ b/xaxis.go @@ -50,6 +50,8 @@ type XAxisOption struct { FontColor Color // The text rotation of label TextRotation float64 + // The first axis + FirstAxis int // The offset of label LabelOffset Box isValueAxis bool @@ -87,6 +89,7 @@ func (opt *XAxisOption) ToAxisOption() AxisOption { SplitLineColor: opt.Theme.GetAxisSplitLineColor(), TextRotation: opt.TextRotation, LabelOffset: opt.LabelOffset, + FirstAxis: opt.FirstAxis, } if opt.isValueAxis { axisOpt.SplitLineShow = true From fa4874d16b27d1bb89448b3defc1050bfd490621 Mon Sep 17 00:00:00 2001 From: vicanso Date: Mon, 13 Mar 2023 20:13:12 +0800 Subject: [PATCH 228/251] chore: update go modules --- .github/workflows/build.yml | 1 + Dockerfile | 2 +- go.mod | 14 +++++++------- go.sum | 33 +++++++++++++++++---------------- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 890e4ea..d620e62 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -29,6 +29,7 @@ jobs: id: docker_build uses: docker/build-push-action@v2 with: + platforms: linux/amd64, linux/arm64 push: true tags: ${{ secrets.DOCKER_HUB_USERNAME }}/go-charts - name: Image digest diff --git a/Dockerfile b/Dockerfile index d7baa6a..3fdd253 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -FROM golang:1.17-alpine as builder +FROM golang:1.19-alpine as builder ADD ./ /go-charts diff --git a/go.mod b/go.mod index dd501e5..60f8934 100644 --- a/go.mod +++ b/go.mod @@ -1,22 +1,22 @@ module github.com/vicanso/go-charts-web -go 1.18 +go 1.19 require ( - github.com/vicanso/elton v1.9.5 - github.com/vicanso/go-charts/v2 v2.3.0 + github.com/vicanso/elton v1.10.0 + github.com/vicanso/go-charts/v2 v2.6.0 ) require ( github.com/andybalholm/brotli v1.0.4 // indirect - github.com/dustin/go-humanize v1.0.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/tidwall/gjson v1.14.3 // indirect + github.com/tidwall/gjson v1.14.4 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect - github.com/vicanso/hes v0.6.0 // indirect + github.com/vicanso/hes v0.6.1 // indirect github.com/vicanso/intranet-ip v0.1.0 // indirect github.com/vicanso/keygrip v1.2.1 // indirect github.com/wcharczuk/go-chart/v2 v2.1.0 // indirect - golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 // indirect + golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect ) diff --git a/go.sum b/go.sum index d13d097..fba9022 100644 --- a/go.sum +++ b/go.sum @@ -3,42 +3,43 @@ github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= -github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= +github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/vicanso/elton v1.9.5 h1:vWCota4myz2BXT40RqbxMZlSTTvxiSPR06rJ/VWXEqQ= -github.com/vicanso/elton v1.9.5/go.mod h1:KIEn5zohLKfKo3d/Rlww5j2/jbOXDdNlO/UTwxrc+wk= -github.com/vicanso/go-charts/v2 v2.3.0 h1:+YbtMsPdhrhbdiPzyLx6OVnHbhIbl4aEmmfaQlufNp8= -github.com/vicanso/go-charts/v2 v2.3.0/go.mod h1:j9h9EbZk5t2sXk9rhw4pXxrzy5G/LncABf2hXWOE3WU= -github.com/vicanso/hes v0.6.0 h1:rmLhJw1PkZ+BTlJXt91i12mr7vpIC65S5KRCD4uF9HU= -github.com/vicanso/hes v0.6.0/go.mod h1:bO1pAVgzuwBJAv76LXx8YN6jXLWcCYVyNx4qzPw9h6Y= +github.com/vicanso/elton v1.10.0 h1:Qd6Dr5sarzkij+Vdgvtsd08jaNAKuZpBDpyPtKzESaY= +github.com/vicanso/elton v1.10.0/go.mod h1:GnFxH3+Vtz0HQbhGhCmssbdi67+yLjFOUbZDdB8mRcQ= +github.com/vicanso/go-charts/v2 v2.6.0 h1:nDaJuIr4pc1leQVjwmSXIMSmRvrTr5hUwZaxG3GExKI= +github.com/vicanso/go-charts/v2 v2.6.0/go.mod h1:aEuuwzCT+p/Pd8YnAPMEV+sMKjpKK6anH1u6CxiboIw= +github.com/vicanso/hes v0.6.1 h1:BRGUDhV2sJYMieJf4dgxFXjvuhDgUWBsINELcti0Z8M= +github.com/vicanso/hes v0.6.1/go.mod h1:awwBbvcDTk8APxRmiV7Hxrir89/iCxgB6RMeLc5toh0= github.com/vicanso/intranet-ip v0.1.0 h1:UeoxilO2VDIkeZZxmu6aT+f5o79mfGdsSdwoEv75nYo= github.com/vicanso/intranet-ip v0.1.0/go.mod h1:N1yrHdDYWNsOs5V374DuAJHba+d2dxUDcjVALgIlfOg= github.com/vicanso/keygrip v1.2.1 h1:876fXDwGJqxdi4JxZ1lNGBxYswyLZotrs7AA2QWcLeY= github.com/vicanso/keygrip v1.2.1/go.mod h1:tfB5az1yqold78zotkzNugk3sV+QW5m71CFz3zg9eeo= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY= -golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20220512140231-539c8e751b99/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From e7a49c2c212d022df6cda4739b8c3e391fd3594a Mon Sep 17 00:00:00 2001 From: Mike Jensen Date: Thu, 4 May 2023 12:52:28 -0600 Subject: [PATCH 229/251] Improvements to how the X Axis is rendered This provides two improvements to how the X Axis is rendered: * The calculation for where a tick should exist has been improved. It now will ensure a tick is always at both the start of the axis and the end of the axis. This makes it clear exactly what data span is captured in the graph. * The second improvement is how the label on the last tick is written. It used to often get partially cut off, and with the change to ensure a tick is always at the end this could be seen more easily. Now the last tick has it's label written to the left so that it can be fully displayed. --- painter.go | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/painter.go b/painter.go index 18496fd..450afdf 100644 --- a/painter.go +++ b/painter.go @@ -615,6 +615,17 @@ func (p *Painter) TextFit(body string, x, y, width int, textAligns ...string) ch return output } +func isTick(totalRange int, numTicks int, index int) bool { + step := float64(totalRange-1) / float64(numTicks-1) + for i := 0; i < numTicks; i++ { + value := float64(i) * step + if int(value + 0.5) == index { + return true + } + } + return false +} + func (p *Painter) Ticks(opt TicksOption) *Painter { if opt.Count <= 0 || opt.Length <= 0 { return p @@ -638,7 +649,7 @@ func (p *Painter) Ticks(opt TicksOption) *Painter { if index < first { continue } - if (index-first)%unit != 0 { + if ! isTick(len(values), unit, index) { continue } if isVertical { @@ -674,15 +685,13 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { } count := len(opt.TextList) positionCenter := true - showIndex := opt.Unit / 2 + tickLimit := true if containsString([]string{ PositionLeft, PositionTop, }, opt.Position) { positionCenter = false count-- - // 非居中 - showIndex = 0 } width := p.Width() height := p.Height() @@ -690,6 +699,7 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { isVertical := opt.Orient == OrientVertical if isVertical { values = autoDivide(height, count) + tickLimit = false } else { values = autoDivide(width, count) } @@ -699,7 +709,7 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { if index < opt.First { continue } - if opt.Unit != 0 && (index-opt.First)%opt.Unit != showIndex { + if opt.Unit != 0 && tickLimit && ! isTick(len(opt.TextList)-opt.First, opt.Unit, index-opt.First) { continue } if isTextRotation { @@ -724,7 +734,11 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { x = 0 } } else { - x = start - box.Width()>>1 + if index == len(opt.TextList) - 1 { + x = start - box.Width() + } else { + x = start - box.Width()>>1 + } } x += offset.Left y += offset.Top @@ -749,7 +763,6 @@ func (p *Painter) Grid(opt GridOption) *Painter { x1 := 0 y1 := 0 if isVertical { - x0 = v x1 = v y1 = height From 19173dfd37f737b4a5a681556b0a7fe661d749db Mon Sep 17 00:00:00 2001 From: Mike Jensen Date: Thu, 4 May 2023 17:59:11 -0600 Subject: [PATCH 230/251] painter.go: Optimize isTick function This reduces the loop frequency to one or two iterations in all cases. I have been unable to find any single line equation that can produce this same behavior, but one likely exists. --- painter.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/painter.go b/painter.go index 450afdf..175b2f2 100644 --- a/painter.go +++ b/painter.go @@ -617,10 +617,12 @@ func (p *Painter) TextFit(body string, x, y, width int, textAligns ...string) ch func isTick(totalRange int, numTicks int, index int) bool { step := float64(totalRange-1) / float64(numTicks-1) - for i := 0; i < numTicks; i++ { - value := float64(i) * step - if int(value + 0.5) == index { + for i := int(float64(index) / step); i < numTicks; i++ { + value := int((float64(i) * step) + 0.5) + if value == index { return true + } else if value > index { + break } } return false From c810369730585ed5692c3e5e13c36a4c785568c1 Mon Sep 17 00:00:00 2001 From: Mike Jensen Date: Fri, 5 May 2023 09:44:09 -0600 Subject: [PATCH 231/251] Change ticks to avoid values impacting each other The recently introduced logic has an incorrect understanding of the `unit` parameter. This would result in too many ticks being outputted, particularly as datasets got larger. This fixes it by re-calculating the tick count using the `unit` param as originally intended. --- painter.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/painter.go b/painter.go index 175b2f2..d74b80d 100644 --- a/painter.go +++ b/painter.go @@ -615,7 +615,8 @@ func (p *Painter) TextFit(body string, x, y, width int, textAligns ...string) ch return output } -func isTick(totalRange int, numTicks int, index int) bool { +func isTick(totalRange int, unit int, index int) bool { + numTicks := (totalRange / unit) + 1 step := float64(totalRange-1) / float64(numTicks-1) for i := int(float64(index) / step); i < numTicks; i++ { value := int((float64(i) * step) + 0.5) @@ -737,7 +738,7 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { } } else { if index == len(opt.TextList) - 1 { - x = start - box.Width() + x = start - box.Width() + 10 } else { x = start - box.Width()>>1 } From a158191faf90eb0baa08d2cbe8692afd5b09b58c Mon Sep 17 00:00:00 2001 From: Mike Jensen Date: Fri, 5 May 2023 09:55:55 -0600 Subject: [PATCH 232/251] Add `Unit` to XAxis as a publicly visible parameter In some cases the XAxis may have a single long title. This can result in very few increments being shown. In order to be more flexible for those cases this allows the XAxis Tick frequency to be able to be directly controlled. --- axis.go | 1 - xaxis.go | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/axis.go b/axis.go index 762a6a2..af104a8 100644 --- a/axis.go +++ b/axis.go @@ -176,7 +176,6 @@ func (a *axisPainter) Render() (Box, error) { unit := opt.Unit if unit <= 0 { - unit = ceilFloatToInt(float64(dataCount) / float64(fitTextCount)) unit = chart.MaxInt(unit, opt.SplitNumber) // 偶数 diff --git a/xaxis.go b/xaxis.go index 61698d7..5557015 100644 --- a/xaxis.go +++ b/xaxis.go @@ -40,7 +40,7 @@ type XAxisOption struct { FontSize float64 // The flag for show axis, set this to *false will hide axis Show *bool - // Number of segments that the axis is split into. Note that this number serves only as a recommendation. + // Number of segments that the axis is split into. Note that this number serves only as a recommendation to avoid writing overlap. SplitNumber int // The position of axis, it can be 'top' or 'bottom' Position string @@ -55,6 +55,8 @@ type XAxisOption struct { // The offset of label LabelOffset Box isValueAxis bool + // This value overrides SplitNumber, specifying directly the frequency at which the axis is split into, higher numbers result in less ticks + Unit int } const defaultXAxisHeight = 30 @@ -90,6 +92,7 @@ func (opt *XAxisOption) ToAxisOption() AxisOption { TextRotation: opt.TextRotation, LabelOffset: opt.LabelOffset, FirstAxis: opt.FirstAxis, + Unit: opt.Unit, } if opt.isValueAxis { axisOpt.SplitLineShow = true From 687baad0af8ff907e1e317f2671e3d76b91746c1 Mon Sep 17 00:00:00 2001 From: Mike Jensen Date: Fri, 5 May 2023 10:19:01 -0600 Subject: [PATCH 233/251] Unit test fixes Unit tests updated for new tick positions and in a couple cases additional one X axis sample. --- axis_test.go | 6 +++--- bar_chart_test.go | 2 +- chart_option_test.go | 6 +++--- echarts_test.go | 2 +- horizontal_bar_chart_test.go | 2 +- line_chart_test.go | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/axis_test.go b/axis_test.go index d0cff41..a04024d 100644 --- a/axis_test.go +++ b/axis_test.go @@ -53,7 +53,7 @@ func TestAxis(t *testing.T) { }).Render() return p.Bytes() }, - result: "\\nMonTueWedThuFriSatSun", + result: "\\nMonTueWedThuFriSatSun", }, // 底部x轴文本居左 { @@ -72,7 +72,7 @@ func TestAxis(t *testing.T) { }).Render() return p.Bytes() }, - result: "\\nMonTueWedThuFriSatSun", + result: "\\nMonTueWedThuFriSatSun", }, // 左侧y轴 { @@ -155,7 +155,7 @@ func TestAxis(t *testing.T) { }).Render() return p.Bytes() }, - result: "\\nMon --Tue --Wed --Thu --Fri --Sat --Sun --", + result: "\\nMon --Tue --Wed --Thu --Fri --Sat --Sun --", }, } diff --git a/bar_chart_test.go b/bar_chart_test.go index e1522d6..aec6428 100644 --- a/bar_chart_test.go +++ b/bar_chart_test.go @@ -102,7 +102,7 @@ func TestBarChart(t *testing.T) { } return p.Bytes() }, - result: "\\n24020016012080400FebMayAugNov24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", + result: "\\n24020016012080400JanAprJulSepDec24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", }, } diff --git a/chart_option_test.go b/chart_option_test.go index ff17750..b7f4e93 100644 --- a/chart_option_test.go +++ b/chart_option_test.go @@ -204,7 +204,7 @@ func TestLineRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", string(data)) + assert.Equal("\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", string(data)) } func TestBarRender(t *testing.T) { @@ -277,7 +277,7 @@ func TestBarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nRainfallEvaporation24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporation24020016012080400JanAprJulSepDec162.22182.22.341.6248.07", string(data)) } func TestHorizontalBarRender(t *testing.T) { @@ -326,7 +326,7 @@ func TestHorizontalBarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", string(data)) + assert.Equal("\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", string(data)) } func TestPieRender(t *testing.T) { diff --git a/echarts_test.go b/echarts_test.go index 2ce1715..dd7562f 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -578,5 +578,5 @@ func TestRenderEChartsToSVG(t *testing.T) { ] }`) assert.Nil(err) - assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400JanAprJulSepDec162.22182.22.341.6248.07", string(data)) } diff --git a/horizontal_bar_chart_test.go b/horizontal_bar_chart_test.go index e078c4a..78f3e69 100644 --- a/horizontal_bar_chart_test.go +++ b/horizontal_bar_chart_test.go @@ -83,7 +83,7 @@ func TestHorizontalBarChart(t *testing.T) { } return p.Bytes() }, - result: "\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", + result: "\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", }, } for _, tt := range tests { diff --git a/line_chart_test.go b/line_chart_test.go index e169f90..e8bc1d7 100644 --- a/line_chart_test.go +++ b/line_chart_test.go @@ -117,7 +117,7 @@ func TestLineChart(t *testing.T) { } return p.Bytes() }, - result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", }, { render: func(p *Painter) ([]byte, error) { @@ -201,7 +201,7 @@ func TestLineChart(t *testing.T) { } return p.Bytes() }, - result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", }, } From 0ddb9e4ef1d089a08fdf712377e6d3d7d7396cc4 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 12 May 2023 20:31:42 +0800 Subject: [PATCH 234/251] chore: update modules --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e265627..d8a492c 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.17 require ( github.com/dustin/go-humanize v1.0.1 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 - github.com/stretchr/testify v1.8.1 + github.com/stretchr/testify v1.8.2 github.com/wcharczuk/go-chart/v2 v2.1.0 ) diff --git a/go.sum b/go.sum index ef2a000..ac1d9f7 100644 --- a/go.sum +++ b/go.sum @@ -12,8 +12,8 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= From 8bcb584abac4fe128bd83103a9b3a04a01db0346 Mon Sep 17 00:00:00 2001 From: Tree Xie Date: Wed, 27 Dec 2023 18:20:55 +0800 Subject: [PATCH 235/251] Revert "Improvements to how the X Axis is rendered" --- axis.go | 1 + axis_test.go | 6 +++--- bar_chart_test.go | 2 +- chart_option_test.go | 6 +++--- echarts_test.go | 2 +- horizontal_bar_chart_test.go | 2 +- line_chart_test.go | 4 ++-- painter.go | 30 +++++++----------------------- xaxis.go | 5 +---- 9 files changed, 20 insertions(+), 38 deletions(-) diff --git a/axis.go b/axis.go index af104a8..762a6a2 100644 --- a/axis.go +++ b/axis.go @@ -176,6 +176,7 @@ func (a *axisPainter) Render() (Box, error) { unit := opt.Unit if unit <= 0 { + unit = ceilFloatToInt(float64(dataCount) / float64(fitTextCount)) unit = chart.MaxInt(unit, opt.SplitNumber) // 偶数 diff --git a/axis_test.go b/axis_test.go index a04024d..d0cff41 100644 --- a/axis_test.go +++ b/axis_test.go @@ -53,7 +53,7 @@ func TestAxis(t *testing.T) { }).Render() return p.Bytes() }, - result: "\\nMonTueWedThuFriSatSun", + result: "\\nMonTueWedThuFriSatSun", }, // 底部x轴文本居左 { @@ -72,7 +72,7 @@ func TestAxis(t *testing.T) { }).Render() return p.Bytes() }, - result: "\\nMonTueWedThuFriSatSun", + result: "\\nMonTueWedThuFriSatSun", }, // 左侧y轴 { @@ -155,7 +155,7 @@ func TestAxis(t *testing.T) { }).Render() return p.Bytes() }, - result: "\\nMon --Tue --Wed --Thu --Fri --Sat --Sun --", + result: "\\nMon --Tue --Wed --Thu --Fri --Sat --Sun --", }, } diff --git a/bar_chart_test.go b/bar_chart_test.go index aec6428..e1522d6 100644 --- a/bar_chart_test.go +++ b/bar_chart_test.go @@ -102,7 +102,7 @@ func TestBarChart(t *testing.T) { } return p.Bytes() }, - result: "\\n24020016012080400JanAprJulSepDec24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", + result: "\\n24020016012080400FebMayAugNov24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", }, } diff --git a/chart_option_test.go b/chart_option_test.go index b7f4e93..ff17750 100644 --- a/chart_option_test.go +++ b/chart_option_test.go @@ -204,7 +204,7 @@ func TestLineRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", string(data)) + assert.Equal("\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", string(data)) } func TestBarRender(t *testing.T) { @@ -277,7 +277,7 @@ func TestBarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\nRainfallEvaporation24020016012080400JanAprJulSepDec162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporation24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) } func TestHorizontalBarRender(t *testing.T) { @@ -326,7 +326,7 @@ func TestHorizontalBarRender(t *testing.T) { assert.Nil(err) data, err := p.Bytes() assert.Nil(err) - assert.Equal("\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", string(data)) + assert.Equal("\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", string(data)) } func TestPieRender(t *testing.T) { diff --git a/echarts_test.go b/echarts_test.go index dd7562f..2ce1715 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -578,5 +578,5 @@ func TestRenderEChartsToSVG(t *testing.T) { ] }`) assert.Nil(err) - assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400JanAprJulSepDec162.22182.22.341.6248.07", string(data)) + assert.Equal("\\nRainfallEvaporationRainfall vs EvaporationFake Data24020016012080400FebMayAugNov162.22182.22.341.6248.07", string(data)) } diff --git a/horizontal_bar_chart_test.go b/horizontal_bar_chart_test.go index 78f3e69..e078c4a 100644 --- a/horizontal_bar_chart_test.go +++ b/horizontal_bar_chart_test.go @@ -83,7 +83,7 @@ func TestHorizontalBarChart(t *testing.T) { } return p.Bytes() }, - result: "\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", + result: "\\n20112012World PopulationWorldChinaIndiaUSAIndonesiaBrazil0122.28k244.56k366.84k489.12k611.4k733.68k", }, } for _, tt := range tests { diff --git a/line_chart_test.go b/line_chart_test.go index e8bc1d7..e169f90 100644 --- a/line_chart_test.go +++ b/line_chart_test.go @@ -117,7 +117,7 @@ func TestLineChart(t *testing.T) { } return p.Bytes() }, - result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", }, { render: func(p *Painter) ([]byte, error) { @@ -201,7 +201,7 @@ func TestLineChart(t *testing.T) { } return p.Bytes() }, - result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", + result: "\\nEmailUnion AdsVideo AdsDirectSearch EngineLine1.44k1.2k9607204802400MonTueWedThuFriSatSun", }, } diff --git a/painter.go b/painter.go index d74b80d..18496fd 100644 --- a/painter.go +++ b/painter.go @@ -615,20 +615,6 @@ func (p *Painter) TextFit(body string, x, y, width int, textAligns ...string) ch return output } -func isTick(totalRange int, unit int, index int) bool { - numTicks := (totalRange / unit) + 1 - step := float64(totalRange-1) / float64(numTicks-1) - for i := int(float64(index) / step); i < numTicks; i++ { - value := int((float64(i) * step) + 0.5) - if value == index { - return true - } else if value > index { - break - } - } - return false -} - func (p *Painter) Ticks(opt TicksOption) *Painter { if opt.Count <= 0 || opt.Length <= 0 { return p @@ -652,7 +638,7 @@ func (p *Painter) Ticks(opt TicksOption) *Painter { if index < first { continue } - if ! isTick(len(values), unit, index) { + if (index-first)%unit != 0 { continue } if isVertical { @@ -688,13 +674,15 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { } count := len(opt.TextList) positionCenter := true - tickLimit := true + showIndex := opt.Unit / 2 if containsString([]string{ PositionLeft, PositionTop, }, opt.Position) { positionCenter = false count-- + // 非居中 + showIndex = 0 } width := p.Width() height := p.Height() @@ -702,7 +690,6 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { isVertical := opt.Orient == OrientVertical if isVertical { values = autoDivide(height, count) - tickLimit = false } else { values = autoDivide(width, count) } @@ -712,7 +699,7 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { if index < opt.First { continue } - if opt.Unit != 0 && tickLimit && ! isTick(len(opt.TextList)-opt.First, opt.Unit, index-opt.First) { + if opt.Unit != 0 && (index-opt.First)%opt.Unit != showIndex { continue } if isTextRotation { @@ -737,11 +724,7 @@ func (p *Painter) MultiText(opt MultiTextOption) *Painter { x = 0 } } else { - if index == len(opt.TextList) - 1 { - x = start - box.Width() + 10 - } else { - x = start - box.Width()>>1 - } + x = start - box.Width()>>1 } x += offset.Left y += offset.Top @@ -766,6 +749,7 @@ func (p *Painter) Grid(opt GridOption) *Painter { x1 := 0 y1 := 0 if isVertical { + x0 = v x1 = v y1 = height diff --git a/xaxis.go b/xaxis.go index 5557015..61698d7 100644 --- a/xaxis.go +++ b/xaxis.go @@ -40,7 +40,7 @@ type XAxisOption struct { FontSize float64 // The flag for show axis, set this to *false will hide axis Show *bool - // Number of segments that the axis is split into. Note that this number serves only as a recommendation to avoid writing overlap. + // Number of segments that the axis is split into. Note that this number serves only as a recommendation. SplitNumber int // The position of axis, it can be 'top' or 'bottom' Position string @@ -55,8 +55,6 @@ type XAxisOption struct { // The offset of label LabelOffset Box isValueAxis bool - // This value overrides SplitNumber, specifying directly the frequency at which the axis is split into, higher numbers result in less ticks - Unit int } const defaultXAxisHeight = 30 @@ -92,7 +90,6 @@ func (opt *XAxisOption) ToAxisOption() AxisOption { TextRotation: opt.TextRotation, LabelOffset: opt.LabelOffset, FirstAxis: opt.FirstAxis, - Unit: opt.Unit, } if opt.isValueAxis { axisOpt.SplitLineShow = true From 98af9866a47cd7ac3665588501889601f7900ef4 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 27 Dec 2023 20:33:12 +0800 Subject: [PATCH 236/251] refactor: support label show for radar chart, #62 --- echarts.go | 5 +++++ radar_chart.go | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/echarts.go b/echarts.go index fbe9a36..5a0e5a0 100644 --- a/echarts.go +++ b/echarts.go @@ -344,6 +344,11 @@ func (esList EChartsSeriesList) ToSeriesList() SeriesList { Data: NewSeriesDataFromValues(dataItem.Value.values), Max: item.Max, Min: item.Min, + Label: SeriesLabel{ + Color: parseColor(item.Label.Color), + Show: item.Label.Show, + Distance: item.Label.Distance, + }, }) } continue diff --git a/radar_chart.go b/radar_chart.go index 429850d..f3d63b9 100644 --- a/radar_chart.go +++ b/radar_chart.go @@ -25,6 +25,7 @@ package charts import ( "errors" + "github.com/dustin/go-humanize" "github.com/golang/freetype/truetype" "github.com/wcharczuk/go-chart/v2" "github.com/wcharczuk/go-chart/v2/drawing" @@ -230,9 +231,15 @@ func (r *radarChart) render(result *defaultRenderResult, seriesList SeriesList) StrokeColor: color, FillColor: dotFillColor, }) - for _, point := range linePoints { + for index, point := range linePoints { seriesPainter.Circle(dotWith, point.X, point.Y) seriesPainter.FillStroke() + if series.Label.Show && index < len(series.Data) { + value := humanize.FtoaWithDigits(series.Data[index].Value, 2) + b := seriesPainter.MeasureText(value) + seriesPainter.Text(value, point.X-b.Width()/2, point.Y) + } + } } From c2f709a74299db5a1c0290f5d6c07606f0b9f124 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 27 Dec 2023 20:34:05 +0800 Subject: [PATCH 237/251] chore: update modules --- .github/workflows/test.yml | 1 + go.mod | 6 +++--- go.sum | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f591a3a..8d6a027 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,6 +14,7 @@ jobs: strategy: matrix: go: + - '1.21' - '1.20' - '1.19' - '1.18' diff --git a/go.mod b/go.mod index d8a492c..b46ff02 100644 --- a/go.mod +++ b/go.mod @@ -5,13 +5,13 @@ go 1.17 require ( github.com/dustin/go-humanize v1.0.1 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 - github.com/stretchr/testify v1.8.2 - github.com/wcharczuk/go-chart/v2 v2.1.0 + github.com/stretchr/testify v1.8.4 + github.com/wcharczuk/go-chart/v2 v2.1.1 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect + golang.org/x/image v0.14.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index ac1d9f7..e518b63 100644 --- a/go.sum +++ b/go.sum @@ -14,11 +14,48 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= +github.com/wcharczuk/go-chart/v2 v2.1.1 h1:2u7na789qiD5WzccZsFz4MJWOJP72G+2kUuJoSNqWnE= +github.com/wcharczuk/go-chart/v2 v2.1.1/go.mod h1:CyCAUt2oqvfhCl6Q5ZvAZwItgpQKZOkCJGb+VGv6l14= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8= +golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= +golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From e09ab2c3c7a5a338be739f503361bc17779733dd Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 27 Dec 2023 20:37:18 +0800 Subject: [PATCH 238/251] Revert "chore: update modules" This reverts commit c2f709a74299db5a1c0290f5d6c07606f0b9f124. --- .github/workflows/test.yml | 1 - go.mod | 6 +++--- go.sum | 37 ------------------------------------- 3 files changed, 3 insertions(+), 41 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8d6a027..f591a3a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,6 @@ jobs: strategy: matrix: go: - - '1.21' - '1.20' - '1.19' - '1.18' diff --git a/go.mod b/go.mod index b46ff02..d8a492c 100644 --- a/go.mod +++ b/go.mod @@ -5,13 +5,13 @@ go 1.17 require ( github.com/dustin/go-humanize v1.0.1 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 - github.com/stretchr/testify v1.8.4 - github.com/wcharczuk/go-chart/v2 v2.1.1 + github.com/stretchr/testify v1.8.2 + github.com/wcharczuk/go-chart/v2 v2.1.0 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.14.0 // indirect + golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index e518b63..ac1d9f7 100644 --- a/go.sum +++ b/go.sum @@ -14,48 +14,11 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= -github.com/wcharczuk/go-chart/v2 v2.1.1 h1:2u7na789qiD5WzccZsFz4MJWOJP72G+2kUuJoSNqWnE= -github.com/wcharczuk/go-chart/v2 v2.1.1/go.mod h1:CyCAUt2oqvfhCl6Q5ZvAZwItgpQKZOkCJGb+VGv6l14= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8= -golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= -golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 310800a5f01eaa29226b7595cdcc0384d2d9f55b Mon Sep 17 00:00:00 2001 From: "xuejinwei.1112" Date: Tue, 2 Jan 2024 12:32:56 +0800 Subject: [PATCH 239/251] support dash line for line chart --- line_chart.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/line_chart.go b/line_chart.go index bdbd38e..363cd36 100644 --- a/line_chart.go +++ b/line_chart.go @@ -115,6 +115,9 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) ( StrokeColor: seriesColor, StrokeWidth: strokeWidth, } + if len(series.Style.StrokeDashArray) > 0 { + drawingStyle.StrokeDashArray = series.Style.StrokeDashArray + } yRange := result.axisRanges[series.AxisIndex] points := make([]Point, 0) From f1a231ff4b0e660609709babc1a9336c89c0233a Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 11 Feb 2024 12:36:26 +0800 Subject: [PATCH 240/251] feat: support split line show option for charts, #69 --- .github/workflows/test.yml | 2 ++ examples/area_line_chart/main.go | 3 +-- examples/bar_chart/main.go | 3 +-- examples/chinese/main.go | 2 +- examples/funnel_chart/main.go | 3 +-- examples/horizontal_bar_chart/main.go | 3 +-- examples/line_chart/main.go | 8 ++++++-- examples/painter/main.go | 3 +-- examples/pie_chart/main.go | 3 +-- examples/radar_chart/main.go | 3 +-- examples/table/main.go | 3 +-- examples/time_line_chart/main.go | 3 +-- yaxis.go | 5 +++++ 13 files changed, 23 insertions(+), 21 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f591a3a..5544970 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,6 +14,8 @@ jobs: strategy: matrix: go: + - '1.22' + - '1.21' - '1.20' - '1.19' - '1.18' diff --git a/examples/area_line_chart/main.go b/examples/area_line_chart/main.go index 7a84df0..ea8f1c2 100644 --- a/examples/area_line_chart/main.go +++ b/examples/area_line_chart/main.go @@ -1,7 +1,6 @@ package main import ( - "io/ioutil" "os" "path/filepath" @@ -16,7 +15,7 @@ func writeFile(buf []byte) error { } file := filepath.Join(tmpPath, "area-line-chart.png") - err = ioutil.WriteFile(file, buf, 0600) + err = os.WriteFile(file, buf, 0600) if err != nil { return err } diff --git a/examples/bar_chart/main.go b/examples/bar_chart/main.go index c559a76..feea66e 100644 --- a/examples/bar_chart/main.go +++ b/examples/bar_chart/main.go @@ -1,7 +1,6 @@ package main import ( - "io/ioutil" "os" "path/filepath" @@ -16,7 +15,7 @@ func writeFile(buf []byte) error { } file := filepath.Join(tmpPath, "bar-chart.png") - err = ioutil.WriteFile(file, buf, 0600) + err = os.WriteFile(file, buf, 0600) if err != nil { return err } diff --git a/examples/chinese/main.go b/examples/chinese/main.go index d77216a..2d96b58 100644 --- a/examples/chinese/main.go +++ b/examples/chinese/main.go @@ -16,7 +16,7 @@ func writeFile(buf []byte) error { } file := filepath.Join(tmpPath, "chinese-line-chart.png") - err = ioutil.WriteFile(file, buf, 0600) + err = os.WriteFile(file, buf, 0600) if err != nil { return err } diff --git a/examples/funnel_chart/main.go b/examples/funnel_chart/main.go index 24f8afe..f29ccf9 100644 --- a/examples/funnel_chart/main.go +++ b/examples/funnel_chart/main.go @@ -1,7 +1,6 @@ package main import ( - "io/ioutil" "os" "path/filepath" @@ -16,7 +15,7 @@ func writeFile(buf []byte) error { } file := filepath.Join(tmpPath, "funnel-chart.png") - err = ioutil.WriteFile(file, buf, 0600) + err = os.WriteFile(file, buf, 0600) if err != nil { return err } diff --git a/examples/horizontal_bar_chart/main.go b/examples/horizontal_bar_chart/main.go index a1c50a7..f2cabe8 100644 --- a/examples/horizontal_bar_chart/main.go +++ b/examples/horizontal_bar_chart/main.go @@ -1,7 +1,6 @@ package main import ( - "io/ioutil" "os" "path/filepath" @@ -16,7 +15,7 @@ func writeFile(buf []byte) error { } file := filepath.Join(tmpPath, "horizontal-bar-chart.png") - err = ioutil.WriteFile(file, buf, 0600) + err = os.WriteFile(file, buf, 0600) if err != nil { return err } diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go index c1478a6..4e6448f 100644 --- a/examples/line_chart/main.go +++ b/examples/line_chart/main.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "io/ioutil" "os" "path/filepath" @@ -17,7 +16,7 @@ func writeFile(buf []byte) error { } file := filepath.Join(tmpPath, "line-chart.png") - err = ioutil.WriteFile(file, buf, 0600) + err = os.WriteFile(file, buf, 0600) if err != nil { return err } @@ -97,6 +96,11 @@ func main() { Top: 5, Bottom: 10, } + opt.YAxisOptions = []charts.YAxisOption{ + { + SplitLineShow: charts.FalseFlag(), + }, + } opt.SymbolShow = charts.FalseFlag() opt.LineStrokeWidth = 1 opt.ValueFormatter = func(f float64) string { diff --git a/examples/painter/main.go b/examples/painter/main.go index 3c31ce4..b7a5832 100644 --- a/examples/painter/main.go +++ b/examples/painter/main.go @@ -1,7 +1,6 @@ package main import ( - "io/ioutil" "os" "path/filepath" @@ -17,7 +16,7 @@ func writeFile(buf []byte) error { } file := filepath.Join(tmpPath, "painter.png") - err = ioutil.WriteFile(file, buf, 0600) + err = os.WriteFile(file, buf, 0600) if err != nil { return err } diff --git a/examples/pie_chart/main.go b/examples/pie_chart/main.go index 3721ed1..38488d2 100644 --- a/examples/pie_chart/main.go +++ b/examples/pie_chart/main.go @@ -1,7 +1,6 @@ package main import ( - "io/ioutil" "os" "path/filepath" @@ -16,7 +15,7 @@ func writeFile(buf []byte) error { } file := filepath.Join(tmpPath, "pie-chart.png") - err = ioutil.WriteFile(file, buf, 0600) + err = os.WriteFile(file, buf, 0600) if err != nil { return err } diff --git a/examples/radar_chart/main.go b/examples/radar_chart/main.go index 51f7409..e8095ae 100644 --- a/examples/radar_chart/main.go +++ b/examples/radar_chart/main.go @@ -1,7 +1,6 @@ package main import ( - "io/ioutil" "os" "path/filepath" @@ -16,7 +15,7 @@ func writeFile(buf []byte) error { } file := filepath.Join(tmpPath, "radar-chart.png") - err = ioutil.WriteFile(file, buf, 0600) + err = os.WriteFile(file, buf, 0600) if err != nil { return err } diff --git a/examples/table/main.go b/examples/table/main.go index 2701ec1..0210ecf 100644 --- a/examples/table/main.go +++ b/examples/table/main.go @@ -1,7 +1,6 @@ package main import ( - "io/ioutil" "os" "path/filepath" "strconv" @@ -19,7 +18,7 @@ func writeFile(buf []byte, filename string) error { } file := filepath.Join(tmpPath, filename) - err = ioutil.WriteFile(file, buf, 0600) + err = os.WriteFile(file, buf, 0600) if err != nil { return err } diff --git a/examples/time_line_chart/main.go b/examples/time_line_chart/main.go index 10932cd..6cb3f3d 100644 --- a/examples/time_line_chart/main.go +++ b/examples/time_line_chart/main.go @@ -3,7 +3,6 @@ package main import ( "crypto/rand" "fmt" - "io/ioutil" "math/big" "os" "path/filepath" @@ -20,7 +19,7 @@ func writeFile(buf []byte) error { } file := filepath.Join(tmpPath, "time-line-chart.png") - err = ioutil.WriteFile(file, buf, 0600) + err = os.WriteFile(file, buf, 0600) if err != nil { return err } diff --git a/yaxis.go b/yaxis.go index bece2cc..e58b7a6 100644 --- a/yaxis.go +++ b/yaxis.go @@ -50,6 +50,8 @@ type YAxisOption struct { DivideCount int Unit int isCategoryAxis bool + // The flag for show axis split line, set this to true will show axis split line + SplitLineShow *bool } // NewYAxisOptions returns a y axis option @@ -100,6 +102,9 @@ func (opt *YAxisOption) ToAxisOption(p *Painter) AxisOption { axisOpt.StrokeWidth = 1 axisOpt.SplitLineShow = false } + if opt.SplitLineShow != nil { + axisOpt.SplitLineShow = *opt.SplitLineShow + } return axisOpt } From 06fe1006d5b2f1a79f7f68f5a986de4bd1c7b9d2 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sun, 11 Feb 2024 12:39:39 +0800 Subject: [PATCH 241/251] chore: update test go version --- .github/workflows/test.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5544970..ce56fe7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,10 +20,6 @@ jobs: - '1.19' - '1.18' - '1.17' - - '1.16' - - '1.15' - - '1.14' - - '1.13' steps: - name: Go ${{ matrix.go }} test From 19a4d783fdfb2f6dedfbad90da9117d389443ffe Mon Sep 17 00:00:00 2001 From: Alexander Heidrich Date: Fri, 8 Mar 2024 20:24:13 +0100 Subject: [PATCH 242/251] fix: Label position of the pie chart --- pie_chart.go | 223 ++++++++++++++++++++++++----------- pie_chart_test.go | 294 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 447 insertions(+), 70 deletions(-) diff --git a/pie_chart.go b/pie_chart.go index b4714ac..bbf7814 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -63,6 +63,96 @@ func NewPieChart(p *Painter, opt PieChartOption) *pieChart { } } +type sector struct { + value float64 + percent float64 + cx int + cy int + rx float64 + ry float64 + start float64 + delta float64 + offset int + quadrant int + lineStartX int + lineStartY int + lineBranchX int + lineBranchY int + lineEndX int + lineEndY int + showLabel bool + label string + series Series + color Color +} + +func NewSector(cx int, cy int, radius float64, labelRadius float64, value float64, currentValue float64, totalValue float64, labelLineLength int, label string, series Series, color Color) sector { + s := sector{} + s.value = value + s.percent = value / totalValue + s.cx = cx + s.cy = cy + s.rx = radius + s.ry = radius + p := currentValue / totalValue + if p < 0.25 { + s.quadrant = 1 + } else if p < 0.5 { + s.quadrant = 4 + } else if p < 0.75 { + s.quadrant = 3 + } else { + s.quadrant = 2 + } + s.start = chart.PercentToRadians(currentValue/totalValue) - math.Pi/2 // Bogenmaß + s.delta = chart.PercentToRadians(value / totalValue) + angle := s.start + s.delta/2 + s.lineStartX = cx + int(radius*math.Cos(angle)) + s.lineStartY = cy + int(radius*math.Sin(angle)) + s.lineBranchX = cx + int(labelRadius*math.Cos(angle)) + s.lineBranchY = cy + int(labelRadius*math.Sin(angle)) + s.offset = labelLineLength + if s.lineBranchX <= cx { + s.offset *= -1 + } + s.lineEndX = s.lineBranchX + s.offset + s.lineEndY = s.lineBranchY + s.series = series + s.color = color + s.showLabel = series.Label.Show + s.label = NewPieLabelFormatter([]string{label}, series.Label.Formatter)(0, s.value, s.percent) + return s +} + +func (s *sector) calculateY(prevY int) int { + for i := 0; i <= s.cy; i++ { + if s.quadrant <= 2 { + if (prevY - s.lineBranchY) > labelFontSize+5 { + break + } + s.lineBranchY -= 1 + } else { + if (s.lineBranchY - prevY) > labelFontSize+5 { + break + } + s.lineBranchY += 1 + } + } + s.lineEndY = s.lineBranchY + return s.lineBranchY +} + +func (s *sector) calculateTextXY(textBox Box) (x int, y int) { + textMargin := 3 + x = s.lineEndX + textMargin + y = s.lineEndY + textBox.Height()>>1 - 1 + if s.offset < 0 { + textWidth := textBox.Width() + x = s.lineEndX - textWidth - textMargin + } + return +} + func (p *pieChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { opt := p.opt values := make([]float64, len(seriesList)) @@ -101,98 +191,91 @@ func (p *pieChart) render(result *defaultRenderResult, seriesList SeriesList) (B theme := opt.Theme currentValue := float64(0) - prevPoints := make([]Point, 0) - isOverride := func(x, y int) bool { - for _, p := range prevPoints { - if math.Abs(float64(p.Y-y)) > labelFontSize { - continue - } - // label可能较多内容,不好计算横向占用空间 - // 因此x的位置需要中间位置两侧,否则认为override - if (p.X <= cx && x <= cx) || - (p.X > cx && x > cx) { - return true + var quadrant1, quadrant2, quadrant3, quadrant4 []sector + for index, v := range values { + series := seriesList[index] + color := theme.GetSeriesColor(index) + if index == len(values)-1 { + if color == theme.GetSeriesColor(0) { + color = theme.GetSeriesColor(1) } } - return false + s := NewSector(cx, cy, radius, labelRadius, v, currentValue, total, labelLineWidth, seriesNames[index], series, color) + switch quadrant := s.quadrant; quadrant { + case 1: + quadrant1 = append([]sector{s}, quadrant1...) + case 2: + quadrant2 = append(quadrant2, s) + case 3: + quadrant3 = append([]sector{s}, quadrant3...) + case 4: + quadrant4 = append(quadrant4, s) + } + currentValue += v } + sectors := append(quadrant1, quadrant4...) + sectors = append(sectors, quadrant3...) + sectors = append(sectors, quadrant2...) - for index, v := range values { + currentQuadrant := 0 + prevY := 0 + maxY := 0 + minY := 0 + for _, s := range sectors { seriesPainter.OverrideDrawingStyle(Style{ StrokeWidth: 1, - StrokeColor: theme.GetSeriesColor(index), - FillColor: theme.GetSeriesColor(index), + StrokeColor: s.color, + FillColor: s.color, }) - seriesPainter.MoveTo(cx, cy) - start := chart.PercentToRadians(currentValue/total) - math.Pi/2 - currentValue += v - percent := (v / total) - delta := chart.PercentToRadians(percent) - seriesPainter.ArcTo(cx, cy, radius, radius, start, delta). - LineTo(cx, cy). - Close(). - FillStroke() - - series := seriesList[index] - // 是否显示label - showLabel := series.Label.Show - if !showLabel { + seriesPainter.MoveTo(s.cx, s.cy) + seriesPainter.ArcTo(s.cx, s.cy, s.rx, s.ry, s.start, s.delta).LineTo(s.cx, s.cy).Close().FillStroke() + if !s.showLabel { continue } - - // label的角度为饼块中间 - angle := start + delta/2 - startx := cx + int(radius*math.Cos(angle)) - starty := cy + int(radius*math.Sin(angle)) - - endx := cx + int(labelRadius*math.Cos(angle)) - endy := cy + int(labelRadius*math.Sin(angle)) - // 计算是否有重叠,如果有则调整y坐标位置 - // 最多只尝试5次 - for i := 0; i < 5; i++ { - if !isOverride(endx, endy) { - break + if currentQuadrant != s.quadrant { + currentQuadrant = s.quadrant + if s.quadrant == 1 { + minY = cy * 2 + maxY = 0 + prevY = cy * 2 + } + if s.quadrant == 2 { + prevY = minY + } + if s.quadrant == 3 { + minY = cy * 2 + maxY = 0 + prevY = 0 + } + if s.quadrant == 4 { + prevY = maxY } - endy -= (labelFontSize << 1) } - prevPoints = append(prevPoints, Point{ - X: endx, - Y: endy, - }) - - seriesPainter.MoveTo(startx, starty) - seriesPainter.LineTo(endx, endy) - offset := labelLineWidth - if endx < cx { - offset *= -1 + prevY = s.calculateY(prevY) + if prevY > maxY { + maxY = prevY } - seriesPainter.MoveTo(endx, endy) - endx += offset - seriesPainter.LineTo(endx, endy) + if prevY < minY { + minY = prevY + } + seriesPainter.MoveTo(s.lineStartX, s.lineStartY) + seriesPainter.LineTo(s.lineBranchX, s.lineBranchY) + seriesPainter.MoveTo(s.lineBranchX, s.lineBranchY) + seriesPainter.LineTo(s.lineEndX, s.lineEndY) seriesPainter.Stroke() - textStyle := Style{ FontColor: theme.GetTextColor(), FontSize: labelFontSize, Font: opt.Font, } - if !series.Label.Color.IsZero() { - textStyle.FontColor = series.Label.Color + if !s.series.Label.Color.IsZero() { + textStyle.FontColor = s.series.Label.Color } seriesPainter.OverrideTextStyle(textStyle) - text := NewPieLabelFormatter(seriesNames, series.Label.Formatter)(index, v, percent) - textBox := seriesPainter.MeasureText(text) - textMargin := 3 - x := endx + textMargin - y := endy + textBox.Height()>>1 - 1 - if offset < 0 { - textWidth := textBox.Width() - x = endx - textWidth - textMargin - } - seriesPainter.Text(text, x, y) + x, y := s.calculateTextXY(seriesPainter.MeasureText(s.label)) + seriesPainter.Text(s.label, x, y) } - return p.p.box, nil } diff --git a/pie_chart_test.go b/pie_chart_test.go index c373a7e..0b8f798 100644 --- a/pie_chart_test.go +++ b/pie_chart_test.go @@ -23,6 +23,7 @@ package charts import ( + "strconv" "testing" "github.com/stretchr/testify/assert" @@ -98,3 +99,296 @@ func TestPieChart(t *testing.T) { assert.Equal(tt.result, string(data)) } } + +func TestPieChartWithLabelsValuesSortedDescending(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + values := []float64{ + 84358845, + 68070697, + 58850717, + 48059777, + 36753736, + 19051562, + 17947406, + 11754004, + 10827529, + 10521556, + 10467366, + 10394055, + 9597085, + 9104772, + 6447710, + 5932654, + 5563970, + 5428792, + 5194336, + 3850894, + 2857279, + 2116792, + 1883008, + 1373101, + 920701, + 660809, + 542051, + } + _, err := NewPieChart(p, PieChartOption{ + SeriesList: NewPieSeriesList(values, PieSeriesOption{ + Label: SeriesLabel{ + Show: true, + Formatter: "{b} ({c} ≅ {d})", + }, + Radius: "200", + }), + Title: TitleOption{ + Text: "European Union member states by population", + Left: PositionRight, + }, + Padding: Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }, + Legend: LegendOption{ + Data: []string{ + "Germany", + "France", + "Italy", + "Spain", + "Poland", + "Romania", + "Netherlands", + "Belgium", + "Czech Republic", + "Sweden", + "Portugal", + "Greece", + "Hungary", + "Austria", + "Bulgaria", + "Denmark", + "Finland", + "Slovakia", + "Ireland", + "Croatia", + "Lithuania", + "Slovenia", + "Latvia", + "Estonia", + "Cyprus", + "Luxembourg", + "Malta", + }, + Show: FalseFlag(), + }, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nEuropean Union member states by populationFrance (68070697 ≅ 15.17%)Germany (84358845 ≅ 18.8%)Italy (58850717 ≅ 13.12%)Spain (48059777 ≅ 10.71%)Belgium (11754004 ≅ 2.62%)Netherlands (17947406 ≅ 4%)Romania (19051562 ≅ 4.24%)Poland (36753736 ≅ 8.19%)Czech Republic (10827529 ≅ 2.41%)Sweden (10521556 ≅ 2.34%)Portugal (10467366 ≅ 2.33%)Greece (10394055 ≅ 2.31%)Hungary (9597085 ≅ 2.13%)Austria (9104772 ≅ 2.02%)Bulgaria (6447710 ≅ 1.43%)Denmark (5932654 ≅ 1.32%)Finland (5563970 ≅ 1.24%)Slovakia (5428792 ≅ 1.21%)Ireland (5194336 ≅ 1.15%)Croatia (3850894 ≅ 0.85%)Lithuania (2857279 ≅ 0.63%)Slovenia (2116792 ≅ 0.47%)Latvia (1883008 ≅ 0.41%)Estonia (1373101 ≅ 0.3%)Cyprus (920701 ≅ 0.2%)Luxembourg (660809 ≅ 0.14%)Malta (542051 ≅ 0.12%)", + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 1000, + Height: 800, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p.Child(PainterPaddingOption(Box{ + Left: 20, + Top: 20, + Right: 20, + Bottom: 20, + }))) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} + +func TestPieChartWithLabelsValuesUnsorted(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + values := []float64{ + 9104772, + 11754004, + 6447710, + 3850894, + 920701, + 10827529, + 5932654, + 1373101, + 5563970, + 68070697, + 84358845, + 10394055, + 9597085, + 5194336, + 58850717, + 1883008, + 2857279, + 660809, + 542051, + 17947406, + 36753736, + 10467366, + 19051562, + 5428792, + 2116792, + 48059777, + 10521556, + } + _, err := NewPieChart(p, PieChartOption{ + SeriesList: NewPieSeriesList(values, PieSeriesOption{ + Label: SeriesLabel{ + Show: true, + Formatter: "{b} ({c} ≅ {d})", + }, + Radius: "200", + }), + Title: TitleOption{ + Text: "European Union member states by population", + Left: PositionRight, + }, + Padding: Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }, + Legend: LegendOption{ + Data: []string{ + "Austria", + "Belgium", + "Bulgaria", + "Croatia", + "Cyprus", + "Czech Republic", + "Denmark", + "Estonia", + "Finland", + "France", + "Germany", + "Greece", + "Hungary", + "Ireland", + "Italy", + "Latvia", + "Lithuania", + "Luxembourg", + "Malta", + "Netherlands", + "Poland", + "Portugal", + "Romania", + "Slovakia", + "Slovenia", + "Spain", + "Sweden", + }, + Show: FalseFlag(), + }, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nEuropean Union member states by populationFrance (68070697 ≅ 15.17%)Finland (5563970 ≅ 1.24%)Estonia (1373101 ≅ 0.3%)Denmark (5932654 ≅ 1.32%)Czech Republic (10827529 ≅ 2.41%)Cyprus (920701 ≅ 0.2%)Croatia (3850894 ≅ 0.85%)Bulgaria (6447710 ≅ 1.43%)Belgium (11754004 ≅ 2.62%)Austria (9104772 ≅ 2.02%)Germany (84358845 ≅ 18.8%)Greece (10394055 ≅ 2.31%)Hungary (9597085 ≅ 2.13%)Poland (36753736 ≅ 8.19%)Netherlands (17947406 ≅ 4%)Malta (542051 ≅ 0.12%)Luxembourg (660809 ≅ 0.14%)Lithuania (2857279 ≅ 0.63%)Latvia (1883008 ≅ 0.41%)Italy (58850717 ≅ 13.12%)Ireland (5194336 ≅ 1.15%)Portugal (10467366 ≅ 2.33%)Romania (19051562 ≅ 4.24%)Slovakia (5428792 ≅ 1.21%)Slovenia (2116792 ≅ 0.47%)Spain (48059777 ≅ 10.71%)Sweden (10521556 ≅ 2.34%)", + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 1000, + Height: 800, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p.Child(PainterPaddingOption(Box{ + Left: 20, + Top: 20, + Right: 20, + Bottom: 20, + }))) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} + +func TestPieChartWith100Labels(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + var values []float64 + var labels []string + for i := 1; i <= 100; i++ { + values = append(values, float64(1)) + labels = append(labels, "Label "+strconv.Itoa(i)) + } + _, err := NewPieChart(p, PieChartOption{ + SeriesList: NewPieSeriesList(values, PieSeriesOption{ + Label: SeriesLabel{ + Show: true, + }, + Radius: "200", + }), + Title: TitleOption{ + Text: "Test with 100 labels", + Left: PositionRight, + }, + Padding: Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }, + Legend: LegendOption{ + Data: labels, + Show: FalseFlag(), + }, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nTest with 100 labelsLabel 25: 1%Label 24: 1%Label 23: 1%Label 22: 1%Label 21: 1%Label 20: 1%Label 19: 1%Label 18: 1%Label 17: 1%Label 16: 1%Label 15: 1%Label 14: 1%Label 13: 1%Label 12: 1%Label 11: 1%Label 10: 1%Label 9: 1%Label 8: 1%Label 7: 1%Label 6: 1%Label 5: 1%Label 4: 1%Label 3: 1%Label 2: 1%Label 1: 1%Label 26: 1%Label 27: 1%Label 28: 1%Label 29: 1%Label 30: 1%Label 31: 1%Label 32: 1%Label 33: 1%Label 34: 1%Label 35: 1%Label 36: 1%Label 37: 1%Label 38: 1%Label 39: 1%Label 40: 1%Label 41: 1%Label 42: 1%Label 43: 1%Label 44: 1%Label 45: 1%Label 46: 1%Label 47: 1%Label 48: 1%Label 49: 1%Label 50: 1%Label 75: 1%Label 74: 1%Label 73: 1%Label 72: 1%Label 71: 1%Label 70: 1%Label 69: 1%Label 68: 1%Label 67: 1%Label 66: 1%Label 65: 1%Label 64: 1%Label 63: 1%Label 62: 1%Label 61: 1%Label 60: 1%Label 59: 1%Label 58: 1%Label 57: 1%Label 56: 1%Label 55: 1%Label 54: 1%Label 53: 1%Label 52: 1%Label 51: 1%Label 76: 1%Label 77: 1%Label 78: 1%Label 79: 1%Label 80: 1%Label 81: 1%Label 82: 1%Label 83: 1%Label 84: 1%Label 85: 1%Label 86: 1%Label 87: 1%Label 88: 1%Label 89: 1%Label 90: 1%Label 91: 1%Label 92: 1%Label 93: 1%Label 94: 1%Label 95: 1%Label 96: 1%Label 97: 1%Label 98: 1%Label 99: 1%Label 100: 1%", + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 1000, + Height: 900, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p.Child(PainterPaddingOption(Box{ + Left: 20, + Top: 20, + Right: 20, + Bottom: 20, + }))) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} From 8c6c4e007c85b7c5fabf3340fff4952fc0810592 Mon Sep 17 00:00:00 2001 From: Alexander Heidrich Date: Fri, 22 Mar 2024 08:27:06 +0100 Subject: [PATCH 243/251] fix: Label position of the pie chart --- pie_chart.go | 4 +- pie_chart_test.go | 141 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 142 insertions(+), 3 deletions(-) diff --git a/pie_chart.go b/pie_chart.go index bbf7814..6cc48c4 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -94,7 +94,7 @@ func NewSector(cx int, cy int, radius float64, labelRadius float64, value float6 s.cy = cy s.rx = radius s.ry = radius - p := currentValue / totalValue + p := (currentValue + value/2) / totalValue if p < 0.25 { s.quadrant = 1 } else if p < 0.5 { @@ -104,7 +104,7 @@ func NewSector(cx int, cy int, radius float64, labelRadius float64, value float6 } else { s.quadrant = 2 } - s.start = chart.PercentToRadians(currentValue/totalValue) - math.Pi/2 // Bogenmaß + s.start = chart.PercentToRadians(currentValue/totalValue) - math.Pi/2 s.delta = chart.PercentToRadians(value / totalValue) angle := s.start + s.delta/2 s.lineStartX = cx + int(radius*math.Cos(angle)) diff --git a/pie_chart_test.go b/pie_chart_test.go index 0b8f798..3795d32 100644 --- a/pie_chart_test.go +++ b/pie_chart_test.go @@ -194,7 +194,7 @@ func TestPieChartWithLabelsValuesSortedDescending(t *testing.T) { } return p.Bytes() }, - result: "\\nEuropean Union member states by populationFrance (68070697 ≅ 15.17%)Germany (84358845 ≅ 18.8%)Italy (58850717 ≅ 13.12%)Spain (48059777 ≅ 10.71%)Belgium (11754004 ≅ 2.62%)Netherlands (17947406 ≅ 4%)Romania (19051562 ≅ 4.24%)Poland (36753736 ≅ 8.19%)Czech Republic (10827529 ≅ 2.41%)Sweden (10521556 ≅ 2.34%)Portugal (10467366 ≅ 2.33%)Greece (10394055 ≅ 2.31%)Hungary (9597085 ≅ 2.13%)Austria (9104772 ≅ 2.02%)Bulgaria (6447710 ≅ 1.43%)Denmark (5932654 ≅ 1.32%)Finland (5563970 ≅ 1.24%)Slovakia (5428792 ≅ 1.21%)Ireland (5194336 ≅ 1.15%)Croatia (3850894 ≅ 0.85%)Lithuania (2857279 ≅ 0.63%)Slovenia (2116792 ≅ 0.47%)Latvia (1883008 ≅ 0.41%)Estonia (1373101 ≅ 0.3%)Cyprus (920701 ≅ 0.2%)Luxembourg (660809 ≅ 0.14%)Malta (542051 ≅ 0.12%)", + result: "\\nEuropean Union member states by populationGermany (84358845 ≅ 18.8%)France (68070697 ≅ 15.17%)Italy (58850717 ≅ 13.12%)Netherlands (17947406 ≅ 4%)Romania (19051562 ≅ 4.24%)Poland (36753736 ≅ 8.19%)Spain (48059777 ≅ 10.71%)Belgium (11754004 ≅ 2.62%)Czech Republic (10827529 ≅ 2.41%)Sweden (10521556 ≅ 2.34%)Portugal (10467366 ≅ 2.33%)Greece (10394055 ≅ 2.31%)Hungary (9597085 ≅ 2.13%)Austria (9104772 ≅ 2.02%)Bulgaria (6447710 ≅ 1.43%)Denmark (5932654 ≅ 1.32%)Finland (5563970 ≅ 1.24%)Slovakia (5428792 ≅ 1.21%)Ireland (5194336 ≅ 1.15%)Croatia (3850894 ≅ 0.85%)Lithuania (2857279 ≅ 0.63%)Slovenia (2116792 ≅ 0.47%)Latvia (1883008 ≅ 0.41%)Estonia (1373101 ≅ 0.3%)Cyprus (920701 ≅ 0.2%)Luxembourg (660809 ≅ 0.14%)Malta (542051 ≅ 0.12%)", }, } for _, tt := range tests { @@ -392,3 +392,142 @@ func TestPieChartWith100Labels(t *testing.T) { assert.Equal(tt.result, string(data)) } } + +func TestPieChartFixLabelPos72586(t *testing.T) { + assert := assert.New(t) + + tests := []struct { + render func(*Painter) ([]byte, error) + result string + }{ + { + render: func(p *Painter) ([]byte, error) { + values := []float64{ + 397594, + 185596, + 149086, + 144258, + 120194, + 117514, + 99412, + 91135, + 87282, + 76790, + 72586, + 58818, + 58270, + 56306, + 55486, + 54792, + 53746, + 51460, + 41242, + 39476, + 37414, + 36644, + 33784, + 32788, + 32566, + 29608, + 29558, + 29384, + 28166, + 26998, + 26948, + 26054, + 25804, + 25730, + 24438, + 23782, + 22896, + 21404, + 428978, + } + _, err := NewPieChart(p, PieChartOption{ + SeriesList: NewPieSeriesList(values, PieSeriesOption{ + Label: SeriesLabel{ + Show: true, + Formatter: "{b} ({c} ≅ {d})", + }, + Radius: "150", + }), + Title: TitleOption{ + Text: "Fix label K (72586)", + Left: PositionRight, + }, + Padding: Box{ + Top: 20, + Right: 20, + Bottom: 20, + Left: 20, + }, + Legend: LegendOption{ + Data: []string{ + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + "AA", + "AB", + "AC", + "AD", + "AE", + "AF", + "AG", + "AH", + "AI", + "AJ", + "AK", + "AL", + "AM", + }, + Show: FalseFlag(), + }, + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\nFix label K (72586)C (149086 ≅ 5.04%)B (185596 ≅ 6.28%)A (397594 ≅ 13.45%)D (144258 ≅ 4.88%)E (120194 ≅ 4.06%)F (117514 ≅ 3.97%)G (99412 ≅ 3.36%)H (91135 ≅ 3.08%)I (87282 ≅ 2.95%)J (76790 ≅ 2.59%)Z (29608 ≅ 1%)Y (32566 ≅ 1.1%)X (32788 ≅ 1.1%)W (33784 ≅ 1.14%)V (36644 ≅ 1.24%)U (37414 ≅ 1.26%)T (39476 ≅ 1.33%)S (41242 ≅ 1.39%)R (51460 ≅ 1.74%)Q (53746 ≅ 1.81%)P (54792 ≅ 1.85%)O (55486 ≅ 1.87%)N (56306 ≅ 1.9%)M (58270 ≅ 1.97%)L (58818 ≅ 1.99%)K (72586 ≅ 2.45%)AA (29558 ≅ 1%)AB (29384 ≅ 0.99%)AC (28166 ≅ 0.95%)AD (26998 ≅ 0.91%)AE (26948 ≅ 0.91%)AF (26054 ≅ 0.88%)AG (25804 ≅ 0.87%)AH (25730 ≅ 0.87%)AI (24438 ≅ 0.82%)AJ (23782 ≅ 0.8%)AK (22896 ≅ 0.77%)AL (21404 ≅ 0.72%)AM (428978 ≅ 14.52%)", + }, + } + for _, tt := range tests { + p, err := NewPainter(PainterOptions{ + Type: ChartOutputSVG, + Width: 1150, + Height: 550, + }, PainterThemeOption(defaultTheme)) + assert.Nil(err) + data, err := tt.render(p.Child(PainterPaddingOption(Box{ + Left: 20, + Top: 20, + Right: 20, + Bottom: 20, + }))) + assert.Nil(err) + assert.Equal(tt.result, string(data)) + } +} From 9b7634c2c230a0a1907c6e99be6bdea11f811a9e Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 16 May 2024 20:02:24 +0800 Subject: [PATCH 244/251] feat: support rounded rect for bar chart --- bar_chart.go | 27 ++++++++++++------ bar_chart_test.go | 70 +++++++++++++++++++++++++++++++++++++++++++++++ painter.go | 42 ++++++++++++++++++++++++++++ painter_test.go | 23 ++++++++++++++++ series.go | 2 ++ 5 files changed, 156 insertions(+), 8 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index efeb465..508c63e 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -142,14 +142,25 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B } top := barMaxHeight - h - seriesPainter.OverrideDrawingStyle(Style{ - FillColor: fillColor, - }).Rect(chart.Box{ - Top: top, - Left: x, - Right: x + barWidth, - Bottom: barMaxHeight - 1, - }) + if series.RoundRadius <= 0 { + seriesPainter.OverrideDrawingStyle(Style{ + FillColor: fillColor, + }).Rect(chart.Box{ + Top: top, + Left: x, + Right: x + barWidth, + Bottom: barMaxHeight - 1, + }) + } else { + seriesPainter.OverrideDrawingStyle(Style{ + FillColor: fillColor, + }).RoundedRect(chart.Box{ + Top: top, + Left: x, + Right: x + barWidth, + Bottom: barMaxHeight - 1, + }, series.RoundRadius) + } // 用于生成marker point points[j] = Point{ // 居中的位置 diff --git a/bar_chart_test.go b/bar_chart_test.go index e1522d6..654c320 100644 --- a/bar_chart_test.go +++ b/bar_chart_test.go @@ -104,6 +104,76 @@ func TestBarChart(t *testing.T) { }, result: "\\n24020016012080400FebMayAugNov24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", }, + { + render: func(p *Painter) ([]byte, error) { + seriesList := NewSeriesListDataFromValues([][]float64{ + { + 2.0, + 4.9, + 7.0, + 23.2, + 25.6, + 76.7, + 135.6, + 162.2, + 32.6, + 20.0, + 6.4, + 3.3, + }, + { + 2.6, + 5.9, + 9.0, + 26.4, + 28.7, + 70.7, + 175.6, + 182.2, + 48.7, + 18.8, + 6.0, + 2.3, + }, + }) + for index := range seriesList { + seriesList[index].Label.Show = true + seriesList[index].RoundRadius = 5 + } + _, err := NewBarChart(p, BarChartOption{ + Padding: Box{ + Left: 10, + Top: 10, + Right: 10, + Bottom: 10, + }, + SeriesList: seriesList, + XAxis: NewXAxisOption([]string{ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + }), + YAxisOptions: NewYAxisOptions([]string{ + "Rainfall", + "Evaporation", + }), + }).Render() + if err != nil { + return nil, err + } + return p.Bytes() + }, + result: "\\n24020016012080400FebMayAugNov24.9723.225.676.7135.6162.232.6206.43.32.65.9926.428.770.7175.6182.248.718.862.3", + }, } for _, tt := range tests { diff --git a/painter.go b/painter.go index 18496fd..bc13418 100644 --- a/painter.go +++ b/painter.go @@ -803,6 +803,48 @@ func (p *Painter) Rect(box Box) *Painter { return p } +func (p *Painter) RoundedRect(box Box, radius int) *Painter { + r := (box.Right - box.Left) / 2 + if radius > r { + radius = r + } + rx := float64(radius) + ry := float64(radius) + p.MoveTo(box.Left+radius, box.Top) + p.LineTo(box.Right-radius, box.Top) + + cx := box.Right - radius + cy := box.Top + radius + // right top + p.ArcTo(cx, cy, rx, ry, -math.Pi/2, math.Pi/2) + + p.LineTo(box.Right, box.Bottom-radius) + + // right bottom + cx = box.Right - radius + cy = box.Bottom - radius + p.ArcTo(cx, cy, rx, ry, 0.0, math.Pi/2) + + p.LineTo(box.Left+radius, box.Bottom) + + // left bottom + cx = box.Left + radius + cy = box.Bottom - radius + p.ArcTo(cx, cy, rx, ry, math.Pi/2, math.Pi/2) + + p.LineTo(box.Left, box.Top+radius) + + // left top + cx = box.Left + radius + cy = box.Top + radius + p.ArcTo(cx, cy, rx, ry, math.Pi, math.Pi/2) + + p.Close() + p.FillStroke() + p.Fill() + return p +} + func (p *Painter) LegendLineDot(box Box) *Painter { width := box.Width() height := box.Height() diff --git a/painter_test.go b/painter_test.go index 2392d5b..b159328 100644 --- a/painter_test.go +++ b/painter_test.go @@ -343,6 +343,29 @@ func TestPainter(t *testing.T) { } } +func TestRoundedRect(t *testing.T) { + assert := assert.New(t) + p, err := NewPainter(PainterOptions{ + Width: 400, + Height: 300, + Type: ChartOutputSVG, + }) + assert.Nil(err) + p.OverrideDrawingStyle(Style{ + FillColor: drawing.ColorWhite, + StrokeWidth: 1, + StrokeColor: drawing.ColorWhite, + }).RoundedRect(Box{ + Left: 10, + Right: 30, + Bottom: 150, + Top: 10, + }, 5) + buf, err := p.Bytes() + assert.Nil(err) + assert.Equal("\\n", string(buf)) +} + func TestPainterTextFit(t *testing.T) { assert := assert.New(t) p, err := NewPainter(PainterOptions{ diff --git a/series.go b/series.go index f28bfa9..0ad135f 100644 --- a/series.go +++ b/series.go @@ -126,6 +126,8 @@ type Series struct { Name string // Radius for Pie chart, e.g.: 40%, default is "40%" Radius string + // Round for bar chart + RoundRadius int // Mark point for series MarkPoint SeriesMarkPoint // Make line for series From 96148357237a4698910b58e780f6a2fe095a4cfe Mon Sep 17 00:00:00 2001 From: vicanso Date: Tue, 21 May 2024 20:26:40 +0800 Subject: [PATCH 245/251] feat: support rounded rect for horizontal bar chart --- examples/horizontal_bar_chart/main.go | 3 +++ horizontal_bar_chart.go | 28 +++++++++++++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/examples/horizontal_bar_chart/main.go b/examples/horizontal_bar_chart/main.go index f2cabe8..a7daa8c 100644 --- a/examples/horizontal_bar_chart/main.go +++ b/examples/horizontal_bar_chart/main.go @@ -65,6 +65,9 @@ func main() { "China", "World", }), + func(opt *charts.ChartOption) { + opt.SeriesList[0].RoundRadius = 5 + }, ) if err != nil { panic(err) diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index 2ab4c03..ca91242 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -136,14 +136,26 @@ func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList Seri fillColor = item.Style.FillColor } right := w - seriesPainter.OverrideDrawingStyle(Style{ - FillColor: fillColor, - }).Rect(chart.Box{ - Top: y, - Left: 0, - Right: right, - Bottom: y + barHeight, - }) + if series.RoundRadius <= 0 { + seriesPainter.OverrideDrawingStyle(Style{ + FillColor: fillColor, + }).Rect(chart.Box{ + Top: y, + Left: 0, + Right: right, + Bottom: y + barHeight, + }) + } else { + seriesPainter.OverrideDrawingStyle(Style{ + FillColor: fillColor, + }).RoundedRect(chart.Box{ + Top: y, + Left: 0, + Right: right, + Bottom: y + barHeight, + }, series.RoundRadius) + } + // 如果label不需要展示,则返回 if labelPainter == nil { continue From 32e6dd52d093ff3411bab31f2bed1357ddc29f48 Mon Sep 17 00:00:00 2001 From: vicanso Date: Wed, 5 Jun 2024 21:13:03 +0800 Subject: [PATCH 246/251] refactor: export `GetRenderer` function to get chart renderer --- painter.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/painter.go b/painter.go index bc13418..2bbbe2e 100644 --- a/painter.go +++ b/painter.go @@ -860,3 +860,7 @@ func (p *Painter) LegendLineDot(box Box) *Painter { p.FillStroke() return p } + +func (p *Painter) GetRenderer() chart.Renderer { + return p.render +} From e7dc4189d5b4bae6e8cf1b10851f6766cb3d4f39 Mon Sep 17 00:00:00 2001 From: vicanso Date: Fri, 7 Jun 2024 20:35:03 +0800 Subject: [PATCH 247/251] feat: support bar margin --- bar_chart.go | 7 +++++++ chart_option.go | 2 ++ charts.go | 10 ++++++---- horizontal_bar_chart.go | 5 +++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index 508c63e..1bebc88 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -23,6 +23,7 @@ package charts import ( + "fmt" "math" "github.com/golang/freetype/truetype" @@ -63,6 +64,8 @@ type BarChartOption struct { // The legend option Legend LegendOption BarWidth int + // Margin of bar + BarMargin int } func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (Box, error) { @@ -88,6 +91,10 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B margin = 5 barMargin = 3 } + if opt.BarMargin > 0 { + barMargin = opt.BarMargin + } + fmt.Println(barMargin) seriesCount := len(seriesList) // 总的宽度-两个margin-(总数-1)的barMargin barWidth := (width - 2*margin - barMargin*(seriesCount-1)) / seriesCount diff --git a/chart_option.go b/chart_option.go index 5311d50..d80a383 100644 --- a/chart_option.go +++ b/chart_option.go @@ -67,6 +67,8 @@ type ChartOption struct { LineStrokeWidth float64 // The bar with of bar chart BarWidth int + // The margin of each bar + BarMargin int // The bar height of horizontal bar chart BarHeight int // Fill the area of line chart diff --git a/charts.go b/charts.go index 74db733..91a0048 100644 --- a/charts.go +++ b/charts.go @@ -375,10 +375,11 @@ func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { if len(barSeriesList) != 0 { handler.Add(func() error { _, err := NewBarChart(p, BarChartOption{ - Theme: opt.theme, - Font: opt.font, - XAxis: opt.XAxis, - BarWidth: opt.BarWidth, + Theme: opt.theme, + Font: opt.font, + XAxis: opt.XAxis, + BarWidth: opt.BarWidth, + BarMargin: opt.BarMargin, }).render(renderResult, barSeriesList) return err }) @@ -391,6 +392,7 @@ func Render(opt ChartOption, opts ...OptionFunc) (*Painter, error) { Theme: opt.theme, Font: opt.font, BarHeight: opt.BarHeight, + BarMargin: opt.BarMargin, YAxisOptions: opt.YAxisOptions, }).render(renderResult, horizontalBarSeriesList) return err diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index ca91242..2ea97bd 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -50,6 +50,8 @@ type HorizontalBarChartOption struct { // The legend option Legend LegendOption BarHeight int + // Margin of bar + BarMargin int } // NewHorizontalBarChart returns a horizontal bar chart renderer @@ -81,6 +83,9 @@ func (h *horizontalBarChart) render(result *defaultRenderResult, seriesList Seri margin = 5 barMargin = 3 } + if opt.BarMargin > 0 { + barMargin = opt.BarMargin + } seriesCount := len(seriesList) // 总的高度-两个margin-(总数-1)的barMargin barHeight := (height - 2*margin - barMargin*(seriesCount-1)) / seriesCount From 5842c71b1d23147fad578d8c11e0f587c464ef71 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 1 Aug 2024 21:44:52 +0800 Subject: [PATCH 248/251] refactor: remove unused code --- bar_chart.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/bar_chart.go b/bar_chart.go index 1bebc88..2d702f2 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -23,7 +23,6 @@ package charts import ( - "fmt" "math" "github.com/golang/freetype/truetype" @@ -94,7 +93,6 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B if opt.BarMargin > 0 { barMargin = opt.BarMargin } - fmt.Println(barMargin) seriesCount := len(seriesList) // 总的宽度-两个margin-(总数-1)的barMargin barWidth := (width - 2*margin - barMargin*(seriesCount-1)) / seriesCount From d25a827706ac3d9c23b2676085c7d6fb845e7782 Mon Sep 17 00:00:00 2001 From: vicanso Date: Thu, 15 Aug 2024 20:37:07 +0800 Subject: [PATCH 249/251] fix: fix label position of pie, #86 --- pie_chart.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/pie_chart.go b/pie_chart.go index 6cc48c4..9e036c6 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -234,23 +234,35 @@ func (p *pieChart) render(result *defaultRenderResult, seriesList SeriesList) (B continue } if currentQuadrant != s.quadrant { - currentQuadrant = s.quadrant if s.quadrant == 1 { minY = cy * 2 maxY = 0 prevY = cy * 2 } if s.quadrant == 2 { - prevY = minY + if currentQuadrant != 3 { + prevY = s.lineEndY + } else { + prevY = minY + } } if s.quadrant == 3 { - minY = cy * 2 - maxY = 0 - prevY = 0 + if currentQuadrant != 4 { + prevY = s.lineEndY + } else { + minY = cy * 2 + maxY = 0 + prevY = 0 + } } if s.quadrant == 4 { - prevY = maxY + if currentQuadrant != 1 { + prevY = s.lineEndY + } else { + prevY = maxY + } } + currentQuadrant = s.quadrant } prevY = s.calculateY(prevY) if prevY > maxY { From 0eacc8e394512d513cd7fa53b8c2fe525b9b2f3c Mon Sep 17 00:00:00 2001 From: Zeni Kim Date: Tue, 13 May 2025 21:46:02 -0500 Subject: [PATCH 250/251] start migration to our packages --- README.md | 2 ++ alias.go | 4 ++-- axis.go | 2 +- axis_test.go | 2 +- bar_chart.go | 2 +- chart_option_test.go | 2 +- charts.go | 2 +- charts_test.go | 2 +- echarts.go | 2 +- echarts_test.go | 2 +- examples/painter/main.go | 2 +- examples/table/main.go | 2 +- font.go | 2 +- font_test.go | 2 +- go.mod | 12 +++++++----- go.sum | 18 ++++++++---------- grid_test.go | 2 +- horizontal_bar_chart.go | 2 +- line_chart.go | 2 +- mark_line_test.go | 2 +- mark_point_test.go | 2 +- painter.go | 2 +- painter_test.go | 4 ++-- pie_chart.go | 2 +- radar_chart.go | 4 ++-- series.go | 2 +- series_label.go | 2 +- table.go | 4 ++-- theme.go | 2 +- util.go | 4 ++-- util_test.go | 4 ++-- 31 files changed, 51 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 1e4ea8b..4cfb004 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # go-charts +Clone from https://github.com/vicanso/go-charts + [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-charts/blob/master/LICENSE) [![Build Status](https://github.com/vicanso/go-charts/workflows/Test/badge.svg)](https://github.com/vicanso/go-charts/actions) diff --git a/alias.go b/alias.go index a96f50b..edf0dec 100644 --- a/alias.go +++ b/alias.go @@ -23,8 +23,8 @@ package charts import ( - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) type Box = chart.Box diff --git a/axis.go b/axis.go index 762a6a2..55fa219 100644 --- a/axis.go +++ b/axis.go @@ -26,7 +26,7 @@ import ( "strings" "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2" ) type axisPainter struct { diff --git a/axis_test.go b/axis_test.go index d0cff41..85e18ca 100644 --- a/axis_test.go +++ b/axis_test.go @@ -26,7 +26,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) func TestAxis(t *testing.T) { diff --git a/bar_chart.go b/bar_chart.go index 2d702f2..043e044 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -26,7 +26,7 @@ import ( "math" "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2" ) type barChart struct { diff --git a/chart_option_test.go b/chart_option_test.go index ff17750..c354b26 100644 --- a/chart_option_test.go +++ b/chart_option_test.go @@ -26,7 +26,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) func TestChartOption(t *testing.T) { diff --git a/charts.go b/charts.go index 91a0048..31df11c 100644 --- a/charts.go +++ b/charts.go @@ -27,7 +27,7 @@ import ( "math" "sort" - "github.com/wcharczuk/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2" ) const labelFontSize = 10 diff --git a/charts_test.go b/charts_test.go index da75ee5..bd581e9 100644 --- a/charts_test.go +++ b/charts_test.go @@ -26,7 +26,7 @@ import ( "errors" "testing" - "github.com/wcharczuk/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2" ) func BenchmarkMultiChartPNGRender(b *testing.B) { diff --git a/echarts.go b/echarts.go index 5a0e5a0..aaef1f1 100644 --- a/echarts.go +++ b/echarts.go @@ -29,7 +29,7 @@ import ( "regexp" "strconv" - "github.com/wcharczuk/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2" ) func convertToArray(data []byte) []byte { diff --git a/echarts_test.go b/echarts_test.go index 2ce1715..2077278 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -27,7 +27,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) func TestConvertToArray(t *testing.T) { diff --git a/examples/painter/main.go b/examples/painter/main.go index b7a5832..193eb7c 100644 --- a/examples/painter/main.go +++ b/examples/painter/main.go @@ -5,7 +5,7 @@ import ( "path/filepath" charts "github.com/vicanso/go-charts/v2" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) func writeFile(buf []byte) error { diff --git a/examples/table/main.go b/examples/table/main.go index 0210ecf..036dc90 100644 --- a/examples/table/main.go +++ b/examples/table/main.go @@ -7,7 +7,7 @@ import ( "strings" "github.com/vicanso/go-charts/v2" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) func writeFile(buf []byte, filename string) error { diff --git a/font.go b/font.go index dae5141..828654e 100644 --- a/font.go +++ b/font.go @@ -27,7 +27,7 @@ import ( "sync" "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2/roboto" + "git.smarteching.com/zeni/go-chart/v2/roboto" ) var fonts = sync.Map{} diff --git a/font_test.go b/font_test.go index 9dc731c..e0c56b2 100644 --- a/font_test.go +++ b/font_test.go @@ -26,7 +26,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2/roboto" + "git.smarteching.com/zeni/go-chart/v2/roboto" ) func TestInstallFont(t *testing.T) { diff --git a/go.mod b/go.mod index d8a492c..b984e59 100644 --- a/go.mod +++ b/go.mod @@ -1,17 +1,19 @@ -module github.com/vicanso/go-charts/v2 +module git.smarteching.com/zeni/go-charts/v2 -go 1.17 +go 1.24.1 require ( + git.smarteching.com/zeni/go-chart/v2 v2.1.4 github.com/dustin/go-humanize v1.0.1 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 - github.com/stretchr/testify v1.8.2 - github.com/wcharczuk/go-chart/v2 v2.1.0 + github.com/stretchr/testify v1.10.0 + github.com/vicanso/go-charts/v2 v2.6.10 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect + github.com/wcharczuk/go-chart/v2 v2.1.0 // indirect + golang.org/x/image v0.21.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index ac1d9f7..e7a75a8 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,5 @@ -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +git.smarteching.com/zeni/go-chart/v2 v2.1.4 h1:pF06+F6eqJLIG8uMiTVPR5TygPGMjM/FHMzTxmu5V/Q= +git.smarteching.com/zeni/go-chart/v2 v2.1.4/go.mod h1:b3ueW9h3pGGXyhkormZAvilHaG4+mQti+bMNPdQBeOQ= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -7,20 +8,17 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/vicanso/go-charts/v2 v2.6.10 h1:Nb2YBekEbUBPbvohnUO1oYMy31v75brUPk6n/fq+JXw= +github.com/vicanso/go-charts/v2 v2.6.10/go.mod h1:Ii2KDI3udTG1wPtiTnntzjlUBJVJTqNscMzh3oYHzUk= github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= -golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= +golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/grid_test.go b/grid_test.go index 3110a2b..fa9c3a6 100644 --- a/grid_test.go +++ b/grid_test.go @@ -26,7 +26,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) func TestGrid(t *testing.T) { diff --git a/horizontal_bar_chart.go b/horizontal_bar_chart.go index 2ea97bd..ed091c9 100644 --- a/horizontal_bar_chart.go +++ b/horizontal_bar_chart.go @@ -24,7 +24,7 @@ package charts import ( "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2" ) type horizontalBarChart struct { diff --git a/line_chart.go b/line_chart.go index 363cd36..fb1d16a 100644 --- a/line_chart.go +++ b/line_chart.go @@ -26,7 +26,7 @@ import ( "math" "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) type lineChart struct { diff --git a/mark_line_test.go b/mark_line_test.go index 00d19ef..0448cda 100644 --- a/mark_line_test.go +++ b/mark_line_test.go @@ -26,7 +26,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) func TestMarkLine(t *testing.T) { diff --git a/mark_point_test.go b/mark_point_test.go index ffa01a7..298345b 100644 --- a/mark_point_test.go +++ b/mark_point_test.go @@ -26,7 +26,7 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) func TestMarkPoint(t *testing.T) { diff --git a/painter.go b/painter.go index 2bbbe2e..bee646f 100644 --- a/painter.go +++ b/painter.go @@ -28,7 +28,7 @@ import ( "math" "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2" ) type ValueFormatter func(float64) string diff --git a/painter_test.go b/painter_test.go index b159328..07c4113 100644 --- a/painter_test.go +++ b/painter_test.go @@ -28,8 +28,8 @@ import ( "github.com/golang/freetype/truetype" "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) func TestPainterOption(t *testing.T) { diff --git a/pie_chart.go b/pie_chart.go index 9e036c6..5c04ed8 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -27,7 +27,7 @@ import ( "math" "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2" ) type pieChart struct { diff --git a/radar_chart.go b/radar_chart.go index f3d63b9..cf18135 100644 --- a/radar_chart.go +++ b/radar_chart.go @@ -27,8 +27,8 @@ import ( "github.com/dustin/go-humanize" "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) type radarChart struct { diff --git a/series.go b/series.go index 0ad135f..da50e64 100644 --- a/series.go +++ b/series.go @@ -26,7 +26,7 @@ import ( "strings" "github.com/dustin/go-humanize" - "github.com/wcharczuk/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2" ) type SeriesData struct { diff --git a/series_label.go b/series_label.go index 10fd148..af873fc 100644 --- a/series_label.go +++ b/series_label.go @@ -24,7 +24,7 @@ package charts import ( "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2" ) type labelRenderValue struct { diff --git a/table.go b/table.go index 86ef569..3e6f273 100644 --- a/table.go +++ b/table.go @@ -26,8 +26,8 @@ import ( "errors" "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) type tableChart struct { diff --git a/theme.go b/theme.go index a6d624f..85016a5 100644 --- a/theme.go +++ b/theme.go @@ -24,7 +24,7 @@ package charts import ( "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) const ThemeDark = "dark" diff --git a/util.go b/util.go index b333e6d..87ff31c 100644 --- a/util.go +++ b/util.go @@ -29,8 +29,8 @@ import ( "strings" "github.com/dustin/go-humanize" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) func TrueFlag() *bool { diff --git a/util_test.go b/util_test.go index 62fd08d..5770776 100644 --- a/util_test.go +++ b/util_test.go @@ -26,8 +26,8 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/wcharczuk/go-chart/v2" - "github.com/wcharczuk/go-chart/v2/drawing" + "git.smarteching.com/zeni/go-chart/v2" + "git.smarteching.com/zeni/go-chart/v2/drawing" ) func TestGetDefaultInt(t *testing.T) { From 958172a1f1206cc6b676c0c02da928ce7f21cf7f Mon Sep 17 00:00:00 2001 From: Zeni Kim Date: Tue, 13 May 2025 21:53:31 -0500 Subject: [PATCH 251/251] update URL in examples --- README.md | 16 ++++++++-------- README_zh.md | 16 ++++++++-------- examples/area_line_chart/main.go | 2 +- examples/bar_chart/main.go | 2 +- examples/charts/main.go | 2 +- examples/chinese/main.go | 2 +- examples/funnel_chart/main.go | 2 +- examples/horizontal_bar_chart/main.go | 2 +- examples/line_chart/main.go | 2 +- examples/painter/main.go | 2 +- examples/pie_chart/main.go | 2 +- examples/radar_chart/main.go | 2 +- examples/table/main.go | 2 +- examples/time_line_chart/main.go | 2 +- go.mod | 2 -- go.sum | 6 ------ 16 files changed, 28 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 4cfb004..0650395 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ More examples can be found in the [./examples/](./examples/) directory. package main import ( - charts "github.com/vicanso/go-charts/v2" + charts "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -101,7 +101,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -176,7 +176,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -233,7 +233,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -288,7 +288,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -346,7 +346,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -386,7 +386,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -451,7 +451,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { diff --git a/README_zh.md b/README_zh.md index c31cf77..3f35b97 100644 --- a/README_zh.md +++ b/README_zh.md @@ -32,7 +32,7 @@ package main import ( - charts "github.com/vicanso/go-charts/v2" + charts "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -98,7 +98,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -173,7 +173,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -230,7 +230,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -285,7 +285,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -343,7 +343,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -383,7 +383,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { @@ -447,7 +447,7 @@ func main() { package main import ( - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func main() { diff --git a/examples/area_line_chart/main.go b/examples/area_line_chart/main.go index ea8f1c2..57ca1e9 100644 --- a/examples/area_line_chart/main.go +++ b/examples/area_line_chart/main.go @@ -4,7 +4,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/bar_chart/main.go b/examples/bar_chart/main.go index feea66e..91c9f81 100644 --- a/examples/bar_chart/main.go +++ b/examples/bar_chart/main.go @@ -4,7 +4,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/charts/main.go b/examples/charts/main.go index 76aa42c..81bc4f2 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -6,7 +6,7 @@ import ( "net/http" "strconv" - charts "github.com/vicanso/go-charts/v2" + charts "git.smarteching.com/zeni/go-charts/v2" ) var html = ` diff --git a/examples/chinese/main.go b/examples/chinese/main.go index 2d96b58..601f54e 100644 --- a/examples/chinese/main.go +++ b/examples/chinese/main.go @@ -5,7 +5,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/funnel_chart/main.go b/examples/funnel_chart/main.go index f29ccf9..653f834 100644 --- a/examples/funnel_chart/main.go +++ b/examples/funnel_chart/main.go @@ -4,7 +4,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/horizontal_bar_chart/main.go b/examples/horizontal_bar_chart/main.go index a7daa8c..f5d8497 100644 --- a/examples/horizontal_bar_chart/main.go +++ b/examples/horizontal_bar_chart/main.go @@ -4,7 +4,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/line_chart/main.go b/examples/line_chart/main.go index 4e6448f..baee8a3 100644 --- a/examples/line_chart/main.go +++ b/examples/line_chart/main.go @@ -5,7 +5,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/painter/main.go b/examples/painter/main.go index 193eb7c..1b842b3 100644 --- a/examples/painter/main.go +++ b/examples/painter/main.go @@ -4,7 +4,7 @@ import ( "os" "path/filepath" - charts "github.com/vicanso/go-charts/v2" + charts "git.smarteching.com/zeni/go-charts/v2" "git.smarteching.com/zeni/go-chart/v2/drawing" ) diff --git a/examples/pie_chart/main.go b/examples/pie_chart/main.go index 38488d2..5d70438 100644 --- a/examples/pie_chart/main.go +++ b/examples/pie_chart/main.go @@ -4,7 +4,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/radar_chart/main.go b/examples/radar_chart/main.go index e8095ae..e7053af 100644 --- a/examples/radar_chart/main.go +++ b/examples/radar_chart/main.go @@ -4,7 +4,7 @@ import ( "os" "path/filepath" - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/examples/table/main.go b/examples/table/main.go index 036dc90..de994eb 100644 --- a/examples/table/main.go +++ b/examples/table/main.go @@ -6,7 +6,7 @@ import ( "strconv" "strings" - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" "git.smarteching.com/zeni/go-chart/v2/drawing" ) diff --git a/examples/time_line_chart/main.go b/examples/time_line_chart/main.go index 6cb3f3d..c6c93bf 100644 --- a/examples/time_line_chart/main.go +++ b/examples/time_line_chart/main.go @@ -8,7 +8,7 @@ import ( "path/filepath" "time" - "github.com/vicanso/go-charts/v2" + "git.smarteching.com/zeni/go-charts/v2" ) func writeFile(buf []byte) error { diff --git a/go.mod b/go.mod index b984e59..76a47b6 100644 --- a/go.mod +++ b/go.mod @@ -7,13 +7,11 @@ require ( github.com/dustin/go-humanize v1.0.1 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 github.com/stretchr/testify v1.10.0 - github.com/vicanso/go-charts/v2 v2.6.10 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/wcharczuk/go-chart/v2 v2.1.0 // indirect golang.org/x/image v0.21.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index e7a75a8..3e1a48a 100644 --- a/go.sum +++ b/go.sum @@ -10,14 +10,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/vicanso/go-charts/v2 v2.6.10 h1:Nb2YBekEbUBPbvohnUO1oYMy31v75brUPk6n/fq+JXw= -github.com/vicanso/go-charts/v2 v2.6.10/go.mod h1:Ii2KDI3udTG1wPtiTnntzjlUBJVJTqNscMzh3oYHzUk= -github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= -github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= -golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

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%0ARZYXFO_3h|Utj(s1Qb9QiHJ92ZS!~CvAoR66V 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Ȧ@}U3x+-;Jv|;DY=kz{9BKN5wNwjfH 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

D!I1{Rz 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≈kK5r4!2Copr|{}UV54CsWxJ_fI742yP3c!t+r{T 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

INkic#ym?MeA0oNz^ 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�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

6KkA{N5mw1Syvig2AICy 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 {yylwSV-M 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 BB0m5C diff --git a/assets/go-echarts.png b/assets/go-echarts.png new file mode 100644 index 0000000000000000000000000000000000000000..c7ef555759baeb594e1971879e90e47a446e2f9f GIT binary patch literal 271936 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%0DxPnQdySwyh9&u^o!eY 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 literal 0 HcmV?d00001 From 805184b74d5f1dd678c78fe8a2394040ad8c1ad6 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Dec 2021 12:13:32 +0800 Subject: [PATCH 019/251] docs: add document for echarts option --- .github/workflows/test.yml | 43 +++++++++++++ README.md | 38 ++++++++++- charts.go | 17 +++-- echarts.go | 28 +++++++-- echarts_test.go | 22 +++++++ examples/charts/main.go | 2 +- legend.go | 126 ++++++++++++++++++++++++++----------- legend_test.go | 17 +++-- 8 files changed, 236 insertions(+), 57 deletions(-) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..ebc9a02 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,43 @@ +name: Test + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + + build: + name: Build + runs-on: ubuntu-latest + strategy: + matrix: + go: + - '1.17' + - '1.16' + - '1.15' + - '1.14' + - '1.13' + steps: + + - name: Go ${{ matrix.go }} test + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go }} + + - name: Check out code into the Go module directory + uses: actions/checkout@v2 + + - name: Get dependencies + run: + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin latest + + - name: Lint + run: make lint + + - name: Test + run: make test + + - name: Bench + run: make bench diff --git a/README.md b/README.md index 93db83e..c267461 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # go-echarts -![Alt](https://repobeats.axiom.co/api/embed/9071915842d72a909465be75eb6c12ffb7de2dcf.svg "Repobeats analytics image") - [go-chart](https://github.com/wcharczuk/go-chart)是golang常用的可视化图表库,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可。go-echarts则是结合两者的方式,兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图: ![](./assets/go-echarts.png) @@ -44,4 +42,38 @@ func main() { } os.WriteFile("output.png", buf, 0600) } -``` \ No newline at end of file +``` + +## 参数说明 + +- `theme` 颜色主题,支持`dark`与`light`模式,默认为`light` +- `padding` 图表的内边距,单位px。支持以下几种模式的设置 + - `padding: 5` 设置内边距为5 + - `padding: [5, 10]` 设置上下的内边距为 5,左右的内边距为 10 + - `padding:[5, 10, 5, 10]` 分别设置`上右下左`边距 +- `title` 图表标题,包括标题内容、高度、颜色等 + - `title.text` 标题内容 + - `title.textStyle.color` 标题文字颜色 + - `title.textStyle.fontSize` 标题文字字体大小 + - `title.textStyle.height` 标题高度 +- `xAxis` 直角坐标系grid中的x轴,由于go-echarts仅支持单一个x轴,因此若参数为数组多个x轴,只使用第一个配置 + - `xAxis.boundaryGap` 坐标轴两边留白策略,仅支持三种设置方式`null`, `true`或者`false`。`null`或`true`时则数据点展示在两个刻度中间 + - `xAxis.splitNumber` 坐标轴的分割段数,需要注意的是这个分割段数只是个预估值,最后实际显示的段数会在这个基础上根据分割后坐标轴刻度显示的易读程度作调整 + - `xAxis.data` x轴的展示文案,暂只支持字符串数组,如["Mon", "Tue"],其数量需要与展示点一致 +- `yAxis` 直角坐标系grid中的y轴,最多支持两个y轴 + - `yAxis.min` 坐标轴刻度最小值,若不设置则自动计算 + - `yAxis.max` 坐标轴刻度最大值,若不设置则自动计算 + - `yAxis.axisLabel.formatter` 刻度标签的内容格式器,如`"formatter": "{value} kg"` +- `legend` 图表中不同系列的标记 + - `legend.data` 图例的数据数组,为字符串数组,如["Email", "Video Ads"] + - `legend.align` 图例标记和文本的对齐,默认为标记靠左`left` + - `legend.padding` legend的padding,配置方式与图表的`padding`一致 + - `legend.left` legend离容器左侧的距离,其值可以为具体的像素值(20)或百分比(20%) + - `legend.right` legend离容器右侧的距离,其值可以为具体的像素值(20)或百分比(20%) +- `series` 图表的数据项列表 + - `series.type` 图表的展示类型,暂支持`line`, `bar`以及`pie`,需要注意`pie`只能单独使用 + - `series.yAxisIndex` 该数据项使用的y轴,默认为0,对yAxis的配置对应 + - `series.itemStyle.color` 该数据项展示时使用的颜色 + - `series.data` 数据项对应的数据数组,支持以下形式的数据: + - `数值` 常用形式,数组数据为浮点数组,如[1.1, 2,3, 5.2] + - `结构体` pie图表或bar图表中指定样式使用,如[{"value": 1048, "name": "Search Engine"},{"value": 735,"name": "Direct"}] \ No newline at end of file diff --git a/charts.go b/charts.go index cdc4b76..f5fcb1f 100644 --- a/charts.go +++ b/charts.go @@ -49,6 +49,10 @@ type ( Data []string Align string Padding chart.Box + Left string + Right string + Top string + Bottom string } Options struct { Padding chart.Box @@ -193,11 +197,14 @@ func newChart(opt Options) *chart.Chart { if legendSize != 0 { c.Elements = []chart.Renderable{ LegendCustomize(c.Series, LegendOption{ - Theme: opt.Theme, - TextPosition: LegendTextPositionRight, - IconDraw: DefaultLegendIconDraw, - Align: opt.Legend.Align, - Padding: opt.Legend.Padding, + Theme: opt.Theme, + IconDraw: DefaultLegendIconDraw, + Align: opt.Legend.Align, + Padding: opt.Legend.Padding, + Left: opt.Legend.Left, + Right: opt.Legend.Right, + Top: opt.Legend.Top, + Bottom: opt.Legend.Bottom, }), } } diff --git a/echarts.go b/echarts.go index 672a21a..bd5a950 100644 --- a/echarts.go +++ b/echarts.go @@ -25,6 +25,7 @@ package charts import ( "bytes" "encoding/json" + "fmt" "regexp" "strconv" "strings" @@ -81,6 +82,19 @@ type EChartsPadding struct { box chart.Box } +type LegendPostion string + +func (lp *LegendPostion) UnmarshalJSON(data []byte) error { + if len(data) == 0 { + return nil + } + if regexp.MustCompile(`^\d+`).Match(data) { + data = []byte(fmt.Sprintf(`"%s"`, string(data))) + } + s := (*string)(lp) + return json.Unmarshal(data, s) +} + func (ep *EChartsPadding) UnmarshalJSON(data []byte) error { data = convertToArray(data) if len(data) == 0 { @@ -128,9 +142,9 @@ func (ep *EChartsPadding) UnmarshalJSON(data []byte) error { type EChartsYAxis struct { Data []struct { - Min *float64 `json:"min"` - Max *float64 `json:"max"` - Interval int `json:"interval"` + Min *float64 `json:"min"` + Max *float64 `json:"max"` + // Interval int `json:"interval"` AxisLabel struct { Formatter string `json:"formatter"` } `json:"axisLabel"` @@ -147,7 +161,7 @@ func (ey *EChartsYAxis) UnmarshalJSON(data []byte) error { type EChartsXAxis struct { Data []struct { - Type string `json:"type"` + // Type string `json:"type"` BoundaryGap *bool `json:"boundaryGap"` SplitNumber int `json:"splitNumber"` Data []string `json:"data"` @@ -183,6 +197,10 @@ type ECharsOptions struct { Data []string `json:"data"` Align string `json:"align"` Padding EChartsPadding `json:"padding"` + Left LegendPostion `json:"left"` + Right LegendPostion `json:"right"` + // Top string `json:"top"` + // Bottom string `json:"bottom"` } `json:"legend"` Series []struct { Data []ECharsSeriesData `json:"data"` @@ -293,6 +311,8 @@ func (e *ECharsOptions) ToOptions() Options { Data: e.Legend.Data, Align: e.Legend.Align, Padding: e.Legend.Padding.box, + Left: string(e.Legend.Left), + Right: string(e.Legend.Right), } if len(e.YAxis.Data) != 0 { yAxisOptions := make([]*YAxisOption, len(e.YAxis.Data)) diff --git a/echarts_test.go b/echarts_test.go index b06da53..9639ac1 100644 --- a/echarts_test.go +++ b/echarts_test.go @@ -397,3 +397,25 @@ func TestParseECharsOptions(t *testing.T) { }, }, options) } + +func BenchmarkEChartsRender(b *testing.B) { + for i := 0; i < b.N; i++ { + _, err := RenderEChartsToPNG(`{ + "title": { + "text": "Line" + }, + "xAxis": { + "type": "category", + "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + }, + "series": [ + { + "data": [150, 230, 224, 218, 135, 147, 260] + } + ] + }`) + if err != nil { + panic(err) + } + } +} diff --git a/examples/charts/main.go b/examples/charts/main.go index 4cf72e2..72b75b0 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -86,7 +86,7 @@ var chartOptions = []map[string]string{ }, "legend": { "align": "left", - "padding": [5, 0, 0, 50], + "right": 0, "data": ["Email", "Union Ads", "Video Ads", "Direct", "Search Engine"] }, "xAxis": { diff --git a/legend.go b/legend.go index b019868..bf968fe 100644 --- a/legend.go +++ b/legend.go @@ -23,16 +23,22 @@ package charts import ( + "strconv" + "strings" + "github.com/wcharczuk/go-chart/v2" ) type LegendOption struct { - Style chart.Style - Padding chart.Box - Align string - TextPosition string - Theme string - IconDraw LegendIconDraw + Style chart.Style + Padding chart.Box + Left string + Right string + Top string + Bottom string + Align string + Theme string + IconDraw LegendIconDraw } type LegendIconDrawOption struct { @@ -43,13 +49,8 @@ type LegendIconDrawOption struct { } const ( - LegendAlignLeft = "left" - LegendAlignCenter = "center" - LegendAlignRight = "right" -) - -const ( - LegendTextPositionRight = "right" + LegendAlignLeft = "left" + LegendAlignRight = "right" ) type LegendIconDraw func(r chart.Renderer, opt LegendIconDrawOption) @@ -71,6 +72,61 @@ func DefaultLegendIconDraw(r chart.Renderer, opt LegendIconDrawOption) { r.FillStroke() } +func covertPercent(value string) float64 { + if !strings.HasSuffix(value, "%") { + return -1 + } + v, err := strconv.Atoi(strings.ReplaceAll(value, "%", "")) + if err != nil { + return -1 + } + return float64(v) / 100 +} + +func getLegendLeft(width, legendBoxWidth int, opt LegendOption) int { + left := (width - legendBoxWidth) / 2 + leftValue := opt.Left + if leftValue == "auto" || leftValue == "center" { + leftValue = "" + } + if leftValue == "left" { + leftValue = "0" + } + + rightValue := opt.Right + if rightValue == "auto" || leftValue == "center" { + rightValue = "" + } + if rightValue == "right" { + rightValue = "0" + } + if leftValue == "" && rightValue == "" { + return left + } + if leftValue != "" { + percent := covertPercent(leftValue) + if percent >= 0 { + return int(float64(width) * percent) + } + v, _ := strconv.Atoi(leftValue) + return v + } + if rightValue != "" { + percent := covertPercent(rightValue) + if percent >= 0 { + return width - legendBoxWidth - int(float64(width)*percent) + } + v, _ := strconv.Atoi(rightValue) + return width - legendBoxWidth - v + } + return left +} + +func getLegendTop(height, legendBoxHeight int, opt LegendOption) int { + // TODO 支持top的处理 + return 0 +} + func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { return func(r chart.Renderer, cb chart.Box, chartDefaults chart.Style) { legendDefaults := chart.Style{ @@ -115,26 +171,23 @@ func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { chartPadding := cb.Top legendYMargin := (chartPadding - legendBoxHeight) >> 1 - lineLengthMinimum := 25 + iconWidth := 25 + lineTextGap := 5 - labelWidth += lineLengthMinimum * len(labels) + iconAllWidth := iconWidth * len(labels) + spaceAllWidth := chart.DefaultMinimumTickHorizontalSpacing * (len(labels) - 1) - left := 0 - switch opt.Align { - case LegendAlignLeft: - left = 0 - case LegendAlignRight: - left = cb.Width() - labelWidth - default: - left = (cb.Width() - labelWidth) / 2 - } + legendBoxWidth := labelWidth + iconAllWidth + spaceAllWidth + + left := getLegendLeft(cb.Width(), legendBoxWidth, opt) + top := getLegendTop(cb.Height(), legendBoxHeight, opt) left += opt.Padding.Left - top := opt.Padding.Top + top += opt.Padding.Top legendBox := chart.Box{ Left: left, - Right: left + labelWidth, + Right: left + legendBoxWidth, Top: top, Bottom: top + legendBoxHeight, } @@ -145,8 +198,6 @@ func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { r.SetFontColor(legendStyle.GetFontColor()) r.SetFontSize(legendStyle.GetFontSize()) - lineTextGap := 5 - startX := legendBox.Left + legendStyle.Padding.Left ty := top + legendYMargin + legendStyle.Padding.Top + textHeight var label string @@ -155,13 +206,17 @@ func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { if iconDraw == nil { iconDraw = DefaultLegendIconDraw } + align := opt.Align + if align == "" { + align = LegendAlignLeft + } for index := range labels { label = labels[index] if len(label) > 0 { x = startX - // 如果文本靠左显示 - if opt.TextPosition != LegendTextPositionRight { + // 如果图例标记靠右展示 + if align == LegendAlignRight { textBox = r.MeasureText(label) r.Text(label, x, ty) x = startX + textBox.Width() + lineTextGap @@ -175,20 +230,21 @@ func LegendCustomize(series []chart.Series, opt LegendOption) chart.Renderable { Box: chart.Box{ Left: x, Top: ty, - Right: x + lineLengthMinimum, + Right: x + iconWidth, Bottom: ty + textHeight, }, }) - x += (lineLengthMinimum + lineTextGap) + x += (iconWidth + lineTextGap) - // 如果文本靠右显示 - if opt.TextPosition == LegendTextPositionRight { + // 如果图例标记靠左展示 + if align == LegendAlignLeft { textBox = r.MeasureText(label) r.Text(label, x, ty) + x += textBox.Width() } // 计算下一个legend的位置 - startX += textBox.Width() + chart.DefaultMinimumTickHorizontalSpacing + lineTextGap + lineLengthMinimum + startX = x + chart.DefaultMinimumTickHorizontalSpacing } } } diff --git a/legend_test.go b/legend_test.go index d2af129..5bfacf8 100644 --- a/legend_test.go +++ b/legend_test.go @@ -43,16 +43,16 @@ func TestLegendCustomize(t *testing.T) { }, chart.TickPositionBetweenTicks, "") tests := []struct { - textPosition string - svg string + align string + svg string }{ { - textPosition: LegendTextPositionRight, - svg: "\\nchromeedge", + align: LegendAlignLeft, + svg: "\\nchromeedge", }, { - textPosition: LegendAlignLeft, - svg: "\\nchromeedge", + align: LegendAlignRight, + svg: "\\nchromeedge", }, } @@ -60,9 +60,8 @@ func TestLegendCustomize(t *testing.T) { r, err := chart.SVG(800, 600) assert.Nil(err) fn := LegendCustomize(series, LegendOption{ - TextPosition: tt.textPosition, - IconDraw: DefaultLegendIconDraw, - Align: LegendAlignLeft, + Align: tt.align, + IconDraw: DefaultLegendIconDraw, Padding: chart.Box{ Left: 100, Top: 100, From 6a3c67e13f2d77ffabfdec04fb2237705c39f2e8 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Dec 2021 12:20:24 +0800 Subject: [PATCH 020/251] fix: fix test --- examples/basic/main.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/basic/main.go b/examples/basic/main.go index 906f32c..d30d0cf 100644 --- a/examples/basic/main.go +++ b/examples/basic/main.go @@ -24,5 +24,10 @@ func main() { if err != nil { panic(err) } - os.WriteFile("output.png", buf, 0600) + file, err := os.Create("output.png") + if err != nil { + panic(err) + } + defer file.Close() + file.Write(buf) } From 1aa9cae53d962320101571c94fd356146f41bb5f Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Dec 2021 12:26:05 +0800 Subject: [PATCH 021/251] docs: update readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c267461..889898e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # go-echarts -[go-chart](https://github.com/wcharczuk/go-chart)是golang常用的可视化图表库,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可。go-echarts则是结合两者的方式,兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图: +[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-echarts/blob/master/LICENSE) +[![Build Status](https://github.com/vicanso/go-echarts/workflows/Test/badge.svg)](https://github.com/vicanso/go-echarts/actions) + +`go-echarts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可,`go-echarts`兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图: ![](./assets/go-echarts.png) From 0b458d69769ba1822380ff9ce013871c1436393e Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Dec 2021 14:41:12 +0800 Subject: [PATCH 022/251] docs: update documents --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 889898e..036e635 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-echarts/blob/master/LICENSE) [![Build Status](https://github.com/vicanso/go-echarts/workflows/Test/badge.svg)](https://github.com/vicanso/go-echarts/actions) -`go-echarts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可,`go-echarts`兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图: +`go-echarts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可,`go-echarts`兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图(黑夜模式): ![](./assets/go-echarts.png) From edd58a76329f9878dee8a33a7a3f774ff8498667 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Dec 2021 16:56:34 +0800 Subject: [PATCH 023/251] refactor: change module's name --- README.md | 2 +- examples/basic/main.go | 2 +- examples/charts/main.go | 2 +- go.mod | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 036e635..ff4b974 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ package main import ( "os" - charts "github.com/vicanso/echarts" + charts "github.com/vicanso/go-echarts" ) func main() { diff --git a/examples/basic/main.go b/examples/basic/main.go index d30d0cf..c019df3 100644 --- a/examples/basic/main.go +++ b/examples/basic/main.go @@ -3,7 +3,7 @@ package main import ( "os" - charts "github.com/vicanso/echarts" + charts "github.com/vicanso/go-echarts" ) func main() { diff --git a/examples/charts/main.go b/examples/charts/main.go index 72b75b0..4316d79 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -4,7 +4,7 @@ import ( "bytes" "net/http" - charts "github.com/vicanso/echarts" + charts "github.com/vicanso/go-echarts" ) var html = ` diff --git a/go.mod b/go.mod index 6ea9001..b83ca6c 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/vicanso/echarts +module github.com/vicanso/go-echarts go 1.17 From 18af884865f43ea0920986016b2f94ee7b392065 Mon Sep 17 00:00:00 2001 From: vicanso Date: Sat, 25 Dec 2021 20:15:31 +0800 Subject: [PATCH 024/251] refactor: change modules's name --- README.md | 16 ++++++++-------- examples/basic/main.go | 2 +- examples/charts/main.go | 4 ++-- go.mod | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index ff4b974..2486162 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# go-echarts +# go-charts -[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-echarts/blob/master/LICENSE) -[![Build Status](https://github.com/vicanso/go-echarts/workflows/Test/badge.svg)](https://github.com/vicanso/go-echarts/actions) +[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/vicanso/go-charts/blob/master/LICENSE) +[![Build Status](https://github.com/vicanso/go-charts/workflows/Test/badge.svg)](https://github.com/vicanso/go-charts/actions) -`go-echarts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可,`go-echarts`兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图(黑夜模式): +`go-charts`基于[go-chart](https://github.com/wcharczuk/go-chart)生成数据图表,支持`svg`与`png`的输出,`Apache ECharts`在前端开发中得到众多开发者的认可,`go-charts`兼容`Apache ECharts`的配置参数,简单快捷的生成相似的图表(`svg`或`png`),方便插入至Email或分享使用。下面为常用的几种图表截图(黑夜模式): -![](./assets/go-echarts.png) +![](./assets/go-charts.png) ## 支持图表类型 @@ -14,7 +14,7 @@ ## 示例 -`go-echarts`兼容了`echarts`的参数配置,可简单的使用json形式的配置字符串则可快速生成图表。 +`go-charts`兼容了`echarts`的参数配置,可简单的使用json形式的配置字符串则可快速生成图表。 ```go package main @@ -22,7 +22,7 @@ package main import ( "os" - charts "github.com/vicanso/go-echarts" + charts "github.com/vicanso/go-charts" ) func main() { @@ -59,7 +59,7 @@ func main() { - `title.textStyle.color` 标题文字颜色 - `title.textStyle.fontSize` 标题文字字体大小 - `title.textStyle.height` 标题高度 -- `xAxis` 直角坐标系grid中的x轴,由于go-echarts仅支持单一个x轴,因此若参数为数组多个x轴,只使用第一个配置 +- `xAxis` 直角坐标系grid中的x轴,由于go-charts仅支持单一个x轴,因此若参数为数组多个x轴,只使用第一个配置 - `xAxis.boundaryGap` 坐标轴两边留白策略,仅支持三种设置方式`null`, `true`或者`false`。`null`或`true`时则数据点展示在两个刻度中间 - `xAxis.splitNumber` 坐标轴的分割段数,需要注意的是这个分割段数只是个预估值,最后实际显示的段数会在这个基础上根据分割后坐标轴刻度显示的易读程度作调整 - `xAxis.data` x轴的展示文案,暂只支持字符串数组,如["Mon", "Tue"],其数量需要与展示点一致 diff --git a/examples/basic/main.go b/examples/basic/main.go index c019df3..9efc745 100644 --- a/examples/basic/main.go +++ b/examples/basic/main.go @@ -3,7 +3,7 @@ package main import ( "os" - charts "github.com/vicanso/go-echarts" + charts "github.com/vicanso/go-charts" ) func main() { diff --git a/examples/charts/main.go b/examples/charts/main.go index 4316d79..4000b44 100644 --- a/examples/charts/main.go +++ b/examples/charts/main.go @@ -4,7 +4,7 @@ import ( "bytes" "net/http" - charts "github.com/vicanso/go-echarts" + charts "github.com/vicanso/go-charts" ) var html = ` @@ -42,7 +42,7 @@ var html = ` display: block; } - go-echarts + go-charts