wip(mechanic): inflight damage-flow + vendor scheme + PhotoAnnotate + TT views

Маркер «вот где остановилась mechanic-сессия» — не разбито по логическим коммитам,
зафиксировано целиком чтобы не потерять при отвлечении/чекаутах.

Modified:
- pages/InspectionEditor.tsx — расширение damage-flow внутри редактора
- pages/VehicleCard.tsx — vendor data + расширение карточки
- pages/InspectionReview.tsx — обновлённый review
- api/{auth,inspections,photos,vehicles}.ts — новые endpoints для TT + photo flow
- components/damage-flow/DamageClassifyDialog.tsx — multi-step UI
- components/vehicle-scheme/VendorVehicleScheme.tsx — SVG zone interaction
- data/damageVocabulary.ts — обновлённый словарь повреждений
- frontend index.html/manifest/icons — PWA-метаданные

New (untracked):
- components/damage-flow/PhotoAnnotateStep.tsx — новый шаг flow'а
- components/tt/ — vendor TT-state UI
- pages/TtStateDetail.tsx — экран осмотра вендора
- recon/findings/damage_model.md + damage_vocabulary.json + scheme/ — recon docs

Cleanup: удалены bash-garbage 'Last' и 'dict[str' из frontend/.
This commit is contained in:
2026-05-20 11:16:21 +10:00
parent e0083b894f
commit 7e2cf0c9c8
132 changed files with 2823 additions and 106 deletions
+9 -1
View File
@@ -3,8 +3,16 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32.png" />
<link rel="icon" type="image/png" sizes="48x48" href="/icons/favicon-48.png" />
<link rel="icon" type="image/png" sizes="192x192" href="/icons/icon-192.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/icons/apple-touch-icon.png" />
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover" /> <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover" />
<meta name="theme-color" content="#2a2a2a" /> <meta name="theme-color" content="#000000" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-title" content="Mechanic" />
<link rel="manifest" href="/manifest.webmanifest" /> <link rel="manifest" href="/manifest.webmanifest" />
<title>Premium Механик</title> <title>Premium Механик</title>
</head> </head>
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 514 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 889 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

@@ -4,10 +4,11 @@
"start_url": "/", "start_url": "/",
"display": "standalone", "display": "standalone",
"orientation": "portrait", "orientation": "portrait",
"background_color": "#f5f1ea", "background_color": "#000000",
"theme_color": "#2a2a2a", "theme_color": "#000000",
"icons": [ "icons": [
{ "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" }, { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
{ "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png" } { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
{ "src": "/icons/icon-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
] ]
} }
+2
View File
@@ -6,6 +6,7 @@ import Home from "@/pages/Home";
import VehicleCard from "@/pages/VehicleCard"; import VehicleCard from "@/pages/VehicleCard";
import InspectionEditor from "@/pages/InspectionEditor"; import InspectionEditor from "@/pages/InspectionEditor";
import InspectionReview from "@/pages/InspectionReview"; import InspectionReview from "@/pages/InspectionReview";
import TtStateDetail from "@/pages/TtStateDetail";
function RequireAuth({ children }: { children: React.ReactNode }) { function RequireAuth({ children }: { children: React.ReactNode }) {
const token = useAuth((s) => s.token); const token = useAuth((s) => s.token);
@@ -22,6 +23,7 @@ export default function App() {
<Route path="/vehicles/:id" element={<RequireAuth><VehicleCard /></RequireAuth>} /> <Route path="/vehicles/:id" element={<RequireAuth><VehicleCard /></RequireAuth>} />
<Route path="/inspections/:id/edit" element={<RequireAuth><InspectionEditor /></RequireAuth>} /> <Route path="/inspections/:id/edit" element={<RequireAuth><InspectionEditor /></RequireAuth>} />
<Route path="/inspections/:id" element={<RequireAuth><InspectionReview /></RequireAuth>} /> <Route path="/inspections/:id" element={<RequireAuth><InspectionReview /></RequireAuth>} />
<Route path="/tt-states/:id" element={<RequireAuth><TtStateDetail /></RequireAuth>} />
<Route path="*" element={<Navigate to="/" replace />} /> <Route path="*" element={<Navigate to="/" replace />} />
</Routes> </Routes>
); );
+3 -1
View File
@@ -23,6 +23,8 @@ export async function login(input: LoginInput): Promise<LoginOutput> {
const body = new URLSearchParams(); const body = new URLSearchParams();
body.set("username", input.username); body.set("username", input.username);
body.set("password", input.password); body.set("password", input.password);
// PWA — длинная сессия (30 дней) чтобы механики не вводили пароль каждые 8 ч.
body.set("long_session", "true");
const res = await fetch("/api/auth/login", { const res = await fetch("/api/auth/login", {
method: "POST", method: "POST",
@@ -42,7 +44,7 @@ export async function login2fa(input: TwoFactorInput): Promise<LoginOutput> {
const res = await fetch("/api/auth/2fa", { const res = await fetch("/api/auth/2fa", {
method: "POST", method: "POST",
headers: { "Content-Type": "application/json" }, headers: { "Content-Type": "application/json" },
body: JSON.stringify(input), body: JSON.stringify({ ...input, long_session: true }),
credentials: "include", // accept the trusted_device cookie on Set-Cookie credentials: "include", // accept the trusted_device cookie on Set-Cookie
}); });
if (!res.ok) { if (!res.ok) {
@@ -27,6 +27,7 @@ export interface PhotoSummary {
slot_index: number; slot_index: number;
storage_key: string; storage_key: string;
thumb_key?: string | null; thumb_key?: string | null;
annotated_key?: string | null;
width?: number | null; width?: number | null;
height?: number | null; height?: number | null;
status: string; status: string;
@@ -37,6 +38,7 @@ export interface MarkerSummary {
id: number; id: number;
inspection_id: number; inspection_id: number;
photo_id?: number | null; photo_id?: number | null;
tt_image_id?: string | null;
side?: string | null; side?: string | null;
x?: number | null; x?: number | null;
y?: number | null; y?: number | null;
@@ -103,4 +105,12 @@ export async function createMarker(
.json<MarkerSummary>(); .json<MarkerSummary>();
} }
export async function deleteInspection(inspectionId: number): Promise<void> {
await api.delete(`inspections/${inspectionId}`);
}
export async function deleteMarker(markerId: number): Promise<void> {
await api.delete(`markers/${markerId}`);
}
export type { InspectionSummary }; export type { InspectionSummary };
+15
View File
@@ -14,12 +14,27 @@ export interface PhotoConfirmResponse {
slot_index: number; slot_index: number;
storage_key: string; storage_key: string;
thumb_key?: string | null; thumb_key?: string | null;
annotated_key?: string | null;
width?: number | null; width?: number | null;
height?: number | null; height?: number | null;
status: string; status: string;
taken_at: string; taken_at: string;
} }
export async function uploadPhotoAnnotation(
inspectionId: number,
photoId: number,
blob: Blob,
): Promise<PhotoConfirmResponse> {
const form = new FormData();
form.append("file", blob, "annotation.jpg");
return api
.post(`inspections/${inspectionId}/photos/${photoId}/annotation`, {
body: form,
})
.json<PhotoConfirmResponse>();
}
export async function requestUploadUrl( export async function requestUploadUrl(
inspectionId: number, inspectionId: number,
args: { side: string; slot_index: number; content_type: string; size: number } args: { side: string; slot_index: number; content_type: string; size: number }
+73
View File
@@ -12,6 +12,8 @@ export interface VehicleSummary {
export interface VehicleDetail extends VehicleSummary { export interface VehicleDetail extends VehicleSummary {
recent_inspections: InspectionSummary[]; recent_inspections: InspectionSummary[];
starline_mileage?: number | null;
starline_mileage_at?: string | null;
} }
export interface InspectionSummary { export interface InspectionSummary {
@@ -36,3 +38,74 @@ export async function listVehicles(q?: string): Promise<VehicleSummary[]> {
export async function getVehicle(id: number): Promise<VehicleDetail> { export async function getVehicle(id: number): Promise<VehicleDetail> {
return api.get(`vehicles/${id}`).json<VehicleDetail>(); return api.get(`vehicles/${id}`).json<VehicleDetail>();
} }
// ── TT-Control vendor archive (Element Mechanic) ───────────────────────────
export interface TtStateSummary {
id: number;
vendor_state_id: string;
unix_time: number | null;
mechanic_name: string | null;
mileage: number | null;
photos_count: number;
damages_count: number;
}
export interface TtHistory {
vendor_vehicle_id: string | null;
plate?: string | null;
brand?: string | null;
model?: string | null;
states: TtStateSummary[];
}
export interface TtPhotoRef {
image_id: string;
image_with_lines_id: string | null;
unix_time: number | null;
guid: string | null;
}
export interface TtDamage {
damage_type_id: number | null;
degree: number | null;
points: { x: number; y: number }[];
guid: string | null;
unix_time: number | null;
}
export interface TtSidePhoto {
image_id: string;
miniature_id: string | null;
photo_type: number | null;
}
export interface TtStateDetail {
id: number;
vendor_state_id: string;
unix_time: number | null;
mechanic_name: string | null;
mileage: number | null;
side_photos: TtSidePhoto[];
photos_by_zone: Record<string, TtPhotoRef[]>;
damages_by_zone: Record<string, TtDamage[]>;
}
export async function getTtHistory(vehicleId: number): Promise<TtHistory> {
return api.get(`vehicles/${vehicleId}/tt-history`).json<TtHistory>();
}
export async function getTtState(stateId: number): Promise<TtStateDetail> {
return api.get(`tt-states/${stateId}`).json<TtStateDetail>();
}
export async function deleteTtState(stateId: number): Promise<void> {
await api.delete(`tt-states/${stateId}`);
}
export function ttImageUrl(imageId: string, withLines: boolean = false): string {
// tt-image endpoint без auth-guard'а (vendor сам публично отдаёт эти JPEG'и),
// поэтому подходит для прямого <img src=...>.
const base = import.meta.env.VITE_API_BASE ?? "/api/v1/mechanic";
return `${base}/tt-image/${imageId}${withLines ? "?lines=true" : ""}`;
}
@@ -2,7 +2,7 @@ import { useEffect, useState } from "react";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import { loadDamageVocabulary } from "@/data/damageVocabulary"; import { loadDamageVocabulary, damageTypeRuToEnum } from "@/data/damageVocabulary";
interface Props { interface Props {
open: boolean; open: boolean;
@@ -29,8 +29,12 @@ export function DamageClassifyDialog({ open, zoneId, zoneLabel, pointsCount, onC
// Salon zones (44=водительское сидение, 45=пассажирское, 46=задний диван) use salon_selectable; else exterior // Salon zones (44=водительское сидение, 45=пассажирское, 46=задний диван) use salon_selectable; else exterior
const isSalon = zoneId === 44 || zoneId === 45 || zoneId === 46; const isSalon = zoneId === 44 || zoneId === 45 || zoneId === 46;
// Фильтруем типы для которых нет соответствия в backend DamageType enum —
// иначе backend вернёт 422 на createMarker.
const list = vocab const list = vocab
? (isSalon ? vocab.salon_selectable : vocab.exterior_selectable) ? (isSalon ? vocab.salon_selectable : vocab.exterior_selectable).filter(
(dt) => damageTypeRuToEnum(dt) != null,
)
: []; : [];
return ( return (
@@ -0,0 +1,247 @@
import { useEffect, useRef, useState } from "react";
import { Button } from "@/components/ui/button";
interface Props {
photoFile: File;
zoneLabel: string;
/** Called when user submits. annotated=null если "без линий". */
onSubmit: (annotated: Blob | null) => void | Promise<void>;
onCancel: () => void;
}
interface Stroke {
pts: { x: number; y: number }[]; // in image-space pixels
}
/** Pen-on-photo step: показывает только что снятое фото, даёт обвести
* пальцем красным. Flatten в JPEG при submit. Координаты strokes в native
* пикселях фото — canvas resize'нут на тот же размер. */
export function PhotoAnnotateStep({ photoFile, zoneLabel, onSubmit, onCancel }: Props) {
const canvasRef = useRef<HTMLCanvasElement>(null);
const imgRef = useRef<HTMLImageElement | null>(null);
const [imgLoaded, setImgLoaded] = useState(false);
const [strokes, setStrokes] = useState<Stroke[]>([]);
const currentStroke = useRef<Stroke | null>(null);
const [submitting, setSubmitting] = useState(false);
// Load image once
useEffect(() => {
const url = URL.createObjectURL(photoFile);
const img = new Image();
img.onload = () => {
imgRef.current = img;
const canvas = canvasRef.current;
if (canvas) {
canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight;
}
setImgLoaded(true);
URL.revokeObjectURL(url);
redraw([]);
};
img.onerror = () => URL.revokeObjectURL(url);
img.src = url;
return () => {
URL.revokeObjectURL(url);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [photoFile]);
function redraw(allStrokes: Stroke[]) {
const canvas = canvasRef.current;
const img = imgRef.current;
if (!canvas || !img) return;
const ctx = canvas.getContext("2d");
if (!ctx) return;
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
// Linewidth scaled to image — на 4К фото 4px тонко смотрится
const lw = Math.max(6, Math.round(canvas.width / 250));
ctx.strokeStyle = "rgb(220, 38, 38)";
ctx.lineWidth = lw;
ctx.lineCap = "round";
ctx.lineJoin = "round";
for (const s of allStrokes) {
if (s.pts.length < 2) {
// single tap → dot
if (s.pts.length === 1) {
ctx.fillStyle = "rgb(220, 38, 38)";
ctx.beginPath();
ctx.arc(s.pts[0].x, s.pts[0].y, lw / 2, 0, Math.PI * 2);
ctx.fill();
}
continue;
}
ctx.beginPath();
ctx.moveTo(s.pts[0].x, s.pts[0].y);
for (let i = 1; i < s.pts.length; i++) {
ctx.lineTo(s.pts[i].x, s.pts[i].y);
}
ctx.stroke();
}
}
// Re-draw whenever strokes change
useEffect(() => {
if (imgLoaded) redraw(strokes);
}, [strokes, imgLoaded]);
function pointFromEvent(e: React.PointerEvent<HTMLCanvasElement>): { x: number; y: number } | null {
const canvas = canvasRef.current;
if (!canvas) return null;
const rect = canvas.getBoundingClientRect();
if (rect.width === 0 || rect.height === 0) return null;
// CSS px → canvas px
const x = ((e.clientX - rect.left) / rect.width) * canvas.width;
const y = ((e.clientY - rect.top) / rect.height) * canvas.height;
return { x, y };
}
function onPointerDown(e: React.PointerEvent<HTMLCanvasElement>) {
e.preventDefault();
(e.target as HTMLCanvasElement).setPointerCapture(e.pointerId);
const pt = pointFromEvent(e);
if (!pt) return;
currentStroke.current = { pts: [pt] };
// Immediate visual feedback: draw a partial stroke without setState
drawPartialStroke(currentStroke.current);
}
function onPointerMove(e: React.PointerEvent<HTMLCanvasElement>) {
if (!currentStroke.current) return;
const pt = pointFromEvent(e);
if (!pt) return;
currentStroke.current.pts.push(pt);
drawPartialStroke(currentStroke.current);
}
function onPointerUp(e: React.PointerEvent<HTMLCanvasElement>) {
if (!currentStroke.current) return;
try {
(e.target as HTMLCanvasElement).releasePointerCapture(e.pointerId);
} catch {
// ignore — pointer wasn't captured
}
const finished = currentStroke.current;
currentStroke.current = null;
if (finished.pts.length > 0) {
setStrokes((s) => [...s, finished]);
}
}
/** Avoid re-running full redraw on every move — just append last segment. */
function drawPartialStroke(s: Stroke) {
const canvas = canvasRef.current;
if (!canvas || s.pts.length < 2) return;
const ctx = canvas.getContext("2d");
if (!ctx) return;
const lw = Math.max(6, Math.round(canvas.width / 250));
ctx.strokeStyle = "rgb(220, 38, 38)";
ctx.lineWidth = lw;
ctx.lineCap = "round";
ctx.lineJoin = "round";
const a = s.pts[s.pts.length - 2];
const b = s.pts[s.pts.length - 1];
ctx.beginPath();
ctx.moveTo(a.x, a.y);
ctx.lineTo(b.x, b.y);
ctx.stroke();
}
function clearAll() {
setStrokes([]);
}
function undoLast() {
setStrokes((s) => s.slice(0, -1));
}
async function finishWithAnnotation() {
const canvas = canvasRef.current;
if (!canvas) return;
setSubmitting(true);
try {
const blob = await new Promise<Blob | null>((resolve) =>
canvas.toBlob(resolve, "image/jpeg", 0.85)
);
await onSubmit(blob);
} finally {
setSubmitting(false);
}
}
async function finishWithoutAnnotation() {
setSubmitting(true);
try {
await onSubmit(null);
} finally {
setSubmitting(false);
}
}
return (
<div className="fixed inset-0 z-50 bg-background flex flex-col">
<header className="p-4 border-b flex items-center justify-between">
<div>
<div className="text-xs text-muted-foreground">Обведите повреждение</div>
<h2 className="text-lg font-semibold capitalize">{zoneLabel}</h2>
</div>
<div className="flex gap-2">
<button
onClick={undoLast}
disabled={strokes.length === 0 || submitting}
className="text-sm px-3 py-1 border rounded-md disabled:opacity-40"
title="Отменить последний штрих"
>
</button>
<button
onClick={clearAll}
disabled={strokes.length === 0 || submitting}
className="text-sm px-3 py-1 border rounded-md disabled:opacity-40"
title="Очистить"
>
Очистить
</button>
</div>
</header>
<main className="flex-1 overflow-auto p-2 flex items-center justify-center bg-black">
<canvas
ref={canvasRef}
onPointerDown={onPointerDown}
onPointerMove={onPointerMove}
onPointerUp={onPointerUp}
onPointerCancel={onPointerUp}
className="max-w-full max-h-full block"
style={{ touchAction: "none", cursor: "crosshair" }}
/>
</main>
<footer className="border-t p-3 flex gap-2 bg-card">
<Button
variant="outline"
onClick={onCancel}
disabled={submitting}
className="flex-none"
>
Назад
</Button>
<Button
variant="outline"
onClick={finishWithoutAnnotation}
disabled={submitting}
className="flex-1"
>
Без линий
</Button>
<Button
onClick={finishWithAnnotation}
disabled={submitting || strokes.length === 0}
className="flex-1"
>
{submitting ? "Сохраняю…" : "Готово"}
</Button>
</footer>
</div>
);
}
@@ -0,0 +1,157 @@
import { useEffect, useRef, useState } from "react";
interface Point {
x: number;
y: number;
}
interface DamageOverlay {
zoneId: number;
points: Point[];
}
interface Props {
damagedZoneIds: number[];
/** Координаты точек повреждений в композитной SVG-системе (827×1209). */
damages?: DamageOverlay[];
onZoneClick?: (zoneId: number) => void;
}
const SVG_NS = "http://www.w3.org/2000/svg";
const POINT_RADIUS = 9;
/** Композитная SVG-схема экстерьера машины с подсветкой зон + точками
* повреждений. Координаты точек в системе 827×1209 (та же что у vendor). */
export function TtDamageMap({ damagedZoneIds, damages, onZoneClick }: Props) {
const containerRef = useRef<HTMLDivElement>(null);
const [svgText, setSvgText] = useState<string | null>(null);
const damagedSet = new Set(damagedZoneIds.map(String));
useEffect(() => {
let cancelled = false;
fetch("/scheme/exterior.svg")
.then((r) => r.text())
.then((text) => {
if (cancelled) return;
let mut = text;
mut = mut.replace(/<script[\s\S]*?<\/script>/gi, "");
mut = mut.replace(
/(<svg\b[^>]*?)\s(?:width|height)\s*=\s*"[^"]*"/gi,
"$1"
);
mut = mut.replace(
/<svg\b/i,
`<svg width="100%" height="100%" preserveAspectRatio="xMidYMid meet"`
);
setSvgText(mut);
});
return () => {
cancelled = true;
};
}, []);
// Tinting + cursors
useEffect(() => {
if (!svgText) return;
const el = containerRef.current;
if (!el) return;
const svg = el.querySelector("svg") as SVGSVGElement | null;
if (!svg) return;
svg.querySelectorAll("path[class]").forEach((p) => {
const cls = p.getAttribute("class") ?? "";
if (damagedSet.has(cls)) {
p.setAttribute("fill", "rgba(239, 68, 68, 0.35)");
p.setAttribute("stroke", "rgb(239, 68, 68)");
p.setAttribute("stroke-width", "2");
(p as SVGElement).style.cursor = onZoneClick ? "pointer" : "default";
} else {
p.setAttribute("fill", "rgba(0,0,0,0.04)");
p.setAttribute("stroke", "rgba(0,0,0,0.25)");
p.setAttribute("stroke-width", "0.5");
(p as SVGElement).style.cursor = "default";
}
});
svg.querySelectorAll("path:not([class])").forEach((p) => {
(p as SVGElement).style.opacity = "0.4";
(p as SVGElement).style.pointerEvents = "none";
});
}, [svgText, damagedSet, onZoneClick]);
// Point overlay — рисуем поверх SVG в его user-space (827×1209) чтобы
// точки идеально совмещались с подсвеченными зонами при любом масштабе.
useEffect(() => {
if (!svgText) return;
const el = containerRef.current;
if (!el) return;
const svg = el.querySelector("svg") as SVGSVGElement | null;
if (!svg) return;
const existing = svg.querySelector("g[data-tt-damage-points]");
if (existing) existing.remove();
if (!damages || damages.length === 0) return;
const group = document.createElementNS(SVG_NS, "g");
group.setAttribute("data-tt-damage-points", "1");
let counter = 1;
for (const dmg of damages) {
for (const pt of dmg.points || []) {
if (
typeof pt.x !== "number" ||
typeof pt.y !== "number" ||
!Number.isFinite(pt.x) ||
!Number.isFinite(pt.y)
) {
continue;
}
const circle = document.createElementNS(SVG_NS, "circle");
circle.setAttribute("cx", String(pt.x));
circle.setAttribute("cy", String(pt.y));
circle.setAttribute("r", String(POINT_RADIUS));
circle.setAttribute("fill", "rgb(220, 38, 38)");
circle.setAttribute("stroke", "white");
circle.setAttribute("stroke-width", "2");
(circle as SVGElement).style.pointerEvents = "none";
group.appendChild(circle);
const text = document.createElementNS(SVG_NS, "text");
text.setAttribute("x", String(pt.x));
text.setAttribute("y", String(pt.y));
text.setAttribute("text-anchor", "middle");
text.setAttribute("dominant-baseline", "central");
text.setAttribute("fill", "white");
text.setAttribute("font-size", "11");
text.setAttribute("font-weight", "bold");
(text as SVGElement).style.pointerEvents = "none";
(text as SVGElement).style.userSelect = "none";
text.textContent = String(counter);
group.appendChild(text);
counter += 1;
}
}
svg.appendChild(group);
}, [svgText, damages]);
function handleClick(e: React.MouseEvent<HTMLDivElement>) {
if (!onZoneClick) return;
const target = e.target as Element;
const cls = target.getAttribute?.("class");
if (cls && damagedSet.has(cls)) {
const zoneId = Number(cls);
if (Number.isFinite(zoneId)) onZoneClick(zoneId);
}
}
return (
<div
ref={containerRef}
onClick={handleClick}
className="w-full aspect-[827/1209] max-h-[60vh] mx-auto bg-card rounded-lg overflow-hidden"
style={{ touchAction: "manipulation" }}
dangerouslySetInnerHTML={svgText ? { __html: svgText } : undefined}
/>
);
}
@@ -14,8 +14,17 @@ export interface SchemeMarker {
damage_type?: string | null; damage_type?: string | null;
severity?: string | null; severity?: string | null;
resolved: boolean; resolved: boolean;
/** Координаты точек повреждения в композитной SVG-системе (827×1209). */
polygon?: { x: number; y: number }[] | null;
} }
const SVG_NS = "http://www.w3.org/2000/svg";
const POINT_RADIUS = 9;
const POINT_FILL_ACTIVE = "rgb(220, 38, 38)";
const POINT_FILL_RESOLVED = "rgb(107, 114, 128)";
const COMPOSITE_W = 827;
const COMPOSITE_H = 1209;
interface Props { interface Props {
markers: SchemeMarker[]; markers: SchemeMarker[];
onZoneTap?: (zoneId: number) => void; onZoneTap?: (zoneId: number) => void;
@@ -110,6 +119,69 @@ export function VendorVehicleScheme({
}); });
}, [svgText, zoneStats, hoverZone, editable]); }, [svgText, zoneStats, hoverZone, editable]);
// Overlay точек повреждений (multi-point координаты в композитной 827×1209)
useEffect(() => {
if (!svgText) return;
const el = containerRef.current;
if (!el) return;
const svg = el.querySelector("svg") as SVGSVGElement | null;
if (!svg) return;
// Удаляем предыдущий overlay
const existing = svg.querySelector("g[data-damage-points]");
if (existing) existing.remove();
const group = document.createElementNS(SVG_NS, "g");
group.setAttribute("data-damage-points", "1");
let counter = 1;
for (const m of markers) {
const pts = m.polygon || [];
if (pts.length === 0) continue;
const fill = m.resolved ? POINT_FILL_RESOLVED : POINT_FILL_ACTIVE;
for (const pt of pts) {
if (
typeof pt.x !== "number" ||
typeof pt.y !== "number" ||
!Number.isFinite(pt.x) ||
!Number.isFinite(pt.y)
) {
continue;
}
// Polygon хранится в normalised 0..1 (см. ZoneDetailView). SVG viewBox
// в композитной 827×1209, поэтому умножаем перед отрисовкой.
const cx = pt.x * COMPOSITE_W;
const cy = pt.y * COMPOSITE_H;
const circle = document.createElementNS(SVG_NS, "circle");
circle.setAttribute("cx", String(cx));
circle.setAttribute("cy", String(cy));
circle.setAttribute("r", String(POINT_RADIUS));
circle.setAttribute("fill", fill);
circle.setAttribute("stroke", "white");
circle.setAttribute("stroke-width", "2");
(circle as SVGElement).style.pointerEvents = "none";
group.appendChild(circle);
const text = document.createElementNS(SVG_NS, "text");
text.setAttribute("x", String(cx));
text.setAttribute("y", String(cy));
text.setAttribute("text-anchor", "middle");
text.setAttribute("dominant-baseline", "central");
text.setAttribute("fill", "white");
text.setAttribute("font-size", "11");
text.setAttribute("font-weight", "bold");
(text as SVGElement).style.pointerEvents = "none";
(text as SVGElement).style.userSelect = "none";
text.textContent = String(counter);
group.appendChild(text);
counter += 1;
}
}
svg.appendChild(group);
}, [svgText, markers]);
// Walk up from event.target to find a path[class="N"] (numeric zone id) // Walk up from event.target to find a path[class="N"] (numeric zone id)
function zoneFromEvent(e: React.MouseEvent | React.TouchEvent): number | null { function zoneFromEvent(e: React.MouseEvent | React.TouchEvent): number | null {
let node = e.target as Element | null; let node = e.target as Element | null;
@@ -24,3 +24,42 @@ export async function loadDamageVocabulary(): Promise<DamageVocabulary> {
}; };
return cache; return cache;
} }
/**
* Mapping русского названия из damage_vocabulary.json в DamageType enum
* нашего backend'а (см. mechanic_schemas.DamageType Literal).
* Возвращает null для типов которым нет точного соответствия —
* вызывающий код должен такие отфильтровать из UI.
*/
export const DAMAGE_RU_TO_ENUM: Record<string, string | null> = {
"Вмятина": "dent",
"Царапина": "scratch",
"Трещина": "crack",
"Повреждено": "damaged",
"Скол": "chip",
"Отсутствует": "missing",
"Прожжено": "burn",
"Погнуто": "bent",
"Требуется мойка": null,
"Не работает": "not-working",
"Порез": "cut",
"Прокол": "puncture",
"Порвано": "torn",
"Пятна": "stain",
"Грязный салон": "stain",
"Запах табака": null,
"Повреждение салонных ковриков": "damaged",
"Повреждение обшивки дверей": "damaged",
"Сломанные ручки": "damaged",
"Установлено": "removed",
"Снято": "removed",
"Контроль": null,
"Требуется химчистка": "stain",
"Затертость": "scuff",
"Грыжа": "bulge",
"Штат": null,
};
export function damageTypeRuToEnum(ru: string): string | null {
return DAMAGE_RU_TO_ENUM[ru] ?? null;
}
@@ -6,9 +6,10 @@ import {
getInspection, getInspection,
patchInspection, patchInspection,
createMarker, createMarker,
deleteMarker,
type MarkerSummary, type MarkerSummary,
} from "@/api/inspections"; } from "@/api/inspections";
import { uploadPhoto } from "@/api/photos"; import { uploadPhoto, uploadPhotoAnnotation } from "@/api/photos";
import { PhotoSlot } from "@/components/camera/PhotoSlot"; import { PhotoSlot } from "@/components/camera/PhotoSlot";
import { CameraCapture } from "@/components/camera/CameraCapture"; import { CameraCapture } from "@/components/camera/CameraCapture";
import { VendorVehicleScheme } from "@/components/vehicle-scheme/VendorVehicleScheme"; import { VendorVehicleScheme } from "@/components/vehicle-scheme/VendorVehicleScheme";
@@ -16,12 +17,15 @@ import { TireWearDialog } from "@/components/inspection/TireWearDialog";
import { ZoneConfirmDialog } from "@/components/damage-flow/ZoneConfirmDialog"; import { ZoneConfirmDialog } from "@/components/damage-flow/ZoneConfirmDialog";
import { ZoneDetailView } from "@/components/damage-flow/ZoneDetailView"; import { ZoneDetailView } from "@/components/damage-flow/ZoneDetailView";
import { DamageClassifyDialog } from "@/components/damage-flow/DamageClassifyDialog"; import { DamageClassifyDialog } from "@/components/damage-flow/DamageClassifyDialog";
import { PhotoAnnotateStep } from "@/components/damage-flow/PhotoAnnotateStep";
import { AuthImg } from "@/components/AuthImg"; import { AuthImg } from "@/components/AuthImg";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Card } from "@/components/ui/card"; import { Card } from "@/components/ui/card";
import { loadZoneLabels } from "@/data/zoneLabels"; import { loadZoneLabels } from "@/data/zoneLabels";
import { damageTypeRuToEnum } from "@/data/damageVocabulary";
import { ttImageUrl } from "@/api/vehicles";
const SLOTS: { side: string; label: string }[] = [ const SLOTS_GENERAL: { side: string; label: string }[] = [
{ side: "front", label: "Перед" }, { side: "front", label: "Перед" },
{ side: "rear", label: "Зад" }, { side: "rear", label: "Зад" },
{ side: "left", label: "Левый бок" }, { side: "left", label: "Левый бок" },
@@ -32,6 +36,15 @@ const SLOTS: { side: string; label: string }[] = [
{ side: "free", label: "Свободное" }, { side: "free", label: "Свободное" },
]; ];
const SLOT_JACK = { side: "jack", label: "Домкрат" };
/** На приёмке (return) общие ракурсы не нужны — машина уже знакома, фокус
* на проверке повреждений и комплектации. Домкрат остаётся всегда. */
function slotsForType(type: string): typeof SLOTS_GENERAL {
if (type === "return") return [SLOT_JACK];
return [...SLOTS_GENERAL, SLOT_JACK];
}
const SEVERITY_LABELS: Record<string, string> = { const SEVERITY_LABELS: Record<string, string> = {
cosmetic: "косметика", cosmetic: "косметика",
minor: "лёгкое", minor: "лёгкое",
@@ -61,11 +74,18 @@ const DAMAGE_TYPE_LABELS: Record<string, string> = {
// Vendor 3-position severity index → backend literal // Vendor 3-position severity index → backend literal
const SEVERITY_MAP = ["minor", "moderate", "severe"] as const; const SEVERITY_MAP = ["minor", "moderate", "severe"] as const;
function humanizeMarkerSide(side: string | null | undefined): string { function humanizeMarkerSide(
side: string | null | undefined,
zoneLabels?: Record<string, string> | null,
): string {
if (!side) return "—"; if (!side) return "—";
if (side === "tires") return "Резина"; if (side === "tires") return "Резина";
const zm = /^zone-(\d+)$/.exec(side); const zm = /^zone-(\d+)$/.exec(side);
if (zm) return `Зона ${zm[1]}`; if (zm) {
const label = zoneLabels?.[zm[1]];
if (label) return label;
return `Зона ${zm[1]}`;
}
const map: Record<string, string> = { const map: Record<string, string> = {
top: "Сверху", top: "Сверху",
front: "Перед", front: "Перед",
@@ -93,7 +113,8 @@ type DamageFlow =
| { kind: "confirm"; zoneId: number; zoneLabel: string } | { kind: "confirm"; zoneId: number; zoneLabel: string }
| { kind: "placePoints"; zoneId: number; zoneLabel: string } | { kind: "placePoints"; zoneId: number; zoneLabel: string }
| { kind: "classify"; zoneId: number; zoneLabel: string; points: { x: number; y: number }[] } | { kind: "classify"; zoneId: number; zoneLabel: string; points: { x: number; y: number }[] }
| { kind: "capture"; zoneId: number; zoneLabel: string; points: { x: number; y: number }[]; damageType: string; severity: 0 | 1 | 2 }; | { kind: "capture"; zoneId: number; zoneLabel: string; points: { x: number; y: number }[]; damageType: string; severity: 0 | 1 | 2 }
| { kind: "annotate"; zoneId: number; zoneLabel: string; points: { x: number; y: number }[]; damageType: string; severity: 0 | 1 | 2; photoFile: File };
export default function InspectionEditor() { export default function InspectionEditor() {
const { id } = useParams<{ id: string }>(); const { id } = useParams<{ id: string }>();
@@ -121,6 +142,15 @@ export default function InspectionEditor() {
onError: () => toast.error("Не удалось завершить"), onError: () => toast.error("Не удалось завершить"),
}); });
const removeMarker = useMutation({
mutationFn: (markerId: number) => deleteMarker(markerId),
onSuccess: () => {
void qc.invalidateQueries({ queryKey: ["inspection", insId] });
toast.success("Метка удалена");
},
onError: () => toast.error("Не удалось удалить"),
});
if (isLoading) return <div className="p-8 text-muted-foreground">Загружаю</div>; if (isLoading) return <div className="p-8 text-muted-foreground">Загружаю</div>;
if (isError || !ins) if (isError || !ins)
return <div className="p-8 text-destructive">Осмотр не найден.</div>; return <div className="p-8 text-destructive">Осмотр не найден.</div>;
@@ -128,6 +158,9 @@ export default function InspectionEditor() {
// Photos lookup by side+slot for initialPhotoId // Photos lookup by side+slot for initialPhotoId
const photosBySide = new Map<string, typeof ins.photos[0]>(); const photosBySide = new Map<string, typeof ins.photos[0]>();
for (const p of ins.photos) photosBySide.set(`${p.side}-${p.slot_index}`, p); for (const p of ins.photos) photosBySide.set(`${p.side}-${p.slot_index}`, p);
// Photos lookup by id — нужен для marker thumb (annotated vs original)
const photosById = new Map<number, typeof ins.photos[0]>();
for (const p of ins.photos) photosById.set(p.id, p);
const editable = ins.status === "in_progress"; const editable = ins.status === "in_progress";
@@ -166,6 +199,7 @@ export default function InspectionEditor() {
damage_type: m.damage_type, damage_type: m.damage_type,
severity: m.severity, severity: m.severity,
resolved: m.resolved, resolved: m.resolved,
polygon: m.polygon,
}))} }))}
onZoneTap={editable ? handleZoneTap : undefined} onZoneTap={editable ? handleZoneTap : undefined}
onTireWearClick={editable ? () => setTireWearOpen(true) : undefined} onTireWearClick={editable ? () => setTireWearOpen(true) : undefined}
@@ -221,21 +255,64 @@ export default function InspectionEditor() {
{flow.kind === "capture" && ( {flow.kind === "capture" && (
<CapturePhotoStep <CapturePhotoStep
inspectionId={insId}
zoneLabel={flow.zoneLabel} zoneLabel={flow.zoneLabel}
onCancel={() => setFlow({ kind: "idle" })} onCancel={() => setFlow({ kind: "idle" })}
onPhotoUploaded={async (photoId) => { onPhotoCaptured={(file) =>
setFlow({
kind: "annotate",
zoneId: flow.zoneId,
zoneLabel: flow.zoneLabel,
points: flow.points,
damageType: flow.damageType,
severity: flow.severity,
photoFile: file,
})
}
/>
)}
{flow.kind === "annotate" && (
<PhotoAnnotateStep
photoFile={flow.photoFile}
zoneLabel={flow.zoneLabel}
onCancel={() =>
setFlow({
kind: "capture",
zoneId: flow.zoneId,
zoneLabel: flow.zoneLabel,
points: flow.points,
damageType: flow.damageType,
severity: flow.severity,
})
}
onSubmit={async (annotated) => {
try { try {
const damageEnum = damageTypeRuToEnum(flow.damageType);
if (!damageEnum) {
toast.error(`Не поддерживается: ${flow.damageType}`);
setFlow({ kind: "idle" });
return;
}
const result = await uploadPhoto(insId, "free", 0, flow.photoFile);
if (annotated) {
try {
await uploadPhotoAnnotation(insId, result.id, annotated);
} catch (err) {
// Аннотация — best-effort. Фото оригинал уже сохранилось.
console.warn("annotation upload failed (non-fatal)", err);
}
}
await createMarker(insId, { await createMarker(insId, {
side: `zone-${flow.zoneId}`, side: `zone-${flow.zoneId}`,
polygon: flow.points, polygon: flow.points,
damage_type: flow.damageType, damage_type: damageEnum,
severity: SEVERITY_MAP[flow.severity], severity: SEVERITY_MAP[flow.severity],
photo_id: photoId, photo_id: result.id,
}); });
void qc.invalidateQueries({ queryKey: ["inspection", insId] }); void qc.invalidateQueries({ queryKey: ["inspection", insId] });
toast.success("Повреждение записано"); toast.success("Повреждение записано");
} catch { } catch (err) {
console.error("save failed", err);
toast.error("Не удалось сохранить"); toast.error("Не удалось сохранить");
} finally { } finally {
setFlow({ kind: "idle" }); setFlow({ kind: "idle" });
@@ -258,7 +335,7 @@ export default function InspectionEditor() {
<div> <div>
<h2 className="text-sm font-semibold text-muted-foreground mb-2">Фото</h2> <h2 className="text-sm font-semibold text-muted-foreground mb-2">Фото</h2>
<div className="grid grid-cols-2 gap-2"> <div className="grid grid-cols-2 gap-2">
{SLOTS.map((s) => ( {slotsForType(ins.type).map((s) => (
<PhotoSlot <PhotoSlot
key={`${s.side}-0`} key={`${s.side}-0`}
inspectionId={insId} inspectionId={insId}
@@ -285,8 +362,8 @@ export default function InspectionEditor() {
<Card className="p-3 text-sm"> <Card className="p-3 text-sm">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<div> <div>
<span className="font-medium"> <span className="font-medium capitalize">
{humanizeMarkerSide(m.side)} {humanizeMarkerSide(m.side, zoneLabels)}
</span> </span>
{" — "} {" — "}
<span> <span>
@@ -303,26 +380,64 @@ export default function InspectionEditor() {
</> </>
)} )}
</div> </div>
<div className="flex items-center gap-2">
{m.carried_over_from_id && ( {m.carried_over_from_id && (
<span className="text-xs text-muted-foreground"> <span className="text-xs text-muted-foreground">
перенесено перенесено
</span> </span>
)} )}
{!m.carried_over_from_id &&
m.description?.startsWith("Перенесено из Element Mechanic") && (
<span className="text-xs text-muted-foreground">
из Element Mechanic
</span>
)}
{editable && (
<button
onClick={() => {
const verb = m.carried_over_from_id
? "Удалить (повреждение устранено в ремонте)?"
: "Удалить метку?";
if (window.confirm(verb)) {
removeMarker.mutate(m.id);
}
}}
disabled={removeMarker.isPending}
className="text-xs text-destructive hover:underline px-1"
title="Удалить метку"
>
</button>
)}
</div>
</div> </div>
{m.description && ( {m.description && (
<div className="text-xs text-muted-foreground mt-1"> <div className="text-xs text-muted-foreground mt-1">
{m.description} {m.description}
</div> </div>
)} )}
{m.photo_id && ( {m.photo_id ? (
<div className="mt-2 max-w-[8rem]"> <div className="mt-2 max-w-[8rem]">
<AuthImg <AuthImg
src={`photos/${m.photo_id}/thumb`} src={
photosById.get(m.photo_id)?.annotated_key
? `photos/${m.photo_id}/annotated`
: `photos/${m.photo_id}/thumb`
}
alt="Фото повреждения" alt="Фото повреждения"
className="w-full aspect-[4/3] object-cover rounded bg-muted" className="w-full aspect-[4/3] object-cover rounded bg-muted"
/> />
</div> </div>
)} ) : m.tt_image_id ? (
<div className="mt-2 max-w-[8rem]">
<img
src={ttImageUrl(m.tt_image_id)}
alt="Фото из Element Mechanic"
loading="lazy"
className="w-full aspect-[4/3] object-cover rounded bg-muted"
/>
</div>
) : null}
</Card> </Card>
</li> </li>
))} ))}
@@ -344,29 +459,14 @@ export default function InspectionEditor() {
} }
function CapturePhotoStep({ function CapturePhotoStep({
inspectionId,
zoneLabel, zoneLabel,
onCancel, onCancel,
onPhotoUploaded, onPhotoCaptured,
}: { }: {
inspectionId: number;
zoneLabel: string; zoneLabel: string;
onCancel: () => void; onCancel: () => void;
onPhotoUploaded: (photoId: number) => void | Promise<void>; onPhotoCaptured: (file: File) => void;
}) { }) {
const [uploading, setUploading] = useState(false);
async function handleFile(file: File) {
setUploading(true);
try {
const result = await uploadPhoto(inspectionId, "free", 0, file);
await onPhotoUploaded(result.id);
} catch {
toast.error("Ошибка загрузки фото");
setUploading(false);
}
}
return ( return (
<div className="fixed inset-0 z-50 bg-background flex flex-col"> <div className="fixed inset-0 z-50 bg-background flex flex-col">
<header className="p-4 border-b"> <header className="p-4 border-b">
@@ -375,13 +475,12 @@ function CapturePhotoStep({
</header> </header>
<main className="flex-1 p-4 flex flex-col justify-center max-w-md w-full mx-auto"> <main className="flex-1 p-4 flex flex-col justify-center max-w-md w-full mx-auto">
<CameraCapture <CameraCapture
onCapture={handleFile} onCapture={onPhotoCaptured}
buttonLabel={uploading ? "Загружаю…" : "Сделать фото"} buttonLabel="Сделать фото"
/> />
<Button <Button
variant="outline" variant="outline"
onClick={onCancel} onClick={onCancel}
disabled={uploading}
className="mt-4 w-full" className="mt-4 w-full"
> >
Отмена Отмена
@@ -1,9 +1,18 @@
import { useParams, useNavigate } from "react-router-dom"; import { useParams, useNavigate } from "react-router-dom";
import { useQuery } from "@tanstack/react-query"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { getInspection, type MarkerSummary, type PhotoSummary } from "@/api/inspections"; import { toast } from "sonner";
import {
getInspection,
deleteInspection,
type MarkerSummary,
type PhotoSummary,
} from "@/api/inspections";
import { getMe } from "@/api/me";
import { AuthImg } from "@/components/AuthImg"; import { AuthImg } from "@/components/AuthImg";
import { ttImageUrl } from "@/api/vehicles";
import { VendorVehicleScheme } from "@/components/vehicle-scheme/VendorVehicleScheme"; import { VendorVehicleScheme } from "@/components/vehicle-scheme/VendorVehicleScheme";
import { Card } from "@/components/ui/card"; import { Card } from "@/components/ui/card";
import { loadZoneLabels } from "@/data/zoneLabels";
const STATUS_LABELS: Record<string, string> = { const STATUS_LABELS: Record<string, string> = {
in_progress: "В работе", in_progress: "В работе",
@@ -37,11 +46,18 @@ const DAMAGE_TYPE_LABELS: Record<string, string> = {
"not-working": "не работает", "not-working": "не работает",
}; };
function humanizeMarkerSide(side: string | null | undefined): string { function humanizeMarkerSide(
side: string | null | undefined,
zoneLabels?: Record<string, string> | null,
): string {
if (!side) return "—"; if (!side) return "—";
if (side === "tires") return "Резина"; if (side === "tires") return "Резина";
const zm = /^zone-(\d+)$/.exec(side); const zm = /^zone-(\d+)$/.exec(side);
if (zm) return `Зона ${zm[1]}`; if (zm) {
const label = zoneLabels?.[zm[1]];
if (label) return label;
return `Зона ${zm[1]}`;
}
const map: Record<string, string> = { const map: Record<string, string> = {
top: "Сверху", top: "Сверху",
front: "Перед", front: "Перед",
@@ -74,10 +90,38 @@ export default function InspectionReview() {
queryFn: () => getInspection(insId), queryFn: () => getInspection(insId),
}); });
const { data: me } = useQuery({
queryKey: ["me"],
queryFn: getMe,
staleTime: 5 * 60_000,
});
const isAdmin = me?.permissions?.includes("admin") ?? false;
const queryClient = useQueryClient();
const deleteMutation = useMutation({
mutationFn: () => deleteInspection(insId),
onSuccess: () => {
toast.success("Осмотр удалён");
queryClient.invalidateQueries({ queryKey: ["vehicle"] });
navigate(-1);
},
onError: () => toast.error("Не удалось удалить осмотр"),
});
const { data: zoneLabels } = useQuery({
queryKey: ["zone-labels"],
queryFn: loadZoneLabels,
staleTime: Infinity,
});
if (isLoading) return <div className="p-8 text-muted-foreground">Загружаю</div>; if (isLoading) return <div className="p-8 text-muted-foreground">Загружаю</div>;
if (isError || !ins) if (isError || !ins)
return <div className="p-8 text-destructive">Осмотр не найден.</div>; return <div className="p-8 text-destructive">Осмотр не найден.</div>;
// Lookup photo by id для определения annotated_key.
const photosById = new Map<number, typeof ins.photos[0]>();
for (const p of ins.photos) photosById.set(p.id, p);
return ( return (
<div className="min-h-screen bg-background p-4 space-y-4"> <div className="min-h-screen bg-background p-4 space-y-4">
<button <button
@@ -127,6 +171,7 @@ export default function InspectionReview() {
damage_type: m.damage_type, damage_type: m.damage_type,
severity: m.severity, severity: m.severity,
resolved: m.resolved, resolved: m.resolved,
polygon: m.polygon,
}))} }))}
editable={false} editable={false}
/> />
@@ -167,8 +212,8 @@ export default function InspectionReview() {
<Card className="p-3 text-sm"> <Card className="p-3 text-sm">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<div> <div>
<span className="font-medium"> <span className="font-medium capitalize">
{humanizeMarkerSide(m.side)} {humanizeMarkerSide(m.side, zoneLabels)}
</span> </span>
{" — "} {" — "}
<span> <span>
@@ -203,21 +248,53 @@ export default function InspectionReview() {
{m.description} {m.description}
</div> </div>
)} )}
{m.photo_id && ( {m.photo_id ? (
<div className="mt-2 max-w-[8rem]"> <div className="mt-2 max-w-[8rem]">
<AuthImg <AuthImg
src={`photos/${m.photo_id}/thumb`} src={
photosById.get(m.photo_id)?.annotated_key
? `photos/${m.photo_id}/annotated`
: `photos/${m.photo_id}/thumb`
}
alt="Фото повреждения" alt="Фото повреждения"
className="w-full aspect-[4/3] object-cover rounded bg-muted" className="w-full aspect-[4/3] object-cover rounded bg-muted"
/> />
</div> </div>
)} ) : m.tt_image_id ? (
<div className="mt-2 max-w-[8rem]">
<img
src={ttImageUrl(m.tt_image_id)}
alt="Фото из Element Mechanic"
loading="lazy"
className="w-full aspect-[4/3] object-cover rounded bg-muted"
/>
</div>
) : null}
</Card> </Card>
</li> </li>
))} ))}
</ul> </ul>
)} )}
</div> </div>
{isAdmin && (
<div className="pt-4">
<button
onClick={() => {
if (
window.confirm(
"Удалить этот осмотр? Все фото будут безвозвратно удалены из хранилища. Действие необратимо."
)
) {
deleteMutation.mutate();
}
}}
disabled={deleteMutation.isPending}
className="w-full py-3 rounded-lg border border-destructive text-destructive hover:bg-destructive/10 active:bg-destructive/20 transition-colors font-semibold"
>
{deleteMutation.isPending ? "Удаляю…" : "Удалить осмотр"}
</button>
</div>
)}
</div> </div>
); );
} }
@@ -0,0 +1,394 @@
import { useState, useMemo, useRef, useEffect } from "react";
import { useParams, useNavigate } from "react-router-dom";
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { toast } from "sonner";
import {
getTtState,
deleteTtState,
ttImageUrl,
type TtPhotoRef,
type TtSidePhoto,
} from "@/api/vehicles";
import { getMe } from "@/api/me";
import { Card } from "@/components/ui/card";
import { TtDamageMap } from "@/components/tt/TtDamageMap";
interface ZoneLabels {
[zoneId: string]: string;
}
interface DamageVocabulary {
damage_types_ordered: string[];
[k: string]: unknown;
}
let zoneLabelsCache: ZoneLabels | null = null;
let damageVocabCache: DamageVocabulary | null = null;
async function loadZoneLabels(): Promise<ZoneLabels> {
if (zoneLabelsCache) return zoneLabelsCache;
const res = await fetch("/data/zone_labels.json");
zoneLabelsCache = await res.json();
return zoneLabelsCache!;
}
async function loadDamageVocabulary(): Promise<DamageVocabulary> {
if (damageVocabCache) return damageVocabCache;
const res = await fetch("/data/damage_vocabulary.json");
damageVocabCache = await res.json();
return damageVocabCache!;
}
const DEGREE_LABELS: Record<number, string> = {
0: "Лёгкое",
1: "Среднее",
2: "Тяжёлое",
};
function damageTypeName(
id: number | null,
vocab: DamageVocabulary | undefined,
): string {
if (id == null) return "Без типа";
// Vendor enum is 1-based: type=1 → damage_types_ordered[0] ("Вмятина").
const idx = id - 1;
const arr = vocab?.damage_types_ordered;
if (arr && idx >= 0 && idx < arr.length) return arr[idx];
return `Тип ${id}`;
}
const SIDE_LABELS: Record<number, string> = {
1: "Перед",
2: "Зад",
3: "Левый борт",
4: "Правый борт",
5: "Сверху",
6: "Передний угол",
7: "Задний угол",
8: "Салон",
9: "Дополнительно",
};
type PreviewItem =
| { kind: "zone"; photo: TtPhotoRef }
| { kind: "side"; photo: TtSidePhoto };
export default function TtStateDetail() {
const { id } = useParams<{ id: string }>();
const navigate = useNavigate();
const stateId = Number(id);
const zoneRefs = useRef<Record<string, HTMLDivElement | null>>({});
const { data: state, isLoading, isError } = useQuery({
queryKey: ["tt-state", stateId],
queryFn: () => getTtState(stateId),
enabled: Number.isFinite(stateId),
});
const { data: labels } = useQuery({
queryKey: ["zone-labels"],
queryFn: loadZoneLabels,
staleTime: Infinity,
});
const { data: vocab } = useQuery({
queryKey: ["damage-vocabulary"],
queryFn: loadDamageVocabulary,
staleTime: Infinity,
});
const { data: me } = useQuery({
queryKey: ["me"],
queryFn: getMe,
staleTime: 5 * 60_000,
});
const isAdmin = me?.permissions?.includes("admin") ?? false;
const queryClient = useQueryClient();
const deleteMutation = useMutation({
mutationFn: () => deleteTtState(stateId),
onSuccess: () => {
toast.success("Осмотр удалён");
// Drop any cached tt-history for vehicle list so новый рендер не покажет удалённый.
queryClient.invalidateQueries({ queryKey: ["vehicle"] });
navigate(-1);
},
onError: () => toast.error("Не удалось удалить осмотр"),
});
const [preview, setPreview] = useState<PreviewItem | null>(null);
const [showLines, setShowLines] = useState(false);
const damagedZoneIds = useMemo(() => {
if (!state) return [];
return Object.keys(state.damages_by_zone).map((k) => Number(k));
}, [state]);
const damageOverlays = useMemo(() => {
if (!state) return [];
return Object.entries(state.damages_by_zone).flatMap(([zid, dmgs]) =>
dmgs.map((d) => ({ zoneId: Number(zid), points: d.points || [] }))
);
}, [state]);
// Reset refs when state changes
useEffect(() => {
zoneRefs.current = {};
}, [stateId]);
if (isLoading)
return <div className="p-8 text-muted-foreground">Загружаю</div>;
if (isError || !state)
return <div className="p-8 text-destructive">Осмотр не найден.</div>;
const date = state.unix_time
? new Date(state.unix_time * 1000).toLocaleString("ru-RU")
: "—";
const zoneIds = Array.from(
new Set([
...Object.keys(state.photos_by_zone),
...Object.keys(state.damages_by_zone),
])
).sort((a, b) => Number(a) - Number(b));
function scrollToZone(zoneId: number) {
const el = zoneRefs.current[String(zoneId)];
if (el) {
el.scrollIntoView({ behavior: "smooth", block: "start" });
}
}
return (
<div className="min-h-screen bg-background p-4 space-y-4 pb-20">
<button
onClick={() => navigate(-1)}
className="text-sm text-muted-foreground hover:text-foreground"
>
Назад
</button>
<Card className="p-4">
<div className="text-xs text-muted-foreground">Element Mechanic</div>
<div className="text-lg font-semibold mt-1">
{state.mechanic_name || "Осмотр"}
</div>
<div className="text-sm text-muted-foreground mt-1">
{date}
{state.mileage != null && (
<> · {state.mileage.toLocaleString("ru-RU")} км</>
)}
</div>
</Card>
{/* Общие 9 ракурсов */}
{state.side_photos.length > 0 && (
<div>
<h2 className="text-sm font-semibold text-muted-foreground mb-2">
Общие фото
</h2>
<div className="grid grid-cols-3 gap-2">
{state.side_photos.map((p) => {
const label = p.photo_type
? SIDE_LABELS[p.photo_type] || `Ракурс ${p.photo_type}`
: "Ракурс";
const thumbSrc = p.miniature_id
? ttImageUrl(p.miniature_id)
: ttImageUrl(p.image_id);
return (
<button
key={p.image_id}
onClick={() => {
setPreview({ kind: "side", photo: p });
setShowLines(false);
}}
className="aspect-square overflow-hidden rounded-lg bg-muted hover:opacity-80 transition-opacity relative"
>
<img
src={thumbSrc}
alt={label}
loading="lazy"
className="w-full h-full object-cover"
/>
<div className="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/60 to-transparent p-1">
<div className="text-white text-[10px] font-medium truncate">
{label}
</div>
</div>
</button>
);
})}
</div>
</div>
)}
{/* Карта повреждений */}
{damagedZoneIds.length > 0 && (
<div>
<h2 className="text-sm font-semibold text-muted-foreground mb-2">
Карта повреждений
<span className="ml-2 text-xs font-normal">
{damagedZoneIds.length}{" "}
{damagedZoneIds.length === 1 ? "зона" : "зон"}
</span>
</h2>
<TtDamageMap
damagedZoneIds={damagedZoneIds}
damages={damageOverlays}
onZoneClick={scrollToZone}
/>
<div className="text-[11px] text-muted-foreground mt-1 text-center">
Тап на зону прокрутка к деталям
</div>
</div>
)}
{/* Детали по зонам с повреждениями */}
{zoneIds.length === 0 ? (
<Card className="p-4 text-sm text-muted-foreground">
В осмотре нет ни фото, ни повреждений.
</Card>
) : (
zoneIds.map((zid) => {
const photos = state.photos_by_zone[zid] || [];
const damages = state.damages_by_zone[zid] || [];
const label = labels?.[zid] || `Зона ${zid}`;
return (
<div
key={zid}
ref={(el) => {
zoneRefs.current[zid] = el;
}}
className="scroll-mt-4"
>
<h2 className="text-sm font-semibold text-muted-foreground mb-2 capitalize flex items-center justify-between">
<span>{label}</span>
{damages.length > 0 && (
<span className="text-destructive text-xs">
{damages.length}{" "}
{damages.length === 1 ? "повреждение" : "повреждений"}
</span>
)}
</h2>
{damages.length > 0 && (
<div className="flex flex-wrap gap-1.5 mb-2">
{damages.map((d, idx) => {
const tname = damageTypeName(d.damage_type_id, vocab);
const dname =
d.degree != null ? DEGREE_LABELS[d.degree] : null;
return (
<span
key={(d.guid ?? "g") + "_" + idx}
className="inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded-full bg-destructive/10 text-destructive border border-destructive/30"
>
<span className="font-medium">{tname}</span>
{dname && (
<>
<span className="opacity-50">·</span>
<span>{dname}</span>
</>
)}
</span>
);
})}
</div>
)}
{photos.length > 0 ? (
<div className="grid grid-cols-3 gap-2">
{photos.map((p, idx) => (
<button
key={p.image_id + "_" + idx}
onClick={() => {
setPreview({ kind: "zone", photo: p });
setShowLines(false);
}}
className="aspect-square overflow-hidden rounded-lg bg-muted hover:opacity-80 transition-opacity"
>
<img
src={ttImageUrl(p.image_id)}
alt={`Зона ${zid}`}
loading="lazy"
className="w-full h-full object-cover"
/>
</button>
))}
</div>
) : (
<Card className="p-3 text-xs text-muted-foreground">
Фото нет только координаты повреждений
</Card>
)}
</div>
);
})
)}
{isAdmin && (
<div className="pt-4">
<button
onClick={() => {
if (
window.confirm(
"Скрыть этот осмотр из истории? Будет помечен как игнорируемый — sync не вернёт. Действие обратимо только из БД."
)
) {
deleteMutation.mutate();
}
}}
disabled={deleteMutation.isPending}
className="w-full py-3 rounded-lg border border-destructive text-destructive hover:bg-destructive/10 active:bg-destructive/20 transition-colors font-semibold"
>
{deleteMutation.isPending ? "Удаляю…" : "Удалить осмотр"}
</button>
</div>
)}
{preview && (
<div
className="fixed inset-0 z-50 bg-black/90 flex flex-col"
onClick={() => setPreview(null)}
>
<div className="flex items-center justify-between p-3">
<button
onClick={(e) => {
e.stopPropagation();
setPreview(null);
}}
className="text-white text-2xl px-3"
>
</button>
{preview.kind === "zone" &&
preview.photo.image_with_lines_id && (
<button
onClick={(e) => {
e.stopPropagation();
setShowLines((v) => !v);
}}
className="text-white text-sm border border-white/40 px-3 py-1 rounded-lg"
>
{showLines ? "Без линий" : "С линиями"}
</button>
)}
</div>
<div
className="flex-1 flex items-center justify-center p-4"
onClick={(e) => e.stopPropagation()}
>
<img
src={ttImageUrl(
preview.kind === "zone" &&
showLines &&
preview.photo.image_with_lines_id
? preview.photo.image_with_lines_id
: preview.photo.image_id
)}
alt="Просмотр"
className="max-w-full max-h-full object-contain"
/>
</div>
</div>
)}
</div>
);
}
+112 -47
View File
@@ -2,7 +2,7 @@ import { useState } from "react";
import { useParams, useNavigate, useSearchParams } from "react-router-dom"; import { useParams, useNavigate, useSearchParams } from "react-router-dom";
import { useQuery, useMutation } from "@tanstack/react-query"; import { useQuery, useMutation } from "@tanstack/react-query";
import { toast } from "sonner"; import { toast } from "sonner";
import { getVehicle } from "@/api/vehicles"; import { getVehicle, getTtHistory } from "@/api/vehicles";
import { createInspection, type InspectionType } from "@/api/inspections"; import { createInspection, type InspectionType } from "@/api/inspections";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Card } from "@/components/ui/card"; import { Card } from "@/components/ui/card";
@@ -10,7 +10,7 @@ import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
const INSPECTION_TYPE_LABELS: Record<InspectionType, string> = { const INSPECTION_TYPE_LABELS: Record<InspectionType, string> = {
handover: "Передача", handover: "Выдача",
return: "Приёмка", return: "Приёмка",
periodic: "Плановый", periodic: "Плановый",
"ad-hoc": "Свободный", "ad-hoc": "Свободный",
@@ -27,6 +27,18 @@ const STATUS_LABELS: Record<string, string> = {
cancelled: "Отменён", cancelled: "Отменён",
}; };
function timeAgo(iso: string): string {
const sec = Math.max(0, (Date.now() - new Date(iso).getTime()) / 1000);
if (sec < 60) return "только что";
const min = Math.floor(sec / 60);
if (min < 60) return `${min} мин назад`;
const h = Math.floor(min / 60);
if (h < 24) return `${h} ч назад`;
const d = Math.floor(h / 24);
if (d < 30) return `${d} дн назад`;
return new Date(iso).toLocaleDateString("ru-RU");
}
export default function VehicleCard() { export default function VehicleCard() {
const { id } = useParams<{ id: string }>(); const { id } = useParams<{ id: string }>();
const navigate = useNavigate(); const navigate = useNavigate();
@@ -37,12 +49,24 @@ export default function VehicleCard() {
const [pendingType, setPendingType] = useState<InspectionType | null>(null); const [pendingType, setPendingType] = useState<InspectionType | null>(null);
const [mileageInput, setMileageInput] = useState(""); const [mileageInput, setMileageInput] = useState("");
const [mileageSource, setMileageSource] = useState<
"starline" | "last-inspection" | null
>(null);
const { data: v, isLoading, isError } = useQuery({ const { data: v, isLoading, isError } = useQuery({
queryKey: ["vehicle", vehicleId], queryKey: ["vehicle", vehicleId],
queryFn: () => getVehicle(vehicleId), queryFn: () => getVehicle(vehicleId),
}); });
// История из vendor (Element Mechanic). Молча возвращает пустой список
// если машина ещё не синхронизирована — секцию просто скрываем.
const { data: tt } = useQuery({
queryKey: ["vehicle", vehicleId, "tt-history"],
queryFn: () => getTtHistory(vehicleId),
enabled: Number.isFinite(vehicleId),
staleTime: 5 * 60_000,
});
const startInspection = useMutation({ const startInspection = useMutation({
mutationFn: (input: { type: InspectionType; mileage: number | undefined }) => mutationFn: (input: { type: InspectionType; mileage: number | undefined }) =>
createInspection({ vehicle_id: vehicleId, type: input.type, mileage: input.mileage }), createInspection({ vehicle_id: vehicleId, type: input.type, mileage: input.mileage }),
@@ -54,8 +78,21 @@ export default function VehicleCard() {
const handleStartClick = (type: InspectionType) => { const handleStartClick = (type: InspectionType) => {
setPendingType(type); setPendingType(type);
// Приоритет: 1) StarLine OBD (свежий одометр), 2) пробег прошлого
// осмотра. Менеджер всегда может скорректировать.
if (v?.starline_mileage != null) {
setMileageInput(String(v.starline_mileage));
setMileageSource("starline");
return;
}
const lastWithMileage = v?.recent_inspections.find((i) => i.mileage != null); const lastWithMileage = v?.recent_inspections.find((i) => i.mileage != null);
setMileageInput(lastWithMileage?.mileage ? String(lastWithMileage.mileage) : ""); if (lastWithMileage?.mileage != null) {
setMileageInput(String(lastWithMileage.mileage));
setMileageSource("last-inspection");
return;
}
setMileageInput("");
setMileageSource(null);
}; };
if (isLoading) if (isLoading)
@@ -91,7 +128,7 @@ export default function VehicleCard() {
onClick={() => handleStartClick("handover")} onClick={() => handleStartClick("handover")}
disabled={startInspection.isPending} disabled={startInspection.isPending}
> >
Передача Выдача
</Button> </Button>
<Button <Button
onClick={() => handleStartClick("return")} onClick={() => handleStartClick("return")}
@@ -103,51 +140,10 @@ export default function VehicleCard() {
variant="outline" variant="outline"
onClick={() => handleStartClick("periodic")} onClick={() => handleStartClick("periodic")}
disabled={startInspection.isPending} disabled={startInspection.isPending}
className="col-span-2"
> >
Плановый Плановый
</Button> </Button>
<Button
variant="outline"
onClick={() => handleStartClick("ad-hoc")}
disabled={startInspection.isPending}
>
Свободный
</Button>
<Button
variant="outline"
onClick={() => handleStartClick("initial")}
disabled={startInspection.isPending}
>
Первичный
</Button>
<Button
variant="outline"
onClick={() => handleStartClick("seizure")}
disabled={startInspection.isPending}
>
Изъятие
</Button>
<Button
variant="outline"
onClick={() => handleStartClick("equipment-change")}
disabled={startInspection.isPending}
>
Комплектация
</Button>
<Button
variant="outline"
onClick={() => handleStartClick("pre-repair")}
disabled={startInspection.isPending}
>
В ремонт
</Button>
<Button
variant="outline"
onClick={() => handleStartClick("post-repair")}
disabled={startInspection.isPending}
>
Из ремонта
</Button>
</div> </div>
</div> </div>
@@ -202,6 +198,53 @@ export default function VehicleCard() {
)} )}
</div> </div>
{tt && tt.states.length > 0 && (
<div>
<h2 className="text-sm font-semibold text-muted-foreground mb-2">
История осмотров (Element Mechanic)
</h2>
<div className="space-y-2">
{tt.states.map((s) => {
const date = s.unix_time
? new Date(s.unix_time * 1000).toLocaleString("ru-RU")
: "—";
return (
<Card
key={s.id}
className="p-3 cursor-pointer hover:shadow-md transition-shadow"
onClick={() => navigate(`/tt-states/${s.id}`)}
>
<div className="flex items-start justify-between gap-3">
<div className="flex-1 min-w-0">
<div className="font-medium">
{s.mechanic_name || "Осмотр"}
</div>
<div className="text-xs text-muted-foreground mt-1 flex items-center gap-2 flex-wrap">
<span>{date}</span>
{s.mileage != null && (
<>
<span className="text-muted-foreground/50">·</span>
<span>{s.mileage.toLocaleString("ru-RU")} км</span>
</>
)}
</div>
</div>
<div className="text-xs text-muted-foreground shrink-0 text-right">
<div>📷 {s.photos_count}</div>
{s.damages_count > 0 && (
<div className="text-destructive mt-0.5">
{s.damages_count}
</div>
)}
</div>
</div>
</Card>
);
})}
</div>
</div>
)}
{pendingType && ( {pendingType && (
<div <div
className="fixed inset-0 z-50 bg-black/40 flex items-end sm:items-center justify-center p-0 sm:p-4" className="fixed inset-0 z-50 bg-black/40 flex items-end sm:items-center justify-center p-0 sm:p-4"
@@ -228,10 +271,32 @@ export default function VehicleCard() {
inputMode="numeric" inputMode="numeric"
pattern="[0-9]*" pattern="[0-9]*"
value={mileageInput} value={mileageInput}
onChange={(e) => setMileageInput(e.target.value.replace(/\D/g, ""))} onChange={(e) => {
setMileageInput(e.target.value.replace(/\D/g, ""));
setMileageSource(null);
}}
placeholder="123456" placeholder="123456"
autoFocus autoFocus
/> />
{mileageSource === "starline" && (
<div className="text-[11px] text-muted-foreground flex items-center gap-1.5">
<span className="inline-block w-1.5 h-1.5 rounded-full bg-emerald-500" />
<span>
Из StarLine
{v?.starline_mileage_at && (
<> · {timeAgo(v.starline_mileage_at)}</>
)}
</span>
<span className="text-muted-foreground/60">
· скорректируйте если надо
</span>
</div>
)}
{mileageSource === "last-inspection" && (
<div className="text-[11px] text-muted-foreground">
Из прошлого осмотра · скорректируйте если надо
</div>
)}
</div> </div>
<div className="flex gap-2"> <div className="flex gap-2">
+79
View File
@@ -0,0 +1,79 @@
# Vendor Damage Data Model — Extraction Notes
Source: `Ttc.dll` (Xamarin Android app, reverse-engineered from `assemblies.blob`)
Date: 2026-05-17
## Core Objects
### DetailDamageCoordinate
A single tap-point placed by the mechanic on the enlarged part SVG.
| Field | Type | Notes |
|-------|------|-------|
| `Id` | int/Guid | PK |
| `X` | float | Relative X on the part SVG canvas |
| `Y` | float | Relative Y on the part SVG canvas |
| `InspectionGuid` | Guid | Ties this point to an inspection session |
| `MetaId` | int | Zone ID (0..56) — which part this point belongs to |
| `GroupId` | int | Groups multiple points belonging to ONE damage annotation |
| `ImageWithLinesId` | int | FK → the photo with polyline annotation |
| `LinesId` | int | FK → the DrawingLines set |
Evidence: backing fields `<X>k__BackingField`, `<Y>k__BackingField`, `<Id>k__BackingField`, `<MetaId>k__BackingField`, `<GroupId>k__BackingField`, `<ImageWithLinesId>k__BackingField`, `<LinesId>k__BackingField` all found in contiguous block at 0x3baa00x3bd50 in Strings heap. `GetByGroupId` method confirms group-based querying.
### DetailDamageCoordinateContract (API wire format)
Same fields as above, serialized as JSON. The JSON property for severity is `"degree"` (lowercase, confirmed at 0x3d752 in Strings heap alongside `"damageDegree"` widget name).
### DetailDamageDrawPointContract
A single vertex in the finger-drawn polyline annotation on a photo.
| Field | Type | Notes |
|-------|------|-------|
| `X` | float | Point X on the photo canvas |
| `Y` | float | Point Y on the photo canvas |
The polyline is a **list** of `DetailDamageDrawPointContract` objects. The parent container is `DrawingLines` (backing field `<DrawingLines>k__BackingField` at 0x3cade). Method `DrawLine` (0x3e3c9) draws each segment. `StrokeWidth` (0x3f59a) controls line thickness.
The photo itself is stored as `Image64StringWithLines` (base64 JPEG) and `ImageBase64StringWithLines` (alternate field). The link between a damage group and its annotated photo is: `DetailDamageCoordinate.ImageWithLinesId → VehicleStatePhotoInspection.Id`.
## Multi-Point Damage Grouping
**Yes, multi-point damages are grouped via `GroupId`.** The mechanic taps N spots on the part SVG — each tap creates a `DetailDamageCoordinate` with the same `GroupId`. All points in a group share:
- One `damage_type` (the vertical list selection)
- One `degree` (severity: 0=Легкое, 1=Среднее, 2=Тяжелое)
- One `ImageWithLinesId` (one photo with optional polyline)
The `GetByGroupId` method (found in Strings heap at 0x394c0) fetches all coordinates for a group. `SaveByParts` (0x42f4f) persists the full group in one call.
## Photo + Polyline Link
```
Inspection
└─ DetailDamageCoordinate[] (grouped by GroupId)
├─ GroupId = 42 (e.g.)
├─ MetaId = 0 (front bumper)
├─ [X1,Y1], [X2,Y2], [X3,Y3] ← multiple tap points
├─ ImageWithLinesId = 7 ← FK → photo record
└─ degree = 1 (Среднее)
VehicleStatePhotoInspection (id=7)
├─ Image64StringWithLines ← base64 JPEG (the photo)
├─ DrawingLines[] ← list of DetailDamageDrawPointContract
│ └─ [{X:0.2, Y:0.4}, {X:0.5, Y:0.6}, ...] ← polyline vertices
└─ HistoryLines[] ← read-only history of old polylines
```
## Our Implementation Recommendation
1. **DamageGroup** table: `{ id, inspection_id, zone_id, damage_type, severity(0-2), photo_id, created_at }`
2. **DamagePoint** table: `{ id, group_id, x REAL, y REAL, seq_order INT }` — multiple rows per group
3. **DamagePhoto** table: `{ id, image_b64, polyline JSONB }` where `polyline` is `[[x,y], ...]`
4. Severity stored as integer 0/1/2, displayed as Легкое/Среднее/Тяжелое
This mirrors the vendor model exactly while using a standard relational schema.
## Known Unknowns
- The exact JSON shape returned by `damage/details` endpoint (API not captured live)
- Whether `GroupId` is a local UUID or server-assigned int
- Whether `DrawingLines` coordinates are normalized (0..1) or absolute pixels
+90
View File
@@ -0,0 +1,90 @@
{
"_meta": {
"source": "Ttc.dll #US heap, contiguous block at offsets 0xc2e240xc3084",
"confidence": "HIGH — full block scanned; order is the binary storage order which matches app display order (repository pattern typically loads in definition order)",
"notes": [
"Items 012 are general exterior damage types (user-selectable for any zone)",
"Items 1318 appear to be salon-specific (Грязный салон, Запах табака, etc.) — shown only for interior zones (4446 seats, salon)",
"Установлено/Снято (19–20) and Контроль (21) are semi-system states used for equipment completeness zones (3348 area)",
"Штат (25) appears to be a system/staff marker, not user-selectable",
"Порез, Прокол, Порвано are tire-specific damage types for zones 1720",
"Есть/Нет повреждений found in binary (0x4599a/0x4597a) — likely used for salon damage yes/no toggle, not in the standard list"
]
},
"damage_types_ordered": [
"Вмятина",
"Царапина",
"Трещина",
"Повреждено",
"Скол",
"Отсутствует",
"Прожжено",
"Погнуто",
"Требуется мойка",
"Не работает",
"Порез",
"Прокол",
"Порвано",
"Пятна",
"Грязный салон",
"Запах табака",
"Повреждение салонных ковриков",
"Повреждение обшивки дверей",
"Сломанные ручки",
"Установлено",
"Снято",
"Контроль",
"Требуется химчистка",
"Затертость",
"Грыжа",
"Штат"
],
"exterior_selectable": [
"Вмятина",
"Царапина",
"Трещина",
"Повреждено",
"Скол",
"Отсутствует",
"Прожжено",
"Погнуто",
"Требуется мойка",
"Не работает",
"Порез",
"Прокол",
"Порвано",
"Пятна",
"Затертость",
"Грыжа"
],
"salon_selectable": [
"Вмятина",
"Царапина",
"Трещина",
"Повреждено",
"Скол",
"Отсутствует",
"Прожжено",
"Погнуто",
"Требуется мойка",
"Не работает",
"Пятна",
"Грязный салон",
"Запах табака",
"Повреждение салонных ковриков",
"Повреждение обшивки дверей",
"Сломанные ручки",
"Требуется химчистка",
"Затертость",
"Грыжа"
],
"severity_scale": {
"positions": 3,
"labels": ["Легкое", "Среднее", "Тяжелое"],
"values": [0, 1, 2],
"widget": "SeekBar (vehicleInspectionDegreeSelect / newDamageSeekBarDamageDegree)",
"api_field": "degree (lowercase, in JSON contract)",
"default": "Легкое (index 0)",
"source_note": "Легкое found at 0x59d79 (adjacent to 'Добавить повреждение' button label = default/initial value); Среднее+Тяжелое found together at 0xc39e80xc39f8 (loading state transitions)"
}
}
+38
View File
@@ -0,0 +1,38 @@
US+1023: inspectionId
US+2393: )" id="car" xmlns = "http://www.w3.org/2000/svg" viewBox = "
US+81926: inspectionvideo/
US+83424: vehicle
US+83802: vehicle.json
US+83898: http://ttcontrol.naughtysoft.ru/api/
US+83972: vehicletechnicalcontrol
US+84020: techinspectionitem
US+84448: vehicle/vehiclelist
US+84488: vehicle/statuses
US+84522: vehiclerepair
US+84550: inspection.json
US+511737: vehiclestatephotoinspection
US+512035: vehicletechinspection
US+512311: inspection
US+512945: customersettings/salondamages
US+513773: damage/details
US+517799: vehicletechnicalcontrol/driver?search=
US+517877: vehicletechnicalcontrol/driverinspection?vehicleNumber=
US+517989: driver/state?vehicleNum={0}&reason={1}
US+518099: inspectionvideo?vehicleId=
US+518153: inspectionvideo
US+518323: vehicle?id=
US+518347: vehicle/vehiclemeta?id=
US+518395: damage/damagescard?id=
US+518441: vehicle/
US+518493: vehiclerepair/byvehicle?vehicleId=
US+518563: vehiclestate/history?id=
US+518613: vehiclestate/mileage
US+518655: vehiclestate/new
US+518689: vehiclestate/newpart
US+518731: vehiclestate/new?id=
US+518773: vehiclestatephotoinspection/photohistory?vehicleId={0}&type={1}
US+518901: vehiclestatephotoinspection/photoinspection?vehicleId=
US+519011: vehicletechinspection/byvehicle?vehicleId=
US+519097: inspection/byvehicle?id=
US+519147: inspection/photohistory?vehicleId={0}&type={1}
US+519253: damage
+6
View File
@@ -0,0 +1,6 @@
US+391601 (2929 chars): <line x1="540" y1="515" x2="610" y2="280" stroke="#000" stroke-width="2" /><circle class="38" ontouchstart="onstart(38)" ontouchend="onend(38)" cx = "610" cy = "280" r = "30" stroke = "black" stroke-width = "3" fill = "white" /><path fill="#C0C0C0" d="M640.7200000000004,512.7300000000006C638.7400000
US+397462 (2866 chars): <line x1="280" y1="515" x2="220" y2="280" stroke="#000" stroke-width="2" /><circle class="39" ontouchstart="onstart(39)" ontouchend="onend(39)" cx = "220" cy = "280" r = "30" stroke = "black" stroke-width = "3" fill = "white" /><path fill="#C0C0C0" d="M286.35,1012.9200000000002C286.43,1017.160000000
US+513813 (12 chars): <circle cx="
@@ -0,0 +1,30 @@
[529] US+513681: 'Контроль'
[530] US+513699: 'Требуется химчистка'
[531] US+513739: 'Затертость'
[532] US+513761: 'Грыжа'
[533] US+513773: 'damage/details'
[534] US+513803: 'Штат'
[535] US+513813: '<circle cx="'
[536] US+513839: '" cy="'
[537] US+513853: '" r="10" stroke-width="1" fill = "'
[538] US+513923: '" />'
[539] US+513933: '<text x="{0}" y = "{1}" stroke="#fff" class="small">{2}</text>'
[540] US+514059: '<rect x="'
[541] US+514079: '" y="'
[542] US+514091: '" width="20" height="20" fill = "'
[543] US+514159: '<polygon points="'
@@ -0,0 +1,76 @@
# Per-Part Detail SVG: API-Fetched, Not Embedded
## Verdict: API-FETCHED
No per-part SVG `<path d="...">` data is embedded in the DLL binaries. The vendor app fetches detail part SVGs from the server at runtime.
## How It Works
### 1. Vehicle Load: `vehicle/vehiclemeta?id=<vehicleId>`
When the mechanic selects a vehicle, the app calls:
```
GET {baseUrl}/vehicle/vehiclemeta?id={vehicleId}
Authorization: Bearer {token}
```
The response includes a list of `DetailScheme` objects — one per tappable zone. Each `DetailScheme` has at minimum:
- `Id` — database PK
- `MetaId` — maps to the SVG `class="N"` zone ID (0..56)
- `Scheme` — full SVG string for the enlarged part view
- `ViewBox` — the viewBox string for that part's SVG (e.g. `"0 0 400 300"`)
### 2. Zone Tap → Detail View
When user taps zone N on the composite SVG:
1. `Foo.TouchEnd(N)` fires (JavaScript in WebView)
2. App calls `GetDamagedDetailScheme(metaId: N)` (C# method in `Ttc.dll`)
3. The cached `DetailScheme` for that MetaId is retrieved
4. Its `Scheme` SVG is rendered in a new WebView/Activity (`DetailSchemeActivity`)
5. The scheme has the same `<script>` click handler so mechanic can tap damage spots
### 3. Damage Point Overlay: `damage/details` + `damage/damagescard?id=`
Existing damage points are overlaid on the detail scheme via:
```
GET {baseUrl}/damage/details # returns damage list for the part
GET {baseUrl}/damage/damagescard?id={damageId} # returns single damage card
```
## Key C# Symbols
```
DetailScheme — per-part SVG wrapper (field: Scheme, ViewBox, MetaId)
DetailSchemeWithStack — same with pre-rendered damage circle stack
DetailSchemeWithDamages — ViewModel binding damage points to scheme
GetDamagedDetailScheme(metaId) — retrieves scheme by zone ID
GetDamagedDetailSchemeWithStack(...) — retrieves scheme + overlaid damage marks
GenerateDamagesFromStack — draws circle markers from DamageCoordinates
DetailSchemeActivity — the Android Activity that hosts the per-part WebView
```
## Base URL
```
http://ttcontrol.naughtysoft.ru/api/
```
(Found at US heap 0x83898 in Ttc.dll — hard-coded base URL)
## Why No Embedded SVGs
The composite exterior and salon SVGs are embedded (they are static templates).
Per-part detail SVGs are vehicle-model-specific and change when the fleet changes
vehicle types, so they are served from the API to stay updatable without an app release.
## Our Implementation Options
1. **Mirror the API contract**: Implement our own `GET /vehicle/vehiclemeta?id=` that returns `DetailScheme[]` with our custom per-part SVGs.
2. **Embed static SVGs**: For each of the 57 zone IDs we use, design our own per-part SVG and bundle it in the frontend. Simpler but requires a frontend release for changes.
3. **Hybrid**: Embed SVGs for the top-N most common damage zones (bumpers, doors, hood, roof = zones 0,4,10,11,12,13,16,22) and fetch others from API.
Option 2 (embed static) is recommended for Phase 1 — we control all 57 shapes.
@@ -0,0 +1,15 @@
[63] US+1763: 'Комплектность'
[64] US+1791: '«Я, '
[65] US+1801: ', ознакомлен с результатами осмотра автомобиля.Выявленные повреждения автомобиля подтверждаю»'
[66] US+1990: '«Я, ознакомлен с результатами осмотра автомобиля.Выявленные повреждения автомобиля подтверждаю»'
[67] US+2183: 'gasAvailable'
[68] US+2209: 'Detail not found'
[69] US+2243: 'utf-8'
[70] US+2255: 'webInterface'
[71] US+2281: 'text/html; charset=UTF-8'
[72] US+2331: 'base64'
[73] US+2345: '<svg transform="rotate('
[74] US+2393: ')" id="car" xmlns = "http://www.w3.org/2000/svg" viewBox = "'
[75] US+2515: '" stroke = "black"><script>var pt = document.getElementById("car").createSVGPoint();function clicked(evt){var e = evt.target;var dim = e.getBoundingClientRect();pt.x = evt.clientX;pt.y = evt.clientY;v'
[76] US+81152: ' </svg>'
[77] US+81168: ' '
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 129 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 52 KiB

@@ -0,0 +1,795 @@
+ 88: __StaticArrayInitTypeSize=40
+ 158: <>c__DisplayClass10_0
+ 233: <_vehicleStatusHistoryRepository_CarChanged>b__11_0
+ 326: <TrySave>b__11_0
+ 343: <>c__DisplayClass11_0
+ 395: <GetSalonDamages>b__1_0
+ 419: <>c__DisplayClass1_0
+ 481: <>c__DisplayClass12_0
+ 503: <>c__DisplayClass72_0
+ 606: <>c__DisplayClass2_0
+ 650: <>c__DisplayClass13_0
+ 789: <GetHistoryPhotos>b__3_0
+ 814: <>c__DisplayClass3_0
+ 887: <>c__DisplayClass14_0
+ 1114: <>c__DisplayClass4_0
+ 1168: <GetHistory>b__65_0
+ 1188: <>c__DisplayClass65_0
+ 1271: <GoNextButton_Click>b__5_0
+ 1312: <GetHistoryPhotos>b__5_0
+ 1337: <>c__DisplayClass5_0
+ 1452: <>c__DisplayClass66_0
+ 1483: <GetByVehicle>b__6_0
+ 1521: <GetForSalon>b__6_0
+ 1541: <>c__DisplayClass6_0
+ 1605: <>c__DisplayClass17_0
+ 1656: <>c__DisplayClass67_0
+ 1678: <>c__DisplayClass77_0
+ 1739: <>c__DisplayClass7_0
+ 1760: <>c__DisplayClass68_0
+ 1782: <>c__DisplayClass78_0
+ 1826: <>c__DisplayClass8_0
+ 1945: <>c__DisplayClass9_0
+ 1966: <GetByGroupId>b__0
+ 1985: <GetMetaById>b__0
+ 2003: <GetImageById>b__0
+ 2022: <GetImagePathById>b__0
+ 2045: <GetById>b__0
+ 2059: <SearchText_TextChanged>b__0
+ 2103: <GetByVehicle>b__0
+ 2357: <GetDamages>b__0
+ 2391: <SaveByParts>b__0
+ 2464: <GetItemBy>b__0
+ 2480: <GetStateFromHistory>b__0
+ 2653: <TrySave>d__11
+ 2835: <TrySave>b__11_1
+ 2852: <>c__DisplayClass11_1
+ 2955: <>c__DisplayClass72_1
+ 3003: <>c__DisplayClass2_1
+ 3226: <>c__DisplayClass14_1
+ 3430: <GoNextButton_Click>b__5_1
+ 3807: <GetByVehicle>b__1
+ 3940: <GetHistoryPhotos>b__1
+ 3963: <SaveByParts>b__1
+ 4014: <GetHistory>b__1
+ 4031: <GetById>d__1
+ 4063: <GetSalonDamages>d__1
+ 4132: <Retry>d__11`1
+ 4251: AsyncTaskMethodBuilder`1
+ 4319: ArrayAdapter`1
+ 4425: __StaticArrayInitTypeSize=12
+ 4524: <SaveByParts>d__72
+ 4689: <>c__DisplayClass14_2
+ 4763: <GoNextButton_Click>b__5_2
+ 4987: <exceptions>5__2
+ 5071: <isReadOnly>5__2
+ 5188: <GetMetaById>d__2
+ 5378: KeyValuePair`2
+ 5393: Dictionary`2
+ 5406: TextAppearance_Compat_Notification_Line2
+ 5479: text2
+ 5594: <>c__DisplayClass14_3
+ 5642: <GoNextButton_Click>b__5_3
+ 5908: <GetImageById>d__3
+ 5927: <GetByVehicle>d__3
+ 5995: <GetDamages>d__3
+ 6034: <GetHistoryPhotos>d__3
+ 6153: __StaticArrayInitTypeSize=24
+ 6381: <GetImagePathById>d__4
+ 6512: <GetHistory>d__65
+ 6777: <GetByVehicle>d__5
+ 6822: <GoNextButton_Click>d__5
+ 6847: <GetHistoryPhotos>d__5
+ 7066: <GetByVehicle>d__6
+ 7366: <OnActivityResult>d__7
+ 7392: __StaticArrayInitTypeSize=28
+ 7421: __StaticArrayInitTypeSize=48
+ 7747: <GoToNextButton_Click>d__9
+ 7992: PointF
+ 8071: System.IO
+ 8104: get_X
+ 8110: set_X
+ 8116: GradientColor_android_endX
+ 8143: GradientColor_android_centerX
+ 8173: GetX
+ 8178: GradientColor_android_startX
+ 8207: _viewX
+ 8214: get_Y
+ 8220: set_Y
+ 8226: GradientColor_android_endY
+ 8253: GradientColor_android_centerY
+ 8283: GetY
+ 8288: GradientColor_android_startY
+ 8423: TextAppearance_Compat_Notification_Line2_Media
+ 8470: TextAppearance_Compat_Notification_Title_Media
+ 8517: TextAppearance_Compat_Notification_Time_Media
+ 8563: TextAppearance_Compat_Notification_Media
+ 8604: TextAppearance_Compat_Notification_Info_Media
+ 8792: newDamageTextureCamera
+ 8815: inspectionTextureCamera
+ 8847: GetStringExtra
+ 8862: GetBooleanExtra
+ 8878: GetIntExtra
+ 8890: PutExtra
+ 9059: System.Collections.Generic
+ 9086: GetResponseAsync
+ 9103: DownloadDataTaskAsync
+ 9125: GetRequestStreamAsync
+ 9147: async
+ 9157: <<TrySave>b__11_0>d
+ 9448: textViewResourceId
+ 9613: get_PhotoTypeId
+ 9629: set_PhotoTypeId
+ 10003: GetByGroupId
+ 10221: GetMetaById
+ 10233: GetImageById
+ 10246: GetImagePathById
+ 10263: GetById
+ 10271: FindViewById
+ 10347: detailhistoryadd
+ 10427: _damageAdded
+ 10614: _vehicleStatusHistoryRepository_CarChanged
+ 10694: DamageDegreeOnProgressChanged
+ 10791: _vehicleStatusHistoryRepository_ApprovedListChanged
+ 10872: add_TextChanged
+ 10888: SearchText_TextChanged
+ 10950: get_SalonChecked
+ 10967: set_SalonChecked
+ 11026: get_ComplecityChecked
+ 11048: set_ComplecityChecked
+ 11601: System.Collections.Specialized
+ 11770: <X>k__BackingField
+ 11789: <Y>k__BackingField
+ 12000: <PhotoTypeId>k__BackingField
+ 12516: <SalonChecked>k__BackingField
+ 12580: <ComplecityChecked>k__BackingField
+ 13005: <DamageDegree>k__BackingField
+ 13282: <Damage>k__BackingField
+ 13306: <ImageDamage>k__BackingField
+ 13335: <SalonGotDamage>k__BackingField
+ 13367: <GotNewDamage>k__BackingField
+ 13397: <ReadyForStatusChange>k__BackingField
+ 13435: <ReadyForDischarge>k__BackingField
+ 13631: <TypeName>k__BackingField
+ 13657: <TiTypeName>k__BackingField
+ 13829: <Scheme>k__BackingField
+ 13853: <DetailScheme>k__BackingField
+ 13883: <UnixTime>k__BackingField
+ 13909: <LastServiceUnixTime>k__BackingField
+ 13946: <LastServiceGasUnixTime>k__BackingField
+ 14009: <Type>k__BackingField
+ 14031: <SubType>k__BackingField
+ 14056: <VehicleRepairMetalWorkType>k__BackingField
+ 14100: <DetailType>k__BackingField
+ 14128: <PhotoType>k__BackingField
+ 14155: <VehicleRepairType>k__BackingField
+ 14190: <AccountType>k__BackingField
+ 14241: <ExpectedDate>k__BackingField
+ 15546: <ApprovedBySecondDriver>k__BackingField
+ 15586: <ApprovedByDriver>k__BackingField
+ 15770: <Damages>k__BackingField
+ 15795: <SalonDamages>k__BackingField
+ 15939: <HistoryLines>k__BackingField
+ 15969: <DamageTypes>k__BackingField
+ 15998: <TireTypes>k__BackingField
+ 16025: <DiskTypes>k__BackingField
+ 16143: <DamageCoordinates>k__BackingField
+ 16779: <ViewBox>k__BackingField
+ 16804: <ImageRepository>k__BackingField
+ 16837: <NewDamageRepository>k__BackingField
+ 16874: <VehicleRepository>k__BackingField
+ 16909: <VehicleRepairReferenceTypeRepository>k__BackingField
+ 16963: <DamageTypeRepository>k__BackingField
+ 17001: <InspectionRepairMetalWorkTypeRepository>k__BackingField
+ 17058: <DetailTypeRepository>k__BackingField
+ 17096: <SetItemTypeRepository>k__BackingField
+ 17135: <VehicleTechInspectionTypeRepository>k__BackingField
+ 17188: <InspectionReasonTypeRepository>k__BackingField
+ 17236: <PhotoTypeRepository>k__BackingField
+ 17273: <RepairTypeRepository>k__BackingField
+ 17311: <VehicleTechControlRepository>k__BackingField
+ 17357: <TechInspectionItemRepository>k__BackingField
+ 17403: <InspectionRepository>k__BackingField
+ 17441: <TechInspectionRepository>k__BackingField
+ 17483: <VehicleStatePhotoInspectionRepository>k__BackingField
+ 17538: <InspectionReasonRepository>k__BackingField
+ 17582: <InspectionVideoRepository>k__BackingField
+ 17625: <DriverRepository>k__BackingField
+ 17659: <VehicleRepairRepository>k__BackingField
+ 17700: <CustomerSettingsRepository>k__BackingField
+ 17744: <VehicleStateDraftRepository>k__BackingField
+ 17789: <AccountRepository>k__BackingField
+ 17824: <SparePartRepository>k__BackingField
+ 17861: <VehicleStatusHistoryRepository>k__BackingField
+ 17909: <AccidentGuilty>k__BackingField
+ 17941: textField
+ 18071: CoordinatorLayout_statusBarBackground
+ 18392: GetSystemService
+ 18875: get_DamageDegree
+ 18892: set_DamageDegree
+ 18909: newDamageSeekBarDamageDegree
+ 18938: _newDamageTextViewDamageDegree
+ 18969: _damageDegree
+ 18983: vehicleInspectionDamagesDegree
+ 19235: techinspectionHistoryTiMileage
+ 19266: CustomHistoryInspectionItemMileage
+ 19587: FontFamily_fontProviderPackage
+ 19862: get_Damage
+ 19873: set_Damage
+ 19884: detailPreviewAddDamage
+ 19907: SelectedDamage
+ 19922: get_ImageDamage
+ 19938: set_ImageDamage
+ 19954: DrawingImageDamage
+ 19973: DetailDamage
+ 19986: currentDamage
+ 20000: get_SalonGotDamage
+ 20019: set_SalonGotDamage
+ 20038: get_GotNewDamage
+ 20055: set_GotNewDamage
+ 20072: damage
+ 20144: CoordinatorLayout_Layout_layout_insetEdge
+ 20206: get_ReadyForStatusChange
+ 20231: set_ReadyForStatusChange
+ 20256: CompareExchange
+ 20272: get_ReadyForDischarge
+ 20294: set_ReadyForDischarge
+ 20454: Styleable
+ 20507: add_SurfaceTextureAvailable
+ 20535: TextureViewOnSurfaceTextureAvailable
+ 20807: GetByVehicle
+ 20847: RuntimeTypeHandle
+ 20865: GetTypeFromHandle
+ 21038: TextAppearance_Compat_Notification_Title
+ 21295: ProgressDialogStyle
+ 21315: SetProgressStyle
+ 21332: FontFamilyFont_android_fontStyle
+ 21365: FontFamilyFont_fontStyle
+ 21390: coordinatorLayoutStyle
+ 21507: _contextFileName
+ 21534: get_TypeName
+ 21547: set_TypeName
+ 21560: get_TiTypeName
+ 21575: set_TiTypeName
+ 21590: set_DefaultTextEncodingName
+ 21845: library_name
+ 21882: get_Scheme
+ 21893: set_Scheme
+ 21904: get_DetailScheme
+ 21921: set_DetailScheme
+ 21938: GetDamagedDetailScheme
+ 21961: TextAppearance_Compat_Notification_Time
+ 22010: get_UnixTime
+ 22023: set_UnixTime
+ 22036: get_LastServiceUnixTime
+ 22060: set_LastServiceUnixTime
+ 22084: get_LastServiceGasUnixTime
+ 22111: set_LastServiceGasUnixTime
+ 22222: IAsyncStateMachine
+ 22304: CoordinatorLayout_Layout_layout_keyline
+ 22410: get_Type
+ 22419: set_Type
+ 22428: get_SubType
+ 22440: set_SubType
+ 22452: methodType
+ 22463: VehicleType
+ 22475: _vehicleType
+ 22488: ValueType
+ 22498: get_VehicleRepairMetalWorkType
+ 22529: set_VehicleRepairMetalWorkType
+ 22560: ChangeDiskType
+ 22575: get_DetailType
+ 22590: set_DetailType
+ 22605: ApprovedCustomItemType
+ 22628: get_PhotoType
+ 22642: set_PhotoType
+ 22656: get_VehicleRepairType
+ 22678: set_VehicleRepairType
+ 22700: set_ContentType
+ 22716: get_AccountType
+ 22732: set_AccountType
+ 22748: InspectionPartType
+ 22767: GenerateDiskByType
+ 22786: GradientColor_android_type
+ 22854: System.Core
+ 22969: get_SurfaceTexture
+ 22988: completenessPhotoTexture
+ 23013: SetPreviewTexture
+ 23381: InspectionVideoHistoryResponse
+ 23420: TryParse
+ 23455: get_ExpectedDate
+ 23472: set_ExpectedDate
+ 23623: techinspectionHistoryTiDate
+ 23691: CustomHistoryInspectionItemDate
+ 23976: DetailDamageCoordinate
+ 24064: GetCurrentSalonDamageState
+ 24579: AssemblyTitleAttribute
+ 24602: AsyncStateMachineAttribute
+ 24629: AssemblyTrademarkAttribute
+ 24728: AssemblyFileVersionAttribute
+ 24757: AssemblyConfigurationAttribute
+ 24788: AssemblyDescriptionAttribute
+ 24866: CompilationRelaxationsAttribute
+ 24898: AssemblyProductAttribute
+ 24923: AssemblyCopyrightAttribute
+ 24950: ExportAttribute
+ 24966: AssemblyCompanyAttribute
+ 24991: RuntimeCompatibilityAttribute
+ 25021: ActivityAttribute
+ 25039: Byte
+ 25123: TrySave
+ 25173: newDamageRemove
+ 25189: vehicleInspectionDamageAprove
+ 25369: notification_action_text_size
+ 25399: notification_subtext_size
+ 25425: IndexOf
+ 25433: Exif
+ 25505: notify_panel_notification_icon_bg
+ 25737: System.Threading
+ 25844: ThenByDescending
+ 25861: OrderByDescending
+ 25946: System.Runtime.Versioning
+ 26831: compat_notification_large_icon_max_width
+ 26901: dayOfMonth
+ 26939: taxi
+ 26993: damageTypeGoBack
+ 27010: metalWorkTypeGoBack
+ 27030: detailTypeGoBack
+ 27047: repairTypeGoBack
+ 27141: vehicleRepairTypeSelectGoBack
+ 27229: damageViewGoBack
+ 27320: AsyncCallback
+ 27444: inspectionSalonGoback
+ 27604: videoplaybackgoback
+ 27784: techinspectiontypesgoback
+ 28100: inspectionHistorygoback
+ 28124: inspectionTakePhotoHistorygoback
+ 28157: detailhistorygoback
+ 28177: detailhistoryhistorygoback
+ 28245: GetDamagedDetailSchemeWithStack
+ 28277: GenerateDamagesFromStack
+ 28433: GoNextButton_Click
+ 28452: GoToNextButton_Click
+ 28650: customDamageItemCheckMark
+ 28676: customSalonItemCheckMark
+ 28701: secondary_text_default_material_dark
+ 28738: primary_text_default_material_dark
+ 29728: MemoryStream
+ 29947: InspectionVideoHistoryResponseItem
+ 30246: CustomDamageListViewItem
+ 30271: CustomSalonDamageListViewItem
+ 30569: CustomInspectionHistoryListViewItem
+ 30667: System
+ 30980: status_bar_notification_info_maxnum
+ 31258: notification_big_circle_margin
+ 31466: TextAppearance_Compat_Notification
+ 31608: SetCameraDisplayOrientation
+ 31636: SetDisplayOrientation
+ 31693: System.Globalization
+ 31861: System.Reflection
+ 32120: WebException
+ 32133: AggregateException
+ 32152: CustomApiException
+ 32171: InvalidOperationException
+ 32197: SetException
+ 32210: ContextException
+ 32227: IdsForSalon
+ 32239: GetForSalon
+ 32478: newDamageButton
+ 32546: damageTypeButton
+ 32925: salonApproveButton
+ 33279: newDamagePhotoButton
+ 33356: inspectionNextPhotoButton
+ 33607: tiGoNextButton
+ 33622: repairGoNextButton
+ 33641: sparePartGoNextButton
+ 33663: inspectionHistoryGoNextButton
+ 33693: _goToNextButton
+ 33709: inspectionPhotoHistoryButton
+ 33742: CopyTo
+ 33787: TextAppearance_Compat_Notification_Info
+ 33943: detailHistoryMakePhoto
+ 33966: newDamageTakePhoto
+ 34032: newDamageRetakePhoto
+ 34128: newDamageApprovePhoto
+ 34314: HistoryPhoto
+ 34327: detailhistoryPhoto
+ 34765: System.Linq
+ 34889: get_Year
+ 34898: monthOfYear
+ 34916: year
+ 35188: CustomDamageItemHeader
+ 35367: CustomSalonItemHeader
+ 35479: TextReader
+ 35617: inspectionHistoryheader
+ 35641: detailhistoryheader
+ 35733: ContextProvider
+ 35749: _contextProvider
+ 35775: AsyncVoidMethodBuilder
+ 36058: tag_unhandled_key_event_manager
+ 36234: System.CodeDom.Compiler
+ 36510: videoplaybackOpenInBrowser
+ 36558: get_LayoutInflater
+ 36666: TextWriter
+ 36886: CustomSalonDamageListViewAdapter
+ 37174: CustomTechInspectionHistoryListViewAdapter
+ 37217: CustomInspectionHistoryListViewAdapter
+ 37256: CustomArrayAdapter
+ 37401: get_ApprovedBySecondDriver
+ 37428: set_ApprovedBySecondDriver
+ 37527: get_ApprovedByDriver
+ 37548: set_ApprovedByDriver
+ 37621: CamelCasePropertyNamesContractResolver
+ 37688: get_MediaPlayer
+ 37704: set_MediaPlayer
+ 37720: _mediaPlayer
+ 37890: CoordinatorLayout_Layout_layout_anchor
+ 37929: CoordinatorLayout_Layout_layout_behavior
+ 38128: SetTextColor
+ 38506: get_Extras
+ 38517: extras
+ 38574: System.Diagnostics
+ 38604: FromUnixTimeSeconds
+ 38744: System.Runtime.InteropServices
+ 38775: System.Runtime.CompilerServices
+ 38914: get_Damages
+ 38926: set_Damages
+ 38938: GenerateDamages
+ 38954: DetailSchemeWithDamages
+ 38978: vehicleInspectionDamages
+ 39003: get_SalonDamages
+ 39020: set_SalonDamages
+ 39037: GetSalonDamages
+ 39053: GetDamages
+ 39064: _damages
+ 39073: CoordinatorLayout_Layout_layout_dodgeInsetEdges
+ 39147: QueryIntentActivities
+ 39221: damageNames
+ 39233: DetailSchemes
+ 39397: get_HistoryLines
+ 39414: set_HistoryLines
+ 39431: CoordinatorLayout_keylines
+ 39458: get_DamageTypes
+ 39474: set_DamageTypes
+ 39490: get_TireTypes
+ 39504: set_TireTypes
+ 39518: GetTiTypes
+ 39529: get_DiskTypes
+ 39543: set_DiskTypes
+ 39557: GetPhotoControlTypes
+ 39578: GetInspectionTypes
+ 39777: get_DamageCoordinates
+ 39799: set_DamageCoordinates
+ 39832: GetBytes
+ 39841: bytes
+ 39979: FontFamilyFont_android_fontVariationSettings
+ 40024: FontFamilyFont_fontVariationSettings
+ 40134: TextChangedEventArgs
+ 40180: SurfaceTextureAvailableEventArgs
+ 40213: surfaceTextureAvailableEventArgs
+ 40367: Microsoft.CodeAnalysis
+ 40390: System.Threading.Tasks
+ 40519: LayoutParams
+ 40865: System.Collections
+ 41022: GetHistoryPhotos
+ 41092: tag_unhandled_key_listeners
+ 41276: _damageColors
+ 41539: SaveByParts
+ 41572: FontFamily_fontProviderCerts
+ 41601: CheckDetailExists
+ 41755: ChangeSalonDamageStatus
+ 41950: AddDays
+ 42021: Xamarin.Android.Support.Compat
+ 42052: ContextCompat
+ 42066: ActivityCompat
+ 42146: DamageContract
+ 42219: DetailDamageCoordinateContract
+ 42426: DetailDamageDrawPointContract
+ 42632: System.Net
+ 42753: KeySet
+ 42904: FontFamilyFont_android_fontWeight
+ 42938: FontFamilyFont_fontWeight
+ 42995: compat_notification_large_icon_max_height
+ 43059: secondary_text_default_material_light
+ 43144: _commentTextEdit
+ 43161: textEdit
+ 43196: Exit
+ 43201: exit
+ 43261: IAsyncResult
+ 43274: StartActivityForResult
+ 43317: OnActivityResult
+ 43468: newDamageComment
+ 43485: _damageComment
+ 43795: DrawingPoint
+ 43808: FontFamilyFont
+ 43823: FontFamilyFont_android_font
+ 43851: FontFamilyFont_font
+ 43896: maxAttemptCount
+ 43937: SyncRoot
+ 44176: newDamageCoast
+ 44191: _damageCoast
+ 44236: salonDamageList
+ 44252: damageTypeList
+ 44452: detailhistoryDamagesList
+ 44477: techinspectiontypesList
+ 44581: inspectionHistoryList
+ 44603: videoHistoryList
+ 44620: inspectionTakePhotoHistoryList
+ 44651: detailhistoryhistorylist
+ 44730: FontFamily_fontProviderFetchTimeout
+ 44766: CoordinatorLayout_Layout
+ 44791: SignatureSecondLayout
+ 44813: VehicleInspectionDetailDamageLayout
+ 44849: InspectionRepairMetalWorkTypeLayout
+ 44885: InspectionRepairTypeLayout
+ 44912: InspectionReasonsMoreLayout
+ 44940: SignatureLayout
+ 44956: VehicleTechControlApproveLayout
+ 44988: VehicleInspectionDetailDrawingLayout
+ 45025: LoadingDialogLayout
+ 45045: VehicleInspectionVideoPlaybackLayout
+ 45082: InspectionRepairAdditionalLayout
+ 45115: VehicleInspectionCustomFuelLayout
+ 45149: VehicleInspectionFuelLayout
+ 45177: VehicleInspectionTierLevelLayout
+ 45210: VehicleTechControlLayout
+ 45235: vehicleTechControlLayout
+ 45260: VehicleInspectionLayout
+ 45284: VehicleInspectionSalonLayout
+ 45313: VehicleInspectionVideoLayout
+ 45342: VehicleInspectionCompletenessTakePhotoLayout
+ 45387: LinearLayout
+ 45400: Widget_Support_CoordinatorLayout
+ 45433: VehicleTechControlVehiclesLayout
+ 45466: VehicleStatusesLayout
+ 45488: DriverDischargeReasonsLayout
+ 45517: InspectionReasonsLayout
+ 45541: SpareGroupsLayout
+ 45559: VehicleTechControlDriversLayout
+ 45591: VehicleInspectionCompletenessLayout
+ 45627: VehicleInspectionDraftsLayout
+ 45657: VehicleInspectionDocumentsLayout
+ 45690: VehicleForRejectLayout
+ 45713: InspectionReasonsAfterAccidentLayout
+ 45750: VehicleInspectionCommentLayout
+ 45781: VehicleRepairCommentLayout
+ 45808: SparePartLayout
+ 45824: VehicleTechInspectionTypeListLayout
+ 45860: VehicleTechInspectionWorkListLayout
+ 45896: ImageViewLayout
+ 45912: imageViewLayout
+ 45928: ParkViewLayout
+ 45943: SignaturePreviewLayout
+ 45966: VehicleInspectionDetailPreviewLayout
+ 46003: VehicleInspectionDetailPhotoPreviewLayout
+ 46045: VehicleInspectionChangeHistoryLayout
+ 46082: VehicleInspectionDetailHistoryLayout
+ 46119: VehicleInspectionHistoryLayout
+ 46150: VehicleTechInspectionHistoryLayout
+ 46185: InspectionTakePhotoHistoryLayout
+ 46218: VehicleInspectionDetailHistoryHistoryLayout
+ 46262: videolayout
+ 46284: MoveNext
+ 46293: repairAditionaGoNext
+ 46314: inspectionDetailGoNext
+ 46337: detailPreviewGoNext
+ 46357: newDamageGoToNext
+ 46375: isNext
+ 46382: Android.Text
+ 46395: System.Text
+ 46407: get_Text
+ 46416: set_Text
+ 46425: vehicleTechControlMileageText
+ 46455: inspectionChangeNewMileageText
+ 46486: inspectionHistoryMileageText
+ 46515: _mileageText
+ 46528: MakeText
+ 46537: _titleText
+ 46548: vehicleRepairTypeText
+ 46570: _searchText
+ 46582: vehicleInspectionCustomFuelText
+ 46614: tierLevelText
+ 46628: Widget_Compat_NotificationActionText
+ 46665: customApprovedHeaderText
+ 46690: _headerText
+ 46702: _passwordEditText
+ 46720: _mileagEditText
+ 46736: driverSecondSearchEditText
+ 46763: vehicleSearchEditText
+ 46785: techcotroldriverSearchEditText
+ 46816: sparePartSearchEditText
+ 46840: _loginEditText
+ 46855: _stoEditText
+ 46868: vehicleInspectionCommentText
+ 46897: vehicleRepairCommentText
+ 46922: vehicleRejectCommentText
+ 46947: detailHistoryCommentText
+ 46972: progressViewText
+ 46989: next
+ 46994: notification_top_pad_large_text
+ 47026: action_text
+ 47038: inspectionsecondsignaturetext
+ 47068: inspectionsignaturetext
+ 47092: get_Context
+ 47104: SaveVehicleContext
+ 47123: GetVehicleContext
+ 47141: SaveAccountContext
+ 47160: GetAccountContext
+ 47178: context
+ 47186: txt
+ 47196: NewDamageMenu
+ 47210: NewDamagePhotoMenu
+ 47364: inspectionHistoryImageView
+ 47391: NewDamageView
+ 47416: DamageTypeView
+ 47431: DetailTypeView
+ 47446: TextureView
+ 47458: _textureView
+ 47602: VehicleRepairTypeSelectView
+ 47775: metalWorkTypeListView
+ 47797: detailTypeListView
+ 47816: vehicleRepairTypeListView
+ 47842: repairTypeListView
+ 48005: _headerTextView
+ 48021: textView
+ 48158: newDamagePhotoPreview
+ 48481: Max
+ 48485: FontFamilyFont_android_ttcIndex
+ 48517: FontFamilyFont_ttcIndex
+ 48541: Matrix
+ 48548: CheckBox
+ 48557: get_ViewBox
+ 48569: set_ViewBox
+ 48581: viewBox
+ 48589: GetItemBy
+ 48599: get_Day
+ 48607: get_Today
+ 48617: Play
+ 48622: get_DefaultDisplay
+ 48641: cm_gray
+ 48649: DecodeByteArray
+ 48665: InitializeArray
+ 48681: ToArray
+ 48689: set_Accuracy
+ 48702: _changeStatusReady
+ 48721: body
+ 48726: get_Key
+ 48734: ContainsKey
+ 48746: FontFamily_fontProviderFetchStrategy
+ 48783: FontFamily
+ 48794: IsReadOnly
+ 48805: _isReadOnly
+ 48817: Any
+ 48821: OnDestroy
+ 48831: Copy
+ 48836: _buttonInfoDictionary
+ 48858: detailPreviewGallery
+ 48879: gallery
+ 48887: FontFamily_fontProviderQuery
+ 48916: BitmapFactory
+ 48930: get_ExternalStorageDirectory
+ 48959: Ttc.Data.Repository
+ 48979: get_ImageRepository
+ 48999: get_NewDamageRepository
+ 49023: _newDamageRepository
+ 49044: _imageRepository
+ 49061: get_VehicleRepository
+ 49083: _vehicleRepository
+ 49102: get_VehicleRepairReferenceTypeRepository
+ 49143: get_DamageTypeRepository
+ 49168: _vehicleDamageTypeRepository
+ 49197: _damageTypeRepository
+ 49219: get_InspectionRepairMetalWorkTypeRepository
+ 49263: get_DetailTypeRepository
+ 49288: get_SetItemTypeRepository
+ 49314: get_VehicleTechInspectionTypeRepository
+ 49354: set_VehicleTechInspectionTypeRepository
+ 49394: _vehicleTechInspectionTypeRepository
+ 49431: get_InspectionReasonTypeRepository
+ 49466: get_PhotoTypeRepository
+ 49490: _photoTypeRepository
+ 49511: get_RepairTypeRepository
+ 49536: _repairTypeRepository
+ 49558: _vehicleDetailStateRepository
+ 49588: get_VehicleTechControlRepository
+ 49621: _vehicleTechControlRepository
+ 49651: get_TechInspectionItemRepository
+ 49684: _techInspectionItemRepository
+ 49714: get_InspectionRepository
+ 49739: get_TechInspectionRepository
+ 49768: _techInspectionRepository
+ 49794: get_VehicleStatePhotoInspectionRepository
+ 49836: _vehicleStatePhotoInspectionRepository
+ 49875: _inspectionRepository
+ 49897: get_InspectionReasonRepository
+ 49928: _inspectionReasonRepository
+ 49956: get_InspectionVideoRepository
+ 49986: _inspectionVideoRepository
+ 50013: get_DriverRepository
+ 50034: get_VehicleRepairRepository
+ 50062: _vehicleRepairRepository
+ 50087: get_CustomerSettingsRepository
+ 50118: _customerSettingsRepository
+ 50146: get_VehicleStateDraftRepository
+ 50178: _vehicleStateDraftRepository
+ 50207: get_AccountRepository
+ 50229: _accountRepository
+ 50248: get_SparePartRepository
+ 50272: RestRepository
+ 50287: get_VehicleStatusHistoryRepository
+ 50322: _vehicleStatusHistoryRepository
+ 50354: GetStateFromHistory
+ 50374: CachedCarHistory
+ 50391: IsHistory
+ 50401: GetHistory
+ 50412: photocarhistory
+ 50428: detailhistoryhistory
+ 50449: Retry
+ 50455: Entry
+ 50461: set_JpegQuality
+ 50477: op_Equality
+ 50489: Availability
+ 50502: get_Visibility
+ 50517: set_Visibility
+ 50532: _extraVisibility
+ 50549: FontFamily_fontProviderAuthority
+ 50582: CoordinatorLayout_Layout_layout_anchorGravity
+ 50628: CoordinatorLayout_Layout_android_layout_gravity
+ 50676: get_Activity
+ 50689: SignatureSecondActivity
+ 50713: VehicleInspectionDetailDamageActivity
+ 50751: VehicleInspectionDetailSchemeActivity
+ 50789: InspectionReasonsMoreActivity
+ 50819: SignatureActivity
+ 50837: BaseActivity
+ 50850: VehicleInspectionVideoPlaybackActivity
+ 50889: InspectionRepairAdditionalActivity
+ 50924: VehicleInspectionCustomFuelActivity
+ 50960: VehicleInspectionFuelActivity
+ 50990: VehicleInspectionCustomGasFuelActivity
+ 51029: VehicleInspectionGasFuelActivity
+ 51062: VehicleInspectionTierLevelActivity
+ 51097: VehicleTechControlActivity
+ 51124: VehicleDriverTechControlActivity
+ 51157: SplashScreenActivity
+ 51178: ManagerMainActivity
+ 51198: VehicleInspectionActivity
+ 51224: VehicleInspectionSalonActivity
+ 51255: VehicleInspectionVideoActivity
+ 51286: NewDamagePhotoActivity
+ 51309: VehicleInspectionDetailTakePhotoActivity
+ 51350: InspectionTakePhotoActivity
+ 51378: VehicleInspectionCompletenessTakePhotoActivity
+ 51425: VehicleRepairActivity
+ 51447: VehicleTechControlVehiclesActivity
+ 51482: VehicleStatusesActivity
+ 51506: DriverDischargeReasonsActivity
+ 51537: InspectionReasonsActivity
+ 51563: VehicleTechControlDriversActivity
+ 51597: VehicleRepairsActivity
+ 51620: VehicleInspectionCompletenessActivity
+ 51658: VehicleInspectionDraftsActivity
+ 51690: VehicleInspectionDocumentsActivity
+ 51725: VehicleForRejectActivity
+ 51750: VehiclesForRejectActivity
+ 51776: VehicleRepairTypeSelectActivity
+ 51808: InspectionReasonsAfterAccidentActivity
+ 51847: VehicleInspectionCommentActivity
+ 51880: VehicleRepairCommentActivity
+ 51909: StartActivity
+ 51923: VehicleTechInspectionTypeListActivity
+ 51961: VehicleTechInspectionWorkListActivity
+ 51999: ImageViewActivity
+ 52017: ParkViewActivity
+ 52034: SignaturePreviewActivity
+ 52059: VehicleInspectionDetailPhotoPreviewActivity
+ 52103: VehicleInspectionChangeHistoryActivity
+ 52142: VehicleTechInspectionHistoryActivity
+ 52179: InspectionTakePhotoHistoryActivity
+ 52214: InspectionPhotoHistoryActivity
+ 52245: activity
+ 52254: get_AccidentGuilty
+ 52273: set_AccidentGuilty
+ 52292: GetAccidentGuilty
+ 52310: IsNullOrEmpty
+ 52324: isEmpty
+37
View File
@@ -0,0 +1,37 @@
=== Strings BEFORE exterior SVG (idx 391) ===
[376] US+201813: 'Левый передний диск '
[377] US+201855: 'Правый передний диск '
[378] US+201899: 'Правый задний диск '
[379] US+201939: 'Левый задний диск '
[380] US+201977: 'штампованный'
[381] US+202003: 'штампованный с колпаком'
[382] US+202051: 'литой'
[383] US+202063: '<path onclick="Foo.ChangeRezina(0)" transform="scale(0.2, 0.2)" fill="#006DF0" d="M501.961,245.961h-42.423l10.335-10.335c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0 l-24.532,2'
[384] US+210660: '<path ontouchstart="Foo.ChangeRezinaOnStart(0)" ontouchend="Foo.ChangeRezinaOnEnd(0)" transform="scale(0.2, 0.2)" fill="#FFDA44" d="M497.78,326.334l-51.395-70.808l51.395-70.804c1.711-2.475,2.088-5.232'
[385] US+212935: '<path onclick="Foo.ChangeRezina(1)" transform="scale(0.2, 0.2)" fill="#006DF0" d="M501.961,245.961h-42.423l10.335-10.335c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0 l-24.532,2'
[386] US+221532: '<path ontouchstart="Foo.ChangeRezinaOnStart(1)" ontouchend="Foo.ChangeRezinaOnEnd(1)" transform="scale(0.2, 0.2)" fill="#FFDA44" d="M497.78,326.334l-51.395-70.808l51.395-70.804c1.711-2.475,2.088-5.232'
[387] US+223807: '<path onclick="Foo.ChangeRezina(2)" transform="scale(0.2, 0.2)" fill="#006DF0" d="M501.961,245.961h-42.423l10.335-10.335c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0 l-24.532,2'
[388] US+232404: '<path ontouchstart="Foo.ChangeRezinaOnStart(2)" ontouchend="Foo.ChangeRezinaOnEnd(2)" transform="scale(0.2, 0.2)" fill="#FFDA44" d="M497.78,326.334l-51.395-70.808l51.395-70.804c1.711-2.475,2.088-5.232'
[389] US+234679: '<path onclick="Foo.ChangeRezina(3)" transform="scale(0.2, 0.2)" fill="#006DF0" d="M501.961,245.961h-42.423l10.335-10.335c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0 l-24.532,2'
[390] US+243276: '<path ontouchstart="Foo.ChangeRezinaOnStart(3)" ontouchend="Foo.ChangeRezinaOnEnd(3)" transform="scale(0.2, 0.2)" fill="#FFDA44" d="M497.78,326.334l-51.395-70.808l51.395-70.804c1.711-2.475,2.088-5.232'
=== Strings AFTER exterior SVG ===
[392] US+324296: '</g><g transform ="translate(660, 150)">'
[393] US+324378: '</g><g transform ="translate(60, 950)">'
[394] US+324458: '</g><g transform ="translate(660, 950)">'
[395] US+324540: '</g><path fill = "#C0C0C0" d="M352.2200000000006,295.44000000000045C352.1500000000006,299.89000000000044,352.1700000000006,304.3500000000005,352.1900000000006,308.81000000000046C390.92000000000064,308'
[396] US+330189: '<path class="52" ontouchstart="onstart(52)" ontouchend="onend(52)" fill = "#ffffff" d="M704.9500000000005,302.20000000000044C704.8900000000006,306.51000000000045,704.9600000000005,310.84000000000043,7'
[397] US+332198: '<path class="51" ontouchstart="onstart(51)" ontouchend="onend(51)" fill = "#ffffff" d="M90.69000000000051,300.70000000000044C85.06000000000051,303.2800000000004,84.14000000000051,310.11000000000047,82'
[398] US+333995: '<path fill = "#C0C0C0" d="M684.1800000000005,309.9200000000004C684.0400000000005,315.9500000000004,684.7600000000006,321.96000000000043,684.5100000000006,327.9900000000004C684.6600000000005,330.130000'
[399] US+338054: '<path fill = "#C0C0C0" d="M122.05000000000052,309.27000000000044C122.98000000000053,318.9100000000004,123.96000000000052,328.5500000000004,125.32000000000052,338.14000000000044C129.62000000000052,337.'
[400] US+341951: '<path class="3" ontouchstart="onstart(3)" ontouchend="onend(3)" fill = "#ffffff" d="M350,130L470,130,470,152,350,152Z" />'
[401] US+342196: '<path ontouchstart="onstart(57)" ontouchend="onend(57)" fill = "#ffffff" d = "M360,130L390,130,400,152,350,152Z" />'
[402] US+342429: '<path class="30" fill = "#C0C0C0" ontouchstart="onstart(30)" ontouchend="onend(30)" d="M509.22000000000014,746.4400000000003C512.6800000000002,756.4900000000002,515.8800000000001,766.7000000000003,520'
[403] US+344372: '<path fill = "#C0C0C0" class="31" ontouchstart="onstart(31)" ontouchend="onend(31)" d="M298.04000000000013,743.8400000000003C298.5500000000001,754.5800000000003,298.91000000000014,765.3500000000003,29'
[404] US+346287: '<path class="28" ontouchstart="onstart(28)" ontouchend="onend(28)" fill="№ffffff" d="M170.45000000000044,496.19000000000057C170.49000000000044,498.31000000000057,170.41000000000045,500.45000000000056,'
[405] US+347230: '<path class="29" ontouchstart="onstart(29)" ontouchend="onend(29)" fill="#ffffff" d="M645.2800000000004,504.77000000000055C647.3600000000005,503.95000000000056,649.5200000000004,503.39000000000055,651'
[406] US+348151: '<path fill = "#C0C0C0" d="M531.9600000000002,557.0300000000004C532.1600000000002,583.7900000000004,531.5300000000002,610.5500000000004,531.8000000000002,637.3000000000004C534.7500000000002,635.7400000'
[407] US+353102: '<path d="M664.2900000000003,581.3900000000006C667.1000000000003,580.3300000000006,671.5300000000003,581.3400000000006,671.4800000000004,585.0100000000006C671.5500000000004,593.9800000000006,671.600000'
[408] US+358861: '<path d="M153.3000000000003,581.3800000000006C156.1100000000003,580.3300000000006,160.5200000000003,581.3300000000006,160.4800000000003,585.0000000000006C160.56000000000031,593.9600000000006,160.59000'
[409] US+363706: '<path fill = "#C0C0C0" d="M172.47000000000034,456.1500000000006C171.80000000000035,465.5700000000006,171.77000000000035,475.5100000000006,175.78000000000034,484.2800000000006C178.87000000000035,489.95'
[410] US+369021: '<path class="22" ontouchstart="onstart(22)" ontouchend="onend(22)" fill = "#ffffff" d="M283.93000000000006,1063.81C282.95000000000005,1065.78,281.52000000000004,1067.7,281.5400000000001,1070.01C281.48'
@@ -0,0 +1,58 @@
=== Strings mentioning TouchEnd, TouchStart, Foo, Circle, cx, cy ===
US+150958: <g transform="translate(490, 85)"><path onclick="clicked(evt)" stroke-width="20" fill = "#009966" stroke="#000" transform = "scale(0.06, 0.06)" class="34" ontouchstart="onstart(34)" ontouchend="onend(34)" fill = "#ffffff" d = "M407,76H105C47.109,76,0,123.109,0,181v150c0,57.891,47.109,105,105,105h302c57.891,0,105-47.109,105-105V181C512,123.109,464.891,76,407,76z"/></g>
US+151701: <g transform="translate(300, 85)"><path stroke-width="20" onclick="clicked(evt)" stroke="#000" fill = "#009966" transform = "scale(0.06, 0.06)" class="35" ontouchstart="onstart(35)" ontouchend="onend(35)" fill = "#ffffff" d = "M407,76H105C47.109,76,0,123.109,0,181v150c0,57.891,47.109,105,105,105h302c57.891,0,105-47.109,105-105V181C512,123.109,464.891,76,407,76z"/></g>
US+152444: <g transform="translate(490, 1090)"><path onclick="clicked(evt)" stroke-width="20" stroke="#000" fill = "#009966" transform = "scale(0.06, 0.06)" class="36" ontouchstart="onstart(36)" ontouchend="onend(36)" d = "M407,76H105C47.109,76,0,123.109,0,181v150c0,57.891,47.109,105,105,105h302c57.891,0,105-47.109,105-105V181C512,123.109,464.891,76,407,76z"/></g>
US+153157: <g transform="translate(300, 1090)"><path onclick="clicked(evt)" stroke-width="20" fill = "#009966" stroke="#000" transform = "scale(0.06, 0.06)" class="37" ontouchstart="onstart(37)" ontouchend="onend(37)" d = "M407,76H105C47.109,76,0,123.109,0,181v150c0,57.891,47.109,105,105,105h302c57.891,0,105-47.109,105-105V181C512,123.109,464.891,76,407,76z"/></g>
US+198789: " /><path onclick="Foo.ChangeWash()" d="M290.909,277.721c-12.853,0-23.273,10.42-23.273,23.273v31.03c0,12.853,10.42,23.273,23.273,23.273 c12.853,0,23.273-10.42,23.273-23.273v-31.03C314.182,288.141,303.762,277.721,290.909,277.721z" fill="
US+199270: " /><path onclick="Foo.ChangeWash()" d="M290.909,401.842c-12.853,0-23.273,10.42-23.273,23.273v31.03c0,12.853,10.42,23.273,23.273,23.273 c12.853,0,23.273-10.42,23.273-23.273v-31.03C314.182,412.262,303.762,401.842,290.909,401.842z" fill="
US+199751: " /><path onclick="Foo.ChangeWash()" d="M197.818,277.721c-12.853,0-23.273,10.42-23.273,23.273v31.03c0,12.853,10.42,23.273,23.273,23.273 c12.853,0,23.273-10.42,23.273-23.273v-31.03C221.091,288.141,210.671,277.721,197.818,277.721z" fill="
US+200232: " /><path onclick="Foo.ChangeWash()" d="M197.818,401.842c-12.853,0-23.273,10.42-23.273,23.273v31.03c0,12.853,10.42,23.273,23.273,23.273 c12.853,0,23.273-10.42,23.273-23.273v-31.03C221.091,412.262,210.671,401.842,197.818,401.842z" fill="
US+200713: " /><path onclick="Foo.ChangeWash()" d="M104.727,277.721c-12.853,0-23.273,10.42-23.273,23.273v31.03c0,12.853,10.42,23.273,23.273,23.273 c12.853,0,23.273-10.42,23.273-23.273v-31.03C128,288.141,117.58,277.721,104.727,277.721z" fill="
US+201184: " /><path onclick="Foo.ChangeWash()" d="M104.727,401.842c-12.853,0-23.273,10.42-23.273,23.273v31.03c0,12.853,10.42,23.273,23.273,23.273 c12.853,0,23.273-10.42,23.273-23.273v-31.03C128,412.262,117.58,401.842,104.727,401.842z" fill="
US+341951: <path class="3" ontouchstart="onstart(3)" ontouchend="onend(3)" fill = "#ffffff" d="M350,130L470,130,470,152,350,152Z" />
US+342196: <path ontouchstart="onstart(57)" ontouchend="onend(57)" fill = "#ffffff" d = "M360,130L390,130,400,152,350,152Z" />
US+346287: <path class="28" ontouchstart="onstart(28)" ontouchend="onend(28)" fill="№ffffff" d="M170.45000000000044,496.19000000000057C170.49000000000044,498.31000000000057,170.41000000000045,500.45000000000056,170.59000000000043,502.58000000000055C172.44000000000042,503.66000000000054,174.74000000000044,503.81000000000057,176.76000000000042,504.53000000000054C174.73000000000042,501.69000000000057,172.54000000000042,498.97000000000054,170.45000000000041,496.19000000000057Z" />
US+347230: <path class="29" ontouchstart="onstart(29)" ontouchend="onend(29)" fill="#ffffff" d="M645.2800000000004,504.77000000000055C647.3600000000005,503.95000000000056,649.5200000000004,503.39000000000055,651.7400000000005,503.08000000000055C651.8000000000004,500.78000000000054,651.8100000000005,498.48000000000053,651.7900000000004,496.19000000000057C649.6800000000004,499.1000000000006,647.5100000000004,501.95000000000056,645.2800000000004,504.77000000000055Z" />
US+451703: <path class="14" ontouchstart="onstart(14)" ontouchend="onend(14)" fill = "#ffffff" d="M72.11000000000013,471.3300000000005L72.96000000000012,632.8000000000005L77.00000000000013,632.4500000000005L77.11000000000013,471.3300000000005Z" />
US+453461: <path class="15" ontouchstart="onstart(15)" ontouchend="onend(15)" fill = "#ffffff" d="M748,470L744,632.5L748.19,632.5L750,461Z" />
US+453726: <path class="48" ontouchstart="onstart(48)" ontouchend="onend(48)" fill = "#ffffff" d="M745,740L744,632.5L748.19,632.5L750,739Z" />
US+482566: <path class="41" ontouchstart="onstart(41)" ontouchend="onend(41)" fill = "#ffffff" d="M727.5600000000002,767.6400000000003C743.2000000000002,763.4900000000004,760.6000000000001,774.9700000000004,762.9700000000001,790.9700000000004C766.2500000000001,806.3900000000003,754.6800000000002,822.8200000000004,739.0900000000001,825.0200000000003C724.4000000000001,827.9500000000003,708.7500000000001,817.5600000000003,705.6800000000002,802.9100000000003C701.6000000000001,787.7300000000004,712.1800000000002,770.7700000000003,727.5600000000002,767.6400000000003Z" />
US+504522: <g transform="translate(490, 85)"><path stroke-width="20" stroke="#000" transform = "scale(0.06, 0.06)" class="34" ontouchstart="onstart(34)" ontouchend="onend(34)" fill = "#ffffff" d = "M407,76H105C47.109,76,0,123.109,0,181v150c0,57.891,47.109,105,105,105h302c57.891,0,105-47.109,105-105V181C512,123.109,464.891,76,407,76z"/></g>
US+505185: <g transform="translate(300, 85)"><path stroke-width="20" stroke="#000" transform = "scale(0.06, 0.06)" class="35" ontouchstart="onstart(35)" ontouchend="onend(35)" fill = "#ffffff" d = "M407,76H105C47.109,76,0,123.109,0,181v150c0,57.891,47.109,105,105,105h302c57.891,0,105-47.109,105-105V181C512,123.109,464.891,76,407,76z"/></g>
US+505848: <g transform="translate(490, 1090)"><path stroke-width="20" stroke="#000" transform = "scale(0.06, 0.06)" class="36" ontouchstart="onstart(36)" ontouchend="onend(36)" fill = "#ffffff" d = "M407,76H105C47.109,76,0,123.109,0,181v150c0,57.891,47.109,105,105,105h302c57.891,0,105-47.109,105-105V181C512,123.109,464.891,76,407,76z"/></g>
US+506515: <g transform="translate(300, 1090)"><path stroke-width="20" stroke="#000" transform = "scale(0.06, 0.06)" class="37" ontouchstart="onstart(37)" ontouchend="onend(37)" fill = "#ffffff" d = "M407,76H105C47.109,76,0,123.109,0,181v150c0,57.891,47.109,105,105,105h302c57.891,0,105-47.109,105-105V181C512,123.109,464.891,76,407,76z"/></g>
US+507182: <path class="53" ontouchstart="onstart(53)" ontouchend="onend(53)" fill = "#ffffff" d="M228.80000000000018,719.1500000000003L218.80000000000018,748.1500000000003,185.83000000000015,780.5999999999999,188.41000000000017,814.1099999999999,190.55000000000015,811.5099999999999L201.85000000000016,798.2499999999999,210.37000000000015,782.9599999999999,218.77000000000015,767.7799999999999C221.21000000000015,763.5799999999998,222.51000000000016,758.3399999999998,226.96000000000015,755.7199999999999Z" />
US+508183: <path class="54" ontouchstart="onstart(54)" ontouchend="onend(54)" fill = "#ffffff" d="M634.3400000000001,824.57L634.3400000000001,814.57,640.8900000000001,778.2000000000002,605.8900000000001,745.2000000000002,594.8900000000001,723.2000000000002,594.8900000000001,756.2000000000002Z" />
US+508758: <path class="55" ontouchstart="onstart(55)" ontouchend="onend(55)" fill = "#ffffff" d="M170,490L170,450,230,560,230,580Z" />
US+509009: <path class="56" ontouchstart="onstart(56)" ontouchend="onend(56)" fill = "#ffffff" d="M650,490L650,450,595,560,595,580Z" />
US+511008: <path ontouchstart ="Foo.ChangeDiskOnStart({0})" ontouchend="Foo.ChangeDiskOnEnd({1})" fill = "{2}" transform = "scale(0.2, 0.2)" d = "M256,0C114.615,0,0,114.615,0,256s114.615,256,256,256s256-114.615,256-256S397.385,0,256,0z M256,428.5c-95.117,0-172.5-77.383-172.5-172.5S160.883,83.5,256,83.5S428.5,160.883,428.5,256S351.117,428.5,256,428.5z" />
US+513813: <circle cx="
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="11" stroke = "#ffffff" fill = "#009966" d="M662.0900000000003,483.2500000000005C659.7200000000003,483.9300000000005,657.9700000000003,485.72000000000054,656.2100000000003,487.3200000000005C655.5700000000003,534.0300000000005,653.3100000000003,580.7100000000005,652.1600000000003,627.4100000000005C657.7600000000003,624.9000000000005,664.0000000000003,625.0500000000005,670.0100000000003,624.7000000000005C679.9700000000004,624.2900000000005,689.9500000000004,623.7400000000005,699.9200000000003,624.4500000000005C713.5100000000003,624.2400000000005,727.0300000000003,626.4000000000005,740.1200000000003,629.9500000000005C740.0200000000003,608.9800000000005,740.9200000000003,588.0200000000006,741.1300000000003,567.0500000000005C742.0200000000003,540.3700000000006,742.1800000000003,513.6400000000006,743.4700000000004,486.97000000000054C744.0300000000003,484.47000000000054,741.1900000000004,484.07000000000056,739.5200000000003,483.3600000000005C732.5100000000003,481.40000000000055,725.2200000000004,480.6200000000005,718.0000000000003,479.9900000000005C699.3500000000004,479.8300000000005,680.2500000000003,477.8600000000005,662.0900000000004,483.2500000000005Z"/><path onclick="clicked(evt)" class="11" stroke = "#ffffff" fill = "#009966" d="M656,489 600,555 595,605 590,642 652,627 652,614 600,627 610,555 656,500Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="12" stroke = "#ffffff" fill = "#009966" d="M82.14000000000013,634.7700000000002C82.17000000000013,639.8500000000003,82.24000000000012,644.9400000000002,82.12000000000013,650.0200000000002C81.53000000000013,676.7000000000002,82.32000000000014,703.4100000000002,81.57000000000014,730.0800000000002C94.31000000000013,731.1200000000001,107.23000000000013,732.8800000000001,119.07000000000014,737.9200000000002C128.33000000000013,742.0100000000002,135.56000000000014,749.4400000000002,141.51000000000013,757.4500000000002C145.66000000000014,762.6800000000002,149.15000000000012,769.4900000000001,156.02000000000012,771.5100000000001C164.11000000000013,773.6200000000001,172.52000000000012,775.1300000000001,180.91000000000014,774.2400000000001C178.95000000000013,750.0100000000001,177.24000000000015,725.7500000000001,175.06000000000014,701.5300000000001C173.04000000000013,678.4800000000001,171.78000000000014,655.3800000000001,170.45000000000013,632.2900000000001C163.23000000000013,628.4900000000001,154.87000000000012,629.2,147.00000000000014,628.85C133.97000000000014,628.12,120.92000000000014,628.61,107.91000000000014,629.37C99.24000000000014,630.66,90.41000000000014,631.71,82.14000000000014,634.77Z"/><path onclick="clicked(evt)" class="12" stroke = "#ffffff" fill = "#009966" d="M171,633 228,646 225,726 211,760 182,775 182,765 205,752 215,726 218,651 171,641z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="13" stroke = "#ffffff" fill = "#009966" d="M652.1500000000001,632.2400000000002C651.2700000000001,636.0700000000003,651.5900000000001,640.0800000000003,651.21,643.9800000000002C649.0500000000001,687.5100000000002,644.38,730.8600000000002,641.5300000000001,774.3400000000003C647.3700000000001,774.7400000000002,653.2600000000001,774.3900000000002,659.0000000000001,773.1700000000003C663.3200000000002,772.2300000000002,668.0800000000002,771.7100000000003,671.5700000000002,768.7100000000003C675.5500000000002,765.2300000000002,678.2800000000002,760.6400000000002,681.5200000000002,756.5300000000003C687.2700000000002,748.9700000000004,694.2200000000003,742.0100000000003,702.9800000000002,738.0500000000003C714.9100000000002,732.8500000000003,727.9800000000002,731.2200000000003,740.8200000000003,730.0100000000003C739.9600000000003,698.3500000000004,740.9500000000003,666.6500000000003,739.9600000000003,635.0000000000003C739.2000000000003,633.9700000000004,737.7300000000002,633.9500000000004,736.6500000000003,633.5000000000003C714.9500000000003,627.6000000000004,692.2500000000003,628.2200000000004,669.9900000000004,628.9900000000004C663.9600000000004,629.2200000000004,657.5500000000003,629.1600000000003,652.1500000000003,632.2400000000004Z"/><path onclick="clicked(evt)" class="13" stroke = "#ffffff" fill = "#009966" d="M651,633 594,646 591,726 595,760 637,775 637,765 608,752 599,726 601,651 651,641z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="16" stroke = "#ffffff" fill = "#009966" d="M381.04,565.1600000000003C362.39000000000004,566.8500000000004,343.52000000000004,569.4000000000003,325.94,576.1700000000003C328.2,587.7000000000003,329.96999999999997,599.3300000000003,330.62,611.0800000000003C334.28000000000003,651.9000000000003,335.37,692.9000000000003,336.93,733.8400000000003C337.44,743.8800000000002,336.90000000000003,753.9600000000003,337.93,763.9700000000003C360.27,770.7800000000002,383.83,771.5800000000003,407.01,771.8300000000003C432.42,772.0000000000002,458.31,771.3100000000003,482.81,763.9200000000003C483.68,747.2900000000003,483.62,730.6300000000003,484.43,714.0000000000003C485.8,680.6400000000003,486.79,647.2500000000003,489.84000000000003,613.9900000000004C490.64000000000004,601.3600000000004,491.96000000000004,588.7300000000004,494.87,576.4000000000003C485.46,572.2100000000003,475.25,570.2400000000004,465.18,568.3800000000003C437.42,563.4400000000003,409.09000000000003,563.1100000000004,381.04,565.1600000000003Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" stroke = "#ffffff" class="17" fill = "#009966" d="M725.4200000000005,371.65000000000043C708.2400000000006,375.02000000000044,694.0000000000006,389.59000000000043,691.1200000000006,406.87000000000046C688.6600000000005,420.2900000000005,692.9900000000006,434.7200000000005,702.4800000000006,444.5300000000004C710.7700000000006,453.3700000000004,722.9000000000005,458.58000000000044,735.0500000000006,458.15000000000043C750.1700000000006,458.1000000000004,764.7700000000007,449.2400000000004,772.1300000000007,436.08000000000044C776.1400000000007,429.12000000000046,778.1700000000006,421.0400000000004,777.8500000000007,413.01000000000045C777.4900000000007,397.5300000000004,768.0400000000008,382.74000000000046,754.2700000000007,375.7300000000005C745.5100000000007,371.0400000000005,735.1300000000007,369.75000000000045,725.4200000000006,371.6500000000005Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="18" stroke = "#ffffff" fill = "#009966" d="M79.47000000000048,371.64000000000044C62.27000000000048,375.00000000000045,48.01000000000048,389.57000000000045,45.12000000000048,406.86000000000047C42.70000000000048,420.06000000000046,46.85000000000048,434.2200000000005,56.00000000000048,444.0300000000005C64.31000000000049,453.1400000000005,76.64000000000048,458.5900000000005,89.0200000000005,458.1500000000005C104.1700000000005,458.1200000000005,118.8000000000005,449.2100000000005,126.1600000000005,436.0300000000005C130.1500000000005,429.0900000000005,132.1700000000005,421.0300000000005,131.8500000000005,413.0300000000005C131.5000000000005,397.5300000000005,122.02000000000051,382.7200000000005,108.2300000000005,375.7000000000005C99.4900000000005,371.0400000000005,89.1500000000005,369.7700000000005,79.4700000000005,371.6400000000005Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="19" stroke = "#ffffff" fill = "#009966" d="M723.5500000000003,753.7500000000003C706.6800000000003,757.8400000000004,693.1300000000003,772.8100000000003,690.8800000000003,790.0500000000003C688.9600000000004,803.1000000000003,693.3900000000003,816.9200000000003,702.6400000000003,826.3400000000003C710.8700000000003,835.0900000000003,722.9100000000003,840.1700000000003,734.9400000000003,839.8600000000002C749.2500000000002,839.7500000000002,763.1600000000003,831.9200000000002,770.8400000000003,819.8800000000002C775.6000000000003,812.5500000000002,778.1600000000003,803.7800000000002,777.8600000000002,795.0300000000002C777.6300000000002,779.2800000000002,767.9600000000003,764.1700000000002,753.8700000000002,757.1900000000002C744.6300000000002,752.3700000000001,733.6300000000002,751.2500000000001,723.5500000000002,753.7500000000001Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="20" stroke = "#ffffff" fill = "#009966" d="M77.59000000000026,753.7400000000004C61.45000000000026,757.6600000000003,48.30000000000026,771.4800000000004,45.250000000000256,787.8200000000004C42.55000000000025,801.2900000000004,46.720000000000255,815.9100000000004,56.19000000000025,825.8800000000003C64.47000000000025,834.9100000000003,76.72000000000025,840.2000000000004,88.99000000000025,839.8600000000004C103.56000000000026,839.7500000000003,117.67000000000024,831.6000000000004,125.27000000000025,819.2100000000004C131.06000000000026,810.0200000000003,133.18000000000026,798.6400000000003,131.11000000000024,787.9900000000004C128.60000000000025,774.6100000000004,119.44000000000024,762.6700000000003,107.13000000000024,756.8300000000004C98.07000000000023,752.3100000000004,87.39000000000024,751.3300000000004,77.59000000000023,753.7400000000004Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="21" stroke = "#ffffff" fill = "#009966" d="M307.76000000000005,1038.83C311.14000000000004,1045.8899999999999,314.6,1052.9099999999999,318.02000000000004,1059.96C320.43000000000006,1065.13,323.04,1070.8600000000001,328.23,1073.76C331.98,1075.14,336.08000000000004,1074.98,340,1075.43C374.31,1077.52,408.7,1076.6200000000001,443.06,1076.8400000000001C458.77,1076.2,474.54,1076.4700000000003,490.18,1074.6100000000001C495.5,1074.2,498.77,1069.2900000000002,501.15000000000003,1065.0500000000002C505.43,1056.1900000000003,509.90000000000003,1047.41,514,1038.4700000000003C445.25,1038.6300000000003,376.5,1038.3400000000001,307.76,1038.8300000000002Z"/><path onclick="clicked(evt)" class="21" stroke = "#ffffff" fill = "#009966" d="M303.57,1024.0600000000002C303.29,1027.0100000000002,304.86,1029.7200000000003,305.75,1032.4600000000003C375.75,1032.4900000000002,445.76,1032.4600000000003,515.76,1032.6100000000004C517.04,1029.2700000000004,519.17,1025.5800000000004,517.51,1021.9900000000004C515.9,1018.5000000000003,513.35,1014.4700000000004,509.11,1014.2000000000004C505.43,1013.6500000000004,501.7,1013.8300000000004,498,1013.8000000000004C436.98,1013.8000000000004,375.95,1013.7800000000004,314.93,1013.9300000000004C309.02,1013.4900000000004,304.74,1018.7700000000004,303.57,1024.0600000000004Z"/><path onclick ="clicked(evt)" class="21" stroke = "#ffffff" fill = "#009966" d="M316.5000000000001,841.3900000000003C316.8400000000001,860.6000000000004,319.10000000000014,879.7200000000004,320.16000000000014,898.8900000000003C330.7400000000001,908.0000000000003,343.6300000000001,915.5800000000004,357.85000000000014,916.5200000000003C376.46000000000015,918.7300000000004,395.22000000000014,919.3100000000003,413.95000000000016,919.1300000000003C432.98000000000013,919.3700000000003,452.0600000000002,918.1500000000003,470.89000000000016,915.3900000000003C481.28000000000014,912.5100000000003,490.89000000000016,907.0500000000003,499.10000000000014,900.1100000000004C500.92000000000013,899.0600000000004,500.51000000000016,896.8000000000004,500.7400000000001,895.0700000000004C501.85000000000014,877.1800000000004,503.8700000000001,859.3300000000004,504.1300000000001,841.4100000000004C496.3300000000001,847.7100000000004,486.7100000000001,851.1000000000005,477.1300000000001,853.6600000000004C453.92000000000013,859.5800000000004,429.8100000000001,860.5700000000004,405.9600000000001,860.1800000000004C384.1400000000001,860.1000000000004,362.0700000000001,858.8200000000004,340.9500000000001,852.9600000000004C332.2500000000001,850.4700000000004,323.6100000000001,847.1400000000003,316.5000000000001,841.3900000000003Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="22" stroke = "#ffffff" fill = "#009966" d="M283.93000000000006,1063.81C282.95000000000005,1065.78,281.52000000000004,1067.7,281.5400000000001,1070.01C281.4800000000001,1075.64,281.5100000000001,1081.27,281.5800000000001,1086.91C298.9500000000001,1089.1000000000001,316.5400000000001,1087.44,333.9800000000001,1088.43C389.32000000000005,1088.97,444.70000000000005,1089.19,500.0300000000001,1088.1200000000001C513.3600000000001,1087.93,526.7800000000001,1088.64,540.0300000000001,1086.91C539.69,1079.26,541.6400000000001,1071,537.8500000000001,1063.95C527.2300000000001,1065.29,516.5000000000001,1065.21,505.83000000000015,1065.91C502.3600000000001,1071.8400000000001,497.65000000000015,1078.8600000000001,489.9900000000002,1078.99C463.7400000000002,1081.6,437.33000000000015,1080.5,411.00000000000017,1081.19C384.3100000000002,1080.48,357.5300000000002,1081.65,330.9200000000002,1078.9C323.5300000000002,1078.5,319.4300000000002,1071.52,315.75000000000017,1066.0400000000002C305.1800000000002,1064.91,294.4300000000002,1065.5900000000001,283.9300000000002,1063.8100000000002Z"/><path onclick ="clicked(evt)" class="22" stroke = "#ffffff" fill = "#009966" d="M281.9700000000001,1091.1699999999998C282.5700000000001,1097.2599999999998,282.8900000000001,1103.4399999999998,284.5200000000001,1109.3799999999999C285.9000000000001,1114.52,289.3900000000001,1118.6699999999998,292.1000000000001,1123.1499999999999C295.5400000000001,1121.6699999999998,299.18000000000006,1120.6299999999999,302.9500000000001,1120.61C340.6200000000001,1118.9599999999998,378.3400000000001,1119.59,416.0400000000001,1119.4699999999998C450.3900000000001,1119.5299999999997,484.75000000000006,1119.0899999999997,519.0600000000001,1120.6299999999999C522.73,1120.6799999999998,526.2500000000001,1121.77,529.6300000000001,1123.12C532.1000000000001,1118.75,535.5200000000001,1114.86,536.9600000000002,1109.9799999999998C538.7600000000001,1103.8999999999999,539.0800000000002,1097.5199999999998,539.6400000000001,1091.2599999999998C533.1200000000001,1092.0499999999997,526.5500000000001,1092.2099999999998,519.9900000000001,1092.1699999999998C492.65000000000015,1092.0399999999997,465.33000000000015,1093.0199999999998,438.0000000000001,1092.8799999999999C401.04000000000013,1092.87,364.09000000000015,1093.06,327.1400000000001,1092.31C312.1000000000001,1091.6699999999998,296.9500000000001,1093.07,281.9700000000001,1091.1699999999998Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="0" stroke = "#ffffff" fill = "#009966" d="M279.1300000000006,119.04000000000042C278.11000000000064,124.02000000000042,278.4100000000006,129.1700000000004,278.8800000000006,134.20000000000041C283.79000000000065,131.44000000000042,289.3900000000006,130.3400000000004,294.9600000000006,129.94000000000042C302.93000000000063,129.02000000000044,310.9600000000006,128.81000000000043,318.9800000000006,128.47000000000043H489.0300000000006C502.3500000000006,128.35000000000042,515.7000000000006,128.84000000000043,528.9200000000006,130.51000000000042C532.8500000000006,131.01000000000042,536.6200000000007,132.35000000000042,540.1200000000007,134.20000000000041C540.5900000000007,129.1800000000004,540.8500000000007,124.06000000000041,539.9100000000007,119.08000000000041C536.6800000000006,118.20000000000041,533.4100000000007,117.4600000000004,530.0700000000006,117.23000000000042C511.7100000000006,115.90000000000042,493.3200000000006,115.43000000000042,474.92000000000064,115.53000000000041H400.97000000000065C368.97000000000065,115.75000000000041,336.95000000000067,114.95000000000041,304.97000000000065,116.25000000000041C296.34000000000066,116.95000000000041,287.52000000000066,116.59000000000042,279.1300000000007,119.04000000000042Z"/><path onclick="clicked(evt)" class="0" stroke = "#ffffff" fill = "#009966" d="M290.1600000000006,88.97000000000043C287.4800000000006,94.70000000000043,284.1100000000006,100.09000000000043,281.6300000000006,105.93000000000043C280.5700000000006,108.86000000000044,279.6600000000006,111.84000000000043,278.49000000000063,114.73000000000043C281.9400000000006,113.99000000000044,285.41000000000065,113.28000000000043,288.9500000000006,113.07000000000043C303.9500000000006,112.08000000000044,318.9700000000006,111.34000000000043,334.0100000000006,111.47000000000044H455.9700000000006C478.3400000000006,111.55000000000044,500.7300000000006,111.03000000000044,523.0600000000006,112.64000000000044C528.9200000000006,112.91000000000044,534.8000000000006,113.32000000000045,540.5200000000007,114.70000000000044C537.3700000000007,105.78000000000044,533.2500000000007,97.29000000000045,528.9200000000006,88.89000000000044C449.34000000000066,88.93000000000045,369.7500000000007,88.77000000000044,290.16000000000065,88.97000000000044Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="23" stroke = "#ffffff" fill = "#009966" d="M485.51 767.67c-18.23 5.96-37.52 7.47-56.56 8.45-31.79.15-64.39 1-95.06-8.74-2.21-.27-2.71 2.05-3.18 3.68-2.45 9.43-4.95 18.86-7.11 28.36-2.24 10.5-5.21 20.86-6.48 31.54-.1 1.98-.89 4.47 1.02 5.89 6.4 6.39 15.26 9.35 23.72 11.92 18.9 5.23 38.58 6.93 58.13 7.06 19.06.4 38.23.33 57.13-2.56 11.89-1.8 23.84-4.28 34.85-9.29 4.28-2.08 8.57-4.57 11.59-8.33.61-1.47-.03-3.15-.02-4.67-1.25-10.53-4.14-20.76-6.37-31.1-2.37-10.23-4.88-20.43-7.76-30.52-.29-1.79-2.42-2.38-3.9-1.69"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="24" stroke = "#ffffff" fill = "#009966" d="M191.33000000000015,526.1200000000005C189.73000000000016,527.8500000000005,188.46000000000015,530.1800000000004,185.99000000000015,530.8000000000004C180.93000000000015,531.9900000000005,174.42000000000016,532.6600000000004,171.07000000000016,527.7500000000005C172.59000000000017,557.9100000000004,173.11000000000016,588.1500000000004,174.29000000000016,618.3400000000005C191.19000000000017,622.5500000000005,208.07000000000016,626.8900000000004,224.88000000000017,631.4500000000005C224.67000000000016,617.0600000000005,222.95000000000016,602.7300000000005,220.64000000000016,588.5500000000005C219.15000000000015,578.9500000000005,216.30000000000015,569.5800000000005,212.28000000000014,560.7500000000006C206.75000000000014,548.7800000000005,200.48000000000013,537.0500000000005,192.47000000000014,526.5500000000005L191.33000000000015,526.1200000000006Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="25" stroke = "#ffffff" fill = "#009966" d="M630.2900000000002,526.0600000000005C622.2400000000002,536.3100000000005,616.1100000000002,547.9200000000005,610.5500000000002,559.6600000000005C606.6800000000002,568.0400000000005,603.7000000000002,576.8700000000006,602.1500000000002,585.9900000000006C599.5300000000002,600.9900000000006,597.7300000000002,616.1600000000005,597.4500000000002,631.3900000000006C614.3000000000002,626.8800000000006,631.2400000000001,622.6500000000005,648.1100000000001,618.2000000000005C648.9900000000001,588.1000000000005,650.0900000000001,558.0100000000004,651.0200000000001,527.9200000000005C649.3700000000001,529.6000000000005,647.6000000000001,531.6600000000005,645.0000000000001,531.5300000000005C641.4000000000001,531.6000000000006,637.4400000000002,531.7600000000006,634.2800000000001,529.7800000000005C632.6600000000001,528.8400000000005,632.2700000000001,526.3400000000005,630.2900000000001,526.0600000000005Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="26" stroke = "#ffffff" fill = "#009966" d="M175.47100000000012,644.4100000000004C176.78000000000011,672.3590000000004,179.32800000000012,700.2400000000005,181.61000000000013,728.1200000000005C194.67000000000013,728.1500000000004,207.73000000000013,727.5500000000004,220.79000000000013,727.5600000000005C226.01000000000013,703.0700000000005,224.67000000000013,677.8800000000006,225.40000000000015,653.0200000000006C217.58600000000015,651.6180000000005,209.78300000000016,650.1510000000005,201.98000000000013,648.6790000000005L198.86000000000013,648.0910000000006C191.05700000000013,646.6190000000006,183.25400000000013,645.1520000000006,175.4400000000001,643.7500000000006L175.47100000000012,644.4100000000005Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="27" stroke = "#ffffff" fill = "#009966" d="M596.9300000000001,653.0300000000004C597.5000000000001,677.8700000000005,596.5600000000001,702.9500000000004,601.3800000000001,727.4700000000005C614.5100000000001,727.6600000000005,627.6300000000001,728.1000000000005,640.7600000000001,728.1100000000005C642.9900000000001,700.0100000000004,645.5800000000002,671.9200000000005,646.9300000000001,643.7600000000004C630.24,646.7400000000005,613.61,650.0000000000005,596.9300000000001,653.0300000000004Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="30" stroke = "#ffffff" fill = "#009966" d="M602.9300000000001,734.6100000000004C605.47,743.8000000000004,609.61,752.7300000000004,616.19,759.7500000000003C621.6500000000001,765.7100000000004,629.62,768.3800000000003,637.3900000000001,769.6700000000003C638.4300000000001,758.1800000000003,639.3100000000001,746.6800000000003,640.1100000000001,735.1700000000003C627.7100000000002,735.1900000000003,615.3200000000002,734.7800000000003,602.9300000000002,734.6100000000004Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="38" fill = "#009966" d="M510.42000000000064,202.94000000000045C512.3700000000007,204.39000000000044,513.1100000000007,206.72000000000045,514.3500000000006,208.70000000000044C516.6000000000006,210.08000000000044,519.5200000000006,209.33000000000044,522.0500000000006,209.47000000000045C527.8700000000007,209.34000000000046,534.7300000000006,207.16000000000045,537.0900000000006,201.29000000000045C535.8600000000006,200.15000000000046,534.7400000000006,198.62000000000046,532.9500000000006,198.42000000000044C526.9600000000006,197.41000000000045,520.9400000000006,196.55000000000044,514.9200000000006,195.83000000000044C513.4200000000006,198.20000000000044,511.90000000000066,200.56000000000043,510.42000000000064,202.94000000000045Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="39" stroke = "#ffffff" fill = "#009966" d="M286.86000000000064,198.26000000000045C284.7500000000006,198.34000000000046,283.2500000000006,199.87000000000046,281.90000000000066,201.31000000000046C285.5600000000007,209.50000000000045,296.14000000000067,210.18000000000046,303.90000000000066,209.21000000000046C306.02000000000066,207.63000000000045,306.23000000000064,204.45000000000047,308.5700000000007,202.95000000000047C307.0700000000007,200.59000000000046,305.7300000000007,198.11000000000047,303.9800000000007,195.94000000000048C298.2300000000007,196.33000000000047,292.5600000000007,197.47000000000048,286.8600000000007,198.26000000000047Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="40" fill = "#009966" d="M81.51000000000022,767.6500000000003C94.18000000000022,764.4000000000003,108.40000000000022,771.0500000000003,114.21000000000022,782.7300000000004C117.98000000000022,790.0300000000003,118.51000000000022,798.9200000000004,115.54000000000022,806.5900000000004C112.11000000000021,815.8200000000004,103.71000000000022,822.9900000000004,94.03000000000021,824.8600000000004C84.02000000000021,827.0300000000003,73.02000000000021,823.3500000000004,66.28000000000021,815.6400000000003C58.700000000000216,807.3300000000004,56.710000000000214,794.5100000000003,61.40000000000021,784.2800000000003C65.01000000000022,776.0000000000003,72.69000000000021,769.6200000000003,81.51000000000022,767.6500000000003Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="41" fill = "#009966" d="M727.5600000000002,767.6400000000003C743.2000000000002,763.4900000000004,760.6000000000001,774.9700000000004,762.9700000000001,790.9700000000004C766.2500000000001,806.3900000000003,754.6800000000002,822.8200000000004,739.0900000000001,825.0200000000003C724.4000000000001,827.9500000000003,708.7500000000001,817.5600000000003,705.6800000000002,802.9100000000003C701.6000000000001,787.7300000000004,712.1800000000002,770.7700000000003,727.5600000000002,767.6400000000003Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="1" stroke = "#ffffff" fill = "#009966" d="M488.5400000000007,132.88000000000042C488.51000000000073,138.73000000000042,488.5500000000007,144.59000000000043,488.5000000000007,150.44000000000042C501.65000000000066,151.63000000000042,514.7800000000007,153.65000000000043,528.0100000000007,153.49000000000044C530.7700000000007,153.45000000000044,533.6300000000007,153.33000000000044,536.2300000000007,152.28000000000043C537.9800000000007,147.98000000000042,539.4200000000008,142.77000000000044,537.6800000000007,138.27000000000044C533.1300000000008,134.98000000000044,527.2600000000008,134.63000000000045,521.8500000000007,134.11000000000044C510.7800000000007,132.99000000000044,499.6500000000007,132.97000000000045,488.5400000000007,132.88000000000045Z"/>
@@ -0,0 +1 @@
<path class="42" onclick="clicked(evt)" fill = "#009966" d="M729.4400000000005,385.6000000000004C743.4900000000005,382.95000000000044,758.4300000000005,392.3500000000004,762.2300000000005,406.1100000000004C766.0100000000004,418.0000000000004,761.0200000000004,431.84000000000043,750.6500000000004,438.7300000000004C739.5500000000004,446.5600000000004,723.1200000000005,445.1100000000004,713.6200000000005,435.3700000000004C703.8000000000004,426.0700000000004,702.0400000000004,409.7900000000004,709.5800000000005,398.5800000000004C713.9900000000005,391.7100000000004,721.3700000000005,386.86000000000035,729.4400000000005,385.60000000000036Z" />
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="43" stroke="#ffffff" fill = "#009966" d="M83.49000000000046,385.59000000000043C97.50000000000047,382.9700000000004,112.41000000000047,392.3500000000004,116.21000000000046,406.07000000000045C120.02000000000046,417.9700000000004,115.03000000000046,431.84000000000043,104.65000000000046,438.7300000000005C93.53000000000046,446.57000000000045,77.06000000000046,445.1000000000005,67.57000000000046,435.32000000000045C57.770000000000465,426.00000000000045,56.050000000000466,409.71000000000043,63.61000000000046,398.52000000000044C68.04000000000046,391.6700000000004,75.42000000000046,386.84000000000043,83.49000000000046,385.59000000000043Z"/>
@@ -0,0 +1 @@
<g transform="translate(330, 580)"><path onclick="clicked(evt)" stroke="#ffffff" fill = "#009966" transform = "scale(0.15, 0.15)" class="44" ontouchstart="onstart(44)" ontouchend="onend(44)" fill = "#ffffff" d="M450.08,360.192c-9.237-8.683-19.84-12.907-29.163-15.211c1.749-7.488,3.264-15.467,4.459-23.915c2.091-14.528,1.557-29.333-1.6-44.053l-26.965-126.272c-4.608-16.299-14.315-28.437-26.432-37.675c0.491-0.619,1.131-1.109,1.6-1.771c6.891-9.899,8.832-22.421,5.355-33.899l-8.021-48c-0.213-1.323-0.555-2.624-1.024-3.883C362.635,10.24,347.957,0,331.744,0H180.235c-16.213,0-30.891,10.24-37.141,27.413l-12.629,47.68c-4.48,12.096-2.773,25.6,4.587,36.181c1.152,1.643,2.581,2.987,3.947,4.395c-11.051,9.173-19.883,20.949-24.235,36.437L88.117,277.013c-3.136,14.635-3.669,29.44-1.6,44.075c1.216,8.448,2.709,16.405,4.48,23.893c-9.301,2.325-19.883,6.549-29.099,15.211c-8.789,8.235-19.243,23.424-19.221,49.899C44.405,445.355,71.157,512,159.989,512h192c88.832,0,115.584-66.645,117.333-102.933C469.323,383.616,458.869,368.427,450.08,360.192z M138.656,467.285c-48.64-10.005-52.992-53.739-53.333-58.219c0-12.224,4.267-16.32,5.675-17.664c3.051-2.923,7.339-4.587,11.243-5.461c5.845,9.237,12.587,16.768,20.096,22.485c0.299,0.277,0.619,0.469,0.896,0.747c1.621,1.536,3.285,2.88,4.971,4.224c1.707,1.323,3.456,2.517,5.248,3.648c1.728,1.109,3.392,2.304,5.205,3.221V467.285z M330.656,469.333H181.323v-46.891c1.856-0.619,3.947-1.28,6.379-1.984c0.512-0.149,1.109-0.32,1.643-0.469c2.24-0.64,4.715-1.323,7.339-1.984c0.96-0.256,1.941-0.512,2.965-0.747c2.944-0.725,6.08-1.429,9.408-2.112c0.619-0.128,1.195-0.277,1.835-0.405c3.904-0.768,8.043-1.472,12.331-2.112c1.152-0.171,2.325-0.32,3.499-0.469c3.371-0.448,6.869-0.832,10.411-1.152c1.387-0.128,2.752-0.256,4.139-0.341c4.8-0.341,9.685-0.597,14.677-0.597c4.949,0,9.813,0.256,14.571,0.597c1.408,0.085,2.773,0.213,4.16,0.341c3.541,0.32,6.997,0.704,10.368,1.152c1.173,0.149,2.368,0.299,3.499,0.469c4.288,0.64,8.448,1.344,12.352,2.133c0.597,0.107,1.131,0.235,1.707,0.363c3.349,0.683,6.549,1.408,9.536,2.133c1.024,0.256,2.027,0.512,3.029,0.768c2.56,0.64,4.971,1.301,7.168,1.92c0.597,0.192,1.301,0.363,1.877,0.533c2.453,0.725,4.587,1.408,6.443,2.005V469.333z M270.112,85.333c-3.264-0.064-5.995-0.043-8.171,0h-11.691c-1.344-0.021-2.795-0.021-4.416,0h-74.027l11.285-42.667h145.195l7.125,42.667H270.112z M373.323,467.285v-47.04c1.813-0.917,3.499-2.155,5.227-3.243c1.685-1.088,3.328-2.219,4.949-3.456c1.728-1.365,3.456-2.709,5.099-4.288c0.171-0.149,0.363-0.277,0.533-0.427c7.744-5.76,14.635-13.419,20.608-22.891c3.755,0.853,8,2.411,11.136,5.355c1.429,1.344,5.781,5.44,5.824,16.555C426.315,413.419,421.963,457.259,373.323,467.285z" /></g>
@@ -0,0 +1 @@
<g transform="translate(412, 580)"><path onclick="clicked(evt)" stroke="#ffffff" fill = "#009966" stroke="#000" transform = "scale(0.15, 0.15)" class="45" ontouchstart="onstart(45)" ontouchend="onend(45)" fill = "#ffffff" d="M450.08,360.192c-9.237-8.683-19.84-12.907-29.163-15.211c1.749-7.488,3.264-15.467,4.459-23.915c2.091-14.528,1.557-29.333-1.6-44.053l-26.965-126.272c-4.608-16.299-14.315-28.437-26.432-37.675c0.491-0.619,1.131-1.109,1.6-1.771c6.891-9.899,8.832-22.421,5.355-33.899l-8.021-48c-0.213-1.323-0.555-2.624-1.024-3.883C362.635,10.24,347.957,0,331.744,0H180.235c-16.213,0-30.891,10.24-37.141,27.413l-12.629,47.68c-4.48,12.096-2.773,25.6,4.587,36.181c1.152,1.643,2.581,2.987,3.947,4.395c-11.051,9.173-19.883,20.949-24.235,36.437L88.117,277.013c-3.136,14.635-3.669,29.44-1.6,44.075c1.216,8.448,2.709,16.405,4.48,23.893c-9.301,2.325-19.883,6.549-29.099,15.211c-8.789,8.235-19.243,23.424-19.221,49.899C44.405,445.355,71.157,512,159.989,512h192c88.832,0,115.584-66.645,117.333-102.933C469.323,383.616,458.869,368.427,450.08,360.192z M138.656,467.285c-48.64-10.005-52.992-53.739-53.333-58.219c0-12.224,4.267-16.32,5.675-17.664c3.051-2.923,7.339-4.587,11.243-5.461c5.845,9.237,12.587,16.768,20.096,22.485c0.299,0.277,0.619,0.469,0.896,0.747c1.621,1.536,3.285,2.88,4.971,4.224c1.707,1.323,3.456,2.517,5.248,3.648c1.728,1.109,3.392,2.304,5.205,3.221V467.285z M330.656,469.333H181.323v-46.891c1.856-0.619,3.947-1.28,6.379-1.984c0.512-0.149,1.109-0.32,1.643-0.469c2.24-0.64,4.715-1.323,7.339-1.984c0.96-0.256,1.941-0.512,2.965-0.747c2.944-0.725,6.08-1.429,9.408-2.112c0.619-0.128,1.195-0.277,1.835-0.405c3.904-0.768,8.043-1.472,12.331-2.112c1.152-0.171,2.325-0.32,3.499-0.469c3.371-0.448,6.869-0.832,10.411-1.152c1.387-0.128,2.752-0.256,4.139-0.341c4.8-0.341,9.685-0.597,14.677-0.597c4.949,0,9.813,0.256,14.571,0.597c1.408,0.085,2.773,0.213,4.16,0.341c3.541,0.32,6.997,0.704,10.368,1.152c1.173,0.149,2.368,0.299,3.499,0.469c4.288,0.64,8.448,1.344,12.352,2.133c0.597,0.107,1.131,0.235,1.707,0.363c3.349,0.683,6.549,1.408,9.536,2.133c1.024,0.256,2.027,0.512,3.029,0.768c2.56,0.64,4.971,1.301,7.168,1.92c0.597,0.192,1.301,0.363,1.877,0.533c2.453,0.725,4.587,1.408,6.443,2.005V469.333z M270.112,85.333c-3.264-0.064-5.995-0.043-8.171,0h-11.691c-1.344-0.021-2.795-0.021-4.416,0h-74.027l11.285-42.667h145.195l7.125,42.667H270.112z M373.323,467.285v-47.04c1.813-0.917,3.499-2.155,5.227-3.243c1.685-1.088,3.328-2.219,4.949-3.456c1.728-1.365,3.456-2.709,5.099-4.288c0.171-0.149,0.363-0.277,0.533-0.427c7.744-5.76,14.635-13.419,20.608-22.891c3.755,0.853,8,2.411,11.136,5.355c1.429,1.344,5.781,5.44,5.824,16.555C426.315,413.419,421.963,457.259,373.323,467.285z" /></g>
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="47" stroke = "#ffffff" fill = "#009966" d="M73.89000000000013,632C74.06000000000013,642.7000000000004,73.44000000000013,658.3400000000004,73.47000000000013,724.0000000000005C73.59000000000013,729.2600000000004,72.83000000000013,734.5200000000004,73.42000000000013,739.7700000000004C74.52000000000012,739.9100000000004,75.62000000000013,740.0700000000004,76.73000000000013,740.2300000000005C78.43000000000013,724.5700000000005,76.78000000000013,708.7600000000004,77.82000000000014,693.0600000000005C77.66000000000014,654.3600000000005,78.32000000000014,615.6400000000006,77.12000000000013,632Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="49" stroke = "#ffffff" fill = "#009966" d="M110.88000000000005,848.8300000000003C103.55000000000005,851.7100000000003,95.64000000000006,853.0800000000003,87.78000000000006,853.2700000000003C87.83000000000006,858.0300000000003,88.54000000000006,862.7700000000003,89.43000000000006,867.4500000000003C93.00000000000006,886.5400000000003,97.27000000000007,905.6200000000002,104.21000000000006,923.8000000000003C105.73000000000006,924.5000000000003,107.17000000000006,925.6000000000003,108.89000000000007,925.7500000000003C113.30000000000007,925.8800000000003,117.99000000000007,926.4800000000004,121.95000000000007,924.1000000000004C126.97000000000007,924.3500000000004,132.57000000000008,922.8900000000003,135.82000000000008,918.8300000000004C138.32000000000008,916.1300000000003,137.30000000000007,912.3000000000004,137.48000000000008,909.0000000000003C137.5300000000001,881.6600000000003,137.35000000000008,854.3200000000004,137.57000000000008,826.9800000000004C131.20000000000007,836.8300000000004,121.44000000000008,844.0200000000003,110.88000000000008,848.8300000000004Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="50" stroke = "#ffffff" fill = "#009966" d="M684.9300000000001,827.2500000000002C684.83,856.5100000000002,684.8800000000001,885.7800000000002,684.9100000000001,915.0400000000002C685.96,921.3000000000002,693.34,924.2700000000002,699.08,924.0200000000002C701.62,923.7000000000002,703.4200000000001,926.2700000000002,706,925.8400000000003C710.23,925.6900000000003,715.97,926.9600000000003,718.57,922.6300000000002C723.59,909.4800000000002,726.95,895.7600000000002,730.0300000000001,882.0500000000002C731.84,872.5200000000002,734.2600000000001,863.0300000000002,734.6100000000001,853.2900000000002C715.0900000000001,853.3800000000002,695.8300000000002,843.4900000000002,684.9300000000002,827.2500000000002Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="51" stroke = "#ffffff" fill = "#009966" d="M90.69000000000051,300.70000000000044C85.06000000000051,303.2800000000004,84.14000000000051,310.11000000000047,82.6800000000005,315.43000000000046C81.0400000000005,329.94000000000045,81.6300000000005,344.6000000000005,81.55000000000051,359.18000000000046C89.39000000000051,358.77000000000044,97.36000000000051,358.61000000000047,105.05000000000051,360.42000000000047C111.25000000000051,361.63000000000045,116.9300000000005,364.50000000000045,122.44000000000051,367.4700000000005C121.75000000000051,350.1400000000005,120.09000000000052,332.87000000000046,118.0400000000005,315.6400000000005C117.44000000000051,311.2600000000005,117.3700000000005,306.8300000000005,117.5000000000005,302.4100000000005C110.1400000000005,295.7900000000005,99.18000000000049,297.3500000000005,90.6900000000005,300.7000000000005Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="52" stroke = "#ffffff" fill = "#009966" d="M704.9500000000005,302.20000000000044C704.8900000000006,306.51000000000045,704.9600000000005,310.84000000000043,704.3400000000005,315.13000000000045C702.2400000000005,332.55000000000047,700.6900000000005,350.0300000000004,699.8000000000005,367.5400000000004C704.9100000000005,364.7300000000004,710.2000000000005,362.08000000000044,715.9200000000005,360.7800000000004C724.0200000000006,358.57000000000045,732.5100000000006,358.77000000000044,740.8300000000005,359.1600000000004C740.7800000000005,345.45000000000044,741.1100000000005,331.71000000000043,740.0000000000005,318.02000000000044C739.5400000000004,313.4700000000004,738.0900000000005,309.0500000000004,736.2000000000005,304.9100000000004C734.0500000000005,300.7200000000004,729.0900000000005,299.5500000000004,724.8700000000005,298.6900000000004C718.1600000000004,296.9300000000004,710.4200000000004,297.6200000000004,704.9500000000005,302.2000000000004Z"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="2" stroke = "#ffffff" fill = "#009966" d = "M298.9900000000007,133.96000000000043C292.9800000000007,134.56000000000043,286.3500000000007,134.62000000000043,281.2800000000007,138.32000000000045C279.6100000000007,142.82000000000045,281.0300000000007,147.97000000000045,282.75000000000074,152.27000000000044C287.60000000000076,154.06000000000043,292.88000000000073,153.38000000000045,297.94000000000074,153.45000000000044C308.81000000000074,152.81000000000046,319.6400000000007,151.50000000000045,330.48000000000076,150.46000000000043C330.44000000000074,144.59000000000043,330.54000000000076,138.71000000000043,330.41000000000076,132.84000000000043C319.94000000000074,133.27000000000044,309.43000000000075,132.82000000000042,298.99000000000075,133.96000000000043Z"/>
@@ -0,0 +1 @@
<g onclick="Foo.ChangeWash()" fill="#fff" transform ="translate(750, 500)"><g onclick="Foo.ChangeWash()" transform = "scale(0.15, 0.15)" ><path onclick="Foo.ChangeWash()" d = "M316.041,0c-49.416,0-94.503,26.334-118.987,68.276c-76.645,0.416-138.871,62.888-138.871,139.627 c0,12.853,10.42,23.273,23.273,23.273h232.727c12.853,0,23.273-10.42,23.273-23.273c0-59.473-37.378-110.372-89.87-130.462 c17.031-19.312,41.789-30.895,68.456-30.895c50.306,0,91.232,40.937,91.232,91.255v350.926c0,12.853,10.42,23.273,23.273,23.273 c12.853,0,23.273-10.42,23.273-23.273V137.801C453.818,61.817,392.012,0,316.041,0z" fill = "
@@ -0,0 +1 @@
<path onclick="Foo.ChangeRezina(0)" transform="scale(0.2, 0.2)" fill="#006DF0" d="M501.961,245.961h-42.423l10.335-10.335c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0 l-24.532,24.534h-43.89l30.306-30.306c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0l-44.503,44.505h-78.62 l55.593-55.593h62.937c5.544,0,10.039-4.496,10.039-10.039c0-5.544-4.496-10.039-10.039-10.039h-42.858l31.035-31.035h62.936 c5.544,0,10.039-4.496,10.039-10.039c0-5.544-4.496-10.039-10.039-10.039h-42.857l29.997-29.997c3.92-3.92,3.92-10.277,0-14.198 c-3.921-3.919-10.276-3.919-14.198,0l-29.997,29.997V62.12c0-5.544-4.496-10.039-10.039-10.039s-10.039,4.496-10.039,10.039 v62.936l-31.035,31.035v-42.858c0-5.544-4.496-10.039-10.039-10.039s-10.039,4.496-10.039,10.039v62.937l-55.593,55.593v-78.62 l44.504-44.503c3.92-3.92,3.92-10.277,0-14.198c-3.919-3.917-10.274-3.919-14.198,0l-30.305,30.306v-43.89l44.504-44.503 c3.92-3.92,3.92-10.277,0-14.198c-3.919-3.917-10.274-3.919-14.198,0l-30.305,30.306V10.039C266.039,4.496,261.544,0,256,0 c-5.544,0-10.039,4.496-10.039,10.039v42.423l-30.306-30.306c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198 l44.505,44.503v43.89l-30.306-30.306c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198l44.505,44.503v78.62 l-55.593-55.593v-62.937c0-5.544-4.496-10.039-10.039-10.039c-5.544,0-10.039,4.496-10.039,10.039v42.858l-31.035-31.035V62.12 c0-5.544-4.496-10.039-10.039-10.039c-5.544,0-10.039,4.496-10.039,10.039v42.857L89.178,74.98 c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198l29.997,29.997H62.12c-5.544,0-10.039,4.496-10.039,10.039 c0,5.544,4.496,10.039,10.039,10.039h62.936l31.035,31.035h-42.858c-5.544,0-10.039,4.496-10.039,10.039 c0,5.544,4.496,10.039,10.039,10.039h62.937l55.593,55.593h-78.62l-44.503-44.504c-3.919-3.918-10.274-3.919-14.198,0 c-3.92,3.92-3.92,10.277,0,14.198l30.306,30.305h-43.89l-44.503-44.504c-3.92-3.918-10.275-3.919-14.198,0 c-3.92,3.92-3.92,10.277,0,14.198l30.306,30.305H10.039C4.496,245.961,0,250.456,0,256c0,5.544,4.496,10.039,10.039,10.039h42.423 l-30.306,30.306c-3.92,3.92-3.92,10.277,0,14.198c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l44.504-44.505h43.89 l-30.306,30.306c-3.92,3.92-3.92,10.277,0,14.198c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l44.504-44.505h78.62 l-55.593,55.593h-62.937c-5.544,0-10.039,4.496-10.039,10.039s4.496,10.039,10.039,10.039h42.858l-31.035,31.035H62.12 c-5.544,0-10.039,4.496-10.039,10.039s4.496,10.039,10.039,10.039h42.857L74.98,422.822c-3.92,3.92-3.92,10.277,0,14.198 c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l29.997-29.997v42.857c0,5.544,4.496,10.039,10.039,10.039 s10.039-4.496,10.039-10.039v-62.936l31.035-31.035v42.858c0,5.544,4.496,10.039,10.039,10.039 c5.544,0,10.039-4.496,10.039-10.039v-62.937l55.594-55.593v78.62l-44.504,44.503c-3.92,3.92-3.92,10.277,0,14.198 c3.921,3.918,10.276,3.92,14.198,0l30.305-30.306v43.89l-44.504,44.503c-3.92,3.92-3.92,10.277,0,14.198 c3.921,3.919,10.276,3.92,14.198,0l30.305-30.306v42.423c0,5.544,4.496,10.039,10.039,10.039c5.544,0,10.039-4.496,10.039-10.039 v-42.423l30.306,30.306c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198 l-44.504-44.503v-43.89l30.306,30.306c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94 c3.92-3.92,3.92-10.277,0-14.198l-44.504-44.503v-78.62l55.593,55.593v62.937c0,5.544,4.496,10.039,10.039,10.039 s10.039-4.496,10.039-10.039v-42.858l31.035,31.035v62.936c0,5.544,4.496,10.039,10.039,10.039s10.039-4.496,10.039-10.039 v-42.857l29.997,29.997c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198 l-29.997-29.997h42.857c5.544,0,10.039-4.496,10.039-10.039s-4.496-10.039-10.039-10.039h-62.936l-31.035-31.035h42.858 c5.544,0,10.039-4.496,10.039-10.039s-4.496-10.039-10.039-10.039H335.83l-55.592-55.593h78.62l44.503,44.504 c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198l-30.305-30.305h43.89 l44.503,44.504c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198l-30.305-30.305h42.423 c5.544,0,10.039-4.496,10.039-10.039C512,250.456,507.504,245.961,501.961,245.961z" />
@@ -0,0 +1 @@
<path ontouchstart="Foo.ChangeRezinaOnStart(0)" ontouchend="Foo.ChangeRezinaOnEnd(0)" transform="scale(0.2, 0.2)" fill="#FFDA44" d="M497.78,326.334l-51.395-70.808l51.395-70.804c1.711-2.475,2.088-5.232,1.14-8.276c-0.767-2.859-2.669-4.762-5.712-5.712 l-83.363-27.408V55.959c0-3.044-1.242-5.519-3.721-7.421c-2.85-1.902-5.615-2.284-8.274-1.143l-83.367,26.836L263.092,3.427 C261.378,1.143,258.905,0,255.667,0c-3.234,0-5.708,1.146-7.422,3.427l-51.394,70.805l-83.368-26.836 c-2.662-1.142-5.424-0.76-8.28,1.143c-2.474,1.903-3.711,4.377-3.711,7.421v87.366l-83.367,27.408 c-3.044,0.953-4.947,2.856-5.708,5.712c-0.95,3.044-0.571,5.802,1.143,8.276l51.391,70.804L13.56,326.334 c-1.714,2.282-2.093,5.041-1.143,8.278c0.76,2.847,2.664,4.753,5.708,5.712l83.367,27.407v87.364c0,3.043,1.237,5.521,3.711,7.423 c2.856,1.903,5.618,2.283,8.28,1.144l83.368-26.837l51.394,70.805c1.902,2.471,4.377,3.71,7.422,3.71s5.522-1.239,7.424-3.71 l51.391-70.805l83.371,26.837c2.659,1.143,5.421,0.76,8.271-1.144c2.479-1.902,3.721-4.38,3.721-7.423v-87.364l83.363-27.407 c3.043-0.955,4.945-2.861,5.712-5.712C499.875,331.375,499.491,328.616,497.78,326.334z" />
@@ -0,0 +1 @@
<path onclick="Foo.ChangeRezina(1)" transform="scale(0.2, 0.2)" fill="#006DF0" d="M501.961,245.961h-42.423l10.335-10.335c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0 l-24.532,24.534h-43.89l30.306-30.306c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0l-44.503,44.505h-78.62 l55.593-55.593h62.937c5.544,0,10.039-4.496,10.039-10.039c0-5.544-4.496-10.039-10.039-10.039h-42.858l31.035-31.035h62.936 c5.544,0,10.039-4.496,10.039-10.039c0-5.544-4.496-10.039-10.039-10.039h-42.857l29.997-29.997c3.92-3.92,3.92-10.277,0-14.198 c-3.921-3.919-10.276-3.919-14.198,0l-29.997,29.997V62.12c0-5.544-4.496-10.039-10.039-10.039s-10.039,4.496-10.039,10.039 v62.936l-31.035,31.035v-42.858c0-5.544-4.496-10.039-10.039-10.039s-10.039,4.496-10.039,10.039v62.937l-55.593,55.593v-78.62 l44.504-44.503c3.92-3.92,3.92-10.277,0-14.198c-3.919-3.917-10.274-3.919-14.198,0l-30.305,30.306v-43.89l44.504-44.503 c3.92-3.92,3.92-10.277,0-14.198c-3.919-3.917-10.274-3.919-14.198,0l-30.305,30.306V10.039C266.039,4.496,261.544,0,256,0 c-5.544,0-10.039,4.496-10.039,10.039v42.423l-30.306-30.306c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198 l44.505,44.503v43.89l-30.306-30.306c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198l44.505,44.503v78.62 l-55.593-55.593v-62.937c0-5.544-4.496-10.039-10.039-10.039c-5.544,0-10.039,4.496-10.039,10.039v42.858l-31.035-31.035V62.12 c0-5.544-4.496-10.039-10.039-10.039c-5.544,0-10.039,4.496-10.039,10.039v42.857L89.178,74.98 c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198l29.997,29.997H62.12c-5.544,0-10.039,4.496-10.039,10.039 c0,5.544,4.496,10.039,10.039,10.039h62.936l31.035,31.035h-42.858c-5.544,0-10.039,4.496-10.039,10.039 c0,5.544,4.496,10.039,10.039,10.039h62.937l55.593,55.593h-78.62l-44.503-44.504c-3.919-3.918-10.274-3.919-14.198,0 c-3.92,3.92-3.92,10.277,0,14.198l30.306,30.305h-43.89l-44.503-44.504c-3.92-3.918-10.275-3.919-14.198,0 c-3.92,3.92-3.92,10.277,0,14.198l30.306,30.305H10.039C4.496,245.961,0,250.456,0,256c0,5.544,4.496,10.039,10.039,10.039h42.423 l-30.306,30.306c-3.92,3.92-3.92,10.277,0,14.198c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l44.504-44.505h43.89 l-30.306,30.306c-3.92,3.92-3.92,10.277,0,14.198c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l44.504-44.505h78.62 l-55.593,55.593h-62.937c-5.544,0-10.039,4.496-10.039,10.039s4.496,10.039,10.039,10.039h42.858l-31.035,31.035H62.12 c-5.544,0-10.039,4.496-10.039,10.039s4.496,10.039,10.039,10.039h42.857L74.98,422.822c-3.92,3.92-3.92,10.277,0,14.198 c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l29.997-29.997v42.857c0,5.544,4.496,10.039,10.039,10.039 s10.039-4.496,10.039-10.039v-62.936l31.035-31.035v42.858c0,5.544,4.496,10.039,10.039,10.039 c5.544,0,10.039-4.496,10.039-10.039v-62.937l55.594-55.593v78.62l-44.504,44.503c-3.92,3.92-3.92,10.277,0,14.198 c3.921,3.918,10.276,3.92,14.198,0l30.305-30.306v43.89l-44.504,44.503c-3.92,3.92-3.92,10.277,0,14.198 c3.921,3.919,10.276,3.92,14.198,0l30.305-30.306v42.423c0,5.544,4.496,10.039,10.039,10.039c5.544,0,10.039-4.496,10.039-10.039 v-42.423l30.306,30.306c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198 l-44.504-44.503v-43.89l30.306,30.306c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94 c3.92-3.92,3.92-10.277,0-14.198l-44.504-44.503v-78.62l55.593,55.593v62.937c0,5.544,4.496,10.039,10.039,10.039 s10.039-4.496,10.039-10.039v-42.858l31.035,31.035v62.936c0,5.544,4.496,10.039,10.039,10.039s10.039-4.496,10.039-10.039 v-42.857l29.997,29.997c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198 l-29.997-29.997h42.857c5.544,0,10.039-4.496,10.039-10.039s-4.496-10.039-10.039-10.039h-62.936l-31.035-31.035h42.858 c5.544,0,10.039-4.496,10.039-10.039s-4.496-10.039-10.039-10.039H335.83l-55.592-55.593h78.62l44.503,44.504 c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198l-30.305-30.305h43.89 l44.503,44.504c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198l-30.305-30.305h42.423 c5.544,0,10.039-4.496,10.039-10.039C512,250.456,507.504,245.961,501.961,245.961z" />
@@ -0,0 +1 @@
<path ontouchstart="Foo.ChangeRezinaOnStart(1)" ontouchend="Foo.ChangeRezinaOnEnd(1)" transform="scale(0.2, 0.2)" fill="#FFDA44" d="M497.78,326.334l-51.395-70.808l51.395-70.804c1.711-2.475,2.088-5.232,1.14-8.276c-0.767-2.859-2.669-4.762-5.712-5.712 l-83.363-27.408V55.959c0-3.044-1.242-5.519-3.721-7.421c-2.85-1.902-5.615-2.284-8.274-1.143l-83.367,26.836L263.092,3.427 C261.378,1.143,258.905,0,255.667,0c-3.234,0-5.708,1.146-7.422,3.427l-51.394,70.805l-83.368-26.836 c-2.662-1.142-5.424-0.76-8.28,1.143c-2.474,1.903-3.711,4.377-3.711,7.421v87.366l-83.367,27.408 c-3.044,0.953-4.947,2.856-5.708,5.712c-0.95,3.044-0.571,5.802,1.143,8.276l51.391,70.804L13.56,326.334 c-1.714,2.282-2.093,5.041-1.143,8.278c0.76,2.847,2.664,4.753,5.708,5.712l83.367,27.407v87.364c0,3.043,1.237,5.521,3.711,7.423 c2.856,1.903,5.618,2.283,8.28,1.144l83.368-26.837l51.394,70.805c1.902,2.471,4.377,3.71,7.422,3.71s5.522-1.239,7.424-3.71 l51.391-70.805l83.371,26.837c2.659,1.143,5.421,0.76,8.271-1.144c2.479-1.902,3.721-4.38,3.721-7.423v-87.364l83.363-27.407 c3.043-0.955,4.945-2.861,5.712-5.712C499.875,331.375,499.491,328.616,497.78,326.334z" />
@@ -0,0 +1 @@
<path onclick="Foo.ChangeRezina(2)" transform="scale(0.2, 0.2)" fill="#006DF0" d="M501.961,245.961h-42.423l10.335-10.335c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0 l-24.532,24.534h-43.89l30.306-30.306c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0l-44.503,44.505h-78.62 l55.593-55.593h62.937c5.544,0,10.039-4.496,10.039-10.039c0-5.544-4.496-10.039-10.039-10.039h-42.858l31.035-31.035h62.936 c5.544,0,10.039-4.496,10.039-10.039c0-5.544-4.496-10.039-10.039-10.039h-42.857l29.997-29.997c3.92-3.92,3.92-10.277,0-14.198 c-3.921-3.919-10.276-3.919-14.198,0l-29.997,29.997V62.12c0-5.544-4.496-10.039-10.039-10.039s-10.039,4.496-10.039,10.039 v62.936l-31.035,31.035v-42.858c0-5.544-4.496-10.039-10.039-10.039s-10.039,4.496-10.039,10.039v62.937l-55.593,55.593v-78.62 l44.504-44.503c3.92-3.92,3.92-10.277,0-14.198c-3.919-3.917-10.274-3.919-14.198,0l-30.305,30.306v-43.89l44.504-44.503 c3.92-3.92,3.92-10.277,0-14.198c-3.919-3.917-10.274-3.919-14.198,0l-30.305,30.306V10.039C266.039,4.496,261.544,0,256,0 c-5.544,0-10.039,4.496-10.039,10.039v42.423l-30.306-30.306c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198 l44.505,44.503v43.89l-30.306-30.306c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198l44.505,44.503v78.62 l-55.593-55.593v-62.937c0-5.544-4.496-10.039-10.039-10.039c-5.544,0-10.039,4.496-10.039,10.039v42.858l-31.035-31.035V62.12 c0-5.544-4.496-10.039-10.039-10.039c-5.544,0-10.039,4.496-10.039,10.039v42.857L89.178,74.98 c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198l29.997,29.997H62.12c-5.544,0-10.039,4.496-10.039,10.039 c0,5.544,4.496,10.039,10.039,10.039h62.936l31.035,31.035h-42.858c-5.544,0-10.039,4.496-10.039,10.039 c0,5.544,4.496,10.039,10.039,10.039h62.937l55.593,55.593h-78.62l-44.503-44.504c-3.919-3.918-10.274-3.919-14.198,0 c-3.92,3.92-3.92,10.277,0,14.198l30.306,30.305h-43.89l-44.503-44.504c-3.92-3.918-10.275-3.919-14.198,0 c-3.92,3.92-3.92,10.277,0,14.198l30.306,30.305H10.039C4.496,245.961,0,250.456,0,256c0,5.544,4.496,10.039,10.039,10.039h42.423 l-30.306,30.306c-3.92,3.92-3.92,10.277,0,14.198c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l44.504-44.505h43.89 l-30.306,30.306c-3.92,3.92-3.92,10.277,0,14.198c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l44.504-44.505h78.62 l-55.593,55.593h-62.937c-5.544,0-10.039,4.496-10.039,10.039s4.496,10.039,10.039,10.039h42.858l-31.035,31.035H62.12 c-5.544,0-10.039,4.496-10.039,10.039s4.496,10.039,10.039,10.039h42.857L74.98,422.822c-3.92,3.92-3.92,10.277,0,14.198 c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l29.997-29.997v42.857c0,5.544,4.496,10.039,10.039,10.039 s10.039-4.496,10.039-10.039v-62.936l31.035-31.035v42.858c0,5.544,4.496,10.039,10.039,10.039 c5.544,0,10.039-4.496,10.039-10.039v-62.937l55.594-55.593v78.62l-44.504,44.503c-3.92,3.92-3.92,10.277,0,14.198 c3.921,3.918,10.276,3.92,14.198,0l30.305-30.306v43.89l-44.504,44.503c-3.92,3.92-3.92,10.277,0,14.198 c3.921,3.919,10.276,3.92,14.198,0l30.305-30.306v42.423c0,5.544,4.496,10.039,10.039,10.039c5.544,0,10.039-4.496,10.039-10.039 v-42.423l30.306,30.306c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198 l-44.504-44.503v-43.89l30.306,30.306c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94 c3.92-3.92,3.92-10.277,0-14.198l-44.504-44.503v-78.62l55.593,55.593v62.937c0,5.544,4.496,10.039,10.039,10.039 s10.039-4.496,10.039-10.039v-42.858l31.035,31.035v62.936c0,5.544,4.496,10.039,10.039,10.039s10.039-4.496,10.039-10.039 v-42.857l29.997,29.997c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198 l-29.997-29.997h42.857c5.544,0,10.039-4.496,10.039-10.039s-4.496-10.039-10.039-10.039h-62.936l-31.035-31.035h42.858 c5.544,0,10.039-4.496,10.039-10.039s-4.496-10.039-10.039-10.039H335.83l-55.592-55.593h78.62l44.503,44.504 c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198l-30.305-30.305h43.89 l44.503,44.504c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198l-30.305-30.305h42.423 c5.544,0,10.039-4.496,10.039-10.039C512,250.456,507.504,245.961,501.961,245.961z" />
@@ -0,0 +1 @@
<path ontouchstart="Foo.ChangeRezinaOnStart(2)" ontouchend="Foo.ChangeRezinaOnEnd(2)" transform="scale(0.2, 0.2)" fill="#FFDA44" d="M497.78,326.334l-51.395-70.808l51.395-70.804c1.711-2.475,2.088-5.232,1.14-8.276c-0.767-2.859-2.669-4.762-5.712-5.712 l-83.363-27.408V55.959c0-3.044-1.242-5.519-3.721-7.421c-2.85-1.902-5.615-2.284-8.274-1.143l-83.367,26.836L263.092,3.427 C261.378,1.143,258.905,0,255.667,0c-3.234,0-5.708,1.146-7.422,3.427l-51.394,70.805l-83.368-26.836 c-2.662-1.142-5.424-0.76-8.28,1.143c-2.474,1.903-3.711,4.377-3.711,7.421v87.366l-83.367,27.408 c-3.044,0.953-4.947,2.856-5.708,5.712c-0.95,3.044-0.571,5.802,1.143,8.276l51.391,70.804L13.56,326.334 c-1.714,2.282-2.093,5.041-1.143,8.278c0.76,2.847,2.664,4.753,5.708,5.712l83.367,27.407v87.364c0,3.043,1.237,5.521,3.711,7.423 c2.856,1.903,5.618,2.283,8.28,1.144l83.368-26.837l51.394,70.805c1.902,2.471,4.377,3.71,7.422,3.71s5.522-1.239,7.424-3.71 l51.391-70.805l83.371,26.837c2.659,1.143,5.421,0.76,8.271-1.144c2.479-1.902,3.721-4.38,3.721-7.423v-87.364l83.363-27.407 c3.043-0.955,4.945-2.861,5.712-5.712C499.875,331.375,499.491,328.616,497.78,326.334z" />
@@ -0,0 +1 @@
<path onclick="Foo.ChangeRezina(3)" transform="scale(0.2, 0.2)" fill="#006DF0" d="M501.961,245.961h-42.423l10.335-10.335c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0 l-24.532,24.534h-43.89l30.306-30.306c3.92-3.92,3.92-10.277,0-14.198c-3.921-3.919-10.276-3.919-14.198,0l-44.503,44.505h-78.62 l55.593-55.593h62.937c5.544,0,10.039-4.496,10.039-10.039c0-5.544-4.496-10.039-10.039-10.039h-42.858l31.035-31.035h62.936 c5.544,0,10.039-4.496,10.039-10.039c0-5.544-4.496-10.039-10.039-10.039h-42.857l29.997-29.997c3.92-3.92,3.92-10.277,0-14.198 c-3.921-3.919-10.276-3.919-14.198,0l-29.997,29.997V62.12c0-5.544-4.496-10.039-10.039-10.039s-10.039,4.496-10.039,10.039 v62.936l-31.035,31.035v-42.858c0-5.544-4.496-10.039-10.039-10.039s-10.039,4.496-10.039,10.039v62.937l-55.593,55.593v-78.62 l44.504-44.503c3.92-3.92,3.92-10.277,0-14.198c-3.919-3.917-10.274-3.919-14.198,0l-30.305,30.306v-43.89l44.504-44.503 c3.92-3.92,3.92-10.277,0-14.198c-3.919-3.917-10.274-3.919-14.198,0l-30.305,30.306V10.039C266.039,4.496,261.544,0,256,0 c-5.544,0-10.039,4.496-10.039,10.039v42.423l-30.306-30.306c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198 l44.505,44.503v43.89l-30.306-30.306c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198l44.505,44.503v78.62 l-55.593-55.593v-62.937c0-5.544-4.496-10.039-10.039-10.039c-5.544,0-10.039,4.496-10.039,10.039v42.858l-31.035-31.035V62.12 c0-5.544-4.496-10.039-10.039-10.039c-5.544,0-10.039,4.496-10.039,10.039v42.857L89.178,74.98 c-3.921-3.919-10.276-3.919-14.198,0c-3.92,3.92-3.92,10.277,0,14.198l29.997,29.997H62.12c-5.544,0-10.039,4.496-10.039,10.039 c0,5.544,4.496,10.039,10.039,10.039h62.936l31.035,31.035h-42.858c-5.544,0-10.039,4.496-10.039,10.039 c0,5.544,4.496,10.039,10.039,10.039h62.937l55.593,55.593h-78.62l-44.503-44.504c-3.919-3.918-10.274-3.919-14.198,0 c-3.92,3.92-3.92,10.277,0,14.198l30.306,30.305h-43.89l-44.503-44.504c-3.92-3.918-10.275-3.919-14.198,0 c-3.92,3.92-3.92,10.277,0,14.198l30.306,30.305H10.039C4.496,245.961,0,250.456,0,256c0,5.544,4.496,10.039,10.039,10.039h42.423 l-30.306,30.306c-3.92,3.92-3.92,10.277,0,14.198c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l44.504-44.505h43.89 l-30.306,30.306c-3.92,3.92-3.92,10.277,0,14.198c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l44.504-44.505h78.62 l-55.593,55.593h-62.937c-5.544,0-10.039,4.496-10.039,10.039s4.496,10.039,10.039,10.039h42.858l-31.035,31.035H62.12 c-5.544,0-10.039,4.496-10.039,10.039s4.496,10.039,10.039,10.039h42.857L74.98,422.822c-3.92,3.92-3.92,10.277,0,14.198 c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94l29.997-29.997v42.857c0,5.544,4.496,10.039,10.039,10.039 s10.039-4.496,10.039-10.039v-62.936l31.035-31.035v42.858c0,5.544,4.496,10.039,10.039,10.039 c5.544,0,10.039-4.496,10.039-10.039v-62.937l55.594-55.593v78.62l-44.504,44.503c-3.92,3.92-3.92,10.277,0,14.198 c3.921,3.918,10.276,3.92,14.198,0l30.305-30.306v43.89l-44.504,44.503c-3.92,3.92-3.92,10.277,0,14.198 c3.921,3.919,10.276,3.92,14.198,0l30.305-30.306v42.423c0,5.544,4.496,10.039,10.039,10.039c5.544,0,10.039-4.496,10.039-10.039 v-42.423l30.306,30.306c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198 l-44.504-44.503v-43.89l30.306,30.306c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94 c3.92-3.92,3.92-10.277,0-14.198l-44.504-44.503v-78.62l55.593,55.593v62.937c0,5.544,4.496,10.039,10.039,10.039 s10.039-4.496,10.039-10.039v-42.858l31.035,31.035v62.936c0,5.544,4.496,10.039,10.039,10.039s10.039-4.496,10.039-10.039 v-42.857l29.997,29.997c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198 l-29.997-29.997h42.857c5.544,0,10.039-4.496,10.039-10.039s-4.496-10.039-10.039-10.039h-62.936l-31.035-31.035h42.858 c5.544,0,10.039-4.496,10.039-10.039s-4.496-10.039-10.039-10.039H335.83l-55.592-55.593h78.62l44.503,44.504 c1.961,1.96,4.53,2.94,7.099,2.94c2.569,0,5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198l-30.305-30.305h43.89 l44.503,44.504c1.961,1.96,4.53,2.94,7.099,2.94s5.138-0.981,7.099-2.94c3.92-3.92,3.92-10.277,0-14.198l-30.305-30.305h42.423 c5.544,0,10.039-4.496,10.039-10.039C512,250.456,507.504,245.961,501.961,245.961z" />
@@ -0,0 +1 @@
<path ontouchstart="Foo.ChangeRezinaOnStart(3)" ontouchend="Foo.ChangeRezinaOnEnd(3)" transform="scale(0.2, 0.2)" fill="#FFDA44" d="M497.78,326.334l-51.395-70.808l51.395-70.804c1.711-2.475,2.088-5.232,1.14-8.276c-0.767-2.859-2.669-4.762-5.712-5.712 l-83.363-27.408V55.959c0-3.044-1.242-5.519-3.721-7.421c-2.85-1.902-5.615-2.284-8.274-1.143l-83.367,26.836L263.092,3.427 C261.378,1.143,258.905,0,255.667,0c-3.234,0-5.708,1.146-7.422,3.427l-51.394,70.805l-83.368-26.836 c-2.662-1.142-5.424-0.76-8.28,1.143c-2.474,1.903-3.711,4.377-3.711,7.421v87.366l-83.367,27.408 c-3.044,0.953-4.947,2.856-5.708,5.712c-0.95,3.044-0.571,5.802,1.143,8.276l51.391,70.804L13.56,326.334 c-1.714,2.282-2.093,5.041-1.143,8.278c0.76,2.847,2.664,4.753,5.708,5.712l83.367,27.407v87.364c0,3.043,1.237,5.521,3.711,7.423 c2.856,1.903,5.618,2.283,8.28,1.144l83.368-26.837l51.394,70.805c1.902,2.471,4.377,3.71,7.422,3.71s5.522-1.239,7.424-3.71 l51.391-70.805l83.371,26.837c2.659,1.143,5.421,0.76,8.271-1.144c2.479-1.902,3.721-4.38,3.721-7.423v-87.364l83.363-27.407 c3.043-0.955,4.945-2.861,5.712-5.712C499.875,331.375,499.491,328.616,497.78,326.334z" />
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 38 KiB

@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="4" stroke = "#ffffff" fill = "#009966" d="M348.89 311.89c-0.45 3.65-2.7 7.43-6.7 7.77-13.83 1.12-27.49 3.62-41.18 5.74-.29 44.27-.15 88.57.92 132.82 13.5-11.13 30.24-17.37 47.1-21.35 20.59-5.07 41.92-6.14 63.05-5.95 20.5-.48 41.12 1.42 61.05 6.31 16.36 3.98 32.52 10.23 45.67 21.01.27-17.73.86-35.44.68-53.18.54-26.55.35-53.11.27-79.67-13.62-2.02-27.18-4.64-40.94-5.67-4.23-.25-6.86-4.24-6.99-8.2-1.14.83-2.31 1.81-3.81 1.64l-114.06.04c-1.81.14-3.52-.4-5.06-1.31"/>
@@ -0,0 +1 @@
</g><path fill = "#C0C0C0" d="M352.2200000000006,295.44000000000045C352.1500000000006,299.89000000000044,352.1700000000006,304.3500000000005,352.1900000000006,308.81000000000046C390.92000000000064,308.88000000000045,429.6500000000006,308.76000000000045,468.3800000000006,308.87000000000046C468.49000000000063,304.32000000000045,468.6300000000006,299.77000000000044,468.2600000000006,295.2300000000005C430.6600000000006,284.13000000000045,389.6400000000006,283.0200000000005,352.2200000000006,295.44000000000045Z" /><path class="0" ontouchstart="onstart(0)" ontouchend="onend(0)" fill = "#ffffff" d="M279.1300000000006,119.04000000000042C278.11000000000064,124.02000000000042,278.4100000000006,129.1700000000004,278.8800000000006,134.20000000000041C283.79000000000065,131.44000000000042,289.3900000000006,130.3400000000004,294.9600000000006,129.94000000000042C302.93000000000063,129.02000000000044,310.9600000000006,128.81000000000043,318.9800000000006,128.47000000000043H489.0300000000006C502.3500000000006,128.35000000000042,515.7000000000006,128.84000000000043,528.9200000000006,130.51000000000042C532.8500000000006,131.01000000000042,536.6200000000007,132.35000000000042,540.1200000000007,134.20000000000041C540.5900000000007,129.1800000000004,540.8500000000007,124.06000000000041,539.9100000000007,119.08000000000041C536.6800000000006,118.20000000000041,533.4100000000007,117.4600000000004,530.0700000000006,117.23000000000042C511.7100000000006,115.90000000000042,493.3200000000006,115.43000000000042,474.92000000000064,115.53000000000041H400.97000000000065C368.97000000000065,115.75000000000041,336.95000000000067,114.95000000000041,304.97000000000065,116.25000000000041C296.34000000000066,116.95000000000041,287.52000000000066,116.59000000000042,279.1300000000007,119.04000000000042Z" /><path class="0" ontouchstart="onstart(0)" ontouchend="onend(0)" fill = "#ffffff" d="M290.1600000000006,88.97000000000043C287.4800000000006,94.70000000000043,284.1100000000006,100.09000000000043,281.6300000000006,105.93000000000043C280.5700000000006,108.86000000000044,279.6600000000006,111.84000000000043,278.49000000000063,114.73000000000043C281.9400000000006,113.99000000000044,285.41000000000065,113.28000000000043,288.9500000000006,113.07000000000043C303.9500000000006,112.08000000000044,318.9700000000006,111.34000000000043,334.0100000000006,111.47000000000044H455.9700000000006C478.3400000000006,111.55000000000044,500.7300000000006,111.03000000000044,523.0600000000006,112.64000000000044C528.9200000000006,112.91000000000044,534.8000000000006,113.32000000000045,540.5200000000007,114.70000000000044C537.3700000000007,105.78000000000044,533.2500000000007,97.29000000000045,528.9200000000006,88.89000000000044C449.34000000000066,88.93000000000045,369.7500000000007,88.77000000000044,290.16000000000065,88.97000000000044Z" />
@@ -0,0 +1 @@
<path class="52" ontouchstart="onstart(52)" ontouchend="onend(52)" fill = "#ffffff" d="M704.9500000000005,302.20000000000044C704.8900000000006,306.51000000000045,704.9600000000005,310.84000000000043,704.3400000000005,315.13000000000045C702.2400000000005,332.55000000000047,700.6900000000005,350.0300000000004,699.8000000000005,367.5400000000004C704.9100000000005,364.7300000000004,710.2000000000005,362.08000000000044,715.9200000000005,360.7800000000004C724.0200000000006,358.57000000000045,732.5100000000006,358.77000000000044,740.8300000000005,359.1600000000004C740.7800000000005,345.45000000000044,741.1100000000005,331.71000000000043,740.0000000000005,318.02000000000044C739.5400000000004,313.4700000000004,738.0900000000005,309.0500000000004,736.2000000000005,304.9100000000004C734.0500000000005,300.7200000000004,729.0900000000005,299.5500000000004,724.8700000000005,298.6900000000004C718.1600000000004,296.9300000000004,710.4200000000004,297.6200000000004,704.9500000000005,302.2000000000004Z" />
@@ -0,0 +1 @@
<path class="51" ontouchstart="onstart(51)" ontouchend="onend(51)" fill = "#ffffff" d="M90.69000000000051,300.70000000000044C85.06000000000051,303.2800000000004,84.14000000000051,310.11000000000047,82.6800000000005,315.43000000000046C81.0400000000005,329.94000000000045,81.6300000000005,344.6000000000005,81.55000000000051,359.18000000000046C89.39000000000051,358.77000000000044,97.36000000000051,358.61000000000047,105.05000000000051,360.42000000000047C111.25000000000051,361.63000000000045,116.9300000000005,364.50000000000045,122.44000000000051,367.4700000000005C121.75000000000051,350.1400000000005,120.09000000000052,332.87000000000046,118.0400000000005,315.6400000000005C117.44000000000051,311.2600000000005,117.3700000000005,306.8300000000005,117.5000000000005,302.4100000000005C110.1400000000005,295.7900000000005,99.18000000000049,297.3500000000005,90.6900000000005,300.7000000000005Z" />
@@ -0,0 +1 @@
<path fill = "#C0C0C0" d="M684.1800000000005,309.9200000000004C684.0400000000005,315.9500000000004,684.7600000000006,321.96000000000043,684.5100000000006,327.9900000000004C684.6600000000005,330.1300000000004,684.0300000000005,332.6700000000004,685.5000000000006,334.4800000000004C688.6800000000005,337.1600000000004,692.9200000000005,337.8600000000004,696.9400000000006,338.20000000000044C698.4300000000006,328.62000000000046,699.3400000000006,318.96000000000043,700.2800000000007,309.31000000000046C694.9100000000007,308.69000000000045,689.4600000000006,308.74000000000046,684.1800000000006,309.92000000000047Z" /><path fill = "#C0C0C0" d="M475.59000000000054,300.7200000000004C476.00000000000057,304.8500000000004,475.71000000000055,309.09000000000043,476.8700000000005,313.1100000000004C477.4600000000005,315.33000000000044,480.10000000000053,315.1000000000004,481.8800000000005,315.3500000000004C494.3700000000005,316.3100000000004,506.6700000000005,318.70000000000044,519.0200000000006,320.6100000000004C516.7100000000006,315.9900000000004,513.0900000000006,311.58000000000044,507.97000000000054,310.0300000000004C497.3000000000005,306.52000000000044,486.4200000000005,303.69000000000045,475.59000000000054,300.7200000000004Z" /><path class="1" ontouchstart="onstart(1)" ontouchend="onend(1)" fill = "#ffffff" d="M488.5400000000007,132.88000000000042C488.51000000000073,138.73000000000042,488.5500000000007,144.59000000000043,488.5000000000007,150.44000000000042C501.65000000000066,151.63000000000042,514.7800000000007,153.65000000000043,528.0100000000007,153.49000000000044C530.7700000000007,153.45000000000044,533.6300000000007,153.33000000000044,536.2300000000007,152.28000000000043C537.9800000000007,147.98000000000042,539.4200000000008,142.77000000000044,537.6800000000007,138.27000000000044C533.1300000000008,134.98000000000044,527.2600000000008,134.63000000000045,521.8500000000007,134.11000000000044C510.7800000000007,132.99000000000044,499.6500000000007,132.97000000000045,488.5400000000007,132.88000000000045Z" />
@@ -0,0 +1 @@
<path fill = "#C0C0C0" d="M122.05000000000052,309.27000000000044C122.98000000000053,318.9100000000004,123.96000000000052,328.5500000000004,125.32000000000052,338.14000000000044C129.62000000000052,337.7300000000004,135.4400000000005,337.24000000000046,137.64000000000053,332.9700000000004C137.89000000000053,325.2800000000004,138.00000000000054,317.5600000000004,138.09000000000052,309.8500000000004C132.80000000000052,308.8100000000004,127.40000000000052,308.6800000000004,122.05000000000052,309.27000000000044Z" /><path fill = "#C0C0C0" d="M312.88000000000056,309.9700000000004C307.70000000000056,311.45000000000044,304.13000000000056,315.89000000000044,301.65000000000055,320.4300000000004C313.7400000000005,318.9500000000004,325.70000000000056,316.3100000000004,337.88000000000056,315.4400000000004C339.78000000000054,314.9900000000004,342.4800000000006,315.6100000000004,343.64000000000055,313.6500000000004C344.94000000000057,309.47000000000037,344.76000000000056,305.04000000000036,345.01000000000056,300.72000000000037C334.28000000000054,303.7100000000004,323.47000000000054,306.48000000000036,312.88000000000056,309.97000000000037Z" /><path class="2" ontouchstart="onstart(2)" ontouchend="onend(2)" fill = "#ffffff" d="M298.9900000000007,133.96000000000043C292.9800000000007,134.56000000000043,286.3500000000007,134.62000000000043,281.2800000000007,138.32000000000045C279.6100000000007,142.82000000000045,281.0300000000007,147.97000000000045,282.75000000000074,152.27000000000044C287.60000000000076,154.06000000000043,292.88000000000073,153.38000000000045,297.94000000000074,153.45000000000044C308.81000000000074,152.81000000000046,319.6400000000007,151.50000000000045,330.48000000000076,150.46000000000043C330.44000000000074,144.59000000000043,330.54000000000076,138.71000000000043,330.41000000000076,132.84000000000043C319.94000000000074,133.27000000000044,309.43000000000075,132.82000000000042,298.99000000000075,133.96000000000043Z" />
@@ -0,0 +1 @@
<path class="30" fill = "#C0C0C0" ontouchstart="onstart(30)" ontouchend="onend(30)" d="M509.22000000000014,746.4400000000003C512.6800000000002,756.4900000000002,515.8800000000001,766.7000000000003,520.6100000000001,776.2400000000002C521.8700000000001,765.4900000000002,522.0700000000002,754.6400000000002,522.6000000000001,743.8400000000003C518.1400000000001,744.7100000000003,513.6700000000002,745.5600000000003,509.22000000000014,746.4400000000003Z" /><path class="30" ontouchstart="onstart(30)" ontouchend="onend(30)" fill = "#ffffff" d="M602.9300000000001,734.6100000000004C605.47,743.8000000000004,609.61,752.7300000000004,616.19,759.7500000000003C621.6500000000001,765.7100000000004,629.62,768.3800000000003,637.3900000000001,769.6700000000003C638.4300000000001,758.1800000000003,639.3100000000001,746.6800000000003,640.1100000000001,735.1700000000003C627.7100000000002,735.1900000000003,615.3200000000002,734.7800000000003,602.9300000000002,734.6100000000004Z" />
@@ -0,0 +1 @@
<path fill = "#C0C0C0" class="31" ontouchstart="onstart(31)" ontouchend="onend(31)" d="M298.04000000000013,743.8400000000003C298.5500000000001,754.5800000000003,298.91000000000014,765.3500000000003,299.9400000000001,776.0600000000003C304.98000000000013,766.7000000000003,308.0200000000001,756.3900000000003,311.3800000000001,746.3300000000003C306.9100000000001,745.6000000000003,302.48000000000013,744.6900000000003,298.04000000000013,743.8400000000003Z" /><path class="31" ontouchstart="onstart(31)" ontouchend="onend(31)" fill = "#ffffff" d="M182.12000000000006,735.2000000000004L184.90000000000006,769.6300000000003C192.18000000000006,768.5000000000003,199.59000000000006,766.0900000000004,205.02000000000007,760.8900000000003C212.22000000000006,753.7200000000004,216.86000000000007,744.2900000000003,219.34000000000006,734.5000000000003C206.94000000000005,734.9400000000004,194.53000000000006,735.1000000000004,182.12000000000006,735.2000000000004Z" />
@@ -0,0 +1 @@
<path fill = "#C0C0C0" d="M531.9600000000002,557.0300000000004C532.1600000000002,583.7900000000004,531.5300000000002,610.5500000000004,531.8000000000002,637.3000000000004C534.7500000000002,635.7400000000005,538.4700000000001,634.8000000000004,540.0700000000002,631.5800000000004C538.3400000000001,630.4900000000004,535.6300000000001,629.5600000000004,535.8700000000001,627.0300000000004C535.7700000000001,616.6700000000004,535.8300000000002,606.3000000000004,535.8300000000002,595.9400000000004C535.3900000000001,593.5600000000004,537.5000000000001,592.2300000000004,539.1400000000001,591.0400000000004C539.2600000000001,569.6800000000004,538.7200000000001,548.3300000000004,538.8500000000001,526.9700000000005C536.6500000000001,526.0600000000005,534.4400000000002,525.1700000000005,532.2500000000001,524.2600000000004C532.0400000000001,535.1800000000004,532.3600000000001,546.1100000000005,531.9600000000002,557.0300000000004Z" /><path class="11" ontouchstart="onstart(11)" ontouchend="onend(11)" fill = "#ffffff" d = "M662.0900000000003,483.2500000000005C659.7200000000003,483.9300000000005,657.9700000000003,485.72000000000054,656.2100000000003,487.3200000000005C655.5700000000003,534.0300000000005,653.3100000000003,580.7100000000005,652.1600000000003,627.4100000000005C657.7600000000003,624.9000000000005,664.0000000000003,625.0500000000005,670.0100000000003,624.7000000000005C679.9700000000004,624.2900000000005,689.9500000000004,623.7400000000005,699.9200000000003,624.4500000000005C713.5100000000003,624.2400000000005,727.0300000000003,626.4000000000005,740.1200000000003,629.9500000000005C740.0200000000003,608.9800000000005,740.9200000000003,588.0200000000006,741.1300000000003,567.0500000000005C742.0200000000003,540.3700000000006,742.1800000000003,513.6400000000006,743.4700000000004,486.97000000000054C744.0300000000003,484.47000000000054,741.1900000000004,484.07000000000056,739.5200000000003,483.3600000000005C732.5100000000003,481.40000000000055,725.2200000000004,480.6200000000005,718.0000000000003,479.9900000000005C699.3500000000004,479.8300000000005,680.2500000000003,477.8600000000005,662.0900000000004,483.2500000000005ZM278.55000000000024,595.9000000000005C278.5000000000002,606.0300000000005,278.55000000000024,616.1600000000005,278.52000000000027,626.2900000000005L280.8100000000003,626.7400000000006C281.5000000000003,616.4800000000006,280.9500000000003,606.1600000000005,281.1100000000003,595.8800000000006L278.5500000000003,595.9000000000005Z" />
@@ -0,0 +1 @@
<path d="M664.2900000000003,581.3900000000006C667.1000000000003,580.3300000000006,671.5300000000003,581.3400000000006,671.4800000000004,585.0100000000006C671.5500000000004,593.9800000000006,671.6000000000004,602.9600000000006,671.4600000000004,611.9400000000005C671.2800000000004,615.8200000000005,666.0100000000003,616.4700000000005,663.3500000000004,614.7400000000005C661.4700000000004,613.4200000000004,661.8600000000004,610.9800000000005,661.8000000000004,609.0100000000004C661.8900000000004,600.9900000000005,661.7200000000004,592.9700000000005,661.8700000000005,584.9600000000005C661.7600000000004,583.3700000000005,662.8800000000005,581.9800000000005,664.2900000000004,581.3900000000004Z" /><path fill = "#C0C0C0" d="M281.90000000000015,526.8600000000005C281.9900000000001,548.3000000000005,281.3600000000001,569.7300000000005,281.52000000000015,591.1600000000004C283.21000000000015,591.9100000000004,285.5600000000002,592.7500000000005,285.46000000000015,595.0200000000004C285.6100000000001,605.6400000000004,285.53000000000014,616.2700000000004,285.4900000000001,626.9000000000004C285.71000000000015,629.6400000000004,282.8800000000001,630.8000000000004,280.71000000000015,631.3200000000004C281.77000000000015,634.9000000000004,285.94000000000017,635.6900000000004,288.89000000000016,637.2000000000004C289.09000000000015,627.8200000000004,289.04000000000013,618.4200000000004,288.82000000000016,609.0400000000004C288.85000000000014,580.7200000000004,288.77000000000015,552.4000000000004,288.8600000000002,524.0800000000004C286.5600000000002,525.0600000000004,284.2300000000002,525.9700000000004,281.9000000000002,526.8600000000004Z" /><path class="10" ontouchstart="onstart(10)" ontouchend="onend(10)" fill = "#ffffff" d="M87.98000000000025,482.1100000000005C84.93000000000025,482.7600000000005,81.69000000000024,483.29000000000053,79.09000000000024,485.1400000000005C78.52000000000025,489.4100000000005,79.42000000000024,493.7200000000005,79.46000000000025,498.0100000000005C80.35000000000025,542.0000000000005,82.04000000000025,585.9700000000005,82.14000000000026,629.9700000000005C95.44000000000025,626.3500000000005,109.18000000000026,624.2300000000005,122.99000000000026,624.4400000000005C132.68000000000026,623.7300000000005,142.39000000000027,624.3000000000005,152.08000000000027,624.6900000000005C158.15000000000026,624.9800000000005,164.37000000000026,625.0200000000006,170.12000000000026,627.2400000000005C169.01000000000025,580.8300000000005,166.91000000000025,534.4300000000005,166.02000000000027,488.02000000000044C164.94000000000025,485.20000000000044,161.73000000000027,483.5500000000004,158.90000000000026,482.84000000000043C144.28000000000026,478.9800000000004,129.02000000000027,479.1600000000004,114.03000000000026,479.88000000000045C105.29000000000026,479.58000000000044,96.56000000000026,480.50000000000045,87.98000000000026,482.11000000000047Z" />
@@ -0,0 +1 @@
<path d="M153.3000000000003,581.3800000000006C156.1100000000003,580.3300000000006,160.5200000000003,581.3300000000006,160.4800000000003,585.0000000000006C160.56000000000031,593.9600000000006,160.59000000000032,602.9300000000005,160.4700000000003,611.8900000000006C160.33000000000033,615.8200000000005,154.9800000000003,616.4900000000006,152.3200000000003,614.7200000000006C150.4700000000003,613.4000000000005,150.87000000000032,610.9800000000006,150.8000000000003,609.0200000000006C150.8900000000003,601.0100000000006,150.7300000000003,592.9900000000006,150.8700000000003,584.9700000000006C150.75000000000028,583.3800000000006,151.8900000000003,581.9700000000006,153.3000000000003,581.3800000000006Z" /><path fill = "#C0C0C0" d="M299.35000000000065,157.77000000000044C297.70000000000067,166.29000000000045,297.77000000000066,176.27000000000044,303.6900000000006,183.22000000000043C305.48000000000064,185.16000000000042,307.1400000000006,187.87000000000043,310.0300000000006,188.10000000000042C313.6700000000006,188.70000000000041,317.3600000000006,189.03000000000043,321.0500000000006,189.12000000000043H491.9300000000006C498.21000000000055,189.19000000000042,504.5900000000006,189.14000000000044,510.7400000000006,187.68000000000043C512.9400000000006,186.26000000000045,514.5800000000006,184.14000000000044,516.1800000000006,182.09000000000043C521.2900000000006,175.18000000000043,521.1700000000006,165.85000000000042,519.6600000000007,157.77000000000044C509.43000000000063,157.14000000000044,499.2500000000006,155.84000000000043,489.03000000000065,155.18000000000043C462.35000000000065,155.22000000000043,435.66000000000065,155.02000000000044,408.99000000000063,155.40000000000043C385.3200000000006,155.02000000000044,361.65000000000066,155.23000000000044,337.98000000000064,155.18000000000043C325.04000000000065,154.77000000000044,312.24000000000063,157.12000000000043,299.35000000000065,157.77000000000044Z" /><path class="4" ontouchstart="onstart(4)" ontouchend="onend(4)" fill = "#ffffff" d="M348.89 311.89c-0.45 3.65-2.7 7.43-6.7 7.77-13.83 1.12-27.49 3.62-41.18 5.74-.29 44.27-.15 88.57.92 132.82 13.5-11.13 30.24-17.37 47.1-21.35 20.59-5.07 41.92-6.14 63.05-5.95 20.5-.48 41.12 1.42 61.05 6.31 16.36 3.98 32.52 10.23 45.67 21.01.27-17.73.86-35.44.68-53.18.54-26.55.35-53.11.27-79.67-13.62-2.02-27.18-4.64-40.94-5.67-4.23-.25-6.86-4.24-6.99-8.2-1.14.83-2.31 1.81-3.81 1.64l-114.06.04c-1.81.14-3.52-.4-5.06-1.31"/>
@@ -0,0 +1 @@
<path onclick="clicked(evt)" class="6" stroke = "#ffffff" fill = "#009966" d="M142.47 314.95c.18 6.69-.05 13.39-.54 20.06-3.09 5.91-10.58 7.53-16.73 7.59.64 9.34 1.15 18.69 1.29 28.05 15.77 14.97 19.72 38.79 15.5 59.4-2.38 12.62-10.12 24.18-21.38 30.5-12.7 7.8-27.9 9.35-42.48 9.67.44 3.25.46 6.53.35 9.81 7.32-2.25 14.92-3.39 22.53-4.09 9.29-.99 18.65-.04 27.95-.77 10.75-.08 21.57.99 31.99 3.66 3.16.68 5.43 3.08 7.92 4.95.31-.39.93-1.17 1.24-1.57-1.96-7.21-2.68-14.74-2.13-22.2.67-5.41-1.2-10.66-1.5-16.02-2.38-16.96-2.62-34.11-4.68-51.09-1.33-14.41-3.33-28.76-6.36-42.9-3.21-12-5.97-24.57-12.97-35.05z"/>
@@ -0,0 +1 @@
<path fill = "#C0C0C0" d="M172.47000000000034,456.1500000000006C171.80000000000035,465.5700000000006,171.77000000000035,475.5100000000006,175.78000000000034,484.2800000000006C178.87000000000035,489.9500000000006,183.12000000000035,494.8800000000006,186.89000000000033,500.1000000000006C198.32000000000033,515.1900000000006,208.38000000000034,531.2300000000006,218.94000000000034,546.9200000000006C206.00000000000034,515.4300000000006,188.94000000000034,485.8800000000006,172.47000000000034,456.15000000000066Z"/><path fill = "#C0C0C0" d="M629.3600000000004,493.3500000000006C619.7400000000004,510.7200000000006,611.1200000000003,528.6300000000006,603.3200000000004,546.8900000000006C614.3800000000003,530.7500000000006,624.6700000000004,514.0800000000006,636.6100000000004,498.56000000000057C640.9900000000004,492.34000000000054,646.6000000000004,486.58000000000055,648.4800000000004,478.9900000000006C650.5100000000003,471.6600000000006,650.3000000000004,463.9700000000006,649.9100000000003,456.45000000000056C642.6300000000003,468.4900000000006,636.1600000000003,481.03000000000054,629.3600000000004,493.35000000000053Z" /><path fill = "#C0C0C0" d="M314.29000000000065,193.09000000000046C318.90000000000066,202.07000000000045,324.6300000000006,210.45000000000044,330.18000000000063,218.88000000000045C334.6900000000006,224.90000000000046,339.4500000000006,231.49000000000046,346.7600000000006,234.25000000000045C356.6600000000006,238.19000000000045,367.54000000000065,237.31000000000046,377.9700000000006,237.87000000000046C403.9500000000006,239.00000000000045,429.9600000000006,238.48000000000047,455.9300000000006,237.32000000000045C463.81000000000057,237.01000000000045,472.1700000000006,235.63000000000045,478.5300000000006,230.62000000000046C486.1700000000006,224.00000000000045,491.3000000000006,215.15000000000046,496.7400000000006,206.76000000000045C499.44000000000057,202.23000000000044,502.4600000000006,197.87000000000046,504.7300000000006,193.09000000000046C475.1600000000006,193.17000000000047,445.5900000000006,193.71000000000046,416.0200000000006,193.52000000000046C382.1000000000006,193.70000000000047,348.2000000000006,193.28000000000046,314.2900000000006,193.09000000000046Z" /><path class="5" ontouchstart="onstart(5)" ontouchend="onend(5)" fill = "#ffffff" d="M342.12 452.14c-12.56 4.06-24.9 9.44-35.57 17.3-1.5 11.52-.47 23.3 2.31 34.56 4.87 22.05 10.89 43.82 15.65 65.89 16.92-6.42 35.02-8.89 52.93-10.78 17.82-1.32 35.72-1.65 53.57-.96 22 1.52 44.2 4.2 65.1 11.57 5.44-24.23 12.03-48.21 17.15-72.52 1.46-9.17 2.46-18.82.59-27.92-11.16-8.21-24.14-13.69-37.32-17.76-25.38-7.76-52.21-8.76-78.55-7.65-18.89-.05-37.82 2.61-55.86 8.27"/>
@@ -0,0 +1 @@
<path class="22" ontouchstart="onstart(22)" ontouchend="onend(22)" fill = "#ffffff" d="M283.93000000000006,1063.81C282.95000000000005,1065.78,281.52000000000004,1067.7,281.5400000000001,1070.01C281.4800000000001,1075.64,281.5100000000001,1081.27,281.5800000000001,1086.91C298.9500000000001,1089.1000000000001,316.5400000000001,1087.44,333.9800000000001,1088.43C389.32000000000005,1088.97,444.70000000000005,1089.19,500.0300000000001,1088.1200000000001C513.3600000000001,1087.93,526.7800000000001,1088.64,540.0300000000001,1086.91C539.69,1079.26,541.6400000000001,1071,537.8500000000001,1063.95C527.2300000000001,1065.29,516.5000000000001,1065.21,505.83000000000015,1065.91C502.3600000000001,1071.8400000000001,497.65000000000015,1078.8600000000001,489.9900000000002,1078.99C463.7400000000002,1081.6,437.33000000000015,1080.5,411.00000000000017,1081.19C384.3100000000002,1080.48,357.5300000000002,1081.65,330.9200000000002,1078.9C323.5300000000002,1078.5,319.4300000000002,1071.52,315.75000000000017,1066.0400000000002C305.1800000000002,1064.91,294.4300000000002,1065.5900000000001,283.9300000000002,1063.8100000000002Z" /><path fill = "#C0C0C0" d="M524.69,897.2600000000002C519.7600000000001,903.9100000000002,512.96,909.1800000000002,505.20000000000005,912.1200000000002C494.49000000000007,916.0300000000002,483.21000000000004,917.9300000000002,471.94000000000005,919.3400000000003C458.9800000000001,920.7600000000002,446.05000000000007,922.8300000000003,433.00000000000006,923.1100000000002C411.62000000000006,923.9700000000003,390.20000000000005,923.4200000000002,368.87000000000006,921.7900000000002C350.55000000000007,919.4600000000002,331.75000000000006,918.3500000000001,314.3500000000001,911.6700000000002C307.0800000000001,908.8800000000002,301.24000000000007,903.5600000000002,296.0900000000001,897.8800000000002C298.4500000000001,904.2300000000002,302.74000000000007,909.8700000000002,308.4500000000001,913.5500000000002C312.3700000000001,916.0200000000002,316.8800000000001,917.2300000000001,321.2300000000001,918.7200000000001C350.19000000000005,927.8100000000002,380.81000000000006,929.7100000000002,410.99000000000007,929.3900000000001C442.9800000000001,929.8600000000001,475.5300000000001,927.3000000000001,505.88000000000005,916.5400000000001C514.7900000000001,913.6400000000001,521.84,906.1100000000001,524.69,897.2600000000001Z"/><path class="22" ontouchstart="onstart(22)" ontouchend="onend(22)" fill = "#ffffff" d="M281.9700000000001,1091.1699999999998C282.5700000000001,1097.2599999999998,282.8900000000001,1103.4399999999998,284.5200000000001,1109.3799999999999C285.9000000000001,1114.52,289.3900000000001,1118.6699999999998,292.1000000000001,1123.1499999999999C295.5400000000001,1121.6699999999998,299.18000000000006,1120.6299999999999,302.9500000000001,1120.61C340.6200000000001,1118.9599999999998,378.3400000000001,1119.59,416.0400000000001,1119.4699999999998C450.3900000000001,1119.5299999999997,484.75000000000006,1119.0899999999997,519.0600000000001,1120.6299999999999C522.73,1120.6799999999998,526.2500000000001,1121.77,529.6300000000001,1123.12C532.1000000000001,1118.75,535.5200000000001,1114.86,536.9600000000002,1109.9799999999998C538.7600000000001,1103.8999999999999,539.0800000000002,1097.5199999999998,539.6400000000001,1091.2599999999998C533.1200000000001,1092.0499999999997,526.5500000000001,1092.2099999999998,519.9900000000001,1092.1699999999998C492.65000000000015,1092.0399999999997,465.33000000000015,1093.0199999999998,438.0000000000001,1092.8799999999999C401.04000000000013,1092.87,364.09000000000015,1093.06,327.1400000000001,1092.31C312.1000000000001,1091.6699999999998,296.9500000000001,1093.07,281.9700000000001,1091.1699999999998Z" />
@@ -0,0 +1 @@
<path class="49" ontouchstart="onstart(49)" ontouchend="onend(49)" fill = "#ffffff" d="M110.88000000000005,848.8300000000003C103.55000000000005,851.7100000000003,95.64000000000006,853.0800000000003,87.78000000000006,853.2700000000003C87.83000000000006,858.0300000000003,88.54000000000006,862.7700000000003,89.43000000000006,867.4500000000003C93.00000000000006,886.5400000000003,97.27000000000007,905.6200000000002,104.21000000000006,923.8000000000003C105.73000000000006,924.5000000000003,107.17000000000006,925.6000000000003,108.89000000000007,925.7500000000003C113.30000000000007,925.8800000000003,117.99000000000007,926.4800000000004,121.95000000000007,924.1000000000004C126.97000000000007,924.3500000000004,132.57000000000008,922.8900000000003,135.82000000000008,918.8300000000004C138.32000000000008,916.1300000000003,137.30000000000007,912.3000000000004,137.48000000000008,909.0000000000003C137.5300000000001,881.6600000000003,137.35000000000008,854.3200000000004,137.57000000000008,826.9800000000004C131.20000000000007,836.8300000000004,121.44000000000008,844.0200000000003,110.88000000000008,848.8300000000004Z" />
@@ -0,0 +1 @@
<path class="50" ontouchstart="onstart(50)" ontouchend="onend(50)" fill = "#ffffff" d="M684.9300000000001,827.2500000000002C684.83,856.5100000000002,684.8800000000001,885.7800000000002,684.9100000000001,915.0400000000002C685.96,921.3000000000002,693.34,924.2700000000002,699.08,924.0200000000002C701.62,923.7000000000002,703.4200000000001,926.2700000000002,706,925.8400000000003C710.23,925.6900000000003,715.97,926.9600000000003,718.57,922.6300000000002C723.59,909.4800000000002,726.95,895.7600000000002,730.0300000000001,882.0500000000002C731.84,872.5200000000002,734.2600000000001,863.0300000000002,734.6100000000001,853.2900000000002C715.0900000000001,853.3800000000002,695.8300000000002,843.4900000000002,684.9300000000002,827.2500000000002Z" />
@@ -0,0 +1 @@
<path fill="#C0C0C0" d="M147.26000000000016,896.1600000000003C145.40000000000015,903.1800000000003,144.27000000000015,910.3700000000003,142.86000000000016,917.4900000000004C150.23000000000016,917.0800000000004,157.59000000000015,916.3400000000004,164.83000000000015,914.8800000000003C164.82000000000016,908.8900000000003,164.81000000000014,902.9100000000003,164.84000000000015,896.9300000000003C159.12000000000015,895.3000000000003,153.11000000000016,895.2800000000003,147.26000000000016,896.1600000000003Z" /><path fill="#C0C0C0" d="M297.2400000000002,877.9900000000002C297.6500000000002,884.0900000000003,296.14000000000016,891.3700000000002,300.69000000000017,896.2900000000002C307.90000000000015,905.7300000000002,319.69000000000017,910.0300000000002,331.03000000000014,911.9300000000002C326.8100000000001,909.6300000000002,322.89000000000016,906.8400000000001,319.26000000000016,903.7300000000001C316.2300000000002,900.7600000000001,311.54000000000013,900.5300000000001,308.65000000000015,897.3600000000001C303.3700000000002,891.9100000000001,300.22000000000014,884.8500000000001,297.2400000000001,877.9900000000001Z" /><path class="33" ontouchstart="onstart(33)" ontouchend="onend(33)" fill = "#ffffff" d="M290.98,1040.33C289.17,1040.8999999999999,286.99,1041.83,286.6,1043.9299999999998C285.3,1049.0399999999997,284.83000000000004,1054.32,284.24,1059.56C293.99,1061.3999999999999,304.01,1061.06,313.89,1061.58C310.27,1053.98,306.55,1046.4299999999998,302.84,1038.8799999999999C298.88,1039.33,294.85999999999996,1039.4099999999999,290.97999999999996,1040.33Z" />
@@ -0,0 +1 @@
<path fill="#C0C0C0" d="M657.5500000000002,896.8500000000004C657.5100000000002,902.8700000000003,657.5100000000002,908.8900000000003,657.5600000000002,914.9200000000004C664.7900000000002,916.3300000000004,672.1200000000001,917.0500000000004,679.4700000000001,917.5100000000004C678.0400000000002,910.3600000000005,676.9900000000001,903.1200000000005,674.9900000000001,896.1000000000005C669.1800000000002,895.3000000000005,663.2500000000001,895.3500000000005,657.5500000000001,896.8500000000005Z" /><path fill="#C0C0C0" d="M511.63000000000017,897.7100000000003C508.7900000000002,900.5400000000003,504.44000000000017,900.8800000000002,501.5500000000002,903.6200000000002C497.9100000000002,906.7600000000002,493.9200000000002,909.4500000000003,489.8400000000002,911.9800000000002C502.5200000000002,909.7300000000002,516.1100000000002,904.3300000000003,522.5000000000002,892.3800000000002C523.4700000000003,887.6900000000002,523.3200000000003,882.8300000000003,523.5200000000002,878.0700000000003C520.2300000000002,884.9600000000003,517.2400000000002,892.3200000000003,511.6300000000002,897.7100000000003Z" /><path class="32" ontouchstart="onstart(32)" ontouchend="onend(32)" fill = "#ffffff" d="M507.74,1061.47C517.62,1061.17,527.66,1061.39,537.4,1059.52C536.62,1053.84,536.5799999999999,1047.8799999999999,534.4599999999999,1042.5C530.3,1038.78,524.0999999999999,1039.62,518.9399999999999,1039.04C514.8699999999999,1046.32,511.5799999999999,1054.05,507.73999999999995,1061.47Z" />
@@ -0,0 +1 @@
<path class="21" ontouchstart="onstart(21)" ontouchend="onend(21)" fill = "#ffffff" d="M307.76000000000005,1038.83C311.14000000000004,1045.8899999999999,314.6,1052.9099999999999,318.02000000000004,1059.96C320.43000000000006,1065.13,323.04,1070.8600000000001,328.23,1073.76C331.98,1075.14,336.08000000000004,1074.98,340,1075.43C374.31,1077.52,408.7,1076.6200000000001,443.06,1076.8400000000001C458.77,1076.2,474.54,1076.4700000000003,490.18,1074.6100000000001C495.5,1074.2,498.77,1069.2900000000002,501.15000000000003,1065.0500000000002C505.43,1056.1900000000003,509.90000000000003,1047.41,514,1038.4700000000003C445.25,1038.6300000000003,376.5,1038.3400000000001,307.76,1038.8300000000002Z" /><path class="21" ontouchstart="onstart(21)" ontouchend="onend(21)" fill = "#ffffff" d="M303.57,1024.0600000000002C303.29,1027.0100000000002,304.86,1029.7200000000003,305.75,1032.4600000000003C375.75,1032.4900000000002,445.76,1032.4600000000003,515.76,1032.6100000000004C517.04,1029.2700000000004,519.17,1025.5800000000004,517.51,1021.9900000000004C515.9,1018.5000000000003,513.35,1014.4700000000004,509.11,1014.2000000000004C505.43,1013.6500000000004,501.7,1013.8300000000004,498,1013.8000000000004C436.98,1013.8000000000004,375.95,1013.7800000000004,314.93,1013.9300000000004C309.02,1013.4900000000004,304.74,1018.7700000000004,303.57,1024.0600000000004Z" /><path class="21" ontouchstart="onstart(21)" ontouchend="onend(21)" fill = "#ffffff" d="M316.5000000000001,841.3900000000003C316.8400000000001,860.6000000000004,319.10000000000014,879.7200000000004,320.16000000000014,898.8900000000003C330.7400000000001,908.0000000000003,343.6300000000001,915.5800000000004,357.85000000000014,916.5200000000003C376.46000000000015,918.7300000000004,395.22000000000014,919.3100000000003,413.95000000000016,919.1300000000003C432.98000000000013,919.3700000000003,452.0600000000002,918.1500000000003,470.89000000000016,915.3900000000003C481.28000000000014,912.5100000000003,490.89000000000016,907.0500000000003,499.10000000000014,900.1100000000004C500.92000000000013,899.0600000000004,500.51000000000016,896.8000000000004,500.7400000000001,895.0700000000004C501.85000000000014,877.1800000000004,503.8700000000001,859.3300000000004,504.1300000000001,841.4100000000004C496.3300000000001,847.7100000000004,486.7100000000001,851.1000000000005,477.1300000000001,853.6600000000004C453.92000000000013,859.5800000000004,429.8100000000001,860.5700000000004,405.9600000000001,860.1800000000004C384.1400000000001,860.1000000000004,362.0700000000001,858.8200000000004,340.9500000000001,852.9600000000004C332.2500000000001,850.4700000000004,323.6100000000001,847.1400000000003,316.5000000000001,841.3900000000003Z" />
@@ -0,0 +1 @@
<line x1="540" y1="515" x2="610" y2="280" stroke="#000" stroke-width="2" /><circle class="38" ontouchstart="onstart(38)" ontouchend="onend(38)" cx = "610" cy = "280" r = "30" stroke = "black" stroke-width = "3" fill = "white" /><path fill="#C0C0C0" d="M640.7200000000004,512.7300000000006C638.7400000000004,514.0600000000006,636.1000000000004,515.3000000000006,635.9300000000004,518.0200000000006C635.6700000000004,520.7500000000006,634.2200000000004,525.0500000000005,637.5200000000004,526.4600000000006C640.1500000000004,527.2900000000006,643.2100000000005,528.0200000000006,645.8600000000005,526.8700000000006C651.6000000000005,522.1500000000005,651.7900000000004,514.2700000000006,651.4300000000005,507.45000000000056C647.4000000000005,508.14000000000055,644.1300000000006,510.6800000000006,640.7200000000005,512.7300000000006Z" /><path fill="#C0C0C0" d="M528.6700000000004,503.26000000000056C527.6200000000005,507.51000000000056,526.3200000000004,511.69000000000057,525.0200000000004,515.8800000000006C528.2300000000005,516.3900000000006,531.5400000000004,516.4800000000006,534.6500000000004,517.5200000000006C542.4900000000005,520.5800000000005,550.0500000000004,524.3400000000006,557.9800000000005,527.1800000000005C557.6500000000004,524.2800000000005,557.5800000000005,520.7400000000005,555.0000000000005,518.8300000000005C546.9300000000004,512.5500000000005,537.9300000000004,507.5600000000005,528.6700000000004,503.2600000000005Z" /><path fill="#C0C0C0" class="38" ontouchstart="onstart(38)" ontouchend="onend(38)" fill = "#ffffff" d="M513.4300000000001,1007.6400000000002C514.1700000000001,1009.1000000000003,515.1700000000001,1010.5000000000002,516.9100000000001,1010.8300000000003C520.96,1012.1400000000002,524.4900000000001,1014.6000000000003,527.6400000000001,1017.4300000000003C529.7700000000001,1016.9500000000003,531.9200000000001,1016.5500000000003,534.0800000000002,1016.2000000000003C535.1100000000001,1014.2400000000002,535.7600000000001,1011.8200000000003,533.6400000000001,1010.3400000000003C527.7700000000001,1006.2500000000002,520.1300000000001,1007.7500000000002,513.4300000000001,1007.6400000000002Z" /><path class="38" ontouchstart="onstart(38)" ontouchend="onend(38)" fill = "#ffffff" d="M510.42000000000064,202.94000000000045C512.3700000000007,204.39000000000044,513.1100000000007,206.72000000000045,514.3500000000006,208.70000000000044C516.6000000000006,210.08000000000044,519.5200000000006,209.33000000000044,522.0500000000006,209.47000000000045C527.8700000000007,209.34000000000046,534.7300000000006,207.16000000000045,537.0900000000006,201.29000000000045C535.8600000000006,200.15000000000046,534.7400000000006,198.62000000000046,532.9500000000006,198.42000000000044C526.9600000000006,197.41000000000045,520.9400000000006,196.55000000000044,514.9200000000006,195.83000000000044C513.4200000000006,198.20000000000044,511.90000000000066,200.56000000000043,510.42000000000064,202.94000000000045Z" />

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