From 6fe24ac92534042b27120a188b96df5347234a05 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 18:02:32 +0000 Subject: [PATCH 1/7] Present abap2UI5 to decision makers: fresh light design, use cases, market comparison MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Hero, header, bands and footer move from dark navy to a light design with coral, sky and mint washes - The technical counts under the hero (unit tests, specs, gates) become manager tiles: 0 € license, 1 class per app, minutes to a first screen, 7.02 → Cloud, no lock-in; src/lib/facts.mjs and the weekly rebuild go - "The problem it answers" becomes "What you can build": warehouse, maintenance, shop floor, approvals, cockpits, paper/Excel, SAP GUI, mobile - "When to use it and when not" becomes a comparison with RAP + Fiori Elements, freestyle UI5 and commercial UI5 / low-code platforms - "Evaluate" leaves the visible text; a test holds it there. Section ids stay, they are linked from elsewhere Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0134Dawy9Fb26HLtDiHWfnT1 --- .github/workflows/pages.yml | 6 +- AGENTS.md | 13 +-- README.md | 15 ++-- astro.config.mjs | 2 +- package-lock.json | 4 +- package.json | 4 +- src/components/Icon.astro | 6 ++ src/components/Stats.astro | 24 +++--- src/layouts/Page.astro | 12 +-- src/lib/facts.mjs | 51 ------------ src/pages/index.astro | 135 ++++++++++++++++-------------- src/styles/global.css | 160 ++++++++++++++++++++---------------- test/site.test.mjs | 10 +-- 13 files changed, 210 insertions(+), 232 deletions(-) delete mode 100644 src/lib/facts.mjs diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 59498e7..b1d73d1 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -1,9 +1,7 @@ # Build, test and publish the page to GitHub Pages at # https://abap2ui5.github.io/test-docs/. # -# On a pull request it builds and tests only. On main it also deploys; the -# weekly run picks up the counted figures from the framework README -# (src/lib/facts.mjs), which change without a commit here. +# On a pull request it builds and tests only. On main it also deploys. # # Needs Settings → Pages → Source: "GitHub Actions" once. name: pages @@ -12,8 +10,6 @@ on: push: branches: [main] pull_request: - schedule: - - cron: "17 6 * * 1" workflow_dispatch: permissions: diff --git a/AGENTS.md b/AGENTS.md index 7d0ce25..ffc8c12 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,7 +1,8 @@ # AGENTS.md -Evaluate abap2UI5: one static page for the people who approve abap2UI5, -published at https://abap2ui5.github.io/test-docs/ by GitHub Pages. A +abap2UI5 for decision makers: one static page that presents abap2UI5 to IT +management and product owners - what it can build, why it beats every other +UI5 solution on SAP (commercial ones included), what it costs - published at https://abap2ui5.github.io/test-docs/ by GitHub Pages. A standalone site — its own repository, build and deployment — and nothing in it depends on abap2UI5/docs or abap2UI5/playground at build time. @@ -11,13 +12,12 @@ it depends on abap2UI5/docs or abap2UI5/playground at build time. | --- | --- | | `src/pages/index.astro` | The page: the text of every section, as data at the top and markup below | | `src/layouts/Page.astro` | The document: head, the Content-Security-Policy, the header with the section links, the foot | -| `src/components/` | `Stats` (the figures under the hero), `CostCalculator` (the sheet, after the manual's), `Icon` (inline marks) | +| `src/components/` | `Stats` (the headline tiles under the hero), `CostCalculator` (the sheet, after the manual's), `Icon` (inline marks) | | `public/calc.js` | The cost calculator in the browser - the page's one script; the calculator reads correctly without it | -| `src/lib/facts.mjs` | Reads the counted figures from the framework README's `facts:start` block at build time (`EVALUATE_README` names a local file, else raw GitHub); a failed read costs the counts, never the build | | `src/styles/global.css` | The one stylesheet; light and dark follow the system | | `public/` | Font (Inter, self-hosted), logo, icons, the screenshot | | `test/site.test.mjs` | `node:test` over the built `dist/index.html` | -| `.github/workflows/pages.yml` | Build + test on every PR; deploy on main and weekly (the figures move without a commit here) | +| `.github/workflows/pages.yml` | Build + test on every PR; deploy on main | ## Commands @@ -41,7 +41,8 @@ npm run check # build + test, what CI runs page. No inline `style=""` either (`style-src 'self'`) — a class in `global.css`. - **Nothing from another origin.** No CDN, no web font service, no analytics; the font and the images are in `public/`. -- **No number typed by hand.** The counts come from the framework README. +- **Written for managers.** No technical counts (tests, specs, gates) and no + "evaluate" in the visible text - `test/site.test.mjs` checks the latter. - **Toolchain:** Node 22 (`.nvmrc`, `engines`), every dependency pinned exactly (astro 7.3.8), actions pinned to commits. - The site is written for people. Links into the manual are absolute diff --git a/README.md b/README.md index 4398a8d..7e2e61c 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# Evaluate abap2UI5 +# abap2UI5 for decision makers -The page for the people who approve abap2UI5 rather than build with it — IT -management, architecture boards, product owners, SAP Basis and internal audit: -the problem it answers, when to use it and when RAP, what your organization -keeps, where it runs, what it costs, the objections a review board raises, and -how to evaluate it on one real screen in a week. +The page that presents abap2UI5 to IT management, product owners and +architecture boards: what you can build with it, why it beats every other way +to build UI5 apps on SAP — commercial platforms included — what your +organization keeps, where it runs, what it costs, and how to start with one +real screen. **→ https://abap2ui5.github.io/test-docs/** @@ -22,8 +22,7 @@ npm run dev # http://localhost:4321/test-docs/ npm run check # build + tests, what CI runs ``` -Edit the text in `src/pages/index.astro`. The counted figures under the hero -are read at build time from the framework README and are never typed here. +Edit the text in `src/pages/index.astro`. ## License diff --git a/astro.config.mjs b/astro.config.mjs index abb3ade..84d4ea9 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,4 +1,4 @@ -// Evaluate abap2UI5 - one static page, published by GitHub Pages at +// abap2UI5 for decision makers - one static page, published by GitHub Pages at // https://abap2ui5.github.io/test-docs/ (.github/workflows/pages.yml). // // Static output only: no client component, no island. The page's one script diff --git a/package-lock.json b/package-lock.json index 23a53a2..6479d1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "abap2ui5-evaluate", + "name": "abap2ui5-decision-makers", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "abap2ui5-evaluate", + "name": "abap2ui5-decision-makers", "version": "1.0.0", "license": "MIT", "devDependencies": { diff --git a/package.json b/package.json index d822666..2f0d65b 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "abap2ui5-evaluate", + "name": "abap2ui5-decision-makers", "version": "1.0.0", "private": true, - "description": "Evaluate abap2UI5 - the page for the people who approve it", + "description": "abap2UI5 for decision makers", "license": "MIT", "type": "module", "engines": { diff --git a/src/components/Icon.astro b/src/components/Icon.astro index e0dd6de..d4ff007 100644 --- a/src/components/Icon.astro +++ b/src/components/Icon.astro @@ -14,6 +14,12 @@ const PATHS = { key: '', db: '', log: '', + box: '', + wrench: '', + factory: '', + check: '', + form: '', + phone: '', leaf: '', }; const { name } = Astro.props; diff --git a/src/components/Stats.astro b/src/components/Stats.astro index 0b2aa20..eb558d6 100644 --- a/src/components/Stats.astro +++ b/src/components/Stats.astro @@ -1,17 +1,17 @@ --- -/* The size of the thing, under the hero. The counts are read at build time - * from the framework README (src/lib/facts.mjs), never typed; the last two - * tiles are the release spans and the license, which are the project's - * claims rather than counts. Without the README the counts are left out and - * the two claims stay. */ -import { readFacts } from "../lib/facts.mjs"; -const facts = await readFacts(); +/* The headline under the hero: what a decision maker takes away in five + * seconds. Claims, not counts - the technical figures (tests, specs, gates) + * belong to the framework's README, not to this page. */ +const tiles = [ + ["0 €", "license fees - now and later, for any number of users"], + ["1 class", "per app - no frontend project, no extra platform"], + ["Minutes", "to a first screen, built by the ABAP team you have"], + ["7.02 → Cloud", "every SAP release, from one source"], + ["100 % yours", "open source, no vendor, no lock-in"], +]; --- -
+
    - {facts.map((f) =>
  • {f.value}{f.label}
  • )} -
  • 7.02 → Cloudone source for every ABAP release
  • -
  • MITno license fee, no per-user cost
  • + {tiles.map(([value, label]) =>
  • {value}{label}
  • )}
- {facts.length > 0 &&

Counted from the framework repository at build time.

}
diff --git a/src/layouts/Page.astro b/src/layouts/Page.astro index 9b4ea30..f6893e2 100644 --- a/src/layouts/Page.astro +++ b/src/layouts/Page.astro @@ -23,14 +23,14 @@ const CSP = [ "form-action 'none'", ].join("; "); const sections = [ - ["the-problem-it-answers", "Problem"], - ["when-to-use-it-and-when-not", "Fit"], + ["the-problem-it-answers", "Use cases"], + ["when-to-use-it-and-when-not", "Comparison"], ["what-you-keep", "Governance"], ["no-strings-attached", "No strings"], ["where-it-runs", "Platform"], ["what-it-costs", "Cost"], - ["the-objections", "Objections"], - ["how-to-evaluate-it-in-a-week", "One week"], + ["the-objections", "Questions"], + ["how-to-evaluate-it-in-a-week", "Get started"], ]; --- @@ -47,7 +47,7 @@ const sections = [ - + @@ -56,7 +56,7 @@ const sections = [
- abap2UI5 Evaluate + abap2UI5 for decision makers diff --git a/src/lib/facts.mjs b/src/lib/facts.mjs deleted file mode 100644 index efe8d27..0000000 --- a/src/lib/facts.mjs +++ /dev/null @@ -1,51 +0,0 @@ -// The counted figures - unit tests, specs, browser suites, gates. A reader who -// is deciding wants the size of the thing, and this repository types no number -// of its own: the framework's README carries them between `facts:start` and -// `facts:end`, regenerated there by `npm run facts` and held current by a gate. -// -// Read at build time: from the file EVALUATE_README names (a local clone), -// else from raw.githubusercontent.com. Allowed to fail - no network, a 5xx, a -// README whose block moved - and then the band shows what it can without the -// counts, and the build log says so. It never falls back to a typed number. -import fs from "node:fs"; - -const README_URL = "https://raw.githubusercontent.com/abap2UI5/abap2UI5/main/README.md"; - -/* What the block carries that the page does not show as a count: the workflow - * total (a maintainer's figure), the release spans (shown as their own tiles) - * and the trailing "counted from this repository by …". */ -const SKIP = /workflows|→|counted/; - -/** The figures of the block as plain strings - "1,530 ABAP unit tests". */ -export function factsIn(readme) { - const block = String(readme).match(/([\s\S]*?)/); - if (!block) return []; - const text = block[1].replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim(); - return text.split(/\s·\s/).map((s) => s.trim()).filter((s) => s && !SKIP.test(s)); -} - -/** "1,530 ABAP unit tests" -> { value: "1,530", label: "ABAP unit tests" }. */ -export function splitFact(fact) { - const m = String(fact).match(/^([\d.,]+\+?)\s+(.+)$/); - return m ? { value: m[1], label: m[2] } : { value: "", label: fact }; -} - -let cached; -export async function readFacts() { - if (cached) return cached; - let readme = ""; - try { - if (process.env.EVALUATE_README) { - readme = fs.readFileSync(process.env.EVALUATE_README, "utf8"); - } else { - const res = await fetch(README_URL, { signal: AbortSignal.timeout(15000) }); - if (!res.ok) throw new Error(`HTTP ${res.status}`); - readme = await res.text(); - } - } catch (err) { - console.warn(`evaluate: the counted figures were not read (${err.message}) - the page goes out without them`); - } - cached = factsIn(readme).map(splitFact); - if (readme && !cached.length) console.warn("evaluate: the framework README has no facts block - the page goes out without the counts"); - return cached; -} diff --git a/src/pages/index.astro b/src/pages/index.astro index d04da6a..f8e8067 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,7 +1,7 @@ --- -/* Evaluate abap2UI5 - the page for the people who approve it: IT management, - * architecture boards, product owners, SAP Basis, internal audit. The - * questions a review asks, in the order it asks them. +/* abap2UI5 for decision makers - IT management, product owners, architecture + * boards: what it lets you build, why it beats every other way to put a UI5 + * app on SAP (commercial products included), what it costs and how to start. * * THE SECTION IDS ARE ADDRESSES. /docs/evaluate redirects here with its * #fragment, and the framework's README links #what-you-keep and @@ -17,6 +17,19 @@ const PLAYGROUND = "https://abap2ui5.github.io/playground/"; const GITHUB = "https://github.com/abap2UI5/abap2UI5"; const base = import.meta.env.BASE_URL; +/* What it solves - the processes, not one problem. The same ground the + * commercial SAP app platforms sell (warehouse, maintenance, shop floor, + * approvals), at no license fee. */ +const useCases = [ + ["box", "Warehouse & logistics", "Goods receipt, picking, stock transfers and inventory counts on scanners, handhelds and tablets - in the browser, with the barcode scanner and camera of the device."], + ["wrench", "Maintenance & service", "Work orders, notifications and checklists for technicians, on the desktop in the workshop or on the phone at the machine."], + ["factory", "Production & shop floor", "Confirmations, quality inspections and the special processes the standard never covered - right where the work happens."], + ["check", "Approvals & workflows", "Purchase requisitions, invoices, leave and master-data requests: approve in one click, in the launchpad, in Teams or on the phone."], + ["gauge", "Cockpits & dashboards", "KPIs, charts and monitors for one team or one process, live from SAP - no data warehouse, no extra BI tool."], + ["form", "Paper & Excel replaced", "Forms, checklists and spreadsheets that live outside SAP become apps that write straight into it."], + ["list", "SAP GUI modernized", "Reports, ALV lists and transactions turn into browser apps one at a time, with the logic behind them unchanged."], + ["phone", "Mobile, without an app store", "Every app runs on iOS and Android in the browser or the mobile shell - nothing to install, nothing to distribute."], +]; const useIt = [ ["The team is ABAP.", "No JavaScript, no UI5 tooling, no Business Application Studio to set up. An app is one class, written, debugged, transported and unit-tested like every other class."], ["The system is older than RAP.", "NetWeaver 7.02 to 7.4x have no RAP and a Fiori stack that is expensive to add. abap2UI5 runs there from the same source it runs on ABAP Cloud, so an app written on 7.31 today moves to S/4HANA unchanged."], @@ -24,22 +37,19 @@ const useIt = [ ["You do not want a deployment pipeline.", "No BSP upload, no approuter, no MTA. The ABAP system serves the frontend; an abapGit pull is the installation."], ["You replace SAP GUI screens one at a time.", "Selection screens, lists and transactions become browser apps without rewriting the logic behind them."], ]; -const useRap = [ - ["The service is the product.", "Other consumers, a mobile app, an integration, SAP's own apps, need the OData service anyway. RAP gives you the service and the UI from one model; abap2UI5 gives you a UI and no service."], - ["The screen is a standard floorplan and should stay one.", "List report, object page, worklist, with SAP's draft handling and flexible column layout as SAP ships and maintains them. Fiori Elements tracks every UI5 release for you; a hand-built screen is yours to keep current."], - ["The data is large and lives behind paging.", "Fiori Elements pages, sorts and filters through OData on the server. In abap2UI5 the table a view binds travels with the model; thousands of rows are routine, millions are the app's job to page."], - ["Offline, or a native mobile SDK, is a requirement.", "abap2UI5 is a roundtrip to the ABAP system on every interaction. It has a mobile shell for camera, barcode and location; it has no offline store."], - ["A frontend team should own the frontend.", "The app is one ABAP class; that is the point, and it means there is no frontend project for a separate team to own, and no place for heavy client-side behavior."], - ["The organization has standardized on it.", "A clean-core guideline that names RAP as the extensibility model is a decision already taken. abap2UI5 passes the ABAP Cloud checks, but it is not SAP's programming model, and a review board will say so."], -]; -const costCompare = [ - ["Skills", "ABAP, and a reading knowledge of the UI5 control API", "ABAP, CDS, RAP, annotations, and someone who can debug the Fiori Elements template"], - ["First screen", "One class, minutes", "Data model, behavior definition, service, Fiori project, deploy: a day when everything is set up"], - ["Custom UI", "Any UI5 control, 1:1, from ABAP", "Extension points; past them, a freestyle UI5 project"], - ["Upgrade", "The framework is a transport; the public API is held by a snapshot and deprecations are tracked", "SAP's; the template follows the UI5 release"], - ["Reuse by other consumers", "None, there is no service", "The OData service, by anything"], - ["Runs on", "NetWeaver 7.02 to ABAP Cloud, UI5 1.71 to 2.x", "7.5x and later for RAP, ABAP Cloud for the full model"], - ["License", "MIT, no per-user cost", "Part of the platform license"], +/* The market, as a manager compares it. Columns: abap2UI5, then SAP's own + * two routes, then the commercial UI5 app platforms and low-code builders + * sold on top of SAP. */ +const rivals = ["RAP + Fiori Elements", "Freestyle UI5 + OData", "Commercial UI5 & low-code platforms"]; +const compare = [ + ["License cost", "None. MIT, for any number of users, systems and apps", "Part of the SAP license", "Part of the SAP license", "Subscription or per-user fees, renewed every year"], + ["Who builds the apps", "The ABAP team you already have", "ABAP plus CDS, RAP and annotation specialists", "JavaScript / UI5 developers", "Developers trained on the vendor's tool"], + ["First screen", "Minutes", "Days: model, service, project, deployment", "Days to weeks", "After the platform is installed and licensed"], + ["Freedom of the UI", "Every UI5 control, any layout", "SAP's floorplans and their extension points", "Every UI5 control", "What the vendor's designer offers"], + ["Older SAP releases", "NetWeaver 7.02 up to ABAP Cloud, one source", "7.5x and later", "Yes, with OData effort per release", "Depends on the vendor's add-on"], + ["Extra infrastructure", "None - one endpoint on your SAP system", "Fiori frontend server and deployment", "Frontend deployment (BSP, BTP or web server)", "The vendor's add-on, server or cloud tenant"], + ["Lock-in", "None - apps are plain ABAP classes in your system", "SAP's programming model", "Low", "Apps live in the vendor's runtime and repository"], + ["Source code", "Open, every line, on GitHub", "Closed", "UI5 open, your app yours", "Closed"], ]; const keep = [ ["What an app is", "An ABAP class"], @@ -71,6 +81,7 @@ const objections = [ ["Is this another UI5 wrapper that will not survive the next UI5 release?", `The frontend is UI5 itself, not a copy of it, and every merge is run in the browser on the oldest supported release and on UI5 2.x. Releases are tagged and listed (Release Notes); what is on its way out is announced and tracked until removal (Deprecations), and the public API apps use is held by a snapshot, so a change to it fails the framework's own pull request.`], ["Every click is a roundtrip. Is that fast enough?", `A roundtrip is one HTTP POST carrying only what changed, served by the ABAP stack that already serves everything else. For the screens this page is about, worklists, forms, cockpits, it is the same round trip a SAP GUI screen makes, in a browser. What it is not built for is a real-time collaborative editor or an app that holds its state offline (Performance).`], ["Our clean-core guideline names RAP. Where does this leave us?", "Side by side. abap2UI5 passes the ABAP Cloud checks and modifies nothing in the standard, so it is clean core in the technical sense, but it is not SAP's programming model. The usual outcome is a scope: standard transactional screens in RAP, the tools around them in abap2UI5, both in one launchpad."], + ["Why should we trust it over a product we pay for?", "Because you can check everything a vendor asks you to believe. The source is open, every test is public, and an app is a class in your own system that keeps running whatever happens to the project. A paid platform sells you a runtime you cannot read and a contract you have to renew; abap2UI5 hands you the code."], ["Who is accountable when something breaks?", `Your developer, for the app, the same as for any class in the system; the community, for the framework, on a best-effort basis; a commercial partner, if you sign one. Security reports are acknowledged within three business days (Security).`], ["Is anybody actually running this in production?", `Yes, see below. And every release is tested against Standard ABAP and ABAP Cloud, downported and linted against NetWeaver 7.02, and run in the browser on the oldest and the newest supported UI5 release (verified on).`], ]; @@ -104,8 +115,8 @@ const week = [ ["Pick one real screen", "One your team has to build this quarter — not a demo."], ["Build it in a development system", "With the people who will maintain it, in ADT or SE80."], ["Review it like any ABAP", "Read the class, transport it, run ATC on it, check the authorizations it asks for."], - ["Count", "The files, the systems and the tools involved, and the time until a user can click it."], - ["Hold it against the evidence", "This page against the security model and the verified-on page, with the skepticism you would apply to any claim — then decide from the screen."], + ["Measure", "The time until a user can click it, and the tools and systems it needed - none beyond your SAP system."], + ["Compare and decide", "Hold the result against any alternative or vendor quote - then decide from the screen, not from the slide."], ]; const doors = [ ["play", "Ten minutes, nothing installed", "Open the playground and change a running app, or browse the sample catalog for the screen closest to yours.", `${PLAYGROUND}samples/`, "Playground"], @@ -115,18 +126,18 @@ const doors = [ ]; ---
-

For IT management, architecture boards, product owners, SAP Basis and internal audit

-

Evaluate abap2UI5 with the questions a review asks

-

In the order a review asks them, each with the page that carries the detail. A developer who wants to see it run is better served by the Quickstart; send them there and read on.

+

For IT management, product owners and architecture boards

+

Modern SAP apps, built by the team you already have

+

abap2UI5 turns your ABAP developers into UI5 app builders - no JavaScript, no extra platform, no license fee. Faster to build, cheaper to run and freer to leave than any other UI5 solution on the market, commercial ones included.

Nothing to install, no trial license, no sales call — the playground runs in your browser.

@@ -141,45 +152,42 @@ const doors = [
-

The problem it answers

-

Every SAP system has screens nobody shipped

-
-
-

The cockpit for one team, the monitor for one process, the selection screen with a result list that used to be a report with an ALV. They are not standard floorplans, so Fiori Elements does not cover them; they are not worth a frontend project, an OData service and a deployment pipeline, so they stay in SAP GUI, in a spreadsheet, or on paper. And on a system older than S/4HANA, RAP is not there to build them with at all.

-

abap2UI5 is the shorter path for exactly these screens. An app is one ABAP class, written in ADT or SE80, transported like any other class, and it renders as a UI5 app in the browser, in the Fiori launchpad, or on a mobile device. There is no service, no frontend project and nothing to deploy. The rest of this page is what that costs and what it does not.

-
-
-

The cockpit for one team

Too specific for a standard app, too small for a project.

-

The monitor for one process

Today a report someone runs by hand, or a spreadsheet.

-

The selection screen with a list

The ALV report, as a browser app, logic unchanged.

-
+

What you can build

+

One framework for every process that needs a screen

+

From the warehouse floor to the management cockpit: whatever runs in SAP today on paper, in Excel or in SAP GUI becomes a modern app - built in your own system, by your own team.

+
+ {useCases.map(([icon, h, t]) =>

{h}

{t}

)}
-

→ In a Nutshell is the technical picture of how the framework works, for the architect who wants to see the roundtrip.

+

→ Browse the sample catalog for the screen closest to yours, or read In a Nutshell for how it works.

-

When to use it, and when not

-

One way to put a UI5 interface on ABAP — not the only one

-

RAP with Fiori Elements is another, freestyle UI5 with OData a third, and all three run side by side in the same launchpad. Written so that a team can disagree with a specific line rather than with a feeling.

+

Compared with the market

+

Better than every other way to build UI5 apps on SAP - the commercial ones included

+

SAP's own routes, and the UI5 app platforms and low-code builders sold on top of SAP, side by side.

+
+ + {rivals.map((r) => )} + {compare.map(([k, a, ...rest]) => {rest.map((t) => )})} +
abap2UI5{r}
{k}{a}{t}
+
-

Use abap2UI5 when

+

Why teams choose abap2UI5

    {useIt.map(([b, t]) =>
  • {b}{t}
  • )}
-
-

Use RAP and Fiori Elements when

-
    {useRap.map(([b, t]) =>
  • {b}{t}
  • )}
+
+

Nothing to throw away

+
    +
  • Your Fiori apps stay.abap2UI5 apps appear as tiles in the same launchpad, with navigation between them.
  • +
  • Your ABAP logic stays.A report, a BAPI, a function module: an app calls it as it is.
  • +
  • Your rules stay.Transports, code review, ATC and authorizations apply unchanged.
  • +
  • Your exit stays open.No contract, no runtime fee - the apps are yours whatever you decide later.
  • +
-

The common answer is not either. Standard transactional screens as Fiori Elements, the tools and cockpits around them as abap2UI5, both as tiles in the same launchpad with navigation between them. What it costs either way:

-
- - - {costCompare.map(([k, a, b]) => )} -
abap2UI5RAP + Fiori Elements
{k}{a}{b}
-

→ On-Stack or Side-by-Side and One App, Many Systems are the deployment scenarios in detail.

@@ -198,7 +206,7 @@ const doors = [
{governance.map(([icon, h, t]) =>

{h}

{t}

)}
-

The price is that someone has to write ABAP. There is no click-together designer for business users, on purpose: every app stays one kind of thing, a class, governed by the rules you already have.

+

No shadow IT. There is no click-together designer that bypasses your development process: every app stays one kind of thing, a class, governed by the rules you already have.

→ More on Security and Authorization, and the security model a security review starts from: what the framework guarantees, and which test holds the code to each guarantee.

@@ -207,7 +215,7 @@ const doors = [

No strings attached

Nothing to buy, nothing to renew, nothing between you and your code

-

What a review can check in minutes, and what stays true after the decision.

+

What a commercial platform cannot offer, and what stays true after the decision.

    {strings.map(([b, t]) =>
  • {b}{t}
  • )}
@@ -259,7 +267,7 @@ const doors = [

What it costs

-

No license fee, now or later — the work is what you pay for

+

No license fee, now or later — while commercial platforms charge every year

0 license fees @@ -272,6 +280,7 @@ const doors = [

The apps built with it are standard UI5 freestyle apps, licensed the way your organization licenses every other UI5 app.

+

Commercial SAP app platforms charge per named user or per device, every month, often with minimum terms and setup fees - and the bill grows with every user who adopts the apps. With abap2UI5 adoption costs nothing.

What is not free is the work: an ABAP developer's time to write the screen, and the evenings of the volunteers who maintain the framework. Support is the community's, on GitHub issues and Slack, on a best-effort basis; there is no vendor SLA to buy from the project. Companies and freelancers offer paid implementation, training and support agreements around it.

→ More on the License and Support.

@@ -284,8 +293,8 @@ const doors = [
-

The objections

-

The questions a review board raises, with the honest answer to each

+

Questions

+

What decision makers ask, answered

{objections.map(([q, a], i) =>
{q}

)}
@@ -316,9 +325,9 @@ const doors = [
-

How to evaluate it in a week

-

Decide from the screen, not from the slide

-

Take one real screen and review it the way your organization reviews ABAP.

+

Get started

+

Your first real app in a week

+

No pilot budget, no vendor workshop: take one real screen and build it with your own team.

    {week.map(([b, t]) =>
  1. {b}{t}
  2. )}
diff --git a/src/styles/global.css b/src/styles/global.css index 7682ec4..c04ee71 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -1,7 +1,7 @@ -/* Evaluate abap2UI5 - the one stylesheet. A product page for the people who - * approve a tool: a dark hero, light bands for the argument, the brand red of - * the logo for what to do next, and nothing that needs a script. Light and - * dark follow the reader's system. */ +/* abap2UI5 for decision makers - the one stylesheet. A light, fresh product + * page: a bright hero washed with the logo's coral, sky and mint, white bands + * for the argument, the brand red of the logo for what to do next, and nothing + * that needs a script. Light and dark follow the reader's system. */ @font-face { font-family: "Inter"; @@ -25,9 +25,13 @@ --good: #16794c; --good-soft: #e7f5ee; --neutral-soft: #eef1f5; - --hero-bg: #0b1220; - --hero-text: #e8ecf3; - --hero-muted: #a3adbf; + --sky: #0ea5e9; + --sky-soft: #e6f6fd; + --hero-bg: #fffdfb; + --wash-coral: rgba(255, 138, 128, .30); + --wash-sky: rgba(56, 189, 248, .22); + --wash-mint: rgba(52, 211, 153, .18); + --header-bg: rgba(255, 255, 255, .86); --radius: 14px; --shadow: 0 1px 2px rgba(15, 23, 42, .06), 0 8px 24px rgba(15, 23, 42, .06); --width: 1160px; @@ -50,7 +54,13 @@ --good: #4cc38a; --good-soft: #15291f; --neutral-soft: #1c2536; - --hero-bg: #080d18; + --sky: #38bdf8; + --sky-soft: #10283a; + --hero-bg: #0f1522; + --wash-coral: rgba(240, 96, 109, .22); + --wash-sky: rgba(56, 189, 248, .14); + --wash-mint: rgba(52, 211, 153, .10); + --header-bg: rgba(15, 21, 34, .86); --shadow: 0 1px 2px rgba(0, 0, 0, .3), 0 8px 24px rgba(0, 0, 0, .25); } } @@ -79,17 +89,17 @@ code { font-family: var(--mono); font-size: .9em; } /* ---- the header: the mark, the sections, one action -------------------- */ .top { position: sticky; top: 0; z-index: 10; - background: color-mix(in srgb, var(--hero-bg) 92%, transparent); + background: var(--header-bg); backdrop-filter: saturate(1.4) blur(10px); - border-bottom: 1px solid rgba(255, 255, 255, .08); + border-bottom: 1px solid var(--line); } .top .wrap { display: flex; align-items: center; gap: 24px; height: 60px; } -.mark { display: flex; align-items: center; gap: 10px; color: #fff; text-decoration: none; font-weight: 700; letter-spacing: -.01em; white-space: nowrap; } +.mark { display: flex; align-items: center; gap: 10px; color: var(--ink); text-decoration: none; font-weight: 700; letter-spacing: -.01em; white-space: nowrap; } .mark img { width: 28px; height: 28px; } -.mark span { color: var(--hero-muted); font-weight: 500; } +.mark span { color: var(--muted); font-weight: 500; } .nav { display: flex; gap: 4px; margin-left: auto; } -.nav a { padding: 6px 10px; border-radius: 8px; color: var(--hero-muted); font-size: 14px; font-weight: 500; text-decoration: none; } -.nav a:hover { color: #fff; background: rgba(255, 255, 255, .06); } +.nav a { padding: 6px 10px; border-radius: 8px; color: var(--muted); font-size: 14px; font-weight: 500; text-decoration: none; } +.nav a:hover { color: var(--ink); background: var(--bg-alt); } .top .btn { padding: 0 14px; line-height: 36px; font-size: 14px; } @media (max-width: 1060px) { .nav { display: none; } .top .btn { margin-left: auto; } } @media (max-width: 420px) { .mark span { display: none; } } @@ -100,42 +110,43 @@ code { font-family: var(--mono); font-size: .9em; } font-weight: 600; font-size: 15px; line-height: 46px; text-decoration: none; white-space: nowrap; transition: background-color .15s, border-color .15s, transform .15s; } -.btn-primary { background: var(--brand); color: #fff; } +.btn-primary { background: var(--brand); color: #fff; box-shadow: 0 6px 18px color-mix(in srgb, var(--brand) 28%, transparent); } .btn-primary:hover { background: var(--brand-strong); color: #fff; } -.btn-ghost { border: 1px solid rgba(255, 255, 255, .22); color: #fff; } -.btn-ghost:hover { border-color: #fff; color: #fff; } +.btn-ghost { border: 1px solid var(--line); background: var(--card); color: var(--ink); } +.btn-ghost:hover { border-color: var(--brand); color: var(--brand); } .btn-outline { border: 1px solid var(--line); color: var(--ink); background: var(--card); } .btn-outline:hover { border-color: var(--brand); color: var(--brand); } /* ---- the hero ------------------------------------------------------------ */ .hero { background: - radial-gradient(900px 420px at 85% -10%, rgba(208, 60, 74, .35), transparent 60%), - radial-gradient(700px 400px at -10% 110%, rgba(56, 97, 251, .22), transparent 60%), + radial-gradient(900px 460px at 88% -10%, var(--wash-coral), transparent 62%), + radial-gradient(760px 440px at -8% 108%, var(--wash-sky), transparent 62%), + radial-gradient(620px 320px at 48% 118%, var(--wash-mint), transparent 62%), var(--hero-bg); - color: var(--hero-text); - padding: 88px 0 96px; + color: var(--text); + padding: 88px 0 104px; } .hero .wrap { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr); gap: 56px; align-items: center; } -.eyebrow { display: inline-block; margin: 0 0 18px; padding: 5px 14px; border-radius: 999px; line-height: 1.5; border: 1px solid rgba(255, 255, 255, .14); background: rgba(255, 255, 255, .05); font-size: 13px; font-weight: 600; color: var(--hero-muted); } -.eyebrow b { color: #fff; font-weight: 600; } -.hero h1 { margin: 0; color: #fff; font-size: clamp(36px, 5vw, 58px); font-weight: 750; letter-spacing: -.035em; } -.hero h1 em { font-style: normal; color: #ff8b95; } -.hero .lede { margin: 22px 0 0; max-width: 560px; font-size: 19px; line-height: 1.6; color: var(--hero-muted); } -.hero .lede a { color: #fff; } +.eyebrow { display: inline-block; margin: 0 0 18px; padding: 5px 14px; border-radius: 999px; line-height: 1.5; border: 1px solid var(--line); background: var(--card); font-size: 13px; font-weight: 600; color: var(--muted); box-shadow: var(--shadow); } +.eyebrow b { color: var(--brand); font-weight: 700; } +.hero h1 { margin: 0; color: var(--ink); font-size: clamp(36px, 5vw, 58px); font-weight: 750; letter-spacing: -.035em; } +.hero h1 em { font-style: normal; background: linear-gradient(90deg, var(--brand), #f08a4b); -webkit-background-clip: text; background-clip: text; color: transparent; } +.hero .lede { margin: 22px 0 0; max-width: 560px; font-size: 19px; line-height: 1.6; color: var(--muted); } +.hero .lede b { color: var(--ink); } .hero .actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 34px; } -.hero .note { margin: 16px 0 0; font-size: 14px; color: var(--hero-muted); } -.hero .note::before { content: "✓"; margin-right: 8px; color: #6ee7a8; font-weight: 700; } +.hero .note { margin: 16px 0 0; font-size: 14px; color: var(--muted); } +.hero .note::before { content: "✓"; margin-right: 8px; color: var(--good); font-weight: 700; } /* the screenshot in a window frame, tilted towards the reader */ .window { margin: 0; border-radius: 14px; overflow: hidden; - background: #1a2233; border: 1px solid rgba(255, 255, 255, .1); - box-shadow: 0 30px 80px rgba(0, 0, 0, .45), 0 0 0 1px rgba(255, 255, 255, .03); + background: var(--card); border: 1px solid var(--line); + box-shadow: 0 30px 70px rgba(15, 23, 42, .14), 0 2px 6px rgba(15, 23, 42, .06); } -.window-bar { display: flex; align-items: center; gap: 7px; padding: 11px 14px; background: #141b29; } -.window-bar i { width: 11px; height: 11px; border-radius: 50%; background: #3b4558; } +.window-bar { display: flex; align-items: center; gap: 7px; padding: 11px 14px; background: var(--bg-alt); border-bottom: 1px solid var(--line); } +.window-bar i { width: 11px; height: 11px; border-radius: 50%; background: var(--line); } .window-bar i:first-child { background: #ff5f57; } .window-bar i:nth-child(2) { background: #febc2e; } .window-bar i:nth-child(3) { background: #28c840; } -.window-bar span { margin-left: 10px; font: 12px var(--mono); color: #7d889b; } +.window-bar span { margin-left: 10px; font: 12px var(--mono); color: var(--muted); } .window img { display: block; width: 100%; } @media (max-width: 920px) { .hero { padding: 56px 0 64px; } @@ -154,9 +165,8 @@ code { font-family: var(--mono); font-size: .9em; } } .stats li { padding: 22px 22px 20px; border-left: 1px solid var(--line); } .stats li:first-child { border-left: 0; } -.stats b { display: block; font-size: 30px; line-height: 1.1; font-weight: 750; letter-spacing: -.03em; color: var(--ink); } -.stats span { display: block; margin-top: 4px; font-size: 13px; line-height: 1.4; color: var(--muted); } -.stats p { margin: 10px 4px 0; font-size: 12px; color: var(--muted); } +.stats b { display: block; font-size: 28px; line-height: 1.1; font-weight: 750; letter-spacing: -.03em; color: var(--brand); } +.stats span { display: block; margin-top: 6px; font-size: 14px; line-height: 1.45; color: var(--muted); } @media (max-width: 700px) { .stats ul { grid-template-columns: repeat(2, minmax(0, 1fr)); } .stats li { border-left: 0; border-top: 1px solid var(--line); } @@ -188,6 +198,9 @@ code { font-family: var(--mono); font-size: .9em; } .cards.five { grid-template-columns: repeat(5, minmax(0, 1fr)); } @media (max-width: 1060px) { .cards.five { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 560px) { .cards.five { grid-template-columns: minmax(0, 1fr); } } +.cards.four { grid-template-columns: repeat(4, minmax(0, 1fr)); } +@media (max-width: 1060px) { .cards.four { grid-template-columns: repeat(2, minmax(0, 1fr)); } } +@media (max-width: 560px) { .cards.four { grid-template-columns: minmax(0, 1fr); } } .cards.stack { margin-top: 0; grid-template-columns: minmax(0, 1fr); } .icon { display: inline-grid; place-items: center; width: 40px; height: 40px; border-radius: 10px; background: var(--brand-soft); color: var(--brand); } .icon svg { width: 21px; height: 21px; } @@ -219,6 +232,11 @@ code { font-family: var(--mono); font-size: .9em; } .table table.two td { color: var(--ink); } .table td.us { color: var(--ink); background: color-mix(in srgb, var(--good-soft) 55%, transparent); } .table thead th.us { color: var(--good); } +.table.compare td { color: var(--muted); } +.table.compare td.us { color: var(--ink); font-weight: 550; } +.table.compare td.us::before { content: "✓ "; color: var(--good); font-weight: 800; } +.table.compare thead th { width: auto; } +.table .note { display: block; font-size: 12px; font-weight: 500; text-transform: none; letter-spacing: 0; } /* where it runs: the request path */ .flow { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1.4fr); gap: 18px; align-items: stretch; margin-top: 40px; } @@ -242,12 +260,12 @@ code { font-family: var(--mono); font-size: .9em; } .steps-basis li::before { content: counter(b); position: absolute; left: 0; top: 9px; display: grid; place-items: center; width: 26px; height: 26px; border-radius: 50%; background: var(--brand-soft); color: var(--brand); font-weight: 700; font-size: 13px; } /* the cost */ -.price { padding: 32px; border-radius: var(--radius); background: var(--hero-bg); color: var(--hero-text); } +.price { padding: 32px; border-radius: var(--radius); background: linear-gradient(135deg, var(--brand) 0%, #f08a4b 100%); color: #fff; box-shadow: var(--shadow); } .price .big { display: block; font-size: 64px; line-height: 1; font-weight: 800; letter-spacing: -.04em; color: #fff; } -.price .big small { font-size: 20px; font-weight: 600; color: var(--hero-muted); letter-spacing: 0; } +.price .big small { font-size: 20px; font-weight: 600; color: rgba(255, 255, 255, .85); letter-spacing: 0; } .price ul { margin: 22px 0 0; padding: 0; list-style: none; } -.price li { padding: 9px 0 9px 28px; position: relative; border-top: 1px solid rgba(255, 255, 255, .08); color: var(--hero-muted); } -.price li::before { content: "✓"; position: absolute; left: 0; color: #6ee7a8; font-weight: 800; } +.price li { padding: 9px 0 9px 28px; position: relative; border-top: 1px solid rgba(255, 255, 255, .25); color: #fff; } +.price li::before { content: "✓"; position: absolute; left: 0; color: #fff; font-weight: 800; } /* the cost calculator */ .calc-title { margin: 56px 0 0; font-size: 22px; } @@ -274,19 +292,18 @@ code { font-family: var(--mono); font-size: .9em; } .calc-actions { margin: 18px 0 0; } .calc-actions .btn { border: 0; cursor: pointer; font-family: inherit; } .calc-inputs input:disabled, .calc-inputs select:disabled { opacity: .55; } -.calc-result { border-radius: var(--radius); background: var(--hero-bg); color: var(--hero-text); overflow: hidden; } +.calc-result { border-radius: var(--radius); background: var(--card); border: 1px solid var(--line); box-shadow: var(--shadow); overflow: hidden; } .calc-sheet { padding: 8px 24px; } -.calc-line { display: flex; justify-content: space-between; gap: 18px; padding: 12px 0; border-top: 1px solid rgba(255, 255, 255, .08); } +.calc-line { display: flex; justify-content: space-between; gap: 18px; padding: 12px 0; border-top: 1px solid var(--line); } .calc-line:first-child { border-top: 0; } -.calc-what { color: #fff; font-weight: 600; font-size: 15px; } -.calc-what small { display: block; margin-top: 2px; font-weight: 400; font-size: 13px; color: var(--hero-muted); } -.calc-amount { flex: none; font-weight: 700; color: #6ee7a8; font-variant-numeric: tabular-nums; } -.calc-total { padding: 20px 24px 24px; background: rgba(255, 255, 255, .04); border-top: 1px solid rgba(255, 255, 255, .1); } -.calc-total div { display: flex; justify-content: space-between; padding: 4px 0; color: var(--hero-muted); } -.calc-total div:first-child { color: #fff; font-size: 18px; font-weight: 700; } -.calc-total output { color: #6ee7a8; font-weight: 800; font-size: 18px; } -.calc-total p { margin: 14px 0 0; font-size: 13px; color: var(--hero-muted); } -.calc-total a { color: #ff8b95; } +.calc-what { color: var(--ink); font-weight: 600; font-size: 15px; } +.calc-what small { display: block; margin-top: 2px; font-weight: 400; font-size: 13px; color: var(--muted); } +.calc-amount { flex: none; font-weight: 700; color: var(--good); font-variant-numeric: tabular-nums; } +.calc-total { padding: 20px 24px 24px; background: var(--good-soft); border-top: 1px solid var(--line); } +.calc-total div { display: flex; justify-content: space-between; padding: 4px 0; color: var(--muted); } +.calc-total div:first-child { color: var(--ink); font-size: 18px; font-weight: 700; } +.calc-total output { color: var(--good); font-weight: 800; font-size: 18px; } +.calc-total p { margin: 14px 0 0; font-size: 13px; color: var(--muted); } .calc-give { grid-column: 1 / -1; padding: 28px; border-radius: var(--radius); background: var(--brand-soft); } .calc-give h3 { margin: 0 0 8px; font-size: 20px; } .calc-give p { margin: 0; max-width: 820px; color: var(--ink); } @@ -347,36 +364,39 @@ code { font-family: var(--mono); font-size: .9em; } .week span { display: block; margin-top: 6px; font-size: 14px; line-height: 1.5; color: var(--muted); } /* the ways in */ -.start { background: var(--hero-bg); color: var(--hero-text); } -.start h2 { color: #fff; } -.start .intro { color: var(--hero-muted); } +.start { + background: + radial-gradient(800px 380px at 100% 0%, var(--wash-coral), transparent 62%), + radial-gradient(700px 360px at 0% 100%, var(--wash-sky), transparent 62%), + var(--hero-bg); + border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); +} .doors { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; margin-top: 40px; } @media (max-width: 1000px) { .doors { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 560px) { .doors { grid-template-columns: minmax(0, 1fr); } } -.door { display: block; padding: 24px; border-radius: var(--radius); border: 1px solid rgba(255, 255, 255, .1); background: rgba(255, 255, 255, .04); color: var(--hero-text); text-decoration: none; transition: border-color .15s, transform .15s; } -.door:hover { border-color: var(--brand); color: var(--hero-text); transform: translateY(-2px); } -.door .icon { background: rgba(240, 96, 109, .16); color: #ff8b95; } -.door b { display: block; margin-top: 14px; font-size: 17px; color: #fff; } -.door b::after { content: " →"; color: #ff8b95; } -.door span { display: block; margin-top: 6px; font-size: 14px; color: var(--hero-muted); } -.door small { display: block; margin-top: 12px; font-size: 12px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: #7d889b; } +.door { display: block; padding: 24px; border-radius: var(--radius); border: 1px solid var(--line); background: var(--card); color: var(--text); text-decoration: none; box-shadow: var(--shadow); transition: border-color .15s, transform .15s; } +.door:hover { border-color: var(--brand); color: var(--text); transform: translateY(-2px); } +.door b { display: block; margin-top: 14px; font-size: 17px; color: var(--ink); } +.door b::after { content: " →"; color: var(--brand); } +.door span { display: block; margin-top: 6px; font-size: 14px; color: var(--muted); } +.door small { display: block; margin-top: 12px; font-size: 12px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--brand); } @media (prefers-reduced-motion: reduce) { .door, .btn { transition: none; } .door:hover { transform: none; } } -/* no strings attached: eight facts on the dark band */ +/* no strings attached: eight facts on the bright band */ .strings { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; margin: 40px 0 0; padding: 0; list-style: none; } @media (max-width: 1000px) { .strings { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 560px) { .strings { grid-template-columns: minmax(0, 1fr); } } -.strings li { padding: 22px; border-radius: var(--radius); border: 1px solid rgba(255, 255, 255, .1); background: rgba(255, 255, 255, .04); } -.strings b { display: flex; gap: 10px; align-items: baseline; color: #fff; font-size: 16px; line-height: 1.35; } -.strings b::before { content: "✓"; flex: none; color: #6ee7a8; font-weight: 800; } -.strings span { display: block; margin-top: 8px; font-size: 14px; line-height: 1.55; color: var(--hero-muted); } +.strings li { padding: 22px; border-radius: var(--radius); border: 1px solid var(--line); background: var(--card); box-shadow: var(--shadow); } +.strings b { display: flex; gap: 10px; align-items: baseline; color: var(--ink); font-size: 16px; line-height: 1.35; } +.strings b::before { content: "✓"; flex: none; color: var(--good); font-weight: 800; } +.strings span { display: block; margin-top: 8px; font-size: 14px; line-height: 1.55; color: var(--muted); } /* the foot */ -.foot { padding: 36px 0 44px; background: var(--hero-bg); color: var(--hero-muted); font-size: 14px; border-top: 1px solid rgba(255, 255, 255, .08); } +.foot { padding: 36px 0 44px; background: var(--bg-alt); color: var(--muted); font-size: 14px; border-top: 1px solid var(--line); } .foot .wrap { display: flex; flex-wrap: wrap; gap: 16px 32px; align-items: center; justify-content: space-between; } .foot nav { display: flex; flex-wrap: wrap; gap: 8px 20px; } -.foot a { color: var(--hero-text); text-decoration: none; } -.foot a:hover { color: #fff; text-decoration: underline; } +.foot a { color: var(--ink); text-decoration: none; } +.foot a:hover { color: var(--brand); text-decoration: underline; } @media print { .top, .skip, .hero .actions, .start, .foot { display: none; } diff --git a/test/site.test.mjs b/test/site.test.mjs index ed0d9d9..6f77948 100644 --- a/test/site.test.mjs +++ b/test/site.test.mjs @@ -6,7 +6,6 @@ import { test } from "node:test"; import assert from "node:assert/strict"; import fs from "node:fs"; import path from "node:path"; -import { factsIn, splitFact } from "../src/lib/facts.mjs"; const DIST = path.join(import.meta.dirname, "..", "dist"); const BASE = "/test-docs/"; @@ -55,9 +54,8 @@ test("the canonical address is the published one", () => { assert.match(html, //); }); -test("the figures are read from the README block, never typed", () => { - const readme = "1,530 ABAP unit tests · 92 JS unit specs · 25 workflows · ABAP 7.02 → Cloud — counted from this repository by npm run facts"; - assert.deepEqual(factsIn(readme), ["1,530 ABAP unit tests", "92 JS unit specs"]); - assert.deepEqual(splitFact("1,530 ABAP unit tests"), { value: "1,530", label: "ABAP unit tests" }); - assert.deepEqual(factsIn("no block here"), []); +test("the page speaks to decision makers, not reviewers", () => { + // the ids stay addresses; the words a reader sees never say "evaluate" + const visible = html.replace(/[\s\S]*?<\/head>/, "").replace(/<[^>]+>/g, " "); + assert.doesNotMatch(visible, /evaluat/i); }); From 15545e89ec21c61d2ebb1fd0bf0300365c0a4701 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 18:07:34 +0000 Subject: [PATCH 2/7] Drop the audience pill above the hero headline Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0134Dawy9Fb26HLtDiHWfnT1 --- src/pages/index.astro | 1 - src/styles/global.css | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/pages/index.astro b/src/pages/index.astro index f8e8067..e8ae330 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -132,7 +132,6 @@ const doors = [
-

For IT management, product owners and architecture boards

Modern SAP apps, built by the team you already have

abap2UI5 turns your ABAP developers into UI5 app builders - no JavaScript, no extra platform, no license fee. Faster to build, cheaper to run and freer to leave than any other UI5 solution on the market, commercial ones included.

diff --git a/src/styles/global.css b/src/styles/global.css index c04ee71..65a6f53 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -128,8 +128,6 @@ code { font-family: var(--mono); font-size: .9em; } padding: 88px 0 104px; } .hero .wrap { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr); gap: 56px; align-items: center; } -.eyebrow { display: inline-block; margin: 0 0 18px; padding: 5px 14px; border-radius: 999px; line-height: 1.5; border: 1px solid var(--line); background: var(--card); font-size: 13px; font-weight: 600; color: var(--muted); box-shadow: var(--shadow); } -.eyebrow b { color: var(--brand); font-weight: 700; } .hero h1 { margin: 0; color: var(--ink); font-size: clamp(36px, 5vw, 58px); font-weight: 750; letter-spacing: -.035em; } .hero h1 em { font-style: normal; background: linear-gradient(90deg, var(--brand), #f08a4b); -webkit-background-clip: text; background-clip: text; color: transparent; } .hero .lede { margin: 22px 0 0; max-width: 560px; font-size: 19px; line-height: 1.6; color: var(--muted); } From 98d7dacaa3b3e020216d878894d4d3bdeb6f4478 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 18:07:49 +0000 Subject: [PATCH 3/7] Hero headline: modern UI5 apps Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0134Dawy9Fb26HLtDiHWfnT1 --- src/pages/index.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/index.astro b/src/pages/index.astro index e8ae330..f1ecb6e 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -132,7 +132,7 @@ const doors = [
-

Modern SAP apps, built by the team you already have

+

Modern UI5 apps, built by the team you already have

abap2UI5 turns your ABAP developers into UI5 app builders - no JavaScript, no extra platform, no license fee. Faster to build, cheaper to run and freer to leave than any other UI5 solution on the market, commercial ones included.

See it live From c982e2bfa56a2b648840d97acf0f41b15fa59dd5 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 18:08:21 +0000 Subject: [PATCH 4/7] Keep "problem" out of the visible text too Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0134Dawy9Fb26HLtDiHWfnT1 --- AGENTS.md | 2 +- test/site.test.mjs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index ffc8c12..57be42a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -42,7 +42,7 @@ npm run check # build + test, what CI runs - **Nothing from another origin.** No CDN, no web font service, no analytics; the font and the images are in `public/`. - **Written for managers.** No technical counts (tests, specs, gates) and no - "evaluate" in the visible text - `test/site.test.mjs` checks the latter. + "evaluate" or "problem" in the visible text - `test/site.test.mjs` checks the latter. - **Toolchain:** Node 22 (`.nvmrc`, `engines`), every dependency pinned exactly (astro 7.3.8), actions pinned to commits. - The site is written for people. Links into the manual are absolute diff --git a/test/site.test.mjs b/test/site.test.mjs index 6f77948..4cdf60d 100644 --- a/test/site.test.mjs +++ b/test/site.test.mjs @@ -55,7 +55,7 @@ test("the canonical address is the published one", () => { }); test("the page speaks to decision makers, not reviewers", () => { - // the ids stay addresses; the words a reader sees never say "evaluate" + // the ids stay addresses; the words a reader sees never say "evaluate" or "problem" const visible = html.replace(/[\s\S]*?<\/head>/, "").replace(/<[^>]+>/g, " "); - assert.doesNotMatch(visible, /evaluat/i); + assert.doesNotMatch(visible, /evaluat|problem/i); }); From 2ad6b16dd0daf25a2c61774b86d70a3160f51a6a Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 18:08:38 +0000 Subject: [PATCH 5/7] Menu and kicker: FAQ instead of Questions; keep "problem" out of the calculator text Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0134Dawy9Fb26HLtDiHWfnT1 --- src/components/CostCalculator.astro | 2 +- src/layouts/Page.astro | 2 +- src/pages/index.astro | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/CostCalculator.astro b/src/components/CostCalculator.astro index a042dd1..3817baf 100644 --- a/src/components/CostCalculator.astro +++ b/src/components/CostCalculator.astro @@ -43,7 +43,7 @@ const lines = [ const give = [ ["Star the repository.", `One click on GitHub, and the next visitor sees a project rather than an experiment.`], ["Answer somebody.", `One reply under an issue or in Slack saves somebody else an afternoon of searching.`], - ["Report what broke.", `An issue with a class that reproduces the problem is half of the fix already.`], + ["Report what broke.", `An issue with a class that reproduces the bug is half of the fix already.`], ["Post about it.", `A short post that mentions the page and carries #abap2UI5 is how the word gets around.`], ["Add your company.", `One row in Who Uses abap2UI5? is what answers is anybody actually running this?`], ["Sponsor the work.", `The contributors, and the open-source projects it stands on - the smallest amount is a real one.`], diff --git a/src/layouts/Page.astro b/src/layouts/Page.astro index f6893e2..f11e6d6 100644 --- a/src/layouts/Page.astro +++ b/src/layouts/Page.astro @@ -29,7 +29,7 @@ const sections = [ ["no-strings-attached", "No strings"], ["where-it-runs", "Platform"], ["what-it-costs", "Cost"], - ["the-objections", "Questions"], + ["the-objections", "FAQ"], ["how-to-evaluate-it-in-a-week", "Get started"], ]; --- diff --git a/src/pages/index.astro b/src/pages/index.astro index f1ecb6e..c20ac5e 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -292,7 +292,7 @@ const doors = [
-

Questions

+

FAQ

What decision makers ask, answered

{objections.map(([q, a], i) =>
{q}

)} From ea639ed38abc69124d0ccada36b244e22c9366a6 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 18:09:51 +0000 Subject: [PATCH 6/7] Add an AI section: one class an AI writes whole, AI Studio, plugins, linter Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0134Dawy9Fb26HLtDiHWfnT1 --- src/components/Icon.astro | 1 + src/layouts/Page.astro | 1 + src/pages/index.astro | 27 ++++++++++++++++++++++++++- src/styles/global.css | 3 +++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/components/Icon.astro b/src/components/Icon.astro index d4ff007..83709e0 100644 --- a/src/components/Icon.astro +++ b/src/components/Icon.astro @@ -20,6 +20,7 @@ const PATHS = { check: '', form: '', phone: '', + spark: '', leaf: '', }; const { name } = Astro.props; diff --git a/src/layouts/Page.astro b/src/layouts/Page.astro index f11e6d6..bdcd770 100644 --- a/src/layouts/Page.astro +++ b/src/layouts/Page.astro @@ -25,6 +25,7 @@ const CSP = [ const sections = [ ["the-problem-it-answers", "Use cases"], ["when-to-use-it-and-when-not", "Comparison"], + ["ai", "AI"], ["what-you-keep", "Governance"], ["no-strings-attached", "No strings"], ["where-it-runs", "Platform"], diff --git a/src/pages/index.astro b/src/pages/index.astro index c20ac5e..c98f579 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -50,6 +50,18 @@ const compare = [ ["Extra infrastructure", "None - one endpoint on your SAP system", "Fiori frontend server and deployment", "Frontend deployment (BSP, BTP or web server)", "The vendor's add-on, server or cloud tenant"], ["Lock-in", "None - apps are plain ABAP classes in your system", "SAP's programming model", "Low", "Apps live in the vendor's runtime and repository"], ["Source code", "Open, every line, on GitHub", "Closed", "UI5 open, your app yours", "Closed"], + ["Built with AI", "One class an AI writes whole - AI Studio, Claude Code and Copilot plugins, free", "Many artifacts for an AI to generate and keep in sync", "Two codebases, frontend and service", "The vendor's own AI, at the vendor's price"], +]; +/* Why AI and abap2UI5 fit: one class is one file an assistant can write + * whole, check without a system and hand over for review. Every claim is in + * the framework README's "Build with AI" and "AI Assistants". */ +const ai = [ + ["spark", "One app, one file", "An AI writes the whole app - one ABAP class. No OData service, no frontend project, no deployment to generate and keep in sync."], + ["play", "From a sentence to an app", "The AI Studio builds an app from a description, right in the browser: written, run and fixed against the real framework, ready for abapGit. Nothing to install."], + ["code", "In the tools your team uses", "Plugins for Claude Code and GitHub Copilot, skills for any agent and an MCP server that validates, runs and screenshots apps - without an SAP system."], + ["list", "Learns from 700+ samples", "Hundreds of working apps and documentation written for AI make the result right the first time, not the third."], + ["check", "Checked before anyone looks", "The abap2UI5 linter tests every class the AI writes, and the AI fixes what it broke before a developer reviews it."], + ["chat", "AI inside your apps, too", "A chat or a summarize-this-data panel in an existing app, with a local model first or the provider of your choice."], ]; const keep = [ ["What an app is", "An ABAP class"], @@ -191,7 +203,20 @@ const doors = [
-
+
+
+

AI

+

The UI5 framework made for AI

+

An AI assistant is only as good as what it has to produce. With abap2UI5 that is one ABAP class - the simplest target there is for an AI, and the easiest result for your team to check. Your developers describe the screen; the AI writes it; your rules review and transport it like any other code.

+
+ {ai.map(([icon, h, t]) =>

{h}

{t}

)} +
+

No AI lock-in either. Use Claude, ChatGPT, Copilot or a local model - with your own key, at your own price. Commercial platforms sell their AI as an add-on to their license; abap2UI5's costs nothing.

+

→ Try the AI Studio, or read Developing with AI.

+
+
+ +

What you keep

An abap2UI5 app is ABAP code, and governs itself like it

diff --git a/src/styles/global.css b/src/styles/global.css index 65a6f53..8dcf6ff 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -196,6 +196,9 @@ code { font-family: var(--mono); font-size: .9em; } .cards.five { grid-template-columns: repeat(5, minmax(0, 1fr)); } @media (max-width: 1060px) { .cards.five { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 560px) { .cards.five { grid-template-columns: minmax(0, 1fr); } } +.cards.three { grid-template-columns: repeat(3, minmax(0, 1fr)); } +@media (max-width: 1060px) { .cards.three { grid-template-columns: repeat(2, minmax(0, 1fr)); } } +@media (max-width: 560px) { .cards.three { grid-template-columns: minmax(0, 1fr); } } .cards.four { grid-template-columns: repeat(4, minmax(0, 1fr)); } @media (max-width: 1060px) { .cards.four { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 560px) { .cards.four { grid-template-columns: minmax(0, 1fr); } } From fb6d3d8f11c8b3be619d229f1e7b7a86ddb8cb55 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 24 Oct 2026 18:25:40 +0000 Subject: [PATCH 7/7] Show a running example app on every use case and in the AI section Screenshots of sample apps from the playground's catalogue, run there and saved as WebP under public/apps/; each card links to its sample page. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_0134Dawy9Fb26HLtDiHWfnT1 --- public/apps/z2ui5_cl_smp_app_070.webp | Bin 0 -> 15844 bytes public/apps/z2ui5_cl_smp_app_530.webp | Bin 0 -> 7162 bytes public/apps/z2ui5_cl_smp_app_540.webp | Bin 0 -> 12286 bytes public/apps/z2ui5_cl_smpc_app_024.webp | Bin 0 -> 16792 bytes public/apps/z2ui5_cl_smpc_app_089.webp | Bin 0 -> 7256 bytes public/apps/z2ui5_cl_smpc_app_108.webp | Bin 0 -> 9346 bytes public/apps/z2ui5_cl_smpc_app_291.webp | Bin 0 -> 12576 bytes public/apps/z2ui5_cl_smpc_app_329.webp | Bin 0 -> 5224 bytes public/apps/z2ui5_cl_smpc_app_517.webp | Bin 0 -> 20202 bytes src/pages/index.astro | 28 +++++++++++++++++-------- src/styles/global.css | 14 +++++++++++++ 11 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 public/apps/z2ui5_cl_smp_app_070.webp create mode 100644 public/apps/z2ui5_cl_smp_app_530.webp create mode 100644 public/apps/z2ui5_cl_smp_app_540.webp create mode 100644 public/apps/z2ui5_cl_smpc_app_024.webp create mode 100644 public/apps/z2ui5_cl_smpc_app_089.webp create mode 100644 public/apps/z2ui5_cl_smpc_app_108.webp create mode 100644 public/apps/z2ui5_cl_smpc_app_291.webp create mode 100644 public/apps/z2ui5_cl_smpc_app_329.webp create mode 100644 public/apps/z2ui5_cl_smpc_app_517.webp diff --git a/public/apps/z2ui5_cl_smp_app_070.webp b/public/apps/z2ui5_cl_smp_app_070.webp new file mode 100644 index 0000000000000000000000000000000000000000..37d7ae08420c9343084e732502e0d77fe69ea779 GIT binary patch literal 15844 zcmcJ#Q;aW8@ICk$+cS4;+qUgHwr$(CZQJ%8+qP|czrX(`i|p>>)9Ssm4I@9s0cuwfcO$5a-~a(i5Ux#DE~1aLz&q=a47!n z0ZBkG7PeelS(yMNclWRz#M#KcPEmSTV(_^9Qok-eu^$27{O4NVesl8I*6SKb>&%me1C*v z{<*%@U&mj`-@$MGh21B;ProU@mZzo<@pro){*xb|z6?LJ-^m~4O~2pYPJ|u&-=Fio z*1q50b7*9E*bR`WdP3cS7~{zw*(A(Ci$3sp^~=dP$A6xSixSX(Dc-ma>W(KOk%XVK znCnwTi12GdK|XyQXf%0W;%a~YutsEfO}}BTvnoF-y_A}xq=`8iKN$to#7hgOSO;q2 zR2d`B9cvMY!2CuOVJ`zWs*KB0053<~^|mNb$Ih+~S$~3kx-J-_` zxsu<2irUl?%F3|+K{au*B2Tr{{QrZbe?cGr_ndU$VIGI4j5MR4*5>`uJeJO@a$=B2 z2Bpb}K=~tunr|k3|MYW{D+Xp4EbMkDxa}YayFox!egE{DzUdVMvnvM1gft}KbP}K?9KogN4HHade_U9~ak2gc*mcoi}DVDJftB%!KFBWwW|JDy zqPbs=n=0()fmo$VmW-GlMJ9?vmgE0MiT}PO4u*kcX>FoL@$BlthqCY;7xVt@UEeg$ z*2+9PM#*bpxtM(%)qxmGv2Pv`!oeyIV3*v|vopcdzJeOXC#pkrTeY*v7@p_Sj9}N&&tWG%(Ld=Hn zxwV16PG1-4E|ZtL23eZp62wnq7m!bGY)!R(zm;|F6MeAna_i(c2lo1YZR|D37ut}u z32r&S>Y_^qlyG4Dk=vSz9&RBmWaTn!JHPIJ)fG)k;GrQ;fA33%-y>^_<`zk}dh{5EPLNtV+nW}{uky#XUZd5LMtXqN&0@WL(sS%;b5 zo}|5)1dDdG#mro~x1?dc8kEEKXqOjg-Nr)@&bAyD@?`*RI6fAs$Z*uP+X~M z6<9q+##rm)4uydlnUpt?WHDW_VdqMOM~Do^@maek!u3RatZ>Rwl+ka0_=WNaEvU2u z$#BeSR07GBloSfS!;rvBW)ov8L#+%oy+vWJ!FVfM;<|nXbf)jBER^$(Jy!fR(GIN; zoI`sL-NX%YBT2k!t2{U8U_kL7*jCUrNCc7Xt+VZQfz7=HeT{Pf4j$P6{7f0`I>9;N zorA_Su=*Cd7gk5zWYf33=tw(O-9n0=OkoHI9tR81+*{_)Ozqf!(o3aOGwo)kLZE!u zcqzyUqVMHo9zJ6y%zN_x^8}$zhsiH5)trb5hx27>Z>7q`i(gDajq12u`fqSJ7+;%3N40==ts6retf_fT5SMf_4qGzwM zoTe6%A|jurCJG|Y#K>yAp0wUhupIbP$D5;)SBwL7W+MJ-Ro-i0pgR%0ccQU{0U4S* zsL&s&Jb|V#5+f9odKv!N?c}2+g|D+~{ps^gn95(p$ku{uI^^Kh!9R09P%t^4QKnsK zslE+lWqd*1O0am=Ve@D&L(vk7$)>-92a9K(*SW6Mb?Y}w4n)%m_ki8g{}i}mUAKgI z7-XBlEfM2LRaBvw5?e3GU)$@gbY8a->H#^evGh33S(EgRpXW z$>){4EfdpwJ?EriQJMzakhZ(Z-TN8A&2cqVQ;+>yS1FwxPHEClVn2Ga@I?5{n?nO&~EfIBstzdz8~o*Cgf%TAUzl=|Pd zqlThLxAsl2df2RjDbfI~KGoEv5ud{LI?uaio0%CzZ105sUd>kAH*_$Z|6;mQJAtiw z=a%&uX6gg2k9+d7zn&+Q4&l+)?rJty3bbQ)gPZY0>Hq)F1`7b-=aG}nCDS4&@P1nr zB|d=ocCmG6zNdlDG)C8xFIj(3)PzY=fOE`>2x}|R>tQ-%eYW(W(NZt=D`UdStB&!Igk?5_*q#W;VEl4$JxTH~Z`hj^xc(8yqrT@9OguoS9dC!nrfc9Cvz0 zt(&*|JUF%)NmSeC=Mt}lN_E}I;B85WUk7OhiwoMz%R{0(%XI*qYRQiB$HB#^?h8}( zZqa-uq34J&_LRz^k!hvMxb+|bWV*5U7(B@0Q*6jQ0lXa#WX-js@mr_&&ts2ulEk~G zCr@8}o^)%`RgbSr5)rwsU;eGDxDf>4VDtE(F%m(7t!FSq$u8~s@WZ(arleFW@+(0l z&BhgoU2nvpKq%T$nj>9v;Enms`! zwJVfsTzES{(I?l|SCoNOUJeE9Is}V^S+okKYv-dsvVgL(n>(CM`K2=jiR_T(UU8sP-)_P5?LOEj;S)ndtYy9ed_Aj$- z577lh?kylg`|};avpDAhi??E4G;Ue4>w#WvRKeeuH;1^!#=E(C;a}h#1ec|Er&_hI z16r?S(3iAiT#{a#GxpxNmtB`X^)Sl&ZN^^#hAAut7Dpa;hqn9aOUqvsX8LM|E|_yY zdhBSMp3sjhyI;QaM+q(TSn%zx6U_(dRG|!-2t}WEBVA%r&lgb*)YGJ(C!mq;`2du| z;nxPWb&Q|Nyvi9*1RKO?_wZ)xg)g)L9jiHtT|pNUi33U9(lmy~vt2R0XlE56bU6$9-5=djE zqqs3ivv8kq7K%a{uO$79XK{>8ehhy%>>P^wo~yJ2zpO1TUeIpMTI|yQB()!8m~Azk zB!!*wz0+v>87geF_y6foO}mAzrMAWpNlHwjDfYtqB)m{`WZGdO-R#iFQ4ullNb+7; z7}~?RYl^DFbgnqia9wh_WAPk%wf>C?O?r3qeREe&`?P+0TVY78iLsz3O`LfiD|9}- zF$T&EAH^9|7L0qRWbeKw|29LA)sj&d!hZScF}tDgo`km+HL(t0P=OAiqv)U&)^4X#wX&+ic?4L#hafLwn!ep%mpU! z6ffxxVj!+aIQ)>Si*xvuERC5{R>xwe#=A{d#?50Y0)MBhKvDl(GM?JeR)xyvqPC_# zX}+=Y3Lhv5{@F*ak3a=l%`2VUpmi(-C`6IDmQzfL2M;g>CK;R|=)=Tc+CA|_R~hz6 zVMu;SW%S54EKOh7#FpAATe~oOW*Jpvt$xc5^cx|#!sw$p%JQnIG39a3Ou%;rYlpTz zR%5^NOBYI*;_pDaZWzB-H3|WKXjIfyD`rjY-^zfuxbdV<3(WCP$!7g9l1-h<4aPWC z$YklEHSF?IPhRJ7_`-aVtL&!Kv~2q4USv%5 zvK&6HA~{@qNARjTRL;IDC&gq}k4190KEf06uA-s$CA7K5ornxLVlIiF2Bp4en3%UB zE%GR3%hsPPPu$~ar3V!LTn}oXv8Nk9sE$#X{y=II#m)b0(O*zmTx0Lv(Rq+Rb!dNZ>2 zil$h8a?|ri7YV3%6s$amOP4_bqD9F!%YB|E+U>7X4(EaybBco!CR6-(Y+M@9p%{%2 z9O7ja!o2L&tPJ!I2Y24!{H=K;JH(6hU{-_Frmd_P=x~sdl+b@}0iF`y{56h+@E_BiogYYE7AuSbXIM?)D0yTY# z6q^L*$i&L0S*$HX(w8=j2p5zZPP ze5YRO3y>I=(LR_`XE(3uG(0|JsVSuyd9)=GjbhREmqJ>T%yf*(N>qIYn8v zbOji0{c6n*#M7s6$xTl$-QY%o1qlA_w!{UIe@G({G>v=f1_LIlg=a0Xr=R&_TYHbUz-p&|E<-i zev`0npZtSWMbXB_a?O_9lx7%0^-ooT)#gA})3Z0FQM%W#ALmt$00J2UOd>WWevfC7 z->6qDXn?4;X2%js)--%yS^USac-##nFGSTe)9P3}@HUtS(GC%NZ@0xyVmL}zP#n3D zf}G3Q71%nLi$G30%Ym`3`DMd!6U8X$UxZHW_MNDGr$IKw*Ku^nf8xPl`)_;i#MCF@ zH8wtNbQ%de1fTBQSf(k(;%>65&O0%Zv40nu@VB$H?5x{IB7?%IR?A|u&q#{iizZtw z%*c_Et4#_JJ=?0?swmP$*NnslOsl`79@gb+2*E}{=l@ptjuh- zhpN!#utBriGVB*Y9zvihERiZob!o&qjsZkxjFiqvE6*gQmsWE(ZWZ^Sj#6BoClM|q z4>p}F%V%C=TZR$4z#?u_S`~X(koZY^5{nP?<^jsslXb=aIG^vXdtJiGQ&2r46Cy@z z?Fu8&@JWqleL4T98r}tlQ&sE6?I}E6@Nm8tQE zrero#qKbdj94HCD(93?kOK%A^tS`*JviyB;acr3}O!vtV9ZVK69mXBvIkwzh#MDK6 z>Z^uE68GZjoFOSNaQneIJ3|YaT0esA7jfwv$$UUCPx;Gy*!rP0OIhHXDQ`ChxZRLyt-CAA$LuDuTOQv+vw%@TK_m{|?toii69g@Z@jr1^@=WPoGXr z9yB9fzo~~M)~B$FwR6!DxU=U9MFK)TW`Fs^B`WmnWe-*FL8R2)&C6tJcs^<1K#oX# zQsgIB>mm!!M3NW_*OvG2L9rcXW zsk9RE*8V{0SX_a=oD5xVX#t?QLD_qs8^$=DpDbBr)<=ixDJC=bVE zh;Gw!I_9Ax&p)u8X#l<-=MVv#4J0HwAqmy6S>QRnO;iL$6R3H*(a*>hwlxnHL66aI z*5f_HVTcpLxEjdok4wY}Edr1ZyxA?4XHuy|VYAoNiKmecsM1kOyus1-DXxm#HH}&D zAM;);=wUlX@d-+x+9%lQbqB|5lv$rZkGYbpog9}4o$T$q8j z7mFfRGs5JG#&5=lkAEVV%XzAL`u61tp-v)-BacJap8j?{A061Fo-s{LGf!)1XJ^&1 zwknspa=Mdq*nY-D4p&**v+454K}pEg}H00)F4<3B* z=#%JNhzPsAU_q>fY%V8PK)J+>M zLo)CGpz)}lS48~$PjP5LmzdRjwBhEoi6?cQ*s#bDg0_mwR}d7Q@{V2x9A30|MTHp0 zTE6WI0%C6<{ye0HfkqJJMyYi6*r=Tz&48C6;JGR7Tl1D3LoT>wgN-QIH)GqWjNeso zUM{4pR&1iBMO=_TFa7gX!ibsf;d^iaQ;0)rnQFa-+$?@&!iH5ZOCC)9vJ~N{dCfIk z_J*f(QJ0Sp-xCnxRv2ah%FS1<{BU1_?)zYILXe}NT=Ga-zdC+m4{MyDlPlBLQS#Fx zvbgH=p|(VYK7}_%F&s-qWM(w~o;b-)PB+g=azFYE7Kl;{1USV{0KrOiLq4CjU-yQ< z*kSl_rZsNPaJqHpwJL)8BR7kofe%dwe7|auQ+uXw&c)~;I;AUx*3sz}JGGsm+cn?< zwSQ(Pd&|KB3Z0hxAf~dO`wx6F1S-1gXyK6EMQNCH8_U^_mj;oq9k-G_er2I5&rwaH z@IhVAVW{{NOc9zAQAoWoA~6!0(x(<-DFlG>JehZk9sZM@#nqJW%KXB4)zPl6MDH{I zjfC59!4zbEOx-g#GtGu`s58v%QR3|y%dO;}&l*MngZFgd_Uy2FUd%dY|A|v!O z*alt5s1(|+EcMHs4D;`cZ*i!0_KnP*%9fQgld1C|)>JU}plojp6j}}+@LJKq_PhT+ zV?BWq1&ZGT86^raCudFZb$HPYOuD4`wimxi@@yj=o|CQ|l;JTaHXbRyXxykC70dE? zl|7E<*pZ&C6TxrKbt#NVVxc~uKlh_S5i2(FbgS%tx}3LM7Q^&VNPX<3Yt@Z))p}y% z{crI%(ED$<2IGjP$rX!1n!F)~Vk(zH_;e*V>!pTkMx5q~IA@Q$$}RwLGX0<_zd}G@ z2zKX~2P=`J)bUh|!BKcWHueiNT?1CImP7Rwn$c|yo~vXM_Jd06L8r{hcHH#&@&&C( zaNHI6k{cPYdbxJhvu7KZNBYGJprq3p1@*&j&n1IXXjL}E9^7|9P8?B^ZTHaC1RQRvJ#%Ws3qSo&h4>7vupb>jjL6h#+A@EQA zCkb(R4Lp}%)R!TvWa==;O(%$re^t={*Q&UnKnCvBJ$sMMUi)$v{TBH*H!zFEO5=*S zbmpUjH_a(YZlreQVyx{#vTm&4GBe)AxE!oSb`YP)Vyo68+Haf{!06*4M{lD%XXxY- z$8raEKp1uOrcj+fi2mOXv(!4d-Sx#xCruMo{=JOT$Ct{uWsOz*finv*lg$@q%>Ji^ zRd~&-alNH6?J;Z^0~c%G{t7(dsD9vx@7VqHe%(J}M>nvW(^YtjXUD z^DGkot<(#aHq4)>>RLO#;nthfa0Q-E6WS_YIG*(Mfg~fF4Q1#b2osn-MLS8o{}*vd zJ|)-Cq1Fgj@i-BWsynLG7i^`PBb0va2_GD7VVQ#SGIbc&H*8(WP}D~x4o>u>dZ9E; z^fV^tPv1Uhw@_tz1NrI~VPPKy1yn6F(o!%EOrr4oTKk2h>&f#+R|&EEavI(?;d~dT zpxJ`*ul|i-zZu3o*pY;emNrTNt+pcdo!G<+zcijSkn=hsPn8uMpQVM)7(JOHVl%fY z3w-Mb@1$f5l1tCq93LW{O6@MSh)9c`myd!wlEBMc68JH(18j(q7F3T%simeQZN9pg z!Pt919PhzypVvCBKfy2cIF^#9MYLyb>0F@MpH0i$1YxylybKwSU&@TrghWR*T>ikx z9q=RKki`Wa_<%k(9Tn8Odre?fr8?+(QRYF#AaGsS#|qN@$tlK87ext&hH#lAs;1!# z3+Eo!_nS%w96i^0Mmg54IhC`X-_`Ice<$%Hy)U^x@lzj*20lvDtUqi5O%#~Di_K)v5I%^)CM0W_M)dSlea(MtcXo7 zWTb&l@5v%hUr;SACNY~3R!`*7eJc2PEFzH=jcaT((WdT?S%|g^e=qHYgz2Q5)M(p( z7lYnsrF{yL3mLiTk7QN;zEolG_RnK4m%=s3?h;rGId#VIN@T8XTj}kqmz`QL`4)q2a27x%5ejy1w^RU_`eB7GVGkV%rW^ zK|Uuga(vA4t0KDsylQ!3!x>NFPZq^wd7Fu0MXXuV>ed&+;$@8>$wB22+RB#RN#L^$ zLOb}+e->E0ZTVj@69eci^+IKIO(qrB#CJ-s8dbaRckGO0UM_Rmpb}d)L-hc{Kk#>& zfEI9t(BV6rMa6K4iJMWZnItwu7swsaTq~l%(tXeKaH;0|M1gXMs&WIfljY)Zzws0N zir?1&R= za`&vI;qs(s*W{~*gm{?|OeYbp0RM7?E_BVl7j|bwA`4RLH zXAR+RRu!OACal^%F3Fs$KVBbh6O?f0C7e>a*?4EI&z)TbzD9?h)y z{E_8JUCM~KegI@))rr+r%DEig6U~{Pnd4Nc&q>t?wbgE5S%B#p5*Y}vTQd?-Jt(vF zOWParILTb`>4jhSq{i$WPA?cX;P{Rrj^=_il}5+iRXdAEB(fiIx@lu~Pn-d62iV2m z@eNgp6Ol>v7g&uvPPlF&kpU|$qNdJFTI7+tFcS?qDltlV6W`oL_?Y{uc z1k4C&d@T0IXq?un)_2i^md=TY{j`nZn6BI&5BCn^^V`6E8(QBjl3Jy&rw^cbNcch; zC&78(J0Ft=1mZCoHxeZ*;=%t$kG3A}>fe+d@0Y3zNvTRjWrMm5RB$5Y%%Chbs#46p z*Y|Rdgk}{e?|WhSq~tIw!zj~DD`B{`!rFQ=0!H%9$q?B}hpPD$ry6fp0wSl5o&)|g zhw&pY*wgg~4MdAoSpFyl1lUr6y|vO_uv02ad6@46AEG?5>s?Ef%^s*k=2%>mszvXh zk?qC8j+!4`U&HAJxQ_FustvJK=ah7pc>KqUlhZK3{>fOjDX0CL105wta&Ig_xhXZt zkFJ0aNHr6-Mn{@<#?$xE&e_yImc_;Wn1Ks12;Xbxp!ez{b7U_~Rq*=w^;}i@yG5Gn zkU`Qmzf(%|wWH+j-BlgyTNY3*x0Z!hjwDFi9ldNh|bv1 zx7I~T*>t-7&h^z8T-n2Q1O`AIr61L_J~qfR8#OkXqD6)epcM+H?J59Jllqo!A~rF6uAp>`z|l zd~!3yc{BvKhvn4nS73XgDfJpc0mE#N1(g!SBuQwM`G*9=-N_|g2xEc_ zOJO=%JQK5EP6@=?vUY0isoR)(%W!^D{%=n?d9uu%&k{>YxImR^hm}xmO`eHaNT*sZ z6@3{(9eI1zj*MNb6=(~iKAXRxlLVBtbbsMctOtit23bp4Gz0hL=DSK^H7o`oYgmUV zo|yiO#*JNNJUdq~^lVWzM_9cK4u#vi2ZS@klc}J0t`iME4T&`GYxKSk)vexJ%0Muj zUv!Id--^NPU$97<95;UgZLEM8=n}F(_M$gn!Gli>3xdlAvpKX9f?WU_0^fleqP(&= z+_h+m`c+ZBK~iYlw@U)x4M=Q*ooI|vlY#L=*O)?m)@!Lh)1=jh@;uZ87mkBd6ZAe0 za>b1i6CjtESI9ZOEt(;u2h#g;W;ahM>ZncIHk+Xt{eG3!e$o#5^8UjdtDd{oOV4i^lY&K}lWISLDdE za~c!_geyoJ$BEV3rj85GU-JBYOJTdesa>`asL0kKJ%eflyO%L7P$w9Oc!cBAwQg-B zO)i}ahRfdp-RAXDVbYMoOlBh+uVdU(BZiZBgVQvm5=oQ@UNa`NKDhLex%rY(=e^&` zzVBF2e*>P*YLz}!xerlwesC0ceCT7je$8!9I7JTh8~g4ov4gR2J|5?!p##1(INWai zH#BNY49{wY_WHf(v`t_;K~BqW|`_5H#1b#FK6WJ+A!Y*Se}9sm3j| zjfsJ>co3N()!MnPI}5ISj`3kd!it_i2m*QeD74p{b2TD2{q9a zsnAaPx47sVQ;rQd2I?yHFK>KQUpm4fZ*Q(vU5i>1a^LbX5-Y`I=xy0J{jVko8^5)Pigso>n zRD9iY4Yqp?FPdu4wt4q`yjLp%ff%nlO9a6M4VQqlgO8tYT!QP~!C-KCg26z8DY7Lx zS`95j$`lAIYM6a|B_xTY*q&UPN?0W&oM9gY!M+H6Fl1N};W4 ze`w~dKH1xxQZngEfe3!D)deZf0r>eC;m2d&*)4;1Ty!npD(xIz<XURw)M$5RLE@wir% zsb-hCw{&=US&`j}G?i@bV>UA&6b%z{;?L;Dx8X6Rre<<*yz^XXdFE`>n?_c5>NJq8yTptY6ONs9*6a zH?LV%P+!>w3t*r>%|1r?`0lDb=DFr6=}2k>(O3N6pSVFr=GB9t+r&i6>exD3fY!(t zt|!QMyboR)1}(%&8&~@9nV6HBddSl5)n7A)Q$aivk0f!W&1;FxgbfAN$Q084ji(mj zii?pQZU!B)9}1C)WN=wf9a!1yGDz}J0E2KC3IX1Yrt?42OtI3``KEt9`w>!h!Zdxi zOtum7CmkG+#3d_ofV5P>Tn7SLq7Dchg@<^2-2~+F(^VmMt`}DBx@?BiU4%_2$&#Fb zBjG~?oDW4e@2>TfBA{Qy?$_NhWK%pJo*K9~i??q;s-hwD4B!7%Luhns#|$kqF`Z0q zOeP~N{M*kK2q#32`Afj={T-;OK+rd~19d5QFRvqV4-oZ=jPB9_bDsTKd)Wve2)PA- z=6S)&wiBp~i!|eUlv5HhXgmI81>^Rk75LLgN6*?zAI3cO-JMT=Q(e9FbSgHcXA>l{ z%b(P5n9-<|$gwiaM4UsmR=rsEbPzjAYXDC{wq3JVX+gXIzU6V{yG|~c!n87YCo8)P@(-eGZ zR$L*`GH{!K`E16a;wzc@p;*^IZoAkIwcO+|w#T~i$ofNV zBMJCmuEo>OuUeaCqxqrA(tv)DQtVbnz#4rUio}kHjiwa~E|>PC*Z& z9?I6T5-G*AAo*`GUl9OIu!rm2C(x?{KQci2Pe>;#s0t6~h%^pI)xl3DnT02)17oOz zUjC1^Sc4$;V&8r9|JD9tWfB8ZwS$vM2vEryR3_0^F}+(F$3TL~h|MDjc8Pz#L%eds+zSJGub33W4QPAZasrp(89W%53j4!6sz9P6`Z660R!8PHb; z^(hze=S|tih=b6pX)VMwA063TsR>M;QqQ}+b|M>Zw~ zn5X;Ow-ndVvmD+sV({dcuT;5`=Jy$fF=MnI*{N_jKFDhSC%MF(E*%dhRlq+dIm^Zy zbf-zM94~(bENYJ1R-f%ER_x)ZcNJQA42XJ8nYfti0U*Q(DAERl?^=| zW$^+?8iTd7To5J+vj*kIZ$?A~E*Mwq*i(W@ndlNy9@ad_LR8`V%8_J|k9FZfuCzaf zZa|bq&M2xg0M?&w<%O35hA;%$u~rjZ0H2->A0t-rq+vjkTz?FfOLe1O6G1~^B5rGe z-ld7j1O__1sh@|)HUgZd(o&-psFKV8(D?)M-%hHB@8@wU;W;VeNEuI6ht11g^)DtxO)prjmtEqsw^5mGdy73-FQzvJfJ zMp=i;lC4{=msXx{gz?)g=uhl4arN-fHA%Pn;C4aN zzF^Ukq~Ma#?+_G)6^Jw@uh$kWAC4(CS@zYP1{cfK*bHoMuCF&xR{W8y@)J%7c}Sk* zRY#vOlZtjm#0J`>2lY}47H|I}RC?!P5Xnky>F>%q8o#;wZyOhoY~7me4=p&Qz?xTM zb6+P(0X=pz2s%tJ2s3VgRE91_wUK<(Kg(7+gzvg#8^Hh39 zp`^LjK1~*17$?Uwjjv=GRBH8F!rqz9T_2soFq45C2Lq+Z5wuqRp(>t|K^`u}qhW*1cW(BB)p0rNe0OeUx&;h&$8-T<)ow^%@(WAH z8J@R#cfn|Gm>IIkG5cs#l=i7?BT}g3LJ_V}s){b|Ij8Yegi7~<((gMF*>oO| zPwo2&R8h`LF8x$};TW z{l&+2y%R&L&I0*m1B|aO4IIEyo#+COhaWDpi4q^~xHM?-)l+oTr>27o25jus46=gm zB}79>e$7JlGkGcC>BGsDS(oX)RphSZrmR(KlVb@%3cLt4Y&de zN@c@sD~k?xi>3UYrNO{BP`+&jUG#lA>c+q0iQ}e4EH~lStpSlPb`gtiP#1@q5HRv8 zz3Rr7FTyVZ?}lzQedcj+_-I&7wV2LB!ta%9h?B0_CqJM;?uBA$nhU&Fa7#$Kih`@A zzNcx9IPRjz-JQuR49tz|%ThTtQ7`gH9slikbo3Y~X>85H)y6ksNZwU$pRje7Xc>|-8G6QNwD*e_W4)z4j>L&P$x--@% zT1|JQEn1LY=!2N`g0#8+lH`IbWWT%xr9#D_eVeHRvJ^kuU9>|n{;Wz^Zz9TXd203!cN!- zufYD9VoH^vn~5J)7^_!ZjlNoHro@=g1@nVcYOi^edJw}-*cOpRj&j@1kuhDs*64~& zm;0j`oT?CIcgOy1%s;z-qCMdZfW=z{{iJ#UefX0cWWrhX+-3b-mFnx&VMa(`FY26w zmUN#kIkF807^PGp5-uzN_HVHQ;&`|)1Zj+&IZ?2|f4;!)hiQ zx^K%GjGY8vZeycPA7=&tw4Xu|0X#6(cTU!wV}~5WThHhpG{{NZI^9l_=Kap+_^(&G z(z7q{T7uyH)WFyryMcTyB$#odveJU@^Q}Kz83U*jF*h_<&J<>6%q!JvNsuu&1{_WR z*+Gb%7V!%{ikhAzZ7Y~A3Mb;fy!VqMDpUJR$VC{Ny3_PB`^CHYg@jRmCEJ}Kytwb7 zNIG5mRNvpxr;W=-h}h~Df|(`s-vM?puf{DT1@#-~M0+gv(|{*N!M_g2SLKto^-kV= zP?;xYLei4U9SetG`5!B%O03%}iB7h70`v%@$y{g_u7dw0p&V&V)36=6rS5B0!N4P< z&^mz)ZF&5P5Kxkg+IB#{RZglS5!!f`eJ{CKI#%jq2hYj!F_XL1f62a6tJUow)}N{- zBT##utk)38MXMN>kpfg%&SK7lrU>-mP}jI@3pz!aJU*aqJtwgTgw!9*k}WEpi_iB} zlor;O3Xr3nMgwOE`5o@X?8iq7$2=B2=!r%px1Ybh&HI;qEjT!!kgR`|tl6gU%)6TD zQ_JMrAEviH=l)`4U))M#3;xwYz5b@sZJ%FvDqHHGtf#N~2HpEUvb?Px54Xp(E8-Sb z3YwLgCTw2EWGw*<9I7D+9jHhG0K)z?ZZW_i7YThA zt97gRk`FHpa=8j7XVy1dMYDloY-e^nNgL>F!{Y*^> z3rIVbr&1bp=h{LCAfS8T&OV+_Pkc*i#2TUZRh<>VHoVut?JN?t| zzs&D5cF9I!5wl}>F@69?ytMQs;*yCNnZYj6adhXlh)AI5Trc(>peXT$b(^~gagBfCn*-Il$FvH z7o{TW*5RVqI6mrw)ZP4Hl@QL=PekIMQBSN+>QNS-)?6ipy~!TvYXYOXQg~#ptplJk zzOH_K-e=FKn=D|!8{o_W`Z>jNPJFhv^-=4w926Mw+IPo0WTK@X={I+A`A4Gb=_jNF zND)ym^Bf$Y`nor%dPqk0%pqy=x#t^{rZ@C?>teGAV*VEScKKiugmow}+q?Z74KcqP z9wquCu_bZp8yv_2X@oMoWIQ^psh4gYK%bylx6#j7PwEhgqX3xRJg7T(_g>;90Sevd zyuXA#z9*aTOpK9kOsEX}sRFsS0XcN4`(|1*d2qV(!tD6k8+)n6f0W6n@ptJZp;Xgw zB_Ea;>bVyOR1~A{!(bpN@Lxt+_vJOm=eR?o`C~pjJK7pVgfTP5P})HGyCVg=%~Y)g znt}_X-F%^_qppows$+%vyekYkB=yy*oH*SkT=mr1#zdTjl`+wV(JrHgw|2wEf(nM8 zVSBPE%Xut1XKulG;|U)aRN+5@Y7j<&1vhI!jpEb76(0(Z3btF|lv;#bKh-81y$umG z*+TYESNQ^6!oRLT1=|YOBqzBGmb8~0YBr@jG}~##m+ae@>{XSlDk~RNPro&P(te|JLmBNn%*=#?m&@&^PyPBxyC0T>= zrbL4Y*7f;~hRkF2!heRkx<)GSSFOmGC$tnccP=F zW2v_d|Hg+a(y`vTB~d-7N>@9J1!s1P{V0R9*g^B3hWsS?b!__sBRpE|tQY>*=pEkm zw)I!UYU;6yGc35{|MCp9!N{*Ux$`a0&*!3f_xOK~%*?8Zr1ez3fC1RYzTcg#A7N>7n?5J!68UlUhY>{Lp`P-*<9 z{NGuAsq&|Br#}wxc+W-3Ny{)=RTEQX3!dEaA!Y5;TjT%3xR(PjlbaDe+MSvPol*9G z_-DUMa@(=Gu(U^pBP`!oCdHgPEk%R5biJ;WOUz_K+xa*4nL29tV5JVsVMNsbL^?ai z?VDtNJB~i~2%Rv){wh{tI`XrRa(P|#en5y!qO!&LQ3mZbN}KI3nkf8xA1A0cNd>{? zdeLowFN_DLm}#C~Yd$wIh*uFC{~}-JEwEBHe~TzFK6vAwMXmIvVN=B%O>V5@l`sX# z?RT+Q=tTU}5o8C#c@JxEf72{@nd|qVlI(>BEihrW6qR2LprqqWyGE^(Sy6j#n7Hn2 z()y)U`I6z)0V;5OaL7(#xbRBrO1_=9)em!u+E|*fICz9N4zpc9gNa^A;|pm{IT%Lt zK3w1R&H?7a-6&K!-rwz9&Wpe9YL1qlHr!eu2?n8kim|wV=M#yjJ|mL<#qRF4W?u8~ zw3UE9&>64e-OkjI)%x6F7(pJn9SBaq@X%5)s$#L`b1N5gQp4*v^2yb@%c6$cJX*mk zNyq8kVA6Hh)~gfk1+GEJBIjG`u0e%krrtXDQ85qmY-8&7ZRL_ZCkTAfUxARgVjyR7%4M34??g&9$? zd|XJ+q?CZ&WGw1R+MZFpn0C4vGF+VeA10mN(^lo?+82O-8!!Ni z{n^Gg3dKcvH!bHAvwn&{>~l*-;AKG^@t(hN6y$Ys0`9uVk0_V&#?;8BVzAFV0;VkQGIJMFyZ8= zJFxcDns9g4da;$i7OS|8D9h@N;^)39`sz1caLiK1v*49s@?%@t=c%dLbzNyFGib>c zR4*Jv6#QjvBp*Dn)=vC=EN{an;>^w>+{lNe$oFy7yxzSHZC7sbEDXOwA0o>_=)TOP z6SXei(>ccLSqnoie~d}Ep4U*tT~PZl#rs3wTYc%}C|iq7wEXPt7Q~dEuXP7`I!ql` zXL^SE-F|TUT0Z12y+ zWI6-s=)D#bX&-lIGF#*^?s4~5DoyW@1J$X-Yb*5HCYW_ekRvki%+0?wr3_7rd>rOx z4DAc#52UFnb75LP@7g!_s38KCr1&Y;l@GqIf;&RS8<~*v{Z^QouLj_Ds_+CiXTPK$ zVcNVP3oFh}iq4Sjp)gKt*|neNG|hO*xO%LCI*2q2gpxR9&jV)LE7etYvdME=;3^B@ zTjAS;Y1E8y3D)`a=_3upiqrl`?{-quE{}--vCohY55UaXw4X8jv6WKdT*{-`-Ib<- zu4ILQz;=JsAJGId{BeQ@Gj5p<|-ZBlNJzG?RUgo1_K52<7U2!@pOP}ejEL6HA5SI(uW32m;=-<6b;2rJ1kgN+fkn6M zp;k5QG#ZN>@SlJxgJd^dA@L6QOK+qOjeua$_ zkC@~l4#($>z1w*$HVn5JjQX7P`^bwDT0F&i6~>^k8o58M*~Lo{Fdg-imCQIVsbR1spNPyRyiWt63) zz02V)r|*yu7MwE^0t$z_sBZuI(QF#FK;%2`MSL&T_0q^C_Ah(7W(9qSXLd`Whngc1 zn-xKlUp7?Z&{dP{Li$7IAI{J&m&osGZy~m$9C{1sJSpN_fzpwQ!a1jl=tb!9UW$W! zaCes>Sl>1nXPQF2rfyXEDmMKM!*C;EwzG_}4`byMd$!fr@cM18Zy}1+941GCXb>6W z`KlY><*pB^B@V1h9^_%3s7*yka(Xjk=`zreOALA?n*9kv z>_9@90#ah&hzS7*Q}{eV*f3zyeBXKsJ1jZM3gAB(l5lj@dj$ip=KYE|1BhJ=vn3x< z8M^TGmI%9OMT$VUL^6l(d4K5`MhcF?<(UczfDUtW_c}mHndWZy9t(WIkyGAm5aQt{ zrs#1^D{i^Q)~9%8NPGS+KI$PEeA-lE-({zBWfV76fAniD7N#i`xYeh~sPVOyo0G_D zn42af;guQ)`F$}zF$Ew?DV8}iu5v^mNr+*%Gz3wNbuRSHGIwJS+53gc_XrS(DeQ_y zG9`N|U|klPjVx1^Mk;l+Iy53y_Bt7{H6MML_23mKzqgVI--Hgu^EFN*Uw51rgXd~_ z{DL=Cuus>-9?mC5KX%sZJ>@N}M%AFa7*PJ?y(Abr{zJCZe<5ducZ#nc%b_s~6Ig3~ z0qNPUwU@a#Y24nd0~i*=#B%8@yIM5t5li6uR|v)Kb>UPM?AZQz?01vZ%6_M~pCx%8 zJX^^g$Nma#9nuR=?#HzX@U9|C)WQ5C+kPA;!o%B)y#h>CmJO&&=SBTln;2XISr?6p z4gA2c;+|srq;2sky}A$Jr9?4&u;fe}Vp;L;=>xz-|LzZPTRz~fcv4{(4iZCl1(38< zNU)xL+QJFPjL@z6zMIDY{6HRwHfM<*k;F^vA0OxnNjHuHpkBpNk01gGA?eWtBxzV6k$j!yw4;%vE`mo9iiay26;}PU3=GB25J4Y!J%KL6lPtu8PfG~_Vxh4FHR zCMf`zlJT-~tKCg)k!3(ZKGJP9m&}tx$ZbCB&9|mIA~}t& zYj8rR5n2@Rm03{e*vKCn0DGZRQn4Ykp>0Di-Y}bb=(c)jU5qv11mD$ETKnnqp-fy7 zDx}89nN3Z~hNlX|Sm?%NR)W@+{pkk~6u8!-cdg0+0A#H~-Kt!f8HPmUlX<(rvj(LM zS;MUd+>~Z>=23%yS)!Mf{a!T_c=aMYfC7 zWAe6T14rplNh!GgZTeqwA0WQDu3u>z-qs55uB>x}wigEkN?|yH7&S!R(+JyO?4X)T zQW7T(;nP+&8KtrjT+|?Cpc`p=`dX91JC$i1*n{B60tF&y~JZ z1)K(AA%^6;AU=RCU>@fGqISA3J_(tB{%|5SB=ADmqI7x?yGsstewoEl%+%bu?6kWt zHv)op|2`6*T{V0TzG>h5Tx1&3GU3I)Mb%)ChW- z>CX;~X?G`0m@F4r6yXo1IY>Yh<l}<_RO{;id|8BXV&+@%*+q79cEXmj} zyKf7{gj@5YB`9W3fP|r*oQMw$O{xD#ik9Bnxe8;(#a)%-a)khNd7VNr{p>7Dv93d6 zlxt`7Ze^t9qIHQOk%-(SL!0eE>zT)B4>Q5-lvOt_28s2qN7`-MUzq3>oEbpr{5vEm zn`Jxy9q*sTV~l7?)J&bIRzhGDX=c7C!45qFvR82s@8eK7ivLs<3>OjUx|lB2&cZlZ zBE(B>(Z6)^eOaZYP=yn+Bkr4(Y3m^_+6E8xpf4_4eWN;oZ%neppzi}~kpG82UR46Z zlU{NmG9}rxl)r2^N1ff;-D&3~w&gaOe##xwtX{g0Z~<|58J!1{d>M?SgLj@;vfz~|4RIswVDGt`ANg~}`*rtRBMw{-gsu8b}9GcKz z^Y4MN>T`#mf=<-ntYP5Dx9uqCU;HMsHG!cZJc0M6V#NufEnI<1sco}Xp$k3r9PK9D zeV#g8g7Sb24Z-Lx(T~cSo*sN>W0^xVy97Fmf#fKG6dhLRGtbBln50udL*|nLV{Dz) z#x0-P$J*l@NNG4;R8l`7dWsl1lef0JN2LEvJ ztEWbH+=b@BIuG=h7$eCl@{hgM2M9Vt(QE4MIbHCtn%tkKlQ-Rk5O)Ay}XXHJlNbmg5nJWjU z*fk?&q?#4o=7n<*Z4Ea0iteF!VpqZN$rmFla0p+fR-*Te(eI#Pkr?UDk2!RNgTWW_ zoCcm?;P@=4i$&k_YGqJhFKconiv=aAt$EVv!HGU(1jP}1e<#xJkcCb)? znrcm_w}QZo8(5DP+QfEOV24uEUi*$uN&PZN@8zNPV&jUoiZ7YfNY4Qf%HjT`)TC-N zD9=pi!2z%owt6^@%B~f1;*jNxBMxqsm!#jD7Z!f8i+3|XV}9cp=TYaGE0M{xJCE+U zADt>K$KKu9lBIb(&vhJi6?$gE$iJwye-q+p9$1)uhE zP+SYwihuPqwhR609kT<)-)EOJyl7IOsO95}g=3nC319sA^_WDPN%W(Y)yfOA*y(VG z_z7ouEXOOcl`0RHsPj@!kwXYQBRHx%CBwD?1#I)6zJ=2i@h95JD4slhWEC!yeOv38v{<*pcc#x}^(D*H8T{tiBP@UKIZ_#9MN2fm6%VxYnr)i zLngjVunN`;qa_pZ$OydR&O@&DY}PSJuD z4-Xv?#6fkKXF}K==s`ZLj5|u?>1y55KuW1u9;oG7+U0$^&)0)rMd>A~zWxS#Sv-9Q zNM}@%B`<5^344ogngD(h0`@0uI^3F?dyCR7{YIr#lGa|Dx*I14(7tN=XvbD@73P&> z)qo&lyVkYg(H1^VPQ6j01VTcH4eW4ixhN-+Mt|L%(zcX0M{eSzXdZ~4(G4Y*y)F#o z@CSP+3((7$^m5jh~?^%P#AI^OL=`)UBbyQiysg{t;o(aF}UVd+uC@+YK&8iBk z+Cq=@i8qHiHR=1>jbYWV%~G(DmZ?p)ys%s{Fa0HE*G#1|+oSU-r4wDrJ)^0Yd)v5X zLiE~(OIMLF9UBMU+#@qLk*PiJ+tFJ8(<=t7rW{EF=33tGbl-c0nT%(zYCSOB%~HhB z4)!~bVEFf6RjKsn2k7BQsuME_`+~SLN2T`}X=DstmjtMS*YhHagYSwvwMmlr@$uOW z>Bl59HX=6WFhr$fxPk?QOtH3QktzLKYsWop!;ovuHR$3futpUJ8I04i3Q0-S^_Ie# dHrKIfRXV33^;GFDNqeVoQ!{^mRR163zW_#Cqq_LNSvQ=dRvDI z^VjxMJALf5^d|ABzHejvwf+;!EB8jADdz~tYlru>_yqU}KOg_GS`2+bOtJg;?)zE! zIsW+%w}AJ`vyDreZ|OyWFQh!EpC1LJpD+6_mLGw2ju)iySWY0}Tj&ii6S($O^Rsx{ zdGa&*)Aq>lCck;J{1fop{XY6Ga7P%Cllbxdy>cyn2=^d=0z3mYyup6CU%M|0EcuRn zfWC)662AZJdg}qBe{f#UZW&GlR)6Mznm;J-E6;$>-1pWGf!5eW;G(;=PwQvxXYAuo z;*LS?6tD_7_=ECR_}Kj=|HJSkkiowO6#bF^nf;3G6Mx9P&VB2|^nLZ>|GtCN0a(_1 z4GUss&`7A@G9(cBZDTk5A*;|20_+N&mP;o<9UIK z1w3d&ijer2fJw3JA6twtI}-yeM+B=NrmOF-2tvP%u;hxg3ZwFf66*h`bWRx=PcP($ zXj8EdO%z4x7O9@R2f8ED8^BEjazf{z>eM$|SG4j%U*893l&Y9oo zGRM?&w2PivbbDlH3+VE-@}mF0X#N~Q!Thn^D*T3tC5)|0@Ut!_R}YxJmpVr6WYwC~ z=VU*5h+!$Z%GC52*_ouJ?gR8NooG#n)Z0FC!4NEd_C=mUXK~ z@%=0a2eOVK{btxttmzb3Nd3Qe@xL|mKPgG@2~jx~l-iJPT_a(0iPG>s_3PCvr_S@E zTu`c)9L;^hs`QwB*ds%@{B7_DwuFi1S5Aai9O4uuhPKq|U^vAFZkn+Bh0N#!y)h8` zBqdFEZGyu}UnR2(9n#r;daxUCpQQe;g8K-y9P;jxK>?+_q6l`&>bKZll>h+&UA&4; z>#M(td+Pdz$pPo)&8lRgo8!x@nHQ!t?i+%jq$Kp?7oQpmY+9<{sK7XjeS47VqwO!` zYo2QgR6Zfm9sUbWDe-X3$ab=g->CJUOH8}j_5q;=8hZncYzy5l8wj0;Yd>Z}zOuw^ zU*Bot$goh4&9ul=GFG>}PmC!(DEq<7LkS{ZB+wFpr?O|-0)Z?ovOy zVv<9u%FlE;6mVTp7guohB84Cz@JP1X+K$mE;@hYZxrg8Vs2G`M<;B3L$6hHV$)nDA zFQec!@Aa=#CuwkrHjA+bhG?32bSKKyrfnp3dT*09C}$EX=*Ye@8J)ae;L2x+r-G8Y z$Ngc#={9RroZN-X4L~>i4ShvAMPbCgaU}7alrB;K{J63QP~tE`o*4w@iqhPeh1wk3 zvsz+GJIlY|*-~bHbAiZ3U1kwDzHak`Mpj>uzu-jZvTgU_mQ$5cPq2EB@w;$~%f~Gw ziJqJIct5gtMN)JGXE+1^liZnaht=674ILywKyCS9uuo^F#9M1uQbIrz1-IuG@m`+6 z>38bg9dgnfLy|ZJ0#f0j2Dn9x_lI@I6AxnY#H4N-_Oy&(yu#mh-~~#r#Td(nkzQ zJ^zcki;DL}Mk9W){2xzsm4Ic2=>IOCuGv-wOb`AqrTITSVy@(+h_*QYmoonU3;#dP&;kVH`{J(E&fl@R1cFe6H%5Y8YFmILKH1d66PKtrW}Rn; z_P{7<(Q*a2TuoqKmM#7DtB`jmpc@;^2Yk+uOmCfxJEStW*<%6M-Z`KkQ=mHkfx{K! zv?THN$E>i+a+#duvub17&kSZ@nLL6cTZ0V~k^en2B_+HBkvqa}SG##u zSbGr#eDP)cJ&64%8x6I(l;Tn}B0;0_{P1MOrFm{#6w(}D<{L|_^A40`sS^7ZJZR3E z?xydp(fx>$4n9ncjn6Wn`9}P%xVu(p*r902p=ZyVWV|U_34yN}Dt{YoFz5lJH#J^G zGjpAEf7Iv^K z;&g7~*ui#85M|9*TitUhYawEh{(6RBXT~7cjbdZ;wuVIoexq`KxCXySONl#fo#) zPt9IqbWIKph<7eo|WkJIrvQ`j@1LiL%5vr!ji}yzS^4Mu&%UxdY7k zEz)DdDx4$IGCT}r-{5nn`x6_6-Y4q5rn!YT9nUa7RP{x|l!N1%I7|ld=36u$Z!?^3 z-Epjk6n(t~Ei-ydFeIFkLh7dKg~klJPNHg%LZiCZ*~_f-hd-%p)w?)=ZOCX(cXq08 z8Tf`!C++$hGU+D9043Ty-~)eN~(c*EU)OAh}%{Kg=D)`Y_bx^9=h_!>6hh1NP_O zQA`bEm|~jW%H$TgaX5obaT}U?wh+gX*!+lYBpFI! zjEl_S-f)}kE99m4HC0?Mp6BRFm#LBqC(vFITa&(Su~Nd4I2_@M44QM(X2v;YqT$O) za0P<=Q$M_JufBO>1&THf3}55T`{xd!H(@?~&9!TF+LEwePra)+qpNborw>YgC29V^ zlFBUg6L+>pv}l{+N%C!X^Rh8kzD2XHr52LBjbdW{6#j|5q5rD9 zyLKS`#|VbP4?8~xsXH^NGh-W}<%|$)VqfzavAc(!_ELQiK2cUGv^>WY!on~j4c#R} z5Q4k=E9tQGf^h|Zq1&E#CnI z-A7;Xm32wYL6BPq++2u~ji1*c$R&AV0kX{t3FLOs@~{}V zyrNcA#P@&xKl496z|OLD+8lq<%NK4k3_U{EyVM3jkHdK8h>!ljpun`os$Relepg(P zP+d7TiDAUR5p*C?%WSaOQ+UY}ZLo-sY+u~@hp}D3PHP8e_0R;7^Hh}QgH!X$j2zT~ z%XYL-bM5AWO&~w?C;0tea8g6`1C>LcPOa5S!9&=Bz$2!9L-j+-%vMr8>8d7vsl6)! zTrrEhVu)u~dJR?N#QD}fO~ky$y+%(C1lk*e{HA#70h$OR7Jlc>ovxB&9ggPd(K12I ztm+`~!9wqmBuCtBEA;$*N%dh#V+`kEH0pKwFjyB$e>wR9yW%1oWGL6MDOctp!Sc@s zgY+pZnsrRc1t3E3DA8Y{XjD_p1q!YBq+b9pM=dNbERQl~#E)@eYsm7$JbD1dipv_Glnua23&Q|e|R!TU(#&xgu1lsE)`ASmda>l}HA1xnW` zsLqnZ9+~$vX%KiwbD|Dh^vjt8-b@SdT|+quBt^JvYO&-E*x8$+@1l3JMDJeyAl>mO+RUFf%9W`7DP)IRl{lE$Mmw47GeM3=SOPw6EZQ zDJM{??Uv2=+O-0E@B8scp?o=hBHPEEDFk6aB%NQ}G{pT0JJKMIP)ZuwyIYb9-1?|~ zk#;XORdp3DT)LvGi-6j68ii^{^Xaog+9@MFc86Oh=+ymEJQN>!`-!#)+}fy7KG=%D z*`q>*WtxNRAsFgZmENCi_9imvQ!)TFF{%fS-rqQ zENU>{6v2sFo1isMWl0OfW$~cGClB0E0~N1yC zY!wK2l&shXn7RPPRTA}`!X*>MA!6#QbRK_Ke(Y(DG7yE;0FzvDr9 zkV+vdHB<8CE7v!+Y%yu}e=QOOD|W8`_v`61u@6{+x%Q$yyeaixmvCXPo7$ZO|DM7H zL|5>wa=C}7Vdi;XZGMy#djMi87B6+Y0kpV&^qpiUOtDxXv^oSi&QZbn_#&L7{kcwg zf2eb%#k29lUdS`l0OO_N7--4DF-VK+zz|m^w&w5Xqr|q!ESiAOW%?}zqR`SdYHe`h zC=M-*u}D5v#!*4sG4XQv>3}DqVGJ6$ND2deTFU2L3x;H+{fdbMfZ+xrk_>CttkI>8 zSAnsOq&GU(p!6478=gCD2EPOd2*`LcxhrfwpKxDnybn^pacEfaEP8S1N9Hs#2;*o) z5Bw4{7z*)+wT#S{$ZGm~cs8du|jAxi@1J-(d%n@!x;4zr4CXK6{ylFyI9OC)bo7h>*N%>(eGc5G_ zmlbm*xl>c;>cveo4c>?gkob0`nbR{VH9uBsb^8OAA}d9&?$iQ2mL~)ept>0OemF(J zgLFz9n|p1Fbk{?pjH2lj5cv_><=vnZNL>)j%wsGC^lzo-=IUp?5U zlU8JxDKfB=VMrnqXmT}y9<;klWNO{JN$>8;!004Rbt0*Hz`auo!7O|JMq$Q+i5BI& zvk~IMqIb@v>=HLdFt1|@ijw9ja#1W<}6P8`~lK4+OC zns!2-c452>Acyx%2c6&6I<>tS(vYhCcEZlrh(n!^%esI(senfKPCHui@4_&=YDG|W zOsOd!P@-ZH*R7+Emc-%;9dV5FYCbeXx?j*(NEp(a*GDc%;WbP-+I@7d5FIlaUIRmF z%b9`i&pTmCw^ycAlW+r-{e!0v`xcW+H<=W4Dth;qn^{{l#WS1g7FnaikBP${YgXZQ zYr$JQnN=yrn6|DO=^?WI$c@J~t9e)cg*@#c`Kiu8wYq&+x7oUU#eK&Rd_?rGmc+kFx|6Faq6A1`uT z3i=Y4>C;~7dx&6iL$LYBWx0_~2NIaQdeL-gKLM3yTG*@NpL&KG@<&8(#)cnSY_lB5 zhAdk?w%Oc~B{Gh#lv+O_8BSeFJ_+O*)716pNzNPp#}*nGHQAm{8Q_NK!&tB<1BQ-> zSyTjyDSAj7M!u8x#};H0QL1tS?KNi(q_cI#BLyj(E`kPo(plj3QDh= z$e+vU?&2&}65{a&(n2*yJWL7nwT{!9uy?P3YM}~ResXVA7@U({OTC@(x3HS^EEy+b z9vobi2UDT;gzzQ)4g8|aRyRz>0ZnEy`0HTsVTJifRI}fwiR1eObLnY2Z=G!M*MzT! zy1d02l*twkPReXyIjh%CbtiVGv0HAIDwM51>!JA|@@Hv@clcz6EZmZb)*M^CbYU;k zcT#uPb786Px?{}S3At*rG2b@+Msc+0-|Gx0wWR=l!fdE~@ikO}Z-=Jdc|m&ULgyVb zLZRvGr9Q}BwclWvXv`~7}eFpRQ&S^S92%AxJu3EiKjzPtYIE zU!9L}x)%%;gVJp=7TtXX7i%gF1iR%IlTy;_lo)6KErG+pOf(7Gr$58^pT(X0 z42bKRamY!`;5B&bmrzJr!qvKpO+e2{YXz(5Q{ACgh1*3zDaRgj3*%IBY)cy(lrDR_ zIVG@6+med)(5K8Wdf2r}-r&z~VY7j8TjEd$Ceyv{9V4QQj}Ni=R7tBl?8>~yOM&%l zfoSEzH5D><$%2fX%ueKaB4$&PjK>AQAL46;JKKdf++%T814(h~NgHbklAA&MymB%YG$EhZCqfHRhA*!%gQsG5pfYkg}| z@SYa@Et0_s&-tO0C-aZzi%aEIBOQ(x|4ft(Md=VwUNlR z0ICxEme-+Yx|6?u-vNT5GUqr~Uzz>zSTnM!)L`tu7p8n;?A|=NSA)pg<82B|azwTc zW9O)0mm#UsX+=S>$1$#FDpQ!>(W`txjW*Br*c2qVZb46kzM#7m_68Mvorj1MAyauP z%fZ~-)?$rCct>u0Jo<;0vK!dhgeJnVErhe~YX^Dcq*`}@GzwtWCi+NKce$;|soDeT zfqx)!)XAw!jSQ+StwO-Y`xMQ2Rw6&Epu2rt1BcoW$U_%8L4y%J^R-?YNx7X#J2>+k zoP*|_FpD{mlXWjaE5~bCQTeJ8_bi7O#@ulRhm7;{84JFxhFk5gTPwbi5d85Wrjhmi zG!#{|+TCdIA8!y`)<<)2({OURXy_|H+6XdPXQGQzuCip~znSGeVZ9-PUS>Pwq?mj$ zR8Y_sut$kqNV!kZz_9xfbj##2Juw$Lk>I(&?3tA&fFtytl<>5{|K97F6_3op+ZEG$ z|0&Ba>c0j~6I`OW1q0o`B@iOi1CD#pO{wDJKLc1esj!Pf0-Wwi81tW89b9XL9;$mY z8+`}O5==qLH9gzM{R==L>?FRrKPs}tk#Iq~^7V6>m;m>B3|^K+EANyP_ckIja*)45 zM7>EWqc$%kPzm0bs)=1qEjAl~%BO@6Y+BGKa?H{2nwnjB^p1^I;yfkBK18}TVpL{) zPliz0dc-;I+atStWrbmi;ZM0-fzLmg)Vpdyu;0R_qsF~@JEk&hF{yIQ(64g^#3&p_ z?>D%ERqT&YU;?3C2MA;1i9vMs?p#}cZO=BB2p5=`{c9p55i8>!wnjsbrbK}J3aYcY zBHMDf2Fb?4)5DE0+(>{%x7cZ;gSvnY@C}C7lGiVuAfHVws0@~NvI8cBx;hn`r_u!;LX~PsX}BE54=t%QOA6Mb>I0J zZS{9Mq=n{y94Gr-Nfq85J<&2i=mlY;BStLQ^$yPim&L;yNqpHiWVP8+*`~?#+iDB9 zOpf=Thz^crm?52~=GD(+7~R9D@2i4ign(>hT+fWezk-a9KVBMHSlCU?(H$3J46bMn zu&(1pElUP=&59!6+2P>Ma&Uuw=3vn?ja>}(p?XxR9U3H5fP~M4RyWE8B2>!4>vsEe z;_|d`Fe3{Qo8@%0eLUGsjW!-a z%Lkd!31{!iNv*prBr@Q&MkiT9r1{`K=iXXxG0~Q$#1lVz@9fRhu~R^Cb9Og z%hi~L&DV}IqbG1KI%cF(_Zt3$dJAR)pY8^Q7M+gmw1QV-f8a~UMb{#~(@Vn&yE$T2&J z_7ThHqTEqgHNduqsj&9gWP1}>h)}LTaX_w_HQvOb^>+*wo?;J{byu%yE1cwFae^tnN;Y$k5K=?M_M_pRYSbRq3ZV{|nwkav9QDBG zRbh3_WhdmE|I~l!H=L1ggTA(G=*nTE+>?>-jry}9ctkvR3(b|T>hN3rYuJEjZ7y)P zafm*mLRRMCj-DM!(-PrdF3oMUUq1h1X!LERFh%IVDE6$4xc+ygr!=*9cZt9+o~-7< zn=VZ`v}JBEBn661G$GCAF{WY8DrTgFbgqWEt*|0@UU8t}J~NMVuJ*2y#bm!5H~qjk zC=3r(F6=(CkWiqWMy-{-m@>la28@71Br|^!zRKBo4FeBwJ`i?MWqLgOKygq@n2vTE zxP#lht_b<2+iq>(y0anW;w^!k)W$kck9kOw98nB}tA}(7?8!zeAOOok(6lh`x;g0> z8YVo_%9)6JVl|CR{f-pH#;KDuW|PKBA^U)~+itGAEl9~Dxj2xWCpF-QhYhWs52$0~ zZ`2_`veh~JN~kQ#4h30v`LqEkcgT1ZBD_BtkXMwOp?&MqI4D5xefa*(h4EN@+-~h) zB2K{TgJx7iUwE4$2MNExOW_YoI#AUJu&`~8Yl;X)enzttnx{P$^D{TMOiM%M01cx) z4XeND%=u$!hY~KQ4g533`8RT@kqs{eZ?hJbu+37W=n;Q0dDy5(2K0LQzMD=@g3AUS=JxQk8fi| zdiW++Z@@y z{i||ne3Jw(7}WYtc4G9xTQC_DYCk2b&WOf63DX~xyD9`;?%-^U(7B%^#I%S8Hg9lN zA1vZV9r`d+2qI&XtVk{q#XK|S1yLpblcQpd*bT_E`co2^jE41DEvy#YX^HfnHl_5U z4$6aLvRp}i#_7GkCjUYrMaZIXv#6-yJ|>jB2`?KBhUR^n?p+FQl+i3AcMeb9{~3Tm z4*yae@!$9whzdVv$TX1`X|<-nB=fk>oDD+u1fIY8yurQ_eD z=NZ)xBwtsDS@e$%X!Pvu6kjH88ayUK+w*Bylrkj((G}q3VG3>SGeFiatH{ZRN%p`TP7FimW*Rh@Pn%Q$b^zfi73C*MG>wy&H*X)S#A25ttHh zgEp@2`i*KP?X5`uZ{!=v4{WBpyx+viT_r(${+A zfD+#JefDsZb6BQxQ77;-o-lbEH^c$PNi5EL>c=&Yfk;~WSm96esWn8iA>xf0{d-dq z=%mi2l?c?D_T3(DNmWY9U&_C{(Syxm4SQ62KsZJR-xM>UbbipW-`)RB8Xii_U^k_5F0|+b6G_Z|~?V)2MkVJu}++h!LHJ3%{D{)j13v3XN zD%LvQ7V;^}7VBQVFz}VeH-zu}k3TmP&4!c5EeL|hjvIfNq#KuT4MDAhN;asq8ZL%f zVDPHldH~ffgn)VLc%|6@kl}KiB#jRNj=Ib{7KGd8mxS2l^K2lORQ6w;C|C@)=-xiS zEwjDiP+hIT%M@uBahdp@0%6~LOnLAme(d=|{Fd*4a$DQX-}w4Xw{RvGX_vOKteSZ?CPnQr=&6MO9cZJ)&CWLRlV%-h zv2(oys^nViln-H|ZMHxiHftVK6Ogm(qDQvx7*dbIy%9X!y!n$HwuW4|0rV-+OiF^U zElBEzPH*w$NL==+!6hi;#ZTVCO5u#!j?tNkUqVEaIWn_k!8ihOI>5vY)+Z$AQrC&) zov3!3FG=~O^4?RtmBFqIS0$_HX;$s2JUqd;I zb28jefN2S_#?Q>Sn<#kkW^4Pgz;_`|$X)CCbvyem7Cm_1SG>Lrq@ohf`m~f1<|cR1 zUF*N48f)e*dJZhmLOAZVoC-2{3YL-O4P5{y2Oydxx`gfNpgpuHbr^Y5&`S5?eI9n% zp?;CYtKm(GP}ux$hNG96WMd4DCEPP?!1YerBznZw9EII!ZH}w7>-ib?d=3EPFuVUY z`FO(yPd^vupMf0;l|Ul=C`|YK@k!ikmR|7kb^~1~6`;WeMh*_706HlE>M^e6?{E__ zZ7!m-K@S@=)S$Nb4r=~u4>U5_H=dr}B*z`TxC6|TfwONpxha;FH6kJ`{-YnklVhnf z0!e?YZUkoP>Nv}kSMo^0=k$bIJT`L8vlBiAox^Ack@7;c%}=KxF8fw>h#@by%UHUi zQD_>JT{%6ybqqpR&e+MV1nKcNMb)azoQkGDrf=u#cazm5G6$M47#5L7a|4$h@H7v6Xd1L}Ap^X|`B zYstwgL1=ZS)c1IDkr1eFN;MqhB{2!2$`DnO_b@J+qTVVVv6vwkdE3vsy26$)bb#qZ zXajRGJHM1!nrQ|3y#N>^Jvc;F;|`zj1nB|-xP2HTy6*wc?bJ49xEut|FG~K{c=4>% zzOJm-!B_Rly|nm$JvFq&K_ClFYc1uvu6li-CNo6^F5I3J%4*Mz{6RQ+MX_a$Vaq)7 z{;OaZ^E?cv*HQM8M?PcpkXD$a+nq{PmRkv5MO=+v6a*V*ZsFF^AyALgein^7%=&9J zx=TDvscEu>78dGLv@+QYHo*`^GOQ01Zhg3N5IeCC&wd+8ZirioZ*z6yl4^t^Jm)Mj zh(<>IqbVL&u1E zkNwaqw`^RVl_hItrptXmnE;I4B#T0ou$92dl6tq}w1Fdq#^d7+u9^V*mavoVkR|{`f6vZ={;?}jf~U0b~4bKauI|JTfdzsLCp%D3=D2*(6iE)k@ z5>oBe7hrdR%bYuY@#aH89(D=~!9zePybtR7Uiu(|bax8l+i5(fGl=CC>boK8*i1OIx_WIdGG>OVzBM_<}*BZTFKO)W7D{|2!V+$Vuw^%pq57q+1@5 zF4sTC4ErznjWX6r02N#{$WO^yA0GQ8ZuXv5a%J14%`DMMjvz6`?yioWH zEv_DfA{_0!^=snliJ-SlLrAEXx7xz(2kQz}x{l5$YU7}aayTcQ(v}CX+BloW`XkrY?nO0{CRaNw zU8aiKH)ZeT#dph5XKsTmvaqH{gTLrGj>y){*K2NM9o!=E%d6_?0|F+6dg(&-+)}lO zR2yNUO3lBJt~7d>SM9}L#lc@7D99#w-!rOVKq#9lA5JW4_s;2j*i3`yrIO>q0%xyl&-YQRa z5<`!qx(dUSqrKIx8Xlld2u>@%Zb~4EF)CH_AOc+nUf#V@Yo&go9&_(x=XxuBO}=Wr zk3OcZY!7_tzaBnJuWw#`EwYl|DIR(Ze%L;tK5uSxjC?b`pY~-BcZz>vzc1eO?_pkV z?sXr2wtsxT+WCCzAyj_UPr)u_7khR2C*LDKAUy56O~1D`{`ZVG$n`NzNKynucA zzn`9-9?E}yelU6wHu-;kK6|kE9eaNw4f0BJa#NT92*0hXFI}<@hlI^Eu{DKOCpt-6 z=aT+w62xEbxuH4Qq2%j+u}M`@iSu!U7uLIDz?Ao~k(=r)9NXnRC^k9_7F?AZRARk3icc%xRthRDneH8%11 zG8>^CHU6?neLaZ3R6)X|&)+XYZSe6K2!=&Egl#b4_5WQ_H?z{2iTDTeT{SHCkKyd! z?KN2M<_+wqp+ql2NNLpn2=ou?rbZ`>m+w_#%FlE9z3u8=Rzn|kjgcYv|A~nAW;O15 z0N~_Ec|QI0u~%1N;!*V3u&}%2&@#2y2uQTW6_McZV++6TyWdQi(#%Fs1V{Ep_o2v< zrx~J?Hjetg!x9-GU*P<9{dP-{Hb=p+lRc(;rDY zRlovg`NQ!nwS0j^kXe1SY)b7L6c@5soke!?^ zT)+fndHHD#Ab|6)j4g2xK|468U+oCzYJ`|mqoV);cC(>ilEG68315qDe!x*A0Z#OX z9>eV`&lJ-tdv2PrU>qj8p-02c81YT{)>QcktW5P!*BW8^O)0*DnoXKIHIM-EmOl-$scB>q=0;@M0q!K5bsB-13L|4$Bd zBZrSwgAj7V50Y5)+S)q9eD>F520j%e4vh^Y8fe&h@&xId-iC-o&7)DUiuMDHL$9Zg zU);~$3=#i}!K!~xCcyLR596__X$K4pq@0%e9CRb4=52<(?&8EI;rw8U^^Wn{6RPxW z2M9q)*@E+?(fW9_Vdg4d=znYa-+?Rzl`glQZGDJ9xVwIj2Y&>FJqvtG#dSyhKL+4H zt>LEg(hPM%o*}-{opc#Mr9S9-{H*`C&Hg3r-1OdA(cJK}^A<+aSO7|K#e*~W80Xw=!S^Mx6;Is--Yb`!0YWYtnS&L zb1My_)u6ZdYILwuzHz37@RvWk-mo;VhCnnCD9%7u!TkSLx_?26vVFg_RD@_1a_e?$ z2}|muv>q5>1oz$f9funH>B+-%aV%H&!`7b^El4+d% z|FnXCU-2Ba&p_Ke3cx_7LXciCe_3B2s1rxmkENLWyPW=l<>yUaF9w&DHc>LR-H;2c z&a2uV4PP>w`i%si`)&EXJ^H%|ONIR0lJ z`lnO<+fr5l!1qsK6@$PJwO<=8Dtp<_EnqQP`4XC*kY)16Xb*XSEJzA61&Nke?RQommp=m4kXij zEv3(V;|kN@Pe?X1glc2`9_hhK8zfK1qtdoB{%$B+XH}DPn<=UlCF)KAOfP4W$LcDO z$*-V#GYyAk3XIXQ9BAP7Y=r19>p>LzX? z(0St#l4xS#_P#K%t}}Xt07*elO9^?%Jsr4 z|2G`6jL#*5g*BfyRQSj)u0>G&&wxYKoC;P-q^vZH%#8ST>0_aOt5L1-Ly@lbuV$2G zWdv9a5HqS*TU8j%@!k;N`PtqKIgkGIqNZX4LD`PPFai=W01bL*#wykJ4~>nbVpw9M zwYcWZ8M+UQp91KZe%+n!BM;=yPm(y{C6lb=31@4O*l5I=FB@oIPAGe)2BJr3?hjj z%vlyI12@ePVNeCf;!l^s`vK}{ir=K{H$)!*M*h+LuKeSrRrTiOd+4#XjL8?S;?K4c z4;T(Wob2JWMqS@{nJLBx{}XSwOvUf>WFZU6DjMh8XX0v*KsQEu)G{q`#iAN3+pdPa zZV^cSfJlz%HV*)>u;wO6M4za;D4RjayEdCUNP;w`&VplSKS$=hi^}gsssGeAdNO^7 z>)HETeaI;Ql6dxO(O6@nzCm{7tFJM8<-G!Q(C$*jW+&|4H?+rzCPj_zk-EK*#G>6P zX?n2QHxTh{FWDcp+}gVfp32ONb+tpGSN&0O^Dvp~m~RK+RbCM7cvPHFI-V*Q7vE15 ztk{9FCCaNp9M~rd_UW3bbi(KqY=r*wI!G=yM%6dO9<9i$ko=FQ{8JqSnoRbzKf;4l z2+5-tj8qc9NQYn}OeNX*IrFQke^{XCCH-zebY^F9dO0H&Q~;{s(^GArQZ2Bq<12op zl@EM*o_Uy@_75LnSg}GAgrL4n`+x-lC5`Z-S!WCD{%xZ;u+WHxTlQ4Z=P^p#c|6-O!x(zs2PW0 zCQrw2pY+83yTaS9e^xuoKb*lVE?n-O{2fva4=+ROg4J&?_qi#C&##8)$ARebZy#3_*!IgBV_>?Ej6@r2dgp$E zxlmu^Y^g@WDo6&sF9c6rJ~q$CNdncV#9o8?Pgr#GGGhmi?c4hmkttY zmzM|$O$Ov|f4UUwF6^Wjpf8pm4e>~Tv(8wqZ%zGP&fU!gGg?2FdLiw|&)N1^VUO~4 zXY7=X7|X&Gtl=vNX~1JwYK~lQ3BWR{Cq>^!86U4&mo6rg{aA(Jv@-)D65VyJOt}i= z#7l0?#<_X3;60&ZZBCm(pNk&L>ZL4o%bMeu5AXz=?c>T|2V%#qX>IEiDr$u0p{WSt2LOIsSQNjr zJ}#kkbGGa-hqHdlM(E__wAQ+Eau8obrrNcTm3}nu_U0p|hiZQLoBALgQ(patOqS?C z=i~dYRk|;^GuKjjfcN5~h}0<-;BqkZI-hZbr$R|&IDC0$rvmb4@eX76rt-LarAeC@ zuOLmyzHfJCE~VHrFUDEEJhT6}Tk~^TD!H40+OhVRz**2e}2{nA7xvq*9S!W&WX0@j(|8i_LuKWwIV!D^BAnETgnF8qcu!K z)GNc-{Mir4u#gv%ktsfO#kFv4F*qcHOhCWl((E0ldRkkctXQCl{(E0%T^mM@q)+CT zBt7mk20mHE3I;{!FvI;ENDCprGa2#Li1aE(hO}{c)vpY32(!-^%2qZG$eP^5+%$PJ zP3jdw}k;>@*pW;rMGy zPp_>8)&biHWHFw!1+UW0ettc@y`dd8V_yUZ)yKugDj&CrF`tcF0`oVLJqr*;*lgtr&S(r2V!V>plt!77Ya^~RCw7@NYk@uo zKw9`!>2@eJcWl~WL(MtFo0#bsasFqMjT|`GD;;sXZ41bmT(6vG`xF`tbcDQ&n7?A( z_6RefMjf5rnmMia$~+gW*6mg_=DT`*(2Y?}iNe_$>#Hod`sITQxuPz`G#Pq&9C-p0 zBb*4j!b$V$R#ur}KPUXH2b;1@a+1xg7N-l-0K*m38&#AaSqU?aU2qZuvTd-e;0j$7VXZ)8g9SLeA4J&P(&;clBQO*B8<8|pJ|6}m|1Ku_|Pf9;RO<8b?4gC!$RIa$8%$W z9Yb-Du9QcN3$yO^%h+fI6qK0LWu}%6CAZO`alTYqRIqEhw6nw-90(Tm^(6w)m!8GP zB~7=g$x%Gbvqt=$x`pzoCF-=-A{<%0#Td@+hswY>j^i&H^BAGXjo?A;-2p&tCY6V= z(|*AG?eixxIITCcgJ@ds0;)e{K?GU|PQ~c@u#%_kPv+qqH+VthQ^sDG~^Wnk3E z>Vf^wl-pCwXFeOX5}O+h(i4e-#JF>Iw{x+ht-@sSK~rQZZ!U<`p{Do-!9-T>vYdD2zr#@1j~cwDe2rD%X0bcAm{8@Q=64gSOSMfX z*Krpace|+x59dFp#(@kGuWm0fSe^Q8c{s`n{05x`57vBX=RAEcNTOhvn55IOe4haU zu$Hw$=*Uq1wFZ^jaZ}Q!4_y+|!N2XpG|SXhI2g!<;s79#$gO12$=ke#41W8Niip46 z{WtT6o9m4DMHODe-uW!ecm+aJ-MMrdx)6J{6e<*R`c1XqfHk3gOXa1RIEDvFWPy)< zrB!!Wj)MdJDBZ_dEM<2a)V94c~a%tKG)FfzB_LMX)hrG}p0Lk!7CK z{w;Uuq)H%$YxKd_Qp>8#s33w8OzsyxK&g$-lTnTL98Y4c&~~lzo516^!`RYcaV(ER zI4~ig=L73_P`wcI3mloT(X55mfHGLxLg($o2o2b7P9m`?V)hcSC;(^uf$e*AMXuLs z<9~FhX!;_WCVONz9?&}wB5POT0#BYj6jYw|?wW%WHGemKbQyuh8tjEu#C5eucbjvkHxzY)d8dOMCM0;L zfJig%(ODR>j-ZBpKjpg#PZ%U~2JB5$EM+;7i@Ts#gN z`uES|{Xjq>)^aDQ(+6w-HJ%?iAtghx@;)~!9Ivqseuhtm-3%pyMOQnkJH9KGB>obp zmC)F_>SRDa{Ky&wh5?aVHzGSzN%?PXxU8LM#>D#wqzL%J$R)=d8>tNdu-aCI~`iv$ym8T(jlRB zhqWZR@AH=JM${|)9-_-0jc#4EB?n$(aAKznFQ~A!fD5U_C^k*wc*4$LBylJj@zrEl zWN#emP^6-W-9z)Fdx-*4tEjekvRSBF7Nl&%ga*R`C*VHvVxeSQ*~9RD!mVJ@LNk4U zJnXH)Epd2khfpla_Mm4Fo@r-W>(`5q6VCbhVp|;4k1j^}Zr$)Lotg`%WUV2bE}^Lc zA(O`{P!rH%X-x=*hr$-|y6?1%BrQ-YkYG{ykm}`A{&6)Mg6g0mPr<4bM@i6=7K?L9 zm?G{*!ZT4WzEq@8k3>I7@xtHBHRiK-9bkbl3Y|kE67te$%wrX2lSO0ZcBx57djS=q z-kg+ZSD?|}n_ulqT%{}a`py#^k2J`wNfCepn&DpVS&+9Db)l^7Q=PnY{J7KT!&NL3cj9H%XedP0rcrGRf6B^>4*+h`)V zRZv+2;HPz|9^T7mjt{XIAw-SwXop|A-|(IzJ)%TK%^C#zTb)F*w^%fw8+*lx=UlzK2NVebM z?1&g30VvQzpD-t(iV(*BdAX7XP*F{*MkeCi z$0qd(q3Z0RB#XOVW^4~cR4(&=oWlLcIQmjf=+|iiR1iDToL7X6Ra6Jwv#&URspKgL zvOB6)sd$Q_-d}z>ica72TG60Urf7}nn{A{RH~$G-X5IOke35S8*JVi(`Rd7)Stl#D z!$)*_Ty8aOJ1M|t(JJTHmw?xP;yi^UL2qV@s42H0cB8tyV5qi{*FYSDP`+y&ZM7bH zllcr^-hdW5Jv3f~+>OtS4?EYHkC7q7ucG0je$7>@X7#?X7|WW*jZ}U5Nt=KdX+X_r z6NZ)=sEcSKwf{`n6gtI?B?Cz2zE8N+xEQ|U|IoZzDU}SBX6hQYWKisYe8T$@;}27Y+7yhllvOrViOWF5@`z)%E1{KkmT$*idas9 zn7|I;SlVFzz=t$v)OAo{Ty^w~eqwpUW53kU_3}J<7ix<;sEhq5ti2|D5rBbDBv7bY zK!buimj(&`lTl_asPsfLr4XvoJpo}#_I_Z9Vxp#) z&NXQ`ny*^sf>t7*ft*G7thmF~sYpoW?oA^14O|hJxF8czVmE$n+QhiADo%T@8VH~ zWg<737=ipwhuOioTI1Kh{qR!`=NtVbEp1Ng3Y-m(d~@cbha68x;0+{>Ex=*c~6Q#OX<_siB5t_kH$lD5ZE8zC5?#3gGPT?o#qW>C9aV|B2Wc;|jh&Mdx z`NY0>J4yERDW)mTavafm5{pC3JHG=H%ZYlB620}*g*l~LgDQid5GkRFB|0(J1nm(~ zH58w;>RpZzhwI5(Hzn`(o{D89L>4^mvF}QgpOTm0RNBs|g%&Acg{uLpeY!TNjfAMr zyZ;34p~1?Zy%A%V34V|6^NRw;i$$=1okI&}O()+;PO6~Rb$twtwJ~uSfHb0r;rUW& z8M4%wMN~*W2KCWjmk&p$I!R|3?7m-z8Rnd?ka!Tg<`21x9?pA@pMw_3EMr{U$hq*^a((N}}G^UuE=H@_r z@iIms(Nuw)RacIgHKS9Y`_gO7A76O>p3T zl^N9{k@L2D>AU7mp+>>e1&M>DnJ2gAt6V-uXv^uhK3f8`x{`{C{O*Lvkiqnkbi{Vl>W8ioc!ERQo?X< z@b=f~_?1$pp0Y|3=p}Z>G)Xxd*gg81rYl62Qar*g^ec6>7b0fV+yus%oR6mmo8%VpbGIwSU6_Z9l6F*>);9%To+U5Z5%4~OLJEJn zw{(4`y&g0#bE3L-Q2Gv7VyaqmTGr_BusR@Hg!yQKSKC>=#}pRG-T?EL$u_D>MqfMd7x@A=cnVo|!iBY0l0*f!*VloVl9 zK*|r=Tc~C#`*Ygt;+H1Td(VFaD99ewm^nAM;Y>xEnO z9IA!qGQS5NTi`~E~y_@MB zgNJz2f=Vaj%a&@(HEs|9K%DH5=IlZaIf2ruB+y{MAxWBZ|E{$)PU{X2=N&1!4xCWN z?np;uYH2eA?*qzY(nCBYgxaJq=&8Y5DozJ08Ya1|OfrHl*j)zY;~8b01nYSS$uc>B zC2nY2)V#V+_-ZV}d9!XMe0;TLEDgS{4v8^R_tRxY6pc#)R%4yiISw54x7!QF4^OIa z;gALpl1u8#9&+vM-4*wG@C2z_94)xY(aJ5ep9Yil+WUwNcibnnakUvN=B)IWvck*Y zt{ceu6^*-WfeVCmYy)@Tr+P5-X7-|Uj>fk+SLNf*%hIk%V8(SS)8}%^WcW<7-5N^j z6kPCOqJ}!9QxTJTo=6&#I(Qm(xff=E#Vn?q$3p5kFExw2oSIW2$wnU=1e^nb!@!gx z(R0Eke6zDv<|-!#%8rb|b9JVHy^~o}oFY$|K3!wb>8n)_n)*RZO8W|yqI-+-r_1woPX`}T z(270q2^24o6i-IxMoYpu=a=WGm+oWhWO-GJ_`;p}km9(;6Uxr<>?ZX~=ApwN1F7s1pTj z-@NiNZu6wBn`SDH@=kPjS4o9Tf0Sg&PMCv>h&DmJqH|ZY(M~$b-A+`uH#=1T~ z*qa%m8cqA7EK_QNDFm#(FNA{(Co)P||@L@#rg8#ivB@WWyJ0 zUnDbM7?U4i8t^46l-;x&KoR@af=^D7HZ?L`E8&96Su_K$UZl37DE!I=Dn*#8JIQxE z=`V~^(oI`f03l2G;p4y4+cL^k!p6U@O$`M$5&mO^X@ApNnn!*jYsll350kE5E(%ht`ueHa;XljtKo0lfl8UPTvj&v>T#{aWzdjXa z$$H1=5g5^7lG%K!J&in462^P-Ser0cvX^Mh_fX^2$iQRb(P_?IKgW6>&|X)CNvqsK z?-zjO>I<)}_MmEzoaw&#bDX*Va1E>xsM8g*d4YcsB0jPAa+5}s;`^~RC4;&>5n^aQ zyC$D@1f1nQ_h%{8FCC##tSVylBs!Muwq}c~|6pFwE~ONsJbB?YLLE(~lH(#CN2j+~ z=Yor);pd!&WZL=*>mW&VP|{}R9(PJgiT2G=pBi6 z#>kG;$B3h`#agBqN~%nQeE*svpB@w(v|O%jU{bz6_HJ@8V}l&xjJQ(%u7Uz>Tj{Su zqZeK9w!xou8?L~74`mM3CE0%x`wX^qlgRx%3SL4>B(V+coX6=jdOCLUxLg*!pmni^31on??frQX|9)JLP1!fwxbgjxQ7A9 zykU7`lLik`Qe8Mwc_W@}66R$+E!xfY96AJcniq+v-?EEGiw(`Z)&lalp7(E==Y zzA2Vdb#iEjpL=!eTV3f~$E$td{@4=MdD55*067W(Lj1-fb{%ttnofw1E$B`?ZS#PE zA80n0d0W$rPT7h(m7ME8P&cKQBu zgBynQfT6ES_hF#vZPkPF6`NO-VC=+(6*T7zpAOc$7KLeXKL8g3#JSa_;L@)=ArwDC{LY28mR z1=vayT>Cz(9zHG7KBG|_^Z?`Odrjs>+1EgIxLDlS#jm!4xuu|nmR19eyXGRc|%B?mlNZ&68H9& zI{P@CYJ_}nSjef_<=69f{F8yq$Bb4wg4YQA=(MBIR&^-+*>vD&>H?+JW|JhME8P1@ zsX^!`hzHI$73oTAuz{Dnp$$!f=kT)vG_5wc8z9wHUGj99K-4*-5)_UH4P3PM`LzFN zeYbm$Hjsy}-ByqX|ChfS9yTkR^pCz~kq2-~SlSO>T)tW#`|4zLnuYY6D$|jW1pF@C zisf$MNA#^Ga|!{8A_-^Kj?~YCRov?qOsh5wVatx1Hn6x>*c-!M^jQ$qOP~wVzycNT zrkb+ea*2F}uQf^kh<+1QQ{V{d<{T&+BcXkAkTqT|Nf70J5)5jV`IHVa`4dQ|VpZ07 zqSsH7)9oqYRS}FGR2gY`E@|*{a9JGK#$fE2<2p2g&S!~b%(%5fp*2EjB*zKk(|&Uy zl{D>!i$UO86k~$rickc`S$X8+v%UO%ABc6iO#AU(98+RdTs+fZs<>uV_NaR%i;wih zHfdnpwTruEZWByMga2%ioQ(nT`OUs#)o>N93YoI&1C35xW>*@v5arMa@&44(IlM5( z>#D?(^g6v;~n{>UkdON+X%_T7j-ci5)6NwCW`1(+$LWh?35FUaUM4SWb0 zmPFP*7?+LysQk(|2^qHvdV=8sf_&Big)tFW8NMBr5k`;HFb><>eulL)~QSp zmA@jjDOI)2*R?H72_#;#E~uX~1T?iLh&z@+fwz8KZoYhwA!L*YzDV*ph6<(ymv#Ie zAacRv2!<#0KuwE=4=R^514g^fNBo+6ep(jN<3NXI&vNyEBtVLV3d_VECS6$iCWlqb z&7=xmP1xTSxgWlVJsq1^1|nwL;BK_8UQtMELcr2TfgZzMk<_p#yo2DDA~vEEHRH)3 zfuc<{gz#c1dr9VsC6FP-{)4lO}^)=jGUF2n++rc0~40O8zZtP>4 z`@-wmx536o*Vx>H!ZLM=W?2xA>_)%pGo+9keLbIb)|_qB0s+1Xh7mEV*TB826C~H1 zaQ8bEG+-WPFrbr(bw_vLt!kI@i4~N&^DxJa{XJU{=Wj{D=nx z&34JCTai#F*8!PC{p5K}1LzeF!9Z?+9WT>~Ztl*@p zcc)2h9lv{#-#udsmFY1_ds|w7{_b9AQj=?6`=Tz6?%vr(?Gmlc*w#7w;n`X~>qeWN z`61cSA>bhg+bmFtW*0h4)10i_)CD&6nxcn3aMaDr9=lxQ3QZ7-rzDURK6V=#tlA6z zqfW{p;&4oFCU`FJVznBIEm~;t8aSL&QKsv-tu2(87$09T9Rm+O7GG1GdnAda9uYa_ zUjigVGVYNnDT0*2WPW6#bz&N_z83=rxSK0fu` zk2xd5gd}U$p#cod8XIR8xcd% zxJ~cI=MbMB_l)kRx-G)4D9Rr#4?jEUe{}0fM!wVtp9nM2B`na2@ciWA1IY$LVk>LN ze~B|t*}K{{DBD!w`qg$OZWjRHLzoc;{8naX+OTO}U@l>5`RpIAMrWV9tLi7OpY(dR zf#d&}GeVJv;7k*cMFXLfYdKbzfmwMgMC$wDJ*8Yc96A9od@JbvbQCU`N!dqh6(7=J z2kAn(DF;}#wBSN~(}^Re$P`~{L@c)x#m1vWQ392}ysFNTDU4GU5EC@B$As7x^F^Lu zRwg50w$8znYq#3m51np!o*T8@+#t(Y(ChE!G1oY6t0uf%(R9ZYnh|r!QrjO5r1S(=-RU(G#8C+d?GD=vh ztd!p*MB9yMfys;@Su2GXxX-+)2kY8$M>h`g0mXzkhtRG?JB>k|7r`r$$q4G!dw=!& zc@KI*`hovp5^v4Ea)BV5s(z@Y`omj`kdMr_5owWVdHiCyPQwW&bpRvX#i2ipf_66Z z#2`$}1WI=k8%Eg8b}-TCmhm+^{BzuO1(Md+p#9L2Jn6mBtWH~sB-A2mIjfFi5%+df z0&kl3mZvVLu`+zYVU!qHWdk>_?i-#gGWuo?{h~53$ocf0wAk)EJr_ap9Q_B!G(Rn| zL2}-`i2GJM^A@>+<-PWjc^vv%QCu1X$UwVlmf^w7VM83TSt;sWpu;sB)YlhqGrajfZSausZl7ZvEItB!(h zu7%NyEtg)Zc!XN6Ap(b@J^-$+7wBoNjNVO@-2=|}GV}(pWr8Q!sHI3QP@bahxh_^l z+^328h+R;rK&1{f0ZYza2T@lplKd+ncZMk29^^WcMHPrt$bba&bl{Zau-z^tOJbOR z6&|Z(oik*=B+A|PIG%a;5@hr4#{6_5>M3sI!}Nl$4~H3XLX75!spzh=d`9TTZ@$R3 zHjQmLfhBHY8q6*gE6h`8VUA0Sq1QjZs)%k7gw@_N2_HKrfn1Z)MXVFCdGO9~eSf5< zj$KbccjBAkq)PZ*G0LTP%sr210w@F8*6~n5$;9m-0k9T5oFh+@9$5eYfZ1Jta3hwi zn_BKiK||X~(LnjCTPxC9jke7QSX$|L10^_|h!g_70zM+_rJX$xqSvNtIPrsSh~x$} zz}cL6gIWd{TV_@XWUuWTLoxa^O+5adBwe=x?|aN}ZFyghXq}~#!=ik2wyOVn{!K4R zJIeW8_gtCD#0B;q4By|f{jZ1ds;Ip#2y^tNT`krWRY0Q#MoX(P6^h$F#xut3JAnn* zz{~R=L6piDc5CKmNj!YPK|{e~U0YhKC!D5x;*2uNjz1vdRdKk9iHfcUP?>#-_Ccp< z#&+*)VU{-vs}T8Eh3}W_z|P~cF@DgE`Ua%KZ`MK!xkg(ZNF{ncz3GJ`_B@qiV-_yz z;S;I|GEDJNnK7n5Lm8Iyu^Xe;qsaV#-`FUcb?KTKpd6FhPHVp;jIu!sSmb>EbPe=< zaNSb7WuKl)NLhrT3-qI$SpXb^N3cPt!ek0hAK*9&2INFl+t_iH1te>NA#)g0V$;>~ zEDP0zj6rtEslZdt{dLFtBxJLK8D;d{xrx}z7IfY~^S{*V?=4!`pKG>3D(=tmr83xBr?l56r=sht=flE_-LwO_w@lx`n zt7UL6{>p>Xd)i(5>a6sN0Pka!$jx{8=e#2QOYk?upx^T?1umL?FVVLB3i~-`Y4GBR zsWAp&KrU9N#YOg49Xlkyvx|sm2hiRElFjnIzLEy`Szy?BW7)4GOY{PW0qA@3^PXlx z@!4>2$KxJ@Wz^6ZD#VY|%2;|ICv4W(a^O6;VOm`(Hd{->lo_?%*LQ2)q#ZTX;6}>4 z$)he{nNt|El8UotOQo%}V?5eYf&KR-T}RA5y_zK--TmL(Bw1Sl96%FGX&R-U%ZOb7 zprwuh1W0*j?mj+sY;q;3o`IWlT2R~p6m`=|Vl`I^U=E3Fo=6|CVS^9B#wM=D20B^> zIxxPy1*-FLg^moVgj9KTEZInWIm6#5%H8|pV2PpQVzVL79qjj3Wi>J9Ajgs2p(1@A ze0o2`%!!tI4%*y*{UQgS{r0oX+=L>!D^f5-^ri1Mmm}f#0Mb&s&q;04(hVXQ$OLoi zmT53H4UMW#+8Ql28>D!;zYcHS5zZz=BqZedHkzo_IK5M=UJK_MHlxWHiku?@k+l^$ z;m#n*`^?uBMdlg86UKT7boL|<3^iz7^8gqE8I^i|EEq@EiY6)0fs!EkB`0PJ&A0Ek z2Qff81eb&Y3+n`SA-3cf51FHZA2taLCYY&XmA(#8T}Xag3eYVM%ywuo;{p`njch?5 z&OLZmC%Z%y{EA!BI{FT+dVzeSdzrl%o4(NGO~JnNk|oWg0XI zuSSFXGX3^R0@y)+AwO>>{g2O()Pnn!v_Y35Dav72+b`Lk zyF4#=9G%mshe^LHG_0TC0vF+-&fo{(bp0*KV7$NS_pkn>&A*EZ0!*;6KFTky>YoxA zrdpT0`pqt&coiyyuU~?6FBD%7R4VxU8H!2C12nsF2e1$1xRI}VlLJlNa0_z!xj{*j zG&90yiqVpkx?m8T)~N5_B#DOFsEZ<9T?Ct({z3g>0U@I^#Yaj)2yKc-ls35`Q)pWo zqlSb3@)}lkOc%_SuZd|_V*j3=7wrI9~_Rgv-Szbv$lXCz)tvzbbjTCY`!9Kr%v1`Q-vzPlL~GuK2uEnoYrJC z0&$xB%%P_}2c}N1lhEVM&@Us6svsex_4G*0j(RUzTE%Yasp3`be3G~{hujEEXY_cH z#+382E3{DuE+%OB!@Nr#3l0^MN!sXQ*>`9seB7h{R6gqZAy@&eRJ9v7P_x&V5}vwl z0e6Z%myl7fFp%Lld24A4lj=^BU_g*A*EC4YeO3kM&VYB)!~dTBJWWG7KM&Gxsx!!i zr;K-r=3?WzHQgU&)oRAYsg6;Y}m8E zWjYu|v3EVzndh3JIw(W*>aJWt#}`nlCgw^!gnQTzwMF&Ct}n4no~tzf`NrvxGzf-E zR>UsDH98@h7|!HIQL&$1WlFT`hbY&gav#B|tKE+~;`oB8{2k-v!q`RjUA+fSoZ zf0PsW$l?lgztGPg)!@p8dotZ?FsIpRJ5e8ZIydacg=ijW?r_Fn2Q~Y5-zPQmW{q`9 z-(c0#t%P}VP0&hD{PZ)yXh!iDJhz!;C7I*&=4T`vSYH|oDnM(v6VQdbt%Sq7sq!5d z*xA=A=pIv;kav8gTcSg8lnpP<`C(e`FHytRI^_^}DVXfpr^f4Bn|HZuFe72e zY{UFV!1mFzQQF26XqNT&%PbqUE%xOyR##?xCm5~oZCYf2SwRp0;A6=tS1$uuu70Ri zz%PQlWe9%NT8XX|31sy-ScXSF$~KXB*Q;e-!-0q5TI!UCbm+VvAEKq2EZyC-%0*|S zd^WU!K>WAOGxmi;(`-_Zp>TJq9#ga=47D$=Ds>@$<-UZE|@rm-r}_@Br`@m>b9C@2iT-YIyJYR_Qwp7qX{CL zOf)1>WdKAenLu=o8les9otgfV}e7J#rU}QfD z79W%}Rci4aZbtoxf{<$UXC}6>h@;2JqmQ22+dSkH7250k!m7aQcLbrPtRmr~fK&PH zH`a4h5IH*__(>|_YOvE)I*U(N^$`)!b3TZNVE{z8F3R-pI`kk8Uu}FCTvJi(Pm3a2 zoUp()&f-^`uRVAIuj1xB2rD%7j(<*fs;dp86>&cnh8@u^tSb_Bzv@IJP4SVqW*ulJ zF|2{;?6i&V|M~3DF%>Do#(!d4!TDp#kc~~}kC0&M)PoAZ)iN|Qa3UTdfmXS?h%pME zl3mK!`{-qD{SDr%HiICmWt$(&KME5!`%KEA9%?y7+0G~+Qb>gQuDi}km6w93jWA_Y zT{N8ry;cq)gCtW5{c{!~{XFmSwMWU6WF2js>K)_5?|{A31J+*P5_^qDmVA1K(#Ubju7}`GKDaGl#N`6jH|zJ>!80sA{4PkA&94u zK4ZW+g5_iRyH-D$XFuq5;ef>X9#5g4C2^(ALn9J12S3elV&<>+iClPhZ0*ilz{A@p6&Z1(t zGRIeKR9R~D+Vi}8Xy+%|{?XwQT~7vdm3L-J&UR#O%tyl)71%yL+w zyHx-SyfA568=$kL1(4+5Qkc8D8ljx716!Sm3*CTwe7%p|&EdYpxy^cn- z>cF>F!E12MZLvTla~WU^Ap5k=(|5JIYVPgR3rD?|Yk_2!}YZ=aVg{<0vT)ie;9rrju|5~HT_iXuE{<_~)! zKrQ@JcZ;c@<>sLmat2(KO33QoP?DwJ;x?7iDe1r(XYd;Kw^g#S*S`G&QG6FIX&v*j z#U--R+6RIeEpY8HFTO=Ql%iT@--`s7C0cE@7rfd>kO0#oT(^V(_7>6C)hPz7K3X)V z+ExeJ@E5L=l4Ord@?g7dNQeN+&do;bN&QS(-(zr5vXpo>OoK^#TR?tIqsDaGaZ(A* z3?&tf_NC*)FO<9n+qHup;Ih}}OgwxodLyvr)xa2m%&=n76@R|c5$#8p)0m*76|i4Y z88XQ;t(Il!l58WkZ|^u&R^vjBEgh13N6*lzz_d)m8u>Ybx0vsQaO?%Tv7o3E;msp_o0tfC7`AZWvmBjqBw!H=BzHS>~t|E;@~OV*1(@K6)3it{sW( zi;(_v?RfWp0$~82|IJk!i+-GAlBWgY6!Gg;c%!ee`{}e}VdR-%SzLErQk&;O@lMS8 z!w1Iki^}ow(xfcvMSBd`o(}uW+z~&30OSE#MemWxOs-QXIJ}cXD8>^Z+RBy;CNKa1 J00000002@7mSz9| literal 0 HcmV?d00001 diff --git a/public/apps/z2ui5_cl_smpc_app_089.webp b/public/apps/z2ui5_cl_smpc_app_089.webp new file mode 100644 index 0000000000000000000000000000000000000000..d0a4e66b86d94c5c5a6bf3810473bf2601f84c47 GIT binary patch literal 7256 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 o-a+0l8rABOv(GLyB0O^K2!2kdN literal 0 HcmV?d00001 diff --git a/public/apps/z2ui5_cl_smpc_app_108.webp b/public/apps/z2ui5_cl_smpc_app_108.webp new file mode 100644 index 0000000000000000000000000000000000000000..4084bcfa92740b73c03d784ceeae53c5760dc9bd GIT binary patch literal 9346 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 Z0tz%rRSp5O>5??(Cy#*tjOhP*{684KwaNeh literal 0 HcmV?d00001 diff --git a/public/apps/z2ui5_cl_smpc_app_329.webp b/public/apps/z2ui5_cl_smpc_app_329.webp new file mode 100644 index 0000000000000000000000000000000000000000..3da1c9a5aaab1fe4262baa130d88132a5f4d0947 GIT binary patch literal 5224 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 H00000GXOhs literal 0 HcmV?d00001 diff --git a/src/pages/index.astro b/src/pages/index.astro index c98f579..a1b03b8 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -21,14 +21,14 @@ const base = import.meta.env.BASE_URL; * commercial SAP app platforms sell (warehouse, maintenance, shop floor, * approvals), at no license fee. */ const useCases = [ - ["box", "Warehouse & logistics", "Goods receipt, picking, stock transfers and inventory counts on scanners, handhelds and tablets - in the browser, with the barcode scanner and camera of the device."], - ["wrench", "Maintenance & service", "Work orders, notifications and checklists for technicians, on the desktop in the workshop or on the phone at the machine."], - ["factory", "Production & shop floor", "Confirmations, quality inspections and the special processes the standard never covered - right where the work happens."], - ["check", "Approvals & workflows", "Purchase requisitions, invoices, leave and master-data requests: approve in one click, in the launchpad, in Teams or on the phone."], - ["gauge", "Cockpits & dashboards", "KPIs, charts and monitors for one team or one process, live from SAP - no data warehouse, no extra BI tool."], - ["form", "Paper & Excel replaced", "Forms, checklists and spreadsheets that live outside SAP become apps that write straight into it."], - ["list", "SAP GUI modernized", "Reports, ALV lists and transactions turn into browser apps one at a time, with the logic behind them unchanged."], - ["phone", "Mobile, without an app store", "Every app runs on iOS and Android in the browser or the mobile shell - nothing to install, nothing to distribute."], + ["box", "Warehouse & logistics", "Goods receipt, picking, stock transfers and inventory counts on scanners, handhelds and tablets - in the browser, with the barcode scanner and camera of the device.", "z2ui5_cl_smp_app_530", "A scan field for the warehouse: every scan lands in the list, no tap needed"], + ["wrench", "Maintenance & service", "Work orders, notifications and checklists for technicians, on the desktop in the workshop or on the phone at the machine.", "z2ui5_cl_smpc_app_089", "An object page: header, status and sections, as a work order would show them"], + ["factory", "Production & shop floor", "Confirmations, quality inspections, shift plans and the special processes the standard never covered - right where the work happens.", "z2ui5_cl_smpc_app_108", "A planning calendar, as a shift or capacity plan would use it"], + ["check", "Approvals & workflows", "Purchase requisitions, invoices, leave and master-data requests: approve in one click, in the launchpad, in Teams or on the phone.", "z2ui5_cl_smpc_app_291", "A notification inbox with priorities and actions"], + ["gauge", "Cockpits & dashboards", "KPIs, charts and monitors for one team or one process, live from SAP - no data warehouse, no extra BI tool.", "z2ui5_cl_smpc_app_517", "Launchpad tiles with KPIs, trends and figures"], + ["form", "Paper & Excel replaced", "Forms, checklists and spreadsheets that live outside SAP become apps that write straight into it.", "z2ui5_cl_smpc_app_329", "A form with an edit switch, instead of a paper form"], + ["list", "SAP GUI modernized", "Reports, ALV lists and transactions turn into browser apps one at a time, with the logic behind them unchanged.", "z2ui5_cl_smp_app_070", "An ALV-style table with search, sort, filter and row actions"], + ["phone", "Mobile, without an app store", "Every app runs on iOS and Android in the browser or the mobile shell - nothing to install, nothing to distribute.", "z2ui5_cl_smpc_app_024", "A feed app on a phone"], ]; const useIt = [ ["The team is ABAP.", "No JavaScript, no UI5 tooling, no Business Application Studio to set up. An app is one class, written, debugged, transported and unit-tested like every other class."], @@ -167,7 +167,13 @@ const doors = [

One framework for every process that needs a screen

From the warehouse floor to the management cockpit: whatever runs in SAP today on paper, in Excel or in SAP GUI becomes a modern app - built in your own system, by your own team.

- {useCases.map(([icon, h, t]) =>

{h}

{t}

)} + {useCases.map(([icon, h, t, cls, alt]) => ( +
+ {alt} +

{h}

{t}

+ See the example app +
+ ))}

→ Browse the sample catalog for the screen closest to yours, or read In a Nutshell for how it works.

@@ -208,6 +214,10 @@ const doors = [

AI

The UI5 framework made for AI

An AI assistant is only as good as what it has to produce. With abap2UI5 that is one ABAP class - the simplest target there is for an AI, and the easiest result for your team to check. Your developers describe the screen; the AI writes it; your rules review and transport it like any other code.

+
+ A chat assistant in an abap2UI5 app, with suggested questions +

Example: a chat assistant inside an abap2UI5 app - one class, with a built-in rule-based answerer that one method turns into a real AI call.

+
{ai.map(([icon, h, t]) =>

{h}

{t}

)}
diff --git a/src/styles/global.css b/src/styles/global.css index 8dcf6ff..46e1761 100644 --- a/src/styles/global.css +++ b/src/styles/global.css @@ -203,6 +203,20 @@ code { font-family: var(--mono); font-size: .9em; } @media (max-width: 1060px) { .cards.four { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 560px) { .cards.four { grid-template-columns: minmax(0, 1fr); } } .cards.stack { margin-top: 0; grid-template-columns: minmax(0, 1fr); } +/* a card led by a screenshot of a running sample app */ +.card.shot { display: flex; flex-direction: column; padding: 0 0 22px; overflow: hidden; } +.card.shot > :not(.shot-img) { margin-left: 22px; margin-right: 22px; } +.card.shot .icon { margin-top: 18px; } +.shot-img { display: block; aspect-ratio: 16 / 10; overflow: hidden; background: var(--bg-alt); border-bottom: 1px solid var(--line); } +.shot-img img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: top left; transition: transform .25s; } +.shot-img:hover img { transform: scale(1.03); } +.ai-split { display: grid; grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr); gap: 28px; align-items: center; margin-top: 36px; } +.ai-split p { margin: 0; color: var(--muted); } +.ai-shot { border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); } +@media (max-width: 860px) { .ai-split { grid-template-columns: minmax(0, 1fr); } } +.shot-link { margin-top: auto; padding-top: 14px; font-size: 14px; font-weight: 600; text-decoration: none; } +.shot-link::after { content: " →"; } +@media (prefers-reduced-motion: reduce) { .shot-img img { transition: none; } .shot-img:hover img { transform: none; } } .icon { display: inline-grid; place-items: center; width: 40px; height: 40px; border-radius: 10px; background: var(--brand-soft); color: var(--brand); } .icon svg { width: 21px; height: 21px; }