From 5d30700149e175290f4ff1166a11de18176a7197 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 03:59:56 +0800 Subject: [PATCH 01/69] feat: generate class docs, #43 * using jsdoc/minami/taffyb * installed with npm install --save-dev jsdoc minami taffydb --- app/.eslintignore | 2 + app/.gitignore | 2 + app/.jsdoc.json | 27 ++ app/package-lock.json | 494 +++++++++++++++++++++++++++++- app/package.json | 6 +- app/src/classes/colorlog/index.js | 6 +- app/src/classes/schema/index.js | 2 +- 7 files changed, 533 insertions(+), 6 deletions(-) create mode 100644 app/.jsdoc.json diff --git a/app/.eslintignore b/app/.eslintignore index f739bcc..1398766 100644 --- a/app/.eslintignore +++ b/app/.eslintignore @@ -6,7 +6,9 @@ node_modules/ *.zip *.tgz dist/ +docs/ # Ignore all JSON files except: !package.json !package-lock.json +!.jsdoc.json diff --git a/app/.gitignore b/app/.gitignore index f739bcc..1398766 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -6,7 +6,9 @@ node_modules/ *.zip *.tgz dist/ +docs/ # Ignore all JSON files except: !package.json !package-lock.json +!.jsdoc.json diff --git a/app/.jsdoc.json b/app/.jsdoc.json new file mode 100644 index 0000000..c3143bf --- /dev/null +++ b/app/.jsdoc.json @@ -0,0 +1,27 @@ +{ + "tags": { + "allowUnknownTags": true, + "dictionaries": ["jsdoc"] + }, + "source": { + "include": ["src", "package.json"], + "includePattern": ".js$", + "excludePattern": "(node_modules/|docs)" + }, + "plugins": [ + "plugins/markdown" + ], + "templates": { + "cleverLinks": false, + "monospaceLinks": true, + "useLongnameInNav": false, + "showInheritedInNav": true + }, + "opts": { + "destination": "./docs/", + "encoding": "utf8", + "private": true, + "recurse": true, + "template": "./node_modules/minami" + } +} diff --git a/app/package-lock.json b/app/package-lock.json index 3253d26..35efca5 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -21,7 +21,10 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.0.0", "jest": "^29.7.0", - "pkg": "^5.8.0" + "jsdoc": "^4.0.3", + "minami": "^1.2.3", + "pkg": "^5.8.0", + "taffydb": "^2.7.3" }, "engines": { "node": "16.14.2", @@ -1294,6 +1297,18 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsdoc/salty": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz", + "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1476,6 +1491,28 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, "node_modules/@types/node": { "version": "22.5.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", @@ -1859,6 +1896,12 @@ "node": ">= 6" } }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2013,6 +2056,18 @@ } ] }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2341,6 +2396,18 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -4552,6 +4619,82 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dev": true, + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", + "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^14.1.1", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc/node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/jsdoc/node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/jsdoc/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -4606,6 +4749,15 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -4643,6 +4795,15 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4658,6 +4819,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4700,6 +4867,51 @@ "tmpl": "1.0.5" } }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "dev": true, + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4749,6 +4961,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/minami": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minami/-/minami-1.2.3.tgz", + "integrity": "sha512-3f2QqqbUC1usVux0FkQMFYB73yd9JIxmHSn1dWQacizL6hOUaNu6mA3KxZ9SfiCc4qgcgq+5XP59+hP7URa1Dw==", + "dev": true + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4767,6 +4985,18 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -5380,6 +5610,15 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", @@ -5499,6 +5738,15 @@ "node": ">=0.10.0" } }, + "node_modules/requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -5910,6 +6158,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/taffydb": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", + "integrity": "sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg==", + "dev": true + }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -6062,6 +6316,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -6077,6 +6337,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "dev": true + }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -6270,6 +6536,12 @@ "node": ">=0.8" } }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "dev": true + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -7303,6 +7575,15 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "@jsdoc/salty": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz", + "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==", + "dev": true, + "requires": { + "lodash": "^4.17.21" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7468,6 +7749,28 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true + }, + "@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "requires": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, "@types/node": { "version": "22.5.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", @@ -7753,6 +8056,12 @@ } } }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -7847,6 +8156,15 @@ "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", "dev": true }, + "catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8084,6 +8402,12 @@ "once": "^1.4.0" } }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -9714,6 +10038,66 @@ "argparse": "^2.0.1" } }, + "js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dev": true, + "requires": { + "xmlcreate": "^2.0.4" + } + }, + "jsdoc": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", + "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^14.1.1", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "dependencies": { + "@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.25.6" + } + }, + "@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + } + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9757,6 +10141,15 @@ "universalify": "^2.0.0" } }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -9785,6 +10178,15 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "requires": { + "uc.micro": "^2.0.0" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -9794,6 +10196,12 @@ "p-locate": "^5.0.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -9827,6 +10235,39 @@ "tmpl": "1.0.5" } }, + "markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "requires": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + } + }, + "markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "dev": true, + "requires": {} + }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true + }, + "mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -9861,6 +10302,12 @@ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true }, + "minami": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minami/-/minami-1.2.3.tgz", + "integrity": "sha512-3f2QqqbUC1usVux0FkQMFYB73yd9JIxmHSn1dWQacizL6hOUaNu6mA3KxZ9SfiCc4qgcgq+5XP59+hP7URa1Dw==", + "dev": true + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -9876,6 +10323,12 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -10320,6 +10773,12 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true + }, "pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", @@ -10396,6 +10855,15 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, + "requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dev": true, + "requires": { + "lodash": "^4.17.21" + } + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -10678,6 +11146,12 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "taffydb": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", + "integrity": "sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg==", + "dev": true + }, "tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -10802,6 +11276,12 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -10814,6 +11294,12 @@ "which-boxed-primitive": "^1.0.2" } }, + "underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "dev": true + }, "undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -10952,6 +11438,12 @@ "version": "https://cdn.sheetjs.com/xlsx-0.18.10/xlsx-0.18.10.tgz", "integrity": "sha512-mY2CU0mXUT0J98ew3DfTAn9fPVjDi22LemGU0SJ6wk6kELMlAKQFNPdyBVDa+012rpCSexBYyTobv4f4Puf6qg==" }, + "xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "dev": true + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/app/package.json b/app/package.json index 76ff49e..cc70fbb 100644 --- a/app/package.json +++ b/app/package.json @@ -18,6 +18,7 @@ "minify:region": "ncc build src/scripts/by_region.js -m -o dist/region", "minify:province": "ncc build src/scripts/by_province.js -m -o dist/province", "minify:all": "npm run minify:region && npm run minify:province", + "generate-docs": "node_modules/.bin/jsdoc --configure .jsdoc.json --verbose", "lint": "eslint src __tests__ .", "lint:fix": "eslint src __tests__ . --fix", "test": "jest" @@ -40,7 +41,10 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.0.0", "jest": "^29.7.0", - "pkg": "^5.8.0" + "jsdoc": "^4.0.3", + "minami": "^1.2.3", + "pkg": "^5.8.0", + "taffydb": "^2.7.3" }, "dependencies": { "dotenv": "^16.0.1", diff --git a/app/src/classes/colorlog/index.js b/app/src/classes/colorlog/index.js index f6efb7c..4c4bab7 100644 --- a/app/src/classes/colorlog/index.js +++ b/app/src/classes/colorlog/index.js @@ -48,7 +48,7 @@ class ColorLog { * @param {Object} options - (Optional) * @param {String} options.color - ANSI color defined in `ColorLog.COLORS` * @param {Bool} options.isBold - Flag to render bold colored text - * @returns + * @returns {Bool} */ log (message, options = {}) { if (!message || typeof message !== 'string') return @@ -64,7 +64,7 @@ class ColorLog { /** * Sets the text color in console.log() * @param {String} color - ANSI color defined in `ColorLog.COLORS` - * @returns + * @returns {Bool} */ setColor (color) { if (!color) return @@ -79,7 +79,7 @@ class ColorLog { /** * Sets the text weight in console.log * @param {Bool} isBold - Flag to render bold colored text - * @returns + * @returns {Bool} */ setText (isBold) { if (![true, false].includes(isBold)) return diff --git a/app/src/classes/schema/index.js b/app/src/classes/schema/index.js index d77063a..75bb785 100644 --- a/app/src/classes/schema/index.js +++ b/app/src/classes/schema/index.js @@ -44,7 +44,7 @@ class Schema { /** * Formats error messages into a single string * @param {Object[]} errors - List of zod error messages - * @returns + * @returns {Bool} */ formatErrorLog (errors = []) { if (!Array.isArray(errors)) { From 4000ba4e0113325b358e914f2170abfe7ed216ab Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 05:09:30 +0800 Subject: [PATCH 02/69] feat: build and deploy docs to gh pages, #43 --- .github/workflows/deploy-docs.yml | 52 +++++++++++++++++++++++++++++++ scripts/build-docs.sh | 17 ++++++++++ 2 files changed, 69 insertions(+) create mode 100644 .github/workflows/deploy-docs.yml create mode 100644 scripts/build-docs.sh diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 0000000..8f25981 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,52 @@ +name: Build and Deploy Docs + +on: + push: + branches-ignore: + - master + - dev + +jobs: + build-docs: + name: Install JSDoc Dependencies + runs-on: ubuntu-latest + steps: + - name: Checkout the repository + uses: actions/checkout@v4 + + - name: Use NodeJS v16.14.2 + uses: actions/setup-node@v3 + with: + node-version: 16.14.2 + + - name: Install jsdoc and build + run: | + chmod u+x scripts/build-docs.sh + ./scripts/build-docs.sh + + - name: Archive Development Artifact + uses: actions/upload-artifact@v4 + with: + name: out + path: out/ph-municipalities/${{ env.version }} + retention-days: 3 + + deploy-client: + name: Deploy client to Github Pages + needs: lint-client + runs-on: ubuntu-latest + steps: + - name: Download Artifact + uses: actions/download-artifact@v4 + with: + name: out + + - name: List files for publish + run: ls -l -a + + - name: Deploy to Github Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./ + publish_branch: gh-pages diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh new file mode 100644 index 0000000..bd418d9 --- /dev/null +++ b/scripts/build-docs.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +cd app + +# Install jsdoc and theme +npm install --save-dev jsdoc minami taffydb + +# Generate the documentation +npm run generate-docs + +# Find and export the active version no. +filePath="app/package.json" +version=$(grep -oP '"version":\s*"\K[^"]+' "$filePath") + +# Output the version as a GitHub Actions output variable +echo "$version" >> $GITHUB_ENV +echo version: "$version" From ef23c3811e8aa58c38a6cabfcc6b7c2a2f9e23fd Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 05:13:42 +0800 Subject: [PATCH 03/69] fix: gh yml typo --- .github/workflows/deploy-docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 8f25981..bab0301 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -31,9 +31,9 @@ jobs: path: out/ph-municipalities/${{ env.version }} retention-days: 3 - deploy-client: + deploy-docs: name: Deploy client to Github Pages - needs: lint-client + needs: build-docs runs-on: ubuntu-latest steps: - name: Download Artifact From a4aab42a2998676698ca4e575ba8466bfe39b6b3 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 05:16:11 +0800 Subject: [PATCH 04/69] fix: use relative dir path --- scripts/build-docs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index bd418d9..f374e10 100644 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -9,7 +9,7 @@ npm install --save-dev jsdoc minami taffydb npm run generate-docs # Find and export the active version no. -filePath="app/package.json" +filePath="package.json" version=$(grep -oP '"version":\s*"\K[^"]+' "$filePath") # Output the version as a GitHub Actions output variable From cd4171bc4306641c833cd16cd38455d7f01e4a1e Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 05:22:02 +0800 Subject: [PATCH 05/69] fix: include hidden files in upload artifact v4 --- .github/workflows/deploy-docs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index bab0301..9b675af 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -28,6 +28,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: out + include-hidden-files: true path: out/ph-municipalities/${{ env.version }} retention-days: 3 From 8fe0d03a847c99ef9f7a5c74f589e37902f74b30 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 05:25:42 +0800 Subject: [PATCH 06/69] fix: use the /docs path --- .github/workflows/deploy-docs.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 9b675af..b8ef876 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -27,9 +27,9 @@ jobs: - name: Archive Development Artifact uses: actions/upload-artifact@v4 with: - name: out + name: docs include-hidden-files: true - path: out/ph-municipalities/${{ env.version }} + path: docs/ph-municipalities/${{ env.version }} retention-days: 3 deploy-docs: @@ -40,7 +40,7 @@ jobs: - name: Download Artifact uses: actions/download-artifact@v4 with: - name: out + name: docs - name: List files for publish run: ls -l -a From 140edb7f56c9d6b2e09d067bfbe446fb73e75f0a Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 05:27:32 +0800 Subject: [PATCH 07/69] log directory paths --- scripts/build-docs.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index f374e10..51b59c3 100644 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -15,3 +15,12 @@ version=$(grep -oP '"version":\s*"\K[^"]+' "$filePath") # Output the version as a GitHub Actions output variable echo "$version" >> $GITHUB_ENV echo version: "$version" + +# Log directories +ls -l -a + +cd docs +ls -l -a + +cd ph-municipalities +ls -l -a From bbce2919c012d2d11295153d085b09f6e81882b8 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 05:31:25 +0800 Subject: [PATCH 08/69] chore: log the nv variable --- .github/workflows/deploy-docs.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index b8ef876..fa09d36 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -24,6 +24,9 @@ jobs: chmod u+x scripts/build-docs.sh ./scripts/build-docs.sh + - name: Debug Environment Variables + run: cat $GITHUB_ENV + - name: Archive Development Artifact uses: actions/upload-artifact@v4 with: From 95058840df93be87e8c7b084597f3bb77bb87d97 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 05:49:38 +0800 Subject: [PATCH 09/69] fix: wrap gh env variable in quotes --- .github/workflows/deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index fa09d36..ce07946 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -32,7 +32,7 @@ jobs: with: name: docs include-hidden-files: true - path: docs/ph-municipalities/${{ env.version }} + path: docs/ph-municipalities/"${{ env.version }}" retention-days: 3 deploy-docs: From 77ebb70ba4dba7d11a9dfd726a1e0dbda97f9ddd Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 05:52:48 +0800 Subject: [PATCH 10/69] fix: wrap gh env variable in quotes --- .github/workflows/deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index ce07946..fa09d36 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -32,7 +32,7 @@ jobs: with: name: docs include-hidden-files: true - path: docs/ph-municipalities/"${{ env.version }}" + path: docs/ph-municipalities/${{ env.version }} retention-days: 3 deploy-docs: From c798d2ad2e19abd9765eb5b6f66970036265004d Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 16:44:32 +0800 Subject: [PATCH 11/69] chore: remove version number jsdoc build --- app/.jsdoc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/.jsdoc.json b/app/.jsdoc.json index c3143bf..0903edc 100644 --- a/app/.jsdoc.json +++ b/app/.jsdoc.json @@ -4,7 +4,7 @@ "dictionaries": ["jsdoc"] }, "source": { - "include": ["src", "package.json"], + "include": ["src"], "includePattern": ".js$", "excludePattern": "(node_modules/|docs)" }, From c027e0bd9f2afb03ff7aa789248c76578a860e7d Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 16:45:45 +0800 Subject: [PATCH 12/69] chore: commit backup of full jsdoc settings with version no. --- app/.gitignore | 1 + app/.jsdoc_full.json | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 app/.jsdoc_full.json diff --git a/app/.gitignore b/app/.gitignore index 1398766..7211668 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -12,3 +12,4 @@ docs/ !package.json !package-lock.json !.jsdoc.json +!.jsdoc_full.json diff --git a/app/.jsdoc_full.json b/app/.jsdoc_full.json new file mode 100644 index 0000000..c3143bf --- /dev/null +++ b/app/.jsdoc_full.json @@ -0,0 +1,27 @@ +{ + "tags": { + "allowUnknownTags": true, + "dictionaries": ["jsdoc"] + }, + "source": { + "include": ["src", "package.json"], + "includePattern": ".js$", + "excludePattern": "(node_modules/|docs)" + }, + "plugins": [ + "plugins/markdown" + ], + "templates": { + "cleverLinks": false, + "monospaceLinks": true, + "useLongnameInNav": false, + "showInheritedInNav": true + }, + "opts": { + "destination": "./docs/", + "encoding": "utf8", + "private": true, + "recurse": true, + "template": "./node_modules/minami" + } +} From 035e59f0ee01ccdc5dff864991b0b90a41dd1cce Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 16:52:01 +0800 Subject: [PATCH 13/69] chore: remove jsdoc devDeps * restored package*.json files from dev@79d5791 * retained the generate-docs script --- app/package-lock.json | 494 +----------------------------------------- app/package.json | 5 +- 2 files changed, 2 insertions(+), 497 deletions(-) diff --git a/app/package-lock.json b/app/package-lock.json index 35efca5..3253d26 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -21,10 +21,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.0.0", "jest": "^29.7.0", - "jsdoc": "^4.0.3", - "minami": "^1.2.3", - "pkg": "^5.8.0", - "taffydb": "^2.7.3" + "pkg": "^5.8.0" }, "engines": { "node": "16.14.2", @@ -1297,18 +1294,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsdoc/salty": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz", - "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v12.0.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1491,28 +1476,6 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "dev": true, - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true - }, "node_modules/@types/node": { "version": "22.5.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", @@ -1896,12 +1859,6 @@ "node": ">= 6" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2056,18 +2013,6 @@ } ] }, - "node_modules/catharsis": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", - "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2396,18 +2341,6 @@ "once": "^1.4.0" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -4619,82 +4552,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/js2xmlparser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", - "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", - "dev": true, - "dependencies": { - "xmlcreate": "^2.0.4" - } - }, - "node_modules/jsdoc": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", - "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.15", - "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^14.1.1", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^14.1.0", - "markdown-it-anchor": "^8.6.7", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "underscore": "~1.13.2" - }, - "bin": { - "jsdoc": "jsdoc.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdoc/node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/jsdoc/node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jsdoc/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -4749,15 +4606,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.9" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -4795,15 +4643,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "dependencies": { - "uc.micro": "^2.0.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -4819,12 +4658,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4867,51 +4700,6 @@ "tmpl": "1.0.5" } }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdown-it-anchor": { - "version": "8.6.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", - "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "dev": true, - "peerDependencies": { - "@types/markdown-it": "*", - "markdown-it": "*" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4961,12 +4749,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minami": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/minami/-/minami-1.2.3.tgz", - "integrity": "sha512-3f2QqqbUC1usVux0FkQMFYB73yd9JIxmHSn1dWQacizL6hOUaNu6mA3KxZ9SfiCc4qgcgq+5XP59+hP7URa1Dw==", - "dev": true - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4985,18 +4767,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -5610,15 +5380,6 @@ "node": ">=6" } }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", @@ -5738,15 +5499,6 @@ "node": ">=0.10.0" } }, - "node_modules/requizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", - "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -6158,12 +5910,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/taffydb": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", - "integrity": "sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg==", - "dev": true - }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -6316,12 +6062,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -6337,12 +6077,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/underscore": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", - "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", - "dev": true - }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -6536,12 +6270,6 @@ "node": ">=0.8" } }, - "node_modules/xmlcreate": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", - "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "dev": true - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -7575,15 +7303,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@jsdoc/salty": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.8.tgz", - "integrity": "sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7749,28 +7468,6 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true - }, - "@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "dev": true, - "requires": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true - }, "@types/node": { "version": "22.5.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.0.tgz", @@ -8056,12 +7753,6 @@ } } }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8156,15 +7847,6 @@ "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", "dev": true }, - "catharsis": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", - "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8402,12 +8084,6 @@ "once": "^1.4.0" } }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -10038,66 +9714,6 @@ "argparse": "^2.0.1" } }, - "js2xmlparser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", - "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", - "dev": true, - "requires": { - "xmlcreate": "^2.0.4" - } - }, - "jsdoc": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.3.tgz", - "integrity": "sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.15", - "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^14.1.1", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^14.1.0", - "markdown-it-anchor": "^8.6.7", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "underscore": "~1.13.2" - }, - "dependencies": { - "@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.25.6" - } - }, - "@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - } - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -10141,15 +9757,6 @@ "universalify": "^2.0.0" } }, - "klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -10178,15 +9785,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "requires": { - "uc.micro": "^2.0.0" - } - }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -10196,12 +9794,6 @@ "p-locate": "^5.0.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -10235,39 +9827,6 @@ "tmpl": "1.0.5" } }, - "markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "requires": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - } - }, - "markdown-it-anchor": { - "version": "8.6.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", - "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", - "dev": true, - "requires": {} - }, - "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true - }, - "mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true - }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -10302,12 +9861,6 @@ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true }, - "minami": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/minami/-/minami-1.2.3.tgz", - "integrity": "sha512-3f2QqqbUC1usVux0FkQMFYB73yd9JIxmHSn1dWQacizL6hOUaNu6mA3KxZ9SfiCc4qgcgq+5XP59+hP7URa1Dw==", - "dev": true - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -10323,12 +9876,6 @@ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -10773,12 +10320,6 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true - }, "pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", @@ -10855,15 +10396,6 @@ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true }, - "requizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", - "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -11146,12 +10678,6 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, - "taffydb": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.7.3.tgz", - "integrity": "sha512-GQ3gtYFSOAxSMN/apGtDKKkbJf+8izz5YfbGqIsUc7AMiQOapARZ76dhilRY2h39cynYxBFdafQo5HUL5vgkrg==", - "dev": true - }, "tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -11276,12 +10802,6 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, - "uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, "unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -11294,12 +10814,6 @@ "which-boxed-primitive": "^1.0.2" } }, - "underscore": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", - "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", - "dev": true - }, "undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -11438,12 +10952,6 @@ "version": "https://cdn.sheetjs.com/xlsx-0.18.10/xlsx-0.18.10.tgz", "integrity": "sha512-mY2CU0mXUT0J98ew3DfTAn9fPVjDi22LemGU0SJ6wk6kELMlAKQFNPdyBVDa+012rpCSexBYyTobv4f4Puf6qg==" }, - "xmlcreate": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", - "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", - "dev": true - }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/app/package.json b/app/package.json index cc70fbb..978ef1b 100644 --- a/app/package.json +++ b/app/package.json @@ -41,10 +41,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^6.0.0", "jest": "^29.7.0", - "jsdoc": "^4.0.3", - "minami": "^1.2.3", - "pkg": "^5.8.0", - "taffydb": "^2.7.3" + "pkg": "^5.8.0" }, "dependencies": { "dotenv": "^16.0.1", From fccaef24b275ea17ad53647802e82ca4a5942fea Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 16:53:01 +0800 Subject: [PATCH 14/69] chore: update README - add generate-docs to available scripts --- README.md | 12 ++++++++++++ scripts/build-docs.sh | 21 +++++++-------------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 9551adc..acd6fde 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,18 @@ npm run list:region - Downloads and parses a remote excel file. - Demonstrates sample usage with `await` +### `npm run generate-docs` + +Builds the class documentation into the **/docs** directory. + +> [!NOTE] +> This script requires manual installation of the `jsdoc@4.0.3`, `minami@1.2.3`, and `taffydb@2.7.3` packages as **devDependencies**. +> These libraries, only used for building the class documentation, were excluded from the final package.json to have fewer external dependencies. +> ```bash +> npm install --save-dev jsdoc@4.0.3 minami@1.2.3 taffydb@2.7.3 +> ``` +> Installing these libraries will update the `package.json` and `package-lock.json` files. Take care not to push changes caused by installation. + --- ### `build:win:region` diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index 51b59c3..2e3b1ab 100644 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -3,24 +3,17 @@ cd app # Install jsdoc and theme -npm install --save-dev jsdoc minami taffydb +npm install --save-dev jsdoc@4.0.3 minami@1.2.3 taffydb@2.7.3 # Generate the documentation npm run generate-docs # Find and export the active version no. -filePath="package.json" -version=$(grep -oP '"version":\s*"\K[^"]+' "$filePath") +# filePath="package.json" +# version=$(grep -oP '"version":\s*"\K[^"]+' "$filePath") -# Output the version as a GitHub Actions output variable -echo "$version" >> $GITHUB_ENV -echo version: "$version" +# Export the version as a GitHub Actions output variable +# Accessible in the GH Actions steps as: ${{ env.version }} -# Log directories -ls -l -a - -cd docs -ls -l -a - -cd ph-municipalities -ls -l -a +# echo "$version" >> $GITHUB_ENV +# echo version: "$version" From 4c5cdca64820c4426e8bc879b3b17af193c36663 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 16:55:05 +0800 Subject: [PATCH 15/69] fix: update gh upload artifacts path --- .github/workflows/deploy-docs.yml | 2 +- .github/workflows/test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index fa09d36..087fa36 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -32,7 +32,7 @@ jobs: with: name: docs include-hidden-files: true - path: docs/ph-municipalities/${{ env.version }} + path: docs retention-days: 3 deploy-docs: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a588612..9f0bada 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,4 +1,4 @@ -name: Lint Files +name: Lint and Test on: push: From 98b3d4c5fbd0c03a2c8cf41792cd276b0d10cd92 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 16:59:50 +0800 Subject: [PATCH 16/69] fix: docs/ path; log output --- .github/workflows/deploy-docs.yml | 4 ++-- scripts/build-docs.sh | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 087fa36..e14e88a 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -8,7 +8,7 @@ on: jobs: build-docs: - name: Install JSDoc Dependencies + name: Build Class Documentation runs-on: ubuntu-latest steps: - name: Checkout the repository @@ -32,7 +32,7 @@ jobs: with: name: docs include-hidden-files: true - path: docs + path: docs/ retention-days: 3 deploy-docs: diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index 2e3b1ab..462af3e 100644 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -17,3 +17,9 @@ npm run generate-docs # echo "$version" >> $GITHUB_ENV # echo version: "$version" + +# Log directories +ls -l -a + +cd docs +ls -l -a From 32ee5241c6fd1cd020cebb5f4ff01218c3067589 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 17:03:00 +0800 Subject: [PATCH 17/69] fix: use jsdoc-generated docs/ path --- .github/workflows/deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index e14e88a..e6d3515 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -32,7 +32,7 @@ jobs: with: name: docs include-hidden-files: true - path: docs/ + path: app/docs/ retention-days: 3 deploy-docs: From 29895edc7191e5eb04e7a8bdb3e42325404c5dd1 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 17:47:15 +0800 Subject: [PATCH 18/69] chore: include README in docs build --- scripts/build-docs.sh | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index 462af3e..1d0f425 100644 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -1,5 +1,9 @@ #!/bin/bash +# Copy files +cp README.md app/ +cp docs/ app/ + cd app # Install jsdoc and theme @@ -8,6 +12,12 @@ npm install --save-dev jsdoc@4.0.3 minami@1.2.3 taffydb@2.7.3 # Generate the documentation npm run generate-docs +# Log directories +ls -l -a + +cd docs +ls -l -a + # Find and export the active version no. # filePath="package.json" # version=$(grep -oP '"version":\s*"\K[^"]+' "$filePath") @@ -17,9 +27,3 @@ npm run generate-docs # echo "$version" >> $GITHUB_ENV # echo version: "$version" - -# Log directories -ls -l -a - -cd docs -ls -l -a From 5731bed2dd89256afe1701a85690c3f0a91fc4aa Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 17:49:09 +0800 Subject: [PATCH 19/69] chore: include README in docs build - follow-up --- .github/workflows/deploy-docs.yml | 5 +---- README.md | 4 ++-- app/.gitignore | 5 +++-- app/.jsdoc.json | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index e6d3515..394ca5f 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -24,9 +24,6 @@ jobs: chmod u+x scripts/build-docs.sh ./scripts/build-docs.sh - - name: Debug Environment Variables - run: cat $GITHUB_ENV - - name: Archive Development Artifact uses: actions/upload-artifact@v4 with: @@ -36,7 +33,7 @@ jobs: retention-days: 3 deploy-docs: - name: Deploy client to Github Pages + name: Deploy docs to Github Pages needs: build-docs runs-on: ubuntu-latest steps: diff --git a/README.md b/README.md index acd6fde..ff19048 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ The following dependencies are used for this project. Feel free to use other dep - [`npm start` / `npm run list:region`](#npm-start--npm-run-listregion) - [`npm run list:province`](#npm-run-listprovince) - [`npm run example`](#npm-run-example) + - [`npm run generate-docs`](#npm-run-generate-docs) - [`build:win:region`](#buildwinregion) - [`build:win:province`](#buildwinprovince) - [`build:win:all`](#buildwinall) @@ -189,8 +190,7 @@ npm run list:region Builds the class documentation into the **/docs** directory. > [!NOTE] -> This script requires manual installation of the `jsdoc@4.0.3`, `minami@1.2.3`, and `taffydb@2.7.3` packages as **devDependencies**. -> These libraries, only used for building the class documentation, were excluded from the final package.json to have fewer external dependencies. +> This script requires manual installation of the `jsdoc@4.0.3`, `minami@1.2.3`, and `taffydb@2.7.3` packages as **devDependencies** inside the **/app** directory > These libraries, only used for building the class documentation, were excluded from the final package.json to have fewer external dependencies. > ```bash > npm install --save-dev jsdoc@4.0.3 minami@1.2.3 taffydb@2.7.3 > ``` diff --git a/app/.gitignore b/app/.gitignore index 7211668..737d8a5 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1,12 +1,13 @@ node_modules/ +dist/ +docs/ +README.md .env .vscode *.xlsx *.json *.zip *.tgz -dist/ -docs/ # Ignore all JSON files except: !package.json diff --git a/app/.jsdoc.json b/app/.jsdoc.json index 0903edc..d79859a 100644 --- a/app/.jsdoc.json +++ b/app/.jsdoc.json @@ -4,7 +4,7 @@ "dictionaries": ["jsdoc"] }, "source": { - "include": ["src"], + "include": ["src", "README.md"], "includePattern": ".js$", "excludePattern": "(node_modules/|docs)" }, From 42378d104566fcfa0a8c7d9e5a91593027a3dc89 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 17:55:02 +0800 Subject: [PATCH 20/69] fix: broken diagram URL link --- scripts/build-docs.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index 1d0f425..79569ff 100644 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -1,8 +1,8 @@ #!/bin/bash # Copy files -cp README.md app/ -cp docs/ app/ +cp -r docs/ app/ +sed "s|/docs/diagrams|/diagrams|g" README.md > app/README.md cd app From d8613eb5f4433da6b918e6de61c8b898f3ba114b Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 18:04:27 +0800 Subject: [PATCH 21/69] fix: use gh-pages root directory path for diagram --- app/.gitignore | 1 + scripts/build-docs.sh | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/.gitignore b/app/.gitignore index 737d8a5..4f597bb 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -8,6 +8,7 @@ README.md *.json *.zip *.tgz +*.png # Ignore all JSON files except: !package.json diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index 79569ff..c72a305 100644 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -1,8 +1,8 @@ #!/bin/bash # Copy files -cp -r docs/ app/ -sed "s|/docs/diagrams|/diagrams|g" README.md > app/README.md +cp docs/diagrams/*.png app/ +sed "s|/docs/diagrams|/ph-municipalities|g" README.md > app/README.md cd app From a8ec1ef2e2f0d45a5b4da495782efae05784cb6d Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 18:10:15 +0800 Subject: [PATCH 22/69] fix: include arch diagram in jsdoc config --- app/.jsdoc.json | 2 +- app/.jsdoc_full.json | 2 +- scripts/build-docs.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/.jsdoc.json b/app/.jsdoc.json index d79859a..3f82c24 100644 --- a/app/.jsdoc.json +++ b/app/.jsdoc.json @@ -4,7 +4,7 @@ "dictionaries": ["jsdoc"] }, "source": { - "include": ["src", "README.md"], + "include": ["src", "README.md", "diagram.png"], "includePattern": ".js$", "excludePattern": "(node_modules/|docs)" }, diff --git a/app/.jsdoc_full.json b/app/.jsdoc_full.json index c3143bf..3f82c24 100644 --- a/app/.jsdoc_full.json +++ b/app/.jsdoc_full.json @@ -4,7 +4,7 @@ "dictionaries": ["jsdoc"] }, "source": { - "include": ["src", "package.json"], + "include": ["src", "README.md", "diagram.png"], "includePattern": ".js$", "excludePattern": "(node_modules/|docs)" }, diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index c72a305..87218c4 100644 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -1,7 +1,7 @@ #!/bin/bash # Copy files -cp docs/diagrams/*.png app/ +cp docs/diagrams/ph-municipalities-arch-90.png app/diagram.png sed "s|/docs/diagrams|/ph-municipalities|g" README.md > app/README.md cd app From 4cf5db45b0d7ff99d3f7933d58552047f5aa4c28 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 18:12:41 +0800 Subject: [PATCH 23/69] fix: docs diagram file name --- scripts/build-docs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index 87218c4..7edbf11 100644 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -2,7 +2,7 @@ # Copy files cp docs/diagrams/ph-municipalities-arch-90.png app/diagram.png -sed "s|/docs/diagrams|/ph-municipalities|g" README.md > app/README.md +sed "s|/docs/diagrams/ph-municipalities-arch-90.png|/ph-municipalities/diagram.png|g" README.md > app/README.md cd app From 4b747aef7768e2e81e0cc56f278fe24f23228271 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 18:32:39 +0800 Subject: [PATCH 24/69] fix: copy diagram after docs build --- scripts/build-docs.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index 7edbf11..2f56701 100644 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -1,9 +1,7 @@ #!/bin/bash -# Copy files -cp docs/diagrams/ph-municipalities-arch-90.png app/diagram.png +# Copy README file sed "s|/docs/diagrams/ph-municipalities-arch-90.png|/ph-municipalities/diagram.png|g" README.md > app/README.md - cd app # Install jsdoc and theme @@ -12,6 +10,9 @@ npm install --save-dev jsdoc@4.0.3 minami@1.2.3 taffydb@2.7.3 # Generate the documentation npm run generate-docs +# Copy picture files +cp docs/diagrams/ph-municipalities-arch-90.png app/docs/diagram.png + # Log directories ls -l -a From c7e4684589dd31e8e4b62593eb368c5e19a710dd Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 18:37:46 +0800 Subject: [PATCH 25/69] fix: create /docs dir and copy diagram --- scripts/build-docs.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/build-docs.sh b/scripts/build-docs.sh index 2f56701..92955bb 100644 --- a/scripts/build-docs.sh +++ b/scripts/build-docs.sh @@ -1,5 +1,9 @@ #!/bin/bash +# Copy picture files +mkdir app/docs +cp docs/diagrams/ph-municipalities-arch-90.png app/docs/diagram.png + # Copy README file sed "s|/docs/diagrams/ph-municipalities-arch-90.png|/ph-municipalities/diagram.png|g" README.md > app/README.md cd app @@ -10,9 +14,6 @@ npm install --save-dev jsdoc@4.0.3 minami@1.2.3 taffydb@2.7.3 # Generate the documentation npm run generate-docs -# Copy picture files -cp docs/diagrams/ph-municipalities-arch-90.png app/docs/diagram.png - # Log directories ls -l -a From af8b6f0c58212b043fb59c5bac47ca2ad4a949c8 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 18:49:23 +0800 Subject: [PATCH 26/69] wip: remove node_modules/.bin in generate-docs script --- app/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/package.json b/app/package.json index 978ef1b..9d43b0d 100644 --- a/app/package.json +++ b/app/package.json @@ -18,7 +18,7 @@ "minify:region": "ncc build src/scripts/by_region.js -m -o dist/region", "minify:province": "ncc build src/scripts/by_province.js -m -o dist/province", "minify:all": "npm run minify:region && npm run minify:province", - "generate-docs": "node_modules/.bin/jsdoc --configure .jsdoc.json --verbose", + "generate-docs": "jsdoc --configure .jsdoc.json --verbose", "lint": "eslint src __tests__ .", "lint:fix": "eslint src __tests__ . --fix", "test": "jest" From 1f7e144fb1510ab485b1309e70fe6d07463c9a5e Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 18:53:47 +0800 Subject: [PATCH 27/69] wip: remove picture asset in jsdoc config --- app/.jsdoc.json | 2 +- app/.jsdoc_full.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/.jsdoc.json b/app/.jsdoc.json index 3f82c24..d79859a 100644 --- a/app/.jsdoc.json +++ b/app/.jsdoc.json @@ -4,7 +4,7 @@ "dictionaries": ["jsdoc"] }, "source": { - "include": ["src", "README.md", "diagram.png"], + "include": ["src", "README.md"], "includePattern": ".js$", "excludePattern": "(node_modules/|docs)" }, diff --git a/app/.jsdoc_full.json b/app/.jsdoc_full.json index 3f82c24..d79859a 100644 --- a/app/.jsdoc_full.json +++ b/app/.jsdoc_full.json @@ -4,7 +4,7 @@ "dictionaries": ["jsdoc"] }, "source": { - "include": ["src", "README.md", "diagram.png"], + "include": ["src", "README.md"], "includePattern": ".js$", "excludePattern": "(node_modules/|docs)" }, From 8f3ac21d7ee8c3e0d0e85f3e216ce8a39e7224fd Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 20:32:49 +0800 Subject: [PATCH 28/69] chore: install jsdoc deps from script --- app/package.json | 3 ++- scripts/local-docs-install | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 scripts/local-docs-install diff --git a/app/package.json b/app/package.json index 9d43b0d..8e5ede4 100644 --- a/app/package.json +++ b/app/package.json @@ -18,7 +18,8 @@ "minify:region": "ncc build src/scripts/by_region.js -m -o dist/region", "minify:province": "ncc build src/scripts/by_province.js -m -o dist/province", "minify:all": "npm run minify:region && npm run minify:province", - "generate-docs": "jsdoc --configure .jsdoc.json --verbose", + "local:docs:install": "./scripts/local-docs-install", + "generate-docs": "npm run local:docs:install && jsdoc --configure .jsdoc.json --verbose", "lint": "eslint src __tests__ .", "lint:fix": "eslint src __tests__ . --fix", "test": "jest" diff --git a/scripts/local-docs-install b/scripts/local-docs-install new file mode 100644 index 0000000..194fb9e --- /dev/null +++ b/scripts/local-docs-install @@ -0,0 +1,2 @@ +# Install JSDoc and theme dependencies +npm install --save-dev jsdoc@4.0.3 minami@1.2.3 taffydb@2.7.3 From ee42deca6423aede00b1bacefbae346381b28deb Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 20:43:01 +0800 Subject: [PATCH 29/69] chore: install jsdoc from script --- .github/workflows/deploy-docs.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 394ca5f..80ab4d1 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -21,8 +21,10 @@ jobs: - name: Install jsdoc and build run: | - chmod u+x scripts/build-docs.sh - ./scripts/build-docs.sh + ./scripts/local-docs-install + cd app && npm run generate-docs + # chmod u+x scripts/build-docs.sh + # ./scripts/build-docs.sh - name: Archive Development Artifact uses: actions/upload-artifact@v4 From 1186f3100497e500ec4d66f4688b0f5fc8f96a2e Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 20:44:23 +0800 Subject: [PATCH 30/69] fix: bash script permission --- .github/workflows/deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 80ab4d1..b3ea770 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -21,7 +21,7 @@ jobs: - name: Install jsdoc and build run: | - ./scripts/local-docs-install + chmod u+x scripts/local-docs-install && ./scripts/local-docs-install cd app && npm run generate-docs # chmod u+x scripts/build-docs.sh # ./scripts/build-docs.sh From 20477de9af19be2ea1cf216dea877fd4d135bf66 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 21:17:12 +0800 Subject: [PATCH 31/69] chore: build docs from bash scripts, #43 --- .github/workflows/deploy-docs.yml | 6 ++---- app/package.json | 5 +++-- scripts/{build-docs.sh => docs-build-gh.sh} | 0 scripts/{local-docs-install => docs-install.sh} | 0 4 files changed, 5 insertions(+), 6 deletions(-) rename scripts/{build-docs.sh => docs-build-gh.sh} (100%) rename scripts/{local-docs-install => docs-install.sh} (100%) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index b3ea770..12eb01d 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -21,10 +21,8 @@ jobs: - name: Install jsdoc and build run: | - chmod u+x scripts/local-docs-install && ./scripts/local-docs-install - cd app && npm run generate-docs - # chmod u+x scripts/build-docs.sh - # ./scripts/build-docs.sh + chmod u+x scripts/docs-install.sh && ./scripts/docs-install.sh + chmod u+x scripts/docs-build-gh.sh && ./scripts/docs-build-gh.sh - name: Archive Development Artifact uses: actions/upload-artifact@v4 diff --git a/app/package.json b/app/package.json index 8e5ede4..f26c332 100644 --- a/app/package.json +++ b/app/package.json @@ -18,8 +18,9 @@ "minify:region": "ncc build src/scripts/by_region.js -m -o dist/region", "minify:province": "ncc build src/scripts/by_province.js -m -o dist/province", "minify:all": "npm run minify:region && npm run minify:province", - "local:docs:install": "./scripts/local-docs-install", - "generate-docs": "npm run local:docs:install && jsdoc --configure .jsdoc.json --verbose", + "docs:install": "./scripts/docs-install.sh", + "docs:build": "./scripts/local-docs-build.sh", + "generate-docs": "jsdoc --configure .jsdoc.json --verbose", "lint": "eslint src __tests__ .", "lint:fix": "eslint src __tests__ . --fix", "test": "jest" diff --git a/scripts/build-docs.sh b/scripts/docs-build-gh.sh similarity index 100% rename from scripts/build-docs.sh rename to scripts/docs-build-gh.sh diff --git a/scripts/local-docs-install b/scripts/docs-install.sh similarity index 100% rename from scripts/local-docs-install rename to scripts/docs-install.sh From 7e11147c70ba5137ec30fa811a4e3b23ac28df74 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 21:18:16 +0800 Subject: [PATCH 32/69] chore: remove jsdoc install; update comments --- scripts/docs-build-gh.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/docs-build-gh.sh b/scripts/docs-build-gh.sh index 92955bb..5092c6b 100644 --- a/scripts/docs-build-gh.sh +++ b/scripts/docs-build-gh.sh @@ -1,5 +1,8 @@ #!/bin/bash +# NOTE: This script requires JSDoc and theme dependencies. +# Run docs-install first before running this script. + # Copy picture files mkdir app/docs cp docs/diagrams/ph-municipalities-arch-90.png app/docs/diagram.png @@ -8,9 +11,6 @@ cp docs/diagrams/ph-municipalities-arch-90.png app/docs/diagram.png sed "s|/docs/diagrams/ph-municipalities-arch-90.png|/ph-municipalities/diagram.png|g" README.md > app/README.md cd app -# Install jsdoc and theme -npm install --save-dev jsdoc@4.0.3 minami@1.2.3 taffydb@2.7.3 - # Generate the documentation npm run generate-docs From c43c263b056f97ff4e0f93f79f90f3264d64e18b Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 21:52:39 +0800 Subject: [PATCH 33/69] docs: update README * add notes for using the docs:install NPM script * add notes for using the docs:build NPM script * add notes for building the class documentation --- README.md | 57 ++++++++++++++++++++++++++++++++++++++++ app/.gitignore | 2 ++ app/package.json | 2 +- docker-compose.dev.yml | 3 +++ scripts/docs-build-gh.sh | 3 ++- scripts/docs-build.sh | 13 +++++++++ 6 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 scripts/docs-build.sh diff --git a/README.md b/README.md index ff19048..1e11a00 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,8 @@ The following dependencies are used for this project. Feel free to use other dep - [`npm run list:province`](#npm-run-listprovince) - [`npm run example`](#npm-run-example) - [`npm run generate-docs`](#npm-run-generate-docs) + - [`npm run docs:install`](#npm-run-docs-install) + - [`npm run docs:build`](#npm-run-docs-build) - [`build:win:region`](#buildwinregion) - [`build:win:province`](#buildwinprovince) - [`build:win:all`](#buildwinall) @@ -82,6 +84,9 @@ The following dependencies are used for this project. Feel free to use other dep - [Using a Custom Configuration File](#using-a-custom-configuration-file) - [Building Standalone Windows Executables](#building-standalone-windows-executables) - [Compiling into Single, Minified Files](#compiling-into-single-minified-files) +- [Building the Class Documentation](#building-the-class-documentation) + - [Using NodeJS](#using-nodejs) + - [Using Docker](#using-docker) - [Troubleshooting](#troubleshooting) ## Installation @@ -185,6 +190,8 @@ npm run list:region - Downloads and parses a remote excel file. - Demonstrates sample usage with `await` +--- + ### `npm run generate-docs` Builds the class documentation into the **/docs** directory. @@ -196,6 +203,34 @@ Builds the class documentation into the **/docs** directory. > ``` > Installing these libraries will update the `package.json` and `package-lock.json` files. Take care not to push changes caused by installation. +### `npm run docs:install` + +Runs the Bash script that installs the JSDoc and theme dependencies for building the class documentation. + +> [!NOTE] +> This script requires running from a Bash terminal: it won't work from a Windows command line terminal. + +This script is used for building the class documentation from a local Docker environment along with the `npm run docs:build` NPM script. + +```bash +docker exec -u root -it ph-municipalities npm run docs:install +docker exec -u root -it ph-municipalities npm run docs:build +``` + +### `npm run docs:build` + +Runs the Bash script that builds the class documentation using JSDoc. + +> [!NOTE] +> This script requires running from a Bash terminal: it won't work from a Windows command line terminal. + +This script is used for building the class documentation from a local Docker environment along with the `npm run docs:install` NPM script. + +```bash +docker exec -u root -it ph-municipalities npm run docs:install +docker exec -u root -it ph-municipalities npm run docs:build +``` + --- ### `build:win:region` @@ -498,6 +533,28 @@ The main npm scripts can be compiled into standalone JavaScript files together w node dist/province ``` +## Building the Class Documentation + +There are two (2) options for building the class documentation. + +### Using NodeJS + +Install the dependencies for JSDoc. Refer to the [**`npm run generate-docs`**](#npm-run-generate-docs) Script usage for more information. + +### Using Docker + +1. Run docker for localhost development. Refer to the [Docker for Localhost Development](#docker-for-localhost-development) section for more information. + +2. Install the dependencies for JSDoc. Suceeding builds will not need to install dependencies after an initial installation. Refer to the [**npm run docs:install**](#npm-run-docs-install) script usage for more information.
+ ```bash + npm run docs:install + ``` + +3. Build the documentation. Refer to the [**npm run docs:build**](#npm-run-docs-build) script usage for more information.
+ ```bash + npm run docs:build + ``` + ## Troubleshooting This section describes several common errors and related fixes. diff --git a/app/.gitignore b/app/.gitignore index 4f597bb..1bcd219 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -2,6 +2,7 @@ node_modules/ dist/ docs/ README.md +README.tmp .env .vscode *.xlsx @@ -9,6 +10,7 @@ README.md *.zip *.tgz *.png +*.sh # Ignore all JSON files except: !package.json diff --git a/app/package.json b/app/package.json index f26c332..2af03bf 100644 --- a/app/package.json +++ b/app/package.json @@ -19,7 +19,7 @@ "minify:province": "ncc build src/scripts/by_province.js -m -o dist/province", "minify:all": "npm run minify:region && npm run minify:province", "docs:install": "./scripts/docs-install.sh", - "docs:build": "./scripts/local-docs-build.sh", + "docs:build": "./scripts/docs-build.sh", "generate-docs": "jsdoc --configure .jsdoc.json --verbose", "lint": "eslint src __tests__ .", "lint:fix": "eslint src __tests__ . --fix", diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 60dc99e..7385d05 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -12,6 +12,9 @@ services: - ph-municipalities volumes: - ./app:/opt/app + - ./scripts:/opt/app/scripts + - ./docs/diagrams:/opt/app/diagrams + - ./README.md:/opt/app/README.tmp - /opt/app/node_modules stdin_open: true tty: true diff --git a/scripts/docs-build-gh.sh b/scripts/docs-build-gh.sh index 5092c6b..533c9ac 100644 --- a/scripts/docs-build-gh.sh +++ b/scripts/docs-build-gh.sh @@ -1,6 +1,7 @@ #!/bin/bash -# NOTE: This script requires JSDoc and theme dependencies. +# This script builds the class docs for GH Pages deployment, run from the repo root directory. +# NOTE: It requires JSDoc and theme dependencies. # Run docs-install first before running this script. # Copy picture files diff --git a/scripts/docs-build.sh b/scripts/docs-build.sh new file mode 100644 index 0000000..6c066db --- /dev/null +++ b/scripts/docs-build.sh @@ -0,0 +1,13 @@ +# This script builds the class documentation from a Docker environment. +# NOTE: It requires assets from the root directory mounted as volumes. +# Run docs-install first before running this script. + +# Copy picture files +mkdir docs +cp diagrams/ph-municipalities-arch-90.png docs/diagram.png + +# Copy README file +sed "s|/docs/diagrams/ph-municipalities-arch-90.png|diagram.png|g" README.tmp > README.md + +# Generate the documentation +npm run generate-docs From a99cc8ede140b0cbfc50d261da9ea6d56e4fee1a Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 21:55:20 +0800 Subject: [PATCH 34/69] fix: broken internal URL links --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1e11a00..5596475 100644 --- a/README.md +++ b/README.md @@ -66,8 +66,8 @@ The following dependencies are used for this project. Feel free to use other dep - [`npm run list:province`](#npm-run-listprovince) - [`npm run example`](#npm-run-example) - [`npm run generate-docs`](#npm-run-generate-docs) - - [`npm run docs:install`](#npm-run-docs-install) - - [`npm run docs:build`](#npm-run-docs-build) + - [`npm run docs:install`](#npm-run-docsinstall) + - [`npm run docs:build`](#npm-run-docsbuild) - [`build:win:region`](#buildwinregion) - [`build:win:province`](#buildwinprovince) - [`build:win:all`](#buildwinall) @@ -545,12 +545,12 @@ Install the dependencies for JSDoc. Refer to the [**`npm run generate-docs`**](# 1. Run docker for localhost development. Refer to the [Docker for Localhost Development](#docker-for-localhost-development) section for more information. -2. Install the dependencies for JSDoc. Suceeding builds will not need to install dependencies after an initial installation. Refer to the [**npm run docs:install**](#npm-run-docs-install) script usage for more information.
+2. Install the dependencies for JSDoc. Suceeding builds will not need to install dependencies after an initial installation. Refer to the [**npm run docs:install**](#npm-run-docsinstall) script usage for more information.
```bash npm run docs:install ``` -3. Build the documentation. Refer to the [**npm run docs:build**](#npm-run-docs-build) script usage for more information.
+3. Build the documentation. Refer to the [**npm run docs:build**](#npm-run-docsbuild) script usage for more information.
```bash npm run docs:build ``` From c379b74b90a0715eaee76632521ecc4079ac2fc9 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 21:58:52 +0800 Subject: [PATCH 35/69] fix: move back to the root dir after docs build --- scripts/docs-build-gh.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/docs-build-gh.sh b/scripts/docs-build-gh.sh index 533c9ac..a1647cf 100644 --- a/scripts/docs-build-gh.sh +++ b/scripts/docs-build-gh.sh @@ -21,6 +21,9 @@ ls -l -a cd docs ls -l -a +# Return to the root directory +cd .. + # Find and export the active version no. # filePath="package.json" # version=$(grep -oP '"version":\s*"\K[^"]+' "$filePath") From 6f026d738d64ae367c8a5717fe6122578f7708ce Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 22:34:16 +0800 Subject: [PATCH 36/69] fix: docs build paths --- .github/workflows/deploy-docs.yml | 3 ++- scripts/docs-build-gh.sh | 11 ++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 12eb01d..745402b 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -21,8 +21,9 @@ jobs: - name: Install jsdoc and build run: | - chmod u+x scripts/docs-install.sh && ./scripts/docs-install.sh chmod u+x scripts/docs-build-gh.sh && ./scripts/docs-build-gh.sh + cd app && ./docs-install.sh + npm run generate-docs - name: Archive Development Artifact uses: actions/upload-artifact@v4 diff --git a/scripts/docs-build-gh.sh b/scripts/docs-build-gh.sh index a1647cf..16a3998 100644 --- a/scripts/docs-build-gh.sh +++ b/scripts/docs-build-gh.sh @@ -4,26 +4,23 @@ # NOTE: It requires JSDoc and theme dependencies. # Run docs-install first before running this script. -# Copy picture files +# Copy build files mkdir app/docs cp docs/diagrams/ph-municipalities-arch-90.png app/docs/diagram.png +chmod u+x scripts/docs-install.sh +cp scripts/docs-install.sh app/ + # Copy README file sed "s|/docs/diagrams/ph-municipalities-arch-90.png|/ph-municipalities/diagram.png|g" README.md > app/README.md cd app -# Generate the documentation -npm run generate-docs - # Log directories ls -l -a cd docs ls -l -a -# Return to the root directory -cd .. - # Find and export the active version no. # filePath="package.json" # version=$(grep -oP '"version":\s*"\K[^"]+' "$filePath") From 3a60d531be3ed975a1f7d5b19e60ce87c7a85607 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 22:39:36 +0800 Subject: [PATCH 37/69] chore: log output --- .github/workflows/deploy-docs.yml | 3 +++ scripts/docs-build-gh.sh | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 745402b..8f755d1 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -24,6 +24,9 @@ jobs: chmod u+x scripts/docs-build-gh.sh && ./scripts/docs-build-gh.sh cd app && ./docs-install.sh npm run generate-docs + ls -l -a + cd docs + ls -l -a - name: Archive Development Artifact uses: actions/upload-artifact@v4 diff --git a/scripts/docs-build-gh.sh b/scripts/docs-build-gh.sh index 16a3998..bb507c2 100644 --- a/scripts/docs-build-gh.sh +++ b/scripts/docs-build-gh.sh @@ -18,9 +18,6 @@ cd app # Log directories ls -l -a -cd docs -ls -l -a - # Find and export the active version no. # filePath="package.json" # version=$(grep -oP '"version":\s*"\K[^"]+' "$filePath") From 9eb817ace40cf7fe97e552c19d861cc2d0a9363e Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 22:45:20 +0800 Subject: [PATCH 38/69] wip: permissions --- .github/workflows/deploy-docs.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 8f755d1..a1c44da 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -22,7 +22,8 @@ jobs: - name: Install jsdoc and build run: | chmod u+x scripts/docs-build-gh.sh && ./scripts/docs-build-gh.sh - cd app && ./docs-install.sh + cd app + chmod u+x docs-build-gh.sh && ./docs-install.sh npm run generate-docs ls -l -a cd docs From 818a7f941e75664c1f5f4a52c825bb2fd9669c27 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 22:48:18 +0800 Subject: [PATCH 39/69] fix: typo --- .github/workflows/deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index a1c44da..eb8923c 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -23,7 +23,7 @@ jobs: run: | chmod u+x scripts/docs-build-gh.sh && ./scripts/docs-build-gh.sh cd app - chmod u+x docs-build-gh.sh && ./docs-install.sh + chmod u+x docs-install.sh && ./docs-install.sh npm run generate-docs ls -l -a cd docs From ed7e8ce0498ee1f61577b687f321c726cff76ab2 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 22:51:00 +0800 Subject: [PATCH 40/69] chore: add return type doc --- app/src/classes/excel/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/classes/excel/index.js b/app/src/classes/excel/index.js index 0ff5c57..77d5afc 100644 --- a/app/src/classes/excel/index.js +++ b/app/src/classes/excel/index.js @@ -243,7 +243,7 @@ class ExcelFile { /** * Sets the local this.#options settings * @param {Object} options - Miscellaneous app settings defined in this.#options - * @returns + * @returns {Bool} */ setOptions (options) { if (!options) return false From 8810f445b48a38964c0067a726147c88f5acb5dc Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 22:53:19 +0800 Subject: [PATCH 41/69] chore: remove output logs --- .github/workflows/deploy-docs.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index eb8923c..745402b 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -22,12 +22,8 @@ jobs: - name: Install jsdoc and build run: | chmod u+x scripts/docs-build-gh.sh && ./scripts/docs-build-gh.sh - cd app - chmod u+x docs-install.sh && ./docs-install.sh + cd app && ./docs-install.sh npm run generate-docs - ls -l -a - cd docs - ls -l -a - name: Archive Development Artifact uses: actions/upload-artifact@v4 From 36f16e5f8666c92ebf6ae8d10c34201fed9e6bf6 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 23:00:35 +0800 Subject: [PATCH 42/69] docs: README * indicate docs:install/build compatibility for docker only --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 5596475..1a01d7d 100644 --- a/README.md +++ b/README.md @@ -205,10 +205,10 @@ Builds the class documentation into the **/docs** directory. ### `npm run docs:install` -Runs the Bash script that installs the JSDoc and theme dependencies for building the class documentation. +Runs the Bash script that installs the JSDoc and theme dependencies for building the class documentation within athe development Docker environment. > [!NOTE] -> This script requires running from a Bash terminal: it won't work from a Windows command line terminal. +> This script requires running from a Bash terminal - it won't work from a Windows command line terminal. It is reserved for building the documentation with Docker. This script is used for building the class documentation from a local Docker environment along with the `npm run docs:build` NPM script. @@ -219,10 +219,10 @@ docker exec -u root -it ph-municipalities npm run docs:build ### `npm run docs:build` -Runs the Bash script that builds the class documentation using JSDoc. +Runs the Bash script that builds the class documentation using JSDoc within athe development Docker environment. > [!NOTE] -> This script requires running from a Bash terminal: it won't work from a Windows command line terminal. +> This script requires running from a Bash terminal - it won't work from a Windows command line terminal. It is reserved for building the documentation with Docker. This script is used for building the class documentation from a local Docker environment along with the `npm run docs:install` NPM script. From 17bfbf0876ef36fc4bff915e134766ff9635a805 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 23:26:38 +0800 Subject: [PATCH 43/69] docs: README - update manual docs build using node --- README.md | 36 ++++++++++++++++++++++++++++-------- app/.gitignore | 1 + 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 1a01d7d..5f74f9c 100644 --- a/README.md +++ b/README.md @@ -85,8 +85,8 @@ The following dependencies are used for this project. Feel free to use other dep - [Building Standalone Windows Executables](#building-standalone-windows-executables) - [Compiling into Single, Minified Files](#compiling-into-single-minified-files) - [Building the Class Documentation](#building-the-class-documentation) - - [Using NodeJS](#using-nodejs) - [Using Docker](#using-docker) + - [Using NodeJS](#using-nodejs) - [Troubleshooting](#troubleshooting) ## Installation @@ -197,7 +197,8 @@ npm run list:region Builds the class documentation into the **/docs** directory. > [!NOTE] -> This script requires manual installation of the `jsdoc@4.0.3`, `minami@1.2.3`, and `taffydb@2.7.3` packages as **devDependencies** inside the **/app** directory > These libraries, only used for building the class documentation, were excluded from the final package.json to have fewer external dependencies. +> This script requires manual installation of the `jsdoc@4.0.3`, `minami@1.2.3`, and `taffydb@2.7.3` packages as **devDependencies** inside the **/app** directory. +> These libraries, only used for building the class documentation, were excluded from the final package.json to have fewer external dependencies. > ```bash > npm install --save-dev jsdoc@4.0.3 minami@1.2.3 taffydb@2.7.3 > ``` @@ -205,7 +206,7 @@ Builds the class documentation into the **/docs** directory. ### `npm run docs:install` -Runs the Bash script that installs the JSDoc and theme dependencies for building the class documentation within athe development Docker environment. +Runs the Bash script that installs the JSDoc and theme dependencies for building the class documentation only within the **development Docker environment**. > [!NOTE] > This script requires running from a Bash terminal - it won't work from a Windows command line terminal. It is reserved for building the documentation with Docker. @@ -219,7 +220,7 @@ docker exec -u root -it ph-municipalities npm run docs:build ### `npm run docs:build` -Runs the Bash script that builds the class documentation using JSDoc within athe development Docker environment. +Runs the Bash script that builds the class documentation using JSDoc only within the **development Docker environment**. > [!NOTE] > This script requires running from a Bash terminal - it won't work from a Windows command line terminal. It is reserved for building the documentation with Docker. @@ -537,10 +538,6 @@ The main npm scripts can be compiled into standalone JavaScript files together w There are two (2) options for building the class documentation. -### Using NodeJS - -Install the dependencies for JSDoc. Refer to the [**`npm run generate-docs`**](#npm-run-generate-docs) Script usage for more information. - ### Using Docker 1. Run docker for localhost development. Refer to the [Docker for Localhost Development](#docker-for-localhost-development) section for more information. @@ -555,6 +552,29 @@ Install the dependencies for JSDoc. Refer to the [**`npm run generate-docs`**](# npm run docs:build ``` +### Using NodeJS + +1. Install the dependencies for JSDoc. Refer to the [**`npm run generate-docs`**](#npm-run-generate-docs) Script usage for more information. +2. Copy Bash scripts to the **/app** directory. + - Create a **/scripts** directory inside the **/app** directory. + - Copy the `/scripts/docs-install.sh` and `/scripts/docs-build.sh` Bash scripts to the **/scripts** directory created from the previous step. +3. Copy static assets to the **/app** directory. + - Copy the `/docs/diagrams` directory inside the **/app** directory. + - Copy the `README.md` file to the **/app** directory. +4. Add appropriate user permission to the files. + ```bash + chmod u+x scripts/docs-install.sh + chmod u+x scripts/docs-build.sh + ``` +5. Run the commands for building the documentation. + + > **INFO:** Use a GitBash terminal if you are working on a Windows OS machine. + + ```bash + ./scripts/docs-install.sh + ./scripts/docs-build.sh + ``` + ## Troubleshooting This section describes several common errors and related fixes. diff --git a/app/.gitignore b/app/.gitignore index 1bcd219..87691a7 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1,6 +1,7 @@ node_modules/ dist/ docs/ +diagrams/ README.md README.tmp .env From de7381c679acff21c428b111958e3e00b5071729 Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 23:29:05 +0800 Subject: [PATCH 44/69] chore: exclude docs build files in .npmignore --- app/.npmignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/.npmignore b/app/.npmignore index 0c204e6..00ab32d 100644 --- a/app/.npmignore +++ b/app/.npmignore @@ -6,8 +6,11 @@ dist/ *.xlsx *.json *.zip +*.tgz *.txt *.tgz +*.png +*.sh .env.example .eslintrc.js @@ -15,6 +18,8 @@ dist/ .gitignore .npmignore .eslintignore +README.md +README.tmp # Ignore all JSON files except: !package.json @@ -26,6 +31,8 @@ dist/ # Exclude directories src/examples/ +docs/ +diagrams/ # Docker Dockerfile From 0c04cbbed765a333e308423a5fef469aa36ff56d Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 23:39:27 +0800 Subject: [PATCH 45/69] docs: add gh pages URL link to class docs --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5f74f9c..2def74e 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,12 @@ Extracted municipalities are written in JSON files following the format: Pre-compiled windows binaries are available for download in the latest [Releases](https://github.com/ciatph/ph-municipalities/releases) download page. +## Class Documentation + +- Class documentation and methods are available at https://ciatph.github.io/ph-municipalities. +- The documentation website's HTML files are available in the [`gh-pages`](https://github.com/ciatph/ph-municipalities/tree/gh-pages) branch of this repository. +- Refer to the [Building the Class Documentation](#building-the-class-documentation) section for more information about updating and building the class documentation. + ## Requirements The following dependencies are used for this project. Feel free to use other dependency versions as needed. @@ -57,6 +63,7 @@ The following dependencies are used for this project. Feel free to use other dep ## Contents - [ph-municipalities](#ph-municipalities) +- [Class Documentation](#class-documentation) - [Requirements](#requirements) - [Contents](#contents) - [Installation](#installation) @@ -536,7 +543,7 @@ The main npm scripts can be compiled into standalone JavaScript files together w ## Building the Class Documentation -There are two (2) options for building the class documentation. +The class documentation uses [JSDoc](https://jsdoc.app/) annotations where applicable in the JavaScript source codes inside the **/src** directory. There are two (2) options for building the class documentation. ### Using Docker From e1a37386ac417c32e50a66970cf01a26ac866e9f Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 23:46:05 +0800 Subject: [PATCH 46/69] docs: update README * use docker exec with root user in docs build --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2def74e..5bfad16 100644 --- a/README.md +++ b/README.md @@ -551,12 +551,12 @@ The class documentation uses [JSDoc](https://jsdoc.app/) annotations where appli 2. Install the dependencies for JSDoc. Suceeding builds will not need to install dependencies after an initial installation. Refer to the [**npm run docs:install**](#npm-run-docsinstall) script usage for more information.
```bash - npm run docs:install + docker exec -u root -it ph-municipalities npm run docs:install ``` 3. Build the documentation. Refer to the [**npm run docs:build**](#npm-run-docsbuild) script usage for more information.
```bash - npm run docs:build + docker exec -u root -it ph-municipalities npm run docs:build ``` ### Using NodeJS From 7d12c0b4d4eac2aa75741b797a071ea9fd3ad80e Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 23:56:11 +0800 Subject: [PATCH 47/69] docs: test using details/summary elements --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 5bfad16..160e06b 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,8 @@ Pre-compiled windows binaries are available for download in the latest [Releases The following dependencies are used for this project. Feel free to use other dependency versions as needed. +
+Expand to view requirements 1. Windows 10 OS 2. nvm for Windows v1.1.9 3. NodeJS, installed using nvm @@ -59,6 +61,7 @@ The following dependencies are used for this project. Feel free to use other dep - Checkout the excel file format on the `/app/data/day1.xlsx` sample file for more information 5. (Optional) Download URL for a remote excel file. - See the `EXCEL_FILE_URL` variable on the [Installation](#installation) section. +
## Contents From 551318a2e1a6844e6c12d4f439d06bb708a0650f Mon Sep 17 00:00:00 2001 From: ciatph Date: Thu, 12 Sep 2024 23:58:15 +0800 Subject: [PATCH 48/69] docs: test using details/summary elements, adjust text --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 160e06b..7961231 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,8 @@ Pre-compiled windows binaries are available for download in the latest [Releases The following dependencies are used for this project. Feel free to use other dependency versions as needed.
-Expand to view requirements +Requirements list + 1. Windows 10 OS 2. nvm for Windows v1.1.9 3. NodeJS, installed using nvm @@ -61,6 +62,7 @@ The following dependencies are used for this project. Feel free to use other dep - Checkout the excel file format on the `/app/data/day1.xlsx` sample file for more information 5. (Optional) Download URL for a remote excel file. - See the `EXCEL_FILE_URL` variable on the [Installation](#installation) section. +
## Contents From 348fd830eda8ad8adc2ffa4181f78a85bad39a36 Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 01:14:10 +0800 Subject: [PATCH 49/69] docs: use details/summary --- README.md | 172 +++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 143 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 7961231..f7a1562 100644 --- a/README.md +++ b/README.md @@ -65,30 +65,41 @@ The following dependencies are used for this project. Feel free to use other dep -## Contents +## Table of Contents + +
+ +Click to expand the table of contents + + - [ph-municipalities](#ph-municipalities) - [Class Documentation](#class-documentation) - [Requirements](#requirements) -- [Contents](#contents) +- [Table of Contents](#table-of-contents) - [Installation](#installation) - [Installation Using Docker](#installation-using-docker) - [Available Scripts](#available-scripts) - - [`npm start` / `npm run list:region`](#npm-start--npm-run-listregion) - - [`npm run list:province`](#npm-run-listprovince) - - [`npm run example`](#npm-run-example) - - [`npm run generate-docs`](#npm-run-generate-docs) - - [`npm run docs:install`](#npm-run-docsinstall) - - [`npm run docs:build`](#npm-run-docsbuild) - - [`build:win:region`](#buildwinregion) - - [`build:win:province`](#buildwinprovince) - - [`build:win:all`](#buildwinall) - - [`npm run minify:region`](#npm-run-minifyregion) - - [`npm run minify:province`](#npm-run-minifyprovince) - - [`npm run minify:all`](#npm-run-minifyall) - - [`npm run lint`](#npm-run-lint) - - [`npm run lint:fix`](#npm-run-lintfix) - - [`npm test`](#npm-test) + - [Interactive CLI Scripts](#interactive-cli-scripts) + - [`npm start` / `npm run list:region`](#npm-start--npm-run-listregion) + - [`npm run list:province`](#npm-run-listprovince) + - [NPM Scripts for Building Documentation](#npm-scripts-for-building-documentation) + - [`npm run generate-docs`](#npm-run-generate-docs) + - [`npm run docs:install`](#npm-run-docsinstall) + - [`npm run docs:build`](#npm-run-docsbuild) + - [NPM Scripts for Building Windows Executable Files of the Interactive CLI Scripts](#npm-scripts-for-building-windows-executable-files-of-the-interactive-cli-scripts) + - [`build:win:region`](#buildwinregion) + - [`build:win:province`](#buildwinprovince) + - [`build:win:all`](#buildwinall) + - [`npm run minify:region`](#npm-run-minifyregion) + - [NPM Scripts for Compiling the Interactive CLI Scripts into Stand-Alone Scripts](#npm-scripts-for-compiling-the-interactive-cli-scripts-into-stand-alone-scripts) + - [`npm run minify:province`](#npm-run-minifyprovince) + - [`npm run minify:all`](#npm-run-minifyall) + - [NPM Scripts for Linting Files and Unit Testing](#npm-scripts-for-linting-files-and-unit-testing) + - [`npm run lint`](#npm-run-lint) + - [`npm run lint:fix`](#npm-run-lintfix) + - [`npm test`](#npm-test) + - [`npm run example`](#npm-run-example) - [Class Usage](#class-usage) - [Load and Parse a Local Excel File](#load-and-parse-a-local-excel-file) - [Download and Parse a Remote Excel File](#download-and-parse-a-remote-excel-file) @@ -101,6 +112,8 @@ The following dependencies are used for this project. Feel free to use other dep - [Using NodeJS](#using-nodejs) - [Troubleshooting](#troubleshooting) +
+ ## Installation 1. Clone this repository.
@@ -114,6 +127,9 @@ The following dependencies are used for this project. Feel free to use other dep 3. Create a `.env` file from the `.env.example` file inside the `/app` directory. Use the default values for the following environment variables. +
+ List of .env variables and their description. + > **INFO:** If installed as an NPM package with `npm i ph-municipalities`, create the `.env` file inside the NPM project's root directory. | Variable Name | Description | @@ -124,13 +140,18 @@ The following dependencies are used for this project. Feel free to use other dep | SPECIAL_CHARACTERS | Key-value pairs of special characters or garbled text and their normalized text conversions, delimited by the `":"` character.
Multiple key-value pairs are delimited by the `","` character.
If a special character key's value is a an empty string, write it as i.e.,: `"some-garbled-text:"` | | IMAGE_URL | Raw URL of the README image file from this GitHub repository.
**NOTE:** Only add this variable in the GitHub Secrets for publishing to the NPM registry since NPM does not allow displaying images by relative path.
| +
+ ## Installation Using Docker We can use Docker to run dockerized Node app for local development mode. The following methods require Docker and Docker compose correctly installed and set up on your development machine. ### Docker Dependencies +
+ The following dependencies are used to build and run the image. Please feel feel free to use other OS and versions as needed. + 1. Ubuntu 22.04.1 - Docker version 23.0.1, build a5eeb1 @@ -141,8 +162,13 @@ The following dependencies are used to build and run the image. Please feel feel - Docker Compose version v2.27.1-desktop.1 - Docker Engine version 26.1.4, build 5650f9b +
+ ### Docker for Localhost Development +
+Steps for using Docker with local development + 1. Set up the environment variables for the `/app` directory. Visit the [Installation](#installation) section, **step #3** for more information. 2. Stop and delete all docker instances for a fresh start. @@ -167,6 +193,8 @@ The following dependencies are used to build and run the image. Please feel feel - For new scripts (example only):
`docker exec -it ph-municipalities node ./src/new.js` +
+ ## Available Scripts > _**Note:** These NPM scripts run relative within the `/app` directory, when working on a git-cloned repository of the app. To run using only NodeJS, navigate first to the `/app` directory and execute a target script, for example:_ @@ -176,6 +204,11 @@ cd app npm run list:region ``` +
+ + Interactive CLI Scripts + + ### `npm start` / `npm run list:region` - Asks users to enter the download URL of a remote excel file or use the default local excel file @@ -197,13 +230,15 @@ npm run list:region - Run the script as follows if installed using `npm i ph-municipalities`: - `node .\node_modules\ph-municipalities\src\scripts\by_province.js` -### `npm run example` - -- Downloads and parses a remote excel file. -- Demonstrates sample usage with `await` +
--- +
+ + NPM Scripts for Building Documentation + + ### `npm run generate-docs` Builds the class documentation into the **/docs** directory. @@ -244,8 +279,15 @@ docker exec -u root -it ph-municipalities npm run docs:install docker exec -u root -it ph-municipalities npm run docs:build ``` +
+ --- +
+ + NPM Scripts for Building Windows Executable Files of the Interactive CLI Scripts + + ### `build:win:region` - Package the Node.js project's `npm start` script into a stand-alone windows `node16-win-x64` executable. @@ -261,8 +303,15 @@ docker exec -u root -it ph-municipalities npm run docs:build - Package the Node.js project's `npm start` and `npm list:province` script into a stand-alone windows `node16-win-x64` executables in one go. - Each window executable file will be stored in the `/dist` directory. +
+ --- +
+ + NPM Scripts for Compiling the Interactive CLI Scripts into Stand-Alone Scripts + + ### `npm run minify:region` - Compiles the Node.js project's `npm list:region` script and dependencies into a single script using [**ncc**](https://www.npmjs.com/package/@vercel/ncc). @@ -280,8 +329,15 @@ docker exec -u root -it ph-municipalities npm run docs:build - Run the `npm list:region` and `npm list:province` scripts in one go. - Each compiled/minified files will be stored in the `/dist` directory. +
+ --- +
+ + NPM Scripts for Linting Files and Unit Testing + + ### `npm run lint` Lint JavaScript source codes. @@ -294,6 +350,13 @@ Fix JavaScript lint errors. Run tests defined in the `/app/__tests__` directory. +### `npm run example` + +- Downloads and parses a remote excel file. +- Demonstrates sample usage with `await` + +
+ ## Class Usage Below are example usages of the `ExcelFile` class, run from the **/app/src/examples** directory. Check out the `/app/src/examples/sample_usage.js` file for more examples. @@ -302,7 +365,9 @@ Below are example usages of the `ExcelFile` class, run from the **/app/src/examp This is a simple usage example of the `ExcelFile` class. -**Simple Usage** +
+Simple Usage + ```javascript const path = require('path') const ExcelFile = require('../classes/excel') @@ -346,7 +411,13 @@ file.datalist = [ { municipality: 'Bucay', province: 'Abra' }] ``` -**Reading regions, provinces and municipalities** +
+ +
+ + Reading regions, provinces and municipalities + + ```javascript const path = require('path') const ExcelFile = require('../classes/excel') @@ -377,10 +448,17 @@ const municipalitiesFromProvince = file.listMunicipalities({ provinces }) console.log(`---municipalities`, municipalitiesFromProvince) ``` +
+ ### Download and Parse a Remote Excel File Adding a `url` field in the constructor parameter prepares the class to download a remote Excel file for the data source. +
+ + Remote Excel file download example + + > **INFO:** Run the `.init()` method after initializing a class with a `url` parameter to start the async file download. ```javascript @@ -410,9 +488,14 @@ const main = async () => { main() ``` +
+ ### Alternate Usage - Events -Initialize an `ExcelFile` class instance. +
+ + Initialize an ExcelFile class instance. + ```javascript require('dotenv').config() @@ -446,6 +529,8 @@ const main = () => { main() ``` +
+ ### Using a Custom Configuration File The **ph-municipalities** `ExcelFile` and `ExcelFactory` classes use a default configuration file to define their regions and provinces in the `/app/config/regions.json` file. The regions and provinces data in this file syncs with the PAGASA Seasonal and 10-Day Weather Forecast Excel files provinces and municipalities naming convention, encoded by hand as of August 24, 2024. @@ -454,7 +539,11 @@ Follow the codes to define a custom regions config file, following the format of > _**Note:** The custom config file's province/municipality names should match those in the 10-day Excel file._ -**config.json** +
+ + config.json + + ``` { "metadata": { @@ -485,7 +574,13 @@ Follow the codes to define a custom regions config file, following the format of } ``` -**Custom config usage** +
+ +
+ + Custom config usage + + ```javascript require('dotenv').config() const path = require('path') @@ -518,6 +613,8 @@ console.log('\nProvince/municipality names should match with those in the 10-day console.log('---municipalities', municipalities) ``` +
+ ## Building Standalone Windows Executables The main npm scripts can be packaged into standalone windows executables. Pre-compiled windows binaries are available for download in the latest [Releases](https://github.com/ciatph/ph-municipalities/releases) download page. @@ -550,7 +647,10 @@ The main npm scripts can be compiled into standalone JavaScript files together w The class documentation uses [JSDoc](https://jsdoc.app/) annotations where applicable in the JavaScript source codes inside the **/src** directory. There are two (2) options for building the class documentation. -### Using Docker +
+ + Using Docker + 1. Run docker for localhost development. Refer to the [Docker for Localhost Development](#docker-for-localhost-development) section for more information. @@ -564,7 +664,14 @@ The class documentation uses [JSDoc](https://jsdoc.app/) annotations where appli docker exec -u root -it ph-municipalities npm run docs:build ``` -### Using NodeJS +
+ +
+ +
+ + Using NodeJS + 1. Install the dependencies for JSDoc. Refer to the [**`npm run generate-docs`**](#npm-run-generate-docs) Script usage for more information. 2. Copy Bash scripts to the **/app** directory. @@ -587,11 +694,16 @@ The class documentation uses [JSDoc](https://jsdoc.app/) annotations where appli ./scripts/docs-build.sh ``` +
+ ## Troubleshooting This section describes several common errors and related fixes. -### EACCESS: permission denied +
+ + EACCESS: permission denied + #### Information @@ -607,7 +719,9 @@ This section describes several common errors and related fixes. `sudo chown -R : ./app` 3. Re-run the NPM script. +
+
@ciatph
20220807 \ No newline at end of file From 7f16bf67e76cd5c5eabe7a65f991750b2891d4ae Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 01:23:17 +0800 Subject: [PATCH 50/69] docs: use more details/summary in the README --- README.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f7a1562..eda9049 100644 --- a/README.md +++ b/README.md @@ -366,7 +366,7 @@ Below are example usages of the `ExcelFile` class, run from the **/app/src/examp This is a simple usage example of the `ExcelFile` class.
-Simple Usage +Simple Usage ```javascript const path = require('path') @@ -415,7 +415,7 @@ file.datalist = [
- Reading regions, provinces and municipalities +Reading regions, provinces and municipalities ```javascript @@ -456,7 +456,7 @@ Adding a `url` field in the constructor parameter prepares the class to downlo
- Remote Excel file download example +Remote Excel file download example > **INFO:** Run the `.init()` method after initializing a class with a `url` parameter to start the async file download. @@ -494,7 +494,7 @@ main()
- Initialize an ExcelFile class instance. +Initialize an ExcelFile class instance ```javascript @@ -541,7 +541,7 @@ Follow the codes to define a custom regions config file, following the format of
- config.json +config.json ``` @@ -578,7 +578,7 @@ Follow the codes to define a custom regions config file, following the format of
- Custom config usage +Custom config usage ```javascript @@ -617,7 +617,10 @@ console.log('---municipalities', municipalities) ## Building Standalone Windows Executables -The main npm scripts can be packaged into standalone windows executables. Pre-compiled windows binaries are available for download in the latest [Releases](https://github.com/ciatph/ph-municipalities/releases) download page. +
+ +The main npm scripts can be packaged into standalone windows executables. Pre-compiled windows binaries are available for download in the latest Releases download page. + 1. Run any of the following scripts to build the programs. ```bash @@ -627,9 +630,14 @@ The main npm scripts can be packaged into standalone windows executables. Pre-co ``` 2. Click the resulting executable files in the `/dist` directory to execute. +
+ ## Compiling into Single, Minified Files +
+ The main npm scripts can be compiled into standalone JavaScript files together with all its dependencies. + 1. Run any of the following scripts to compile the source codes. ```bash @@ -643,6 +651,8 @@ The main npm scripts can be compiled into standalone JavaScript files together w node dist/province ``` +
+ ## Building the Class Documentation The class documentation uses [JSDoc](https://jsdoc.app/) annotations where applicable in the JavaScript source codes inside the **/src** directory. There are two (2) options for building the class documentation. From e6ac5f84c80e96cad0abfcfb8dca94e549dae7d4 Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 01:27:48 +0800 Subject: [PATCH 51/69] docs: README * remove internal links in the table of contents --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index eda9049..55123ce 100644 --- a/README.md +++ b/README.md @@ -81,25 +81,25 @@ Click to expand the table of contents - [Installation Using Docker](#installation-using-docker) - [Available Scripts](#available-scripts) - [Interactive CLI Scripts](#interactive-cli-scripts) - - [`npm start` / `npm run list:region`](#npm-start--npm-run-listregion) - - [`npm run list:province`](#npm-run-listprovince) + - `npm start` / `npm run list:region` + - `npm run list:province` - [NPM Scripts for Building Documentation](#npm-scripts-for-building-documentation) - - [`npm run generate-docs`](#npm-run-generate-docs) - - [`npm run docs:install`](#npm-run-docsinstall) - - [`npm run docs:build`](#npm-run-docsbuild) + - `npm run generate-docs` + - `npm run docs:install` + - `npm run docs:build` - [NPM Scripts for Building Windows Executable Files of the Interactive CLI Scripts](#npm-scripts-for-building-windows-executable-files-of-the-interactive-cli-scripts) - - [`build:win:region`](#buildwinregion) - - [`build:win:province`](#buildwinprovince) - - [`build:win:all`](#buildwinall) - - [`npm run minify:region`](#npm-run-minifyregion) + - `build:win:region` + - `build:win:province` + - `build:win:all` + - `npm run minify:region` - [NPM Scripts for Compiling the Interactive CLI Scripts into Stand-Alone Scripts](#npm-scripts-for-compiling-the-interactive-cli-scripts-into-stand-alone-scripts) - - [`npm run minify:province`](#npm-run-minifyprovince) - - [`npm run minify:all`](#npm-run-minifyall) + - `npm run minify:province` + - `npm run minify:all` - [NPM Scripts for Linting Files and Unit Testing](#npm-scripts-for-linting-files-and-unit-testing) - - [`npm run lint`](#npm-run-lint) - - [`npm run lint:fix`](#npm-run-lintfix) - - [`npm test`](#npm-test) - - [`npm run example`](#npm-run-example) + - `npm run lint` + - `npm run lint:fix` + - `npm test` + - `npm run example` - [Class Usage](#class-usage) - [Load and Parse a Local Excel File](#load-and-parse-a-local-excel-file) - [Download and Parse a Remote Excel File](#download-and-parse-a-remote-excel-file) From bc831988021c25658ea0f00d96efdf6475f6404f Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 01:31:04 +0800 Subject: [PATCH 52/69] docs: update README --- README.md | 72 +++++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 55123ce..81822b4 100644 --- a/README.md +++ b/README.md @@ -83,18 +83,18 @@ Click to expand the table of contents - [Interactive CLI Scripts](#interactive-cli-scripts) - `npm start` / `npm run list:region` - `npm run list:province` - - [NPM Scripts for Building Documentation](#npm-scripts-for-building-documentation) - - `npm run generate-docs` - - `npm run docs:install` - - `npm run docs:build` - [NPM Scripts for Building Windows Executable Files of the Interactive CLI Scripts](#npm-scripts-for-building-windows-executable-files-of-the-interactive-cli-scripts) - - `build:win:region` - - `build:win:province` - - `build:win:all` + - `npm run build:win:region` + - `npm run build:win:province` + - `npm run build:win:all` - `npm run minify:region` - [NPM Scripts for Compiling the Interactive CLI Scripts into Stand-Alone Scripts](#npm-scripts-for-compiling-the-interactive-cli-scripts-into-stand-alone-scripts) - `npm run minify:province` - `npm run minify:all` + - [NPM Scripts for Building Documentation](#npm-scripts-for-building-documentation) + - `npm run generate-docs` + - `npm run docs:install` + - `npm run docs:build` - [NPM Scripts for Linting Files and Unit Testing](#npm-scripts-for-linting-files-and-unit-testing) - `npm run lint` - `npm run lint:fix` @@ -234,6 +234,32 @@ npm run list:region --- +
+ + NPM Scripts for Compiling the Interactive CLI Scripts into Stand-Alone Scripts + + +### `npm run minify:region` + +- Compiles the Node.js project's `npm list:region` script and dependencies into a single script using [**ncc**](https://www.npmjs.com/package/@vercel/ncc). +- The compiled/minified file will be stored in `/dist/region`. Run the command to use the compiled script:
+`node dist/region` + +### `npm run minify:province` + +- Compiles the Node.js project's `npm list:province` script and dependencies into a single script using [**ncc**](https://www.npmjs.com/package/@vercel/ncc). +- The compiled/minified file will be stored in `/dist/province`. Run the command to use the compiled script:
+`node dist/province` + +### `npm run minify:all` + +- Run the `npm list:region` and `npm list:province` scripts in one go. +- Each compiled/minified files will be stored in the `/dist` directory. + +
+ +--- +
NPM Scripts for Building Documentation @@ -288,17 +314,17 @@ docker exec -u root -it ph-municipalities npm run docs:build NPM Scripts for Building Windows Executable Files of the Interactive CLI Scripts -### `build:win:region` +### `npm run build:win:region` - Package the Node.js project's `npm start` script into a stand-alone windows `node16-win-x64` executable. - The windows executable file will be stored in `/dist/ph-regions-win.exe`. Click the executable file to run. -### `build:win:province` +### `npm run build:win:province` - Package the Node.js project's `npm list:province` script into a stand-alone windows `node16-win-x64` executable. - The windows executable file will be stored in `/dist/ph-provinces-win.exe`. Click the executable file to run. -### `build:win:all` +### `npm run build:win:all` - Package the Node.js project's `npm start` and `npm list:province` script into a stand-alone windows `node16-win-x64` executables in one go. - Each window executable file will be stored in the `/dist` directory. @@ -307,32 +333,6 @@ docker exec -u root -it ph-municipalities npm run docs:build --- -
- - NPM Scripts for Compiling the Interactive CLI Scripts into Stand-Alone Scripts - - -### `npm run minify:region` - -- Compiles the Node.js project's `npm list:region` script and dependencies into a single script using [**ncc**](https://www.npmjs.com/package/@vercel/ncc). -- The compiled/minified file will be stored in `/dist/region`. Run the command to use the compiled script:
-`node dist/region` - -### `npm run minify:province` - -- Compiles the Node.js project's `npm list:province` script and dependencies into a single script using [**ncc**](https://www.npmjs.com/package/@vercel/ncc). -- The compiled/minified file will be stored in `/dist/province`. Run the command to use the compiled script:
-`node dist/province` - -### `npm run minify:all` - -- Run the `npm list:region` and `npm list:province` scripts in one go. -- Each compiled/minified files will be stored in the `/dist` directory. - -
- ---- -
NPM Scripts for Linting Files and Unit Testing From 7637ebbf5fc2c94f22511614b3d3bdb60343db4f Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 01:32:30 +0800 Subject: [PATCH 53/69] docs: update README --- README.md | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 81822b4..686cb45 100644 --- a/README.md +++ b/README.md @@ -260,6 +260,30 @@ npm run list:region --- +
+ + NPM Scripts for Building Windows Executable Files of the Interactive CLI Scripts + + +### `npm run build:win:region` + +- Package the Node.js project's `npm start` script into a stand-alone windows `node16-win-x64` executable. +- The windows executable file will be stored in `/dist/ph-regions-win.exe`. Click the executable file to run. + +### `npm run build:win:province` + +- Package the Node.js project's `npm list:province` script into a stand-alone windows `node16-win-x64` executable. +- The windows executable file will be stored in `/dist/ph-provinces-win.exe`. Click the executable file to run. + +### `npm run build:win:all` + +- Package the Node.js project's `npm start` and `npm list:province` script into a stand-alone windows `node16-win-x64` executables in one go. +- Each window executable file will be stored in the `/dist` directory. + +
+ +--- +
NPM Scripts for Building Documentation @@ -309,30 +333,6 @@ docker exec -u root -it ph-municipalities npm run docs:build --- -
- - NPM Scripts for Building Windows Executable Files of the Interactive CLI Scripts - - -### `npm run build:win:region` - -- Package the Node.js project's `npm start` script into a stand-alone windows `node16-win-x64` executable. -- The windows executable file will be stored in `/dist/ph-regions-win.exe`. Click the executable file to run. - -### `npm run build:win:province` - -- Package the Node.js project's `npm list:province` script into a stand-alone windows `node16-win-x64` executable. -- The windows executable file will be stored in `/dist/ph-provinces-win.exe`. Click the executable file to run. - -### `npm run build:win:all` - -- Package the Node.js project's `npm start` and `npm list:province` script into a stand-alone windows `node16-win-x64` executables in one go. -- Each window executable file will be stored in the `/dist` directory. - -
- ---- -
NPM Scripts for Linting Files and Unit Testing @@ -357,6 +357,8 @@ Run tests defined in the `/app/__tests__` directory.
+
+ ## Class Usage Below are example usages of the `ExcelFile` class, run from the **/app/src/examples** directory. Check out the `/app/src/examples/sample_usage.js` file for more examples. From 18ba9ccddfd1de4caf837e39179f4ff68b51ca8a Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 01:35:15 +0800 Subject: [PATCH 54/69] docs: update README --- README.md | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 686cb45..11472e7 100644 --- a/README.md +++ b/README.md @@ -234,6 +234,30 @@ npm run list:region --- +
+ + NPM Scripts for Building Windows Executable Files of the Interactive CLI Scripts + + +### `npm run build:win:region` + +- Package the Node.js project's `npm start` script into a stand-alone windows `node16-win-x64` executable. +- The windows executable file will be stored in `/dist/ph-regions-win.exe`. Click the executable file to run. + +### `npm run build:win:province` + +- Package the Node.js project's `npm list:province` script into a stand-alone windows `node16-win-x64` executable. +- The windows executable file will be stored in `/dist/ph-provinces-win.exe`. Click the executable file to run. + +### `npm run build:win:all` + +- Package the Node.js project's `npm start` and `npm list:province` script into a stand-alone windows `node16-win-x64` executables in one go. +- Each window executable file will be stored in the `/dist` directory. + +
+ +--- +
NPM Scripts for Compiling the Interactive CLI Scripts into Stand-Alone Scripts @@ -258,29 +282,6 @@ npm run list:region
---- - -
- - NPM Scripts for Building Windows Executable Files of the Interactive CLI Scripts - - -### `npm run build:win:region` - -- Package the Node.js project's `npm start` script into a stand-alone windows `node16-win-x64` executable. -- The windows executable file will be stored in `/dist/ph-regions-win.exe`. Click the executable file to run. - -### `npm run build:win:province` - -- Package the Node.js project's `npm list:province` script into a stand-alone windows `node16-win-x64` executable. -- The windows executable file will be stored in `/dist/ph-provinces-win.exe`. Click the executable file to run. - -### `npm run build:win:all` - -- Package the Node.js project's `npm start` and `npm list:province` script into a stand-alone windows `node16-win-x64` executables in one go. -- Each window executable file will be stored in the `/dist` directory. - -
--- From e80151f01233dccf7552ad8870b0241c31401343 Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 01:38:29 +0800 Subject: [PATCH 55/69] chore: build and deploy docs on push to dev branch, #43 --- .github/workflows/deploy-docs.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 745402b..b5644f2 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -2,8 +2,7 @@ name: Build and Deploy Docs on: push: - branches-ignore: - - master + branches: - dev jobs: From d37c79751f28ae11b4a4b1294afa69ff3c934685 Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 03:39:21 +0800 Subject: [PATCH 56/69] docs: use correct jsdoc type annotations --- .../classInitialization/checkClass.js | 2 +- .../createMunicipalityInstance.js | 4 +- app/src/classes/colorlog/index.js | 22 +++++----- app/src/classes/excel/index.js | 42 ++++++++++--------- app/src/classes/excelfactory/index.js | 4 +- app/src/classes/schema/index.js | 4 +- app/src/lib/utils.js | 8 ++-- 7 files changed, 44 insertions(+), 42 deletions(-) diff --git a/app/__tests__/classInitialization/checkClass.js b/app/__tests__/classInitialization/checkClass.js index d289501..efad34b 100644 --- a/app/__tests__/classInitialization/checkClass.js +++ b/app/__tests__/classInitialization/checkClass.js @@ -4,7 +4,7 @@ * Checks valid `ExcelFile` or `ExcelFactory` class instances. * @typedef {Object} params - Input parameters * @param {Function} excelInstance - `ExcelFile` or `ExcelFactory` class instance - * @param {Bool} isRemote - Flag if the Excel data source is from a remote download. Defaults to `false`. + * @param {boolean} isRemote - Flag if the Excel data source is from a remote download. Defaults to `false`. * @param {Function} classType - `ExcelFile` or `ExcelFactory` class */ const checkClass = ({ excelInstance, isRemote = false, classType = null }) => { diff --git a/app/__tests__/municipalities/createMunicipalityInstance.js b/app/__tests__/municipalities/createMunicipalityInstance.js index 6b79a32..ec11476 100644 --- a/app/__tests__/municipalities/createMunicipalityInstance.js +++ b/app/__tests__/municipalities/createMunicipalityInstance.js @@ -7,8 +7,8 @@ const logger = new ColorLog({ color: ColorLog.COLORS.TEXT.YELLOW, isBold: true } * Builds objects containing all provinces AND municipality names for the PAGASA seasonal config and 10-Day Excel file to use for comparison checks and logs viewing purposes only. * @param {Class} excelFile - `ExcelFile` or `ExcelFactory` instance * @returns {Object} Object containing Arrays and Sets of province and municipality names - * - `hasMissingInExcel` {Bool} - Flag if province(s) exist in the PAGASA seasonal config but not in the 10-day Excel - * - `hasMissingInConfig` {Bool} - Flag if municipalities exist in 10-day Excel but not in the municipalities list built from the PAGASA seasonal config + * - `hasMissingInExcel` {boolean} - Flag if province(s) exist in the PAGASA seasonal config but not in the 10-day Excel + * - `hasMissingInConfig` {boolean} - Flag if municipalities exist in 10-day Excel but not in the municipalities list built from the PAGASA seasonal config * - `excel` {Object} - Contains full province/municipality names and data from the 10-day Excel file * - `excel.provinces` {String[]} - all provinces from the 10-day Excel file * - `excel.municipalities` {Object} - Object with province names as keys and values are String[] array of municipalities under the province diff --git a/app/src/classes/colorlog/index.js b/app/src/classes/colorlog/index.js index 4c4bab7..7ab025a 100644 --- a/app/src/classes/colorlog/index.js +++ b/app/src/classes/colorlog/index.js @@ -33,9 +33,9 @@ class ColorLog { /** * Initializes a ColorLog class - * @typedef {Object} params - Input parameters - * @param {String} params.color - ANSI color defined in `ColorLog.COLORS` - * @param {Bool} params.isBold - Flag to render bold colored text + * @param {Object} params - Input parameters + * @param {string} params.color - ANSI color defined in `ColorLog.COLORS` + * @param {boolean} params.isBold - Flag to render bold colored text */ constructor ({ color, isBold = false } = {}) { this.setColor(color) @@ -44,11 +44,11 @@ class ColorLog { /** * Prints colored log message in console.log() - * @param {String} message - Log message text + * @param {string} message - Log message text * @param {Object} options - (Optional) - * @param {String} options.color - ANSI color defined in `ColorLog.COLORS` - * @param {Bool} options.isBold - Flag to render bold colored text - * @returns {Bool} + * @param {string} options.color - ANSI color defined in `ColorLog.COLORS` + * @param {boolean} options.isBold - Flag to render bold colored text + * @returns {boolean} */ log (message, options = {}) { if (!message || typeof message !== 'string') return @@ -63,8 +63,8 @@ class ColorLog { /** * Sets the text color in console.log() - * @param {String} color - ANSI color defined in `ColorLog.COLORS` - * @returns {Bool} + * @param {string} color - ANSI color defined in `ColorLog.COLORS` + * @returns {boolean} */ setColor (color) { if (!color) return @@ -78,8 +78,8 @@ class ColorLog { /** * Sets the text weight in console.log - * @param {Bool} isBold - Flag to render bold colored text - * @returns {Bool} + * @param {boolean} isBold - Flag to render bold colored text + * @returns {boolean} */ setText (isBold) { if (![true, false].includes(isBold)) return diff --git a/app/src/classes/excel/index.js b/app/src/classes/excel/index.js index 77d5afc..6c36240 100644 --- a/app/src/classes/excel/index.js +++ b/app/src/classes/excel/index.js @@ -37,12 +37,14 @@ class ExcelFile { /** * SheetJS array index number translated from the Excel headers row count * before elements containing "municipalityName (provinceName)" data + * @type {number} */ dataRowStart: 0, /** Internal excel file column name read by sheetjs. * This column contains strings following the pattern * "municipalityName (provinceName)" + * @type {string} */ SHEETJS_COL: process.env.SHEETJS_COLUMN || '__EMPTY' } @@ -73,14 +75,14 @@ class ExcelFile { /** * Initialize an ExcelFile object - * @typedef {Object} params - Constructor parameter Object - * @param {String} [params.url] - (Optional) Remote download URL of an excel file - * @param {String} params.pathToFile + * @param {Object} params - Constructor parameter Object + * @param {string} [params.url] - (Optional) Remote download URL of an excel file + * @param {string} params.pathToFile * - Full local file path of an existing Excel file, **required** if `params.url` is not provided * - Full local file path to an existing or non-existent Excel file on which to download/save the remote Excel file from `params.url`, * if the `params.url` parameter is provided * @param {Object} [params.settings] - (Optional) Region settings configuration object following the format of the `/app/config/regions.json` file. Defaults to the mentioned file if not provided. - * @param {Bool} [params.fastload] - (Optional) Start loading and parsing the local excel file on class initialization if the "url" param is not provided. + * @param {boolean} [params.fastload] - (Optional) Start loading and parsing the local excel file on class initialization if the "url" param is not provided. * - If `false` or not provided, call the `.init()` method later on a more convenient time. */ constructor ({ url, pathToFile, fastload = true, settings = null, options = null } = {}) { @@ -233,8 +235,8 @@ class ExcelFile { /** * Checks if a string follows the pattern: * "municipalityName (provinceName)" - * @param {String} str - String to check - * @returns {Bool} true | false + * @param {string} str - String to check + * @returns {boolean} true | false */ followsStringPattern (str) { return /[a-zA-Z,.] *\([^)]*\) *$/.test(str) @@ -243,7 +245,7 @@ class ExcelFile { /** * Sets the local this.#options settings * @param {Object} options - Miscellaneous app settings defined in this.#options - * @returns {Bool} + * @returns {boolean} */ setOptions (options) { if (!options) return false @@ -257,8 +259,8 @@ class ExcelFile { /** * Checks if a string contains special characters - * @param {String} str - String to check - * @returns {Bool} + * @param {string} str - String to check + * @returns {boolean} */ static hasSpecialChars (str) { /* eslint-disable no-control-regex */ @@ -268,8 +270,8 @@ class ExcelFile { /** * Cleans/removes default-known special characters and garbled text defined in config from string. - * @param {String} str - String to clean - * @returns {String} - Clean string + * @param {string} str - String to clean + * @returns {string} - Clean string */ static removeGarbledText (str) { // Known garbled special text @@ -304,8 +306,8 @@ class ExcelFile { /** * Extracts the municipality name from a string following the pattern: * "municipalityName (provinceName)" - * @param {String} str - * @returns {String} municipality name + * @param {string} str + * @returns {string} municipality name */ getMunicipalityName (str) { const municipalityName = str.replace(/ *\([^)]*\) */g, '') @@ -320,8 +322,8 @@ class ExcelFile { /** * Extracts the province name from a string following the pattern: * "municipalityName (provinceName)" - * @param {String} str - * @returns {String} province name + * @param {string} str + * @returns {string} province name * @returns {null} Returns null if "provinceName" is not found */ getProvinceName (str) { @@ -436,8 +438,8 @@ class ExcelFile { * Writes queried municipalities data to a JSON file. * Lists municipalities by by provinces. * @param {String[]} provinces - Array of case-sensitive province names. Starts with an upper case. - * @param {String} fielName - Full file path to a JSON file - * @param {Bool} prettify - Write the JSON content with proper spacings and newlines + * @param {string} fielName - Full file path to a JSON file + * @param {boolean} prettify - Write the JSON content with proper spacings and newlines * @returns {Object} Formatted raw data with misc. metadata */ writeMunicipalities ({ provinces, fileName, prettify = false }) { @@ -466,7 +468,7 @@ class ExcelFile { /** * Lists the province names of a region defined in the settings file - * @param {String} regionName - Region name that matches with the `/app/config/regions.json` file's `data[N].name` + * @param {string} regionName - Region name that matches with the `/app/config/regions.json` file's `data[N].name` * @returns {String[]} List provinces under the `regionName`. */ listProvinces (regionName) { @@ -476,8 +478,8 @@ class ExcelFile { /** * Lists the province names of a region defined in the settings (PAGASA seasonal config) file or from the parsed Excel file - * @param {String} region - Region name that matches with the `/app/config/regions.json` file's `data[N].name` - * @param {Bool} fromExcel - Flag to return the province names from the parsed 10-day Excel file. Defaults to `false`. + * @param {string} region - Region name that matches with the `/app/config/regions.json` file's `data[N].name` + * @param {boolean} fromExcel - Flag to return the province names from the parsed 10-day Excel file. Defaults to `false`. * - Note: Province names from a "remote" Excel file may change without notice. * - It may differ from the contents of the "default" settings (PAGASA seasonal config) file. * - If the province names from the "remote" Excel file and "default" settings (PAGASA seasonal config) file vary, diff --git a/app/src/classes/excelfactory/index.js b/app/src/classes/excelfactory/index.js index 749dae6..f4307fe 100644 --- a/app/src/classes/excelfactory/index.js +++ b/app/src/classes/excelfactory/index.js @@ -16,8 +16,8 @@ const ExcelFile = require('../excel') class ExcelFactory extends ExcelFile { /** * Initializes an `ExcelFactory` class. - * @typedef {Object} params - Constructor parameter Object - * @param {String} [params.url] - (Optional) Remote download URL of an excel file + * @param {Object} params - Constructor parameter Object + * @param {string} [params.url] - (Optional) Remote download URL of an excel file * @param {Object} [params.settings] - (Optional) Region settings configuration object following the format of the `/app/config/regions.json` file. Defaults to the mentioned file if not provided. */ constructor ({ url, settings } = {}) { diff --git a/app/src/classes/schema/index.js b/app/src/classes/schema/index.js index 75bb785..6e4c960 100644 --- a/app/src/classes/schema/index.js +++ b/app/src/classes/schema/index.js @@ -1,5 +1,5 @@ /** - * Validates Objects with zod schemas and formats validation error(s) for log output. + * Validates Objects with [zod](https://github.com/colinhacks/zod) schemas and formats validation error(s) for log output. */ class Schema { /** Settings object */ @@ -44,7 +44,7 @@ class Schema { /** * Formats error messages into a single string * @param {Object[]} errors - List of zod error messages - * @returns {Bool} + * @returns {boolean} */ formatErrorLog (errors = []) { if (!Array.isArray(errors)) { diff --git a/app/src/lib/utils.js b/app/src/lib/utils.js index cf2a6bb..12ce251 100644 --- a/app/src/lib/utils.js +++ b/app/src/lib/utils.js @@ -1,7 +1,7 @@ /** * Checks if a variable is a true JavaScript Object * @param {Object} item - JavaScript Object - * @returns {Bool} true|false + * @returns {boolean} true|false */ const isObject = (item) => { return item && @@ -12,14 +12,14 @@ const isObject = (item) => { /** * Converts an Array of strings (text) into a single comma-separated string * @param {String[]} arrayOfText - Array containing String items - * @returns {String} Comma-separated text + * @returns {string} Comma-separated text */ const arrayToString = (arrayOfText) => arrayOfText.toString().split(',').join(', ') /** * Capitalizes the first letter of words in a text - * @param {String} text - String text - * @returns {String} Capitalized text + * @param {string} text - String text + * @returns {string} Capitalized text */ const capitalizeText = (text) => { if (typeof text !== 'string') return null From 93b97e1641de1580c9d734dda81a634265a94816 Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 04:19:49 +0800 Subject: [PATCH 57/69] docs: update class member doc --- README.md | 3 +- app/src/classes/colorlog/index.js | 38 +++++++++++++++++-- app/src/classes/excel/index.js | 61 ++++++++++++++++++++++++------- app/src/classes/schema/index.js | 5 ++- 4 files changed, 88 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 11472e7..0d37f02 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,9 @@ Pre-compiled windows binaries are available for download in the latest [Releases ## Class Documentation -- Class documentation and methods are available at https://ciatph.github.io/ph-municipalities. +- Class and methods documentation are available at https://ciatph.github.io/ph-municipalities. - The documentation website's HTML files are available in the [`gh-pages`](https://github.com/ciatph/ph-municipalities/tree/gh-pages) branch of this repository. +- Class source codes are available at https://github.com/ciatph/ph-municipalities. - Refer to the [Building the Class Documentation](#building-the-class-documentation) section for more information about updating and building the class documentation. ## Requirements diff --git a/app/src/classes/colorlog/index.js b/app/src/classes/colorlog/index.js index 7ab025a..e2a09de 100644 --- a/app/src/classes/colorlog/index.js +++ b/app/src/classes/colorlog/index.js @@ -1,13 +1,34 @@ /** * Prints colored console.log messages - * @class */ class ColorLog { + /** + * Text styles for logging. + * @static + * @type {Object.} + * @property {string} BOLD - Bold text style. + * @property {string} NORMAL - Normal text style. + */ static TEXT = { BOLD: '\x1b[1m', NORMAL: '\x1b[0m' } + /** + * ANSI colors for coloring the logging text. + * @static + * @type {Object.} + * @property {Object} TEXT - Object containing color properties. + * @property {string} TEXT.WHITE - White color. + * @property {string} TEXT.GRAY - Gray color. + * @property {string} TEXT.GREEN - Green color. + * @property {string} TEXT.RED - Red color. + * @property {string} TEXT.YELLOW - Yellow color. + * @property {string} TEXT.BLUE - Blue color. + * @property {string} TEXT.CYAN - Cyan color. + * @property {string} TEXT.RESET - Reset color. + * @property {string} TEXT.MAGENTA - Magenta color. + */ static COLORS = { TEXT: { WHITE: '\x1b[37m', @@ -22,13 +43,22 @@ class ColorLog { } } - /** Message log */ + /** + * Message log text. + * @type {string | null} + */ #log = null - /** Text color */ + /** + * Text color + * @type {string} + */ #color = ColorLog.COLORS.TEXT.GREEN - /** Text weight (bold, normal) */ + /** + * Text weight (bold, normal) + * @type {string} + */ #weight = false /** diff --git a/app/src/classes/excel/index.js b/app/src/classes/excel/index.js index 6c36240..ab73c88 100644 --- a/app/src/classes/excel/index.js +++ b/app/src/classes/excel/index.js @@ -17,22 +17,40 @@ const { capitalizeText } = require('../../lib/utils') * "municipalityName (ProvinceName)" */ class ExcelFile { - /** Remote download URL of an excel file */ + /** + * Remote download URL of an excel file + * @type {string | null} + */ #url = null - /** Full file path to excel file on local storage */ + /** + * Full file path to excel file on local storage + * @type {string | null} + */ #pathToFile = null - /** Region information from the /app/config/regions.json or other config file */ + /** + * Region information from the `/app/config/regions.json` or other JSON config file. + * @type {Object | null} + */ #settings = null - /** 10-day Excel file information */ + /** + * 10-day Excel file information + * @type {Object.} + */ #metadata = { - // Weather forecast date + /** + * Weather forecast date + * @type {string | null} + */ forecastDate: null } - /** Other app settings and configurations */ + /** + * Other app settings and configurations + * @type {Object.} + */ #options = { /** * SheetJS array index number translated from the Excel headers row count @@ -49,26 +67,43 @@ class ExcelFile { SHEETJS_COL: process.env.SHEETJS_COLUMN || '__EMPTY' } - /** Excel workbook object parsed by sheetjs */ + /** + * Excel workbook object parsed by sheetjs + * @type {Object[] | null} + */ #workbook = null - /** Excel sheet names parsed by sheetjs */ + /** + * Excel sheet names parsed by sheetjs. + * @type {string[] | null} + */ #sheets = null - /** Objects[] Array corresponding to excel rows extracted from the excel sheet by sheetjs */ + /** + * Objects[] Array corresponding to excel rows extracted from the excel sheet by sheetjs. + * @type {Object[] | null} + */ #data = null - /** Object[] Array of processed string corresponding to the column in the excel file - * that contains the list of municipalities following the pattern: + /** + * Object[] Array of processed string corresponding to the column in the excel file + * that contains the list of municipalities following the pattern: * "municipalityName (provinceName)" * Content: [{ municipality, province }, ... ] + * @type {Object[] | null} */ #datalist = [] - /** Event emitter for listening to custom events */ + /** + * Node event emitter for listening to custom events. + * @type {Function} + */ events = new EventEmitter() - /** List of EventEmitter events */ + /** + * List of EventEmitter events. + * @type {Object.} + */ EVENTS = { LOADED: 'loaded' } diff --git a/app/src/classes/schema/index.js b/app/src/classes/schema/index.js index 6e4c960..2603450 100644 --- a/app/src/classes/schema/index.js +++ b/app/src/classes/schema/index.js @@ -2,7 +2,10 @@ * Validates Objects with [zod](https://github.com/colinhacks/zod) schemas and formats validation error(s) for log output. */ class Schema { - /** Settings object */ + /** + * Settings object. + * @type {Object | null} + */ #data = null /** From 01e1c083d0ee4bdeae0acdfc153771e463a238b8 Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 09:31:53 +0800 Subject: [PATCH 58/69] feat: add faqs section in the README, #111 --- README.md | 157 ++++++++++++++++++++++++++++++++- app/src/classes/excel/index.js | 2 +- 2 files changed, 155 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0d37f02..1b7f2c5 100644 --- a/README.md +++ b/README.md @@ -39,9 +39,9 @@ Pre-compiled windows binaries are available for download in the latest [Releases ## Class Documentation -- Class and methods documentation are available at https://ciatph.github.io/ph-municipalities. -- The documentation website's HTML files are available in the [`gh-pages`](https://github.com/ciatph/ph-municipalities/tree/gh-pages) branch of this repository. -- Class source codes are available at https://github.com/ciatph/ph-municipalities. +- Class and methods documentation are available at [https://ciatph.github.io/ph-municipalities](https://ciatph.github.io/ph-municipalities). +- Class source codes are available at the [ph-municipalities](https://github.com/ciatph/ph-municipalities) GitHub repository. +- The documentation website's HTML files are available in the [`gh-pages`](https://github.com/ciatph/ph-municipalities/tree/gh-pages) branch of the GitHub repository. - Refer to the [Building the Class Documentation](#building-the-class-documentation) section for more information about updating and building the class documentation. ## Requirements @@ -66,6 +66,156 @@ The following dependencies are used for this project. Feel free to use other dep
+## FAQs + +
+ +What is the purpose or goal of ph-municipalities? + + +
+ +

ph-municipalities aims to provide a simple, organized, and flexible interface for viewing, querying, and listing Philippine provinces and municipalities using the PAGASA 10-day weather forecast Excel files as the data source.

+ +

Its early stages were written as procedural functions within a private backend project for extracting 10-day weather forecast data from the PAGASA 10-day weather forecast Excel files. When the private project started gaining complexity, a need to separate the logic and management for listing the Philippine province and municipalities per region rose. Creating an independent, public OpenSource version listing the provinces and municipalities per region was decided after experiencing drawbacks and difficulties testing using similar OpenSource libraries (some of which are listed above) for that project.

+ +> ph-municipalities aim to contribute to the OpenSource community by listing ONLY Philippine provinces and municipalities names, using PAGASA's 10-day weather forecast Excel files, which are publicly accessible to everyone. + +
+ +
+ +
+ +Can ph-municipalities parse and extract PAGASA 10-day weather forecast data? + + +
+ +

While ph-municipalities use a PAGASA 10-day weather forecast Excel file as a data source for its provinces and municipalities list, NO, it cannot parse and extract PAGASA 10-day weather forecast data.

+ +

ph-municipalities only have class methods for parsing, extracting, listing and querying provinces and municipalities names data from a PAGASA 10-day weather forecast Excel file. Refer to the ExcelFile class documentation for more information about its available methods.

+ +
+ +
+ +
+ +Are there alternative libraries to ph-municipalities for listing Philippine provinces and municipalities? + + +
+ +

Yes, several OpenSource libraries and projects similar to ph-municipalities exist, which you can use in its place to list Philippine provinces and municipalities.

+ +

Here is a list of several of these libraries and code repositories. +Note, however, these items use old and new data sources. These may not be for you if you require using provinces and municipalities names data from the PAGASA 10-day weather forecast Excel files.

+ + + +
+ +
+ +
+ +Is it possible to make ph-municipalities parse and extract PAGASA 10-day weather forecast data? + + +
+ +

While ph-municipalites do not support parsing and extracting PAGASA 10-day weather forecast data, you can extend the ExcelFile or ExcelAdapter classes with custom logic and codes to enable parsing and extracting PAGASA 10-day weather forecast data.

+ +

Since the ExcelFile or ExcelAdapter are classes (functions in disguise, not true OOP, but inheritance still works), you can extend them with class inheritance, overriding or creating new class methods to accommodate processing the PAGASA 10-day weather forecast data. Refer to the ph-municipalities class documentation to know more about the available classes, member variables, and methods.

+ +

An example of extending the classes to parse PAGASA 10-day weather forecast data may go along the lines of:

+ +```javascript +const { ExcelFile } = require('ph-municipalities') + +class PAGASATendayParser extends ExcelFile { + /* Override constructor if neccessary + constructor (params) { + super(params) + + // Custom class initialization logic here + } + */ + + getWeatherData () { + // Note: this.#data contains the "raw" original Excel rows data as JSON with weather data + + const weatherData = this.#data.reduce((list, row, index) => { + // Write logic to parse and extract weather data here + }, []) + + return weatherData + } +} + +const parser = new PAGASATendayParser() +weatherForecast = parser.getWeatherData() + +``` + +
+ +
+ +
+ + + How does ph-municipalities determine which provinces belong to a region? + + + +
+ +The PAGASA 10-day Excel files only contain province and municipality names linked with weather data - _it has no region information_. Therefore, ph-municipalities link the province names in the 10-day Excel files to region/province names defined in the `/app/config/regions.json` file to determine which region they belong to. + +### The `/app/config/regions.json` file + +This file contains region/province names mapping encoded manually with reference from the region and province names listed in the [PAGASA Seasonal Forecast website's](https://www.pagasa.dost.gov.ph/climate/climate-prediction/seasonal-forecast) Forecast Analysis Rainfall table. + +> **_NOTE:_**
+> The region/province mapping defined in this file may become outdated as time passes. ph-municipalities users are encouraged to [Use a Custom Configuration File](#using-a-custom-configuration-file), defining new region/province name mappings following the file's current format if they will notice region to province inconsistencies in the generated municipality lists. + +
+ +
+ +
+ + + Are the provinces and municipality list generated by ph-municipalities updated? + + + +
+ +

NO. By default, ph-municipalities use an outdated PAGASA 10-day Excel file by default for its local data source, downloaded on August 8, 2022. However, it also provides several ways for using updated PAGASA 10-day Excel files as data sources by:

+ +- Prompting to download an updated PAGASA 10-day Excel file using the [Interactive CLI Scripts](#interactive-cli-scripts) +- Providing [class methods](https://ciatph.github.io/ph-municipalities/ExcelFile.html#download) to programmatically download and use a remote PAGASA 10-day Excel file +- Allowing to override the default region - province list settings during class initialization (See [Class Usage - Using a Custom Configuration File](#using-a-custom-configuration-file)) + +> **_NOTE:_** +> Overall, the provinces and municipality list rely on the latest contents of a [PAGASA 10-day Excel file](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast) and manual configuration of region/province names mapping in the `/app/config/regions.json` file (See [Class Usage - Using a Custom Configuration File](#using-a-custom-configuration-file)). It is not yet known and tested if these are in sync with the latest regions, provinces, and municipalities in the more standard and canon [Philippine Standard Geographic Code (PSGC)](https://psa.gov.ph/classification/psgc) data. + +
+ +
+ ## Table of Contents
@@ -77,6 +227,7 @@ Click to expand the table of contents - [ph-municipalities](#ph-municipalities) - [Class Documentation](#class-documentation) - [Requirements](#requirements) +- [FAQs](#faqs) - [Table of Contents](#table-of-contents) - [Installation](#installation) - [Installation Using Docker](#installation-using-docker) diff --git a/app/src/classes/excel/index.js b/app/src/classes/excel/index.js index ab73c88..502770b 100644 --- a/app/src/classes/excel/index.js +++ b/app/src/classes/excel/index.js @@ -48,7 +48,7 @@ class ExcelFile { } /** - * Other app settings and configurations + * Other class settings and configurations * @type {Object.} */ #options = { From f297a93117b5cc61504681dc41689ec57a6d6a63 Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 09:34:50 +0800 Subject: [PATCH 59/69] chore: add local link to similar libs --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1b7f2c5..b0cbfbd 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ The following dependencies are used for this project. Feel free to use other dep

ph-municipalities aims to provide a simple, organized, and flexible interface for viewing, querying, and listing Philippine provinces and municipalities using the PAGASA 10-day weather forecast Excel files as the data source.

-

Its early stages were written as procedural functions within a private backend project for extracting 10-day weather forecast data from the PAGASA 10-day weather forecast Excel files. When the private project started gaining complexity, a need to separate the logic and management for listing the Philippine province and municipalities per region rose. Creating an independent, public OpenSource version listing the provinces and municipalities per region was decided after experiencing drawbacks and difficulties testing using similar OpenSource libraries (some of which are listed above) for that project.

+

Its early stages were written as procedural functions within a private backend project for extracting 10-day weather forecast data from the PAGASA 10-day weather forecast Excel files. When the private project started gaining complexity, a need to separate the logic and management for listing the Philippine province and municipalities per region rose. Creating an independent, public OpenSource version listing the provinces and municipalities per region was decided after experiencing drawbacks and difficulties testing using similar OpenSource libraries (some of which are [listed below](#similar-libraries)) for that project.

> ph-municipalities aim to contribute to the OpenSource community by listing ONLY Philippine provinces and municipalities names, using PAGASA's 10-day weather forecast Excel files, which are publicly accessible to everyone. @@ -101,7 +101,7 @@ The following dependencies are used for this project. Feel free to use other dep
- + Are there alternative libraries to ph-municipalities for listing Philippine provinces and municipalities? From eeb0b7c451461aceb8c1d5b69e4d8a4a937f89ab Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 09:44:17 +0800 Subject: [PATCH 60/69] chore: remove p tags --- README.md | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index b0cbfbd..d0b6512 100644 --- a/README.md +++ b/README.md @@ -75,11 +75,11 @@ The following dependencies are used for this project. Feel free to use other dep
-

ph-municipalities aims to provide a simple, organized, and flexible interface for viewing, querying, and listing Philippine provinces and municipalities using the PAGASA 10-day weather forecast Excel files as the data source.

+ph-municipalities aims to provide a simple, organized, and flexible interface for viewing, querying, and listing Philippine provinces and municipalities using the [PAGASA 10-day weather forecast Excel files](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast) as the data source. -

Its early stages were written as procedural functions within a private backend project for extracting 10-day weather forecast data from the PAGASA 10-day weather forecast Excel files. When the private project started gaining complexity, a need to separate the logic and management for listing the Philippine province and municipalities per region rose. Creating an independent, public OpenSource version listing the provinces and municipalities per region was decided after experiencing drawbacks and difficulties testing using similar OpenSource libraries (some of which are [listed below](#similar-libraries)) for that project.

+Its early stages were written as procedural functions within a private backend project for extracting 10-day weather forecast data from the PAGASA 10-day weather forecast Excel files. When the private project started gaining complexity, a need to separate the logic and management for listing the Philippine province and municipalities per region rose. Creating an independent, public OpenSource version listing the provinces and municipalities per region was decided after experiencing drawbacks and difficulties testing using similar OpenSource libraries (some of which are [listed below](#similar-libraries)) for that project. -> ph-municipalities aim to contribute to the OpenSource community by listing ONLY Philippine provinces and municipalities names, using PAGASA's 10-day weather forecast Excel files, which are publicly accessible to everyone. +> **_ph-municipalities aim to contribute to the OpenSource community by listing ONLY Philippine provinces and municipalities names, using [PAGASA's 10-day weather forecast Excel files](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast), which are publicly accessible to everyone._**
@@ -92,9 +92,9 @@ The following dependencies are used for this project. Feel free to use other dep
-

While ph-municipalities use a PAGASA 10-day weather forecast Excel file as a data source for its provinces and municipalities list, NO, it cannot parse and extract PAGASA 10-day weather forecast data.

+While ph-municipalities use a [PAGASA 10-day weather forecast Excel file](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast) as a data source for its provinces and municipalities list, **_NO, it cannot parse and extract PAGASA 10-day weather forecast data_**. -

ph-municipalities only have class methods for parsing, extracting, listing and querying provinces and municipalities names data from a PAGASA 10-day weather forecast Excel file. Refer to the ExcelFile class documentation for more information about its available methods.

+ph-municipalities only have class methods for parsing, extracting, listing and querying provinces and municipalities names data from a PAGASA 10-day weather forecast Excel file. Refer to the **ExcelFile** [class documentation](https://ciatph.github.io/ph-municipalities/ExcelFile.html) for more information about its available methods.
@@ -107,21 +107,19 @@ The following dependencies are used for this project. Feel free to use other dep
-

Yes, several OpenSource libraries and projects similar to ph-municipalities exist, which you can use in its place to list Philippine provinces and municipalities.

+Yes, several OpenSource libraries and projects similar to ph-municipalities exist, which you can use in its place to list Philippine provinces and municipalities. -

Here is a list of several of these libraries and code repositories. -Note, however, these items use old and new data sources. These may not be for you if you require using provinces and municipalities names data from the PAGASA 10-day weather forecast Excel files.

+Here is a list of several of these libraries and code repositories. +Note, however, these items use old and new data sources. These may not be for you if you require using provinces and municipalities names data from the [PAGASA 10-day weather forecast Excel files](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast). - +- [psgc2](https://www.npmjs.com/package/psgc2) +- [use-postal-ph](https://www.npmjs.com/package/use-postal-ph) +- [philippine-address-selector](https://github.com/wilfredpine/philippine-address-selector) +- [philippines](https://www.npmjs.com/package/philippines) +- [ph-locations](https://github.com/hubertursua/ph-locations) +- [select-philippines-address](https://www.npmjs.com/package/select-philippines-address) +- [psgc-api](https://github.com/OSSPhilippines/psgc-api) +- [phl-admin-psgc](https://github.com/benhur07b/phl-admin-psgc)
@@ -134,11 +132,11 @@ Note, however, these items use old and new data sources. These may not be for yo
-

While ph-municipalites do not support parsing and extracting PAGASA 10-day weather forecast data, you can extend the ExcelFile or ExcelAdapter classes with custom logic and codes to enable parsing and extracting PAGASA 10-day weather forecast data.

+While ph-municipalites do not support parsing and extracting PAGASA 10-day weather forecast data, _you can extend the `ExcelFile` or `ExcelAdapter` classes with custom logic and codes to enable parsing and extracting PAGASA 10-day weather forecast data_. -

Since the ExcelFile or ExcelAdapter are classes (functions in disguise, not true OOP, but inheritance still works), you can extend them with class inheritance, overriding or creating new class methods to accommodate processing the PAGASA 10-day weather forecast data. Refer to the ph-municipalities class documentation to know more about the available classes, member variables, and methods.

+Since the `ExcelFile` or `ExcelAdapter` are [classes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) (functions in disguise, not true OOP, but inheritance still works), you can extend them with class inheritance, overriding or creating new class methods to accommodate processing the PAGASA 10-day weather forecast data. Refer to the [ph-municipalities class documentation](https://ciatph.github.io/ph-municipalities) to know more about the available classes, member variables, and methods. -

An example of extending the classes to parse PAGASA 10-day weather forecast data may go along the lines of:

+An example of extending the classes to parse PAGASA 10-day weather forecast data may go along the lines of: ```javascript const { ExcelFile } = require('ph-municipalities') @@ -203,7 +201,7 @@ This file contains region/province names mapping encoded manually with reference
-

NO. By default, ph-municipalities use an outdated PAGASA 10-day Excel file by default for its local data source, downloaded on August 8, 2022. However, it also provides several ways for using updated PAGASA 10-day Excel files as data sources by:

+NO. By default, ph-municipalities use an outdated PAGASA 10-day Excel file by default for its local data source, downloaded on August 8, 2022. However, it also provides several ways for using updated PAGASA 10-day Excel files as data sources by: - Prompting to download an updated PAGASA 10-day Excel file using the [Interactive CLI Scripts](#interactive-cli-scripts) - Providing [class methods](https://ciatph.github.io/ph-municipalities/ExcelFile.html#download) to programmatically download and use a remote PAGASA 10-day Excel file From b463d7d146e59c02b30dedbef005494929d8987f Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 09:51:23 +0800 Subject: [PATCH 61/69] chore: update README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d0b6512..0d604db 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ ph-municipalities only have class methods for parsing, extracting, listing and q Yes, several OpenSource libraries and projects similar to ph-municipalities exist, which you can use in its place to list Philippine provinces and municipalities. Here is a list of several of these libraries and code repositories. -Note, however, these items use old and new data sources. These may not be for you if you require using provinces and municipalities names data from the [PAGASA 10-day weather forecast Excel files](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast). +Note, however, that these items use old and new data sources. These may not be for you if you require using provinces and municipalities' names data from the [PAGASA 10-day weather forecast Excel files](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast). - [psgc2](https://www.npmjs.com/package/psgc2) - [use-postal-ph](https://www.npmjs.com/package/use-postal-ph) @@ -185,7 +185,7 @@ The PAGASA 10-day Excel files only contain province and municipality names linke This file contains region/province names mapping encoded manually with reference from the region and province names listed in the [PAGASA Seasonal Forecast website's](https://www.pagasa.dost.gov.ph/climate/climate-prediction/seasonal-forecast) Forecast Analysis Rainfall table. -> **_NOTE:_**
+> **NOTE:**
> The region/province mapping defined in this file may become outdated as time passes. ph-municipalities users are encouraged to [Use a Custom Configuration File](#using-a-custom-configuration-file), defining new region/province name mappings following the file's current format if they will notice region to province inconsistencies in the generated municipality lists.
@@ -207,7 +207,7 @@ NO. By default, ph-municipalities use an outdated PAGASA 10-day Excel file by de - Providing [class methods](https://ciatph.github.io/ph-municipalities/ExcelFile.html#download) to programmatically download and use a remote PAGASA 10-day Excel file - Allowing to override the default region - province list settings during class initialization (See [Class Usage - Using a Custom Configuration File](#using-a-custom-configuration-file)) -> **_NOTE:_** +> **NOTE:**
> Overall, the provinces and municipality list rely on the latest contents of a [PAGASA 10-day Excel file](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast) and manual configuration of region/province names mapping in the `/app/config/regions.json` file (See [Class Usage - Using a Custom Configuration File](#using-a-custom-configuration-file)). It is not yet known and tested if these are in sync with the latest regions, provinces, and municipalities in the more standard and canon [Philippine Standard Geographic Code (PSGC)](https://psa.gov.ph/classification/psgc) data.
From b3cca2507d34d9a0a9e70aa3a1e2229dbfdf8e7d Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 09:54:17 +0800 Subject: [PATCH 62/69] chore: update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d604db..69059d1 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ The following dependencies are used for this project. Feel free to use other dep ph-municipalities aims to provide a simple, organized, and flexible interface for viewing, querying, and listing Philippine provinces and municipalities using the [PAGASA 10-day weather forecast Excel files](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast) as the data source. -Its early stages were written as procedural functions within a private backend project for extracting 10-day weather forecast data from the PAGASA 10-day weather forecast Excel files. When the private project started gaining complexity, a need to separate the logic and management for listing the Philippine province and municipalities per region rose. Creating an independent, public OpenSource version listing the provinces and municipalities per region was decided after experiencing drawbacks and difficulties testing using similar OpenSource libraries (some of which are [listed below](#similar-libraries)) for that project. +Its early stages were written as procedural functions within a _private backend project_ for extracting 10-day weather forecast data from the PAGASA 10-day weather forecast Excel files. When the private project started gaining complexity, a need to separate the logic and management for listing the Philippine province and municipalities per region rose. Creating an independent, public OpenSource version listing the provinces and municipalities per region was decided after experiencing drawbacks and difficulties testing using similar OpenSource libraries (some of which are [listed below](#similar-libraries)) for that project. > **_ph-municipalities aim to contribute to the OpenSource community by listing ONLY Philippine provinces and municipalities names, using [PAGASA's 10-day weather forecast Excel files](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast), which are publicly accessible to everyone._** From f8e010fe5c3531544e44e48b0f2cf9e4295ade9c Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 10:05:40 +0800 Subject: [PATCH 63/69] docs: display class initialization --- docs/diagrams/ph-municipalities-arch-90.png | Bin 61060 -> 62199 bytes docs/diagrams/ph-municipalities-arch.drawio | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/diagrams/ph-municipalities-arch-90.png b/docs/diagrams/ph-municipalities-arch-90.png index cbf365383453b3fc4e22dd8361b745025b56da0e..2fdf93e148a535acb5322d9db0f994ab2115a4d9 100644 GIT binary patch literal 62199 zcmaHTbzGHAyY5=x0;IcR5t0JZ-3l0VH%K>vbRz;vgMf5PH_|0YiKKKRrF2VkX8G=K z@9#VN{LUZmPr>JTX6BxI?zpaN-gnB1a#-l(=nx15>#6)>RR{#BAN=7MVs>G&oW#^zVOX+CgkvvgXzK3^_ z3X#HvnLJ?rLNrc@vLcf3tkt%XaQPn%QqjthFr(^aOu!I9|7P*zD;A%rLkNj(5vIWPQw*)fcL;wAhI@}-j>*)ql@W1~q0DUC>`|!U8{nxWh z$(jH9>)**hS&g4VL-eNO!co=!{U6MNkb>7x%w`He7^mJ_{*i1M9;dT3XJsNuG!$vhA(4GiGEomF z%{&*I2BD6Fl9UUFkhgM^GPshLtI%bsK zAl`@uZyc09u#|?Gb%kJ!EDv zS<#jo3PNXwEkEHfY!Rf&{h)qp&3K^5vqDA~}x-+ou_a6SFkw|*-J#H3+Q2r&{lNkPqO3pLA9>=s*Q-Y(8O zAUe>5nl(#4Yp7rHo0|(1B1gF5ay!D~RI-q0Rg4D`*~i*^y>*&iTgzK~wKl6pq7ZQS zpqMUv-#GcN|HdGu{98HQR251>7=TLlmXw&&a7TNeUP6c=^VW-3%U?#1D87A?WoMdn zCk*|u+Af2pM31|wvFm*$*eKoaF;W?3N)>*^C$DPbget_zRODUd`a6_t%BFsVq$XY$Qx`f zdNqi5(W1ptr2EO3Tw{5}Lx~N$!~I%Ww3~yQRo+>GY~i zR?x-@S1!-%?XGG+_o%IAD_WJqUe4F7EK3d|tjL?xaowqRB)Ql1C~xyeU%fT!^sgR2 zQ7t$bRgsO0Y6+Dm7__( zfAH*al!(Vc7AEN<$qb*P{yuLE5{?hY!x9olcTIP_H2$JfS0ZjZG20dGh8siaB~hQF zl9w6|H`bEc{ckTexlMZ_M4M)+a4sV$g;X^h9<%b_I1*k;R;66+H4iJg*F`^Im`jXc z0!Mqf5-Hd$6lU(O4mUube!HgCE~>O7y6#gc)z{8@EU6k zO;~go+|jxnucG?dmZ%b0jA#-wZ_f!nMYHKh>Z-Fn+%FZ+5$%VpHxV77noDZ8``wuR z{Q7RJ(xeNGaFqt~sAC8GHP3FQdaOjNqK}I_rbM%h9QxVH7g`5h)+kn2ku0O=(2K^y z3NwvNEq7J0&}V{^`AV|=YOt9o?rT5Adco~BBNQ5AC&y0x999@W0X%U*Il)&okeAsQ zHO?jKUD}@$@e7+DDvhOnCY}YhEXh^Zl`Yo`c*(D=?-yxtwK0)Oig~Z&k=4VWd!|6Y zVKMF|q=!cJf2`|<={!2J9qpJ57RjqlmGE!NIwHR<5lgCq;7W#?t|*|$N0V|%H@WSy za<-nR-mB&_uD6+Z<{6*McS2*Y?^`-SP$o9Lab=nID&%{bkXm5tgz0T324`UvG!vY3 zwS`5m?J~Ry&K}2^>U^)e+pB%8;~wvWUpd*@5uTzOVm{|irvke~sN=H745__aZKshz zd&p;>ZKpVX+S72Gg+0`(d*QkG3LIqD4@`~j`-@}sjz&d>txc@7_Cq?u(0v1+!*112 zFUa_!wO8fzP^F#8Ip`?kK;+R!1cyLGaOl8hF#R@dHFcEiTYdD0vT-FM=g6)X|66$4 zi@CbH;kL=^So-=*HT6&WXYC_l+BeK)tZA;$! zV(U^phgRh86|DG7)aJ-+^>5r=e6V&*d!rJvWkR3**;^pWONB=tLI%)CM)#3PQL)JL zq)BbY3$u5=HhwHQE8qSDJ^5@i5hw0@$$Zem^%3LJYP>M^s6oJLL~?=jm!EM7QQY9c z{cEa#@WWVc*Qm8dOp1Pt1yXtRy3g0l`DVwdq>4f7XxZ;XTR75&U3f?JlL4-3)qS z{qLl!v6HHz93AR-`4|~O*E+viD+fZ@K*B%xIr^H_nAMmhE_UYUmKIJQ5mtC#>Qv%) z`i(C;rp{dys4heVQgz|)k`iO|hB;C;J%Sy_{p>2t%xU5m{v^h~98DH+Hmr5RxE{r% z7=f6FKz}{D=dzm7n2ckn#r9YasvC-CEV^qgyHiHS9oU|{YIDxlCBSRk#fC{b$)6l> zf4DY8IlWA#cXJCDza`pqNN6+d;|lSpXn%ki4>Bx(Y({h>=dGSqwD4_tpcgo)TiPy$ z78qU3}mDg;-&&kMMTQEB{62DhvE-iniJx}w>R8yXvA5^ zY%axhYJV4kge{+<#rCinn=1aowq|{5L5Mp?fs4#j>QIz;@ofLi(OO*Bk<=emXO*!an-oRYB*!qS2{F@%((zW7}a@E7H5U1<8 z`Gx}1+(9Rd)=^xS8i#qFOx&*+jaf`H8?b;-P{=GdfK1T)z&unPE{4v4)UQTDL!9R) zb7e80BILo)H1#I~2fP3L&aB^s>Up7pZxdBNUIPE#DNR&gQ0lXRiwT$J@Yvm-#acM> zH}7HjHZu}DX4f?auY^{E1s&E; z{JpsS+hygv15}HNYFQJVks9@k`*e0lSP5sPSWdo^@mFTX;V+L4x*J>j(HaX+Ml$pZ zd?sr?)E48>#|V**jXk44*H&A5G60X0cMo2Btp1Y=Y+6GRgmy;3bw+^bKsoR++;gNw z=IDS#=jeB2exB>#uVt_0J}wqMx9H;9P}Paay8Qz#79NhXrPD+AK@o;%pV$YP^V-j5 zzmg8fcnYd_5Q56U?u!)%5n47V6LC3M3qB+xOf?%nfBZd1wZ=zEgQ!ApmCo}X8^2dQ zdaU+qm*1lPbF~6;#bVW3O=-H14I733gtX`OK9==AvwXMZDM1r^XD67#8DqKe?A7Eu zM1}bH0ksUsYpIC5rk>=h2E`!)w)xDYld6%cFLiM`)Iv*CR z0_XYCAM9dfj9~qb_T7`Y&OQFe54QgtAM1KE_kLjF?;OsnCA;z z`?_4M;_YYhb-Db}`AF&=SfHwNDEuZ~BuS3gb%mPS3-d(GkKXbb=XxhCy?yF|yswyr z?CXw;N#Zsu9u`USm6k1FT$%3;&s19*lL-~QSZvpemh<9W`~8`?TK<(LVqbOK}7 zO-a74gfzMUjA0GNP-OddTPT@ASc%bpfH~#yxKo(ujM0ZWrZ#R_wXq0nC zwNV|~nCF1kSSqzrxLy)_`ZLY?D$n+93e8Z_dcB+c)mOul3Z`ncynQ)a4x|&J zwY3gpxNsu$TD@FBq@;$B#Bca~S#tG0SR0ES@^J%v?P3n536)6 z{AxHiG&A_^FkYyln)CQROx*=3|RHDTQe z6YdHsJI`#RLwe|3)KKTi-RRm%*;B{EP@*6M$AGizv1aw7TTt@!H%5!(mSViGkU z_`fNyZqQ9OF!SbMd^W~(S%9oDd)v<@{@Q#WlUArI8U;G#dT=zG^B-R2BT=)(U@|CO zZ&jXTx+oWa;DA%0CME<`$%G!K4|bl;fC%kJUD=!xX`&vdu2HWORxV=|A7wYi_ zz3!>#_upr8j!D#FUd+R7LL31!%8|wXn)@xMvdkGn8%y{5-Nt`bA;MQS2wzwlGfYJC zZ;;$*J$v5MkF7=`s}`9-69yW*W`d4x&eDP*Q)!FsT9yM#B-~Q9(KHcj+N(+Syp-!U{M=2J$GSoqHRDsRO7qK3Ofp!s=a^ z^_56I59OmiMK&_d#@oF$^TM}))XLoCw=q=N4)TvO{#59FJE}rFV%(M zHC}x*K?YD}MX`V~>%}v-$FQ*yP-Z#YR`>=zBpxg#j++ur`Y>Q54qvhtVXaSBQFyf|KVEbdsVt$_f=p)BlbG2-%72;0? zBr6!g`W@tpkn`t^^K?W?&Z6GSf!%2!c`xfj#6`=(*k!}s{pN~Ve_9u!2dQOJNXcuN z(zJ)PqUrSy$CuKQZR(!>Fkz_@?VlXMZ)H4qw7T?>fE-SFV>>L|#Xjb3u>1=couL9k zE9ANB!ANwF0E|wSaLnO*7ywsCG9ea{#m9ggnV(_|G-_Zx58rybw!`|CVY{%eV7r<~ z+rN=ZZ_y~8-C_|VavaeW8Ym6Z#L!ZT*3-*IC>v@}>6OqDSCZJqYZp`eiNmUgJWk{^ zGPD>F*~Ih zJCW#l3V~*{LK1KO3yuimtdLcpHOu;DS896f5}mT zb&lP?4=ZES+Zi_YBD6^c|SnO{Mtl_ofQ`jMuO@-OnC-70@nOKEcX$Fwoq$6 zAre;H7vSH%=nLp7z>Ywrun|i40)+Xl+LSa5BD7B+#~YVZlzl?V4lq-nn5#AqueJWs z6H9ahdKHZa&2bN&KLhD2-*tOZwZ-G`qi^mQ)hwul<4?{%c2%_BlDn6hp#=E)Umu3D z`7)VCCvD=!wW_C@ssM-!%$!?-L>gzBK$Eda$fmg=M7Xx5IF#*h_Et=1jwD9Qobd{824brk!wK>3o~8Nv_=LbKxv>u@-OMANOEO zR2>2khx}_`ir819?PsrTm0aK9Klq^Fx;3tHH<4lX-5R|1jpHP=Z3MD^ez(x<&L)z= zYn@{^ezQXALV0sB<|20doyUAM=Si_qt(uaU#)7u7sF>q|UdAY#)^g_n8>Q}?Ar$x zdfUm;cL9vcHGVgj=!JMWP)K(>v*^gA^TLNVOH{GAbZC zOS*)a+0l#E@y=zmR*Za$g3pF9aLr{{Okhg1G@#_F_nOz(|IdOuz%awnyYo1&f9 zzp=n4-E5hA6;M+AXwLZTXVtBd2fGo@w0 z$>3P~rN3JzZK0eM4iKf?FB1o)ft1wNSWON0A@^4Apk)?!m0wQ$trMNqkWmv0~;CWv#>pO&LMQJq~p5$b#X|E86J&-Nzz1YmGXz65RKz^)MrknpW z#MOt>j;Bi^?tXoxSDXUHBO|Iw6Ni_)UF^6n5l* z0|WSkVc~bK!T?nCd-vnYik4nD7B3!r>Y{&XKi~DK#bbrIihu8SC6;6XwVuqw#BZ35 zPA^vtA1b-lzIt8C520QmZ=fAH9Gd|8j=+VwK4+vUpdi9k^ZBPx za(})b12Z>;zdVe6GZdd%)@MGBo-(wsO>@rKM7s=S5qX(3#**5ovpRDF(siOLaRn1V0@uWgc6EPMZRV| z;)Zy(6g=AzF88A-KqD}e+Do2jfE4(DcQ#U>W|rsi##TthtJR*s4Ae-_4Zsn7=9^}> z+BEbv70B;Ses~Ky3GzjN{2h!h<=q9Llag z?df6SXT>Fi)j2M40K_hCZ=rdBy?!2_u*RARluEQ9X;F^7U9T;Kz>!A+1>d_ zG?$m|ZtLegH`76-3~$`6o4dASwMRrx8DK}tK53Vf|L*J_5v5`B0~sk|JO>UJDPy;%h=&dU zDPxxT@ZKPxEjsSdAL=(Km$w`}ySVwYl<&4X3p$SW^Cc@?!1y5euBTu;#b^8(kAW*O zvO+kIK%6N1WLRgXLnh%T+S;FdF14HnP_jNWaIna#zNaDT&>~i2uUJ>36UKsK)?wfP z0KCxx;En%ONFqpQ%k(he*T3NVZCB+-a8TMyK1+PaGBY!C)JGpZlDd=Yn#1yUsRh7J zBKZtg*}(d>=pEqzT_qXN&@y;XXd&ovU`)pKGI-v5zqQ)`&QGV=&E9Hr=pFdFB#avX zMb4kfMK={dBgPKXEY+rsq!36fEq$2aNPgivieLe(rz^9|+B_bC$s%TF1ZHnLZ!EZf)kI$HX5uyYSebIz7G0C~@FR~M{s-vAf21Lr=H`huaw8=EMh_?c;V18G- z0$&*0y2DB41j9rB`IzJgSO%(nw-qON!y0T)n&yR&AmZ%~9$>PJr-OlDK(seV&2GDK z?+BQ_9jtV9J)#;4{D*&hi6}JW-ux#SsSQ4POb?}-FD6X8U!_vVEvU9wjGnE)=>OJ|=*k9+@S8c+`cHy)~lZN3Js z`adT73BqVp1zz;u-#jLquCq^_fBi$@Xy5-XwHOSDh@WAIxbE>vh!6afrUi_aHuXX5 z@77)y0{@6Ekxm8Ma8QOcSMQhv%7=b%es=UItV#bFC$Ag?N>{8IZzjI@*9=T%{Z$%6x9+z#_GRZ&^}r);a=_ zRg2YGq&#f`jQAZA=_ zq&oh3;wG==1|U8#OfFcSL^-;B4iZ$=c)HT0t`x99mBMX+Zmt_T{_zD+)T*W0ToTD< z1H`3L+?Ua0JUx?wq8|}6#x(;+PRdYhRuSft1>qJs*_{(Gd9Dd66K72K?Me0(7mutO z^y`~_|D@4exw);^gDHGSoWg(i60QbTVEOHtONM&K0~n+~)92`&dXegbY&`MvWn|Bl zwK-;B{HZ%P>*!AkZ=YH>e zi?M!vJglTsMPlTm;&-u5LdI(q^Di1z-*?gf?nbphk;?T2=s7e{Vq)p#Hd6I20HFTi z&!V@IL-Q_w@*|TV;R@CKXDo9zyWsRUB%Fh6E87?Dg8Ca@NhqFi~|lk$gzK z`_Wqew^=Pi&nFJ8r<$Ii(8ve!3v>rp4s#Fl&%JftfA+o+U_wF)h>eQ_Pus5c!oO4c z_6C`?M2D=t($5t4HQV@}yw%EK(1g%hxXc8thT_na-$tFdZhV|A2c*C*w^%o7;qmkSsQ^_>>*hnAi@md2p{2rs<~5dgp* zmC{kV`(n{DrJ>mZWRJNN2_D5CdU3qTCh1;{7niOc?~CYnHGzN8>dycRmB=-K{tIno zCx|bfUM{N7x*(lVOaIlAO3ZqbGQF76*7{E@kQo2~vOEgeB+FO_9nyf3#0>)wo2Z(Q zzmw*E>4&HLYC=P6{SZI3(murXV;uv2ydA)P819ZU@4nXr;vDt`SV~t%;!xw{Ba!8F ztaOF0M@!tsq>H$J1O2rbAW^F=hpA_Pv}R|nUdaIYu+#Atu&Z>OX`xzfZgpN%VqWU4 z&d$zjK%n%j6$yr3sD?^ESKd`8gI^a!m-rsxz%VCB%Ei}B!WyQM#&2=)bvo%o@2k>?4l8gYWD1%gE#rqN=I0`pF9f*LCM1>j_dO_Pz{!fTLy zxi^}&y7k&D%Of~`0k3zsM85&dLXDPUFD``Kpe4|M72wFNRI^n=IBEON&^T-2g3dXWWw z2Y$B8OHHmNP0)_P4j>U3$B4mVLNi40<^XVJD|iej%LEQTE09V`gWm9$>Nl#2gR1*< zI+48gnPB~* zAP8?jfDn*FB;21GtzM@Q#CX&;^UTYipaM7z@6JIFJfQ#+oj$j>226dL^EVb&yF&o0 zXi>l71SWj`S&S6Jkbgc9Knvq$%0i!98aV@EN zfou-b49kNVB}O&~u54l|IKyi=OzMlvh!-cHSMqRWs_?u9RHp zciWlf8ccNZ@bRo#q5Dp8cEU;!_vVkM5=vaA=LXrufYB{}OaEoxOS|`-u25<&$W(%s zVbK`bOR?$eBFH30{?FJty!I**gV(Y89xHEwI*o$p`9Pu}Y`I%bcqCfPG(+nXrTpldbVH?gFLEayUlvJ7ufB@9h~*a-xsQ(2bGd4$_E9q;Vs~cJ1zV|1J(a z6v!o9$rTkFEPs8f%lHuohAH&kQVixE$ z+ss97mbLSYq!-QYAYWYp3Ah6L!4)5D*8IN7Ta+7rB?R3>*Y39pMEP_?2B%1wlDU^xTG3!;iZLxYL0M-jc;YIdv%ozGiN@%^D7z#{3^oZPrr6|1Io=W~77d+ht| z?KbWa#qk$Kk&(xID41-JC?t^(fEWX$@9LFVGOPRUE$iXDd@fE zmVAyQ_1za-#p`*mH=yM)6a>*qJo)+P{p8Aggf=4+9R-2-PIj7&-T=n<@U=lG4b))o zy9LC!0C>h5@Ujcb;UQ>G5wfeeZ)^^lXEGAxom?Rtu~e9a3jB)k|NlDInYZ24tc{%(RI^C#LzJ9>~UvosxENUS_P15-}iaJ1)EQ2|{enXiM*uR-J; zUdKiKGPzH+pdbr=sr9kvoEjA0UNC?4yzq=W zboa%Z>adnB^&I7I?VF|UhzPO7>Te3lbX`zztiG-42!XSWr>+nK+%CLB&@QmxzA-k| zUc)LjY~TQY)%RMvQ|1UE^R*60jRdvLJCv8xre%wA@@Gr+E}$M^O(%7zo@r5oOjzUT z22xm50IP6ul=C!LD5UVR98t-M8|xFel6n7#k0^Mu5n1QPuO0X!Sc7L=+Pk94T~-A4 zs4c{itui$xqCg#D#Y<3VLQp>3gyX9)e$02(b9#S@MNFWgwpZ}n{tMP9IMJl;+S1PY z@2-6zZZ33ZBSi`?ry*f&UMIh@t9i0k#6(d#QOPx4DR)lUombLMqLR2@V;KpGYEEKt zHJw9I`vhYt2sONLMM9{0t1fx$Wz)Sm$*Ijvx==+wB#+MrneDdneIBP)3E(ou%`jg> zz588|X$ENUM*iuqZ_IA!p^j)-JQDJCNbGjc7#MZD6;5y>&ZGgjOz!8}0OOU6a*%d@ z)E>wz8TgW$`RVtKHYDcc2#S4x3=G|TiNHI0V|I1*?A23Bwnwi{Ql%Jqmkn zi*xdFxdt~Rt5c7r3OQ=e$L6PfIB~C9N2gv~FWSnzp`NOJ-fk(376OX;#Yv_4M@F0! zln>F4Wj5kGB4a3(XfyA87h62h@zcKDFQg@-7>3kAUa&E&a@F6aqG+nOf1z3#FH)Nj zI*;w~KV8B*UMFN=s%Aiw;M#q$mZl#4C7Oa-hE_wFkq^`~m)65!WGLA(_m#g9N)~di zjke%jNLByV>Bd3wWBxoP>n-tmo*SZb_t9ANnt2(u6Z0nQ^U6>Jfvoo13<7Ds7o4~~ z+^w94o$R$tWM@|U1mf5YUcsORC%1;{Flr%6t zEf4p@&##nZnlc=DaT>@b4TOIsx#wc~Lx6&kl{`K+4*xe%Q2hHG9=!buLrNBdEQD!2IUb8|@jBg- zPrO$!NymJXhtw~XoSV7J+d3hf$)?tE;o1FiPFDWRZ2{7cwt!UI3J?@k0RAdr_Hn|} zTyc=o6oEiC%B&1p*?IMz!kY^J-SzCWJPErnre=qvR&`?u()QR1k)~6A|po$W(JkVWAEJU;{PrXUZ&0`8^$s%T57n z>9X=L%UjK;Qi0xpyd#K0eXN~fMimmcI)>*E$f_ee$@Z0|@uM0&1FGZ1{r+2h9_i}( z?U&Nrva(<9U*C2NgvlMr3*nLrlD0L#r=mgL0L_G(U?w2E_+ZjtcfMVO2WgC9z zwl-C!H#JJ8O-q)JY{3`Ch~6I--5CN2wl_YO;+5y;F*2s)S(A4B^~RmdDJnHcJ0=1* z8uZ%e{FlEYy@Wp?=VuSTejWAxbZH2*TAw6oR)~|Q0qd^kDqSrx6%n(u+w?W)fnb)h z8JdQqlK6$0#yl!Ei@L4paXr#>MCiG*U4ZPKFQHDCg>?;H+)Zl;iykWE@hr)j{@{s4 z4=Yf3&ASL4yuFtvl29;vd|&VpoOT9^C$<+9vs1NvA6rgdQJFauI~?`7Tr{=Dl>7Bi z79Cx+_zG-u;2l%OuNa~oMh#fZCOO%&7<`h{iz*y+7B16Wy!Z8cpTtfW3Yvti1!*WS zE5oTMwzymKDdM=q-THs#Bo|@Dh=P0>To8TY+o$xt!KLnmIiP^ef^64A(-`O8k?5*5 zPO3M+e-?i5>khja{{{$zvW7UGY*_Dk!ybJFpCsmQB{r?{ow7qRQS$1i;Np%}kg}ZF z&yF^hgAo{sewN{3O1di(aL^x?{&H35>aS%|c=AL|pJyUzV-VIB0+l+T>&N+Ia7nO- zX$%X}-BKul)Sx^v;YF{T8ZIEmw6N5G*4iv&RS26ofUmN|zeqJ7tsmPe(}*P4ED2Wk z+7UIeG;!q`Z5|N%gM<=<r7?77SzY&ka=kL5st?pz)!|y74+dTeD_3L z?#}Al^R)snsi>&6?G(G;QV7V~sdumdP)Ly_SzE%*n8h%<@2oYWF7fopv z(GT)ht-`WQXAWCzUbg=jmbfc51hl@&lg@);#x=8Jy5=>*-KGFK5GE^WkG?4}>TYnf;`I6ACP`gSKo%rWjU@4lJtUaXM+e@&x` z+Jy$zi&9Pm`qp?a6VVQM1~y$ct3&mnG-&8*ajS+r8ZTaRCpYFfV`u1_n2J@0F28Ls z85iilAUAQuIci)*LE@Z$VN5UTw>p2&GpFM&?aa!yf7l4P1g&+t)>#G%;b347KWCEdvL$jk{%^ZFyAN6f(sP-nQkHEVxb?1W^t)U0XKo^yR&(TBV|}h*f|! z@*kqbEUvw{yw@P2C0*Tosq0;j{9I8N#p)iVjq-epXU#G!;IRdB3#32HMb^{n>wIT! zu~EZWmM~oU(}6TIq2Y8%Fo_>02JypRANv9I6J)1eh!VC$DY`HZxCvuwk3gb>PFFn6 zua3F+G#_D{)5!Zm%QS|@El#EZTIV2}l#TrUA?IKHE_VK-ccZICxJYNi3-c1Szmt z4_a3$IN?4t`>TwEsPRKTUwn&%iSSPc^X|9-I~04$kSDF z=$rwfE$t9*taFHm1fR&ZqWsy9Z{1bq^9`?x*IbGZ1>Y$Or7&H9YD5Djg6sJ96U`rF z;*+~o6?AfLakvEc9y~S!rty0@c2YUpg?v?8lKy(nbxDSc4kSXF+)87#4@h@iAje91N!}^@39AE2}T5fyWZ36#ku0)6T}VP zj^aegky%}9{n^(L7X11Vs(2IESqg-utg?-u?kjpIFdUgH30j#6Q|0-*mF7Si3J-gL zB@~H=+Nr}ez^N@_wc7U)sWhvwq~5iJAr9ZnFq`!>iV_Qih()QzW)$9N(Cmi(5--@% z%RU#}1dyM6@CjNqDfh$TBSca+(*;}sEV1s4pKtf~*D%4|r|pia+XhTdVv>=ckZR{_ z3F!s^i;5IrRrm?spT)f>zcQL0!$s%p_Lu|0Sy}aeT4SqXOWFEl#L|!}$=w1*h7AXk zf=C`PV$Q5vGZItS4`=q%Ex`qYzx%w+O72FBO=kFmRwktI1GnMlYyLf`Jl@Of0ohz1 zCS6{o>ihkp{CCL#yYBL`-$|s!Dya?2pZM8|dmfp&u0FDxepDe&P9_$0iWELvy2PJo zae@T%I0`m%BpJqj=xIwP=c4v^AUBr>lw00F_Y@R7JDs&|9!}%{rQm4Z;Wj6rK1LqG z4>Sun1(>o+Hvw`M-c;(dhPNS3oTB}O2X7(?4VqpbI)hek`z?u~vJP=W;P=!ARW5<2 zJ#!MvNt{?~UFJyx+2QY(Q{4&W7@$FF^A_Mj{q%Vno}Z%8OFXkurF zlp;YPU^Cs=;RVcz(F9mLN3ED8bH~%O0V}u3^q8F_jqsPKN2ED9bN2NMpWtpONL z%u>2yswU$&i?~udQLMqrRK7$`J2OXwu=pf*6!Gi77Ki_*#fiJ43NpN&t+zj6(XTsU zeFOw78d$j7EA@zS`pJ&IaqH)ZT$ll1W$W4c_N(i?uFQG=`rkmY&dzk3Z}W>}?r!(g zuRg3vB^I>nb3k;W@hhALfV^`W|KEWvs!Ty&8bn8zr0@JriTyie&BkzM#n!z0uaPfF z@r=Oa58XH_7j=6^g8(@Vmht+iIYQyg?u<|pX2igF&@=<`Q1w(v{IUnL|6HSsC8z|R z1z8?Eswb4pu=zkMJ4ztI4`yBR66|A{IVJlqP`I=jNENgV{MrQMUlO<>=P42hiRSk{ zv(qRdd{WsVY{>t2Y0l>Ol(s;zSF9}uWa{{$Z$caMJGLfD*1^@vByb6>f$#CR8~ix6 z#1TzYFvmLKjW1+C4Lma!9iX;kUT}HncJ`af9^7iKcG*+}XFl=+U{GQ%CrWO#+$O_g z(iVrGj*lAo96l)m7j}681RgqRp7<1~E1Ljxs-#@Ogux1H5?DQfKxK`g^wENr>pxsgIp3+n^jU9~Rv^Y6PcLI1KRAm>!hny)gIo5HNEF$^}FN~CR!BH_?yW*+oe zPtanVf(|>sfcogf&g48#;)pu^Eh`snCZHao97PJP;+C9|p4(B&0Sd;?eLtc1sR7nz_v1xoyR8DD&K{U3ZI^6j{BsnVp zE4@*JPp|F2zFJYC)0X{Ewi$t7^lY5v#$7eGiz2yh9+ur?1q5E74! zw)Y>ZF4NsxjS|_5k$Qt7WK)`cN(aQLzBcK!0!KW}7K ztdX-`1l%krbK1Mz{f`s#YutUN$gd^c*GqO_Xo%P@OirKsw&boAa3}gBm|+}%UTZlS zdw#TAzr{qtiwhzsE{JHbD9-XKV8;J!cS{v&*h{MXKS`$xKg$fZA03iaBaEK>!n z`~~=kx-@dIUEb_YDG9BR#%E7)BKaCb)FDB{M7;q)-4Vc&dp8Fu`X;4s_0G+pn({L6 zKpt@#wdp_Lm28kL9z@t!O(S(vEs*zbw1NI-1o-duRLaVbZUJ3zZYQs*{a>dpo)yhR z&(lH78N>L08NcdM=-)0X>l4Tjv#I}*`O#erbnQhiod?gr#pc4-)=ewA{x_#nn?e>p zJ}Cq#+%vMg6GeRQZz6~Tu}TCW6mdYN`T(LL$+?VIi4pT1M_l18?#sYhEAl!% zGuw(|a98$$uKc~rXnqIYQ-zA!5Hl)alhgOx$Af=drOE-Rt`Fqb43${F7hd4-4E>0S zKCCU6tqlcX5a4M<+wA7U`l900t^i3v*>?uqg%M2OT*hC@*6b`uH^> zh`I4>^$Wn=M>9E$`bVw(VZ$h*UAfqOy=felEo=-O@vVtfQx$F7^%BJA{h-X#ONbquoE z6G<@u;w;U55n2ZCE8k@+b@+$BGtm6sUPvY%MXYJ;5DczXzTv)X{V&>qKHy!uHLfhj z3eYY+1G$^NqtrBJr6`@pQZd6RcQ zK(NQkKzVZJrt`n|xEUCFRmRVRSXnkyH!IkMSE(js0Z1r|1TDWZe{04AOG`fOY;qpu-{Z3$V~E4Y*`#AbwR=-`SZ(}>5!f3AVQ-+f+u2q9-}e3+ zWN-L%OG}AopGjA@Plit_2X-*WD9SHh_Cj^8=BQ^r3p{s@qQZ!P)pLVt z9aWyQCa_W8J*GB!4&nnlpu(qF8eEGrKQIyg#0DVI;ZJ89^$rDCOUPP1@ikq^8b`{?V^4aG z>as2aWGi@0K>SLlZddrBeJbC<;I(zwAM~Ah7v)8x^Edi4O;Nn%-f4eOf?q#IgwJil zdEp7A(wWrM_3x%fbApy~PkElCao9&5559`sD0`N`${Nb`OrM?rcEsa70hHn_gRc;3 zy#w^Pq`O)JaqX6;U5ilfJu=s z{inhvd7Wn6kBcx@E zV$zC_*~v@U2}d`JLE^C-`fzu>DRDGy8r{fmYgXxD`bGEm$Oi9Jk8$r8HTbquUCZ^Y zDw)gk@MW@ng79c+F;-9%sZJtlKf;3L$s)g>Qq`YZK9^S(JlCZse0h6)Q5+WbISUm+ z+6(Sxiz0P3WjzI|uVYDWJ1(*QCbW0h^_9fDujaa5fY9FjWwcPzim>Ae9?Ab<>@CBp z+STE*656bV+x2NJt1sr=)bJ#5A_m-mdQor z3p!1XK5hmfO*{xC`au%(0@Qn&eSips-Emn&yWA)s)ng@Mi<7N8n;*VdcsTzMNz@uo z?j=08tO#yR;ycq`S*x&kOuDV1_Ct<<#$w$oa4U~H2}-uYN}Vr>Jg)}%*v1 zP@i-o{^O+7mGgRz{h3T@bVp3k*Y+C;+nkB5-tY7^3@9#$*0qfwf;qn4DU$^;A+o`G zoC2RTTye7g{qtvlMdr*jI^rDs-GL0ys2>M*j;D90lXY+krQJ5KS z%>&pEjCSJk8}Pa2Ngon=_+h?w(4;^BARDQ7!Hp?e4_k%O4 z9-vja224;AtjF`{1a|-f*zHp-E2W?_`6FFQO5uG30-K`1Q7{>=v$(59oA3K|c?(d^ z_|InHd`A2WD+m=Q0p6T?Y=OWgi3DmHO|Cn6cZQl(9AYfTbM;{^pn;d;zxqwkT{wOB z3ji-s39P0{zrefMW7%&$=6DJ2Rgc5{fsU7ha4-bMEkGBS&RQ~69DIBdf;Q-g#sW2w z>`bNkdiwoM{^{-v$63sbSnEIQ(6#=d1R~gf^9}%=P#7ZcLQ(lR3U?SmLU~xeKtw*? zksb2jXjUxKI0Iu0Nou_p+TMkt-V|j=2Th?ky!GXvjUqV9~1zsX-g@9_);}s zD22Ny8vk$G-E%$OdC_xI8n8UnDS<09ZlIO@9i-tujRF3pQSJjEiSOr#H9!=i*!=Jo z)JBp*-jtreB~ITyQn0?iK6T1dJr|Y2?zaSJKXBf81@v3^TCF|}GDB5n{g07bJfbjh zUUDI?PvL%Uc32YPb=ytkD+aDoD!_m!>H6A4w332wGK?!29cJjg#~JT7G>gj^r3qwN z`uYK>sbut8NJghVrAQf zh1gljp8NNt`TzgkruZ-{(r4xapC0XcN$Qz(0D2tVA3d zg@?9Y|2r#EjVEDdS)vyUL@0NfpMV;XqsbC@Au)VgHD&OBvpz~rtipak(5_=t*BB~) zz$|4a?h(sczl=x__V8oU#G*LW)sM^|cDGCY&hKjmMW{jR&oS2_AMdOhGsb$!MfZ{p>WZ8hm`z+TI-kA#b+oyDT-5mNr-Lslv;HZCr^_U!OnQF4 z0MkdoSL{>2`mHX`cUWhV-5KHlznhhIvH2KwpWmSBxFasy#}V~|M_?$ZjzR%5xG#4$ zi-177Mlscao0Wa6zXkBJ(r+1hJph2D5&ixJGH%%Qe$xR4mvIHCtao2hqa2nt?aP!= zp+~g>ei8X}G+AFtC|_Il4P?wFk^n~G_pVw%z&!L*8Lpsbi@w$a+_v+TcU$fw;b=cr zTTnw6=r5wLEFYxeK{a%4~38=dbq5Nxf)U5&up@YUlJRN4niXbd*1%Y8_XwEK(F!||X zm736Fo^;0*X^b_9>uk{Vz+Ad?oXg1f^^Ui$zj`o2N97cqLF4H4>?ti$BI;Sg>$B1O zv{+??$L)8&2=_c96>iC#!DC)YG4^lcR9IS=5U<{%Ci*Abr2crl z$p^g{bwAi}4mn9h@D7;oY%(!2FO7THInQ%H8`2!K-6ngDR3qHS5ZGrTG>P`CnoUvg z=V&aTWQpk*2`7iXD|xzn-m|4Tv2=e=YupUXG;!9Vy%!I8-J|D z!L|QV^u+<2Y9>ZUfGZDC>Q6|M;=F5Ru4VuLi;L83fG$F+j0!u-p6G835ZuDK6C#x; z{^~^}O5R}_HUkH3r_Z|h?P|n6S_X2Bq1!x>)T?0$Df!6R((k`p`*v;? zy8#p+JYvyKl>UpL?GzXi8QiPrC66PuuYX+#oW9V!PdLV;rBK>`J!&HkG(v9C`gnsE zAss_#k6;vC7cg>~m#hQ&$9ppi)yDb{ZcJZ0zao8%UiX6=>wd~xiS`pxnpr+2@kz)K zmZCLN`cQh@repwgaF;NkEnFhWACGkZ$6JP59-#buAm;6MazYDuc?i>W$C7dfCrR;h z#QxDv{!^ePW%G?gWX}f&;J_P-_q5y#?^H#Yu*;I92tp#|wHPdU0o@}$XXqqv7DU$h zXb_5E2MhY_zH+I|&^q(|wp82gd%ci%VM*k3a5p0@A7Pal7L6$fE3n#ZSVCzVY=Q!;@J+ zVLyLCeFCu5LM4n~1&9Ur+u2XgcaaXVJ4mDakP74#D;s@p-FM+qYMd%;V&nP{;Zg)* zTV$c)@HaL1T|IU?ng6!%JFn4+M|D6^(2j*V<6N z5_|N{hLdBhb1&L^RHe|60LvWm|P})%VAOpxaXf9X)wN_7cz$NrCu$9U#V^ zLH1De=EzN_5*p<(0SdHp!~@*Dcc5aa0_wH`=Q%3~T>P>%6gO_!2nu*J^_Ex>?I?mS zaTMpYRJxCZ{LuWuH)c4wr?#-XHbO=0zWo7dzPeUeE!MA8FC;2~p;1cW^b0N03nT7h z$B!hO18!dY0JYiJ!Iu+LvVYWoSa zT_`5hq4k2D`04?Ej001&G6`{4^cbipznWOY$_j?}sNtS-0liN^9X=}$?42wDJQL8&kg3 zV@Fm&>p!C6O`c-W01EXyRZrv9pP*tpu~7nQnJh3_&HND=6u!qHX6;A9cSkr^VEvF4 z5&_#T>iH~adRbx-koEY0|A&iP;;#_OcZsAz^YXZP!%2FpcnMh9uk)Vsrgh$Uw_+^Y zU$OdKMSgg0B3p(C>U42%3(gST;M_;Bu1eVONDwqtn0B@7y5iMciK_Yf=SoZk905^o zQ(33g=qO%`R$T$|x>h2Gkk!}6Jw%4ZE2;>+x^?#I3kdASva!?>_*Pj6$5mBT6K%=^ z$7)pE}7=U$!;S~9O2D*3*LZ%m>h>OuTno5Q_wFb)D zg{?0MuThw2PJRep%x8}!=8mNX?y1?K{b>kZD=#aLJoy9A0Cj(%{TTQ$-+bi&3O&D% z)$m~Be;STYeh05L7nz3YYMF|7XhRV^0OY@ITXNz{w@fk*kk-X(3d;fdFK^quI`#=+6s&JlI2aJI7n|b(r1_7o>)i zfP#1-{@3s-6agCf=YswFWv>fqa6ws^O>CrhK}bdxFx-18tv*+u)crL{_)Wb5VkwI9 z<8X2Hqi`t;1Lz&Ar%(*KjY<%GeWNkG_o1yrEKrMY0TNUHd*#t$l4V*_Wi$|J!{CB! zmbRPY#M>mU&y1QZ>o4)PAht(fxe9x|fY?N8?Nd7$o`zJ~-J0-vU?hvW`fc&hprKx~ zN5rQ|j3gSR7Y_)Klx6t9mHypufC4^jEtRv7pNSuK#5AK23Hp5fD~y8BY&)Qrw2cEq zq7KVKjnh)mm!`qal$L^p)4#YehQ6|)=U=0z){~Qf1Yc>F4XXyED{uwgTH{Wsi=zdDG$LCGH0q7nwF8OPh|nK9SA;;K2b++BBg5MZ9O0WEFQpXBvVL?|bHuu+2wDJ> zgKf!75NCaLTW>n)LhJW8!e1@lkeFQINALfQH$x+Ib@+bEbLUH|?vmO=YT8Yl{>e{Z zg$PCIA+}OQ=6SngxuLOv-y5AqiU;$4&Doz-0>M8C?5y}*ZXGBJ_k-gXkH>*M^;N-B z|0fQ?j)_Bmt5<5RVaCFrp=9R-Zq~kvf@hyTobZ9PlZ+TaBr5sH?{>#f{nlMC=OoDN z;fF|EH*9WTlhL!fGO7otX*Fig)JPtFf!Z$Qfm2%3DK3?ho5L=g0k=Kt$&6OeAsIEW z!I$p9LNJ;9aRF>8K0PPyA9i~5<{sj7^IOk*uO`;F#Nh24@eiZu&7vT$)ZBSgOUNZv z>*Y42*ViW|0FoDE359pDAD6gFG?4`~-nWS|mvBZSf%QOXo6Ot>l$VDRVtzmVbXhi@Tz`BH&TAvPYcM}Pi{G87eV4mQg% z7L{XH!3e1c!GgJZ?g}B@voyKwLzOSiRdY*+rp;{YC0;pjtVB_GTbXr77E_V%hLsqY z`LGN+bsh6k(W2VYq4(eGvgR)n-nM@Y$}b1p0>qM(EYLA37c`u_15EiwWDB#8eMShL zaNDOMs_g!BElh$wltO-|0jz5Q-H1O^PlPEX@4&WvSzI*?16C09TA}Vdlalloi`ydx-Vp z@D{;g7{_an(+?V2 zZg0Qlxx%G|#D_`kDA@j{;DmkprGx-B%4?(%WR(Stl9Bg#71-1&8BHPq%JnD6-(HHb zoQ4W{d`8&pGX)jgM=Js1XVbs)xwp5Ju-6#5#z%P>CjI!uKG3R7iFMvka{qP*0t(45 zqSKVbi%StW(Jvm z`+4v;dm=nHWjr1aB}o7>J77WGmNMUW4E10h>B7ws7 zQZ|vcxP!)`JCue4eQdfTrOcQYz?iv~Q{O9KTGyWxGN1F(T?q&$rI~rb1n+-b*@=i& zju3WRyOc{mG=2bVew-R@&n;CE?Cc(n>!kW#Z&lha@a2jE7Jz_>#?Hb!Ku4uP1^KIf zO_qF!hsQMNrlQ)0p!dVGNs}*ipi|MD*Shtnq847JZhimf`dgkH=Yz!?PX{bOGT>Ino zA+FSIHJUrm)@r1;21z!Jv=>2NwSBk|52mk+vdJIn?r?ed%Nfvo1%Zc2?&`wVi>)cp{W0c`@dYw*>(;axk^Un;WxkxeimgNRh$SBfwJs@(|lNU zP%NFGh&pW*B|=R7~k3PBL3D zU}3>3ZG=Kg%U`D!Y_?e~m-C#z{F9;I?_#3~%>S?e|G`4&*qJ^)ik+#lELw8S@sLn{ z#hL=AR=pe8>0{1-+VE?%n$*PlyKyKPj#T!#vfFF|jsivrT|Hmzf-TcD`9M^2nk2EEV%8!(bBIb}Z@Vzp>0w?o&RwRpx1Rr!E6Bs5I zKBoBKWfV6B&n@n-mqY8$az7iWJTuKk8-C5ix=%iO*droWrX8yo#IrvDH`JOCX7@^U z>_iWwX0U2J3}+!hBt1*4=jZJGfh?IihDE=W2Q+m8rAgrBnp8PTX_Px|q62l8p57|9q;T@4pE?X*OZax3)g z0ikqHd_~r4cJdI2k8+`wm_2CG+SZ4L+W41-nh2->0hh|?p*WJ=Q6e&Zg4e}<30LW| zz$-i$=fmE}bRfIZVS3)ue`vEhN@66SI@>GDJ&>S3<2?Lzg2Q|u)iMxc@XoQ})XuMx z%&_AR77u#zlSB|tF0#Zw)uN`&ujRTNg3DC@L(NEmvm)Cq96!Y0{H7H#ffSe;%(g2J z*TUJi-gWoZE>OxS#0>*YB;KVfKkq>t0nT^SsR*8;6&0*NN9gU~T8|{q1@!2mEVv3| z;KI?K?BHS-_3}Idx*F?zWZ+6#;{%-IZA?v{)nLt?4=_^P(mtKz8qTqHDRsi1_B$+Z ze(4ty)wng1qEq`5fOGkI=?hhR?T@KuN*fzKqT+9^trZ-~`?DH=a$D3*9pGRZ6d*X1 z|HIqla@DWf!FP?DnwLAD7#T}*NyUD1>Jv_ldSuFrL5`6qvt*!ua@9gM3464X(ZvkP zu3*KZ5T5kvo56b*#zY_h1azhd<}}$5VQ_TLEU4VkU9#6%jZ#mPBD&wvaD47hdOii+ ze$IAlv`jcc7u2R#p}_E&nQ1Timi2TXHe}OnRQ7585B4o$FposO~!axI;$}1^J77HIXI7KVf z7vg&WtgQyBoN$ajq;?$oq>x_7Nqu`zOnULEnYxASn^;sO`UbF_4Cfsl82B*lF+iVR zz_0jpGLsvXkH99tMhlIhi5u$0;P!_zXIHdPD1>ngq5DGucL%V~Dq0QosLOs+kw z1J6?Ywat!L93-llN5pvh-PlZzV0a0fUy*R0@_oWg<`i*QXjErVFQjd|Jx_5aq&B0O z_)8OhE!;c40>}&QCt){^@P!EaL~;`mn@%=fS>5(X$jtVqU=>a)V5{y^18;EX8K-+f(yBpbZe{mS+F1rG+o zV1YculB$yvjtv3QvT&9q{iD1|__)ONE8#jh|26noDMv9mO)p#)Nm@H(SovB=w^chi zO+%IBr<~!H9{0vKp%cwzsdMG4jb8c6we=bv{s_@Be$X2F; z+6T6L>JEeMR%cyZSfVDt0@gswaKIk{Nlg#|RNB!PPBXWnmoH0tCAq2u58II#^pov@ z<8L6P&kwJMDg{Ek4!qnMo!QA`K~74uJYiIjNPWZr=ep$m!l%1))?=lSx8B9 zVK0)CQjn~HrU&U97TCf`S?I{m`*ATcSCIFs|H7-ir*~vy)SY}g1HPq&^zh5*kH0je z2;w{~8t31C@Ivm_(!~0|grh1AtpOZ`Hu2La z@*eefvIwcIo(r<0Po4e3&pVnb*54@nKf)&LcQ78qT5jbm2d!Rc1bncc?hYOLH)3dx z1`&fADc%gbE&@PgICLe3g_7Z*nlKSS(@f8@5k`Z}{F&3RKZ3y&pmf56+;I8U6Lg3l zsK5R7->{Uv)8qqt{5nyoXLp#66628K`=!FdP}`mQ4JZFAK<0j}d*!&gbQraBrPVUH zaW#t>6QyPKf5fD^F0wPT$X0yHn)dmY=1AO-DvTlPHOlO9(HP69j~Y5D{BE3pvl|&4 zkSs`b;+I9GO-VBY-e%$mE&gxXSwz@{FJC=JK42NkvYwuVmb47JY!0iddzDZ^rD;6GO? z^kSYi;m%y;D1SV^=m*h1HgNwKjB`6I82}eW`^*v%ErhX%73p02*`3IxFaHfvVe#H% zhiD~Ik@E=s-%(USZ~0ueb40nTHA$9%V8PTAa1k`d&o}150q4u@BRC7U7->K_3NZ$2 zP+#>%&KXpV#%$5vTtp*2tUDZ12_A;CezM6xI`Cgil_35;3Ew-b2W&^&Se<=z0%9PI}gX%r6vy@LXF#Pqf$^j>g7ROXwjDfkz=;r zX*CDjM1U2?w@;I4h{fh#hmzVW8R~H{K#)_fjdPRL+JPD2%-l#Y9Hk?@VC&K%rZ~o| zYWL*(iAa~4?U~HETMOda9$uPf#Pa$6MW7+Xa!{hd-}c0ckv4^Xd9avhGCs1_sZ2WV zS?nhd9wKdCBT~EQ&&WY(W)5wntxvJ&zQC>V;)g?kNk_)O$6>l816iKNbbQC{un9$% zEap2fJZE>0kLO=B_@Hdm#JuK*#$(uRje&I)iu>CF#YN!sP(9NgaIa=GS*%^yXaHQd zUZ8^sJLRAae|7-OwN(iimJ7h+_hvn6F6nQj#R&_03&Byc#%@L>i$InNxXzBoB@wPb zD_%b&X2u{e;Vd$H^=>zdL?T-=EPoYzeLOTz$MH;9vj zidSn#!WI~!^(i4=1|?=<9&}Wr_mhX)J^b|-t~D82oM*Bmk6Zf2%P*5mzw*x7Hq{{} z@|AgHcdqrea< zL3j`c%<(=b9Ob!S=`zl3`E)lXhO-z1I)NCuXl%e*u~K`MWU3K_B>eyybn%2KpDE@i zk6UlZDZaZQkh(z=bzadqk^+keXwnSCOt{JF9*pl_HmGF1#5F`ve~cs(*TULXgq_`D z3&WSk7vy7)o=hUkgXr=LD$F=?OL|g5>Ro+EO-95Vxdm9xC9If#jThD0HUEN%*#E*U z&c440AqL$Tt8Fh>pO$197OPAHQ=S3jk=d9VO5&t+rIFV}OdY)TUUBe;f}7{>6e&u2 zSSpCS*qaryXP`m?| zdOUmd*YwZd663FhNxmXQ1JG0nlExvKhr*A8shPiZO*3F>pbPx-w9|aAt%*5pJ~8Px zs)0gEH#5yVKvEjr4@ylUT>H1Q+Eb+JLt^|wvAhKSivWV(x-f!E&=xWWY;UFGFVQe> z3wJe^>s>CH{rrD6EhRFTn#Batp9J8zClF*Y^wp~b zyfburzQA`4PzrRAfI@xoSym1BWe?;6fd3=CMsZ@L7ode7?ErZG%Z{L05(6j$d;-l5 z5RyLw!KLy&5Hb~cflc_2qdhnb{*S*-Bmihn#i1iEpnBj8*9H=iz_wVyfS_AaKQV9c z7i$2%fPtMDxtJPu0S5!%b~2xsb-5rMc@eKQ;Ja`8Kj`IuKZ}Q75u4l(G)QHD+cI@; z%+okJ*@S|dFA^W{kG}T2io^g8HQ>Fd82I;PvN$ZHmHh}7^w&*D34wy498}|g>0|RN z>oIY4s7W^BYv8Z@Uy$ej`lL)mz)xwA?gH88ir9|TV}d@o4Q5?B?%(BpoFq6_35QJB zjoSUiu@$$Ta3Jdy&-eCyYzCE^c=wqhNhvo~{c~Wl34fr}+Bg5+E6RWN{}6e~2QY$% zvc>yCBR7A+K7tVK_3#?Jt0?1V&na4|J5Xu(pJx%_@0*tT?`q&Voaapu-lqw8R`RWX zQdLmy5mS;f1JB{MpuWHZWC>u{&H_Y!kML<;PqctTu7H}RF%ivwPRAn$6eb7w1>E=b zTosD%UM3JNz7=(DRz$s5fPcZhHwZa4O>Ie-`Z83CUp2QKyd#$Ot*c?KyE*j+IK zm47P)_UCkq22`2U$n`{6b|HiN(-mTS{ZDwEb0~ZH&#jkvUYVW4ZFVHY*kay{)8!sH zv{#(n^15t@?@^eV3aC*(1w)!_$$=@w|9p6OCS0{3qN-ag1ZlS+TR(gL`N-vSe{tnX5`9;M3Jp&xAb7h9S>&`zeth@qLOClCfH8yUw25OrWK>^x<4~$TROQdaohA6S+p#BKfL%yVCQVM%;9~T zciFG1N!~v#>9@t3(xU1mssu{NHlhfvYtpAj^DZM3-5##cD>V@?-R)!>)BgPg9uW*- zZW)D-X|R>DLFx8X8~mRg4P8}aH3W4^7~(<8MOt)p^Mr=3M5BVD2J%>rzo@ghWf#%> zbz%O`-$DC?E7Vj%J?@L1`L0bF;ol#i1gk)qCRdkh_79xuUZ@F|Qf%8R+iaX36#6q{ zU=$#NKX7FcfZx%vMCJ+r32wWvTJ{zl>6N0_ne>k5Mxc*@*Y z)8@)lOkZ3afL~VX?DYlws-Mk>OTK?fCNe;p#90=C0o6ywhcWWIw=Pd=3g${0Zs9uS zUeowZ;W`?}kDY+45g{lDM2v5gRyVeqHN&FMfa=ZkpP#k-DoSI^E(@OEk`rD_l{tIE z+^=jQF`^E?{&wXI7&kqE0fCeZ_{KS(nDxra4zLW*)Z9*IY~-nUbx(3zzz+uC)3?iS z1NBR#aZGgqqP9AGbvZWStE)OQYFWe?vSv5*`CJ3siN9atu+U$$Qj=F!W8?3SRCaOt z1d2LiDYjzk|K~@Pq)K;54w36xx4-WGu9`>|b*|lz^)3SIN3Y_aq6UV<4VKg`CTAH~ zYpMlUVZ5MyGtRg_^Y_x7dgC^C2w*1yO?+J7nx)hbTBPY1$}|k9;Oj$sde61GOMWr6}IB1S*KV?G4g_Buo&!lRQ&BCeowXs}KD&Q+ z2Buy1>800n^}on~rbd0AeNJEiab1z2q=nUhXV78Z(p@&tdst!BNdjIUG>o|TZ6;)eWAF#mlh!;&!g9yWKN zn3B?VcUBfUvZ5l(tUmLtrlydd4JcSSfLQAUXof!R28lXLN1O&%zsOLEO-TCTd#NNc zRfR)vq8=vdyuNu-J+8n3n(Jv;ta-Uy_&ldS#NgJs{KsJCj zQ7Y>EBIz{e75wuq2)9n-AeO1*8!*qG zfcxIUUCb;1S^E*+O_hq5-$n04P`#kwiVn(%@J?{khOgzJB-Ko0l)1X7K@Fe)7ImIf zZ~=Gcg`0I&Kl&n;mKTB;fQ7$*2||LG2hArjykO^Hl@cm{5Ov0{Ih`+L$WT&Nzp8N> z!T9ZU&SWK7)C6=wC9byMHgF>L18k$17kGdSf>ll*RW`4i6Bnunu*e_~lGy{0!4jNY zW^Oa)pLekfB)x@zQ!@Y|E)szW+ZdV4;L8m_%dpC#gQv!9JhCv;UsQrqZHg-nzByC| zEQ%JvZ&|##XuIbu(XHbG)mnD%{f7L8lVScLkV_lm4cRqr<;{>NDR{wgj1*7|PXRjZ zq;%iwelnlK4q&UnWdUy7a6j4!_roj=xkR=OxL(QvY=4fhr*4VXAV4Y(V4&@VDYBO4 zfDIR~raLF2gP=bm&6pZ}4Yz*t=C}uad^r%&4uS{KEWrO$TcNA`=n>T#3BjrfqSU)*rB& z{89i%J}hv5b7BGPG3p#^yRi8a-`382s|IxVH~g=IjzC9gW#G9^Z~`j3q~tmlgTND$ z)5c8S*imyOz`SNc<7AOI#OwfO6CzCyHr=O69S2VQA7^@46XP?_e)QNH7x!P%m`bz) zVd40U_TB_F2IOsh55%#o^}6s1@UBC^5yiT8+61#|#v(=AJxQKxru&usyjDEs*LHyM z8|y>iCVeN9x(-R8BQ%a1@IaFY)@IkVS8D0BgPac{OZu<9MQD^ z9dA2kj)V)>SM42vnWjlNLYM93)-diDjK$@FHGL+EiBPsXDh50tCcBg#U17E&Q#^=#1?U5MbyZRJr;o?y?B5POa<|}4vxeO zZA)qflWj|_C$&tmb~*!gAXLA3G_=hLyqE9i!LZTp>nC+4Ts#16sXJdTf&1M*B&CdC z>v##|!M4_$M#bPsiFvQIyxd_NgvC|5~Egg5?>^EvI9IP@V*B3*r<`xft+IgeDI0C98CVHi3yYo0bNz ze?Qm?1LTlrsO{(;Cb<^O#nodn7Ci)-)jJQ07*P{!uqPj|@E1SQW-WeNYRX(u$}>&I z5K_}i^6Bh%sj_xmWeiX!I!tk)-fkpY|I_y8uQ5@VN01<>{;3wz?o(N! z&dh%799-uDBFG}sZGQKB_4sUXMgPL3GQAXbAaCotv)Al~W9?2;rTPRg!T0vZX!@UGW8Gm8!i4uDz~kSWS)w0g8^2n!4N^Fe0FHRLle-v60YP_)diQSetr%0kKM%L!HqA0$z)6Jx88FhE zgzf5pToSmP=@t(G{os@itO6UCB!YU5-6~jlN!J13Wh?{2@U`~vMA-d@d63^OMomLM-p(61} zdj*#VnZ*Bt43WPSlQ#sP61kZ}$n%!Dti4C2pHu7HV*;)hokOC~Ht<{J_TEBw0C_kZl)?Mz2#;fo`On1k=+xtuE6=B`im0EVyxh~Pxfs7?k3 z!#eKh{)88p%S6yz{SR6nrQhLJ(~grvhm8~;!uWC)J;zAWbJ7$yg(&19c6ix~DXz#`uTacn_ zM-woi`fmFR!5wNy0%b?2si0aGPi?07qDY!98$Y6jAT&41fk(nC)1`` zly=yM7tn|0D9n}qFUw>QEaqumgv>viUusfih28+rY*z0a9PG!`!aX>AiS3XAA&|{& zyVgOR8~Rl&K{z!kj>wBnv`dUX2>Xh~n`U68u-vMwltnYMwWyV7Fn!kF0 zSK3~HEMn7|=ZiJSwZC9-mktJ_zlDI*p;AW|@{+Om+jc(rYT)GYOHAI!2-#9!!V{z; zydSHQ$6uO1Wyq@6HR>^TNyq%QA1X9OkPYP*qf#Q2${PlHP@NaZQee26(J;?yRO3)! zDpBxH6`_77s-&r@W84lT5oUkq$tjoQRtx`?t?~R6A_I?(=F62x!d=@)l5P1UyDwTpL}aoQlq8`qQ33zvXVDSlsHO{+*ZkP8Os^& z8ebD(77wf-zP==LYH{=%S<0=4GU4v)MD#3(>QQ&wV5Q;}RklWZBlbJZGk5o7X=E9! z84JF-yz~-|4=bcs&6`FQs&t5bmdM!*dbipyCRMbN9mkjXLl3@!>}3Ym0*u9|bNywa z08by_s}WhHk^O!cQ!N-BVY5-ayaUTmhS~^H7{Ya0u~R>Nfcd)er{b3thlfVXsJoM@ zR;H9~anatD9SW4h!e$1eVgo``4ODWEcFB?s=Fk<`BIhs`VQ7)T;j@q8(3y;3N37 z8DEqG^yEKD`>GX;4$(tW`KL_F`l8qv0zmOzFxl z14w#qD;kfzU(OI4ILY`t)8C&d6L~*EBbDY6;<~i~-y;uvk68=xKdNd7AsG5(p73Dj z*NhKv<|)?g>5jmA8~D)%pF6Lisb8II_%U9pd|`a3S)Kl}CiQH+bdX+)Ovsnw(Atn$ zS}NrfuD650SsR+bVlAwOPy`Y~mf%5n0G;%8EG85L@Gi!&psHst7W(x4=_r+&+y*|k zUKZ_4CLK3>boVjJMufFO>=InJZ1D;H7~7eV+}KBuA>H5|b;!5ue?#p(NIr}LrIwnM zx%m}ID8ewZKc+-(COLX94@ewzu}ZP*eB9z5g;agMTf~{ts{L_H9C4*lZU$Y4L#qQCbKYdB*5oZ4+fuS!$Vp+x-mR<`2FsT3-Ly359h3zm0%h;6>Fae z`3??<$vjh{a6+PRkeM!AtEyhkfqm2*j{JGaR34>sCiO+aDtJ-Y>$1=ieNc>v=Sh4J z?xt_+afpzi^LMVe1u!hCn|aLnNUp}>^&B&(aa5K@{(o;n`3u-<71(Gnlzmh+kZn8A zNlhvtSY+%MCH`lmezU@P$1W_)yb5v(nRD?=0$sf@XlE)GGQ5nvVXxBJi#S z*-J8TFYVrN>_wH0G(-jwAC7IwGUqH%B-nHF;6mSnUi8VF(txdMfz;Il>kDf7jGcyZ zy&Q?>v#){CcS&vyNsl}QtM#J(l3~T~1n0VpgLVpJ3iGQrh)u<-edBrN`Dkwt7Ws9& zI%lChDDT3aOvWmR+zC1Dy+G-H;S$<&3xH}4fv7|HLGI;cKZemAY9=%YFL=s7D$K3K zfL0VZEVWvIQ3%C$UFtUSnOQQOwp9@zCv4!MU2^JuisGj)f_s5-W5uYgmu@y2kL6iZ zTq*OVNi;Fqn4Y<*3Oqi2;qYsGs z-8fc3d^tFwY4|oq@La2_nUPl0>sfWnHGVj9Kj>F0ET|rXGPJEbt*wEZA7)Gn5)RcT zP?ntY$OQMg1s=p>1)TSOq;R;GEL7yOUu$`xw)Q^M*4C#nZ70mk$QrcM&dJBKBrr)8 zKOYD)&uI8_XPM0-%}Y}wzG159ejLh;hS5KhHYaf2YA3aUj?1_~sB32oSXbp5{{zod z{BQ3-G^mAnJHS|GM-H;FKz?74Uk*32N!K^Qvop{5t{B-&>Zx&Emmu(BA%U$wEFJ)p z532VqfJh??7&ad3q4#B*o_GrkKh(E?bEaGlYYJ&`5w8A78Guccm*+o%D{ z>uO=^qSu&~Emo=bT8i`Gt0#{xOXtA}R`L>IX+4^2wt$OB4MS28RCY--5xG2$`=1Yi zf{Yb~$zhzus?mE1Dqdu~0(~vHfIcW3q0xQr?Gs@JY}U3F5qv5=2zrPxx&6z{Q{L9T zgy(5VptNia+GW$<*lJ~FWFn541^sIWBsU{dIotWy<6b1 zK8;-j-+}SY#EDt}4~BT4S#ck{Pyx4+83f5x%Vx<(4rsHUETyZ;JJ{E+z{@BzEJV>6 z@Zxg$3SS0+z5?&Mk?G5COoklt&Sw(LaK}b@=I=wAvb6;DppLz3YbeB_j7e%v0Lv~U z+`p+WKLvIha}89q^r1)wSF4Zv?uaX|5bT?=^j(HHyIiG4*g?ND$aT{jq+vtA7j+O2 zZPo{>Aa_e}#aeqE92Ml$O0+uMq!7md4MvQmgoFCE^n4K)@CfYrXnJyKoTgecyP4`h z;!9I%+Yb3Y4kRgYrn?ZYL2#}!^^oghMO)~B+(SGt@251RO^2~w#s}PFE`CZX z{f3W+?HvKGX{cD_EFOK+c2z^WVyL9w-xDmI>=zm8D86OHMTZ^5)4iotg!+h7U#deO zNHOVN+h4u7cL;0=E{Gs8eKe2p#vO2qbahFV#i<$^ZQCt(F#3fiPBk@ijkds3U(;X4 z0})-um0APA9V^odmqSVkH7x8!fkUqN`cAuq4XLUff{0dsL-s2tT;FIUA_6@c51K(O zbVeD`Sl3DIULo4U@^&#K92~M6p)HlKo{C;%I)1JAXjuI|;ZlCmlTi!+9yN3-ZW;4t_051I)=)|!W`Tzj*jdiuAKHEAeXh%5nbT2*-=GB5*2 zND|~Zbf}|&v7{O%NWyJzhtr;v4SL>$LcH*7)O(qNxfhi2%y|;@oTW(_wJ=EQogCIK zLHVg9auv+vd84FkF3&0R<5mEyrNEHIS#K6p@0Pa@i8f!g zXZK8oir3pk15*$itDk3QwW=qsg76;0Na9;^l&);5{uFrT*-^+oanv*lK=WQa))IgP2K4-1f}i40ka%H5{`3u6VN4IPQV3 zeRE-?ss}W)Gzgoo&w_X0f2|8r4Q;*)cHt;v$eK+->DvSqN_<+pA(Nt#+5y*xiz=dY zSME1I4_QxYeqsB);xdQCdot9Z_0vjGp7A`A1#NtRrsw`_avhyWgfCOC_;UfL%_Ui^ zJK!1*6T%e?!IBcf@J(*s;sHMLgW->82Ej-$6K+EF$``bnDtm`->6t>N7!)nHn>Vew zPB;>j;D)qTwzmx-Tg3@0nFmWa1n?W$MPHEAX9^VHR_y7oj`fA+}64Mgb{RzWN>W&L_@0 zz!gq2CAErh4_{{rgHWaQc7E&v2o0x4oarJ(o#`g9ml8TvJW7t=4~$I=b#Sj{D;!#r}CSbwxb_X9m!ZmRnLFHjhBswR{kgmI+Gu% z|G7ADptywBmF5zz=iSP^PV@uK_58my&Q)8h{*X!gNumzsCeC=AF);OvvleOYG+V-J z)(1*ZCTWIx<$>sl&rBx2s1x}Kjg6G;JNJhYQkwk{xLr-q@p=LZa80D$9B#x{GRW(E z?RQyl`<`HE!}=vyO_2q1m=PYO6T+Q0XTk}=D5Q|5it~ue5PA>>mBKM;tQf`n(FZ%n z;E=bXqO+Bty7HT6mdck;VAEb|My8T?){6A zW9QmoZvzW_XK zBG&pO{T!PNFA|TDy3u4k?#Y*q^vCUsn@b=vw0A^`P%V!#{n`wQgez*M%)39kQr|Gg z57%qz-2&57pU((Ry-)mf)I>~jHD6yUm#W&ws#83!=M79b=0-^O@s58) zw`St264UI2UE*rvx70i{GPN_LaY$ z)q*;=hx+hY{5!*S8JhX|GB9uAPobs(1?n$i%!IWhcSBOsx7p#W&(4UBd0EV)zv=Ya zS{C=2a4HNem;moGc-yE(ga0OLl~4tEI2-uksbEjXi{g60q7M1{&)4ogEuV$lZCHdA z9vr}44+w5%e-x^m9N`Hux^2d47bVVD!XZWnZKKlkmk#`aEQD68LW9V+v5^f#5y;a- zwBIcsU0`_fcW=BFD#D+#DTb0+N^I`vgyi}RSx%4sZVpqI87azvzttGo6EfiW1Uwiu z_(K%DCW=cMJT4=`PDwraipjX1VHaco5n3<=XC^-_?uynPX25dSP4bi5Ig-M$diivW zCvj=`er8$mW+eqpJ@*Z|yG;kJlQxX$$Wu7HU`pi@vQa57p#4i^W18tZLJ%p=c=icj z%d+Ee*opU;$T}_X{aomr{>@>PW6Vi(`%Fb^V3xZo{cgMYEPQIW_Csf{zPLpRVd znPzhoip1=9rqKuC>|T+s{le=`rz#DAg75N>F4*4hFkHM1KwBFx&r$ih8G%|c#T)p%RnZRjVI;aWR zUifv}`>UrJx>l=cS}q8-0G;LDkMNG$u~#mBdfoX<{mSQvZD6*yY-TfbS|w6#fmw!L z?MoXYllq$ro4UdigFWIO=a}@k7_cMj^>~&^X|DHIOdXmX`$gL6q!(tEzFO{>M}N$U zSDdN#DgDDoqP+oe&H*m#a~+c>P$t$yh#$@wfM{(yZwH8AUrp(`M0@U5^gc|ws-3YQ zO;=6w(05v%+|x_-V!-N;h}6jm$kB_;;l)D8Pgpat)iwUAlYYHjTXbTee_M0bi4hDU zQkWJ6h=^@SbqZ&D-n;7UwO(4?gXwG)gs+O7>Rr2;;cca}u5UIV=UMG3q}lHIM(RLT zm-NAq0@a=XCaXx~U|+8+9gFrdw=BvxR4cB63rJ?83F@fFO>1c1q}R#lWtOX<$B$2i z4trm3hB>ULmQ1&L-qHL!_WR&deEh8hV zjvcZhG7CwHjOh2e`h33M`*%O?$Nf)#^r&;Lb6wZ_{eHck>y?DEk53w+MA|s%H`M#V zwIB!>V!9{SzWmy6Ey+NC9=U6hZPdwQzg5)-=PW{?zMAQhI+_@%sO@~_uWc3+-b`2v z`Vp-vqk{@KcY{t-Zng3X)xZpDXVcOoFUe<=Oy55MqVunEp*!@1MAl#6uD7yV3+VS7 z^&C6QGYlETPc;Yl{cG)D=FMg4Ocodk}O_janf^^DtLVpCHrKUFmaO~YL^xNHi9vsz3;-l z)$yO#rFBe&lPm&#{ZQ)3!8TLE6#~4>7BkDQAF;E+VqdH7WINmm)%EPe*x z(weM?5Qa$S3uk&lr2wz$c?)L~$BJ-Yutjwja`iF6xA=Njj>#ZTIzlYbWERP<+W=3FwCCdGKFTBNKdD05M&v|?b_^r8G zWClM}oc2s!jH`{DQ>E+;07o!%F<=JAB894#gD@r$;b1$p|)X@z*2*OM%^qmK?})RZO`= zvZz8WKjQG)zrS%T&dx@vL=lZyA1kvk%MkI^5DTU zg@A?{h40VXkHmZL)YDMIS*U@Ly8F|*EG{kY*r zlIE*)NrZ>EF+z;n9MrDW{4ec3bd`rI^*F`fD7F;uLJGiW#i~{bx1IM} zaJon!>2ENGDZ2h}Z`E3qJL4x?qXcL}Hd>HhSo+2#GK>?_&|bwI!h6WU82WM)=k|f) z@|^ay^NX)^`3w4(^lrs7>T{Hmfx$XnKfG*Wwe@zg$b+IlGrA8{krOO6yk&iyVWHBKRX!gGr*q0lWW( z(zBYBV`^FEKN6a|_!XArZ(jLjtlz57A&&m(Sr6U(x#H(?YCXE;-7D8fn@M)X+pW|S zDG8y80$ARg7eAB3QNZ%^OLlzHCHbl#!cg<%B_+3_o%Zhr!m0VQ!yI9Y>&Q$<{01Kq1DUbY>X z{cS}#9kD)qR%3QbVW)|=*-0Rix z{Q}s7iV~kEt5I}^;*L&2wsd>Z0VHNlWW+)W$lQ+Z$2;awr7#Ijj-|Xs8HZ&o$ap zjP3+wDlQODqh@OUf}(c`uz>;=bZg9&i)w5)k8hY$siEo_ZR@?e&YBLiUMTn)=_rBV zU*;N|=mpIukZC>|=K+vV<$Oo3A{67bwkH3PkHzLGI%4u<&G+NaUmiUi8FYQm!_hl| zo9CK3?RsPFdfTpR!kZye4QCNbqNPFf^8^M8oV>O6Vjqq6k>h{)x*j5xpY80_{ne6h z-@!^<(~x64a1Y> zP68mEOZ)kJOuOg4?Xd8P^I#6nZ^)#5#DXQig&?s(11yceB@P{?)m4)b>#VdPGV}84 zeYG0l-BId`$_d0-Z>oF)|YFmzg2>&X|a~xtgzCDm75q0_oqJSkBsZyRI zKV1tFaU0S-h>XPM2nSxX$Pq53+p!hu_>@cX3Bm#|Ku}`E!7F8VZ-XZIW9hozIWr&* zzNCI-0Cg6s{y)g|Z0RzpbPCZiRtX2Sl&Wwc6#t6uvP1j(37pl!VXj){tve38?Y4>w1P83E`Ir>7KUy3@R1 z%xO*|-0pJ#FqQ4KRSbx}h<4AIzl~V|{kod2+i~WSG@A3 zVfPjZapWfmpgyjWS_JZbEsM4p;rhvzVx+DZy7=k;_p4Rh1L)EjFkLHxhfTqSs`K}t zJScv0w#8uzgVvXP(cMx(OU))X4yiAWA%>i)k=#bNv5G9mkG4)rzaOmOjLvhOquo7! zTa$D&fGHd|6J;M@hsY8&t1<%$fDEQIs@w;~!UVFR1uCM)%&-{Dij zrh*cWm0d$f%()vV7?+fja4R0u!a!@E1nhV0Da^4L@6f4^Zwyc8YJQ7NgOpOIs*8Ku z*YdO|iN1RVLlxu%3;vFHAvn9GXvuWB}}E=(tN8?u}Qog!LY*ls!_;^1J8l68>CJBZB!`tv`cx>-QGpSvGb$vRRQ@%W4;K;5@R z_;L3I^N}d`MN;>cvJ-+M>mbY`^3-2n!8#t)&to9sI?gT`W>KS_) zHmIw-3eoM`r-+M+{b#PRTK3B>vpUElp!T>}P1iYxaoj2G>*q!-6Ax{_nIdA`r~lE@ zvS^Z);d^-~ynoxPUnQM$7J+>cUVVi;B%@Z6FlRhW!b?fyH|IFh2*;6jIpwobyeTSE zUMd^Erj9A$c|v(F1n0e7Is6+MQ;kKApQ8obN!T_3y`}SDs&^hBe!eW`?|*;>qgT%m z_X1?Hk7eDtD2b1`i&iKoiTY10ShTPqSUjSvV;Q>B3>dyQ7hPZ~>{Y&PW~I+oK%D8o z1{wcp^#uSRZGYH+jt(it>3+f?WP&<<<&P^1a*M*ITtf> z)MNMVo>6amqkgred``UyEIAS&iOAG6Y=R0#gs>~>Xl6N}`@aYL!v)wB&(0~3x$peq zW_T$VowfHx!dbA9Wm0H@<+Xw67Ej+d9(H=h)3_`>-UvH((!P|FP> zT+_9xf>ITf?1$lm`hKJ^@3to;B)=9yTGciD|97#y5W+l{_p6<-e007S zk?`yRPzMF*Yspytp8-a7u9*`s1)&fA!uq&m5SXPH&g+6~wHMBc619{JUpN?jpHFwk zg9dLi^^x5LC%n*XJyg+?`{%Esnq3ecl#6&7vh|IU?c!yE2m)~9TBN~rS>4_Y8{S%t ze}0wS)0luwm#!Ob2?R`(eZR-Yqy;YA=<0BOeA7+ZC;0W$pPhso^o&_MCt0L>YnvwR zi;QmZ>>l5UA$@q*N$kkSv)byf${OjzPf3J3mOYHlEFZA9t6S!Q8Pw%$705k9Qe!)ve*)s=x5W^Vsbiwc z`>b%pk+xcz%`Sr0W%?Gy&3rclWcE&Frpa-$h1!^#%gY$Q#cROA$p!woH(cvvQgyKX zk>&YwXnsh7tpCIrVl655)rbQ+;lATQ`t}(+l-QIUu`K1+zjN;Ib6$+d!sU0duWr4u zs{Z_tWs*fm%{dCFc<<>`V@=xKrwp9uu#czO`kJvOmP^x4f;Z(YC#~e?ua7kO`FMP* z8B5i@Da)Pop~neW=-!ihhv|~a;u%UWD&gqxQtX~g9KKBid1dPII34=1qx#Jqd%&i-g^8QY z3myy2kx>$FD2Z+(!w$ox&|xcl4x{UZtkrKv!;GT_ObXO-y2nY}K?v|MLpypW>WCcn z+@`_iY2prLlu7t&1Fr)%iie#I-F=S-xXQ1c*poO~w#Zt6_Bb!&Qm@@`d3HMOf=o~a zE&$rgT6q$aHVx8>KhF+_*nb3g%7_zrxPyZg+&q}ZkC9`G+}rcxE5Dwgp>95%bc~!S zy~k{slDH_4yyj&ThVu_IN|58LRC0zvJl>kgp}5;m2A;@W?CxrY#6b}*(|^-3+bD#uE`Ncf~vt6)!2Y&b423n^P4` z-oMX;5vjI3(du>Zvc4axn{{jg#d!VaXoiXNX)Lu-f!$r%FFly#EKstgp+wURY0ORA z#LxDcZSviQdQ{9I%IcrgW6Y&e>aT5coQ7a{rq0kctxa;uua-w54eD3-w5&lwX7mO;W%m6ZCDTOGq# zbUHXHn!hW6o<&<9$ac@5*^AzURRIN>h2rltClRv1ud}|;)=2VNUH1DR^AegK% zeIucb;dM;p!hN*c>ZWJNSvv*7sE&%6yd$hRPYE6+c7ndIJ0_fo$_F(Tr;KOyeD%Tw z(ohp*VXC4NdqJ{Scg@JjQs@NTuMppWZ_zO?!Q!6d!0MY2|$ z$N9%X7>e&#J7}WI(Wm&B2r1MR;y+y6{AOpAiacBsZlf?sX1{2!nXyeqIZe^6)_?RK ztjT&xbye0O(qUve%XE>@1TdjdK)_fje$7O?L{yV9?BN3V3?}iqI~?{u%1C667P}x5 zU-WkoJfRkRHV!3RF{Z}da56ipeEjTV=1inRCl@IRo8_Zs?d@v+x)g(qCKb*y#OfrS z3d}^xDTB4pI|;FlpCU(No||1K^>-gLagqNCI)$W5HJ@6JOprh0t$zmtl+G53STND` z!{`UMgaJPEe(K}35w20(pCX%ttkrDRJ7|0LxNLLxF#$Ahz7wsKAeuL`a5ROHLRm?? zIYii`wz|1;=Sf~JI%QYztQKRBV}+}%+pu4^3T8^vPh50ouabWqQu4Jr^(rD`JSPZe z3a0=bO)g3|H$=*H&(i2(6>(~Bq$Zf7wZXL2TE2Fb`E)(qmGj)0tB+-BRKI`rkD-K5 z_-pm!{e*||86Q5MD#4brE^~VL-+^(}hJo}zrM<5GK3Zb3rfCz{V47k~PTloLFDqe21fRb3TFdVI03cL#sCu!qKPRHqXsj5Y_542Tp3dDPPa?DHcc zMnk$i2i58OT2uNj{s-F$gRtRcLB%0m!oA!l2I5dviXow0NWn;9{fpPnikmW( zl*^&CJ}-8cC7%!dR$Hq~AJgA;?wuf7V{(^G{=N|HSh~@PBSiP_{F2eMDP5Xd<^>Z5 zn9{_d$(vHh0}W;gZqJif2wO~i@z<3`nLEirN+Rg9$?I-`qVdlRp}1WFl|s#1uUD;Y zQ3E1k8mtp_6h&7?|C;$se?Y>=5RB+T%i&&838=znN*S?Hk;Y1w5m8Uy*$9SxM2+*A z>?4?q4%Rk^(Yj!vc$p8c_#Nw03(N#=Nc?;LE~fjp=UGe_h>R~zRsRsruJhdK&tdYe z;X@<*Ur*M5_`gxy+^foz7wNQ21i_TuqO<6pqT*TI%j;Z;?!rXe6)Wpmmt;%sXPD7Ki>#3ShyI8l786*4V$^9IEz_J^rf4 zqQKNcJDjwBC;%-^AOIq=qMi41@#!VIL!Ykd0@JKfIDb*0>di>)`-YV7RT)8tzN=Sy z9~?jTR=BQ1?nejR(H5B>6-k#uY$j(zcpW-r(8&^kY$ERz5N}+vN4ghMeyY;PnA7i5FL=43%%a^! zE^XddNSi9(u_Eot<#v8U4ep{V(m$66;!X4mOMg=^jAW}ZL==&z`~9zUu0#uC8+T8l zfVzg*CmGpw@3N4KaE}vl`E~NgV@)?1jtc-IN-Cnm!|pk#Wcz35N1+uNrBLHqrEPYs zbkwt?bL=?jZYSVtqKnR`9^1Y}HFIpNs-2j!LN}=4jc@pJzdITrX4}ogV!_7V87k z#wrC{072G-w%Um-9_AM&nrWRA)q9DVFTR`6tq*oZW%qgq-uN+o^s<{l)s?(K{EZ}z zKac0bLVB7_iLt>O9!Q2#B+JotxRWwmS7XEgosa^rp_cpkQsq9lFdDP88#my>D2b86 zr6&!F@#$~Wi$X*mJ;c#QRy$8mdV*>3B(r$V(VT)cni;?E^6fkcfF6951BT5;Chq$V z5H}7IGm9l4v~;@a;3wDcoPpr5Pgnls3j@JRDhEcG;s1cTdEC(+v0?3T^GYV9IaWq~ z*aqN20tm0G3kJu(Ulm$bIW5}($!sG3XtGRBM0FpX6m2C4M zzIS88t8;k^5(TA!x9(et(4AV<5N#USqfK7b@}IQJPXRb21u?mRay9o}&Y~9xg5{=v z6?zK1ST%xOU$E*@lMbddZhg}J0O*?q@H;$(PI3Uzl*ob2w6Nq31+v*V6!1nJA6?+H zj0QUBS{l72_zR^+65awu@Ybkg`oh=yu=`GbXxVx9-(QNs_mX%|+VM(2qM!uyOjY31 z%yGMsvQAe@D;JDk+yIK@w0sgAq(ew*MxM|2PkA6*&MfO0ilk&PN)`U*zz;53UTWf5 z>S|Tp+dw}@c!%Uyfy3%V!H0VYokQoBO!7_jCP!!}V+$oFY6ZHh>DQ1JkOy!JH_Hxa zh#cNkUK4USG>g09LAD$)nUbtNHKc6L$`Q-Y4ppLH|ecJLQ~KzeE8-0*1JU z6`aL+;O$^w30HRS%o%;i$w$LXDAFLIig|ij!=lP_tSf%{%!p9*ttrknGMSk2;klW9cNF>t4@eC9=qF!} zTsyA<)FmCBPw3b5*HI=?5G60c%ruWy(qrS>#I>ucM}-gR;TbXAfRQ~X6}-Un zn}K+<^YKV>a*K9nk$NWQ^T7LF4d4(d#+!a)PN*FPSDOTeNRLMP09Fk$H16Y}F+|E!@wfA?qdU<1yBy?`;5m`U>r z$_@QnWm?Jr?cI2EkJ|$Rz*E5Z)7M~ew;+a0@xptdh*(oWwahF7+Xm^b0%R5S2?jv# z$(TxN%k*M#25Qab=>>3B_ZZy;A^4W{scVQ;{=SE3$ zf_Gqz?($=`ajdojeC(*L+|2w3xc>AlhW=*ePtI}dR{*_TO(-}JeHm1}ydwhcrZ;KpL>?E;8nzlSAU6{<+3YHvHuYwjX|H4zkEjt>TjW5!uERs1WIP}ug_+5#vtB}t(Gx>ZxIAIEtj^X z`z6Jd8{rEt3&StB4B>B-k)IB^xk<7S#BMo2PWU};O>I*4eU6IYi*@yi7}A0r&i-q? z5kSmvKpV6lY$3q#X*ZPtfQ8#*l>nvY;G~Z9DQCUD=*<=ER<*)7s$W%p49%gGr& zB*Q^lW1ysv%r2M?${G>UvRFa1-;-ezn-5_NFSvI>J6jPfkTx7_UECWik%a_PcC_^c5lOZ&f~jLK@?~|SiRTdyn}ng%3?K!m7G&lWw=mlR`LDVQDTr1| z3|B0R%SFl?oT=)RZo9!rSF^?5bxtEmZ#0p`CW{^&-AKWr1Owik%Z|00`A|)ETKNO* zX|gJH_-2mqxgikKxK(dL(mv<%4f&Pf{m2dNsL47BIV0(r#KNso0rc1&<;LZ}a9qp% zy~2`IeD7J3LEy?vdPEf7Ru;sHIYUAbZkk8_w$$+wrI~3f1)}4-)el9<^>CIlxmD2= z)v~0<^?9mJZdABY*NI9#hkUJ6AaurK{SuXzBQm^PpMRKc8|xmsKlBn9nsay5_VsR& z0!4RL0oWoS?phiIV9w8dvqmX?^w|2;SR0(P4wgwC;$6imm8(}S0=;?v!S9}RuM@|% z0G}G$6%v0ocSZeT;mb(sj)riC;#)%FViktb!u(%l8V|T{FqXxu>v34~k2)9FbQgU^ z(*F^yp>12(iESyL^ejBhR+AXJk(SBFkhA9tfwfcEF< zpa6VWA7V^n~QPmH!6rXb#2@yMFJ74_(sPk3($vyI$Fq#|B>@+)Y{b69iLs%%J$mLHiOcx#!bj)FvrBe>}*+G+Cj1wn)Mr++qz|a#!F6Oz~yXA1QzX z9oDKS!f_e)_GWg-R^%j+b--V!$c9QWTd3p2SdqGEe&cYo&Mz93SH8z7hk|!Aq8P(*P6I8fRdr81!PVnNg3vIhcg4P>o0&XFS$!2yHv4<0?&Nm@{LUGFa_I(EUzS4;;JSG7{*;WUa$iLFMTmOTt*=bU8 zIQts4!$CVCBFJ%^U$GP10VX-#e49Bbv3^LaK2zgkhq*k|fKI<+%YhUoIHXEB*iH+V-_vm0YBie&_D|0z zx|}^RCL`GflXP6D*n;2Loth9I(L*~EGWS6AM^e4H0+XV5X3H^|wFbN#NEg(k>kO>; z0Z>x5amqG^MPjJ2d(JUg%od3bsoxqkDXHPICvu^qFH!UMe=2dZ%^yTlFPOGm?t}(1u;f_i*X)AA{{(3S$9WXUXD@Wr?x;4rL)T zlP4eAB_0XK@d+lKC?46<@rl-<)L;H?6pkAeq4sp_@|q4c#qjuNroA7~ufuvPaA4VR z>al$-zVp=xwKfYA)C?Dr`6K`hQxle#aR8Qe0irWfA+urpH8jVgEqWjg-1yKbOxj}B z>>u(Jk=L-gze5GGT(7G&C^1e!D5Fq!S?*Q5Y5&urfY_Xt*mKbnJ}pw@=`L!+CKd*$ z`tb)QG=bAEMM?$3v9Z3o^LrDGe&qN3$kEhi#ad0Fm*{lS1k8f{J52$K!hiY$bm=m(1qLB4$|^l*)pr;^`K0t`& zs9jMLZ%vZ;eir@DJ?H@aZ>S^v3!1n{>K=e^Qlw7le6(OwK!y|z=cv;)HnQ{aoMb9% zx&{zSfFeIw5G7$gw#K)MU&djcm;EymE-kBk z$=+Ma|Nid6cTgwP z{;I)DAy zqrV08NF@ zDne&IWiS_-=>$dfj&ATEuH%_mz}AO8$b(<`z!Z(-qV_^qj7y6cu{5bx{7ye>6@VhC zVAtzhffOyF-CuLT|Ad>g@H&p&U%Q$&%l0)d9*UF{(utFTRjAn>7M1H_|e`8>PK=v4wB1)#LjWAA2fM|)qn$S(^O51Cu{Y0gCB6n*cLF?hB z3=hi$1(WIRY$}>a4kwDbTo;%Q82rA+godYMes%(?a~yc{A~arc_wPI1B1J4qnmA^{gVBZSf~IzY;`6$g(qBRjeoyo`XweD$vAuU8Z@d~s z1mhX;`gRS^A-DYlW&sdhutngN7|g~ zCXJzTiQHL&ynfd6!vZ(bKEIF&Xb<;9UeTEqE>PG-djm;Dh4VMo@_kdmR= zG==CQq&GW(rgiX<%g_C9AyE47aZrPpHa*!2a0D>L+PP%&1C6GRy3s}>%?N2goW>gW zz11mPD@YKpAU{=)b`LbkebARVi@e@YX2B^4!yOQo$UK1e>hC$^57v5l7{mA9&pJn# zcnR(Gs?oh8bBO2AFp0qc`zG%kcdn~!c$i3CJCbO$1S7bF@}pEs)dc~H8;5GFUn>XL5W%xyRfBlC7|Nq7AAfOP^!JHCR`C~2| z$N*!Fd3!)zlOx6Oc`WW#p_MUSn*7lZH5WT^L-e=7i)lZ}B@Uqjvh`e_8 zR~GkB?KlzeQgdBmveHH)Z9J+s$SrEXH-4D9$$-HX@%aI}B@J*^8HE^GGH^*GBD6px z)FP7#J*L~biV9e9(CpgySdQfC_Xd}=v%{15ISQlMFv z)ZYgV2(EOGa^$<^X*5uzg)1CTK$Q-V3P_PNjfrSFZl>MP<$$ z{)i9C;Yo=YsIW6DRIG;s2Jn`}{#bKEUkcdjeEVuThY*AkiKY<(4#5`utgqBXs&@=Y zf?UYnybU$cITES%QHlotM(ymtopBqX!mJUJzAJC*8Lew!Ws1jh(gQ$Vi+V!Upq zkRiCAZY{cK@;m}^m&Lvf!DR^}L$Yn(;Zb=Y39F~k<(Qzbx}8KzK~R6+1XuyX2UW#D z;B5IQi6EY=)8q!HkIV2YmznWBHh^nKYfxuDlU?LNourlrB)!Vz7(oOu)%bv?9A@5A zS+~w0f?G{cl0mILe81S+0xBH&Ba?wB3S}e01c^7~TNoQgTfrE6CEB=?pt!INOoP<0 z*ikWX>3P6TodWvN0po`hXCI7Wy@|BXLfULaSAc_1bgXDe=t_}p`FptEupMmnl_}sw zy62Gk(em?`z1KLC7C=#Ke(k#$Zb0t<%x$Go-mTu)YeLye1 z{ui)LqSa55a@zNyaBkkUec*5nVo8Mgc+H$4 z?W0IaTO0H0JcLqqAmB{GzdJl!%~mwc1P0H6;93i5^pQFwO2qd|=A)BhMlX-YY|4cE z>(OqZi4?)nf}~egAK+RU1-~OKa)jWKEr@l>R+!={ZQ3^8zifIw7-vU~rC2J6KIN8( z7>%7{s2U8Q(j$v&m7C`lk@O-;iOe#FE`a!Yv|c|V_tMVoTbRrJ6gj?UKWB0{zX99a zU&#KFQf*Z9k+wkOXv%*R`E_Y4IOjhpNnfod{S!GH6Bo{QvYRnUVVg#8Va-IukdB)sO#CT|Ht-LN~7pE75agF zw(I-Z@yBoFKC8N3;Q#MQzBguzBk6dH-j(?EPyq^2A{VDk9|P-460aiowe`|r5Uj6*Y~Vgwf|l+}8H zIW4&5MVfj5gxiS6I6QJ(D;nT6lD=wn;_W8ut3fEPcJRXkNLP&LD&T--w?(Kytt$uB z6L+&?=cILg|A zG>mQRTzV9aQ^>K(%ngt}Q#qk2z5Ur)Nni=ut|902Y-dH*E4bj4I9tlYfG5h(#~)0iwFMM>8$)s z+M_zqI+J#<7fYcH^>(H9|i%fc?>SoQ^I+`SF zVCvSX+5n7NM6t2m4cMH;AJdj|SipGpB|s`6sEMp$0c>m(Gfbm z$X6w|XwPsG+qxPM8M!F`)a5xwPItU&*r^0x0q|m^YMzfqxEK2%%JGa%=;Ou*Um%p= z^qYq+l;vw|u`Dvu5J{9I)rOy7m}eecR8}v_ii3>VLaY0M+{n8Jtlg`$v3u@FWQO4T zvQ&o$FKOx?_NK{*j*dfKwbQ7nhvsmhz938fB`vi~POYi}>-Pu(yrf0?o3oYqwl}Hq zVc&B$>D|XSsP5V(`2WLa{*`ucXJe1Jsa|N+QjZRzIG(cIL8pbi6<3wL15te9KyJk& z>Xts3;PJ<&I!a1FPfy$5X|nO({@Em2NNM=)AnHJJEdK z=e4v*{)XAv{2k)~w>^B9Lx3@TLX7j7-X#I!?k<%+vPYK03*y&N=_vPTT$HTvY73E1=A0pWEl-)i1 z+D#uzVZ7V@$nt3m6Ptwoq_w4CWk#FBt~`ldq76TBHp$f?Y-8cOY66FI#air%^_I_n zX%F@K0Vg|qko`Ox&#Hex{)z@7xq;GRtZS+-yUgJnPfVX5w%P!MAU}z`8Hpdb+de)P z!hxfu)^cOhz+c5(7Oyfj=+Q6x*426tpz(;Hn=8MpEQODRkS**voRAwQl>UK*a%mryMwQIjU zgovYejSP^=y+=r;666`YBrd;#OE8;Y>k39+jrU!p`qiLbd9Mg% zWPjl)UWn@UQebqN;b56j>66u$W!OgbKIrImy6v0nZb4@>@a*zfal=ZXw6oPGtBpKM zaYpdfjpr!QpAjO}F5V*4#A^om*Drxd6o}y>86HT9v$L@1F?xU-<2C9E*HD9qOC~oz zx+2k}&&unJB68Mh>%;j2oZ=KR+eCIVCh9=L;^~~Z13`5DPmi3Y&1}#@<`H2kG0XFG zb(ff#1o+MG;+DbZCeE!1U}atl53M>IBrdSsskv_r?CSGv-$yv1*BxiP4<1gREPWH} z_XX85pNdpmq1D*9&Uof~OL8)E;X54jKjqx!I_`hev;tj3!Y%#P8`03U?!p-&ndaP3 z5Sttmga|y6k}4Lm*k2pZN1ti=4qRUvaDGXwW03pr^fVK(M#h}KT)VJqB(H>$Es{v? z4}?qiFt2o0Poi-GvtvoLUdYf^z0rn`Tgq*f3-1L?Gi+YnTyNQty#k3=-elb5rf{eh z`&}*Y4j5=qu5?kWX_n*%4)p8mum@avr`YvknOA+TvqR|IYEM`HK4{NJR=q+h^uB33dWO@AX73c!Q#viV_ZG)=u)5|bBlEt>1hckl z6f$4ldESmC;}ii2gPQqb_fa;P$4cY;^i+nBv3*kADKv?%;O$m`&}fU5Q}@}4&!Pt6 zpYCs5Pc`fb7rL#z7f=27^yRhN2R{k~Z)k&ES7&hmcEQ(6ZpL~TL>2`p&fO1jN4+7M zA_Xv&iJj&hzV9H0v;|GW_5G(3!&ib4C{wzfg_?Wk+;@m*UIML7d4tB#8S@@kgGMRL zhV|$B1kurKJLjLfbumjnyBB~z$&t`tI#=AlT-P14;J(b&?bYcoS&)r=JtnqwWWA1s zbdr`oxYvS!&uqR#PiW^e-SvRz?=s(XMuvYPqdYSpCVOW?3#5h>X63fx7ewUJ%ZX)- z*A1YdP#&Xx93ke|^+qRJ>PcG~S*084JBxs=Cjnd>&5>ARBz0qeuBT$;ZP)qAX3}9o ziUaVLqqM>q8hh_wYG+>(6mB_I%nzN?jFkdjNuzRq;%Kwm;u($KFa+aUe}Hc^>VPV* z*XwO4f~Nm6`}56LSNWYv#qCB^MUJ_Qw9rBFBhr4a%!|kS09V+zy#-Bt`v3OV5vPcf zZ#D0O!F>t1SZPS7H?L;HTmjU(gFpomgZIJZ%*t}pSOx$SBb2A6Z+n?z* z_+G(s3{S?99tLi4mbJ<=9+Mh^p)0!;@OUV)x$Q6-h!8(fZp^J2a!mb)?L(2G* zdQl8Ud&hI4xRY+htWms(1=wg3ri4tKJb$Sgjn-&XqVk|2nDIT?rcx?XtY!JsUBlDU zzh92O(HP#Lt9f2*2WH z;6B7_p6Nk?$&tMC6D4x2E;3O!*eR=k=Pf0y0!dpf9$l3lre^ZRbiNurzdTgLlO7eAYt=1jfP-TA&RKuK&)9Qhx%i+etxO~()P z0F&CRAoV%=;)izSobwxO#c69b=a01|)2@*Yq;8!*P9V9)8p`4_l5Vm1oqXIjney}( zn(8-4B33I~W3{KGzfdt^rGqJ7Gi~aNEIKO%U@KjK7rx{}RhlVsebDQO&xxrkxRaK` z#1Z|wQe;7`1W>qu}&dl~X&vYnr6DCRh5%wUR6MfaW!&*xHj6 z1U7JKf_Qso31WkhVDZnl6eq^SD#?k2B*u%KlhG8(p?+kegV6daw~~egi{XuCy5tYz z^vy}mvfKPHNeZeufj=&psKc@siocODeabVZ!)dxW{ z&VArfq4{#N-g-Lv@)slHr7sIh_{lJw=p;4zT=iZjc6<6AV#=dJ^xZd+{R(wy`9 zlSeiR`>$)VHhgE#eQN!2Rb!j2eAiINqGy??nIEeF`QsB-GiuKJBW3tCp92S{uZY3U z?C0a%PrueChOg?~_DKFt;KpprZ&!bKtGN$j(T&i8SgF02sM*5I`;|^S6vXw1#vz6i zVFIO^rHv2JL`r963du+eSDNiKcINfB$1^{7XEV=Y7nL5*9Ai)7*0T(#7@Ah7H`+S; z;I;nT3^bko3G`DZ*ObK%5(X;&n0MXc)AY_P4*XxyJ~&#<4m>{WLGO9HBo>QBfTZu% zx|nSdy9tIo3IcO*oj?8tx|ktl6)>&sU%dA%b?|G(52KA9+uRN>CR$N+F+?dG1y?yI z2dVocQZEY&^?YRZDGPDXT$-{v5#BLm)*B^skat?<`so(YqeQay%7Ku(>StxqHyc@+ zX?-pf_bUlj8WZRa`0g(9--0_tk$_JY!I!2RK1SrhoGLn)o2sL!C3>K^(#@bp_uMsm zb$se%-pyymcbL5y&IAiD9Yu-I1ar~E6dg&ji!|$RiB_ttQyY9s{Svw*Sxf!IHd_ErU-Hj)e0*tgyx;U)lZAvI0NGwmQ60 zc5`2u<+o{cRpW^#-(`wlhGn0ua?|2$A)gk`5gj3Ar8~uQ_i+-l`?UDV$GW#$LoOV~ z{#m;|uJh)D({0lyh0@$?=Gg+Q&G{PKM4x4_eA5?4Fv@HP&Cw_dYv8JFAxB;V_Xh-f z?~JRSAir}ZA#A}j?&7m1cNylbuF@Jmf$Fp_6mdd!6qM?q*h zg%#AHutElM$f4=7cM$Fbp{8R}AUZ-f7|jRM4ALO|Ho;T?&xcMBPcTe1KGX_9w8=Cb z^6>!g$5$0vUq=S9ETCiy>WA+i2);X8NPt1 z7Qs8dc%3nP!BjK;|R76t;Hxm8Lbh@o_c^(CHZ(i4b+T7`2^?^fHA3rh_G5kLA* z&I1{dD5;Q2I zrzkMy;8puJAcy@3OmW@Q>VjU_^q~*mRae+ zV&vkQQR5nkyXWmz5On`u)J`QY`Fn^E>_ZZ|j9)o7VWYuhT|K%0(zmfgQy|Oe*7e0d zfQcfzXfzcO_)rb3BKfP$2iqp?TEaD%tz7YPRsdtzcEz(>upAlHw!I2>JuJTvV&|5? z03wNi6<|@VpRkG+UI_$|R$g>-wRg`S=Lt~Y1@LrkvmjbBe^e-OGpfbL z{sJCf9GMkW4?e|SFbHc~XODfhMYLxE{j`cFB^zf?V&=VnK!<;l@L>L^*d;hbkTBH>?r=9z0yEjX!LLP%?fWgSeW6XWuyOUvOAn4FKcpj9kDZ;O&hW6Mc ze2n!%gpegUXQYEM_jIQh(0Prm`KNtkH4^uG1DboMm*q&%h#bH`$jA@x_A$VdOFp-E zCycD>*HJ3KNoNbMs&u;}gq}F*@v_|wP5aO!UHqhg>;&@3!7rN&^)LpQ?V624j7!!11Upqpz?da=g-jhUR`AcO*oR;|h?`A(_ zfK5a9wOozE1z2El{I?@|T0qQvq_+t?9*pZqIt7e5l0YJctKe@~f_;H!l4Nl#4>1B2 zLEm-368fxB|BOu}_c>l+?;XUn9oxPKol7r5gaSow+->|&_THCq`=XLwo-{{-i;}0O zR0;fqsC@A0F=H4n^50phNEHHj49Te$U3PEcQKJ+~PUO){P5dB8;OO8-43>g_Cqbt8 zo{W9tE$MM^lRkP_w}lKQJoN?<`hB#9^(l$uA;}wH*Q;lIM0_5M>IC9 z<SMMm3D&n6%FO?x_v^SxGZa%^1AuB~G=;;S{DUB(|H zVLQ6;COE?w#&FFB(Z7>J|DqaiH##fdw}ivsv3z_DOx3^0kJk4{hAP;{ z?Sg!MbTTEIs{B3t-QslJUi|8r)jBMD!52^)ywX~8ZuN(a8dcBw4kb7uyPR$fC;cnJ z&obT|6H;+wvJxw-&}JNlHj~XNjZ{WI4h7$e@uI`W#6assXdu zI@kYG+?B>d{k89zu_qc^Poj((M5IWPVj9v&mL$!{zEcQMsIez4nnso)N+}~`-@nUe8GiUprbD#UZ?(4GY{RP=(V*J)y_JV8<@8Q93 zsFQ3Rr~_Qtd{@}|#ZhWp7x|y@=FfTqfWC0=rY^Qgq(``N%!7!bX{|fd=Y(9|+Sl?@ z8}RGnR_nP|_H{Rd4wnUs&~LRwE2iB*^q79PoHBa_vp3%8T*VS4BSm0D!tH~r!CT&p z#P-U;x;ZfX9k_!VK@z6XA4Q3Y`_zlp3s zpXE>AiLQ_HgRcTtU-CuW^?4|7JQLW>eNRPCDZyrop>Y;Bkmaow*D(MGz0Jy8!~Y3w zLhD$j79yAyydq~LLeeq#8>-8;RYpHngV@n>o(75YLe305tIfyZv1QhLfbOZtTcS0^RB@m?OaO0Sy!?j&k z_FTdo0AfeV$J0Q2jv&JQk{~Df;OsovSN6gPFE2Cb1=+b|9yzy>Z2I1}8a)cg{Z>r- z(H-wLz8ixOo<-b@&jIY@YnMD;DX3p4U6-g(oo(Q+U^{It;N+HGEs;{K(z!X~g ztc6cZ2?X^Tk%YyaZYDqgbN_|}*S1SEHOT!En!HZ*N}1_6)BNU9`91XY#h!k8t=1FX zx|O5|gYC|`i@S|19$3Eh0J9g&n^4y5_yHulq_I1u$(Q^hm?I}6hGJ3O5JKDd82gB= z$|_e*0KfgBylSRfa?9t+#zZtC`0DXtx5yT*mKhzWc*Mk_7j^K;y5DA+&X>WcAp`3>BwMCB2$2|;6&Q=2;UYHNnkBSiYA{|=-J1VJh zO6)#SW8s?@Ud&WVd}rstQtcaB!r|jrm!#755O4`#B_-sl4g7YJM&N@H%a^r2>Te-N zRg!M-kV0WsP3eAw!74;HyzME-MWiADJ2@qct-8?jyYU~iXS)E2(S%?(?-iyBK^hOyX(=nOcQ?Ee28`>{k;nZG5lq^~Detd+b(THne9sR!M zmwC+)O=j>f(ON zxll+y_vREO8&$+CXMlr&5(r&M3;5SNMjj7d==2WVR)0WCrmcYeo@0e;1T-jge z8oQa)T=Q+F_jvfwpPQU-%EB2rWbWd)iTy_6l4?jbXSZD%&EM@xe>j$tI&Um#Jq@3sB7349oCft1DV6|CTg2JCW195bmaWQF z@;5`;!*|Y>5WR8%X*+?a03bX-vto{&zo-A7{egkKHT0=PZv_ikWC{|7>*o7c{U39&5|D(C|S#-&js=DjK32$ zQasC&x<#A=LYog7%prgG?6_;0;0`6NM>IdHvt|we>E)crApXZy0E`OODAzzuGV&J_ z;l>LAmJErC1HH)p5kSqq%xXMxXXD$2hXC3YKi5uM$gvSWO{g$u%|IA(YbW;~gbVp@ z{5y)KzgsC%vasU(lQqcj^Dh820wn9#Oj}kRl4k!r$iIZuBOb(^oc-D}9WuHA$xi+K z`4UnxwfOPt-yzwBzdZT5{X$ONW=CLOHc4$TvTlsu$3n$`4I?`^wqgOvmsM(+!va72 zvxd7nb6&#HwpkebDF}=hp;tt(Sn|&IN;RlpyN`fnv~RttLfw}!b8GM*wPUl4>dus- zy&O^W#nRM@wM80lfjPj2b-Tkqem%`yA|pK?^816LdVHgfqT20i8E#<}q z5w-?rK%$&5BjoiuCTxQ*F`B)rMc+(+iUZC5a2J8({w@8$?<8&!K8vo?{^uq}PnS;j z9Kdk5=>!2^VXAFP*oJw+e|^gsRxU~7+Sv2w&wJ|YNu6h|%#Pey{xuj;7O;?Yj!eD? zffpZD_a0KEElBsx&kYZB=j7xJ%>^j@SzW$dR9yUhDEeGsQBm*IRF+U4I9pau>;CAh z@*a(P)!t+_73kyB-qhUu@S1cA|MFt;=5Pre6qkif58kVSq&TkX31XM5;w7ZuXO=KCtY;n1C znK*y?^2(z3B`t9@D=Dj~C_S3~+LC_CW4Z4?qEXK(KI?@hXx2 z{>Mynv%zQu*yFP{9?s77%;Rh)DyG@b)V%1R{{DVSCTv_cm;LnWuIk809tq>&)WQ1B zLzU)bezVW3s6YdwY2ZIx+PE-1{eij4yaF_|(?36co{2m#5dX@m$~QVX`q8i7M-mbe zsEP2YONW4jZ+d-O^U<%nXE*9QSaNZ3t>Gz_z_+{LZG65U^3g=HvsTh{Q|!VlkH?*& zok1wf9V`y7YAb5^PM^##;^n&dt&VqLdO)l1&|{gmf=e~6t#fleRb+pDbov;bquhXKYH_T^F%?B>gU3YUBDjFfd^7 z;r`DCMo~WXySRh+qS=V_!0AxG0tYS3#QXO*H;rvI0-cIZo@(Qr8QThV>J>K(=z5Wz zsMN2SnVE}L(!ZVd*PqvSYjH06;_mL=+;Vj4G_jQ3#m$N5O<_m&d|>48>V>A8i#X_u z6gxLls!cRc2Ho(4STg|x_*d&Q=Gh`7Phl*!&7 zH31Fql6Cst%5H|iRUfbz^`4)g6crV9maMx@$DaN@CYxKXY95z#z~ZecZyx7Et7*UDZsUZDjh>#R^Y5f1jLxY$cCBza_Ty>yIBlG`D|mHNBI4X2%7$558Qz z!SDE({-t75Jx~4VhJy5V-E;eEE*g?X`uNz9C2GmR&8&F;tFn@p%+IVSJZEA^FX$zH zk=t)_Vs}L1v@b8S_p`zttI7#O%hWSOVlFi$EMJMVp0y%%(j}4>moMx5A-1w##xSWk zHC1YzfmL!;nb2};|@qJ;7Iur8el`3O6|41dbMZ4dpxq7YO8aQ+NXNKp3tz| z{ZM4~C_H8-xUqD-G-XFaOsrOTV)^@IY@8{NTKB|!f6`SeL-o1p3RhC>MVa7VXrBYGRt%O?wb9k(}f?O8P-Z2&$u=TA& zlCrY0#?{L&g$^;xZ8uFZ713uDEkZBq`+vS9+Gp>l=~V7^0$I!j0yuo9BO^X-&d4+I zZjhbGvdrt_ujg7G-b2Pp8Xo6_;&i?WnQ_Sy|A##v9MbCC+HDjvevX>S?~m4ojwr#u zD1S3Pl!BU7gR{f6x1h9%`g7;YR^2#0?cR_v}5WMtzg8&ATZ=e;r7Cy-?)3UeUp zDf`GY$mm{2w5tP0SBt}{=r%Mv_684@Zbvj%-APE>n!!raBz#b9ATK6 z2CbTRB!3iuhQ~v7(zQOya5gCGRci}!XD18cj4{yLdN>`LZ|MEV$AsO?PcqrP`!#jX zc*}RB;U|M=;zHj_MbX6Y2dUOOc;HCk!O8|hZ|#L~c&FObOJ-=|F*C#T7!hmDxH+dw zNW)?8j^gp`y^VTO(`dZ+9y<&X`;GgA|IIW#eqw89x6{ogUDAm3xZSnHx6H!%()DA| z80?<}l;nfeQ(|a7X2FBKLdW{Iz+~9re(gkhj)pNtU%HMgE|_+B$yOkc3M(`k`Tr>( zJPtxhmY@!4?SLtPx4=u+W*q*DrG#U|KLt1=0vxZXN0KlD|9;;EUM$`1)uueHe+sa> za0Jqxpk~_NI*^JAVPzI}Ms!R5f6c)@MN0MZ(LdK)~m)AfRlHg#Q*uP#U6Oe6YbnoAuDWd$J*Hudf zEE6<39=-gRy9Fvxioi3`%f9kja0VK-x(}X=3bWQ(3@5A)r7#kB9j^^q(PsMoM$e7a zghM3@t;dVMcli0VY^2+Kcfe=Z)m$eTeXGmZd|<1CbZ3GYR!*3?_tZdy6?T^!kU#wf#Im3;15z6>L@YRp_^G+ z%J;{T75QErA0KvO%YRTSVkbefJn%s=_B%^HJyO;bi5@RtbMOpLH1G^dX5Pnm z@i8Raa^Q&8N^<-Y-rmPZKtqQlAaSL|l5i^t{kdEfnN=>34S;ls20(d9cLsFh1E5H( z&dXgPSL!dS!a5&Y{ruPvO~$Vkf>i?t>L9`g?pzYY*AGKZL0htXZT9fJVQZs2b+ta; zVJK1;v;XxTx7%v}Uya&A2(>jY4GYZAS9--8H{eRsX37h>P z8sh4B98IZ6JDS%T*#4YFRLgj=mOCK zH6)Jr#rq32@&x+Fen78;wF#41xh)2Rs~*WS!P`zc+33~RE`^#UVDXsXDzo=Tq(F!1 zfY|wE6aC;K#ON@_ghl;CnyKMwR+o=Y5{orY2FFaH2UWaKmr0Ak(}UQ7^V@zi!#lj= z{cWbLi_gfsWhO!`rT)m)+N_^`lVH6f8hzs;(eX=Hp)_eAL+T+ZAHo#7YZEe2(IF{7 zSsbTg-zADXLKzHSoflnQSk5?uAkK$B$(357n9vLBou^ zw~CIBhgju-flRnuEWY_pGO`%Wu83`jO`B^z+E`1O`gFO1k;Y{=>omVRjp|P=6|Is? z0*_R@ixH!ErscBecQLaya$bW!*a$y@fKv@aoGND0Pq@fOwCN{Bqm)o@AF+EUMY+< z2F+55V7>Yd%0{YAM$OVfNP|7jf_JplTb{}0ExjqTJ~uH~0d_S?KhS^4Kaphv!;{!;5;C|+Q5t60Eg6xK`?V3V21)G!!?1dP#e+;r7xYN^)zax8h=j$Os zYoH~e#PWFYF{Y@X%Q`L*|3UmQr}(p}tZHq4VNV6ACKjfFw{ZO^T3bb@Fb#K?&5 zM%|xgU5Mn7#J(--cqUR6hGA2%7=CnxYa4mdKx-R1?Z@&%j%lTBehJSu|JEs^)AOkw z-W(M;QAiW=`-pe06?Y}i+FsZfdbvB>P_}(OsqYZu>Br`OvN1eyQXmzhcGBl^_$xn8 zC)!J3L(q2m`C0mTr1%f16Ie$7cE?%F+x>gz4c6ndD|QqDp4Ci-A2qxdoRli`8j|Q* zJPsDVH#r!8(5gshpt2j$9Yr2BbRMKp%a=fZ5vQ{%t&bYH#_1dGD1%2CNQwwFqVXa! zXw$fZsq9>{FYYdcbg%Rq=N&CXy*m7G*CmyTZ-4ja_*KlLF*jwYtI!%Befk!zbK83Y zqwYcR${9*#ED`upARVXm>M2gjk^jE*;=!l8j$_JIPfq4Y#j)3siguRePG>tCmwMH4 zL>y9~m_*Q@AKlcUKk<*BVw(^xLw|dr^@#>O_<$3-JyFKU@5HiE+P(um{7wAgwM>qX zU(#V8TPnuy_r{+(j+>_{^tFFJ{pJ6%OcR!|{MeHWg>aSHJa;3aIaGO1z3$FjMV3B8odyf{JbeKQF zl#+=`hi$}VRIua=Nruz#Q}LX#_EMaPn!X8nn_05qsPed|b;Zf98@M#ND*4MY!WsM~ z@5;k?o6manR%78$C)uWH?@i+?!ZMuZYuW~8-8~aOv*N-r*)aL@XI?M-c**QW+QRE! z-h?UXOf0Ox!wHle3UUXGK!})FXQhmgt487EV;}RO1zX*3bJ&Cq3T% zkoCi(!0K2VLFF)f%AQwU!RT^_T^u%N(PCCBI%IP;v-S_QnHBcJ%{-H9u8t~O_thr0 zoKIjj*TdB~Xs?6cQ3iJr`{Oav&TPvnX~1?IiFPhGEaVf}K*SYF<-x*3dk%a!5-YhP z9dcrTAw2pk0h#d}tM()#rGugVDNibDZR{YH1Nnfe0%V4z&sa;sUa)n^sh`@nVB@jR zy2>QmjGqHNJ-(rf^hgweeIVg*H8OMV*XKxNp)c*{Ik-YL zk>}JIsCxB|7<;PyJ9;Wr#-EJHY)0fUX3Yc!TSD|DNOGWQIi?`&`O}ENcc+r`3}G)3 zyYZd#L0$VG8D{Q2W#TNmm$|>(EiI|1@RQEiPKaT+bORBZhAM;l&GtVsU3qylVmj!` zNEzr{@?iMfE+Tt*AHBM&)@N&ZrnI%K1D!eDO;5wGkN-ig%+Z4sYNcFv#={(3VWL)& zJ)ZINE2m{kjE$l&p~Gr+3obVOj?mTG;|6r>jGfa5?Gjx3l8*=ZHVAL?vCU8dr%3bg zYTEW@)wAdN1fNg7qR}??Ylx%^Me1MN=o2I(u?yAz6%(48;kKH6g(2D&kKvtQ=Z|#g z2m(SsA|S*jktK+DqrspFIR>se@xQV5GAg9kJK?{K7F&e{o~?EWz*y^9^SREp++q3} zv(4Nc!q5|Y29{0jp)D4v#;7tNVYe@9$qY1iU*nIexI)&yK6IM@vL)K5YDgO|!v)u& zRe`m(@$6wClXAULfBF7F;~=!cBVsF^&Y?_J{HI*1>?n0 zA>%nFB1zU}xXy5+d&*Ga!Ue2GM7>-;Q(f)$nK*xz9Shm{L)~9Eohn%Rom@^+f3Bmu zzp!U|x@u?jAk#&KT;EYfsJ$k&KAP=am?w`$CrD{fZ9iMFpa+9w-5HHAS^bLwN<_HX zp6tGpmMHI5a9b&Z(bR+cvG=ro1^#4^SSibhqPUpdXrEC#t7-p!RgZG~x<8ZTPb~Rk zucZ@Vd5uwBABm26Pfl&o>@>z+T{0ghFIG6+uR4|J{5MwnP;uAyIn{v#Bdh z`NAl?=;SNYdtd!7zV{PpvUz(Xg|?r=_o=X=gKJcc_xHtEzBc;Ksq&sw`40ZRns1vV zUs+Z`rWS#dR^KmZf#HZDvTp+oC3+5YAmOP$*~}y!mW(3Z!h*1zyG$CJ>tvOyxZzOe ziD&wLCN%==MRvF?)l&YNc?Zc3aRYuX*m8U9Ugo-0c>U`NQl9s_m_i$$fpv~ms|nF- zK67UlHe6=WT5pih;?OH?lo*lUWD~8Qc~qq_l?k!IZQYnAb2?jbg2 zJ^AU6kIaLwLeG?M1-%zc%}Pbmd6F`@=Da432cxu~Xyy@5PHq$lo1M=x%?MNnYp^)o z>`bo0$+5h=D?*sQ2gHf30|q+7U1IwG?<#MFM{TcyFA zCf%`PD0VD8RzDDP^ZP=2Z8fL1(6>gw*?JGfS@P$N>X0_|PA{+e`QWl2T#k5RY@BD za7TfXYv~sqo?hOHJ`Gb%AbDY+sHt2EGa-N4q}TAe7Sua3nu1w(JbL>US+{w{pZpn8 z*p9hb_3EFM+F2-V=$Kb3a?M)UvF;Lc+Z)7223agvkj4p&p6yI&pFH0T%ZCjNV``=6 z=_bsPa_d<;p4z=bZMtsEm1&fZ?gupwk759H#yWpD4)R?BM2*li(+#qOJQwUQ@3lhK zJ20I42hKq5o(E93o6DpAWOyu>1GB9v=e=I``lY@_L7#Jtd?Ui8 zZ@1fD0+>Nzp*nBc9g6k#i_7ixMGD9PBqeIITdgw)M$rs)YRw{6g4oWy&{W4JAa2P5 z(^Y#D?t!T3ET?&8^SX?<+gE8t^{S!7+=MlKl6km>@9&$Y?mQ5Ut(_{ii!jp0AB;#? zaRQ#%9yeFUJ&Ng?200ELMxD^lD!_DWNfs~HdooZQNJHbW`)%34lH-l|yZY4MVUdD= za&6c&i&%~79zJ6hphBa9H4y4v+#4+-$mP-U$!YMMT*2(Z8%--pR;77_WrBTsu=q(h zEH%oq?1jIM_Wj_J%kw!0ZBx;gCQ24X{OZAv$oMo=LW%PqS14w1;gTq@+0LHN+Ehu( z>DiDdI#doyaj;3&HV!cqDmt)lyj<{=D9aAx{pmhu_r2Z6V||9ZKV&KFz0`zona6@R zHGW*(6`y1+nV!Hq-~_M`PC&&x2NwST#a;5aeqFloI^(*?c1(aF#i=2|%e?n|HyBdM z+kU5?MT00k{hccQ{#C=b078Ua9ECL zaN|cruAx%+swDs5nv#gKA;29g`beKJekj^W1u9`u;AnQA%DGFRY|*^bhH?A3=TJsT zCNf;DoheBc{d{vi zE)VOWjZdj)i~D)r(ajLsBj*Xe>VmAdH`WIJlAM;a&o*ODaH>qsc_bgPF54LT?$?XJ zFrqi6N>(__zl?n*iR|GEqxWN#P+;)_AS$iR94X)(K0$7U5+$Fo_;`Jy)IfPfFe8PB zfwsoDy_Vuqww7W6Jk(6`@nBv7G^b)zt?T!vjM}xJ7rG`J?cWl97d?_J8X{`JFbfFU zbiX`Y{!&(IYSR!NG9A?*%QO+=GZ?BbB9ZObh0gBx`;?UALcuA*OIMu8bvo=^gIbDc zGnI<8MuNRLHDg5q+pbQB@3tpb5$(gJ~Ss-8=uSVMt881vHI6j;2Eur-OQ{BBW>eXpU;ca~vh zH(lb+Yoo4TN^gIB3T`{;#%(d3{5;?iZt8!S-^D=TeDdawYRBEYEc44D1Kq5eEVAX3 ztccjOuTGPPA!fe^>RnP%SjM$7PiO)Ufh9g#Om~(dlA|Pomxr*|8i2fqC*gtp9o)3m z7gQY=gQ8czN|ag{-S(`M<)z%_awCyC(FAF*&)S}Tg@H8gd?E0(M1CS%vff^@keQ-gB(hidFWUz(E zcX;R8yzfG~(0anR*7S}|w~j-<*icjBBUd`5dZaRFIIdL`+rv8WTy)cYG6#Hd8FR)h`1x{eN$%fx5K$Cz*h!N^*Q9 zc(z!7|6V*Qj~s|Ys+qgdAk#w!2O=x7N)KC-MiG5Hi1Pu1kR^#@R6zZF|0kpTJ0>`& zFXfI_da1M3J=M5vr*j>(tBef2d>cH@4wt*%N&}#zNH&r7_-Zp}sKf8N@a5;Xa;Nrl zjf!XYSPvqfFv5&Gd`k~*u1*+7Ur3w*kYz1NT?yVBMOb#Cf?N$E_wj0+uvDMq-RyXU z;Dlr(zAD#5siypGnc!gRIJhj?@E5jUo@m?ZU8~1|mOJO`A2KuVue;eccz*x>?jpET zUbj|O)uDEqpXEMlz1@ehy5+UwKa|2+mCdN}KK{5gqyPHoV~qJ@N#}U2sKx{l9*}~B zxft@6VZv}Y;cZTLqF0jQ6i&x zkDHH-9QldLm8#yU?HmR|k1@J7GmF!LEL|2pZX8ZK-;aBn`3|1-Y#l^GfkS9-A8+Pc z`_#V&WsAQAEXQZRg?HoClje_azA9tv9&}tQrN01P`nwiu^L~NG2Q@hyo7RSB{fZCL z{mIW?*w5>*1v^YRz&G3N@ zMeErsaealng(Xm7HpobxqX%=QE)(d`1=ICBY?AqrNXj^mQqzNW#sg5eWbJAEL7e6Rj3v2k-x47vFj8TcJ*_l z1w7Cbpv5y7Ur2)>0+cu~xUJ%?g}3@yC^s27uFWbr*Lp8TQ+R`ua+sZn>vl~;c&}O- z6`_*teAN1fSgzREiO>M)<_Gp@u5BD#wD~l(PI1tgAa1fSfX}1706S4(Wu;4zMeJm} zhJ`OyC#qk=HXwe2j#LvLU1EzahF(rGb}w@OG8I23-Ts%g9~7T-$5 zu7Qh10p5Z)7el&EmXa9R_B@^4JaTrrR|-Xx_HckY?)}3c@lZ_kV@@l6fTRZi>q7NB zvf@M6K^M3=>@L;m8-P=zhe1#jb3r<@9a;r4&A@Eb7&>q+h$3^Tl8l)SxJ^pKrwna* zd>OhlvF~LlWgtdxZr!}Lic;40nid}=%+x0XS7io{LcB3I^AWlL0Qqap2Jrx>O8g2z z7`(j4a4h!eY*PPw^{ejA8Ra0b?k;h#ZULLYw0M!=&KT~6_X2~{mpx$JRMmiM*!q?i zj9xPtA%BcOu zmcfo18E*gw5lm{oWm;I^rSiFzMiak~17!rw-dq!5(yL0Hn*6ol3~r7<$H@+=fUi$> zrm9kaLpLZ^&Z*q}c=zY}KFRqsf+Xm~1{=Grepnv}F`z}lWw)7Ry4uKaNbL>5cj zz`iV{2g?12_&7ZeFZPNsf^z2NJIRu)(J&__2x@P`Ie~6<+)!5thTlsp#ee8f$0%?X`erk% z;4Ge@JFXf%OG!?If@AuxOz7{oNFeU}^YqmmJTRsZ}=`9B$&3}pqx{a}GvS@0}r9>BfU4M9O*r{LOVpy@M)9lKe7 z9YwPfs~N_ZEyO)VFu~5+IR9=E0dbI2dp`U7_*C%t0K&LpaJ{GU(yy@s1O@p4SnWlS ziv&W@l*pqXo%0DzzlYGJ|9(M2z;!BGk?vsGmv1}a)Y4|Rzt7Y_j$k}3PK|g>0AwB< z-0maobGg5~DsbvsUCw%lV|@vJ@KydV<7^9((njQe4&z_^W_-W}1d)1;7b_+%wEOr7 z^GN?=dxz2Bs4d^~;{4B2;zd*tS*dxE72Usl7+?wHD=0o32o~~I;pNafW;Nj6uYe;p z`<5$ud~-5dwq-lttXisBMzHo_%>D0H1D}D5ymbE_7%7U&##eYO8NVFxb!#7YDibpt zI&^6jQYr6lHigaS8trPW#-Q{D&ChxN5nXUNIFfLJM0EtP7bg-$z-$J{Ryj;dz#{|B z+HA4IkKN+yQ}x{@rT^{)AbS2Xz~^2aa25zNY>=G)_GJl=>vj`zaiHv3o zns0qC>d&eJ$@tkkI$h?=GGSrz=oSRacDym{lj#MVRh5Cu@C$#=46eVv$_i0XSkUw0 z;ti0Z;0)T$*26=wNH$VW0YmxB*!L(T`Y9Xq@HtDzrHR+|UQ?0PSU&Ft3M`v?_=q5C2KXGb%0QEJSI&sSSXu_5?5jW^CKc~(i^pT#%+LAvi2dfGcFa z!Wh{~5JAw&>aeh7z710F@EZiuwYVd`1K#HYnH9@ykbnRKECW&aa=kiN21mvNtTEE8 zpOwK~1|eGlgq^~`cThkXmImc@BxJ^-1>T+%qzRqOy1qe84vQ?~CCVuPu<931m2Q?> z0=b3r@2!%dWNo9ZZJxBr782-HXW%{dmz_vklNA}6Z~k1V!aHt`hmOaUg$MmEe$pW* z-5;R7K)7r-reh8StMK~A`@BCBqjarY3dku;yxGzy%TUM5!&fscE+sdAt`FWq#X;@y z4j^a)z#`3oHXrv>ym^n>ae_@Q@YHKbK%lm^_QxvlAlvY)EN0L-p&k#~HVVj}=_Rom z3!Obv$qn$vXVOs-d`QSrPChUbD_vvK`=dZ20hFk>EiPw$boCg!>hH^!N z3T5EXV^9kWfyMxqv+aqxal2Sk`h-NO{>QSEI1ow$Zo65Sexohi*#Alr^dpp#fBN&g z%zMe_rfJdtvF}0>qW)1vQ$pv76O!`JKVy-MC&jdC4T zK?d#0a`MZ$gBa+{0b^3I-}`}y59)LuK>dSfd4f-eE^yTI*tr{vTPB%7Gjo?~_1ak+ zmXU4d`F3+SqeP&q&T{mfYJn8}LCra=J7~VaMw|EKE5}3?7w|Z0`NQbp)0(t-o?Ws}`pu|1L_2dGjl&H@H1joLqYFP(tCll1MWme~dyMizgo zzebO0r_TjO-?p}~%>tP;od*5gUfLg`9CDah`B<4F^G zB#9cw26-+p2#ELi^ZH^??1>#u0!AkrY^F*x9(qO=U9;{r%E*vYbei zSD_OFj;YMvMSFN+0<_({CmdH*(m8|6F7|QHp`3n5ogt(~!a0sy@W*KCW|l|xPZlrV zbo3=l`y1Owc|FD{-`k!(!o;SECb3M4GydrM0TFF(KSD%3X01!;olxOnj;LHd5S)+5 z9gA=7+COe}4x`%hjPUI+S^szsN0j2ufC+5=0|3O@cDIwWvGB)Tqg_F$*jh(2wp-Ll zuRwjw(?D*3u{lLGF3Ij++oPOd`xzSGsoaycqFwx0SwMBR$$__(Cb(+|+y*CN%b~F#t^` z+shIKGVX8lm4A2A)_l6%bJ#8sXgtMB1;v(uQ|}Xo`M1MfC|d-BeD~)`9NKVan!|L{ zx0W_WvdXxwY380LW-_(B%tA#zk9%_?ZZVQc4-jvxcSlr>1Pd!uMm~y%st8Ca9^cPVukUCf9v9rTc_br+X^5U6u=h98je z8X%eFs;H>Qe`3KiAF>n&$cK=RhKTqd57Mo7V++HgIUlFKuz9DD#itp;WJcQ+!}`6n z=6)0s7m~@z8KR?Y%D^S&Bd#JXX(*IeXNP=zmV41xy&Zm)X!x7(wEbd1J;P;b!qO!y zU{QkIB0{mwYPuo2l#uB5TjK6W!|Id~Tn$Gu>@Z|xLl8N<6huTFyGO07vHS*D`aPES zC+BR@+9R|B2D~}4(P*+}k3rR<6}IF0E+Ug8)U+CV$@uPf%4{$Q03Pxn&9+mFg3b`I zydjSkh@O^REYoI9w#sDogH#h>3ti@7lJY#)&^t5m&UKi=LHmzbhe%&mctyr@18e!;?{Eya( z@%WV#iym#$AQCZI6U`@XKKonS6rV5==_|uHngmB=HSGJdgvWVnC#D3fMof#oCou*d zKi!0yIBzyyZ8AHXLKO)!d_dft`?mUPVLka>_A*V6MK!>XSeREWw{tk6F(FaQ373l_MdLu8@33q0;qK0>iP}@li6lHH9H3TI1|tG zo+zSam`q?cd|R;D%?eDNShYE_d$L=8xR_OOr zPUi)JSo6gU9mQQ&W4Qas-a&a;pl>Jwer6`pDZASyKIKAMQ5**(PjVJA*66Y&rNOuN zkwM$07Tvv}IuxENN5l*G1GgVYOk63ve^F`HU`BMR+r9rDG|jfl6FZS(&9Oc2Gj^y> z;LjlW3nQcTZ%XvDz3clp|3hq1v%*>uVZnE(E*eP+Alqu#T<|HQo53IS#G-nNQvm{x z`pbsqhERR0yeQ-6iVk-56VF$3sXV8uj458Mt=9CDtLq9nKORJz2(X$$X#oBNAPrBj0@%aqbh$gHe;oTHHmkSWxC?5h|I)ow(0VaoV<93@L@xc zg5eMD8@<}vA`|ulZEH~qt6RAKo+itfvvrnn($s%=6`0_dtVecDKZ`Rp(9EB5TB#@~ zA5+H(y?U%a#w@dur@rYq|YCxN`gy1ATd*&U^Oa`iIpDM ztcn8-n1?Q^Ap0S$!GG)dHIki-@SI{(Jz_m?m@*>Sn%bUlhp0s>#g`D%2kF>PDt>u$t_TOf;~&k9TQvN^1@=4O zJ$`uLbr=JdcXwu~#cnqC`@+g2G8AG5 z7}_fv&tQTnoR!0y6@x;{!0BL1;!RU^F#wz=W69t>I^g;uu;Yl)c61opg9>5y5pks+ zLQPM}HcLvIXbsQO!#IDO0a}J7ou4jJfDKnNNF1A|7#5R~46vxxn#n3-4lv)(OsmDB zdg#bEQLf7Y4W-gq_LHZ8>R+t*Yxg-44`eEd@7imn?cXlEjx5}fep zKjpVOF+Me7qUCu{jVxz7Svv;OqK$_Lnf35J+UXNkp~nZvo&};Jd|s&KlC>T3y|j31 zMoOHtL}G;5c4)R}M3C(QIoy@_a?pD7)P|M4Z3yjG|IcRvV;@CTx)U+0*wg6~mU}1J zzUgVKijT^}1x))eH4U-ZLTvXRBkBzIJBAZ~NTiuVnmBBA>Qh!Q65q_(-hPMS? zl1K}tWQ#Gus5rllh$Wo`#Dx6FoCb7uKL?>Qj+Uwq0|5C0PS&)<;e@uaB-ef~UQRLh z)0O5|-J!LvTWU1#j+P(W6p)Q{8?p&}yCj0N`UJreE)Eu}1ZH%w>883qyudOQZZ3AT z( zkMe}-_T#((Wzg#sE-osGAt~g8=fwW(-GfI(`gH>NvHay zC~T7PR$IzK=MZo&#di6g*lovO7`H=NvSNsEzRNCV)c^;+OkAd|4qJVSpV@hV-4=Z* zOHSWa{W*p?6>=zl`RVS~A=zu^oxZ(lugSOao$R^YU$T!jW*JAB)TVw^8qSRo=}5Bk zg{4l2ajL?jFQ3_>iA+D>qL6qzXt9A2Z5nFu3(N121(XcMl<#Du!uvtvBFprz67KCS zl}AaTT;pTB4|l3YiWSoGgN3@7r@NGq22ZFG;L+q)nlmz;^uSLk!4=ALbWG46J!|U+ zZRwh#``du?AixQz3~wWjU)?_hguHGE~Oo9g`ft-;d-xfZVdpWqV+Sa0#`H~j^%PLvt3_ba$V5a9-%O*1Xq4BSqxI^0xKMg0 z-1A(16@*+X{ZibpxXCrjEIQ7x_VSweC;+5R{b^g*5}I*+z~L9&si9Jx-d!88zwv zkVtxVuaxjK zbqmA~!ua|1?S25)R2%xza)0se&&4UqK=qiD>F?dT(b8rKv&>E<>-qO9yxxf%yC#m- zAMpoS0%OK1$ZGIM+2de^|h?U)QFIp)vn*XpO_DY@=IqB4Pw*G@2HY*92 zD%9bHkY~*deAo{~CUCmeT>b+n`WQ%}umok6;_xbQz6?wN_T&RVm6ein+fVkwX?z6l zyf{fo(6B_f$OWF0_fYziNknSiJd8k96Wlh&z}<-s%lM>3%aNinBC4lkTP}T$BY?vl zJ*ptkiRR;jfFA5A4?Bk;TwSaDBUlb?S#BjVO6Kc=LLS%Wd!+`2+8I4xyU3fxxuV>4 zO6;{pT^>e_v_>a6+xyt;%|;(*tCuKg=CN+Q_E_*Lp_Hy;xl3c=XE!&PkEhIOxy1M%KS1tFtv7 zzTZYYzRBl%2{_On1v)h*+kx$Jo=ey4dj4l-n*oAP2c$w?2V9PPuF3#wROj6~>fEFx zA7BqbU1?H{z)ru9J$>(hw@0|G({rg0>4TwDBGRV#pPQ@17o+E1?vtQTfNSA2D7 z+VX8k^%M#P%7XIn$VYY9we|YSGy?b2Jm#J7%#^;ynk0g@D zzqBvnT+S}11(w~#vtRezU$y7S!s7P{!y+lZto0J_96>GTCU8os1~A&WJ5BeE(Ig6? z2_ZI`arjHHjk9|uMA&Gr!mR`--&2)044i)-+Ub4r5~1epI=HBP2xLNpGM}_cn>k&k zZE{i$e>d!a^nO;?TnJ`H9y;ZExb&H!C|aAjDaHq<5Uu8$ zc|pw_1#>zgGauu+OGBAEfD*A8qn&knd$tg?R9y8$Jf4W@1~It(BPY8zDL+Lu5msbk z69U)ds!dW_^5LcN4HTR~s0QlGv`s*p$-Ixj(lct*Sth7nj%2J<;aaxz53iGuU=Kb6 z;EHq4V{sAcO73Jw4Cb!(Ls&r~{`|~P(STcdijlW0jb4-YmY?a%0n8e3uC*Ur z_*g(j<4#mvSh1j9SI6tG4X5Yn5C-LE!y|@hWbtWD z_ht1Nnqw`P(e;Ql`&6!n$-h*Q1qLQg_vWTH-|?A}Z(ul_fW%j$)=l^YOh7uiUfZkm zaTbU+`GuLhBS1+xsB2Rc5X8rx+)4W`v%{z8zs~ly_BGqC=gBa)rhV6QLdI`L!^FsH zUq9>bG(BMDITnUCWaSVeV$LhD9Q`34y>9@I_i26mAIrh#kMGBM@)OLg6eYOU6~!S< zu6#zNNCJ3&so9qQYlPrKv#@m>m{+Yt=@4spc>M2cP~FvO^Q-|}IH#IUcYkr{0%sDr zQN!zGfb@5JxD)}?lHK*~^tK_A#^6JwX4>%w<_=!h=A8UHO7Ptj%_x(8z%v#cFJ^(zDBHHi5(0k7Hvu81rAlrjsd^*JyWq4_I{0w7FH zWhVc(-KY1)^15uGMTR4gBB6%oE??96Jt|9G78~vKjg``&GjrxZWp*meNtu5EQ*1XB zrCS`DHXF5wLt?muvIS24^iap*w)V+o~il}PzTZEsGj!30Z?{M z^FQuWvM}^(6EH?8Ahq)34@8RNa@kM-%uhAL+xr!(=5=-Z_=8533U5s-3|iEl?EIRk zvwUlL_`C_N+^Aiz1B^XwjhDpfix)4G-PQH`#F**6PVPQauVMwCzPyRy;R>h z1eCfqp(;38^__6b5(Omd#rUy&r7S-Bi**ZBL_51+hXe3%3wnKHZxIyI+!NRB_FWC( zg^`81F&v?Ez-j;>LbHo74ly+Lr@?;|dY?t?IRdsJ;)Z1%t4S1Z zz*?#`+Uf!=GS(2g7i?QNy93h_5NE}ag?TFj*wyRTKXO!qqMiayLMaNo=q9QnP3k$QhfQd#x%_P zw&Qv~DqK;3+x3@9!)L4~-VFm%i(qsv3QhlpLTn1ZzNYVmHd4RG-mIp5``IL^->Z)5 zdwx25jg^$(h^IKELDS0LOy)enaXV^4zl>K8=WqOx1IG;pn$YGz6XBO|TKo$9xL-ME^?@JHlpC2W?S35o~J=Mvyd2Qw>Q3k=XR#ng2K54|cUI@zogVK$yf#ysD3N=q$7vO+}e7Vi61c999(``UlW3Wg(xNRe2|)Q!s* z^oGaYiXd!V(|Nm{R2i1RHs~FS#`tT#rB2SSIOF_x*EKP?6aFZozx=4ng5fwr;b6?mgrJ?Hs}zc_20b!3GIHuj+}UCGzcwBnfSn}=p?}wKF^(&6#)UV9MnH8MHC0HW)|W>9%<9xl9|ZRr)! zm#j@g8Tsn{%CN$*axxka}HGZD-)P4Rm@&7}{f1QQTn-~JdvXI6E=#24> zq>T*abI5o4gr>cD)*b&D>eh4egk95qly0Uc;=s0O4%)6O=f73xGyH^X&!b$Oe2FNE zlF2G9DzaL>39J>A=~DyRq^A_2U-J9N{rnFRR<^Cd^;l#P;P@@GtkA)@ya=Df@x_kE zm)$C^fzRF2MaL0Eg%V?337|+4IW8DGLN_B5WN1C#O*zx|Px(C|KeRslT4qKqWHo1i z+7|R;HHI**2W8GX6db%C)b%S$Hp^iPaj!=($V! zI{ajoS}B^oXfNI}W$8`8L*0h1zjZC8O8_Cy^3vG<<7#a>2?9diQrl%0E5(#rLK{}Fkhcv#(#D@o06r8%C^8NCHP?dfrv3fzZm9{UEG5`tdJ$0&W+p2XSZ&V?+b zw;FsjRMTd7$4u~zsBp?QY13}LxdxM%^DlGC+Hsj*u2UoS;1TIF5NZ-Zvrq9elFX?6ZlX+k2sHLk0=P?|&TW}|f!=9HL-<3uS+Ld;-`hF}6*eHr>*f3+ zdSLp3gE)iDH5}rc^KE({2Pz!ukfmIMuz()MGj%->uMN|-hA1lE9h=L`4>RD4RU$od z1le4>RC<=4ky2GJ$$PVRxF|aS9V5X1K(AGvifEEl`{-)zwOiA_)<@!?P%NLF2sA~xaP|AIYXv7 zB=!wgH~-S0`$yIPn$LTH>j~JsHSo&}KvR4%OmGK8*}fa=6ezECd7dyF%6mo=8sN44 zp#=Qu4(if6KDX^>4(xym%S3pD$I38$(*)cFN01B;V6e8~pw|UFmkK%zLE8r-_rE_? zT3Ch}tTj4eZ?4fMz)@mJF6P^XWCg_U%C#nFu+egTL^5Bb3anso%j3u-y)v)CE&%72#8y&kEE_^m8t zpt*=1R|mxJ-$WJiDJ+QgpgF%~OFqx~cuFImXZ1S8GL11Drb?jNw)g;lyE90alLRRH zLC~U~xs}uo+OpP&!T8Lem@_dfUI_(s(5RBogT^Y7mhIBAwYHOyL=b{_Yw4e5+gWBh zg_a{Gm9;?Q3(dQOk2@?g*(DE56IMSDeVd|B$kO#(;}hPiA2*wCcKTkTOkv4q&I(39 zTONSk=Gyqo2k4i9onT5r<8?NekzgE)%5hqz>MPEjCtgXo*qft6G#7=f4<<@S60))= zchrC~0UKjSoTLku04fc)WcT4&9L8wrv3yBG!@%8LTf}ThnJHx~KJ%o3N)l8(UHugv zaM|?piD`6_&g?%tLBCgkDTERQAdysuQUJ#=mP=+RGD%#P{qv{E1b;9V{zzN;)#E`K zw-DcY3x3yM@n0SWc;4o6uYC{cCuaLL8A<{PHZ+%W`Rf&n9hEJz@dpQ0R(Zjp$KrO{ zujh$}$pIh{(wdDsHDCQod_veXfvlVKV{F&6gbFd-Pn9AXp;W67Fx(J5D@syPBP}SrVEd1|oq$&kzc;q0xWs#@Q@Z_)rs2@#|_6%a%~x38hO~5d;B|?gmMz zB_$v!4T5wDg2i)9_WqscJmZ}ApLYz$*kkOWYpprwJ@5O9&-Z(M-|u}(o;y2cM7$wb z_bkQlDEIyCWu~sR2GsM9R|%f?x_I$!&3P}A8XVrYA|^oJGz^k#DD22J6zuDb`o!0?z)t6-c%aiL_+Vj(Nh05ia#)xA_NF zTKVLN656enaCBI8!lQQb7&+%<&z}zmz=a@B!A%b9?HE~+e8%?^%!6+$wyu)v-%y*| zkusN-CQLHe|Ljmx6MgsE`J3h0`y}U#lxXnsg7OJrk$iVVMC4E1XUaZX=tt^>e;9c$ zN3KY-o~~Vsv^~_Sm#QU^?cHDW5_$j5mWY3JphzmIM7@ zt}^!p+P$p@*aVwIE33is0$tX*>|@D24U%0S6?-K<+Y)RP?fP-Y42trEU96KSQcAie z%O{E&mab%btD?$_b@=9Hfx)J;)hd1&}>^X|v`YNVqDpy6P7H`ixBI4|3YIRY#I_w6gs>7$fI|j;stLD?#)&%U>@U9DJ zA9nloJf~#(&=dRI`_Rm|4@43^Hc-`txOa(&TAwRn!2Cwz-o?VH#h0rCX+;rlBB^o0 zsO~t6d)vCV#~U~`YkB9`09Uj3c==jY*0)}e8GP0_TpQBq7~|xBx|TyqJN#!O(x0&T znuZv`Zk=AI^p~)|{b}e;#;y?2JQ+M0p9Wb#k+8abtvS+jz<3RU0UVP{K2;nEC5vSG zNs@%zFU53T-F7PZ8zL?cvbrlApnnr=QmHK+ABy)AW^knCesAJ#l84Nl?^6D0T z*Jv`-HPtYFQ!d(1Up%)8JL{)t@3<77`V~Woah1+*;6hf!8W~r5nIvnANsDI86TK$8 zm1myDIzy=f3%gLJ)Hi*>t#RLDdxq}zqY2U*BN)GitK}!QXdO*5e!lflnGgKddVBNM zb5VvwYML7j3d5UEm$!Z9*%F=|?LYwiLO!&<%TpQ-*IeUfAK(HR|Fsy&7KqnZl3&&h zH||79U1JdY3ks>X%-TTPG0DbzQm%_bFZgk~ynqzbo@mH2^Zj&II6*Z9#M`)d&o0#sjtvTjfmWT1nlce>#D8(;s^@Efscu3nlB`$) zE=cRQJA;O|BUffRxM(}(GWOLOmFZuxMlmZdirx^g_LCN2U=~tSb*)K!B=f%ade~Un z6@u>;7Q2Z-Kjtz&JbNWykKK7xTVg=(GI1i-&2N#S!c%GcjBSA^u^8K-+N#PYX7MPN z%&p`Dm(OtvUk_f;apnB$57L?O>h_M0)1jxPvhDlwgI5;Q>p3U1JwuF&=2 z9J#1tVkt{WXZqh57-StzYrE})o_G>Ye@-6J& zLFIyi46mV^?R*k3e?_7kr&(9*l!Z8vifabr>Fv1-_eRqmRfe-9)Yy0)b{`Qf(kL;) zdlc`C`($+Q`P?)5EUG<55NX{qnKaz}eBt19Mh{x>4;cBHWER9avz6N-@I1c>B>Sfm zqwZo!`Fgk=GWHOo2+O}+EX#Rn$6t{VE+0!amo=0lkH0L;M(d^zJqSMtSzG~_!tPw! zdljLnc2a&>=__ZRbR}8#3lnb@%V$&_ME!B-_6g5kc>b=BXK$IfV)9MYG+%`OUv;zt1YDLM8jR z3zaD9?*XGQkz-KY6+Vs&OCc456(Xo{=P3U_KQBl2z6S+4dlE+0Rl+JLzTD&9!W_zJ zr;Ki;%U4mY{Q3K*-4A!t`WZfI`h4M#suK#G8c^4zY?Jub@ zgUMD(Egy+&ibHIw2f|U{wW6_UHnY^Fg!6KP@=`OMTGi-s=a+h$NK3x)sq01XlSEZ3 z|4va>WTUoLCf*NBs{dYz^{4S(AzGhps(TN7k1G_!iZYkBt1V@Cm$ZtsimYu|=c#@H z7w{3HAis3c0=SIoMNEpK)9Z*%51lP0yG|^M>M`MVjIiXxm4sA#D{=+c zPNlAX`WHTgQ3bSH+Znz)L|#h!feZ?Dnq5c&)s!Of>y0^1{hJcq@GY5r!kKk|$L~p3 z;jC%`OHDg@Yo@_%&GbHPv1-6z_-*$is&S6qI7k|IC>1dM(EWnPAlqBrxi$px9YYTHB-ZbMz9 zO~ETB&iPA*@mayT3O@a^mq6Z*`YfB~0BJqAG zrWg4qn&Hc^2Nvwm@|r0HVPGeHl77}Z^zoy5Ku(hA^}o;8hMlQm<)rkSEPtY)EgESe zgG6#j_w$cYvFO0PFHYhE!oWiXvsT+UoG-+M0(tM?1E=)?< z;mRIzyQI1?&-_me3`yPmggiq#)g21LzCul1j(Cv zP%dDbQ+IfFMUrkz5{UhNfYh6h1l3;|0j9X&v^8)7{Q@mDCO@4lx)_T0qYpu;S{qq1 zS7{YBO&Ch%Pz>_nKF|3lHolylD1RuKvRg_EhPzun)vvOK+%{9p^lv4AS7=cyI#+?Z zR3XI*XvZc$8S9L$!2R0Rm&BIy{-+tVmdx~3Y}O>>)6?Z^$t(gBF?|(BxDpoiWL{#k z*R*5$egCFb0DwD=$|qw}n=;xTz8|dRwupj0v4bp5F+TE+UAWEL^|vfje{RdWV@0lL zUbg;rTK`4P7WKukN#*{X#o#2iHjbFr6-X104)dWGX#5m5q^zKF@aXW_6cQC5C6anH zE#3B#CsfL#3}(3Zc>n60p3Upz%9x7;)JX^o3k#9FN^EphJy$VT#G3wwDHpZhp2Sg= zF^EvE3NhX63D#m%ee%=9by4O;L81S+^(qg5FY=0ZA^k+GBu^uQSeb6TlZ{VrlJ71W z?%>*cU#e`aGL<~&jB80F{_Mq15Ri~sZUpsE&hvq8#c6@t$o{SD?^}{WaaGh>TYEP` zRyAJ+Yy82&FAck(!RUKQSXqk8_`U9VjXMLl8&Q=ev9j$NXy=+4w6&(dJa+aC)~S z(o;O4_wCH1c|t4d*!;nBGc8hr1l15_X{X5f+7UO4gwRgD$m-qJNN#BS)4oQRq2m5` zU3Ie?R{I@X)$-$2Bgu2HAauL|2*zAf2~E6EgGsm?Lx^8>UWsB!{$Vyblq-+_3#W;{ z)h5GRw#)l9wEbeE(Ilc@?IX-~;aM!fI#d@fbcGRm;0xN0NOvtS znaJ3P{vpw_(31>rPFIS}k5BI~3l6zID5Hq9+|}m3!M5;yYhmwG+VT6eiYA7CN^P@K z7n(c~^G6f?Vj%pR6fa}(1Z${7S-z$9Is5a2fs&`+Icf$>15vQK6-LI()?dKl_b+@# zSQ{$$&;^eUe~4#rd%m@mR^y_`=pC9llGhW&##g+`<9&6*48$3wf*E*jb*RubR@hMt zD5>&#WT*ld9!fy7^I83*Fta?uGW_3sEi%Jth@PiZs3%P`cn}^z8$u%#EVL%rdes?{1Nx1cGv%>-9RWW&ZJK?!7i$$|8jA z_9UQCV`;p=-;aPZ=7Kt79+Cfpunaz%*y)gHoIB@KWnIWI=s$|^f+D&ZrM{W>+{E&L z2v*DehGs}dtZk9JfN1x0)RkRc51Hj>hI#T&ZxDXoV`Mm{05ovVeDm5vu0o=pi@EZ$ z*O@yR8FC+7GnkaFIuJ3axZixUleiN3SU0tweXy&X|Z`Uh)?biP_W)9hwa#)l=u_Txd-BW?0-EQYy?j@Ef{} z7?oaD-}>xcm`YDUPnun2KUI0~|G_6N-iWOk#$Pl0KqK-gydmwTndE{r?`oLQ2;rKU zeJXbXUFZwHKe_A$e@0)?(1U4Umo@5P)wM8gypj($s{=#xD3(MxVMo;EP>A1(mG3SK z?@e!C#YbQHT&h>~ZrUsL5vWpagR!bPn zuhHv;JwS5Nsap3a+8OhMoGoelQ2&s z2Od9;?f6*)ke;NwC}Tf?D`qQ{BxPSqPD=B>Z(XLLW}7gamkQCPU0E8Oo3)%{aeE7? zZtUSTi>ow}te!#je+0_$ zRK*wk6bC|to(3zDMy}L zyI2=rQ7)D$UU1G!ij>{8ip~$W1XPoyc+c?0ps$$-rzVZy1|p!^t!?than%lh2K3Y!z}xpn(GX}vXz|Y_Yx3& z7U{aUN7&y#zls$7ST}-HjGdZ~QhaVarJNfFQ(2kR=otDt7c1V^`$~VH#JtsPEpv~n z(?zGnc~NpqjMqmq|AE81j8>R}lv(;Vuno_VX+8r#A(X5tPUHa-`8TzrdZp3pMcD^ud|MkJ z9xo@iSP}_;T>X%#Lc{D1QeXL#h2$2Gujaeu4H@OU?`P5BAZKl|E&heI%5BI+o~|cx zUnpW7T_aZ|KAl~{cMaYn64dcz_ucDL8s&93zCMlan`A;;fGlVYf&EKxWtuzfIm^bk zx#PoQ(G#oXA`FU8SF7TO^b}$t;wRaf6=V$+9bCnW*Y!1}zCBWl&eZ&V*r>@bGE7)| zl8Vii;`3vtM4)s*gkOWv?iLk~|MYiyJ6+fb7RS0(?Fg4sNABrWD%9?LOmMqj1Rac3 zk*kb14|A+WmJc*mI!ET5+7v!@wo%DK^HCj^6BK7l@LKo~a^*ijO*}ZK%WV^~;n1b* z|G}v+g#ORx3$d=X2%qag)p~fN6o{vgJKwjaMo$ONHf{+n7Ra!4P{gs2Q2v62R`WwU zOt_6NJzrk77rR42A7t!A-FJgOY}~pp&1hFvJ=&&SX3T}Cx~C^!DmW~c`F+c%mSho3LFKiw`KgB(p-Xlc<^7^7Zl}jcf zP;wwYtplD%=zbuz_@(acx_NG3G!-43`=-t@NVV@fk3;VmdKp;EdJElp1O>wInX19N z90|7cf&dh-6ADKYUcBLG=96F%VqkhD++{`vN!8-Zkr)v2fi?^QxhiZkhJsoOKI=pIRhmaC8bj^@hDQiJ7Qz>BgM2TX@bY0PK1&91ij(cfSf|6*0k zkOEd`8 z9|zr80p&01-)cc=40!c2kn?f(gKpp+v1?W)|)(`pG-x1ht zC1p-@;eA=fbuETf*^Pk_>5f5x~IkSlf!azZq z{b9$i1@}8Ih~21i`C^=UcqFU$qtCIxb?LJD`-gO>G&-VdJ%9DXucVf~a?tju-I{h2 zuic*HP`O{i>hLOqF$8Dt1yw*2y52&muc;dw@&rKEPAI@HB4d^Vz5rm3u0$mFD8r+B2d%&a6t~ zPP6|48T$7^)8g2f4|fY(CuVm@j`tZvgU6G^vcf+XYmPi$4e4e^h?WtK_-OaBC9>?R zOFB_Xzhkt)qlyaS+ECh(C$#f6j-bH8LocvD1F-Sf1wqT!5qioe44N9a|AVO77UTVe zAvhUyuh_#tCk|dKySo;$QWZFwk3TRA*r!-1(V!P&9|$1Ol!LNmpFIZPMAiZ_gZHi@ zWK9_^piC7%hcSksFkE}$?gg@L^-@D2CfEJhgGr0$mkXymIHKY(-rsXs>ZCH(H*y&# znPGJdiBtZKyBPTnyZmo!av|BoxXZvY?JCF>%Q8luQU-kBD_yfV;!Rt#s3y(1pIFUMP-RVLsY9HpmOwpFdMC6IBQ=@Y8L zM_SvODsGzD7SM|Mtvpt3t5HL3e{SPJ26w8iS9W)TBmO_!mALMstcRqiyIbg0pRx$# z6>tbRaU5tlM@gnu?Q=quJFic$#oPN-=7bo$oU`n-krMfkgCAcO6{)xU0$!OXPA5Lq zNb3hTB&~C#Rhj+o;|)#Hpa0A!`NuPDXa9*WQvwLJ9I!iZ;_j2QYHqx1ZaJBYAagW} zTubG%DfBX{q6-VCCdB3I#O&$0E;xPR{lg4PyZSEBVKO6iBe$S%G4M{v6%WGrNT$K~ zVL7HE%i(_|ulgI*00x`eJ9>ynMprI$Qieig>umG<p%>(K~zx*%tKZJ8X8O|&PP=I1s zxas1_WNc76)=MM2d&lA`7^7_J~Y%C=CbQ^)5`4Q?QC#A547-HqRAvz$<)8PijQM=1>Kdzz!5cY?kWqOI=TvG5%W7p~* zkm@>@wl=N$@x* z97^M*Mn&e0IHc?=nsr-Yh=Gdv`7K#Ghme46CK!MCo$;bwvtgA7zwymh)+g(`VWM5vpUCS0J^3r9!AnFEYaQndYv-%x2E9QM=DHX+5BXPYOOI{s(w$G#d%QWJ+Wnk{=WbWp;BEU7`@BP_E2ugl%=a+N7^?~l6%0&G8ifMui2FNw{zg~?LX8QOG3%l688{M zqmk=bgzz!pmX`e^q`#eiLz|c0T$h|5+9f|+=qYMnW>^{pONSZg;=ZciHbXGN=JxYJ zFJSxBrgIJx;-5n}omUZ$dhtDa?Q3V*?;lr3`d28LslL2P7v?qYflx1}myf6(w-bW^ z60js#jTaCymNw|^C1ntHgI`ubi{_+!n*!X!`yen)SS3tcT9;_#xpDl4BiG?7- ze@t|$_@ua9zto4hf#zKvy(h+Z&bSPCF<27thc^WQGL?1_(CeQS3o6rbpJ9E(dx*Xq zT&TciCaM}dmY!J;6!;+G9D}9v?*;0y{W?<00+tfiC5G$*oUZEm59q9pppHO4PR?U2 z(&LuTs|Eh6=RnoZ%`#rEJ<}tn7u-glp8>}R^BuOxroR2T`#;%4;!9{jKqhI%4Y`5K zj%&{i&-{zm6V`cP7RaBNiBIQVbbx2%0`HnFxVCr-TlhyAawA42rIage(YEGs=Mop6 z|LuqRDVhRH`$!7e6<5IiuhMJZJh`^Ht{<9P;kLCN0fj94iaW}+5BDog*B+eDCGz?+~z%gshSqXw{<=nsjA7iwW zbmU3luKa`KRrS1ElB4#PMzSu%vTSKYdD%)FhxRa49nW&4w}f-e|@X87X5u z{i5&n77)mf!Xm!M_U`wK|K3U=pL2*@@zS|yf;bKa8D65*`l2E@%LrOgCKlpLjOV2B zz&WtDZ%sfn17a#)nria{UfIUg{HQ zXmAhHU+c+PPZ&9&T$=p(8<6Ad|defsbyk%}|CSiGdWIGEe2s#W~ArFvgAGW+>@G7MPZy z8)ToF$`xdj`Zqs(F$9T9xL5Z*g6&*^Utw=*r&qh#)ft;4lApjLu*5?5>&^Mp1NSrds7U8cP;rkn zKu>!+QZUTY#HL>6+`lPKy!+}TIB}UjfIexojRaadGVbGFW|(DetNA`U`4IJ=yBcjw zijh6%PHNXLc^xq&hZeZ>UP0dCZFAwHhDA-Wi2ga;G6#B(Zx-(>!!j&|i#jaMk1X1S zuP;d269Wz4*Ur*YHk;(#6HGr>e*9k?nRt%~-A@6TNR}&P&JgqlIfXsG{%@}#@;>}m zD9iWHh2OsOi~x)%7rNFyBj1Spfu~~EcD?}T2Jh+Ss3C{=LoWEI&o3<~Jp#o20BFyj zz3kwAc??I@m*wP*;eXyt_j_jdGU!FZO?Y z>Yma^xhM&Z1jHbczwzz;#~W@R3j7mZNr$FO$EVZb4%ou-xuZ%8QHT30u>k)yVVmcS z3qx!%o70-?<)~VVuVu;!ngjtGKeOaVCk?e zRz0b_QITY@_RR)d))8ZgF9LhPotKcV^P}-%Hn5FV*a|j`twf4-Y|GXcjfr4x0gV-u z%#87RTri~3z_8-oJqT+tEsrwa!Had*Szy%E6YfUShuhj^9-Rpw_Tm@3Jc&pa1$CZ2 z5mrQ_Zva8`NRAwV+%GE|#yD<_`gH^N=El&q`g@28{`OPQ)FV2l8OHMx?5yGC<84-S zt^_uAs;-ZNBhrBrZm-&YdFevvOWqT!doa!$yUGm3au5NoDwaFRU4EeXTg=x6!(*)e z@7cx6qzRd9oph;Ttjlza#8%21NvCnF6gVVK9 z{mB_gf>O~bsNV+wjbp-dwdJ{4<1^w& zuu0exc&|=BXC?V`L=_S_RVYQ*@cr<#i`?X8!0%<6)z2ELx7RWQ{MUuwaHVJl!O=KW z3nXdkUN zSZRr8WfvdVEfaCP*%UID(9kym_ox#0%|J~2n;59g(x%e&x#lJWgI2#=_}wF|_acO_ z<=)@2!Vq<+GN|JR;0Vo}L)UsZB=?-!0U0C*O4#|AV5IN?F*=iBgS(t$@1rI}@*tlz zY-8Hm5V`$IQ;)|G)3TTFai6N~r$+i;3r|qF_R_7w0IOS2U(ZwFuNu8CoNFgevA&HU z4zjUSw%ySb7GP^@;|5UpEA0~fRMF!}1_p-yxtrnox4<&(5QvR5OahTlh}Xnw{c|tGJ^3`nX&zoRI6+ zq`Q5Ez^9ncWl0({m`Gr!`~!ZKAYTCd{Q+4@hot>s7Edq4;jDe)1bUUX%ibSEB6WRR zuq+hX$j?!R@+AFwy`(E6?<1z%2k`AA>~@s7>f#e_1xfe)g+<0`gguJec~USqG11@% zRPtZrC=S#8HSe{IhqPo~fvz+S)@6T(9<1hmW8ZBn(A{X7MJ8F-bLf=v@4i2bMcmEs z1i3)I#9#Ahtg`fGJ%`JON>C!o&QXM{^fHa%EUUv?!);YF=gRtKvw^CRrAp;ZR8NO) z;=WvWBqHu-uBw_Y(jq~dc8)?{fT4a4Ek8Fns({-_HS(Mt+X4o6+{hZjKYqAdE$nL= zL133L-AD^t-6E&>A4yD8Ga0-9{Z4Hg+|Cc@p*j2aKzR z7`1agn~{&F(1OW1bxogxwe*Z1v|dA15=A5mz#g!s*Uhb6r5j`p=1zA3?^ZkLg2m>F zs%bYTg~g^V)XW_Li|zhWaZ;HoTyx&mR8^jSe4ij*MUCh;a{^uRlZ*ZP{qEzovj$+6=rGPlG*;5Mu z(Z@#y+jZ-vA948Rw6({4nE!h$=*x&2kf#&cD*Uvm^iEv+%@WvN@!fzYK7w?lYA77ADFx5pL^RA@9wCJI_|Sf~0&$qwm5cG5dve`9$#O>` zuS~#(bwJ;)#EO9Pp>Rian&J=X%o7 zw^B8|y2{uWJSL740vG?RB6D^`9}={EUEsUX#v*}xabXA#?P6fM<)r6CwxlalE1!nI zF{e1T_$1hrve%Q`+!@XZn>|rump^_g)be;tf|q8b%>_0>k^}~yc}p`Zeu4fIMtwc}cPWHy1Je+hZt4s2nhxqf z+)o`6=qZ6L_~JMdc*W1D%wtHL+tpJUql~i2C7#~Bn2zzb_%>Sd5%VW@+P-NtN2}&? z4_zr&DP}<{Ue58?z8c*>lb+q~L-)d5D7GE1Z4-JksJ|?advYQ5{(m-9+U*C6*eYc& zjg@%U)tInIDBkSUFXQ`0==z@;wT;(YYAS1T2xp=oTsDo-w%sAT5p^k+#hAge+2QW`-9j);=2s({P;1}INk5mBc)3@wAx_kW?PlmUoSIz2 zb=M=e4eTCm$-umFdpOVh_44J*&s)5)2A6kvT7Qq+Bkr!e=-j*PR1t}uZhmXIxs%Qr zhaZhJmm4i!_ZW>;9LLMX@8HCMIw&eP!LEF3KR=+4tFHRuy-Jb4-8Lz$HTf9H#ewj! zhWtNvXL#hZuH0YzYZ6Et*y+kdW^H_t8C^ZHUc~u+>4cHar69{TPk0emK?KPUgI{ZQ zh|#!q$lG{mm6}K@s1v`n*(tmeMSFRzEKoStX};whjM_N%q)j)PcWhnp^k8q2tNyYoDMMV4}KLE5#sX(m7@G|1^hnLEIe@=R)^7G}qIF z+(EG0ZT?uM&p9K0(WJJNpmH-&#A|PXy+|l%fumhjXnRu#MZ+<}Pn;0NLJGQu3{htV z(-$IwAynctE=ZUh|6>PH<7Oj7dt1eTMyviBYw__{Az(IW-Gch1|BTn|FW4BwBR@+qTw|g@; znQn3y_R~F~C7;EX!L!`@I8MSH{fMqvNkjV1M|kO1iz*vqd@)dFGhCfr+3MNG@cLf# z`X%enE~o`OL#?2nq3~i%!T+_YmFY; zkN&)Xmr+4WoKC2KFXxZG3VH~R5s4lWQyf((T-miNZRnPDqbsIG;a6MAp$ky;WrTx; zppA{`-2`Pe_|Ag${$o=T_Da##WP!UzL#H;sLF`_&cvZxXN|I^{r3GPW)TZGN48c4 z>gtIs1KrRU4ApG&4vzCUu&>4{qD zw)sZKb${40roASRwZaO|Eh+VrKM4}SzLEBkjD++d-M7-&3GG_NyOgGInNA9(@vKW91D0tV?zD?c4AZG!V$glNrs+C_-a8V6Qi55)9%;?!h z6W4c|(OF;21^nI*L(FytQt~5AKi%v8hN*b3=qG5rg zy=fA5;(HR)&EoKm404g%4o7%AfTdp|xsVkwt<|*?c*9*vK9ZR)NP8ibk8?-$-s#&#>)=crl*H#z zw`FZwe#S%V7SKD|M?T=n)e4N35u9;;1~I*@EhV>x9S*4#v2j|A47}^7bf;j$EpW1l z@w8rWLC)ag(oe?GQv2R7Udu5>Go-)mXWZyM&%V*w>TbUGD4=p{4?|nX+@Ohf9m#(`^JQ&o<%zS( zw}3Zg;Z6ci^LO+Hfeh}<0R52?G*xL-{l)r3X{=aXie}h)LA4vsfK(A+ody>(mV5SVTSx(I-r|Mx@#2**cu>1p(wgQ~Q;HEwZ zbJMhhw(3dPc}1H^1@9OQh0y5@wiW(fct)V_Sp_CLx}NA<>*}V^L|=_y$+(G><%Pft zWZUzF-ED38`xAcJicV2aS3uSK3fgtA5D|fg8}?rd{cH^&BbMxiMA zJ{gyF0>+!{_2Qj16qAKS77yB6#VSoy1<0rH!2mM7UnDWX3?S{T{l&-b;3WHMjtgvs zOA))9CmRaiBd^}S)1D3>h)`=DTr_`G^5{fcTt73f2hAb+8H`d)p3&jl)HnpNC-u+q zm!bZ2q0x8uz7knvJuRa!3+~mHPDlN>Z*_B)PvN*!5E^uW0V6XxjM^vvHuFN$d-#_+ zt4|f%@&is5FH&Y<2zUVrHE@B_-qgu_FVTA0)Ln*72>oilk*-QmTby4Psg5p-uU~}a zMCr!$*BB?3`>c@!WG!gFQ<{&b`}#9PzbL=rNAWw&&Foqg+~r}fBH>%=Y^YX(JKBTBS2j>%=TYNBEk+IlAWv4 z&(<*o_qtV>byJagP_Gxi^>jGy__~LR1kO_4C32Bq2M$8u?#eBh{1_4OYR?M;si}^iz0D zxYo57pu$%9{E7Dv7MFdJmOOsptJcF09V4K~F<%RfdwUJvYvs8T?Jt|&)rku1cXe6%N+Z6_`oZ z^X?nt+%oVs)N%prjrXb5_Iu-0*r33SQ;cnbLF2at3FP zpg;;S@*5G!^_1V?z_yKkTtcw>wYROd!h(-%~$QKw~i(Sw6LK{98XFa{l@O1475^@DLX0qR`W{%T4ic%)DA}?fIq$6mM-U|yy^-2Y+qB|}R|4ga3 z2{Ils)Bj=83)?#zAuho{#wj4F_tfK26$g)Ia~v8k5lNASK+LV3-D1*^mEwVi-aR>S zhQ@ymYcjBOF}Q=|?r8|2DJB>@qoty;#0|7JKnpxeblfE1i7(n96>?0K^{;Q zq66_Sw!KiGkr0|GzUj4_DHt~~2dTvQ7sb)-)ZN|CzCgLmku(rD$>JfpM+7^1HOth; z?bpAm2Yh+wMW>7MN%!zjAd0P=nrFnb{(Ph0`%h3&SvfYYGjBQ)F+cF%ooiNsmbycs z+S47I0*L=@1^UFuLRJojB*ENK&)2bA|RXE9a>(OL#?L^l|m!WA}7NhEG zf~VX?p;qPgSxt^&Bp6Hv#eT-7RLF*`@J42~zavdZ6e_?`LZ!c`_su<|uItbbxP^1_ z)bjT$ug_9mFU;vNNJc9Zn?hBHPa5{~xs?}XLmOj-R@9`ub3;Ogv!JXB&VpnHAD ziSrK33_L8<*rFs|*~X6NQ#uj?N-7_}8}v=F<`cHq$3}tRjvvs?+kOS$0m5=CXDuq_ z<-m#3Rrj39r)S(1w5Qo*pIEWz8~&Qu|H5iwp%res>36bcUR2QN2=f7Irk;Pgcydg( z6hf>i=8&5}*FgA&_*V@`SgaS?f;{xUdg|pB@56eZ=1f%!a(sCt6;M0tVeqRZcXzov zrfT=AIy@fr!tGYB5T-MIt99kqKVSuUbT8p1>^AM*I|OIP(JRyMw*tw z&d9wBJD!!!8)n|Wv+7F;Rq=#4L+arZmm0LYmyD#tY1qV>;}y!U5JyqSD`*s0%6o93 z`criy8ye^j`oW*DA6oYI=2zx&pifxc#<`gUQohrjrrlaHgKukDJ==R5qP^&(>S*+(bUm!Qg(DJC&|IZfQJd~B}zo=(^!Pj=Wr&Jz| zTdv^={FbXeYFR%A2j#*>388wf^UvI)N3VZW4;t3~+Qv;_QouGzI_SEd%xS(z|5BLD z%v7xKN-w|tUa?HZpjv6iHtmiUm28@@T2ab0?3qPpj$TywlMh9QPjjsBCRV)j~^A-idJv z&8b&_Sx6V6nZ){;9VWJImi`Jpk@RUzKP5hvto(&NwCgu@@D5rd~FO5_mdG)5_ zFj(&Mf%(QSY}Hk|^{Wz-ZbmfPgh9UQPvrJ{DT>6#1G245)tF!3aaQKMUmX4|GFjF9 zu}^>^+Ar2KF(AXAQOdu3YDJ~=6|g6=ch~LA@~Bru9DELm42-9lN0jY=ecw7 zb=sRX4#taG#r$g=oXN6lZ)>s-GpZ?u|Go+2kv}iHS$=piX%=>atiZLj?CmdBo$HHz zf1naw``qX2eg%0(g{eY@_m7HO;{uT<=IR05nal7ri`_*$x+6KYm+NQF1$ju!s$X=& zf7lGSpkSTvdFy4ii(86xmqZn0y;Lei8^oBro|K+7Ol1}RYPF1W9Xf@IeaR7@GM%oN zDrWhEP`1xfvK`fum76yGqxfY}*wgibZpHyCemgSe=&?8nUz@{yLqu+vAJXn>MI!Mc zepPmrdr60S?ds_6!^d-f*mKvC)nQMHCZ$mN1P%^PvCtxr|FssfVo10dGO8}lOG`h_ z&uLcA&Tl)yNT$Rq9{ZJGlX<+ZJlAb)aNMUS2G5ZJsZOkGpj(V2E>=9d-(<)}b-^y7p|P24Rf` z*C?M{h~Y0@EzFe0QL_DI8T+pF?(Xon{2J*Zxa+I?0(-|0{C~OWtVTwj@HOf&Qh0mr zc*?t`l*Xg)AIW3+z%%MiiY44z&;V>QMEhcFn_ZtiIjyO5^fk4o#6#^A7bd``sj#GUbf@Bi!I`kOSnPW5iZ@}vI{c_ z_yDJl;#4vQRLg;$=yxqxADG-W0WGc1;^RJkb=C= zaa2wD-q*wXYUE#y5;{Lp7_6%$P5F3K%Hz~@cNZy14V552ggxSD9}FTZvT{Ef&B*n9 z-BBXh9?BG(*Z)-By*N%(i?o%-2`G#9p}E$o?=Ibptnv;4jf2e(Z6%Vfi|b1$JQGcI zMoHyGj%S&4A#MnDJg{nEG_4KFq`pOpUfz zc`GfF8|z!ztGV{|lwN0Xl)5AyH$l5Vdl@+LV8>8<-_JjwOBh_rp+L&Y$YLunGEW|| zVmWA*RQ?^xLQHOPmv^)vDEK(i#JbkZiTO#EuON^|iI;|7moY~%EnR_03Lhuarr1u} z_>xA;pJRhG@wY%uSc8JrtWa^L1_u?9mZ0egt%lT5awg729|4dvNPVW}3L!;uIs2zH z$LQNIKrVzQd@q`HO|-+&R*SS0?wTyaZ)a~m)g&ygVGd^~DNomT2l5iJMsh99D}TqR zEVBB41CUZ`>B~ysMpQ}pqR;Av%DawJ-`g(g6Bu|5Z`8=7oY1cAsL`)9 zLu@~(1DBo~Hqe|E;sa`>s)yQ_(Nmgjn7i3;G~N-&yx4TcPjX5A4!*D0sj9 z_Ye$9ZR1pg@8Zkj>a`DyBn^F9R6Dxg{oqp!u@qxp7s}O!;B+3;J_52g7Z>EUvzYX; z!;O@)$+Df^xL4%LM3IdTV7!@u>VH%TbNmDwBa5rP`WH61`}d8K%HO6~2DtUNTEAJYoqHg5%got8kX6?F8 z3T);Lii8y@;tpga5cusLMk7N#9fB#Ym^RSUqYt(nAVI2Gs(qo_3wT}|Ew)dRiy(fL zrSC{0DvfSZ5eT!5&_*YYbjIwsI2Ck}`dYm!aWGA$|b)iBRp{LeqPBf z3cx|3(#u%Q*zo0LZ!0uVdy4Gm+w|h1VBBHD>}UD=7ztMUH=bMno^k$wr(>I;vKYwg zj`k4-DoehdjdGo1*nX+4J&a^hfRt%lee4L+hPYXtj9)-GuJGQUBgBm2N@Sd4JjK>g*agm|a(Qy($q*FkMnR{n0Z3 zDS(#@$x*ok$0Wpe5#MGc&mk(kDNRF^*=)Y?$u1!aO|=uch-UKZM#^-LBwrGb`QVR+ zF&a}cadzRMN|`8@J7Elrxkk&?5A!NMAxFurE(Qy0(CM&Gl-n1c&r3ooN;n=&e4O3H ze}@`A_X*i&H-Vc*Q8u{?ciLv?6$EhlD;N9oc5}nD3etyUUd;Gn zjUa=2ZViQzcK{Brf^Qo^b5eHtk58|MaWsR@G+<`48=k)sBgy(iS*H8<3CPCG=`KA| zA=AODWXSN@fI*k+bTu;Aq@QzSNG}zML*GM6iwLe^ECS1z3a$Yib?TQ8q|1pyW5wpE z6z9-3Hm&vju`^DJ-|Nm*e(Lx7a&shgDe06-X>wmAr^d(IFue2fbidZ~{UCE0pWpmJI0{vc^ zRWK@ID@fpw7GDJ|MXc>uVX`-<>~LOZOrLRRzV+CsUKTnpXzIZR<08)6OqOZsiDgEo z$JyPWNu(n(A^O3+Y{89&qn5m-`QE6Scx7FHNIT-SLYi=-!JUYM6>6!uaQ|hKCH3}I zIkhSZnI-{azkM0p_a}Y>=|WZdb-0q>4FATJ=f~gyZxJvKezGyks`i=QZ+jT(jXb8hK%O^+QB}7W z9u?4J9GnE!`z3-+J8Veb4#+_`|)Or|)~MtCpm6#G|iUO>Xbu%f?PbN) zH;*lo3yqqby|>fV6=Hzp)XF&WKQ{t)04gEj>};9v&^W} z-r6IPkjC9fCeI{bpltaX?=ypx;pb!HgY;tU3gzBuVLhxt-jP$X1I`J>Nl>(Y6|cD=7ae!bm`^8$1J@zVF!aNw+qEarJNpr5 z=H1JTHh5EXje{FdS&op!y;v!D>$M8~Y0i}^UzVL3>uW#CY^k|?id`1y+^;c$#VIpr z(5@?$+@bYQP7DmSrYFISBf}7mpTiVg6Bb3%wFIJpA-FQTTSOE$qzl;YE(N`?*40m0 zNkf{_{!;lIaWuwY>7nh5@C=|9EjwRm$#5-4D}6;jIY6BF{_Ka(Rs?a<-`^&L3uwv z+Xo-ZLj38xBLJ?gtXnkAzmX_u5Z1q?ASM_nfccjdzY}Vcu z*)=d?vsCMqgB_YI7ENiY&N#H^Wch9EjVA%cT2MMugH*)Nu0oNEbasi+c!fZ-e+{33 zn4nt@1Q&$(ClJZd49f!P#f99<_1(Mc6BByta?#f;Rb_+KlyW$%;Z#`c9~6s`;3^2& zC4J;;7QgFtKBzVbNbe!Q0SUr?>KZX(*8!&h z;{p51EnpCR)DfeJ!s+zEbjVaZY{o+6dQH*5shTS0#k_6HpEtIzN9)Ro`_75BCStCp z#OP`FAjIVGhsUpgv?14cLl91e>r-;lqraS$cd$>8NfBfYqQidq4-*0oXe|2`mAR+c z4KQyK;$HCdC&SOEn#oaLqV6K}#drFubn8h@OJYWBnUv9~Y__`RKLP)-kuIr0BMf5l zP*;t{KfVw1fA~Hv0`!c_H|E>;wgtCnPT{!UEvQjylNM;LgZwJA)(?amks2I|7E2aNGX$6OQ zlW_!%>9B0T zHUecBM0^|>SJf=wP%_LZT9jW2R3-d=ZiBE8wZ<1~ac1Br1V_~kETM2}|Df}36ifi6 zD>F}vb9t{SdzLdckF*C5S3{`Az`};sZjsXdb(0Fq@npJJcqN^o{8Ed^;cQq3Q>1}e z4hus0(54Dbc)G@BGsw!--zMvsDE^d%iOapLju0@`j<4Cyv!RRRe8#Hvrd7SmVmY+3 zZ@#_e9+d&C(cK_)SwFfiK+?sRMz#(X0wT(6sWc9Br0lPEG4LVC%0jh`aC|E(mTBt% z-^R5_SmmhOW*7Jmf%K>y;^`fr+Kw!ln!6Sv>C&j^CP$cwF`$S(B?RxXPGO41@8uDh?{`-6 zU+b1ReenS5H2XXvsUasV23*;~=#t-TyRx$!Q98yzt=vmUix?Bf<5m0)JvE6=N-*9` z9*5#K20Y^+NxTEOrR>os$Nh8rcl|7Cld}&7bdWyyVnAv&tG3KMu9-Ne(y!hpiGIbnP&?E+UyX zrG^L5{Z+1(#zu?1s$uBz1RKS6a0c{VRuEC!pVLs(v6*?+^j!jG(S*Y+Ub)jDsE|C7>pi@{DYmB0uc)u^|}UJkUh$-Imjktg!8*QQ%Y6c{j}uu7#1k)K~`_iRjrIb^L^v ze$y~tOpq*0(9Bs#*7QlFKg=%b3dN@;A4J;fxLhL`5y&GMd2mmleTA`PeJ(u)Fb zel+l8EphI{)_xC_S5K(0>UZ1%RzNt(nAV8CfL-iG7F|OcJjKEZ)2rCxURE~euxiW) zg=qw~ER)Ekq9HMfm>_1u{eXsQr2lQ;X=Mr&HpTw%1gXsRO6{x%Str0QvJDzr4MQ0* z1KCvWVJZc_E>Td=j2IPgUmMp zYLNEu+K~kAhoqm!V~}}f7}wU6oINN{Rrw@${3?Q8ByyeJxT>6lI%&0Zr1RxBwOIvc z0CTc`*SpoS&XH=>G!!tF`|%uk+8;(g{hD)g_rN-E_XCG2#QQ6O;#LWyMUuMJqk>e} zKked+KjawE+t*LC+d_s1DmmNB!%>R}SDs51br1AN9U!l*iV+x4Qstt4#CPQJt-pkM zyN3HT4i8xnb6(7Xg}eiRpX*CS-g}^tKDpjat&k>eBI^K}6c5mRwnK44POXR#O=Nfi zQl#HVCcheZ%!TiLk2ohLXlGGiaREEmZC!InLErcsjUf|uxfWs);8dT~vqV2sO)VVB zvwAZ`N1>qRQW$9yLA%aKA}a|_HT{y;H42#}3W_ zgeL^Dmelpof^Q+eXmqX?U3t$Fh*?>aY;OHdGXa85?M=58cw~JOo;Xt_7t)Ot8mxy@ zU@e+f;w>~>`42*_2(*fxomb5s5b7y0bLFz%g+PPfBCY18*ZIw>;~_yPTsdXuEv@M0 zNbD7_l+?k7ZQ6msO#obKt<|sZNlYs%(pIGrl3&s2!g8)ljLWQrrQf`mjk)^Z zUbWyNa^GgF!ga4x7;KrA zF(2|imua?`YYwcdn&@O_d5UbkJiW(i^yYa45kyvBdcaC-SB zKKAG8A~w{-IZx7RcVs;2#)1?J<%sD&D|?ocuACys);z3F3n^SAKEE$|HiGsvO>Z5$(5GyyL=7rJ!< zT)7}8epxP^z(Bc{MfWw^LcBZ12WHal&GY^_i3x?9tiMJ*erU^{%`&+=z(S6lxtvm~ zH{%rYo;}m=gE+&`gu#;Tq6R=t7egYSw17M?wH(;zUXkI``&R-_IZ%U0I?e;o@AqqL z+%$+3wZsHnfH^$}T2(=$=0}3qxny}A1ZlBy`4zrygbGSJ93s0_h+InTVsQg8&a4k# z#kru)22IVd$>Bamk-QFU$S<48)0a6xi>k7DtzbD%?0_Z>nzaJl1cPZ zX`{)KTMC0L&eG?dD6`IUU#hd?Rw%4==AlC`xPCp)!B1_(Ia+RT$3>!WV9d7$?C^%E zwgb7PAwS!0&*`}zY*&7D;A~oQxbTY$8xV$cdO^Tx#_+7#-$ZaW$J2sq1ri^;XY~>_ zCxQDB0BkG|$*}7Hg3IX1T!TDwjZ06Wfzw5ARCL<;g8?e_!m~Jv*Hj9b%P#mPh2_Dr z)XBb2ZO>zHj$S_)vvu2ZplCw-FrH+SD`iQ z`i<3!%Q>h*pEAp!3V_1qEXSWE9B7%G^!`XRoR&-V^If|ZHqY}2+iFavGXZVlh0HC0 z1el>te%Kz!R_yWPOM^H;RUTC zuoLZs9PZzWa1R96Puo8D!JUjJS`NaeAP;!!Nk8eWp7_}Lc7_?u=6oF|(bU$Ux!4(e zE7vsa2b6{aHx@HwvLRfgjahm?MxVsTO*ud>v;QnbW#$xhg_biMyb}iLM!9jD8SJRI1hGD728}?Fl zVe{g4Nr1%HAN3t zr3hG4O*R{^`HqDZGga@s+7%m zU`A51)h?UK^t~STdwSZyb1JC+=3`n2&WV%tdlODXDN+h#I%>Jbh41r(Ba9o9?$9dx^=G+RGb(O?!4Ga*Q>p!5Af-#)r!G2Q@#TIP3}6o*ml`%!?1>fL?e6HoJDTm2Em@fSX}vqCnccY~no11AIdQMtN|mv(_LcxBQm0c+gT>9U`BBrmbbFHN4K7@d=6O5=K^kU$r^*1sN#`?5{PPPfu#=@h;n|w)SPozG{ z{aCkAmEFtw7$5lnUo0=m6}o;Tbl@+Q^AG93m#or(9% zQ)7`9T4Qomvd!y3Xuzhe!7ObaewSI<%4K-aj#i!_jfUTVM^kVS;eS;wcV(+w|EBx8 z;R_vE>ZgI}6y6xcH_41>W(Mh9poy#|0sD}ddEKyfbsah5i`y*mB2pwM7{HGf4L z-o1~h*RWw3HlEdL3ND_*HXU=w2T(LcD&$Rc{aKxrD@W=Xw0YlEUNfma!@N<$$_&@G z=tG632vV$}g7=F7?xFhk)qyM&s0(cQgKu|7QjAAiK7b1tG2`^hOCUC+4p^&fjDUDt zPHTTqQw%&#afeRf5j2(UhpKP}RkO?C|IY%*nGyW`p#8b}2;s6->5q7r!njK}|KN1c zcWMJOMB4XyBKAN>;Zq%-z0>!wQUt2!f9b&8BB~2BG|jjNY$=lQE*K$L{h+OiqUpBt z|6=uUzy@911Pij_M(znl!K>;q-4NjZeH`*~Y|z;I`BsXW2C@TYSBrzQ<9{#Us4Qt5J+MNyh0Tu^4F!kSa)WN~G|B}88@ zycqcoW#bq4sAh0Z@#C5LbU(Q*iI%UhFpm{GPK@6L>R|IpsbUGc#z(nl_JY))O>RDi zD^QHnx)MmBI)1gWM_tl7Xr>O6JX>ybSBfg(QNz1wn<%JXYS;0mOy4v?Ckjq1?gB_`*eOme%#x9EdN(s;aYmo7lWLj(5UcbuB1!`9MhQS+ z_5up^Bv|-cbqz2&IXun(2F z?Z|`8v%)s3kK_CqWcZX_u<-O5AdhLcky+5C7dSRRs-v%PPgN?PnTS{)p@oN%&(PWz zhkl9Y1Vt-nr_Efj+(40}%Utf?KABuhb{0bbA{ivi2Pta|L@&g^!$`@vvVDJmjll=oxCr)*BU9o@0!iq|}o7@Ry21D++PC#<{ez zr2^o>MC&K%f=llACty8)37c^=8>TFX;LoRs&fWqg3wc*u{F02%tH0X`^Wan9N5mH8 z;E*6Sask1^aM1I(HUV8O5-QzKL#yGk1&tap=Ff>gu(-4uY#+aTXSt4kWtV9k<*$|z0c)DQL=-D-_PEO zg2COj{i})Kxb|qgy+7*O0T_dA43t$MDF0}!O7*`gX8^W!civpPcKb>CA;9w;$j1F8 zYMntm`t={)IzA$0&KYQuozpYj{51jNN$n1}$P$wje7m(&*-D6!?{UCG9}o;g0VHzC za|ubrzRwp4jzn#Nx}a9Dm)eWfwfMJqHtbGOjiuN3C97O`C{}%2_uo6qz5gC9cmgpz zIja7Od3NmxCBFJJ=*WxDZAs(E5OOGgXnf&``K zi6ighr1Zs26oSyfI~aTjZ*d27Z<=nhZ_p+~_Xcll0{{~R1;O{9Fsu_DDaSmahLv2TL~NN1mvD@7HLl{p4g5XzCls-e-UsNE#&c8>$i;*r7w zB2P*Fx)p-r4e1JZyl1KbJB1MABEMPyM z_78nkS2Xr;DTMDm763~c*K(sUdXQF=gaie$NhzIC2MpKrH>SZhshE}ey@NAsz$5nr z97KR;Y`^w&)RZgP6khgYGwzxLGr-F7b%ycOJYr-^`{6(GK6+ZPCA!seqc3<7afa&n z4=qp>Uwt;|44Eq(Z4PG5^3NPFcl~PP&GZ{xqzqnR|(nVblyt*jxBXO-E{am=1vV7 zoS(UdcMv@X#|_$yf~fbF?%#Y-{qH$8SE{wfmgu7^DgmwECcpK#t4=Qt@CyZ35PfRu zCcwv|%x~6k#+J$bNYa8WyY?fX`}?CHneFrhH9XX>uUvzOI@qA{s;G9}iC4ci$$?H= zy_WiiJP}y6^Cdf@h3uHq!l2n(rg&HE>^Cbr_aVE`MY3=JdkmUt9r5rE>pEU7D{*S! zztAk&&BGKCvC;Yzylt=&+U>S1IN+D5oy$G%a!<^I{D5ipib`8h)mNq8H`Xpd8ow?% zw%X+E4k`N7kMYf}hXBdhzp@q^h{|#m15Dd)(N>yR14?tButdYw9B;|O+z+f!)d#C} z{90lcKm>Ux6HBRF&4{$KUPpT+p?@`vS?aEE+dpOccvapv#e8fBu%EKd zZC&ZNF!29XyBxNnmyU0ir(F2-u90l&UxS6&?QZDd99C_WaEOe;!!_|Hj16kUSpp+UyV2)j=1Qvv9iD>y=OrrTDCu-4|_$JBJ7I;0=6 zO-Wq^9U-`Csb>skoVjp^O|Tb_T^We!fnxwim^u9dp!iJ%dNq9DZNm8rTU${$GYKj& z)9ifi{0axsG6@rBhoQohUAm?#3K1IpA89QU&!Yn?QGm9cqjSh3sxy2_I^1YBT4Jkh zTiqn4W58!HaL)Sc?Wd$BI>$L6tkMXr^0<(_I*SAsUPF+0tya>d z`1u1(eG!IeUcAqUX(+b7(EH3wC61*mv*7|*;qYE1P66?!eG{6#K)c3vA-0|fz8cmc1*#n?bj~8x$YfA z026b|+6*#RAJMtKWh23v{tR4)rt6?MD9OriR#>C&b{O)at651NsjB#JO1RXl=rH=8 z-lxe&-!XvxB#VLq??au`$DwZ|54}S!x>&A}gr$qeoF0V<33d{+6SBiogba%HM8H{H z)bodysg3^mJ18RWze|f`HiE9XK{?c2g|dYL9mo_doOU4iFzV*Fv%Sj~g&`j4zEvH9 zp0B0SEN6JLY$`LM!!35P80D?o#3bl;s$F%O-FMOh%O_4Z+J}4rk1DEVt5bFl!x-gm-48mKpF97HogjybUD5v zGvq7j^3le|Q11V_2*s%xq77%u7-h}yomDYo^Ja1Ye2Rc-3KFCrAcsrBSdo~74`zuM+LF16Du9I$AwI5LqaH87!%<%5 zs3k3)c{tVg`tLY6Is~tkRlYs};81t27zuC|4!{ghw|tZw-7*@^%%AM7o<@nyUf>61wfV0GI5wQPoy$mgq9pW zN97>O;BfKxro0umQRD=Eha@KMM?G0~g$lcw#=@Od{|1*F99DFI2b^O%p(%!wcO$Rw zyp1JrI6r!AZwGaWr+-e8L1bf#2ZtiTF@=g0K7cPWOpQbSGs2|CeawEk2u6>RkhKJl z`ODkjZ;5#jbR`e!B3p@AajE(MxRTx4OHF<$?eJJ}$ev$a!lV3?8xurDUs=v7NFOfsp6J82}V*m(LbVpbt5y!AvjpT?Iunme3ubsVn zPJ!`n!Ak|LF|JEu4rC1y;n{lS^tvYh6b5ocP9Yl=k2WkhY|sGWd)3B^T}|(*Ux^ROp**MocgHR5pQmDPxWLcSAc;pgx`Onb_6=+N7wJd{a5uy(t_ z8l;vbb*qvt8llF%?N$G6iN$Q^iP1=a#ym{IBfKZL>1xCkL15DX zp+j``_jw2U6QxOA!FH*y!kwCY4I6mbwLC9$=c|M{ugsVuIX+EEA})s~2NSp6)InP7 zpg}VbE}7kQH^ceQ%Gf=EyY~pNL}#x)MrPD3`<@nV>)^w1X5<>u1PedXXApVlR8 zasCRnz}pZ8zVCJCMf9-O5iS0YHmOI@K*|;Zd5S%tgdsO3X@o-1ES%$SMY1^Gjn6!k z+0LdpEkBbYW~T?FdHV0oIOexXF zEhvj(pwGHjF!R|Qf$~Klqd`))mI{0EUSq~`9LP4)I7u;NmlWPf4lIoCYEti34+$_` z2|5;wtV9j`%+zcv?S@H@-)rzZh7t164J3$Z1k(5UYCf(AH)n3c=%i>+eldL_K^G6) zeQ*lf4gFOH((`2PerzB|*lDk83S3h-tX`SN^W8pe?ae;YVQpj?T0HDSgcj|)p<1$g z^%-vzo(L^}DXZiSshuMZIG~{!E@SzND;w`-WuI1xuI;MkZA6LIm`37# z15HDWDwaya`+|FSr*g|*EeY<+Y;Pd&zXgOnB)E669H$M~q(c}DUv&Lt2j7C?59Kgu zN)NFL+yxdV&c^+)SNT#CZb z!28FxA@}xff*HJ^GGb_B>MPPvUiI4P_L&-X{A1dwE_*g9-iQ`i?hu#E_^tacWua-? zHUK_##_kO#fF{)gqO1gQ-g=>b0%&(Q3%emZwY}-Wbx88*YU@BkeQp?gf>OY}*;Ng2 zSY-2`Lh6(DUE~iB+yKY_0$D!v(UkRQGE;L2XpwzOk{{7%;L(sy9zdsAkbkv!)N6kX zVOo%8U$DjVe}3%?Chk}Oe(PAo>aJjeumMpM8|cE@X|5iG zRV#~Nrrv&HoEH;(b z5Z(LN34zN@nB(v$`Tsc(yrO^R0q7{5vV1p@1&|X0@3|rwCa%DEj)GcCTDy~oS`}UM z_qQ#A(a;zwf23i)fK9rZ(61Ry^2W_tO}4YzA@PmH{JVD-pR3bOyg;%81q-O6PwGE{ zL|Rd7M^Cd(6E5oMudZ)*Ax(|C?u(Gg|Tf;uCkJ*9Zs$SCUxE_W2)(Am=cWQZUSNmowl7^M9Ccz zoMpH%?T;kDre8wxmm+|!@-@~WE7E1;llm_pjVwp-jpRw5LqFY%6<*R%XrBrS5+Joh zkJP2g9TqbhgPV4Q9`KA65j$f`iKkaGqvxBiBMx_7goS3cD7662VhOX7jPh3{Stj{| z>Bb@2$qr_zlngIQJ+2!z$gCg!mi7n9@9ImIlx98LnSKLUl`eybsX}4)7_@*{$HUJc zZ(z6{wmn-!SPc>Lam2hRtRX$26`KTnDr0~T7#S&@o;@deFjo~F0=Kt0MZHrmps$yXp3tvtA$FWt;vUPl04$kO{ag-9{s-itbDCZDr5Vac z`9H5NsMSR>MU$IE8a>Z&D`|N|PIU=A)dH#u`}wZ`>kL082fCCW8Sz{WaX#6WI^Ny3 zL6(u6-IrPI_7b@Vuw)JMM`G4-)~*m}thtI`*~9Z&T!b%bRQi9k001G7ncM;WgeE5r z@}CR(ACj0r1O4MN))k4Q65;w*&WUT#Z?usY!&9lBHu<#nPXTcUb}^f6ynKpo-_!Iu zDc>Vtlfrh*N-u|e$)9Pc0DnZSawZX#isDzoFWU=%+pp6JN zBL|5h0PkS?&C8F#47+x@YcJ5>0&gG6WnN@<2R^eam5=IQmh;0fP>A$Bx*X5RnQ8Ko z8-{GqY!1vUOYFI1Kif)*ntI z)Da1SwEQkHkF8mq?3S{pn4k;xc(0~!C7I{azBX%0S5f_7^IS;{f&#NKaX(9RgI|JZ z`M#Td5r&|K69?ng^2L9HxGMJkxqHQWvU>zK>l8~xX>7Kk=NdryR{yQfRp!I2{GHf6 z<(`Af^&40YM4u6sUDE);|UZ5n`1qr2l zDSMWdD}B^9`RZ!eVaZi^*{){V#`;krL?Acj0ExCU54k6(iBa@+9rrAAT!HNkE=Qb? zT6Hq&gHm0>Ku0nJ?wDO}D!DJXr@0WuNqeK3MCd__R&h5ff#lF}CHsZ>njkaMwlpD))Ew6lE{jG_Zaz;0S5 z2qTU7{73bN1qsV3?Eevh#EGy_fNbB>ZS!e|W)-!%kL&>ULkQ2`R!VV7+jS%q_loR% zQBTDhHKY>oBcUfKiGo{25@g~j?vp7k5PM zeZBo30pj_0vz%_9+*3>I_L1yC{3IK?DHeooL-j7XztmJiU`0Wct*ppBrWiB()%Ars zzg~O`taO>zzt1cqQlhZ;ei3^^QY}_OLxXQCQ5jLSFcrPhIk*Df`51$5#V9)|NPw%B-$Lp*xse+ zli&(kGQ<5f5H_0)pL7fIe=Ty$rr%?fnq156_Bbf9T(Zl4)3ihxSrx7UlK6LJ!n6I( z(bB(!Olc7=);bs1U6Phw;+9m?S)+drs}TPqXAFETwd^lmlBb3kk|cTo`{AEgA&bQd z)-!?K>(@UV zIe#jafU~k0TzihNhM%&1!%)Q0#Gl<(j@3e418bE^JV=7jQ`7leVfQrpRz z9;RnMoy(vQ!AUHz2R5*1B-XF^ad&-FMyHx;dP|SplFq-)4g%SpUYI1iS&7G0Ta@-z z=_R_CAZ7?nm&%HMtE!wAq=1;)XT-0nl5ME>P*fAVQGBtO63NN>c1ZQOl_M_-7=rdE ztHXU{SA}o>XSRRO_dZWaCimZ#(L$pcz%hID{?DxyAK0=A4u%cnD1o7}!`_fMol9fA z^N1@ThT#fB?{(1$sS06$Is$V8vc0qo-NH>H`EV+Q8i~Fn8EKd7%j67Rtd^{XQ9B;LgTPT>%AKK?l2F+~GcL^bdDAE9HeDdo91 z&(+`EV!r?wl%VR}?o9^2+g|_}?ApgTe^)S@)(=*_m9_;<2p=g8H)p28o3A%?Tdu!Y zG5tPinIlDxYZO20e4hu{$L}<+Bc5=GAG@lhEs)wqJ3avjdr_8B^QU46QF}^O3o)Q?I$&DCVN6ZUl9T5wi1TyX#6KSq{29`xcDL!NU7 z=%%eC^f;TRo5}9F#?x*}dSW&`u8Y0&ELm;ho%xTAW0r=V^%x1P{p3E3Yf@+u19#Tb zhpjq%-RG|7Y<_z;v7am#rU)oIX|V0ac3sc^cTu(`VizU53{qRm)n{;kC66#+1)3BHb54b>vQ~I z@qKYBtS=E0*B8z8qYR+lq!(YbdI@lTO{#1sfLniz&TV(5M&V=|nSG%Knecye10y`; zfM5cDAK%p)fjg5;i>h1UvOCYfNcd&K$wvgr%cNy-0^3%0bX$_Hd!fPs>pJ1J=(E|X z;tfD3er-)M7^<6L=G(aAXEwD211T6Xf(9sdhJhl=$I_VOT*vo;VvZ#r`{ zo#ffV@HPrSgL{kS50y^vQo#^2MCLg9aniO5;krRNq%+2}cqU{HD*5;rXR48IP%QoO znJ|U;L%Z9XOZ1n;ncd18blv!!s7~P;J7qA-TZfO;WNMz}y<8$1brvEhW>Uk8u0=E4 zcXNY4H`TJ81&B2<+P=xf{%_4!sv!76AN|ck-Im#_PIrk8XILg;8fMJ&u~@v2^i3`u z;|0^f53f_GZQ1=;P!=-;7^t4~kEFysFBTNLuMBp_vqYF@gaqBO@H&;s#6N&#Qpje~ z8;{&cg0x~yEj=TmY&LL-&f17#j1&rw#tCbj=PoGh1G%u$>E-dB;m>wzyIZqwADA?E z43Aem)FfN(7noEs6eJr733C34jK%MC`!Yz{0h-Ap3!v}@;@H43S5y4;8|4{t+^y!w z9gsD&LuYA^XdF!Lbrq4aZy=2(l2`i@8+xvbo@)#EY2%Gy&QBO>S$BRLd{-n83#BJ1 zhTnYru%0HK5U-q|uZlauLL@TnG^Ml5C%*G|viTTlV5fXA+4{IE%O=B0;0{zaA7~h>TbJk$Vf3@AN+9d0Mex)*NSc$Ct;yM-ri&U0laipa2><6*eu4#Tyv* z2pvh@LK<&DBv=iyy@~jr{Oa<>aIQY*YB!Q~|DrMc1655hnFjPAahFp`13h79dHDSM@%=orZ3zk z@|Kc!6{MSX@s5?{MGZ2?kknD8s{8=QwKZ3mL?E4P>O*mI;U+%U*Vue+h&tW0s+^_rS zvN!X4EcH{;ruS}_I9z~QTJ={jAbrOXth@o0FNq|d@#E<$44cZh71W!GZidINY0nQ> z`tUq(9{J3pV={!tz7gN1U5=?l?V94Q-!u^q2S`+frg6E#r}Fd~9UoyW*tS{)9CXEs zXPC9hAPc>3jPX6B*DtBa);NVrF-oL0jp4PI_z9jO%9(fpxAH$bE3BonLvp4QkPqen zp?l_2D&iuUrpd%uCN3_g_a!u>+^GH2*Ch7$bj@++aUcILA)AfBofw>3tUl!Hv0LlL1K1uPivXTna`>hDoQK zjUwkCl?+{DWh|IZPA3e}lj>D`tJaGHYT9K#ld%-hSWzMU) zg61jX9(7r)0u!pFY9BJHZI{{S<9U>&rS7fw(g@WD9T|P>$fxLN92?~jYOC7!u#ukn zQzvlOXC@$G<(|oQUUE&uepu{7TCW~XjV$6Ht7{R1r>Q>M*CR(n$d+GIE&FQD*a(kk3 zTMmTo4AFmaFLaF}d1vLrK5=9vNV-(56XjGR?#f8*6UCChP}J+$-k^?v%|K|Y0K|^m z*4OtuNq(~zl+HY3JB4?Ey9L&D zm>^I>gsJug{6SBL^V0KqSc^ZQ{|S2Z%H7zZ%3GW9 zwHPq|6dL$~;O~}%;FoC!AIEB`2~%?f>4@|``Sc6-)ZMd3r6utxf*bW>l zb>Q{?_uo-r+xU6LF;6L)I+cEgWj%s2HJZo1}EI0d|NRuCFXf}`RcS)>EZ znQuV_6zJR7f2n8xIRq%NuNPAuX~WTAB>Am>G|3Qb7xPt!Z``Q(Yd3_YUJVM?3*>#k zpc^R>gQ#5Q?T{+m2(&Z;Ji{Z8;je-p$mB5jVGP=nxeUs>enNVrtYGec2@rLO(t(N~ zBqzJv`krm&;GBBmR>3(W1LA*lrEXtk|1(I!ffRY}RbD~$SjhDUXrSuZyC9cKMUxf1 z5WyoaYZZJZAyug4ON31cjSwU?ez?S2f8L5)F~DW~`_BD5O_Tw=QEvC7QpNS?MGEn4 zp<+A(e>3ye!i*9e-QTmz=VKVG=rT+B3jrvu^d!UAY{;umb)gy2KN<)Wi;MaP@n~6Rdhz{64>L37hZtC&R^*) zj3_8}U=`nDjinx&%1vPoC*BL~ujDMCob%XMnZbr7{%(7(7r3 zX4fOyN+Y)|;J6)N2$#*fAsBglM6t^pZv{83Thq296?VDuh43dWNMJ=!Wp0WKrAZBv zf}{@i$=1uo!M8S%dvjOXbMT_?1tC88A1d<`&HvEZCr@|ROtAp+GUcvV8FA2Y1UTYISc1Cxn>C|#j?R3nULCHe%)jC zLJ^ozW0A~<6^Mh;6ni>sou;W*i-a5@KAW6YaBBvYKkC-b!(6RS)iZYo5mD#8uONOc zI?{OvS#3ayELc3n|J9OBfSwbX`>6g8tUW7s?4&78CHoOBlqu${Cq@kLkZp+J)c#|T zZ}N@3i%g2gxMoz;27N{}9{^(7$n>{Uv0w|%`_iu>0@uEfune3@G)#hSLFk55h+Ypb zVr92W28U64ITFAFL$KOGSZ83GG%%Ga0lN@iCxtlKt;$I<*%|ju@L*n1qlXb0b9-%! zs8hdwg!R0x0DJq!J z6;6f4NxmQvuhVYn&U}=)VxCbo#b8@sB~V81t$Q9aOTi2A>LM>F7hS;&GxDPWnIrN9 z3TwOkZ-jrj`->=2>cGqJ2#GlUPTmDXLW+=RK+LsOMI^8IViosV&5;8Ve&siN5_`k% z{b?SpRXq~`1Bt>ubVY;x{w6{}GY~Yv$K$A1VndZpaj$Zg?T`!vb{A;*%yzj1PhLhj`hRI>d zVex=_^EM$2Q7aN4MrkXba%d&3;4TOOxs-s+76B^PzFsI%KqIRT8VfsLWW-FHVuI*c z6{uq8KfgZ92RL*-5TZcG1H5l%*-V1l@Nans$s8ks z0fx9y1WGwaTw4w@b(sk#zn?8i0aDh_!AH$`e#W@{B_(5MKE5NUAq3#-ckp9P{N7#x zr%xPjihR7Md6ZZ6WZ~xDC;2tAh3H}MToK09NeJ51ZD4%=2~)1Q4}QaI2hq%@!;y)< zR!E8>fXz75$>L*_Xp{e=;xXB}?4Pk22o0wK4R{`qT$ z(nxsv)RFh{Y!Z*0Jbm&=H{Ffh?ZJ&Az~jSSCNc* z%CY9K$?4*^O?aY1v2S^54(j#%A#2dY@rrO+z@(LL?E7M?*GkKt*0pVUuoE6G&^w-k zwaIT5%oyw&E3g##{o_DGXiAdxeJa-~+9Z`BTjkWbH`jiX;Cw6-v)LPn664mCnn(W&|Z_q`%g&#go(|*@L;_1=QB^5jCt3PufDMm=906rTuq%@} zJppx349J9s24G6jlCSNrAffSmwhY`Q>FgPx{1Rc&7#}aF#NVbuZUv}JvsDn4sR-<5 zq@A_#7&}zUV`6k1IBI-uUkOJEXFexzGg3aAgV#mkL=b<~8zxgkxtL_kl%_&K85FxZ_ZX%SjW$Ow(gb*xe0`?dJExo;$vL#7Q`#W?}!NvKfXb_?R~E+ zSDH!%b<6=5v?um+@(~HTQk<+^%~yO2k?4xGY*FERxS!&H1u`xDGo#`?65O{58M$ic zt&oI$HIxRvCjDiSkCa#xAt<~Y`C)(}B7Ti^c>*#kWFwe|b)G-c&^@|@jP&O7oPxU~ zOTB3!njsjmpL2RxpFz))=JgMP(3ypboNf3*}WE_*jmdQQp21$JAc!=&gG16eDwEMsZ*~* zv*76@-AxM0ZjGO};bg_BT5<_2eJo}vබpBOeB3{h*x97f!WxckjqvqgQlsD8S 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 + @@ -40,8 +40,8 @@ - - + + From cbd7e26f3f121bccebbd5df9abc59b4dad151aea Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 10:09:25 +0800 Subject: [PATCH 64/69] docs: adjust diagram size --- docs/diagrams/ph-municipalities-arch-90.png | Bin 62199 -> 62774 bytes docs/diagrams/ph-municipalities-arch.drawio | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/diagrams/ph-municipalities-arch-90.png b/docs/diagrams/ph-municipalities-arch-90.png index 2fdf93e148a535acb5322d9db0f994ab2115a4d9..86704e4e6501a5ac86ec05f36bbccea11de7e1e8 100644 GIT binary patch literal 62774 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 + @@ -26,10 +26,10 @@ - + - + @@ -40,8 +40,8 @@ - - + + @@ -127,8 +127,8 @@ - - + + From e56f5992fb682bad12495980a35d02459e45bc08 Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 10:15:56 +0800 Subject: [PATCH 65/69] docs: update README heading color --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 69059d1..0802cf6 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ The following dependencies are used for this project. Feel free to use other dep ## FAQs
- + What is the purpose or goal of ph-municipalities? @@ -79,14 +79,14 @@ ph-municipalities aims to provide a simple, organized, and flexible interface fo Its early stages were written as procedural functions within a _private backend project_ for extracting 10-day weather forecast data from the PAGASA 10-day weather forecast Excel files. When the private project started gaining complexity, a need to separate the logic and management for listing the Philippine province and municipalities per region rose. Creating an independent, public OpenSource version listing the provinces and municipalities per region was decided after experiencing drawbacks and difficulties testing using similar OpenSource libraries (some of which are [listed below](#similar-libraries)) for that project. -> **_ph-municipalities aim to contribute to the OpenSource community by listing ONLY Philippine provinces and municipalities names, using [PAGASA's 10-day weather forecast Excel files](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast), which are publicly accessible to everyone._** +> **_ph-municipalities aim to contribute to the OpenSource community by listing ONLY Philippine provinces and municipalities' names, using [PAGASA's 10-day weather forecast Excel files](https://www.pagasa.dost.gov.ph/climate/climate-prediction/10-day-climate-forecast), which are publicly accessible to everyone._**

- + Can ph-municipalities parse and extract PAGASA 10-day weather forecast data? @@ -101,7 +101,7 @@ ph-municipalities only have class methods for parsing, extracting, listing and q
- + Are there alternative libraries to ph-municipalities for listing Philippine provinces and municipalities? @@ -126,7 +126,7 @@ Note, however, that these items use old and new data sources. These may not be f
- + Is it possible to make ph-municipalities parse and extract PAGASA 10-day weather forecast data? @@ -171,8 +171,8 @@ weatherForecast = parser.getWeatherData()
- - + + How does ph-municipalities determine which provinces belong to a region? @@ -193,8 +193,8 @@ This file contains region/province names mapping encoded manually with reference
- - + + Are the provinces and municipality list generated by ph-municipalities updated? From 971f53eb2e8bc49b918c7508af54d849a32b98ac Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 10:30:30 +0800 Subject: [PATCH 66/69] docs: add anchor links for docs build, #43 --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 0802cf6..d3c7998 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ Extracted municipalities are written in JSON files following the format: Pre-compiled windows binaries are available for download in the latest [Releases](https://github.com/ciatph/ph-municipalities/releases) download page. + ## Class Documentation - Class and methods documentation are available at [https://ciatph.github.io/ph-municipalities](https://ciatph.github.io/ph-municipalities). @@ -44,6 +45,7 @@ Pre-compiled windows binaries are available for download in the latest [Releases - The documentation website's HTML files are available in the [`gh-pages`](https://github.com/ciatph/ph-municipalities/tree/gh-pages) branch of the GitHub repository. - Refer to the [Building the Class Documentation](#building-the-class-documentation) section for more information about updating and building the class documentation. + ## Requirements The following dependencies are used for this project. Feel free to use other dependency versions as needed. @@ -66,6 +68,7 @@ The following dependencies are used for this project. Feel free to use other dep
+ ## FAQs
@@ -214,6 +217,7 @@ NO. By default, ph-municipalities use an outdated PAGASA 10-day Excel file by de
+ ## Table of Contents
@@ -264,6 +268,7 @@ Click to expand the table of contents
+ ## Installation 1. Clone this repository.
@@ -292,6 +297,7 @@ Click to expand the table of contents
+ ## Installation Using Docker We can use Docker to run dockerized Node app for local development mode. The following methods require Docker and Docker compose correctly installed and set up on your development machine. @@ -314,6 +320,7 @@ The following dependencies are used to build and run the image. Please feel feel
+ ### Docker for Localhost Development
@@ -345,6 +352,7 @@ The following dependencies are used to build and run the image. Please feel feel
+ ## Available Scripts > _**Note:** These NPM scripts run relative within the `/app` directory, when working on a git-cloned repository of the app. To run using only NodeJS, navigate first to the `/app` directory and execute a target script, for example:_ @@ -510,6 +518,7 @@ Run tests defined in the `/app/__tests__` directory.
+ ## Class Usage Below are example usages of the `ExcelFile` class, run from the **/app/src/examples** directory. Check out the `/app/src/examples/sample_usage.js` file for more examples. @@ -603,6 +612,7 @@ console.log(`---municipalities`, municipalitiesFromProvince)
+ ### Download and Parse a Remote Excel File Adding a `url` field in the constructor parameter prepares the class to download a remote Excel file for the data source. @@ -643,6 +653,7 @@ main()
+ ### Alternate Usage - Events
@@ -684,6 +695,7 @@ main()
+ ### Using a Custom Configuration File The **ph-municipalities** `ExcelFile` and `ExcelFactory` classes use a default configuration file to define their regions and provinces in the `/app/config/regions.json` file. The regions and provinces data in this file syncs with the PAGASA Seasonal and 10-Day Weather Forecast Excel files provinces and municipalities naming convention, encoded by hand as of August 24, 2024. @@ -768,6 +780,7 @@ console.log('---municipalities', municipalities)
+ ## Building Standalone Windows Executables
@@ -785,6 +798,7 @@ The main npm scripts can be packaged into standalone windows executables. Pre-co
+ ## Compiling into Single, Minified Files
@@ -806,6 +820,7 @@ The main npm scripts can be compiled into standalone JavaScript files together w
+ ## Building the Class Documentation The class documentation uses [JSDoc](https://jsdoc.app/) annotations where applicable in the JavaScript source codes inside the **/src** directory. There are two (2) options for building the class documentation. @@ -859,6 +874,7 @@ The class documentation uses [JSDoc](https://jsdoc.app/) annotations where appli
+ ## Troubleshooting This section describes several common errors and related fixes. From 2c211c832c7c0767c1261814fbee647cf4d63fd3 Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 10:36:03 +0800 Subject: [PATCH 67/69] chore: bump version minor v1.4.0 --- app/package-lock.json | 4 ++-- app/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/package-lock.json b/app/package-lock.json index 3253d26..f330304 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -1,12 +1,12 @@ { "name": "ph-municipalities", - "version": "1.3.7", + "version": "1.4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ph-municipalities", - "version": "1.3.7", + "version": "1.4.0", "license": "ISC", "dependencies": { "dotenv": "^16.0.1", diff --git a/app/package.json b/app/package.json index 2af03bf..60141dd 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "ph-municipalities", - "version": "1.3.7", + "version": "1.4.0", "description": "List and write the `municipalities` of Philippines provinces or regions into JSON files", "main": "index.js", "engines": { From 4f137424c0929060756a8078941e7d280ad422ec Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 10:55:44 +0800 Subject: [PATCH 68/69] Create LICENSE --- LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..10bede4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2024 ciatph + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From ac13450d257c7b831c9206bf79ae75ecfcb37c81 Mon Sep 17 00:00:00 2001 From: ciatph Date: Fri, 13 Sep 2024 11:01:20 +0800 Subject: [PATCH 69/69] chore: build and deploy class docs on publish of new releases --- .github/workflows/deploy-docs.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index b5644f2..c1ff0cc 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -4,6 +4,8 @@ on: push: branches: - dev + release: + types: [published] jobs: build-docs: