构建一个能看橄榄球比赛的 AI
构建一个能看橄榄球比赛的 AI
注意! 这篇文章写于 [[elapsed]] 之前。 虽然它可能仍然有帮助,但请验证任何信息,因为我的观点和实践可能已经发生了变化。 🤖 ai
橄榄球数据存在一个缺口。
我们已经掌握了重要的时刻——达阵、射门和红黄牌。 结构化的事件流能够很好地告诉你 发生了什么。
但是它们不太擅长告诉你 为什么。
在 Gainline,我们围绕上下文构建了整个应用程序。 我们希望为橄榄球迷提供一种身临其境的第二屏幕体验——一种比分线更深入的评论。 我们已经引入了天气数据、球队统计数据和球员资料。 我们还用 AI 生成的摘要来丰富它。
但是我们受到所获得数据的限制。
我们不知道裁判为什么吹哨。 我们无法判断一名支柱球员是否在默默地主导争球。 我们错过了裁判对队长说的话。 这是一个问题——因为这些时刻在试图讲述比赛的完整故事时很重要。
所以我们问了自己一个简单的问题:
如果我们能观看比赛并自己生成数据呢?
这让我陷入了一个非常有趣的兔子洞。
在这篇文章中,我将向你展示我是如何构建一个原型系统,使用 AI 观看橄榄球比赛的。 我们将了解如何从广播公司的 UI 中提取比分和比赛时钟,如何使用 Whisper 转录裁判和评论音频,以及我们学到了哪些关于如何以低成本和有效的方式运行这些实验的经验。
虽然粗糙,但它有效。
上下文至关重要
它提供简洁、精心设计的体验,为球迷提供他们所需的信息。 我们汇集了来自各种提供商的数据——实时比分、球员统计数据、球队历史——并尝试讲述一个更丰富的故事,关于球场上正在发生的事情。
大部分都运行良好。 如果你想知道谁得了上次达阵,谁是接球后卫,或者谁做了最多的带球,我们都能满足你。
但是橄榄球很混乱。
在结构化的事件之间会发生很多事情。 判罚没有得到解释。 球员们不知疲倦地工作,但这些努力永远不会出现在统计数据中。 支柱球员们会花费 80 分钟来耗尽他们的肺活量——如果他们得分,可能会被提及。
而且我们看不到任何这些。
这令人沮丧——因为它限制了我们 AI 生成的摘要。 如果我们只知道发生了判罚,我们就无法说出 为什么。 我们无法发现一次糟糕的防守或者一次占主导地位的争球。
最优秀的橄榄球专家不仅仅是看球——他们阅读整场比赛。
这就是我们希望 Gainline 做的事情。
想法
如果我们能自己观看比赛呢?
不是字面意义上的。 我们无法聘请分析师来观看每场比赛并手动输入数据。
但是 AI? 这可能行得通 😁
计划很简单。
获取橄榄球比赛的视频。 将其切成屏幕截图——每五秒一张。 将这些帧输入到 OpenAI 的视觉模型中,并询问它发生了什么。
我们可以读取比分吗?
我们从一个简单的方法开始: 什么是我们可以轻松检测到的? 让我们从基础开始。
比分是多少? 比赛时钟显示什么?
但我也很好奇——这个模型 真正 能看到什么?
这是我使用的提示(通过一个单独的优化过程构建——改天再写另一篇文章!):
你是一个分析橄榄球比赛截图的 AI。 你的任务是直观地解释图像并提取结构化的比赛信息——包括比分、时间、球队名称和比赛阶段(例如,上半场、下半场、全场)。 以清晰、结构化的格式返回数据,适合以编程方式使用(例如,JSON)。 专注于识别所有总结当前比赛状态的元素。
结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ```
{
"home_team": "Bath Rugby",
"away_team": "Harlequins",
"home_team_abbreviation": "BTH",
"away_team_abbreviation": "HAR",
"score": {
"BTH": 0,
"HAR": 0
},
"time_elapsed": "00:36",
"match_phase": "first_half",
"competition": "Gallagher Premiership",
"current_play": "ruck",
"bath_team_kit": "dark blue with light blue accents",
"harlequins_team_kit": "white with green shorts and multicolor accents"
}
---|---
`
它奏效了。 效果非常好。
但是视觉模型根据上下文大小来定价它们的 API 调用——图像转换成的 token 数量。 每五秒发送一张全分辨率的屏幕截图会很快变得昂贵。
所以下一个挑战变成了:我们如何更便宜地做到这一点?
## 减少上下文大小
让我们放大到基本要素。 如果我们只需要比分和经过的时间怎么办?
如果我们将图像裁剪到 _仅仅_ 是记分牌,我们可以大大减少大小——和成本。
我首先要求模型返回记分牌的像素坐标。
它没有奏效。
我无法获得可靠的边界框。

我不太确定为什么。 我尝试了几种方法。 我认为可能是图像在内部被调整了大小,所以我改用百分比而不是像素值——但结果仍然不准确。
然后我意识到:我不需要边界框。
记分牌总是出现在一个角落里。 裁剪到那个角落使图像大小减少了 75%。
我更新了提示。 它完美地工作了。 便宜、可靠,而且不需要复杂的图像处理。
### 这不只是一个 Diff 吗?
我们真的需要一个语言模型来找到记分牌吗?
广播通常将记分牌放置在一个一致的位置——通常是左上角或右上角。 我们能否只 _diff_ 两个帧——一个带有记分牌,一个没有——来检测 UI?
理论上,可以。
静态背景会抵消,只留下叠加层。

这是命令:
1
2
| ```
magick compare -highlight-color Red -lowlight-color Black
-compose src frame_000015.png frame_000016.png diff.png
---|---
`
虽然粗糙,但你可以看到它在工作。 我们清楚地识别出一个角落。 我们可以裁剪它或添加填充,并只针对变化的像素。
整个项目的目的是找到生成橄榄球数据的最简单、最可靠的方法。
如果这意味着使用 更少 的 AI——那就更好了。
我们根本需要 LLM 吗?
我们从大型语言模型开始,因为它们是最容易进行原型设计的工具。 我可以将图像发送到 OpenAI 的视觉模型,描述我想要的东西,并获得有用的结果。
但是我开始怀疑——我们甚至需要一个 LLM 吗?
我们只是试图从一个可预测的区域——记分牌——提取文本。
所以我尝试了 tesseract
,一个开源的 OCR 工具,来获取比分和时钟。
它有点用。 但不够好。
问题是质量。 模糊的帧、低分辨率和复杂的叠加使 OCR 变得棘手。 当它工作时,它工作得很好。 但是当它失败时,它没有提取任何有用的东西。
也许它可以更好地处理更高质量的流或一些预处理——但在我的测试设置中,它不可靠。
所以目前——LLM 仍然存在。
奖励:收听比赛
一旦我有了比分和时钟,我就转向了音频。
橄榄球广播充满了上下文:
- 裁判麦克风解释了判罚决定。
- 评论员添加了主观分析。
- 观众增加了气氛。
我使用 OpenAI Whisper 来转录音频。 它工作得非常出色——给了我带有时间戳的评论,我可以用来丰富结构化数据。
现在我可以突出显示一个支柱球员令人难以置信的转换,或者捕捉到统计数据中没有显示的事件——比如错过的判罚、冲突,或者 Freddie Burns 过早庆祝。
我迫不及待地想正确地整合它。
与其仅仅展示事实——我们可以开始讲述故事。
接下来是什么?
这是一个原型。 它尚未准备好投入生产。 但它显示了什么是可能的。
扩展它将是一个基础设施挑战:
- 我们应该启动 VM 来观看直播吗?
- 我们是否运行分布式工作程序来提取帧和音频?
- 我们如何处理不同的广播公司、格式和语言?
然后是法律和伦理问题。
我们并不是要取代广播公司或记者。 但是,如果 AI 能够观看一场比赛并实时总结它——这是否只是自动化新闻?
这是一个我们必须回答的问题。
这是我一段时间以来做过的最有趣的实验之一。
AI 正在超越结构化数据和客户支持聊天机器人。 这些模型的能力呈指数级增长。 作为一名开发人员,我的工作是密切关注这种发展——了解什么是可能的,什么是不可能的,以及局限性在哪里。
对于橄榄球——以及更广泛的体育运动——我认为机会是巨大的。
我们可以用更少的资源做更多的事情。 解锁更好的见解。 讲述更丰富的故事。 并获得更多的乐趣。 发布于 2025-04-15 00:00:00 +0000。
[ ``` ░░░░ ░░░░░░░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░▒▒▒▒▒░▒▒▒▒▒▒▒▒▒▒▒▒░░░░░ ░░░░░░▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▒▒▓█████████████████████████ ░ ░░░░░░░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░▒▒▒▒▒▒░▒▒▒▒▒▒▒▒▒▒▓▒▒▒░░░░░ ░░░░░░░▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▒▒▒▓▓███████████████████████ ░ ░░░░░░░░░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▒▒▒▒░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▓▓▓▓▒▒▓▓▓▓█████████████████████ ░░ ░░░ ░ ░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓████████████████▓▓▓▓▓▓▓▓▒▒▒▒▒▒░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓███████████████████ ▒░░░░ ░░░ ░ ░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▓████████████▓████████████████▓▓▒▒▒▒░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓█████████████████ ▓▓▒▒░░░░░░ ░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▓██▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓████▓▓▓▒▒▒░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓█████████▓▓▓▓▓▓█ ███▓▓▓▒░░ ░░░░░░░░░░░░▒▒▒▒▒▓▓█▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓████▓▓▓▓▓▓▓▓███ █████▓▒░░ ░░░░░░░░░░░░▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓███ █████▓▒░░░ ░░░░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▓▓▓▒▒▓▓▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓██████ █████▓▓▒░░░░░ ░░░░░▒▓▓▓▓▓▓▓▓▓▓▒▒▒▓▓▓▓▒▓▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▒▒▒▒▒░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓█████████ ███████▓▓▓▒▒░░░░░ ░ ░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▒▒▒▒▒░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▓▓▓▒▒▓▓▓█████████ ███████████▓▓▒▒░░░░░ ░░░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▒▒▒▒▒░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▓▒▒▒▒▓▓▓███████ ████▓▓▓▓▓██████▓▓▒░░░░░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▓▓▒░░ ░░░▒▒▒▒▒▒░▒▓▒▒▒▒▒░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓█████ ██▓▓▒▓▓██▓▓█████▓▓▓▒▒▒░░░░▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░ ░▒▓▓▓▒▒▒▒▒▒▒░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓██ ▓▓▒▓▓████████▓▓▓▓▓▓▓▓▓▓▒▒▒▓▓▓▓▓▓▓▓▓▓▓▒░ ░▒▒▒▒▒▒▒░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓ ▓▓▓███████▓▓▓▓▓▓▓▓██████▓▓▒▒▒▒▓▓▓▓▒░ ░▒▓▒▒▒░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓ ████████▓▓▓▓▓█▓▓▓▓▓████▓▓▒▒▒▒▒▓▒░ ░▓▒▒▒░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▓▓▓ ████▓▓▓▓▓███████▓▓▓▓███▓▒▒▒▒▒▒ ░░░░░░ ░░░░░░░░░░░░░░ ░ ░▒▒▒▒▒░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▓▓▓ ██▓▓▓▓▓█████████▓▓▓▓██▓▒▒▒▒░ ░░░░░░░░░░░░░░░░░░░░░░░░░ ░▒▒▒▒▒▒▒▒░░░░░░░░░░░▒▒▒▒▒▒▒▒▓▓ ▓▓▓▓████████████▓▓▓███▓▒▒░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░▒▒▒▒▒▒▒▒ ▓███████████████▓▓▓███▒░ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░ ░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░▒▒▒▒▒▒ ███████████████▓▓▓██▓▒ ░░░░░░░░░░░░░░░░░░░░░▒▒▒▒▒░░░░░░░░ ░░ ░░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░▒▒▒▒ ████████████▓▓▓▓▓▓█▓░ ░░░░░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒░░░░░ ░░░░░░░░░▒▒▓▒ ▒▓▓░ ░▒▒▒▒▒░░▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░▒▒ ██████▓▓▓▓▓▓▓▓▓▓▓▓▒ ░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░ ░░░░░░░░░░░▒▒▒▒▒▒▓▓▓ ▓▒░░ ▒███▓▒░░▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░ ████▓▓▓▓▓▓▓▓▓▓▓▓▓░ ░░░░░░░░░░▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▒▒▒▒░ ░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓░▓██▒▒▓▓▓▓▓█▒▒░▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░ ████▓▓▓▓▓▓▓▓▓▓▓▓░ ░░░░░░░░░░▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓░▒███▓▓▒▒▒▒▓▓▒░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░ █████████▓▓▓▓▓▓░ ░░░░░░░░░░░░▒▒▒▒▒▒▓▓▓▓▓▓▒▒▒▒░░ ░▒▒▒▒▒▒▒▒▒▒░░░░░░░░░▒▒▒▒▒▓▓▓░░███▓▓▓▓▒▒▒▓▒░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░ █████████████▓░ ░ ░░ ░░░░░▒▒▒▒▒▒░░ ▒░░░░░░░░░░░░░░ ░░░░░▒▒▒▓▓▓░░███▓▓▓▓▓▓▒▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░ █████████████▒░░░ ░░ ░░░░░▒▒▒▒▒▒░ ░░ ░░░░░ ░░░░░░▒▒▒▒▒▒▒▒▓▓▓░▒████▓▓▓▓▓▓▓█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ████████████▓▒░░░ ░░ ░░░░░░░▒▒▓▓▓▓▓▓▓▓▒▒░ ░░░░ ░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓ ▓▓███▓▒▒▓▓▓▓█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ████████████▒░░░ ░░░░░░▒▒▒▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒░ ░░▒▒▒▒░ ░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓░░▓▓███▓▓▒▒▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▒▒▒▒▒ ████████████▒░░░ ░░▒▒▒▒▒▒▓▓▓▓▓▓▓▒▒▒░░░░░░░░░ ░▒▓▓▓▒▒▒░ ░░░░▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓░░▓▓▓▓███▓▒▒▓▓▓█▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▓▓▓▓▓▓█████▓░░░ ░ ░▒▒▒▓▓▓▓▓▓▒▒▒▒░░░ ░░░░░░ ░▓▓▓▓▓▓▒▒░ ░▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░░░▓▓▓▓▓███▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░▒ ███████████▓▒░ ░░ ░░ ░▓▒▓▓▓▓▓▒▒▒▒░░░░░░░░░░░▒▒░░▓▓▓▓▓▓▓▒▒▒░ ░▒▓▓▓▓▓▓▓▓▓▓▓▓▒▒░░░▒▒▓▓▓▓▓▓▓█████▓▓▓▓░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░ ██████▓▓▓▓▓▓▓▓▒░░░▒▒▓▓▓▓▓ ▒▒░▒▓▓▓▓▓▒▒░ ░░░▒▒░░░░░░▒▒ ░▓▓▓▓▓▓▓▓▒▒▒▒░ ░░▒▒▒▒▒░░░░░▒▒▓▓▓▓▓▓▓▓▓▓██████▓▓▓░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░ ██▓▓▓▓▓▓▓▓▓▓▓████▓█████▓▓▓ ▒████▓▓▓▓▒░░▒▒▒▒▒▒▒▒░░▒▒▒▒▒ ▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒░░░░▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█████▓▓▓▒░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▓▓▓▓▒▒▒▒▓▓▓████████████▓▓█▓░▒████▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▒░░▓▓▓▓██▓▓▓▓▓▓▓▒▒▒▒▒▓▓▓▓▓████████▓▓▓▓▓▓▓▓▓▓█████▓▓▒░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▓▓▓▓██████████████▓███▓░▒▓███▓▓▓▓▓▒▒▒▒▒▒▒▒▓▓▓▓▒░ ▒▓▓▓▓███▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█████▓▓▓▓▓▓▓▓▓▓▓▓████▓▓▓▒▒░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒ ▒▒▓▓▓▓▓███████████████▓▓▓█▓▓▓░░▓███▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒░ ░▓▓▓▓██▓███▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓███▓▓▓▓▓▓▓▓▒▒░░░░░░░░░░▒▒▒▒▒ ▓▓▓▓▓▓▓▓▓▓▓███████████▓▓█████▓▒░▒▓██▓▓▓▓▓▓▓▓▓▓▒░░░▒▓▓▓▓▓██████████▓▓▓▓▓▓▓▓▓▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓████████▓▓▓▓▓▒▒░░░░░░░░░░▒▒▒ ▓▓▓▓▓▓▓▓▓▓▓███████████▓▓██████▓▓▓▒░▒▒▒▒▒▒▒░░░░▒▒▓▓▓▓▓▓████████████▓▓▓▒▒▒▒▒▒▒▒▒▓▓▓▓▓▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓█████▓▓▓▓▓▓▓▓▒▒▒▒░░░░░░░░░░ ▓▓▓▓▓▓▓▓▓▓▓██████████▓▓▓▓▓▓▓▓▓▓▓████▓▓▓▓▓▓▓▓▓▓██▓▓▓▓▓███████████▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓█████▓▓▓▓▓▓▓▓▓▓▓▒░░░░░░░░░░ ▓▓▓▓▓▓▓▓▓▓███████████▓▓▓▓▓▓▓▓▒▒▓██████████████▓▓▓▓▓▓▓██▓▓▒▒▒▓▓▓▓▓▓▒▒▒░░░░░▒▒▒▒▒▒▒▒▒░░░░▒▒▓▓█▓▓▓▓▓▓▒▒▓██████▓▓▓▓▓▓▓▓▓▓▒▒░░░░░░░░░ ▓▓▓▓▓▓▓▓▓███████████▓▓▓▓▓▓▓▓▓▓▓▓▓█████████████▓▓▓▓▓▓▓▓▓▓▓▓▓▒▓▓▓▒▒▒▒░░░░░░░░▒▒▒▒▒▒▒▒░░░▒▒▒▓███▓▓▓▓▓▒▒▓█████████▓▓▓▓▓▓▓▒▒▒░░░░░░░░ ████████████████████▓▓▓▓██▓▓▓▓▓▓▓▓████████████▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒░░░░▒▒░░░░░░▒▒▒▒▒▒▒░ ░░▒▓▒▓▓██▓▓▓▒▒▓▒▓▓████████████▓▓▓▓▓▓▓▓▒▒▒▒▒▒░ ████████████████████▓▓▓██████▓▓▓▓████████████▓▓▓▓▓▓▓▓▓▓▒▒▒▒░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒░░░ ░▒▓▓▓▒▒▓██▓▓▒▒▒▒▒▓▓███████████████▓▓▓▓▓▓▓▓▓▓▓▓ ████████████████████▓▓███████████████████████▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒░░▒▓▓▓▓▓▓▓▒▒▒▓▓▓▒▒░░▒▓▓▓▓▓▒██▓▓▓▒▒▒▒▒▒▓█████████████████▓▓▓▓▓▓▓▓▒▒ ▒▒▒▒▓▓▓██▓█████████▓▓▓▓█████████████████████▓▓▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█▓▓█▓▓▓▒▒░▓▓███▓▓▓▓█▓▓▓▒▒▒▒▒▒▓████████████████▓▓▓▒▒▒▒▒▒▒▒ ▒▓▓▓▓▓▓▓▓▓█████████▓▓▓▓▓▓▓▓▓▓▓█████▓▓▓██████▓▓░░▒▒▒▒▒▓▓▓▓▒▒▒▓▓▓▓▓██████████▓▒▓▒▒▓▓████▓▒▒▓▓▓▓▒▒▒▒▒░▒▓█▓▓▓▓██▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒ ▓▓▒▒▒▒▒▓▓▓█████████▓▓▓▓▓▓▓███████▓▓▓▓▓▓▓█████▓▒░░▒▒▒░ ░▒▓██████████████▓▒▒▒▓▓▓█████▓▓▒▒▒▓▓▒░░▒░░▓███▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒░░░░░░░░▒ ▒▒▒▒▒▒▒▓▓▓█████████▓▓▓▓█▓▓▓▓▒▒▒▒▓▓███▓▓▓▓▓████▓▒░░▒▒▒▒▒▒▒░░▒▓███████████▓▒▒▓▓▓▓▓██████▓▓▒▒░▒▓▒▒░░░▒▓███▓▓▓▓▓▒▒▒▒▒░░░░░░░░░░░░░▒▒ ██████▓▓▓██████████▓▓▓▓▒▒▒▒▒▓▓████████▓▓▓▓▓▓███▓▒▒▒▓▓▓██▓▓▓▒░▒▒▒▒▒▓▓▒▓▒▓▓▓██▓▓▓▓██▓██▓▓▓▓▒▒░▒▒░░░░▓████▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒░░░░░░░▒▒▒ ████████▓██████████▓▓▓▓▓▓▓▓▓▓█▓▓▓▓▓▓▒▒▒▒▓▓▓▓▓▓▓██▓▓▒▓▓███████▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒░░░░░░▒▓▓███▓▓▓▓▓▒▒▒▓▓▒▒▒▒▒▒▒░▒░░░░░░ ████████▓█████████▓▓▓▓████████▓▓▓▓▓▓▒▓▓▓▓▓▓▓▓▓▓▓▓█▓▓▓▓████████████▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒░░░░░░░▒▓▓███▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░ ▓███████▓█████████▓▓▓███████████▓▓▓▓▓███▓▓▓▓▓▒▒▓▓██▓▓▓█████████████▓▓▓▓▓▓▓▒▒▒▒▓▓▓▓▓██▓▓▒▒▒░░░░░░▒▓▓▓▓██▓▓▓▓▓▒▒░░░░▒▒▒▒▒░░▒▒░░░░▒ ███████▓██████████▓▓▓▓▓▓▓▓█▓▓▓▓▓█▓▓▓██▓▓▓█▓▓▓▓▒▒▒▓▓▓▓▓▓▓███████▓▓▓▓▓▒▒▒▒▒▒▒░▒▒▓▓▓▓██▓▓▒▒▒