From 8a59f850d1bb5b1345f16c67fb404c9cbdef9419 Mon Sep 17 00:00:00 2001 From: Daniel Lautzenheiser Date: Sun, 2 Oct 2022 20:06:20 -0400 Subject: [PATCH] Feature/rebrand (#27) --- .eslintrc.js | 2 +- CODE_OF_CONDUCT.md | 2 +- CONTRIBUTING.md | 14 +- README.md | 34 +- babel.config.js | 2 +- dev-test/index.html | 10 +- index.d.ts | 2 +- package.json | 10 +- simple-cms-logo.png | Bin 67986 -> 67250 bytes src/actions/config.ts | 8 +- src/backend.ts | 2 +- src/backends/azure/index.ts | 2 +- src/backends/bitbucket/index.ts | 2 +- src/backends/git-gateway/implementation.ts | 4 +- src/backends/git-gateway/index.ts | 2 +- src/backends/github/API.ts | 14 +- src/backends/github/index.ts | 2 +- src/backends/gitlab/index.ts | 2 +- src/backends/proxy/AuthenticationPage.js | 2 +- src/backends/proxy/index.ts | 2 +- src/backends/test/AuthenticationPage.js | 2 +- src/backends/test/index.ts | 2 +- src/bootstrap.js | 4 +- src/components/UI/ErrorBoundary.js | 8 +- src/components/UI/SettingsDropdown.js | 2 +- src/editor-components/image/index.js | 2 +- src/lib/auth/index.js | 2 +- src/lib/auth/pkce-oauth.js | 2 +- src/lib/auth/utils.js | 6 +- src/lib/util/index.ts | 2 +- src/lib/widgets/index.ts | 2 +- src/media-libraries/cloudinary/index.js | 2 +- src/media-libraries/uploadcare/index.js | 6 +- src/reducers/collections.ts | 2 +- src/reducers/entries.ts | 4 +- src/ui/AuthenticationPage.js | 6 +- src/ui/Icon/images/_index.js | 4 +- src/ui/Icon/images/simple-cms-logo.svg | 943 ----------------- src/ui/Icon/images/static-cms-logo.svg | 995 ++++++++++++++++++ src/ui/index.js | 2 +- src/widgets/boolean/index.js | 4 +- src/widgets/code/index.js | 4 +- src/widgets/colorstring/index.js | 4 +- src/widgets/datetime/index.js | 4 +- src/widgets/file/index.js | 4 +- src/widgets/file/withFileControl.js | 2 +- src/widgets/image/index.js | 8 +- src/widgets/list/ListControl.js | 4 +- src/widgets/list/index.js | 8 +- src/widgets/map/index.js | 4 +- src/widgets/markdown/index.js | 4 +- src/widgets/number/index.js | 4 +- src/widgets/object/index.js | 4 +- src/widgets/relation/index.js | 4 +- src/widgets/select/index.js | 4 +- src/widgets/string/index.tsx | 4 +- src/widgets/text/index.js | 4 +- tsconfig.json | 2 +- webpack.config.js | 6 +- website/README.md | 4 +- website/content/blog/welcome-to-simple-cms.md | 8 +- website/content/docs/add-to-your-site.md | 36 +- website/content/docs/architecture.md | 2 +- website/content/docs/azure-backend.md | 4 +- website/content/docs/backends-overview.md | 4 +- website/content/docs/beta-features.md | 24 +- website/content/docs/bitbucket-backend.md | 6 +- website/content/docs/cloudinary.md | 16 +- website/content/docs/collection-types.md | 2 +- website/content/docs/configuration-options.md | 18 +- website/content/docs/contributor-guide.md | 24 +- website/content/docs/custom-widgets.md | 42 +- website/content/docs/customization.md | 10 +- website/content/docs/docusaurus.md | 18 +- website/content/docs/examples.md | 10 +- website/content/docs/gatsby.md | 10 +- website/content/docs/git-gateway-backend.md | 6 +- website/content/docs/github-backend.md | 6 +- website/content/docs/gitlab-backend.md | 12 +- website/content/docs/gridsome.md | 14 +- website/content/docs/hugo.md | 22 +- website/content/docs/intro.md | 8 +- website/content/docs/jekyll.md | 34 +- website/content/docs/middleman.md | 14 +- website/content/docs/netlify-large-media.md | 12 +- website/content/docs/nextjs.md | 20 +- website/content/docs/nuxt.md | 14 +- website/content/docs/releases.md | 2 +- .../content/docs/site-generator-overview.md | 16 +- website/content/docs/start-with-a-template.md | 14 +- website/content/docs/test-backend.md | 4 +- website/content/docs/uploadcare.md | 18 +- website/content/docs/widgets.md | 6 +- website/content/docs/widgets/markdown.md | 2 +- website/content/docs/writing-style-guide.md | 4 +- website/content/pages/community.md | 14 +- website/data/global.yaml | 4 +- website/data/landing.yaml | 10 +- website/data/notifications.yml | 2 +- website/data/updates.yml | 2 +- website/gatsby-config.js | 8 +- website/package.json | 6 +- website/site.yml | 4 +- website/src/components/chat-button.js | 2 +- website/src/components/docsearch.js | 2 +- website/src/components/footer.js | 4 +- website/src/components/github-button.js | 6 +- website/src/components/header.js | 4 +- website/src/components/release.js | 2 +- website/src/components/twitter-meta.js | 2 +- website/src/components/video-embed.js | 4 +- website/src/html.js | 4 +- website/src/img/simple-cms-logo.svg | 921 ---------------- website/src/img/static-cms-logo.svg | 995 ++++++++++++++++++ website/src/pages/blog.js | 4 +- website/static/_redirects | 4 +- website/static/admin/config.yml | 2 +- 117 files changed, 2398 insertions(+), 2272 deletions(-) delete mode 100644 src/ui/Icon/images/simple-cms-logo.svg create mode 100644 src/ui/Icon/images/static-cms-logo.svg delete mode 100644 website/src/img/simple-cms-logo.svg create mode 100644 website/src/img/static-cms-logo.svg diff --git a/.eslintrc.js b/.eslintrc.js index 08ef4fb0..753acb04 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -17,7 +17,7 @@ module.exports = { 'cypress/globals': true, }, globals: { - SIMPLE_CMS_CORE_VERSION: false, + STATIC_CMS_CORE_VERSION: false, CMS_ENV: false, }, rules: { diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 1f05c65a..ee29d2e4 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -55,7 +55,7 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at simplecmsorg@gmail.com. All +reported by contacting the project team at staticjscms@gmail.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 64aca1a3..046a6fbe 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ Contributions are always welcome, no matter how large or small. Before contributing, please read the [code of conduct](CODE_OF_CONDUCT.md). -For details on contributing to documentation, see [Website Directory Readme](https://github.com/SimpleCMS/simple-cms/blob/main/website/README.md). +For details on contributing to documentation, see [Website Directory Readme](https://github.com/StaticJsCMS/static-cms/blob/main/website/README.md). ## Setup @@ -14,8 +14,8 @@ For details on contributing to documentation, see [Website Directory Readme](htt > Only required on the first run, subsequent runs can use `yarn start` to both bootstrap and run the development server. ```sh -git clone https://github.com/SimpleCMS/simple-cms -cd simple-cms +git clone https://github.com/StaticJsCMS/static-cms +cd static-cms yarn ``` @@ -45,7 +45,7 @@ yarn clean ### build -Runs the `clean` script and builds the simple-cms-core. +Runs the `clean` script and builds the static-cms-core. ```sh yarn build @@ -65,7 +65,7 @@ We actively welcome your pull requests! If you need help with Git or our workflow, please ask. We want your contributions even if you're just learning Git. Our maintainers are happy to help! -Simple CMS uses the [Forking Workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow) + [Feature Branches](https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow). Additionally, PR's should be [rebased](https://www.atlassian.com/git/tutorials/merging-vs-rebasing) on main when opened, and again before merging. +Static CMS uses the [Forking Workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow) + [Feature Branches](https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow). Additionally, PR's should be [rebased](https://www.atlassian.com/git/tutorials/merging-vs-rebasing) on main when opened, and again before merging. 1. Fork the repo. 2. Create a branch from `main`. If you're addressing a specific issue, prefix your branch name with the issue number. @@ -95,7 +95,7 @@ backend: When debugging the CMS with Git Gateway you must: -1. Have a Netlify site with [Git Gateway](https://docs.netlify.com/visitor-access/git-gateway/) and [Netlify Identity](https://docs.netlify.com/visitor-access/identity/) enabled. An easy way to create such a site is to use a [template](https://www.simplecms.github.io/simple-cms/docs/start-with-a-template/), for example the [Gatsby template](https://app.netlify.com/start/deploy?repository=https://github.com/AustinGreen/gatsby-starter-netlify-cms&stack=cms) +1. Have a Netlify site with [Git Gateway](https://docs.netlify.com/visitor-access/git-gateway/) and [Netlify Identity](https://docs.netlify.com/visitor-access/identity/) enabled. An easy way to create such a site is to use a [template](https://www.staticjscms.github.io/static-cms/docs/start-with-a-template/), for example the [Gatsby template](https://app.netlify.com/start/deploy?repository=https://github.com/AustinGreen/gatsby-starter-netlify-cms&stack=cms) 2. Tell the CMS the URL of your Netlify site using a local storage item. To do so: 1. Open `http://localhost:8080/` in the browser @@ -106,4 +106,4 @@ When debugging the CMS with Git Gateway you must: ## License -By contributing to Simple CMS, you agree that your contributions will be licensed under its [MIT license](LICENSE). +By contributing to Static CMS, you agree that your contributions will be licensed under its [MIT license](LICENSE). diff --git a/README.md b/README.md index 44a34f39..04ba530d 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@
- + -[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/SimpleCMS/simple-cms/blob/main/LICENSE) -[![npm latest package](https://img.shields.io/npm/v/@simplecms/simple-cms-core/latest.svg)](https://www.npmjs.com/package/@simplecms/simple-cms-core) -[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/SimpleCMS/simple-cms/blob/main/CONTRIBUTING.md) +[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/StaticJsCMS/static-cms/blob/main/LICENSE) +[![npm latest package](https://img.shields.io/npm/v/@staticcms/core/latest.svg)](https://www.npmjs.com/package/@staticcms/core) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/StaticJsCMS/static-cms/blob/main/CONTRIBUTING.md)
-[simplecms.github.io/simple-cms](https://www.simplecms.github.io/simple-cms/) +[staticjscms.github.io/static-cms](https://www.staticjscms.github.io/static-cms/) A CMS for static site generators. Give users a simple way to edit and add content to any site built with a static site generator. @@ -16,7 +16,7 @@ and add content to any site built with a static site generator. ## How It Works -Simple CMS is a single-page app that you pull into the `/admin` part of your site. +Static CMS is a single-page app that you pull into the `/admin` part of your site. It presents a clean UI for editing content stored in a Git repository. @@ -26,21 +26,21 @@ tweak the main layout of the CMS a bit to fit your own site. When a user navigates to `/admin/` they'll be prompted to log in, and once authenticated they'll be able to create new content or edit existing content. -Read more about Simple CMS [Core Concepts](https://www.simplecms.github.io/simple-cms/docs/intro/). +Read more about Static CMS [Core Concepts](https://www.staticjscms.github.io/static-cms/docs/intro/). # Installation and Configuration -The Simple CMS can be used in two different ways. +The Static CMS can be used in two different ways. * A Quick and easy install, that requires you to create a single HTML file and a configuration file. All the CMS JavaScript and CSS are loaded from a CDN. - To learn more about this installation method, refer to the [Quick Start Guide](https://www.simplecms.github.io/simple-cms/docs/quick-start/) + To learn more about this installation method, refer to the [Quick Start Guide](https://www.staticjscms.github.io/static-cms/docs/quick-start/) * A complete, more complex install, that gives you more flexibility but requires that you use a static site builder with a build system that supports npm packages. -# simple-cms-core +# static-cms-core ## Installation -`npm install @simplecms/simple-cms-core` +`npm install @staticcms/core` ## Setup @@ -62,7 +62,7 @@ import { ListWidget, MapWidget, MarkdownWidget, - SimpleCmsCore as CMS, + StaticCmsCore as CMS, NumberWidget, ObjectWidget, ProxyBackend, @@ -74,7 +74,7 @@ import { locales, Icon, images -} from '@simple-cms/simple-cms-core'; +} from '@static-cms/static-cms-core'; // Register all the things CMS.registerBackend('git-gateway', GitGatewayBackend); @@ -117,20 +117,20 @@ Object.keys(images).forEach(iconName => { # Contributing -New contributors are always welcome! Check out [CONTRIBUTING.md](https://github.com/SimpleCMS/simple-cms/blob/main/CONTRIBUTING.md) to get involved. +New contributors are always welcome! Check out [CONTRIBUTING.md](https://github.com/StaticJsCMS/static-cms/blob/main/CONTRIBUTING.md) to get involved. # Change Log This project adheres to [Semantic Versioning](http://semver.org/). -Every release is documented on the Github [Releases](https://github.com/SimpleCMS/simple-cms/releases) page. +Every release is documented on the Github [Releases](https://github.com/StaticJsCMS/static-cms/releases) page. # License -Simple CMS is released under the [MIT License](LICENSE). +Static CMS is released under the [MIT License](LICENSE). Please make sure you understand its [implications and guarantees](https://writing.kemitchell.com/2016/09/21/MIT-License-Line-by-Line.html). # Netlify CMS -Simple CMS is a fork of Netlify CMS focusing on the core product over adding massive new features. +Static CMS is a fork of Netlify CMS focusing on the core product over adding massive new features. # Thanks diff --git a/babel.config.js b/babel.config.js index 2c0814c9..e5dd9da8 100644 --- a/babel.config.js +++ b/babel.config.js @@ -59,7 +59,7 @@ function plugins() { [ 'transform-define', { - SIMPLE_CMS_CORE_VERSION: `${coreVersion}`, + STATIC_CMS_CORE_VERSION: `${coreVersion}`, }, ], [ diff --git a/dev-test/index.html b/dev-test/index.html index b93ce3e6..883ec515 100644 --- a/dev-test/index.html +++ b/dev-test/index.html @@ -3,7 +3,7 @@ - Simple CMS Development Test + Static CMS Development Test - + diff --git a/index.d.ts b/index.d.ts index d43d953f..807f0f80 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -declare module '@simplecms/simple-cms-core' { +declare module '@staticcms/core' { import type { Iterable as ImmutableIterable, List, Map } from 'immutable'; import type { ComponentType, FocusEventHandler, ReactNode } from 'react'; import type { t } from 'react-polyglot'; diff --git a/package.json b/package.json index 62f64e48..4c94039d 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { - "name": "@simplecms/simple-cms-core", + "name": "@staticcms/core", "version": "0.2.0", "license": "MIT", - "description": "Simple CMS core application.", - "repository": "https://github.com/SimpleCMS/simple-cms", - "bugs": "https://github.com/SimpleCMS/simple-cms/issues", + "description": "Static CMS core application.", + "repository": "https://github.com/StaticJsCMS/static-cms", + "bugs": "https://github.com/StaticJsCMS/static-cms/issues", "keywords": [ "simple", "cms", @@ -27,7 +27,7 @@ "start": "run-s clean develop" }, "module": "dist/esm/index.js", - "main": "dist/simple-cms-core.js", + "main": "dist/static-cms-core.js", "files": [ "src/", "dist/", diff --git a/simple-cms-logo.png b/simple-cms-logo.png index cb7e548e424fbee49af56345fe1ec44dd2bb0afc..56b67bffb67a90d85060d3e32c6fcbffea36913b 100644 GIT binary patch literal 67250 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듉R+*=gcs?f3>$e}Z z{IqC@68zIqV;_BuBK!Ku22(~G#NUz@5-?P7yU49fh2ptjAX_}Vj?!mlKn78A!REak zrLU(S))PbPR^#mw6FXRHNrmbz2SD~?YrQWXSpxaBa+Rj58)RQ2oA2eMzs>XUErw=< z*QXt9LM8s(0LuaO*raga2=Psom{}~3%(TZE8?Db3*}+o~>)CYTQQ<+u@`QV_;M#)4 zHYK+}FF)p{A4i)CHk_KJqKa~;n9^d(u4Xd;h|Az zFMn?QY7<`aGmm)q9Cs2j(asuZu%ADHcZp_EeOEdS4M5WPfpBFlGnmfS_oKolwEx-j z{iPMC1z+!rtTLZ80d||TUUwHf(-Qf_>M|&(!jBqL-?Tv0p zAVJV)h|dK*#>08y?1h4Ee*Ojw$Lrud;efGUnl%fznBjK&^p!g~_U&Ma-f}^J z2#KY^Re2Vx9>quJ-stXLnyl>T^@)1E#f=dOK6WA3F1Di5AFBYuZ2rbf1!In_t14-v zrUs|&Ox6%5O;Tl{x4nk;S)RG#&GvF+i$bai&h1M475D5(GD_&vgTTR4|0@DB%TSA1 z^P4J_m;bE5@0L6r-`KWX-~ox^1c8|2D;_^1K|#KfYMV3tw%lkTB!`tB+Y^kNH?>WP zXyO}t*PX?hKP`EVtT$niLMbpVy<80TWu;xb*wK*NSjsDKRlctQe-tWaq%BLmX z(JhVuS{V+-^Y*L`H;9bioS{EBuHO7*|Jkw@fyi$bnTV%Qb_si(TMNdkr3I+Cj#bz3 z3a`DqWGrlXfOk@tu#Mu`PPmHUvW(c1!j{@pj%5GMZa=B@ASR}A|5zb=`#re#d<~_| zT=oe@(&zpP&DB{vUr_Qx%pUPSMoKVbU+`+-{8_!0mX?C$xHhQYbr-5{RMPZQfj@5{ zf22E(p>E{Tx0W}bD3NvfLULbO9lv+EgeqJ&bp_eR(@NWRb&ozBbL$m<79U&V{j6TX zw(7z##6eUD6e~#zjf%+cn@tB)UCy-2?;r`@Y@{=0z`2!l)l=8y@E9)R1ioNrYY|;EB90y87d#AmsY3)Cn;2nXNcyh*A zrl_U{6z68LVWXhem$7BeE5Qvpf5jn!ZRfQN)mLEf3i7C|G zS04TX$WbybJs@yW+{I3sXs7@AKHe>H21^RLzrB&lzfC9JU#z zH5g1=r-uc$%;#z@rJ*02jz|iVsc-Whe`PISdAN#gal+;CJl^J=P%0~W$8`5FIxZwu zv5#FKeG}G3w(Ql_+<0au;Ws-e+rA%CPfWR@9{=O-%lqJ9*~b^EcIGipWxbMt9$DjFJ^&iJAB!-VbW zrHkZoBPNmT(H&RSu?HK=i0vb7+lLOJ%#UW%Q=HCA6w?puKC!RgPb|B2&1=dYUV_*e z+Ya3@!7rCdmsfN-bDelX)BJ+kdeEQlWtB{rzc1fG@NU2(!G31Se{EnEPI!2Kz^wNl z)~X%*Jrf+qVKMT}kiPFn2UN|ps+U>%_fKwc;GqufVKCDBacZgwHuJNNBmI{mB1^rs zp&vI?X_{G7xg-RFxi(Nw<|ka1NbNptM!TVLQhn$Cs6dD!PabDB6^s9mlNLSrg3J_cTT%L9TC5D2)kXacSmRBvD(PXUlf}wsHflkioNr|D7Yccg5TRqEbyH;UG7y0H) zU!EScudYNSQd8Kow_^ouk@vl?wMkjnH0! z)G>iQ*1Hx4C6nc=xBbeTu!Af4D@T!z^M<4B>qn7&pu6EYHwBdeLbKL0G;biZ5FcWQ zcJ**_`XeEO{i3*P8z>1ZEGdaKS1ycBOqDe-pg_Wm4_g1swD8Thhfmq=;$n@51WhJf zRM9S^oFf3wp|y+aG$n>cOz}6LxPm%aSXBX=#hT;#MYjSV2-& zcjyvacka^traZNJ~0cY$j1M(E!%`?xqE9x;c<-S;g^sfK=f(HnWta8nv z3Bd!OAHTJA2pLzOC`iduyY^^0*e(Q1$>$z#Y|2^)8~4{RwLCeRePV0oZ2>}cZ;Gd+ z)N3aO z65pgU+TysIzLKD;pEIAUabL(B)ozP+e{(Ewyu7G9(a+MHknFl3Yp}$PR$Zfq_DAmX zvTUOXsb$;aX#L~_CClK+9q*%v2!gTN-;GdXrJ1#5Zb?-v0F4bm29Ge zspSy^OKGB4HDb#ly2^lACo}Tva^A_U+kze^Oo2pV@QiHWSz%eC|lYnDK@VRP`Ev5?KR9gq8xD=yV0Om(oQ&aG#v(4VK139zm(FmOr8si|@6=7&?b zEu~~-!-|?$-aaV3T$M*B)r=lY#bs7O6LS{rVx-16;1)-U;;4oUVj*A!#SsLqRMQu| z;-wQ9A5KGvZ9t}}V;NAFXXt>%SvgH6In{%KA&rz4f3LD@1+gfcJI>2+kDJ7aNupU(_-e%VC0Fy=B zv~mUcR})rAr?RIKTH4gk{o-Q37asDBAVkXIBQ}%A*YtZcyc&FZ%Byjf9b`vC<9NHP zE4Sw&czRIw`KnIjgJUDhO;wFR-HLT-c&cOc+;v-Mvd<{((x#HT^eA~@>>mwB=}hj# zhPvhOANy#ob)3J)LksKPD44$KvL1H3v3yO4SFvNqNSz{${P}lsXUV! z9-ySQMf}mgX;6{f_qaUjS{(z}gS34fF4XcE;V8pTz2)JT z>Zl^GWZW8lCS!ZQ1T~g}(TvS}$yz%Z>2SE{+0mt|$jwlZ7#=Vp$ZR)>3i}ts&h0GL ziobtJ#;R4T9V?Ped5Do$?y~fw0cn4TurS4>vGG%W3DV~?%0uet6z_j&Qpn+Sm3NpPxBb@9Y zIIo{-&hJk6n>;Dn;b>@Lk3Q>Cf;V-7cNMpUV!#RoGyjig9%#_jM zU9BrtY;GU_FV~bIyQGB{DzZZqb)ABM zI)!)R#bU~$xvH)!+|)`$K!C^~??`;64J)cs23JqUl1LxUFPWu3bOXkfIoV!=A`l1) zkrwQn=x2CcYPcLP`S-1>l3WoJ-_*6O-jdzpC%+ghYjixegcRPCLTMh{RfHcMD}fL_ zyW#E3QR&3ShOAHU8HnmEgQXYXW9)#}ZBI^eQ`N3&K{qY(IDF1~2J%r$f*)RDr>=4$w~Qzr)j5v#d}1>+TZEg_v*;ZcSNAHVWZVo9Wzf^ZasBF@h$*mt zQ6J`eRa0ko-M37>vYY;A8|&nc!(NT4#%Xd{#O?!$aZmN(EYYGzsC_bpHVb|Ow6u)@ zq9Jyr{J5~b7nuKS`ZqGXw3Lj%LP7x0WdMM7X1UR!@1Z*=3JHuXr;c^3$vvg*^PA`@ zH)+3jh+41)Ka2U%82y^oK`11h+i%S)FL)zEfBFL90+DMcY6q8?$%cBK9(cY#hh$7_ z)EXZeqP_YIGd5Qgi*kPW$9f5;IKKqLhQm_AMsl&|eHEX9L{Lt$l*VG_GN{Y2eWR|F zW6F--k7AOF^R$}n-uTU*IfFvO&BE`Ql&Iqw0_0%;uBU|kuJ!DlAfLXP3l-Q68# z9n)%-TrB@bqZz6DBG#b~z?P)aew}1vGzqh&yBHsf9e>UraiPHp?+x_6iRF@Rl{aZOhBvmuMFn5bZEA*)M=f8TtDaqyPJBbC(=j3MY7)ZpmHq{bUI8jz zJ@qRb9i8kKdMPyE^mJgWAM}iNN-XSv0De_8!uJs_LkDmyKAB8k)PXCuXQ3*6 z(V6#eAwv{760@;w8@IOil-h59*mOPCopNV}w5m<8CK_fhMejmdCE_#`1ole2vU?B(Zi1S@ThSad8GH7=z?Xb}eQ4mTCz zbOG##xlS<|fk<_`Tk=b%ZoM31#xiIYGQ84Q4l?nF6&#{tVsr9E@}!*iDPmDHR6kPs z(a$TTW$XgwsfZ>I{U+g>0tMr^E;y)Oh|!=C#*m9~=t>dC5^gdhjn-85C?dPrcdigSD;9_nN>$Tn%{bz3yBd&&~!_R8#;V zk(VL6gUwLziGOkYa8jRkyq0`F!;wUJ5zO>B!E= z5GDDC#D#uQt=Ug9q<50ejzE^bj2%4_Q0wHrI?Bqy%lm85b$K|)4{pK6^>>btsbtfJ zMp;N0QW?6ese^!C(uuY?XCWMs5aKl`q~=RM7D-B+OEqJh5yOTRopm%tezi&p$%}L8 z6N=rj!@R-H6q`gkgyT4u6}%NV?GG!{?aW+hDed&_`S1NqO5bB&&e4ha*~q{lBCxT` zg^-i$$=oZgaCcbB2r8{buOz+}eVbpJm&aU=z#Cv5M$ayzmtLxuM}VoNgg|Kw_tH-V z#MWh8PRHKvkvP)$^YUgD>I>QDddKzbtSEOs#{)*CD)~KXQsK$(NZFXl=Y%oOXiNU~ zJo+n4O;fGX>2;*)dat}a=$geVo%!IgBT?g2-AD3rVoKep<{in>U`3|40$BH1cvyPO zh~A`L59;b5CwEHmzSu8iARF(5|=LjXlwF$%UZ?iyrH=$hu-{N50Sk)G4+LlqVe_R&2pd%pRD z2!Va&i+FBw#lXQ2jB_}@gAJS#er7FU>A%EeQ2svC_!4T3j35nHAV6IOMywl^Gu*1K zuE*4b(TNO-rByh49=Y-P8z&d%9~cDGjbSd8`!k=^yl(_HN*j=~K_h6+@YbL>;frO9 zL)q_`<7~qOeUzQc)7`6N-m%HYKE5}{O;4fMelYF7oh@9NNBTwX<-pqi%s|8L!QL7x zYnzOgmcZ5W(AgWp&v2S-~wA-43d7rgA0JC@0?DW%_I?uR|pi> zE7!Is<+hl!MMII0X3H@yHF30L1Bph+#vCVj+S%)9&#Xma%_==3`vF^m>&eWF)%Fg5 zU~wysz(3@_dZlEekI5r2tFVn$t&} z!!;&*+#j4-ui1pSqZLYjb;X^iNx+xFz9fO&L6$Nqc2V`~sk_fU==A@(awiJ;98&od`-s;+0%zRy@LOj$!b>I@Ft9%rtrglhN>T z(%M8$jXhK+;@R)r&=Ob_DTVXAPfEdb7fFovsZu`gv@LSKxf*J?dT*lR^G4ZZD4EM$ z5H3TX2;*>LLpc&$v5y8Meqw2d5`5Bd57m9z;&F0yJ-6R@V8F#Az4px?0xXJCA8AM6*&rcd4L zFp=Ax(*BNwn7TfXxm|AFoZaj(8Y$1h4~^ESfyy1jUjTnp)GQ#!{Z!A^=aT)}Q<&%t zksH82;I=uXPS0AVLShAHK68(To|>t@btl|=ptU4<%YB}+^^vGz?Cj2rQ9x$uJd!cn zSpz4LP^2$s|99&(LJg~MNA=WxQp>3@2R;)uIkS*(8`a638Oze>50QtxP#M*%zXcQ^ zw(xM!{b-qwEFj=-c$PW?m>p8j$%-!-s&v6#a_wFCs4~CpfObZNUWa|%#iVBtS z|46;hbQ&{7L6kd5rYT@H^RuiFpTX=`Or|_-sG@YvU2@Y|CGV0U)%cDZYLEWc>A01^Bg$m|^2HOI#ZI;E)gQ$}KBU;y|dU#9ZdW;f)kI{zG;%3OBK z=;g_vHQWRZHLSzSY1PMd4@RL%r_cZ;kkxo(Ia|Y~Y#v`!*R@$%jKxW@@Y#clUGa}! zfrbYgF5ovxTfUi}qeu-Uxy@U{AZ4u3B08>L2Izt>+dM#Of^OL0>zO?-Ru0$~tUjC*pND{8@^G1GO@~YW zh6kH9>S`>l?-8LK;i(ng7fNa2GtuRAl~UE(U`i5+ z41aU12f!OMfg9sC;^M;I4H&gosE^Dn6mr6v5g%y`Lt zn`CLGF@A54$O)`YLN@}0n`1oIJ^DY_2gLnMrYb0mjY|2-$mc$!{2D|FY;wqKeO@gs zu>{U*nTdEO9Z@!^ykN|UV6=RvQ3B;Kp7vC7JeM9wieTi!Rd+y%K)A{mdifpZu>;l< z{^1(&%ZXFe0l**vgd#gBz)!YxwQgxDs=aUY=dlQO* zJ3cvI$RG&>gn(-rV6E4;Uklt{trX;&%009e*Y2!e-TeS4yXxx$T3dxIFz)%+7)V5$Ed*U6jz^8jIL zYHFck)y1am!9@+CDFILj($}WyS2JzkVl!6yxwYub&CLN6#HLpeu+{P-MmiW=T={Qr zA#8Cgp@x9NIQ3oIdv^)yeQ4==uQN}j)hq`5BveB-ISEZxR|NXSbAqeBJzvZ!a_@{_WQX&08+Tn;$j-VbEsGlhCKiX z&%mI-!Nyj^0Q%ny8i_$K##Fkxf?g>rDz*cWPf>k+@&YK_V9SXeelsDr+CjLy(Jy+x~1rT0V{Uy>vf2fG0^nOr!+)&+~dtug6%;&)w%Y zHr`AVbPxSQzdMx569jar1QZs-@i7RKrVd#~_s&Fk!tmi;}WZ5<6$6YKhvX&!2y# z@i`^|Ar3-9LMmF?b%zE(Xg1v3=~@v#n35E{y@iuCG>lA4 zVlp!1fsmDaA!l_uvr!Itvk^|uLIXmAJ^{g37yvH`x}OhhvNAGA0R?*wGt?FY=5z&# zUHmJz*^1(RfO+~!MJ*$*@{9^bnUmwQN_kX+<5pB`teA-jjfRE>pk~jkoiTB7;yD7* z2(Fz;(_bZIxx#U~*Z>#MPGbaso4dHfMc=*iNH#;jKCI;_(aRET#m!OLN z=Wc-N8SLyHZmx7tV30DQAeU=YnZ~5Y z25T=0sUw22vcHXPqlPd7F#UhwBRK@Q#1#}?d3kvOkof>X;CtW;7@W>kR}HZDNZ%XAY!QvrH^3OTAXYVYBlZ zLt9n#&CQ`zRh&HJh%lmdr<hB>WmVcZ7J@nt^|GUC-^Z#Ap zZ}b0N;cxT*Ug7_};R>h&7*k1>o*Hf195mY0W&M zte<|o0?tt2t;KLjT=}y8^a=(>aAr>C$59AS`e@+Mb->bbp->2%;8v7k;?+{t&rj~+ z(-E(9o2m>P6jX5rj~cptWOUBxYxi(PRG-7t_HjW0MjKSDsj@8;J;h`2w*3+jsu$4W z?R;r1?s?1woc0Pd$u-r}lUkJ##cyOK0WD3$(E)=Y$}&C<4A18l6yvcf%YbO}Qsx7v z)BPDKlvGuHf`fhdNPxbIjdKmJt=->C;3z;ZM86_+KG&rJ>lg!@pXAlZOrJ$^J7yVtCX!Pd0;k9^0k=oSasU?J(iGv zT(lSQ7%pO)@VGD$qkHO95H4;X(oq_yM0|Wok}FuokvL^61Z3hGOI7t^eP7*lG^OB2 z)tE)D1tI2?iMFX>boi#p2IjQ5c%!vl4^8brFaa|jbdWBzO`&jdJ%`R`T?G&b-I(E_ z>8eH@W;p4(G$#1o?!Mkq~0Jp+dO3?4eh;{e$Oh*Kr zsUB&`&`*J?S|R&ibeN0J!@_t>XT54Egoi#(Rd_9`3FLA|25X2n5BFM~-wN933{E{p z&`_kzBS6FR12pVv#+{o9X)#Y##nVi56)4uE#RZp|U5PMbhY6ewAP+xV4UxtXVPJ@{ zwBSdT6|B&isSi*gm-~VgEIhfk>)&xOhp&D8nZD=@)(L5w;_~)mK;Ed_jBaZ&L{tS^ z=0bSimIna3QO;U@t20_>XIs`#Ts32nYGQ`G%5m#TBe%%jy7{#ZcAE6F0Hdm_OgY#g zX;eo-E!sK{RCRUn0!qFL=(nAeZ~oVn0orIa`x$4g#dPHJozQs%b>YGIQ7hc>Hpzz~ zY%K{q&6~Mj{aY~SD+~hTHLR851TZjT`08TIqlP7fNDv9ydX`)t#_J>WsMMW>dpFM@ zk+;qUCFpso3(dVHI{})lEDnTZkf#(UKgLLAPC!@Ny(B(gofRD&1>AVmomtkOjkjE> zc{iv`-lTP`?CCVce_8u6L<+TcbSd^2R^zFScxQ<9F!(AgV+ZT`Y_LD$Ari!;pcpJa zgQ$M>sC9@2h3waz8GjQnt)CFx*m&7Il2f$gS^8zEEg}`_PSO)JTPo&nN%kI?Zjr?- z{td4n1ZX8~V`FaU<7U9k@$wt(#htyTgpwK0_NZ3N=Chd;qYCbbRqAgBfaYJ%(Cwo_ z_-*80Z;sat!Icc?*e)m9CRN~S*$;wI?s7`Nnlpa_KIwAHuXkOZ-W;fTaBi;ou3+f` zUCoZJVXRm3te3W5#0GoidMUV?b`~6S+BV7RKMJ;Kd@ebKxCQ!P0yl zUY8|Z<8(y}2dl15{XoX{GTA~hn@vUD3CnnVTcOa2y-QS+LCMhCK+Fd~gIaSLo%v1F zot)uInkZLCW*R|u7ZU1ME2$YG1tEvV-^8-HohA*h)_}DdBfMBFhw(VRnzA{N!gBHE zCVN!gH6-4kZ#{=L<94msqYZKt9x-eK=yWE?8=UPH77wz^&+?>@9^E229w8-AD_GBPgQZgWR7Tby^ z%>s89_6kN{e9ea*@VWa@qqKCJ>sTo83yidcyg1~8p5OlgcHi!` literal 67986 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

H*8>kZ*PU9Z$XDC3IZg^Ip z%QYQE1%6X|TV{Zny$O)n!`1K?rPtE&x&wTN^uPeh(q?-+1{!?_ZZ$ z$Vq>LxV#r4*HKgV|Jv~?0t+i!hu^zE!v0^7E>`CMBdq^L+v}6x?EE_+pzZ&{`@f+7;r%x-2ue|r zU((*x^_4tXNg?vr^ZCu}O|8uMf4?`Z~Ls6fb>tw4ByY&>k-+@|JC05)zmCQeokHYQ#UULX_D6v%DD zW6BCNH|72}6v|FkAgct}{5w^zsLVj9%y_v>O!!RMm_TQPP?-RLOuVeTyiDfYyk@Ly z92{o6CcxjQ%uM;E?VW4^Aaz>V0xWd^S6;6o{D1iGuO9v%o&ZAq-$VW*`Tkd2{}tDNB!T}3 z_`lZmUvd3M68MjR|7%_UzljUsf7%_O9jF3w2Q@PgLVlK@MhM14{;ed~%j-{WXK?~( z1>QkM*BJ~95%cv04wjyY2U>)6kyVs}{SHrrNrcnn^bxd^6iil9Ov7XKWZm8C%|h$T z<#gJL;f>wRHucwdD)}ZyTp0H#$zoUmLWgV_=Tr{DTP z!YNU02|NY7)yXUP59OT`%#}Cwii(QLCtvkzA8EU=?w}H_bOSd2ju`j0dvH6sj6?OzC^LuwSxu z5GsXf(_gS(K>$37#>E^?9xkrgFO4;wjt2g|H<#@5;V{h5aUkw!9ID=6{9#VgH!m^5 zxz(Vp>9Z%%TaxhwH!#W#QI`=zt&AG%mJbqr+LlXw#yBA^eZM*{_iS#!rJP zW@@krUI|7RRnpUI`75mL1AhiqEe1}@M%#6SHF1d)h(yN#W%@k%KeV!;rIO{1El`^g zRWbm+=Ht6iI?%xz{M8*eHCmy#e$6VP-f3`^u^YRY2*O`8X!jo%9ILdwK!B=j$}8{p zmv6k+{u`4XK5il)tJ&I@Wt~enCp0+xK8JjF3{2Kp^YND<|~7C(t28aHTT71;VC zxi$>Akt@^wB^#2;p%J%BiPi%jqv{_{QhUn_z>mY;P#GfpHJR-Lv16T|rKV3+P|Sa& z!8^+8Hu23L<6rzQZ3>dEiKJ!YfJB6SkTbc2El_-`78X^p^H3eLJw68X4RUcwDcysB1S^|$kZ6Q zkWf})qS=?ZIax(TDk`er`FV}_`1lLnO3lw!Fpx&9;eYxN?}q$R-&QK6@(YP&IY+(UB2S;0!6~_^_xbq$U;UHmL0D z9I#bHovCx!XHB`hK>x~L`%xhI(b0u>baWV_y|=dBp2?GVBkYyx{dikze{O{GhFA2% zy;76?#?%H?JnN`kXSi%NV`{kBw6PJ^|$5?Nkf`3<>e^7!i??cpy$d6Wqe0VoZE|s}y5Yc-^ac5~C8whPJfuvU70I5eX!Zjmf>LBXI7bc+#ARho-d*mb z@!Jx7ZML=88H)CLI4rhVYY6ZB_;b{QoTvqo$9H=jXO zJ)7HD!6#5FnmyfJ?(Xj=uv?HuxmIPv{xk-ejhK$}dWX@UvaFcKpng@j}^zRBl^( z)8QB@CLzNBEfQ3t5C9tJ{KI86ryovqOiWw-s3N-su_EUEA<-V4!YjJ}$buJHP8M*r z8=jby#OCwl0fR~$^>yb{?m}!pidA~y=g&?@*M~?%+)=XyksjxrKkqL3QCAFW-?}CK z6#zO)0(Ev@6g~$?+~oK7{o%?oak&f1fhj|Fqi;a|69|J$F5=5u@D{huW~H6+qkHQK z8v9FS=^w69|{JbXAn0L7uA+?u%SC?x5aH?ls@4$qg< zxO@(x5!Sy$z04*C4e-l=I`892eHy0~hOVxzq_mW5_)l=WE`!gbxnhB@fsBJ85}iW& zBG&gQ0af@(#x3qI&5rr;7?`O%_RNtuOeVV{p9ThpP1DUUAPkTcK7IPMySMi#F?9eG zIq4X^qEn1KgF7E@N2kzVB?i)23=KVf{8oQx?dAkW8ixf6C_uCbW&3QD0inBQZkO82 zkCvS_S&{Wr%aJ?$77>tXu|k@{z)X-L;UqY0R0Knh2uGD-DA?#B_D&cJNKOlSF5T0p z;ltq*6O-e!vz6@Zn0@b$->ozpB9@xbJ|H)LRkX81(QmRz%6b(WDAN+ihQljla3=*L z;<7t#OJZPPus*1kYmsVjJuoKQt-Q^8r+yqrATqBzQ^BREw>4*Mg^ci|XKFPLuLt$g zNP`L^!IyXB(CGb6it4kPByBWd7$+7R%s?yYw;(pF%U#MrD3T3re7UVlkCCa-t&{p` zGEhSB?Ybi;@xH5Va0?fv;o%7#XYLGQGaX{}xG>({-UekeNxER5E+;p))7=H&HG&^4 zlz-Tr-B8nXm2t~N6Au$Uw@fLJ&e&kf%t+($u*^DXni?G){XTJT!Rq_$g@A|{SgGgD zWuxo2SYy+#ROX#7*DY4`&T%<_f4t|tu8v;8>?Ty{Chk~_2EEzNX|?9aIdAMNSu8TM zynskeN*-jT;aHC?Z9cLLCntP}R2@9sXOr(G6~=zY@(^FY&Cd^fpUn8MbHn3tv!K1w zW}5-x!^nPq1bxkEeDc-v4h{}bM5;h##m{daV_$xCzq|$I*p*Kpowu#Woa%4Dr29+f zf|o#B`}K=rJB-}_ta0|O{P8h*YRAj(9fURy$Z)Z6VzxV+r}rA>lqdvfU{l5y_5+fk zbqK!cy;CY$D(thbnMPf}@o4-d5j+GZNr#<|=Q7e{Z8_)7zKnq#pWOhlz-@E5NJhz- zco3(qRWKv>H4iNqQK|#pin=fZr<8bdO;wkv(!!h4Z`|L z|L}zpR3ot>6-+}h$@kYG@15MFo&2D`edG*fv~&>vgg>IJvfV?Jg{28)pNHHN9guZkJM32yl?hj!Wuk!AC{` z_p^B1oC8%UsbIm!2@V=gqw<2X@^ZfOjvp&c-k~R!AUOkQ3=uxo1_XS{bU$mINaLX4 zH7Z|%VM1o9+!$;!AB-_i(CZ%RLx3TmDAYGD&t0H~v^s&IUgtJzByuj&&(ZY<62PR= z(kveuL$16+7B) zNcGbdZ#@h>8iT*!gg|f4=Q<6E)9pn?i#K0yA_id*;n4s$4j}~PwzO`aAU`3j zSqjQw+FF_zM94r2e(nQ`2IXDSO4$Sv`tetjR6|GmT!OTV6|azMIRO?S2)=a*y@mv6hX=eic z|BiDVqs0=uzE01?6#cFMPn z2I1IxTGr2M8Zz4ro#+_*l&9*LT~@EvTOCG&719LL1_}#}aGMx6CvOB+zU=0&A;SLJ zoby3K{tN*OYQic_rYy>2Q;~xn23R5cVENEE;E$nb*NS%Jg}bi&FrjK88w%PAS4ARB zoS~=7RB-L-;Rl=NdAxIY6h7jbf5;nxt;_w*I|aec(bqYtwaI6p1I`#yHEy)=6!n+arHWzdT>KykeuW z-+a!6)q)iK1))fST}uGdwDB8?KoEY918P+G1;=}rDcNSN;J~fIQqb4q0^e70X=p9| zn2nLU)r~OpNkGUEt1n_}2rhyES7^kq{vP$qi5f;->B9Qjs!1g~@6yC9s4hX=z7TbKIv_g^;c@pFn) zD)n3rK3&in&tBD!21tBDw}~-Rdx=yx`=7~t_c01sGtEw#_p~ec_u=U;R8W4BMOPI0uV@rjg4)y zT=VJYhHp;M__x#9)7aC`r7R{U`Fm!VugSE$TV759R0U3(jm9J5^EsJS(>19(;@~j&+15C>T`EDMuV3=wAbeGo;#GA*Ti4=ooue{%3!5Jrn zSg^ylBboqhA?@u220l{{GItx&3(qL395zWEW6N0;=Z5|IL7kJs@)WUdgiEM>S~PG9 zv=c)q3spi;mV}a$k}~i-EV}!JW8ZQAxxvM?_WGK$s$<)US~2~#lx?pJ9%e-X4IX6V z7khL?ptf(Q6~Q{YIB5z)}M2FuSM1(0>e{jE@7Y zxnXe%kEOUIr2c(FQ^_U0aGgR^_3|(sy6_bKdgnS)VBYu+;FTxOQK}Y&l&Hfa%I2?= zJY7Dph&YU-6ch!@70#emTfJBbcr;(S=CKp)b-Q9A`0}*z;c!p8|H|v*?FnEY3>~mh z<@$bU44&?_Nzi`j*mQEVUg4Y)`e^{N{Evb*_lzD+n$QgCiUeLb%uj9~e#SYP`8&S# z4-bMggr!g|Y{B|qH>naEdkC$Y3Z}OsWFQq(hbUp`YR0Jgi`AwPNWXW&5osI&;bJ_I z;ilKE7rj#7j?dr8bNcr2mxfNn(i5|rPgm%+j7TxA8HqdUkz3!KY%p{2$1N#bCh)i! z*MKgc{ZmGxj#RNgn41+_kQtgSR-{d&b0z58txWu2>FBBUxp7Dl9&SHpws^Qc1gyt= z{!E?y;a1s64K%$y;6Pe|CPLNcP!h?al4mY#XuwjIl#CrjLG<`w3yoT_4Co7>2%a#>Da73H(ly$CF za@a|P5s0iS*LWm@ug4^UG2+GmgMSO@)drl%z`p9MqxsZC^YQln$!oFDqjPHTo%Z=q z9e=Y?7P28dr3;gh7r68ORPU+VIN~GklwOM;&xS|zadmf>a%g2!2r9`GQS-*s$MF=$ zpYC1jz;W*@RAo>M-Kwd2EL$l52n?16Mayl=!r*cV!1&}mU4m}M9R#&fCSImRIn5p8 zU4I$EA}9WvTm4kasLi0kqcD{M@NRBVx;n%3J{gh7$U41Ad{@c$5rEvJJ_JU#2CTdU zaTnYHMaA>e)RNeeZp+y3b$&V$98_9cO^n>!1Qj;~8v4d20KauLyf=iQ-cd7ntJA{O zz3s`P*-0OHg;okFS#DYYrHb}L39A}P+BDX(gyXFNW>@w^|L_9de!`JLW> zO_r!q=rmZW#wuA?_%AJKUwk04c@M*a!(5cbSJ3do_v2*4m)n7ErRYA5xqR9&li3js z6LNl!k)*8&u?4sH3#ul1!_5Ueh%j#!9oiQ&^8y_;Sa{C>m;tjnE zKECnsos!z`l=qO3ClOk67l24B&=_?W6hsWKpBy4mwbH*T9Y|kIg4`m`a**USWW|>R z+ep-Fq9~~fYg-U)vN|-Z3p#U3Nuwdbg6JRJb6YmobtcP-Wv;lWHb?N|XYm8xyOrUGf&Xk17T0ea2rM&1Jmp)pb%Sd8>j zTUF}pw2{}C_5?b3Zt?{vOyt$9iA1T2oLoMW5z>J#zr0xNtJgoA?0iugIhycj5zUQK zmdUNCh(eqa$*Gu#0)O%BzKR&XfA;=~yj)Y%_&wIw>$7}v<6-3F+K2tDljYh1`Q)GH zzAqW&)vZdxiJ;&J3j4~SIa?ZN{PP-NxtNgqS=)qcD%WabUmmB47rFeF&WAPJw7Doe zW^J2Ab;r_JBP=`?YW+Se2YQ&fnwy!5!2VmP+c?PF1$u3p}5yHXdtWaL{gp8T^nl*D-||A$VS4Zcrz zxB58frewFYIQx4(i+396{`KA%G*_IZ0d+=hpv#`m$|6aK%)B`ry@70s_4oR*6||-oTv%R$oJO` z^E-1zMPzM5SLAy0sm-JEY7>wOLAN=?KOGkq7CJz~nWt@B)LOs}^}WjL5EWE|(SdrU z`~9rp5!HgWPM0R=jv7x~lKBjcdu-}e=ATuNxa;(06*#GQh3P7Im8~_joroEXr_7P* zw`K5UN)3*UC@`HyBN1iBDLp+M`b3eLApzBi=2zcWv%J3Tn(No+%j#QlhSce|<^uc7 zfL3MRIO9yX$mR4cHVWU-^Nu|puOt~n=zCmR@z_kD5OJB!UY;R4+P(OUs_jKP7VGQS z@6TVJi9uyGgX)~Mg@Lwp@ogQj7x<7~HfD{Jd~5FlvA z|2i@4xH{_I4V3v^h&@{$%#ay0?2;>`vHF*kl(@0D^y4&f3f6n_~W94|o*KxvK2DNxUw=L6azeFLCwK_?)j-a`DSuh1W8Oc05)yB<--*IO2Xr zKBmM(k(a@Mp+`V$*cgg>glzqE8`LVDu~q;s?;lJ)tD+Dday)mSTpHEjK)o*5_$s}+;-|?x>=NO z@gPCXBOCAtYs$cZnvZYg*Yl0fdZRYShpS!im#+PvkN5rR%A>G;uR~#fhK@Bmo*&;Q zf!`<6K;4kb`%g&n{nc7$04YdLeS#FsCJ3rQNYf@pQ7fq?_~Jo51C31LF31C$4z1xf zNs-pU zwM{pXEfh&65xVW<`c7G1zF#8e9H2;{!#@+P0&8IhQIpswzNJRpFXW)t5gS~<(fg9edq5RmSY4hfM?=@5|a?m@air8^|0 zyBTR==X_M=eF5Vr@=?&8U(9n?dcXc^YgZ_=8Iv}a~L&XFFQ2Q z(lV|$pA8z%)mmFEDJ_=i9of{Sa104lX=hY{pZ;L3PDM{|5U9g5mBuLgR*U_n8Qzfb z9#n!|+2nXxfSsKkSlN`+)Oj+Kdw+dj3EZbhZiqcMNI(AK2>B~3C-Sa2 z<;fLNzFyePBNa-Ws0n+s$TB0*y#q4Oq< zpJdI|z9`xMv&H(|F`Oe*Q@stkC)ekV3n@txv98l5_^wO{4LUXHaXKUL?0Ze+$Dw7KPG3v*YXuP|DJ;>!guYpfg9E1AlS;iBXIi`slzX3fz zEoug@!Mns1nbuQdd46j?qwd%rv9Z%x#%?Wokh^K4Q@Up`BVgt`X-8a4Ob4*3@O4$k ztGEPF&BwF$*)V&Uspe#Bt`os8K(=_I*p0l!w1rKv_GTd_utjh=XDvO?Px zo}Z-BkWYu`@SjZR#$*LSgwq^344LU;8BS0ogL*dCTyt2k`cYRUAATn9NjwW&VxE+X z{2LTJ#>{#*C#c&%^gpt}5R4lGZHSoIE8)8t|5Vq<)$+iSOTV!-h5K}dvc@1JESi(Q zuh7dKHl&;Nj@ZcREGFnDOXl8X_<_$xJP~agw-hKU)C$S}s?Epz7VO)-KiZmK572w| z#}8Gq#`0woWd$xY#vS-oYJ|`HX7{k6F<*dSNkywyZs!eeSmi6H&FL)2hwyHOk9<$* z$vs;(^_<@3I=0Ne;9yNfWlcK_BuYVpT-?~$5T{I7IIL5?T$4(l0#_F{4qg?|Ic8eD z5da^XP8C5T>H9KU4?x#$#z6uacmJJRDQr->yjFbL52(+1C43R#v(+5er?- zFRf#hClGNtyw=oAdQVNg;*c~xHKn4W(qYP=2B3&B)7szFPN+!)N#LS?i-93!ZH@LN z_>GcYYs~3snnPw&;@pAB^e}mwW6yz$lKzs2x3}OPx7F9HL*yB$2U%rh3Zt;_kfDrxbzjlPMV2g+2iKXC)$;23r4fAkj@f2}Ji4`N#Goxmx!eO;ED zR(Zsyak;>ZRys^usnhpH8%_`(98&zqrURGtzFqyaH>!SOW%hVegNEbCXgQ~ve!t#6hsbT+%6`JJI0&envR zKAmrs3%YuE5RT=^ADnKqUXQ|bT}IwUIq&!10vDcHt8$w8$1hX7PtRlvJw0;nxYAHv zP!Rm{?cC~pHw{j-qn0N~wCh7n53an?_Hb5CZZ4bI@H@ceu*scmXGF$#t#nKf^OR=@ zdR~@0ZZR*qZ&@$8ogL`i35{wGrp?b2KMQyr!CM?|cBDHyI{+fV!oaW}cSOi+Xh_=K zwV-EUn5lAQA>y|AcGCpYd|bS9_%aV0NZ}8rQ=#Sne*fs`=w~S@a%SeJ5a5PDK5=n! z+JPztP%MAb1wA#O5JA|Y_f=w7ia4IWN==8^8NaW2R)2Gw*xv2E{!2`(>)9!r)#kGy z8fNCh0Ok;WXEu0&IupF3DS~mh4%|zkY#V|qxG-52CEPtz7Xy=_gLlvjVcS2e17gUk z9Kal^HmGaWd}~d+No6s(-8)&w3Z;eA{`vLA8P{gRvGH_fL7;-O*QTo_KZlHCeH+WI zqQ(=E^M19e#p-zW%$`6xu$lItFA!2Ar+DAEJ&}Fh~2I~=D$jdF^O95Jq>yh3E>)B4vqn4gE z1pzuH1MB_i)(h)Q0<+hI-?cK~c~Dhf1gH9-^IuKzL8rC_1`)0izM)K=kL7WA-#US1 z)jWAMZ z>R(uZp#2Q9(YpC+yRxY-Pn5L!)4Fy56hfeKEnP+ZdbixZlQnB>KUz+g!(E#yFK7;*}6o zJelRBSnm7)s?qQ=I?5?6H{f6K|qQB+g=q^U{3J#Y8w z>G2BcejiHn&G6g?U@#3A@nyg;M?F0|>k#6$^6=mT+bPv!w{YIB1FcxACd@S5Jzib! zA%Qr8nREH&)IW?HMve0C5&iw;E#`rLY%kBu{Zm?S6N5IKD67i?YTls6D5E+M$cCM8 zxH`E+A5rGMRD$g&Z%2@g%GdFgU`t<|VM%DeZd9nv!SNPtlX0dfs6p0+pBMPxkD$K4 zfx@DpQ5_qG&bXA_#;!54Pi-^6JjgsKWP>O$av1O1W1N%E;ogTmS)x63N9HxX^@#kz zMrX&qN!RJqmoGRzK97MyRb)UmrpfSH*pF4|w%=o_V>M`h4H&FC0aIydWFV;ufqHsv zLS26Y`m_b8#6^R{)EOPug__v-co*1~={A`(bMvw2b338udEnf7*Yb3zVl*w^Jp&w6 z@TkA`C$iyxx|-k(kB&A4{}q6Uc8c{{k|jyqW7VH7lA9AdXaR{ZXWJAxrXb8T{m|6Z z)zgC@cJ*xaA2w`x=%P64b1nbD9!%km1|2^IC1rFy?V&|{P>vzxnDz|Wnwy*EXV2Nl#`Z`xw#o4 zTaQ+F@@;QdI?X;bw70jvKc_)I9u0q5PjwtTtSFzDJYMOz>E>>2)3$9Ll#pSLeMRM4 zwAPm=XE0k`nDd?{xJ5B2cjb!VsCC{3>|dkhAeD~8>5}s?dVVDPGmJY_r2BiaHJ_f4q5Mwp<|@|dvK_Ywk|c; zxv5*yN+yTQ)HqmZJm$8sf!DAa2J0C0J{C6ybkvZb>lrK<0ufzWc z4ZuwJ-(w!+-3kC8mO8$G8|%{3qxbzvFAe@rVVyTxG-!#;fq=mQ%hTVWBY5r7tugC! zw~g9|hGR>pt`kM|eG|u!a)5!IbgYTJ($rAZ#?*2DpNH!cBR&ktI`d7$>WP4;Gq%`n z@v4&EKo_kIKkwmKUHTTyj^t1NeQ};_Cv(0sGcRP}2m{Z5u88y7Gpm^ovJ7_Z=h{D& z)HLyKtH@i%Ta5AL_)VNPjTQSbdhO94PbRBgCR^cX+ikl{}!=g~j0NC}EyR zk4N8ieD4LQxn8^!?keZKTA?%2F3V&5n5X;2~ZmLsb#*gWB$I&fE>Q z6-yf~8;zn49GVvHcN3srK}XP2>^7wmtNi?XZ#~|cmO@v$Au7A~MN_&ROm*{^@rOgY z+RZfT|JtJf3A-gIc~F-RB(Y z@D@Ij`r_?jCk z{LqOg%qAfM@^)rOqLNV(%1rhzUqzxrb>E2=RCjoCasqCm32Zz(`vdPBh(x>qNGVjw{}~hG58FWYRBw+anpeGj zX_Wc$jArKNd&QruOC=3??*$BGUd)cV)pVC(3!ygC-qYTB8ZUSJ#j8ihxt|UG$PuKA z|7rpgHw~#Uwo)6yXuJZ~OzYLBSz6`Aur4Gs1FKPVfswlGrR)agFFwwGg4ErxZs*kkBX#I5X4#n)S9vie$}JdS-+)|_)1FQ52e=X!qgN_lKF zk;BzSL%KK^2I^99W}28#oA#$rW>EW`4GKr|AJ+d?4=(xM+$=!qv5ohhimJBJXE#>r z{?Il0BD5UmM_gQ&Kj^J6=0+31SvTWNZ3XxK{d+r56*-LgEYPw%zPUXVTw38@YA8|& zDp6F)lU=bLdI)4Q3R};VUakZ+HDG9Eq|Bx2QkSF4W{1?u#+1LIds`$~%FN&$Y36N) z`Mvjq6ZzCvwE&djpw8)1;eX3n*v6ScX#qIThR7)v_qMXU~j>%->5Tln-f2|h8X zMHVX%rdVH2cJu*NHkTErKCb=1>p=O^$U__J_W5bubs5xhncr*RSEpam^T^B5QKVMh z2%h?VNoI-r#x}dwvk|d{ET@q7CSptZ-rfi&-bR=waFOq>5%41$<0>$~((hv(!F~Di z#X$SAW=f9%Jg%a$#y<+Wtms4^A|xSacE@+2Sn?}v2xRXme;*B0@HlM`tIds0f!o;G zdv_iQl;+EuDbVh#qbBvm|Dx7LBuO_l5ue}yu&MQNhgx9~d)S{>O(GB03ssmgOPtBGsV)JuNflCRlIl==wb3@lq zE4t#*$^|y$Pww}E8o2rfwDozM{sIZQ)I!63xv35hc`vbq_q?fx%I0y>YZSwBa^9N^ zq|TT!5B9mn2V2hoWO^;V>FAe2tnZ_*#d%Bg_{mz2UP} zeMTz(LO-V*bL+Lt{qh}V9&F}*#l+mSp|`TM2*7(RgF`WbOgL)f zwL6hYJ3*)f+*7D$?J zo-Y@QhELaPNmv+gA%Eo`Z-|xrw^<6FQov5i-hx}Nn4iO}aQHh`A~RkyVYAkl)yJyI z%K-|vGk9A*w<@2Z$A`ab2PxT_49QG^>ikBvqTyx%L5vHSj~;wh4_>-dbA(*XjI#Ns z`k5j@E}{j26z~$}Ih&QE{pC=z+4vpdWR6d!D(e*?ia}LSq)*JRJRzn2@teID!BJZD zk2!nWzA$xy5U-iRsSUVfyc%(2vV9k@8& z9n`@-9)zMucPs}Hm71QwZS@Y?-GkEN8)z0DAp9U9aD5U@_M`IT6_;Hk5q~^emr=V= zUEAIsgT_>W8HLm09}y+~rW)F@?=VTKfLzt9k!;*7yaV6jHO@J41|TB4!>=bL>vT}` zl>cM9|Hg0^pL_p}K!_bpI4LNDv4a9u{_g{0rJP*6`IDtjNiQ3hznolD;W5u#Ni+t% z$9a2G?a$!JFO?;|?YT^-B%>4TJez|;5H@KgOk;Z~^G_Q3tTb9bI{ss3?tQ;xomDep zA5Wv^{ji~3mGNWr+307RARa)bU(TAs)F?@>6};*1CjNvzlLe$Z97lOJ>>;qpVfhUedH7Wz|s3Dn>+BUrS4UnttNTng#JW z*d-Z8BesriYG1UF@Ly7Bi#{67IfM03;pPNH?L$hc<%}*ylY=)}$2(rCz~|EN5rM26 z^3bjK(0Y8*lL6X0+{-OCxfnW?JXZJ9Z>`s>C_uf?eZ~~5W-7l3IR|XR1E_q}m+UDP zJ}I$zjtX2qR|~FH+w;D2qZe^3KA~OVc4X%oC%6_&%4*X)=DDh$vM?;;{kmwJ)%)#vnC=cC;Licl^9>{&USq zN&Htz--H*eW2y7$_Q%yz=VY!sLFpn94P)zp^kxMMBjXeGIVKv(Nn%-~7F(G4QB)*ZEX z;k$RG@aRiqQ{Ot*=faTt?08Xride3MF&phomK1AN1?9rxPojOAX){Db1EiFdG4-Km zE{82g2$dWjBKGzeOShBU*CWx7wtuZX)zqlDm%JS7@I(P%1_VKnI1K?IvjZ29wUKgi za;j7NB(PUpq-9w8oKh*(w#-LPoyXvd;?~iG@_H=$s+L=hQGAUci zsTpKb2YCCExQHW}*t0KVyHOoi?fK8_1I1gHr;t173PxHkr#_tC9dN~RYsx3^lN7Ha zGIg;rV*iw8`!G5L9*WCc#aPeHOohWJuf&Whz)DObT?*YO-AJdiU}an>&G5Fx3%&E% zrD^;yR#YHfCh^$6B!iq|XxG{7)f}M#@c|%XS(5OqO**AtulcU#9UG1oJ)gaWy{WRT zmaE0Bt^~b!h4(f492Yd%HJ@M*OWvA%kG+ztkkA?^MU$ewiqO-G}` z5bo(_$h7%nQ~RKH`;&x(eRnf&1QB<-{aQD>VJD(M`te0QxRJchQkK?B>Jp?;9DUGr zKsIMH_GGPt&qe0dQ1J}Rh6OYR$+%{G!}22`X4n!KxP=uMg4Hxy`t6nrz6^KFGG3QC zJz6hj4@>b1vJ`8E>A3h`DO2yV z&tp{va)v=h3{MwuEj)o{4&~ueFG(OuaDV4p^`AphGFXiU`YzTbV2{TQu8D7#zBT@|w4XHJDAE6IMLBLoB zn&?84E9hW8ydf>l0kHnPq!NWxjNG=*s)#hl0@0 z>)LTK#pb*_eylg7`sHNSvg{-#<1ykD0)6z|9WX2fp4x@o9|L{(%EF0lS~g5TtAtZ~ zV_sENbu)r~v=y&y8^fLbNLc@z8sRaZ;B9C~%p<7X()^;=+erPY>~hTkQ#?~UIZ)Kx zpBw`|ygTPob{x4lVoX6Eq5a)#;cxuIE$(40xD=CW8-lEF!z~gkMTE@)%~@e2ZRHal z{c18_MEI@bLMpFM6C;GMYW-MD@>TDBJ+PoS1q+7J8|?p~47ilFg@fKhUP>)Ns15{k zPzl9P5)I>7^yMeAI$B(W9}aAX9J@9W0Dd}NG|50s9pvZt5)g4bd&Pmz3j?U-3*dwb ze6~t@Ye=vpWX>9#x0AE4u%W1yEC4J-c}h(y-XF`Xiv5 zbcWoQKS?w)FyFiGPq)Q0Y0oq|qik$!5DU2d01&L9p&9s4dEgFB=2slAQd1ij5e&sI-mCdrKr{)V+d+aKxa&(&%)0f#)gjBR;?{pB#J@W4oQj$AxwDQ)! zEYZqh;#&W4y_H9z9pM>s=d-HUJMFPtus`_*XHR&$?o8Z?l-$X5(c@c({?QJsTVxoY(P+WXrAh z>Q711jUHi0ruJP;#&Jp&OhQkO)ZN|vxtC6{X?za!oq|FP+%aTl{Z&5Me|CR(g1s=V`Dh6Gx7MtA19CoPmH!tUGk4~@RLqZU3nl98z z>rXA**YY#s0)c7$tvx^mU*OwkJBmp=ok^Ct@|ehh%<8}_t@e1A$8Zr2iuTnAzj0Da zsu8t!%iEM!V%(~T<9~9)b1i6soF#v@vs_M8J5i1kVi}XM!tJsn?C^cw`%8(c(T;u|NIg2I)WZ;6ju!y?2P6b z=uh?c%Z7y^-<>xA!UrTR-k7F&%jb8f6)jWFw zLLfi=Ij@*sp*{nl*QX+`oqi#n+1B#!Q&UHqNxB!{D$FcdwnvWNpK`Ix3H(^hp7?g- z=%n1a`M*h}Gf7j9`GcNe9>=Uem#u2E@_Q?D_VRW+WZ(pWvqs#48x>zjbLsX{7o0A+ zL#;~^;^K;mihsfMkn4pb(zTWinAwU*hGl63Ui!bro zSuH!hf?nxZe$>?^c{&q*>QFC(p5%1nA1*XS7nQcg1C1FIhOD1~l8bFRn6YF!L;~=V zGM@*_($>w!H<44k7~tgt$l>OSV20V%TF2aPHpWT8RGr z{_@4B)T`0bjbAX`(xbs!@A^LWDm zY^~o#2l|hFMP3J%QzN6Jm{)h>3D9%nBWjW4Ky3LW_Rvr)nxM4~^xXXq_{Gzz9kr#X z@9?SaGuwlhs_DC$7Wl}D3lUV>+1EyvYP9gk(G164>`1A3G}~bc5PQDmgyVy6@)wc~ zQKO8I?4SKFQS|e@F0n+QQrHLIt47YCHRXgM zp`lXwW}NtZ13^qbNpW{W-U@UKGQhrsQC7+crHF8~iwj63#haHG%_;mYd}~ZmYZsbV zJYrcukp44RM6UPo(QW@}6pq|Sw`uh5mA&U$Q47?BL zW6!Ud3L^vtwc_P;s;lmW&u6TxAV6?ZvsX&=18-aLdh*FD`2OBYUWm71y%G3{KqkDi z_a247qHQP{7{WoN+%$Q(Gp2He1c@E&4bY9 zU>Yp3!l)ythNwaN$o0ky|7#ZNGddmFBFU5G z?ZrS)9r?v>46redY4f%+wLI`W{yVQ$)IXRcp< zsaC4fTXxvcb3v0s>XBVi5_#mc)nrelP40CuyXUrYBQ9WI##sf^~#ynAuwtnVIg^&u)6LnBqv;NO_}gads<6 zCv0;$Idgj=5;pP4&`5?m-yC5FQX`Xui*H9YQ^j(4Dg87p!hjr>pHpgQon*ukjR1oiaprv-S2co#I zp7gjc*IjWq_kD|oqk4O_;3NE`b<@aj_vZD>d0?Pkx*rIod+eH%K8zWa9z2ycK|Z~E zYiGPvxZMUh>B4K+GZj|YW`lZNOaLFbvGz%U*xN}feake>S#AER!TrqS@P0?PV>E*Z z>WbCmdK9%Mv~Zs85x~#}Twi3MT)N01>wWLxKFpe79r66lSj!e(DOwl%Qch(%S#(MS z#dgwDYdo*(es8{b$?Q*pT$T7cr@NX`&0U|y%FrNFbl%wwr!x4bWNW@e+xLS_TaH? zw%C}NEzd1AkgxPuTg}5*d~Rf>9CiV6^(%gglv_GN;CflCV=_bJ-CryP0fH&-JPVC7 z$$G=*DGI<(Dl8~=inJqmN%or4&)@|-PHr`gv?i~N-^M7CZNQR>l8@vfI!4w%TkFTo zd35>q@sxO7g|aUN)8!%Ob_Vr3OAcWw;*ELP+U8d>yrPI5>%|Fjfj#6O_LZ~$efjJ? zyfYDA@Hq&#MRA>`q*rZwJv|ZUoq~#s($+r_T5Q60gcmDOu6u4@<(Pal>ryUlj6NF@ zX6ZDXo;u_yWXPMFOCb~d+v7br=eX_>e)KiKH*cVJaCFqHHp5_PJtodi^9bt+)A2J; zX4G`BH6+Dl)ZV;hdpyqOFv1&R{CFeb$4-5> z2WQvjN-%}M>oWVC-p^~XVXHH3*ynsi^8TixC%8r*+GvX8?Cfkmr*CdfN0Z^?Ct0sd zvSFOtFSySNeu&@y0#v$e3fxS*UqyaoaEhee5Qh01z6`2l&-c^VwSyOZE0fND-b(Pu zsQQE?TT%P(E-SP1-<2Hy=aHMc0`KKwItlTDj?4F5qL`WLOB`qY7BL|Ywr1ub{*$civOe^V-=6Al_>WCe3SVnyYy@T4+k}#1tn@VD?T1Wq4!tW=~G%?9H-2 zI%a&`1oui)^jFsHzE*VM`{Qc9DdCGkg)Z+52K7?eu-2B7ZXzjRHPRJA_%$#?p;u66 z;-pWN9Zm@Gt9u=`QY)c7CN&l+hAaju8=Gt!C*@Oe-gFsyD}i@2-mG8Nlp)CwAN6ZE zzid`<%|AY?v0I94;{Ut@1a&dJb(G?#n8wM*SdDJ~ee9uV=DoGGj;9%w`rF$!LglC|3ud!V!r4EgiW~%kNfDpE?`uZtFSSYaFb% zUn}_YN4nSE^OQxwezZ6LIA!U+o9mTbJ(zgVW}Kkg{fi2Eim#k{0(5_xeGPz6*$>r) zd}w@38?LwmLmzZ!Y^9_u+~%Hcr%Z#Fh99p|fEPa-=dF;)N?tN}0kpC%XCI38s-Z_F zy4%b9GnP(gA8<;YAga@M99;qO!3pG$Myh?C^P%0B4BETX1l6+6R3oIESPTJwKC7$l zDwc+~d~A4w!>1as#6ef}#55H!nh2=;xZNzYKBo$9+A}1aOWaxgq&HNTYFR0&+ds1C zP;*(W?JqR~#il}okb74o6KxAvtKrvo3F9CIlYthx1*39*oMNOGa&)+9C*=C}ALA@c zz6lt17mNEV>(Y({8s43W%B@tjMCE<1N9!YBTp};elQEhJ(lz(_H{WFft z!GoTENkJw4n>oB+NN<$Q%7uI+7ys4yoq&S}Zk#eU4i1~?pcQ=|OvPpY`P3%9D_pzo zAS2DmA{X3-IIZ zwWmd%@j1B_B%<{6pGZ+p)R0Pwiq=Z%)Ttzvo>y+YkR7q0$9YIAcTO{-m!1u?;}+>B zdHKP=yuKZZst9b6>3`c-a_ zTHv6w@-wUuEg~$Ui;L#DtdT$}2MY2yaqV)&&|x!+=BWeIkHk46 zF%N}(8u~wUKaz|QyxCLaR{6Qk%*lvuq|4o0JM?vM`cW_`R979$!vLwSaIn~RRT7I| zzkFfSa^Uj(Ds9-bkQY910w>;wWdwoV2%~7hc>Vi(Q?G|xTaO6ykODB+DKGCsR?mD5 zj07D}PecmBF&fdZ&4I(WrEZfr(p;6i_yV{2!eA{dDn)fur))6H9 z)Q4SBdwY8^f1=UQJXbeKEKLQIQ^Q^5uOsvy;HP2Ms8>lT7Cvfl`UnxrS6MVnkkX zd4F=I;nd=X?zr{Ky|zFs2sC4~k{!TvC$`gxxZKlJGLQkV0XGwkgxa!ESk{fm?lfiv zYWUCkIRIHr@_}yEsm*Tvv0-DyfkU-|rC4uGo>rT_V6Eluut{nxJ}TAV;Ow$#xQ-U8^?!fqbQ^)??^l#8VuEzq>P=;CZ?po&dpV3s@+j2G3cH`E(<85 zL7r}$%efuex+D@~U}*d|z-aAlMYA?eV{b3VFBS!fEQ~_jNtxbn2}u&wc7Z&v;Y(Z> z^xTsDIvifc?tz0T7Lf}P@4xPxF;>l~QjOL^YI1QWo`3O3 zVikFhBG5Uka4_zLS}t8&&*sfez?A+I_mt0?HnHnHlGl!mzTu8CxKiSza+SlLohneW z2lONdeQ#{+6wY!fa#1!iT0O&4FVou#lQyGw%UN>YTF9}8)(+s;J*}sfm5qkH$E@1w zC#~>Sa7UjSFI4H+4X|1EXD0D~Csh2hDNE-)Rv=l|w5-nAIO>F3m@-X-i%I8ovkp(I zMtV-UYM{9IJl5Z<|9EU}@pq>tM(0b%$n)eXDXgm;k^@@ci*2TEs^1UkbkA{`CH#A- z7%+~EBUmj!iDdgO-r}39u+!=nve%3tVM`Z7qoSxNGWNJx-5k<-e(Ip-;m-Tt#Kae! zYBvnPFuezn&Rj5HDEIaks8G;>2n4>kxuXgdK2)~}GXqacU4N?&vZp(Hlm$jv;#?`# zx_MHpMt)`e$H1T`_vb^y2CrPM137}&NP*HKobC65;(}vv)@C>U`L#RpySJ||jQxDo zSraW;k?d`3Vm#bFEvXeUwk2ymt<+k3+@~QeU4st+4#Ih?9`fy%5Zb?NY}`;36LqCC z8$qI%geKyQ8Hy*yXhry^li#~Zj<^)FleR-7K4-5#QT?%1%Ha}cq-rd~+-&eJ>np&7 zr+6*F)>r0uk{TxVtJF6la~e7DfmbqhT=qXl#BeHL69G~b^oG-|My9j+ieRSM%?%5L z;PLKxxl7Tccka(rJx5@2b91F^ujSJC;>z^S;sT_6^NE5eQOg<{KzVaGS7$r@ujg|I z7<#s|z5V&m2kZIkR)#y0IBId@Sjl?$h@YuFaiam2gY&$lL0HVX`jSmqS>$Rf3+1le zr*W}&0lY>rXGpci^p+L4PSf))V=;kgkT&2C%JMb z+TYnsqw;~j5ql14gI(&pzEH8qsA|RV-}FaGs>?VB#AJ>4Lho2-RD-`syh;=DNu0S@ zo!I@|;3tYDb7IfxrCr|cCJpO*Ml=Deoca5=qqy!@eV>P==0^{4HP6HOnN*KHy8dLr zlu#^c#V=ptVjHN!ado#bNb%sGJL(_5Mu{U3Z|cCbNeR@*fy!7a9LYJX>kS{zXl zGZ1CnUdvucrM_kr6<`=N`u!p|Sur^1>-on>!^wzBWK~l-iN$vrrU92a8XEt$M<%Yl z=*ZdxzJWP$=^%j+{KQO8*yX;J4#SWn9t6-jKDUjI^4oGy4FHTyf0-NlkY-Ab`u6UU zD_2f`c5bc(iKH#Sa_W#!{W1mlB{gLs84?u<<@B55+*8pqQo&>}63;)m!=DTL)yv2r zQB^BQxP%5W7mum@DXz0KpSh~)5@WmDJF|(xusU}AZHgpUheLnuCW+b_{zt|!iw&Yz;F}%%1Rp-M> zrA;Hg{YtJ3u-qN*1?EUSyZg&~XE8wp)CGed+BVE8#j|R0LQ>Kd5u|yoVQ>A1JwJZc z&Ch;pfoErBJPPZ$7fSS(SSh|QCa$U7CzS6yEj)O0{jU>wDx8{#UKSn;35|!5Uqp;G z#-roc=P8myD!IU0rj_;w*J#yd=Y7TLgD!PW2>(| zr*rdEF01%(EJqCUDio)Qi6V?bj*X)S|CI0Q#!FRIRZ*}pth>eYWSEAmUQ`X zN#MV~Cq3TDj)S}@(cb$;AbmldWu3(9XfitvJ6Uey5J!lTilJ^4V;);i#zcJG63DN3 z=kYoSC0}5LP**S++!5+IdT?gjlZc7bjktYFVTmKj%Br`1y(IDlRvo;CyTMYwMa__3 zncV3S*n&bD++j z0fcWLgtJBThhm6vqQ;yN#;IuNx&6D)8yydE%ulc{(?U%4)w;a*a(!tQUkQ(MJLntk zTKH<=IQXDmPRhSW|k4Nh@xZV-BzeCkq6AeW}2XQ0RDH$f%hZarGaf&Y$E*4iDW zuK()mNZ?i#AUpw;n(%|B2zUaiK8p*w?7!H^3L5*;Xw#kCL$DA%(0{{+ z9UlJVH=)xGF7j}4=J8<|6o7kinM9b~PkQ<$Po$JO_BQf;hDNv|Z7_QVGQqU8NR@?A z=;+&A|53$l+FZ?#*3x1q4<($UPjnO+!FraocY-9bq%#?E??uzgSzrCU9{3_m^{$=A z=hBS&MvfEb&j60xj3}>1o`_;Vrn&VC-|qxXQrAnF8h_$HV(rz446DAjCXe{A`^bjpfkKOIdFchJYR#pkmFd37qxKK1d9kzBTLiu>&!J zkO>K;Yrpbj#}_RvX$Yj10TaehJ6@@OZ$Q_iIGq~WF0QnyLM&_~s~jDzOkN@qGBJhX z+0x!1@P{U*;t6NYC-9dZ!BAVyyV$i5`Hz=BUV8{gIY2`T{0L?~TKGXOiQ@I8&@UuJ zZ)6DJg#JywCpIY{mW>tHpD1*NpVV&&I%QG-%DLAb30?z^=IiX z`_^^WG(&nk@|BiPw#Yk>P_`d@&vNmIJ$k|bI2M|-{hH_Jt4n&~Xq%5$Wu9O2#|uYx zJGlw<76p+c{F6j>=%kq6!RihR`!q6MEo?r^>9~oiez_O_$0WPL=LurF^5*T%dwNa^ zM0MvcRKQ>}Fdxy#I?S35d&%j{z=yh1<)B>1(wdC^%G?nOE$U>(#X&;l{QXJBW5!Y8 z)}esCs|B8T)?H!LKPO}lF5!+t2*otQ;DWzqpSw7fz9J6!1?oGjNEp3WKPf+bYe3JU zrl;!<{bI{+l7IPL_<1y$q`_EHO+-DQsNjJZ_SfB*u9Sxyy!ywvvt3Sp=~XHx$?JW@cufIFZIE z-L(K+V8`h%rA1$!=}x&9tes9j=w-gOVF!}Yjzrdv!sBcm@u3_NioE@ZwQu+j#C>8n z;9^4XWXeA$V;Tp)5=9pdXUZbIoPXCs!gC)aI)k|upBWI6+qq>zRr>g&bpP#zV~$N= zHVGG;V|SE8$XDW6;R~O|eccV?TUur6ISConhb{kKEOlAsyY^qy)xpdjcJP%hG|125 zQ{|~c>rJF>edW_n9gZ&lVDYt(j_A+y?OZ@&RlmGzLzo*iY+dwON^2hm_^Oe4Q#U9* zNuup?F~elSej}<2Y%I(9=6(Gv$NWuGrk+{J7hVPBmp<}1HkOzdeqQDHwWz)IhcB!+ zYP2a;nN`XLxy_1+skuq{?Jo(l7CuiKQM1uQkUKjyd!(h_7r()ZrA8|0m|z&$7JJlv zuUw#6cs(Mz1(9V`NZy@@*=WVH@c>}PCf6GhdTbyngro7Za}1dR5@E^-w%{yp`8aYFQR%n%B~3m!2y+OgOoR z+qkH??Z2t&W6I)WhdCoxR}H}oz?Py?6t{yKbzO3u-o$@LZDNgvKvt28>2dDu%5aqU z16gYIHs{dy75NSpmLiTMmt-zBm@d>RSr6{k`{TQZ2zo*Z7nfQFKLQr3(%)!;R!-Vf z^~J(YnbW4!&JQJTg#@iRdy+9+>_7W2YQEQO`!(TgwT)~}%$L&SIq)Ie;Mkd(}Ky@;fYhn^y<>w7!j58>oCw_PlgfBe_qzrHu6+cO~CY&<>ZaN0}L zRJk-eJ6oMx1!AZ@adt0=oyV0Hdw&Fd=GDAzZ+|H*Bdz0kI!hd2^D{&%HQ@C-pzZ{= zjwfkknAjpa89&Tz%CduL)>emuMn8@BI9Ni0Vw27=z zL<2GvY{So0>tv*OnmsVTgu2EiN8Bxb6_>6qpkNY~-6UjY6W9voj7%5Au^i z$j4ne+WPr3mssZK<7;lpK|n_mcX#LI_PXNlmAt*DZPMl~gB}!_2Y_)E_)i~UNgOLlC%5}B_C9G zALT@>fGtU0Vriv|MB~qQQC;M=+AAN`;zie4-Rebe!aw>Za8I00T{LMn<^{PeO2#U$ zZ*F8+_Bzho%+^e?gYl}ZS1m;D*IB}>2KV)`I%72HcFhd%$}%$Ht_fhzwrMoGVT|R= zk>pvfsweTgmhxYIv19;86KBb$#lh^w{yc%t#sVmr>|yA(m;ZaNG%J1N(05BX=n06` zMD#k08s_vmP_@_WT(o^c)fNf6!86R>KmL=-&c*oU6kYp-^NSh7R+Q)K=!_h}tqsB_ zaYGFciYbxd0O7L2mDUNa`}+mLLya#ml!34F20mN|%yqH30bm?kx^qt; zNi^orI)6ILq~%0TlV1LppB(I2*#O}40i0VMHM{itM^~OoSqj{S1HXSqTV}jt_Bjbx zxfyr(Hm6kHn;f~mdFj7zlz3HN{V3VC#m^#M?TLTg@}NcKf|$Ob0qcuGRde39+VNZX zIBkoZ_L2mi7_qzTV{)F7qQ>6>rQg2{k-Q!nE$Qg!b_}+`s4S{tH)8_*rpuy2d%6C> z&HA;d=fzuRdv*AWQ~>o=6wfN+;q4MXmP<2mC=VZJhG=PN?GEtES}wJ;1}DVOg=Jas zBkmv^92^Y~mvf2yt}e>wXID_4?+8!Fo=5A%bOErftKUu7^4GV)Xif|=jXHF5w_h;) z>qYYQkpp+%#pXc2F;r))h^jjMI$zhKC`>oS#u6!j=aWImAmd70qR%geyxhe9cZHPH zSALywusIgnZVL*+&Yv&na{+}dO;~sWVoxnYLtqqW{b6I-$!^$&*OMprd*>I+O^3I1 zU0q$J`<@$p=LHFCZDRDR0El17JMv*6|F+jAe4h>ut9qA+%S#u?)tzw8hCqov^e2c1 zHdP)0Q{wPuqAZB16T4VvD?eVS_oRoUCtv7-E`I(@=4f5kwSD92?%xoM62{z3U@JOG zPe>v?^DX=s`X67I?Ou9 zYrc?tb!Zl1UjVb%HfrKZGd*{mjmj|{Rz_tX39aXYrL?cIQ!;(2rQ#Si7`4+O^n~Yg zNYNcl=JW3;5_EzLrS*PO>aE>FN3G!<=otyBd)GlnkYE+u#@`l`qoeJPL(uI7DnU1V z=2voK_4lVwtER3G<26Pgh4Pao!!5%7Y`z7g;V%-(tl#D-SDyVZUU zp_pR`V3c?nA7C-WE*d$sSLXR?-3kz|6j#4DZ|S}S1Cu-a*Du4V^dEI8qIHFehD7U_ zKMw{Ke~|Tz?3Q8h>r{W5DHW9Suoe50Z?CDxBvEi*exc{HZFgiuE=F#kw(%lXc^gqK zZ#BV^knSwywFE11JCngF^VdKA@4aWxQQw<9zE@q=#Cn_6J8s5RLc^k@pl^k4LUTeV zg-b}8u{3o3{%sx@qcrlpRUhycGo~2>1g5ENV4JyLOsF?JaYIRJU*-axu?ak(F?qoW z9B0w*&U=$JK=3ZR9&aw93x!4CXn|bN?K9@HbPaO3OwWUzpx0ebCnJ|6{)e4F?<880TP`}tIYymJd+RA!PYi6^oB|JVJEFr@HGrv@7dwZt793DoY4ZOh*wXW zzV&3k3(T;A({hpOGP{F~6Un#j{~g8xP2JqYJ=An4bM?z3S{ZdF(@fGdXveWVYwCF2 z5qta_l3$Wk*jBvz3!{oPR*X+UDqykidx4Si)$n1chS#Unin@=(Es3H%(!Nn&b<5(` z3Pr^`7L$bYJuF4YnCpJjG0@BOU!IZ+y1p2u3LDInieeGsek(T?BuKUkGFM(YHX*<6((_p?oV(3k*_wc~#bpfSqR%@tG=fGhTv&%@zip){#~l_W{x-nMIj6mmzj0GRFz zo)ZO_GhsKWX=*3_ThevD+5L9iN5gl2yC&kj;(R@0V&7#lwwaR` zeb8VNUUURT2h>34b>5~|SJP|WyE|Oa zGZEWCSolL3S;iJyrZNpSX76q(<&KnMyNa90HUsTdMuAR)FkI7^NJ4oQorRsGZ zR##s?JvGIrsE7hcV=^quFhHUO{sM(pgz?*@yOq=JD!Q-lbV)yI|K9_Q=Dq>m3xF{}6;KTV86p&T3((Oe zW@SwRf-^8RprWR>FZVj`z5;M%H$7oLB9fb%-v@aQVuA={hCC~BbA7|;T7m)m%s-U{ zV7l}KXz4H2nW6vy1r8RL`u2|t#Xmf%m}+uqJQs zm?qsQj9U=tIyYqj)H_cn%sBdAa(UU)jo83N`1e~cB%coAPWb!vzT0w4bmSYzkmw@; z%?iXh%58*@Ohow#gq9xHqhJ^bxAVHbmOec-J^!izL3n+rJn4!2%CBTQm{CI*QhF0% zIlpZ@couKJ!UtA*?3)3AJrujLwKYvZ0dJ@;1V!bT~dY$H}`6y%-@PAtr2Ye9z(S zwsZb|pFP}$$L)9>Fln0^9c_=RLC8<1X)8Rv=);9^NMVECDh;OP?DB~fTz-BhRRBw} z4yM>dW+vPAC=Bj3+$wdPc+p4Rq{6v@2h5{GPEjkhYw=Xbm2|%F6H@BjEuj{^uP8x- zbt87yX;^=Mb$|GPedSj439+;A70Z7~4wb4+kR=bz?yC$+EsRM>2-wVeGUf)(B0%-- zYCRzUjpBKsSVXDecDaiF0Pu6(lMn1Z}iAQ^b{O(v=j#DN9~%Tr|~sXj;?O$a3q41UE%rel`#K8)cp)u zGKQgHXRFi8=3|NQ~92-KgF4)vQp~{IkTr0!`I7 zk%&wL=uc{g%uhXE?U8&z3yZ7Ryp+5$)y|C(Fv~-Ww z`N4Wk9XW5!6X?amL08#t73 z{}ea@4YJPcsw$hlyVlauQ1?r%p8h0F2~STyXU6>R+cV5?TCIW5mY9W4l zduB7%y*xg@eTA!lJO@9sDHKtUt}e$waz4fo#_G#YqI(K}=8mOO82ekB z?tKn3y)$vF-a1$j@wr?unWbj;d?4_zP9E=ld3hh$0+IFrFbXb`YabpS-kRH~CI0fs z_<{tL0Os`WEtL^Ri#TSfCUH}5Vn1e6)jo4dP<otGh&p2qzc_U|r(RJOtx9pWj0|rIIvD8H&m>xM`TpxVvO53! z8%%4VqS8fzA}KK{F(x#IL(O;2I=a1C^!+oPiZf{?ua-E>`TpWl#1WcywE&p`)bC%_z8c;R zFo0^KjWjl^vJU1q@3&oo=6%sdS7&|%{8(^6``!T13#6Jq0FqEZ86nH%n-g!<&irE2 z(~e}*>qQoW^+sFWsWza%)VO8`Gs*p#%eq`5(v114mIWjI#5?RHjD^x&l z;q(y3MmD0-fXkd%mVVOzr-3a&I#s~)cpFctFLXti16jTk2F|%@ATIi9XV8{H1KEgw zftN_dO!hgGkU1Fo@53+sY<4l#OCN8d7o1-R$UMKrHsxX55!{Dc6t6Ys!HBZpchJ0` z32k{s&)VTo{Qg#2Zk{8 zu&BKH^2Os62D&-`6w<$pZDa2qg}`#N`x%2~Cy`)dELRvK7J%HLzpK|8!2vUNIG&Y` z-n2cQXgi_+qM3O=57=quvGKddcurM+zYc?BEspku>QG`0r)|w@Gm~HaHsw9dAO(<= zklAkQz7w5fci6A>S{@jGzgSPvHKmONfA6B1ZW91WMP?4DCo=g{f!YF!XK1aKW@qt$ z0!t9H=teoFNaav46;Bpcp;Wxb7s~;o+;@8@0#~O)&t{?Je({XKetKpP(BlcJfx-mI zv0J;|3=K#fOGF#ET*L&w7^xLs4$djyBI0qpX9aFimcbQtg$Gz z79wq$65_merE^~}{`iq{9#)8o8G{ZA3bcop;vqhBO+*=zrryBg;JZB`{d?%t+kz*( z9*6;hp^S!{z<(^Gr!BuV=TGbQ)=UTl@$kaJ_jK=W;)}N3!F1;hS8-?Q(#lFeHTU8g zf29xPU#4c9?)r1l>mD1RB-;Z7sUoG6(f4LA1$)|6wBCIMNMe2iEIrJA_y z*=d$;=I$!N%P|}NU&5-qW=PFg3Y4DF;33a}O983I##D5fim7a%$pVm~LZwG<1;LA> zh4?b{BfmK+^&s*vSPd=(P)jK)6U4q}ka}<_#fwQL=b#`dg3+H6WbxOQF#jXdu2F%X%MtzHjqe z-^?V~qy*|(!Xv1*NwLBWb@hGWlpUM!K@LC`PAkEi2_`7JCiwBwC`M>Vh;k8}J9AKs zDHvJG&{abSwXhwqJ5!|%BU7y2sLrHPRT(M}-pjX6EzM2IWE;v7*SiJrGr{Z&Hd;!3 zhNgyPwA!T;Ae_pGH{bb(8Ta1sfcf*;a;AVzr#S@R6DVnDq?+&Bfm{^Grw2Ya?wL|k zAKWS0AP}g6jXxipGv8M?pFbY0wtzkhRw4wyrKM#Xa4_F?K0l&>6>yE)AMJVmDFiL_b^O2t%uYl1^op6QVUi6UxB z^4|A2V((}Lg7E7>-Y|2*b~(@XV?vF@YTWbEt05Kb)1e!Kz&>7Pcj*+F3bM!*{f1Qk znqgN;P&xLeUq|l9#ODtlV%oRp$h%cq8oI_wDNEHysMMXZ>Gj{vI!>WI)ZZ3bbuob& z3lS1L&dt-m2M&a;ea{}(`wbMpYl#4+95aDqZ+|3Y^ukRJl_R@QH?($;n&(A&`9pbn0X0Vo$46G23AL|=Dn2zeFdE7ClS z)B|W!5w&;r&~tBV!I|#wA=Pqluk8HT#ucY~F0MjJA8?QdrE<0akEcaq$qEZ@u*4wN;TFneE`7uPw0B`|k%+*8oH>Mk3&xshxoL z#rW+J0z6QEQkaTrul51}eq2Ur>33jg2&Dgn)YLGYn*`+g!~*n~`FVMMK=%@0Z~-QJ z|JaRXZijf8o)4D*;_xzES^-$odP-z2`vZqa-U~JWYbIqV{1wm+Lq*;D#}ajN`svll zd!n0dnhN}bZ#QALPIN=V&xdpK+!9j)AX=ZTHHR6FCRGE3i%alZNDNGo=*Y+i-Gq32 zNO3ucXD)nFc~bJs@nd;$um-ZACz|P)@toab=$iz8zbgT>QNA2-XtbjdgLl03E78GRx?ArpVpnr}c&=AZ0cJG#LOzClbIu zF?MjCxAh!hehSnY;=6(mr) zUygNvq&y?I#>H14k?$|T{py=gZj~aiyJl6Kc{(^@I4UQX9EZhPV}{8O{IoXeN`L|h zRAF1)B$~s)0JOiOun?bJbNI{gq5JjCP_bWo<&3dUDM+|?k9cIcx(Sqy5UBY4)!YyK zxusCP))F`Lfd)gA+W5YGVx;fi@nErmd>80|{@;fpRgel(E)t=^sy7ZL&O09`tcPTD z7R-?5%LSTxAS}}zzYoRgo!;bekJsVk@c6goji`*O8VrillaMBCZfwYCxTiVq-*5fj z=lN6rnqFTA#($#84h1--n3&B+W$j zr<9-SzZsY#H-`BKPi-v7XlT3y8~yvW|9!)JyltRT&TDRF*VPsGC5uH|fft57qQJsD zdUXGc?2R%U3<|jIjh8qLz>(}gp0Fhi^;|ZP%!S4*0$q^~@KJmtVQgvfU1R%AB;gWdL-`117W}pDFL32RiyEO0?;?mMi;Y(1OydB}vI6WQ2hZ+r)l~;05 zar`(=H~t>(rhuT2VcW~i%>OOl;H8^KASPlMqrOw8H#DHx+RIMJDODb+e+Y(oN7Kp5 z`GR8DsI~kT&j(goUMm_+wP(Jn$cL{Hm!$$M55=~ zteLH4rKG|nl|!}UY+lQ(D}!rp1Nc~4N=Hzn0>$HXj6jY0U;A!#6$vQ}vLC9j z>vEB$ra(iG3Pnr!m8K_O(ubVfkw3!Q`I)^NTsysX`z37<4X2@44*YAXZ|UOHz(-sN zCRs;^9%)d>;(a`WEZb@*a;jJ$0~Y0P*Um(z-k<|HV$`x|C83zg9h~Hq_4V;cJWjyL z&LCgFa8Hrmll4G7T}U>n)4|DD2;r6VBhs3YJ4CTQ^$ zgX5HMs{_-lU-W!?s8`7I{4 z0eV|;lhV|A^sM$v3)v^#0wk3QCmDIu{Y2+c2~-BZ&_oh-t52i0T+qn9BGf!3v!d0j(?Y4 zvy$35lOUY89~HgkKqZXu_^n*gQl0}04lrV4lA;bqF{ik{FU<=(uYv&oHB(&~^YDWG zV5L6Vpt^+>=PUli#16?M83uQCrtmYi9aG?R0iKi&*suM%1yri5y+u} z46P#52{C&LG|7P9J49mAwn*TTq!(NsxZy$heL5BG$db-e=UiUKPKYa~{CRnV8LpUv@^aV`#iwQ=Caw|5w?aPs_h97dGm_v=$ykGLbdsE+F ztud%$AcA0c6$L8|pgxE*K%@g<<#q~`}16O)zRjO^)mk?SQhrAv31ieV!rd~qpFV6`haU7%Z5B)w=i1u zcf=1S_~$fP#8ExO5JcIkQsmY6#wMEWv~x(yE{yL4pqa!9(N;k5DoL-qyQuR=sQRm)W^xo9%UyC^c5?BtP$Nph;HqCl%%U5oFw zXwtB!1Ve$*u)$D{d?z;}VZ1m*5sSt4J4z&H#KKC(T%~7PRHk?A#ml-l_iwD{fU)*B zjb4%OniT7z__F(NBoN+_6iZ|mKPYwAeqqS7U!tHYMG2SmDTiJg8p+eUfqu=Spg%bJ z3jU)x@IZ?|;qjt#`T1=(84oWr;NZUv2uE>pinG*ct*w~=-3s~*PpGGxm?tdLfI4-H z5|$aBH2F(iT4=VkLi&Aiyk9hx)B`4VrQ;L*;)316+D9DSw1YWKd`-Kjzu}>vA1V%8 zaX_#l!eo?mX*}CT#0OWPl`sRW{CCY$iC%JdvnME37vbWg9gPvHe54;e$cGO<+&d$G z_KKGE1qCOJs$~y42ZQmIT!>Ui z92SOnV37jphG-i>8P?Tq!8KM8IV}22w67L@7&lIL!7qt^_-uJciBF%^A;qXEF~3B?CUz8%T>>WICYF+x0X?NCle!}*7%|!m9LFn#&u>a&&zOcxhqFzlaA`?A zLZbuDv6UGuQ7IT&{UgjInkaN{!~uDO21?w1v{uv~%ZyfH@tt<&2{YuU!kN6uuh_UL6lp zuM~A?j-42Je>Vm7PIcH^VCa=j2r?5EU2(CE%%cX%q>TVdF~WCWy%pCWq#27)fyL|< zjBo;Wv>ek-9zX**t_EX7{x;I^o<2O+IhzWOvJ`42A6lGS8Zd;Hsqr-Nv5U4hD42?nz_R1wb)j)5!}^0X|s z6B+n&2jJJuME;mRy|n#JSgoNy{J=qw^4dM0|L0jl%cj>+q1KOwazQQ zcx!d0HLf~fOL0z0mDnulA90pq?C8xOFw)MH==T^eR;+`AcF(m;J-v@LpL`p@Z~szoN;U6La2n3;212H2 zT)Q3eDf<4`TekE;`j-oQ>+cWh?!v(M&X|dhO6%wpRm>tL@{i=EBZrWm&soit_~r_?f?Jg4(S5agiP0Ffq_`pc!+Mdru2vG=$7J>^L9gcvQ&0VGwguyx?wj{mThNp&*ZL!&MJW_JV0tq#X~3$w)|M(NSh zyj*3}0J&ssW;m#zo#lLyMlg^xsfYwE9yP_$=Ae7j8M%=M&5-j7+wb2(dx}tR?YGW; zDciz1!q{>t>I}O(mYvU>;ZjuxTQxQICQ*}tMwM6QZ9qmS8+<9_VzM0C2Z3i15hS~8 zZ6(x6eTuIEUIRW|m|MhTuyyzD0uWblaE?zdBvQ;r`-D{)@5B3_-mvn);tLsodtz_R zjn{hPJtIHHurk$~nE>yD>Y?+sG9GW0J*-0LdB>hw*_K>5NXs2YpQoD85;k$+Wu3Xq zW4d+?NS>qZrWBg5fsR~WLBZD$#cdL}CJPxdQG--e6OL?Me=VkIq5$IPB2=c@wOgyN z(oLuB-xeArlP!*aF58vvrThUoGTF=B29pA366z*J%`BP%$x3F12uN7x$^50d3R8l} zd>FAQ->TLJeLFg9nc^hC_#(I|;5mbeY9bUs!jT@{`wb*>O>WR#E0j*KN8b<$E3C@E zEEIX&!BQI5vB25k>oOMUPB$3`MWq;qOx7=~#h z4e6Ab%znFGHU!Oa2jmb)bB;#d7p3udleWgcM}P}DuEvt7^2JI$hW5`&qpF+A|H5b6 z{la%3YVVj0nL^WLX>?aFlkc}6OflG?)+&Fu$UZpg8D?6$wra1jWp(aQorKULFDxf7 zq7FD1DuPC$RYYYs8Jko{SJGi*>J<{LFXAdi^C4T|ab?Jfn>S88HYwg5mJ_X(EfDVIBs7PgGfSu0TN^Clr zg2B5qh|iQSj!CpctfG4ig=IGtJ>(PF9$aO8`5Wl=XGBI$aj zKPhVuQC0550h%*!$HV+B(4tYsH#>7AS{-NdQta=(Y}zI}_KttmU5HS4Jk8Y0S9Odb z2)JIejqCp}iimg$g0(uI=hiZH1f~~mwXr975L1ZxROq3;5*Hd5ncmzKt~5QK2Hdy0 zHjfXAt|u-96vpq**DT8p;pl<}Qr=~cPf{P=r6_xtda*Du@gc+rYdjI}9V?8K z&K86X^UUfP7ELgjlf2Wna>(haH|s5hdg%7(kJ2=axet~Nad-^AQFIXRc> z%~@NW7fB!c`z{ZMaJ(d*$DT=cda`1)hXyO(iI(*#NQK?WGd+H$6ev@%1kUn)D%Xgh zQ4r*0(r2)TRq~mttCuea!d>d(n%tND{MVxJH)pFdoh1iQGQEMeT(&P|668Y-3vtwyY)8jfaQzLEROp_E7~29jl$-vARha}Qz+9@Zi*z}wjO$K+p~ zLIUR2b7ZvN#b=uI{Gv<7(3Q@|T&)!YE8eOY*uD!vasi~imy~E!r)R}yxEalfgf;a! zi3xb2M!iC+Ib1Mk6B)BY4E+e&ncBytIs(giks*PJ1vqWlo-F)(8P+2MR?Ag`q zs6hJ+(57RuEFZR{^n6=&mglfs2yS^Y#z?T+yXPHHRpL3b93C1sJ~*tDOsO8t;zVJuQAbxP~|FZbksexRy0gSE6s|0#&ir^RG!wG+lApO~w z3t|1E#V;x1H3S6Ckoi{EdM*7ZqNn(5UH1lDe~P_z=w!Kq-lAK77^8&yE3PAK4?{2Z z+V@a7wS1-`>NzyLZVK{48XKERp%R_Tl|048wnu5< zA&{?Wset|&Ou6N`I451u=VV6wBsNxNx!PW$vb^URmH2dGsjH~G+Z+@XgB26+E7~3D z*fllxiGQ8u=y)qnzTv$$SJ*gE`BTAYmpX3&p5_L(h0?%$IACpUjR=D;vR|A@^mc+1 z&f5;e6|mI^e@c!kLKz~CL_4tCS9mcy{YSE=Tjyu-IZ?G^+dUbST&*IUQa@q z!y!yB@V!tm6=atzRUI0GU0>3Ms6^$B@j#Fsg7plO5YFGRv3Eb zQns|V0w(P_6&;a$gwgT4jQg?X#i^emy6g?XA=C2#Sg<`FGl$ujY;zll1woz z+zz77o>oc3889SfQ<{%DU1^75R#md>e9SkdawO=b*-z~&0+5}U&-eMxWz00w3XO+37ee{KM~7&L^etj=Fp8$OnAvFRClbu=0Y6lpI1 z6x3LyY-H%w6iD`?N?!2#f<9K1=$jXb6#bE{rHlxy5m>a~2UGk-DumHrC$&9O5)i*{ zOwjU)bFy z4@l>lyeZj@Qp>BqiK)>~jR*36CTdM`XDZppYI8>pXT3tNemGbwRAA9^rkNUh{iIq= zWYXmjMk(xb%<7(y!ColWdzGA=se6d+Y4w?S+gcnkhECmx3yt zE+OLe2`%i5XR_Vf`OZ)>;09o;JRSpaxM6019ZnKt17fk>644$J0WcJ^A8&`R_`)}C zjg_w_O1aON^d5Cxxp`ns07>k9M?_y9d>Zr>Xr^x-)f@v`jepj308}R z;O^B~+I%yZ(dON7H`!xBuk-*<*y(smiQX>*uguE?>Yh4NdgSyuA7xVKu*UePLbgL- zdG<#~VmdO0{YIdTPqNF&S6i}uICItNhaC5Bbyf&3UyNQMJnG)TcxpcB*k4Eo@ZA{; zm=0oN(!8Uc+Tg@bh#rA7Gzdw!$;`~`-(Wk1%@nz%VsJey+mwFVc*ev86Eo2)OY2%i zaf+y_T+*0u8Dg@sQdhW0MzO2v^tW(uVvV_1Ko2B{UHrfp&35OZGW_==p<409Sm(zp zFTP&H+3n++%X{=)yR|o3mL56x4_^06Jc2>n&G$~@NBAI#KcpOCOZ>=X$W$Rp1(X^M z7UFcVk~ETZwtK`$Z?Q{}8GGWH6i%5-vbdum`hyKLgEjMHe`8R|(5o?`!NvZ35knNZ zY{#v*n7E8u2ZKk232p^L*lW|SBpe8$);wxPMRK)zLiOvt1HctJY1U&+#YcfyamR#bcXt(1^9!TvUys zX?y|ZHGoVIHa5;~jZ7l<3$1ymV)#)xr{Mj9Y96^6DBiu&$HS*Q)L7FY(Si4te!kJ6 zwio*aNaV-MpaaHv=<4ZwO8Q8RXvc6hfj4JGB(>p!fYEvlgViam`E_VpqTCtJqY$5v6Y=jpms3WM=oHRiW@jo*AZa+KtpssYv(qQ)45vgtZH zI)rB8(Uax*%N2xFJvEbwdZYq6!g{bW&t;VJYTxoJGffW8i83bs?Bf+for#5N<-(3; zkbN~x9e^t#*H*(y*>9rTGXGnvmQFYo5J@y?ov+)BxuOU^DgMM28^P94jcqEcJBOGj zdZSxIUHV$vztCO9rI8v>;`CjXtn<57fAsY#E2+%@#T8~Di=~6m0s<%h z0jJc3I`aClKVZ-cjMadhwp$@nbJ>)Xj%Kc>(9qZzHpBZ7`@Z?AH%2Tbt)Xr3sO^;+ zs`|;-wc8P{e_D7H;vH^Y4XE_=tJhe0X=~!m#){$(ZcBuZzRb)jh=(fdm3w_QB!`tx zZ-Rmsd%v4Lc)iL;e(VG}D67JHUoUFer{>h6ndKMCQO0kDLV)^wxp%y;V`kM)HIjO; zos7jAbHL2AvkNFpG41-}&zsnwT?eb!b32%}ygiKtnQEfurvq1ZY!AsPU(GTvDbei^ zG+?Q?H5&R5AuDm#3_l24?sh*$N7@pm+p= ziw>bl>(j8DlDUB_$D(H;#g&S+P$1{zZuGJDuR*LzxIn7i2Bm@E@(je3+weZaksVkpsbbRy9jk=CY{X3 zi>PW@=IVph{uHlAN?zv+!@G1n^O?J7#0)BQ0J7$F-*PH8FhPd;rq6UW4^Cr))#Tq5 zO>EJUX33>1@%rxO}hxOq}Ih2W*mKbcYqtp*(x=$`5!nCvu#logt7W>O)hM&>d-b;k~ zq&*lT^=Ka`e2~<#*kYw`SG6~EGC!RLm9yxp3tJv=!YA~NwA%{(xgge5lW~BySs=fo zBMSf=uyxK-dz#XYj?F-sXDl#PxL=UOeNM90d$^N1dWN0P-09l%3~BMS)}~h$^tK0k z{dlg#D&=M=xi~g;tyOz6)&|5>sh*B{ADC~RNcA7yjvzBFKiA}3 z`>pJC7)M@WY>52B6R`wF1^91jYu!u4yRT%C@>c#j(7M*hg5gUyK?V(oJtIlvWXA7T z9mx>HpgKcW_rDh6)lhusn9)hqhST$w4c(G}+517jBa@xyrLeJhxOPv3Y=5XZ zt*>@B#5!32+ln}AXkv~^e%Vv>Sf1s(0wpRmSreTUA!2@0lRpqNrDnrJ@Tb0xIb*R^ zFWN<5duZ(BuT&~-?&D`ZEU@hD7WLDnUqQi^`46}y-)7YHr;)jU(}7cKl5e*01f?j( z>90NkOOrCrSj6W~A)2U5awO+Zb;g3_J{m4xh?V#!k;G0`z^H~=^CLnMx6Q65p#36d zC=n7xgCs^o4AIv>dPxL@q=&k0LmC4aA~rF5n6A=Kbu=|E7M2rPDtqLxDuZRb>Q|1+ zE4D)P`5y?FJlyk`*nt5N35m!-t&4J3f>%&+#UjybP3iC2-hnTRJ0wxcTJwYF@?w5v*!2F_fu7!bPk{_L7@ zqyXm06Y1=|Gd%);oE&nTr-#`u{GzCaS!6^pqTZQ7XlBy)!oB(d{tgb>fb*hMb}rK5 zM~%2yhgB7=p=l@wX6mXE*&23u?^xbu8`zw$S(z0uMoVIK&YM9u&!I60TtA`I~?i4F9Cfm$93eRgPrt0Uk>0+u04fZBoP4@xH#fsH@K+ zaWnWvg~@iAHU%Y_8>JoqhRuKE>_{?y0snHf?wR+$p-koAqY%_lr~Z(S_*xk9UVNZ}*_LJJs^%iwA`fPAI%gYWgBDj!m5at-tu z#_AmSq%t+8FJ{mY8^sk2roXm{T#EIjO4X6B>Gm7FA?G?PhI$$qq49EU^NaJ!$Y!>j zCPO?-0ISB(%xQ_;&b)WBGmVNzZIvG3LT+EQT&?%(Vzt=)*btUnQvBI%4bAlpQz3U% zkJ@7-7b>|>Cls+vn%PB1oCmat#pG&q#z_XEE1JaViny%8-=AO5ZtAehIX7Uk95d~R zqfvyU*-CmVT)Sv6zIU<6(JHZ^gX-%u{F9Qd)7-15u`vaOOg!U})8KqN(cyx-*hKio z-CAaCQOVPN=fJ*a)kDE1>>)=BHe%|)P82W4wy*h%G|up^4kLxR7*kAnDhmB+=$0^q z;+PnL962HPGEbI_e+RR!E*y}^@!-)O^Y5Za+K)M`^4RQAQ2eE`!#725`iKRKr2-h) zG=P)PDQzEM{%YB3V2%sQrD@nR93qzPN>VkdrU6Ocz6kK8jxARu6s_EiC0Rg2Mv2m$ zx@0|qO1=Y^b^|3}2N4(Lo57E+gOD=6O{se&#p4k#lAYOQvV|xs@y%H?&Reh~Vjv@h z>5ia^g-ASv%ks(79oF?*1N^*EXGxutO8acn!JzNM-6Y zXHS(^PBsdPl-8LXhTvns|HA&*FH6t_fUF+M5>UHzFHdbSZI+#4iG`~A=3| zx^lF`^6)kcTy)6Nsd*<|$oim3cI&bZKn%^OkkPS$IM|lBtJfZUwnsKN)~gR_#e{%44Me|IJ`qS~_8K zwUuKl+&u8oH2amt_N(}G**#Zps!*^!I!}-+QGCNG9xA!Shn@1zUnLb#aX<9SLA3Z9 ztg1<@I9@>g`mU zg+M?X(+^T1Dc~d|nY+BCA?gx$VZV_}s_im9jg(q26YVy@$2s_*V&8b6tdo*VI5VIH z14@)eO)hZKoFltu(iY=ZqYaV57IqOzeDx zM$+BP`LLslWM_`=<{a(+!vc6F9+}<4IKi^J)VGnH+#5=`w33JwbywLARl&7+Mh;`s zIAY01SpfhUK+mtAtiP_lad5q!%kaPv2!>lu_6Gq)bBepr#Qp=ZQC!HiH$~;YMK?~; zD%YMPn1T$PkNJIhtQ}s*!%x*-=P#>2f@JO1J+r)2&J`vYJfutguJhag1R$fDw7vXq~du4$opGU7TDF1H2 zMCuAk+P8NP&GHB$bChzm@->ijFii$>z}6sKE{z4`c}=a!EQ{T6ZNhxhR^pWyt};g} z0q6rZQUsbXFNe{~NBfgGs!({0{!KV5vu{+tT;-|$wibdO6UfO%P)kWT;eUrK*hw6CgR@2t)Zcmv!5b)j5!Q$=lr))WN1}ehgf_J7(Rs^_gmv zBaXM@tkrt^BikmkY7o=<`z6ryz5J}_dQ*Mx~O^8X? zSUF+Q71a@VdsTVbi2O;~I?26O=OhSTR19O&4IVA$cLfnSaNvnr?y`K@tG?6@TRHaz z@E|Gh-ONEDy)u2cc8|!1L!;aF7$o1tR$!({L8-dQNU3LZ&eN~MVi3>|c1tY|qF2Q| zr}|(q!qoKS2^nG%E!$Kn^irRHyKT(y3*D zKGID@scVS{2Cvn#W!0rRIo(4}d?V$j3R+ZvdKF_?1@F^OMs;O*8`OB}3FR6%<*}4t zI}p!at>PjpH@9{;0STI;l!{+#XKR_Jg#!FLWU@HMFV@|6ZWtpIXEo`!ijLP==TJy~ z<7P zBV$TxJGC}C7S!%qT^;9>1oON%Hu=FWqJp_E z_V=A`PxxZhCH$P_-0PxX;ao1OgM*=A*GZ1GWA%_jzGq=h@?eW}X2WCr8=W^AE7oQd zO(eL&kcK30@b1*X+;NC$y<|^Uz;<}) zdG|0yab4-@s~456KN$hKuP)IslT@SxoV7SiRQX6hd!*c=y)$LKHtCL>CUc*m$hj{AsrPtgllH4VuU51|0?xW(P+GXTLRY^D@9Tz zrg7U#-Khir`kKb|uF_UooZ#`$^PPL{a>Y*gD~8V($JWi9tq)o0r-}eXQt1qtnYm+w zA6orA2wY-a+dWOO8XwJh84vH`6zCxxH{A045#B#%yDPE#odZ#jKes z;!7@8^_hkE;jL?}TiNU%C3QZk`^?0(@h}zxXb_S2DSJ-YziR-`kl8v>V3a-7Ce~u4mcXY2@e#SQw zd=giTam_>hS30PojMJ9mE_wf1u?1w+?1iD9#&%$9974LqtSaOz1bb@&e%wNRIMld~ z3GheWTF3A{_o{$|RDF(K6~|SLQTZEv*8TLsy#L&G6jm1#ibxjsr#TR&6t9C!(GC|Y zpYBoABm9vp#%9Hl_-C?wY`2g!PDvUO6;x3ypZf=sLnb__0?Isft%BUN zxl;Rzyxr^g%k^=w8NEA`B8kP$!^R!q2V$6yhwkQoOWg0h&pJH!sh;mUQLdVHtA5B3 znID@adYmEseA|m!yYbG_`=IFb{mCNe`0c+NZoUh!(qVTy!)$MFXF#KxjngWVU=&Bh z=4X%nq$0&*Ccx{{IunF*WL@Uu<))svCN)J`q2 ztO|C7=y2d_9Jbb-pxUDGH$tOFRQpPJ=F!VtsK){Yj)949_8ff`n3kPTFsCI%Z_Af6 zr&Eg#|071SHiyC}@=q}ec-DXzHT36O?(}5q;lp z;!KtA<8x?#LsdvcN?>?hc#PpH($UPyc=nN{_xy;pyO( zhZ$qb1pRx=aa?;KZ}VB?vMKvp=ls!I;v(=>Iq1LSN7{&^wPmT(ns?rKV(al)k3;3t zL>FHY1=hgC#xm+pQ29_nJ_%$HH~iX07=jW>##eHZm-G-KnnrFx3150Mra)Fx>+MP? z-%HnVxA(Wspd`nM)0t4%z`i7+09uv4{9_#g?Vo=4;{1gi;N;jMCWcvvy|dDeq}Z_y ze+(Km4g+9>_{pv;OkvP?BC_jvNO~-A%lB4%r9jMM-xyLPC=2orEZ_hVVt#o!ZN;g! zvk--|Ty~`fH?1Du>PC580)9v_Y!G!!&m@o6vnLZ(NB}{kMZ4ncwC7zsesHJT`u(^4 zA3SJ_x#mq#QjyqUE=@LyG--^s9 zWN+CgGl3m^qG|OY0#5}9|1;)YAW?pYBkBzMM=TE3@r`zKMcdW4mI0MEwZuN47`_SO zHj6V@@)#Ol1g%(KA1?Ennn)}1G`S_j=b1ZZl!Q7Uc|rsD*JeARQvqVNd{!d z%7?%nQH6^%-xmV&`Lfzzt=}KIZ(v{$9UsqJfjO+klV@H`jQ56^5GlMzjE4&7uhee!r231Y)Ec8-p5dv)Y~;tz$0SgrXm}4{ zTt!Oen__Ve(sr-8zv3>i+ZyS!{Np0d?#XA6zX)O<>5QhAzZabf-u|SJes^ls)&KgczOW$|EhZHu&RRf4HOX( z1Vlm_q@^3Bk#3Og?(XiE+QcR|-AZ?NBOS6S>F(~h3(xtTd+#4S`(f?1XU(knX6DQH zMI&?tLLSVX9^H4M4=vujz8D#>K#) zaBM*(=qy(;hR#Pd3mSgJH!d1B5gcjp1afouP8xB-3veZ7_iwgbFOG?vYvpRYVy_={ zrEt*TbMDAyefgI> zNGVQ0YQ?KM@a?rfLx-Vccneo~x)sPRa}|~pZ@D()V5pWU7UOCDwyv_pl;@cD+HnG1 z15K`Vgpu3 zpu5N@(8% z15;CM+m=(xOJ`@C5H!WtC^8+`svAsW=DpvCPj=nvbOT<4eH0ZoCgwcQT$?HhwuLvg zn>1on8`4UsC3xCsQU$R&YGa6#^wC6^>3$Oy2tyJ>b6sSOq~0;*6Mt0OWpR6sTTGr# zh>t5Mpu9R>9t*?B2N$GAQ6Vyz-m(2LH;}%b_*;W1X7Vlja|44-)~b_&-E+6TIU_^n zOz!B4;((9j~oEOIk zgbtICv+Jc4Vt2Q(2a*?olv;^E5DH%mhTY&2blG+x7XleoPcrYat&GR?jfRILhrRAi zz}wQ&v!hz6OqeT?4l-JJr#r9m(B1#hp&k=LUni=IU4Th0E});Yu}*tt;6mix+DgFf z68U(Kx^n9FIeO*YO|F8hq)OW!ImWkJFn=fiIJP{lIug>L?{ojyeSI&gZ+iT}>304( z>XqZ!FMukBw%r#IVxfDIh(<*lZ@8Ua59BLWwaE) z>#49__#&&Co}zSk5Mg&hMCz`QxW|S;4p&syf~jAKNq2WrI1v{o+M32@`M%mVYWVi( zpiY(1Y~@1~Lee#XMlFH>08!yU94t{Kxi_s9b=NlLU7vc*-!oe;xf;zF|emPkH}m@4P|QNtMdf{o_V zC09PM-bW60@{ENLI0qTrm=1hcjx*wNM0X<6OqZeSGe@^XQP;GjZN5IxUw#S%mqoSm zP7G!yK)wn&CnM$@)hi9@y6r8=RN;v^z@N;=u$|v{l`biOnbrzqDQI!n;QRb#Nzh$h|MmCIi6|o zFl#KdcVIxn2a`*@i*O2-oUoe6mjK`S=}ATRfzJA_59CCeb0U5?sFMbOZcaB@lhcXq zW)-wRXZD!loTPQqP9~ghbanYYiXk)pAgND{i(9wyaKs>rHl3_3FQnxPOHr&k>)2Hy zGzp-(U-uPBt8twf!52?4mEj+1+w?ZVE+cwQLJbkPMQV?F3`;$AbUo&20iWqUu->=d zyD#}1bYng~yq!Ln7rdTRR9$p3yrRdSm{L#{lYj9q$-r}QanDtoqV|VJoO-mbhr31o zVc=Do%hbsjDiW3m_<$34{eyupEJQ-+TZN&x=@e(qzC&;Tx@l5bs@qR8L^v6Vb~fhC z#$q^YF+nsB5yJvSyZ!iCPIO6P9E9%x-cx~$t%B+@6ZL{yRwEzH<_;o*$)bBEAY#J4 zz07#1?fCYo^qw2EFqmEs=LpPCZIcRKCvkNf6BWVHny|09uG(dK%bytEK0h(KZA*PJ zIF4?U`IDGrUQX4yu)v!g3XX~E>k4fv;R+YbPG;jM+XSP+1t=+H7yx`50K93H+aP)x zXjUZ*o~Mcw+gAdgf)7Oq0z}?oNCGO9E7;7DEDrD{Pcp3545dt4`qgOTHu@^DP$hS? zi5BE)?WR#iURf6X;`pp%^1i;d4_VXdZza=bO6#{*N?mndUh06${(644ZgnAAit^gn z|3O9mZB*M4N#?jEhhYYBZNoN$*m2h)uFwS39Jz~xq<;Q4GbWMsi8}k$HH>ll{Vv5a zHephi1bKM$r<~`T?A2#e%rcVg0`BB5w#??Y)%FeOhE2~U#!$syO<}CdK%meQ8QR^feax#DM)7s&W}>NkVP9HX}>$w)`s*0 zg7o|y%7yFdkyVtW`qUPK0D0c82$z7Er&mQwZVYPBc}i*F=Ch=us{HBy6&SF~nd$ z0Z>}rTh!c_&On23>J$(U7vdAS^+7_0e=)($SetzpUXMQfpJmhZrV2)YC&}Jj?c0__ zNOA&hA}p^n$08wVVj$@u@BAWR=zeBdN$L`*T>*vpeWlj(-4wx7VR^;;Hs zoIl_kAK~H9jeBcakww`)5WnJa~7yaUmOwZ3zj=0%bI5swiG`#wP z)D~NLS?RIAOvo0N763Lblo|+u6zwc%Cw$IPnHf&~LUkUASa7hLsf(7xV~(fPcF|mU zZ9Ww#_^IWtjS`>j1kJPz?5}n~4<9 zEBdnX7m}NmGAR8)r8{PJg258bO1)2W)VV-k0e9T3YIH<%b7Y&ht$5X*eob$Ao3gGg z%?O&*6?0M?XL98MsEf`hJ6#r*A?H>S(o!zqeauCcUZeG{*>HMl3hUC+765M%KvS|+ zpx|i3iCS19U%?HRR0m?Y)jMNEs$Yi?i7KGS-lkpG3l0xV>7lNm$0Y#B<`O&i`iAey z=bD*IE=jC(c%wv1x$-|F82I#bL&sfbTbSF*OS7y7`h^DPWn;_${Vb`#ZcRREEai8y z8w@cY|KMj$l)f#QI>z10l(Bfd7V9X2DJ?BL{x3`_);~{mrKS!d?0S;b1QCSRnn-1l zB&TQDTQ+SR;grw8?(82LL(8;VuI}&w@3k)P;o+yOW*U#c7S8(C%sh2RB{9f1noJ*9 z*Zv+E+so#^N)Jb2LwAus`p(yA+Rde&VfuY8>XDtDh4XoMNhF-#|3_lT0SF_2Cg}y; z%)`@@jAbGwY3@U&dh8GcINbD8KI3$|C(%vhBU(C&gO~h_l2o^`^GgA*jm|}5X`3r= z`|KKQ`;b&*Xdf#j3k8p3PC{uQp6TOc1_K@qV~viK9w~E-83I-l+_D;TIto&iq0VQ( z0uzfS+60&ob1ExOi!8509v5;{63M7jl%u_MoeRQRnH5h9p9N%NF!V;QzMeSOY3Y3W z`e)sV4vx2V`fv^}y)8K=i$)2sLp#~ke-+!V0FH7$x(;aq6CVz8$n}6eWOX{ol6l)e-N!1&h`aRuijRvxV+y}x`QiVvqP}_PO(H*2d5y& zQo%5|!l<&D6)_7*7CRvl?7J)fws6;m2YtzHcrzMaKh+auWKy%53j zIuQU|)@udFkI20AmqixcRm+c&e*J{aeEN|1_J`)vzh8$fX;D?llX+X=S~GqOF$ef4 zr~GF*i~T(>G?SvKO_*(4Cq(hsw?qjE1zh=E7BPGS=Xwtaa@OTx8ktp)jBHHNo*OPP z3sK?%=m=IzRl)U39;yERoyAS*#k#jBOG`&P+Fu0?2VZCEU%f`{@4X#)zEGuZIA%o{ zY4Ru-)$D0%e`Z7{6~Du`bJ;UPomJ8`cYxaMg0XQo(?{TU zN${!X@*mRnAzb+n*1+h1NY6(TJ-rx0ZkHpGr+FqX9=Ep(A|vC2o>uShf3p zvx2RDasn;i`9=Rc|D3bZohiI?_Y+z;+yHW3e!OlVa?@o{9(zdhFSy&$B@zmZe>&pt z_oeTdsMm70v^Bm9$X`5b_vw2W^I|`mXUerhd9P})VU5*oR`@Tr$?gwqGu68zGFA(9 zQKKNx4-sta58Bu?tQ&f6ra1xy@CZY_;|Q8iilA@(=-N$er#O@ee6xG@rwdhIA}x95 zKkiOD8V7`P@Zv*&ag~i2SbH&2gq*N&b z15yOEgwS<0y2W6>UQR{3tIM^o&hYu7Oymv1YPf>Gq3_eX1%<`Yz3Pg| zbe2`d@$jE2`Lr?Inp;v-A)y>c{+(H2lt7egqoM+Xq>_T^jhON#Knwdv4m zSv9_W`x4!ddww$iEt{yT=&cSP=*FXSR@TnB2mj{RocplWv(H1vw?Bi)nL`h94{vDs zujv)~Vj>1&lckSP>c{_1`_;3v$j8R>r>gIN5mgFl&P~|jwT-$z7m}&X8>J?u_jPfC zKcbI{e^^)+RbfAky@j!z-9oz8+-VKr zRf?Cii;4w-WVyKJQ@&W^adOTzpkt8XRfG*;!owzm6Gmkke>pj!vglddbZAUbSV!C6 zr_bCm_Cp`QsA5bF>Yx4g^h z+xa^WU*~X_%`05t@`oOd!zMOpzQf>8SL9lzazVy%wPDqVL-DLGSS_^D^rL1YGq4zA1bcYYU=5#A&>+G4rCLKUWJm^YtqbzjUJ(`t`($N$u@ zvaGE*ImpnGk>dJS&S1$Ixu#YR`9fN4S*po~$g=%Zu3>VLjA7{Hp5t_xAI4bap9=wi zSh2RuEv^Rt0wfT?^j8R~8!{k(6+%#p1xsetXZlg&#N)lnBSc3hGe*?^ELHbKQL-r@ zpjzPV$HUi77swSGC}5zs2XVW_OG(vphx|J^o5h( zoE2$d8Ofx?7`_)l;w3`ukIq~Hu$+w-t_Yz{+%6eKMq76%99or?vU0zZWuG9L1KPe{ z!y2pY>TA&m4hWz1_)OuE_)jSky`LCUTAvuu6(;+XL0e97)duuBnbH2N>k(bO5i2a- zM0vEaB^0qT30BUlE6`d~hB&I4*_D70vO>lGxT| z{Yo+ zz&eP`rM|PKMLlnG#9-+!>WYnZPJ4dF5@hP)Yg%^w1>7XR-O^Y-V|#3*dxS(LZ|225 zRty9jI)3q!0GzR6aGS{+!b%Z5pOguiK2!r-1RJ`(__&T+(Z^gT4b;z%W4Vse<7Ed1 zb2Y)VDQ$YYn}~MWrt>YZ1tYY2!0DLXp6`FO_l`@JD7)J1D;z8uAy`~|z3HBRFtWBD z%y-`OGsCuf$r?!7>@^YqJehV4J5mTJoB-B>EWV$LE>)?Vh?I^P(l)yB-RZS1LAS6M_3l zg<~sK6w9ePSK2@4i4`ju(S2UJkTUQW!!PEnCai`dr7HL-lp)KZ|4N0-nm}82ITQ`! zPP~2n>w1G?M4hq8!zuhvUJCW=gWEoXP3=!4kZ$+6%+kNLZ)`2C7tlx?t(AQL;IYVJBc(-Nmz^`E37j`YmRVBS^=q<6b)sFK)U@x-Eq$$5$Olys-rFEJkz{r9kGwS z{^t~*K(KsuJel`0ZUr^LU?0nQ&F_$I`1cTG!i;Z1^97%POs-_gi<>vRuLKgdR%TD% zpAk~BI)OctHgdH$e*?pRRKh5IW%kaZ2HvTqKv?p%jCfk)bUMPlDy)LqFIZ`F88Yc_ zOjFeAu>=4l9BY|)&vzIg3-!fM3jopgXYhKSy0sLoXN2ZH->EL%pgv2Obe>rrE#5=+ z&3(3`Bz%by&I zf&{*w50r&R!3YcMz}dW_8YK&nAvtu`AkOcghU089vd`)4Pm+0<9zMy2EF5kPOyo*h zMa7cwKjGWlJ&h%ExlXVi@dnPqDJ*k~VdLH^YY> z7Sp9n?71siTl{G<10jB*0RbMb@nBt2bne!`9(VGwQnoCJ{0mXg20Nf8p6O5ZM$% zDHtu6Mpcq2n4(IWE<2%E3X5EluhPoE!9rWyDmV@g8<=TY#`dly@B8>!yrIk0)9)97 z?W=dT&#WmCWl!Qsg@xd5{zsy=(Zu4dG`wXGf84LjgBQWUNgqsw;-8-Q*U!oO?2nT@ zpUKGc_2Qrz-EW(r-DGeCv-lDiI zPpVtRS5#NUvg)L>zKY^Q45`7mn1>~+dCQ#EKZMt(*)@cYtJ7hKFdq>2j%4=uG-hUp zL@`vFumD)(Gy|xt;06}tWmns;$KFD7hI2WBHjwoSa>%OviLyD7)=9cI09Gv-Z*q$#-@)PxyI9 z&upJ;P5!#|D|=>m%QzD}4)XUTs0-In-9IumoTmDsVoMY)*y(Y%ZB_)U) zq3jdo=V#pL4b!Q$Z5GLX`^pJ1Zu%Y8_ z*Jen&O?u(*=1s&h;tK5G)GcFh{0a_VteJE@k_^&;gC~{wUN8L{8;r$}9&2%UWQlfa z92Sb~Ilit8I5YLF=#rs#kND`ClOUtu(Z869Y#0hL#BjIo0RWE}RQgo=-kJJfU8EQE zy%`mkgW1kZ9q)wja7l`~K8an7XTNP$UBk|MelCXXX14+$I%3Fwt0^75U1Y@#Bn`Ou zoMWgOEt_CUv-TJ-;cBP2lMC;}apRiNa*GaP_?FwqzSzYK!6Gs;^o(s6EP;W6i=M}= zbTm{Qn+_uM^Nuz(QW@uvhM<%A3MWce*bv0Aq%V$KKPL?RmgCim0ryL`gt=IA2v{10 z8(&g0Pn?=Q!9=Xn3%y003)W@QSYM`I3Nye}irWs+4px@L&U^(O@4d{*hm~n!f$Eto zL{IB@5)wVh0C+fn|2vF?#7y!*VTHZZQj$kuEp{d8gD`P^X8aC7Ma8Hx zlS1SVdTPN~7Jm@2GRCkS9-Soe*;9UX*-vku8+HJk)6B|jHk#tv z-2pz(^ZoVoW&TUZOd+zMvN8-HvS7cvyK6XZyH{`X!lnN8%ZwRfK-GWh9txkSo)S&1 zujr1!t|O32vLo~%M(@XW@`0;$@EPxYZNdBS)t^Z=V*Ut-EX2eVK8hNBgxdtR1Ib;I zzmXy1B|RfS+|Lry<{HnaB576v#xe-;t5xISUxL|kaMCGg^Xi3X1(1`dMXmk{?bpEt zkiVKDjGL1UVM4*Q$@9ze5aRAg2I$L#159EO;y^TcwE7Cmc{eVN;enxmU zvluW=X&TbxUq>mK`NUXzMbY=eEZHP-9c|Uta%}*$t#=reujc`k$4%Kw07efUcKW~z ztoVGc=xqOQ6UE#vtS*k=Z@uHPwmt-~dixsz_}0N>u8)6ZrE!bZ&5|rDvJo4~?cfyz z>lcP*s(IPq;RxXy{IgndXpHFjNp0w|$@0^aB!j|IPS#_C)bYYAprY?pU_)Aie-p`L z!3Kda^(}`F#y}arKZlCw{nWC5#cnZgi;O5DL6u`%YT{_lB=ZfV7FGefn+|422AYF07jkV zH4%{02gFJ@LEJWZ}(T&!(2FzG~%%m+c@6zE`p%kcNVHQ zIvo{I{@vOA3Ssd83D0+*wjp;>2gDD_W3`E&T#CMmk(%c^K*A!1)8liOuvzM3^gn*g zNSh5e0%U-&Q3ydH#>gyg7)}5*wb9n=&ap<7g|^fdqCfs;Zt%s2wc3l#;ZmYj3Jt%+ zrV4ePba(q)ee}q7etb(cn8IoASt8mY=V^{ssO$F5RVcxt1+i;7a^Su(@*y=Hg6%6a zQrvDh`iRPU-p8HHVmO*NxQ=##JYnaCU6|psR-|qE^PkA~{P_KQ>R}JsUeMee0kGtx z&Ox=s930L(ox3@Np^dO~cxJFi>Rgr_XH&C(#N-|MtqWueNpP4ttR-QQ`y1)1qhb)i z+pg5{xwTMFxKH|Bl98KvVqxt5)?6Htb`qL?DRol@0}o_q;(y?9-w!xQo;d|x(`WdP zvc2)=ob z;Lvey=>d*1BhRm(nUC^XCJzKs#NQ5wjP>=kPxfJ9a9dPfo6%OTo5BZ>_yf z^Vv#LRW5=B{Ab?-ECbA~tk&9nFYy6Jk-3Ib29*-E&S~>0(O=Qxq1M>pE@242F#&(_aZhV_rz4^C>dv1&pyVTMJ-lL{M~r#NQ`zqGxh{RrtCWg^fwX zQnC@-tJW<~r>F;8K;K0m7?UH=^d6TBm}K)VJ>@4%6Ir?DpBwM&UJ6&3NU7N4Am>ou-Q;UTVBL z^M4RT_jgy1@ydC76J9T#zp`mG=4CY*CCD(qG0)kMLM#`b2&!!@x2t3CsBoQJKb2RS zlCbT_gMM%#*-3 zJxUzAL=(fnI61B$i!y*wu&5rxPY@OXMf|dD$vVYmZf(8_)Ofd?kAAs2T8I{tsSiW) zh(6BUxZ#6gf!Z2v&7&9%tAAU&uwwIUHK{>FMwwim{HA+|i|1;qe=;ob=Yzf9k3t0K z8?%Mhu)4pgFygdovZIiNl$YqBd$k>qwgE5N5#8Jx+}4MO=h7-u{?`>yj@F8NMYYVV zyhlCRJf}=`zd}ok=pC?zGyD6ZTr2gv;S(9OB^@MxQ{Wr3=*@?B!dDvwe6v2;`l2o^F@(%(n(^BQ9pyGFzoE?mv08pnFNU%h&v+>~o=f~r z2C;H}Gy!P>HD^7BLF~FgYlz>gM*{tk%1dUZxFKL z$L)KDhOzZ+J8f(qX7s?x7>-~g^DE3VR?!Frdk|-6GJv`d(#LUfb++FbCviDg9E{B& zvv{|v>_1hqG(m+#1|Jc z;9DTa)UrTiC?`C@AUZGv$gN!O20mW5JZoVfQz^EuJW$Ax8O z8Eb3kfL0+cD@#hjiCZ|u*>b~|xF)8vM*6*{tPQ0*tGzw5XsYmbinjdZewkm!+#L6a zq;^K&Uq6G_BqyLyO(Yz(*dk(;>EEa~6*+3zBiL8<$8g~-<1)W)SaW<-ZVIn>3{n! zX{W7W_lr8%UQ&Hd0;sTVwCqk_bl*-d(W(tkOCwOQ`r2)#K0r&UVibJh(OOemE3cz7 zn(?=Ju5w-bMHev!REU?ipk++e`LQ2x7=N+$i8u?FoGI7rAKAAt0YG*DruKD*#+<~J z8wEiD#O58uQUHAys3%NFNFbPP&-A{(R#bP__`mr9s=dQ$U-VXht|>k-0WjB7)vHbD z-$Wn{{Qljw>y+W@_h|&~HwKBMFfxcgBPbEDF z`=vd%6(C4mR8++2w8OLyEjPT}+gERLLYyj)>tD5t)L3`sTodWb7EiHKq-0bI1y19I zDWL@V8UVvv$l1Bp;gb>|H~&r&DYR%e9wJFl=F0Rg&DAk~$9%1210WIrMz`Ml#cqRE znS7Te9jU06Fw@Uk18i*d?P6|f3V^lssf`aP+xo7gBrGqF1`J%%?7!~~*rSuByY`LT z--N#ZWTL*xV$-xs`3@k=mP&b3YTP11+dhG6ygzaIt0CtQnuX!jUo+>43Y8jdQUrb zpZpwFBUQyP=I6(STe=0wONN<4fP9Ma`AJEDpbKE@0<3URMa61#jsM9Bbs0S1xhX6j z{jR7vwAw8~r`6zxZ>uGxuTOHmHDc&tLdlRc6z&lm#@L(xX6Cj41*n53{*VQ@lJD+3 zWYf8NvxP!`{Vd5VE=G#(FQ)naA1Qx{Z~YMk3PDR-(~mNUKt$Yq54Y!PjRq7ESoB7# zUBSaC+)31m1uITm6VBe!IqMqg-4u+cO#piN>sKK>M37Vnhw~ohXSs~LybTU#XJ_Q5 zzrUUTKaJOtw7>#D=KvQyr}G}$uHt0MSKIeU*bG3SPy!u|nlONe4xs-4Gba^ZUaah< zP4n9nLJ7=Rb~Z^y{qj@>9Huv>a4_(SSVI9u!`RqZ0S5;b*+L9}@Qx6baho*!D?@yYnq(Ln^4h7#?(uOU z03E+oKnb8DXWGtZ);?zG z%YcAG)8&kUfdIF&dzfEXpHx-l0E5NIkY%^4fJK)q=i|edqOK0my~Sl@$O1vD_o0Sv z+^Pe@LT-ap;f?2rblpr$0Rpg{#DM6wwefj)cB4yI@lE z7n>}n>I^d>p%5k+65E**5ImgD8VYPiEUeGZS4YP6QTy*#PJG?KMk%5Mb0Y6*UNzCr ztL_-OEaVioebde2{+bFak|eOt5vwRt$1n|WubDP6iSgl$#Kf1t)tz~F_=|^QiQ(D$ zaF~wrL~M^`_HTQ7o?h%u&Cbn*9hM&ASVw(ndVkQCW3Cv{OKMWBKD>QCaL&WP$hdxS z!M4=qjn7X&(DU@cGQEyalvRW)S7=`mvqKRi547(zeJSsEuDJ1=hdea-_s zRl0DhfrCFfH#e7qlQRsk;5j&MNI)Ra+DK~mtnZ_@*ZrZZEDH=wKt%NC4iG51JOeef z+wIAUk$x8d8rT6s{_|2%05pEwn+X)veo?RDeiTL`zFYw2>;8YRlf;9T!|(ojkT>@8g37 z9we8Ql{Iwu5;nL?PH76};BWuY-7WN$1Rmy_-RW-f*mmXf-96CF$65q@WcbQf_V5Wa zT8~Ga$dGQ=ui8h~25fk}OWU56&G$A!Ai90+UX_`l9Gc?damj>D(lalt{{DVu&QxJ} zOnHXi$=D*m6i{JDB#&&xj-4gTo&)X6es~#rD7OCjt=DGVu5-M#Pw-4LZbc4N8Q*Id z7&z>bAHd6T+wpjU1EwVa2?prcDNT1clCLKW%!(<2CVsP&9pUXgFf!D-x}qYpu<{~`o|%w2?SOrLSzufz z-xD_19JImgf(K6l#YIKFTtMp`LduxE>P};3%2C@Br%MT)%B2Wp?cD#qNsv2VPaLqo zpFq>I3@m2tT598b&=mICW&^s2Dx;owJ2*I@FC}ixVj~PKO~TaCN@FZ4x+_)$p2frF z&d2++sK_cv$$eqG$uuj(=XTgMuGHV?&9#w=G1iKX$I~9(_?mb4}F~A7`k6-|&gJ zXFMMtrgkS8t7A!+{gG#n_~FIL0A`lyv*MgYpe4&`vbO7Gsq;Xa$dqL?jWvG8ixO>C zpSf>U1YV7oWFo63V}t=;L@KLVHF?A2Y?F8nt!|qs5q-5zD!l5QMxv-{hTL{x;pbG;VN9xso-g151#Xcm1&OH zv9}jQdzw3m2tQjn+&L>N>!QF17D4wPS%#_z3(;U;ZUzKtfsX06dpq7-&dqI5E$MpJ ziW?L+#@j)HRPeN%BmelTJV)M{E+zNwy(=>lp3&nJMXPKjh)yzG+`r_z_d1^Y6w*C$ zeD}DNq&~ASRAuGayA4d-Vm+V)<^SeD zl8gC^4{-!*fTyJPsPvx~QPedhqSw7qeY~V29Zkx$UXP?9{oM)wHl?;D(Z;huoW?Gh zK#TR~q;ICpFAj0iGEkFMU67M{F+yIR|}ihx1eK*}hBs?C;DDl9;q^r$WG zEABe>)PLp32VBN=J6+Mlg_n?7$G4QzH+(^41lF(&Y{?!%nG?D>QL1+RpT!iWsImqb zyZmac-C-51L(l1J{K^E1?1Zu?0tQqjlrkN%rWuh$1Yqvw*NXP<&8-p$JK3$_pzbxc zZ#=?hw@evon?LkUb<|FoFcwU7LK>E1aLaD%4ipaRZr6T1 zHmwKNlrtOvP5(@*^QvUknqN=diCcV5?wSui%08vG|bQMbT~ z^F&}#OLA5hLsJmgc^fR$HOE6WqZf1 zB3%6u@#abi(eqPnLlbQ$<0u%*QG-hj!D6Tb&m3e79tKA3qgt_!Wr(65`%x>)@JUrWqkiT9`=+FXuz(UF309?#%6{KDY7|5! zr`YG%gxGGf5q%dBg)E7EFwzpxrkomHjtJp$5PqM8dDPu b?fGq^8XpD5(DXRaDvX4PtZ 0; if (!validRole) { - throw new Error("You don't have sufficient permissions to access Simple CMS"); + throw new Error("You don't have sufficient permissions to access Static CMS"); } } @@ -328,7 +328,7 @@ export default class GitGateway implements Implementation { } if (!(await this.api!.hasWriteAccess())) { - throw new Error("You don't have sufficient permissions to access Simple CMS"); + throw new Error("You don't have sufficient permissions to access Static CMS"); } return { name: userData.name, login: userData.email } as User; }); diff --git a/src/backends/git-gateway/index.ts b/src/backends/git-gateway/index.ts index e018a208..aa4c1e79 100644 --- a/src/backends/git-gateway/index.ts +++ b/src/backends/git-gateway/index.ts @@ -1,7 +1,7 @@ import GitGatewayBackend from './implementation'; import AuthenticationPage from './AuthenticationPage'; -export const SimpleCmsBackendGitGateway = { +export const StaticCmsBackendGitGateway = { GitGatewayBackend, AuthenticationPage, }; diff --git a/src/backends/github/API.ts b/src/backends/github/API.ts index 28cf6288..5d23a12c 100644 --- a/src/backends/github/API.ts +++ b/src/backends/github/API.ts @@ -130,7 +130,7 @@ export default class API { this.originRepoName = originRepoParts[1]; } - static DEFAULT_COMMIT_MESSAGE = 'Automatically generated by Simple CMS'; + static DEFAULT_COMMIT_MESSAGE = 'Automatically generated by Static CMS'; user(): Promise<{ name: string; login: string }> { if (!this._userPromise) { @@ -271,12 +271,12 @@ export default class API { } checkMetadataRef() { - return this.request(`${this.repoURL}/git/refs/meta/_simple_cms`) + return this.request(`${this.repoURL}/git/refs/meta/_static_cms`) .then(response => response.object) .catch(() => { // Meta ref doesn't exist const readme = { - raw: '# Simple CMS\n\nThis tree is used by the Simple CMS to store metadata information for specific files and branches.', + raw: '# Static CMS\n\nThis tree is used by the Static CMS to store metadata information for specific files and branches.', }; return this.uploadBlob(readme) @@ -289,7 +289,7 @@ export default class API { }), ) .then(tree => this.commit('First Commit', tree)) - .then(response => this.createRef('meta', '_simple_cms', response.sha)) + .then(response => this.createRef('meta', '_static_cms', response.sha)) .then(response => response.object); }); } @@ -310,7 +310,7 @@ export default class API { await this.uploadBlob(file); const changeTree = await this.updateTree(branchData.sha, [file as TreeFile]); const { sha } = await this.commit(`Updating “${key}” metadata`, changeTree); - await this.patchRef('meta', '_simple_cms', sha); + await this.patchRef('meta', '_static_cms', sha); await localForage.setItem(`gh.meta.${key}`, { expires: Date.now() + 300000, // In 5 minutes data, @@ -336,7 +336,7 @@ export default class API { const changeTree = await this.updateTree(branchData.sha, [file]); const { sha } = await this.commit(`Deleting “${key}” metadata`, changeTree); - await this.patchRef('meta', '_simple_cms', sha); + await this.patchRef('meta', '_static_cms', sha); this._metadataSemaphore?.leave(); resolve(); } catch (err) { @@ -354,7 +354,7 @@ export default class API { ); const metadataRequestOptions = { - params: { ref: 'refs/meta/_simple_cms' }, + params: { ref: 'refs/meta/_static_cms' }, headers: { Accept: 'application/vnd.github.v3.raw' }, }; diff --git a/src/backends/github/index.ts b/src/backends/github/index.ts index 3c6da302..8b26ebfc 100644 --- a/src/backends/github/index.ts +++ b/src/backends/github/index.ts @@ -2,7 +2,7 @@ import GitHubBackend from './implementation'; import API from './API'; import AuthenticationPage from './AuthenticationPage'; -export const SimpleCmsBackendGithub = { +export const StaticCmsBackendGithub = { GitHubBackend, API, AuthenticationPage, diff --git a/src/backends/gitlab/index.ts b/src/backends/gitlab/index.ts index 3f3fa5c0..73dc7bfc 100644 --- a/src/backends/gitlab/index.ts +++ b/src/backends/gitlab/index.ts @@ -2,7 +2,7 @@ import GitLabBackend from './implementation'; import API from './API'; import AuthenticationPage from './AuthenticationPage'; -export const SimpleCmsBackendGitlab = { +export const StaticCmsBackendGitlab = { GitLabBackend, API, AuthenticationPage, diff --git a/src/backends/proxy/AuthenticationPage.js b/src/backends/proxy/AuthenticationPage.js index ce255e15..d7ca98a2 100644 --- a/src/backends/proxy/AuthenticationPage.js +++ b/src/backends/proxy/AuthenticationPage.js @@ -52,7 +52,7 @@ export default class AuthenticationPage extends React.Component { return ( - + {inProgress ? t('auth.loggingIn') : t('auth.login')} diff --git a/src/backends/proxy/index.ts b/src/backends/proxy/index.ts index 262537c0..e074802c 100644 --- a/src/backends/proxy/index.ts +++ b/src/backends/proxy/index.ts @@ -1,7 +1,7 @@ import ProxyBackend from './implementation'; import AuthenticationPage from './AuthenticationPage'; -export const SimpleCmsBackendProxy = { +export const StaticCmsBackendProxy = { ProxyBackend, AuthenticationPage, }; diff --git a/src/backends/test/AuthenticationPage.js b/src/backends/test/AuthenticationPage.js index 9cc845d3..0041acd2 100644 --- a/src/backends/test/AuthenticationPage.js +++ b/src/backends/test/AuthenticationPage.js @@ -62,7 +62,7 @@ export default class AuthenticationPage extends React.Component { return ( - + {inProgress ? t('auth.loggingIn') : t('auth.login')} diff --git a/src/backends/test/index.ts b/src/backends/test/index.ts index 2ff97814..fc4135f5 100644 --- a/src/backends/test/index.ts +++ b/src/backends/test/index.ts @@ -1,7 +1,7 @@ import TestBackend from './implementation'; import AuthenticationPage from './AuthenticationPage'; -export const SimpleCmsBackendTest = { +export const StaticCmsBackendTest = { TestBackend, AuthenticationPage, }; diff --git a/src/bootstrap.js b/src/bootstrap.js index 36337558..6d5acd11 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -45,8 +45,8 @@ function bootstrap(opts = {}) { /** * Log the version number. */ - if (typeof SIMPLE_CMS_CORE_VERSION === 'string') { - console.info(`simple-cms-core ${SIMPLE_CMS_CORE_VERSION}`); + if (typeof STATIC_CMS_CORE_VERSION === 'string') { + console.info(`static-cms-core ${STATIC_CMS_CORE_VERSION}`); } /** diff --git a/src/components/UI/ErrorBoundary.js b/src/components/UI/ErrorBoundary.js index 57718181..e5d2fc0c 100644 --- a/src/components/UI/ErrorBoundary.js +++ b/src/components/UI/ErrorBoundary.js @@ -10,7 +10,7 @@ import cleanStack from 'clean-stack'; import { buttons, colors } from '../../ui'; import { localForage } from '../../lib/util'; -const ISSUE_URL = 'https://github.com/SimpleCMS/simple-cms/issues/new?'; +const ISSUE_URL = 'https://github.com/StaticJsCMS/static-cms/issues/new?'; function getIssueTemplate({ version, provider, browser, config }) { return ` @@ -23,7 +23,7 @@ function getIssueTemplate({ version, provider, browser, config }) { **Screenshots** **Applicable Versions:** - - Simple CMS version: \`${version}\` + - Static CMS version: \`${version}\` - Git provider: \`${provider}\` - Browser version: \`${browser}\` @@ -38,8 +38,8 @@ ${config} function buildIssueTemplate({ config }) { let version = ''; - if (typeof SIMPLE_CMS_CORE_VERSION === 'string') { - version = `simple-cms@${SIMPLE_CMS_CORE_VERSION}`; + if (typeof STATIC_CMS_CORE_VERSION === 'string') { + version = `static-cms@${STATIC_CMS_CORE_VERSION}`; } const template = getIssueTemplate({ version, diff --git a/src/components/UI/SettingsDropdown.js b/src/components/UI/SettingsDropdown.js index 86d674dd..1d2be4fe 100644 --- a/src/components/UI/SettingsDropdown.js +++ b/src/components/UI/SettingsDropdown.js @@ -64,7 +64,7 @@ function SettingsDropdown({ displayUrl, isTestRepo, imageUrl, onLogoutClick, t } {isTestRepo && ( diff --git a/src/editor-components/image/index.js b/src/editor-components/image/index.js index d0925a4c..f2c93c03 100644 --- a/src/editor-components/image/index.js +++ b/src/editor-components/image/index.js @@ -38,5 +38,5 @@ const image = { ], }; -export const SimpleCmsEditorComponentImage = image; +export const StaticCmsEditorComponentImage = image; export default image; diff --git a/src/lib/auth/index.js b/src/lib/auth/index.js index f53aacd8..aa863c04 100644 --- a/src/lib/auth/index.js +++ b/src/lib/auth/index.js @@ -1,5 +1,5 @@ import NetlifyAuthenticator from './netlify-auth'; import ImplicitAuthenticator from './implicit-oauth'; import PkceAuthenticator from './pkce-oauth'; -export const SimpleCmsLibAuth = { NetlifyAuthenticator, ImplicitAuthenticator, PkceAuthenticator }; +export const StaticCmsLibAuth = { NetlifyAuthenticator, ImplicitAuthenticator, PkceAuthenticator }; export { NetlifyAuthenticator, ImplicitAuthenticator, PkceAuthenticator }; diff --git a/src/lib/auth/pkce-oauth.js b/src/lib/auth/pkce-oauth.js index 91f551a2..232ccee7 100644 --- a/src/lib/auth/pkce-oauth.js +++ b/src/lib/auth/pkce-oauth.js @@ -30,7 +30,7 @@ async function createCodeChallenge(codeVerifier) { return btoa(sha).split('=')[0].replace(/\+/g, '-').replace(/\//g, '_'); } -const CODE_VERIFIER_STORAGE_KEY = 'simple-cms-pkce-verifier-code'; +const CODE_VERIFIER_STORAGE_KEY = 'static-cms-pkce-verifier-code'; function createCodeVerifier() { const codeVerifier = generateVerifierCode(); diff --git a/src/lib/auth/utils.js b/src/lib/auth/utils.js index dd95c569..0017a881 100644 --- a/src/lib/auth/utils.js +++ b/src/lib/auth/utils.js @@ -2,14 +2,14 @@ import uuid from 'uuid/v4'; export function createNonce() { const nonce = uuid(); - window.sessionStorage.setItem('simple-cms-auth', JSON.stringify({ nonce })); + window.sessionStorage.setItem('static-cms-auth', JSON.stringify({ nonce })); return nonce; } export function validateNonce(check) { - const auth = window.sessionStorage.getItem('simple-cms-auth'); + const auth = window.sessionStorage.getItem('static-cms-auth'); const valid = auth && JSON.parse(auth).nonce; - window.localStorage.removeItem('simple-cms-auth'); + window.localStorage.removeItem('static-cms-auth'); return check === valid; } diff --git a/src/lib/util/index.ts b/src/lib/util/index.ts index 3585b3e4..67e674d9 100644 --- a/src/lib/util/index.ts +++ b/src/lib/util/index.ts @@ -74,7 +74,7 @@ export type FetchError = FE; export type PointerFile = PF; export type DataFile = DF; -export const SimpleCmsLibUtil = { +export const StaticCmsLibUtil = { APIError, Cursor, CURSOR_COMPATIBILITY_SYMBOL, diff --git a/src/lib/widgets/index.ts b/src/lib/widgets/index.ts index e5610ab1..457a29bc 100644 --- a/src/lib/widgets/index.ts +++ b/src/lib/widgets/index.ts @@ -1,7 +1,7 @@ import * as stringTemplate from './stringTemplate'; import * as validations from './validations'; -export const SimpleCmsLibWidgets = { +export const StaticCmsLibWidgets = { stringTemplate, validations, }; diff --git a/src/media-libraries/cloudinary/index.js b/src/media-libraries/cloudinary/index.js index 69d248c4..8ba46dda 100644 --- a/src/media-libraries/cloudinary/index.js +++ b/src/media-libraries/cloudinary/index.js @@ -84,5 +84,5 @@ async function init({ options = {}, handleInsert } = {}) { const cloudinaryMediaLibrary = { name: 'cloudinary', init }; -export const SimpleCmsMediaLibraryCloudinary = cloudinaryMediaLibrary; +export const StaticCmsMediaLibraryCloudinary = cloudinaryMediaLibrary; export default cloudinaryMediaLibrary; diff --git a/src/media-libraries/uploadcare/index.js b/src/media-libraries/uploadcare/index.js index a549de6c..26103323 100644 --- a/src/media-libraries/uploadcare/index.js +++ b/src/media-libraries/uploadcare/index.js @@ -5,7 +5,7 @@ import { Iterable } from 'immutable'; window.UPLOADCARE_LIVE = false; window.UPLOADCARE_MANUAL_START = true; -const USER_AGENT = 'SimpleCMS-Uploadcare-MediaLibrary'; +const USER_AGENT = 'StaticCms-Uploadcare-MediaLibrary'; const CDN_BASE_URL = 'https://ucarecdn.com'; /** @@ -165,7 +165,7 @@ async function init({ options = { config: {}, settings: {} }, handleInsert } = { /** * Uploadcare doesn't provide a "media library" widget for viewing and - * selecting existing files, so we return `false` here so Simple CMS only + * selecting existing files, so we return `false` here so Static CMS only * opens the Uploadcare widget when called from an editor control. This * results in the "Media" button in the global nav being hidden. */ @@ -179,5 +179,5 @@ async function init({ options = { config: {}, settings: {} }, handleInsert } = { */ const uploadcareMediaLibrary = { name: 'uploadcare', init }; -export const SimpleCmsMediaLibraryUploadcare = uploadcareMediaLibrary; +export const StaticCmsMediaLibraryUploadcare = uploadcareMediaLibrary; export default uploadcareMediaLibrary; diff --git a/src/reducers/collections.ts b/src/reducers/collections.ts index 28ce4af1..15344385 100644 --- a/src/reducers/collections.ts +++ b/src/reducers/collections.ts @@ -353,7 +353,7 @@ export function selectInferedField(collection: Collection, fieldName: string) { if (inferableField.showError) { consoleError( `The Field ${fieldName} is missing for the collection “${collection.get('name')}”`, - `Simple CMS tries to infer the entry ${fieldName} automatically, but one couldn't be found for entries of the collection “${collection.get( + `Static CMS tries to infer the entry ${fieldName} automatically, but one couldn't be found for entries of the collection “${collection.get( 'name', )}”. Please check your site configuration.`, ); diff --git a/src/reducers/entries.ts b/src/reducers/entries.ts index 8bcced83..1cbeca33 100644 --- a/src/reducers/entries.ts +++ b/src/reducers/entries.ts @@ -71,8 +71,8 @@ let append: boolean; let page: number; let slug: string; -const storageSortKey = 'simple-cms.entries.sort'; -const viewStyleKey = 'simple-cms.entries.viewStyle'; +const storageSortKey = 'static-cms.entries.sort'; +const viewStyleKey = 'static-cms.entries.viewStyle'; type StorageSortObject = SortObject & { index: number }; type StorageSort = { [collection: string]: { [key: string]: StorageSortObject } }; diff --git a/src/ui/AuthenticationPage.js b/src/ui/AuthenticationPage.js index 760c3461..3a0cdd6a 100644 --- a/src/ui/AuthenticationPage.js +++ b/src/ui/AuthenticationPage.js @@ -25,7 +25,7 @@ const SimpleLogoIcon = styled(Icon)` margin-top: -300px; `; -const SimpleCmsIcon = styled(Icon)` +const StaticCmsIcon = styled(Icon)` color: #c4c6d2; position: absolute; bottom: 10px; @@ -43,7 +43,7 @@ function renderPageLogo(logoUrl) { if (logoUrl) { return ; } - return ; + return ; } const LoginButton = styled.button` @@ -96,7 +96,7 @@ function AuthenticationPage({ )} {siteUrl && } - {logoUrl ? : null} + {logoUrl ? : null} ); } diff --git a/src/ui/Icon/images/_index.js b/src/ui/Icon/images/_index.js index b6843716..7e7b0ce0 100644 --- a/src/ui/Icon/images/_index.js +++ b/src/ui/Icon/images/_index.js @@ -32,7 +32,7 @@ import iconMarkdown from './markdown.svg'; import iconMedia from './media.svg'; import iconMediaAlt from './media-alt.svg'; import iconNetlify from './netlify.svg'; -import iconSimpleCms from './simple-cms-logo.svg'; +import iconStaticCms from './static-cms-logo.svg'; import iconNewTab from './new-tab.svg'; import iconPage from './page.svg'; import iconPages from './pages.svg'; @@ -82,7 +82,7 @@ const images = { media: iconMedia, 'media-alt': iconMediaAlt, netlify: iconNetlify, - 'simple-cms': iconSimpleCms, + 'static-cms': iconStaticCms, 'new-tab': iconNewTab, page: iconPage, pages: iconPages, diff --git a/src/ui/Icon/images/simple-cms-logo.svg b/src/ui/Icon/images/simple-cms-logo.svg deleted file mode 100644 index 3b9dd8f0..00000000 --- a/src/ui/Icon/images/simple-cms-logo.svg +++ /dev/null @@ -1,943 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ui/Icon/images/static-cms-logo.svg b/src/ui/Icon/images/static-cms-logo.svg new file mode 100644 index 00000000..74154c7a --- /dev/null +++ b/src/ui/Icon/images/static-cms-logo.svg @@ -0,0 +1,995 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ui/index.js b/src/ui/index.js index 38f207ab..75f9f00c 100644 --- a/src/ui/index.js +++ b/src/ui/index.js @@ -32,7 +32,7 @@ import { GlobalStyles, } from './styles'; -export const SimpleCmsUiDefault = { +export const StaticCmsUiDefault = { Dropdown, DropdownItem, DropdownCheckedItem, diff --git a/src/widgets/boolean/index.js b/src/widgets/boolean/index.js index 4fa0d292..631a4615 100644 --- a/src/widgets/boolean/index.js +++ b/src/widgets/boolean/index.js @@ -8,5 +8,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetBoolean = { Widget, controlComponent }; -export default SimpleCmsWidgetBoolean; +export const StaticCmsWidgetBoolean = { Widget, controlComponent }; +export default StaticCmsWidgetBoolean; diff --git a/src/widgets/code/index.js b/src/widgets/code/index.js index e779af19..fe9daf7c 100644 --- a/src/widgets/code/index.js +++ b/src/widgets/code/index.js @@ -14,5 +14,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetCode = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetCode; +export const StaticCmsWidgetCode = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetCode; diff --git a/src/widgets/colorstring/index.js b/src/widgets/colorstring/index.js index 9706cc21..ef4b645a 100644 --- a/src/widgets/colorstring/index.js +++ b/src/widgets/colorstring/index.js @@ -10,5 +10,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetColorString = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetColorString; +export const StaticCmsWidgetColorString = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetColorString; diff --git a/src/widgets/datetime/index.js b/src/widgets/datetime/index.js index eb7f4ff7..3dfa9471 100644 --- a/src/widgets/datetime/index.js +++ b/src/widgets/datetime/index.js @@ -12,5 +12,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetDatetime = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetDatetime; +export const StaticCmsWidgetDatetime = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetDatetime; diff --git a/src/widgets/file/index.js b/src/widgets/file/index.js index b2725a60..eb3db17b 100644 --- a/src/widgets/file/index.js +++ b/src/widgets/file/index.js @@ -14,5 +14,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetFile = { Widget, controlComponent, previewComponent, withFileControl }; -export default SimpleCmsWidgetFile; +export const StaticCmsWidgetFile = { Widget, controlComponent, previewComponent, withFileControl }; +export default StaticCmsWidgetFile; diff --git a/src/widgets/file/withFileControl.js b/src/widgets/file/withFileControl.js index 8a2f427f..63135b7d 100644 --- a/src/widgets/file/withFileControl.js +++ b/src/widgets/file/withFileControl.js @@ -158,7 +158,7 @@ function valueListToArray(value) { const warnDeprecatedOptions = once(field => console.warn(oneLine` - Simple CMS config: ${field.get('name')} field: property "options" has been deprecated for the + Static CMS config: ${field.get('name')} field: property "options" has been deprecated for the ${field.get('widget')} widget and will be removed in the next major release. Rather than \`field.options.media_library\`, apply media library options for this widget under \`field.media_library\`. diff --git a/src/widgets/image/index.js b/src/widgets/image/index.js index d76b180b..3f38bbd7 100644 --- a/src/widgets/image/index.js +++ b/src/widgets/image/index.js @@ -1,8 +1,8 @@ -import SimpleCmsWidgetFile from '../file'; +import StaticCmsWidgetFile from '../file'; import previewComponent from './ImagePreview'; import schema from './schema'; -const controlComponent = SimpleCmsWidgetFile.withFileControl({ forImage: true }); +const controlComponent = StaticCmsWidgetFile.withFileControl({ forImage: true }); function Widget(opts = {}) { return { @@ -14,5 +14,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetImage = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetImage; +export const StaticCmsWidgetImage = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetImage; diff --git a/src/widgets/list/ListControl.js b/src/widgets/list/ListControl.js index f3847b3d..effb902e 100644 --- a/src/widgets/list/ListControl.js +++ b/src/widgets/list/ListControl.js @@ -16,7 +16,7 @@ import { FieldLabel, } from '../../ui'; import { stringTemplate, validations } from '../../lib/widgets'; -import SimpleCmsWidgetObject from '../object'; +import StaticCmsWidgetObject from '../object'; import { TYPES_KEY, getTypedFieldForValue, @@ -24,7 +24,7 @@ import { getErrorMessageForTypedFieldAndValue, } from './typedListHelpers'; -const ObjectControl = SimpleCmsWidgetObject.controlComponent; +const ObjectControl = StaticCmsWidgetObject.controlComponent; const ListItem = styled.div(); diff --git a/src/widgets/list/index.js b/src/widgets/list/index.js index f59165b7..44f0decc 100644 --- a/src/widgets/list/index.js +++ b/src/widgets/list/index.js @@ -1,8 +1,8 @@ -import SimpleCmsWidgetObject from '../object'; +import StaticCmsWidgetObject from '../object'; import controlComponent from './ListControl'; import schema from './schema'; -const previewComponent = SimpleCmsWidgetObject.previewComponent; +const previewComponent = StaticCmsWidgetObject.previewComponent; function Widget(opts = {}) { return { @@ -14,5 +14,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetList = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetList; +export const StaticCmsWidgetList = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetList; diff --git a/src/widgets/map/index.js b/src/widgets/map/index.js index c79f598e..4b8baf84 100644 --- a/src/widgets/map/index.js +++ b/src/widgets/map/index.js @@ -14,5 +14,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetMap = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetMap; +export const StaticCmsWidgetMap = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetMap; diff --git a/src/widgets/markdown/index.js b/src/widgets/markdown/index.js index d1e81a11..9f0f963a 100644 --- a/src/widgets/markdown/index.js +++ b/src/widgets/markdown/index.js @@ -12,5 +12,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetMarkdown = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetMarkdown; +export const StaticCmsWidgetMarkdown = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetMarkdown; diff --git a/src/widgets/number/index.js b/src/widgets/number/index.js index 1a37e60a..2d1005a9 100644 --- a/src/widgets/number/index.js +++ b/src/widgets/number/index.js @@ -25,5 +25,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetNumber = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetNumber; +export const StaticCmsWidgetNumber = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetNumber; diff --git a/src/widgets/object/index.js b/src/widgets/object/index.js index 166627ea..d1b74b7a 100644 --- a/src/widgets/object/index.js +++ b/src/widgets/object/index.js @@ -12,5 +12,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetObject = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetObject; +export const StaticCmsWidgetObject = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetObject; diff --git a/src/widgets/relation/index.js b/src/widgets/relation/index.js index 6b4a8a32..49be68c1 100644 --- a/src/widgets/relation/index.js +++ b/src/widgets/relation/index.js @@ -35,5 +35,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetRelation = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetRelation; +export const StaticCmsWidgetRelation = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetRelation; diff --git a/src/widgets/select/index.js b/src/widgets/select/index.js index 9d032b28..363c299d 100644 --- a/src/widgets/select/index.js +++ b/src/widgets/select/index.js @@ -30,5 +30,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetSelect = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetSelect; +export const StaticCmsWidgetSelect = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetSelect; diff --git a/src/widgets/string/index.tsx b/src/widgets/string/index.tsx index 225562e3..9f77f1e4 100644 --- a/src/widgets/string/index.tsx +++ b/src/widgets/string/index.tsx @@ -11,5 +11,5 @@ function Widget(opts = {}): CmsWidgetParam { }; } -export const SimpleCmsWidgetString = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetString; +export const StaticCmsWidgetString = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetString; diff --git a/src/widgets/text/index.js b/src/widgets/text/index.js index 93554b56..815b170e 100644 --- a/src/widgets/text/index.js +++ b/src/widgets/text/index.js @@ -10,5 +10,5 @@ function Widget(opts = {}) { }; } -export const SimpleCmsWidgetText = { Widget, controlComponent, previewComponent }; -export default SimpleCmsWidgetText; +export const StaticCmsWidgetText = { Widget, controlComponent, previewComponent }; +export default StaticCmsWidgetText; diff --git a/tsconfig.json b/tsconfig.json index d20a7609..61f19f23 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,7 @@ "noUnusedParameters": true, "baseUrl": "./", "paths": { - "@simplecms/simple-cms-core": ["./src"] + "@staticcms/core": ["./src"] } }, "include": ["**/src/**/*", "dev-test/index.js"], diff --git a/webpack.config.js b/webpack.config.js index 018e1c0b..6cf37f55 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,7 +2,7 @@ const path = require('path'); const webpack = require('webpack'); const isProduction = process.env.NODE_ENV === 'production'; -const devServerPort = parseInt(process.env.SIMPLE_CMS_DEV_SERVER_PORT || `${8080}`); +const devServerPort = parseInt(process.env.STATIC_CMS_DEV_SERVER_PORT || `${8080}`); function moduleNameToPath(libName) { return path.resolve(__dirname, 'node_modules', libName); @@ -66,9 +66,9 @@ module.exports = { ], output: { path: path.resolve(__dirname, 'dist'), - filename: 'simple-cms-core.js', + filename: 'static-cms-core.js', library: { - name: 'SimpleCmsCore', + name: 'StaticCmsCore', type: 'umd', }, }, diff --git a/website/README.md b/website/README.md index 7906346e..10ceb6f4 100644 --- a/website/README.md +++ b/website/README.md @@ -1,6 +1,6 @@ -# Simple CMS Website & Docs +# Static CMS Website & Docs -This directory builds simplecms.github.io/simple-cms. If you'd like to propose changes to the site or docs, you'll find the source files in here. +This directory builds staticjscms.github.io/static-cms. If you'd like to propose changes to the site or docs, you'll find the source files in here. ## Local development diff --git a/website/content/blog/welcome-to-simple-cms.md b/website/content/blog/welcome-to-simple-cms.md index 209071bf..9b3e01ce 100644 --- a/website/content/blog/welcome-to-simple-cms.md +++ b/website/content/blog/welcome-to-simple-cms.md @@ -1,10 +1,10 @@ --- title: >- - Welcome to Simple CMS + Welcome to Static CMS author: Daniel Lautzenheiser description: >- - Announcing the release of Simple CMS v1.0. -twitter_image: /img/simple-cms.png + Announcing the release of Static CMS v1.0. +twitter_image: /img/static-cms.png date: 2022-10-30T12:00:00.000Z --- -Today we’re releasing Simple CMS 1.0! \ No newline at end of file +Today we’re releasing Static CMS 1.0! \ No newline at end of file diff --git a/website/content/docs/add-to-your-site.md b/website/content/docs/add-to-your-site.md index 129f27c7..b1ff45bf 100644 --- a/website/content/docs/add-to-your-site.md +++ b/website/content/docs/add-to-your-site.md @@ -3,13 +3,13 @@ group: Intro weight: 3 title: Add to Your Site --- -You can adapt Simple CMS to a wide variety of projects. It works with any content written in markdown, JSON, YAML, or TOML files, stored in a repo on [GitHub](https://github.com/), [GitLab](https://about.gitlab.com/), or [Bitbucket](https://bitbucket.org). You can also create your own custom backend. +You can adapt Static CMS to a wide variety of projects. It works with any content written in markdown, JSON, YAML, or TOML files, stored in a repo on [GitHub](https://github.com/), [GitLab](https://about.gitlab.com/), or [Bitbucket](https://bitbucket.org). You can also create your own custom backend. -This tutorial guides you through the steps for adding Simple CMS to a site that's built with a common [static site generator](https://www.staticgen.com/), like Jekyll, Hugo, Hexo, or Gatsby. Alternatively, you can [start from a template](../start-with-a-template) or dive right into [configuration options](../configuration-options). +This tutorial guides you through the steps for adding Static CMS to a site that's built with a common [static site generator](https://www.staticgen.com/), like Jekyll, Hugo, Hexo, or Gatsby. Alternatively, you can [start from a template](../start-with-a-template) or dive right into [configuration options](../configuration-options). ## App File Structure -A static `admin` folder contains all Simple CMS files, stored at the root of your published site. Where you store this folder in the source files depends on your static site generator. Here's the static file location for a few of the most popular static site generators: +A static `admin` folder contains all Static CMS files, stored at the root of your published site. Where you store this folder in the source files depends on your static site generator. Here's the static file location for a few of the most popular static site generators: | These generators | store static files in | | ------------------------------------------------------- | --------------------- | @@ -26,7 +26,7 @@ A static `admin` folder contains all Simple CMS files, stored at the root of you | preact-cli | `/src/static` | | Docusaurus | `/static` | -If your generator isn't listed here, you can check its documentation, or as a shortcut, look in your project for a `css` or `images` folder. The contents of folders like that are usually processed as static files, so it's likely you can store your `admin` folder next to those. (When you've found the location, feel free to add it to these docs by [filing a pull request](https://github.com/SimpleCMS/simple-cms/blob/main/CONTRIBUTING.md#pull-requests)!) +If your generator isn't listed here, you can check its documentation, or as a shortcut, look in your project for a `css` or `images` folder. The contents of folders like that are usually processed as static files, so it's likely you can store your `admin` folder next to those. (When you've found the location, feel free to add it to these docs by [filing a pull request](https://github.com/StaticJsCMS/static-cms/blob/main/CONTRIBUTING.md#pull-requests)!) Inside the `admin` folder, you'll create two files: @@ -36,7 +36,7 @@ admin └ config.yml ``` -The first file, `admin/index.html`, is the entry point for the Simple CMS admin interface. This means that users navigate to `yoursite.com/admin/` to access it. On the code side, it's a basic HTML starter page that loads the Simple CMS JavaScript file. The second file, `admin/config.yml`, is the heart of your Simple CMS installation, and a bit more complex. The [Configuration](#configuration) section covers the details. +The first file, `admin/index.html`, is the entry point for the Static CMS admin interface. This means that users navigate to `yoursite.com/admin/` to access it. On the code side, it's a basic HTML starter page that loads the Static CMS JavaScript file. The second file, `admin/config.yml`, is the heart of your Static CMS installation, and a bit more complex. The [Configuration](#configuration) section covers the details. In this example, we pull the `admin/index.html` file from a public CDN. @@ -49,26 +49,26 @@ In this example, we pull the `admin/index.html` file from a public CDN. Content Manager - - + + ``` -In the code above the `script` is loaded from the `unpkg` CDN. Should there be any issue, `jsDelivr` can be used as an alternative source. Simply set the `src` to `https://cdn.jsdelivr.net/npm/@simplecms/simple-cms-core@%5E0.1.0/dist/simple-cms-core.js` +In the code above the `script` is loaded from the `unpkg` CDN. Should there be any issue, `jsDelivr` can be used as an alternative source. Simply set the `src` to `https://cdn.jsdelivr.net/npm/@staticcms/core@%5E0.1.0/dist/static-cms-core.js` ### Installing with npm -You can also use Simple CMS as an npm module. Wherever you import Simple CMS, it automatically runs, taking over the current page. Make sure the script that imports it only runs on your CMS page. First install the package and save it to your project: +You can also use Static CMS as an npm module. Wherever you import Static CMS, it automatically runs, taking over the current page. Make sure the script that imports it only runs on your CMS page. First install the package and save it to your project: ```bash -npm install @simplecms/simple-cms-core --save +npm install @staticcms/core --save ``` Then import it (assuming your project has tooling for imports): ```js -import CMS from '@simplecms/simple-cms-core' +import CMS from '@staticcms/core' // Initialize the CMS object CMS.init() // Now the registry is available via the CMS object. @@ -83,7 +83,7 @@ Configuration is different for every site, so we'll break it down into parts. A We're using [Netlify](https://www.netlify.com) for our hosting and authentication in this tutorial, so backend configuration is fairly straightforward. -For GitHub and GitLab repositories, you can start your Simple CMS `config.yml` file with these lines: +For GitHub and GitLab repositories, you can start your Static CMS `config.yml` file with these lines: ```yaml backend: @@ -97,7 +97,7 @@ The configuration above specifies your backend protocol and your publication bra ### Media and Public Folders -Simple CMS allows users to upload images directly within the editor. For this to work, the CMS needs to know where to save them. If you already have an `images` folder in your project, you could use its path, possibly creating an `uploads` sub-folder, for example: +Static CMS allows users to upload images directly within the editor. For this to work, the CMS needs to know where to save them. If you already have an `images` folder in your project, you could use its path, possibly creating an `uploads` sub-folder, for example: ```yaml # This line should *not* be indented @@ -116,7 +116,7 @@ public_folder: "/images/uploads" # The src attribute for uploaded media will beg The configuration above adds a new setting, `public_folder`. While `media_folder` specifies where uploaded files are saved in the repo, `public_folder` indicates where they are found in the published site. Image `src` attributes use this path, which is relative to the file where it's called. For this reason, we usually start the path at the site root, using the opening `/`. -*If `public_folder` is not set, Simple CMS defaults to the same value as `media_folder`, adding an opening `/` if one is not included.* +*If `public_folder` is not set, Static CMS defaults to the same value as `media_folder`, adding an opening `/` if one is not included.* ### Collections @@ -136,7 +136,7 @@ rating: 5 This is the post body, where I write about our last chance to party before the Y2K bug destroys us all. ``` -Given this example, our `collections` settings would look like this in your Simple CMS `config.yml` file: +Given this example, our `collections` settings would look like this in your Static CMS `config.yml` file: ```yaml collections: @@ -194,7 +194,7 @@ Let's break that down: As described above, the `widget` property specifies a built-in or custom UI widget for a given field. When a content editor enters a value into a widget, that value is saved in the document front matter as the value for the `name` specified for that field. A full listing of available widgets can be found in the [Widgets doc](../widgets). -Based on this example, you can go through the post types in your site and add the appropriate settings to your Simple CMS `config.yml` file. Each post type should be listed as a separate node under the `collections` field. See the [Collections reference doc](../configuration-options/#collections) for more configuration options. +Based on this example, you can go through the post types in your site and add the appropriate settings to your Static CMS `config.yml` file. Each post type should be listed as a separate node under the `collections` field. See the [Collections reference doc](../configuration-options/#collections) for more configuration options. ### Filter @@ -214,7 +214,7 @@ collections: ## Authentication -Now that you have your Simple CMS files in place and configured, all that's left is to enable authentication. We're using the [Netlify](https://www.netlify.com/) platform here because it's one of the quickest ways to get started, but you can learn about other authentication options in the [Backends](/docs/backends-overview) doc. +Now that you have your Static CMS files in place and configured, all that's left is to enable authentication. We're using the [Netlify](https://www.netlify.com/) platform here because it's one of the quickest ways to get started, but you can learn about other authentication options in the [Backends](/docs/backends-overview) doc. ### Setup on Netlify @@ -265,6 +265,6 @@ If you set your registration preference to "Invite only," invite yourself (and a If you left your site registration open, or for return visits after confirming an email invitation, access your site's CMS at `yoursite.com/admin/`. -**Note:** No matter where you access Simple CMS — whether running locally, in a staging environment, or in your published site — it always fetches and commits files in your hosted repository (for example, on GitHub), on the branch you configured in your Simple CMS config.yml file. This means that content fetched in the admin UI matches the content in the repository, which may be different from your locally running site. It also means that content saved using the admin UI saves directly to the hosted repository, even if you're running the UI locally or in staging. +**Note:** No matter where you access Static CMS — whether running locally, in a staging environment, or in your published site — it always fetches and commits files in your hosted repository (for example, on GitHub), on the branch you configured in your Static CMS config.yml file. This means that content fetched in the admin UI matches the content in the repository, which may be different from your locally running site. It also means that content saved using the admin UI saves directly to the hosted repository, even if you're running the UI locally or in staging. Happy posting! diff --git a/website/content/docs/architecture.md b/website/content/docs/architecture.md index 20a585d2..5f625835 100644 --- a/website/content/docs/architecture.md +++ b/website/content/docs/architecture.md @@ -5,7 +5,7 @@ group: Contributing weight: 200 --- -Simple CMS is a React application, using Redux for state management with immutable data structures (immutable.js). +Static CMS is a React application, using Redux for state management with immutable data structures (immutable.js). The core abstractions for content editing are `collections`, `entries`, and `widgets`. diff --git a/website/content/docs/azure-backend.md b/website/content/docs/azure-backend.md index e678d6be..4e7c4f0a 100644 --- a/website/content/docs/azure-backend.md +++ b/website/content/docs/azure-backend.md @@ -6,7 +6,7 @@ title: Azure For repositories stored on Azure, the `azure` backend allows CMS users to log in directly with their Azure account. Note that all users must have write access to your content repository for this to work. -In order to get Simple CMS working with Azure DevOps, you need a Tenant Id and an Application Id. +In order to get Static CMS working with Azure DevOps, you need a Tenant Id and an Application Id. 1. If you do not have an Azure account, [create one here](https://azure.microsoft.com/en-us/free/?WT.mc_id=A261C142F) and make sure to have a credit card linked to the account. 2. If you do not have an Azure Active Directory Tenant Id, [set one up here](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-create-new-tenant). @@ -15,7 +15,7 @@ In order to get Simple CMS working with Azure DevOps, you need a Tenant Id and a 5. [Grant admin consent](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-configure-app-access-web-apis#admin-consent-button) for the application. 6. Under `Authentication->Implicit grant` enable [Access tokens](https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens) for the application and click `Save`. 7. Verify your Azure DevOps organization is connected to the same directory as your tenant under: `https://dev.azure.com//_settings/organizationAad` -8. Add the following lines to your Simple CMS `config.yml` file: +8. Add the following lines to your Static CMS `config.yml` file: ```yaml backend: diff --git a/website/content/docs/backends-overview.md b/website/content/docs/backends-overview.md index 91489e63..ec751df7 100644 --- a/website/content/docs/backends-overview.md +++ b/website/content/docs/backends-overview.md @@ -4,7 +4,7 @@ weight: 1 title: Overview --- -A backend is JavaScript code that allows Simple CMS to communicate with a service that stores content - typically a Git host like GitHub or GitLab. It provides functions that Simple CMS can use to do things like read and update files using API's provided by the service. +A backend is JavaScript code that allows Static CMS to communicate with a service that stores content - typically a Git host like GitHub or GitLab. It provides functions that Static CMS can use to do things like read and update files using API's provided by the service. ## Backend Configuration @@ -21,4 +21,4 @@ Individual backends should provide their own configuration documentation, but th ## Creating a New Backend -Anyone can write a backend, but we don't yet have a finalized and documented API. If you would like to write your own backend for a service that does not have one currently, we recommend using the [GitHub backend](https://github.com/SimpleCMS/simple-cms/tree/main/src/backends/github) as a reference for API and best practices. +Anyone can write a backend, but we don't yet have a finalized and documented API. If you would like to write your own backend for a service that does not have one currently, we recommend using the [GitHub backend](https://github.com/StaticJsCMS/static-cms/tree/main/src/backends/github) as a reference for API and best practices. diff --git a/website/content/docs/beta-features.md b/website/content/docs/beta-features.md index 44611370..241bb697 100644 --- a/website/content/docs/beta-features.md +++ b/website/content/docs/beta-features.md @@ -9,7 +9,7 @@ We run new functionality in an open beta format from time to time. That means th ## Working with a Local Git Repository -You can connect Simple CMS to a local Git repository, instead of working with a live repo. +You can connect Static CMS to a local Git repository, instead of working with a live repo. 1. Navigate to a local Git repository configured with the CMS. 2. Add the top-level property `local_backend` configuration to your `config.yml`: @@ -30,7 +30,7 @@ local_backend: true **Note:** `netlify-cms-proxy-server` runs an unauthenticated express server. As any client can send requests to the server, it should only be used for local development. -### Configure the Simple CMS proxy server port number +### Configure the Static CMS proxy server port number 1. Create a `.env` file in the project's root folder and define the PORT you'd like the proxy server to use @@ -292,7 +292,7 @@ Supports all of the [`slug` templates](/docs/configuration-options#slug) and: ## List Widget: Variable Types -Before this feature, the [list widget](/docs/widgets/#list) allowed a set of fields to be repeated, but every list item had the same set of fields available. With variable types, multiple named sets of fields can be defined, which opens the door to highly flexible content authoring (even page building) in Simple CMS. +Before this feature, the [list widget](/docs/widgets/#list) allowed a set of fields to be repeated, but every list item had the same set of fields available. With variable types, multiple named sets of fields can be defined, which opens the door to highly flexible content authoring (even page building) in Static CMS. **Note: this feature does not yet support default previews and requires [registering a preview template](/docs/customization#registerpreviewtemplate) in order to show up in the preview pane.** @@ -372,13 +372,13 @@ sections: ## Custom Mount Element -Simple CMS always creates its own DOM element for mounting the application, which means it always takes over the entire page, and is generally inflexible if you're trying to do something creative, like injecting it into a shared context. +Static CMS always creates its own DOM element for mounting the application, which means it always takes over the entire page, and is generally inflexible if you're trying to do something creative, like injecting it into a shared context. -You can now provide your own element for Simple CMS to mount in by setting the target element's ID as `nc-root`. If Simple CMS finds an element with this ID during initialization, it will mount within that element instead of creating its own. +You can now provide your own element for Static CMS to mount in by setting the target element's ID as `nc-root`. If Static CMS finds an element with this ID during initialization, it will mount within that element instead of creating its own. ## Manual Initialization -Simple CMS can now be manually initialized, rather than automatically loading up the moment you import it. The whole point of this at the moment is to inject configuration into Simple CMS before it loads, bypassing need for an actual Simple CMS `config.yml`. This is important, for example, when creating tight integrations with static site generators. +Static CMS can now be manually initialized, rather than automatically loading up the moment you import it. The whole point of this at the moment is to inject configuration into Static CMS before it loads, bypassing need for an actual Static CMS `config.yml`. This is important, for example, when creating tight integrations with static site generators. Manual initialization works by setting `window.CMS_MANUAL_INIT = true` **before importing the CMS**: @@ -386,12 +386,12 @@ Manual initialization works by setting `window.CMS_MANUAL_INIT = true` **before // This global flag enables manual initialization. window.CMS_MANUAL_INIT = true // Usage with import from npm package -import CMS, { init } from '@simplecms/simple-cms-core' +import CMS, { init } from '@staticcms/core' // Usage with script tag const { CMS, initCMS: init } = window /** * Initialize without passing in config - equivalent to just importing - * Simple CMS the old way. + * Static CMS the old way. */ init() /** @@ -451,18 +451,18 @@ CMS.registerPreviewTemplate(...); * Assumes a webpack project with `sass-loader` and `css-loader` installed. * Takes advantage of the `toString` method in the return value of `css-loader`. */ -import CMS from '@simplecms/simple-cms-core'; +import CMS from '@staticcms/core'; import styles from '!css-loader!sass-loader!../main.scss'; CMS.registerPreviewStyle(styles.toString(), { raw: true }); ``` ## Commit Message Templates -You can customize the templates used by Simple CMS to generate commit messages by setting the `commit_messages` option under `backend` in your Simple CMS `config.yml`. +You can customize the templates used by Static CMS to generate commit messages by setting the `commit_messages` option under `backend` in your Static CMS `config.yml`. Template tags wrapped in curly braces will be expanded to include information about the file changed by the commit. For example, `{{path}}` will include the full path to the file changed. -Setting up your Simple CMS `config.yml` to recreate the default values would look like this: +Setting up your Static CMS `config.yml` to recreate the default values would look like this: ```yaml backend: @@ -474,7 +474,7 @@ backend: deleteMedia: Delete “{{path}}” ``` -Simple CMS generates the following commit types: +Static CMS generates the following commit types: | Commit type | When is it triggered? | Available template tags | | --------------- | ---------------------------------------- | ----------------------------------------------------------- | diff --git a/website/content/docs/bitbucket-backend.md b/website/content/docs/bitbucket-backend.md index e263ee4b..31e0991f 100644 --- a/website/content/docs/bitbucket-backend.md +++ b/website/content/docs/bitbucket-backend.md @@ -8,7 +8,7 @@ For repositories stored on Bitbucket, the `bitbucket` backend allows CMS users t To enable it: 1. Follow the authentication provider setup steps in the [Netlify docs](https://www.netlify.com/docs/authentication-providers/#using-an-authentication-provider). -2. Add the following lines to your Simple CMS `config.yml` file: +2. Add the following lines to your Static CMS `config.yml` file: ```yaml backend: @@ -20,8 +20,8 @@ To enable it: With Bitbucket's Implicit Grant, users can authenticate with Bitbucket directly from the client. To do this: -1. Follow the [Atlassian docs](https://confluence.atlassian.com/bitbucket/oauth-on-bitbucket-cloud-238027431.html) to create an OAuth consumer. Make sure you allow `Account/Read` and `Repository/Write` permissions. For the **Callback URL**, enter the address where you access Simple CMS, for example, `https://www.mysite.com/admin/`. -2. Bitbucket gives you a **Key**. Copy this Key and enter it in your Simple CMS `config.yml` file, along with the following settings: +1. Follow the [Atlassian docs](https://confluence.atlassian.com/bitbucket/oauth-on-bitbucket-cloud-238027431.html) to create an OAuth consumer. Make sure you allow `Account/Read` and `Repository/Write` permissions. For the **Callback URL**, enter the address where you access Static CMS, for example, `https://www.mysite.com/admin/`. +2. Bitbucket gives you a **Key**. Copy this Key and enter it in your Static CMS `config.yml` file, along with the following settings: ```yaml backend: diff --git a/website/content/docs/cloudinary.md b/website/content/docs/cloudinary.md index d2cfc572..dd6f7143 100644 --- a/website/content/docs/cloudinary.md +++ b/website/content/docs/cloudinary.md @@ -5,7 +5,7 @@ weight: 10 --- Cloudinary is a digital asset management platform with a broad feature set, including support for responsive image generation and url based image transformation. They also provide a powerful media library UI for managing assets, and tools for organizing your assets into a hierarchy. -The Cloudinary media library integration for Simple CMS uses Cloudinary's own media library interface within Simple CMS. To get started, you'll need a Cloudinary account and Simple CMS 2.3.0 or greater. +The Cloudinary media library integration for Static CMS uses Cloudinary's own media library interface within Static CMS. To get started, you'll need a Cloudinary account and Static CMS 2.3.0 or greater. ## Creating a Cloudinary Account @@ -13,9 +13,9 @@ You can [sign up for Cloudinary](https://cloudinary.com/users/register/free) for ![Cloudinary console screenshot](/img/cloudinary-console-details.png) -## Connecting Cloudinary to Simple CMS +## Connecting Cloudinary to Static CMS -To use the Cloudinary media library within Simple CMS, you'll need to update your Simple CMS configuration file with the information from your Cloudinary account: +To use the Cloudinary media library within Static CMS, you'll need to update your Static CMS configuration file with the information from your Cloudinary account: ```yaml media_library: @@ -25,14 +25,14 @@ media_library: api_key: your_api_key ``` -**Note:** The user must be logged in to the Cloudinary account connected to the `api_key` used in your Simple CMS configuration. +**Note:** The user must be logged in to the Cloudinary account connected to the `api_key` used in your Static CMS configuration. ### Security Considerations Although this setup exposes the `cloud_name` and `api_key` publicly via the `/admin/config.yml` endpoint, this information is not sensitive. Any integration of the Cloudinary media library requires this information to be exposed publicly. To use this library or use the restricted Cloudinary API endpoints, the user must have access to the Cloudinary account login details or the `api_secret` associated with the `cloud_name` and `api_key`. -## Simple CMS configuration options +## Static CMS configuration options -The following options are specific to the Simple CMS integration for Cloudinary: +The following options are specific to the Static CMS integration for Cloudinary: * **`output_filename_only`**: _(default: `false`)_\ By default, the value provided for a selected image is a complete URL for the asset on Cloudinary's CDN. Setting `output_filename_only` to `true` will instead produce just the filename (e.g. `image.jpg`). This should be `true` if you will be directly embedding cloudinary transformation urls in page templates. Refer to [Inserting Cloudinary URL in page templates](#inserting-cloudinary-url-in-page-templates). @@ -43,7 +43,7 @@ The following options are specific to the Simple CMS integration for Cloudinary: ## Cloudinary configuration options -The following options are used to configure the media library. All options are listed in Cloudinary's [media library documentation](https://cloudinary.com/documentation/media_library_widget#3_set_the_configuration_options), but only options listed below are available or recommended for the Simple CMS integration: +The following options are used to configure the media library. All options are listed in Cloudinary's [media library documentation](https://cloudinary.com/documentation/media_library_widget#3_set_the_configuration_options), but only options listed below are available or recommended for the Static CMS integration: ### Authentication @@ -58,7 +58,7 @@ The following options are used to configure the media library. All options are l ## Image transformations -The Cloudinary integration allows images to be transformed in two ways: directly within Simple CMS via [Cloudinary's Media Library](#transforming-images-via-media-library), and separately from the CMS via Cloudinary's [dynamic URL's](https://cloudinary.com/documentation/image_transformations#delivering_media_assets_using_dynamic_urls) by [inserting cloudinary urls](#inserting-cloudinary-url-in-page-templates). +The Cloudinary integration allows images to be transformed in two ways: directly within Static CMS via [Cloudinary's Media Library](#transforming-images-via-media-library), and separately from the CMS via Cloudinary's [dynamic URL's](https://cloudinary.com/documentation/image_transformations#delivering_media_assets_using_dynamic_urls) by [inserting cloudinary urls](#inserting-cloudinary-url-in-page-templates). ### Transforming images via Media Library If you transform and insert images from within the Cloudinary media library, the transformed image URL will be output by default. This gives the editor complete freedom to make changes to the image output. diff --git a/website/content/docs/collection-types.md b/website/content/docs/collection-types.md index 91f7e5a4..c5026150 100644 --- a/website/content/docs/collection-types.md +++ b/website/content/docs/collection-types.md @@ -88,7 +88,7 @@ A `files` collection contains one or more uniquely configured files. Unlike item When configuring a `files` collection, configure each file in the collection separately, and list them under the `files` field of the collection. Each file has its own list of `fields` and a unique filepath specified in the `file` field (relative to the base of the repo). -**Note:** Files listed in a file collection must already exist in the hosted repository branch set in your Simple CMS [backend configuration](/docs/backends-overview). Files must also have a valid value for the file type. For example, an empty file works as valid YAML, but a JSON file must have a non-empty value to be valid, such as an empty object. +**Note:** Files listed in a file collection must already exist in the hosted repository branch set in your Static CMS [backend configuration](/docs/backends-overview). Files must also have a valid value for the file type. For example, an empty file works as valid YAML, but a JSON file must have a non-empty value to be valid, such as an empty object. Example: diff --git a/website/content/docs/configuration-options.md b/website/content/docs/configuration-options.md index 30ddb93d..556d48df 100644 --- a/website/content/docs/configuration-options.md +++ b/website/content/docs/configuration-options.md @@ -5,7 +5,7 @@ title: Configuration Options --- ## Configuration File -All configuration options for Simple CMS are specified in a `config.yml` file, in the folder where you access the editor UI (usually in the `/admin` folder). +All configuration options for Static CMS are specified in a `config.yml` file, in the folder where you access the editor UI (usually in the `/admin` folder). Alternatively, you can specify a custom config file using a link tag: @@ -14,7 +14,7 @@ Alternatively, you can specify a custom config file using a link tag: ``` -To see working configuration examples, you can [start from a template](../start-with-a-template) or check out the [CMS demo site](https://cms-demo.netlify.com). (No login required: click the login button and the CMS will open.) You can refer to the demo [configuration code](https://github.com/SimpleCMS/simple-cms/blob/master/dev-test/config.yml) to see how each option was configured. +To see working configuration examples, you can [start from a template](../start-with-a-template) or check out the [CMS demo site](https://cms-demo.netlify.com). (No login required: click the login button and the CMS will open.) You can refer to the demo [configuration code](https://github.com/StaticJsCMS/static-cms/blob/master/dev-test/config.yml) to see how each option was configured. You can find details about all configuration options below. Note that [YAML syntax](https://en.wikipedia.org/wiki/YAML#Basic_components) allows lists and objects to be written in block or inline style, and the code samples below include a mix of both. @@ -24,11 +24,11 @@ You can find details about all configuration options below. Note that [YAML synt The `backend` option specifies how to access the content for your site, including authentication. Full details and code samples can be found in [Backends](/docs/backends-overview). -**Note**: no matter where you access Simple CMS — whether running locally, in a staging environment, or in your published site — it will always fetch and commit files in your hosted repository (for example, on GitHub), on the branch you configured in your Simple CMS config.yml file. This means that content fetched in the admin UI will match the content in the repository, which may be different from your locally running site. It also means that content saved using the admin UI will save directly to the hosted repository, even if you're running the UI locally or in staging. If you want to have your local CMS write to a local repository, try the `local_backend` setting, [currently in beta](/docs/beta-features/#working-with-a-local-git-repository). +**Note**: no matter where you access Static CMS — whether running locally, in a staging environment, or in your published site — it will always fetch and commit files in your hosted repository (for example, on GitHub), on the branch you configured in your Static CMS config.yml file. This means that content fetched in the admin UI will match the content in the repository, which may be different from your locally running site. It also means that content saved using the admin UI will save directly to the hosted repository, even if you're running the UI locally or in staging. If you want to have your local CMS write to a local repository, try the `local_backend` setting, [currently in beta](/docs/beta-features/#working-with-a-local-git-repository). ## Media and Public Folders -Simple CMS users can upload files to your repository using the Media Gallery. The following settings specify where these files are saved, and where they can be accessed on your built site. +Static CMS users can upload files to your repository using the Media Gallery. The following settings specify where these files are saved, and where they can be accessed on your built site. ### Media Folder @@ -116,7 +116,7 @@ locale: 'de' And in your custom JavaScript code: ```js -import CMS, { de } from '@simplecms/simple-cms-core'; +import CMS, { de } from '@staticcms/core'; CMS.registerLocale('de', de); ``` @@ -165,7 +165,7 @@ slug: *This setting is required.* -The `collections` setting is the heart of your Simple CMS configuration, as it determines how content types and editor fields in the UI generate files and content in your repository. Each collection you configure displays in the left sidebar of the Content page of the editor UI, in the order they are entered into your Simple CMS `config.yml` file. +The `collections` setting is the heart of your Static CMS configuration, as it determines how content types and editor fields in the UI generate files and content in your repository. Each collection you configure displays in the left sidebar of the Content page of the editor UI, in the order they are entered into your Static CMS `config.yml` file. `collections` accepts a list of collection objects, each with the following options: @@ -196,7 +196,7 @@ The last few options require more detailed information. ### `identifier_field` -Simple CMS expects every entry to provide a field named `"title"` that serves as an identifier for the entry. The identifier field serves as an entry's title when viewing a list of entries, and is used in [slug](#slug) creation. If you would like to use a field other than `"title"` as the identifier, you can set `identifier_field` to the name of the other field. +Static CMS expects every entry to provide a field named `"title"` that serves as an identifier for the entry. The identifier field serves as an entry's title when viewing a list of entries, and is used in [slug](#slug) creation. If you would like to use a field other than `"title"` as the identifier, you can set `identifier_field` to the name of the other field. **Example** @@ -208,7 +208,7 @@ collections: ### `extension` and `format` -These settings determine how collection files are parsed and saved. Both are optional—Simple CMS will attempt to infer your settings based on existing items in the collection. If your collection is empty, or you'd like more control, you can set these fields explicitly. +These settings determine how collection files are parsed and saved. Both are optional—Static CMS will attempt to infer your settings based on existing items in the collection. If your collection is empty, or you'd like more control, you can set these fields explicitly. `extension` determines the file extension searched for when finding existing entries in a folder collection and it determines the file extension used to save new collection items. It accepts the following values: `yml`, `yaml`, `toml`, `json`, `md`, `markdown`, `html`. @@ -265,7 +265,7 @@ slug: "{{year}}-{{month}}-{{day}}_{{fields.slug}}" ### `fields` -The `fields` option maps editor UI widgets to field-value pairs in the saved file. The order of the fields in your Simple CMS `config.yml` file determines their order in the editor UI and in the saved file. +The `fields` option maps editor UI widgets to field-value pairs in the saved file. The order of the fields in your Static CMS `config.yml` file determines their order in the editor UI and in the saved file. `fields` accepts a list of collection objects, each with the following options: diff --git a/website/content/docs/contributor-guide.md b/website/content/docs/contributor-guide.md index 1ba7ec08..9b3a5ba0 100644 --- a/website/content/docs/contributor-guide.md +++ b/website/content/docs/contributor-guide.md @@ -4,13 +4,13 @@ weight: 20 group: Contributing --- -We're hoping that Simple CMS will do for the [Jamstack](https://www.jamstack.org) what WordPress did for dynamic sites back in the day. We know we can't do that without building a thriving community of contributors and users, and we'd love to have you join us. +We're hoping that Static CMS will do for the [Jamstack](https://www.jamstack.org) what WordPress did for dynamic sites back in the day. We know we can't do that without building a thriving community of contributors and users, and we'd love to have you join us. ## Getting started with contributing -Being a developer is not a requirement for contributing to Simple CMS, you only need the desire, a web browser, and a [GitHub account](https://github.com/join). The GitHub repo has a step-by-step [guide](https://github.com/SimpleCMS/simple-cms/blob/master/CONTRIBUTING.md) to get started with the code. +Being a developer is not a requirement for contributing to Static CMS, you only need the desire, a web browser, and a [GitHub account](https://github.com/join). The GitHub repo has a step-by-step [guide](https://github.com/StaticJsCMS/static-cms/blob/master/CONTRIBUTING.md) to get started with the code. -## The basics of the Simple CMS docs -The documentation for Simple CMS is written in [Markdown](http://daringfireball.net/projects/markdown/) (a good cheatsheet on Markdown is [here](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)), with the source residing on [GitHub](https://github.com/SimpleCMS/simple-cms) in the `/website/content/docs` folder. +## The basics of the Static CMS docs +The documentation for Static CMS is written in [Markdown](http://daringfireball.net/projects/markdown/) (a good cheatsheet on Markdown is [here](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)), with the source residing on [GitHub](https://github.com/StaticJsCMS/static-cms) in the `/website/content/docs` folder. The GitHub website allows you to submit issues, work with files, search for content, and browse changes that have been submitted in the past and those that are being submitted now (aka Pull Requests). @@ -18,18 +18,18 @@ The GitHub website allows you to submit issues, work with files, search for cont A [style guide](/docs/writing-style-guide/) is available to help provide context around grammar, code styling, syntax, etc. ## Filing issues -If you have a GitHub account, you can file an [issue](https://github.com/SimpleCMS/simple-cms/issues) (aka bug report) against the Simple CMS docs. Even if you're not able to, or don't know how to, fix the issue (see [Improve existing content](#improve-existing-content)), it helps to start the conversation. +If you have a GitHub account, you can file an [issue](https://github.com/StaticJsCMS/static-cms/issues) (aka bug report) against the Static CMS docs. Even if you're not able to, or don't know how to, fix the issue (see [Improve existing content](#improve-existing-content)), it helps to start the conversation. -When filing an issue, it is important to remember the [Code of Conduct](https://github.com/SimpleCMS/simple-cms/blob/master/CODE_OF_CONDUCT.md). +When filing an issue, it is important to remember the [Code of Conduct](https://github.com/StaticJsCMS/static-cms/blob/master/CODE_OF_CONDUCT.md). ## Improve existing content -If you are able to offer up a change to existing content, we welcome this. Once you've forked the repo, and changed the content, you would file a pull request (PR). The repo [Contributing file](https://github.com/SimpleCMS/simple-cms/blob/master/CONTRIBUTING.md) lays out the correct format for PRs. +If you are able to offer up a change to existing content, we welcome this. Once you've forked the repo, and changed the content, you would file a pull request (PR). The repo [Contributing file](https://github.com/StaticJsCMS/static-cms/blob/master/CONTRIBUTING.md) lays out the correct format for PRs. ## Other places to get involved While we work on building this page (and you can help!), here are some links with more information about getting involved: -* [Setup instructions and Contribution Guidelines](https://github.com/SimpleCMS/simple-cms/blob/master/CONTRIBUTING.md) -* [Join our Community Chat](https://simplecms.github.io/simple-cms/chat) -* [Code of Conduct](https://github.com/SimpleCMS/simple-cms/blob/master/CODE_OF_CONDUCT.md) -* [Project Milestones](https://github.com/SimpleCMS/simple-cms/milestones) -* [Good First Issues](https://github.com/SimpleCMS/simple-cms/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22good+first+issue%22+-label%3Aclaimed) +* [Setup instructions and Contribution Guidelines](https://github.com/StaticJsCMS/static-cms/blob/master/CONTRIBUTING.md) +* [Join our Community Chat](https://staticjscms.github.io/static-cms/chat) +* [Code of Conduct](https://github.com/StaticJsCMS/static-cms/blob/master/CODE_OF_CONDUCT.md) +* [Project Milestones](https://github.com/StaticJsCMS/static-cms/milestones) +* [Good First Issues](https://github.com/StaticJsCMS/static-cms/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22good+first+issue%22+-label%3Aclaimed) diff --git a/website/content/docs/custom-widgets.md b/website/content/docs/custom-widgets.md index 26dde292..a9631946 100644 --- a/website/content/docs/custom-widgets.md +++ b/website/content/docs/custom-widgets.md @@ -3,7 +3,7 @@ group: Fields weight: 20 title: Creating Custom Widgets --- -The Simple CMS exposes a `window.CMS` a global object that you can use to register custom widgets, previews, and editor plugins. The same object is also the default export if you import Simple CMS as an npm module. The available widget extension methods are: +The Static CMS exposes a `window.CMS` a global object that you can use to register custom widgets, previews, and editor plugins. The same object is also the default export if you import Static CMS as an npm module. The available widget extension methods are: * **registerWidget:** registers a custom widget. * **registerEditorComponent:** adds a block component to the Markdown editor. @@ -12,7 +12,7 @@ The Simple CMS exposes a `window.CMS` a global object that you can use to regist The `registerWidget` requires you to provide a React component. If you have a build process in place for your project, it is possible to integrate with this build process. -However, although possible, it may be cumbersome or even impractical to add a React build phase. For this reason, Simple CMS exposes two constructs globally to allow you to create components inline: ‘createClass’ and ‘h’ (alias for React.createElement). +However, although possible, it may be cumbersome or even impractical to add a React build phase. For this reason, Static CMS exposes two constructs globally to allow you to create components inline: ‘createClass’ and ‘h’ (alias for React.createElement). ## `registerWidget` @@ -23,7 +23,7 @@ Register a custom widget. CMS.registerWidget(name, control, [preview], [schema]); // Using npm module import -import CMS from '@simplecms/simple-cms-core'; +import CMS from '@staticcms/core'; CMS.registerWidget(name, control, [preview], [schema]); ``` @@ -41,7 +41,7 @@ CMS.registerWidget(name, control, [preview], [schema]); `admin/index.html` ```html - + + + @@ -69,7 +69,7 @@ Registers a template for a folder collection or an individual file in a file col **Example:** ```html - + + + ``` -`index.html` displays the Simple CMS admin interface. You'll use the admin interface to edit your blog posts. +`index.html` displays the Static CMS admin interface. You'll use the admin interface to edit your blog posts. @@ -209,7 +209,7 @@ collections: - { name: imageUrl, label: ImageURL, widget: string } ``` -`config.yml` specifies what kind of content your blog posts have. The content specification enables Simple CMS to edit existing posts and create new ones with the same format. To learn more, read about Simple CMS' [](https://www.simplecms.github.io/simple-cms/docs/configuration-options/)[Configuration options](https://www.simplecms.github.io/simple-cms/docs/configuration-options/). +`config.yml` specifies what kind of content your blog posts have. The content specification enables Static CMS to edit existing posts and create new ones with the same format. To learn more, read about Static CMS' [](https://www.staticjscms.github.io/static-cms/docs/configuration-options/)[Configuration options](https://www.staticjscms.github.io/static-cms/docs/configuration-options/).

  • @@ -224,7 +224,7 @@ You can now view and edit `2021-11-15-first-blog-post.md` through the admin inte ```bash git add . -git commit -m "Add Simple CMS" +git commit -m "Add Static CMS" git push ``` @@ -236,7 +236,7 @@ Netlify builds and deploys your new changes. ## Add GitHub as an authentication provider -Before you can access `/admin/` through your Netlify domain, you need to set up an authentication provider. The authentication provider allows Simple CMS to determine whether users have read and write access to `/admin/`. This guide uses GitHub credentials for authentication. +Before you can access `/admin/` through your Netlify domain, you need to set up an authentication provider. The authentication provider allows Static CMS to determine whether users have read and write access to `/admin/`. This guide uses GitHub credentials for authentication. ### Configure GitHub diff --git a/website/content/docs/examples.md b/website/content/docs/examples.md index 6221d0b9..03b17ff2 100644 --- a/website/content/docs/examples.md +++ b/website/content/docs/examples.md @@ -8,7 +8,7 @@ Do you have a great, open source example? Submit a pull request to this page! Example | Tools | Type | Source | More info | --- | --- | --- | --- | --- -[Gatsby & Simple CMS Meetup Group Template](https://github.com/robertcoopercode/gatsby-netlify-cms) | Gatsby | demo | [robertcoopercode/gatsby-netlify-cms](https://github.com/robertcoopercode/gatsby-netlify-cms) | [blog post](https://blog.logrocket.com/gatsby-netlify-cms-a-perfect-pairing-d50d59d16f67) +[Gatsby & Static CMS Meetup Group Template](https://github.com/robertcoopercode/gatsby-netlify-cms) | Gatsby | demo | [robertcoopercode/gatsby-netlify-cms](https://github.com/robertcoopercode/gatsby-netlify-cms) | [blog post](https://blog.logrocket.com/gatsby-netlify-cms-a-perfect-pairing-d50d59d16f67) [This Developing Journey](https://briandouglas.me) | middleman | blog | [bdougie/blog](https://github.com/bdougie/blog) | [blog post](https://www.netlify.com/blog/2017/04/20/creating-a-blog-with-middleman-and-netlify-cms/) [Jamstack Recipes](https://jamstack-cms.netlify.com) | Hugo, Azure | demo | [hlaueriksson/jamstack-cms](https://github.com/hlaueriksson/jamstack-cms) | [blog post](http://conductofcode.io/post/managing-content-for-a-jamstack-site-with-netlify-cms/) [Bael](https://bael-theme.jake101.com/) | Vue, Nuxt | blog | [jake-101/bael-template](https://github.com/jake-101/bael-template) | [blog post](https://bael-theme.jake101.com/blog/2018-06-19-top-10-reasons-why) @@ -24,12 +24,12 @@ Example | Tools | Type | Source | More info | [Jigsaw Blog Starter Template Demo](https://jigsaw-blog-netlify-netlifycms-template.netlify.com/) | Jigsaw | demo | [erickpatrick/jigsaw-blog-netlify-netlifycms-template](https://github.com/erickpatrick/jigsaw-blog-netlify-netlifycms-template) | [blog post](https://www.erickpatrick.net/blog/augmenting-tightenco-jigsaw-with-netlifycms/) [Nuxt & NetlifyCMS Boilerplate](https://nuxt-netlifycms-boilerplate.netlify.com/) | Vue, Nuxt | demo | [tylermercer/nuxt-netlifycms-boilerplate](https://github.com/tylermercer/nuxt-netlifycms-boilerplate) | [read me](https://github.com/tylermercer/nuxt-netlifycms-boilerplate) [Next.js demo](https://netlifycms-nextjs.netlify.com) | Next.js | blog | [masives/netlifycms-nextjs](https://github.com/masives/netlifycms-nextjs) | [read me](https://github.com/masives/netlifycms-nextjs) -[Delog - Jamstack Blog with Simple CMS](https://delog-w3layouts.netlify.com/) | Gatsby, Netlify-CMS | demo | [W3Layouts/gatsby-starter-delog](https://github.com/W3Layouts/gatsby-starter-delog) | [blog post](https://w3layouts.com/articles/delog-gatsby-starter-netlify-cms/) -[Simple CMS template for Gridsome](https://netlifycms-gridsome.suits.at/) | Gridsome, Vue | demo | [suits-at/netlifycms-gridsome](https://github.com/suits-at/netlifycms-gridsome) | [read me](https://github.com/suits-at/netlifycms-gridsome) +[Delog - Jamstack Blog with Static CMS](https://delog-w3layouts.netlify.com/) | Gatsby, Netlify-CMS | demo | [W3Layouts/gatsby-starter-delog](https://github.com/W3Layouts/gatsby-starter-delog) | [blog post](https://w3layouts.com/articles/delog-gatsby-starter-netlify-cms/) +[Static CMS template for Gridsome](https://netlifycms-gridsome.suits.at/) | Gridsome, Vue | demo | [suits-at/netlifycms-gridsome](https://github.com/suits-at/netlifycms-gridsome) | [read me](https://github.com/suits-at/netlifycms-gridsome) [Next.js blogging template for Netlify](https://nextjs-netlify-blog-template.netlify.app/) | Next.js, Netlify | blog | [wutali/nextjs-netlify-blog-template](https://github.com/wutali/nextjs-netlify-blog-template) | [read me](https://github.com/wutali/nextjs-netlify-blog-template) -[Simple CMS and OAuth server on AWS](https://github.com/pulumi/examples/tree/master/aws-ts-netlify-cms-and-oauth) | Netlify, Pulumi, AWS | blog | [pulumi/examples/aws-ts-netlify-cms-and-oauth](https://github.com/pulumi/examples/tree/master/aws-ts-netlify-cms-and-oauth) | [blog post](https://www.pulumi.com/blog/deploying-the-infrastructure-of-oauth-server-for-cms-app/) +[Static CMS and OAuth server on AWS](https://github.com/pulumi/examples/tree/master/aws-ts-netlify-cms-and-oauth) | Netlify, Pulumi, AWS | blog | [pulumi/examples/aws-ts-netlify-cms-and-oauth](https://github.com/pulumi/examples/tree/master/aws-ts-netlify-cms-and-oauth) | [blog post](https://www.pulumi.com/blog/deploying-the-infrastructure-of-oauth-server-for-cms-app/) [Eleventy Starter Boilerplate](https://creativedesignsguru.com/demo/Eleventy-Starter-Boilerplate/eleventy-starter-boilerplate-presentation/) | Eleventy, Netlify | demo | [ixartz/Eleventy-Starter-Boilerplate](https://github.com/ixartz/Eleventy-Starter-Boilerplate) | [read me](https://github.com/ixartz/Eleventy-Starter-Boilerplate) [Nuxt, Tailwind & NetlifyCMS Boilerplate](https://ntn-boilerplate.netlify.app/) | Vue, Nuxt | demo | [Knogobert/ntn-boilerplate](https://github.com/Knogobert/ntn-boilerplate) | [read me](https://github.com/Knogobert/ntn-boilerplate#readme) -[Gatsby & Simple CMS Personal Portfolio](https://kind-mestorf-5a2bc0.netlify.com/) | Gatsby | portfolio | [EarlGeorge/React-Gatsby](https://github.com/EarlGeorge/React-Gatsby) | [read me](https://github.com/EarlGeorge/React-Gatsby/blob/master/README.md) +[Gatsby & Static CMS Personal Portfolio](https://kind-mestorf-5a2bc0.netlify.com/) | Gatsby | portfolio | [EarlGeorge/React-Gatsby](https://github.com/EarlGeorge/React-Gatsby) | [read me](https://github.com/EarlGeorge/React-Gatsby/blob/master/README.md) [Gatsby, Tailwind CSS & NetlifyCMS Starter](https://infallible-varahamihira-058515.netlify.app/) | Gatsby v3, Netlify-CMS, Tailwind CSS | demo | [jimmybutton/gatsby-netlifycms-tailwind-starter](https://github.com/jimmybutton/gatsby-netlifycms-tailwind-starter) | [read me](https://github.com/jimmybutton/gatsby-netlifycms-tailwind-starter#readme) [Metalsmith NetlifyCMS Starter](https://metalsmith-netlify-starter.netlify.app/) | Metalsmith and Netlify-CMS | demo | [metalsmith-netlify-starter](https://github.com/wernerglinka/metalsmith-netlify-starter) | [read me](https://github.com/wernerglinka/metalsmith-netlify-starter#readme) \ No newline at end of file diff --git a/website/content/docs/gatsby.md b/website/content/docs/gatsby.md index 60143efc..f0061467 100644 --- a/website/content/docs/gatsby.md +++ b/website/content/docs/gatsby.md @@ -3,7 +3,7 @@ title: Gatsby group: Guides weight: 10 --- -This guide will help you get started using Simple CMS and Gatsby. +This guide will help you get started using Static CMS and Gatsby. To get up and running with Gatsby, you’ll need to have [Node.js](https://nodejs.org/) installed on your computer. *Note: Gatsby's minimum supported Node.js version is Node 8.* @@ -34,14 +34,14 @@ Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts. ``` -We can see above that each blog post has a title, a date, a description and a body. Now, let's recreate this using Simple CMS. +We can see above that each blog post has a title, a date, a description and a body. Now, let's recreate this using Static CMS. -## Add Simple CMS to your site +## Add Static CMS to your site -First let's install some dependencies. We'll need `@simplecms/simple-cms-core` and `gatsby-plugin-netlify-cms`. Run the following command in the terminal at the root of your site: +First let's install some dependencies. We'll need `@staticcms/core` and `gatsby-plugin-netlify-cms`. Run the following command in the terminal at the root of your site: ```bash -npm install --save @simplecms/simple-cms-core gatsby-plugin-netlify-cms +npm install --save @staticcms/core gatsby-plugin-netlify-cms ``` ### Configuration diff --git a/website/content/docs/git-gateway-backend.md b/website/content/docs/git-gateway-backend.md index 1edf4fd2..d926c6e8 100644 --- a/website/content/docs/git-gateway-backend.md +++ b/website/content/docs/git-gateway-backend.md @@ -8,12 +8,12 @@ group: Accounts ## Git Gateway with Netlify -The [Netlify Identity](https://www.netlify.com/docs/identity/) service can handle the authentication and provides a simple interface for user management. The Simple CMS [featured templates](../start-with-a-template) are working examples of this backend. +The [Netlify Identity](https://www.netlify.com/docs/identity/) service can handle the authentication and provides a simple interface for user management. The Static CMS [featured templates](../start-with-a-template) are working examples of this backend. To use it in your own project stored on GitHub or GitLab, follow these steps: 1. Head over to the [Netlify Identity docs](https://www.netlify.com/docs/identity) and follow the steps to get started. -2. Add the following lines to your Simple CMS `config.yml` file: +2. Add the following lines to your Static CMS `config.yml` file: ```yaml backend: @@ -28,4 +28,4 @@ If you change ownership on your repository, or convert a repository from public You can use [Git Gateway](https://github.com/netlify/git-gateway) without Netlify by setting up your own Git Gateway server and connecting it with your own instance of [GoTrue](https://www.gotrueapi.org) (the open source microservice that powers Netlify Identity), or with any other identity service that can issue JSON Web Tokens (JWT). -To configure in Simple CMS, use the same `backend` settings in your Simple CMS `config.yml` file as described in Step 2 of the [Git Gateway with Netlify Identity](#git-gateway-with-netlify-identity) instructions above. +To configure in Static CMS, use the same `backend` settings in your Static CMS `config.yml` file as described in Step 2 of the [Git Gateway with Netlify Identity](#git-gateway-with-netlify-identity) instructions above. diff --git a/website/content/docs/github-backend.md b/website/content/docs/github-backend.md index d74bade1..0a0a91ea 100644 --- a/website/content/docs/github-backend.md +++ b/website/content/docs/github-backend.md @@ -5,12 +5,12 @@ title: GitHub --- For repositories stored on GitHub, the `github` backend allows CMS users to log in directly with their GitHub account. Note that all users must have push access to your content repository for this to work. -Because Github [requires a server](https://github.com/SimpleCMS/simple-cms/issues/663#issuecomment-335023723) for authentication, Netlify facilitates basic GitHub authentication. +Because Github [requires a server](https://github.com/StaticJsCMS/static-cms/issues/663#issuecomment-335023723) for authentication, Netlify facilitates basic GitHub authentication. To enable basic GitHub authentication: 1. Follow the authentication provider setup steps in the [Netlify docs](https://www.netlify.com/docs/authentication-providers/#using-an-authentication-provider). -2. Add the following lines to your Simple CMS `config.yml` file: +2. Add the following lines to your Static CMS `config.yml` file: ```yaml backend: @@ -22,4 +22,4 @@ backend: ## Git Large File Storage (LFS) -Please note that the GitHub backend **does not** support [git-lfs](https://git-lfs.github.com/), see [this issue](https://github.com/SimpleCMS/simple-cms/issues/1206) for more information. +Please note that the GitHub backend **does not** support [git-lfs](https://git-lfs.github.com/), see [this issue](https://github.com/StaticJsCMS/static-cms/issues/1206) for more information. diff --git a/website/content/docs/gitlab-backend.md b/website/content/docs/gitlab-backend.md index 15c2adfc..285da6c5 100644 --- a/website/content/docs/gitlab-backend.md +++ b/website/content/docs/gitlab-backend.md @@ -19,9 +19,9 @@ When using GitLab's Authorization Code Flow for authentication, you can use Netl To enable it: -1. Follow the [GitLab docs](https://docs.gitlab.com/ee/integration/oauth_provider.html#adding-an-application-through-the-profile) to add your Simple CMS instance as an OAuth application. For the **Redirect URI**, enter `https://api.netlify.com/auth/done`, and check the box for `api` scope. +1. Follow the [GitLab docs](https://docs.gitlab.com/ee/integration/oauth_provider.html#adding-an-application-through-the-profile) to add your Static CMS instance as an OAuth application. For the **Redirect URI**, enter `https://api.netlify.com/auth/done`, and check the box for `api` scope. 2. Follow the [Netlify docs](https://www.netlify.com/docs/authentication-providers/#using-an-authentication-provider) to add your new GitLab Application ID and Secret to your Netlify site dashboard. -3. In your repository, add the following lines to your Simple CMS `config.yml` file: +3. In your repository, add the following lines to your Static CMS `config.yml` file: ```yaml backend: @@ -34,8 +34,8 @@ backend: With GitLab's PKCE authorization, users can authenticate with GitLab directly from the client. To do this: -1. Follow the [GitLab docs](https://docs.gitlab.com/ee/integration/oauth_provider.html#adding-an-application-through-the-profile) to add your Simple CMS instance as an OAuth application and uncheck the **Confidential** checkbox. For the **Redirect URI**, enter the address where you access Simple CMS, for example, `https://www.mysite.com/admin/`. For scope, select `api`. -2. GitLab gives you an **Application ID**. Copy this ID and enter it in your Simple CMS `config.yml` file, along with the following settings: +1. Follow the [GitLab docs](https://docs.gitlab.com/ee/integration/oauth_provider.html#adding-an-application-through-the-profile) to add your Static CMS instance as an OAuth application and uncheck the **Confidential** checkbox. For the **Redirect URI**, enter the address where you access Static CMS, for example, `https://www.mysite.com/admin/`. For scope, select `api`. +2. GitLab gives you an **Application ID**. Copy this ID and enter it in your Static CMS `config.yml` file, along with the following settings: ```yaml backend: @@ -64,8 +64,8 @@ With GitLab's PKCE authorization, users can authenticate with GitLab directly fr With GitLab's Implicit Grant, users can authenticate with GitLab directly from the client. To do this: -1. Follow the [GitLab docs](https://docs.gitlab.com/ee/integration/oauth_provider.html#adding-an-application-through-the-profile) to add your Simple CMS instance as an OAuth application and uncheck the **Confidential** checkbox. For the **Redirect URI**, enter the address where you access Simple CMS, for example, `https://www.mysite.com/admin/`. For scope, select `api`. -2. GitLab gives you an **Application ID**. Copy this ID and enter it in your Simple CMS `config.yml` file, along with the following settings: +1. Follow the [GitLab docs](https://docs.gitlab.com/ee/integration/oauth_provider.html#adding-an-application-through-the-profile) to add your Static CMS instance as an OAuth application and uncheck the **Confidential** checkbox. For the **Redirect URI**, enter the address where you access Static CMS, for example, `https://www.mysite.com/admin/`. For scope, select `api`. +2. GitLab gives you an **Application ID**. Copy this ID and enter it in your Static CMS `config.yml` file, along with the following settings: ```yaml backend: diff --git a/website/content/docs/gridsome.md b/website/content/docs/gridsome.md index 07e5eba1..887083c0 100644 --- a/website/content/docs/gridsome.md +++ b/website/content/docs/gridsome.md @@ -3,7 +3,7 @@ group: Guides weight: 70 title: Gridsome --- -This guide will help you get started using Simple CMS and Gridsome. +This guide will help you get started using Static CMS and Gridsome. ## How to install Gridsome ### 1. Install Gridsome CLI tool @@ -29,15 +29,15 @@ cd gridsome-netlify-blog gridsome develop ``` -### Install Simple CMS the required dependencies to your project +### Install Static CMS the required dependencies to your project ```bash # Using Yarn -yarn add @simplecms/simple-cms-core gridsome-plugin-netlify-cms @gridsome/source-filesystem @gridsome/transformer-remark +yarn add @staticcms/core gridsome-plugin-netlify-cms @gridsome/source-filesystem @gridsome/transformer-remark # Using NPM -npm add @simplecms/simple-cms-core gridsome-plugin-netlify-cms @gridsome/source-filesystem @gridsome/transformer-remark +npm add @staticcms/core gridsome-plugin-netlify-cms @gridsome/source-filesystem @gridsome/transformer-remark ``` Now that the plugins are installed, it's time to setup the configuration. Open the `gridsome.config.js` file and update its content to: @@ -73,7 +73,7 @@ module.exports = { Please read [gridsome-plugin-netlify-cms](https://gridsome.org/plugins/gridsome-plugin-netlify-cms), [transformer-remark](https://gridsome.org/plugins/@gridsome/transformer-remark) for more information. -## Simple CMS setup +## Static CMS setup 1. Create an `admin` directory inside the `src` 2. Create an `uploads` directory inside the root of your project @@ -87,7 +87,7 @@ Your `index.html` should look like this: - Simple CMS + Static CMS @@ -98,7 +98,7 @@ Your `index.html` should look like this: Your `index.js` should look like this: ```js -import CMS from "@simplecms/simple-cms-core" +import CMS from "@staticcms/core" ``` Your `config.yml` for GitHub should look like this: diff --git a/website/content/docs/hugo.md b/website/content/docs/hugo.md index b419df01..74b29727 100644 --- a/website/content/docs/hugo.md +++ b/website/content/docs/hugo.md @@ -5,7 +5,7 @@ weight: 20 --- ## Introduction -This guide will walk you through how to integrate Simple CMS with Hugo. This is a good place to start if you want to learn from the ground up how these two tools work together. If you want to get up-and-running quicker, you can use one of the pre-existing and amazing [starter templates](/docs/start-with-a-template/)! +This guide will walk you through how to integrate Static CMS with Hugo. This is a good place to start if you want to learn from the ground up how these two tools work together. If you want to get up-and-running quicker, you can use one of the pre-existing and amazing [starter templates](/docs/start-with-a-template/)! ## Getting started with Hugo @@ -56,13 +56,13 @@ You'll also add some files to the `content/` and `data/` directories to make sur touch content/.keep data/.keep ``` -This is as basic as you can get with a Hugo project. There's just enough here now for us to install Simple CMS. +This is as basic as you can get with a Hugo project. There's just enough here now for us to install Static CMS. -## Getting Started With Simple CMS +## Getting Started With Static CMS -### Add the Simple CMS files to Hugo +### Add the Static CMS files to Hugo -In Hugo, static files that don't need to be processed by the build commands live in the `static/` directory. You'll install the Simple CMS admin and config files there. Create a directory `admin/` and within it, create two files `index.html` and `config.yml`. In the `index.html`, add the following content: +In Hugo, static files that don't need to be processed by the build commands live in the `static/` directory. You'll install the Static CMS admin and config files there. Create a directory `admin/` and within it, create two files `index.html` and `config.yml`. In the `index.html`, add the following content: ```html @@ -75,8 +75,8 @@ In Hugo, static files that don't need to be processed by the build commands live - - + + ``` @@ -147,9 +147,9 @@ Back in your [Netlify dashboard](https://app.netlify.com/): Once you've reached this point, you should be able to access the CMS in your browser at `http://localhost:1313/admin`. You'll be prompted to add the URL of your Netlify site. Once you've added that URL, you can log in with an Identity account or with one of the External Providers you enabled in step 3 above. For the sake of this tutorial, you can create a blog post in the CMS, and publish it! Once you `git pull` in your project, the blog post will show up in the project at `content/blog/.md`. -And that's it! From this point on, it's just a matter of following [the Hugo documentation](https://gohugo.io/templates/) for outputting the content from your `content/` directory into templates! For more information on configuring Simple CMS, feel free to check out the [Simple CMS configuration options documentation](/docs/configuration-options/). +And that's it! From this point on, it's just a matter of following [the Hugo documentation](https://gohugo.io/templates/) for outputting the content from your `content/` directory into templates! For more information on configuring Static CMS, feel free to check out the [Static CMS configuration options documentation](/docs/configuration-options/). -## Using Simple CMS content in Hugo +## Using Static CMS content in Hugo ### Creating a list of posts @@ -198,13 +198,13 @@ Create a file `layouts/blog/single.html`, and put the following content in there ``` -You can see this basic template includes all the fields you've specified in your Simple CMS `config.yml` file. You can access any custom front-matter fields with `.Params.`! +You can see this basic template includes all the fields you've specified in your Static CMS `config.yml` file. You can access any custom front-matter fields with `.Params.`! ### Using Hugo shortcodes in the Markdown Editor Using `registerEditorComponent` we can register a block level component for the Markdown editor. You can use it to add Hugo's inbuilt shortcodes like `gist`,`youtube` and others as block components to the markdown editor. -You can refer to [registering editor components](https://www.simplecms.github.io/simple-cms/docs/custom-widgets/#registereditorcomponent) for a getting started guide or for creating your own editor components. +You can refer to [registering editor components](https://www.staticjscms.github.io/static-cms/docs/custom-widgets/#registereditorcomponent) for a getting started guide or for creating your own editor components. **Example** diff --git a/website/content/docs/intro.md b/website/content/docs/intro.md index 5593eead..5ff2431f 100644 --- a/website/content/docs/intro.md +++ b/website/content/docs/intro.md @@ -4,9 +4,9 @@ group: Intro weight: 1 --- -Simple CMS is an open source content management system for your Git workflow that enables you to provide editors with a friendly UI and intuitive workflows. You can use it with any static site generator to create faster, more flexible web projects. Content is stored in your Git repository alongside your code for easier versioning, multi-channel publishing, and the option to handle content updates directly in Git. +Static CMS is an open source content management system for your Git workflow that enables you to provide editors with a friendly UI and intuitive workflows. You can use it with any static site generator to create faster, more flexible web projects. Content is stored in your Git repository alongside your code for easier versioning, multi-channel publishing, and the option to handle content updates directly in Git. -At its core, Simple CMS is an open-source React app that acts as a wrapper for the Git workflow, using the GitHub, GitLab, or Bitbucket API. This provides many advantages, including: +At its core, Static CMS is an open-source React app that acts as a wrapper for the Git workflow, using the GitHub, GitLab, or Bitbucket API. This provides many advantages, including: * **Fast, web-based UI:** With rich-text editing, real-time preview, and drag-and-drop media uploads. * **Platform agnostic:** Works with most static site generators. @@ -18,7 +18,7 @@ At its core, Simple CMS is an open-source React app that acts as a wrapper for t ### Find out more - Get a feel for the UI in the [demo site](https://cms-demo.netlify.com). (No login required. Click the login button to go straight to the CMS editor UI.) -- [Start with a template](../start-with-a-template/) to make a Simple CMS-enabled site of your own. +- [Start with a template](../start-with-a-template/) to make a Static CMS-enabled site of your own. - Configure your existing site by following a [tutorial](../add-to-your-site/) or checking [configuration options](../configuration-options). -- Ask questions and share ideas in the Simple CMS [community chat](https://simplecms.github.io/simple-cms/chat). +- Ask questions and share ideas in the Static CMS [community chat](https://staticjscms.github.io/static-cms/chat). - Get involved in new developments and become a [contributor](../contributor-guide/). diff --git a/website/content/docs/jekyll.md b/website/content/docs/jekyll.md index 856daee8..73c9cf1f 100644 --- a/website/content/docs/jekyll.md +++ b/website/content/docs/jekyll.md @@ -5,19 +5,19 @@ title: Jekyll --- ## Introduction -This section will help you integrate Simple CMS with a new or existing Jekyll project. +This section will help you integrate Static CMS with a new or existing Jekyll project. [Jekyll](https://jekyllrb.com/) is a blog-aware static site generator built with Ruby. [Github Pages](https://pages.github.com/) are powered by Jekyll, making it a popular choice for developer blogs and project pages. -If you're starting a new project, the fastest route to publishing on a Jekyll website with Simple CMS is to [deploy a template on Netlify](https://templates.netlify.com/). +If you're starting a new project, the fastest route to publishing on a Jekyll website with Static CMS is to [deploy a template on Netlify](https://templates.netlify.com/). ## Setup This guide will use the blog you get if you follow the [really excellent official Jekyll step by step tutorial](https://jekyllrb.com/docs/step-by-step/01-setup/) as a starting point. If you're new to Jekyll - I recommended you start by following the tutorial so you know your way around your new blog. Otherwise [you can clone this repo](https://github.com/adamwatters/jekyll-tutorial-with-netlify-cms/tree/without-cms) and checkout the `without-cms` branch. -![Jekyll tutorial blog screenshot](https://www.simplecms.github.io/simple-cms/img/screenshot-jekyll-tutorial-blog.png?raw=true) +![Jekyll tutorial blog screenshot](https://www.staticjscms.github.io/static-cms/img/screenshot-jekyll-tutorial-blog.png?raw=true) -## Add Simple CMS +## Add Static CMS ### Add admin/index.html @@ -35,8 +35,8 @@ Create a file `admin/index.html` in the root of your repo - it should look like - - + + ``` @@ -62,15 +62,15 @@ collections: ### Enable authentication for CMS users -Simple CMS stores content in your online Git repository. Therefore, to make content changes, users need to authenticate with the corresponding Git provider to prove that they have read and write access to that content. +Static CMS stores content in your online Git repository. Therefore, to make content changes, users need to authenticate with the corresponding Git provider to prove that they have read and write access to that content. -Follow the directions in the Introduction section to [enable Netlify Identity and Git Gateway services](https://www.simplecms.github.io/simple-cms/docs/add-to-your-site/#enable-identity-and-git-gateway) for the backend, then [add the Identity widget](https://www.simplecms.github.io/simple-cms/docs/add-to-your-site/#add-the-netlify-identity-widget) to render a login portal on the frontend. +Follow the directions in the Introduction section to [enable Netlify Identity and Git Gateway services](https://www.staticjscms.github.io/static-cms/docs/add-to-your-site/#enable-identity-and-git-gateway) for the backend, then [add the Identity widget](https://www.staticjscms.github.io/static-cms/docs/add-to-your-site/#add-the-netlify-identity-widget) to render a login portal on the frontend. ## CMS Configuration ### Blog Collection -We'll start by updating the `blog` collection. Blogging is baked into Jekyll, and the `_posts/` directory uses [some special conventions](https://jekyllrb.com/docs/posts/) we'll need to keep in mind as we configure Simple CMS. Copy and paste the following into your `config.yml`. +We'll start by updating the `blog` collection. Blogging is baked into Jekyll, and the `_posts/` directory uses [some special conventions](https://jekyllrb.com/docs/posts/) we'll need to keep in mind as we configure Static CMS. Copy and paste the following into your `config.yml`. ```yaml collections: @@ -93,15 +93,15 @@ A few things to note. * We set the `slug` to `'{{year}}-{{month}}-{{day}}-{{slug}}'` because [Jekyll requires this format for blog posts](https://jekyllrb.com/docs/posts/#creating-posts). `year`, `month`, and `day` will be extracted from the `date` field, and `slug` will be generated from the `title` field. * We added `editor` configuration with a field `preview: false`. This will eliminate the preview pane. Because Jekyll uses Liquid templates, there currently isn't a good way to provide a preview of pages as you update the content. * The `layout` field default is set to `post` so Jekyll knows to use `_layouts/post.html` when it renders a post. This field is hidden because we want all posts to use the same layout. -* The `date` and `title` field will be used by the `slug` - as noted above, Jekyll relies on the filename to determine a post's publish date, but Simple CMS does not pull date information from the filename and requires a frontmatter `date` field. **Note** Changing the `date` or `title` fields in Simple CMS will not update the filename. This has a few implications: +* The `date` and `title` field will be used by the `slug` - as noted above, Jekyll relies on the filename to determine a post's publish date, but Static CMS does not pull date information from the filename and requires a frontmatter `date` field. **Note** Changing the `date` or `title` fields in Static CMS will not update the filename. This has a few implications: - * If you change the `date` or `title` fields in Simple CMS, Jekyll won't notice + * If you change the `date` or `title` fields in Static CMS, Jekyll won't notice * You don't necessarily need to change the `date` and `title` fields for existing posts, but if you don't the filenames and frontmatter will disagree in a way that might be confusing * If you want to avoid these issues, use a regular Jekyll collection instead of the special `_posts` directory ### Author Collection -In addition to `_posts`, the Jekyll tutorial blog includes a collection of authors in the `_authors` directory. Before we can configure Simple CMS to work with the `authors` collection, we'll need to make a couple tweaks to our Jekyll blog. Here's the front matter for one of the authors. +In addition to `_posts`, the Jekyll tutorial blog includes a collection of authors in the `_authors` directory. Before we can configure Static CMS to work with the `authors` collection, we'll need to make a couple tweaks to our Jekyll blog. Here's the front matter for one of the authors. ```yaml short_name: jill @@ -109,7 +109,7 @@ name: Jill Smith position: Chief Editor ``` -`name` has special meaning as a unique identifier in Simple CMS, but as set up now our Jekyll blog is using `short_name` as the unique identifier for authors. For each author, update the frontmatter like so. +`name` has special meaning as a unique identifier in Static CMS, but as set up now our Jekyll blog is using `short_name` as the unique identifier for authors. For each author, update the frontmatter like so. ```yaml name: jill @@ -190,7 +190,7 @@ Next, copy and paste the following into the collections array in `config.yml` be - { label: 'Body', name: 'body', widget: 'markdown' } ``` -Now that we have the `authors` collection configured, we can add an `author` field to the `blog` collection. We'll use the [relation widget](https://www.simplecms.github.io/simple-cms/docs/widgets/#relation) to define the relationship between blog posts and authors. +Now that we have the `authors` collection configured, we can add an `author` field to the `blog` collection. We'll use the [relation widget](https://www.staticjscms.github.io/static-cms/docs/widgets/#relation) to define the relationship between blog posts and authors. ```yaml # updated fields in blog collection configuration @@ -214,7 +214,7 @@ With that configuration added, you should be able to select the author for a pos ### About Page -Our Jekyll blog includes an About page. It would nice to be able to edit that page just like we can edit our blog and author pages. Simple CMS provides [file collections](https://www.simplecms.github.io/simple-cms/docs/collection-types/#file-collections) to solve this problem. +Our Jekyll blog includes an About page. It would nice to be able to edit that page just like we can edit our blog and author pages. Static CMS provides [file collections](https://www.staticjscms.github.io/static-cms/docs/collection-types/#file-collections) to solve this problem. Copy and paste the following into the collections array in `config.yml` @@ -235,7 +235,7 @@ Copy and paste the following into the collections array in `config.yml` ### Navigation -The last aspect of our Jekyll blog we might want to bring under the control of Simple CMS is our Navigation menu. Our Jekyll tutorial blog has a file `_data/navigation.yml` that defines the links rendered by `_includes/navigation.html`. It looks like this. +The last aspect of our Jekyll blog we might want to bring under the control of Static CMS is our Navigation menu. Our Jekyll tutorial blog has a file `_data/navigation.yml` that defines the links rendered by `_includes/navigation.html`. It looks like this. ```yaml # _data/navigation.yml @@ -249,7 +249,7 @@ The last aspect of our Jekyll blog we might want to bring under the control of S link: /staff.html ``` -To make this file editable with Simple CMS, we'll need to make one minor tweak. The issue is this file contains a yaml array at the top level, but Simple CMS is designed to work with yaml objects. Update `_data/navigation.yml` so it looks like so. +To make this file editable with Static CMS, we'll need to make one minor tweak. The issue is this file contains a yaml array at the top level, but Static CMS is designed to work with yaml objects. Update `_data/navigation.yml` so it looks like so. ```yaml # _data/navigation.yml diff --git a/website/content/docs/middleman.md b/website/content/docs/middleman.md index 959ef9ae..8482e152 100644 --- a/website/content/docs/middleman.md +++ b/website/content/docs/middleman.md @@ -3,7 +3,7 @@ title: Middleman group: Guides weight: 60 --- -This guide will help you get started using Simple CMS and Middleman. +This guide will help you get started using Static CMS and Middleman. ## Installation To get up and running with Middleman, you need both the Ruby language runtime and RubyGems installed on your computer. Check out the [Middleman installation docs](https://middlemanapp.com/basics/install/) for more details. If you already have your environment set up, use the following command to install Middleman: @@ -77,7 +77,7 @@ Time to load our articles in `index.html.erb`. ``` ### Add an article layout -In the last step before we add Simple CMS, we add a layout for the article page. Create a new layout `source/layouts/blog-layout.html.erb`. For now we will get the title and the content: +In the last step before we add Static CMS, we add a layout for the article page. Create a new layout `source/layouts/blog-layout.html.erb`. For now we will get the title and the content: ```ruby

    <%= current_page.data.title %> @@ -86,9 +86,9 @@ In the last step before we add Simple CMS, we add a layout for the article page. <%= yield %> ``` -Now that we have a functioning blog, let's get started with Simple CMS! +Now that we have a functioning blog, let's get started with Static CMS! -## Add Simple CMS to your site +## Add Static CMS to your site Create two files in a new folder called `admin`, `index.html` and `config.yml`. Also add an `upload` folder in the images directory that will function as our `media_folder`. ```bash @@ -102,7 +102,7 @@ Create two files in a new folder called `admin`, `index.html` and `config.yml`. ``` -In the newly created `index.html` we add scripts for Simple CMS and the Netlify Identity Widget: +In the newly created `index.html` we add scripts for Static CMS and the Netlify Identity Widget: ```html @@ -111,11 +111,11 @@ In the newly created `index.html` we add scripts for Simple CMS and the Netlify - Simple CMS + Static CMS - + diff --git a/website/content/docs/netlify-large-media.md b/website/content/docs/netlify-large-media.md index a27647da..ed6dcc25 100644 --- a/website/content/docs/netlify-large-media.md +++ b/website/content/docs/netlify-large-media.md @@ -6,17 +6,17 @@ weight: 20 [Netlify Large Media](https://www.netlify.com/features/large-media/) is a [Git LFS](https://git-lfs.github.com/) implementation for repositories connected to Netlify sites. This means that you can use Git to work with large asset files like images, audio, and video, without bloating your repository. It does this by replacing the asset files in your repository with text pointer files, then uploading the assets to the Netlify Large Media storage service. -If you have a Netlify site with Large Media enabled, Simple CMS (version 2.6.0 and above) will handle Large Media asset files seamlessly, in the same way as files stored directly in the repository. +If you have a Netlify site with Large Media enabled, Static CMS (version 2.6.0 and above) will handle Large Media asset files seamlessly, in the same way as files stored directly in the repository. ## Requirements -To use Netlify Large Media with Simple CMS, you will need to do the following: +To use Netlify Large Media with Static CMS, you will need to do the following: -- [Upgrade Simple CMS](/docs/update-the-cms-version/) to version 2.6.0 or above. -- Configure Simple CMS to use the [Git Gateway backend with Netlify Identity](/docs/git-gateway-backend/#git-gateway-with-netlify-identity). +- [Upgrade Static CMS](/docs/update-the-cms-version/) to version 2.6.0 or above. +- Configure Static CMS to use the [Git Gateway backend with Netlify Identity](/docs/git-gateway-backend/#git-gateway-with-netlify-identity). - Configure the Netlify site and connected repository to use Large Media, following the [Large Media docs on Netlify](https://www.netlify.com/docs/large-media/). -When these are complete, you can use Simple CMS as normal, and the configured asset files will automatically be handled by Netlify Large Media. +When these are complete, you can use Static CMS as normal, and the configured asset files will automatically be handled by Netlify Large Media. ## Image transformations @@ -26,7 +26,7 @@ You can learn more about this feature in [Netlify's image transformation docs](h ### Transformation control for media gallery thumbnails -In repositories enabled with Netlify Large Media, Simple CMS will use the image transformation query parameters to load thumbnail-sized images for the media gallery view. This makes images in the media gallery load significantly faster. +In repositories enabled with Netlify Large Media, Static CMS will use the image transformation query parameters to load thumbnail-sized images for the media gallery view. This makes images in the media gallery load significantly faster. **Note:** When using this option all tracked file types have to be imported into Large Media. For example if you track `*.jpg` but still have jpg-files that are not imported into Large Media the backend will throw an error. Check the [netlify docs](https://docs.netlify.com/large-media/setup/#migrate-files-from-git-history) on how to add previously committed files to Large Media. diff --git a/website/content/docs/nextjs.md b/website/content/docs/nextjs.md index 6c9205b2..14fdfb40 100644 --- a/website/content/docs/nextjs.md +++ b/website/content/docs/nextjs.md @@ -3,7 +3,7 @@ group: Guides weight: 40 title: NextJS --- -This guide will help you get started using Simple CMS with NextJS. +This guide will help you get started using Static CMS with NextJS. ## Creating a new project @@ -69,7 +69,7 @@ cats: --- Welcome to my awesome page about cats of the internet. -This page is built with NextJS, and content is managed in Simple CMS +This page is built with NextJS, and content is managed in Static CMS ``` Next, we need to tell webpack how to load Markdown files. Create a new `next.config.js` file at the root of your project with the following content: @@ -128,9 +128,9 @@ Great! We now have a page that displays content from our Markdown file. Go ahead npm run dev ``` -## Adding Simple CMS +## Adding Static CMS -There are many different ways to add Simple CMS to your project. The easiest is probably just to embed it from a CDN, and that's exactly what we're gonna do. To avoid making this guide too complicated, we're just going to add Netlify into a subfolder inside the `/public` directory (which is just served as static files by Next): +There are many different ways to add Static CMS to your project. The easiest is probably just to embed it from a CDN, and that's exactly what we're gonna do. To avoid making this guide too complicated, we're just going to add Netlify into a subfolder inside the `/public` directory (which is just served as static files by Next): ```bash # Create and navigate into public/admin folder @@ -142,7 +142,7 @@ touch index.html touch config.yml ``` -Paste HTML for Simple CMS into your `public/admin/index.html` file (check out the [Add Netlify To Your Site](https://www.simplecms.github.io/simple-cms/docs/add-to-your-site/) section for more information) +Paste HTML for Static CMS into your `public/admin/index.html` file (check out the [Add Netlify To Your Site](https://www.staticjscms.github.io/static-cms/docs/add-to-your-site/) section for more information) ```html @@ -154,8 +154,8 @@ Paste HTML for Simple CMS into your `public/admin/index.html` file (check out th - - + + ``` @@ -189,9 +189,9 @@ collections: - { label: "Description", name: "description", widget: "text"} ``` -Awesome! Simple CMS should now be available at `localhost:3000/admin/index.html`. Unfortunately we can't edit our content just yet. First we need to move our code into a git repository, and create a new Netlify site. +Awesome! Static CMS should now be available at `localhost:3000/admin/index.html`. Unfortunately we can't edit our content just yet. First we need to move our code into a git repository, and create a new Netlify site. -**Tip:** If you want to test changes made to your config.yml file locally, swap out "git-gateway" with "test-repo" and navigate to `localhost:3000/admin/index.html` to view Simple CMS locally (you can't make changes or read actual content from Git this way, but it's great to verify how things will look). +**Tip:** If you want to test changes made to your config.yml file locally, swap out "git-gateway" with "test-repo" and navigate to `localhost:3000/admin/index.html` to view Static CMS locally (you can't make changes or read actual content from Git this way, but it's great to verify how things will look). ## Publishing to GitHub and Netlify @@ -229,6 +229,6 @@ Netlify's Identity and Git Gateway services allow you to manage CMS admin users Great job - you did it! Open your new page via the new Netlify URL, and navigate to `/admin`. If you did everything correct in the previous step, you should now be able to sign up for an account, and log in. -**Tip:** Signing up with an external provider is the easiest. If you want to sign up by email, you'll have to set up a redirect in your index.js page (which we won't be covering in this guide). For more information, have a look at the [Add To Your Site](https://www.simplecms.github.io/simple-cms/docs/add-to-your-site) section. +**Tip:** Signing up with an external provider is the easiest. If you want to sign up by email, you'll have to set up a redirect in your index.js page (which we won't be covering in this guide). For more information, have a look at the [Add To Your Site](https://www.staticjscms.github.io/static-cms/docs/add-to-your-site) section. Congratulations - you can finally manage your new list of cats! diff --git a/website/content/docs/nuxt.md b/website/content/docs/nuxt.md index bf67f339..a03fb13f 100644 --- a/website/content/docs/nuxt.md +++ b/website/content/docs/nuxt.md @@ -3,7 +3,7 @@ group: Guides weight: 50 title: Nuxt --- -This guide will walk you through how to integrate Simple CMS with Nuxt. +This guide will walk you through how to integrate Static CMS with Nuxt. ## Starting With `create-nuxt-app` @@ -15,11 +15,11 @@ cd npm run dev ``` -## Setting Up Simple CMS +## Setting Up Static CMS -### Add the Simple CMS files to Nuxt +### Add the Static CMS files to Nuxt -In the `static/` directory, create a new directory `admin/`. Inside that directory you'll create two files, your `index.html` and a `config.yml`. Per the [Simple CMS documentation](/docs/add-to-your-site/), we'll set the content of `static/admin/index.html` to the following: +In the `static/` directory, create a new directory `admin/`. Inside that directory you'll create two files, your `index.html` and a `config.yml`. Per the [Static CMS documentation](/docs/add-to-your-site/), we'll set the content of `static/admin/index.html` to the following: ```html @@ -32,8 +32,8 @@ In the `static/` directory, create a new directory `admin/`. Inside that directo - - + + ``` @@ -135,7 +135,7 @@ Once you've reached this point, you should be able to access the CMS in your bro ## Using nuxt/content -Simple CMS and [nuxt/content](https://content.nuxtjs.org) module click together and complement each other to give you best authoring experience and developer experience respectively. +Static CMS and [nuxt/content](https://content.nuxtjs.org) module click together and complement each other to give you best authoring experience and developer experience respectively. Adding nuxt/content dependency diff --git a/website/content/docs/releases.md b/website/content/docs/releases.md index 858c3d99..7cdfd8d0 100644 --- a/website/content/docs/releases.md +++ b/website/content/docs/releases.md @@ -8,7 +8,7 @@ weight: 4 ## Update the CMS Version -The update procedure for your CMS depends upon the method you used to install Simple CMS. +The update procedure for your CMS depends upon the method you used to install Static CMS. ### Package Manager diff --git a/website/content/docs/site-generator-overview.md b/website/content/docs/site-generator-overview.md index 260317f3..8365d23e 100644 --- a/website/content/docs/site-generator-overview.md +++ b/website/content/docs/site-generator-overview.md @@ -4,31 +4,31 @@ group: Guides weight: 1 --- -The process for adding Simple CMS to a static site can be divided into four main steps: +The process for adding Static CMS to a static site can be divided into four main steps: -### Install Simple CMS +### Install Static CMS This is a single page app available at the `/admin` route of your website. Check out the [general overview](/docs/intro/) to see what the installation process entails. ### Set up a backend -This serves two purpose: Secure access to your website's Simple CMS and allows it to read and update content files in your repo. More information about configuring the backend can be found [here](/docs/backends-overview/). +This serves two purpose: Secure access to your website's Static CMS and allows it to read and update content files in your repo. More information about configuring the backend can be found [here](/docs/backends-overview/). -### Configure Simple CMS using a configuration file +### Configure Static CMS using a configuration file For starters, you can get by with a basic configuration that includes required information like Git provider, branch and folders to save files to. Once you've gotten the hang of it, you can use the file to build whatever collections and content modeling you want. Check out the [this section](/docs/configuration-options/#configuration-file) for full details about all available configuration options. -### Render the content provided by Simple CMS as web pages +### Render the content provided by Static CMS as web pages -Simple CMS manages your content, and provides admin features, but it doesn't deliver content. It only makes your content available through an API. +Static CMS manages your content, and provides admin features, but it doesn't deliver content. It only makes your content available through an API. It is up to developers to determine how to build the raw content into something useful and delightful on the frontend. -To learn how to query raw content managed by Simple CMS and reformat them for delivery to end users, please refer the dedicated section for your site generator in the Table of Content. +To learn how to query raw content managed by Static CMS and reformat them for delivery to end users, please refer the dedicated section for your site generator in the Table of Content. ___ ### Local development -If you are experimenting with Simple CMS or testing things out, you can connect it to a local Git repository instead of a live one. Learn how to do it [here](/docs/beta-features/#working-with-a-local-git-repository). +If you are experimenting with Static CMS or testing things out, you can connect it to a local Git repository instead of a live one. Learn how to do it [here](/docs/beta-features/#working-with-a-local-git-repository). diff --git a/website/content/docs/start-with-a-template.md b/website/content/docs/start-with-a-template.md index 12c4d718..0a5f5eb3 100644 --- a/website/content/docs/start-with-a-template.md +++ b/website/content/docs/start-with-a-template.md @@ -3,7 +3,7 @@ group: Intro weight: 2 title: Start with a Template --- -You can add Simple CMS [to an existing site](/docs/add-to-your-site/), but the quickest way to get started is with a template. Found below, our featured templates deploy a bare-bones site and Simple CMS to Netlify, giving you a fully working CMS-enabled site with just a few clicks. +You can add Static CMS [to an existing site](/docs/add-to-your-site/), but the quickest way to get started is with a template. Found below, our featured templates deploy a bare-bones site and Static CMS to Netlify, giving you a fully working CMS-enabled site with just a few clicks.
    @@ -66,20 +66,20 @@ You can add Simple CMS [to an existing site](/docs/add-to-your-site/), but the q After clicking one of those buttons, authenticate with GitHub or GitLab and choose a repository name. Netlify then automatically creates a clone of the repository in your GitHub or GitLab account. Next, it builds and deploys the new site on Netlify, bringing you to the site dashboard after completing the build. -**Note for Bitbucket users:** Simple CMS supports Bitbucket repositories, but Bitbucket's permissions won't work with the Deploy to Netlify buttons above. You can still set up a repository manually, or follow the [tutorial](/docs/add-to-your-site) for adding Simple CMS to an existing site. +**Note for Bitbucket users:** Static CMS supports Bitbucket repositories, but Bitbucket's permissions won't work with the Deploy to Netlify buttons above. You can still set up a repository manually, or follow the [tutorial](/docs/add-to-your-site) for adding Static CMS to an existing site. -## Access Simple CMS on your new site +## Access Static CMS on your new site 1. The template deploy process sends you an invitation to your new site, sent from `no-reply@netlify.com`. - ![Sample email subject line: You've been invited to join radiologist-amanda-53841.netlify.com](https://www.simplecms.github.io/simple-cms/img/email-subject.png?raw=true) + ![Sample email subject line: You've been invited to join radiologist-amanda-53841.netlify.com](https://www.staticjscms.github.io/static-cms/img/email-subject.png?raw=true) 2. Wait for the deployment to complete, then click the link to accept the invite. Your site will open with a prompt to create a password. - !["Complete your signup" modal on the Kaldi coffee site](https://www.simplecms.github.io/simple-cms/img/create-password.png?raw=true) + !["Complete your signup" modal on the Kaldi coffee site](https://www.staticjscms.github.io/static-cms/img/create-password.png?raw=true) 3. Enter a password, sign in, and you’ll go to the CMS. (For future visits, you can go straight to `/admin/`.) Try adding and editing posts, or changing the content of the Products page. When you save, the changes are pushed immediately to your Git repository, triggering a build on Netlify, and updating the content on your site. Check out the configuration code by visiting your site repo. ## More paths to explore -* To see how to integrate Simple CMS into an existing project, go to [Add to your site](/docs/add-to-your-site/). -* Check out other sites using Simple CMS (or share your own!) on the [Examples](/docs/examples/) page. +* To see how to integrate Static CMS into an existing project, go to [Add to your site](/docs/add-to-your-site/). +* Check out other sites using Static CMS (or share your own!) on the [Examples](/docs/examples/) page. * If you’d like to add more CMS editors or change how they log in to your site, read up on [Netlify Identity service](https://www.netlify.com/docs/identity). \ No newline at end of file diff --git a/website/content/docs/test-backend.md b/website/content/docs/test-backend.md index 77f0e61c..3ab3c38e 100644 --- a/website/content/docs/test-backend.md +++ b/website/content/docs/test-backend.md @@ -4,11 +4,11 @@ group: Accounts weight: 50 --- -You can use the `test-repo` backend to try out Simple CMS without connecting to a Git repo. With this backend, you can write and publish content normally, but any changes will disappear when you reload the page. This backend powers the Simple CMS [demo site](https://cms-demo.netlify.com/). +You can use the `test-repo` backend to try out Static CMS without connecting to a Git repo. With this backend, you can write and publish content normally, but any changes will disappear when you reload the page. This backend powers the Static CMS [demo site](https://cms-demo.netlify.com/). **Note:** The `test-repo` backend can't access your local file system, nor does it connect to a Git repo, thus you won't see any existing files while using it. -To enable this backend, add the following lines to your Simple CMS `config.yml` file: +To enable this backend, add the following lines to your Static CMS `config.yml` file: ```yaml backend: diff --git a/website/content/docs/uploadcare.md b/website/content/docs/uploadcare.md index e0407398..03aab26f 100644 --- a/website/content/docs/uploadcare.md +++ b/website/content/docs/uploadcare.md @@ -5,17 +5,17 @@ weight: 30 --- Uploadcare is a sleek service that allows you to upload files without worrying about maintaining a growing collection — more of an asset store than a library. Just upload when you need to, and the files are hosted on their CDN. They provide image processing controls from simple cropping and rotation to filters and face detection, and a lot more. You can check out Uploadcare's full feature set on their [website](https://uploadcare.com/). -The Uploadcare media library integration for Simple CMS allows you to use Uploadcare as your media handler within the CMS itself. It's available by default as of our 2.1.0 release, and works in tandem with the existing file and image widgets, so using it only requires creating an Uploadcare account and updating your Simple CMS configuration. +The Uploadcare media library integration for Static CMS allows you to use Uploadcare as your media handler within the CMS itself. It's available by default as of our 2.1.0 release, and works in tandem with the existing file and image widgets, so using it only requires creating an Uploadcare account and updating your Static CMS configuration. -**Please make sure that Simple CMS is updated to 2.1.0 or greater before proceeding.** +**Please make sure that Static CMS is updated to 2.1.0 or greater before proceeding.** ## Creating an Uploadcare Account -You can [sign up](https://uploadcare.com/accounts/signup/) for a free Uploadcare account to get started. Once you've signed up, go to your dashboard, select a project, and then select "API keys" from the menu on the left. The public key on the API keys page will be needed in your Simple CMS configuration. For more info on getting your API key, visit their [walkthrough](https://uploadcare.com/docs/keys/). +You can [sign up](https://uploadcare.com/accounts/signup/) for a free Uploadcare account to get started. Once you've signed up, go to your dashboard, select a project, and then select "API keys" from the menu on the left. The public key on the API keys page will be needed in your Static CMS configuration. For more info on getting your API key, visit their [walkthrough](https://uploadcare.com/docs/keys/). -## Updating Simple CMS Configuration +## Updating Static CMS Configuration -The next and final step is updating your Simple CMS configuration file: +The next and final step is updating your Static CMS configuration file: 1. Add a `media_library` property at the same level as `media_folder`, with an object as it's value. 2. In the `media_library` object, add the name of the media player under `name`. @@ -30,15 +30,15 @@ media_library: publicKey: YOUR_UPLOADCARE_PUBLIC_KEY ``` -Once you've finished updating your Simple CMS configuration, the Uploadcare widget will appear when using the image or file widgets. +Once you've finished updating your Static CMS configuration, the Uploadcare widget will appear when using the image or file widgets. -**Note:** You'll need to [register the media libraries yourself](https://www.simplecms.github.io/simple-cms/blog/2019/07/netlify-cms-gatsby-plugin-4-0-0#using-media-libraries-with-netlify-cms-app). +**Note:** You'll need to [register the media libraries yourself](https://www.staticjscms.github.io/static-cms/blog/2019/07/netlify-cms-gatsby-plugin-4-0-0#using-media-libraries-with-netlify-cms-app). ## Configuring the Uploadcare Widget -The Uploadcare widget can be configured with settings that are outlined [in their docs](https://uploadcare.com/docs/file_uploads/widget/options/). The widget itself accepts configuration through global variables and data properties on HTML elements, but with Simple CMS you can pass configuration options directly through your `config.yml`. +The Uploadcare widget can be configured with settings that are outlined [in their docs](https://uploadcare.com/docs/file_uploads/widget/options/). The widget itself accepts configuration through global variables and data properties on HTML elements, but with Static CMS you can pass configuration options directly through your `config.yml`. -**Note:** all default values described in Uploadcare's documentation also apply in the Simple CMS integration, except for `previewStep`, which is set to `true`. This was done because the preview step provides helpful information like upload status, and provides access to image editing controls. This option can be disabled through the configuration options below. +**Note:** all default values described in Uploadcare's documentation also apply in the Static CMS integration, except for `previewStep`, which is set to `true`. This was done because the preview step provides helpful information like upload status, and provides access to image editing controls. This option can be disabled through the configuration options below. ### Global configuration diff --git a/website/content/docs/widgets.md b/website/content/docs/widgets.md index 9510eaa8..73810556 100644 --- a/website/content/docs/widgets.md +++ b/website/content/docs/widgets.md @@ -4,11 +4,11 @@ group: Fields weight: 10 --- -Widgets define the data type and interface for entry fields. Simple CMS comes with several built-in widgets. Click the widget names in the sidebar to jump to specific widget details. We’re always adding new widgets, and you can also [create your own](../custom-widgets)! +Widgets define the data type and interface for entry fields. Static CMS comes with several built-in widgets. Click the widget names in the sidebar to jump to specific widget details. We’re always adding new widgets, and you can also [create your own](../custom-widgets)! -Widgets are specified as collection fields in the Simple CMS `config.yml` file. Note that [YAML syntax](https://en.wikipedia.org/wiki/YAML#Basic_components) allows lists and objects to be written in block or inline style, and the code samples below include a mix of both. +Widgets are specified as collection fields in the Static CMS `config.yml` file. Note that [YAML syntax](https://en.wikipedia.org/wiki/YAML#Basic_components) allows lists and objects to be written in block or inline style, and the code samples below include a mix of both. -To see working examples of all of the built-in widgets, try making a 'Kitchen Sink' collection item on the [CMS demo site](https://cms-demo.netlify.com). (No login required: click the login button and the CMS will open.) You can refer to the demo [configuration code](https://github.com/SimpleCMS/simple-cms/blob/master/dev-test/config.yml) to see how each field was configured. +To see working examples of all of the built-in widgets, try making a 'Kitchen Sink' collection item on the [CMS demo site](https://cms-demo.netlify.com). (No login required: click the login button and the CMS will open.) You can refer to the demo [configuration code](https://github.com/StaticJsCMS/static-cms/blob/master/dev-test/config.yml) to see how each field was configured. ## Common widget options diff --git a/website/content/docs/widgets/markdown.md b/website/content/docs/widgets/markdown.md index 9259317f..d48f4ce4 100644 --- a/website/content/docs/widgets/markdown.md +++ b/website/content/docs/widgets/markdown.md @@ -14,7 +14,7 @@ The markdown widget provides a full fledged text editor allowing users to format * `default`: accepts markdown content * `minimal`: accepts a boolean value, `false` by default. Sets the widget height to minimum possible. * `buttons`: an array of strings representing the formatting buttons to display (all shown by default). Buttons include: `bold`, `italic`, `code`, `link`, `heading-one`, `heading-two`, `heading-three`, `heading-four`, `heading-five`, `heading-six`, `quote`, `bulleted-list`, and `numbered-list`. - * `editor_components`: an array of strings representing the names of editor components to display (all shown by default). Simple CMS includes `image` and `code-block` editor components by default, and custom components may be [created and registered](/docs/custom-widgets/#registereditorcomponent). + * `editor_components`: an array of strings representing the names of editor components to display (all shown by default). Static CMS includes `image` and `code-block` editor components by default, and custom components may be [created and registered](/docs/custom-widgets/#registereditorcomponent). * `modes`: an array of strings representing the names of allowed editor modes. Possible modes are `raw` and `rich_text`. A toggle button appears in the toolbar when more than one mode is available. * `sanitize_preview`: accepts a boolean value, `false` by default. Sanitizes markdown preview to prevent XSS attacks - might alter the preview content. * **Example:** diff --git a/website/content/docs/writing-style-guide.md b/website/content/docs/writing-style-guide.md index 36d5fbe1..646c0a64 100644 --- a/website/content/docs/writing-style-guide.md +++ b/website/content/docs/writing-style-guide.md @@ -4,7 +4,7 @@ weight: 30 group: Contributing --- -# Simple CMS Style Guide +# Static CMS Style Guide _Adapted from the [Kubernetes Style Guide](https://kubernetes.io/docs/contribute/style/style-guide)_ ## Documentation Formatting Standards @@ -217,7 +217,7 @@ Do: Version 1.4 includes … Don't: In version 1.4, we have added … _____ -Do: Simple CMS provides a new feature for … +Do: Static CMS provides a new feature for … Don't: We provide a new feature … _____ diff --git a/website/content/pages/community.md b/website/content/pages/community.md index b658bddc..871bb313 100644 --- a/website/content/pages/community.md +++ b/website/content/pages/community.md @@ -5,18 +5,18 @@ subhead: Get support, give support, and find out what's new through the channels sections: - title: support channels: - - title: Simple CMS Slack - description: Live community chat for all things Simple CMS. + - title: Static CMS Slack + description: Live community chat for all things Static CMS. url: /chat - - title: Simple CMS Community + - title: Static CMS Community description: Ask and answer questions on GitHub discussions tab. - url: https://github.com/SimpleCMS/simple-cms/discussions + url: https://github.com/StaticJsCMS/static-cms/discussions - title: GitHub Issues description: Report bugs, request features, and comment on existing issues. - url: https://github.com/SimpleCMS/simple-cms/issues + url: https://github.com/StaticJsCMS/static-cms/issues - title: development channels: - title: Planning - description: Issues board on the Simple CMS GitHub repo. - url: https://github.com/orgs/SimpleCMS/projects/1 + description: Issues board on the Static CMS GitHub repo. + url: https://github.com/orgs/StaticJsCMS/projects/1 --- diff --git a/website/data/global.yaml b/website/data/global.yaml index 36380cd1..f1eb7a77 100644 --- a/website/data/global.yaml +++ b/website/data/global.yaml @@ -1,6 +1,6 @@ footer: buttons: - name: "Twitter" - url: "https://twitter.com/SimpleCMSOrg" + url: "https://twitter.com/StaticJsCMS" - name: "GitHub" - url: "https://github.com/SimpleCMS/simple-cms" + url: "https://github.com/StaticJsCMS/static-cms" diff --git a/website/data/landing.yaml b/website/data/landing.yaml index bf32eff6..456e3fdb 100644 --- a/website/data/landing.yaml +++ b/website/data/landing.yaml @@ -1,13 +1,13 @@ hero: headline: "Open source content management for your Git workflow" - subhead: "Use Simple CMS with any static site generator for a faster and more flexible web project" + subhead: "Use Static CMS with any static site generator for a faster and more flexible web project" devfeatures: - feature: "Static + content management = ♥" description: "Get the speed, security, and scalability of a static site, while still providing a convenient editing interface for content." - feature: "An integrated part of your Git workflow" description: "Content is stored in your Git repository alongside your code for easier versioning, multi-channel publishing, and the option to handle content updates directly in Git." - feature: "An extensible CMS built on React" - description: "Simple CMS is built as a single-page React app. Create custom-styled previews, UI widgets, and editor plugins or add backends to support different Git platform APIs." + description: "Static CMS is built as a single-page React app. Create custom-styled previews, UI widgets, and editor plugins or add backends to support different Git platform APIs." cta: primaryhook: "Getting started is simple and free." @@ -32,10 +32,10 @@ community: hook: "Supported by a growing community" features: - feature: "Built on the Jamstack" - description: "Simple CMS is based on client-side JavaScript, reusable APIs and prebuilt Markup. Compared to server-side CMS like WordPress, this means better performance, higher security, lower cost of scaling, and a better developer experience. You can learn more about the Jamstack on [jamstack.org](https://jamstack.org)." + description: "Static CMS is based on client-side JavaScript, reusable APIs and prebuilt Markup. Compared to server-side CMS like WordPress, this means better performance, higher security, lower cost of scaling, and a better developer experience. You can learn more about the Jamstack on [jamstack.org](https://jamstack.org)." - feature: "Support when you need it" - description: "Get up and running with comprehensive [documentation](/docs) and templates or work through difficult problems in our [community chat](https://simplecms.github.io/simple-cms/chat)." + description: "Get up and running with comprehensive [documentation](/docs) and templates or work through difficult problems in our [community chat](https://staticjscms.github.io/static-cms/chat)." - feature: "A community-driven project you can help evolve" - description: "Simple CMS is built by a community of more than 100 contributors — and you can help. Read the [contributing guide](/docs/contributor-guide) to join in." + description: "Static CMS is built by a community of more than 100 contributors — and you can help. Read the [contributing guide](/docs/contributor-guide) to join in." contributors: "Made possible by awesome contributors" diff --git a/website/data/notifications.yml b/website/data/notifications.yml index c247479f..f7371476 100644 --- a/website/data/notifications.yml +++ b/website/data/notifications.yml @@ -4,4 +4,4 @@ notifications: project with other devs! published: false title: Chat shoutout - url: https://simplecms.github.io/simple-cms/chat + url: https://staticjscms.github.io/static-cms/chat diff --git a/website/data/updates.yml b/website/data/updates.yml index 651246e0..122a696c 100644 --- a/website/data/updates.yml +++ b/website/data/updates.yml @@ -1,5 +1,5 @@ updates: - date: 2022-10-30T00:00:00.000Z version: 1.0.0 - description: The first major release of Simple CMS with an all-new UI, revamped + description: The first major release of Static CMS with an all-new UI, revamped documentation and much more. diff --git a/website/gatsby-config.js b/website/gatsby-config.js index 7b0132de..cde8f6f7 100644 --- a/website/gatsby-config.js +++ b/website/gatsby-config.js @@ -7,18 +7,18 @@ const staticConfig = yaml.load(fs.readFileSync('./site.yml', 'utf8')); module.exports = { siteMetadata: { - title: 'Simple CMS | Open-Source Content Management System', + title: 'Static CMS | Open-Source Content Management System', description: 'Open source content management for your Git workflow', siteUrl: pkg.homepage, menu: staticConfig.menu, }, - pathPrefix: `/simple-cms`, + pathPrefix: `/static-cms`, plugins: [ { resolve: 'gatsby-plugin-manifest', options: { - name: 'SimpleCMS', - short_name: 'SimpleCMS', + name: 'StaticCms', + short_name: 'StaticCms', start_url: '/', background_color: '#ffffff', theme_color: '#ffffff', diff --git a/website/package.json b/website/package.json index 829a77d4..2eec5e5d 100644 --- a/website/package.json +++ b/website/package.json @@ -1,7 +1,7 @@ { - "name": "simple-cms-site", + "name": "static-cms-site", "version": "1.0.0", - "description": "Simple CMS documentation website built with Gatsby", + "description": "Static CMS documentation website built with Gatsby", "scripts": { "start": "gatsby develop", "build": "gatsby build --prefix-paths && rm -rf dist && mv public dist", @@ -9,7 +9,7 @@ "reset": "rm -rf .cache" }, "author": "", - "homepage": "https://www.simplecms.github.io/simple-cms/", + "homepage": "https://www.staticjscms.github.io/static-cms/", "license": "MIT", "dependencies": { "@emotion/cache": "^10.0.29", diff --git a/website/site.yml b/website/site.yml index 712df383..376ad1dc 100644 --- a/website/site.yml +++ b/website/site.yml @@ -1,7 +1,7 @@ menu: docs: - name: Intro - title: Intro to Simple CMS + title: Intro to Static CMS - name: Accounts title: Account Settings - name: Configuration @@ -17,6 +17,6 @@ menu: - name: Guides title: Platform Guides - name: Customization - title: Customizing Simple CMS + title: Customizing Static CMS - name: Contributing title: Community diff --git a/website/src/components/chat-button.js b/website/src/components/chat-button.js index 1dcf58db..4815564e 100644 --- a/website/src/components/chat-button.js +++ b/website/src/components/chat-button.js @@ -11,7 +11,7 @@ const ChatLink = styled.a` function ChatButton() { return ( - + ); diff --git a/website/src/components/docsearch.js b/website/src/components/docsearch.js index 9d5aa158..caa11aa0 100644 --- a/website/src/components/docsearch.js +++ b/website/src/components/docsearch.js @@ -33,7 +33,7 @@ function DocSearch() { if (window.docsearch) { window.docsearch({ apiKey: '08d03dc80862e84c70c5a1e769b13019', - indexName: 'simplecms', + indexName: 'staticcms', inputSelector: '#algolia-search', debug: false, // Set debug to true if you want to inspect the dropdown }); diff --git a/website/src/components/footer.js b/website/src/components/footer.js index 0078b7b0..856e2411 100644 --- a/website/src/components/footer.js +++ b/website/src/components/footer.js @@ -74,14 +74,14 @@ function Footer({ buttons }) {

    Distributed under MIT License {' '} ·{' '} Code of Conduct diff --git a/website/src/components/github-button.js b/website/src/components/github-button.js index a68d1b12..3474920b 100644 --- a/website/src/components/github-button.js +++ b/website/src/components/github-button.js @@ -4,10 +4,10 @@ class GitHubStarButton extends PureComponent { render() { return ( - Star SimpleCMS/simple-cms on GitHub + Star StaticJsCMS/static-cms on GitHub ); } diff --git a/website/src/components/header.js b/website/src/components/header.js index e998c6c7..1d21edc8 100644 --- a/website/src/components/header.js +++ b/website/src/components/header.js @@ -7,7 +7,7 @@ import GitHubStarButton from './github-button'; import Container from './container'; import Notifications from './notifications'; import DocSearch from './docsearch'; -import logo from '../img/simple-cms-logo.svg'; +import logo from '../img/static-cms-logo.svg'; import searchIcon from '../img/search.svg'; import theme from '../theme'; import { mq } from '../utils'; @@ -193,7 +193,7 @@ function Header({ hasHeroBelow }) { - Simple CMS logo + Static CMS logo diff --git a/website/src/components/release.js b/website/src/components/release.js index 9beff810..0a20dbbf 100644 --- a/website/src/components/release.js +++ b/website/src/components/release.js @@ -29,7 +29,7 @@ const Version = styled.span` function Release({ version, versionPrevious, date, description, url }) { const displayDate = moment(date).format('MMMM D, YYYY'); - const defaultUrl = `https://github.com/SimpleCMS/simple-cms/compare/simple-cms@${versionPrevious}...simple-cms@${version}`; + const defaultUrl = `https://github.com/StaticJsCMS/static-cms/compare/static-cms@${versionPrevious}...static-cms@${version}`; return (

  • - + {title && } {description && } {image && } diff --git a/website/src/components/video-embed.js b/website/src/components/video-embed.js index 9215b350..07516cde 100644 --- a/website/src/components/video-embed.js +++ b/website/src/components/video-embed.js @@ -83,7 +83,7 @@ function VideoEmbed() { // const embedcode = ( //