Rematch catalog data to ecommerce source

This commit is contained in:
Jacky Ser
2026-08-11 15:27:26 +08:00
parent 9627c5043e
commit b4d11e2f12
561 changed files with 16313 additions and 7220 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,93 +0,0 @@
import type { CatalogProduct } from "./catalog-data";
// The ecommerce image archive groups products by family rather than by the
// individual model code used in the PDF catalog. These are the corresponding
// family-level main images copied into public/catalog-products/source-main.
const SOURCE_MAIN_IMAGES = {
"1004": "/catalog-products/source-main/1004-main.png",
"258": "/catalog-products/source-main/258-main.jpg",
"259": "/catalog-products/source-main/259-main.jpg",
"266": "/catalog-products/source-main/266-main.jpg",
"267": "/catalog-products/source-main/267-main.jpg",
"268": "/catalog-products/source-main/268-main.jpg",
"270": "/catalog-products/source-main/270-main.jpg",
"271": "/catalog-products/source-main/271-main.jpg",
"272": "/catalog-products/source-main/272-main.jpg",
"273": "/catalog-products/source-main/273-main.jpg",
"274": "/catalog-products/source-main/274-main.jpg",
"275": "/catalog-products/source-main/275-main.jpg",
"276": "/catalog-products/source-main/276-main.jpg",
"308": "/catalog-products/source-main/308-main.png",
"309": "/catalog-products/source-main/309-main.png",
"310": "/catalog-products/source-main/310-main.png",
"311": "/catalog-products/source-main/311-main.png",
"313": "/catalog-products/source-main/313-main.png",
} as const;
type SourceImageKey = keyof typeof SOURCE_MAIN_IMAGES;
function hasWeight(name: string, grams: string) {
return new RegExp(`${grams}\\s*(?:g|克)`, "i").test(name);
}
function getGearSeries(name: string) {
if (/半金属/.test(name)) return "semi";
if (/全金属|金属/.test(name)) return "metal";
if (/塑胶|塑料/.test(name)) return "plastic";
return null;
}
function getSmallServoImage(name: string): string | null {
if (hasWeight(name, "1\\.7")) return SOURCE_MAIN_IMAGES["1004"];
const gearSeries = getGearSeries(name);
if (hasWeight(name, "2") && gearSeries === "plastic") return SOURCE_MAIN_IMAGES["272"];
if (hasWeight(name, "3\\.7") && gearSeries === "plastic") return SOURCE_MAIN_IMAGES["271"];
if (hasWeight(name, "9")) {
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["266"];
if (gearSeries === "semi") return SOURCE_MAIN_IMAGES["259"];
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["258"];
}
if (hasWeight(name, "17")) {
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["274"];
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["273"];
}
if (hasWeight(name, "25")) {
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["276"];
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["275"];
}
if (hasWeight(name, "37")) {
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["270"];
if (gearSeries === "semi") return SOURCE_MAIN_IMAGES["268"];
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["267"];
}
return null;
}
function getBrickServoImage(name: string): string | null {
if (name.includes("3x3x3")) return SOURCE_MAIN_IMAGES["311"];
if (name.includes("3x3x7")) return SOURCE_MAIN_IMAGES["310"];
if (name.includes("3x7x5")) return SOURCE_MAIN_IMAGES["309"];
if (name.includes("6x6x5")) return SOURCE_MAIN_IMAGES["308"];
if (name.includes("11x5x4")) return SOURCE_MAIN_IMAGES["313"];
return null;
}
export function getCatalogProductImage(product: CatalogProduct) {
if (product.category === "积木舵机") {
return getBrickServoImage(product.name) ?? product.image;
}
if (product.category === "标准舵机" || product.category === "异形舵机") {
return getSmallServoImage(product.name) ?? product.image;
}
return product.image;
}
export const CATALOG_SOURCE_IMAGE_KEYS: SourceImageKey[] = Object.keys(SOURCE_MAIN_IMAGES) as SourceImageKey[];

View File

@@ -242,7 +242,7 @@ select:focus, input:focus, textarea:focus { border-color: var(--blue); box-shado
.section-heading > p { max-width: 480px; margin: 0; color: #6e7a8e; line-height: 1.8; font-size: 13px; } .section-heading > p { max-width: 480px; margin: 0; color: #6e7a8e; line-height: 1.8; font-size: 13px; }
.catalog-summary { .catalog-summary {
display: grid; display: grid;
grid-template-columns: repeat(7, 1fr); grid-template-columns: repeat(5, 1fr);
gap: 9px; gap: 9px;
margin-bottom: 22px; margin-bottom: 22px;
} }

View File

@@ -11,17 +11,17 @@ export async function generateMetadata(): Promise<Metadata> {
return { return {
metadataBase, metadataBase,
title: "高徳乐 AI 舵机选型助手", title: "高徳乐 AI 舵机选型助手",
description: "高徳乐280个产品型号完整目录支持搜索筛选、AI舵机初选与样品申请。", description: "高徳乐商城536款产品资料支持产品参数搜索、AI舵机初选与样品申请。",
openGraph: { openGraph: {
title: "高徳乐 AI 舵机选型助手", title: "高徳乐 AI 舵机选型助手",
description: "280个型号完整目录。3分钟找到适合你的舵机AI初选工程师复核。", description: "536款商城产品完整目录。3分钟找到适合你的舵机AI初选工程师复核。",
images: [{ url: new URL("/og.png", metadataBase).toString(), width: 1200, height: 630 }], images: [{ url: new URL("/og.png", metadataBase).toString(), width: 1200, height: 630 }],
type: "website", type: "website",
}, },
twitter: { twitter: {
card: "summary_large_image", card: "summary_large_image",
title: "高徳乐 AI 舵机选型助手", title: "高徳乐 AI 舵机选型助手",
description: "3分钟找到适合你的舵机。", description: "高徳乐商城产品资料与 AI 舵机选型助手。",
images: [new URL("/og.png", metadataBase).toString()], images: [new URL("/og.png", metadataBase).toString()],
}, },
}; };

View File

@@ -3,15 +3,9 @@
import { FormEvent, useMemo, useState } from "react"; import { FormEvent, useMemo, useState } from "react";
import { import {
CATALOG_COUNTS, CATALOG_COUNTS,
CATALOG_PRODUCTS as RAW_CATALOG_PRODUCTS, CATALOG_PRODUCTS,
type CatalogProduct, type CatalogProduct,
} from "./catalog-data"; } from "./catalog-data";
import { getCatalogProductImage } from "./catalog-image-map";
const CATALOG_PRODUCTS = RAW_CATALOG_PRODUCTS.map((product) => ({
...product,
image: getCatalogProductImage(product),
}));
type Requirements = { type Requirements = {
application: string; application: string;
@@ -40,12 +34,10 @@ const APPLICATIONS = [
const PRIMARY_CATALOG_CATEGORIES = [ const PRIMARY_CATALOG_CATEGORIES = [
"标准舵机", "标准舵机",
"异形舵机",
"全金属舵机",
"大扭矩舵机",
"积木舵机", "积木舵机",
"舵盘配件",
"标准齿轮箱", "标准齿轮箱",
"翻盖电机", "精密齿轮配件",
]; ];
const CATALOG_FILTER_CATEGORIES = ["全部产品", ...PRIMARY_CATALOG_CATEGORIES, "静音舵机"]; const CATALOG_FILTER_CATEGORIES = ["全部产品", ...PRIMARY_CATALOG_CATEGORIES, "静音舵机"];
@@ -60,6 +52,13 @@ const FEATURED_SPEC_ORDER = [
"寿命", "寿命",
"产品尺寸", "产品尺寸",
"外形尺寸", "外形尺寸",
"空载速度",
"材质",
"模数",
"齿数",
"孔径",
"重量",
"参考单价",
]; ];
function getFeaturedSpecs(product: CatalogProduct) { function getFeaturedSpecs(product: CatalogProduct) {
@@ -69,20 +68,32 @@ function getFeaturedSpecs(product: CatalogProduct) {
.map((label) => [label, product.specs[label]] as const); .map((label) => [label, product.specs[label]] as const);
} }
const SERVO_CATEGORIES = ["标准舵机", "异形舵机", "全金属舵机", "大扭矩舵机", "积木舵机"]; const SERVO_CATEGORIES = ["标准舵机", "积木舵机"];
const SILENT_SERVO_CATEGORY = "静音舵机"; const SILENT_SERVO_CATEGORY = "静音舵机";
const CUSTOM_SERVO_CATEGORY = "非标准舵机定制"; const CUSTOM_SERVO_CATEGORY = "非标准舵机定制";
const TORQUE_MIN = 0.09; const TORQUE_MIN = 0.09;
const TORQUE_MAX = 920; const TORQUE_MAX = Math.max(
const TORQUE_PRESETS = [0.1, 1, 5, 20, 100, 300, 920]; TORQUE_MIN,
...CATALOG_PRODUCTS.filter((product) => SERVO_CATEGORIES.includes(product.category))
.map((product) => product.torqueValue ?? 0),
);
const TORQUE_PRESETS = [...new Set([
0.1,
1,
5,
20,
100,
300,
TORQUE_MAX,
].filter((value) => value <= TORQUE_MAX))];
const APPLICATION_CATEGORY_MAP: Record<string, string[]> = { const APPLICATION_CATEGORY_MAP: Record<string, string[]> = {
AI毛绒: ["标准舵机", "异形舵机"], AI毛绒: ["标准舵机"],
: ["标准舵机", "异形舵机", "积木舵机"], : ["标准舵机", "积木舵机"],
"教育/积木": ["积木舵机", "标准舵机"], "教育/积木": ["积木舵机", "标准舵机"],
: ["标准舵机", "异形舵机", "全金属舵机"], : ["标准舵机", "积木舵机"],
"云台/航模": ["标准舵机", "全金属舵机"], "云台/航模": ["标准舵机"],
: ["全金属舵机", "大扭矩舵机", "异形舵机"], : ["标准舵机", "积木舵机"],
}; };
function parseNumbers(value = "") { function parseNumbers(value = "") {
@@ -97,7 +108,7 @@ function isSilentServo(product: CatalogProduct) {
const SILENT_SERVO_COUNT = CATALOG_PRODUCTS.filter(isSilentServo).length; const SILENT_SERVO_COUNT = CATALOG_PRODUCTS.filter(isSilentServo).length;
function getCategoryCount(category: string) { function getCategoryCount(category: string) {
return category === SILENT_SERVO_CATEGORY ? SILENT_SERVO_COUNT : CATALOG_COUNTS[category]; return category === SILENT_SERVO_CATEGORY ? SILENT_SERVO_COUNT : CATALOG_COUNTS[category] ?? 0;
} }
type ProductScale = { type ProductScale = {
@@ -214,10 +225,10 @@ const SELECTOR_PRODUCTS = CATALOG_PRODUCTS.filter((product) =>
weight: inferWeight(product), weight: inferWeight(product),
isSilent: isSilentServo(product), isSilent: isSilentServo(product),
gear: classifyGear(product.specs["齿轮材质"]), gear: classifyGear(product.specs["齿轮材质"]),
angle: product.specs["可操作角度"] ?? product.specs["操作角度范围"] ?? "", angle: product.specs["可操作角度"] ?? "",
control, control,
speed: product.specs["空载速度"] ?? product.specs["转动速度"] ?? "", speed: product.specs["空载速度"] ?? "",
size: product.specs["产品尺寸"] ?? product.specs["外形尺寸"] ?? "", size: product.specs["产品尺寸"] ?? "",
}; };
}); });
@@ -349,6 +360,8 @@ export default function Home() {
product.name, product.name,
product.code, product.code,
product.category, product.category,
product.subCategory,
product.sourceCategory,
...Object.keys(product.specs), ...Object.keys(product.specs),
...Object.values(product.specs), ...Object.values(product.specs),
] ]
@@ -429,8 +442,8 @@ export default function Home() {
<a href="#products" className="text-action"></a> <a href="#products" className="text-action"></a>
</div> </div>
<div className="trust-row"> <div className="trust-row">
<span><b>280</b> </span> <span><b>{CATALOG_PRODUCTS.length}</b> </span>
<span><b>0.09920</b> kgf·cm</span> <span><b>{formatTorque(TORQUE_MIN)}{formatTorque(TORQUE_MAX)}</b> kgf·cm</span>
<span><b>48h</b> </span> <span><b>48h</b> </span>
</div> </div>
</div> </div>
@@ -492,7 +505,7 @@ export default function Home() {
<div className="question-step"> <div className="question-step">
<p className="step-kicker"> · </p> <p className="step-kicker"> · </p>
<h2></h2> <h2></h2>
<p className="step-help">2430.09920 kgf·cm</p> <p className="step-help">{SELECTOR_PRODUCTS.length}{TORQUE_MIN}{TORQUE_MAX} kgf·cm</p>
<div className="two-fields compact-fields"> <div className="two-fields compact-fields">
<label className="select-field"> <label className="select-field">
<span></span> <span></span>
@@ -500,7 +513,7 @@ export default function Home() {
value={requirements.category} value={requirements.category}
onChange={(event) => update("category", event.target.value)} onChange={(event) => update("category", event.target.value)}
> >
<option value="全部舵机">243</option> <option value="全部舵机">{SELECTOR_PRODUCTS.length}</option>
<optgroup label="官方产品系列"> <optgroup label="官方产品系列">
{SERVO_CATEGORIES.map((category) => ( {SERVO_CATEGORIES.map((category) => (
<option key={category} value={category}> <option key={category} value={category}>
@@ -560,7 +573,11 @@ export default function Home() {
value={torqueToSlider(requirements.torque)} value={torqueToSlider(requirements.torque)}
onChange={(event) => update("torque", sliderToTorque(Number(event.target.value)))} onChange={(event) => update("torque", sliderToTorque(Number(event.target.value)))}
/> />
<div className="range-scale"><span>0.09</span><span>1</span><span>10</span><span>100</span><span>920</span></div> <div className="range-scale">
{[TORQUE_MIN, 1, 10, 100, TORQUE_MAX]
.filter((value, index, values) => value <= TORQUE_MAX && values.indexOf(value) === index)
.map((value) => <span key={value}>{formatTorque(value)}</span>)}
</div>
<div className="torque-presets" aria-label="常用扭矩快捷值"> <div className="torque-presets" aria-label="常用扭矩快捷值">
{TORQUE_PRESETS.map((torque) => ( {TORQUE_PRESETS.map((torque) => (
<button <button
@@ -820,7 +837,7 @@ export default function Home() {
{match.reasons.slice(0, 2).map((reason) => <li key={reason}> {reason}</li>)} {match.reasons.slice(0, 2).map((reason) => <li key={reason}> {reason}</li>)}
</ul> </ul>
<div className="source-line"> <div className="source-line">
<span></span> <span></span>
<strong>{match.product.category}</strong> <strong>{match.product.category}</strong>
<small></small> <small></small>
</div> </div>
@@ -891,9 +908,9 @@ export default function Home() {
<div className="section-heading"> <div className="section-heading">
<div> <div>
<p className="eyebrow"><span /> · 2026.06</p> <p className="eyebrow"><span /> · 2026.06</p>
<h2>280</h2> <h2>{CATALOG_PRODUCTS.length}</h2>
</div> </div>
<p>280</p> <p></p>
</div> </div>
<div className="catalog-summary" aria-label="产品分类统计"> <div className="catalog-summary" aria-label="产品分类统计">
@@ -912,7 +929,7 @@ export default function Home() {
</button> </button>
))} ))}
</div> </div>
<p className="catalog-category-note"> · 280 · 11</p> <p className="catalog-category-note"> {CATALOG_PRODUCTS.length} 齿齿</p>
<div className="catalog-toolbar"> <div className="catalog-toolbar">
<label className="catalog-search"> <label className="catalog-search">
@@ -989,7 +1006,7 @@ export default function Home() {
) : ( ) : (
<span className="catalog-placeholder">GAUDELOT</span> <span className="catalog-placeholder">GAUDELOT</span>
)} )}
<small>{product.category}</small> <small>{product.subCategory || product.category}</small>
<span className="catalog-zoom-hint"></span> <span className="catalog-zoom-hint"></span>
</button> </button>
<div className="catalog-card-body"> <div className="catalog-card-body">
@@ -1032,6 +1049,8 @@ export default function Home() {
role="presentation" role="presentation"
onMouseDown={() => setSelectedCatalogProduct(null)} onMouseDown={() => setSelectedCatalogProduct(null)}
> >
{/* Stop a click inside the dialog from closing the backdrop. */}
{/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}
<section <section
className="catalog-modal" className="catalog-modal"
role="dialog" role="dialog"
@@ -1057,7 +1076,7 @@ export default function Home() {
<p className="step-kicker">{selectedCatalogProduct.category}</p> <p className="step-kicker">{selectedCatalogProduct.category}</p>
<h2 id="catalog-modal-title">{selectedCatalogProduct.name}</h2> <h2 id="catalog-modal-title">{selectedCatalogProduct.name}</h2>
<code>{selectedCatalogProduct.code}</code> <code>{selectedCatalogProduct.code}</code>
<p className="catalog-source-note"> {selectedCatalogProduct.page} </p> <p className="catalog-source-note"> {selectedCatalogProduct.sourceId} · {selectedCatalogProduct.sourceCategory}</p>
</div> </div>
</div> </div>
<div className="catalog-spec-table"> <div className="catalog-spec-table">

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 850 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Some files were not shown because too many files have changed in this diff Show More