From b63ee97d15a43cec065562c55b462e09e8598c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Mon, 5 Oct 2026 13:02:39 -0400 Subject: [PATCH] Inputs: review r2 fixes --- button.go | 32 ++-- checkbox.go | 2 +- docs/components/021-button.md | 2 +- docs/components/024-text-input.md | 5 +- docs/components/025-text-area.md | 2 +- docs/components/026-number-input.md | 14 +- docs/components/028-search-input.md | 2 +- docs/components/030-radio-group.md | 2 +- input_review2_test.go | 177 ++++++++++++++++++ number_input.go | 114 ++++++++--- password_input.go | 6 +- radio_group.go | 18 +- search_input.go | 19 +- .../darwin/button-comfortable-dark.png | Bin 10367 -> 11197 bytes .../darwin/button-comfortable-light.png | Bin 10109 -> 10878 bytes .../snapshots/darwin/button-compact-dark.png | Bin 10243 -> 11092 bytes .../snapshots/darwin/button-compact-light.png | Bin 9964 -> 10715 bytes testdata/snapshots/darwin/button-dark.png | Bin 10119 -> 11139 bytes testdata/snapshots/darwin/button-light.png | Bin 9919 -> 10838 bytes .../snapshots/darwin/number_input-dark.png | Bin 7139 -> 7070 bytes .../snapshots/darwin/number_input-light.png | Bin 6878 -> 6797 bytes testdata/snapshots/darwin/spinner-dark.png | Bin 3453 -> 4519 bytes testdata/snapshots/darwin/spinner-light.png | Bin 3365 -> 4225 bytes text_area.go | 6 +- text_input.go | 12 +- 25 files changed, 330 insertions(+), 83 deletions(-) create mode 100644 input_review2_test.go diff --git a/button.go b/button.go index 83cfa26..d3c2e2f 100644 --- a/button.go +++ b/button.go @@ -29,6 +29,9 @@ type ButtonOptions struct { Label string } +// buttonSpinnerSize is the leading icon slot, which the spinner takes while loading. +const buttonSpinnerSize float32 = 16 + // Button is a push button. Loading keeps its size and blocks clicks. func Button(c *ui.Context, label string, opts ButtonOptions) *ui.Element { if label == "" && opts.Label == "" { @@ -36,8 +39,13 @@ func Button(c *ui.Context, label string, opts ButtonOptions) *ui.Element { } k := Tokens(c) d := Density(c) + pad, gap := d.Unit()*4, d.Unit()*2 + if opts.Loading && opts.Icon == nil && label != "" { + // The spinner slot comes out of the padding, so the width holds. + pad -= (buttonSpinnerSize + gap) / 2 + } b := ui.ButtonBase(c).MinHeight(d.ControlHeight()).MinWidth(theme.MinHitSize). - Padding(0, d.Unit()*4).Gap(d.Unit() * 2).Radius(theme.ControlRadius). + Padding(0, pad).Gap(gap).Radius(theme.ControlRadius). Disabled(opts.Disabled || opts.Loading) internal.Ring(b, k.Focus, theme.ControlRadius) if opts.Label != "" { @@ -49,25 +57,13 @@ func Button(c *ui.Context, label string, opts ButtonOptions) *ui.Element { b.Border(theme.BorderWidth, border) } b.Children(func() { - switch { - case opts.Loading && opts.Icon != nil: - // The spinner takes the icon's 16 DIP slot. - Spinner(c, SpinnerOptions{Size: 16, Color: fg}) - case opts.Loading && label == "": - Spinner(c, SpinnerOptions{Size: 16, Color: fg}) - case opts.Loading: - // Over the hidden label, so the width stays. - ui.Box(c).Absolute().Left(0).Top(0).Right(0).Bottom(0).Center().Children(func() { - Spinner(c, SpinnerOptions{Size: 16, Color: fg}) - }) - case opts.Icon != nil: - ui.Icon(c, opts.Icon).Size(16, 16) + if opts.Loading { + Spinner(c, SpinnerOptions{Size: buttonSpinnerSize, Color: fg}) + } else if opts.Icon != nil { + ui.Icon(c, opts.Icon).Size(buttonSpinnerSize, buttonSpinnerSize) } if label != "" { - t := ui.Text(c, label).SingleLine() - if opts.Loading && opts.Icon == nil { - t.TextColor(fg.Alpha(0)) - } + ui.Text(c, label).SingleLine() } }) return b diff --git a/checkbox.go b/checkbox.go index c294aea..5a420ee 100644 --- a/checkbox.go +++ b/checkbox.go @@ -32,7 +32,7 @@ func Checkbox(c *ui.Context, value *bool, label string, opts CheckboxOptions) *u wrap.Children(func() { row = ui.CheckboxBase(c, value).Gap(d.Unit() * 2).MinHeight(d.ControlHeight()).FocusRing(false) }) - if opts.Disabled && wrap.FocusWithin() { + if wrap.IsDisabled() && wrap.FocusWithin() { wrap.FocusRing(false).Focus() } if row.Changed() && opts.Indeterminate && !*value { diff --git a/docs/components/021-button.md b/docs/components/021-button.md index ec90fe8..e22d459 100644 --- a/docs/components/021-button.md +++ b/docs/components/021-button.md @@ -21,7 +21,7 @@ if mujica.Button(c, "Save", mujica.ButtonOptions{Icon: icons.Must("check")}).Cli | `label` | `string` | 必填(仅图标时可为空) | 按钮文字;为空时必须提供 `Label`,否则 panic。 | | `Variant` | `ButtonVariant` | `Primary` | `Primary`、`Secondary`、`Outline`、`Ghost`、`Danger`。 | | `Icon` | `*ui.SVG` | `nil` | 文字前的 16 DIP 图标。 | -| `Loading` | `bool` | `false` | 有图标时加载标记占用图标位置;纯文字时标记居中覆盖在隐藏的文字上,宽度不变;阻止点击。 | +| `Loading` | `bool` | `false` | 加载标记出现在前置 16 DIP 图标位置,文字保持可见;有图标时替换图标,纯文字时从左右内边距中让出该位置,宽度不变;阻止点击。 | | `Disabled` | `bool` | `false` | 不可点击、不进入 Tab 序列。 | | `Label` | `string` | `""` | 无障碍名称;`label` 为空时必填。 | diff --git a/docs/components/024-text-input.md b/docs/components/024-text-input.md index d363468..32d4e5f 100644 --- a/docs/components/024-text-input.md +++ b/docs/components/024-text-input.md @@ -32,7 +32,7 @@ if r.Submitted() { ## 状态 -默认(Surface 底、ControlBorder 边)、悬停(边框加深)、聚焦(边框 Focus 色;键盘聚焦另加焦点环)、只读(Background 底、Border 边)、错误、禁用。聚焦时被禁用会放弃焦点,已排队的按键不再修改值、不触发事件。颜色变化 120 毫秒过渡,减少动画时直接切换。 +默认(Surface 底、ControlBorder 边)、悬停(边框加深)、聚焦(边框 Focus 色;键盘聚焦另加焦点环)、只读(Background 底、Border 边)、错误、禁用。禁用来自自身或任一祖先容器;聚焦时被禁用会放弃焦点,已排队的按键不再修改值、不触发事件。颜色变化 120 毫秒过渡,减少动画时直接切换。 ## 事件 @@ -41,9 +41,10 @@ if r.Submitted() { ## 键盘操作 -Tab 聚焦(全选内容);Enter 提交;Escape 清空(仅 `Clearable` 且有内容时,否则交给外层);Cmd/Ctrl+Z、Shift+Cmd+Z 撤销重做;Cmd/Ctrl+A/C/X/V;输入法组合期间不提交。 +Tab 聚焦(全选内容);Enter 提交;Escape 清空(仅 `Clearable` 且有内容时,否则交给外层);Cmd/Ctrl+Z、Shift+Cmd+Z 撤销重做;Cmd/Ctrl+A/C/X/V;组合中的文本不会写入值。 ## 限制 +- 输入法组合期间无法阻止 Enter 提交:MyGo 不公开组合状态,组合文本存在未导出的 `editor.compose`(`ui/editor.go:73`),带编辑器的元素收不到 `InputCompose` 事件(`ui/input.go:689`)。公开接口也无法间接得知:`Element.TextCaret`(`ui/handler.go:82`)只是自绘控件声明输入位置的设置方法,`Tester.TextCaret` 返回的 `Active`(`ui/headless.go:370-373`)只表示可编辑元素持有键盘,不表示正在组合。各平台输入法在组合时通常自己消费 Enter。 - MyGo 没有公开的只读输入接口(只读模式仅用于 `Text.Selectable`,`editor.go:77`)。`ReadOnly` 通过让编辑器编辑一个副本并在同帧还原实现,撤销栈里可能出现被还原的步骤。 - 清空按钮不进入 Tab 序列(与 MyGo SearchField 相同),键盘用 Escape 清空。 diff --git a/docs/components/025-text-area.md b/docs/components/025-text-area.md index c4f1b51..1204c78 100644 --- a/docs/components/025-text-area.md +++ b/docs/components/025-text-area.md @@ -45,5 +45,5 @@ if r.Submitted() { ## 限制 - `MaxLength` 只提示,不截断输入,以免打断输入法组合与粘贴。 -- 输入法组合期间无法阻止提交快捷键:MyGo 不公开组合状态,组合文本存在未导出的 `editor.compose`(`ui/editor.go:73`),带编辑器的元素收不到 `InputCompose` 事件(`ui/input.go:689`)。各平台输入法在组合时通常自己消费 Enter;只有未被输入法消费的按键会触发提交。 +- 输入法组合期间无法阻止提交快捷键:MyGo 不公开组合状态,组合文本存在未导出的 `editor.compose`(`ui/editor.go:73`),带编辑器的元素收不到 `InputCompose` 事件(`ui/input.go:689`)。各平台输入法在组合时通常自己消费 Enter;只有未被输入法消费的按键会触发提交。公开接口也无法间接得知:`Element.TextCaret`(`ui/handler.go:82`)只是自绘控件声明输入位置的设置方法,`Tester.TextCaret` 返回的 `Active`(`ui/headless.go:370-373`)只表示可编辑元素持有键盘,不表示正在组合。 - 只读实现方式同 TextInput。 diff --git a/docs/components/026-number-input.md b/docs/components/026-number-input.md index 2c67ff0..17e1ec3 100644 --- a/docs/components/026-number-input.md +++ b/docs/components/026-number-input.md @@ -2,7 +2,7 @@ ## 用途 -输入与步进数值,支持范围、步长、精度与空值。合并 MyGo 的 Number input(输入模式)与 Stepper(`StepperOnly` 仅步进模式)。 +输入与步进数值,支持范围、步长、精度与空值。合并 MyGo 的 Number input(输入模式)与 Stepper(`StepperOnly` 仅步进模式);两种模式的步进计算都由组件完成。 ## 最小示例 @@ -26,7 +26,7 @@ if mujica.NumberInput(c, &copies, mujica.NumberInputOptions{Min: 1, Max: 99, Lab | `StepperOnly` | `bool` | `false` | 只显示数值与上下箭头,不可输入;必须给出 `Min < Max`,且不能与 `AllowEmpty` 同用。 | | `Placeholder` | `string` | `""` | 空值时的占位。 | | `Label` | `string` | `""` | 无障碍名称。 | -| `Disabled` | `bool` | `false` | 禁用。 | +| `Disabled` | `bool` | `false` | 禁用;任一祖先容器禁用时同样生效。 | | `Error` | `string` | `""` | 调用方给出的错误。 | ## 状态 @@ -39,11 +39,13 @@ if mujica.NumberInput(c, &copies, mujica.NumberInputOptions{Min: 1, Max: 99, Lab ## 键盘操作 -输入模式:Up/Down 按步长增减。仅步进模式:Up/Right 增加、Down/Left 减少、Home 到最小、End 到最大;按住箭头持续步进。 +步进沿以 `Min`(无界时为 0)为起点、`Step` 为间隔的网格移动,结果按精度取整,并停在范围内(范围先向内取到精度上,如 `Max` 0.29999999、步长 0.1 时最大值为 0.2)。不在网格上的值先吸附到相邻网格点。 + +输入模式:Up/Down 按步长增减。仅步进模式:Up/Right 增加、Down/Left 减少、Home 到 `Min`、End 到 `Max`(如 [0, 10] 步长 3 时 End 为 10,再 Down 为 9)。 ## 限制 - 输入模式下的加减按钮不进入 Tab 序列,键盘用 Up/Down。 -- 仅步进模式复用 MyGo `ui.Stepper`,箭头高度来自主题间距,不随密度的控件高度变化。 -- MyGo `ui.Stepper` 的箭头不检查禁用(`indicators.go:216`),禁用时组件向它传入副本,保证值不被修改。 -- MyGo 的步进器吸附依赖有限边界(`widgets.go` 中 `snap`),所以仅步进模式要求有界。 +- 仅步进模式不使用 MyGo `ui.Stepper`:它的箭头不检查禁用(`ui/indicators.go:216`),吸附固定按 9 位小数取整(`ui/widgets.go` 中 `snap`),步长 1e-10 时无法前进。组件自绘箭头并自行计算;按住箭头不会连续步进,需重复点击或使用方向键。 +- 仅步进模式要求有界,以便 Home/End 有目标值。 +- 仅步进模式的值通过无障碍描述朗读,MyGo 未公开为自定义元素设置数值范围的接口。 diff --git a/docs/components/028-search-input.md b/docs/components/028-search-input.md index afec587..c1d6ca8 100644 --- a/docs/components/028-search-input.md +++ b/docs/components/028-search-input.md @@ -48,5 +48,5 @@ if r.Moved() { ## 限制 - MyGo 单行编辑器把 Shift+Enter 当作普通提交且不公开修饰键(`editor.go:489`,`submitMods` 未导出),组件用 `HandleInput` 先截获 Shift+Enter。 -- 输入法组合期间无法阻止提交与匹配跳转:MyGo 不公开组合状态,组合文本存在未导出的 `editor.compose`(`ui/editor.go:73`),带编辑器的元素收不到 `InputCompose` 事件(`ui/input.go:689`)。各平台输入法在组合时通常自己消费 Enter;只有未被输入法消费的按键会触发提交或跳转。 +- 输入法组合期间无法阻止提交与匹配跳转:MyGo 不公开组合状态,组合文本存在未导出的 `editor.compose`(`ui/editor.go:73`),带编辑器的元素收不到 `InputCompose` 事件(`ui/input.go:689`)。各平台输入法在组合时通常自己消费 Enter;只有未被输入法消费的按键会触发提交或跳转。公开接口也无法间接得知:`Element.TextCaret`(`ui/handler.go:82`)只是自绘控件声明输入位置的设置方法,`Tester.TextCaret` 返回的 `Active`(`ui/headless.go:370-373`)只表示可编辑元素持有键盘,不表示正在组合。 - 没有“完成/关闭”按钮;是否显示查找栏由调用方决定。 diff --git a/docs/components/030-radio-group.md b/docs/components/030-radio-group.md index 85e7886..3f6c9b7 100644 --- a/docs/components/030-radio-group.md +++ b/docs/components/030-radio-group.md @@ -49,6 +49,6 @@ Tab 进入组并落在已选项;Up/Down/Left/Right 移动并直接选择,循 ## 限制 -- 每个选项以 `Value` 为键,选项重新排序后焦点仍跟随原来的值。 +- 每个选项按 `Value` 相等性取得稳定键(首次出现的序号),选项重新排序后焦点仍跟随原来的值;组件记住见过的值,长期不断变化的选项集合会让这份记录增长。 - 方向键对横向与纵向组都同时响应上下左右(MyGo `RadioGroup` 固定使用 `Horizontal|Vertical`)。 diff --git a/input_review2_test.go b/input_review2_test.go new file mode 100644 index 0000000..4544940 --- /dev/null +++ b/input_review2_test.go @@ -0,0 +1,177 @@ +package mujica + +import ( + "image/color" + "runtime" + "testing" + + "github.com/egoist/mygo/ui" + + "mujicaui/icons" + "mujicaui/theme" +) + +func TestInputsObeyDisabledAncestor(t *testing.T) { + text, area, num, find, cur := "", "", 5.0, "a", 0 + off, events := false, 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Gap(8).Disabled(off).Children(func() { + for _, r := range []InputResult{ + TextInput(c, &text, TextInputOptions{Label: "Text"}), + TextArea(c, &area, TextAreaOptions{Label: "Area", SubmitKey: ui.KeyEnter}), + NumberInput(c, &num, NumberInputOptions{Label: "Num"}), + } { + if r.Changed() || r.Submitted() { + events++ + } + } + if SearchInput(c, &find, SearchInputOptions{Label: "Find", Find: true, Matches: 3, Current: &cur}).Moved() { + events++ + } + }) + }, 400, 500) + next := func() { + if runtime.GOOS == "darwin" { + tt.Key(ui.Cmd, ui.KeyG) + } else { + tt.Key(0, ui.KeyF3) + } + } + for _, name := range []string{"Text", "Area", "Num"} { + _ = tt.Click(name) + events = 0 + off = true + tt.Type("x") + tt.Key(0, ui.KeyEnter) + tt.Key(0, ui.KeyUp) + next() + if events != 0 { + t.Errorf("%s: %d events under a disabled ancestor", name, events) + } + off = false + tt.Frame() + } + if text != "" || area != "" || num != 5 || cur != 0 { + t.Fatalf("values changed: %q %q %v current %d", text, area, num, cur) + } +} + +// buttonLabelInk counts pixels in the label's box that differ from its first pixel. +func buttonLabelInk(tt *ui.Tester, label string) int { + r, _ := tt.Find(label) + img := tt.Image() + bg := img.At(int(r.X), int(r.Y)) + n := 0 + for y := int(r.Y); y < int(r.Y+r.H); y++ { + for x := int(r.X); x < int(r.X+r.W); x++ { + if !sameColor(img.At(x, y), bg) { + n++ + } + } + } + return n +} + +func sameColor(a, b color.Color) bool { + r1, g1, b1, a1 := a.RGBA() + r2, g2, b2, a2 := b.RGBA() + return r1 == r2 && g1 == g2 && b1 == b2 && a1 == a2 +} + +func TestButtonLoadingKeepsLabelAndWidth(t *testing.T) { + for _, d := range []theme.Density{theme.Compact, theme.Default, theme.Comfortable} { + for _, icon := range []*ui.SVG{nil, icons.Must("check")} { + loading := false + var w float32 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Density: d}) + ui.Row(c).Children(func() { + w = Button(c, "Save", ButtonOptions{Icon: icon, Loading: loading}).Bounds().W + }) + }, 300, 200) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + tt.Frame() + before := w + loading = true + tt.Frame() + tt.Frame() + if w != before { + t.Errorf("%v icon %v: width %v -> %v", d, icon != nil, before, w) + } + // The spinner sits beside the label, never over it, and the label has ink. + sp, _ := tt.Find("Loading") + lb, _ := tt.Find("Save") + if sp.X+sp.W > lb.X || buttonLabelInk(tt, "Save") == 0 { + t.Errorf("%v icon %v: label hidden while loading (spinner %v, label %v)", d, icon != nil, sp, lb) + } + } + } +} + +func numberInputStepTester(v *float64, opts NumberInputOptions) *ui.Tester { + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + NumberInput(c, v, opts) + }, 400, 200) + tt.Key(0, ui.KeyTab) + return tt +} + +func TestNumberInputStepGrid(t *testing.T) { + for _, stepper := range []bool{false, true} { + v := 0.2 + tt := numberInputStepTester(&v, NumberInputOptions{Min: 0, Max: 0.29999999, Step: 0.1, StepperOnly: stepper}) + tt.Key(0, ui.KeyUp) + if v != 0.2 { + t.Errorf("stepper %v: Up past Max 0.29999999 gave %v", stepper, v) + } + v = 0 + tt = numberInputStepTester(&v, NumberInputOptions{Min: -1, Max: 1, Step: 1e-10, StepperOnly: stepper}) + tt.Key(0, ui.KeyUp) + if v != 1e-10 { + t.Errorf("stepper %v: Up by 1e-10 from 0 gave %v", stepper, v) + } + } + v := 0.0 + tt := numberInputStepTester(&v, NumberInputOptions{Min: 0, Max: 10, Step: 3, StepperOnly: true}) + var got []float64 + for _, k := range []ui.Key{ui.KeyUp, ui.KeyEnd, ui.KeyDown, ui.KeyHome, ui.KeyDown} { + tt.Key(0, k) + got = append(got, v) + } + want := []float64{3, 10, 9, 0, 0} + for i := range want { + if got[i] != want[i] { + t.Fatalf("stepper [0,10] by 3: got %v, want %v", got, want) + } + } +} + +// radioSameName prints the same for every value, as fmt keys would see it. +type radioSameName struct{ id int } + +func (radioSameName) String() string { return "same" } + +func TestRadioGroupKeysByEquality(t *testing.T) { + v := radioSameName{0} + items := []RadioItem[radioSameName]{{Value: radioSameName{1}, Label: "One"}, {Value: radioSameName{2}, Label: "Two"}} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + RadioGroup(c, &v, items, RadioGroupOptions{}) + }, 300, 200) + _ = tt.Click("Two") + if v.id != 2 { + t.Fatalf("click chose %v", v) + } + tt.Key(0, ui.KeyUp) + if v.id != 1 { + t.Fatalf("Up chose %v", v) + } + items[0], items[1] = items[1], items[0] + tt.Frame() + tt.Key(0, ui.KeySpace) + if v.id != 1 || !tt.Focused("One") { + t.Fatalf("after reorder chose %v, One focused %v", v, tt.Focused("One")) + } +} diff --git a/number_input.go b/number_input.go index efed56a..d3d3d1d 100644 --- a/number_input.go +++ b/number_input.go @@ -50,9 +50,34 @@ func (s numberInputSpec) format(v float64) string { // clamp rounds v to the precision, then bounds it; the bounds sit on that grid. func (s numberInputSpec) clamp(v float64) float64 { p := math.Pow(10, float64(s.decimals)) - return math.Max(s.lo, math.Min(s.hi, math.Round(v*p)/p)) + return math.Max(s.lo, math.Min(s.hi, math.Round(v*p)/p)) + 0 // + 0 turns -0 into 0 } +// stepBy moves v n steps along the grid of Step from Min, stopping at the bounds. +func (s numberInputSpec) stepBy(v float64, n int) float64 { + if math.IsNaN(v) { + // From empty, the first step lands next to zero. + v = s.clamp(0) + } + base := s.lo + if math.IsInf(base, 0) { + base = 0 + } + k := (v - base) / s.step + if n > 0 { + k = numberInputFloor(k) + float64(n) + } else { + k = numberInputCeil(k) + float64(n) + } + return s.clamp(base + k*s.step) +} + +// numberInputFloor floors x, forgiving floating-point error just below an integer. +func numberInputFloor(x float64) float64 { return math.Floor(x + math.Max(1e-9, 1e-12*math.Abs(x))) } + +// numberInputCeil ceils x, forgiving floating-point error just above an integer. +func numberInputCeil(x float64) float64 { return math.Ceil(x - math.Max(1e-9, 1e-12*math.Abs(x))) } + // numberInputSame reports equal values, counting NaN (empty) as equal. func numberInputSame(a, b float64) bool { return a == b || math.IsNaN(a) && math.IsNaN(b) } @@ -80,8 +105,8 @@ func numberInputResolve(opts NumberInputOptions) numberInputSpec { } // Bounds move inward onto the precision grid, so clamped values keep both. p := math.Pow(10, float64(s.decimals)) - s.lo = math.Ceil(math.Round(s.lo*p*1e6)/1e6) / p - s.hi = math.Floor(math.Round(s.hi*p*1e6)/1e6) / p + s.lo = numberInputCeil(s.lo*p)/p + 0 // + 0 turns -0 into 0 + s.hi = numberInputFloor(s.hi*p)/p + 0 if s.lo > s.hi { panic("mujica: NumberInput has no value in range at this precision") } @@ -113,13 +138,7 @@ func NumberInput(c *ui.Context, value *float64, opts NumberInputOptions) InputRe r.changed = true } } - stepBy := func(n float64) { - base := *value - if math.IsNaN(base) { - base = math.Max(s.lo, math.Min(s.hi, 0)) - } - set(base + n*s.step) - } + stepBy := func(n int) { set(s.stepBy(*value, n)) } look := &textInputLook{disabled: opts.Disabled, err: opts.Error} r.Element, r.Input = textInputFrame(c, look, func(frame *ui.Element) *ui.Element { text := ui.Local(frame, "text", func() string { return s.format(*value) }) @@ -129,13 +148,13 @@ func NumberInput(c *ui.Context, value *float64, opts NumberInputOptions) InputRe // Set from outside: the text follows, and a typing error goes. *text, *invalid = s.format(*value), "" } - in := textInputEditor(c, frame, text, opts.Disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 12). + in := textInputEditor(c, frame, text, look.disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 12). Placeholder(opts.Placeholder).Label(opts.Label) - if in.Changed() && !opts.Disabled { + if in.Changed() && !look.disabled { *invalid = numberInputParse(c, s, *text, opts.AllowEmpty, set) } switch { - case opts.Disabled: + case look.disabled: case in.Shortcut(0, ui.KeyUp): stepBy(1) *text, *invalid = s.format(*value), "" @@ -151,7 +170,7 @@ func NumberInput(c *ui.Context, value *float64, opts NumberInputOptions) InputRe for _, b := range []struct { name string icon string - delta float64 + delta int can bool }{ {msg(c, "number_input.decrease"), "minus", -1, math.IsNaN(*value) || *value > s.lo}, @@ -209,37 +228,78 @@ func numberInputButton(c *ui.Context, icon, name string, can bool) bool { return b.Clicked() } -// numberInputStepper shows the value beside MyGo's stepper, restyled. +// numberInputStepper shows the value beside up and down arrows; it steps itself. func numberInputStepper(c *ui.Context, value *float64, s numberInputSpec, opts NumberInputOptions) InputResult { k := Tokens(c) d := Density(c) var r InputResult r.Element = ui.Column(c).Gap(d.Unit()).Shrink(0).Disabled(opts.Disabled) + disabled := r.Element.IsDisabled() + set := func(v float64) { + if v != *value && !disabled { + *value = v + r.changed = true + } + } r.Element.Children(func() { ui.Row(c).Gap(d.Unit() * 2).MinHeight(d.ControlHeight()).Children(func() { ui.Text(c, s.format(*value)).FontFeatures("tnum").MinWidth(d.Unit() * 8).TextAlign(ui.End) - // MyGo's stepper arrows ignore Disabled: give them a copy. - target := value - if opts.Disabled { - held := *value - target = &held - } - st := ui.Stepper(c, target, s.lo, s.hi, s.step).Label(opts.Label).Width(d.Unit()*6). - Radius(theme.ControlRadius).Background(k.Surface).Border(theme.BorderWidth, k.ControlBorder) + border := k.ControlBorder if opts.Error != "" { - st.Error(opts.Error).Border(theme.BorderWidth, k.Danger) + border = k.Danger } + st := ui.Column(c).Focusable().Shrink(0).Width(d.Unit()*6).Radius(theme.ControlRadius).Clip(). + Background(k.Surface).Border(theme.BorderWidth, border).Role(ui.RoleStepper).Label(opts.Label). + Description(s.format(*value)).Error(opts.Error) internal.Ring(st, k.Focus, theme.ControlRadius) + switch { + case st.Shortcut(0, ui.KeyUp), st.Shortcut(0, ui.KeyRight): + set(s.stepBy(*value, 1)) + case st.Shortcut(0, ui.KeyDown), st.Shortcut(0, ui.KeyLeft): + set(s.stepBy(*value, -1)) + case st.Shortcut(0, ui.KeyHome): + set(s.lo) + case st.Shortcut(0, ui.KeyEnd): + set(s.hi) + } + st.Children(func() { + if numberInputArrow(c, "chevron-up", *value < s.hi, false) { + set(s.stepBy(*value, 1)) + st.Focus() + } + if numberInputArrow(c, "chevron-down", *value > s.lo, true) { + set(s.stepBy(*value, -1)) + st.Focus() + } + }) r.Input = st - r.changed = st.Changed() && !opts.Disabled }) if opts.Error != "" { - ui.Text(c, opts.Error).TextColor(k.Danger).FontSize(theme.CaptionSize) + ui.Text(c, opts.Error).TextColor(k.Danger).FontSize(FontSize(c, theme.CaptionSize)) } }) if r.changed { - *value = s.clamp(*value) slog.Debug("mujica: number_input step", "value", *value) } return r } + +// numberInputArrow builds one half of the stepper and reports a click. +func numberInputArrow(c *ui.Context, icon string, can, lower bool) bool { + k := Tokens(c) + h := Density(c).ControlHeight()/2 - theme.BorderWidth + a := ui.Box(c).Height(h).Center().Role(ui.RoleNone).Cursor(ui.CursorPointer).Disabled(!can) + if lower { + a.BorderWidth(theme.BorderWidth, 0, 0, 0).BorderColor(k.Border) + } + fg := k.TextMuted + if a.Pressed() { + a.Background(k.Selection) + fg = k.Text + } else if a.Hovered() { + a.Background(k.SurfaceHover) + fg = k.Text + } + a.Children(func() { ui.Icon(c, icons.Must(icon)).Size(12, 12).TextColor(fg) }) + return a.Clicked() +} diff --git a/password_input.go b/password_input.go index 4c025c1..f71816c 100644 --- a/password_input.go +++ b/password_input.go @@ -36,14 +36,14 @@ func PasswordInput(c *ui.Context, value *string, opts PasswordInputOptions) Inpu mode = "shown" } ui.Row(c).Key(mode).Grow(1).Children(func() { - in = textInputEditor(c, frame, value, opts.Disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 10). + in = textInputEditor(c, frame, value, look.disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 10). Placeholder(opts.Placeholder).Label(opts.Label) if !*shown { in.Password() } }) - r.changed = in.Changed() && !opts.Disabled - r.submitted = in.Submitted() && !opts.Disabled + r.changed = in.Changed() && !look.disabled + r.submitted = in.Submitted() && !look.disabled if passwordInputToggle(c, *shown) { *shown = !*shown slog.Debug("mujica: password_input reveal", "shown", *shown) diff --git a/radio_group.go b/radio_group.go index b0ac1a8..9f6b11c 100644 --- a/radio_group.go +++ b/radio_group.go @@ -2,6 +2,7 @@ package mujica import ( "log/slog" + "slices" "github.com/egoist/mygo/ui" @@ -45,10 +46,17 @@ func RadioGroup[T comparable](c *ui.Context, value *T, items []RadioItem[T], opt var r InputResult // Disabled on a wrapper blocks the bases' clicks before they choose. wrap := ui.Box(c).Shrink(0).Disabled(opts.Disabled) + // Keys by first appearance of each value: fmt keys would merge equal-looking values. + known := ui.Local(wrap, "values", func() []T { return nil }) wrap.Children(func() { r.Element = ui.RadioGroup(c, func() { for _, it := range items { - if radioGroupItem(c, k, d, value, it) { + key := slices.Index(*known, it.Value) + if key < 0 { + key = len(*known) + *known = append(*known, it.Value) + } + if radioGroupItem(c, k, d, value, it, key) { r.changed = true slog.Debug("mujica: radio_group choose", "label", it.Label) } @@ -58,21 +66,21 @@ func RadioGroup[T comparable](c *ui.Context, value *T, items []RadioItem[T], opt if opts.Horizontal { r.Element.Row().Gap(d.Unit() * 6) } - if opts.Disabled && wrap.FocusWithin() { + if wrap.IsDisabled() && wrap.FocusWithin() { wrap.FocusRing(false).Focus() } return r } // radioGroupItem builds one radio and reports whether it was chosen. -func radioGroupItem[T comparable](c *ui.Context, k theme.Tokens, d theme.Density, value *T, it RadioItem[T]) bool { +func radioGroupItem[T comparable](c *ui.Context, k theme.Tokens, d theme.Density, value *T, it RadioItem[T], key int) bool { // Keyed by value so focus follows the item, not its position. var row *ui.Element - item := ui.Box(c).Key(it.Value).Disabled(it.Disabled) + item := ui.Box(c).Key(key).Disabled(it.Disabled) item.Children(func() { row = ui.RadioBase(c, value, it.Value).Gap(d.Unit() * 2).MinHeight(d.ControlHeight()).FocusRing(false) }) - if it.Disabled && item.FocusWithin() { + if item.IsDisabled() && item.FocusWithin() { item.FocusRing(false).Focus() } on := *value == it.Value diff --git a/search_input.go b/search_input.go index 176b042..ead6c59 100644 --- a/search_input.go +++ b/search_input.go @@ -59,8 +59,9 @@ func SearchInput(c *ui.Context, query *string, opts SearchInputOptions) SearchIn name = place } var r SearchInputResult + look := &textInputLook{disabled: opts.Disabled} step := func(d int) { - if opts.Matches == 0 || opts.Disabled { + if opts.Matches == 0 || look.disabled { return } *opts.Current = (*opts.Current + d + opts.Matches) % opts.Matches @@ -69,7 +70,10 @@ func SearchInput(c *ui.Context, query *string, opts SearchInputOptions) SearchIn } if opts.Find { *opts.Current = max(0, min(*opts.Current, opts.Matches-1)) - if !opts.Disabled { + } + r.Element, r.Input = textInputFrame(c, look, func(frame *ui.Element) *ui.Element { + if opts.Find { + // Built inside the frame, where step knows of disabled ancestors. mac := runtime.GOOS == "darwin" switch { case mac && c.Shortcut(ui.Cmd, ui.KeyG), !mac && c.Shortcut(0, ui.KeyF3): @@ -78,13 +82,10 @@ func SearchInput(c *ui.Context, query *string, opts SearchInputOptions) SearchIn step(-1) } } - } - look := &textInputLook{disabled: opts.Disabled} - r.Element, r.Input = textInputFrame(c, look, func(frame *ui.Element) *ui.Element { ui.Icon(c, icons.Must("search")).Size(16, 16).Shrink(0).TextColor(k.TextMuted) back := ui.Local(frame, "back", func() bool { return false }) - in := textInputEditor(c, frame, query, opts.Disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 10).Placeholder(place).Label(name) - r.changed = in.Changed() && !opts.Disabled + in := textInputEditor(c, frame, query, look.disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 10).Placeholder(place).Label(name) + r.changed = in.Changed() && !look.disabled if opts.Find { // Shift+Enter would reach the editor as a plain submit. in.HandleInput(func(ev ui.InputEvent) bool { @@ -102,9 +103,9 @@ func SearchInput(c *ui.Context, query *string, opts SearchInputOptions) SearchIn step(1) } } else { - r.submitted = in.Submitted() && !opts.Disabled + r.submitted = in.Submitted() && !look.disabled } - if *query != "" && !opts.Disabled && textInputClear(c, in) { + if *query != "" && !look.disabled && textInputClear(c, in) { *query = "" r.changed = true slog.Debug("mujica: search_input clear") diff --git a/testdata/snapshots/darwin/button-comfortable-dark.png b/testdata/snapshots/darwin/button-comfortable-dark.png index afce442a4038da3cb842dcc7613e5ae749623c9f..309ee1791da4f05d05edda3d144d4e81f41de5db 100644 GIT binary patch delta 3965 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 X4u;d*n-Wv^00000NkvXXu0mjfZ`Jph delta 3105 zcmV++4Bqp-SN~9uBLXN!u_c5Ve~W3Wj^hCSKlE}6JsfChpNH&;@o7}mCLwvl+jUc9W9);v=pdm z%fDmBOEWvOa=zdHvYhkdw1j_h^5OSCq<OIc#fgY;A7fv3CXCyCSm@ z#qYO=X$=4aU;r#ifXxbCAxXZQ7=TF-!VsoVA~P%aZ151(d1gzKN5uDrkQxz*3ns$L|P$0WbgtzyKHk1K@uKSjlrbvq8yo zw16N8f*^U2{O%ovYua3nqT+vSR}^@4 zX`9Qzt4e4gpK_|F`&3UiJ$u4DS7&Lo*3q-S$R{74e&xi=^z2b;ELG>up4nY(rUi7s z=z!4yqXW*L4mjQNs7QlQ==0rfn{3Do5*A`diaDNB}q-g*4w+}r{!KNjZ^`{w3m?}dxBu$77mt;^}?y>M~TGfis%7ytuc0Q_tN%qrMe zG?p}uryip%L>S(XsedGyGaUw==_2!bI0p8Nw?U9K_KR6cOuUs~`d&k5PCZ>dIY z?{fM)-W!*$?j(cPqEY{Bvca00_IXAo4xM<(dZ5`oIGRXoI*z;CgQNF`#@Ir|K6_i4 zUdu2{VBz7dUkB2w0(F0TtyT3kh03BxC_Hu7oo=0z&1*4dKju_dXu?8hdfYR9YnXnw zt;poErWabujrxLuf<@olo!_pZQ1D$dY*4-PB*>`!_do#{a|bNJ8xJUYJIcw0|Pf{832C+U;qq&pLu{&`c^T7 z7*o$LGX`(hSI)|->Mewj9cFN5L?f${!{fG&7L`^VSX|;tiqj8<_aAE4n+@)vF@|9* zjdceOzu4c~XS7r{weJu515=}Jo!MaPXbJiQ{@Hm#h+(%Wv@F~oo2)SDo7(rS#bQ%; z-SnFfhGE)VjtYO1er9rdV|~L^Tg~ys{TKR*OH0~aj?Ilt?}UddEvdED(^up{3=`*5iZJL*EbM@%Y8QUn(n&Z@+)_Dt#va41fVJ0Dk5H#z>E# ze<}S7M__S@)`&`@4hx~-ftwra8@?%T`mwPPT)BSf>dd|S@wNE$xaaU|N6U1YG{CXd zXn${CY&FUjDqL@N?QW>u4sdZPUt!X_2ghz-zD5X%gu?av_mrqrMoXncD!J0vKkrRK zWk2RDH|l@ri*l7e*t^%5w$3vS;P1KE1`HT5HrKeJkN}}v4P=m%4vhe7s5EJvwn=NZ zRg@k4Jx92iqu$I(e$!>2!Vjm9IT_@W9yE zcuDcjs><@ezjyK{Kl?2q5+X#<}yu6h-~<$eVi`Yn49+ zfB`T72Ebbz;P54HOba@i%l4&#f1KTxE$En3t>VgaoKld}Hf!BkR{ZP>pIw|?u->%H z-jIK9?QuDr>6yC9CUZ)vR-Gh&TS+sFJerWjxrJ~`Ip`1A=WV&Bg7wYP41-?orsn57 z-PJ}22|qU@J4>g}Si1PJU3_k;g5f<97V2uzyI3LmBPct!DrjtZm-dh zZ7}HPt+w{|XWlw|v~;)JeK~#R19=1?r%r#r9|gE{cd^IgJ$HVX5E2T7PM`Sz00UqE z41nVX;Bed7=k`Qz!XktuYg7Ebm8ijee?77NZo-NQeU5<;;#_nn1vy9lHDtFg7CdRn zHRTr;o1Q2w9yorsyuNBreO168a99`pzLiWvmNJ}3lB7H&k|{ z=XS;GTedIx++LcYMM+df$xl=sCRWr`R}>b?KO_F#;Wv~Td3yie@Vaaq$181ZL6Rc> z6;&#h<0JLeF?W1^0>A(m00ZEy4lp5Py}o%*6qeRjOpIK%-kM$i+oWwA#=^Xks&X#K zxt%VCU3&-hxkkIyc57lvrB*d{wi7Y8$^e7XHC;mNDDqaJn2$V?nM?pXqWqoWM6ZG^2Y!$00zJSI8FeLrmSz>QxqYkbx#pOq6TljOv})f)m5@8R-bFgGG>P) z=|4UF>#y=@hWSKC3nAq4&?Qk6(lXNgK0g->`aC|JKC|3h8Sn?n>ME7ta%$7G`##+| zH$78OWJ*cZUb*^T<&2yzyVHN;bnmIJW>qSm$GfYlJXM$8`{(2H)0UFTvZjt_rp6}H zGIblS<`FN+^Zdpq?iXscy1lJseEj-H7uF{2{LsaH%?)q<>WIZM|J5&lo}n3!*Zbm^ zo>$J3zV`>e_=V5>=B?NN^zM5_MW)V+In|Y2OIx|2Bx$@y9ugg*C13hcth~R5hD-lQf4G_MGfzS+=pE=G8;5PfSd`_`>JD^^KPX&t35ORs=zA+K-Hk{oguy=p}>*!rG7M5C}v<1(j#qoI7Y*^&iiQdUv;=A9M6OX10IS2XTf8S!{ zVoswLcwznb!7;(GEX~k-F!l>eb&`hXxb>Z;`sP;-zw;O6C=MbyIfN+s@1OrRYsqNS@>Gu5MV2 z+zJ%r?r|oPq98Je8(pMvfnaP2u`c}nKx|0~m&>g@L<<@%Xtbcwf{y1FH1v(?i$o%k z$aqN_?^WEqSCbJdX@58#0H*G$BtlS|I*ecr?>&bA7ytuc01SXP23R6-xgXBsdDV$I zIh#9&q9joiu)YIpilRhGdZ3{I7ytv{Z47Wg6z(@<8^!~^>cpI!&7H$#w|7ULK{-nB zkb|NqQ=W0z?Ntic4GFs;VK<~i-3`eS@R*X)H4H-&YTIA#QADd3wEL1SqZ6NMuG6Ka(DbH#YK-d?C28619Uh%f3fK=A`vGG=;6&XI7=b__5D3JB2aU;C vn+%hoDu@E!Jd^P%vXkH{YZ|;c0RMjgSIG0$qfEoo00000NkvXXu0mjfSN18H diff --git a/testdata/snapshots/darwin/button-comfortable-light.png b/testdata/snapshots/darwin/button-comfortable-light.png index 0980b9b871f193f749652e0dfd57962a7ef0b478..492caf4bddac73f2c7be0a2f9d1cabab61b95007 100644 GIT binary patch delta 4025 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 KVVOEC;{O2j>91J; delta 3239 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 diff --git a/testdata/snapshots/darwin/button-compact-dark.png b/testdata/snapshots/darwin/button-compact-dark.png index e0868f369261fd49bde96f3c2ba348f544d6e6e4..a78d663d215db19daca93a0c7b344ce330de1844 100644 GIT binary patch literal 11092 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 literal 10243 zcmeHtWl$Z>w)Vyyb^-*~kl-35KyY`0!^Ryp?(PuWU4y&3I|PT|4#8pL?jPsWJ@0vc zp6|!4x>fhqS~b(v)3WBNUTdCSJt6Y4Vras*0z3i)v8C5ii!q>oEOra z>nva>a8`tck?Db?ZMg1BEKJRNL;5E>=jWVCbs{{7qW|+p=4Vh$!{N00Zc;kS3Ba#r!Wxt?KJvr;3PgF|pr%rAtTe;tQnyrrRCl=Ik zIQCD{N_aCao1T=jH_YSn>fCG-kC*~Fh-Jk5TbeE+v~wQR)7xW@^-Ji491Q}QPj2!I*Fu0#ucwaS3rfio|p>4QxrNaC#lRY zb7d4~7#q<>hy3(?wst#3=xzFmCTf zWo!FB>+PNyemFQ$%b0X{eeq|=-kbJLciI-@v=NnGi1G!U!#}uae#LgFhhzl(sT#lp zfO*q1M8NK!!vknt0Q^660#F98Y|RMx*Aj(r`Uq)I@g~^)VP*#WR~rEQ1}6O1yg>cp zfU;jfM*3BJsKo4D)hK(PQJTkTS=gutUg_N%NyAekE_cGh>w=q!` zA?nP;=FJC?KLnL)&b%Mt*G3S{E^$yekdx@Pq%pi@t}ez*Xzuk%flculUYCJ5m<=Ca zw(Cqx-9G7*VUL(mI_--Rk4ei6j0BF449kX`S4$`uo!{IK62H53IArPB6((PE4YZUB zzfEhtnOqSRS#bneeb!0!R$C$3?lZ7QQT}KV+WqQ$KQIgFPj4b{>U}v45W~^=-GiW$ z0Yv1bkT7!O zKOIW8rBcOGV30M~@>sjo3=9I*Yb-ywp3XKj-l~9SRZ9Irp^+$Cp@oZ)RsO{*Gtmx|5jf1=YI`-=6 zeejzNzIS()Xu`_H?mA+n=iyl)}-3<)e^HW)^o}!**k{XPEIl+s#!oO+(JM8v)=kNW4VxTAe&1;vuyM^ z84Se5=x?XBb@UTNJi(UNs*aT^_-tBhS2T#esC^J-vM#OSoI1<`ZjW6Nl;n?n#e8E(Hcf8x+@yv&9tP58q3V-JgY0u?R0bp zt~ixu^-C)#^8nzT;#Gz?J`A9g;^GAVN^+mB{FD4I0jW45e-Be9_U~zm+@U4kFnh2C zZTp9=7EDx(+Rg(N=s-@}85I{??ukhet+mn9DpwO(AE$}!kE^A+XPO!n7v|eh5IWz`7`lBSQ@iWR&1LUCIjfL?+aQ+d zX;xFptwZrGF~zGK`8mPNaQLQwB-fL2x_D-IZr5A8xoa~w@)H66bHohWyEQK$>}*{< z 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 Z+^i>Se1&J~?feBGAtEbWA*k#3{{S7d+}{8I diff --git a/testdata/snapshots/darwin/button-compact-light.png b/testdata/snapshots/darwin/button-compact-light.png index 8afc2baa0cf4af69efc573b3e31dac2d3bff98e1..0ea1a55291ff5b25bdf90fa62e46e005d2125779 100644 GIT binary patch literal 10715 zcmeHtWl&ws((cCH-GYQbu;36}f+V=x#@*dLxDz0_ySoQ>ch^mDcYEG!hY zmlzZ@gLO4^VqraX!gc-nbp_UpiSOrsBvB|Of25In3D~n5YCQhXCFXhzXEKc(Y@A_!CTt6TmE5&(wf|7&VSuA!tIn$R--fFE&Q=+qck zRehay_$j{CI4P{}iEAHNs5&suT^Vhg@*ix!7pAXmZnpcFswAvk5V zC0!e|&YT#GiB4&}LgTQ=&ce@ecboV6Or)vWuo7bk{sKWhrmScHdp!P*b z!y|MvYNO?8v5nmcrOv)rITn+u7VnjnxEA`-(*1E^N-(R{TLk}- zDF5E=?8y-mVFAon`p`V429T?=Q;Yb}S_c#pz(6kCeJaAUINh)wYAWQGoc21($S6xP zd}8JiU=(MM?Zh})dr07A@oUoGH~C$Idts6|)4bWXkE)G?@5)Zk;ne=~?A7sOF=Gep zA88YwMh8aMT#0%cP|_x#Vs^yIs?y>5`Qq))m%sbIz*u<#oiB^Oc`-m?n|jfZz>;I_ zkIfNUcMzuI?E8MCW6@~SwN54gYWH8X4&zT0WeWdKY`T%^%Ps*3{h|JgTFL=!{O3Jb z)uxAafPYl~$46xF%XY%e^^5N=bibo;k756-~N{F2#7g<*6NccfO^cWwX&5>8eWOC<&^ZA|nu2$xuPl(t2 zL3)~V?9*+hnqWxaZ40w{T|Xfmp9^*Ord~kC9&Y=OYI4(!(Ueho;=k)E!m4l_T zh|`2El9y?+@AqfVzjQRcV)z*3auwU!Sw9~2Em2^X`bJ;2$5O?rT^9{>zIyJ4sXUXh zl+WXtu}@BDnz9pKamb5cB9f(8tIXq*@qRD%h#<#b_kBLhxLdPwLb>9o9xa%ggQ8G2 z$d_0fx3Q3ck|!pTqH61$a!v2xeQgpc?1|-;W(l0!svBWJ6}CeE1P8^Ib)nO{Qppu4 zmEWQhwTv|`&~4Jkar}i3uZ5I2T~k>lg0@90cW&A6ds*J9Y15Vk1}2ai@Ubk8+ba9M z>s>d%KQA)%NP4jk)ze++AZQ7p>*d4^#k1YCdG&H9C3B;O;b8daR~-5Ly8uCJTlX8%IsQ<>x67bn^&tYg@zsRQvorNo>Vbse-EHZ= zq|G&73ijiKn!0ZJrOx0XE4i7897o~n9_CkVn_D`S=aLK7>>M_nC>bx=v>X zC3fV~?a|%U&?{x!SF@?CY#yV@UAhF{r>mu7OONDFS0G<*Ns8{G*3{G$2DOS-S5EfN z)DO|zx_#A%gwca=C`lRoSIxS1Vc`~h_kMZ^@P_E!P%nB!kYfgmp_qd`Jef2ONcZ=? zwtMRjd;vW2nfwA~lWxE!2u+;(npb`z1A7zM`RhVZOD^3fW;Kl*d9lmI*nKr)0$68D zFZXjT-sA2gF!!FgrkhszE$HYzu3wvwIB2Wa%2+xBfVD0;Pm; zu=>5w(d}_0oS$CRB-8d&#FLy4ca2ljjW4lZ^{TczZ=Y>rF!kUEc@GlP=}YK#>dd_J z(QJehb!}`cYSce%H3qS{a(%e=wXsT-YpjoLqbG3uLfN{n9`6f)88_SVmCGv5pXMs& z5S$~v}yTmAy>f_hyo7*%g{bfc~d%uODO zaYFuVIMwSj1OUv~p`(!f>_xj$H$B+1URQMZgX|kG9UsGbHq>!GSDM+Wq?_SNb221r z@a1Vho(KVO_-EmDp!0sUhntqWIAaJ`jOwaj*1>6Od zrJ5jqpUPiN4bWXl_z5#JC&ZjuE{W^E@9=8-p)0lNkpIvs{~k?m1^{}6iGYlG3I^pP z+Ca5jb;AWaZ9VUw(BWTTcnm2c@+2D76jf%I+q#nUTroxF*Vfb#DZE}aQo+~$G7S=9sH6c z)ErC5V|~hJM<(cfdNXCpI|-;aeX*M(2g0MhV{zC$WV+-C(p8Mq{KRz+h z=Do6@`r>lQ5<7Jx=u?Z%+l&anj3*4G)qjQF&L2@};l%*XEiB9*C0afsPOB`YaPWQ; zvp<-Dsr|kbmdxAbyEGNLv@O{YG&G~5t8))19m^TDh{Yl2R{N4}5IML$p9Ex^tQK-g(JE48U z2M{JDK>~!4#-&}Zgi<579t!gcQ8i4(S3mxybXOby{Jrico)a~hQ3QH+1CWu7wu213 zX?2`8d(5D@oF*;ddR5ClL3hBqSHK)BRj5$PU)s-uSH(>0JB(YW*Y=e-GMpBaIALA8 zc1jwqK)8FL-NQL=pdf}7#DpF81zMqB1RW7ORR6Sr5LE>}`h&d(<7aHFaG55;C}U(e zS6Dw0YQ&;BcQ&K|iYG0+U}Qc51xm#DMl`cXIEm=VoY~749}7mBVB{Tw>w;Za{>%x- z7=S)8SJJ>S$)Op0x+Xh~-Z6Fw!T?aP0-l_31WfR_v{K z2x4ipFT}wK@t8GSy@%ggVP)V?uYJtd1OT#Ru%{_KUzU&3j?*GY;NIi=o|6!1IsaaL ztF5|=tFqYwCo=srp9Gq3aI1KeDPc4R7**u@;-$Oh6!l>j&dnmb_NJyj^txy;ib%(~ z&3vs%2iRnt{I$Qd^ku01MM6O#N4NU*X6o#w^To73%wSnVmnw_RW0l*5p0Mb2xf48A zT@*_OrUB$wEqxkOub^XMYIDD;6IHB#oI;ZWaiaE>tG#^oc^Z-f-JSBVzrh+7u>Ofr zN}BKL+{=!fFR4ncy!qmxkH@QNy2PGv-mAGtXv zV(q@d3#M`9Z}e8SZ~m;=2HvRSqiIy13eN`sIM7eFP8XiicvHT0HQg-x6XC3OMZtk< z1_FHa7&(25OfGq{XuWE;TZbmKuDWZd&&gJ>DFGA}W(T{mAlE;FZGx$K${O^j@g^5S zD|V}GnG$~x0I(nWA-vZKd<1px6WT^^&L5i4qR&AvBt6d7Rw^fHAgRr`PALO5i=Y{- z<%YXTgS7bTJ|m%8B3ZaLbd1d=UJlO3)loEe-Dy*MA>vpk_fy*Iavo#)jHiQ$Fm>hX z>NT|%W+r3d?7T0u(zCCv>OAVn)kBdU^eTz!AES|R;D>{t*wP2e%1g`3OX`3XY6;(T zH7d$Wznr=f1BnO;WDja;ejAYleZV%ivK&!KnKZB}!;8*bkch6Lq6M+e+~UBGvOq-q z2MtT;_a+Ba^0jtIup-R-0(vC~)zXKy`W~B_8fFU?EOw=6vLjdHXiltDtaQ4)~zU;Ar`9yD)DiF)s`P&p_C5huvGRImSHaRBQ)(QhUv_+S84aU zjEJ%@kPvJX9 zw0>Zlo9{58uBYqTnwr6R=ANtJ(#bU_i$}Kr|8#CAI$Y$4ybiAqt=oNT5>;A_uz(ta zK5_#Cn{|dEfp}ewI^%&#=p}k}>xz?7cn2~=xASEf!0^}v28z{A0W%;+z51OkKvG=1 zs5o=E)kt18x~`=KRs^$t1#YVaz4js4C}Z=N$xu{kwobdfX88j8yLJ5^yPWw>D{2WV zwzcsj=nK)7WSK*QAc0>6tW~)U6*`3YnTnMSKx=@wUFI)s*EIkZqf>;D*2XAQu~ZT>tE;&i|={`AXL?A9YIx?7qG*J2RjsQ zAFt;P?^eapZNxBdwm|Mm4Fve!+$ZO3@GW7uXf6v8esof=vHcfl*~YS66HrUh5F&k) zEsGfDfEWPxjAf?rR`}qC5Swz`c6#g|HcSM?F}=7EK?Cp_n6h*x_{n@+wR~~2HDdt# zlF<7Tka`RJ$O6|sJ5FNSfo00lPYH!foG8{)B#$Z9yWcp9^R#TX~5!-tD=dZ@t<2h@UY8F8CLr74#Wd1Rn>|lVk!AkF3_NZq+%)l2z^+ zxAL0fZJ%YXlQ)!k%__S-j%WB(=TEpbA66-Bou@~g$v(XT>8@}tTTRIRctKp zo8eRv1bMyX8rrMOTmjnXK_>w`>?XAL$_6HKP(($-)WcsDtj9AG-i zZM~)qP4uE^?d;X>U^T_DD=bzx{-&?`tZA}ZK7nF?Jo+~wux=z z&_(*6_<>jfIZsSm?z0rWa#mrpTbb%AKqcSv<_)y?ck);QI3HCW?yvOlo_)f_X#6}K zaR9PIIUqqlRR(oeqD10#o0%M!JGHZ!9L@b`U* z2j3nASH`Si1&dPRM^eY^{f>&Vf zLS7yfUPMtJGF3hmI=SHfq~BdyWF1YyV>jeW0$($n<{XGWiLCs83V|HCJ*!a+(4FI&zrS~G-oktsE!*xVa+;UmX6Hl zj(8K^|CM~EO**~6U42SJc?jFn3#=wQ)TBbQvwZO!ySXJw_WjN>48D`td<$5F0T5Jo{Gh*fZw#1H8LT6@7<&$2A zt(w(cqGS1{z3m^RD00kQP<|vyURBJVX>J9u_@v8r;pb1j-?BKD6`o7@G!aIujXZk| zVe2~WUJU4gV`{jGT37bx;OXQKTi@0~7?2}tgLOmGrwbMgK51HSGS;k}4kXtr;F{R; zXp_e|ZCWc>y_u-$^tnzvE+%+r5pB&f=-lZP(^DlgxrkKAwws$LLpZ6TSK){b^8Fi* zRjzyjeb9cTAD6R74mQg>Cx1f+j=9R6q{cv%Xxin}YED9xY?#)kF@=%!AUogQ$Use* zHhot2PW8?Li(N$VWKjW{TX=T1v4>Fi9>TWaKR8i~#?~gTDZoyw`|(?>e+3AaKV(Az ze*d;ntA?abnBJc*e5qcl*13tCFg=Nz*P+64J6qjL*Sy&u|1f4eo9(CNcDWUoP#hCB zkXKM}4w?jZo7TT+li3dpPL8%QzD6n+f&$5(ba?LOm<6BAy;W830^p>To@n@924&0S zv$Nimh5bG=9i2|&wWKZo-){tuExNoF-R|C;rPIHs8%Uz>mBrb&Ba!agV zCZAiPp_R8o{)j7bFuy$S$s+vfV8`veKbXY64*1o;2kDbYku$pdY_@1y=%m?$v^?6o zf8SN)r1@gzjW}1DRz_^_Jt)iV;V&5@my z=8$}@g2U->nlZ&nkAQm;OxWQJET#DA?kCjFWI7=|0TJ35 z6ShRA$jFMVu&H9y2*?hSAHBmWrQef?UL>+GVI{m!)&uz48I!1ra|VaNwWZ!kl#iUk z*RT^RZ(T4%BF`gdqxExf=81?Hn_N-6CSd_|N@4 zu*0)dBP!ZHnMses=9oa4MxLEmmXcEB%`3>Cvk(#aUarQJd4Cq5uICfjqfh<8MX$yD z-F~RW=RBt_6f`u=mczA25c4}h?*`%SY!-v{?SU~$#Ie_jQzCY=@pnIYWvH<`pGUXu zPJEqsE%_s$0R`y9EOwjEoj%H+Gw?NRe2gQ>*4GMVOwOg+e76b$iQ;W9P|qL`#37Ms zliQqlX&%WgFkFs#+q^ERUYyg+TOi?WH>9?b_cWQTbZcfTTjEvdNOmjN?!pTB^nBYr zj^|bMqR$R=XB(*rRtB1+pQ7x9^vOI43E6c0+9`1&x(IgY(<8j6_icyVfjS=4_x+xh zDiXbffY!}gK2%>qm?2Rg@Bsk$$uxKK$<@1jK{(7^5G__~sy9-2vb-cRUJUXv@kaD_D>}8y&?+C;d zJL)EdxJGvjwS;4YsF8a~-CfHkN*0JziCq%6t8fVQi7ch*Nk88G9`nXb*U{9roj*Kn z@|q_Qw=pf(wCgtPRn(t7F2A;Gdre}Gt!s%Aqp2MbP5KdT}q0tlgLt=(4eU5-8%F=d`)<^|D6INMot8ZxrwxU z?p=jNa?>{RMX4&vfo$dr4CEZDPODN}e88G(j0|s&D{{b)g^(DOGiupL98L3SiTzrw ze1SC;l`VCh;%>97vU2Cfw%RjG=1zT!e;(osi#Qr1tl0bn>GY=hx7!iD6qx$ z94mP{yeKx8^@l>wT?O05u^x5=%X#+P&6kBR_HS3Ro4jZ?`rtN5-}m9Np{_Bh#kzku z2t8+QbccPf{IM>@KC-8vC7K8D;H#wgLvJFJO;z0G{^~t>YhCR7u%Ob%yAN?AguNuZ z&jMm0bYT{kKclV9pGU;uE|)NG+LozWAl9 z7|p(UKe6L@Y}&S@^&G%-r#cd9MCi7qHBBa0bO%%mIIMSVM+#$h3flKeFcGj}mb zx72a-Htxs0xTigSFXH$T~^u(1?_#GF8*sNzqV zA`XX~xHy9dr!Oz;?{P)awOxHSQS*LeC(!egl(SD%4Ad*G;M*lFLb0f?^4^PI2XNkq zxOnH*6dbBq36z{4ao~ze+Y(#`=b3Wq``a;WrdJH0iBG?susjP}%!Ovt8bQE(2x>QF z!aFP%K9_n%9Oz^0M=OiA zS%BS2R9z57#aLVN2#1Z4^*%;K%6GrLdsu=e1w#l@iJnuh0RK}gfCWk)x*OIX34jBj0muMS{@;CYsf@CP??u=beL7xF zFlCihDT(zt>jOnpO_@Do0 zs|jdMLD9-D^BO#i6ktFO2v`$)n+kX6|CGt|PpAhXU&M2EZO(rS>bV+$#Xz^|)$9Ud zlvni%i0QiAId|6kgNG5YC#E^MY-z8YCnP%DS~G7heTYE^(Lb7I$PKdIrkVXYAPe^I)S5z*D7H+?#>kI&1( z0>Kj)tZKk!X*ph5c}5TOcPHpl{-H3rb*UkJGmj5ONaEr{Dh8J8kB^gWv~sQ59c3&; z7wVZ^*Q$}D|2o7E#NO&^ww!SB?C8wxbTBvnx_}r!foN#ZFABGOaI>(maKU~?L`G&~ z+gUL>JL6z;Z###B^zG;wmo{AdcOAEndmUc)K_QUpUrzyJdukxS-;DQGns$&@9l^I^^Zi*3C{#%w1WzerV^hWq-R&6(e%^aC!OBi99T9Xvd<&j^A;2 znnANojCzysUTJXb_}f1-A5gnRVCwg3_2UCO~ zgOT!%MPMuS&Yy%N{d@!5Saz(fr6u9%xqo?C^O(SkMMO-zc;a&WNwY`~|G};O6O|uC zs(7wk`rk0hBI<55m3F*VX42D3dr-*`v}jzlRs-kPo{+`JRWE_PtXh5A8yTr;Yfr=r zI$prSGy($6I-im~3IEP8vaf-zKnWTx3eU<~Q?K?-|I-^27IqmfZ+VO#Xi(U?Sm)tX zH^r^?!|(8^kp%57+H9(w;DH<)53kiA@amx!N6*)x@UE>1#;%hL8#^xx;qTNB(h9)A zeyZb*41GF{U?az&^RM}NrZS4OBAd0Q1toQIocgAQihfh4)AiQ!mKJK-gN5$grycH0 zK_|7pT9Kh+n7_w8~G$a0-(F3;z{r58Z-xlqbCRBxm^owuTD8Br|i?1v&Bh&Gp zlc9?W2qi+*5!z5$p+f2cf$s9(k7HIL%ZRYUP2h4UPyfXTOcmwqa0@=B77osV4sN1L zR|7C)fyAbWv7nR^rH>U#np56b6l}pmwf9r#PrrrE2|K`7!c_4@T?``mZ zTKm6|Kp^QBlE0r(R}9=+S|T9m5lB136NSYBh4Vjj`F;x?Kod1F>am%h`-?OoK}L@ARLN=|2+6Y@o2`QH4yCg@t0b>tD~?mvM!8f8QYb96~ua z8ty6I*6tYWm`T&+=;bUhp=i_!)~vx4Mj=~w%N=+LJZJv@Ixf*F8L5#+tQ>fV<;(E~ z_xBUaGz3x)j*#v-VZLiA^|k}^6)EkHr>$p8sfyzMnUB;I;z zgsU&)wLdLpx`eFiIlw0=wgtmLdYYEm?5=}xZHOF4>G|T~SA6rbrM(#IA^nQ%IW%K# zRfgJMSq@EV7UGEBkL9+P^1BM_4l_mlzjTYs6XGZ8r(-T9;L~U0dweS2tLLdvF+hR0U-H;D<;=pmI zT7B@S`}$y=EVkvUrWe+T~L`&n;rSo{7g}X!8QRb-WY> zgqG;@JqB}O(%qm)Hua!EHlE5=M=PMOK^LsHwOw8}gQO#>N zOAor9uAaaAk+AvRY@MD*FF>L8t}ZE;!>(=3Q}n+0=)DPavwMrzrJd6r(v-0YbiOF? z`IO(b)Co9A^jb|Nrei1qS@LF7G0D4SVyQ}&-9%&4Xk%2G2lIj3y zdfViOCSI9-)&#qT)8GD42;~ko`OClUyCG^th8=XAFD~i{d86`(n)Tc4P$TEfogRpiUPmRFgK&mv@Lj zq5%9xjdLNtWYEkSi3rj(5;G(y)kS|y{WkEg$ySFA5gkp83DUzK{DlgsFVMvwLbYM`KvA{G_?QOIj6LG8|(Rc&!{2H_AQCKc8Hz(tJ`{Y|T#unI6X0Fod$K*Ih0xkOBtutW1;gWqS1+w?(a@ECAce*| z^AE81%kS-juinG=POM{;`#b__RHcnMefV9xFEIf>)4pt1Q#re%<8j&<`NO>Q^medv zIcnIBM)hzy??-D7*9C%GUyG@&DIWC5gX`;}=X&%X8*JyO-yhp3m4cUl{uDs~{~vlhTz5;EHm_p<5 zX>r9*=(*y)7<%2cJaTs`XYau=r#S7oNqs>4eB>1@i}2D!M~ZFxO!rG?%#@%oK3fjJ zE2XIEet9{?&ZNBxCp&X$Y=kFQDfQym9cyXibFu9Q|Ed9HhKoc$MqKP-SqWSZ!7q*U z%t*@gX`)P73B) zweXcm6C?D(i<2DQ?GAkI2o`C%m9THs9#UpKI22H^+h?@@E*5*?zuz0}v^`$eR7pww zU@}07QxbY@h5uB6{C+?qC$M=cR8_pe77D#+t>`ifIG}cGm8|v9{3w8n^Gz zVf-?d+9ukRmXf0G_4BtsyPvsBHTF*>fW**91&{!gr3|P6W?;>^a?3w&5l z44kGwq1Yo53|9KUK=UD;H01X}1_iFcyMmI~B$KV#`|VdSs6PXy;tpGFj;5wUS^VIU z5cS))?v1SOL}fcjZL%E5R)*ajcwbH$g)x#wbC-P+V>4YgvA*?TdNgD^5#Wmjk}&?D zxETr?BGGBvfPOUlwahMzvDJ(`mhEKG&Ygv}m~LjZ8LWjX$z!`EuD9 z0B{)N<_luFH`RsihCK!YHKfzQ16zqk0#u_ta=X7jQu6b!HM@tC^8d=>#u3ZS@!;WF z>4H2mJlMkyk%RkQ<6j;pH#D5;`Ld5Wy+{^(^!4;vnDhM%8;BG1JfZa5OFkCQ{aK~N z^W`pnuaJAH@NsKNKvD3q#&Ty;6#(*;5|S>h?wdvod!q1Ag~3)kGdGVgc7ImdUP0061fCr5bP!o~Vrkkf;Im0pokR@KxJ_WQX} zps_`Y@G2Z?uOis8#(vitMUi#OZU4G>Mir52Q&CLS=Xm4XQ+xh8P(EU&m_3Pe?`K4# z+JUqH7VO}@KPvZzU%J8FWa7iB*=_Om7w{6A?M!P|(LUP986vRwu%FjI#O`$>*(&bp zbs^mfMh3VpyDru#j{UuxUGJUDqT`k?nc;EvMDF$}` zFX|_oddKF!-U|YLu%qO0hyb->KeQ0*s%^Oy?AvF%FJ{yexpqKQ>l2gbt?#l(^$on> zvnwH#<)e_0q2|SjnB^!18sYY>CEH*lP1ye6X{( zn4fD(UCE50!QlxOGiI3=b>3%Q*J%YOWu^XE3GdU&(5V~Y%Xx*roYWtsHCx-=s=WCe za2v&{cYWp(mBv8FNayyQ+v|ER%4ZqMdH6KCe8tD)&$m95uOPwtp;qtr_S>f{#pq4o zd>cYy`@`SviQl)N#X75hxE#@pX-2{GUr)?DNvZgcus+^!c#OcXhQkHQijo zFc`0WI*og(ci5@R0UzHCM5 z9hCv-UVvoR8O`)CJe0b%oqrUf^a>!l8joI4gA(s<^SbR?5t z#z_Ex8PV)cU|Pu#t>TCK*%4S7Bz$wCOB0u|X~ZK=MOKu+QiE%%numXe&0N zFv_~+c~0{hfAWR3ifUNUT&%Z>j!H?)U;x6^dnWziHySoRiw#WYw9cC`4G72_?tP-m z3zgyhXqvCKMb_+Bd%ZPcow7h;hCX_Sy!0Qe`~1tWk9EC0jk6l#(~joC2cjC+g^4qw=H3yZl^Wpu^9O-eBOV;!ie zyT7s~M0D%|G{~yV+1ilSHYvaMX%sD-T_FVc9!h=m6l_+#tC@;QDpgiCjdY2HQloFl z`)S0K%V`_3po|4-)4qM58mtQZOpE@6S0)y#7L#T+&)4b66NF=q7xIRJqy;eL*Q>H5 zDJQ=MIzIARTL}N^L3^3xb8UQBtZe$4cv(wbJ>ZMF@LkVB{V_H;`71q%0H{!b=3UVF z9;QtwhV5Ft{h9^PQK8d*eN|I6O5}=h*yM43)0dK{QIY+As069=@CC7e6FTrc=Apl@ zFd?N4@FU@G(n8ofJWP7ydwlf6(Aao`o4ZjwS26b|z;%`Jezn_P?hxi`cF+Q`S!$t3 z8bU@dnvtqXn`pGk&@>$1?N^DH?2=W@&p!R#Ju8@`oSjd%zc`B=JxasKX?6~Dk?6IZ z((jOw5ao3QM^i;-dbrp~5E)_oa3VM`>1OtO5BQ}uM-PP$eWEBx{1^mDGeoMy#`F)& z;sa=lTSUtd-kA_{qVelA$gQrPS+)0%`Y7r!md&?1u7k2dq8?hi%KA7+DHLgNK8Vo8 zDJP>>BsDh)6EwQ`8@pL`2O!ioq2zql^ZRlLssr(lU-JcthE!SBp1k^4cr6K;0l!U{ zZ^$k;8Hb~h7`1(5+)fpK6CnCwA-z(Gc8#023F*4j7&X5}T36F%9RA9Ke^5W9b@7P^ z2iUqL-VFJ@Wi<#x9g-mmJ3*}rkvC*1W3vC=PZ=-7x$PupP0xwf1w{5tmmCX};xAl9 zSB2HT?hxCNkBv(2VQSO9IRjU|2B3PxnF8)b*VL*xI=+D+1vcoIe!a5c0BdxNM(Wa`r{u(hEG~)N>xlV~2_n zy%wmzLJeG__M*o^l^Hr(M$#nY;6j=v(2OJ@jSPDPThi;`E%4jz8(^gH3YZpR&vZw-hn+Qec6-^*q@*&pQJ zY8ZcIBZpL8L0+%0z4NtQ;b=jLua1h_@G#);oma)kfY!GOCksBJcwuiJ_(zp#B8qu? zm5A=S(?8Hs3^~0gp{V}5?;Axy6uARC+RKHj@5N@<_aGK&A;}OqMI9Y84INteRb$D# zP^A&iOcAF#tGds0+wIfM){uhCNTY>WR-v|g2f#*$S2)R0N(&~`K>-0~7EFwJ@q;H* zEDf*8k+SGcoHm+y_+{M9j%DCy7Ae}0nF&j$LJLOW2>j#bh-tI3Hvs|fJIt83YZL9v z+|3)o#loNrwPCXq3C?mhNunv7oayMu74dr z=>kyjMZbw7lsbt$k)tr+<3-Ye*0oFRKEy>+2L=Yp-FSU9M+X+Qt_XV31&(zy#&Xj4FUKR{Aa z6me1y4?g+%=fQ8Uu5WvLGU_+wn@oR{X_j+4pA6TSD-RdeY}I>H%iRePsmL50*bwuy zI9_NA-(90k706S??lT|@%CkscTi$k((V1YHuRyGkk3W@~*UH7q(T#m%hRhbvnI*hc zJr5*q`O1CuC+~6}TCD1Z@*rW!MmtEWA?(@SwlUlGDq*1E96r$InAOK8*yI*2`XRhU zC-j9@O7llV^OT1u^0=(ejNafqGiep6jfzeml8kwRS3wOuT38sFwa>0drigJ*JND|Ih>9h6})t7vKXQR z;e1$Lvy$WzV*kye_LeSmqQqLhb3q^Szrs(X@Q2EX&!yhmYI96UwKP z;>9RK!@T{9+f|7f-O!F(8#!i%6+|BQPP>k~F5Gt}YkLqvFZ94^d#LO6?pu@so|XXRx<_&?X<@P766Jp)p^ zAJGA`rKXtz*#)STi)i%0%*>1y$79|cygAr4PO>|L*Hx3*cOa+7$keoOf59bP!24oy zquSsn4PVQ`rA*>aDE$wGh9`x4dr2Baz@K9Z31PS77*79WIv5`+Ce|~QSRS=YY<@vF zSE}1eK3k@1JDQc2R&U=0mSL61b!bc{VG+IBB;1IA={1IP$XgG*72-M{YrfefgNwT3PjdZnyZEhZ{ zffMaAdW_;@T~4rM`mx=(=4j9I4MMLD$o#jG9_~m|y6tgb^WJ>?4>x&ng!^|nufL7$ z@VTtalq1v7P`TOJqIa=i*(^dGONRQsP2j;?pA_0e@qS=Jvm#Gq=bH9XRo1And(bK? znkTiF#8y?#mQU1Vaa9h>kKohx;{0Bv<}q}Z7ewMoJ1f^|=Bxui?J11)u`oIG6thkH zmE<4E%gNrG2CW;Cob3oOLguL?(GS(2WjwlXFcj?@#)2(ty@%u*Q_C#d$2%&>7k>8YU_tAxGKCX%{suhm9t`VQ=~)D5C;wsjZ{K zVXaAlyT;#E3kMIUa+}`NXwW9i4-FX(CDuCejC6H*ul2IawCQnJ{We4ThDow)eH}*C zKw97uJ=(OfzhCRsb1CDi&F-{K$5HuW?qEr5 zcg>xpD+zJsl_A#LL3U-b?gammM-cw`jRf+8c;6 zNOQQ0qk(9gS9p2fod=zydnJIrjBn+lH;unKBp4i`g_8UCSciV`h?G+5Z)l%1%C z$M0cq-#+X<=$IMPPg$qlk9ER~UP?<_?iJJr#VHVUvDzPTwHJQ#o~fMqkZN>hS=cB) z^3>txWE}Iti@UW#5#I?*`cwPbEmk0UI7y39?*Jm)=8#t`@4nS!X<7cx>jwv;9*g52 zX#==z-qcQ2wc~HAM0VOi3(azHvC8cI=LESz<>G1W3hVW9?FxMsd?S`d@NT%OqT;~T zsfFA@YNl3MON%fK&hNYhbrX|WzXuUcTMfLoGjWo)p5@7chP!39q2+iM?%N?j(~hzq zrRmUl_{VxWU4n~m(V0IRf3k92x#!Mx4m(R2&Ym$>-A&DM@Fd1Nzx>7A^6}HV>jSww zB$(?rIot7_r#Dh-W`E((?~*3S`nl6eI=u7Vl*gwqR5CIZMzzACI+t!Zfko2}c&oYx zO2LUk5qEwGF>@#QErd+`uiqcT5d(| zM60tHd+2Wu#%W3ec%!Z}Gc6A4?rZVm`uQI6h3R?CR*(B*!@_waL~-$pO6ZIVOYp;N zX;a=$6rqPtYEOb(NK7xWOF;OI|1BMF@BmE@L5}K_S?yZDqc=k<_=`A*qP)aZ;uSP! zZa#k;u2-CHV#bruw0^97+sAZoWjKE~cnV0Yfl6KBLk zMMd3Zz}-2l{`?K;6+unVyRR)`Y7;DsbrYreQotggX~dqpxe-hL%iNvRa%OajxR2+1 zMTSpR^ZC)%gTiWXF4x><9i-52J3v(v0Zl>D6&q^!Ee=U6KwzFLHg5|zLT0!7!PBOY zoOa((j9X%v8T3W{AP&@~FrAI+|sB?tfA~6Rl&AG5{G3>W76Kqm;8@0>gydM z-xGy|nn^P&ZuTQ4u@A~u!isj1G%-gkfnMX6chQ1>(6DPmBtjyTt`6ijsopF*)RJJH zy1_^Xb6AG;-D)Y){K;@whNM)2YAfqGxbI?7R!q=V#I+*+2w6BxmJ?Pb*5de^Ga!7ilicc9aSdVn zud83#e6fsDrt|tGJeR5Gms;ln>JugYIo$rzD?gB|&3va6+Zg1$R2OWCB z-_o$|F@;A1^ToA9Su(kz5zVvAo@ch5`xyO|KGDd9*tF?>) z^p1bWT^69NsH>rZ}%7z8y=QQ6SO+FA|&Z!_Ia;Tazh zO2P;mQPgN3sSFJ*PXVg(+US_;GQa)c#;$7MfLr_ST>?Z?1?lfOh~k0AR#nT2Dfs!T z^GFd9krMGYFNEHpQQ*>c2xLJjDtxlc$F{f498Zl^6QiOmn_bf~B_*Zh$69>WkX3OZ zbDj-HW+w%vnR3vZKRwYZDP8ZlBK-g9zW9^&GM8>Rxv0gfJ^Xz77%)pl?%s|3ws zvB~_%<5Amm&y7Q?s4<&dlIxGuGcA{bk)gxwl+qfX|VtWgX>*52E4%XLnIs7l&i6&7KtG zztU1u`ANq5*zwfLJ=8_T`+7&SZa<6ik;sd9ufkiCQkstRqB(dm%<)8g+?Y<`P z%gt3wN|b%z%edOt(p4-#o$6j$(N|V>1cM7kETY50rrAae%=<@2t2FlEv-~VSAR&2q zl(K+T?Yx+gvV&4Ky}03G*xN@nj9g?8MluOAzrIJuncoh=SQ+x-@83>`%Mex7t;tE2 z$tl+0;NX$0>Cpc1@k(8Yvg-iLeN{*MnltA0sTxm)uFkW6{+Ku#1}fOKV&k$bu5Tv0 z3s=viN@q-}=Sd@V4(*&gT9;v3L;Gvx#+adzI!xsI`!Hmdot?&ghsNoyf4ki8{Jy=_ z*LknPA$xYV*yeG*P=n_pDjFc~rKDW{4xMhKHgO~^&b#gB*E^9p$dXx+EuZIRYscgF zqN4s+gb{tw8CNIabmg#GVz<-%@892?^ZnZ|M_SQGh$zbadShEUeA!W@0_J5Th5AZt+!;Rq*$}{_H>u^ z=%e@k6`3O6M11U>OW??1)%ksBVe%zbQELZFZIzX8WfDR6rw01^pQjQT_1gB@cAXT# z@sIOb!K%GDY|7&xAy&kZe*rWX)Ek&CQkS%|yIw$0P>IYJv{VMOx@_oIlP9pP5BqBJ zQ=J}{?l#CKbeX1y2vg4s{(G%#Wh4K?2miz1k>+nw_#d9=KMeQ36a7;GqIEzXxFfuErhocR r3wS>a;|U%865;nU`G3QY6oC_XF9~Rkc#(?yt2$C*a-tQ&`d|MKP zawO$fJif^G5IyYoe%R(_Dtzy85`XBKV;g7fPSrC^En>%@Fh`<%b>DYR%5&=?TXrEe zg2MbIMpkmEsfphxT;J@{wDHt!j#mq;r9O|2VQ87Oi_ z8}reIp5Xfts!^}&)h0nvL(z2#D&iPo!u7gO`@dS;3WbE1HoJi`BQU8~K*t<(2o8f# z#B6Hs_sOcp>XRJnHH}f2{m3tX4vSnI1Onv0S7jPHjdAsxXX@7MMI&Qm5oUozv@YP3 zg$G8v=7+hv3~$W02K$4N@DOB={2;cvya7*fm>EOWE?cdCeU=1WZKEMjr^PTxhNx3( zLIfB2yS-RBS6!2x@rC^`ue46b2;Ti(C)lw48K^y)>{Ge_vR0$CK=4clt;eTGb$o=&gS4ba~f9$MRs@`5?P~0mJJOE0&7;%ezP&J)A4ia72 zl^eU=xH2Z_{L;lq9;g4OWQ0$^b&Hydob&qlZv%^{=yJz>Ck2O5bI)%=C+NdQ>2Auh z!r0&lOHU%^XVL^p8_00O)anypk)JWqQV_)V@?4f@edPPJ4UjEW&5Bk#)bewIMO|E# zY)vIXNR`_F&kDiL5^xZbs3o=JB*Vyp$`!h(Kg+g}Y8d{Ms_V^1Jh9D@TMrJhrSPJ= zvd`+rG0p6i&{qkRv1NH+i(;)$ys!c4{elYTIP5sUqQ-$W!%BAHqY{w|D3NJ#T`8)m z;JCsJCHa;8Wf3Mq4H`6Zyt~5;IVd~3_>DmYzsMiJN3D0OBkOXmHw2_ep=o+Ca!f% zcryXW&E#R@p-f*ts?Aim$D*`|sA+r&Bp`R**(N(+|FqnjMRd|+=6PNe-WO!>FfXV1 zG4r94z5h3jyauj=oukibaE8l;RcR6-IU3qxm6HJhF|k5Ue4QK0^~qyXetRB=pWoNc zFK~vG#jEW%@!7e=7YTR1Rr(FH3lK2#;pi|hyjFJ_uUV2N?r_fXY~aSUe>eLBnMW(} z+jQh{)``QXKH)~J!~uvz+u}@bMM(=C4-ZBsjft7rFUyOtY)T6HU=1B`oBhpmauUko zr}-)gAU*xV-pR?q;3hpSJrd$wU)5)w)q7K4tCLHD`AYBmcCvy3Ja2v)Rs#Dr8>eSr zrb$y=!oOYsl*B*l!Q{(7FcA7jtP*b*csfEo&peq>eT?jfI~%b-rQ5P>9L}$r&_@Q{ z+6=i}eQWesJ07@z$AS1brZ!nTc8h6-ZZrw3sxc2Sevtb8 zX>e)0rY_lX*6c}^Iw~=l+DqSIMfN0uSaG7*l|B3K8x{3P%%6HCD*Ov9ir;nI*(elzdVY}0ol7@wp~`7M0}Py@A=qP#Yi#Ib`D&DkVfU0fjPP6fICHUf3d2s49)tkep}Ai5tCFQ~`jV8aglT=yua- zZey)`P%QOB}F8BIUJwLzhO&ydOnTr zPx*QQD)fnpv^ERhDS*DQEFCcT`?s|HZN8H;z>|cqn#^bU(YNvM-_IXg(w1f!4eFh* zcSTnFJ2pobzm7CS7`HHr6lEK!<6$2)nL+*hrf(iy{C4}IhPd^2Bez{{$-a24tqR&( zxd#Lc&28~^q+fh_%#y;CDbPGVcGwl;kuIBia@jFcjOglKbp%{3^iJ_iJdd=^&3j8r zpWIMr7%|xSv;64~>B$43&~kTBps!OBA7pm=M=%6b*%Dgv#k8S#|Fa?-h_a!6&u^Sf z6q^Sgab|q>r(DiAMa+d!GmlF&m!hMIBX=I@yfL>LBn(isKlI?WDVBcn_Cge@)m`{e zw6VbF4&l+@5umM8Dt7G`|KW_6$K`9#=v$Oyjk0m86EqG~AS8VbGBvh5T zxI%Ss49(pW_WZzN6($D?Y}(<-INJ6-&>bGSB+2o+xgih}Q88bDiRyB*P)*Ky@&=g-H!7TH`IaU z@@CM1XtY6G6d7tFLXuYRxM0&}MZF1blfSBH1C%nv0Mpgu{R#|B#`dSyVwu98X_A<@e9kg>OnmeNXBD2OHR5o2MM>e_40a06m@zK$PrXeI)B zLe}#jPq%hAlA~YNmhT>xwjCW+s}ad5u$`}$3*wqgd!uISNBPRW$8NSoWBd`|uz0orn}WixG;glIcCN&rcg%-Ic%45+8WKio5|)o)vK+r|>4PX$=r^wx=G9^% z1ii$E`uYSJCwE`?lwHHlX<2hP(HcHrPgW{>qhh9r2R;U8v=+nZFxj>K%&OyL-B2=h z{Ot3FTr_ZcM0xdb4S)kVWK74@xKz$Jq9ij9!=5`83EqN*kwBP=FoCg;>n5f;Gt9*6 zcbzK(P-q^b0o`;}r5-QUH`O_{+Z9HpasumK3XBoYr4k-2;hxfQ4%THOFLJ3~Wy zAMap-7Q`fqZ}{{227NT*w5OvmFGhPT1Gs5SG-BB#sT&ipSk?iga<%RpGq zVlEA&Y@A+bJQ|zcsI2YVbvEF4-tj~}VO7tvIUO^(pKu~6{!)h>E&VNH);()#+vM4g zM_U5QYD#tU=4ao8XyK1@*YQ`eG6wTiXCzAdhsJlCrRf`Le@Dhd=;oPGrnXc5i(?;x zcg`M1Nuj0e27-%iQM5Gm2{6FFhT7tW_JwQ?y#Zk`1d`F;^=JJx0M?LX*^EA`=phD`Xg!t&t=m6`Ga7F^Njn0ishpBdEj zN=g-nJR(tYY6)W#Ur}P0Fx%o@jak-?-|CR~`-xK1Naf}A6v>3k%Y}5@Ry8>|l!HLs zk^xAakFP*ozfH{F0yi#|25hLyLi+==KfZP} zfc2qGzCbXnDQaglGm;PDN6_+%~}PFmw~di&5HG(OIxhe^TL^@V1Lm#Q4ha6>w2P`?bA>nOF-G^4e>`#O=@Kzig%6iy8e1`H||=3Ws|I z!;H%Sb*&Tfu&IdoeVcGrK<%CD54s0W-ub?pT0Yb>yiq6Mf!`#n3EF zkEb1O?Cl&n_SPv2yQtFdb8>TCr(*VTn;fRdB@S8ugkdD19!A#Wp;9#-wc(WN48Ba_x5JSuj^{%$HIS4ltPtAnX<_IDDJdD<1%4E}Da(FHE*YGqn1y#4g?Df7@! zpdd7~V2$j-GpsNdATpZmt6Ne`YJH?NYo9psI z%uZXCONn&)nwPGP2r8btgJ(|8onKa5BX|oEJYN%I9~YIB^^gt4459>oc(<0`Ql>j$ ztdK@Vf`f&H&ts{n-QclR`;O+_|yBFwj)JOMQue${=xm$_tQ{xYDq*9fiY!qiWgw&u$_N4S^nvh z`o``d5rM!VBuh0Z`9oMNhO?VnX))$2P)|<~2xPgPjME#0M4F_njSLA#I9vJYf!f@| z5VnW4-R0r3lOg2m0%P!Xzv%9k?6{S^VdP<{s(4>Z$fKGd-aSKFCRA94Od$s&3AoE;eRm-+}EC}*LKOm zzjtSlgY*^+gn-tzJ^7}XTyojCI)b(3`C4Az;;KrI%MQA2tRogj$EhBJtm=27VW2Zk z_}d7>52*aSmyuDXsV+u^(blQNBe-Jl`G@`pWtA4Utf^lb`0|FH%jfK7oVNQ^QtR)_ zFcPa)Eb8$# z^c)x(GTlLY%!D_qK?wU@J=rCTYAvz|V>1vW>CElKL}-uq_Rtaa>?M#(eI~O1SU`p} z{@h_Z9t51uJ1Gs0Y1_@tJO=gNl0%$6j#PE)ZhqhuKx{c%``Jm`rim%x!yG_XOwg3e z*vc!aRH9piikL}Cq|WEShBt=(vL(#cDtUkW?Y7wVqtR+E7}ll}_gp!Gqpj7pWpNi{ znV8!NzB$;B*2YG7e}fTwcJ`Nsr=miO|BMeb+XzGslN<_+{zRpu)N!wf$b?pC7AE5* zD&+gy8_Qu@EI@IXV+K}xYFngpr)|jFuESt{^K9XRv|1feI@K5%=GwPed1L!})=l(( z(iYO_rtT$5)jBLixZ(xGxS!W2UWW&CSHXKImXJ@3#|bs(9WC(i(lp*I(VZhsL7T6H z$pK&SHc%**snmJkUj>Y(iYkM>J^Pt9{$UQ${J3t6hDQ1X{IExcP(nhIVOp{QD|*L( zOuOXP_J;RV9|+S^y%GL0`X-%x@w&E^)Tr-}8oaqdFfn<)2t4>U#DX%s?6*A;Y@5~vHC04^jwqMXy8gt0Sg_^j`y{5 zBvzu*bctmKX-yB_3LlCw;vTC#ehv3V+av!I@$O<7!Y)S0JB*Z6`Fuu()U(CXDa$7=C(ptM8e%`)~Z~BOU zIjgIl*62adIG9~ovf=&;a59h?6d?(DGlVg`TY_2s#p!1|DK?HcdzbQQ^-;X#M^#Cz zdfJP|goqkn%&^tFVdBatnn;Pi9zk|5M;Xm66{r2iVBBktYb-c_rWzbp()%V(v7!nM z3sdVDY6Wu-@YXNeyfGhsm7q_o6@NB6^VM$iY*vUvB^fjZTfO{{04!i9|0`SB^!0Pq z(Zu0nZdfq}g6-{Z_^WP~vKvw%AGOIznY^i^qjEmt_vU%UYny{6lO@`v4;@~xeRttd z70u;duO8K_HL`>;zkBd zKYfAyZY!MvF}6(^&^HbsIG^u4tCLURgCxlWAudY?%jUfV0Cvk~yAaB+D%9P<_|KAZ zMVkA#2kZ9^=*FfL%-9GnV{C(%C6d%9>C67bQzhEmG6%XhSv#gYgp4S6G3U=p$LN(D zg1xmLSY(21$KwHSAr|Ngy9_f4BtoHUn)y1{_WuZuihsX$3cok)jy zE|9L1VklS{peI?^ddYZb-@R+fKiLhZx&PI^oStSl{^V1_;q1OdnJ&Momee7BZ+;SCgrGClPSn^pt0#|7}v7#M|3s+JH!*~5YkAUM~rJPJjyq6hQcH|<`ex%GJ zs+wG0&?#)+U_Gs8kpaY-{>F+AK)~g3j{byczArIjSZY zacK)pa$wkd0N zy>O~0Z#T*#T!$8!_-=>r`5hIAOtkw4#}Z-Xml|*@1ELAQR8GwLnbiO?8OeHlRNGY3 zHGzyyj~qn$iM2rb_8UIvU9e0!Ow8p|6oMpG<;m4X;}cehvj^o;(bYUf;dKt)d!fR6 zYx8DzwIi|h`q%+y9Fe!7Pillol#EMoWsaU``yvjmC?n?dh{Pn-3i%B4D@0|5vY58k zA5=|+$T@!iu|;5C>uy&=93GU^=z5Tu z1mtQ$J3e$mv~z!ak>NFgiiGz6Q-J>( z>{kH)vDOL=QGesWm-tpkly`am{zz5aGUa^%exe^+gSFmX?b+{=8D1n1d>4olga+bx z9mr$hn)(&;*C5Yniw5;8r7G=s{E#`Eb4mZD>PUp-0_0_bB%Kku zly|!F%UbD{r#~V9K4uSTxg5`Ap_`<=d69hxX`nzj6A&Q?G4MNbS6Kr7@Es-QS3Rk(K3EsjJF=ruKL|L|3I0?1e|ZC5Ci-6t z{eTmQj@aIvT}1QGPy44tEP9txg;Is`o97v&O$*+!a9&lb_6~LyiEw%|9b2$YD_3GH z`>+kaK6BILl(llD5_?%y3JV@@4QYeZ>50Fu*UZ#zA|OM(`m3d@T2&q=D?3Z<*Yg00 z=j4>E|8ZehIQat{Sq=$yE7gBC)8CiS_nC7`OH`?oC$U`A#ug_ouRPpwq-4X+bi*xb&ZhKekXJcrkyT#2MbEBU=2Z{heK1 zz~TKI2l=z&hYu5(u+yBD{!*BurT%qSdbkZWa~)K>t>V0fAv5RAzn1MS3-<$)n_u*E zVM7KM&oJ(LIn|VwT)jR{F$R&{<;-9pKy3YHhAf9pSIeA?DnFZ&!_9xG3nI;nE{TcY zFM0P3j`ZyB05~rs{vy`&KD7g|ce+)2!jGz`3*THksG5ff``)#EZa@S}>L(bLoZUb4 z?vjEj8tN`CrUg?Aa%Jk+lTCl54wY!JK^P$PxjTGJQ%l-KN^_&FVzG7Cb;nWnYb72_ zF|x1iGUg9cJu=cqLii6!MO;`LM0+@UWDRSjW(iptt7fn`Il-o!675=-dcmyBK{&8Zd!FUHs z{k-8dGt*t@>h+APj;oJ9pUA}9YbZ`4p3siy=RWRl-PvnRUN=3%b=rdxa8aJmHp-L=a$R<>cQb+1O~C{};qs7yf}0>MZSA@1`1%Oi zu1p=VO4;l&F}BunVc7WerRnVx%s{7dp~zdb?$Y94UVMgv#7Sjg_wb5}R=*cs&;YGK z8(CJWXl2T+R*Mn0kcemHcY1BC_`S(m;LHg!%mz5wd61EvK0;eVTRXktqYym0xyyH{ zy#ov@*Gz_6aJvrO>S#3;FTV8R>_S4QHI5g&taf%U8?(j-hp@SFG2RNqp`C;3_~#1p zAFEy!;8heBelD7so11gnbG~@IKV@dBsc&o~spA<7ErfR>|9tsp4O>cBxQ)VZ{lsQ& zE(V=_VUNsfb@$Kc(|+>8)Aa(uUMlD%&ivE=*LC1bT$<@w2$3fdQd>B;Gp>kHFEnS+ z^Q0>!)5U6MMfpX)Sq?LmH7Qxvdizj62Qx3B0kb}pMSwSl>+SIlav;veCK}=j3DR3Rqtj~p{JOd}lNq_s z;{WB5+wgiBrF0=Gv2v$7*iuqClL-rJ!`$0@(+duZN$KEt-*X9yrHM<2w%@`nN?c-G zLSkI92((m8U&tl(Qhcbr5<@V-1HzyCO1~-4F1dhXDuDGT3UOl9_%sK+n`M7%hxe9QW2(r|)`nXP660ju zng%__EugbSWujRgGN7!)iq;z|96xax+ zh%v)qRZ(A~KWMw0ik{=F?SDn#>d*7VjeFnsTFp zMeX6WSP!)^!Mh`PvBroC^M@!>HPhH_xp1SG02UMKV|k^+I)aXYmLar?g@UNoP>-Kt ztfdVmMnjko3A;R;X+9g~fwg8uM|qf)KwrI`lRMx+A*!U$ ztdbE6c`!8L&pZtTnQF6gsxc3sNR1rZiQG`<+!C~(7#uU(ZRvOVEYyF&@k>g;e6I1J zA|zfqd@b+IhNth#B6JN$`lI(&ALB%?FDQT>w&-jvvhhRk+uoOqTW8#&=OFuW3Z}%$v@psDN|VbT*OxtqB3aC-@G&058l=(_{3fHr*MKzJ{kkW1D#d zwA5cGR1E>#DW~92g~GdsyOA^joBeo)s3=$C^A1K0ynbDMTUXZ_I;{IBO=qd95VxYn z%J;G_cEnPaPj$dYicDb;NMAb1PEX%rkcY;}vs4q+G_+7L8Il!QtX0T;WW-T*Y`3;k z{><)JM-$hI?H_o!u*(%D?i=jyseJX530SYVAqa-p0kKjBhqEVy;iR!hganJ)TK7%W za*=^s+{RzYGys&^wpNjgOJ^#q&a*5SzE0;&6|h&S>O>2X}!HK_QB z*1DoO4T$+A1ZJ?HnyL#T@3g=yEYAtUBatq!h&Wnbt#$NWhM1)y%MR8F(=^Mm6s@Ic zX@h%X3p`;`P+_1bFsPuSQAV)HwLrpP6~X!zJGXO}#z|K46HI|x>|NkiM(f$Bf+xxg z&b=9{enaQf)X_K)rQhZmH_D^eVLP)vw*!>{R zc5oibRL?Jz)s^ifzoF^=u~sfJggK%JJnDdWoxsIomJv?c;OIIM>@&GNyBE?pZH$}T zEI_!Z#gnM^(--IyIj?_SW>JaZI{|LeJa!Dj9MT%CI>WVS(Z7WA5Qv1N)xBs0N$e97 zo*Jh-T33iytpqi?4QYotKpuKlf1}X$`}j(9exOqx-*i?t_+jZMIh)0lft zR$W22Xh=wvmh+46?DCWJPnG#whrAUJtG%ngi$>jI_bI8Hc-VF?-uf;sA3)^Bn^gmn zwQYh+mX-%9s+@zIZ)j=z4(7^9IeMfagUlb8R@!z%?%wM7_{@gsw+|1DoSoXcI9EkR zgQKU$hAE;e>t?`4$^v&}2=cTQ-$J)Vud-q077m?t!p zBS8=yZ+?so-#bnaeXxmT{gXj{4!T|OO3UR`JxB{WQA|Ms-8%m{NQgvZLO-GyhNXgc zFVEsJ+gfWAtG;b~*U)2XcFW(~qO~v`5r|OnoEe=33mVUxTFDTk8UU8!z&Sq?9B=gb z=b*w(({G)Q?eYukqysiJ5>a~B^Nncvv^3B6!y0X_&C-bVu9iVo0_|02=GK>^#Oo#B zCJ3wwNAUMKK4lG#u&_Qn-)~_GuVr(X?%9PV@9b=b=bG#FcIyJ^gonH5WwQqkGx=CA zr_0P?nb>;Dsf?g&wigXmyxvlDCHE#`{BEyPpOwkY(`M8~Dkwi%r-&(AQ-&WFGcO zGa=PzZ-a;1GB2mzV`4^vF$1^Gvmz&-ATpoVcc<0bt2FknSJydV68rb=FC(5UBLy{# zR75BbYXRJG8AbugQuh$|na$?QD&%l5D(dCU$vh8pCq$v}?CvTA@|dpQDXDBchnGfK zpg1(PQ;=^W4-k*dH|}sE2l?j?99N2jB?}jql~Gc#yR3G?NWZl9cYa!#_|0Q^((pUr zm+dmRtay7Y_2b=e1{u}~A16;ueSNqNAJYe+)=+IiHs@1+kEubKl@GAc45Nx(Zr%vo z5eWGhqW3R@(Vt=IWo3`r4l>8Ke-Ltor7;4f^5*BY6ag+?#XoPqy@Cz=H7oPMf-ai^~`@n$WLf{$(P4G@uj?By-@BB>) z;DbSa87N88a8a*#i}>^T%FQ+6>$8H0I2EW7Favz_GU?_VdU$yvQ@ZK6 z(x`u<$5WW1p_QbdLw7~+af=tTRW<5ZR$iYm!P3&e^k#anbZ?l4(D3 zKv+=W#mrSJ&6}L;Cc(=MUb%D|OET64f+<5U#WABCtm`zLr zDL$QzW_Aa{b~O0j)!fx}b8>#~H}V$L zK}QX+H0S;Im3yflRR?R zC+k17lk;zX8L4l2MH>iYP;2h6X|1hYnuu#ieX}ZhOjIh|!zQN)xqJ3v>JJ8jblNek z3=IW)R(2pL?2gU;WnadImr@ZM88+sG32dpb8+q!(r?oOl0`;A!n0!o?21e6=Z034% zG-J`=Z2^x5??8U=G4}HAfu;HNnzSfa*H0AJ`!NSeVZRfrERHq_uD74aW-kOjKI=Ea z@VN3tC7p9m;M4{~49Cs)cf$dJyN?NPx>hn(e?P1izO3>+SAFmB*cN-I{cwKY5|g>y z0c}4!!dbs>?*G8oWH`F}Jz#7__Oz;+)voA);W$+#zePK_f0lRG_u#6m=Mg?d$#{X( zeXW^ZOih`j);*&}{;RjJ>Cm3I!df~40zi55_K#{G#}70k+{)6ik-TxhVvX)y(p&zNNqo(O;lEX4+{!LC-A;) ztptIrdDyp4@mEV!-n;w=o9GGF>2P?sk6Z-#%~6>}NR%`Dq`Q+k%&0b?AgR{9nIf%w zfqzH3sgNR=*hJFWT31&`yF&HLm@i7d!=V+n(_(L)ld{Xrrx{2YFqcQTjSEJ=4 zwzv@PQ4RZRk0Dg zh=AsZdSp6>rD;vtZ+EMA|d7T*4#NJa*lcF-G9BOlm_wbhFQ6cpK# zQY#z41}W=1VYgzqLLoyu1R*>8I*mC}r&mg-Sk60QGZl?6l2Jo&xr6F8><>fQSpJ|x z*K5`dN&U(9EBp$0FC$+y6|@~Z)=C8wt;RUkiPElcmZq`x9u$CtpN^?Vxb z6E2TO0pT|uy-w`-WF5LOO#HMZTbnN$GPdJI68YH1Bo4$HC2E(~Jw?Mij*RXb@OL5T zml^!d?$)ls3pCje99Q-^;}($~z1V~}qVFY3HFZjn2$s6qI!lf`>FNdf4Ctqte6=DRU)wr1qjm^GoO6qSm#8M4-gD^|N^FJLUqOnJ8cF2*Q zHmYjsmMmb=oy^CtS3gQ~Y4bi!(i5|Jr~!73hpH2xeu4R7x*uXW&~_J=3(@1$dhLad zX?HLfe!{D>I+rpxDLN*_>r$H1xB$p14x9Vr#?n}ppU|Wcg^K+ss7Zo4uxTeFwy9j=J+uZuG6t>A<8qOTU#O`4I z(0*;b-bUcMWG5g5oj`*0k}iLF%-Y;M{r&sn9f8ySEZ=UI0(I`VgBcwBs1AVB;;Scv zhS0Y7d*dam+OTgAV9IBOg6P(-^X7(b^96E*8G`X_<&Y(I?m5+_w`OrC7|Jzr1!?*6 z4&@aRL_ZU;8P!X+jJi2JXi8jp;ls(-p1(`HyPBudQWICR46XGN#X0j%O-qQ3AuX*+ z{p;G;Fv`pnH3~MH+-;@Q_;CiD9h_Q-NFO{|^?f6XeDvS-o;KMYO4aVEze292_E_{K z?gsh)g?o48S7f@Wq-2S+o8)!LtNeBXTtLc#ie(g}d4Y(P&`VvBZyP_QeJFEJSQ814 zfPiRu5YBPIk1uB`2D)JcbvRpdTlZe=g@(M$utIGCt8df zLfvzbQnivzuRQ}JspC6SE1gH(*986`0#S^bW@!gE>C7F+t|HvH`tmjF$NdAbx39`* z{pKPw*u8GJ-1U|d1C9%k5RWCxUr<9 zA+BS=wsAdfdn~Qp>;@<-^le?;G!}92Hywrfo~>N02LJZ{HOHG@{$n~jGPwDEp^NR& za-_UBrUyxXhW&-p!3#&2-+t?+Ue%QNYcmf&m3m1ugiMfYVCmv=>9#CHg3H&z<_ZJv z=3U{K4AYua6sasJ0^{2&zNj%Y^n{_ULFgYkY5tk+;Fk4;l6pYZl+C;@wV-cc+yT~x z#Pn#HB}V9_mW5TBTR!sD+apAScecH)JF1w1ekm;ZB%1%4|ASJyq){+Vx zAqU1!eoD}mcur-?I9i(d-#Rb-1;{Lur{!;bXS9yMlF=P@U&nErd4&jsoaNP^zr^}%0-Fxmlspqo6PH!p z0w{_)*+hF@tZ7p!y&d?~Dx*e~lAQK5eGyRyb;N518Sc~TcXIOjgc+t=pL*n++3?>q z-N4|h8vIq&Q#C9qR1?~>q!lR%U8aw6Bla&=Be`hB2c)dOfz>6!JSPe*8=plMK_}Ah ztO#Y9l#%b9QwSkS0)9l{q&yn?J%KtQHjCAG{b%gy-xSQ*)>biPghgXf_+JA)HiV$}Uvsw0-<2C|9f&PGhrj z`0;VMm5Im3TZ1`~n!4ZzGLi~o0)9c4gU;|32^Ll(pQEdu@Qr~7PD+9J{gnc9oI(}{ zm$`V4U>6;fStVlwmPDDa zOcr_7_@dTsy+lYCgzX0Rkt!$X<0pZZ zg{yu@5mWuuv|^eW3lyjM4XCrUbjf!+sZbm8I4s2Q>nZn2yEZWS#dBIGD@NOgH`41q z-1C`u6Q%EJ@#TnwWlND*AAC49<}X#-_6m0ALI)RoW%gk=Y?Ns zh#W;l48mkbY%J8@HZ1j=p|wNb{Z#;z>Y6I*M*YtM(13asPbD>4*nE}gv0GP)n=mTz zSyqMc`})&KoANT-eJoqd<~uo`^FOg|{ePYrioJ5D_IP*_k%MwuQY&XhjX4Oo2<4xe zj^Yg2@YRqReJ#1kd=fLoiVuB1)l^q2Ta{`?l+lM15)d@h)mi3S&DYJ*dfx+sEv)VL z*N4qaz|d~P?1!}aja9{r9if~DeKO?R-4EweD~U9V*pe{{bK|eoHhp*lxIXQ@CHgX3k^WJGOC4PBky4^cVLD!^(piH&4%ys8 zK+NpHSN-ajnEJ2pv2%zB7`_6%W8u;iU9^{1p?mfpc!~V8vBCYyOALi5HrUTsb?k*J z9gTX2Q!KlHs6(WW8N0A90nCe&3fLsWOfaW-#g^;F*>;N;xBrn_!b`%jIsN7bH+jBF zN?k4gka5OXpJ3!>#SD~r5=_zOginhtJoTaY`EKv8@5y&k?s^wIR$bua^R)bd;n_f8 z*d%*}kFD7p%g`rsLfbC%h<+kXiw7e zefZ=?oPd8-c3Y_OgX309-9lOJP&~1%T%>A& zEFM4U8~itXN4qCq8I%Clihz~hlJKjPu&I*p*`fin^*Q`*QcC|$m44)Y6#ri=0K=B6 zT?lJ6x3tj41v08!<}_F;t3mF@$nbb6Jtp!eCpnODu|ZBy0o?S;9w5k)(Z{S&XUNE~ z?sEc{cO_SAxVww>UKSu+MiX6=8%eL}HbxZ5a@Q~0n{-7Lf#jiW2|-HJ3m(^5zWv)(f3)PuZm^3@vTQ9S5EU zKT1Sp=va6km=&;@bPDg1x+Nm2Qo77{al0=mW|O10lpkZD#A=z``*|D5xviacnWsYk z+Q*F-%P+&`N^kah2m3a7H(f?pgwACb@ zH%6Cx8eMHrDK?I8Z7P>E_w;;v%BptO*^2+NXV5_ny2pRs*#U}Iz>L+hM7*5J$LvmkLkWi%R!_+otF zwMlo&L;WxElhlW3(&_I217Ng=%72GchbZ~$aee*p4G0tj=5B1Twy~w)Y^5>m1vI3K zo62i8DN+hzniJkGLb;gsgi}uO3<;{Nbq~pKaU)2%<1F~;2qUFzpKT)7emt&UL^d}E zRkG^J7FbwWYa#|406L)*SX_i$15R@0r%@RXgK+<1zuwz#pikoRKF?1GYJ@XAT_ek* z7UQ85*o^gTRML}^gii+^&2m!5h*z=PCg++UzsAOpynv(bb4CsVn`?3@6m{J=?X|XnO;nw28gW$FpDWK=UyuzgcpdCvo|^uM}+`M{!v}871!(Oo0mf zWpV%@jmlknteCGN2?^Aav49W~atCOL2ShU%$v>opX@6yE5>oZP))Yzw1svlm%>N{WS2HXtSj{``4$bI_NkP35TZ8sU*f|D-8ymhm*&_1_G9t&x=~O(e@i?l{lUDg(0prE%mldxz z`6aQRgv&5Ata&dlm=@MZJeV{NoEM2oMr9R;YqFi9rPYLX9Un?VGym3?qT4$Cs1!V$ zfSg|*A#Q)0JlsEKE*6)5^fgU;C}QY-QR@!wZqTGA2n49pyqh;I z(1QtJ$N6$eJ~j|f!extH(8U93v$Q6= z?ERw|`-gki)P5w;j9paEN3uD>J2d(r4%2OFY1YPE1dnT5KmnVP=I*PvE)7i8tJ6PN zw<0U;&!lpg=(xDp*xDM5)Zbo_{rc#et!12AvSV7b^`;daYE(+9xG_~ zEj`_BY@TX(XX_inf#(@Agh3bMpb9PYM6%-wym9!GRN?3NRukZXuBzGon`L&0Up8n?KJM6&u zzc@t1@8OCU0VG&5H?sW(6c64iztG4KTw*>d%Rp#pb#FC;%B*eSg(#$bGq!|6Z;P6h z5izpuiWEs<*ifl>VG6o1E)^>W3zZo7f@MCxEAfQwhXISKCx-*j2)=0Op_NLAeo!D> za3CCJ77QX0=Xq)6I~9wbUh*WS&mj$%-Jy8Is>Nz>qWqJKUY{Y2|4d4}g#12Om+K&S z44F7ig?DbgSos&J-)mKB$sqyp!YjGs-k1-=o_;#N(E>B|L zlUynh84QT|sCKAs+Xs0S%Mb~5BZ1iG9F;>)3$ZGY&)SFm?LdIw_jzK#ANN6Bc@ zb4o!EzSK#T{BVWlpCgX&YD&I}g|YGK(Gif-${h#_{!cze_d}cSBYhTDBdpKLZ!QiZ zh%#`?+pvFRXO(~5xJ?(7Qd(3>)iyQ;k03;lBIU>Opmx8SpWX&V`+=763;NnypW>Z< zm)TRit^Sv9z83ZJ0;OhvxT|ECQO8FxfG#9q8+#J}5~dxtH+Pn(kagx1VAS;y3|7R~ zeSNFBA#~4@w8a#;cZD=83ZH#?I^Jh}^8_bh<_Kx^k!-@QT#v)#ys7@guDq;FtHqt= zZGK%{Lwmb9t_MbFq`W4Zh~dexV%+iayDYxGo*sO7gWu%L_NRSh+*kAK&XGRug^t(#kyS`%o*?J=#1UFF>eaMh5sh+BuCI3JFlwEUsZJ$xmhOak-s_P0PG;w4VZX$C31$l_ zEUwp*3l+XCKVO}x?cr;q^=wpt$P)unl;0X6{(q{Mr}y?ZK^sjvj0XyaA%iB4M?Xat zr*>)P;5|%JDnsk*W$NP=aBTlid|C>- g`chl_fkEsIHrDrtk(m&Ka?mTuNGeEFh<)?_HxFC_7XSbN diff --git a/testdata/snapshots/darwin/button-light.png b/testdata/snapshots/darwin/button-light.png index dbf5a787d0899180639263a6d4aecd42cf2aa834..59444713ce669b22e0bfbe7d609fab7b6ed34ac5 100644 GIT binary patch delta 9651 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 W&^J(0f~)z@TV7g4s$9|}_&)$5QMQBt delta 8619 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 diff --git a/testdata/snapshots/darwin/number_input-dark.png b/testdata/snapshots/darwin/number_input-dark.png index 959270c2a66a2da3103a03cf7b51b8a15f9d5b56..102c51f07f6ad6573b8ba2c1a948848d6b1663d4 100644 GIT binary patch delta 2757 zcmV;$3Oe=UH=Z|;BmrfyC1?+S1*oYjjRW|1Z$c6hFdzz2#3D!$VgNw}@qvPfk212O zpr~l;u6@{cT&<6et93iHT3b8T-O=rgyKC1+t*@%3R(EV?t4J^k_@D}b@U8(O^6-&F z!oArE;acs|X=|$+;Qv3&keqY97iW^+eCK3xZg>4|EP^12Gl#{?4KKF?C--ub5f3Gk zFAxoXUC+W!EeW>3S)!0txf2&x2+2niCH$kqFm_swfXrc{LL?o zX)LC(n8tSFX)MbyB9@&R5#=s(75XS`)MycZ%Zh%<7s!;Z^4BI$^HF*T9hk;q8jEQx zrm@a6jg^SSFCVG zLw(|~@V_qn!zY@Y^w>DLM7ktt%8KbThWQWr&$XgZ+<6M&YQ= zoGH1s3j%&~YJQ1(g-T)qowa19rU$yV|D4yfR%{Ox(>ox8s6C zGPZ4bIWbun>>?YE9bT1^`tQ~2s%{v!o;-f?%0*$Mii{)0k%{r+^|la6t^-rUsr zXE!#AMIyhxUJ|jmw64zHMO0dEhz)*5xH$Rs^^%HR)~3!{n>wqbgY*sc!XU5%cEGNe zVMjy_QuZ~DCO!tqOg1>u99UNULQ`*Rn3 zQ~Yh`&Qo3OdF zeue&}#N<}9NmpkO#vh8YwT0t(Ur$fRVw|ssr=hv&2cv)7{m-+y;*Jh#=XqfeYj#+( z!R(svMJB12KrA3 z9hMd|TC4y56B3KndZniNm87YIy?w&`{EsbvW8t_7!XPR;RCcKBdQD~LD5-2VTRX>n zmVYjDYW)Bf&v0C?kpUYi1Zh}%S&pL8YIK91O)9Optrq1$^E6N+{m+txp5$!&EdT@X5thBib zskG*1;~Ssu77p)BUYU-F9JSb4UCHVc$}QD7YBAnsyI%%&Jhqo<%lGWun)&>v0gGVmk`|;MyMTeHIWEtk0;&1mqtT}>LAkLg8x>GU3Fzzzf+ZOYKwH3=S zZZg+fX44OjWEqD0pLwE)W#tm-ZHxIQJAX}+xwvpV|6_M@k-4}KF&1lE7h}K<*a5p< zj-3NLG&D4{|5sxl*NK6X!4^)FFAx!vAP)|Iu1oC1kL$!ws>MX8Mn#17ag(zw`v|At zc)sP)F_K z`)O<+H~Aw==eP|}jlrmNQwSZv4%h)ZVCR(BJ=*N`ahwD}5N8hFvq_Qd&vLeMxi43S7Ai~u`e2kd}dPr=S19T9!BbI(UR_Ye`hgLm+*H+$D(v5OfI$?@EdUHiC> z*dOp*%!o)~9BX!1v%{Jl*6e!3nw>^lpwSk82+zpw-M{t;&ww4U19rg9X|VI^>lqN> zZ!(#SOUi^k1VNBTjFV!=Fw9>*d}l;-MD2HmNy%wKH-aF@BgRSB>@w%4jfjr0SndfO zsO(VLp|V3|*W)U?LH>R#mc5*-xnQ+ggMtEtZd7)t>`>XEvg=uu-P$$F7>0Q(YqQXQ zfgnit%759pW0$I;I1b?VToHO2*^()tl}cL;IY ze}D*q^d|@kf|CtF5u~<=yteKou5b)mtS7;H_kF%D=bZPJw|w~hILDvL?k_648zWb* zU%T>h{>|qvU*p*!x!89hE@1~d*uk!U5wL4*ZGAE~^KENq;q|+Cc6c^EeT>T*b93ZU zTxw&rvD#Q|?Ei0LZ{Hg2?K!i({e5P7a_;e?f&TL+J5D^Eo$fl_8NZ^9)y8ULwXu!g z#-<@ut3L+%&kgL~OH?Yy(loty_s-J$4_n(i@msKi9qeG&;MgrLEiW!D$6d02@alPA z-&ybMytDJp&O5u(zOy^{AFu4ExlHCVnak9?bD2t8+5PeN;Nfgss_ayDDm#^3c`Li4 zWO!(Ba{Tv9r()vM`2FFb!T34sU)n!)%BLN7-`qCpJI`=tgNob&tV5U*ukz8 z*cCIK-WD^RrY6RwCdQH^DMs3VWf|;X2Rqo63cCaE+S@AaZ57gyj&#i|UAx6|j2XM8O!3%Ck6o5BMkq@Wvdm=tDGG^X>@tcFV@)&m zu@q&Ace3xxWO&RNS*Edj=k0yo&wI|f|D4ac=X>t`+;a~BNkb;e94xMcdI$km-WMsp zr$BIn0zk$_CjW_DKX z{IC9yJ78X2<|Vkc_eM?N)S)kb;4K6Ycwd3TK%)SP&plS8`oWOI-#Ssfw7>1cr?u*q zBbqjf9z!a4uvf%U;2a>VD~GSPHY|jg$jEEq8LvY6fG=t}TJ4VWEyNyv;##>fHyRv< zmKt(@fI5kotMm#Fk{DWP*xcmXX)}+%2QR2hZ~rxY58kB$f}=Dw#&5~bZpjDrd+?46N!LWc8%)qX9!PGGne=g!q-Z1F z)-Kol@figuEVI|&L0iFD-^Hp1CJ!<}SOpS$3i#Ln{A(5c7k@0dd9vq~*TKOCfGWaX)xG|M^-}rkbbBm<<^Z9VbQR~;Kx~bb>v2r5zr=F)s}m2uylMIcP?kj zTMeUN2d1)%J3H&`y~}$X9tNVA$HapVLVC*-d)h z?Nhx?CI)-JX~ILlwmqgmwx&u~d#C6bAWYgWzuQLP3oi(AQaqHD`x+(1ZG+}AWoNs- z;Y4(?Nx};X=cn#RxbI}yl204dH`4rTs>rn=Ioa%qilWsr?0g2^-P@6Nm5}Jd&Q92W zXHC5IY~`WU@o80+uOa_>YPyWm_8N0>mMHL)McV@9)JY!@hkXViu(QCRjnS2DHv~cJ zt9!J!JP=wyVNvDU1Ej{!Q>PlX>sNvrlIpZPPg=%ag+N1|qAmq-a3ViX^(DC#Lcg&V z&e}9Slj6lTgNE6v%$NlW$DY*W!@+mZu?4KFHqaqcvAF!E8}n@4BBSw@915()Z*^-R z5ol2^PuG~EZN^a)wVS(`@s#Q7Zm!Z+8-N5Gce zMQW;{QH9o-rSMK=JH$(4kHKnrM*sN69qI*!iCa|~k+|gYIxUV^SF|FR*EGfHjqA)! z0NqDs)#^G_ebPiZR59)haVs1{KivYz@>D^?g#@>HKlGHx znBP=KtWYS>-C=Mf)k8&62ypClyzKqN8g8b8O-D75?snZsc?bQ51siuRY7(`_^bNL^ z2poTokvTyb%wN2$*|658?ak@=kqV3bY8!{K7V|NB#}v*l6;nsUF|JNu$Rrc=TDdu{ zV2?gM2B>6?_KHr92eQ`lLdr&(aPEuW&l3kL1=lcC4&RxfQ@VD?L(Hnnth-fSR9UPy zzX3jyT_oDC%h#3rY<3XfpVId{2@B01Tqx6zb@u^OPT^4q#MEtVKR7AwU({DIs^Vh= zl_SguNCks7JW`?0m2Hybb}mQ|UnypUHy2Ri&X_-d2#ooc1Wqn!9D`7^)`n@k&%vj= z<{b9MkCfE!|GfWJZMhv$CNz8y<;2Hi3e{V_)t&!PKG;7or$tZ_{Iv0?_KTqq-|vU* z%?#erAm`vWGV-ggd?VYJrf6NS0dco+OQzTo7x}>e@9lFgVCH z1e#(dBkbk{n9|xG@*QTqX@;DriEPzoz42u%FESW?-*c5=N^@HTX#ufP4RQOxI(mYg zH5z?VDo6Unv6_ef9E*o3{%o@=LFlSM)L?(H98|`C!Wz;h%FDeHU6SwmQ9-J-`3i)r=V zL&3$D=4Nq7m{;d<6*Z+>Px#P^(7{(nY0@};aWnqwV$`UMj)bX+an5TXqs{B|quvlF zCywNB7-z|DDs;CE*e{=K#Oai@fUp&j7;=TDr)O3MA=LL#Lrs9ZE zuPvR=yMY>*_$OONv(oci`z0r@hMn~=uLcJqBnrZF?6*Gmgjh7N3vE&2l6#uZbMg3S z=Rdf&2Vts3L+C2em%3e>;zhwhsZuX7qh9R~PZbko5@;VsECfZlY}7DG23zRPCVY>6 zTNf~Uk%bU7>s@qi$;ehmxnp~n_N(1xb=5i>bMu(xCL9T1n`eFNs|pVE(SgSpT@Xn- z*7j3LI%(vG+A0b^Bl#Bpr<5Ld2}0^+ncmDU{J{f#iDqg?>5-HJT)A#&W>BW*^yJ?O C|D_24 diff --git a/testdata/snapshots/darwin/number_input-light.png b/testdata/snapshots/darwin/number_input-light.png index 74f478182c84af19eadf0766d783adb02f6f7e43..f3ab0a940cb58bbb1db94dcc561f7336aa5199f5 100644 GIT binary patch delta 2570 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 diff --git a/testdata/snapshots/darwin/spinner-dark.png b/testdata/snapshots/darwin/spinner-dark.png index a34bd86f06d88611f1b7cf4af48b34c0b80d5d3e..1a9fe927e7d32782754dd5b999da6bbf054d099c 100644 GIT binary patch literal 4519 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 Dx~Dn+ diff --git a/testdata/snapshots/darwin/spinner-light.png b/testdata/snapshots/darwin/spinner-light.png index aed49d0c2c1d4ed24ce50fa267f262f97ad97793..035390969246a19afc952e91bec9e5ea420869d7 100644 GIT binary patch literal 4225 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 diff --git a/text_area.go b/text_area.go index 7dc8eac..b9e82b8 100644 --- a/text_area.go +++ b/text_area.go @@ -55,7 +55,7 @@ func TextArea(c *ui.Context, value *string, opts TextAreaOptions) InputResult { var r InputResult look := &textInputLook{disabled: opts.Disabled, readOnly: opts.ReadOnly, err: errMsg, area: true} r.Element, r.Input = textInputFrame(c, look, func(frame *ui.Element) *ui.Element { - in := textInputEditor(c, frame, value, opts.ReadOnly || opts.Disabled, ui.TextAreaBase).Grow(1).Padding(d.Unit()*2, d.Unit()*3). + in := textInputEditor(c, frame, value, opts.ReadOnly || look.disabled, ui.TextAreaBase).Grow(1).Padding(d.Unit()*2, d.Unit()*3). Placeholder(opts.Placeholder).Label(opts.Label) if opts.MinHeight > 0 { in.MinHeight(opts.MinHeight) @@ -63,7 +63,7 @@ func TextArea(c *ui.Context, value *string, opts TextAreaOptions) InputResult { if opts.MaxHeight > 0 { in.MaxHeight(opts.MaxHeight) } - r.changed = in.Changed() && !opts.ReadOnly && !opts.Disabled + r.changed = in.Changed() && !opts.ReadOnly && !look.disabled // Taken before the editor, which would make a plain Enter a newline. submit := ui.Local(frame, "submit", func() bool { return false }) in.HandleInput(func(ev ui.InputEvent) bool { @@ -73,7 +73,7 @@ func TextArea(c *ui.Context, value *string, opts TextAreaOptions) InputResult { } return false }) - r.submitted = *submit && !opts.Disabled + r.submitted = *submit && !look.disabled *submit = false return in }, count) diff --git a/text_input.go b/text_input.go index acacf0d..961e082 100644 --- a/text_input.go +++ b/text_input.go @@ -53,11 +53,11 @@ func TextInput(c *ui.Context, value *string, opts TextInputOptions) InputResult if opts.Leading != nil { opts.Leading() } - in := textInputEditor(c, frame, value, opts.ReadOnly || opts.Disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 10). + in := textInputEditor(c, frame, value, opts.ReadOnly || look.disabled, ui.TextInputBase).Grow(1).MinWidth(Density(c).Unit() * 10). Placeholder(opts.Placeholder).Label(opts.Label) - r.changed = in.Changed() && !opts.ReadOnly && !opts.Disabled - r.submitted = in.Submitted() && !opts.Disabled - if opts.Clearable && *value != "" && !opts.ReadOnly && !opts.Disabled { + r.changed = in.Changed() && !opts.ReadOnly && !look.disabled + r.submitted = in.Submitted() && !look.disabled + if opts.Clearable && *value != "" && !opts.ReadOnly && !look.disabled { if textInputClear(c, in) { *value = "" r.changed = true @@ -75,7 +75,7 @@ func TextInput(c *ui.Context, value *string, opts TextInputOptions) InputResult // textInputFade eases hover, focus and error colors. var textInputFade = ui.ElementTransition{Colors: true, Duration: theme.StateDuration} -// textInputLook is the state a field frame shows. +// textInputLook is the state a field frame shows; disabled gains any disabled ancestor. type textInputLook struct { disabled, readOnly, area bool err string @@ -86,6 +86,8 @@ func textInputFrame(c *ui.Context, look *textInputLook, build func(frame *ui.Ele k := Tokens(c) d := Density(c) outer = ui.Column(c).Gap(d.Unit()).Shrink(0).Disabled(look.disabled) + // One disabled state, the field's own or an ancestor's, for build to obey. + look.disabled = outer.IsDisabled() outer.Children(func() { frame := ui.Row(c).Radius(theme.ControlRadius).Gap(d.Unit() * 2).Cursor(ui.CursorText) if look.area {