From a9655417057090c46559a039d88e0af6937c1634 Mon Sep 17 00:00:00 2001 From: erezrokah Date: Wed, 10 Feb 2021 11:30:41 +0100 Subject: [PATCH] feat: add frameworks titles --- README.md | 17 +++++++++++++++++ src/core.js | 5 ++++- src/frameworks/angular.json | 1 + src/frameworks/assemble.json | 1 + src/frameworks/brunch.json | 1 + src/frameworks/create-react-app.json | 1 + src/frameworks/docpad.json | 1 + src/frameworks/docusaurus-v2.json | 1 + src/frameworks/docusaurus.json | 1 + src/frameworks/eleventy.json | 1 + src/frameworks/ember.json | 1 + src/frameworks/expo.json | 1 + src/frameworks/gatsby.json | 1 + src/frameworks/gridsome.json | 1 + src/frameworks/grunt.json | 1 + src/frameworks/gulp.json | 1 + src/frameworks/harp.json | 1 + src/frameworks/hexo.json | 1 + src/frameworks/hugo.json | 1 + src/frameworks/jekyll.json | 1 + src/frameworks/metalsmith.json | 1 + src/frameworks/middleman.json | 1 + src/frameworks/next.json | 1 + src/frameworks/nuxt.json | 1 + src/frameworks/parcel.json | 1 + src/frameworks/phenomic.json | 1 + src/frameworks/quasar-v0.17.json | 1 + src/frameworks/quasar.json | 1 + src/frameworks/react-static.json | 1 + src/frameworks/roots.json | 1 + src/frameworks/sapper.json | 1 + src/frameworks/stencil.json | 1 + src/frameworks/svelte.json | 1 + src/frameworks/vue.json | 1 + src/frameworks/vuepress.json | 1 + src/frameworks/wintersmith.json | 1 + test/frameworks.js | 3 ++- test/snapshots/bin.js.md | 4 ++++ test/snapshots/bin.js.snap | Bin 709 -> 733 bytes test/snapshots/main.js.md | 2 ++ test/snapshots/main.js.snap | Bin 547 -> 561 bytes 41 files changed, 63 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c15678bf..d0a5a82c 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ console.log(await listFrameworks({ projectDir: './path/to/gatsby/website' })) // [ // { // name: 'gatsby', +// title: 'Gatsby', // category: 'static_site_generator', // dev: { // commands: ['gatsby develop'], @@ -44,6 +45,7 @@ console.log(await listFrameworks({ projectDir: './path/to/vue/website' })) // [ // { // name: 'vue', +// title: 'Vue.js', // category: 'frontend_framework', // dev: { // commands: ['npm run serve'], @@ -64,6 +66,7 @@ console.log(await hasFramework('vue', { projectDir: './path/to/vue/website' })) console.log(await getFramework('vue', { projectDir: './path/to/vue/website' })) // { // name: 'vue', +// title: 'Vue.js', // category: 'frontend_framework', // dev: { // commands: ['npm run serve'], @@ -88,6 +91,7 @@ $ framework-info --long ./path/to/vue/website [ { "name": "vue", + "title": 'Vue.js', "category": "frontend_framework", "dev": { "commands": ["npm run serve"], @@ -138,6 +142,12 @@ _Type_: `string` Name such as `"gatsby"`. +## title + +_Type_: `string` + +Title such as `"Gatsby"`. + #### category _Type_: `string` @@ -228,6 +238,7 @@ Each framework is a JSON file in the `/src/frameworks/` directory. For example: ```json { "name": "gatsby", + "title": "Gatsby", "category": "static_site_generator", "detect": { "npmDependencies": ["gatsby"], @@ -255,6 +266,12 @@ _Type_: `string` Name of the framework, lowercase. +## title + +_Type_: `string` + +Title of the framework. + ## category _Type_: `string` diff --git a/src/core.js b/src/core.js index d0db624c..6627ae2d 100644 --- a/src/core.js +++ b/src/core.js @@ -42,7 +42,8 @@ const getContext = (context) => { /** * @typedef {object} Framework - * @property {string} name - Name such as `"gatsby"` + * @property {string} name - framework name such as `"gatsby"` + * @property {string} title - framework title as `"Gatsby"` * @property {string} category - Category among `"static_site_generator"`, `"frontend_framework"` and `"build_tool"` * @property {Dev} dev - Information about the dev command * @property {Build} build - Information about the build command @@ -131,6 +132,7 @@ const getProjectInfo = async function ({ pathExists, packageJson, packageJsonPat const getFrameworkInfo = function ( { name, + title, category, dev: { command: frameworkDevCommand, port }, build: { command: frameworkBuildCommand, directory }, @@ -143,6 +145,7 @@ const getFrameworkInfo = function ( const recommendedPlugins = getPlugins(plugins, { nodeVersion }) return { name, + title, category, dev: { commands: devCommands, port }, build: { commands: [frameworkBuildCommand], directory }, diff --git a/src/frameworks/angular.json b/src/frameworks/angular.json index 9c0139c0..d723aabd 100644 --- a/src/frameworks/angular.json +++ b/src/frameworks/angular.json @@ -1,5 +1,6 @@ { "name": "angular", + "title": "Angular", "category": "frontend_framework", "detect": { "npmDependencies": ["@angular/cli"], diff --git a/src/frameworks/assemble.json b/src/frameworks/assemble.json index 5a65176c..76fa9482 100644 --- a/src/frameworks/assemble.json +++ b/src/frameworks/assemble.json @@ -1,5 +1,6 @@ { "name": "assemble", + "title": "Assemble", "category": "static_site_generator", "detect": { "npmDependencies": ["assemble"], diff --git a/src/frameworks/brunch.json b/src/frameworks/brunch.json index d964649a..5f50e183 100644 --- a/src/frameworks/brunch.json +++ b/src/frameworks/brunch.json @@ -1,5 +1,6 @@ { "name": "brunch", + "title": "Brunch", "category": "build_tool", "detect": { "npmDependencies": ["brunch"], diff --git a/src/frameworks/create-react-app.json b/src/frameworks/create-react-app.json index f2b8d8ff..5cb5d366 100644 --- a/src/frameworks/create-react-app.json +++ b/src/frameworks/create-react-app.json @@ -1,5 +1,6 @@ { "name": "create-react-app", + "title": "Create React App", "category": "frontend_framework", "detect": { "npmDependencies": ["react-scripts"], diff --git a/src/frameworks/docpad.json b/src/frameworks/docpad.json index 68baea91..41d0fff7 100644 --- a/src/frameworks/docpad.json +++ b/src/frameworks/docpad.json @@ -1,5 +1,6 @@ { "name": "docpad", + "title": "DocPad", "category": "static_site_generator", "detect": { "npmDependencies": ["docpad"], diff --git a/src/frameworks/docusaurus-v2.json b/src/frameworks/docusaurus-v2.json index 352782c7..53aa164d 100644 --- a/src/frameworks/docusaurus-v2.json +++ b/src/frameworks/docusaurus-v2.json @@ -1,5 +1,6 @@ { "name": "docusaurus-v2", + "title": "Docusaurus 2", "category": "static_site_generator", "detect": { "npmDependencies": ["@docusaurus/core"], diff --git a/src/frameworks/docusaurus.json b/src/frameworks/docusaurus.json index 0c001ca1..1604cf95 100644 --- a/src/frameworks/docusaurus.json +++ b/src/frameworks/docusaurus.json @@ -1,5 +1,6 @@ { "name": "docusaurus", + "title": "Docusaurus", "category": "static_site_generator", "detect": { "npmDependencies": ["docusaurus"], diff --git a/src/frameworks/eleventy.json b/src/frameworks/eleventy.json index 23a21c9e..207e6aaa 100644 --- a/src/frameworks/eleventy.json +++ b/src/frameworks/eleventy.json @@ -1,5 +1,6 @@ { "name": "eleventy", + "title": "Eleventy", "category": "static_site_generator", "detect": { "npmDependencies": ["@11ty/eleventy"], diff --git a/src/frameworks/ember.json b/src/frameworks/ember.json index 043e0860..3c8b4bb5 100644 --- a/src/frameworks/ember.json +++ b/src/frameworks/ember.json @@ -1,5 +1,6 @@ { "name": "ember", + "title": "Ember.js", "category": "frontend_framework", "detect": { "npmDependencies": ["ember-cli"], diff --git a/src/frameworks/expo.json b/src/frameworks/expo.json index 4cc16305..8f0a6782 100644 --- a/src/frameworks/expo.json +++ b/src/frameworks/expo.json @@ -1,5 +1,6 @@ { "name": "expo", + "title": "Expo", "category": "frontend_framework", "detect": { "npmDependencies": ["expo"], diff --git a/src/frameworks/gatsby.json b/src/frameworks/gatsby.json index 9b03b7fb..fdbc52a7 100644 --- a/src/frameworks/gatsby.json +++ b/src/frameworks/gatsby.json @@ -1,5 +1,6 @@ { "name": "gatsby", + "title": "Gatsby", "category": "static_site_generator", "detect": { "npmDependencies": ["gatsby"], diff --git a/src/frameworks/gridsome.json b/src/frameworks/gridsome.json index 325f600b..89aa91e0 100644 --- a/src/frameworks/gridsome.json +++ b/src/frameworks/gridsome.json @@ -1,5 +1,6 @@ { "name": "gridsome", + "title": "Gridsome", "category": "static_site_generator", "detect": { "npmDependencies": ["gridsome"], diff --git a/src/frameworks/grunt.json b/src/frameworks/grunt.json index 1b64e16e..41026062 100644 --- a/src/frameworks/grunt.json +++ b/src/frameworks/grunt.json @@ -1,5 +1,6 @@ { "name": "grunt", + "title": "Grunt", "category": "build_tool", "detect": { "npmDependencies": ["grunt"], diff --git a/src/frameworks/gulp.json b/src/frameworks/gulp.json index c202b5ee..b026a90e 100644 --- a/src/frameworks/gulp.json +++ b/src/frameworks/gulp.json @@ -1,5 +1,6 @@ { "name": "gulp", + "title": "gulp.js", "category": "build_tool", "detect": { "npmDependencies": ["gulp"], diff --git a/src/frameworks/harp.json b/src/frameworks/harp.json index 346d48b2..820806cb 100644 --- a/src/frameworks/harp.json +++ b/src/frameworks/harp.json @@ -1,5 +1,6 @@ { "name": "harp", + "title": "Harp", "category": "static_site_generator", "detect": { "npmDependencies": ["harp"], diff --git a/src/frameworks/hexo.json b/src/frameworks/hexo.json index 4adbfaf9..fa6dea02 100644 --- a/src/frameworks/hexo.json +++ b/src/frameworks/hexo.json @@ -1,5 +1,6 @@ { "name": "hexo", + "title": "Hexo", "category": "static_site_generator", "detect": { "npmDependencies": ["hexo"], diff --git a/src/frameworks/hugo.json b/src/frameworks/hugo.json index bb7a60d3..8d86c1b3 100644 --- a/src/frameworks/hugo.json +++ b/src/frameworks/hugo.json @@ -1,5 +1,6 @@ { "name": "hugo", + "title": "Hugo", "category": "static_site_generator", "detect": { "npmDependencies": [], diff --git a/src/frameworks/jekyll.json b/src/frameworks/jekyll.json index ba4a7991..a15a63f0 100644 --- a/src/frameworks/jekyll.json +++ b/src/frameworks/jekyll.json @@ -1,5 +1,6 @@ { "name": "jekyll", + "title": "Jekyll", "category": "static_site_generator", "detect": { "npmDependencies": [], diff --git a/src/frameworks/metalsmith.json b/src/frameworks/metalsmith.json index ba054643..fdb997b8 100644 --- a/src/frameworks/metalsmith.json +++ b/src/frameworks/metalsmith.json @@ -1,5 +1,6 @@ { "name": "metalsmith", + "title": "Metalsmith", "category": "static_site_generator", "detect": { "npmDependencies": ["metalsmith"], diff --git a/src/frameworks/middleman.json b/src/frameworks/middleman.json index 919c0478..6de4e52f 100644 --- a/src/frameworks/middleman.json +++ b/src/frameworks/middleman.json @@ -1,5 +1,6 @@ { "name": "middleman", + "title": "Middleman", "category": "static_site_generator", "detect": { "npmDependencies": [], diff --git a/src/frameworks/next.json b/src/frameworks/next.json index 2746b1d9..95ec9812 100644 --- a/src/frameworks/next.json +++ b/src/frameworks/next.json @@ -1,5 +1,6 @@ { "name": "next", + "title": "Next.js", "category": "static_site_generator", "detect": { "npmDependencies": ["next"], diff --git a/src/frameworks/nuxt.json b/src/frameworks/nuxt.json index a3354ee3..5b6d96e6 100644 --- a/src/frameworks/nuxt.json +++ b/src/frameworks/nuxt.json @@ -1,5 +1,6 @@ { "name": "nuxt", + "title": "Next.js", "category": "static_site_generator", "detect": { "npmDependencies": ["nuxt"], diff --git a/src/frameworks/parcel.json b/src/frameworks/parcel.json index 5b9fa098..51b32541 100644 --- a/src/frameworks/parcel.json +++ b/src/frameworks/parcel.json @@ -1,5 +1,6 @@ { "name": "parcel", + "title": "Parcel", "category": "build_tool", "detect": { "npmDependencies": ["parcel-bundler", "parcel"], diff --git a/src/frameworks/phenomic.json b/src/frameworks/phenomic.json index ab786dd2..2c9583f2 100644 --- a/src/frameworks/phenomic.json +++ b/src/frameworks/phenomic.json @@ -1,5 +1,6 @@ { "name": "phenomic", + "title": "Phenomic", "category": "static_site_generator", "detect": { "npmDependencies": ["@phenomic/core"], diff --git a/src/frameworks/quasar-v0.17.json b/src/frameworks/quasar-v0.17.json index c2860a9d..293ab508 100644 --- a/src/frameworks/quasar-v0.17.json +++ b/src/frameworks/quasar-v0.17.json @@ -1,5 +1,6 @@ { "name": "quasar-v0.17", + "title": "Quasar", "category": "frontend_framework", "detect": { "npmDependencies": ["quasar-cli"], diff --git a/src/frameworks/quasar.json b/src/frameworks/quasar.json index 1ff9fc6a..ba1aba54 100644 --- a/src/frameworks/quasar.json +++ b/src/frameworks/quasar.json @@ -1,5 +1,6 @@ { "name": "quasar", + "title": "Quasar", "category": "frontend_framework", "detect": { "npmDependencies": ["@quasar/app"], diff --git a/src/frameworks/react-static.json b/src/frameworks/react-static.json index 3eada384..de62c233 100644 --- a/src/frameworks/react-static.json +++ b/src/frameworks/react-static.json @@ -1,5 +1,6 @@ { "name": "react-static", + "title": "React Static", "category": "static_site_generator", "detect": { "npmDependencies": ["react-static"], diff --git a/src/frameworks/roots.json b/src/frameworks/roots.json index 9436f528..db499f48 100644 --- a/src/frameworks/roots.json +++ b/src/frameworks/roots.json @@ -1,5 +1,6 @@ { "name": "roots", + "title": "Roots", "category": "static_site_generator", "detect": { "npmDependencies": ["roots"], diff --git a/src/frameworks/sapper.json b/src/frameworks/sapper.json index 20c25a04..211034a6 100644 --- a/src/frameworks/sapper.json +++ b/src/frameworks/sapper.json @@ -1,5 +1,6 @@ { "name": "sapper", + "title": "Sapper", "category": "frontend_framework", "detect": { "npmDependencies": ["sapper"], diff --git a/src/frameworks/stencil.json b/src/frameworks/stencil.json index ffe642bf..3a82f0e0 100644 --- a/src/frameworks/stencil.json +++ b/src/frameworks/stencil.json @@ -1,5 +1,6 @@ { "name": "stencil", + "title": "Stencil", "category": "static_site_generator", "detect": { "npmDependencies": ["@stencil/core"], diff --git a/src/frameworks/svelte.json b/src/frameworks/svelte.json index 37171697..c1429296 100644 --- a/src/frameworks/svelte.json +++ b/src/frameworks/svelte.json @@ -1,5 +1,6 @@ { "name": "svelte", + "title": "Svelte", "category": "frontend_framework", "detect": { "npmDependencies": ["svelte"], diff --git a/src/frameworks/vue.json b/src/frameworks/vue.json index 65837e89..96d6861a 100644 --- a/src/frameworks/vue.json +++ b/src/frameworks/vue.json @@ -1,5 +1,6 @@ { "name": "vue", + "title": "Vue.js", "category": "frontend_framework", "detect": { "npmDependencies": ["@vue/cli-service"], diff --git a/src/frameworks/vuepress.json b/src/frameworks/vuepress.json index e8e51ea6..6bef0ecb 100644 --- a/src/frameworks/vuepress.json +++ b/src/frameworks/vuepress.json @@ -1,5 +1,6 @@ { "name": "vuepress", + "title": "VuePress", "category": "static_site_generator", "detect": { "npmDependencies": ["vuepress"], diff --git a/src/frameworks/wintersmith.json b/src/frameworks/wintersmith.json index 680d8442..547e10bc 100644 --- a/src/frameworks/wintersmith.json +++ b/src/frameworks/wintersmith.json @@ -1,5 +1,6 @@ { "name": "wintersmith", + "title": "Wintersmith", "category": "static_site_generator", "detect": { "npmDependencies": ["wintersmith"], diff --git a/test/frameworks.js b/test/frameworks.js index aea4e75f..c8396052 100644 --- a/test/frameworks.js +++ b/test/frameworks.js @@ -47,10 +47,11 @@ const PLUGIN_SCHEMA = { const MAX_PORT = 65535 const FRAMEWORK_JSON_SCHEMA = { type: 'object', - required: ['name', 'category', 'detect', 'dev', 'build', 'env'], + required: ['name', 'title', 'category', 'detect', 'dev', 'build', 'env'], additionalProperties: false, properties: { name: { type: 'string', pattern: '^[a-z\\d_]+', minLength: 1 }, + title: { type: 'string', pattern: '^\\w+', minLength: 1 }, category: { type: 'string', enum: ['static_site_generator', 'frontend_framework', 'build_tool'], diff --git a/test/snapshots/bin.js.md b/test/snapshots/bin.js.md index 5dbeaf63..1415c9d7 100644 --- a/test/snapshots/bin.js.md +++ b/test/snapshots/bin.js.md @@ -25,6 +25,7 @@ Generated by [AVA](https://ava.li). `[␊ {␊ "name": "vuepress",␊ + "title": "VuePress",␊ "category": "static_site_generator",␊ "dev": {␊ "commands": [␊ @@ -43,6 +44,7 @@ Generated by [AVA](https://ava.li). },␊ {␊ "name": "vue",␊ + "title": "Vue.js",␊ "category": "frontend_framework",␊ "dev": {␊ "commands": [␊ @@ -75,6 +77,7 @@ Generated by [AVA](https://ava.li). `[␊ {␊ "name": "next",␊ + "title": "Next.js",␊ "category": "static_site_generator",␊ "dev": {␊ "commands": [␊ @@ -102,6 +105,7 @@ Generated by [AVA](https://ava.li). `[␊ {␊ "name": "next",␊ + "title": "Next.js",␊ "category": "static_site_generator",␊ "dev": {␊ "commands": [␊ diff --git a/test/snapshots/bin.js.snap b/test/snapshots/bin.js.snap index 69660a0cd2ff0af0ce6d50b67b0183e4d23445cf..05c6232323dfad4ae17bd18e7c79222e588046b3 100644 GIT binary patch literal 733 zcmV<30wVoERzVgiSX`pc~Y7KzqA^DJjRTnL6Ayj@znw={5PC2Pg#lMEqy4nLZIF;P5v;>}HM ze;XRIV)XG&LJoahT{-pe?90XRy~l=+UQVeD<-xw8-LLk)zxe(0pcSL< z`U%-V`eRP3j|^G^%@6~LO4;UPqa|}YQ?>yX%>$6-)W>WQvZ;4=q=jpyz1VO*#4{TW zHL9^L?QB31Z9XU#>g-jhCY#N^yO%x}5pK?bTtejx5P79HD0#`=Tm_SHv z{KpDog&4Y=q^^d{b9zYL^6yCRFo`vtoF$)nk2*~0Y#Sf)_$cXb;DvR@W3q~!cy-Fz zP09RhR~=m`xJK^GxYESW33;hk5py+<h{2OYvv1~`wo~5)aZLRvrsxodw zgK{9ntjT+l$%<`H2AT=3iY6kLYoHgv+L~&JIcSHrUgfF~9#US36E;yQlYV2u6yl*@ zMcHdYPw@ILJM@J_VB8hbr_ot}Rz;`*X{`ZkO^~-cGfy`VjAvk+=a}a~6@kL(smT&h zDd|GKjUCDkx-|535nSpiY;A`N2iFf-GJlc6DIi?XhC_y2Gatd!i<$29k?TC1Q|N#e zU@B}{#58P|4VF-Q%w1@;2PE~~S}>(0|w|R2=7Z$7q!dxXEn&`5narKawN9 zqDDGlLm+iG!zKfgjNy?&;kU*xI{&t2&veOlM=y;Z=dI$6wrshG%cvTgyNxIRU!Z?e PphWziX8`6pX$SxSAG}^Q literal 709 zcmV;$0y_OcRzVMxoL(F38`}T+@cS#@KMz_ldZV9^ zJ)}RjY4wpoYoHZkAWL$5Wyojj{78b=sm6woOVOUvRI~b= zVjAZf$Wc-)WJYwbWjKjibWZp_<&H8~CB-9v zbD~gaq8GrgG1C+a&<<@sDm5WIq`Vpnwoob~zf~}Uc<9$q_A2NJ-uUf?zK{rvyF&Uj z@&#y3gc^|6oA9d$igu^+Y!ksS14CY5o(DAq3g>60r+`XHmx^uHq2i!RLr<5%rJlm% zI$Suo>Ex7IMG?*b;es|cWXLu15lp_AsZJlcF2Y5H4rl=;!=^+`!FIXe6l#yTOG$Y^ zn&0gMrnF?d(VqQlR+oo|lCuGM;jg2?ziHe-2ry diff --git a/test/snapshots/main.js.md b/test/snapshots/main.js.md index 476892b8..07db798a 100644 --- a/test/snapshots/main.js.md +++ b/test/snapshots/main.js.md @@ -25,6 +25,7 @@ Generated by [AVA](https://ava.li). env: {}, name: 'sapper', plugins: [], + title: 'Sapper', } ## Should detect frameworks @@ -49,5 +50,6 @@ Generated by [AVA](https://ava.li). env: {}, name: 'sapper', plugins: [], + title: 'Sapper', }, ] diff --git a/test/snapshots/main.js.snap b/test/snapshots/main.js.snap index 12c361d83dc15a9493b8559c05efe67e05b9cb12..37acf60c4dbb3c91cd82182d45e0bec01cf57946 100644 GIT binary patch literal 561 zcmV-10?z$GRzVK}^;00000000B6 zQ@?8zK@@&(_U9$WyHg9xKpKmH#43o0HWn% zZ`@r;zA_D-4MEggKl1+J{9M2PI`I5LY1;SZ)hU~>&^5a;lRQD*SbK-V)u@x?9 zS}SQK?H%!@q1a_(4dPe8C)S1_ibDX^z+5Z9jL@j2MlF7|OTSvDmGYO_$#&IhHJ!9b zTRJ6nT5=mvr{jl#-cu!LDJ0EJyY6}0WAVJB@@5>VB$rbDLrQa?NncE{J~?Pw+=uKz z*6^@sqfj(RFF<&yk*oq~f|!Z-4GtSsF|}RnbXIB^XJW{~9m!p1F^lyW6%XW+11FhJ zj684)>mA?;@Dca|`~(i;*U$as_m4bqd2AlIUFLz+J$m57|9IdV#9M%+Uu@$K56pvd z61bvMtzA9f?B)Tt+ymY5d*IpLJn#mxciQzfbq{QU@LeO>7QEih`TczR?2<=}V9{n) z1_ovZcCac&4n`&&AZ-N1!i;Q!jI54DMTwP+j4&2IKR*K_7Xu?B10y#hqYX?GdpVG< z1>z|{d>mvQ5Pt+>5k{y%Z2n1EsmUdbOmL=vfB*v{F9RbR10x?Jqb?&zF*5@rE6}Q> z(#)I`21b6MRwkGrM{;6GYI=TAB}_mlttdaQBsDK3KCLJ*H?=&!C>v~21d>V2DXC>( z!DeK^)Vwk@!&&lxCcrps#fb$4sYPIY3z77(7vz+tXXX`yJj}coC~+8w@1lE<8P$V8 zr2@b}76W1fCN!n2Xi8CK*|Ew(BZLDbLV%&j1a_`36T-P1$@#gtiFql-Xny5P$t(gI ziWHK9@$nEZ$H(iZRutqHl^_{eM1+wnAU$9X3)2p6a4MP()Hat1H5IX-I2x#EH&DSr zG(~J!k{S=lGPo;vA&ymmITf24E~pw{{3E4pb|)b10mSh@JPC-G1MwapzR!RbHH