studio-engine 0.56.4 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +56 -1
- data/README.md +24 -9
- data/app/assets/images/state-flags/ak.svg +22 -0
- data/app/assets/images/state-flags/al.svg +6 -0
- data/app/assets/images/state-flags/ar.svg +244 -0
- data/app/assets/images/state-flags/az.svg +8 -0
- data/app/assets/images/state-flags/ca.svg +1 -0
- data/app/assets/images/state-flags/co.svg +9 -0
- data/app/assets/images/state-flags/ct.svg +2472 -0
- data/app/assets/images/state-flags/dc.svg +18 -0
- data/app/assets/images/state-flags/de.svg +1549 -0
- data/app/assets/images/state-flags/fl.svg +6784 -0
- data/app/assets/images/state-flags/ga.svg +71 -0
- data/app/assets/images/state-flags/hi.svg +11 -0
- data/app/assets/images/state-flags/ia.svg +1 -0
- data/app/assets/images/state-flags/id.svg +105 -0
- data/app/assets/images/state-flags/il.svg +538 -0
- data/app/assets/images/state-flags/in.svg +57 -0
- data/app/assets/images/state-flags/ks.svg +2575 -0
- data/app/assets/images/state-flags/ky.svg +2918 -0
- data/app/assets/images/state-flags/la.svg +1904 -0
- data/app/assets/images/state-flags/ma.svg +142 -0
- data/app/assets/images/state-flags/md.svg +23 -0
- data/app/assets/images/state-flags/me.svg +3277 -0
- data/app/assets/images/state-flags/mi.svg +792 -0
- data/app/assets/images/state-flags/mn.svg +2486 -0
- data/app/assets/images/state-flags/mo.svg +2726 -0
- data/app/assets/images/state-flags/ms.svg +9 -0
- data/app/assets/images/state-flags/mt.svg +1288 -0
- data/app/assets/images/state-flags/nc.svg +268 -0
- data/app/assets/images/state-flags/nd.svg +2365 -0
- data/app/assets/images/state-flags/ne.svg +1960 -0
- data/app/assets/images/state-flags/nh.svg +2 -0
- data/app/assets/images/state-flags/nj.svg +2265 -0
- data/app/assets/images/state-flags/nm.svg +6 -0
- data/app/assets/images/state-flags/nv.svg +468 -0
- data/app/assets/images/state-flags/ny.svg +995 -0
- data/app/assets/images/state-flags/oh.svg +49 -0
- data/app/assets/images/state-flags/ok.svg +1036 -0
- data/app/assets/images/state-flags/or.svg +1 -0
- data/app/assets/images/state-flags/pa.svg +304 -0
- data/app/assets/images/state-flags/pr.svg +7 -0
- data/app/assets/images/state-flags/ri.svg +29 -0
- data/app/assets/images/state-flags/sc.svg +84 -0
- data/app/assets/images/state-flags/sd.svg +446 -0
- data/app/assets/images/state-flags/thumb/ak.png +0 -0
- data/app/assets/images/state-flags/thumb/al.png +0 -0
- data/app/assets/images/state-flags/thumb/ar.png +0 -0
- data/app/assets/images/state-flags/thumb/az.png +0 -0
- data/app/assets/images/state-flags/thumb/ca.png +0 -0
- data/app/assets/images/state-flags/thumb/co.png +0 -0
- data/app/assets/images/state-flags/thumb/ct.png +0 -0
- data/app/assets/images/state-flags/thumb/dc.png +0 -0
- data/app/assets/images/state-flags/thumb/de.png +0 -0
- data/app/assets/images/state-flags/thumb/fl.png +0 -0
- data/app/assets/images/state-flags/thumb/ga.png +0 -0
- data/app/assets/images/state-flags/thumb/hi.png +0 -0
- data/app/assets/images/state-flags/thumb/ia.png +0 -0
- data/app/assets/images/state-flags/thumb/id.png +0 -0
- data/app/assets/images/state-flags/thumb/il.png +0 -0
- data/app/assets/images/state-flags/thumb/in.png +0 -0
- data/app/assets/images/state-flags/thumb/ks.png +0 -0
- data/app/assets/images/state-flags/thumb/ky.png +0 -0
- data/app/assets/images/state-flags/thumb/la.png +0 -0
- data/app/assets/images/state-flags/thumb/ma.png +0 -0
- data/app/assets/images/state-flags/thumb/md.png +0 -0
- data/app/assets/images/state-flags/thumb/me.png +0 -0
- data/app/assets/images/state-flags/thumb/mi.png +0 -0
- data/app/assets/images/state-flags/thumb/mn.png +0 -0
- data/app/assets/images/state-flags/thumb/mo.png +0 -0
- data/app/assets/images/state-flags/thumb/ms.png +0 -0
- data/app/assets/images/state-flags/thumb/mt.png +0 -0
- data/app/assets/images/state-flags/thumb/nc.png +0 -0
- data/app/assets/images/state-flags/thumb/nd.png +0 -0
- data/app/assets/images/state-flags/thumb/ne.png +0 -0
- data/app/assets/images/state-flags/thumb/nh.png +0 -0
- data/app/assets/images/state-flags/thumb/nj.png +0 -0
- data/app/assets/images/state-flags/thumb/nm.png +0 -0
- data/app/assets/images/state-flags/thumb/nv.png +0 -0
- data/app/assets/images/state-flags/thumb/ny.png +0 -0
- data/app/assets/images/state-flags/thumb/oh.png +0 -0
- data/app/assets/images/state-flags/thumb/ok.png +0 -0
- data/app/assets/images/state-flags/thumb/or.png +0 -0
- data/app/assets/images/state-flags/thumb/pa.png +0 -0
- data/app/assets/images/state-flags/thumb/pr.png +0 -0
- data/app/assets/images/state-flags/thumb/ri.png +0 -0
- data/app/assets/images/state-flags/thumb/sc.png +0 -0
- data/app/assets/images/state-flags/thumb/sd.png +0 -0
- data/app/assets/images/state-flags/thumb/tn.png +0 -0
- data/app/assets/images/state-flags/thumb/tx.png +0 -0
- data/app/assets/images/state-flags/thumb/ut.png +0 -0
- data/app/assets/images/state-flags/thumb/va.png +0 -0
- data/app/assets/images/state-flags/thumb/vt.png +0 -0
- data/app/assets/images/state-flags/thumb/wa.png +0 -0
- data/app/assets/images/state-flags/thumb/wi.png +0 -0
- data/app/assets/images/state-flags/thumb/wv.png +0 -0
- data/app/assets/images/state-flags/thumb/wy.png +0 -0
- data/app/assets/images/state-flags/tn.svg +23 -0
- data/app/assets/images/state-flags/tx.svg +16 -0
- data/app/assets/images/state-flags/ut.svg +3225 -0
- data/app/assets/images/state-flags/va.svg +1 -0
- data/app/assets/images/state-flags/vt.svg +397 -0
- data/app/assets/images/state-flags/wa.svg +2620 -0
- data/app/assets/images/state-flags/wi.svg +3611 -0
- data/app/assets/images/state-flags/wv.svg +1 -0
- data/app/assets/images/state-flags/wy.svg +210 -0
- data/app/controllers/concerns/studio/geo_detection.rb +198 -0
- data/app/controllers/studio/geo_settings_controller.rb +155 -0
- data/app/helpers/studio/geo_helper.rb +73 -0
- data/app/models/studio/geo_setting.rb +137 -0
- data/app/views/components/_geo_badge.html.erb +63 -0
- data/app/views/studio/geo_settings/edit.html.erb +368 -0
- data/db/migrate/20260818120000_create_studio_geo_settings.rb +46 -0
- data/lib/studio/engine.rb +30 -0
- data/lib/studio/geo/countries.rb +269 -0
- data/lib/studio/geo/lookup.rb +114 -0
- data/lib/studio/geo.rb +244 -0
- data/lib/studio/version.rb +1 -1
- data/lib/studio.rb +89 -0
- data/studio-engine.gemspec +4 -0
- metadata +135 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b736782effbce6816b1b46cd6acf958593f96cc2f78e524eb23f5e655ab0bdd5
|
|
4
|
+
data.tar.gz: 57b8207ab820e9abac08a9ac3ef304fe3718682921f8bc255941238824aa3c52
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5152ec72b244a9935955a2e7eeaf7cb86adc7530a4000f5a98f44feed966023609ef94f5fd2f7c6a19c18f48b944493b69904adc96535cd7646040fe522b2492
|
|
7
|
+
data.tar.gz: 52f1f4aee6d4dec1bd9df6e5baaf2e76cef0f75d8587a55819f287fca354fc0d0e5f5cff884241f6b1b3d11cac61feb393ed6ec06d3811d26b6b4d562955972f
|
data/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,66 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
The format is [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html) — `MAJOR.MINOR.PATCH`. Consumer Rails apps install the released RubyGems package
|
|
3
|
+
The format is [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html) — `MAJOR.MINOR.PATCH`. Consumer Rails apps install the released RubyGems package and pin the floor each one needs — the pins differ on purpose, and every consumer records why beside its own. Bumping the gem version and updating consumer lockfiles is a release; `bin/release prepare` allocates the version and does both (see [`docs/RELEASE.md`](./docs/RELEASE.md)).
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
7
|
### Added
|
|
8
8
|
|
|
9
|
+
- **Geo — validation for every app, locking for the apps that need it.**
|
|
10
|
+
Turf Monster's geo stack, lifted into the engine and generalised from
|
|
11
|
+
US-states-only to country + subdivision. Full guide:
|
|
12
|
+
[`docs/GEO.md`](docs/GEO.md).
|
|
13
|
+
|
|
14
|
+
What ships:
|
|
15
|
+
|
|
16
|
+
- **`Studio::Geo`** — the pure half: normalization, the region-token
|
|
17
|
+
vocabulary, country flag glyphs, the freshness policy, and `blocked?`, the
|
|
18
|
+
whole blocking decision in one Rails-free method.
|
|
19
|
+
- **`Studio::GeoDetection`** — one `include` in `ApplicationController` gives
|
|
20
|
+
an app IP → region detection with a session cache, the `geo_country` /
|
|
21
|
+
`geo_state` / `geo_region_token` / `geo_blocked?` / `geo_override_active?`
|
|
22
|
+
helpers, and `require_geo_allowed`, the before_action an app hangs on
|
|
23
|
+
whatever it must not serve from a blocked location.
|
|
24
|
+
- **`Studio::GeoSetting`** (`studio_geo_settings`) — the operator's stored
|
|
25
|
+
policy: the kill switch, blocked countries, blocked regions. Install with
|
|
26
|
+
`bin/rails studio_engine:install:migrations && bin/rails db:migrate`.
|
|
27
|
+
- **`/admin/geo` + `/geo/check`** — the manager and the public detection probe.
|
|
28
|
+
Three cards: what the server thinks of you, a summary of what this app blocks
|
|
29
|
+
(flag chips plus the kill switch), and two editors behind a tab — the home
|
|
30
|
+
country's regions and all 249 countries, every square carrying its flag. It
|
|
31
|
+
answers a click immediately: squares paint from their own checkbox, the
|
|
32
|
+
summary follows the editor, and ticking your OWN region repaints the navbar
|
|
33
|
+
badge and the verdict tile before anything is saved. A simulator pins your
|
|
34
|
+
session to a blocked region so the blocked experience can be walked without
|
|
35
|
+
a VPN. **Opt-in** via `Studio.draw_geo_routes = true`: turf-monster owns all
|
|
36
|
+
four helper names today, and a duplicate route name raises while that app's
|
|
37
|
+
`routes.rb` loads, taking its whole route set down.
|
|
38
|
+
- **`components/_geo_badge` + the 52 US subdivision flags** (states + DC + PR,
|
|
39
|
+
~10 MB under `app/assets/images/state-flags/`), so an app gets the complete
|
|
40
|
+
badge from an empty repository. Non-US visitors render an emoji country
|
|
41
|
+
flag — shipping ~250 country SVGs for a 16px badge is not a trade worth
|
|
42
|
+
making.
|
|
43
|
+
- **Geocoder configured on boot** for every app that has the gem: ipinfo over
|
|
44
|
+
**HTTPS** (without which every lookup silently returns nothing and every geo
|
|
45
|
+
gate fails closed), a 3s timeout, and a `Rails.cache`-backed IP cache
|
|
46
|
+
(without which a shared-egress rate limit blanks every visitor). An app that
|
|
47
|
+
already configured Geocoder itself is **left alone** — the host wins, so a
|
|
48
|
+
gem bump cannot change a shipped app's IP provider. Opt out entirely with
|
|
49
|
+
`Studio.configure_geocoder = false`; `geocoder` is now a gem dependency.
|
|
50
|
+
|
|
51
|
+
Two rules worth reading before adopting:
|
|
52
|
+
|
|
53
|
+
**The region token.** `CA` is California *and* Canada, so the ban list stores
|
|
54
|
+
`US-WA`, never `WA`. Bare codes are accepted on input and normalized against
|
|
55
|
+
`Studio.geo_home_country`, so a checkbox grid and a legacy US-only list both
|
|
56
|
+
keep working.
|
|
57
|
+
|
|
58
|
+
**Fail closed.** An unplaceable *home-country* visitor is blocked — a blank
|
|
59
|
+
region could be any blocked region behind a VPN. Narrower than "block every
|
|
60
|
+
blank" on purpose: it fires only when subdivision rules for the home country
|
|
61
|
+
exist, and a *resolved foreign* country with no region stays allowed. Opt out
|
|
62
|
+
with `Studio.geo_fail_closed = false`.
|
|
63
|
+
|
|
9
64
|
- **The hold-to-confirm button, with its fizz — a new ACTION family in
|
|
10
65
|
`engine-motion.css`.** A press-and-hold CTA for an action a host does not want
|
|
11
66
|
taken by accident, ported from Turf Monster where it confirms a contest entry.
|
data/README.md
CHANGED
|
@@ -8,12 +8,24 @@ Shared Rails engine for McRitchie apps. Provides authentication, error handling,
|
|
|
8
8
|
|
|
9
9
|
```ruby
|
|
10
10
|
# Gemfile — install from RubyGems (recommended)
|
|
11
|
-
gem "studio-engine", "~> 0.
|
|
11
|
+
gem "studio-engine", "~> 0.56" # EXAMPLE — pin the floor YOUR app needs
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
Then `bundle install`.
|
|
14
|
+
Then `bundle install`. That number is an example, not a statement about the
|
|
15
|
+
current release: this README deliberately makes no such claim, because a
|
|
16
|
+
hand-written one rots silently — it read `v0.6.1` for fifty minors. For what is
|
|
17
|
+
live, see [RubyGems](https://rubygems.org/gems/studio-engine); for what changed,
|
|
18
|
+
[`CHANGELOG.md`](./CHANGELOG.md).
|
|
15
19
|
|
|
16
|
-
|
|
20
|
+
Pin the floor your app actually needs rather than copying the example. Each
|
|
21
|
+
consumer pins its own and records WHY beside it, and they differ on purpose. A
|
|
22
|
+
two-segment `~>` admits everything under `1.0`, so the pin documents the floor
|
|
23
|
+
rather than constraining the resolve — read the `Gemfile.lock` for what really
|
|
24
|
+
resolved.
|
|
25
|
+
|
|
26
|
+
> Published to RubyGems as of v0.4.0 (2026-05-17). New installs should use the
|
|
27
|
+
> RubyGems form, which all three consumer Rails apps (`mcritchie-studio`,
|
|
28
|
+
> `turf-monster`, `mcritchie-industries`) already use.
|
|
17
29
|
|
|
18
30
|
## What It Provides
|
|
19
31
|
|
|
@@ -24,6 +36,7 @@ Then `bundle install`. The current release is **v0.6.1**; see [`CHANGELOG.md`](.
|
|
|
24
36
|
- **Operator tooling**: Shared `studio/banners/environment` banner with Dev Mode + email connector controls, `studio/banners/impersonation`, and an opt-in `Studio::Impersonation` concern for Act As session conventions.
|
|
25
37
|
- **Sluggable concern**: `before_save :set_slug` with `to_param` for human-readable URLs
|
|
26
38
|
- **ThemeSetting model**: Per-app DB overrides with fallback to config defaults
|
|
39
|
+
- **Geo**: `Studio::GeoDetection` places every visitor (IP → country + subdivision, session-cached), `Studio::GeoSetting` stores the operator's blocked countries and regions, `require_geo_allowed` locks whichever surfaces an app chooses, and the shared badge + `/admin/geo` manager ship with it. See [`docs/GEO.md`](docs/GEO.md).
|
|
27
40
|
- **Transactional emails**: `Studio::EmailCatalog` — every email an app sends, its type, a live preview, and its banner — plus the shared `/admin/emails` page. Every app inherits the standard emails and their artwork on day one, and can register its own workflows and upload its own banners. See [Transactional emails](#transactional-emails).
|
|
28
41
|
|
|
29
42
|
## Configuration
|
|
@@ -105,7 +118,7 @@ Rails.application.routes.draw do
|
|
|
105
118
|
end
|
|
106
119
|
```
|
|
107
120
|
|
|
108
|
-
This draws the enabled auth routes (`/login`, `/signup`, `/logout`, `POST /magic_link` to request a link, `GET`/`POST /l/:token` for the link itself, Solana routes), OAuth callbacks, optional SSO routes, `/error_logs`, and `/admin/theme`. Magic-link emails point at the inert `GET /l/:token` confirmation page; the single-use token is burned only by the CSRF-protected `POST` to `link_consume_path`.
|
|
121
|
+
This draws the enabled auth routes (`/login`, `/signup`, `/logout`, `POST /magic_link` to request a link, `GET`/`POST /l/:token` for the link itself, Solana routes), OAuth callbacks, optional SSO routes, `/error_logs`, and `/admin/theme`. Set `Studio.draw_geo_routes = true` to add the geo manager (`/admin/geo`) and its public probe (`/geo/check`) — off by default because turf-monster owns those helper names until its adoption lands. Magic-link emails point at the inert `GET /l/:token` confirmation page; the single-use token is burned only by the CSRF-protected `POST` to `link_consume_path`.
|
|
109
122
|
|
|
110
123
|
**Magic links need the `studio_links` table.** Install it with `bin/rails studio_engine:install:migrations && bin/rails db:migrate` (install all of them) before enabling `:magic_link` — never by hand-copying the migration, which collides with the task's own copy on `class CreateStudioLinks`. Without the table, the first sign-in raises `Studio::Link::MissingTable`.
|
|
111
124
|
|
|
@@ -612,11 +625,13 @@ that touches that file. Update [`CHANGELOG.md`](./CHANGELOG.md) under
|
|
|
612
625
|
`Unreleased` (that is *not* gated), run `bin/release-check --build`, and open
|
|
613
626
|
your PR into `accepted`. That is the whole of your part.
|
|
614
627
|
|
|
615
|
-
**Conducting the release?**
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
each consumer's lock.
|
|
619
|
-
|
|
628
|
+
**Conducting the release?** Run `bin/release prepare` from mcritchie-studio and
|
|
629
|
+
let it allocate the version — it derives the bump, commits `lib/studio/version.rb`
|
|
630
|
+
with its `Gemfile.lock` onto **`origin/release`**, then publishes, tags, and bumps
|
|
631
|
+
each consumer's lock. **Do not set the version by hand.** A hand-set number makes
|
|
632
|
+
the allocation read the current version as already past the last tag and skip, so
|
|
633
|
+
the hand number silently wins over the derived one. Details and the exact commands
|
|
634
|
+
are in [`docs/RELEASE.md`](./docs/RELEASE.md).
|
|
620
635
|
|
|
621
636
|
**Semver guide** — the release *derives* the bump from its members (a `breaking`
|
|
622
637
|
risk tag → major, a `feature` → minor, otherwise patch), so this is what those
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1416" height="1000">
|
|
2
|
+
<rect width="1416" height="1000" fill="#0F204B"/>
|
|
3
|
+
<g id="bstar" transform="translate(1158,182) scale(52)" fill="#ffb612"><g id="cone">
|
|
4
|
+
<polygon id="triangle" points="0,0 0,1 .5,1" transform="translate(0,-1) rotate(18)"/><use xlink:href="#triangle" transform="scale(-1,1)" id="use5"/></g>
|
|
5
|
+
<use xlink:href="#cone" transform="rotate(72)" id="use1"/>
|
|
6
|
+
<use xlink:href="#cone" transform="rotate(-72)" id="use2"/>
|
|
7
|
+
<use xlink:href="#cone" transform="rotate(144)" id="use3"/>
|
|
8
|
+
<use xlink:href="#cone" transform="rotate(-144)" id="use4"/></g>
|
|
9
|
+
<g id="star" transform="translate (229,396) scale(31)" fill="#ffb612"><g id="cone">
|
|
10
|
+
<polygon id="triangle" points="0,0 0,1 .5,1" transform="translate(0,-1) rotate(18)"/>
|
|
11
|
+
<use xlink:href="#triangle" transform="scale(-1,1)" id="use5"/>
|
|
12
|
+
</g>
|
|
13
|
+
<use xlink:href="#cone" transform="rotate(72)" id="use1"/>
|
|
14
|
+
<use xlink:href="#cone" transform="rotate(-72)" id="use2"/>
|
|
15
|
+
<use xlink:href="#cone" transform="rotate(144)" id="use3"/>
|
|
16
|
+
<use xlink:href="#cone" transform="rotate(-144)" id="use4"/></g>
|
|
17
|
+
<use xlink:href="#star" transform="translate(167,62)"/>
|
|
18
|
+
<use xlink:href="#star" transform="translate(250,151)"/>
|
|
19
|
+
<use xlink:href="#star" transform="translate(334,244)"/>
|
|
20
|
+
<use xlink:href="#star" transform="translate(584,333)"/>
|
|
21
|
+
<use xlink:href="#star" transform="translate(323,375)"/>
|
|
22
|
+
<use xlink:href="#star" transform="translate(511,437)"/></svg>
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
3
|
+
<svg
|
|
4
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
|
5
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
6
|
+
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
7
|
+
version="1.0"
|
|
8
|
+
width="450"
|
|
9
|
+
height="300"
|
|
10
|
+
id="svg548">
|
|
11
|
+
<defs
|
|
12
|
+
id="defs550" />
|
|
13
|
+
<rect
|
|
14
|
+
width="450"
|
|
15
|
+
height="300"
|
|
16
|
+
x="0"
|
|
17
|
+
y="0"
|
|
18
|
+
id="rect552"
|
|
19
|
+
style="fill:#bf0a30" />
|
|
20
|
+
<path
|
|
21
|
+
d="M 37.49998,148.84088 L 224.22459,275 L 412.49999,148.59512 L 224.22459,24.999999 L 37.49998,148.84088 z"
|
|
22
|
+
id="path558"
|
|
23
|
+
style="fill:#002868" />
|
|
24
|
+
<path
|
|
25
|
+
d="M 83.99998,149.12834 L 224.41689,244 L 365.99999,148.94353 L 224.41689,56 L 83.99998,149.12834 z"
|
|
26
|
+
id="path2508"
|
|
27
|
+
style="fill:#fff" />
|
|
28
|
+
<path
|
|
29
|
+
d="M 148.17531,145.0139 L 156.01008,145.0139 L 157.37008,149.38954 L 162.1892,149.38954 L 154.70921,128.16175 L 149.59444,128.16175 L 142.02575,149.38954 L 146.69705,149.38954 L 148.17531,145.0139 z M 152.07791,132.9513 L 152.13705,132.9513 L 154.76834,141.34781 L 149.35792,141.34781 L 152.07791,132.9513 z M 165.04714,149.38954 L 169.39322,149.38954 L 169.39322,141.08173 L 173.97582,141.08173 C 175.5557,141.06819 176.54243,141.37616 176.93603,142.00564 C 177.32961,142.63514 177.49591,143.66745 177.43495,145.10259 C 177.43616,146.17556 177.47805,147.03788 177.5606,147.68954 C 177.64312,148.34121 177.75892,148.90788 177.90799,149.38954 L 182.81581,149.38954 L 182.81581,148.8278 C 182.36246,148.69045 182.08651,148.32951 181.98798,147.74498 C 181.88941,147.16045 181.84999,146.11212 181.86972,144.59998 C 181.86662,142.69057 181.63626,141.39463 181.17864,140.71216 C 180.72097,140.02971 180.05453,139.53203 179.17929,139.21912 C 180.23438,138.84403 181.04373,138.20468 181.60733,137.30108 C 182.1709,136.39751 182.45546,135.35164 182.46103,134.16348 C 182.48309,133.51233 182.32395,132.7221 181.9836,131.79279 C 181.64322,130.86351 180.98914,130.03605 180.02135,129.31041 C 179.05353,128.5848 177.63952,128.20192 175.7793,128.16175 L 165.04714,128.16175 L 165.04714,149.38954 z M 169.39322,137.50434 L 169.39322,131.82783 L 174.92191,131.82783 C 176.1895,131.87343 177.03211,132.19618 177.44973,132.79609 C 177.86732,133.39603 178.05949,133.99965 178.02625,134.60695 C 178.02747,135.64606 177.74413,136.39135 177.17625,136.84282 C 176.60834,137.29432 175.74849,137.51482 174.59669,137.50434 L 169.39322,137.50434 z M 191.17287,142.2052 L 193.24243,140.07651 L 199.8059,149.38954 L 205.51197,149.38954 L 196.34677,136.85391 L 205.00937,128.16175 L 199.27373,128.16175 L 191.17287,136.79478 L 191.17287,128.16175 L 186.73809,128.16175 L 186.73809,149.38954 L 191.17287,149.38954 L 191.17287,142.2052 z M 212.27251,145.0139 L 220.10729,145.0139 L 221.46728,149.38954 L 226.2864,149.38954 L 218.80641,128.16175 L 213.69164,128.16175 L 206.12296,149.38954 L 210.79425,149.38954 L 212.27251,145.0139 z M 216.17512,132.9513 L 216.23424,132.9513 L 218.86554,141.34781 L 213.45512,141.34781 L 216.17512,132.9513 z M 242.09388,142.94433 L 242.03476,142.94433 L 233.60868,128.16175 L 228.93739,128.16175 L 228.93739,149.38954 L 233.0765,149.38954 L 233.0765,134.25217 L 233.13563,134.25217 L 241.79824,149.38954 L 246.23301,149.38954 L 246.23301,128.16175 L 242.09388,128.16175 L 242.09388,142.94433 z M 249.41616,142.85564 C 249.38477,143.77162 249.59538,144.77464 250.04798,145.86472 C 250.50058,146.9548 251.38352,147.89869 252.6968,148.6964 C 254.01007,149.49411 255.94203,149.91241 258.49267,149.95128 C 259.18233,149.98377 260.18134,149.85638 261.4897,149.56912 C 262.79804,149.28187 264.00291,148.63983 265.10432,147.64301 C 266.20569,146.64619 266.79079,145.09968 266.85962,143.00346 C 266.80909,141.14148 266.24488,139.80243 265.16701,138.9863 C 264.08909,138.17018 262.80055,137.60722 261.30137,137.29739 L 256.12746,136.02608 C 255.64578,135.94664 255.16042,135.75816 254.67137,135.46065 C 254.18231,135.16316 253.91869,134.61251 253.88051,133.8087 C 253.92915,132.86201 254.33444,132.19803 255.09637,131.81674 C 255.85828,131.43549 256.68487,131.25194 257.57615,131.26609 C 259.44429,131.34002 260.63798,131.75393 261.15723,132.50783 C 261.67646,133.26175 261.93146,133.91219 261.92223,134.45913 L 266.17962,134.45913 C 266.18854,133.5554 265.95056,132.57719 265.46567,131.52451 C 264.98075,130.47186 264.13613,129.56374 262.93182,128.80013 C 261.72749,128.03657 260.05067,127.63653 257.90137,127.60001 C 255.63196,127.6369 253.90623,128.02635 252.72418,128.76838 C 251.54211,129.51045 250.74276,130.3839 250.32611,131.38873 C 249.90946,132.3936 249.71455,133.30866 249.74138,134.13391 C 249.80789,136.38765 250.50268,137.91149 251.82572,138.70543 C 253.14876,139.49938 254.70093,140.05496 256.48223,140.37216 L 258.75876,140.90434 C 259.90193,141.14333 260.82337,141.44145 261.5231,141.79868 C 262.2228,142.15594 262.5825,142.73492 262.60223,143.53564 C 262.54863,144.63325 262.07189,145.37238 261.17202,145.75303 C 260.27211,146.13368 259.27059,146.31107 258.16745,146.2852 C 256.2876,146.21622 255.05818,145.79245 254.4792,145.0139 C 253.90021,144.23535 253.63166,143.51593 253.67355,142.85564 L 249.41616,142.85564 z M 274.75285,145.0139 L 282.58762,145.0139 L 283.94762,149.38954 L 288.76674,149.38954 L 281.28675,128.16175 L 276.17197,128.16175 L 268.60329,149.38954 L 273.27459,149.38954 L 274.75285,145.0139 z M 278.65545,132.9513 L 278.71458,132.9513 L 281.34588,141.34781 L 275.93545,141.34781 L 278.65545,132.9513 z M 290.53076,142.85564 C 290.49937,143.77162 290.70998,144.77464 291.16258,145.86472 C 291.61518,146.9548 292.49812,147.89869 293.8114,148.6964 C 295.12467,149.49411 297.05663,149.91241 299.60727,149.95128 C 300.29693,149.98377 301.29594,149.85638 302.6043,149.56912 C 303.91264,149.28187 305.11751,148.63983 306.21892,147.64301 C 307.32029,146.64619 307.90539,145.09968 307.97422,143.00346 C 307.92369,141.14148 307.35949,139.80243 306.28161,138.9863 C 305.20369,138.17018 303.91515,137.60722 302.41597,137.29739 L 297.24206,136.02608 C 296.76038,135.94664 296.27502,135.75816 295.78597,135.46065 C 295.29691,135.16316 295.03329,134.61251 294.99511,133.8087 C 295.04375,132.86201 295.44904,132.19803 296.21097,131.81674 C 296.97288,131.43549 297.79947,131.25194 298.69075,131.26609 C 300.55889,131.34002 301.75258,131.75393 302.27183,132.50783 C 302.79106,133.26175 303.04606,133.91219 303.03683,134.45913 L 307.29422,134.45913 C 307.30314,133.5554 307.06516,132.57719 306.58027,131.52451 C 306.09535,130.47186 305.25073,129.56374 304.04642,128.80013 C 302.84209,128.03657 301.16527,127.63653 299.01597,127.60001 C 296.74656,127.6369 295.02083,128.02635 293.83878,128.76838 C 292.65671,129.51045 291.85736,130.3839 291.44071,131.38873 C 291.02406,132.3936 290.82915,133.30866 290.85598,134.13391 C 290.92249,136.38765 291.61728,137.91149 292.94032,138.70543 C 294.26336,139.49938 295.81553,140.05496 297.59683,140.37216 L 299.87336,140.90434 C 301.01653,141.14333 301.93798,141.44145 302.6377,141.79868 C 303.3374,142.15594 303.6971,142.73492 303.71683,143.53564 C 303.66323,144.63325 303.18649,145.37238 302.28662,145.75303 C 301.38672,146.13368 300.38519,146.31107 299.28205,146.2852 C 297.4022,146.21622 296.17278,145.79245 295.5938,145.0139 C 295.01481,144.23535 294.74626,143.51593 294.78815,142.85564 L 290.53076,142.85564 z"
|
|
30
|
+
id="flowRoot2413"
|
|
31
|
+
style="font-size:28px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#002868;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Bold" />
|
|
32
|
+
<path
|
|
33
|
+
d="M 229.48396,49.981066 L 223.96299,45.981502 L 218.45203,50 L 220.54659,43.508953 L 215.02499,39.505124 L 221.84047,39.493001 L 223.9389,33 L 226.0565,39.483554 L 232.87499,39.474488 L 227.36831,43.49367 L 229.48396,49.981066 z"
|
|
34
|
+
id="polygon560"
|
|
35
|
+
style="fill:#fff" />
|
|
36
|
+
<path
|
|
37
|
+
d="M 234.96407,190 L 224.99958,197.08113 L 215.02363,190.00635 L 218.8335,201.45872 L 208.86785,208.54737 L 221.18701,208.5442 L 225.00387,220 L 228.80753,208.54568 L 241.13212,208.53711 L 231.16391,201.46111 L 234.96407,190 z"
|
|
38
|
+
id="path2417"
|
|
39
|
+
style="fill:#002868" />
|
|
40
|
+
<path
|
|
41
|
+
d="M 202.6998,190 L 192.73531,182.91888 L 182.75936,189.99365 L 186.56923,178.54129 L 176.60358,171.45265 L 188.92274,171.4558 L 192.7396,160 L 196.54326,171.45432 L 208.86785,171.46291 L 198.89964,178.5389 L 202.6998,190 z"
|
|
42
|
+
id="path2421"
|
|
43
|
+
style="fill:#002868" />
|
|
44
|
+
<path
|
|
45
|
+
d="M 215.98107,243.54103 L 211.9815,249.062 L 216,254.57296 L 209.50896,252.4784 L 205.50513,258 L 205.49301,251.18452 L 199,249.0861 L 205.48356,246.96849 L 205.47449,240.15 L 209.49367,245.65668 L 215.98107,243.54103 z"
|
|
46
|
+
id="path3655"
|
|
47
|
+
style="fill:#fff" />
|
|
48
|
+
<path
|
|
49
|
+
d="M 233.01893,243.54103 L 237.0185,249.062 L 233,254.57296 L 239.49104,252.4784 L 243.49487,258 L 243.50699,251.18452 L 250,249.0861 L 243.51644,246.96849 L 243.52551,240.15 L 239.50633,245.65668 L 233.01893,243.54103 z"
|
|
50
|
+
id="path3694"
|
|
51
|
+
style="fill:#fff" />
|
|
52
|
+
<use
|
|
53
|
+
transform="translate(64.52842,0)"
|
|
54
|
+
id="use2413"
|
|
55
|
+
x="0"
|
|
56
|
+
y="0"
|
|
57
|
+
width="450"
|
|
58
|
+
height="300"
|
|
59
|
+
xlink:href="#path2421" />
|
|
60
|
+
<use
|
|
61
|
+
transform="translate(-32.26415,-85)"
|
|
62
|
+
id="use2415"
|
|
63
|
+
x="0"
|
|
64
|
+
y="0"
|
|
65
|
+
width="450"
|
|
66
|
+
height="300"
|
|
67
|
+
xlink:href="#use2413" />
|
|
68
|
+
<use
|
|
69
|
+
transform="translate(151.47776,-119)"
|
|
70
|
+
id="use2414"
|
|
71
|
+
x="0"
|
|
72
|
+
y="0"
|
|
73
|
+
width="450"
|
|
74
|
+
height="300"
|
|
75
|
+
xlink:href="#path3655" />
|
|
76
|
+
<use
|
|
77
|
+
transform="translate(-27,-18)"
|
|
78
|
+
id="use2416"
|
|
79
|
+
x="0"
|
|
80
|
+
y="0"
|
|
81
|
+
width="450"
|
|
82
|
+
height="300"
|
|
83
|
+
xlink:href="#use2414" />
|
|
84
|
+
<use
|
|
85
|
+
transform="translate(-27,-18)"
|
|
86
|
+
id="use2418"
|
|
87
|
+
x="0"
|
|
88
|
+
y="0"
|
|
89
|
+
width="450"
|
|
90
|
+
height="300"
|
|
91
|
+
xlink:href="#use2416" />
|
|
92
|
+
<use
|
|
93
|
+
transform="translate(-27,-17)"
|
|
94
|
+
id="use2420"
|
|
95
|
+
x="0"
|
|
96
|
+
y="0"
|
|
97
|
+
width="450"
|
|
98
|
+
height="300"
|
|
99
|
+
xlink:href="#use2418" />
|
|
100
|
+
<use
|
|
101
|
+
transform="translate(-27,-18)"
|
|
102
|
+
id="use2422"
|
|
103
|
+
x="0"
|
|
104
|
+
y="0"
|
|
105
|
+
width="450"
|
|
106
|
+
height="300"
|
|
107
|
+
xlink:href="#use2420" />
|
|
108
|
+
<use
|
|
109
|
+
transform="translate(-163.47776,108)"
|
|
110
|
+
id="use2424"
|
|
111
|
+
x="0"
|
|
112
|
+
y="0"
|
|
113
|
+
width="450"
|
|
114
|
+
height="300"
|
|
115
|
+
xlink:href="#use2422" />
|
|
116
|
+
<use
|
|
117
|
+
transform="translate(24,16)"
|
|
118
|
+
id="use2426"
|
|
119
|
+
x="0"
|
|
120
|
+
y="0"
|
|
121
|
+
width="450"
|
|
122
|
+
height="300"
|
|
123
|
+
xlink:href="#use2424" />
|
|
124
|
+
<use
|
|
125
|
+
transform="translate(24,16)"
|
|
126
|
+
id="use2428"
|
|
127
|
+
x="0"
|
|
128
|
+
y="0"
|
|
129
|
+
width="450"
|
|
130
|
+
height="300"
|
|
131
|
+
xlink:href="#use2426" />
|
|
132
|
+
<use
|
|
133
|
+
transform="translate(24,17)"
|
|
134
|
+
id="use2430"
|
|
135
|
+
x="0"
|
|
136
|
+
y="0"
|
|
137
|
+
width="450"
|
|
138
|
+
height="300"
|
|
139
|
+
xlink:href="#use2428" />
|
|
140
|
+
<use
|
|
141
|
+
transform="translate(24,16)"
|
|
142
|
+
id="use2432"
|
|
143
|
+
x="0"
|
|
144
|
+
y="0"
|
|
145
|
+
width="450"
|
|
146
|
+
height="300"
|
|
147
|
+
xlink:href="#use2430" />
|
|
148
|
+
<use
|
|
149
|
+
transform="translate(-144,-99.075)"
|
|
150
|
+
id="use2434"
|
|
151
|
+
x="0"
|
|
152
|
+
y="0"
|
|
153
|
+
width="450"
|
|
154
|
+
height="300"
|
|
155
|
+
xlink:href="#path3655" />
|
|
156
|
+
<use
|
|
157
|
+
transform="translate(-151,-119)"
|
|
158
|
+
id="use2460"
|
|
159
|
+
x="0"
|
|
160
|
+
y="0"
|
|
161
|
+
width="450"
|
|
162
|
+
height="300"
|
|
163
|
+
xlink:href="#path3694" />
|
|
164
|
+
<use
|
|
165
|
+
transform="translate(26.999998,-18)"
|
|
166
|
+
id="use2462"
|
|
167
|
+
x="0"
|
|
168
|
+
y="0"
|
|
169
|
+
width="450"
|
|
170
|
+
height="300"
|
|
171
|
+
xlink:href="#use2460" />
|
|
172
|
+
<use
|
|
173
|
+
transform="translate(27,-18)"
|
|
174
|
+
id="use2464"
|
|
175
|
+
x="0"
|
|
176
|
+
y="0"
|
|
177
|
+
width="450"
|
|
178
|
+
height="300"
|
|
179
|
+
xlink:href="#use2462" />
|
|
180
|
+
<use
|
|
181
|
+
transform="translate(27,-17)"
|
|
182
|
+
id="use2466"
|
|
183
|
+
x="0"
|
|
184
|
+
y="0"
|
|
185
|
+
width="450"
|
|
186
|
+
height="300"
|
|
187
|
+
xlink:href="#use2464" />
|
|
188
|
+
<use
|
|
189
|
+
transform="translate(27,-18)"
|
|
190
|
+
id="use2468"
|
|
191
|
+
x="0"
|
|
192
|
+
y="0"
|
|
193
|
+
width="450"
|
|
194
|
+
height="300"
|
|
195
|
+
xlink:href="#use2466" />
|
|
196
|
+
<use
|
|
197
|
+
transform="translate(187,90.925)"
|
|
198
|
+
id="use2470"
|
|
199
|
+
x="0"
|
|
200
|
+
y="0"
|
|
201
|
+
width="450"
|
|
202
|
+
height="300"
|
|
203
|
+
xlink:href="#use2468" />
|
|
204
|
+
<use
|
|
205
|
+
transform="translate(-24,17.075)"
|
|
206
|
+
id="use2472"
|
|
207
|
+
x="0"
|
|
208
|
+
y="0"
|
|
209
|
+
width="450"
|
|
210
|
+
height="300"
|
|
211
|
+
xlink:href="#use2470" />
|
|
212
|
+
<use
|
|
213
|
+
transform="translate(-24,16)"
|
|
214
|
+
id="use2474"
|
|
215
|
+
x="0"
|
|
216
|
+
y="0"
|
|
217
|
+
width="450"
|
|
218
|
+
height="300"
|
|
219
|
+
xlink:href="#use2472" />
|
|
220
|
+
<use
|
|
221
|
+
transform="translate(-24,16)"
|
|
222
|
+
id="use2476"
|
|
223
|
+
x="0"
|
|
224
|
+
y="0"
|
|
225
|
+
width="450"
|
|
226
|
+
height="300"
|
|
227
|
+
xlink:href="#use2474" />
|
|
228
|
+
<use
|
|
229
|
+
transform="translate(-24,17)"
|
|
230
|
+
id="use2478"
|
|
231
|
+
x="0"
|
|
232
|
+
y="0"
|
|
233
|
+
width="450"
|
|
234
|
+
height="300"
|
|
235
|
+
xlink:href="#use2476" />
|
|
236
|
+
<use
|
|
237
|
+
transform="translate(-24,16)"
|
|
238
|
+
id="use2480"
|
|
239
|
+
x="0"
|
|
240
|
+
y="0"
|
|
241
|
+
width="450"
|
|
242
|
+
height="300"
|
|
243
|
+
xlink:href="#use2478" />
|
|
244
|
+
</svg>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg width="900" height="600" viewBox="-288 -192 576 384" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
3
|
+
<path fill="#002868" d="M-288-192h576v384h-576z"/>
|
|
4
|
+
<path fill="#bf0a30" d="M-288-192h576v192h-576z"/>
|
|
5
|
+
<path id="a" d="M288-147v80L0 0zM139-192h83L0 0zM27-192h48L0 0z" fill="#fed700"/>
|
|
6
|
+
<use xlink:href="#a" transform="scale(-1 1)"/>
|
|
7
|
+
<path d="M0-96 62.384582 96-100.689662-23.424331H100.689662L-62.384582 96z" fill="#ce5c17"/>
|
|
8
|
+
</svg>
|