Device APIs move into the framework core, revolutionary Bluetooth debugging, and the Build Cloud''s new UI is live in preview.'
+---
+
+
+
+Last week was about defaults. This week is about device APIs moving into the framework core, a small simulator change that revolutionizes Bluetooth development, and a preview of the new Build Cloud UI we would love your feedback on. There is a handful of other things in here too — and the Metal default flip I trailed [last week](/blog/skills-java17-and-theme-accents/) is in a different state than I expected, which is worth a word at the end.
+
+## A new Build Cloud UI — preview
+
+The single most visible change this week sits behind the Build Cloud login. The console we have been serving for years is being replaced. The new UI is *live now* [here](https://cloud.codenameone.com/console/index.html), alongside the current console you can still find [here](https://cloud.codenameone.com/secure/index.html). We want eyes and feedback on it before we flip the default.
+
+
+
+The whole console is written in Java 17 against the Codename One UI framework, then compiled to JavaScript via our JavaScript port and served as static assets from inside the Build Cloud. Same `Form`, `Container`, `BoxLayout`, `Toolbar`, `theme.css` you would write for a phone build.
+
+This is the same playbook the Initializr, the Playground, and the Skin Designer already follow. Four non-trivial Codename One apps shipping to the browser as production tooling. If you wondered whether the JavaScript port could carry a complex application UI, this is the most direct answer we can give.
+
+## Device APIs become first-class
+
+The bigger structural change this week is that three new APIs that used to live in cn1libs or weren't available at all are now built into the framework core: **biometrics**, **cryptography**, and **NFC**. The unifying idea is that you should not have to add a cn1lib to do work this fundamental. The cn1lib model is still useful for genuinely third-party functionality and for features that make less sense in the core. The existing cn1libs that we are subsuming continue to work unchanged on projects that already depend on them — but the bar for what lives in core just moved.
+
+### Biometrics — [PR #4987](https://github.com/codenameone/CodenameOne/pull/4987)
+
+Touch ID, Face ID, and Android `BiometricPrompt` are now in `com.codename1.security.Biometrics`. The API uses simpler semantics compared to the original fingerprint API (that predated face scanning but didn't rename the API). You can use `canAuthenticate()` to gate access, then an `authenticate(...)` call that returns an `AsyncResource`, typed `BiometricError` codes on the failure path.
+
+```java
+Biometrics b = Biometrics.getInstance();
+if (!b.canAuthenticate()) {
+ // No hardware, or no enrolled biometrics
+ return;
+}
+b.authenticate("Unlock your account").onResult((success, err) -> {
+ if (err != null) {
+ BiometricError code = ((BiometricException) err).getError();
+ switch (code) {
+ case USER_CANCELED: return;
+ case LOCKED_OUT: fallToPassword(); return;
+ case NOT_ENROLLED: askToEnroll(); return;
+ default: fallToPassword();
+ }
+ } else {
+ unlock();
+ }
+});
+```
+
+On iOS this wraps `LocalAuthentication.framework`; on Android API 29+ it uses `BiometricPrompt` and on API 23-28 it keeps the legacy `FingerprintManager` path through a reflection adapter. The build servers and local build handle permissions and framework linking seamlessly so you don't need to do anything and don't need to add a build hint. It **just works**.
+
+The Java SE simulator has a new **Simulate -> Biometric Simulation** submenu with an *Available* toggle, per-modality enrollment, and a configurable outcome for the next `authenticate(...)` call. So you can exercise every code branch — success, user cancel, locked-out, no-hardware — without leaving the simulator.
+
+If you have been depending on the venerable `FingerprintScanner` cn1lib, it continues to work unchanged. New code should reach for `com.codename1.security.Biometrics`.
+
+### Cryptography — [PR #4994](https://github.com/codenameone/CodenameOne/pull/4994)
+
+Routine cryptography (hashing, MAC, symmetric and asymmetric encryption, signing, JWT, OTP) is now in `com.codename1.security` and ships with the framework. The pure-Java algorithms (Hash, Hmac, Base32, the JWT and OTP machinery) produce identical output on every supported platform. The bits that need real keys — AES, RSA, ECDSA, `SecureRandom` — route through each port's native crypto provider so you get hardware-backed primitives where the device offers them.
+
+A typical AES-GCM round-trip:
+
+```java
+SecretKey key = KeyGenerator.aes(256);
+byte[] nonce = SecureRandom.bytes(12);
+byte[] enc = Cipher.aesEncrypt(Cipher.AES_GCM, key, nonce, null,
+ "secret".getBytes("UTF-8"));
+byte[] dec = Cipher.aesDecrypt(Cipher.AES_GCM, key, nonce, null, enc);
+```
+
+A SHA-256 hash:
+
+```java
+byte[] digest = Hash.sha256("hello".getBytes("UTF-8"));
+String hex = Hash.toHex(digest);
+```
+
+A signed JWT:
+
+```java
+byte[] hsKey = KeyGenerator.hmac(256);
+String token = Jwt.signHs256(hsKey)
+ .claim("sub", "user-42")
+ .claim("exp", System.currentTimeMillis() / 1000 + 3600)
+ .compact();
+
+Jwt parsed = Jwt.verifyHs256(token, hsKey); // throws on bad signature
+String sub = parsed.getClaim("sub").asString();
+```
+
+And a TOTP that lines up with Google Authenticator / Authy:
+
+```java
+byte[] sharedSecret = Base32.decode("JBSWY3DPEHPK3PXP");
+String code = Otp.totp(sharedSecret); // current 30s window
+boolean ok = Otp.verifyTotp(code, sharedSecret, /* drift */ 1);
+```
+
+The PR also ships a matching UI widget — `com.codename1.components.OtpField` — a segmented, auto-advancing OTP input with paste distribution and a completion listener, so the "enter your 6-digit code" screen is now half a dozen lines of glue:
+
+```java
+OtpField otp = new OtpField(6);
+otp.setCompleteListener(code -> {
+ if (Otp.verifyTotp(code, sharedSecret, 1)) {
+ proceed();
+ } else {
+ otp.setError("Wrong code");
+ }
+});
+form.add(otp);
+```
+
+We deliberately chose conservative defaults: `AES/GCM/NoPadding` for new authenticated AES, `RSA/ECB/OAEPWithSHA-256AndMGF1Padding` for new RSA, constant-time HMAC compare, a bias-free `intBelow(n)` on `SecureRandom`. The MD5 / SHA-1 / PKCS#1 / ECB transformations are still there because real apps still need to interoperate with legacy systems, but the documentation calls them out as interop-only.
+
+### NFC — [PR #4996](https://github.com/codenameone/CodenameOne/pull/4996)
+
+`com.codename1.nfc` is the third addition. A single `Nfc` entry point, an `NdefMessage` / `NdefRecord` pair with typed factories (`createUri`, `createText`, `createMime`, `createExternal`, `createApplicationRecord`), per-technology `Tag` subclasses (`IsoDep`, `MifareClassic`, `MifareUltralight`, `NfcA`, `NfcB`, `NfcF`, `NfcV`), and a `HostCardEmulationService` base class for emulating a contactless card.
+
+Reading an NDEF URI tag — the "tap a poster" pattern:
+
+```java
+Nfc nfc = Nfc.getInstance();
+if (!nfc.canRead()) return; // no NFC hardware / NFC disabled
+
+nfc.readTag(new NfcReadOptions()
+ .setNdefOnly(true)
+ .setAlertMessage("Hold near the poster"))
+ .onResult((tag, err) -> {
+ if (err != null) return;
+ tag.readNdef().onResult((msg, e) -> {
+ if (e == null) {
+ String url = msg.getFirstRecord().getUriPayload();
+ Display.getInstance().execute(url);
+ }
+ });
+ });
+```
+
+Exchanging APDUs with an EMV / transit card:
+
+```java
+nfc.readTag(new NfcReadOptions()
+ .setTechFilter(TagType.ISO_DEP)
+ .setIsoSelectAids(myAid))
+ .onResult((tag, err) -> {
+ if (err != null) return;
+ IsoDep iso = tag.getIsoDep();
+ if (iso == null) return;
+ iso.transceive(myCommandApdu).onResult((resp, e) -> {
+ if (ApduResponse.isSuccess(resp)) {
+ /* parse response */
+ }
+ });
+ });
+```
+
+Acting as a contactless card via Host Card Emulation:
+
+```java
+class LoyaltyCard extends HostCardEmulationService {
+ public String[] getAids() { return new String[] { "F0010203040506" }; }
+ public byte[] processCommand(byte[] apdu) {
+ return ApduResponse.withStatus(loyaltyId.getBytes("UTF-8"),
+ ApduResponse.swSuccess());
+ }
+}
+Nfc.getInstance().registerHostCardEmulationService(new LoyaltyCard());
+```
+
+Android uses `NfcAdapter` foreground dispatch / reader-mode and `HostApduService`; both manifest entries are auto-injected by the Maven plugin and the build daemon when this class is referenced. iOS uses `Core NFC` (`NFCNDEFReaderSession`, `NFCTagReaderSession`) for reading and `CardSession` (iOS 17.4+, EU only) for HCE; the `NFCReaderUsageDescription` plist entry and entitlements are auto-injected by the build server and local builds (again seamless is the key). The Java SE simulator has a **Simulate -> NFC** menu (I feel like I'm repeating myself), that lets you tap a virtual tag, edit its NDEF payload, and fire APDUs at any registered `HostCardEmulationService`, so you can sit at your desk and drive every code path without a card or a reader.
+
+On platforms that do not have NFC (desktop deploy, the JavaScript port) the base class is returned and reports the device as unsupported, so application code does not need platform `if` statements — always gate on `canRead()` and you are fine.
+
+## cn1libs can now own simulator menus — and that changes Bluetooth
+
+[PR #4988](https://github.com/codenameone/CodenameOne/pull/4988) is one of those small-looking changes that opens up a whole category of UX. The Java SE simulator now scans every jar on its classpath for `META-INF/codenameone/simulator-hooks.properties` and lets any cn1lib contribute its own menu items. The cn1lib does not reference any Swing types — the data file just names a `name=...` for the menu group and a series of `itemN` entries pointing at public static no-arg methods, each with an optional `labelN`. The simulator does the rest.
+
+A skeletal hook file:
+
+```properties
+name=Bluetooth
+namespace=bluetooth
+
+item1=com.example.bt.sim.Hooks#toggleAdapter
+label1=Toggle adapter on/off
+
+item2=com.example.bt.sim.Hooks#addDemoPeripheral
+label2=Add demo peripheral
+```
+
+Drop that file inside a cn1lib's `javase/` module and the next time the simulator starts you get a **Bluetooth** menu with two items in it, each running on the CN1 EDT, with `Toggle adapter on/off` and `Add demo peripheral` doing exactly what their names say. Each entry is also callable cross-platform via `CN.execute("bluetooth:item1")`, which is what makes the same hook usable from a screenshot test or a scripted demo. Items without a `labelN` are API-only — registered with the executor but hidden from the menu — which is what test suites use to prime scripted state.
+
+We picked the data-driven shape on purpose. We are going to rewrite the simulator UX over the coming year, and we did not want cn1libs to either depend on `JMenu` / `JMenuItem` directly or have to be recompiled when the simulator's UI shell changes. The neutral `SimulatorHook` record (`menuName`, `label`, `Runnable`) is the contract; the UI on top of it is replaceable.
+
+### Bluetooth that you can actually debug
+
+The reason the simulator hook landed *this* week is that we have been working on the [bluetoothle-codenameone](https://github.com/codenameone/bluetoothle-codenameone/) cn1lib in parallel, and the cn1lib needs the hook to be genuinely good. The result is a Bluetooth debugging story that is materially nicer than what you get out of the box on either native platform.
+
+The library now has two backends: a real BLE backend that talks to actual hardware (CoreBluetooth on iOS, `BluetoothLeScanner` / `BluetoothGatt` on Android, the new native desktop bridge on Java SE) and a fully in-memory simulator.
+
+To be clear, the simulator now connects to the hardware bluetooth on your device and starts scanning for real devices. I debugged bluetooth devices from my Mac using IntelliJ/IDEA and was able to see **real devices**!!!
+
+The cn1lib's `simulator-hooks.properties` ships with seven hooks that put the simulator in the simulator's menu bar:
+
+```
+Bluetooth
+├── Toggle adapter on/off
+├── Add demo peripheral
+├── Disconnect all peripherals
+├── Push demo notification
+├── Clear peripherals
+├── Switch backend → native BLE (real hardware)
+└── Switch backend → simulator
+```
+
+So a typical Bluetooth iteration loop looks like this:
+
+1. Open your app in the Java SE simulator. The simulator backend is on by default.
+2. Open **Bluetooth -> Add demo peripheral**. Your scan picks up a fake peripheral. Step through your discovery code.
+3. Open **Bluetooth → Push demo notification**. Your characteristic listener fires. Step through your handler.
+4. Open **Bluetooth → Toggle adapter on/off**. Your "adapter off" branch runs. Step through it.
+5. When you are happy with the in-simulator behaviour, open **Bluetooth → Switch backend → native BLE (real hardware)** and your laptop's actual Bluetooth radio takes over. Same app, same code, real peripherals.
+
+Compare that to the conventional Bluetooth iteration loop on iOS or Android. You need a real device. You need a real peripheral. The simulator does not have a BLE stack at all on iOS, and Android's emulator has a partial one that does not match real hardware. You end up doing every change on device, with cables, and the moment something goes wrong you have to figure out whether the bug is in your code, the peripheral firmware, the OS BLE stack, or some interaction between all three.
+
+With the cn1-bluetooth simulator backend, the first four of those variables collapse to *one*: your code. When it works in the simulator and it does not work on device, you have narrowed the problem down to the platform BLE stack or the peripheral, which is a tractable problem. When it does not work in the simulator either, you are debugging your own code, on your own laptop.
+
+If you have a cn1lib of your own that would benefit from a "Simulate → Whatever" menu — fake GPS coords, scripted push notifications, deterministic camera frames — the hook file is the simplest way to ship it. Two lines of properties, one public static no-arg method, and the simulator has the affordance built in.
+
+## In-app purchase consistency — [PR #4990](https://github.com/codenameone/CodenameOne/pull/4990)
+
+A forum report of `submitReceipt` being invoked repeatedly turned into three closely related fixes in `Purchase.synchronizeReceipts`. All three had the same root cause: code that worked when the App Store / Play Store filled in every field, and quietly misbehaved when one of them was null.
+
+1. `removePendingPurchase` matched only on `transactionId`. When a receipt's `transactionId` was null (a real case on some restored Android purchases) the call silently no-op'd, the receipt stayed in the pending queue, the recursion at the end of `synchronizeReceipts` pulled the same receipt again, and the same receipt got re-submitted forever. The fix matches on the receipt itself with a fallback tuple of `(sku, storeCode, purchaseDate, orderData)` when `transactionId` is null on either side.
+2. The recursive `synchronizeReceipts(0, callback)` re-registered the caller's `SuccessCallback` on every iteration, so a queue of *N* pending receipts caused the user's callback to fire *N* times. The recursive call now passes `null` since the original callback is already in `synchronizeReceiptsCallbacks`.
+3. The callback flush itself fired even when the queue had not actually drained, which masked the duplicate-submit problem at the surface and made it look like the callback was the bug.
+
+None of this is dramatic in isolation, but the symptom — a subscription that gets re-validated against the server every few seconds — looks identical to a server bug, and it has cost real developers real hours. The fix is shipped and the regression tests cover the null-transactionId path so this exact shape does not come back.
+
+## UTF-8: JDK-compatible replace semantics + a NEON ASCII fast path — [PR #4989](https://github.com/codenameone/CodenameOne/pull/4989)
+
+`String.getBytes("UTF-8")` and `new String(bytes, "UTF-8")` on iOS were behind the standard JDK in two ways. The decoder threw `RuntimeException("Decoding Error")` on malformed input — the rest of the Java world emits `U+FFFD` per maximal subpart and keeps going. The encoder dropped through to a 1-byte-per-char stub on non-Apple builds, and there was a silent `ISO-8859-2 → NSISOLatin1` alias that hid encoding errors when `NSString` rejected the input.
+
+The new decoder is a Hoehrmann DFA with JDK-compatible REPLACE semantics: one `U+FFFD` per maximal subpart violation, truncated trailing sequences also emit a `U+FFFD`. The encoder is a portable UTF-16 → UTF-8 with surrogate-pair joining; the Apple path now uses it directly so `NSString` is no longer involved in the common case. And the encoder gains a real implementation for the POSIX / test fallback in place of the old TODO stub.
+
+The fun part is the SIMD work. The ASCII prefix scan (`vmaxvq_u8`) and the `u8 → u16` widen (`vmovl_u8`) are gated on `__ARM_NEON` and only kick in for inputs ≥ 64 bytes. A standalone microbenchmark shows roughly **53× speedup** over the scalar DFA on ASCII-heavy payloads. The integration-level benchmark cannot see this number because allocating a fresh `char[]` per call dominates on ParparVM, but the helpers carry their weight on the parser-style hot paths the SIMD work was added for (JSON parsing, log scanning, the kind of text that is mostly ASCII with the occasional non-ASCII codepoint).
+
+If your app parses a lot of UTF-8 — and most apps do, because most network APIs are JSON over HTTP — this lands as a quiet but measurable speedup, and as one fewer place where iOS behaves subtly differently from the simulator.
+
+## Two long-standing JVM fixes
+
+### [PR #4980](https://github.com/codenameone/CodenameOne/pull/4980) — Iterative GC mark to fix iOS stack overflow on deep graphs
+
+Issue [#3136](https://github.com/codenameone/CodenameOne/issues/3136) has been around for a long time. The ParparVM garbage collector's mark phase was recursive: for every reachable reference it followed, it pushed a stack frame, so a long linked-list chain or any deep object graph could blow the GC's own stack and crash the app. The reproducer was simple — build a `LinkedList` with 50000 nodes, force a GC — but the symptom on real apps was opaque: an unexplained iOS-only crash on the largest customer datasets, often weeks after the data structure was introduced.
+
+The fix replaces the recursive mark with an iterative one over an explicit work stack. The stack lives on the heap and grows as needed, so the only ceiling now is real memory. Long linked-lists, deep trees, deeply nested JSON parsed into POJOs — all of these used to be a latent crash on iOS and now they are not.
+
+### [PR #4985](https://github.com/codenameone/CodenameOne/pull/4985) — Don't rely on C arg eval order in `PUTFIELD` / `MULTIANEWARRAY`
+
+Issue [#3108](https://github.com/codenameone/CodenameOne/issues/3108) is the other one. Several `PUTFIELD` and `MULTIANEWARRAY` translation paths emitted C code that depended on argument evaluation order. C does not specify an evaluation order for function arguments. Different compilers, different optimisation levels, sometimes the same compiler at different `-O` levels produced different orderings, and the visible result was occasional, "miscompiled", "field was assigned the wrong value", "array dimension came out negative" bugs that nobody could reproduce reliably.
+
+The fix is unglamorous: hoist the operand evaluations into named local variables before the storing call, so the evaluation order is fixed by the C abstract machine instead of being left to the compiler. The kind of thing where the code change is small, the testing is hard, and the symptom is "the platform feels more solid" rather than any specific feature.
+
+I am calling these out separately from the rest because both are issues you have probably bumped into without realising it, and both are the kind of plumbing that does not show up in a feature list but quietly raises the floor under every app on iOS.
+
+## Hardware keyboard and mouse on iOS and Android — [PR #4982](https://github.com/codenameone/CodenameOne/pull/4982)
+
+Issue [#3498](https://github.com/codenameone/CodenameOne/issues/3498) has been on the wishlist since iPadOS started shipping with proper trackpad support and since Android pivoted to position itself as the OS Google wants on Chromebooks. The framework already exposed `pointerHover*` and the full keyboard event surface, but the *ports* did not deliver hover events at all and dropped a depressing number of hardware-keyboard keystrokes — F-keys, Esc, Tab, Home / End, PgUp / PgDn, Insert all arrived as `keyPressed(0)` on Android, and Enter was silently dropped unless you set `sendEnterKey=true`.
+
+This PR forwards `ACTION_HOVER_ENTER/MOVE/EXIT` on Android into the framework's hover surface, replaces the built-in keyboard map lookup with the attached device's actual key map, includes CTRL / FN / CAPS in the meta state, and lights up the equivalent paths on iOS. Result: BT mouse, BT keyboard, stylus hover, Chromebook trackpad, iPad Magic Keyboard — all of these now do what an end user expects. Buttons highlight on hover. Tab moves focus. F-keys produce F-key codes. Cmd-C copies. Esc dismisses dialogs.
+
+This is structural for two reasons. Android wants to replace ChromeOS for the laptop form factor, which means our Android apps are going to land on laptop-shaped devices with attached keyboards and trackpads more often than they ever have, and they need to behave like real desktop apps when they do. And iPad apps with a Magic Keyboard are increasingly indistinguishable from desktop apps in user expectation. Codename One's whole pitch is "write once, run on every screen" — the screen got a keyboard, and now we handle it.
+
+## Expanded CSS gradients and blurs — [PR #4957](https://github.com/codenameone/CodenameOne/pull/4957)
+
+The CSS compiler used to reject anything past two-stop linear gradients at the four cardinal angles and two-stop radial gradients at the center, falling back to a CEF-rasterised bitmap for everything else. `filter` and `backdrop-filter` were ignored entirely. The bitmap fallback worked but it cost you the GPU path and it could not scale with the component.
+
+This PR moves the full CSS gradient range and `filter: blur(...)` into native primitives end-to-end. You get multi-stop linear and radial gradients, conic gradients, repeating linear and repeating radial, the full shape and extent grammar, and Gaussian blur on both `filter` and `backdrop-filter`. Drawn on the GPU. Composable with everything else.
+
+```css
+.HeroCard {
+ background: conic-gradient(from 30deg, #ff7a00, #ff2d95, #6750a4, #ff7a00);
+ border-radius: 24px;
+ filter: blur(0.5px);
+}
+
+.GlassDialog {
+ background: rgba(255, 255, 255, 0.18);
+ backdrop-filter: blur(18px);
+ border-radius: 28px;
+}
+```
+
+The above is the kind of thing you would write today on a modern web stack. Codename One now compiles it down to the Metal / GL / Android `Canvas` / Swing path on the platform you are targeting, without an offscreen bitmap in the middle. Combined with the iOS Modern and Material 3 native themes we shipped three weeks ago and the accent palette overrides we shipped last week, you can put together a genuinely modern UI in pure CSS now.
+
+## On Metal: the community got there first
+
+I said previously that I wanted to flip `ios.metal=true` to the default *this* week. That flip did not happen — and I want to be clear about why, because the reason is the best version of what we are trying to be.
+
+The community got there first. The combination of bug reports, screenshots from real apps, and pull requests against issues people found themselves did the work of a paid QA pass. The remaining regression list is much shorter than I expected it to be a week ago. Most of the items left are subtle (specific blend modes against specific backdrops, a clip-under-rotation edge case the diagnostic test from PR #4924 has already localised, one corner case in font fallback when the device locale changes mid-session). None are showstoppers.
+
+So instead of forcing the flip on a deadline, we are now going to flip it when the regression list reads zero. That will not be very long — within one to three weeks at the pace we are closing things — and the apps that flip first will land on a Metal default that has been tested against more real screens than any rendering migration we have done before.
+
+If you are one of the developers who flipped the hint, took screenshots, and filed issues over the past two weeks: **thank you**. Keep doing it. The Metal pipeline is going to ship as the default in materially better shape than it would have without you. If you have not flipped it yet, [the build hint is still](https://github.com/codenameone/CodenameOne/blob/master/docs/developer-guide/Working-With-iOS.asciidoc) `ios.metal=true`. We would still love your screens through it.
+
+## Wrapping up
+
+This was a week about lifting the floor. NFC, biometrics, and cryptography are no longer optional add-ons. The simulator-hook framework opens up a class of cn1lib UX — Bluetooth being the first and largest beneficiary — that is genuinely hard to assemble on either native platform out of the box. Two of the JVM's longest-standing iOS-only bugs are finally retired. UTF-8 behaves like the standard JDK and is faster where it matters. Hardware keyboards and trackpads behave like real desktop apps would. CSS covers what a modern web stack covers.
+
+And the Build Cloud preview is sitting on the server right now, waiting for you to break it. Please do.
+
+A specific thank-you to the long list of community testers on the Metal pipeline (you know who you are; we are tracking the issues to a thank-you note in the next post), to Dave who submitted [#3136](https://github.com/codenameone/CodenameOne/issues/3136) with the 50,000-node `LinkedList` repro that finally made the GC mark a one-day fix instead of a one-month investigation.
+
+Issue tracker is [here](https://github.com/codenameone/CodenameOne/issues), the [Playground](/playground/), [Initializr](/initializr/), and [Skin Designer](/skindesigner/) are all still the easiest places to see what the JavaScript port is capable of carrying. The Build Cloud preview is at `/console/` on cloud.codenameone.com once you are signed in.
+
+---
+
+## Discussion
+
+_Join the conversation via GitHub Discussions._
+
+{{< giscus >}}
diff --git a/docs/website/static/blog/nfc-crypto-biometrics-and-build-cloud.jpg b/docs/website/static/blog/nfc-crypto-biometrics-and-build-cloud.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..a5cb4c31eb1b4b9394992f64c235eaebd2119a49
GIT binary patch
literal 50111
zcmeFZc|4T=_cwkaDJd-@S{Nno3`wL&7?C|qV=XO;%F?2R7TZOeOoi+vM)ox+N()m-
zB-y2?B(hW1G5dY48NJ_qKEL1he%$x{_j^3X%yrFcJ+E`l>zwB~uZ#DQ*CEL@KIeWI
zL9DD0WduQHAv1**A|mij2>uYErHCm1JA&8?E&KcXJ|U&)GQtQVyy&0u!S2Y6>GIGf
z|7A9PE%+1*M-VZ%Gh>~GhWbq*!FM5H5hUsNef4$gl7#+gF-iD$i!+cUk>B5ik<^*f
zW%!-^`|n>0{7Zpj~@f=nG{NZ0U3 zPtsB252yCOhXag;$qGhBz3f4?!?iaB6HQ%T#$THA9DbA23@cbl;H}?F`LGMmpQzHb z^p$eo0ISzX@(T#$>I5oiJsJNHTS;QOQ#H9;&^YidHs1ee9JIq9jc>#=dVx4K!I(T@ z)ch^Z)71P!PGICZ*^nfX93OgH^j8?a>43*3S&u->ha!P7=zumTy= zQsU&qL;fg3K>u8DOzD7l2ebPA;Rvk#e^`R{AG$#=Tk^0UDwyu3z4%KjN`hvBKHw9H zuMg~wNN#%K0v{ks3_&0YK_^CO$Xx9twKcran;J5rTc zT;t;)qq22;MUE)0&}P21S6U{Q-Vlgro$|5aWMNhvSknYTQ&gaZk)>6Vcnkhif;%^3 zL^BqDMzARf>;ufMfV~DB4cI6bQj}7KOdBZS5<8HYe5*1F> _P6B6-f8Iq`+0w3F09c1w16#`uSfa?H!Wr3*M4UHlC@dvT1OS zmY#}TlR|@6TY|N>s%);6ifF%~#J4l~Dj-`G2kQFHE=L>9Xm6hVT*^Z#@8 {i+6p_H9@6|KyL26IM--fUv{2H6(AH`zT`W3Ogw$hM2YtIjSv zFFVp&IBETizTG4GiS>`BiLj|X8;Ro*R4&()tJyxa$KGlBV#9YQ*ZA}@CVA4GhZLiv zk$cqa*R=y{CIyA&2x_3OzCYw4Nqa#2M~Nf(3s{;w CEx{#Wr)9@2|VC5(OKbwDkVF4<@LsfXLaQDPPvK_5S1An5N=p|3iy zJ`PUzF@N+gC`j-Np%tSRf3`2Odb)iz_S$7c=1dX~K^0&OBa$mUhw%-OmGLm9l>U0j z+=riu9Vd73kU9;N#lTO2cA7(Z#|?@EEmO%u-aI$r7ft1NBp4B0@( aGJcmU7%;CofyIAQ z9X8?1FEeglOvi}25+iC{b$t@)VUEj_a^m}Vu7Bis_D-|;Bc}#^rP*s`btUF%1Q7dD zojNUnwxJb&(DwBESgdqrm&V&ATaM=>cH;c4WnVh~_&AA9?K$(C`!s3%;Ytfwq^$H0 z7Eun!S;&1*dlE)eeh5V1E!aU_Xs7vqFCuYpjE4Zd{9$tV1}cAA#pr*`Dg}rb_74%y zp#mP9ULU)w{)ZAf{;OG#m%j(O0e%!LqF`nG?N?01_=d69ZdUt;`+(Cv{a)CXV8LJ_ z1?5ZmD_Oynmi^C_9Q=DFVdB`DSWceDm>sqMJ)%(H*3;A63M2YQX#aaej?*JjQDchM zPRj$v`)J)-KI{J;QP{)x9FTQBuM89aU=>W$l)L;x=6$k)vFHlKF9#EEn8BZ91YZ1O z2G98gr;GppO&FwgGyWfX{c7h+YwR>he^21gA~1oEe{k=A(A1w_A(p*XMZfj8eA+b> z$xQ6kXtTL&k=A6coZ~I@#y~qibn7BlV2sj-zfd;Chr~Hw2J9~0oo8 M#Q6h_zDQQy6ZD-w%iNFvD*c36W&C=X_JV_)E_P5zkGf?FVcL7?t zdI!u9 M zJBbY329!A(56rS*)K@qD*Am)##}1!c-_LAO-W@Hs?dUSva+?)9gAQmcpRazouh#Qb zs>6wI$B(Bxxtr*;;le}z&cN9d_r@+(?rKj w5G@w3MsFL_OguX*EH1^rC-x8m<-%6>DWDPNH8=tyv`$lU;#gZ38HdT*) zpkBde&|-s%hUE6u^!PDN&q&sL#%-g5HFK60jHOg6n|`U0JZjs$c{#h_ZP?vRXP2?X zYYgw5kO{NU9qDbSe*#N2wSKO8LtgqT`5R@+T}}* )ueFg-UB{=G10){AS);TJYxVB|@fdES*pOOwMIBng@i z(;)qP-0e2!@5X8y68Md|pMA^eX1^CY0NwXYcTeZvTGquM1mcPfiTr~)91tbw#Pk-Q zyrNeauB?pFly}509KzRw)UU8|g7MX@dGnt?!J;+@RztYV?;)qQ0UPw`@eIK|Eq-^1 z7QZ3*xr|}+{4KGx{Z`gW=|#lY1 |?-9&1UZ<}IFg za0^V08x=1Jzl0ZNpNZM;ui^fTKlhtPFq+?OP7ijkU{U7&UKGJ#f#_)q%`rkQoteDG zm3V?{H&Jnk*k#**4%FZ|h{M|>t8QW3$ZUB<994EFPV`7}168g`)eV+;YkOX!jm~Za z`5XlMDmGst|J2ko9wMK&nOj=R4e|Mve0ntR5XoiN@RHgp!Z(*7GlU#uX>ah`h~`6j z8!3(!27v3eB6+9j#`-NB1GalC(aUBCZIXNwz8LWOI8nfOFgViyZ1ZnQh;V|j;yMf! zLzL1|zXvV?d{uzgV%U}l@587#+1x@Ux0?@j6?&zn`;QfRC5hrURd~dL!kZ~(Apl$X z_$uZaVCFf7=?M`6qR0l~%G%jm$Q1^Q0K-h R_S4X~-&Ib!yjSLD6M6I4cwsGzoKEqwlLv9*5z)b>eT*PTzUys#e%LF5v zt5&j4F3ljGrC)y$QM~!l =`_QXZ5*j zedQtNxX!noVFyZVpBh>nc>tgx+DPlO^_%Y|ZhO+lq&WTMw1q)AccFsoi*^<{i0dgI zb8gBnAV#iE0$6BU;>9s3$#+BM6-7%W3cB9*64g!lzc_TZhQ+o9s^%WeB51P`Q=05N zBGw#>#DC@{-!vRvRxH;Px6-SmIAn&KiP&~gT@Pvf6fQ%`EL8dPHK9b(2Flo*nZ9;^ zy*(M`JX<#Hw1PMBvYbn_*++KfDX}!G2bJhMfCft4&%lOV%l|fd?bh6wB@*{+B^GOU z`7{M=ExkB~>#;OQechG#;+}G8y?L+Z+vm6Z#k!S7502yGGSAcpSsE58@-NZ^w@xU% zNHJ)Ne;ZjB;2icB38o$FmLhyZ#M+5}p?gbDtXo+%`MS8~TysC{g24Z;EL-Rdg*^W# zv>ZVEx($Evn@!=jclSk#a7@r)%RfkD9AqN8RP>hGACz1yDuWxJZhU&2_pw1eR2)r( zL1!deF8M4)l6ff~)?@dJ|HGQfzoH*&WP(ybPS@t?8lTk?Q45<4;uhHm7kP#2ej TNgegkoei62&*$keaBv`|`BNM87a zd>#VSCFmBTrNp0+=0D0fBRs_K_8O7t``E9 a8ZReLYNuGYk_E-h2y{`!x+keRS7u;Wt$lGX?Ei4 z2-(8d#l3|WgHjU~7*GI^hk5X?AUFgn4)AFRFvxl+v6_;TA@+mWXQIgzPYdLv-sO!@ z6bih@?6Pv`y#cWKmZ$6$JS6-uAWKe1rg4Nez!5HPP!kwiQXAJM_8jRXF>v00TU1dC z&OaRbc<_a4k?%LJ&Lnz%&U5h0SBB>EkbO32@61xtSlZTe;T=xP3fetMuZmtxtbaWi z{C??*kVogYeX&VgcS2J4IumcvJa$ZkJrJ=hGEqIzL}l)lwX-L13~72OvDLF@--R=} zeTLnAk)+STH)!S8)$l#zS?oc#AkmJMyQeD`pP^7fa3>Wz TPq-!hhFZW*{9fJ@tPGWiH2oQIr8 zEl3*ppK5)(aK)LEi6*5L)h&QZj&h^U3x2IEm%;gxR`^PNZo1jI&TM|zv$lQ}9oerQ zgKti$Cr0&h2dTsOZo*Ze6XL^5SShq3%d?u-&)Z!|WMmD~I=_?h$EEg+Z_uk{` wxJ(BFalAJIc zqfnBf9ANV}Z~a01ST7IBTebo}+7F*(r4)0=WuSejyNK(}AK@7jkz*UEEAk6RmB 9$lZA?dU4v`GA>%U(D^_-Ik{*6Mg !!)15Xk+0InVDa-k+zZMLM^;TdrJOV>P zb)W1m>yICNFXPCL;aIQ>f`$A*IX~99A_P1)1F7Qyy;;YIO=_JxK6C1AfLNK1Mr%N2 zsYB#6==OdkT>m;yAk(4g@C)FNsq^hAKH3P8MeG+MuMQy1^vKYJBe_3j>IFNVx>s*_ z?`w&B6F mJ+BrMl3^1c+dJreZ!HiN?KI%?7T|7c%Q XmKo;Btt7S2cZh+MpR zXL7?nr-^*-2-hp ~cHD7I)c$#qVcU>f zc9%p83wP;e8{59f>YRDFZN(a-a!Ho4M$HB%8%Cb-=C8?v#V$q9PPX-t8S5CKdGZD& z8td651g`O8Hd~D|>QUW%)7B!7(XWA3AXNaa?@&ok6BlZo~5o3o<`qg!xX=9V^ zH&adt>OAaCxubV0MNrgS@L{X$>w6^U5y4#|QmS9U#LxfC#jrQ&cD8mOo0koe1ZB3J zZB0#kr!G5l?oRIO52ozm&j1O*GK!N1_quZZj-x-{0ea&y@f5ATp?{Bs(`A6FOR?r8 zcXE9;?BkYyAojfJ;j(E{)~L%7{8;B{2%b5y3I2zvV=GIpajmaet_l=$J~^;04?lR! z-pxW87En@YzGPG~c`_ZdE? B;8qMI|e6iH@(e ztXdw-lkDszI=WaYtn=&i{8EAV>nWF*k4vR4^DDm6tmjW^VT(ygkwz_h!x#h}BEs}n zUMQZByUx_Z$j~P8XMPi^b8M47lVduTdSwmOpPR=X7-*LOP5LAqf*!d}%vt&2X{?_U z9!yplI=Z&6eS)uo!=&o^%jC|FoaJu0?aA@i;)ZzqV$vnSD4g4f4)lRh=n(wD_7NC` z#>>f$w?GSHO3=)ipN#@}31AdL;uhiaxRh!>^K#}rAMx8Q9K(hsdN`ZF_v*7|TA7>T zAioHd^xs(wU;{=Wh2Uw 0CLZ%NbU!4g#X-Ud z0BeQ(j``YGxB<(bDU2!v#ca(_AQ8E2jCYK(RUa`})Prk1e%ct(iHV1Q6tEVXY))I= zM!a#K8|p+d)4O9ek$yVqlGEtiCfYzBaonQivN+udi!(iq<@m4WhB(%wzX|_5 RP#O z`+3o`&eWd0Xsr}z0q I0D-rHo}OojY1WlK5g84_J` z4A=DOx#x_0{}NREl>aB +A zlRMaXIl^q~t?-4Xi$h q!(Qy$6B-Vy+Zwiri09uJ5!s>Td7w!5RR!S zT(;Ksd*L!;`7q+WnlkR8zSAS_JWD73vhvL=IkzjMye0aD)()zl@@|r>8;3R=(Yj9~ zX%J@Wy&QC?3;mcMdoS;6P5+Ti^BkARY51Q}-^0~@@4w4QZGbwuoCem;Ep%ML=}?(e z>gT@4cRLS<+g~&33I4oH%gL0xpR6hE7&WxK-}%wi@!>9%G&WvU@42w`TRGvCWf0X+ z2fcjea)7m1#&~|CTdP-;FMi3cr`~EVR|>xzIwmzP$$Bf3b&d5+uH9l_n0lPL=HABd z8fJRMeY 2Zmuk&@ fdcb* z>(z#hAKzG+mw ^)PsE0{Jq{B{B=R-{1$l26bsBi2G#5inP-PA z!A(EnG%;t#-V>rb3-QHZ84GQPB(v9;F};ExXSZ-9T( D?JL)?jF@U}7*S<$9N&pPvt(| |@z`^J8i^Jnp6jcl&%`LnXRRS%63`_X&Eo;0;+2xICIYk%0grHgthgIz}c zu?MXsjWO(QJFXFR!tS8ds@N*XZcU`ZiaO>t)QLK+{f54?px0h(yAqpuWfReZ#K9GH zL=RJEp eT=>%7do*&M(B?41+BcSaJmhwQS={7QI;`Wvz3 zL+tf7vQ;tVVanfX<;{h|&u?m@lEzx8KlaUwlw=Jj**zawNA s+2Cf}>rCZ!8>R317>u%WW;xgBRx1yKE&N?ml%(0Sq`v`KTC>tLU zJF9J%z&@JT5MWE~rH!>ZRb9J$BTr&M9^juTqCCVbjJo|upEx6B%Y5|s&hMtHhZcO3 zOE}W!!)8&?Ym!ENr^13lj8zr=&JSHamr;&;lLf-}H3*Ql0q%w&@6L9q`J5E1*hg<; zCk% s_#aixYfbm7H2Io&B*$L?qR0OoO=VD1{v zzZP4$PKB-nlJ(rESmg)jG}j2U>cp5D_tKGmaRv%dV>oy!96#_I?%rk&OLJFoB=MS4 z&WG)$Hf$a^w4i)NtBy!zHqPPeo9&zNy5AGK;|G>ryVt%R!o&xKcHLUlHEM+;6CM|v zh;LruzG;Tkx6rs`%FUSLKiB5>u#7uzEf3W27dx(8ge#1&+`2ALPX+V*o)QxdHRtSl zU&=sgk$|E!E%(0;*=t=hquRp0f0O$ihM!G4s-#=O@^wkq%R1h*UdPNt<6>A%u3<`* z(>P6yL$xUBs@ylYPzB01Se#fIoEq&Z!bP*R!R_kzyD)kAsE1qx`5F%~SFSN-^AIwX z8IVzRxyG&y?Nj{gi&29`@hq$;2r0)@{&dutcBc8ZMKzM``;Fbc&5Lc0Xg@cW=)?SQ z%Kl@6WSj|6Wl`^uLE^lT4i1r9l8mWGKd<(arNIn`kEL>*23Q296+;;kLVA6)k7wLr zL&8@0@pypyAb%p+@wt{eL}oxB E9KZvHW>ZH=)K=#af70=k7@j}$6zpt)OT#< z37nAW?;>m4+8KRp+N*nHix<{yz5-2UKHX4G6M4VV&~!DW-@iJzC5i9G`em>)KTX$g zIBAUhUEQRumeI#Wm7iD|;2wSDt2#2jMQYW(dgDOBFhS!TnjYq!G;N#^uW@8#dphOB zy@zp1X^_RQs)&c|dhKM2;bIDw9u4p zu3qd&&fe_2ShjC|C!Ex9Jf^BX4WM}OHz-I0b4vx(7S5h5E~&+^*djG1lf+qA)ZzV~ zinaf!``ntJZy@;QL7V8&;sze+y7-~=@klV6ayy@M{yiTfk)O!BU$U)0R%rW@faE;A zLaqy&_S!ehF;}dbMt0~b5jI&yyc$|M(T>Z@>Zt+Yxi}cvIUH7PH}K58)UY03l6XRU z{CoKJPY1m|?igBeb$KUSxv_sy^|P&Fv%Zv=O69tU%(lpIS%1)lySIWvw^*=wcPO I`es<=4wZTqkhv&W4+_ z9^g7@76}<+&NmG^yST|YhR@=cX|ZfKduiSn%39PFQ@hW@_a+yxT&G@TVf94yA^Wvv zW9 w3I#G?T z-x`50$PKWc`Ew$%^o#O`E64V(B2BiTjL9%I7w7)~HpO>^XwR?AOL;-p4iSGXA}u1a znfU;jMctw*4{jcUpxxLYwdYqV%ZkQkt!A(ZTZa-=V>7JMsXc;{?v!^0(ye!8RU@Ir zw`&z{ZcJ4UZn9k~qgDOvbel}N{c)1ZA<<$uoV8 v8wdVFCM}U^x`4RNl?mL zq()%F$?>F ;I`I;5qyuccDzrB( zxBuuKt qQ3j?DIQ9x|%j5BolK6BgxOC0F!FIx9vY=?80I0tdN> zxfmp#>I4w^R_Xwr)5#uqe7B-0VdbIoQma(2h!8^k8AGipA +(DM=OtuEC_XrVqmGSI>7O#w=f&A5o$#M$yzHpyh&e-i z$C_a5 G7BrRn;zZ zGsoC^Mfk=|6&qA*nRE<#B@;(nzorAa7#56Onz?OF+;iD|mvl=*ZiqBDplvj}Zl*@2 zv4pQkL!r8Ns|?Me;V+wl#jxE`A2P_@rm*cDW7tyroW|a$HC*2dwj30BsG+uz$Y2qp zO@`)N-|+UpuyW12e8vyyKFbGP=sP8vh5gdH_$?I4p?7m1ba9e(C45^NwexQmva*gA zEjyCse0`OT$@}Xk?p`5%Q|U84cysH`@TxNT&`W2^{lsvunpdc}yY!t3@y&y?bI~Ii z#j5AE!gN<>^*apY^qu6ScpX`OGfU`7^|$Na7F?{=buMv^r3}7w?zxgRB=6!#$&%Y8 zNB*WJ?%{K6te=^Sx~^Q0I~g&@@AdIj5 y{@W-;m8M@1*ILzL|UWt)8RVU{+FU@9Z#M z?jJVi v1ZqJsjN=RJpG5gy?xpkV3rQ2R zv*eb#a{OqJ$TzZdvi%xuq%$3D0hQC6p1&x!Z_r&2+Ru}Coeb%Af>_RKi |3FG|ybCtblc2>CqU{MbCqVfX613N2)Ni}w~b8!Sk8`56*ZNQ0JiV{x3>BlzR zhRAJjf)C(EJg<4A1FRTt?>n#RAzH%^+d$}se^v_fZ^7Tavjf>qu!U})Fv5P2QsEFM zB-UVUXYWEY*;c!=W1RZYZzkdIyvWAtU zdtM>*mVN>xRXRe(Exu=O$vpkk4`Yla12sCn0k$E!NAA435kVrp`;|#h+O{VvrnFv~ z&8i^3U2` 681}64^0XBp)!xx0kRn&_s5PgP-)p?~iD8UJ2W8wP% z01G93b}&kvdc3b*o~3xb>Hz-CCL5o8*7FPcw4XYor{zCMI@o-mpsBRDRrZO)>T=$Fm$iMc@1oKbr#`m1k%_kKZ}0 zE%Z` ||An=7j&gvaJubo?ePyl$^<`Y5zio?Nu%9 zTyyQ~{Q2f5e!AT^S{$&|jUKMocH%8l!a*Uc|LK*7XFR=^=)Rrx0x)B4e`p!|_Fc-P z2K!315|^>}&d%$8shsx<+QP1K3EYXt90m^=>_a=8r!rWR?ercV^6;Jl&bfp*_*{+6 zGS&LfPv7i0wX>AK *!J0bLVqH7pN8c*Z%
cn?@yZ?JDP7PtSOl9z}eYvFp =-ZH>9Ex+TJ68?t;Nj1SZJruZPck5{h5|r_EhC97dZM0 zSQBsScu3c501NhwpuH Y@>$KH}%A>Ilq4?F4#M-TFa)oR1K|&i6i!b zt2<84UzmRsOOliGapL%ygLii0T$(EhTrpe}+4e9PkC54>)MxN2Tw>H`$EJY>DrSf& z@=qt)fiAGuFWT>wO?T?A_>e1ZfFna#fqyz4Fe``$U}-8izIlLsI)^7VEz}V|hTyP6 zv5GS(fMk8Zbi#F4T>ro(Fap5&;HwjNeK^BX&({f&@;ihV8D1a#ve{aBc$3~{+d>IQ zIY~0)ha6xXlrWt@V!g?uWE|pVLKxLu;xVZ2ZCm)N1@yK~5cUrXJh)>ibw@sz&POY* z0G8xLfZ4`8UvuZ=z8}9(uI>gRlM%*4j8$Fru3hQ5JC*5L<`@SjUChz(MNTUnT1r;~ zN_ZN}r`v_ySuyVdKgYytIrV?m5ntx%rvPl13MYzxpSh+Wf{mYPlQg4LN`!^aOs}AW zRyhIq&{ktDb{9Zfvm0lt zN6piHW$P1K pQR>!^k|9P{QO NYRqF zLWG@KYh~X*ePF(9riskA(BMR++p32BuEoWYt0H7;hTg7jXaCY(Zu58-SQ+kwCxt_6 zisWjvikr ?Z{Xtxy zoY9ksTB&(G+!1!4Z`xXC`^SkJKKB|(&0V|mmw9T|nO^I$#St+SqlGaPC7CEJmi3$I zil#k<%zj(oR5${H@3C4~@%&JX#zxM|rl0})tyztg!Ca=)_5-i^&H~9SPh5EHn0A*- zn&bK-R+js~ovNLM{=93KdcBer?Xsm;#yO$uBiuwA?yR^^935fW6uq@lrF^yY$pGO! zZ`DtwH#E7*KDD+#+#12)UpAay-Aw$Mmf4%KC4!-f6{zoeoQ<|ylF254Iy-k)1=tKz zzdKp5@L)KEtHw_6-%~Z76ARJe_NvnN^|Y?JhcNMmEqi70Ns!`=)c|b3M&6eOo7!tC zQ>lgGP{an4F3f5@_t{%u?DyyLjP N*B9PvEZ@L&J#25?>IUPzeztdtNZ33hj^9e3Z;!3pBA&){4q#91H2~!Aj;Xw{9 zBmLf5C92-bUo|vXHzH}+^C Md#ePgx@XcVd z-5Pjy0-k ;_6LgPVvR{ z++JVmOGwolZ35WoJCTEfV`%PkYfVSA*w>z31p(%Zt9 R -u(jSlK=KO!O@S`NU1Q^JnxDg4r{ZqmKp3 znXh7nHVvwTnf2T#OIjk=$@V~XSoP>g`$%@dHD_AMD*OTKW8kYC_1%wNo>NJxrq-5> zJF(BQ-Nt^FfX^cfr;yT?8t$flva2{?bE(mEgvJ?zXIW%#vr?>!ttsV~b@yYn16Ng` zZ{ikh EY1h}u0)@kLgCM&*fj~p?W?NOMFOkGqw`Pn(;#dzk?BAjKHCFJAkVtJIx z%Ox$==_z}uS$kq>lVKw%SPrEN+XL=zleExW;_{Y%?KXM{(neuM7eyK(MH+6**vY?< zBKXy#R4h$KF3L?b49oEi8%gE=n7K|*>BV@8!RqPkRYAiNScgh=v)O_)PJXs#*a(y* zoPgU0zhe2e_)gQCYDw&hsU~f?sQo_Vq!51Ur?M@@>biE1=gE)FJH*nq4IE!-cqx{< z;-kMdfW$V2c%A6crpfE5W8}eQc2YwA+2>ceDm?all~Z+MB@elGgyR+)0f`4_^yZKi zX(?heo1s z;4rVO QlbsU0~i9}&-0-KGCUwh z>UillxrzPGIeY!fnax3FfD=$=fO#PzKrJzik(wkN8s(KLa3c6mi~((dq-qvM3Bj{s zI$&4dYr3wG3{Or0l^{?cR;+dlIDC|p5vq*~B$umhjBO2?mmH6Q4gBZp?BJ&+fQ^8j zq_uB2YG+9*2IKvM7TBW}+}#Tck)mNIG2rrA8`$eXfsF6W zp9?;P9%dv_IcG7YLkSsl7ioA7q9s4qh+6_$xX#MYk9soTB0%8!zz*SaA&%e+_EggC zDTe-cj@W44It&n a$*T6muYK(e@{6b=NS^qW{EJAN>Ts20b+i)4UL{}D=Gk%m%%G%8 G>ZAzzvb80j zc%V4l$N3Ca7S;!avUc&-QbC=t>8{9Ri$D6{k7>G(#{cRg;Z vGkmkr2m>oFHFQ-P>bOAXTksNjHgGV3Jvb!dan5<`6cwuyzz)%{8)5a zEI9KRPWXj?nf`XG-O9=xE*CPg6R#vEr{*k-E1O$4DrPrKd~Iv{%_7|4f{ydOqt|l3 zt)YJDm1KQn(SrM|R_rU^diDO-3Xgff2=lt{G|VmC LSE1fNVsgS#f0*(yVIz6 zA!rvsdSUA?*q!otZov;!8trV`26rEzy;9$!hp_8*$l?4z;s`&tPp7`JrHi|7>TsW} zCyEF)WCoQ5!G_H@oB3WcwxME=IZ@f`-^^?dZQj?D%<(9f2SE(NMB)`cEfb(aB(1Mp zmH;x0Jv0T_l5foO4XhnL){R!M@z;;^J08=)(t;?0ht!B_MZQSMdXW(n8Wkue0=@Ac z9~3tSBr_)HpF~YX+zye;wuP*GE+c2Zou!?20P#9Je}%F)ug_#wx_olnUg;d6DT-^W zY6ZIxo-zWDt+63Dzj0Yn8r2WNACEodN>xPMk)SlcpN_xCLq__t(H0OWOjM ZK&+4C9aE+&Xip^b%9=Is11n_)G`RB-s{NM{EDO!Sq+nbA^l6F^uJ-IOn> zBeJs{1d=)}o5p IdzF6LKW!l=ULC=tw-Dq59=0ZS1 z9gRg{zL-UYp(}x4oCfk&K=5EFz9$8G@b6DhNQzj)*aN;S4Hmv@P-AuzZzUfG(Ssyn z@-*HQF`ZOwH~;B^#+yrxio~`|3H|IPypw4wH7fG;p(b%l2y)i%3QU@o58 hUMOAKUWt9%x)OTvmwtrZ^N zV|z`V^=73n9$aS=%TH>He79>;a6X+lMRm$>3<(&81h?c@3x9GTcxuWmnmil}I`J8a z*@1_A;!YLX6JkANjr+%gimY7QGQH_^lphZr)OvN^p}c(ppeZk?V~~$qUF2(8-gwok zmi`08$oSm-%-~nHkEKOqQt|5rqe76%Xw{^=R*H|045l!T1id zTq~pU+gDF}rkH)$NFl{8cOs~KeCFTn(iDLzE2_+JIc=62La%S({7_&}g6_#Xm8=ZQ z5-zYQPy8!vxL*rT|J5|m=_Dn|xC$nZKRS`EcQ>HAo@Mu#JrM?e`p?2Gt?+CavYhsa zmT!e;rV;x?0uPy8an-j*@`DnI+n6yV@+tOGf!uX?M#W6AbQSHXmc4ohuX2vTb9FkM z6LsA)7liCDMDw1a+pH(A?yIirX}FHJfW9u>TmR1e_IV!i_y7+nx5i5uwOKUMek~8{ z8u#78T5m+Put>vG@{rfJt*C572UW1fFYJ>z)oP8tIKJAc%bm4V?Jztmaln4PUHogu zW!?=m72uOR{I8pCaFjgq*Rx1w)?M2zmAjIYoaXn6{dA|#;SN<2YjmQHBrZMvh< jS_tbyoUbYfbFZ`s@wr!mJ$dyEmaJbtadH-Rr0~Qp>=nO{)p6 ztctR${9d2BWbfgRJfsAd#U3MVj3JKJ+TJHR+(ajDWmI3Ts%9$FKi(b6?5p6m-RGXP z<^;-#P6EAy4A2d@)ABzKiCZ*q-@7#YBoQr(X<1Sly$(OQxotF7?0hQcc0yflHN}E< zHqFDwXSV0DRLaJ0M2W<9jfG;5P9`=}x2?fUlMCVFX{mac>(Ve%&&MQ}zcj|(u@Q1l zIEPyl8ARHFa}Gy@Ohi>>RUG$fY+k9*Jly#p>N;cDQg>Uq_~vzsLIdwGgUk!BL|11k zH|huBCC{H+!9&vRJJ9issbkMKgiV0npqGQS@hR){-BFFAP2?``&<$&943$Gu3touy zpUbjp4|cd)>iI^LdnNAay&DoCYu0@Yz7gI0yw_xjnLH249yDI-rElWXOndp|u$jH( zHJ01X&>ae;?Z?_;iP1ZqE;@W-OzcD^gJ@GvUpn2;x#YHR^NbhV@jT9an`NEb?*$A+ ziE#fHXKx)4<
DGjS2EwQAuQVK{&_X3I_f-4{?uyjgy=qiFB zf}}`ych|<}&SHJu_kQm$?jJ1s>@#uZ%*>fHCr^OL3i{51YTB;(>o%|h>%1!L2}+zQ zsI5z~wpfPBc#K>yLGXTtQSvqF?ta}FMKt81Uifjrww9$Mp!n-Atr&B5ZtP2>AITrd0fjBwC$o; zoKyO!-h{$a+BK;j#E=;*hN}U~zplLV(s`#k>hR*hFji*68E697$4e-tqe=G1no1FE z@>A=Bu*fdAi>wRU`wrt467Snq@H>s!U=`&?P3-xnFJv{2t=T&)nevE)`slD5%df3F z!CvLf>2FX6^LTq8R^Fnf DILwvtq5#yI*XlSrG+Q`m5@= zas-|$)%u2#H0F+9;n *7*x9f0 zslTV#%ET}N#b7(>IC?@o(m1I7{8G3kFU07x$!_;IBQKT*+f5#OAw2ca;!mlcrqvUJ zV|Fjo(NBBYU6v9jC)az8d*-m3y@02lDUNgDl1Ab4GEePZ`9>=LXrphj5itae>6cSF zdG4 ufycOx|r#&77zB+n_@emVEne0Zf^_#h{Bdg@^7 zr(=};p>}umhcvp=-$hiZ+E0$k4yPJ-@gLsHMl(n2CK`7pR6fZc!c%~&WF;Ul#^4Ik zWmbPvuL=tmD$-61Uk6y>wE37OS?AsxV+X{*UGqmh;iP>z2?D;MR*^HN_m|L{C*A>$ z+7kw(XUuZ=T-b=|j9$> 26kzM(w!_73&jWrK5%(_H-s=n*U6 zR?&yOp5}Njg(E_pQ@k27pX*b!JN4_0=?dVi0R_(~Hl~DY9{hRSL=OQ<4g>`7d$lZS znSUQ=5LHmz4!Ad`eRQD&BKf6wyjglae{&;B-1pPi!V28;PaDNix3#rL^>9KzThjd3 zn^l5<_WvG=e*s!-e6CCDPs_QIe;U1eBn1BR_@~JK*OC5LAAcYJ1vu#A;lCdLfA<0Z zH#Q04?%&8w2P@hhh5_=I0=dBX(9k!3pB19HGN=>+9U_&ZiV~=?)*I;3NHmTgpbkDzNx@Gv_$~0J76`Y zgdVXw!p%`W#{WRHvJk*IB#^sF&YQsf7(BoLN!~n5y>1!<4Ntr3l|F_t$Fa?ZQ<;Z$ zVaO#DgeAFP-NDq;TZeiMR*tdXyiT8vI0z!H&KDz7;WTp1iJAFi4mRXdVXLG9I8nqU zj4aWmN!Z5j+xTtjKo0g-;+d_U5sb)q`4hgip*G)I`9f)>6A@e<)%H`O^8$|2PpT#~ zQ&x>oW<|TI=)E_92PA`)US3`~)ad}%j#3Vc9_B_i*VP&5vIj;HaamPdbcG!+p%*kd zN15@car^WaY|!l+bVwrgaXHmAiPG#{F(9pYvYCNz_Uoo-Etejl-80Gnv z)Cqt#uP!gC;=k1Fs003|0O-=}o{Vi~Vl2_Q*qj;JI(~F%Az}c#fF6kT^~W~Z`xcI2 z#xf;V_z*tumcUs^&zfGEE8QX|YTyTIs|_FB^&$lJ9-YLSL`w*V=X7aStf<%+d0=IY zHmikhwxhWgWwWiInG%jW)HUav8Ic3_q}VctRuF=QFjK6?avuPM nY+Ji?t-9o<4x4bFTMo03jw_hlxQB){RNj~0(FMo<_>fEVIVqU-V z#6>kInORr`y1~jTbF!nS!u9Z7=t6BpABw(J_UgIhIyzGLJ~z?6-f@r6Sb0%BMxuaK z?ryC1t&QucFS~QFX<=H=UN&}^6N9^2B|p`Z?wEuzH{dbXLttmRf56+QyPZFzBsV0c zKLim~$P75LNDarodQ5*GT-71JmJ&Iky%(Xk=i|-nm!g;W r6b}%1VqaS?Ms! zBxziP#P}Taz>a}^mLF&P^}E680LCZe!S{js8;kBPj+rg#FWD8vsV^vjPgTQq8Z_IT zgZR4!jZz44$I2HyJGuMmp*|sE@w5Y}_?5dC-1 c&IhCioxCS^ *e3o0V6o?MZ``Y zc+B%AV@OUdgziU~Aby@}$n;w?m$q0j>HF{ANAKWkz@^7_>~IeV#%|r%XnMQb!Xi+6 zF4d_n_ WJdz z;nK$N1kDA<)(Vh50;PmZcJh@?#fll^TK3VYnEt1l&igJ0a0F|C`;af87CWdl7viK? z2AcbIgr) P(<_YlP7j%2C&<4rfaJviItQ4F?}i }wKl}w^ fzIbE6oW0XQapvoL?_{a+4H67vhq z3IB~|KoysC9Hf7)3Qp-iQ~n2ppKD0r_tfP79X{_MyJ~(j%Ddg|sOKEMWpG_80O$ zE&ppi&P_)=__Gq2e^<(@`qLWnzh>h `1jNB&dtD{xS9_E{%^$zyE3gM9H8=sA65&q4~>?c@{Z?X~J#)L_)Zx>Z;1IC+b z$l-8`Anti_o^8dvisC{{_G<#Gqw|~9d2G_N;fynh$8V!s^j>Ixy5HfXF=`T uINls9 hx|Zp~xFBfHFJ14LZzEOz(HqnfjvTk>u< z@$_5}mA9mCzV(5fxuHnv ~WNwrv`nJ<;y|hOSfKN+y<^}o_6q$6=(IT&tw>@na9~Or^R?-!w&{Bx; z=1=>?Jq{1hl`O+8s)pkx4m68H_&7aRG?yLVsvp0Nil&&mi{xS#MlGJCL%&5aeIC}T z6iG=TX^+LsZDnrFK|fmyi|io`z=yT}Kag^D+}5EcE(@{d7nt5ZHX`&!eNPo~=Xw^? zNo?-t-EsenKvLx*q`B(Uupc$VV0KO~L}WvSZffzk`+Jth>>;kSOsf{qy)Q#J?iZa} z?HgwjyoN!jC6>@dSK+a|F<8NOa1(1O&^ps36)FUmdt`Qn)wf4Q6;TH)ym~hlt)+r4 z3(Xig8!PZ}P5ul)ZWa^3;CHbabG^=*R~<#VfW#NSh0+Y&2!76+dI?f>{S$P={2fA` z#;F~fUu}V34neSR0Y~AxaG%>fMcDdV MLz5*4+t9)NtYKlxahGzpR z7_jqLCsY5vUBM+u#A&PiIO;QD7qcCu9ewjfcouCGYa`Tn;mYFYfs?Eu9hCxobl;W5 zVFW5AU*l%g@t_QWjxu_QXi~|u{GT5;-#C+QR|9lJ<)m}XJ9!=u&j ?PGU*;e6p#QkAU`)H~7M3pY47QXFl=(FmfdVu~XJ+KQX0S-Zvg>>Kr%88A zU(6l$Iw_^fhiTkyJPV;OG!6I>s>U_q*ClUzYV=N5Wwgcd>;!Hf8ahe`^QbRmq;iZq zyG(i33B9tXFpAX=L?e#ZgfvRY;`$DW?jDe=<2V-ixKZ&*K6yhI=#|C7b~F`cRC8DP zEVoD%bP#Q1f#rO+6qN4-^iIAtq(HTQmf;rNmLT2leATq6De0SbiypsvT4a(``4*K@ zQ++_k-s5sS{dn)8w|r^c9h&z>GqG-B3@@b~>$)BryV%k~op0_>+Nw~@)J$V-?Zi-4 z5+!F4wO9PSW0ce!v$2W#ifqW&zFXdw8P{)<>r(Hj$%fwhat6np);o^5p6O~YdRlM_ z*Czq)f=u^~W)6`zPK^tU|4_(Pw7)orDH^o9?%*sS z0b7|K`~h@A1DE>lIMmwV*3I*O8~u;>plx+R{r}VZj6*W%ZbU5yF@lBSU=}Fvz=h28 z@7JQ;sCiDmZr|e&wM$R%o a8X!QB34ty5{RWHL_Ybh~b0}rWt$7Y`t*|0+bbxaBAlK86%C-}RK;0pE z2nU5AQOks3{rv5y{t rgXe~-fb2#rU$=fFszv710ej0h6! zfQ_VgNC)~e?Rx(KOuC&E2;2#;MLHaQ4w3?M<98M4ztENCxiZf|m}OF2@?Ru${I0I> z8^^Pwf8P4>aZwP4HMMY)S!%<5)f%Obi2M;owyXYv=bg*wa62}p-hrm)Oc;9&&jjVZ z*A99vqjCYDX3b&A=zY><|5LBYbJ_gv76!v1`}Q)3IjmpI!P_$eQ_HQT{uJ<+(a?t# zCC)3nv-KaYTTD+A!^k`Br`H%2@DNV)!-Ijg$CX=&0@D=PnI}9tuyvpIIiY=TZy&E> z9H+R)2P0BV0UEjiRYrk2rJjHQ172?{i;*gum-!uA%`|T;?d_p9j7* 6)PxYn{=JN2c1AP`v`7k$B+WZ5iNz|u^>VdyatyKD>% zd(=Ji7FPFchmIQwcBo#hMk=nbPYm9#9uof;Sn0TR*!_Y-i6nbUfA$o^>gRks2w}&8 zX9nSEimt~VvyF~69Z>4n%o{TgbH8Df7v1<+Jb6r7PDax~o|-80LUL&&&4&+o7SgRW zRgtfdSUM^GC)iqDuT!LlpLi=f@b4r%pqt&}h!482zCtbTW$Nrpe@B&BEQ_zOZs+2A zI7IbCS6*>3My@vZ`3pn!-CwC($&9~TWg+_{aZapVtG4dt%uSWM_b$!3+ a`pDjSo#W3Uk&+nEYm=Tvb2K;CT4rp0B615Y5WOIhgQ zY%L4SGa$J5zVTgCyeBWD#z~X}NP~ct&Sv48#NF$f-+85h%@2GRnDflYH8c$#*F1We zzCv|K0h~);U|&Xedu&j7+p%hzlp0DR_EtVZ51AgL9|ChAouMVs+I5 -QS{OQ zodJgd`fb&WH&AgJ*Yv*}I7(o2p0m7e(bc(zkNbk-%6uITZ3{lGCTHxKX?^VJ$~`{* z&2ewt;(_x#AMLJFj0B #RzNJ7W2lI5%*MmR#!% zc@oc;fq_Zrq8N#U-~Ay}Ym!HGb+lesqyqLdYDr1GdipbPY7Ix+I6!2wm%xX6MWmTr zM|ctg0y&1xKhkg%abcC54*T9A(%?88@|1^*q%HmmzrV+^=_$ZB7-sW^^55Njv&F=C zu`+@rqhulX^=HACzRo|e8{O$hz0z &*GLv^FdSO*KjJ+Lx7KkNz;IZo0uS2tIwiEiIOdP};C zFh7Ea#M*?X5VbH?l0u>uw6|1bLa)!n&e9on3IG8uJF>IaBUi(|f)(?UV*C@dO^e$+ zuC)6r+3n)W59Yd}&1^fFh64lXv}a9(TAHD*wY^T{L$}99uA#mJ@8oR{U12i}gmEq0 zd%Zqo ?E^J75bv^ }T=PebQJ2xJ^04v`>I&E;W*X&5yY%p;N> zWv{uM<^-Iw*0o)50ueXnAKGJ=#8=!6tGDT~d84o8KEFWNC|#wks)jFYd8#Rlw{i#O zm46#FXlOKh7dxSMZjlw2gN`Vo+dN-#W7(9fQ-L{+)a}K=#rS1ycPW3(9-?frIT0om z)ii%5IT0Z%V8(do2XyM4{gll5aFwvaqs`J!3 C z^ML@krvb4|T?x*jCg^&ChYCJ0W^Av&C^9I#!xs%2G)TObJ$&jkQneY&4SR6?b8@#- z$6NHojrCaEaUS$qiI&{t8u^_emfnK??TIFz=;L8&a@NW#Oz&(}me-kc(9zb6k_m#* z57U<|EM3n&J?BN)ok25&AiME=ps-%bab_y$cIShnJP*r5FTGOTGlsGjt3jF6g9frp za+k6-h_!MFZW_Su#N;TyPUvqxF<>S7N1XTX??0mo9vOiCw3{{n)?oza5+Yy{mO=sD zFZ44O!4DypE2ajDO!wc4Ago@Zme9M(n-sjGwU 8w@eR@*Jl#H?T^Jy!Z zM cagyRoD!hM|So^TP!^DvgRZ`blEXwTy7cuy9WW#)^bYIu#F~a_@Mvk z$D2D`nKgrg&D|OLrfxr+@)z}BYR6UXOS&zd&cdq$S;t~_!AxzXkp=TGaz=^hoGa6H z+KsSK=R1pu>I^_YE{JM<`=VX)9|-C69G0_G#bOCl@?`ZEv^9?UeGhwuk; `NgJ`yv4*Pbu5*rIK{Q|UpRH2txk%*)WQ z&JOX~YxD7e7O}oVkz^@*NYKt;`VMg}E*Dm7(;Fk)60hX$eP--OXpUX_UdFMFF?oOd zJPh-t4jQZM*~^0trEA6>LoUJPY#e=R>d|IHh)iX>)o7>dPNeC%8OI%@S)4n)%yNqK zU@JPQcK9C)IxO>u(UjA#3U^#d5+N{tojhE`r>Irfo$rs&$CKaNCOOm@lF{ldYSItJ zORd6204t58SkHKv1dm5Q4FHbP$;U3UDai|#A+uCZk$6$>G6kv)3>|9OY< kB-}@a)27>9&1_T^qW8I{eEniXur3#>)raEJNC+jRdJTKIXuaEfF1>~rI@=A zKW^Y !$&BYmNnP(@rYq2Bb8!x45W1({A6*lY5 zuFH;4U)3FEb!Esuee2~1XKluHSXoj&Wan;vLjcEj8NMt19Q|BsoLtZ8i{ZuEui^KA zADZPOzpil}&0+F4o@TMkA7f#!ZnWsxPEgy{NtvsdlnqLc?Ny>?0^m1N9f!A6gt;$6 z)w?U_YPTxSRdYB;bxdr(6=e{7wov_Gi@u;La-<;UhLLEqDE444Tm4@0G-^-;)$q|T zH2qN9$z)XdnHbv@b$9@>Q?sCv=q5(!0ZH!FxUF Y}s{wejsz zFMRFP&!yy9`5ax_hE6`2vuIKoNwF%xhjl_v=yV#xbt{DCX#oAHFs?c|DUZo)`DTcF zZK7&vRWYvfvPJz| #dp@XxpQ)`?Dn?AIByLycORkVJR 2+9bh{WSi z=g;oEiP?UR$u71eb6r TwKP5JqCMOq^p{< zw%_CS8FIpcYea2SCphy_*SCaujhagDz#h&ogN|e?Zrpp{{inQ;>h)qYG2D5Pf~0Xe zFY4L0MiS03QG8F6Fzl BO=VL-11Qf%hD zUo+uSktd$e-u6kw%EKBmU(RV@L_=Bd2G9vcV&4xqPVT$$_NUqtlSAhfdIKpIbhzAT zqs-f=gvBi`Ug%zF(Rp4omBm@kCcs8Tb$8`9z4^SvJ+I`3q*+5`-PxO~-<&}Z+Hta& zyB2}NO&o&_kNCDPd(a?mhhItj9IsEtw@^ct=*m=b0Bub)FX9x4RGz)3I5Wxk3_mdk zTSd(y$bu{GR+C*fZIwNFW;1uO`Vb`W%&Z}4qvH4wp|dfsZrT?mcU9*SW%(XmwuiCL z(n2|YmVsMLP9x_ByAMw#yK*c&S)@P~xei*9CfL2%Fx8E04a_!?aEH^r;o=PeAal zOK5V6uQ|SEcvTa1*He{s$^9EMDlC3v(-fV0Iaof|ksO7wb5#>t6bpC1n%`aZCQFFA zp|7fZ=AOMuf*>43?jpKEpJnx0gCzg!`)ltd#q41VE3jy 8HId{3dh2dPT|PmmhsV4r*1DdfaDgy&TbGEQ0ey&2rD%Z07mg z*-l+g?On7KPbp~#y#*WwZ>9whyaowQ!at*o0l!R;d6V!#Fu*&`OK{bc69?9Tgp79t z)!5&|g%h|s6GH1;hy*5yR0MZpL8ZYbcZ7(hq0}Ai*%a1 &Ajn!+aRnNOK@BYgN4H3+1DQ) z3|Op$CZ$ (zIoCn4z<1$Ok14iCD-yyLs1LS5&d9dt%4-^@*3 zRPA@2_U@Uek2l>r6-oMtS^BAl0I7QHp7kZ^<&!u_&WAWR8}yCkFh~Lqdi@-_g)GFV zdHx|K6*J7En{(GF)LERUu^lDLWT1j^F@78B+aiWL!}+fCevpn )3MP%{&Kb-TyB$$qA@ XS|-N1IqE#&NY%r|gB7!Zf&|*rP9yzp7m^<8OxEQkhlQV)~Tm=l}gINA_c<1coT5 za|#UTLRhA<@G~n-X*1ZJKI1F2XEhtUj!DF(vLo;4`ZkYX&)7(#5EljC)raN?G&?}N z`*b=^1Dm#-2)O*-6UCu?)arsBEC;U3uyzsIK#452b@~U=6C4Y26R^S6rEIL9HUdlW z3IQ@(+^6kqZHESE=8?Y(r8@Pnv)YO=yC|#Y18dB?cX>^EpXE7QhWuprHI8kAT$D0D zEXO%-`>}+w?pf)|?oU>?4y RDnopwH-KSgLjQp% zqxG=1HawE>9Qh>4E%u%^V)fbY$zrov5zYkf{ yuf9A AWI*q$OR+GNOeR{cyR z&OgRd_Ok>P>4Y}fTxboym_89}Tewm)Q?bH={_XCETF2)Z;@Ljz0rl2*Ba(JezxiO~ zGZT5Ky!OF7qiPfCL}Vk0u9ffwT?+DGqIFs3Hu3YzUKbMvJs)M?oj$JTC0HnS84AONJat5m$KRJ=6MDp<; QAol748b& mDbJBH~+pwc1Rdz#;QYEUGvicH4en;}dH~*4B0mBNE$%_yKA)lfO{>Ciq0-Hh? z4>2EXf%VckZ*RSzkjtYAF-fpmSVNYD;>y*Nc{TjLounHWjnsRy^J;Qe=(9Pl{S5rv zBRNs7n_&I%mI%3@Y5jS7+JU6v6b$)ffTbNvOrY%M&ZUez>G!6rOJO=rrJfOQ hr}RD|Nar9ot2zlKVe_Gi5RKZ#cM1OwRA9 z0A1qB9ssQNFKJ?txJG^a7`*`p2HNrDNEKfG-UnpH1a5wS_U=y|2^N2f`aB89ZiNwq zZt7*+i5NCjLSjhF0^)P*QSwdPHhRkRB0 ~ieYRoyvA4VKF}*^=+}X7 z46(hsgrNOIga-+y!_W`Fb&A+uWREu|9Xx#mQUCo#s(wB+d`PEDIWzKgkz@FMT5 Z)Z5$;jcbWEY7r|UK4Zt!>*a>uG3u?$=}!BEE$LDqD} z=Vr{8i^M^4K(KPa9$ >9@^=7Je@FW70dVZz zTA?VZ|1)F%uT@yFoZfu9!TtEZZA<>HePg5f7g!&F4j|u^{A6yW5WS=HJb03dJLo9? zT~Z+l iO;Z7}EJbW5zsWXkb$2|ip9r}$b8Wsgc#Nu}? z*a!r{<<};a+O?l<;y`JWwV~ZiZadQuoMTcWz3d6|f6Fu^@5@<1^RcP?shd1rC(oF? zRho-|*Uk<-7oJ& `c^Gdw;qJnkzX zZWS>T5%GGvIa9w!b0$-#Y-siooBdFjm(M3^B3C_)2b t2n!G?B1v$=TFhtUukcF0ISKEL^OX)aupVybU5z&}cL&Up zPpCsYzQIq&c13sp;Ozw9O=Hxjt>62`dQ1AUM@Gjw6;11oqK8dqZh17XQ?&IY6?|!x zZ;=vN#VO_>qr%ShW4XxKt*;DfAEdJ;mQ9iVkjfWWTScW5==R#PJx>ui+d363;phRl zGJRTv3+}i||HCCo{!I^r{wsGCZLm>+)N@ITOPwO0H^^0Q*{bx`zJ$oWwu@GOJO~vi zTrNoVQhmp6JC{og0TQwk!p3ii! T1xo2mDD?qaE9!`r^j{)Vi{&a(|r zOg&!vwYN?@MXhnHW)6M>hJy8_ 9!uF y3Y_=TNeXUUeL5a4w%SFLR>i%wIcj>C zMT(CvK44hT59I@f5R;*IG9sCDk-}XfSu;2%Sdvygf8rpB*5LXb&0m?Ql-%fQ=BG=$ z6Gnj9lFL%Z>cNuxXxeJ9G$~bKrir4jpnjkM6X13Yc3|$SG~~tY+UwfnXZ=6 zM>o^v7;2;&l2=*lMrrOoGJf++2Ah87<^FbB1KNyVsL5S`6Zk#} })T$iaX(FwWNEKYb$0+ z{g)ppx#>>!g8Cc0)Rn1v(?h1)us&3#3NO}6We52WM3zSCL=`PfekLoaK!CscYc{$A z(cwn#Wjf~gw{5zaQN?8mm$Fa4d*OBvWtQ^~ 3cE$tR zWYxp_U!){7Mb^k#?pB-VL_e8wFy;9`PIuNV;u)jXoN2->++-_klgfN+GAj(lCzv$N zH$BCEhJ^&|z%XC#lsUAP@aA`eQ)j=QeUou;;=~L% wR%xj#ER6557|*kuTBL0{qWT0G~5rYP}*Xpi4;A z+lU^p0fF}%lxAt{G UzouIep+uc;r;5 z1^nRzLm{V#-zdpl0-J|&OKv?kE>Kmwjek7|;k0>d>nN||yv>TWMv`|yEM!vFIfyS{z^Z%x)Z+@3 znz&+J@Jy3D2m{g+to}jcc!UtN$rb?MLW7r&pMB|;tAThbVZH!|t4%6@+LOce9CXFK zW7wi@ Oo@RfDNn2gJRtVbK&Y{?A7J3;RfeusL_i< z3!2(mh&%_v-M4E)+_4D6DhX1_0!vF~3cruUav~-)7f{>hssXWP1!w9|61@{MRK;Wr ze2-NH7VtsMxDDt&XrAm1;W7N@LMOiFzBl41v|1oXaLjrJ0WT2g25tJl2{; zG0Icq@=lIgPoLnU2|0VlFfZELi>xm`{1%YubT-D=-wS#tQnYvy@2Xp1E*u7{UL1?# z#&H!M=e*d{KVL2-{q0c9V44c<5230zAFO@haMs$HD*s|2|6V^(HVxJv4sOnVi7!Ci zzyIWel(=jDnYT9KeQsD{ $VbWCZTp4_srD8~y3 D# zQOeRRn@{K_pIuu4o$W#Q^+YDuP7Lll%ZWG|tB6J3o%)o=LE iF4S{!$Kl2OjNQBZLP@eUXWEgi*5-5ePR!Pj~z|6Q3w4v_VvR(KF?Z zi&0=`nAhqR5O+TQ{U$o&$&;Sqf>m>~cU@2mh89PeoJW>SukVRR>=` ^*<20 #lKZAe|+3M1BzxD`b^6B0q7H*>pn`zorIVQNadziqLF}gh=v|K5rzpjpxC4)G^Sg zxtn7~;|iVeG{(rktH+L>EiBPh($|nigekudxK`@kMRWpkL>SJ-dgTX~UVGTlfb)~i zw{) TtWR`zsCN@6ADl^&*L=9(DnRBh(Aja^&d~pDbo*-+gZN0fP#R|PzNEu zXe2w9tB&G`VpgL8dI61`p#h6JZ~5n<_5 gXk5)DO+mnc75uNMknOK|)%?gN^l=l`ke+BH4qkUnHz1oAK@3oiK zir56ZCb6@Zep*|v1ksRBm`Fm4M`wY~U2rn|>h_?shJNa`9--U3U)^rd9-RbvU?u4R z5^wsG#Qy~UE#jy*A34JE$ot*u3oPdr06+Zu3cqB#ayx8c6590 ?tgxhqy`RkG0T-ly z8LsqQ;hhRxWbBsWDUKBQ9dP3W3<|h99J>O7nH_~ah+_^6BkBY{olsyuEZf(PW<)tN zPiC%xIIAF5(UEUIA-Ql{9bi22@3_9re?O)L=LuCvy Q!jE5RfA7u$Q`XHqGw*3y7m=rLOAB#eGnG+ zv?mm4DMU2!{zAN~o$cMK*yvufIQ-deW*D)!UewL8ce0D5i`;eVQXfh-bkb_*nxhvY ziGiDTp{#Z#=4`$*V8bQt+0-#JE%?`clin8q)43uRNQld#%Zdq1$xXvl=Rccu6=nko zd7KktgyA*N)#{JU_Ty7S-EVfy2Ng^3yRbW292uvE%+$+@JkzkJVBJWTvs=gp;Vih^ ztJUTM-E_Qx*x@B;TUTW#f)K972ZZ{WZ@PFQ13jOfCU#g1ZPB=LdzP+&`Az9vWR{n< z5#XQBf@s2u_dx{K#-o%qgxJFLRby-=U+^A9Sw5#ccRNm6FMBmU1B~~hxD*_uDB%VX z=GEAU!(5a1g9gKr>n~i*46mNr3z#nj+h-u4NT9YHDgR JF*UsI9 j6 zjpHNRZ=UBdyK#06i(KZvdEsC? >Q NzTs4QS-4h^n?_*sxM+x6* zYGYls#*~@;uiIx1b0r@dZxey2k9l Mo#dD5GdYP2O@lzMH?OYGAfc5>k_s-+Oh7EvTRR0~a;T7s}zaL+2bj>Iu@8g@2%u&L3{j~f8Bwmi$)?2IkZi(EjSrkx5 zVc?D>H)v=R-am_NGxfTDfh{e5mc3{}etU=dq>?yquXgl#ff+~d-f{?B{>)LjU_#g; z2)tKUwfV|%+p`tX?1J*rAg_21N*^l}(lnkVDWXdS!|kwMT;q;fXL+>#3?%CtQJ-sf z{r=pXU!JqKI_1P<6!js9n%J{@k#PSKR8qQmHX|dW9U@-c5h4P6upT}5QgSvF`f>OK zbnlyONxSERCd0G@xujCmPE-u*0IMiYF@=J_qMOZbH4Ad zyZy2h={TPaOSVlKHDl3Pq9=!qO9Hjj>U*|EMEP bfOc0SFyloo4U;sip0nA>vcxQuqwq-_$Tu1n1T<-{8bXz=U6>T9 z3xn@(YhU#s)ieDTXTK7>fo#Z5W}WeUAr!4KI&^k!Q|J?d^j`CN<_hbu-#6nIy}FNk z&zC~G-{4Z`Q3dLi0Vbb~!^I80U|gEhDEi`l{2;;PgDh)}q|0oNy6z(El4=#xH>sy1 zS07L|E-!ntw;`_3!1R%3F-!@1*0qD`_ff6yNGFbeF*e)$v~O8SvEMj#DCIdhU%T`1 zWMwRGUCQP#MK6&_*Lu$ 3Py8A840usYs_C5Cn3Zw6njqnP*Alze$gW7m4ksQks(If`D{!`F$t2 z+wt7jeK_d7c-r)_3#rVca-11O#?1FXgmVG8v`_=l9wAS<9iGY=tk!pcDs5 zWb)US$HlvUJVJ @_Fp9MaoidzO{J#>@q?&6cTcibM$6@pq(Jz5Aba7`(nTK zz~*LQnEi4hl@ De5A3R-9>ZSY^mpjOcaJ30=8pW7xn t&$ce 8@kZxBPXty2r(!8f}LVX|{YIUOk cX^$P~UxCA!6>A&Yd*cf$5Ub>N_cMoznr}lr zI!X1fZQK+T3_1h{ytDXD g*UV3KB9ub+OFAPyHaWUWb3Io-WTO(6za1G!jU%2x zOX~6XzFqvWP-*xoPhmLZ!1j dI}E0=MZ#8WwCn=B>LulfMdK}}S~8(0q~i^0&pI@^^5k~h8mA_*(F4MSvq zOYv&P(^x58FF={8OP+<`y6bDCC!UxU7%q9W*SE5~t7&$nst-o4IRZA2DCMm6vW5Ci zOd m#b^FFJ`JbEqki64QfbV?5xbvn=m~44B=Ps z_w8tf5#3~V EUSSxQ;BUQxi14Zwq5c4>0S#kskZs_AMnc`{NjX+ zu6g1Qg73Doqh997xfhKi&u0%;DUsp?qt&;XbP%WZv-rQEL?(cc;%eGt$!FhGsWTkO zu < D$NMDgW}M?Fg9ihbrHH6~L!}!-eLk8Qcl0M1uPtHoC;-FkCIcgr{>p(V zg|~5^KR~V=XdZ;mb5%vSz(Sx~+Zh8M5+ny&v!^d$dvIOaS0t>o<^>P5 lf#j1eK93-32VrkH-L&V4_J)2ta01w{_j5 zg5OCOBKoIym&@+%fKsVHx2E>2`2DcXV`5penH+NR+MOgKdZ(v4D2$c{T{Qd8Yz@XV zdVb#avEY3aMhxRxRcyN14i0c(j6&~Q?KeyMscJ#V!a8#=tDD?RxM73LXF6RiFD=Vg z`5-*}5ea7HKKheTs^PD$83!-Ul[yVc5kLcgrnoo@H7DyeaCWjFhJb4WyZMn Z8B}}no`c-GIXoCEe@~zLJQF# zl9@=9Q*x-^2GhNywHsy>GK>EXO-(W35Ibp`iT}_wB`RR@WtBBRVd*MDITizzWqefU z@b*>FCb%z)8*QGw?bNIxl@3i3S?Ph+KG`X3G+5xr=4O*J7rAo4A`7`JU#NxnO{tYL zzke9%&|BNH8%0|dY#t;M%i8HjLp#LoaPW|Hn!Af8mFe1B?cIS#XpERwX)NKcmwO+I zbACn*E)?d}HJQUc5zC%wU!1v*DO^{-nTYygv$rc>xm06k|7L+2g;n)BZIe)TrpTS2 z`ArGdKab}|^M+B!w%}LfS3fRSuCFC+%@a_NgXI}YTIvI|ts8pE)*4@W3^_0x0DBWU z63HOO;8XH>WwDhGM5B+EEN3v+fGp>OKpdI(_-H>-r2s~vuH*@B3CIyj^R<^ILi{j` z!kJR{x30n>)A~B2aEl&F84_@MWH$9OtpIF-p&JRZ)i->*e^^7DTzmFe!L!H%T%#ig z&VqfrfRyUe*Q+q-dMb$`MU2+Vft5qeVxuP*hEL<>U+ZD|_f2Q$@vfp3T~h~Is%PI9 zx$*%-a$NpF|5@r8qClCo?fzbJH6{+4%)hTyO7!Bwn+wwI*#;Dci$x-f#x|DxFEzW{ zDc-t$0Zu+^IXWuRAMWl#7@=Q7OLv!;NistFr}?2-Aj)X>F8(qmR}#I)5(L|(YZBX$ zQvLBL)+qvyhix m>!$|?T4pfe z>3g5L0 ICE0^dzb9Ik=x|YF$v<;8wXC#+1F74dPgO-k%!k zZ7?;&Ww<|#{p!#XnZ2D`yy_+L%KE*E&S_q%hgH)G)RSTqiZcfc>m8))1+}sq)UVv$ zQk+|OwPbMnP^bU$Rg;s9`Db;4JAdehs+JRN(yTr&SlBA3GL)R~pg73}{X|crzFdp? znN1fM0+3;#)|rF0mIjJnx}O96w=3_@Y`S)M;O^V|Gn;PJzTN I3tISQ(J}cC*0Ug*aMGSIFcA z%G6-nzi2`4xCBi=i3Y1y;Ki~~{+s6>39Up6b2LHZDl ge&5*d@p_xFM|S&kPjYJSUIZDpZQ+}t>Rze#5rJvAT;4 ZD@QLTwC z<%C(7)`m(b1W9d%3I(aLIGV&$s-21}d&)NgB{WDzB5#abCX?EKTT|iva6g2eqKafI zPg6hs?5vxElb{BZRGla`hp5b^%4z+nJZxa;pwFDR*%=6LA2OV(qseKH{xF|{JDJ6L z-PR>R@cadhVWuz*ym^Gt@_VYT8HtcsH~zXdHhfKC+aM4`bO_!N-h7$!X+7luu@7bT zi8Iutfr5!EmkwP>=yr3g)^Dr9oTWSR9%Gj}$tZix*R#%XP|n(ov+GXI7!eKAz |?uM3)FwY})=Jz=^UDl3_eKZkQYo$-)3YO}U9YJbXsxgif0 zw38EObz(3PkzUxXP{~l#JNeG;xqViAxt9j%i;hei;W!Fw@wsOw!y2C~I%@kKhdYQN z+}X}6TyPE#kJ!FmUF1IP!sg34G1l8j+JSgjIWYadTDtOZsQR~mWEopC_9%=jSrd^Y z%v7>xmo>6PWnZ$zoKeYAj6F}(OtMP|*(&Q8k;n*Hvd7rhEVDfCd4AXX&-wG5b6wx- z+~;%O_h->gD$jeJi>sbT3>F&+8GiaatJ>DhJ>IhM8YZ6qd2{9<@YFIBBg^Ur>PC*c zk0Ek}4?=N3M8uT^T7kZn_d$OZ7cTp?t|1s~#rq@ED0}W8K?)lqFj83`udO|`gTR7K z&0tzt<;*#FWB;#L;KV LRy6+y4GUX@7G1Gr)Ui8=CKVV2kPHP^}V;}dMSg;llJ zG1V?vvX9hnLgwZBym;^9P%7PHTc_4AgUrtjbJU(>S~Xf6!=)Ko+y85P!wviWG9T?{ zXbML!>g&SX#`$<(cn8 4LMcd*}G7zw1C2f=}h~<6Yp(4O4QF$ehZm<{q^V zSLm&r*XiYy8)o=aC8KD8JECjPWiPVUXKIzAY iDR-t^<_}NBFrV)-U)M&>c;A|HMK_Y P1e>o#!28aXZ5IG?ya~lx)P8LEw&dKmgRT zA MNTC7`$W?vN?2)5eAjB792^jdlf1tK0ukCkH@*> zjw(5)p6X^9Wq3T3>EEm_$;lE?#OfFp$1h}Sm!IQ~S1_m+ xVtUTl@Mc}uJA-J zcAgpwZdCpYSP;tNCSwn5sHeLw%1#&H7L47mwSI@0Dvtr~?P4a8v0-zM3P9tytjt(Q zs&N>oFsDw{(En!eRunOqr}t3B!h5LRyd5i{G2>yE=H;Bn4Uxik%lfJ`uQM+#9)^{Q z*+r0GBO FWu%-bcT;zT| zsLgV~PqTkIf>v&r=z72SWt+are9)@u7*;X^KJM|01mp|!(_q>spIiwFkl0~KOhL08 z)6q(*8m?D;nmxk|kx<&iCmxi96Q%f)5*hv4m{6?utHnm91h18b=eYMlSLNcvgfw)j z4BIGOnn%{Dk-oy3nyalU^m~SIcK<7@C!hubFdX)%YYE?gdYjc+(pgbAeYjb0H*BW) z(B?+~)?IR0CsDxTqvpOk_HO+SPtO)_eNz^aQGH-@UhTBAnnG-f*_O4R?NW)VNdx>{ zeh$}%Gl}+x+%Yxy&9c6@=*k`)3r~y *8acUr&10_K~=iEWPS6i9oFRWizQDjA*`A7;|6nQF!T-l zSa(_$1b5Fk0==R7;MtLT9+N33tq-ZS&L yF!U57YZ!x}rX-U}UM2 z#IF6TmcMRx pxoTUl zyk=})p->Bv2g}TM)-x~S>^3TT>HgBlZphPHT>bI=tN@vKh{TiTBqT2Nvlf4__i5}g z!=dFHJ|h%qYWH5Y15%8YFx4K+lW4n2{{r8JU)9G&U+^4X3mv!bFG&ocl{DBF&bacR z5|n<=+Gp!LVfDOZC%g;`FkXIWkyhaI@d798Hh?VD9D0ruX!sx3BTz*r%Cf;$E=V`O zkEZgTP3H#SI{G^^GJtaP*b(#L&&ZoAeOC}1GzZcl1%2FCueqQdhmohA5+MnUKlWen zTW2$xN095ZrYC%ljfQNHg$XRTEyFJYRwWZ}UZh5ybjm |KSsvDa}6Cvrv96=AIIRGl||r5An@9#r3hS2gau)2 zKV~>R6@<0Bbc86blljn|1{Fu#3mqILlSzVwY*Wt1^T@zCtZ1D6)_bG%IJDUsE*j?w zb~M2(zHV`W Z~&ohe;4_jFoq9ESX%3%I*9cp(SXs(N!1dfksH+nX< zw=YInUuoF+Zm_;ZstjO!R-+@=&~y6)Ob)Hdf`xkHw8A@{RE{P2=l;3_&9HUqZa>JV z dqErElWj@&ohnu`K}dY+C @Mw@eE_5VB!{7aiZ-dND~Fxt5? zAXiKiGJGp>8`xDZG)^YP>WRCi3r($;jOnn+yBWRat5 }7R=Us++A11G>d&@2}M`4e;5w5tB}&`Jl=H49fNDZ zhujHn3$9Tdc6)-}0>Ff2QkXnsiI7v2{`L{N Pan5>n!~e>z@xH%0rh?rZxI4qd8K{Oj99TJ?}l2P#yl2Gy!e>rUi{!if<3(5 zFjjCmH)M$OULqI<0`kfSa963C_@rDD?loFc6h8*PcjY=3W`qmvYAE5ku4$Il5c z&Br@zt+mjiBO)}BJ3YQo<9TnZs1h3bm~8GXgN=3NBZ2>^NL>?-B4*dy8B_EFBZfmM ztTO;s&86PYi`p3!vOG%KOHZ0aqbzNu$?s$!;dKCij0G46L=HyOx9&juu{DV7^^l7p zh*9k4ngmN4>cM?y@Y*fW-$I)UB>sDw7ij=!Ov;@hJt|r$>TFqG0J8u&@@^^kvjMgK z*<3u{Yn}OW+0k<(#lCX$Z5y?IoTv^PzGQEWnz45v^%a$tT%#l!5rI(Ij 2&49Zug?9&cdmeYFZKArMh&@RbCmF{JaySk zB6>JnaX;Vfz}927 MO^cf#V?guXDMdw{j()Hz$J&7x`O z#k~K~m2|2ZMH&A$T8^pv%=D`dhydir8VeV (ygOpj+IRQhr3PUP4A zs8x*3DNJmcOa+sHkQGk&r=eV*w~X)AQ1(p*=e2@sH06$M0z8yEboRxWkKg}`O}kLy zWRw{*VttqdbbA_5my4HKZE{V?${xJVjvbQBsUiZ;cl(VeweAc+qPPpZ $xv!clkNeHk2Aja@NyMS&RF;nK``q=; zMaHqa%sDYkoGdBp%PMSaVonej#QNr1Xt~L)I7=5>;T>bS5NPjMLT3%FqP&2E5!%%o zBij|MPEO|Of>W~fvXB)Cv+}sfOH=h0Nd}~&)*rY+EtmdHheS{ObXG?b#oRCc@FB+R zE-l8#<&-_)RtdB&kT3cg^z@T2ZawA1c16N;l1w|d4HRrN!DJvXXN2Z}jH#i-P510< zi0wMOuO)w%z*0#3FPKIcYBtZv5ux>UPVuh5SP)c{3)E{ZV3*z CL^Co&SaC17 zv=`~uzfBo>x*aJitVWsDLmpCZDRyR;F{_n~xTK>%K20d*)LAKd3K>UpJlNii xAGZ?ql-XhofaCFw=4;gYq#W)-sH`AXuZ~4c0>}m|#Au83e8PQHR!X4c# z7Zy)z1^;?8vQ{(QpT*%6%;UoF+v7G(sC6Y1+R)FXFTxQ)=$-lIoRmNA_ `n1%InjW?AP|ybIo+zZ!#j^=ci-kuM|-}b_fkub?FFQKz7>_ zp}GkiLBY%fnCH>U07&A p~_}^JW#}DxnUI+kV@}tl|V#12ooTxs)68aQ>L!HTC z{I2X^vWAcl!~eYJ 36Ex<1+lt!B4}98bf89 zOxXpOx3paXS6TIh-n-rg52-pONjD+?NPnYUW++p)IyTPKBLz>7iY-W;V6NYH3N)y6 znaTnj%@vlF)+QPmHrZRIaZm8!`EuG!kS?BhK|1k-XV4mRl_;nc^$ojSOk=16X LNN|ATWP znv}G`0;- (h3IzfTjJ4 zhI^3;x*oel5>F{C&EbBO*Q3QEvr?>10*Nx8JlNw5s)&G0N!}a&=svv5RH59qf4H7q zpc#Q-vr%h6A1+f>BR!CcI}{Dt>#wf^oRhsBa!~R#DIK}<`gf>mDdrMk5bCu${7NS? zz>~=@g)V;-J81O{mSbv{=exr@eU(k)PeIz?dA=*jG{l0f-=9>2#P~jZrJ#KJ3DQ5} ztD$p+0D`%b;B@@$rQ3+Xcg^gn&4|n>Tj7Er#ebOOFdOxU5ZjesdD!a88k+ae-7tDw zwe|}< _VrELxH(Y1Emd5EJ53htkQSRp$ zF_e-842(5ec(Zu-y(2<2;=cd!!PC3aH`5RB9S7Z?p6v)Q)upJKe5}eP>WaJ6r(xV* zevzrlTl?^hG{k*w5q;{sTaf8&8A+;lr^WUD2UaNMwILsS%E*kU0f~b%pz>+;Utrp= zx9Vfi722>9V1o~!#1tu?2xPooKv~jT<@mSejHd5wNBPhw=$<87w3flPncS~-FBN$J zSCj 8{t$~M^kR}0Z3!N|4(>Sz9`CR8df@I8ge5|wVS|R RQV12BOsm;+=)d#p{{X=NqLBaq literal 0 HcmV?d00001 diff --git a/docs/website/static/blog/nfc-crypto-biometrics-and-build-cloud/build-cloud-preview.png b/docs/website/static/blog/nfc-crypto-biometrics-and-build-cloud/build-cloud-preview.png new file mode 100644 index 0000000000000000000000000000000000000000..dc7080a0ca4d9ef1f7102cb134d7f284725a8db9 GIT binary patch literal 327536 zcmb4r1zc2H*EfQIN+=>Ajf#LGjC6-0AdMnjN+U7!&?9;kB^3mu5d@U(ngWTD7KW}- zx`!Te<~!bc?)QA}_g)x&{N~I#XYE*f?G^vM_I{(Qtx9u_ %XO2GoU(RQQqpx&QdI&wgFW=zo><%7bM$m`e&VMqLPEm#F6eEkMx*Y9 z7L-ADhW7<_Ha6imO7CON)k#(`+;cyp->~=|ne*jsi)zeOatUI{b7IK3E?34-X=%wb znX&V;)1Q81&iH}ee7fo%Jrx{?gH1_tNx8bY;>kYCAWhBM_>;2*u5U-2MsQKjuBQ|g zs}qV8rjF#dCbZj)QAA>7L)d~)Uiy3H7IV(~pPTm6y07EtqiZWJxoea$Y`mHF_%;_} zk1*mw@)#I(e!hUZkUzsQzWB3l{BaMh$3ew{b3v=rdwQcLT3NTD+uwg9Wgk{JEDu3F zGxw1A`7r$@OW mu;~TL$T0Z&L+kko|Q{@fvtWaz{@|O%3?gv-YsHb@g-rdzC5HUjuHOb-Qou zNkYPS{n!5~wTIkmBqXH6j*pDIjI=bRt-&sWPi(+ewt~JcZokSQk@b}ZE?sQBo^biP zIJ R@bYq#27w?Dh#*8n5bR+O5|WaV0^Jq{2@4AVZwPq$xq3bE6>#;u_D3Oq zm2=P5)7rz)&C3z&%Jr+ *oNbol3 ze %{d)2T+3)@OqdM7Ng-Po=`r0}h-E(vSSPe8yURX->w(Rfq{6CNW)6zdk z^*wDpl)x?krI-AF2J27ae?I(g!r$vO{!g7k;u6CDtn(j_{z3Yy6VeZDJ;Bc2znG}+ z>gXj8ko`}$|C`GAKV Di>>^*So;w@5)wrcwR?9S`JP%HhdeX09p+oJmq?zF zxe_UQ@#(YgpYS&yemX}gE}cnA`tXtbX*#-lcW#_}&Ufaaz?tWl77*2!?q9ir;7u;u zOf9cz@964?uNdb>;U{W6CkScS#F>4xXWDz`nugg#KBF*ECbs-{B&SGEpSi%L`0ThB ziy+;HZu2UvF1o|PxFdYi8bUj)tXn0BaV(W?%KU=XwUZWTP*6YDFnYbe6x+`fXBx+? z)Fw=x1y@LiTb;KRJ7MF_T-eq8QBH#ER;t5Du6A43il{X~*qM pNP8o)%yqnu07iGefaMqGf%0hM26g*?CZD+EbLSqB`x1*cq5We6 z-A_|xAp6d`w(~y9?}Kh5pbgi>F8(zh1?;4oc3LJfu6^cz-}~PN%ZUB-h(x!Pt)sTq z%M-VX#WF+qCq(VcuIr)d&(kN9iZd6!F?;8Me-wmt$TQj_Xqr;|$8C5HP}Nb*3Y z{+>H0ok%Sgzi~4oV-XsxPSAssj}u)8H=>#vtL!XFf5MT 0IP zxlA)2)kDNXPdvb)3?Z5}rvoM8LVvQIR4~6W@~Pd-9;PWe>3mSkSU3X+q;&UJwc{$A zzohT&HLf2rp-Lw 9|avd4FcNYhCxmqCijg?frWdV|uCfb8;%l zJ93%U_>i8`(Pw-v28;qG-mmRClT^b8R$~1(Qu{DCu^gM5RzDA!-+eJ+nc1{g<|!Bb z(j5_&tzp#_u`cA<_W6UvW~|t(&-j@WiF8Qioeb_bR2J7rk?kfGZ@dRaZ%X6YE~eI< zS0{zZ6wq|zHUl)T;!P`8OpL*)r(sMtH5fai6Jr%3jP(@4-ejeRZ;+Q$(O^z!NEKu0 z_>2)`NZ9rScO9OcLvG)h#a3WcoOvL}_pK-&(lq^NTsnbunJyNMqSI?ZaOm;Ehc87h zX`WCBo1U_)jq|ix$vKpRl%u(aWMY;F)EiIt{@C@V4EnesvJwli>RUSBlCogUTJ^f; zgrygFg_Ol18^gvjK5_5Uj0)^6vj~iOS-j&fu5|J?hcr42eld&)!j(>MroYy-E39;z zI#~rtF^W0d^!Zx#kR_k-n`DRs>hbIw%tdteYA@zOo!4g^#;crcf8d|jVg_Cxc+j7$ za0B}g?g<%n!%$Yf8#f{wk~uFuM;NYR)Pp2OR%;v#20Uh5ZM;u785SA&ZWz-D2l9rR zL7Nh?R8gHv$Sc?4O*5?VcZ7V)LCpssEc-h(i?c?JZ9hT~R*ER^Oh|FjgNG&;(=}5V zt$8)y2ysGLsF(yz8dnEaE*Qy&FbX80XOn3o=o%@}DvkTi{y_mvV}4YVh Uz&$;hc;XEumN03hyzP2NGs4C@h z^Yr4y-4>yM=EPjKONFMDe3D*EorBTV=SM5cK(X-48#|O!lgajG^y%7Z#%^$x<1_fN zF?o{jE1dXBK-05Gy!il31T1y>m2 emvNYPglX}CD>ds_t_9^n zPo)x@_xC9G=@6Nw^i@A$!Mf$>2M (`I&YhTP%P03Ob9`qx4V#Lg#Oj*Gx&tTL2fWAUalC#8ccz!|Tv3?c3-N=8?<*b3 zZ&sD5YK6q~&Q~{Zh?yED@4xP(K