diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 0958f00..0000000 --- a/.babelrc +++ /dev/null @@ -1,61 +0,0 @@ -{ - "comments": false, - "env": { - "main": { - "presets": [ - [ - "@babel/env", - { - "targets": { "node": 7 } - } - ] - ] - }, - "renderer": { - "presets": [ - [ - "@babel/env", - { - "modules": false - } - ] - ] - }, - "web": { - "presets": [ - [ - "@babel/env", - { - "modules": false - } - ] - ] - } - }, - "plugins": [ - "@babel/transform-runtime", - // Stage 0 - "@babel/plugin-proposal-function-bind", - - // Stage 1 - "@babel/plugin-proposal-export-default-from", - "@babel/plugin-proposal-logical-assignment-operators", - ["@babel/plugin-proposal-optional-chaining", { "loose": false }], - ["@babel/plugin-proposal-pipeline-operator", { "proposal": "minimal" }], - ["@babel/plugin-proposal-nullish-coalescing-operator", { "loose": false }], - "@babel/plugin-proposal-do-expressions", - - // Stage 2 - ["@babel/plugin-proposal-decorators", { "legacy": true }], - "@babel/plugin-proposal-function-sent", - "@babel/plugin-proposal-export-namespace-from", - "@babel/plugin-proposal-numeric-separator", - "@babel/plugin-proposal-throw-expressions", - - // Stage 3 - "@babel/plugin-syntax-dynamic-import", - "@babel/plugin-syntax-import-meta", - ["@babel/plugin-proposal-class-properties", { "loose": false }], - "@babel/plugin-proposal-json-strings" - ] -} diff --git a/.chglog/CHANGELOG.tpl.md b/.chglog/CHANGELOG.tpl.md deleted file mode 100755 index ad660cf..0000000 --- a/.chglog/CHANGELOG.tpl.md +++ /dev/null @@ -1,24 +0,0 @@ -{{ range .Versions }} - -## {{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}){{ else }}{{ .Tag.Name }}{{ end }} - -> {{ datetime "2006-01-02" .Tag.Date }} - -{{ range .CommitGroups -}} -### {{ .Title }} - -{{ range .Commits -}} -* {{ .Hash.Short }} {{ .Subject }} -{{ end }} -{{ end -}} - -{{- if .NoteGroups -}} -{{ range .NoteGroups -}} -### {{ .Title }} - -{{ range .Notes }} -{{ .Body }} -{{ end }} -{{ end -}} -{{ end -}} -{{ end -}} \ No newline at end of file diff --git a/.chglog/RELEASE.tpl.md b/.chglog/RELEASE.tpl.md deleted file mode 100644 index 5fc1a88..0000000 --- a/.chglog/RELEASE.tpl.md +++ /dev/null @@ -1,35 +0,0 @@ -{{ range .Versions }} - -## {{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}){{ else }}{{ .Tag.Name }}{{ end }} ({{ datetime "2006-01-02" .Tag.Date }}) - -{{ range .CommitGroups -}} - -### {{ .Title }} - -{{ range .Commits -}} - -- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }} -{{ end }} -{{ end -}} - -{{- if .RevertCommits -}} - -### Reverts - -{{ range .RevertCommits -}} - -- {{ .Revert.Header }} - {{ end }} - {{ end -}} - -{{- if .NoteGroups -}} -{{ range .NoteGroups -}} - -### {{ .Title }} - -{{ range .Notes }} -{{ .Body }} -{{ end }} -{{ end -}} -{{ end -}} -{{ end -}} diff --git a/.chglog/config.yml b/.chglog/config.yml deleted file mode 100755 index e6ddcb4..0000000 --- a/.chglog/config.yml +++ /dev/null @@ -1,29 +0,0 @@ -style: github -template: CHANGELOG.tpl.md -info: - title: CHANGELOG - repository_url: https://github.com/Splode/pomotroid -options: - commits: - # filters: - # Type: - # - feat - # - fix - # - perf - # - refactor - commit_groups: - title_maps: - feat: Features - fix: Bug Fixes - perf: Performance Improvements - refactor: Code Refactoring - ci: Continuous Integration - chore: Chores - header: - pattern: "^(\\w*)\\:\\s(.*)$" - pattern_maps: - - Type - - Subject - notes: - keywords: - - BREAKING CHANGE diff --git a/.chglog/release.yml b/.chglog/release.yml deleted file mode 100644 index 6338810..0000000 --- a/.chglog/release.yml +++ /dev/null @@ -1,29 +0,0 @@ -style: github -template: RELEASE.tpl.md -info: - repository_url: https://github.com/Splode/pomotroid -options: - commits: - # filters: - # Type: - # - feat - # - fix - # - perf - # - refactor - commit_groups: - title_maps: - feat: Features - fix: Bug Fixes - perf: Performance Improvements - refactor: Code Refactoring - ci: Continuous Integration - chore: Chores - header: - pattern: "^(\\w*)(?:\\(([\\w\\$\\.\\-\\*\\s]*)\\))?\\:\\s(.*)$" - pattern_maps: - - Type - - Scope - - Subject - notes: - keywords: - - BREAKING CHANGE diff --git a/.electron-vue/build.js b/.electron-vue/build.js deleted file mode 100644 index c42ea75..0000000 --- a/.electron-vue/build.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict' - -process.env.NODE_ENV = 'production' - -const { say } = require('cfonts') -const chalk = require('chalk') -const del = require('del') -const { spawn } = require('child_process') -const webpack = require('webpack') -const Multispinner = require('multispinner') - - -const mainConfig = require('./webpack.main.config') -const rendererConfig = require('./webpack.renderer.config') -const webConfig = require('./webpack.web.config') - -const doneLog = chalk.bgGreen.white(' DONE ') + ' ' -const errorLog = chalk.bgRed.white(' ERROR ') + ' ' -const okayLog = chalk.bgBlue.white(' OKAY ') + ' ' -const isCI = process.env.CI || false - -if (process.env.BUILD_TARGET === 'clean') clean() -else if (process.env.BUILD_TARGET === 'web') web() -else build() - -function clean () { - del.sync(['build/*', '!build/icons', '!build/icons/icon.*']) - console.log(`\n${doneLog}\n`) - process.exit() -} - -function build () { - greeting() - - del.sync(['dist/electron/*', '!.gitkeep']) - - const tasks = ['main', 'renderer'] - const m = new Multispinner(tasks, { - preText: 'building', - postText: 'process' - }) - - let results = '' - - m.on('success', () => { - process.stdout.write('\x1B[2J\x1B[0f') - console.log(`\n\n${results}`) - console.log(`${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`) - process.exit() - }) - - pack(mainConfig).then(result => { - results += result + '\n\n' - m.success('main') - }).catch(err => { - m.error('main') - console.log(`\n ${errorLog}failed to build main process`) - console.error(`\n${err}\n`) - process.exit(1) - }) - - pack(rendererConfig).then(result => { - results += result + '\n\n' - m.success('renderer') - }).catch(err => { - m.error('renderer') - console.log(`\n ${errorLog}failed to build renderer process`) - console.error(`\n${err}\n`) - process.exit(1) - }) -} - -function pack (config) { - return new Promise((resolve, reject) => { - config.mode = 'production' - webpack(config, (err, stats) => { - if (err) reject(err.stack || err) - else if (stats.hasErrors()) { - let err = '' - - stats.toString({ - chunks: false, - colors: true - }) - .split(/\r?\n/) - .forEach(line => { - err += ` ${line}\n` - }) - - reject(err) - } else { - resolve(stats.toString({ - chunks: false, - colors: true - })) - } - }) - }) -} - -function web () { - del.sync(['dist/web/*', '!.gitkeep']) - webConfig.mode = 'production' - webpack(webConfig, (err, stats) => { - if (err || stats.hasErrors()) console.log(err) - - console.log(stats.toString({ - chunks: false, - colors: true - })) - - process.exit() - }) -} - -function greeting () { - const cols = process.stdout.columns - let text = '' - - if (cols > 85) text = 'lets-build' - else if (cols > 60) text = 'lets-|build' - else text = false - - if (text && !isCI) { - say(text, { - colors: ['yellow'], - font: 'simple3d', - space: false - }) - } else console.log(chalk.yellow.bold('\n lets-build')) - console.log() -} diff --git a/.electron-vue/dev-client.js b/.electron-vue/dev-client.js deleted file mode 100644 index 2913ea4..0000000 --- a/.electron-vue/dev-client.js +++ /dev/null @@ -1,40 +0,0 @@ -const hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') - -hotClient.subscribe(event => { - /** - * Reload browser when HTMLWebpackPlugin emits a new index.html - * - * Currently disabled until jantimon/html-webpack-plugin#680 is resolved. - * https://github.com/SimulatedGREG/electron-vue/issues/437 - * https://github.com/jantimon/html-webpack-plugin/issues/680 - */ - // if (event.action === 'reload') { - // window.location.reload() - // } - - /** - * Notify `mainWindow` when `main` process is compiling, - * giving notice for an expected reload of the `electron` process - */ - if (event.action === 'compiling') { - document.body.innerHTML += ` - - -
- Compiling Main Process... -
- ` - } -}) diff --git a/.electron-vue/dev-runner.js b/.electron-vue/dev-runner.js deleted file mode 100644 index 4f08c57..0000000 --- a/.electron-vue/dev-runner.js +++ /dev/null @@ -1,178 +0,0 @@ -'use strict' - -const chalk = require('chalk') -const electron = require('electron') -const path = require('path') -const { say } = require('cfonts') -const { spawn } = require('child_process') -const webpack = require('webpack') -const WebpackDevServer = require('webpack-dev-server') -const webpackHotMiddleware = require('webpack-hot-middleware') - -const mainConfig = require('./webpack.main.config') -const rendererConfig = require('./webpack.renderer.config') - -let electronProcess = null -let manualRestart = false -let hotMiddleware - -function logStats (proc, data) { - let log = '' - - log += chalk.yellow.bold(`┏ ${proc} Process ${new Array((19 - proc.length) + 1).join('-')}`) - log += '\n\n' - - if (typeof data === 'object') { - data.toString({ - colors: true, - chunks: false - }).split(/\r?\n/).forEach(line => { - log += ' ' + line + '\n' - }) - } else { - log += ` ${data}\n` - } - - log += '\n' + chalk.yellow.bold(`┗ ${new Array(28 + 1).join('-')}`) + '\n' - - console.log(log) -} - -function startRenderer () { - return new Promise((resolve, reject) => { - rendererConfig.entry.renderer = [path.join(__dirname, 'dev-client')].concat(rendererConfig.entry.renderer) - rendererConfig.mode = 'development' - const compiler = webpack(rendererConfig) - hotMiddleware = webpackHotMiddleware(compiler, { - log: false, - heartbeat: 2500 - }) - - compiler.hooks.compilation.tap('compilation', compilation => { - compilation.hooks.htmlWebpackPluginAfterEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => { - hotMiddleware.publish({ action: 'reload' }) - cb() - }) - }) - - compiler.hooks.done.tap('done', stats => { - logStats('Renderer', stats) - }) - - const server = new WebpackDevServer( - compiler, - { - contentBase: path.join(__dirname, '../'), - quiet: true, - before (app, ctx) { - app.use(hotMiddleware) - ctx.middleware.waitUntilValid(() => { - resolve() - }) - } - } - ) - - server.listen(9080) - }) -} - -function startMain () { - return new Promise((resolve, reject) => { - mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main) - mainConfig.mode = 'development' - const compiler = webpack(mainConfig) - - compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => { - logStats('Main', chalk.white.bold('compiling...')) - hotMiddleware.publish({ action: 'compiling' }) - done() - }) - - compiler.watch({}, (err, stats) => { - if (err) { - console.log(err) - return - } - - logStats('Main', stats) - - if (electronProcess && electronProcess.kill) { - manualRestart = true - process.kill(electronProcess.pid) - electronProcess = null - startElectron() - - setTimeout(() => { - manualRestart = false - }, 5000) - } - - resolve() - }) - }) -} - -function startElectron () { - electronProcess = spawn(electron, ['--inspect=5858', path.join(__dirname, '../dist/electron/main.js')]) - - electronProcess.stdout.on('data', data => { - electronLog(data, 'blue') - }) - electronProcess.stderr.on('data', data => { - electronLog(data, 'red') - }) - - electronProcess.on('close', () => { - if (!manualRestart) process.exit() - }) -} - -function electronLog (data, color) { - let log = '' - data = data.toString().split(/\r?\n/) - data.forEach(line => { - log += ` ${line}\n` - }) - if (/[0-9A-z]+/.test(log)) { - console.log( - chalk[color].bold('┏ Electron -------------------') + - '\n\n' + - log + - chalk[color].bold('┗ ----------------------------') + - '\n' - ) - } -} - -function greeting () { - const cols = process.stdout.columns - let text = '' - - if (cols > 104) text = 'electron-vue' - else if (cols > 76) text = 'electron-|vue' - else text = false - - if (text) { - say(text, { - colors: ['yellow'], - font: 'simple3d', - space: false - }) - } else console.log(chalk.yellow.bold('\n electron-vue')) - console.log(chalk.blue(' getting ready...') + '\n') -} - -function init () { - greeting() - - Promise.all([startRenderer(), startMain()]) - .then(() => { - startElectron() - }) - .catch(err => { - console.error(err) - }) -} - -init() diff --git a/.electron-vue/webpack.main.config.js b/.electron-vue/webpack.main.config.js deleted file mode 100644 index faa1d3c..0000000 --- a/.electron-vue/webpack.main.config.js +++ /dev/null @@ -1,87 +0,0 @@ -'use strict' - -process.env.BABEL_ENV = 'main' - -const path = require('path') -const { dependencies } = require('../package.json') -const webpack = require('webpack') - -const BabiliWebpackPlugin = require('babili-webpack-plugin') - -let mainConfig = { - entry: { - main: path.join(__dirname, '../src/main/index.js') - }, - externals: [ - ...Object.keys(dependencies || {}) - ], - module: { - rules: [ - { - test: /\.worker\.js$/, - use: { loader: 'worker-loader' } - }, - { - test: /\.(js)$/, - enforce: 'pre', - exclude: /node_modules/, - use: { - loader: 'eslint-loader', - options: { - formatter: require('eslint-friendly-formatter') - } - } - }, - { - test: /\.js$/, - use: 'babel-loader', - exclude: /node_modules/ - }, - { - test: /\.node$/, - use: 'node-loader' - } - ] - }, - node: { - __dirname: process.env.NODE_ENV !== 'production', - __filename: process.env.NODE_ENV !== 'production' - }, - output: { - filename: '[name].js', - libraryTarget: 'commonjs2', - path: path.join(__dirname, '../dist/electron') - }, - plugins: [ - new webpack.NoEmitOnErrorsPlugin() - ], - resolve: { - extensions: ['.js', '.json', '.node'] - }, - target: 'electron-main' -} - -/** - * Adjust mainConfig for development settings - */ -if (process.env.NODE_ENV !== 'production') { - mainConfig.plugins.push( - new webpack.DefinePlugin({ - '__static': `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"` - }) - ) -} - -/** - * Adjust mainConfig for production settings - */ -if (process.env.NODE_ENV === 'production') { - mainConfig.plugins.push( - new BabiliWebpackPlugin(), - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': '"production"' - }) - ) -} - -module.exports = mainConfig diff --git a/.electron-vue/webpack.renderer.config.js b/.electron-vue/webpack.renderer.config.js deleted file mode 100644 index 2f1b73f..0000000 --- a/.electron-vue/webpack.renderer.config.js +++ /dev/null @@ -1,194 +0,0 @@ -'use strict' - -process.env.BABEL_ENV = 'renderer' - -const path = require('path') -const { dependencies } = require('../package.json') -const webpack = require('webpack') - -const BabiliWebpackPlugin = require('babili-webpack-plugin') -const CopyWebpackPlugin = require('copy-webpack-plugin') -const MiniCssExtractPlugin = require('mini-css-extract-plugin') -const HtmlWebpackPlugin = require('html-webpack-plugin') -const { VueLoaderPlugin } = require('vue-loader') - -/** - * List of node_modules to include in webpack bundle - * - * Required for specific packages like Vue UI libraries - * that provide pure *.vue files that need compiling - * https://simulatedgreg.gitbooks.io/electron-vue/content/en/webpack-configurations.html#white-listing-externals - */ -let whiteListedModules = ['vue'] - -let rendererConfig = { - devtool: '#cheap-module-eval-source-map', - entry: { - renderer: path.join(__dirname, '../src/renderer/main.js') - }, - externals: [ - ...Object.keys(dependencies || {}).filter( - d => !whiteListedModules.includes(d) - ) - ], - module: { - rules: [ - { - test: /\.worker\.js$/, - use: { loader: 'worker-loader' } - }, - { - test: /\.(js|vue)$/, - enforce: 'pre', - exclude: /node_modules/, - use: { - loader: 'eslint-loader', - options: { - formatter: require('eslint-friendly-formatter') - } - } - }, - { - test: /\.scss$/, - use: ['vue-style-loader', 'css-loader', 'sass-loader?prependData=@import "./src/renderer/assets/stylesheets/main";'] - }, - { - test: /\.sass$/, - use: ['vue-style-loader', 'css-loader', 'sass-loader?indentedSyntax=1&prependData=@import "./src/renderer/assets/stylesheets/main"'] - }, - { - test: /\.css$/, - use: ['vue-style-loader', 'css-loader'] - }, - { - test: /\.html$/, - use: 'vue-html-loader' - }, - { - test: /\.js$/, - use: 'babel-loader', - exclude: /node_modules/ - }, - { - test: /\.node$/, - use: 'node-loader' - }, - { - test: /\.vue$/, - use: { - loader: 'vue-loader', - options: { - extractCSS: process.env.NODE_ENV === 'production', - loaders: { - sass: - 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1&prependData=@import "./src/renderer/assets/stylesheets/main"', - scss: - 'vue-style-loader!css-loader!sass-loader?prependData=@import "./src/renderer/assets/stylesheets/main";' - } - } - } - }, - { - test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, - use: { - loader: 'url-loader', - query: { - limit: 10000, - name: 'imgs/[name]--[folder].[ext]' - } - } - }, - { - test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, - loader: 'url-loader', - options: { - limit: 10000, - name: 'media/[name]--[folder].[ext]' - } - }, - { - test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, - use: { - loader: 'url-loader', - query: { - limit: 10000, - name: 'fonts/[name]--[folder].[ext]' - } - } - } - ] - }, - node: { - __dirname: process.env.NODE_ENV !== 'production', - __filename: process.env.NODE_ENV !== 'production' - }, - plugins: [ - new VueLoaderPlugin(), - new MiniCssExtractPlugin({ filename: 'styles.css' }), - new HtmlWebpackPlugin({ - filename: 'index.html', - template: path.resolve(__dirname, '../src/index.ejs'), - minify: { - collapseWhitespace: true, - removeAttributeQuotes: true, - removeComments: true - }, - nodeModules: - process.env.NODE_ENV !== 'production' - ? path.resolve(__dirname, '../node_modules') - : false - }), - new webpack.HotModuleReplacementPlugin(), - new webpack.NoEmitOnErrorsPlugin() - ], - output: { - filename: '[name].js', - libraryTarget: 'commonjs2', - path: path.join(__dirname, '../dist/electron') - }, - resolve: { - alias: { - '@': path.join(__dirname, '../src/renderer'), - vue$: 'vue/dist/vue.esm.js' - }, - extensions: ['.js', '.vue', '.json', '.css', '.node'] - }, - target: 'electron-renderer' -} - -/** - * Adjust rendererConfig for development settings - */ -if (process.env.NODE_ENV !== 'production') { - rendererConfig.plugins.push( - new webpack.DefinePlugin({ - __static: `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"` - }) - ) -} - -/** - * Adjust rendererConfig for production settings - */ -if (process.env.NODE_ENV === 'production') { - rendererConfig.devtool = '' - - rendererConfig.plugins.push( - new BabiliWebpackPlugin(), - new CopyWebpackPlugin([ - { - from: path.join(__dirname, '../static'), - to: path.join(__dirname, '../dist/electron/static'), - ignore: ['.*'] - } - ]), - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': '"production"' - }), - new webpack.LoaderOptionsPlugin({ - minimize: true - }) - ) -} - -module.exports = rendererConfig diff --git a/.electron-vue/webpack.web.config.js b/.electron-vue/webpack.web.config.js deleted file mode 100644 index 0f977b4..0000000 --- a/.electron-vue/webpack.web.config.js +++ /dev/null @@ -1,150 +0,0 @@ -'use strict' - -process.env.BABEL_ENV = 'web' - -const path = require('path') -const webpack = require('webpack') - -const BabiliWebpackPlugin = require('babili-webpack-plugin') -const CopyWebpackPlugin = require('copy-webpack-plugin') -const MiniCssExtractPlugin = require('mini-css-extract-plugin') -const HtmlWebpackPlugin = require('html-webpack-plugin') -const { VueLoaderPlugin } = require('vue-loader') - -let webConfig = { - devtool: '#cheap-module-eval-source-map', - entry: { - web: path.join(__dirname, '../src/renderer/main.js') - }, - module: { - rules: [ - { - test: /\.worker\.js$/, - use: { loader: 'worker-loader' } - }, - { - test: /\.(js|vue)$/, - enforce: 'pre', - exclude: /node_modules/, - use: { - loader: 'eslint-loader', - options: { - formatter: require('eslint-friendly-formatter') - } - } - }, - { - test: /\.scss$/, - use: ['vue-style-loader', 'css-loader', 'sass-loader'] - }, - { - test: /\.sass$/, - use: ['vue-style-loader', 'css-loader', 'sass-loader?indentedSyntax'] - }, - { - test: /\.css$/, - use: ['vue-style-loader', 'css-loader'] - }, - { - test: /\.html$/, - use: 'vue-html-loader' - }, - { - test: /\.js$/, - use: 'babel-loader', - include: [path.resolve(__dirname, '../src/renderer')], - exclude: /node_modules/ - }, - { - test: /\.vue$/, - use: { - loader: 'vue-loader', - options: { - extractCSS: true, - loaders: { - sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1', - scss: 'vue-style-loader!css-loader!sass-loader' - } - } - } - }, - { - test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, - use: { - loader: 'url-loader', - query: { - limit: 10000, - name: 'imgs/[name].[ext]' - } - } - }, - { - test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, - use: { - loader: 'url-loader', - query: { - limit: 10000, - name: 'fonts/[name].[ext]' - } - } - } - ] - }, - plugins: [ - new VueLoaderPlugin(), - new MiniCssExtractPlugin({ filename: 'styles.css' }), - new HtmlWebpackPlugin({ - filename: 'index.html', - template: path.resolve(__dirname, '../src/index.ejs'), - minify: { - collapseWhitespace: true, - removeAttributeQuotes: true, - removeComments: true - }, - nodeModules: false - }), - new webpack.DefinePlugin({ - 'process.env.IS_WEB': 'true' - }), - new webpack.HotModuleReplacementPlugin(), - new webpack.NoEmitOnErrorsPlugin() - ], - output: { - filename: '[name].js', - path: path.join(__dirname, '../dist/web') - }, - resolve: { - alias: { - '@': path.join(__dirname, '../src/renderer'), - vue$: 'vue/dist/vue.esm.js' - }, - extensions: ['.js', '.vue', '.json', '.css'] - }, - target: 'web' -} - -/** - * Adjust webConfig for production settings - */ -if (process.env.NODE_ENV === 'production') { - webConfig.devtool = '' - - webConfig.plugins.push( - new BabiliWebpackPlugin(), - new CopyWebpackPlugin([ - { - from: path.join(__dirname, '../static'), - to: path.join(__dirname, '../dist/web/static'), - ignore: ['.*'] - } - ]), - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': '"production"' - }), - new webpack.LoaderOptionsPlugin({ - minimize: true - }) - ) -} - -module.exports = webConfig diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index e69de29..0000000 diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 2c7479e..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = { - root: true, - parserOptions: { - parser: 'babel-eslint', - sourceType: 'module' - }, - env: { - browser: true, - node: true - }, - globals: { - __static: true - }, - plugins: ['html'], - rules: { - // allow paren-less arrow functions - 'arrow-parens': 0, - // allow async-await - 'generator-star-spacing': 0, - // allow debugger during development - 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, - 'space-before-function-paren': ['error', 'never'] - }, - extends: ['standard', 'plugin:vue/base'] -} diff --git a/.github/images/pomotroid-screens.png b/.github/images/pomotroid-screens.png old mode 100644 new mode 100755 index 57ad676..2df7cb5 Binary files a/.github/images/pomotroid-screens.png and b/.github/images/pomotroid-screens.png differ diff --git a/.github/images/pomotroid-stats.png b/.github/images/pomotroid-stats.png new file mode 100755 index 0000000..283ff07 Binary files /dev/null and b/.github/images/pomotroid-stats.png differ diff --git a/.github/images/pomotroid-themes-preview.png b/.github/images/pomotroid-themes-preview.png new file mode 100755 index 0000000..48f2285 Binary files /dev/null and b/.github/images/pomotroid-themes-preview.png differ diff --git a/.github/images/pomotroid_themes-preview--914x219.png b/.github/images/pomotroid_themes-preview--914x219.png deleted file mode 100644 index a834aca..0000000 Binary files a/.github/images/pomotroid_themes-preview--914x219.png and /dev/null differ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d64d872..eca4961 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,20 +1,162 @@ -name: Build/release +name: Build / Test -on: push +on: + push: + branches: [main, 'rewrite/**', 'claude/**', 'feat/**'] + pull_request: + branches: [main] jobs: - release: - runs-on: ${{ matrix.os }} + build-linux: + name: Linux x64 + runs-on: ubuntu-latest - strategy: - matrix: - os: [macos-latest, ubuntu-latest, windows-latest] + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install Rust stable + uses: dtolnay/rust-toolchain@stable + with: + components: clippy + + - name: Cache Rust build artifacts + uses: Swatinem/rust-cache@v2 + with: + workspaces: src-tauri + + - name: Install Linux system dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + libwebkit2gtk-4.1-dev \ + libssl-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev \ + patchelf \ + libasound2-dev + + - name: Install npm dependencies + run: npm ci + + - name: Sync SvelteKit types + run: npx svelte-kit sync + + - name: Svelte type check + run: npm run check + + - name: Clippy (deny warnings) + run: cargo clippy --manifest-path src-tauri/Cargo.toml -- -D warnings + + - name: Cargo test + run: cargo test --manifest-path src-tauri/Cargo.toml + + - name: Build (release) + run: npm run tauri build -- --bundles deb,appimage + env: + CI: true + + - name: Upload Linux artifacts + uses: actions/upload-artifact@v4 + with: + name: pomotroid-linux-x64 + path: | + src-tauri/target/release/bundle/deb/*.deb + src-tauri/target/release/bundle/appimage/*.AppImage + if-no-files-found: error + + build-macos: + name: macOS (universal) + runs-on: macos-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install Rust stable (with universal targets) + uses: dtolnay/rust-toolchain@stable + with: + targets: aarch64-apple-darwin,x86_64-apple-darwin + + - name: Cache Rust build artifacts + uses: Swatinem/rust-cache@v2 + with: + workspaces: src-tauri + + - name: Install npm dependencies + run: npm ci + + - name: Sync SvelteKit types + run: npx svelte-kit sync + + - name: Build (release, universal binary) + run: npm run tauri build -- --bundles dmg --target universal-apple-darwin + env: + CI: true + + - name: Upload macOS artifacts + uses: actions/upload-artifact@v4 + with: + name: pomotroid-macos-universal + path: src-tauri/target/universal-apple-darwin/release/bundle/dmg/*.dmg + if-no-files-found: error + + build-windows: + name: Windows x64 + runs-on: windows-latest steps: - - name: Check out Git repository - uses: actions/checkout@v1 + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install Rust stable + uses: dtolnay/rust-toolchain@stable + + - name: Cache Rust build artifacts + uses: Swatinem/rust-cache@v2 + with: + workspaces: src-tauri + + - name: Install npm dependencies + run: npm ci + + - name: Sync SvelteKit types + run: npx svelte-kit sync + + - name: Build (release) + run: npm run tauri build -- --bundles nsis + env: + CI: true - - name: Install Node.js, NPM and Yarn - uses: actions/setup-node@v1 + - name: Upload Windows artifacts + uses: actions/upload-artifact@v4 with: - node-version: 14 + name: pomotroid-windows-x64 + path: | + src-tauri/target/release/bundle/nsis/*-setup.exe + src-tauri/target/release/pomotroid.exe + if-no-files-found: error diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index b2868fe..05cdbf7 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -2,10 +2,10 @@ name: "CodeQL" on: push: - branches: [master] + branches: [main] pull_request: # The branches below must be a subset of the branches above - branches: [master] + branches: [main] schedule: - cron: '0 23 * * 3' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..555c48f --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,232 @@ +name: Release + +on: + push: + tags: + - 'v[0-9]+.[0-9]+.[0-9]+' + +permissions: + contents: write + +jobs: + # ── Extract release notes from CHANGELOG ─────────────────────────────────── + changelog: + name: Extract release notes + runs-on: ubuntu-latest + outputs: + notes: ${{ steps.extract.outputs.notes }} + version: ${{ steps.version.outputs.version }} + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Get version from tag + id: version + run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT" + + - name: Extract CHANGELOG section + id: extract + run: | + VERSION="${GITHUB_REF_NAME#v}" + # Extract lines between the versioned header and the next header (or EOF) + NOTES=$(awk "/^\[v${VERSION}\]/,/^\[v[0-9]/" CHANGELOG.md \ + | head -n -1 \ + | tail -n +2 \ + | sed '/^[[:space:]]*$/{ N; /^\n[[:space:]]*$/d }') + if [[ -z "$NOTES" ]]; then + NOTES="See [CHANGELOG.md](CHANGELOG.md) for details." + fi + # Write multi-line output safely + { + echo "notes<> "$GITHUB_OUTPUT" + + # ── Linux build ──────────────────────────────────────────────────────────── + build-linux: + name: Linux x64 + runs-on: ubuntu-latest + needs: changelog + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install Rust stable + uses: dtolnay/rust-toolchain@stable + + - name: Cache Rust build artifacts + uses: Swatinem/rust-cache@v2 + with: + workspaces: src-tauri + + - name: Install Linux system dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + libwebkit2gtk-4.1-dev \ + libssl-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev \ + patchelf \ + libasound2-dev + + - name: Install npm dependencies + run: npm ci + + - name: Sync SvelteKit types + run: npx svelte-kit sync + + - name: Build (release) + run: npm run tauri build -- --bundles deb,appimage + env: + CI: true + + - name: Upload Linux artifacts + uses: actions/upload-artifact@v4 + with: + name: pomotroid-linux-x64 + path: | + src-tauri/target/release/bundle/deb/*.deb + src-tauri/target/release/bundle/appimage/*.AppImage + if-no-files-found: error + + # ── macOS build ──────────────────────────────────────────────────────────── + build-macos: + name: macOS (universal) + runs-on: macos-latest + needs: changelog + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install Rust stable (with universal targets) + uses: dtolnay/rust-toolchain@stable + with: + targets: aarch64-apple-darwin,x86_64-apple-darwin + + - name: Cache Rust build artifacts + uses: Swatinem/rust-cache@v2 + with: + workspaces: src-tauri + + - name: Install npm dependencies + run: npm ci + + - name: Sync SvelteKit types + run: npx svelte-kit sync + + - name: Build (release, universal binary) + run: npm run tauri build -- --bundles dmg --target universal-apple-darwin + env: + CI: true + + - name: Upload macOS artifacts + uses: actions/upload-artifact@v4 + with: + name: pomotroid-macos-universal + path: src-tauri/target/universal-apple-darwin/release/bundle/dmg/*.dmg + if-no-files-found: error + + # ── Windows build ────────────────────────────────────────────────────────── + build-windows: + name: Windows x64 + runs-on: windows-latest + needs: changelog + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + + - name: Install Rust stable + uses: dtolnay/rust-toolchain@stable + + - name: Cache Rust build artifacts + uses: Swatinem/rust-cache@v2 + with: + workspaces: src-tauri + + - name: Install npm dependencies + run: npm ci + + - name: Sync SvelteKit types + run: npx svelte-kit sync + + - name: Build (release) + run: npm run tauri build -- --bundles nsis + env: + CI: true + + - name: Upload Windows artifacts + uses: actions/upload-artifact@v4 + with: + name: pomotroid-windows-x64 + path: | + src-tauri/target/release/bundle/nsis/*-setup.exe + src-tauri/target/release/pomotroid.exe + if-no-files-found: error + + # ── Create draft GitHub Release ──────────────────────────────────────────── + release: + name: Create draft release + runs-on: ubuntu-latest + needs: [changelog, build-linux, build-macos, build-windows] + + steps: + - name: Download Linux artifacts + uses: actions/download-artifact@v4 + with: + name: pomotroid-linux-x64 + path: dist/linux + + - name: Download macOS artifacts + uses: actions/download-artifact@v4 + with: + name: pomotroid-macos-universal + path: dist/macos + + - name: Download Windows artifacts + uses: actions/download-artifact@v4 + with: + name: pomotroid-windows-x64 + path: dist/windows + + - name: Create draft release + uses: softprops/action-gh-release@v2 + with: + draft: true + name: ${{ github.ref_name }} + body: ${{ needs.changelog.outputs.notes }} + files: | + dist/linux/**/*.deb + dist/linux/**/*.AppImage + dist/macos/**/*.dmg + dist/windows/**/*-setup.exe + dist/windows/**/pomotroid.exe diff --git a/.gitignore b/.gitignore index 3b9ca40..874f942 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,4 @@ .DS_Store -dist/electron/* -dist/web/* -build/* -!build/icons node_modules/ npm-debug.log npm-debug.log.* @@ -10,4 +6,6 @@ thumbs.db !.gitkeep *.pem *.key -*.cert \ No newline at end of file +*.cert +.svelte-kit/ +build/ diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index b2095be..0000000 --- a/.prettierrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "semi": false, - "singleQuote": true -} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2bfb976..0000000 --- a/.travis.yml +++ /dev/null @@ -1,11 +0,0 @@ -os: osx -osx_image: xcode11.3 -language: node_js -node_js: 'lts/*' -cache: - directories: - - node_modules - - '$HOME/.electron' - - '$HOME/.cache' -script: - - npm run dist diff --git a/CHANGELOG.md b/CHANGELOG.md index 430f6ec..4dc0adc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,106 @@ +[Unreleased] +----------- + +### Complete Rewrite — Electron → Tauri 2 + Rust + Svelte 5 + +Pomotroid has been rebuilt from the ground up. The Electron + Vue.js stack has been replaced with a fully native Tauri 2 application backed by Rust and a Svelte 5 frontend, resulting in a drastically smaller footprint, faster startup, and no Chromium dependency. + +### Timer + +* **Drift-correcting engine** — Rust timer thread uses `std::time::Instant` with a fixed tick schedule; eliminates the cumulative drift that plagued the web-worker approach +* **Sleep / wake handling** — timer pauses automatically on OS sleep and resumes from the correct position on wake; no missed rounds +* **Round sequencing** — configurable work / short-break / long-break cycle with independent auto-start per round type +* **Skip and round reset** — skip to the next round or restart only the current round at any time, regardless of timer state +* **Session recording** — every completed round is written to SQLite with type, duration, and completion status + +### Statistics + +* **Dedicated stats window** with three tabs: + * **Today** — work and break round counts, total focus time, hourly breakdown chart + * **This Week** — daily bar chart for the past seven days, current consecutive-day streak + * **All Time** — 52-week heatmap (GitHub-style contribution calendar), lifetime session totals +* Charts use pure SVG; no external charting library +* Chart and heatmap colours are derived from the active theme +* Stats update live when a round completes — no manual refresh needed + +### Themes & Appearance + +* **37 bundled themes** including Pomotroid (dark), Pomotroid Light, Dracula, Nord, Tokyo Night, Gruvbox, Solarized, GitHub, One Dark, Rose Piné (3 variants), Catppuccin (4 variants), Synthwave, Ayu, Everforest, Kanagawa, Monokai, Night Owl, and more +* **Auto light / dark mode** — follows the OS `prefers-color-scheme` preference automatically; separate theme pickers for light and dark +* **Custom theme hot-reload** — drop a JSON theme file into the user themes folder and it appears instantly without a restart +* Theme colours propagate throughout the full UI and into the tray icon arc + +### Localization + +* **7 languages** — English, Spanish, French, German, Japanese, Chinese (Simplified), and Portuguese +* Auto-detects OS language on first launch; can be overridden manually in Settings +* All UI strings, settings labels, and notification messages are translated +* Locale-aware date and time formatting throughout (Intl.DateTimeFormat, reactive to language changes) +* Built with Paraglide JS v2 — compile-time, type-safe, tree-shakable message functions + +### Audio + +* **Configurable alert cues** for work rounds, short breaks, and long breaks +* **Custom audio** — replace any of the three alert cues with your own file via a file picker +* **Tick sounds** — independently toggleable for work and break rounds +* **Volume control** — global volume slider (0–100) +* All audio runs on a dedicated thread via `rodio`; playback is guaranteed even when the window is hidden to the tray + +### System Tray + +* **Dynamic tray icon** — a progress arc rendered with `tiny-skia` sweeps clockwise from 12 o'clock, coloured by round type (work / short break / long break) +* **Countdown mode** — optional inverted arc that fills from full to empty instead of empty to full +* **Pause indicator** — two vertical bars drawn over the icon when the timer is paused +* **Tray menu** — Show and Exit actions; left-clicking the icon toggles window visibility +* **Minimise to tray** and **close to tray** are independently configurable + +### Global Shortcuts + +* **Four actions** — toggle (start / pause / resume), reset, skip, restart round +* **Platform defaults** — `Control+F1–F4` on Windows and Linux; `Command+Shift+1–4` on macOS +* Fully rebindable in Settings; supports modifier combinations and function keys +* Shortcuts work when the window is hidden to the tray + +### macOS + +* **Global shortcuts via Accessibility** — shortcuts use the macOS Accessibility API; a contextual notice in Settings guides through granting permission with a direct link to System Settings +* **Native window style** — overlay titlebar with macOS-native traffic-light controls +* **Platform-aware defaults** — tray settings hidden on macOS where they are not applicable; shortcut defaults use Command instead of Control + +### Desktop Notifications + +* Native OS notifications on round completion via `tauri-plugin-notification` +* Linux uses `notify-send` (libnotify) to avoid D-Bus session bus conflicts +* Notifications include round type and duration + +### WebSocket Integration + +* **Opt-in local WebSocket server** (default off) for stream overlays and external integrations +* Listens on `ws://127.0.0.1:` (localhost only); default port 1314 +* Broadcasts `roundChange` events with full timer state; clients can query current state with `getState` +* Port is configurable; enable / disable at runtime from Settings → Advanced + +### Diagnostics & Logging + +* **Rotating log file** written to the OS log directory (5 MB max, keeps one backup) +* Structured log entries for all major events — timer state changes, settings loads, audio playback, shortcut registration, round completions +* Panics are captured to the log before the process terminates +* **Verbose logging** toggle in Settings → Advanced switches between INFO and DEBUG level +* **Open Log Folder** button in Settings → About for quick access + +### Settings + +26 configurable values across seven sections — Timer, Appearance, Notifications, Audio, Shortcuts, Advanced, and About. All settings are persisted to SQLite and take effect immediately without a restart (except WebSocket port). + +### Breaking Changes + +* Settings are no longer stored in `user-preferences.json`. All preferences reset to defaults on first launch after upgrading from v0.x. +* The minimum OS requirement follows Tauri 2 system minimums: Windows 10+, macOS 10.13+, Linux with GTK 3.24+. +* Custom theme JSON files from v0.x are fully compatible — no changes needed. + +--- + ## [v0.13.0](https://github.com/Splode/pomotroid/compare/v0.12.0...v0.13.0) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6717d66..cd54dfb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,29 +1,217 @@ # Contributing to Pomotroid -Thank you so much for contributing to Pomotroid. We appreciate your time and help. -Here are some guidelines to help you get started. +Thank you for taking the time to contribute. Below you'll find everything needed to get set up, make changes, and cut a release. + +## Table of Contents + +- [Code of Conduct](#code-of-conduct) +- [Filing a Bug or Feature](#filing-a-bug-or-feature) +- [Development Setup](#development-setup) +- [Project Structure](#project-structure) +- [Making Changes](#making-changes) +- [Releasing](#releasing) + +--- ## Code of Conduct Be kind and respectful to the members of the community. Take time to educate others who are seeking help. Harassment of any kind will not be tolerated. -## Questions - -If you have questions regarding Pomotroid, feel free to open an issue with the `Question` tag, or reach out directly via email at `flyweight@pm.me`. +--- ## Filing a Bug or Feature -1. Before filing an issue, please check the existing issues to see if a similar one was already opened. If there is one already opened, feel free to comment on it. -2. If you believe you've found a bug, please provide detailed steps of reproduction, the version of Pomotroid and anything else you believe will be useful to help troubleshoot it (e.g. OS environment, environment variables, etc...). Also state the current behavior vs. the expected behavior. -3. If you'd like to see a feature or an enhancement please open an issue with a clear title and description of what the feature is and why it would be beneficial to the project and its users. +1. Check existing issues before opening a new one. +2. **Bug reports** — include steps to reproduce, Pomotroid version, OS, and what you expected vs. what happened. +3. **Feature requests** — open an issue with a clear title and description of the feature and why it would be useful. + +--- + +## Development Setup + +### Prerequisites + +| Tool | Version | +|------|---------| +| Node.js | 22+ | +| Rust | stable (via [rustup](https://rustup.rs)) | +| npm | bundled with Node.js | + +**Linux** — install system dependencies: + +```bash +sudo apt-get install -y \ + libwebkit2gtk-4.1-dev libssl-dev \ + libayatana-appindicator3-dev librsvg2-dev \ + patchelf libasound2-dev +``` + +**macOS / Windows** — no extra system dependencies required. + +### Install and run + +```bash +git clone https://github.com/Splode/pomotroid +cd pomotroid +npm install +npm run tauri dev +``` + +### Checks and tests + +```bash +# TypeScript + Svelte type checking +npm run check + +# Rust unit tests +cargo test --manifest-path src-tauri/Cargo.toml + +# Rust linting (must pass with zero warnings) +cargo clippy --manifest-path src-tauri/Cargo.toml -- -D warnings +``` + +All three must pass before submitting a pull request. The CI pipeline runs them automatically. + +### Seeding test data + +To populate the statistics views with realistic historical data, use the seed script (requires Python 3, no extra dependencies): + +```bash +# Preview what would be inserted — no database changes +python3 scripts/seed-db.py --dry-run + +# Seed ~2 years of session history (default) +python3 scripts/seed-db.py + +# Seed 1 year and wipe any existing sessions first +python3 scripts/seed-db.py --days 365 --clear +``` + +The database must exist before seeding — launch Pomotroid at least once to create it. The script resolves the platform-specific app-data path automatically; pass `--db PATH` to override. + +--- + +## Project Structure + +``` +pomotroid/ +├── src/ # SvelteKit frontend (Svelte 5 runes) +│ ├── routes/ # Page components (main timer, settings, stats) +│ └── lib/ +│ ├── components/ # Reusable UI components +│ ├── ipc/ # Frontend wrappers for Tauri commands +│ └── stores/ # Svelte stores (settings, theme) +├── src-tauri/ # Rust backend (Tauri 2) +│ └── src/ +│ ├── commands.rs # IPC command handlers +│ ├── timer/ # Timer engine +│ ├── audio/ # Audio playback (rodio) +│ ├── db/ # SQLite persistence (rusqlite) +│ └── settings/ # Settings load/save +├── static/themes/ # Built-in JSON theme files +└── scripts/ # Maintainer scripts +``` + +--- + +## Making Changes + +1. Fork the repository and create a feature branch from `main`. +2. Make your changes. Keep commits focused and use conventional commit prefixes (`feat:`, `fix:`, `chore:`, etc.). +3. Ensure all checks pass (`npm run check`, `cargo test`, `cargo clippy`). +4. Open a pull request against `main` with a clear description of what changed and why. + +### Adding a built-in theme + +Built-in themes are embedded into the binary at compile time, so adding one requires a small code change in addition to the JSON file. + +1. **Create the theme JSON** in `static/themes/your-theme-name.json`. See `THEMES.md` for the required format and color keys. + +2. **Register it** in `src-tauri/src/themes/mod.rs` — add an `include_str!()` entry to the `BUNDLED_JSON` array: + ```rust + include_str!("../../../static/themes/your-theme-name.json"), + ``` + +3. **Update the bundled theme count** in the test assertion in the same file (e.g. `assert_eq!(themes.len(), 38, ...)`). + +Custom user themes (placed in the app data `themes/` folder) are discovered at runtime and require no code changes. + +### Adding a localization + +The app uses [Inlang + Paraglide](https://inlang.com) for translations. Adding a language requires two files to be touched, then a rebuild. + +1. **Create the message file** at `src/messages/{locale}.json`. Copy `src/messages/en.json` as a starting point and translate all values — do not change any keys. + +2. **Register the locale** by adding it to the `locales` array in `project.inlang/settings.json`: + ```json + "locales": ["en", "zh", "pt", "your-locale"] + ``` + +3. **Rebuild** (`npm run build`) — Paraglide auto-generates the typed JS modules in `src/paraglide/messages/`. No further code changes are needed; the language will appear in Settings automatically. + +### Modifying settings + +Settings are stored as key/value strings in SQLite. Adding a new setting involves: + +1. Adding the DB key and default value in `src-tauri/src/settings/defaults.rs` +2. Adding the typed field to the `Settings` struct in `src-tauri/src/settings/mod.rs` +3. Updating the frontend `Settings` type in `src/lib/types.ts` +4. Exposing a toggle or input in the relevant settings section under `src/lib/components/settings/sections/` + +--- + +## Releasing + +Releases are managed by maintainers. The process is intentionally minimal: one script, one push. + +### Prerequisites + +- You are on the `main` branch with a clean working tree. +- `[Unreleased]` in `CHANGELOG.md` contains the changes for this release. + +### Steps + +**1. Fill in the changelog** + +Open `CHANGELOG.md` and make sure `[Unreleased]` accurately describes everything going into the release. The release workflow uses this section as the GitHub Release body. + +**2. Run the bump script** + +```bash +./scripts/bump-version.sh +# e.g. +./scripts/bump-version.sh 1.1.0 +``` + +This will: +- Update the version in `tauri.conf.json`, `Cargo.toml`, and `package.json` +- Rename `[Unreleased]` in `CHANGELOG.md` to `[v1.1.0] - YYYY-MM-DD` +- Commit all changes and create an annotated `v1.1.0` tag + +**3. Push** + +```bash +git push origin main --follow-tags +``` + +Pushing the tag triggers the [release workflow](.github/workflows/release.yml), which: +- Builds Linux (`.deb`, `.AppImage`), macOS (universal `.dmg`), and Windows (`.exe` installer) in parallel +- Creates a **draft** GitHub Release with all artifacts attached and the changelog section as the release body + +**4. Publish the draft** + +Go to the [Releases page](https://github.com/Splode/pomotroid/releases), review the draft, and click **Publish release**. + +**5. Add a new `[Unreleased]` section** + +After publishing, add a fresh `[Unreleased]` block at the top of `CHANGELOG.md` to start collecting the next release's changes. + +### Version numbering -### Quick Steps to Contribute +Pomotroid follows [Semantic Versioning](https://semver.org): -1. Fork the project. -2. Download your fork to your PC (`git clone https://github.com/your_username/pomotroid && cd pomotroid`) -3. Create your feature branch (`git checkout -b my-new-feature`) -4. Ensure project runs and builds successfully (`npm run dev`) and (`npm run build`) -5. Add them to staging (`git add .`) -6. Commit your changes (`git commit -m 'Add some feature'`) -7. Push to the branch (`git push origin my-new-feature`) -8. Create new pull request to the `dev` branch. +| Change | Version bump | +|--------|-------------| +| Breaking changes or major rewrites | `X.0.0` | +| New features, backward-compatible | `X.Y.0` | +| Bug fixes only | `X.Y.Z` | diff --git a/README.md b/README.md index 54c2931..f8f0e2d 100644 --- a/README.md +++ b/README.md @@ -11,97 +11,130 @@ - [Overview](#overview) - [Features](#features) - - [Themes](#themes) +- [Statistics](#statistics) +- [Themes](#themes) - [Install](#install) - - [Download](#download) - - [Homebrew](#homebrew) - - [Scoop](#scoop) - - [AppGet](#appget) -- [Roadmap](#roadmap) +- [WebSocket API](#websocket-api) - [Development](#development) - - [Build Setup](#build-setup) - [License](#license) ## Overview Pomotroid is a simple and configurable Pomodoro timer. It aims to provide a visually-pleasing and reliable way to track productivity using the Pomodoro Technique. -Pomotroid is in its early stages, so feedback and contributions are welcome and appreciated! :seedling: +Built with [Tauri 2](https://tauri.app), [Rust](https://www.rust-lang.org), and [Svelte 5](https://svelte.dev). ## Features -- Customize times and number of rounds (persistent) -- Charming timer alert sounds (optional) -- Desktop notifications (optional) -- Minimize to tray (optional) -- Several themes included with the ability to create custom themes. -- Timer activity logging. +- **Configurable timer** — customise work duration, break durations, and the number of rounds per long break +- **Statistics** — daily, weekly, and all-time session history with charts and a 52-week heatmap +- **37 bundled themes** — including Dracula, Nord, Tokyo Night, Catppuccin, Gruvbox, Rose Piné, and more; auto-switches with your OS light/dark preference +- **Custom themes** — drop a JSON file into the themes folder; applied instantly without a restart +- **Localization** — 7 languages: English, Spanish, French, German, Japanese, Chinese (Simplified), and Portuguese; auto-detects OS language +- **Global shortcuts** — control the timer from anywhere, even when the window is hidden +- **Custom audio** — replace the built-in alert sounds with your own files +- **Tick sounds** — optional ticking during work and break rounds, independently toggleable +- **Dynamic tray icon** — progress arc updates in real time; reflects round type and pause state +- **Minimise / close to tray** — keep Pomotroid running in the background +- **Desktop notifications** — native OS alerts on round transitions +- **Compact mode** — a minimal set of controls appears when the window is resized small +- **Always on top** — optionally keep the timer above other windows +- **WebSocket server** — opt-in local server for stream overlays and external integrations +- **Diagnostic logging** — rotating log file with a one-click shortcut to the log folder + +## Statistics + +Pomotroid tracks every completed session and surfaces the data across three views: a daily summary with an hourly breakdown, a weekly bar chart with streak tracking, and an all-time 52-week heatmap. -### Themes +
+ Pomotroid statistics window +
+ +## Themes -Pomotroid provides many themes. It's also theme-able, allowing you to customize its appearance. +Pomotroid ships with 37 themes and supports fully custom themes with live hot-reload. -![Screenshots of Pomotroid using various themes](./.github/images/pomotroid_themes-preview--914x219.png) +![Screenshots of Pomotroid using various themes](.github/images/pomotroid-themes-preview.png) -Visit the [theme documentation](./docs/themes/themes.md) to view the full list of official themes and for instruction on creating your own. +See [THEMES.md](./THEMES.md) for the full theme list and instructions on creating your own. ## Install ### Download -Download the latest version from the [releases](https://github.com/Splode/pomotroid/releases) page. +Download the latest release from the [releases](https://github.com/Splode/pomotroid/releases) page. -Pomotroid is available for Windows, Mac OSX and Linux. +Available for **Windows** (installer + standalone exe), **macOS** (universal DMG), and **Linux** (`.deb` + AppImage). -### Homebrew +> **Note:** Pomotroid is currently unsigned. Depending on your OS security settings you may see a warning on first launch — this is expected and can be safely dismissed. -You can also install Pomotroid on macOS with [Homebrew](https://brew.sh): +### Homebrew (macOS) ```sh brew install --cask pomotroid ``` -### Scoop +> The Homebrew cask is maintained separately and may lag behind the latest release. Check the [releases](https://github.com/Splode/pomotroid/releases) page for the most current version. -You can install Pomotroid on Windows with [scoop](https://scoop.sh/) +## Custom Themes -```sh -scoop install https://raw.githubusercontent.com/Splode/pomotroid/master/pomotroid.json -``` +Pomotroid supports user-created themes with automatic hot-reload — no restart required. See [THEMES.md](./THEMES.md) for directory paths, the full color reference, and a step-by-step guide. -### AppGet +## WebSocket API -You can install Pomotroid on Windows with [AppGet](https://appget.net/) +Pomotroid exposes an optional WebSocket server (disabled by default) for integration with external tools, stream overlays, and automation scripts. -```sh -appget install pomotroid -``` +**Enable it** in Settings → Advanced → WebSocket Server, then connect to `ws://127.0.0.1:` (default port: 1314). -## Roadmap +### Messages -:memo: Future plans for enhancements and development: +**Client → Server** -- Mini-mode +| Message | Description | +|---|---| +| `{ "type": "getState" }` | Request the current timer state | -## Development +**Server → Client** -Pomotroid is built with [Vue.js](https://github.com/vuejs/vue), [Electron](https://github.com/electron/electron), and [electron-vue](https://github.com/SimulatedGREG/electron-vue). +| Event | Payload | Description | +|---|---|---| +| `state` | `TimerState` object | Response to `getState` | +| `roundChange` | `TimerState` object | Fired whenever the timer advances to a new round | +| `error` | `{ message }` | Protocol error | -_Note: depending on your OS settings, you may receive a security warning upon installation. This has to do with Pomotroid being an unsigned application. You can find out more by researching code-signing for Apple and Microsoft._ +`TimerState` fields: `elapsed_secs`, `total_secs`, `is_running`, `is_paused`, `round_type`, `work_round_number`, `work_rounds_total`. + +## Development -### Build Setup +See [CONTRIBUTING.md](./CONTRIBUTING.md) for full setup instructions, project structure, and the release process. + +### Quick start ```bash -# install dependencies -npm i +# Install dependencies +npm install -# serve with hot reload at localhost:9080 -npm run dev +# Run in development mode (hot-reload) +npm run tauri dev -# build Pomotroid for production -npm run build +# Build a production release +npm run tauri build ``` +### Localization + +UI strings live in `src/messages/.json` (en, es, fr, de, ja, zh, pt). The compiled output in `src/paraglide/` is generated at build time and is not committed to the repository. + +**During development**, the Paraglide Vite plugin compiles messages automatically whenever `npm run tauri dev` or `npm run tauri build` is run — no manual step required. + +**After adding or changing message keys**, regenerate the output explicitly so that `svelte-check` and your editor can pick up the new types: + +```bash +npm run paraglide:compile +``` + +This is also run automatically as part of `npm run check`. + ## License MIT © [Christopher Murphy](https://github.com/Splode) diff --git a/THEMES.md b/THEMES.md new file mode 100644 index 0000000..0c0f41c --- /dev/null +++ b/THEMES.md @@ -0,0 +1,85 @@ +# Pomotroid Themes + +Pomotroid ships with 37 built-in themes and supports an unlimited number of user-created custom themes. Custom themes are hot-reloaded — no restart required. + +## Built-in themes + +Andromeda, Ayu (Mirage), Catppuccin Frappé, Catppuccin Latte, Catppuccin Macchiato, Catppuccin Mocha, City Lights, Cobalt2, Darcula, Dracula, D.Va, Everforest, GitHub, GitHub Dark, Graphite, Gruvbox, Gruvbox Light, Horizon, Kanagawa, Material Palenight, Monokai, Monokai Pro, Night Owl, Nord, One Dark Pro, Panda, Pomotroid (default dark), Pomotroid Light (default light), Popping and Locking, Rosé Pine, Rosé Pine Dawn, Rosé Pine Moon, Solarized Dark, Solarized Light, Spandex, Synthwave, Tokyo Night + +## Creating a custom theme + +A theme is a single `.json` file with a name and a set of hex color values. + +### 1. Create the themes directory + +The directory is not created automatically. Make it once: + +**Linux** +```sh +mkdir -p ~/.local/share/com.splode.pomotroid/themes +``` + +**macOS** +```sh +mkdir -p ~/Library/Application\ Support/com.splode.pomotroid/themes +``` + +**Windows** (PowerShell) +```powershell +New-Item -ItemType Directory -Force "$env:APPDATA\com.splode.pomotroid\themes" +``` + +### 2. Create a theme file + +Copy the template below into a `.json` file in the themes directory. The filename can be anything — the displayed name comes from the `name` field. + +```json +{ + "name": "My Theme", + "colors": { + "--color-focus-round": "#ff4e4d", + "--color-short-round": "#05ec8c", + "--color-long-round": "#0bbddb", + "--color-background": "#2f384b", + "--color-background-light": "#3d4457", + "--color-background-lightest": "#9ca5b5", + "--color-foreground": "#f6f2eb", + "--color-foreground-darker": "#c0c9da", + "--color-foreground-darkest": "#dbe1ef", + "--color-accent": "#05ec8c" + } +} +``` + +### 3. Select your theme + +Open **Settings → Appearance**. Your theme appears in the picker with a **Custom** badge. Select it for the Light or Dark slot (or both). + +## Color reference + +| Key | Used for | +|-----|----------| +| `--color-focus-round` | Work round indicator — dial arc, round dot | +| `--color-short-round` | Short break indicator | +| `--color-long-round` | Long break indicator | +| `--color-background` | Main window background | +| `--color-background-light` | Sidebar, cards, elevated surfaces | +| `--color-background-lightest` | Borders, dividers, subtler surfaces | +| `--color-foreground` | Primary text | +| `--color-foreground-darker` | Secondary text, labels | +| `--color-foreground-darkest` | Tertiary text, placeholders | +| `--color-accent` | Highlighted elements, active states | + +All values must be CSS hex colors (`#rrggbb` or `#rrggbbaa`). + +## Hot-reload + +Pomotroid watches the themes directory while running. Saving a file — including edits to an existing theme — updates the Appearance picker within half a second. There is no need to reopen settings or restart the app. + +## Overriding a built-in theme + +If a custom theme's `name` exactly matches a built-in theme name (case-insensitive), it replaces that theme in the picker. This lets you tweak an existing theme without adding a new entry to the list. + +## Using bundled themes as a starting point + +The bundled theme files are a useful reference. You can find them in the source repository under [`static/themes/`](./static/themes/). diff --git a/Taskfile.yml b/Taskfile.yml deleted file mode 100644 index 3f222f7..0000000 --- a/Taskfile.yml +++ /dev/null @@ -1,12 +0,0 @@ -# https://taskfile.dev - -version: '3' - -tasks: - changelog: - cmds: - - git-chglog -c .chglog/config.yml > CHANGELOG.md - default: - cmds: - - echo "{{.GREETING}}" - silent: true diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 9573f4d..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: 0.1.{build} - -branches: - only: - - master - - dev - -image: Visual Studio 2017 -platform: - - x64 - -cache: - - node_modules - - '%APPDATA%\npm-cache' - - '%USERPROFILE%\.electron' - - '%USERPROFILE%\AppData\Local\Yarn\cache' - -init: - - git config --global core.autocrlf input - -install: - - ps: Install-Product node 14 x64 - # - choco install yarn --ignore-dependencies - - git reset --hard HEAD - - yarn - - node --version - -build_script: - - yarn build - -test: off diff --git a/build/icons/256x256.png b/build/icons/256x256.png deleted file mode 100644 index a2eceeb..0000000 Binary files a/build/icons/256x256.png and /dev/null differ diff --git a/build/icons/icon.icns b/build/icons/icon.icns deleted file mode 100644 index 9f7257c..0000000 Binary files a/build/icons/icon.icns and /dev/null differ diff --git a/build/icons/icon.ico b/build/icons/icon.ico deleted file mode 100644 index 415ff2c..0000000 Binary files a/build/icons/icon.ico and /dev/null differ diff --git a/build/icons/icon.png b/build/icons/icon.png deleted file mode 100644 index 813cd24..0000000 Binary files a/build/icons/icon.png and /dev/null differ diff --git a/dist/electron/.gitkeep b/dist/electron/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/dist/web/.gitkeep b/dist/web/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/docs/themes/images/andromeda_01.png b/docs/themes/images/andromeda_01.png deleted file mode 100644 index df84ef8..0000000 Binary files a/docs/themes/images/andromeda_01.png and /dev/null differ diff --git a/docs/themes/images/andromeda_02.png b/docs/themes/images/andromeda_02.png deleted file mode 100644 index 88ea15a..0000000 Binary files a/docs/themes/images/andromeda_02.png and /dev/null differ diff --git a/docs/themes/images/ayu_01.png b/docs/themes/images/ayu_01.png deleted file mode 100644 index 3e4c810..0000000 Binary files a/docs/themes/images/ayu_01.png and /dev/null differ diff --git a/docs/themes/images/ayu_02.png b/docs/themes/images/ayu_02.png deleted file mode 100644 index 2044c1f..0000000 Binary files a/docs/themes/images/ayu_02.png and /dev/null differ diff --git a/docs/themes/images/city-lights_01.png b/docs/themes/images/city-lights_01.png deleted file mode 100644 index f4b249e..0000000 Binary files a/docs/themes/images/city-lights_01.png and /dev/null differ diff --git a/docs/themes/images/city-lights_02.png b/docs/themes/images/city-lights_02.png deleted file mode 100644 index 3fff28b..0000000 Binary files a/docs/themes/images/city-lights_02.png and /dev/null differ diff --git a/docs/themes/images/dracula_01.png b/docs/themes/images/dracula_01.png deleted file mode 100644 index fc58ec8..0000000 Binary files a/docs/themes/images/dracula_01.png and /dev/null differ diff --git a/docs/themes/images/dracula_02.png b/docs/themes/images/dracula_02.png deleted file mode 100644 index 2b5cf1a..0000000 Binary files a/docs/themes/images/dracula_02.png and /dev/null differ diff --git a/docs/themes/images/dva_01.png b/docs/themes/images/dva_01.png deleted file mode 100644 index 18eddb2..0000000 Binary files a/docs/themes/images/dva_01.png and /dev/null differ diff --git a/docs/themes/images/dva_02.png b/docs/themes/images/dva_02.png deleted file mode 100644 index 7cebd1c..0000000 Binary files a/docs/themes/images/dva_02.png and /dev/null differ diff --git a/docs/themes/images/github_01.png b/docs/themes/images/github_01.png deleted file mode 100644 index d671525..0000000 Binary files a/docs/themes/images/github_01.png and /dev/null differ diff --git a/docs/themes/images/github_02.png b/docs/themes/images/github_02.png deleted file mode 100644 index e971da4..0000000 Binary files a/docs/themes/images/github_02.png and /dev/null differ diff --git a/docs/themes/images/graphite_01.png b/docs/themes/images/graphite_01.png deleted file mode 100644 index b915ee0..0000000 Binary files a/docs/themes/images/graphite_01.png and /dev/null differ diff --git a/docs/themes/images/graphite_02.png b/docs/themes/images/graphite_02.png deleted file mode 100644 index ffd827d..0000000 Binary files a/docs/themes/images/graphite_02.png and /dev/null differ diff --git a/docs/themes/images/gruvbox_01.png b/docs/themes/images/gruvbox_01.png deleted file mode 100644 index c40da7f..0000000 Binary files a/docs/themes/images/gruvbox_01.png and /dev/null differ diff --git a/docs/themes/images/gruvbox_02.png b/docs/themes/images/gruvbox_02.png deleted file mode 100644 index bf0d30d..0000000 Binary files a/docs/themes/images/gruvbox_02.png and /dev/null differ diff --git a/docs/themes/images/monokai_01.png b/docs/themes/images/monokai_01.png deleted file mode 100644 index f7db5ab..0000000 Binary files a/docs/themes/images/monokai_01.png and /dev/null differ diff --git a/docs/themes/images/monokai_02.png b/docs/themes/images/monokai_02.png deleted file mode 100644 index aad5c73..0000000 Binary files a/docs/themes/images/monokai_02.png and /dev/null differ diff --git a/docs/themes/images/nord_01.png b/docs/themes/images/nord_01.png deleted file mode 100644 index f7a05ea..0000000 Binary files a/docs/themes/images/nord_01.png and /dev/null differ diff --git a/docs/themes/images/nord_02.png b/docs/themes/images/nord_02.png deleted file mode 100644 index 65722ac..0000000 Binary files a/docs/themes/images/nord_02.png and /dev/null differ diff --git a/docs/themes/images/one-dark-pro_01.png b/docs/themes/images/one-dark-pro_01.png deleted file mode 100644 index dfd0652..0000000 Binary files a/docs/themes/images/one-dark-pro_01.png and /dev/null differ diff --git a/docs/themes/images/one-dark-pro_02.png b/docs/themes/images/one-dark-pro_02.png deleted file mode 100644 index 4065263..0000000 Binary files a/docs/themes/images/one-dark-pro_02.png and /dev/null differ diff --git a/docs/themes/images/pomotroid_01.png b/docs/themes/images/pomotroid_01.png deleted file mode 100644 index f2dda37..0000000 Binary files a/docs/themes/images/pomotroid_01.png and /dev/null differ diff --git a/docs/themes/images/pomotroid_02.png b/docs/themes/images/pomotroid_02.png deleted file mode 100644 index 2632f38..0000000 Binary files a/docs/themes/images/pomotroid_02.png and /dev/null differ diff --git a/docs/themes/images/popping-and-locking_01.png b/docs/themes/images/popping-and-locking_01.png deleted file mode 100644 index 90a8476..0000000 Binary files a/docs/themes/images/popping-and-locking_01.png and /dev/null differ diff --git a/docs/themes/images/popping-and-locking_02.png b/docs/themes/images/popping-and-locking_02.png deleted file mode 100644 index b19ec9a..0000000 Binary files a/docs/themes/images/popping-and-locking_02.png and /dev/null differ diff --git a/docs/themes/images/solarized-light_01.png b/docs/themes/images/solarized-light_01.png deleted file mode 100644 index 6ae433b..0000000 Binary files a/docs/themes/images/solarized-light_01.png and /dev/null differ diff --git a/docs/themes/images/solarized-light_02.png b/docs/themes/images/solarized-light_02.png deleted file mode 100644 index fe8b678..0000000 Binary files a/docs/themes/images/solarized-light_02.png and /dev/null differ diff --git a/docs/themes/images/spandex_01.png b/docs/themes/images/spandex_01.png deleted file mode 100644 index a187739..0000000 Binary files a/docs/themes/images/spandex_01.png and /dev/null differ diff --git a/docs/themes/images/spandex_02.png b/docs/themes/images/spandex_02.png deleted file mode 100644 index 3bd2635..0000000 Binary files a/docs/themes/images/spandex_02.png and /dev/null differ diff --git a/docs/themes/images/synthwave_01.png b/docs/themes/images/synthwave_01.png deleted file mode 100644 index 030ab2f..0000000 Binary files a/docs/themes/images/synthwave_01.png and /dev/null differ diff --git a/docs/themes/images/synthwave_02.png b/docs/themes/images/synthwave_02.png deleted file mode 100644 index 4a1f1e6..0000000 Binary files a/docs/themes/images/synthwave_02.png and /dev/null differ diff --git a/docs/themes/images/tokyo-night-storm_01.png b/docs/themes/images/tokyo-night-storm_01.png deleted file mode 100644 index b43ecf2..0000000 Binary files a/docs/themes/images/tokyo-night-storm_01.png and /dev/null differ diff --git a/docs/themes/images/tokyo-night-storm_02.png b/docs/themes/images/tokyo-night-storm_02.png deleted file mode 100644 index 4e73868..0000000 Binary files a/docs/themes/images/tokyo-night-storm_02.png and /dev/null differ diff --git a/docs/themes/theme-template.json b/docs/themes/theme-template.json deleted file mode 100644 index f3a8127..0000000 --- a/docs/themes/theme-template.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "Theme Name", - "colors": { - "--color-long-round": "", - "--color-short-round": "", - "--color-focus-round": "", - "--color-background": "", - "--color-background-light": "", - "--color-background-lightest": "", - "--color-foreground": "", - "--color-foreground-darker": "", - "--color-foreground-darkest": "", - "--color-accent": "" - } -} diff --git a/docs/themes/themes.md b/docs/themes/themes.md deleted file mode 100644 index 1fb6f15..0000000 --- a/docs/themes/themes.md +++ /dev/null @@ -1,64 +0,0 @@ -# Pomotroid Themes - -Pomotroid comes with many officially supported themes. You can also add any number of custom themes. - -- [Pomotroid Themes](#pomotroid-themes) - - [Available Themes](#available-themes) - - [Creating a Custom Theme](#creating-a-custom-theme) - -## Available Themes - -These themes are available by default. - -| Theme | Main App | Timer Colors | -| ------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | -| Andromeda | ![Andromeda theme preview](images/andromeda_01.png) | ![Andromeda theme preview](images/andromeda_02.png) | -| Ayu Mirage | ![Ayu Mirage theme preview](images/ayu_01.png) | ![Ayu Mirage theme preview](images/ayu_02.png) | -| City Lights | ![City Lights theme preview](images/city-lights_01.png) | ![City Lights theme preview](images/city-lights_02.png) | -| Dracula | ![Dracula theme preview](images/dracula_01.png) | ![Dracula theme preview](images/dracula_02.png) | -| D.Va | ![D.Va theme preview](images/dva_01.png) | ![D.Va theme preview](images/dva_02.png) | -| GitHub | ![GitHub theme preview](images/github_01.png) | ![GitHub theme preview](images/github_02.png) | -| Graphite | ![Graphite theme preview](images/graphite_01.png) | ![Graphite theme preview](images/graphite_02.png) | -| Gruvbox | ![Gruvbox theme preview](images/gruvbox_01.png) | ![Gruvbox theme preview](images/gruvbox_02.png) | -| Monokai | ![Monokai theme preview](images/monokai_01.png) | ![Monokai theme preview](images/monokai_02.png) | -| Nord | ![Nord theme preview](images/nord_01.png) | ![Nord theme preview](images/nord_02.png) | -| One Dark Pro | ![One Dark Pro theme preview](images/one-dark-pro_01.png) | ![One Dark Pro theme preview](images/one-dark-pro_02.png) | -| Pomotroid (default) | ![Pomotroid theme preview](images/pomotroid_01.png) | ![Pomotroid theme preview](images/pomotroid_02.png) | -| Popping and Locking | ![Popping and Locking theme preview](images/popping-and-locking_01.png) | ![Popping and Locking theme preview](images/popping-and-locking_02.png) | -| Solarized Light | ![Solarized Light theme preview](images/solarized-light_01.png) | ![Solarized Light theme preview](images/solarized-light_02.png) | -| Spandex | ![Spandex theme preview](images/spandex_01.png) | ![Spandex theme preview](images/spandex_02.png) | -| Sythwave | ![Sythwave theme preview](images/synthwave_01.png) | ![Sythwave theme preview](images/synthwave_02.png) | -| Tokyo Night Storm | ![Tokyo Night Storm theme preview](images/tokyo-night-storm_01.png) | ![Tokyo Night Storm theme preview](images/tokyo-night-storm_02.png) | - -## Creating a Custom Theme - -Creating custom themes is simple. Themes are defined by a `json` file containing a **theme name** and several color values. Use the [theme template file](./theme-template.json) as a starting point. - -```json -// theme-template.json -{ - "name": "Theme Name", - "colors": { - "--color-long-round": "", - "--color-short-round": "", - "--color-focus-round": "", - "--color-background": "", - "--color-background-light": "", - "--color-background-lightest": "", - "--color-foreground": "", - "--color-foreground-darker": "", - "--color-foreground-darkest": "", - "--color-accent": "" - } -} -``` - -To add your custom theme, copy your theme definition to the `themes` directory in the `appData` directory. The location of the `appData` depends on the operating system. - -- `%APPDATA%` on **Windows** -- `$XDG_CONFIG_HOME` or `~/.config` on **Linux** -- `~/Library/Application Support` on **macOS** - -For example, add the theme file to the following directory on Windows: `C:\Users\{User}\AppData\Roaming\pomotroid\themes` - -Restart the application to see your new theme available as an option. diff --git a/misc/icons/pomotroid-icon--0.1.ai b/misc/icons/pomotroid-icon--0.1.ai deleted file mode 100644 index ff2995e..0000000 --- a/misc/icons/pomotroid-icon--0.1.ai +++ /dev/null @@ -1,2346 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/OCGs[6 0 R 5 0 R 7 0 R 33 0 R 35 0 R 34 0 R 36 0 R 63 0 R 65 0 R 64 0 R 66 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - Web - - - Adobe Illustrator CC 22.0 (Windows) - 2018-01-29T12:15:07-07:00 - 2018-01-29T12:19:46-07:00 - 2018-01-29T12:19:46-07:00 - - - - 256 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FUs13zP5d0C3+sa1qNvYRkEp68iqzU/kX7TH/VGEAlBLy7zD/zlB5KsS0ej2lzrEq/Zen1a E/7OQNJ/yTywYixM3nes/wDOT/ny7LLpttZ6ZEfssEaeUfNpDwP/AAGTGII4yw3Uvzf/ADN1Ek3H mO8SvUW7i2Hj0gEeSEAx4ix661/Xbs8rrUbq4PjLNI56U/aY9slSLQIBJoBUnoMUgW20ciirKQPE gjEEJMJDmEba6/rtoeVrqN1bnximkQ9KfssO2NMbZDpv5v8A5m6cQbfzHePToLhxcjx6TiTImATx FmWjf85P+fLQqupW1nqcQ+0xRoJT8mjPAf8AAZE4gy4y9E8vf85QeSr4rHrFpc6PK32np9ZhH+zj Cyf8k8gcRSJvUdC8z+Xdft/rGi6jb38YAL+hIrMtf51+0p/1hlZBDIFM8CXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYqxLzv+afk3ydEf0reB72lY9Ot6SXLVFRVKgID4uQMlGBKCaeA+c/ +clPOOrl7fQkXQ7E7B0pLdMPeRhxX/YKCP5sujiA5sDN5Pe317fXL3V7cSXV1KayTzO0kjHxZmJJ yxgoYVdiq4I56KT9GKt+k/eg+ZAxV6F5N0y1t9JiugoNxPUvJ1NAxAUHw2znu0M0pZDHoH0r2a0W PHpo5APXO7Px5MgzAeiUpLW2l/vYkf8A1lB/XkhOQ5FqnghP6og+8IKfy5oU/wBuyiFf5B6f/EOO Xx1eWPKRcHL2NpJ88cfht91JXdeQtKkqbeWSBuwqHX7jv+OZMO08g5gF1Of2T08voMofaP1/akd9 5G1eCrW5S6QdlPF/ubb8czcfaWOXP0uh1Xstqce8KmPLY/I/rSiKXVdIvUmheewvYjWOWNnhlU+K svFh9GZ0ZRkLBsPP5cM8UuGYMT57PU/Jn/OSnnHSClvrqLrliNi70iulHtIo4t/s1JP82RliB5MR N795I/NPyb5xiH6KvAl7SsmnXFI7laCpolSHA8UJGUygQzBtluRS7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FUHrGs6VounTajqt1HZ2UArLPKaKPADuSewG57YQLV84/mN/zknquomXTvKCtp1jurak4 /wBJkH/FY6RD33b/AFcuji72szeJTTTTyvNPI0s0hLSSOSzMx3JJO5OWsFmFV4jYip+EeJ2xV37o eLn7hirvVI+yAvyGKtF2PUk4qtxVkHl/zbNpcP1WaL17YEmMA8WQnc08Rmv1WhGU8QNF6Psj2glp Y+HIcUOneE6X8wbCvxWsoHsVP9Mwz2XLvDux7X4esJfYiIvPmiv9pZo/dlBH/CschLszIO5yYe1e lPMTj8B+glH2/mfQZ6BLxFJ7SVj/AOJgZRPR5Y84uww9uaTJyyD47ffSZRyRyKHjYOh6MpBH3jMY gjm7OE4yFxNhdgZKNzaWt1GYriJZYz+y4B/Xk4TlE2DTTn0+PLHhnESHmxjVfIdvJWTTpPRfr6Mh JT6G+0PxzZYe0yNpi3ldf7KQl6sB4T3Hl8+Y+1idxaanpN2hkWS1uI25RSqSpqp2ZHX9YObbHljM XE28bqtHl08uHJExP45F7J+XP/OSeq6cYtO83q2o2OyrqSD/AEmMf8WDpKPfZv8AWwSxdzQJvo7R 9Z0rWtOh1HSrqO8spxWKeI1U+IPcEdwdx3ykimxGYFdirsVdirsVdirsVdirsVdirsVYp+YX5k+X vI+l/W9Sf1byUH6lp0ZHqzMPn9lB+056e52yUYkoJp8kefPzF8yeddSN3q03G3Qn6rYRkiCEf5K9 28WO5+W2ZMYgNRNsXySFyoSKn4V8Tiq7mq/YG/8AMeuKrCSTUmpxVrFXYq7FXYqzPyh5BTV7IX99 M8Ns5KwxxUDtxNC1WDACu3TMbLn4TQeT7b9pDpcnhY4iUxzJ5Dy2ZAfyr8v0NLm7B7EvGf8AmXlP 5qXk6Me2Oq/m4/lL/ikNP+U9ka+hqEieHNFf9RTJDVHucjH7Z5B9WOJ9xI/WlN3+VmtR1NtcQXAH Ylo2P0EEfjlg1Mers8Hthp5fXGUfkR+PgklzofmjRmMj29xbgdZoiSv0vGSMmTCexovRaDt7DI3h y1L38J+WxRVh541a3IW5C3UY/m+F/wDgl/iMxMvZuOXL0vYaT2p1OPadZB8j8x+plGmebNIvyE9T 6vOf91S7VPs32TmszaHJDerHk9ZofaDTaja+CXdL9B5fp8k6zDd2o3dna3cJhuY1libqrD8R4HJw ySgbiaLTqNPjzR4MgEosJ13yVPbBrjT6zwDdoTvIvy/mH45utN2iJbT2LwnavszPFc8Pqh3fxD9f 3teQ/wAxfMnkrUhdaVNW3cj63YSEmCYf5S9m8GG4+W2bGUQXlQafW/5ffmR5e876X9a02T0ryID6 7p8hHqwsf+JIf2XGx9jtmNKJDaDbK8il2KuxV2KuxV2KuxV2KuxVg35qfmppfkPS1ZlF3rN2D9Qs K0rTYyykbrGp+ljsO5E4QtiTT5A8w+YdY8w6tPq2r3DXN7cGru3QDsiDoqr2AzJAprJS3ChUoqfa 3b+XsPniqxmZjUnFWsVdiraqzdBXFV3BR9pgPYbnFXViHRSfmf6Yq71PBVH0V/Xir1L8v/MenS6N Dp8syQ3dtyX03IXmpYsGWvXrQjMDPjPFb5t7Tdl5o6iWWIMoT6jptW7LlnhY0WRST0AIJzHp5c45 DmCvxYOxV2KpNq3lDy/qgY3FqqTH/d8X7t6+JI2P+yByyOWUeRdtou29Vp/once47j9nwpg2t/ln qdoGm05xewjf0j8MoHy6N9H3ZlQ1IPPZ7Ls/2sw5ajmHhy7+cf2fjdJ9L8zavpMnoS8pIkPF7aao K07Andcrz6KGTfke99F7L9oc2ACj4mPuv7j0+7yZxpGvafqkdbd6SgVeBtnX+o9xmkz6aeI78u99 B7P7Vw6uPoPq6xPMfjvTHMd2THPMflKG/DXNmBFedWXosnz8G982Ok1xh6Zbx+55ntn2fjqLyYvT l+yX7fP597EtE1zXPLGtxajpsz2Wo2jdelf5kdejK3cHrm8BEh5Pns4SxyMZCpB9eflX+aml+fNL ZlUWms2gH1+wrWldhLETu0bH6VOx7E0ThSQbZzkGTsVdirsVdirsVdirFPzI/MHS/JHl6TUrqkt5 LWPT7KtGmlp+CL1duw9yMlGNlBNPjLzD5h1bzDrFxq+rTm4vbluTuegHZEH7KqNgMygKaiUuAJNB uThQvqI9l3fu3h8sVU8VdiraqzGgFcVX/u16/G34YqtaRm2J28BsMVW4q7FXYqiLOwvb2Qx2kDzO NyEBNB7+GShjlLYC2jPqceIXOQiPNGN5Y8wKKmwm+ha/qyw6bJ/NLijtfSn/ACkVg/xDp+4+t2lO 49WKn6sqlhI5x+xkfyuf/U5/6WSY2Xn7zRakf6X66D9idQ9f9ls345RLBE9HB1Hs3o8n8HCf6Jr9 n2Ml0z81YGITUrMx+MsB5D/gG3/E5RLS9xee1fsdIb4Z35S/WP1My0zW9K1SPnY3KTU3ZQaOPmho w+7MeUDHm8rq+z8+nNZYmP3fPkjci4aUa95W0jWoyLqLjcAUS5TaQeG/7Q9jlkMpjydp2d2xn0h9 BuP808v2fB5drvlnWfLl0s1S0Ab9xexVAr2B/lb2zNjOOQUfk+mdjdvY9RUsZ4MsenUe7vH4LIPL nm+O8K2l+RHdGgSXosh8D4Nmo1egMPVD6fufVuxvaKOasebbJ0PSX6j97J81j1SSeZPLcOqw+pHS O9jHwP2Yfyt/A5m6TVnEaP0ui7a7Fjq48Udso5Hv8j+NmFaHret+WNch1LTpWtNRsn296faR1/aV hsR3zoARIeT5pOEscjGQqQfZX5b/AJg6X538vR6la0ivIqR6hZVq0MtPxRuqN3HuDmPKNFkDbK8i l2KuxV2KuxVB6zrGnaLpV1quozCCys4zLPKeyjsB3JOwHc7YQLV8U/mL581Lzr5km1a7JS3Wsdha 12hgB+Ff9Y9WPc+1MyoxoNJNsXySFQ/uxxH2z9o+HtiqnirsVXqgpybZfxPyxVzOSOI+FfAfxxVZ irsVdiq4RudwNvHtirfpjuyj8f1Yq9Q8lW9vF5et3hA5S8mlcdWYMRv8gKZvNFEDGKfOPaDJKWrk Jco1XyT3Mp0jsVQN5omkXgP1m0ikJ6vxAb/ghRvxyueGEuYczB2hnxfROQ+O3y5Md1H8urKQF7Cd oH7RyfGnyr9ofjmHk7PifpNO+0vtRkjtliJDvGx/V9zFL7Rdc0SYTSI8PA/u7qInjX2den05rs2n lD6hs9Np9fptXHhBEr5xP6mTeXvzMuoCtvrC+vD0F0gpIv8ArDo36/nmBk0wP0vP9p+ycJ3LTnhl /NPL4d33e56JZX1pfWyXNpKs0D/ZdTt8j4H2OYZiQaLweo0+TDMwyDhkFSeCG4heGdFkikHF42FV IPYg4AaYY8koSEompDq8t85eRZdLLX2nBpdPO7puWh+fivv275nYc/Fseb6P2F7RDUVjy7Zeh6S/ b5fJf5U818uGn6g/xfZguGPXwVj+o5r9boa9cPiH2LsDt+6w5jv/AAy/Qf0FmOah7Rjnm3y4L+E3 lsv+mRD4lH+7FHb/AFh2zY6HV8B4ZfSfseZ9oOxvzEfFxj97H/ZD9fd8u5Jfy68+al5K8yQ6rakv bmkd/aV2mgJ+Jf8AWHVT2PtXN7KNh86Bp9raNrGna1pVrqunTCeyvIxLBKO6nsR2IOxHY7ZikU3I zArsVdirsVfMv/OSf5jHUdVXyhp0v+g6cwfUmU7SXPaP5RDr/lH/ACcvxR6tcy8Py5gqD4F5ftH7 PsPHFVPFXYqvVQBzfp+yvjiq1mLGpxVrFXYqv9Ogq54jw74q71APsLT3O5xVaWZjUmuKtYqm+ieZ 9T0gMluVkgY1MMgJWviKEEZfh1MsfLk6vtDsjDqt5WJDqE5T8yNQB+O0hYf5JZf1lsyR2jLuDqpe yuLpOX2I22/Mm1YgXNk8fiY3D/gQmWx7RHUOHl9lJj6Jg+8V+tO7HzboF4Qsd0sch/Yl/dn7z8P4 5kw1WOXV0+o7F1WLcwseW/7U4BBFRuD0OZDq2nRHUo6hlYUZSKgj3GJCYyINjmxHX/IVvOGuNLpB N1Nudo2/1f5T+HyzX59CDvDYvUdm+0c4VHN6o/zuo9/f9/vYrpWsaz5c1BvT5ROppcWsleLgfzD9 RGafLhvaQ3ek1mh0+vxC9x/DIcx+Ooes+XfMun65aetbnhMn9/bsRzQ/xXwOa3JjMTu+ZdqdlZdH PhnvE8pdD+3yTZlVlKsAVIoQdwQcg60Gtw8q89eTTpcp1GxWunyt8aD/AHSxPT/VPbw6ZnYM3Fse b6T7O9u/mB4WQ/vRyP8AOH6+/wCaM8oeYzeRiwu2rdRj905O8ijsf8oZq9fpOA8cfp+59s9ne2fG Hg5D+8HI/wA4frH2sozWPVMD866ELaf9IW60gnNJlH7Mh7/Jv15veztTxDgPMPn3tN2V4U/GgPRL n5S/b970f/nGz8xjp2qt5Q1GX/QdRYvprMdo7nvH8pR0/wAof5WZuWPV5eBfTWUNjsVdirEvzT87 xeTvJt5qtR9dcfV9OjNDyuZAeBoeoQAufYZKEbKCafEs00s80k8zmSaVi8kjGrMzGpJJ7k5lNLSK Can7K7nCrTMWYk4q1iq9FFOTfZH4nwxVazFjU4q1iraqWNAKnFV/JU2Xdv5v6YqsJJNT1xVrFXYq 7FXYq7FXYq7FUz0rzHq2mMPq0xMQ6wP8UZ+jt9GXYtROHIuv1nZeDUD1x9XeNj+PezvQvOmn6kVg n/0W7OwRjVGP+S38Dm1wayM9jsXi+0ewcunuUfXD7R7wyLMt0KU6/wCXbLWLfjIPTuUH7m4A3X2P iPbKM+njkG/N2fZvamTSysbwPOP45F5yDrHlvWAykw3UJ2PVHQ/8SVv8980ObCQeGT337jX4KPqh L5g/oI/Gz1zy15itNc08XEPwTJRbiDuj0/4iexzVZMZiafL+1ey56PLwS3ifpPeP196ZzwQ3ELwT IJIpFKyI24KnYg5AGnX48koSEompDk8a8zaFdeXNZHoswgY+rZT96A9Cf5l75sYSGSNH4vrvYPbP 5jGMkTw5Yc/I9/uP7GbaDq8eqaelwKCUfDOg/ZcfwPUZzupwHFOunR9u7K7Qjq8In/FykO4/jki7 y0hu7WS2mHKKVSrD+I9xlWOZhISHMOZqNPHNjOOf0yDyy7t7vSdTaMO0dxayBopVqpqp5I6n7iM6 jFkE4iQ6vkes0stPlljlzif7C+0fys87xecfJtnqtR9dQfV9RjFBxuYwOZoOgcEOPY5TONFrBtlu RS7FXyp/zkp5yOr+cU0K3etloacHp0a6lAaU/wCxXinsQcyMUaDXMvIMtYKj/CoTv1b54qp4q2ql mAHfFVzsCaL9ldh/XFVmKtqpY0HU4quZgBwTp+03jiqzFXYq7FXYq7FXYq7FXYq7FXYq7FWX+V/O slsUs9TYyW2yx3B3ZPZvFf1ZsNNrDH0y5PLdr9gDJeTCKn1j0Pu8/vegKyuoZSGVhVWG4IPcZtgX hyCDRSrzFoFvrFkY2olzHU2838p8D7HvlGowDJGursuy+0paXJY3gfqH46h55o+q6h5c1n1OJV4m 9O6tzsHWu6/xBzns2K7ieb3eu0eLX6er2O8Zdx/HMPaLG9tr60iu7Z+cEyhkb28D7joc1cgQaL5L qNPPDkOOYqUUv806DHrWkS2pAFwvx2zntIOm/g3Q5PFPhNud2P2idJnE/wCE7S937Obyzyzqkmk6 v6U9Uikb0blG24kGgJ/1Tl2tweJDbmOT7z7PdqDBmBv93kq/0H4fdb0nOcfU2JefNK9S3j1GMfHD SOan8hPwn6G/Xm17MzUTA9Xj/avQcUBnjzjsfd0+R+9k/wDzjX5zOkecX0K4eljri8EB6LdRAtGf 9kvJPclc22WNi3hoF9V5jtiWeZ9dt9A8u6jrVxQx2FvJPwJpyZV+FPmzUXCBZQS+D769ub69uL26 cy3V1I808h6tJIxZmPzJzLaVOMAtU9F3P0YVWkkkk9TirWKqn2Y6/tP+rFVPFXYqqN8C8R9o/a/p iqnirsVdirsVdirsVdirsVdirsVdirsVdirL/JXmg20i6ZeP/o0hpbyMfsMf2T/kn8M2Gj1PCeGX J5bt/sjxAc2MesfUO8d/v+96Dm2eGYh590AT2/6Ut1/fQClwB+1GP2vmv6vlmv12CxxjmHqvZztL gn4Mj6ZfT5Hu+P3+9Q/LPzCYLptHuG/c3BL2pP7MgG6/7Ifj885/U47HE3e1nZnHD8xEeqO0vd3/ AA+73PTMwnz15b+ZmiC01NNRhWkN6KS06CVev/BDf78ztNOxXc+keyfaHi4ThkfVj5f1T+r9Sb+U 9TN/pEfM1nt/3UviafZP0rmk12HgyGuR3fffZ/XfmNML+qHpP6D8vttNLu2jurWW3lFY5VKN9Ipm NCZjIEdHa6jBHLjlCXKQp5ZFLe6RqqTQuYr2wnWSKQdVlhfkrD5Mtc6qMhKII5F8ezYpYpmEucTX yfdfljXbfX/Luna1b0Ed/bxz8Aa8WZfiT5q1VzGIopBeXf8AOUHmE2Pkq00eNuMusXI5r4w21JH/ AOSjR5ZiG7GZfLOZDWv6Re7n8BiqzFW1XkwHjircjcmJHToPkMVW4qvjoKuei9Pniq0kk1PXFWsV dirsVdirsVdirsVdirsVdirsVdirsVdir07yXrp1LT/Qnat3a0VyerIfst/A5u9Hn440eYfO+3uz vy+XiiPRP7D1DIXRXRkcBlYEMp6EHqMyyHRxkQbHN5LrVjNomuPHCSnouJbWTvxryQ/R0zntRh4J GPR9O0Gojq9MDLfiFSH3vZNE1OPVNKtr5NvWQFlHZxs4+hgc0s48Jp8p7Q0h0+eWI/wn7On2IPzf pI1Ty/dW4WsyL6sHjzj3AHzFV+nJYpcMgXK7E1v5fVQn/Cdj7j+rn8Hmvke/NvqxtmNI7peP+zX4 l/iMl2li4sd/zX6D9ltX4ep4DyyD7RuP0vQs0D6O89882PoauLhRRLpAx/11+E/hTN/2bk4sdfzX zj2p0vh6njHKYv4jY/ofQf8Azi/5hN95Ku9HkblLo9yeC+ENzWRP+SiyZk5Ru89AvO/+cn9ZN358 ttNVqxaZZoGXwlnYyMfpThk8Q2RPm8dy1gvl2IX+UAYqsxVemys3gKD5nFVmKuxVfJsFTw3PzOKr MVdirsVdirsVdirsVdirsVdirsVdirsVdirsVTPy5qraZq0NzWkRPCceMbdfu65dp8vBMF1/amjG owSh/FzHvH4p66CCKjcHoc6B8uYf+YunCSygv0HxwN6ch/yH6V+TfrzX9oY7iJdz1PsvquHJLEeU hY94/Z9yv+VWploLzTXP92RPEPZvhf8AGn35zmqjyLT7Y6SpQzDr6T94/Sz/ADFeJeJa5bNo3mi4 SMcRb3AlhH+QSJEH3HNiBx46PUPtPYOvMsOLMPqFfOPP7Q9KjkWSNZENUcBlPsRUZyxFGn3WExKI kORY359tfU0qK4A+KCQVP+S4ofxpmx7MnWQjvDzHtZg4tOJ/zJfYf20yP/nGDWTaefLnTWakWp2b hV8ZYGEin6E55uco2fP4c2G/m/qR1H8zfMdwTXhePbg+1sBAOv8AxjyUBsxlzYigq6jxIyaHOasT 4nFVuKrztEo8ST/DFVmKroxVwD07/LFWmJZiT3xVrFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq9Y8pXxvNAtZGNZI19J/nHsP+Fpm+0s+LGHzLtrT+Fqpgcjv8/wBqK1uzF5pF3bUqZIm4D/KA qv8AwwGWZocUCHG7Pz+FnhPukPl1+x5/5BvTa+aLTeiT8oH9+Y+H/hgM5fPG4l7n2k0/iaOffGpf L9lvZM1z5Q8t/NO09PWre5AoLiAA+7RsQfwIzO0x9NPo/sfn4tPKH82X2Ef2p75YuPX0GzcmpVPT P/PMlP4ZotZDhyyD9Cdh5vE0mM+VfLb9C7zHB6+hXqdaRF/+Rfx/8a4NJLhyxPmy7ZxcekyD+jfy 3/Qxz8oNSOnfmb5cuAac7xLcn2uQYD0/4yZ0kxs+Tx5se1+6N3ruo3Tdbi6mlPTq8jN2275IIKDi +3XwBP3DCqzFXYqvk/ZHgo/HfFVmKr4+jHwX9e2KrMVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVZ7+W1yWtb22J/u3SQD/XBB/4hm17OlsQ8V7V4qnCfeCPl/azPNi8k8gr+j/MNRt9Uu6j2 9KX+zOazRoyHvfU68fS/18f+6i91zTvjTA/zYgrZafPT7EjpX/XUH/jTMrSncvaexmSsmSPfEH5H 9qH8hy89FZf99zMo+RCt/HNb2nGsnwfof2UnelI/mzP3A/pT66j9W2li/nRl+8UzAgakC9Bnhxwl HvBDy7QLo2mu6ddL1t7qGUdOqSK3fbtnWl8YCAwqvj6t/qn9WKrMVdiq+X7f0D9QxVVsLOS9vYLS M0eZwgJ6Cp6/RkscOKQA6tGpzjFjlM8oi3pdv5K8vRW4he39VqUeVmYMx8diAPozdR0WMCqfP8nt Bq5S4hLhHdQYH5n0QaRqZt0YtBIokhJ68SSKH5EZqtTh8OVdHs+yO0PzWHiO0gaKUZQ7R2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ksw/LdyNQu07NCGP+xYD/jbNh2cfUfc8t7VR/dQP9L9D0DN s8M8j8zqF8wX4H+/mP375z+p/vJe99R7IN6XH/Ve3wMWhjY7kqCT7kZoi+P5BUiPNh/5qAf4ftjT cXaAH5xyZkaX6vg9T7HH/Cpf8LP+6ik35fMfqF0vYSg/eo/pmF2oPWPc/Q3sgf3Mx/S/QyvNW9c8 ckULIyjoCQPoOdeDs+KzFSIW4WK+Pq3+qf1YqsxV2Kr5ft/QP1DFUx8sMF8wWBP+/lH37Zdpj+8j 73Xdri9Lk/qvXM6B8uef/mQhGoWj9mhK/wDAsT/xtmp7RHqHue59lZfupj+l+hh+a96l2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2Ksw/LdCdQu37LCFP+yYH/jXNh2cPUfc8t7VS/dQH9L9D0DNs 8M8j8zsG8wX5H+/mH3bZz+pP7yXvfUeyBWlx/wBV7fApWGNTsQoBHuBmiL4/kNyJ82H/AJqEf4ft hXc3aED5RyZkaX6vg9T7HD/Cpf8ACz/uopN+Xyn6hdN2MoH3KP65hdqH1j3P0N7ID9zM/wBL9DK8 1b1zxyRg0jMOhJI+k514Gz4rM3IlG6/am013UbVutvdTRHp1SRl7bdsQxKDi+3TxBH3jCqzFXYqv k/ZPio/DbFVbTZxBqNrOdhFNG5P+qwOTxyqQPm0arHx4px/nRI+Yez50b5Iwz8ybYta2VyB/du8Z P+uAR/xDNd2jHYF632Uy1OcO8A/L+1gWap7V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ks9/ La2K2t7ckf3jpGD/AKgJP/E82vZ0diXivavLc4Q7gT8/7GZ5sXknkFP0h5hoN/rd3Qe/qy/25zWa VmR976nfgaX+pj/3MXuuad8aYH+bE9LLT4K/bkd6f6igf8b5laUbl7T2Mx3kyS7ogfM/sQ/kOLho rN/vyZmHyAVf4Zre05Xk+D9D+ykK0pP86Z+4D9CfXUnpW0sv8iM33CuYEBcgHoM8+CEpdwJeXaBa m713TrVetxdQxDp1eRV77d860vjAZD+b+mnTvzN8x25FOd49wB7XIE46/wDGTIwOyZc2IoaOp8CM mhzijEeBxVbiq87xKfAkfxxVZir2LRLwXmkWlzWpkiXmf8oCjf8ADA50WGfFAF8p7QweFnnDukfl 0+xC+bbE3mgXUaiska+qnzj3P/C1yvVQ4sZcnsXUeFqoE8jt8/2vJ80L6a7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXrHlKxNnoFrGwpJIvqv8AOTcf8LTN9pYcOMPmXbWo8XVTI5Db5ftRWt3g s9Iu7mtDHE3A/wCURRf+GIyzNPhgS43Z+Dxc8Id8h8uv2PP/ACDZG680Wm1Ug5Tv7cB8P/DEZy+e VRL3PtJqPD0c++VR+f7LeyZrnyh5b+ad36mtW9sDUW8AJ9mkYk/gBmdph6bfR/Y/Bw6eU/50vsA/ tT3yxb+hoNmhFCyeof8AnoS/8c0WsnxZZF+hOw8Ph6TGPK/nv+ld5jn9DQr1+lYin/Iz4P8AjbBp I8WWI82XbOXg0mQ/0a+e36WOflBpp1H8zfLluBXheJcEe1sDOen/ABjzpJnZ8njzZl/zk/oxtPPl tqSrSLU7NCzeMsDGNh9CcMjiOzKfN47lrBfLuQ38wBxVZiq9N1ZfEVHzGKrMVegfl1qIksp7Bz8c DepGP8h+tPk36823Z+S4mPc8P7UaXhyRyjlIUfeP2fczAgEUO4PUZsHlnkXmPSm0zVpralIiecB8 Y26fd0zn9Ri4JkPqPZesGowRn/FyPvH4tLMpdg7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUz8uaU 2p6tDbUrEDznPhGvX7+mXafFxzAdf2prBp8Ep/xch7z+LeugACg2A6DOgfLmH/mLqIjsoLBD8c7e pIP8hOlfm36s1/aGSoiPe9T7L6XiySynlEUPef2fer/lVphWC81Jx/eEQRH2X4n/ABp92c5qpcg0 +2OruUMI6eo/cP0s/wAxXiXiWuXLaz5ouHjNRcXAihP+SCI0P3DNiDwQs9A+09g6Axw4sI+o185c /tL0qONY41jQURAFUewFBnLE2bfdYQEYiI5Bjfn269PSorcH4p5BUf5KCp/GmbHsyF5Ce4PMe1mf h04h/Pl9g/bTI/8AnGDRjd+fLnUmWsWmWblW8JZ2Eaj6U55ucp2fP4c3on/OUHl433kq01iNeUuj 3I5t4Q3NI3/5KLHkMR3TMPlnMhrX9YvdD+BxVZiratxYHwxVuReLEDp1HyOKph5f1U6XqsF1U+kD xmA7xts33dcu0+XgmC4Haej/ADGCUOvT3/jZ66jq6K6EMrAFWHQg9DnQAvl0okGjzY9500I6lp/r wLW7tasgHVkP2l/iMxNZg442OYd52D2j+Xy8Mj6J/YeheY5pH0R2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KvTvJegnTdP9edaXd1RnB6qn7K/wATm70eDgjZ5l877e7R/MZeGP0Q+09T+pkLuqIzuQqq CWY9AB1OZZLo4xJNDm8l1q+m1rXHkhBf1XEVqnfjXig+nrnPajNxyMuj6doNPHSaYCW3CLkfv+T2 TRNMj0vSraxTf0UAZh3c7ufpYnNLOXEbfKe0NWdRnllP8R+zp9iD836sNL8v3VwGpM6+lB485NgR 8hVvoyWKPFIByuxNF+Y1UIfwjc+4fr5fF5r5HsDcasblhWO1Xl/s2+Ff4nJdpZeHHX85+g/ZbSeJ qeM8sY+07D9L0LNA+jvPfPN96+ri3U1S1QKf9dviP4Uzf9m4+HHf85849qdV4mp4BygK+J3P6H0H /wA4v+XjY+SrvWJF4y6xcng3jDbVjT/ko0mZOU7vPQD1HzPoVvr/AJd1HRbigjv7eSDmRXizL8L/ ADVqNlYNFkQ+D76yubG9uLK6QxXVrI8M8Z6rJGxVlPyIzLaVOMgNQ9G2P04VWkEEg9Riq6KNpJEj TdnIVR7k0GAsZyEQSeQezaV5L0GyskgktIrqULSWaZA5Zu9OVeI8KZrpZpE83yfW9v6rNkMhOUI9 BE193P4sJ8/+UYNLZNQ0+MpZSnjNEKkRv2Ir+y34HMnBl4tjzeu9m+25agHFlN5ByPeP1hHeQtfE 9v8Aou4b99AK25P7UY/Z+a/q+Wb/AEOexwHmHD9o+zeCfjRHpl9Xke/4/f72X5sHlXn3nXyubaRt Ts0/0aQ1uI1H2GP7Q/yT+GanWabhPFHk9z2B2v4gGHIfWPpPeO73/exDNe9S7FXYq7FXYq7FXYq7 FXYq7FXYq7FWX+SvK5uZF1O8T/RozW3jYfbYftH/ACR+ObDR6biPFLk8t2/2v4YOHGfWfqPcO73/ AHPQc2zwzEPPuviC3/Rdu376cVuCP2Yz+z82/V881+uz0OAcy9V7Odm8c/GkPTH6fM9/w+/3KH5Z +XjPdNrFwv7m3JS1B/akI3b/AGI/H5Zz+pyUOFu9rO0+CH5eJ9Ut5e7u+P3e96ZmE+evLfzM1sXe pppsLVhst5adDK3X/gRt9+Z2mhQvvfR/ZPs/wsJzS+rJy/qj9f6k38p6YbDSI+YpPcfvZfEV+yPo XNJrs3HkNchs+/ez+h/L6YX9U/Uf0D5fbaaXdzHa2stxKaRxKXb6BXMaEDKQA6u11GeOLHKcuURb yyKK91fVUhhQy3t/OscUY6tLM/FVHzZqZ1UYiMQByD49myyyzM5c5G/m+6/LGhW+geXdO0W3oY7C 3jg5gU5Mq/E/zZqtmMTZSAmeBL5U/wCclPJh0jzimu26UsdcXm5HRbqIBZB/sl4v7ktmRilYprmH kGWsFR/iUP36N88VWKxVgymjA1B9xgQRYovbvK2vR61pEV0CBcL8Fyg7SDrt4N1Ga3LDhNPkHbHZ x0mcw/hO8fd+zkmF9ZW19aS2lynOCZSrr7eI9x1GQiSDYcHT6ieHIMkDUovF9Y0rUPLms+nyKvE3 qWtwNg612b+BGbTDlupDm+taHWYtfp7rY7Sj3H8ci9D8u6/b6xZCRaJcx0FxD/KfEex7Z0OnzjJG +rwnanZstLko7wP0n8dQmrKrqVYBlYUZTuCD2OXkOtBINh5/5o8lSWxe80xDJb9ZLcbsnuviv6s1 Op0ZHqjye47I7fGSseY1PpLoff5sQzXvUuxV2KuxV2KuxV2KuxV2KuxVl/lfyVJclLzU1Mdts0du dmf3bwX9ebDTaMy9UuTy3a/b4x3jwm59ZdB7vP7noCqqKFUBVUUVRsAB2GbYB4ckk2Uq8xa/b6PZ GRqPcyVFvD/MfE+w75RqM4xxvq7Lsvs2WqyUNoD6j+OpeeaPpWoeY9Z9PkWeVvUurg7hFru38AM5 7Nlq5Hm93rtZi0GnuthtGPefxzL2ixsraxtIrS2ThBCoVF9vE+56nNXIkmy+S6jUTzZDkmblJL/N OvR6LpEt0SDcN8Fsh7yHpt4L1OTxQ4jTndj9nHV5xD+Eby937eTyzyzpcmrav6s9Xijb1rl235Em oB/1jl2tz+HDbmeT7z7PdljPmAr93jq/0D4/db0nOcfU2JefNV9O3j06M/HNSSan8gPwj6W/Vm17 Mw2TM9Hj/avX8MBgjzlufd0+Z+5k/wDzjX5MOr+cX124Stjoa80J6NdSgrGP9ivJ/Yhc22WVCnho B9V5jtjsVYl+afkiLzj5NvNKoPrqD6xp0hoONzGDwFT0DglD7HJQlRQRb4lmhlgmkgmQxzRMUkjY UZWU0IIPcHMppaRgDQ/ZbY4VaZSrEHFU68peY5dD1NZjVrSWiXUQ7r2Ye69R92VZcfEHUdtdlx1m Hh/jjvE+fd7j+17RBPDcQpPC4kikUNG67gqdwRmtIp8lyY5QkYyFSHNLPMvl201zTzbzfBMlWt5+ 6PT/AIie4yePIYm3YdldqT0eXjjvE/UO8fr7nkZGseW9YKsDDdQncdUdD/xJW/z3za4cxB4ovqH7 jX4LHqhL5g/oI/Gz0bQPMVlrFvyjPp3KD99bk7r7jxHvm+waiOQbc3ge0uy8mllR3geUvxyKbZe6 xjuu+S9P1ItPB/ot2dy6iqMf8pf4jMTPo4z3Gxd92d29l09Rl64faPcWCar5c1bTGP1mEmIdJ0+K M/T2+nNVl084cw9po+1MGoHol6u47H8e5LMpdg7FXYq7FXYq7FUz0ry5q2psPq0JER6zv8MY+nv9 GXYtPOfIOv1namDTj1y9XcNz+PezvQvJen6aVnn/ANKuxuHYURT/AJK/xObXBo4w3O5eL7R7ey6i 4x9EPtPvLIsy3QpTr/mKy0e35SH1Llx+5twd29z4D3yjPqI4xvzdn2b2Xk1UqG0Bzl+OZecgax5k 1gKoM11Mdh0REH/EVX/PfNDmzEnik99+40GCz6YR+ZP6Sfxs9c8teXbTQ9PFvD8cz0a4n7u9P+Ij sM1WTIZG3y/tXtSesy8ctoj6R3D9femc88NvC88ziOKNS0jtsAo3JOQAt1+PHKchGIuR5PGvM2u3 XmPWR6KsYFPpWUHehPUj+Zu+bGERjjZ+L672D2N+XxjHEcWWfPzPd7h+1m2g6RHpenpbihlPxTuP 2nP8B0Gc7qc5yzvp0fbuyuz46TCIfxc5HvP45Iu8u4bS1kuZjxiiUsx/gPc5VjgZyERzLmajURw4 zkn9MQ8su7i71bU2kCGS4upAsUS7mrHiiKO/YDOoxYxjiIjo+R6zVS1GWWSXOR/sD7R/K3yTF5O8 m2elcR9dcfWNScb8rmQDnv3CABB7DKZystYFMtyKXYq7FXzL/wA5J/lydO1VfN+nRf6DqLBNSVRt Hc9pPlKOv+UP8rL8UujXMPD8uYKg+NeP7Q+z7jwxVTxVmHkXzkdLlGn3zV0+Vv3ch/3Sx7/6p7+H XMbPh4txzeV9ouwvzA8XGP3o5j+cP193yerKysoZSCpFQRuCDmC+bEVsUp8xeWtP1y09G4HCZP7i 4UDmh/iviMnjyGJ2dl2X2rl0c+KG8Tzj0P7fN5Nquj6z5c1BfU5ROprb3UdeLgfyn9YObLFmveJ3 fTdHrtPr8RrcfxRPMfjoWVaB59t5wtvqlIJuguBtG3+t/Kfw+WbjBrgdp7F5vtL2cnC5YfVH+b1H u7/v97LkdHUOjBlYVVgagj2ObAF5eUSDR5tkAih3B6jFCT33lLQLwlpLVY5D+3F+7P3D4fwzHnpc cujtNP21qsWwnY89/wBqSXP5bWrEm2vXj8BIgf8AEFMxpdnDoXcYvauY+uAPuNfrQT/lvqAPwXcL DxYMv6g2VHs6XeHMj7VYusJfY5Py31An47uFR4qGb9YXEdnS7wsvarF0hL7EbbfltaqQbm9eTxEa BPxJfLY9nDqXDy+1cz9EAPeb/Undj5S0CzIaO1WSQfty/vD9x+H8MyYaXHHo6fUdtarLsZ0PLb9q cAACg2A6DMh1bTuiKXdgqqKsxNAB7nElMYkmhzYjr/n23gDW+l0nm6G4O8a/6v8AMfw+ea/PrgNo bl6js32cnOpZvTH+b1Pv7vv9zFdK0fWfMeoN6fKV2Nbi6krxQH+Y/qAzT5c1byO70ms12n0GIXsP 4Yjmfx1L1ny75a0/Q7T0bcc5n/v7hgObn+C+AzW5Mhkd3zLtTtXLrJ8U9ojlHoP2+abMyqpZiAoF STsABkHWgXsHlXnrzkdUlOnWLU0+Jvjcf7uYHr/qjt49czsGHh3PN9J9newvy48XIP3p5D+aP19/ yRnlDy4bOMX92tLqQfukI3jU9z/lHNXr9Xxngj9P3vtns72N4I8bIP3h5D+aP1n7GUZrHqmB+ddd FzP+j7dqwQGszD9qQdvkv683vZ2m4RxnmXz72m7V8WfgwPojz85fs+96P/zjZ+XJ1HVW836jF/oO nMU01WG0lz3k+UQ6f5R/yczcsujy8A+msobHYq7FXYqg9Z0fTta0q60rUYRPZXkZiniPdT3B7EHc Hsd8INK+KfzF8h6l5K8yTaTdgvbtWSwuqbTQE/C3+sOjDsfamZUZWGkimL5JCof3g5D7Y+0PH3xV TxVmHk3z1LpZWx1AtLp52jk6tD8vFfbt2zGzYOLcc3le3fZ0ai8mLbL1HSX7fP5vU4J4biFJoHWS KQckkU1Ug9wRmCRT5xkxyhIxkKkOine2NpfWz213Es0D/aRht8x4H3GESINhnp9RkwzE8Z4ZB515 h/LO6gLXGjsbiHqbVyBIv+qejfr+eZmPUg/U952Z7WQnUdR6Zfzhy+Pd93uY1Y61rmiTGGN3h4H9 5ayg8a+6N0+jM/DqJQ+k7PQajQabVx4iBK+Uh+tlenfmLZSAJfwNA/eSP40+dPtD8c2OPtCJ+oU8 zqvZfJHfFISHcdj+r7mRWet6ReAfVruKQnonIBv+BNG/DMyGaEuRdDn7Pz4vrhIfDb58kdljhuxV 2KuxVBXmt6RZg/WbuKMjqnIFv+BFW/DK55oR5lzMHZ+fL9EJH4bfPkxzUfzFsowUsIGnftJJ8CfO n2j+GYeTtCI+kW77S+y+SW+WQiO4bn9X3sUvta1zWphDI7y8z8FrEDxr7IvX6c12bUSn9R2em0+g 02kjxACNc5H9fRkvl78s7qcrcawxt4eotUIMjf6x6L+v5ZgZNSB9Lz/aftZCFx0/ql/OPL4d/wB3 vei2VjaWNsltaRLDAn2UUbfM+J9zmGZEmy8HqNRkzTM8h4pFUnnht4XmndY4oxyeRjRQB3JOAC2G PHKchGIuR6PLfOXnqXVC1jpxaLTxs77hpvn4L7d++Z2HBw7nm+j9hezo09ZMu+XoOkf2+fyX+VPK nHhqGoJ8X2oIG7eDMP1DNfrdb/BD4l9i7A7Aqs2Yb/wx/Sf0BmOah7Rjnm3zGLCE2ds3+mSj4mH+ 61Pf/WPbNjodJxnil9I+15n2g7Z/Lx8LGf3sv9iP193z7kl/LryHqXnXzJDpVqCluKSX93TaGAH4 m/1j0Udz7VzeylQfOgLfa2jaPp2i6Va6Vp0IgsrOMRQRDso7k9yTuT3O+YpNtyMwK7FXYq7FXYqx T8yPy+0vzv5ek026pFeRVk0+9pVoZafijdHXuPcDJRlRQRb4y8w+XtW8vaxcaRq0Bt722bi6HoR2 dD+0rDcHMoG2ohLgSDUbEYUMk8teWItVja6uWaOBW4BUoC7DcmprQb5rtZrTiPDHm9L2H2ENUDky EiANbcymOreQ4fRMmmOwlX/dMhBDfJux+eY2DtM3U+Tte0PZSPDxYCeLuPX3Hp+OST6F5m1ny5dN DQtAG/f2UtQK9yP5W982koRyCx83zHtnsHHqLjkHBlj16j394/Aeo6D5p0jWowbWXjcAVe2faQeO 37Q9xmFPEY83zPtHsfPpD6xcf5w5fs+Kb5W6tBanomlapHwvrZJqbKxFHHycUYffkozMeTmaTtDP pzeKRj93y5MN1P8AKqBiX028MfhFOOQ/4Nd/wOZEdV3h6rSe2MhtmhfnH9R/Wxq98g+aLUn/AET1 0H7cDB6/7HZvwy+OeJ6vQ6f2k0eT+PhP9IV+z7UuP+IdP2P1u0p2PqxU/Vl8cxHKX2ucPyuf/U5/ 6WS9fM/mBRQX830tX9eWjU5P5xYnsjSn/Jxc3mfzAwob+b6Gp+rH8zk/nFR2RpR/k4rB/iHUNh9b u69h6stf15VLMTzl9rI/lcH+pw/0sUxsvIPmi6I/0T0EP7c7BKf7HdvwyiWeI6uDqPaTR4/4+I/0 Rf7PtZLpn5VQKQ+pXhk8YoBxH/Btv+AyiWq7g89q/bGR2wwrzl+ofrZlpmiaVpcfCxtkhrszAVc/ NzVj9+Y8pmXN5XV9oZ9QbyyMvu+XJG5Fw0o17zTpGixk3UvK4Iqlsm8h8Nv2R7nLIYjLk7Ts7sfP qz6BUf5x5ft+Dy7XfM2s+Y7pYaFYC37iyiqRXsT/ADN75mxhHGLPzfTOxuwcenqOMceWXXqfd3D8 FP8Ay55Qjsyt3fgSXQoUi6rGfE+LZqNXrzP0w+n731bsb2dGGsmbfJ0HSP6z9zKM1j1SSeZPMkOl Q+nHSS9kHwJ2UfzN/AZm6TSHKbP0ui7a7ajpI8Md8p5Du8z+N2FaHomt+Z9ch03Tomu9RvX29q/a d2/ZVRuT2zoABEeT5pOcskjKRuRfZX5b/l9pfkjy9HptrSW8lpJqF7SjTS0/BF6IvYe5OY8pWWQF MryKXYq7FXYq7FXYq7FWDfmp+Vel+fNLVWYWms2gP1C/pWldzFKBu0bH6VO47gzhOmJFvkDzD5e1 jy9q0+k6vbtbXtuaOjdCOzoejK3YjMkG2shkXkfWrVIDpszCOUuWgJ2Dcv2a+Nc0/aWnkTxjl1e3 9l+08cYeBI1K7j53097Mc1D2iXavoOn6pHS4SkoFEnXZ1/qPY5kYNTPEduXc63tDsrDq4+serpIc x+O5g+qeWdX0mT14uUkSHklzDUFadyBuubvBrYZNuR7nz7tT2ezYAbHiY++vvHT7vNONE/MzU7QL DqKC9hG3qj4ZQPn0b6fvyyemB5bPnXaHsnhy3LCfDl3c4/s/GzOdJ83+X9UCi3ulSY/7ol/dvXwA Ox/2JOYssUo8w8brexNVp/rhce8bj9nxpOcrdS7FXYqsaCFjVo1JPUkAnG2YySHIlywQqarGoI6E AA42pySPMlfiwdirsVSbVvN/l/SwwuLpXmH+6Iv3j18CBsP9kRlkcUpcg7bRdiarUfRCo952H7fh bBtb/MzU7sNDpyCyhO3qn4pSPn0X6PvzKhpgOe72XZ/snhxVLMfEl3co/t/GyT6X5Z1fVpPXl5Rx OeT3M1SWr3AO7ZXn1sMe3M9z6L2X7PZs4FDw8ffX3Dr93mzjSNB0/S46W6VlIo87bu39B7DNJn1M 8p35dz6D2f2Vh0kfQPV1keZ/HcmOY7smOeY/NsNgGtrMiW86M3VY/n4t7ZsdJoTP1S2j97zPbPtB HT3jxerL9kf2+Xz7mJaJoeueZ9bi07TYXvdRu26dafzO7dFVe5PTN4AIjyfPZzlkkZSNyL68/Kv8 q9L8iaUyKwu9ZuwPr9/xpWm4iiB3WNT9LHc9gKJztIFM5yDJ2KuxV2KuxV2KuxV2KuxVin5g/lv5 e876X9V1KP0ryIH6lqEYHqwsf+JIf2kOx9jvkoyIQRb5I8+fl15k8lakbXVYa27k/VL+MEwTD/Jb s3ip3Hy3zJjIFqIpvQvOs9sFt9QrPANlm6yKPf8AmH45rtT2eJbw2L1fZXtNPFUM3qh39R+v72bW l5a3cImtpFliboyn8D4HNLPHKBqQovdafUY80ePGRKKtkG5JdT8p6Rfkv6f1ec/7ti2qfdfsnMzD rskNrsebpNd7P6bUb1wS74/pHL9Pmxe/8j6tbktbFbqMfy/C/wDwLfwObPF2ljlz9Lyer9ltTj3h WQfI/I/rQttrnmjRmEaXFxbgdIZQSv0JICMywIT3FF4/X9g4ZGs2Kpe7hPz2Kd2n5p61HQXNvBcA dwGjY/SCR+GQOmj0edz+x+nl9EpR+RH4+KbQfmxZGnr6fInjwdX/AFhMrOlPe6zJ7GZB9OSJ94I/ WiR+anl+grbXYPcBIz/zMyP5WXk459jtV/Ox/OX/ABLj+anl+hpbXZPYFIx/zMx/Ky8lHsdqv52P 5y/4lDT/AJsWQr6GnyP4c3VP1B8kNKe9yMfsZkP1ZIj3An9SU3f5p61JUW1vBbg9yGkYfSSB+GWD TR6uzwex+nj9cpS+QH4+KSXOueaNZYxvcXFwD1hiBC/SkYAyZEIbmg9FoOwcMTWHFcvdxH57lFWH kfVrghrkraxn+b4n/wCBX+JzEy9pY48vU9hpPZbU5N51jHzPyH62UaZ5T0iwIf0/rE4/3bLvQ+y/ ZGazNrsk9roeT1mh9n9Np9645d8v0Dl+nzTrMN3ajd3lraQma5kWKJerMfwHicnDHKZqIstOo1GP DHjyERiwnXfOs9yGt9PrBAdmm6SMPb+Ufjm603Z4jvPcvC9q+008tww+mHf1P6vva8h/l15k866k LXSoaW6EfW7+QEQQj/Kbu3go3Py3zYykA8oBb63/AC+/Lfy95I0v6rpsfq3koH13UJAPVmYf8RQf soNh7nfMaUiW0CmV5FLsVdirsVdirsVdirsVdirsVdiqD1jRtK1rTptO1W1jvLKcUlglFVPgR3BH YjcdsINK+cfzG/5xs1XTjLqPlBm1Gx3ZtNc/6TGP+Kz0lHts3+tl0cve1mDxu3u9T0m7cRtJa3EZ 4yxMCpqOqujeHgRhyYo5BUhbfpdZl08uLHIxP45hlmlefLeSkeox+i/T1owSn0r9ofjmpzdmEbwN vZaD2rhL05xwnvHL5cx9rJ7a7tbqMS28qyxn9pCD+rNbOEomiKeqwajHljxQkJDyVsg3LZI45FKS KHQ9VYAj7jhBI5MZwjIVIWEtuPLGgz1L2aKT3jrH/wAQIzJhrMseUnWZuw9Jk54x8NvupAS+Q9Ff 7LTR+ysCP+GU5fHtPIO518/ZTSnkZx+I/SCh2/L6wr8N1KB7hT/AZMdqT7g4x9kMPScvscv5fWFf iupSPYKP4HE9qT7go9kMPWcvsREXkPRU+000nszAD/hVGQl2nkPc5MPZTSjmZy+I/QAj7fyxoMFC lmjEd5Kyf8TJyiesyy5ydhh7D0mPljHx3++0yjjjjUJGoRB0VQAPuGYxJPN2cIRiKiKC7AyUbm7t bWMy3EqxRj9pyB+vJwhKRoC2nPqMeKPFOQiPNjGq+fLeOsenR+s/T1pAQn0L9o/hmyw9mE7zNPK6 /wBq4R9OAcR7zy+XM/YxO4u9T1a7QSNJdXEjcYolBY1Y7KiL+oDNtjxRgKiKeN1Wsy6iXFkkZH8c g9k/Ln/nGzVdRMWo+b2bTrHZl01D/pMg/wCLD0iHtu3+rgll7mgQfR2kaNpWjafFp2lWsdnZQCkc ES8VHiT4k9ydz3ykm2xGYFdirsVdirsVdirsVdirsVdirsVdirsVdirEvO/5WeTfOMR/StmEvaUj 1G3pHcrQUFXoQ4Hg4IyUZkIIt4D5z/5xr846QXuNCddcsRuESkV0o942PFv9gxJ/ly6OUHmwMHlk sWq6RevDMk9hexGkkUivDKp8GVuLD6clKMZCiLDLFmnilxQJifLZN7Hzzq8FFuAl0g7sOL/eu34Z g5OzccuXpeg0vtTqce06mPPY/MfqTy18+6VJQXEUkDdzQOv3jf8ADMKfZmQciC77B7WaeX1iUPtH 6/sTSDzHoU/2L2IV/nPp/wDE+OY0tJljziXbYu2dJPlkj8dvvpGx3VtL/dSo/wDqsD+rKDCQ5hzo Z4T+mQPuKrkW12KqUl1bRf3sqJ/rMB+vJCEjyDVPPCH1SA95QU/mPQoPt3sRp/IfU/4hyy+Okyy5 RLg5e2dJDnkj8N/utK7rz7pUdRbxSTt2NAi/ed/wzJh2ZkPMgOpz+1mnj9AlP7B+v7EjvvPOrz1W 3CWqHuo5P97bfhmbj7Nxx5+p0Oq9qdTk2hUB5bn5n9SURRarq96kMKT397KaRxRq80rHwVV5Mfoz OjGMRQFB5/LmnllxTJkfPd6p5M/5xr84auyXGvOuh2JIJjekt0w9o1PFP9m1R/KcjLKByYiD33yT +Vvk3ydEv6Ksw97Sj6lcUkuWr1+OgCA+CADKZTJZgUy3IpdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdiqWa75Y8u6/b/AFfWtOt7+MAhPXjVmWv8jfaU/wCqcIJCCHl3mH/nF/yVfFpNHu7n R5W+ylfrMI/2EhWT/kplgyliYPO9Z/5xg8+WhZtNubPU4h9lQ7QSn5rIOA/4PJjKEcBYbqX5Qfmb pxIuPLl49Opt0FyPDrAZMkJhjwlj11oGu2h43WnXVufCWGRD0r+0o7ZK0UglkkUUViB4AkYkBkJy HIuaSRhRmJHgSTiAFM5HmUba6Brt2eNrp11cHwihkc9K/sqe2NsaZDpv5QfmbqJAt/Ll4lehuEFs PDrOY8iZhPCWZaN/zjB58uyralc2emRH7Sl2nlHyWMcD/wAHkTlDLgL0Ty9/zi/5KsSsmsXdzrEq /aSv1aE/7CMtJ/yUyBylIg9R0Lyx5d0C3+r6Lp1vYRkAP6EaqzU/nb7TH/WOVkksgEzwJdirsVdi rsVdirsVdirsVdir/9k= - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:d97ff0c7-5bd3-744c-93a1-6bd02f90a7ad - uuid:f242000b-1cd2-465d-923e-8a3137c21ed8 - - uuid:3e593450-be4b-41f3-a1ac-f0c60f6cd9f7 - xmp.did:e4637d7a-1015-5a4e-8a54-8a417d835ed6 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:d97ff0c7-5bd3-744c-93a1-6bd02f90a7ad - 2018-01-29T12:15:08-07:00 - Adobe Illustrator CC 22.0 (Windows) - / - - - - Web - Document - 1 - False - False - - 2000.000000 - 2000.000000 - Pixels - - - - Cyan - Magenta - Yellow - Black - - - - - - Default Swatch Group - 0 - - - - White - RGB - PROCESS - 255 - 255 - 255 - - - Black - RGB - PROCESS - 0 - 0 - 0 - - - RGB Red - RGB - PROCESS - 255 - 0 - 0 - - - RGB Yellow - RGB - PROCESS - 255 - 255 - 0 - - - RGB Green - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blue - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Grays - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Web Color Group - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - Adobe PDF library 15.00 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 72 0 R/TrimBox[0.0 0.0 2000.0 2000.0]/Type/Page>> endobj 68 0 obj <>stream -HUɎ1 +T+BBШ|@a.4v*Kwqmp޼# h)Ή)|z2|ln1ݝxXTc=4gx2@ Aޑ7+vY#,!$ -,a42 _*PWVSې5΃*1ՆnGk=jqh8s1ܶ#.X|֭ˎJS|FݸLS~TvzFgVH;\;h()ȨRiO|Sxa]'9z)]n]ɪ3;H{=EL M-- %Vg3riS -CvLn7h;|&2KtED܆]z_N_ &|PuX̻vum -Do&T$nL{ʨM*+կSEIp!YוA$o:J;5t[c:y仦t$rq_\,NB3vo~ -0ҩ -endstream endobj 72 0 obj <>stream -8;Y!G4-nnL&4OLnJHC<&`@0.E*6]22=_HTE[PJOmrrN5dRHAJTeu)kRQWI1'>O0TJ -emN.^lYSl`?`]4dU[hVm+oEm;I_P\5f.Y6j<7[uMKARVTN>j1;'?A&tC5"OXQ[O0P -9WMAe&NBuBGB@:&oDLin605d^;VnGE]e1a -eC(`?*?t#sZeIOepHLX>[otq;8gg`r%3<9nkRei9nP7$jo=bu#Q'3/O8p'jsH::5\ -P`FqllZ)/?%P9sRBLu!ja6e7MHb;cEWmUE\hK:DFX&7"3N&RZToWZ%2;P7"]'4s-l -Jq(i:Gi=0g8;_bojJQ$2drSk.c#csIimB:Ae;2%hZn0\lnJ!e9jdtJWeN2WT$6?YN -R.QK9TW?-k9!'I2HQhh`15hmG35m%3X_^_#;OpIs=+V28-)4PliL-iLP8#J+-g`6T --nm^@`)hO)q2&ZG6g/AYam]3s;TJ7e-eA$ka>ITi1Us@RR[=`,cM6L;(RP6!U/LWI -9<$j9Y*h;4T.oRCV(s3lT0":*J&hD].:"5&Y!P@<.$Y&u>si`[59Zkk;lUE:]qhs+ -YcH-88qbu'<1R!`XHu!5:r=\X9!S7F6:C'7Z(Ai1:ZO`lJuhr!W`lSg:$pqkqY_cokXZDg%q8(\59JbXhh9 -jaE.e>&p7UG/H0]V2PZ8".YeQ:QanGrY/,2/JG^NeDoXc*+JOJ&]53mLL>1U:\;eI -LttG>4^Of;i++lsrYao@p.nPLEkGq[_]EZ2VI!NXUhZ,a@opcq1;hM-B5"g.cLhc2 -o8NMOZX(XbV5';@Ut(VHp0\Du'`M"2*'d5@HD -,O3VSEBV1-1(q.#HA#q%rZO%&V&h5:$Y+i`VYc\U\ocL@md%MZ=6Su>7+s^*+d)#0 -n#cGsf-$oVkSW@eWE`Bu.HM5+mMJ..4afM?LC9=lTmb6aa&"l?NHg<:&VO'C2V8I( -.Fo&dG#u\Q$mF2i*/@W6Bo$Xk-0_+u(3)ZrOJk_^h+)D'HPHh*=ql[$"OI1uUT6"1 -AX9rb]q&2gQ#]U16U/RcUeNm*b?7/%lpS4!5UiC&DV;S5eY5Y+fL"4\H?EUG4R -gq?+S6n(TDH8^k:B;-2[Zh4k^8:-2f%,RqFH;;\*G?K\(+\V'4`Y0ai^YgQP)bK%8 ->XCgb10pUglO!@Nj`KS]c:bkFFU2,Bn=QOnoKZ;MXAdt5rmk.]3Ceo]*r1YT.SNV2 -Y&o7.dWGlq]3A+-lq$T\o@V7*:;Q3\?,H"Qq]V.IYNR./7fRmVa/tA^X\5uC7G3_r -c1LK9e$4Q58eC[KqPO2GWQqpQTqM=:hXICkL33.d^7SSBlmf5+gFCb~> -endstream endobj 73 0 obj [/Indexed/DeviceRGB 255 74 0 R] endobj 74 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 63 0 obj <> endobj 65 0 obj <> endobj 64 0 obj <> endobj 66 0 obj <> endobj 81 0 obj [/View/Design] endobj 82 0 obj <>>> endobj 79 0 obj [/View/Design] endobj 80 0 obj <>>> endobj 77 0 obj [/View/Design] endobj 78 0 obj <>>> endobj 75 0 obj [/View/Design] endobj 76 0 obj <>>> endobj 71 0 obj <> endobj 70 0 obj [/ICCBased 83 0 R] endobj 83 0 obj <>stream -HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  - 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 -V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= -x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- -ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 -N')].uJr - wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 -n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! -zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km -endstream endobj 69 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 17.0 -%%AI8_CreatorVersion: 22.0.1 -%%For: (MT-User) () -%%Title: (pomotroid-icon--0.1.ai) -%%CreationDate: 1/29/2018 12:19 PM -%%Canvassize: 16383 -%%BoundingBox: -317 -1384 1683 616 -%%HiResBoundingBox: -317 -1384 1683 616 -%%DocumentProcessColors: Cyan Magenta Yellow Black -%AI5_FileFormat 13.0 -%AI12_BuildNumber: 249 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Registration]) -%AI3_Cropmarks: -317 -1384 1683 616 -%AI3_TemplateBox: 683.5 -384.5 683.5 -384.5 -%AI3_TileBox: 389 -767.039978027344 974.9599609375 0 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 4 -%AI17_Begin_Content_if_version_gt:17 1 -%AI9_OpenToView: -4945.74377437744 1590.37833783378 0.3333 3708 1940 18 0 0 68 168 0 0 0 1 1 0 1 1 0 1 -%AI17_Alternate_Content -%AI9_OpenToView: -4945.74377437744 1590.37833783378 0.3333 3708 1940 18 0 0 68 168 0 0 0 1 1 0 1 1 0 1 -%AI17_End_Versioned_Content -%AI5_OpenViewLayers: 7676 -%%PageOrigin:283 -684 -%AI7_GridSettings: 70 8 70 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MS -%%EndComments - -endstream endobj 86 0 obj <>stream -%%BoundingBox: -317 -1384 1683 616 -%%HiResBoundingBox: -317 -1384 1683 616 -%AI7_Thumbnail: 128 128 8 -%%BeginData: 29599 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45FD35FFA8A87D7D5252282E2728272E272827525253537E7EA9A9FD -%64FFA87E52522728052700FD042728272827282728052805270027272828 -%7D7DA8AFFD5CFF7D7D282805282728272827282728272827282728052827 -%2827282728272827280528275252A8A9FD56FF7D53272700272727052827 -%270528272705282727054C274C2728272705280527052827270528052700 -%28527EA8FD50FFA87D27282728272E2728272E2728272E2728272E272827 -%9AB5BCB5BCB5BC939A6F764B522728052E2728272E2728055259A9FD4CFF -%A8282800272728272827282728272827282728272827282794B5BCB5BCB5 -%BCB5BCB5BCB5BCB5BC93704B4C272805282728052705527DFD48FF7D5227 -%2727282728272827282728272827282728272827282752B5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BC6F4C272827282728272728A8FD44FFA828 -%2700282727052827270528272705282728272827282728272827BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5946F4C05270528272700527D -%FD40FFA8532728272E2728272E2728272E2728272E282E2752282E272E27 -%28272E93BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A4B -%522728272E272852AFFD3DFF522700282728272827282728272827282728 -%272827282728272827282728054C93BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BC9376272805282727057DA8FD39FFA82728272827 -%28272827282728272E282E272E272827282728272827282728272805284B -%4C4B764B766F9A93BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F2805 -%28272800527EFD36FFA85900270528272705282727052827282728272705 -%2827270528272705282727052827270528052705280527052827274B706F -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC937005282727002752FD34FFA85205 -%28272E2728272E2728272E282E272E2728272E2728272E2728272E272827 -%2E2728272827282728272827282728272E272827526FBCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BC4B28272E272728A9FD31FF7D2700282728272827282728 -%272827282728272827282728272827282728272827282728272705341234 -%0C340C2E052E2727212827280528274C6FBCB5BCB5BCB5BCB5BCB5BCB5BC -%6F2805282727057EFD2FFF522827282728272827282728272E2728272827 -%282728272827282728272827282728272827282EFD091E183B12340C2E27 -%2827282728277693BCB5BCB5BCB5BCB5BCB5BCB54C05282728007DFD2DFF -%2E2705282727052827270528272805282727052827270528272705282727 -%0528272705282727051E181E181E181E181E181E181E1E1E18190C2E0527 -%272705282794B5BCB5BCB5BCB5BCB5BCB570052827270052A8FD2AFF2827 -%272E2728272E272827522828272E2728272E2728272E2728272E2728272E -%2728272E272E272E1E1E19411E1E19411E1E19411E1E1E411E1E193B342E -%27282728055293BCB5BCB5BCB5BCB5BCB5BC2728272E2752A8FD27FFA927 -%272728272827282728272827282728272827282728272827282728272827 -%282728272827282728051E191E181E181E181E181E181E181E181E181E18 -%1E18180B28272805284B9AB5BCB5BCB5BCB5BCB5BC4B2805280528A8FD25 -%FFA927282728272827282728272E27282728272827282728272827282728 -%2728272E2828272827282728272812FD071E191E1E1E191E1E1E191E1E1E -%191E1E1E1834272827282776B5BCB5BCB5BCB5BCB5BC4B2827282728A8FD -%23FFA8FD0427052827270528272805282727052827270528272705282728 -%272827280528272705282727052827270C191819181E181E181E1D1E181E -%181E181E181E181E181E18190B272128052793BCB5BCB5BCB5BCB5BC4B27 -%05280528A8FD22FF28282728272E2728272E2828272E2728272E2728272E -%2728272E272E272E2728272E2728272E2728272E272827282728272E272E -%2E34123B18411E1E1E411E1E19411E1E19411E1E122E2728272E6FBCB5BC -%B5BCB5BCB5BC6F2E27282752A8FD20FF2827272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282727272827272128272805341219181E191E181E181E181E181E -%1834272705284BBCB5BCB5BCB5BCB5BC6F2827280052A8FD1EFF2E282728 -%27282728272E2828272827282728272827282728272E2828272827282728 -%27282728272827282728272827282728272827282728272827282728272E -%12411E1E191E1E1E19FD041E3B28282728279AB5BCB5BCB5BCB5BC6F2827 -%280553FD1DFF522705282727052827282728272705282727052827270528 -%2728272827270528272705282727052827270528272705270C1413360D35 -%0C2F062805272727052821270534181E181E181E181E181E181E0C270528 -%2794B5BCB5BCB5BCB5BC4B2827270059FD1BFF7D27272E2728272E272E27 -%2E2728272E2728272E2728272E282E272E2728272E2728272E2728272E27 -%28272E272827282F1B1A3D1A3D1A3D1A3D143C133528282728272827280C -%411E1E19411E1E19411E1E12282728279ABBBCB5BCB5BCB5BC4B28272E05 -%84FD19FFA828272827282728272827282728272827282728272827282728 -%27282728272827282728272827282728272827282727051B1A1A141B141A -%141B141A141B1A1A13352827272827272734181E181E181E181E181E1228 -%27280576B5BCB5BCB5BCB5BC4B28272805A8FD18FF520528272827282728 -%272827282728272827282728272E28282728272827282728272827282728 -%272827282728272E272E143D1A1B143D1A1B143D1A1B143D1A1B1A3D132F -%27282728272E12FD051E191E1E1E182E2728059AB5BCB5BCB5BCB5BC2728 -%272828FD17FF590028052827270528272705282727052827270528272827 -%28272705282727052827270528272705282728272827282728271A141A14 -%1A141A141A141A141A141A141A141B1A140C28272700280B19181E181E18 -%1E181E182E21270570B5BCB5BCB5BCB59A0527052752FD15FFA82728272E -%2728272E2828272E2728272E2728272E272E272E2728272E2728272E2728 -%272E27282752282E272E2728272E27280C3D1B3D1A3D1A3D1A3D1A3D1A3D -%1A3D1A3D1A3D1A3D142F27282728273B1E1E19411E1E1941192E272E279A -%B5BCB5BCB5BCBB9A052E27287DFD14FF2728272827282728272827282728 -%272827282728272E27282728272827282728272827282728272827282728 -%272827282728272706350D351336141A141B1A1A141B141A141B141A141B -%1A350527272721341E1E181E181E181E18282128279AB5BCB5BCB5BCB54C -%05280528A8FD12FF5327272827282728272827282728272827282728272E -%2728272827282728272827282728272E272E272827282728272827282728 -%272827282728272E282F0D36141B1A3D1A1B143D1A1B143D1A3C0C282728 -%27341E1E191E1E1E191E1828272827BCB5BCB5BCB5BCB5282728057DFD11 -%FF8427272705282727272827270528272705282727052827270528272705 -%282727052827282728272705282727052827270528272705282727052827 -%270528272705280635141B141A141A141A141A141B0D282727212E181E18 -%1E181E181E122705284BBCB5BCB5BCB5BC6F27052805A8FD10FF53272827 -%2E272827522728272E2728272E272827522728272E2728272E2728272E27 -%2E272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2F3C1A3D1A3D1A3D1A3D1A3D142E272E272E19411E1E19411E -%1E122827286FBCB5BCB5BCB5BC4B2E272852FD0FFFA80028272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2727272F131B1A1A141B141A141B142E2128272E181E181E181E181E0C28 -%272893BCB5BCB5BCB59A052827277DFD0EFF2E2827282728272E28282728 -%272827282728272E272827282728272827282728272E2728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27280D3D1A1B143D1A1B143D1A2E2728272E191E1E1E191E1E1E2728274C -%B5BCB5BCB5BCB57605282752FD0DFF7D2727270528272727282727052827 -%270528272827282727052827270528272727282727052827270528272705 -%282727052827270528272705282727052827270528272705282727052827 -%2705361A1A141A141A141B142E2128212E181E181E181E1D1805280570B5 -%BCB5BCB5BC93270528007DFD0CFF522728272E272827522728272E272827 -%2E2728272E2728272E2728272E272827522728272E2728272E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2827351A3D1A3D1A3D1A3D142E272827351E1E19411E1E1E35272827BCB5 -%BCB5BCB5BC6F2E272828FD0BFFA800282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2728272E141B141A141B141B142E2728213B1E1E181E181E182E27284BBC -%B5BCB5BCB5BC272827277DFD0AFF522727282728272E2828272827282728 -%2728272E2728272827282728272827522728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27282728272E143D1A1B143D1A1B1328272827411E1E191E1E1E12282728 -%93BCB5BCB5BCB57605282752FD09FFA82727270528272727282727052827 -%270528272805282727052827270528272805282727052827270528272705 -%282727052827270528272705282727052827270528272705282727052827 -%270528272705282728131B141A141A141B0D2727270B1E181E181E181E0B -%28054BB5BCB5BCB5BC9327052805A8FD08FF7D2728272E27282752272827 -%2E2728272E272E272E2728272E2728272E272E272E2728272E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E143D1A3D1A3D1A3D2E282728121E19411E -%1E1E3B2728059ABBBCB5BCB5BC4B2E272753FD08FF272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728212E141B141B141A141A2727272E18 -%1E181E181E1D2E272827BCB5BCB5BCB59405282728A8FD06FF7E27272827 -%28272E28282728272827282728272E272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272F1A1B143D1A1B1A -%36272827341E1E191E1E1E1828272893BCB5BCB5BCB54C052827A8FD06FF -%530027052827272728272705282727052827280528272705282727052827 -%280528272705282727052827270528272705282727052827270528272705 -%282727052827270528272705282727052827270528272705282727212F1A -%1A141A141A142E27270519181E181E181E0528054CB5BCB5BCB5BC6F2705 -%2752FD06FF2828272E272827522728272E2728272E272E272E2728272E27 -%28272E282E272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%28272827361A3D1A3D1A3D142827282E1E19411E1E1E3B272827BCB5BCB5 -%BCB5BC272E272EA8FD04FF7D272728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%2827282728272827282728271A141B141A141B0C272728181E181E181E18 -%2E27286FBCB5BCB5BCB54C052805A8FD04FF7D0528272827282728272827 -%2827282728272E2728272827282728272E27282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282F1B143D1A1B1A3C272827 -%341E1E191E1E1E0C28274CB5BCB5BCB5BC6F28272853FD04FF2727052827 -%270528272705282727052827280528272705282727052827270528272705 -%282727052827270528272705282727052827270528272705282727052827 -%270528272705282727052827270528272705282727052827270528131A14 -%1A141A142E2727051E181E181E181905282794B5BCB5BCB59A2727002EFF -%FFFFA828272E2728272E2828272E2728272E2728272E2728272E2728272E -%2828272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728272E2728272E2728272E -%2728272E272F1A3D1A3D1A3D13282728121E19411E1E192E27286FBCB5BC -%B5BCB54C272827AFFFFF7E00282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282714141B141A141B2827212E1E1E181E18 -%1E0C28054CB5BCB5BCB5BC4B2827277DFFFF522827282728272827282728 -%27282728272E272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282F1B143D1A1B1A35 -%272827411E1E191E1E3B272827BCB5BCB5BCB59A2728057DFFFF52002827 -%270528272705282727052827282728272705282727052827280528272705 -%282727052827270528272705282727052827270528272705282727052827 -%270528272705282727052827270528272705282727052827270528272705 -%28141A141A141B13282727121E181E181E182805286FBCB5BCB5BC932827 -%2728FFFF27282728272E272E272E2728272E2728272E2728272E2728272E -%272E272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728272E2728272E2728272E -%2728272E2728272E27361A3D1A3D1A3D282827341E1E19411E1E2E282776 -%B5BCB5BCB5BC27282752FFA8270528272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827282728272827282728272827270C1B141B141A1A2F2727051E18 -%1E181E1E3421284BBCB5BCB5BCB54C052705A8A8272827282728272E2728 -%27282728272828282728272827282728272E272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272E141B143D -%1A1B13282728181E1E1E191E12282752B5BCB5BCB5BC4B2827277D592727 -%270528272805282727052827270528272705282727052827280528272705 -%282727052827270528272705282727052827270528272705282727052827 -%270528272705282727052827270528272705282727052827270528272705 -%28272705361A1A141A141405282712181E181E1819272727BCB5BCB5BCB5 -%700528007D7D2728272E2728272E2728272E2728272E2828272E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728272E2728272E2728272E -%2728272E2728272E272827282F3D1A3D1A3D142E2728121E1E1E1941192E -%272E93BCB5BCB5BC6F2E2728535227272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827282728272827282728272827282728272F141A141B141A062827 -%2E181E181E181E0527059AB5BCB5BCB59405280552522728272827282828 -%27282728272827282728272827282728272E272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27282728272827282728272827282728272827282728272827282728283D -%1A1B143D1A2F27282E1E191E1E1E192E27286FBCB5BCB5BC932827282E27 -%270528272727282727052827270528272805282727052827272728272705 -%282727052827270528272705282727052827270528272705282727052827 -%270528272705282727052827270528272705282727052827270528272705 -%28272705282728131B141A141B0D27052E181E181E181E0B280570B5BCB5 -%BCB5BC2727052E28272E2728272E2828272E2728272E272E272E2728272E -%2728282F2828272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728272E2728272E2728272E -%2728272E2728272E2728272E2728273C1A3D1A3D1B35272827411E411E1E -%1E3427284BBCB5BCB5BCB528272E27272827282728272827282728272827 -%2827282728272827280D1A141A0C27272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%2827282728272827282728272827282728272827282727131B141A141B13 -%272728181E181E181E0C28054CB5BCB5BCB5BC2728272828272827282728 -%2728272827282728272E2728272827280C3D1A1B1A3D2E28272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27351A3D1A1B1A362728273B1E1E191E1E3421284BBCB5BCB5BCB5522728 -%27052827270528272805282727052827272728272705282714141A141A14 -%352727052827270528272705282727052827270528272705282727052827 -%270528272705282727052827270528272705282727052827270528272705 -%2827270528272705270D1B141A141B13282728181E181E181E1227054CB5 -%BCB5BCB5BC272827272E2728272E272E272E2728272E272827522728272E -%2728133D1A3D1A3D1328272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728272E2728272E2728272E -%2728272E2728272E2728272E2728272E27361A3D1A3D1A36272827411E1E -%19411E34272E4BBCB5BCB5BCB55227282727282728272827282728272827 -%2827282728272827282714141B141A1A3527282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827280D1B141B14 -%1B13282728181E181E181E1227054CB5BCB5BCB5BC272827282827282728 -%272E27282728272827282728272827282728131B143D1A1B132827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827361A1B143D1A362728273BFD051E3527284BBCB5BCB5BCB54C2728 -%272727052827272728272705282727052827280528272721351A1A141A14 -%140528272705282727052827270528272705282727052827270528272705 -%282727052827270528272705282727052827270528272705282727052827 -%270528272705282727131B141A141B0D270528181E181E181E0C270570B5 -%BCB5BCB5BC2727052852272E2728272E2828272E2728272E272E272E2728 -%27282F1B1A3D1A3D142E2728272E2728272E2728272E2728272E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728273C1A3D1A3D1B352728281E1E41 -%1E1E1E3427286FBCB5BCB5BCB52827282828272728272827282728272827 -%282728272827282728212F1A1A141B141A05282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827282728272827282728272827282728272827282728141B141A14 -%1B0C27272E181E181E181E0B280570B5BCB5BCB5BC272805525327282728 -%27282728272827282728272E2728272827280C3D1A1B143D1A2F27282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27282E1B143D1A1B1A2F27280C1E1E1E191E1E2E27286FBCB5BCB5BC9328 -%272852522727270528272805282727052827272728272705282728141B14 -%1A141B0C2705282727052827270528272705282727052827270528272705 -%282727052827270528272705282727052827270528272705282727052827 -%270528272705282727212F1A1A141A141A052821341D1E181E181E272705 -%9AB5BCB5BCB594052800597E0528272E2728272E2728272E2728272E2828 -%272E2728273C1A3D1A3D1A36272E2728272E2728272E2728272E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E27282728133D1A3D1A3D142E27281241 -%1E1E19411828272EB5BCB5BCB5BC6F2E27277D7D27272827282728272827 -%282728272827282728272827270D1B141A141B1428272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827282728272827282728272827282728272827282727053C141A14 -%1B1A3527282719181E181E1D3B272827BCB5BCB5BCB570052805A8A82728 -%2728272827282728272827282728272E27282728272F1A3D1A1B143D2E28 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2728272F1A3D1A1B143D2F27272E191E191E1E1E1228274CB5BCB5BCB5BC -%4B282728A8A8280528272705282727052827270528272827282727052706 -%1A141A141A14352727052827270528272705282727052827270528272705 -%282727052827270528272705282727052827270528272705282727052827 -%27052827270528272705270D1B141A141A142E27270B1E181E181E182E21 -%286FBCB5BCB5BC9328052727FFFF2E282728272E272E272E2728272E2728 -%27522728272E2728143D1A3D1A3D142E272E2728272E2728272E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E27282728283C1A3D1A3D1A3C2728273B -%1E1E19411E412728279AB5BCB5BCB5BC27282753FFFF5900282728272827 -%282728272827282728272827282728272F1A1B141A141B0C272728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827282728272827282728272827282728272827282728212F1A1A14 -%1B141B0C272728181E181E181E1227052893BCB5BCB5BC6F28272752FFFF -%7D2727282728272E27282728272827282728272827282728281B143D1A1B -%1A3C27282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27282728143D1A1B143D1A2E27282E1E19FD041E3427284BBCB5BCB5BCB5 -%7605280584FFFFA805270528272727282727052827270528272805282727 -%0527131B141A141A142F2727052827270528272705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%052827270528272705270C1B141A141A1436272721341E1E181E181E0528 -%0570B5BCB5BCB5BC27270528A8FFFFFF52272E2728272E2828272E272827 -%2E2728272E2728272E272F1A3D1A3D1A3D1428272E2728272E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E27282728273C1A3D1A3D1A3D2E28272E19 -%1E19411E1E1828272893BCB5BCB5BC9328272828FD04FF52272728272827 -%28272827282728272827282728272827282714141B141A141B0C27272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272821351A1A141B14 -%1B132827270C1E181E181E1E34212827BCB5BCB5BCB5760528007DFD04FF -%A8272827282728272E2728272827282728272E2728272827282E1B143D1A -%1B1A3D282827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%2E143D1A1B143D1A2F27282719FD041E19412828059AB5BCB5BCB5BC4B28 -%27277DFD04FFA82805270528272827282727052827270528272821272727 -%0528131B141A141A14362727052827270528272705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%052827270527131B141A141A1436272721341D1E181E181E1228052793BC -%B5BCB5BC9327052827FD06FF5228272E272827522728272E2728272E2728 -%2E35122E272E272F1A3D1A3D1A3D1A35272E2728272E2728272E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E272827282F3D1A3D1A3D1A3D2E28272E191E19411E1E1E2E -%27284BBCB5BCB5BCBB76052E2759FD06FFA8052827282728272827282728 -%272827280C1E1D1E182E212827351A1B141A141B142E2128272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2728272827282728272827282727061B141A141B141B0D2727270C1E181E -%181E1E1927280594B5BCB5BCB5BC272827277DFD06FFA852272827282728 -%272E27282728272827411E1E191E192E2728283C1A3D1A1B143D142E2728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728283C1A3D1A1B143D142E2728 -%27FD051E191E2E280552B5BCB5BCB5BC9328272827FD08FF522727270528 -%2728272827270528272E181E181E181E122705270C1B141A141A141B1428 -%212827270528272705282727052827270528272705282727052827270528 -%27270528272705282727052827270528272705141A1A141A141A142F2727 -%21341E1E181E181E122827276FBCB5BCB5BCB54C05280059FD08FFAF2728 -%272E272827522728272E27282E411E1E19411E1E2E2827280D3D1A3D1A3D -%1A3D142E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728273C1A3D1A3D1A3D1A36 -%272827341E1E19411E1E1E2E27284BBCB5BCB5BCB5BC272E2728A8FD09FF -%520528272827282728272827282727121E181E181E1E1905282727131B14 -%1A141B141B142E2728272827282728272827282728272827282728272827 -%28272827282728272827282728272827282728272728141A1B141A141B1A -%1427282728181E181E181E1E1821280594B5BCB5BCB5BC6F2827272EFD0A -%FF7D28272827282728272E27282728272E181E1E1E191E1E3B2728272E14 -%3D1A1B143D1A1B142F272827282728272827282728272827282728272827 -%2827282728272827282728272827282728272827272E3D1A1B143D1A1B1A -%3C28282728121E19FD041E4128280552B5BCB5BCB5BC9352272805A8FD0B -%FFFD0427052827282728272705282134181E181E181E1E342128272E141B -%141A141A141A142F27270528272705282727052827270528272705282727 -%0528272705282727052827270528272700270C1A141A141A141A141A0527 -%27270C1E181E181E181E0C27052793BCB5BCB5BCB57005280552AFFD0BFF -%A80528272E272827522728272E2728273B1E1E19411E1E1E342728272F1A -%3D1A3D1A3D1A3D1B3628282728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E133D1A3D1A3D1A3D1A3D2E2827 -%282E411E1E19411E1E182827286FBCB5BCB5BCB5BC272E27277DFD0DFF52 -%0528272827282728272827282727051E1E1E181E181E182E2128212E141B -%141B141A141B1A1A0C282727272827282728272827282728272827282728 -%272827282728272827282727272F141B141A141B141A141A062727280B1E -%181E181E181E182E212827BCB5BCB5BCB5BC4B28272728FD0EFF7D282728 -%27282728272E2728272827280C1E1E1E191E1E1E182E2728272E141B143D -%1A1B143D1A1B142F27272728272827282728272827282728272827282728 -%27282728272827280C3C1A1B143D1A1B143D1A3C2828272827411E1E19FD -%041E342728279AB5BCB5BCB5BC9328272805A8FD0FFF2827272705282727 -%2728272705282727121E181E181E181E182E21272128131B141A141A141A -%141A14140C28212727270528272705282727052827270528272705282727 -%052F131B141A141A141A141A1436272705270519181E181E181E1E122128 -%0570B5BCB5BCB5BCB54C05280052FD10FFAF2728272E2728272E2828272E -%27282728181E19411E1E1941192E272E27280D3D1A3D1A3D1A3D1A3D1A3D -%14362E2E27282728272E2728272E2728272827282728282F133D1A3D1A3D -%1A3D1A3D1A3D1A36272827282E411E411E1E19411E3B27282752B5BCB5BC -%B5BCBB9A052E2728A8FD11FF7D0028272827282728272827282728272818 -%1E181E181E181E182E212827270C1A1A1A141B141A141B141A1A1B14360C -%2F28282728272727282728272E0C2F133C1A1B141B141A141B141A141B14 -%2F212827270B1E1E1E181E181E1D192727052893BCB5BCB5BCB5BC272827 -%2752FD12FFA852272827282728272E272827282728272E191E191E1E1E19 -%1E1E342728272727361A1B143D1A1B143D1A1B143D1A1B1A3D1436133613 -%350D36143C143D1A1B1A3D1A1B143D1A1B143D1A1B132E2728272812FD05 -%1E191E1E192728272893BCB5BCB5BCB5BC4B28272827FD14FF7D27272705 -%2827270528272705282727212E181E181E181E181E1E1805282727212E13 -%1B141A141A141A141A141A141A141B141B141B1A1B141B141A141A141A14 -%1A141A141A141B1436062705282128121E181E181E181E181E052705286F -%BCB5BCB5BCB5BC6F2705280084FD15FF5327272E2728272E272E272E2728 -%272E272E181E1E1E19411E1E1E412E28272E27282E3C1A3D1A3D1A3D1A3D -%1A3D1A3D1A3D1A3D1A3D1A3D1A3D1A3D1A3D1A3D1A3D1A3D1A3D14352728 -%2728272E181E1E1E19411E1E1E412E28272E6FBCB5BCB5BCB5BC9328272E -%057DFD17FF282727282728272827282728272827282728181E181E181E18 -%1E181E122821282727272F131A1A1B141A141B141A141B141A141B141A14 -%1B141A141B141A141B1A1B14360C2721282727053A1E1E181E181E181E1E -%19052827286FBCB5BCB5BCB5BC934C05280052AFFD17FFA8272827282728 -%2728272E2728272827282728121E1E1E191E1E1E191E1934272827282728 -%2835133D1A1B1A3D1A1B143D1A1B143D1A1B143D1A1B1A3D1A1B143C0D2E -%27282728272812FD051E19FD041E3B272827286FBCB5BCB5BCB5BCB54C05 -%282728A8FD19FF7D002705282727052827280528272705282727121E181E -%181E181E181E1E190B28212705272727052F0D14141B1A1B141B141B141B -%1A1B141B141A13350C2E052727270027272E181E181E181E181E181E1D12 -%002805276FBCB5BCB5BCB5BCB570052705277DFD1BFF7D052E2728272E27 -%2827522728052E272827282E1E1E411E1E19411E1E1E4119342728272827 -%282728272E2E350D361336133613360D352F2F282E272827282728272E34 -%3B1E411E1E19411E1E19411E34272827286FBCB5BCB5BCB5BCB576272827 -%2853FD1DFF5200282728272827282728277093762728272827191D1E181E -%181E181E181E1E1E122E27272128272727282727272827272728272721FD -%042728272721280C12181E1E1E181E181E181E191E122E2128052893BCB5 -%BCB5BCB5BCB5700528272728FD1FFF52052827282728272827BCB5BCB5BC -%4B2827282734181E1E1E191E1E1E19FD041E411234272827282728272827 -%2827282728272827282728272E2E3B181E1E1E191E1E1E19FD041E411228 -%2728054C93BCB5BCB5BCB5BCB59A2728272828FD20FFA828002827270528 -%0594B5BCB5BCB5BC6F270528212E121E1D1E181E181E181E181E181E1D1E -%183A0C2E052E2728052827280528052E0B341219181E1E1E181E181E181E -%181E181E1812052727270570B5BCB5BCB5BCB5BCB5700528272727FD22FF -%A82E2728272E272893BCB5BCB5BCB5BC9352052827282E3B1E411E1E1941 -%1E1E19411E1E1E411E1E1E4119411841183B1841191E19411E1E1E411E1E -%19411E1E19411E1E1E41182E27282728279ABBBCB5BCB5BCB5BCBB76052E -%272827FD24FFA828052827280570B5BCB5BCB5BCB5BCB57627282728272E -%121E1E1E181E181E181E181E181E181E181E191E181E1E1E181E181E181E -%181E181E181E181E181E181E1E190B28272805286FBCB5BCB5BCB5BCB5BC -%B5700528272727A8FD25FFA8522728272827BCB5BCB5BCB5BCB5BCB5BC4B -%28052827280C3B19FD051E191E1E1E191E1E1E191E1E1E191E1E1E191E1E -%1E191E1E1E191E1E1E191E1E1E122E27282728274C93BCB5BCB5BCB5BCB5 -%BCB54C0528272727FD28FFA82E002705282794B5BCB5BCB5BCB5BCB5BC6F -%4B05282727212E0C19181E1D1E181E181E181E181E181E181E181E181E18 -%1E181E181E181E181E1E1E1234052721280527279AB5BCB5BCB5BCB5BCB5 -%BC93280527052727A9FD2AFF53052E2728279AB5BCB5BCB5BCB5BCB5BCB5 -%9A4B28052E2728272E343B19411E1E1E411E1E19411E1E19411E1E19411E -%1E1E411E1E1E4118342E282728272E275293BCBBBCB5BCB5BCB5BCB5BC6F -%2E2728272852FD2DFF5900282728054C93BCB5BCB5BCB5BCB5BCB5BC934C -%27280528272827280B341219181E191E1D1E1E1E1D1E1E1E181E181E183B -%0C2E05282127052805284B9AB5BCB5BCB5BCB5BCB5BCB5BC4B2805282727 -%52FD2FFF7E2728272805286FBCB5BCB5BCB5BCB5BCB5BCB5BC6F52272805 -%2827282728272E272E2E3412351234123512340C2E272827282728272805 -%284B9A93BCB5BCB5BCB5BCB5BCB5BCB59A2728272805287DFD31FFA8FD04 -%2705284B94B5BCB5BCB5BCB5BCB5BCB5BCB59A6F4C272805270528272700 -%282127212721272127212700280527052805274B7093BCB5BCB5BCB5BCB5 -%BCB5BCB5BC934C0527052800287EFD34FF5328272E27282776B5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BC93764B522728272E0528052E2728272E272805 -%2E272827766F9AB5BCBBBCB5BCB5BCB5BCB5BCB5BCBBBC4B2E2728272827 -%7DFD37FF7D280028272805286FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BC93946F764B4C4B4C4B4C4B704B706F9A93BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BC937627280528272727A8FD3AFF7D052827282728277693BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F2805282728052853FD3DFF -%A828270527052805274B9AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC934C272805 -%270527005284FD40FF7E5205282728272E27526FBCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCBBBC93 -%9A4B28052E272827282EA8FD44FF7E2827052727280528274C6F9AB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC93 -%764B2805282728052700527DFD48FF7D532727272827280528274C4B9A93 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A6F76272805 -%2827282728052852A8FD4CFFA8522800270527052805270528274B4B706F -%9493BC93BC93BCB5BC93BC93946F9A6F7027282727052827270528002727 -%7DA8FD51FFA8522E05282728272E2728272E0528272E272827524B522752 -%2728272E2728052E2728272E2728052828597DFD56FFA8A8525227270028 -%272727282728052827280528052805282728052827280528052700282859 -%7DFD5EFF7D7D282E27270028272827282728272827282728272805272728 -%27525384A8FD64FFA8A87D7D5253282805282727052827272752525959A8 -%A8FD34FFFF -%%EndData - -endstream endobj 87 0 obj <>stream -%AI12_CompressedDataxk\Ǖ%]C ؃Qv TVVn qllṡ@Q֎9'dU%Ό*$'N|[i_}-M|xz?ux\ CЁm/}L߽{o}o~ߞ>Q޽|毇g\?}/ٻ2KW/^ĸ,ۧ?3-ǧ~{Cez,T/˻?_߾ճ ^},󀪣Go& mʇc9ǤLrts*~kƻ]*+RZw/02\&o{o,]ܾ|&s$E/wo^~NvhOT|zlƳ^èӿ~yu0.;?gu1`>CL2Ґ&}z廻HmL?n^72"v/}fW;\ƎdG, FeIOڙ|R'{^'߮:++nop,|Z"uo]ԥ_w<sT_@=$~s{o~@xϷwRʯ||дܽ|ͪ1=~goR;͋i ۣ"H{߼x=u!={o ܙǻyP_?}O?/_g0g|7~?}͟^^Ci'M\*Wr*gϥ5-SUjnu^_a\cM׫UB[Zikβ9v[w ;e VjUGWkdkM]jZYKW•%)e kZ֊kv]YM-,.ưZVOu^ˌ9q|;YF({E{+O`#lO(g{.Pݸ[LEq>賿(gs!i J -W(pCcZĘS9bhLK>SNW&bݳoȔ2N:[W*_]]PW7WJNOQu}:nNO&^; CNWק-pg99t>ߜo ̍7%` 7[Lm@kb('t|YS%?Y\iU6%3*aSU݈M-[ʦ)ץ`iUV%Jڔ*aUp`aZqbWŬ^6O>ZzUNY*n׮vAn"vl3,f󶙭A0_y)srUKjRB-'ւ}'Q"B? -IU-YJ?^Zj bk)45u<ɺ%Y'/P2g+ٷQfiFEyw1R[-dQFdT 6 tI m@Hn0 W 1H:Kn W )GVkqCiݷgL d8'$94dA5n[l3@yd݂kDgL ? -!2pZcĖb_.=.S׸;cINp2. BR87׸pYa#KW878reL֊W6JbkKm-[rݻ0b- ،7|}aU6vu}vYWkDn)RrW4}c]n,xcJІߋA<݌Vnv/^ǰF ]9 yq)3z,ys= -ndBd2:]N;,&$C - Ul*+"j*$BQ7I}Wp)bZYȶu|㈝ ҈՚\-j!Yk%d1ےY_( V2Sܔ*k 5 =J O7"'ZItT y.OwJKe}t .)=\l%TVUk^)WJX&=ơ{(NEl hY&yǝ>??D-oϵB_dR6Mjo(gCVNu"4B9.zEceZ<|NyOCZ$ES:tjj:z~d9?ӽ|tA>g^?g R5ՈRJӡWc-MkYXeii4Eo] 7xJ%kCu;jS -Ov M@.Q59>2lhL3KLcv(C=KGAAJ!VN5>RNE:H0Ӂ{NG<略(n]]ɋY30l"n4VqM5{1'04||#N1 [aY}w0iLsr1([rыYUqib&)f'9+s ܍ -\"9N9(,|;%FkjVW81`04J{ڽ4Mb.٘Jqi&h zd1]_NB&b¾M(q6ۨmƂ6PFM:Pυj.rM# u\Q 5\h'[S-Ā-mKi5 zB~ ;JoG ӎC3!!}JzF'14ڃV hw~ԧTgGDA -ȧaU40:FA^)l%Q^'F Y3!@ JKޖ!6; NX-|S~l6#JDvG|?G9|d%m~Nŗ^pz5cбY;CV iQ`tt ts-ܮ|}Ca꽄T]+ELh֓QWkZr^b1_o. _vm W4v&wueZEeL\ 硫>'aGoEO\ 蕰7“Wom($6N -x}qQ!/Gt^)7Q'*EէHT7իwG#=FW΋:8\߮vsiunN4p+"GQZnrᖒ$:R6.T`{9v2y"m|[uC;VE&/qMI}_US<߹z5/Ŝ/_S Ln"+Wl]vy׋lj" 'VdE.\"x\ldu)S6y8|$sjG9Y\7kSKUEvݱM}%II+/NھJʹJJb) 9v.C>Kz%!SFO"%܉v[To?ߕ{5翻&{f Yi+v[5׎?(tl-!uC .K?ܬB%|\R)˗'/SWΝl1)yK6X~[}| h_WÒPob62YJv|2~Xk#S g^r6٩gGPQ'UJkjnsm*JC=^r5r4yx/ s[˞+ZV~3UKxU߳UYvN [oZ); t϶M"P<~޾Svry(;Xw|TrdBS,)sBcT 䤨@1:fP-pDY>IthaUH -L)XUWp\GN#KSװaJQS{z;0ɎJÐ6eyGq+Tԁagjy_w^ݽH=Z9Dce UzXpq.7NK0ws W8%`\[u %0w ^/VTb0wIRntl~ǥ+_r "9a]HӘJaU׺(2e%Ւk@w,OwRh~jwY8Rl/'{\Y獭n="i7eIC;crt#\ lhH(SȹA ZMsXU)o 3x,~ESY>媆SDOt)EBIV_gϲ(KR-͚86mۢ+Y -nEOB<-׵$ś w_sU$ᙛ$wM^$z"zœhJOŗ`#!Xy@7Oluwk뇵(H+nq kuBV?ѓsZyIm[{1#s<Ƈ/՞%{KәmzM_*š7)l=W=P#m{ha]m#SWϯ_?{ubӵ/uESU0>v `5QD@`֍V njp4䓡mU>:bԼ]jMX[$sW<1<\v >onnV#X.'>} 4G˘6~oʮ>mޏB]9$ -Nn+E>Ǭ.YBIɲ# VtuϢM S DzYw)jp#6M L))v&*@pl|U +/V*B0Dˍ KLbiLwm"~ K\l_҇,#ϥ /X0[ T(1+.YkV#RQKQy늻J -26O1TNVAsB x6*\Ru;Ucōr5T8FVJj؜S%DR%.n1=vUʢ9iYq$YrirV[b)n(~*BcXvBʢjKm}ʤ@-?ߣLJ(ʊШ&&"ӤKJ6UE8Zn;܃pc(J)k pm*Xu\ŽhK.CٮL]Bg@Qb6gٮ4f4S Q{Cv@yTrYQ*8Se0s?V{{3 l:qթz(w-Z HjZm0E&Ml -57 f\U`3HsB-%O>':BBA /#$;ŒȀB -GThtR~kDT5x[F1oDەdV~Ou?XսTR].=>I=r -Mo9 "_Hj2+_=%{'QQiQQIUl=*h\JYJozbP8y5 E x LTޡʗ@'U\35Ϋjk7_$MuTܚm1-.&6z+Ƽ6Fړ%Ƥv9Mܿvi{G΢l[wKpК`)g3E=LQ~(?S)vo"_#\Q uŸ.t -^s: 1qJ )=Ƌ>)yHۃGZ+70F}$c+0{ =Dt d!=W\0+oa}qZߖ˥ݵ)M^d#` 9-Nc(A)a,+:f\^\7cd{ZC5ѭvOH_qVۤ`>as5t?VC+ء͖ )Ghm9ZGρ).GB5}>\Pݣ>wh *Q (*xRB]pƧL06uDG^۠uR7LJ|:#>'0:g1f}DS'{&J{}fj۾7U͇?J)xB z Ļ}4r-ѱqN硣 "#8x(fR%!>b.7 TߧpSE,:B! Y(q k 7q\U-fa9,kZf Q1@ְY -,k>.]wv@vzDq9㸆Z;ل{X(F^{SO-Q[56bc+ݶ*WSMw%_5U3V~a>U +8 ٜ/Y =u7S - 5 [L?/.ئ&Z"`;nZ%W\d.u8EgՓHm}3Le3>iIU.o~݆ L:( -'_tג#PB6dG1 dtL`0׹o>aU&/ M5@A%ՉDHL(hC&Q(Ȉ&># -1`SUUV6$}$ab_OMVA~LB2*F 3%y}ݮF+J#sP~]ٓXAo+/Tǯ,lMbO$/șpK’Ijˋ6 vb?սc||GlɽcoG%:n`.!Ah Ł+gAEeԥK.M-$jRaAOV[`V-5VAM&N'|9Ww[U4ƒqX䑞rH&tY0Crx7|H:MI1s[ȡUҪ=OK~Ąz8vDOݒ=p}!'Nq?(RjNѳ$Kb3VpD#~ kWKrFJZ) jlϾgth,Kt(vLJVsݩhD;dϸE/'(H)?LY% >öAמZwQ m=? -v _[J|҂P=%#KūDzӏgv`s?{=qNH3zGUᓧo_~?|X<쟾:[x׿:߾_9XGwH`;y0 IدÑy4.7*_wK[O):]~" ^~۬o֏p޾;xś𫢜ӛ7/1޼}zzϘwS?}Wz=Wvx.qцkB{81&ٕ*)C[M{VF]7QDC>-ğ,=1)C,|Q%@烏e"j&|=!?j,T-2Ʒ1xv쑧232S@E8jMqgLu - qA:>8b:zB'`%Mv Nǃ ed)o -U@E㲘?j|UݤqBΆ`$%NVdjꊛmo8\Uq$9Yo\7wٜ7Pcs\:`Rk"'|%<M`-A!5T ^m7Yb,YYH-s݁CQ!U6*} cT՞6NU1-;eS4>GVtv~z|ʅ n7M^~Nbx# ] mAO>8z XP,;6P9JG^$` pc ^S Gg|J9ez*0Xki%T\#>{C`Cv]E@MO`2?4݌ A?z2HopIʐWh&quǤ$) -|"Ys=xY e]){43ɰB,+iJq ?RUp8T^Vr2b! -qzxx Ky zٷϟ%%|||\}S]⭢a‹Rױ ,C"T^;t\,ش^yHe$j1TA%:V&8bKB'@qc;0 NǐC -޵ehDw{+vRMhD2H^{Zli,?RU.;QlF積vu1ZTWޣlFA2uPǢ~;XE1)k!C#:Mu|ZU0Q '쌯Vh|q"ڃ.#2HU -$ rZC,TQYh |Umk6,yXTh(p6 UQ{>nm|dHH֤,fb]<)6@F -xkv $}GDl -խOWqt!\V.ll -`. -[۟0Rt?<#7l7V?2pQF h!a -n'om,b*ff$eLx#RFlS4aXlj _38X@!n bï։9ye`Ї%oUydxox fˢ>f. -˽¶$C-unJ@Qi̐7:| tGU! 5` @D!k9;hfhW'ט9LT4Ӝ0=9_.Ҙ/pP^D76we$1ⴑ -[Άqaykho`;T͵t6=m,t-g=mowsXk%lMtsm5w}bseWW&Ubk Ȫbmkl~P[k/6@}OY(jmV4x@`gu#B~^TLŔ3{Tϊ?X܂rfظC -$KP٨&M,.4$U!FCq^^K B4VqtPK_>U !X)z(*L.?C`*5.#T|INU>50geq/1iҽPG/K>iG3Đ1:hwK*r{ >hˑHxLܼ7E׈W|7N[<N=`t%"{b9*=]O!˫ymT1WEbwv vca޴͔]ʉq)(&N“喦!=5 G\j$4%lS}_ =v)wV Nt1>ȕS7-[z؝xP&Z-tAIkzQր܀Ѽ<2"$%~`d9@ba8vU2c~, |a3p҃@o۾Qbj֌BJЊm4 -"*[MchԭԪkb4UfѐpjtZ%&f@7#4E{:ژ%h\?[##Dp=(4@h;j3RLGGm Ѵ߱FbH߫huwsQ/Y9}0fDEk.!fls MVs yNcZjw ji,`~]<9sG:Lcyh.X>W׫߂1nJ:7N{nJ9M8UQ(G)4dVin$*%ǘӹ# -j-F t(b-k; ֙!ugl623M40MHI.c=f2H:RPr)[l`SďdG[pĩ#H/xxdݻ+%e{,8.t?ͤwQ Zك;SB0i-e ]oaqjxu'T+$h9\bED$*E -G*/Ǝ8CANp -vAK[hG -⣈)a7_6%0!6m劂f30t(`paPx -:RjJ4rC"Quv2$Fд)s!d|D [ DG24:)] 67G-%('D;bI' H;dmT?8·h,ӆ⵨Mm/538 Z4lJh-̘'OBܚI+Ѯ- 𑜵v9 -BTT4DЬiƊ9\9+QQ(cӨBi2ͱE=ŶFŸӌimlbx]@(l)-jhi0=SGOyh>U- \ gAX67$U,c.je !:PKA1$-$ՄC\vCag]wyX:[Ӡ59B\h$Bźuڈil@Bؘ$vW%,x"FHK0 [~hη9 `S2A2Ǎjy<])%F{&<<;L[٧`錮ԛcby(2؂26^>hl0CUycNТ>iqz0nc!e[ё| -m$R@$3I[/.\>&^G':s B&-4-n#)/q;Qv%wc|:[-.~*vPXFe4w1~WrqF/6M-=g@(b|Q!`݂k*SW[tvNo#x`Q.[~r84q7b^ MEL'1{Cp$#Ԣce S - S3e6,1F'jeݸ<8XXGA15C5Hg^ڙY\J\Rnd UmaS{nQI,aGwjv;XU@bfj)3*6HJD/^k&8J~˴NcK)S2}}i'l`H}qt#ޢ/PH=aN ƵKvaZT1~ 73\Fki,TS3}ψ6Ugt}c|zI RAW8AV,NlJ[ -֯l | RKKD%ݯn`E̜^яtg gI8}d5 Mu NbF>2򖎿4#MmxB.%R ~\(*4N* }ޏ7oր0Y/] R9h bZ -cq~Yr#$(`%;7 HEũbNS _L-6-b#p*y܉n3j [XaQ^NG`o55g8,jMG9('R0BG(OԀ#NXQ<4ol ͈7dn1Fafإ?Uŕ{mPifnG*=R ce4 #c02&} Mpɘ`'%cP2& %cGɘ0' pBh<ᄎ1S>:ƄC8cL:.:0o8dt=tpǘG q1a N( q蠈qh0FLGhȉEP/>ECU-jQq,&ˢ/NbB`0,&(9.leh|8Wx#p^1"8N _;Q40>N8bD'FH} qgs2{i6GL'Ɨǰ&giDZАn-en[ld[5Me++{MD%%L[tk0˴e+:%W}=~xdhfK's -X[m':4js2}i zT(C( ZѓՅf:HVB,:N)pXcD-V^tb zV!w2ީc\wp/a ,7.צw[wfgy(ӊpJDxB`}Ptw%;#)ZaJ/&0Z?0ֆ⛙43ܛ<5] P`x.Lu%};x=ǵqwv&yxCcy1m?5:R^0lݛbnEh9J" EM!\ͽMfn9R2t.!~bxn1/P>[<0MG.hCSEa"&9ḽmqYYTyr6e#4Q%55z|UZo -Ř\/8"=8ih!S'UN(C<=y3 31u4N4Ӣ34JXSf=C/n ,Wd!ME],/kɍ ԉl/䬘6-2VucضKrytqizZ;B}[jTY*<گź)c -9=:3u,j5jV# Z3~^GW{*yxNO!ygplߩmKiQa*D4UEj.?$mW޶A`ؔ}J.*Xe$hP@K<6dRLb#\MU7xacqS3 ĺ̫B@zE}8sGdOyh9>)-PjL81͒jM5c%u_e%`*[ZC.2cG>M+f$"u!aj1CWa%ڗDP`1QQѬ_fO&c~Ӣ1bU /̼#,Fdo.S3}1*kw/3Lnͼ%m$'H ^Kf%ʝ緊aRk]C/m4H@Ao/('[wDe̗p9wj麮|P؅Zj E9Ԩj|ߡ5S1tvi.y20SL(V$#kq0O^ kGᡏob~y/^=_/_~߶tz+~w/w}S7n?{|k1ݷo^.ƾ"w7?x]?/w|Y[Qll-J.Pr6*UoSO~Se Dx᷇"Ɉ-ff{+=w]ӳ~e){>G$@6F@:aQ -K*9L ׋~:MFPZFyI"z4 TXgVåD ܌|z%~hlW^EccR)QD T\Fazt/WųPYl j [ kS=dT,gY⪵%',syR%Vyy|*U **>IrtGv'=:S8 -&((lէie/,&XjLE1fTT+HSx`bKzLԖ3*~Gvf*ظq3\&HnYA[*R*A - iQٌґW¢+{LxQZ$:0=ͨ`3%he(OMa_:b?>ʔDzdHꂑbRdj^V2%sWO d"x#T?kl }܁xG$Ӣ9́]H„X@|[tUyԖCQaz3krʔgYpfϋP<"$W5͉BÊӦ>dӚ -ECR kijgUrҌ6K+}:2*H`UMKG.˃,-R(-{ڂ2X^GqYY?E 8 I iey0}i"љ.4He d B0Hs躌!_cIbʱH -2i J/F[#B*eyW2 7X;-"9.`WS#L+&S:k\H$ϣb -G1TLz INAѱ}"ARH$0D65OC$͗VHTufPa^1d?`P`jb &h=3RT.)1QBI`\'e-ϽbRF Z[SJ RI5fm=A »qrړzP{f(MׂIN;'LyM> ƩZRE:0V|5*ĦAK -Hw/)->2mH7+;LX悏8hȖHJM2(~^I-}fg:}(IXABT ^}'^@JUypc-U6x=MhBZQKZ,6 :RNd::2ed:l@'/$\\yfpZ"i;//ܓRdɏMuR#YI\`f# F$%7*1%4GS  JxuUޚ R-2d֊$@^pãS >&9ϵyXlkޔS -Ƒ);hWtξA[oD5HP_!<1YDKz%%-yd%>eZ*rm^hf:ٛIjRɟZͱ|MpYqEN=p,s&+^_fL/CΌ/^_EWQ8^q^3;'n@((b@`!0"Q}H`ZMseفN,`LUv 틥ѷMx[=R -ؤn ʺ)J՟8Vh}y”L¤58JV :!E?+MUԲX In/Bpz/A!t&=Sbȱ>8Ԡ!XxE⦮gǀy<(wwu8tɤPOI -c|eq9ne -Ρ^p!@Q4%?SrIdH%7Uw))r֨sWKSRnZ -M,dV;nO 0 tY -T} ׇBYS[ޮNK:,əAx$1ױ"7&?x(=GA",tz-CJxbf_\ANN* -5tCo!'rd:ЈU,oK'ϷM!D`Fkc(M%!̸';e`1TRd5̋DI=;^ES+C'yITVV..VoU<جbK5R>l q[ -IZBHrjy֬-bL"c 7K+pw)N 7&}S_9&wDP$Dzm{T 8"HLT\ДRuiU5DWɮB98nߩ*7W䃦 -6jpV@o1Tc[Ͻ&yV@`m79Q9BHyMAU+ҝ)CrQFfqBT*8A6K7Vx pxswIsGI#eu+15K*zaN6dEUXJq*2Mfezfi6DInyK']"$\55'PGF -b3̴"V'l#!@(/f2sԚX 0 8ؒ17sEl@-TLٚAADᔬ)VU"Ml▮+uDK\C"v- -5D6*F6̈) ; RGCvY!AF L #9}qi Epi( P@WEVY*鑐iyTA55 !A=D -$;(WVlJ} -LWQkyدx9' Y|%:A :2"zsd6bWP ttN)%Xs]$ƱI U#+ tɊU8\EǠ>p G?@UZp3)Ŵ0S!S)UJ Udl'Wd5v́3X+N>K 1. dn_Wj@[d SgkE/*USڱ{$cέ̐ Q:IM5H*QX/ӞI@'tK -i5pq|Sl8 vS%-#gF\ ^C /㋌grY]Pa!2*e"vqҳoGs6ZOth $v4vuuɮKž#;jlcH [Qu_ױTߘ}oԁdA'>~𹩧mu0[1W7,_#LCŊ.j̵Y?m -ھ*%F؍7^1c **rg?lM26G|%-%IΏt$dz.x"fQH0"'4$Ĵ#`c!:r87pp<d~=w)VfBZn;R7UXcenW-"wfXސ;*Zm Vy&Y (1Y"74hevr.Oh@b*3Df @E7,mes?axfߖk ߝ{\ipVvha#~u巔a^H:]5,t_;E+ R+s^cţAm3.HzڈAGf9Y @ h``&E8k'!}(hF낪n=]1ieޒm-&;n sjE![UJZϩ@K[xj s;)Gsj#cKY͊猼@>pR -d6GaԔls Y'jni.ETw){/Pmt4XER8xH70=v?c1nO4Tyfm~Eφ~g#yBǂjY -8P", FK8, uЛ1ݨF >o4u;`i~ wqFL$"zПaD2q<ܼn;B ydR>4s>G\ժJ񹂌|N\E U S)Q}v|x)68LMSA5oѰ7jS @2 !o)µ9ܱEDmb7ʽcNdCHʟKXҀ#G*)ĸ3F/ۿsbJ^S. n<)9SDD-%TOԦp/k&oG f6泅@w5$*ÏS0[TҠ,2ʖՑx:sulJdn/rկQKLn  c +qyo8-$nXA&e`es Bo_*ORx'1~X*m>Y-Ll;ܥ]M W1H=?sDb>?bG9,]pk["S~0fUP﷯}f\5SeSekcnDM p͊F?G*"Bށuq(TㅧZB!GӉ -󗡇x ^@- :&F0o:H`74;OxOr)0r3ŷeLCsS`do+!1#憋/HNLC郄qeh1:NZ0QE:W>WP;{Pzӣau'K{뵻(oLw__0'Pq e}8u1c%k}ݵ7*,kӮr"h*7q&A4 vFk; J,#,Mr2["l y4- H.iPڻAm/i -|9ñC8 v| -|E4jXj#pb!H$hn n= h F`dޛusgDI,:yFO/6+i +z9Tco "g9;  -zL= DoGo.][IDg41,SF_?3.3dõsy 3[~0K^_m%i{d %*a - 3Y۽^K&T`&Q?W&x uj6h)FbrFw?zLw@ -veAV;8Ŵ\#ìg91̮=n9sݹ!۩ -ʋ%{_6^n~2 xṏF=)93@F9c%GѪ&V,B,2/p J9G7\gfgRho3/BYfR!JDQO ..v+5tųJ3%ASθ)re*.lƲD.֌Ţ̩LSR*qڈ+HpDP ~BV^8V$eS}73;ٯ0@-pI`z S*H%tإ w3F&i^o,Kj̀f TZ2x{$xK`y`YLt_9,w7*g2~f]4k8{#'+QqbvK Aj&FX޴*ƘC1tٞ3Z*HqrC X(uJQ>0cpd6шH@ ܌"0w½k#]ysׇI -g`iС@,y+6`AC@}y.Z+\Yr3{W,NHBQ(JL?8c`?-¢> -rP"b=vJ]^LD~@E'ntZ&ףBa)0sSmjȭ7kf{p(V#>7jz-Fm{j-(RS -me4k*|:g+ԩtmͨm3.57lѯe6ݸK>8O8 0;q7y:j29n2E `cxn76>߅:Udt|D.Se7PFl5'8>WsWDŦ Je8gPXi4 s "(-P q׹YUذ1 HNI :HHl2Zh=7V [nA(c& -j(UKQ(P*v@zI&HԔ=҇Lki{أ؈ -+G4,t ]^+xuf+N7^2ϣL,HTJWK%J!&):S3h^~kV73ՈZ:-~} uI`B`?= )Tč|AUvȣr03?%$ q `fK&0c~d7nhݓ4o@?n{ܵN]43"hy:#>8nF 'a] -_s!@Y{ PYbΫF8n@玵 TKم^FV?GW>e0 -42iu5aA`Yi'Z[ -ʴ\+rP,?z駓3҃UX[V``ySap[1t)7P9t~`u(EA83 -jttbSHx9D)MP~ fE.(Y -e(Trxf _?+nP `E| Ĥrz"Iنa`Yv( UE׎'9~spjXЂ2͌kZe_hV5>%2y ïmPD;sm.BQc*@Pq(ns xe#tHiTY;yq, &!V CH{H wP}6y_"gG?^qZK=z( =n\p^x!;lsQDMtIZZ@*ݎPьLH' dFVA3Ke [k ]nBx5~]}Tc0UWv{T{ ,&ĖH@ER-H-) Up ]nvf)~6JV Z}HI-9wQ,n#Jݍ<0(YPBtD9gA38#enNTN]Gӫ ٺ7'$!"~l qa ,c!`# =dk&YB !VNt67_%mkd.蒿BX3|nErQ@q3, xH }"!>w:ul9^~킽yiyA΃!Mfp=%4,aLjx [ - !!1Heg~MHI%q1;*;:g2;-whӴa[*l-:QnJ^DlͲ?M)$UX 1ckX8c JitI3g8-4IYO/C+GLnyRzr^p%k:Ekl*-٠4+x[.`lMyS^pYK#B 8^r dC(Y -D^9ݻPa=bc,[\34I1FZƢ`އ ޲"5ѢU7Yk\eij 1jzE_2yDʕ869+Ƹm}HʣIAp;"4LN4_ $mduXED-pTPDk14ky3#O+>LeHk F!mt9ƌ+ t6{'ĝdeО<VBB:Jk6+PP"RX ,jÜc3!%BKS}Ĵ+)nB[&ިy1w{+U*!. -GwI%57$*&4J! MaN5r6z(Dx{n\39:qrI%dq+2RDm, V-LS. -ɗꩂA5GkAEފGp*rj;:vq"݋Xqؒp7 -JdKU&kH -tnڜD=%}_gnԲC2a!NGmܤ\743GcrveZ{vEԚ/H_{hf-?3,z:w?zI!%T6V#G?Z5Ņۿqe*:2glx`[^BHȞ<*fܽ] r> <$Tj8(j_WQ%i)Ect- (Oz^9qT‰/.B;r4=Xq06ifRi~M6xP沺ǫ{0e+)SP8%2߈C]'o(SRb)Dzh5|[z$/*A0;wD4$<} Oeڱ^㝣J1Z_k*Z;:Xl2zkʤ1-ΨQ)?9Z"@+eK2΅j$B ߪ`4X 8KϫUPEK $fHq5$t0s S-z~~"үen;egj뀤5ɷY hFHL%v ~=oqTl[>N)K3WM`0%ٌipjqCŽiBq1&2 7-&Gcj -|wC4$22ߪ9vLG.?Љ4 k_:SƐx2OoZ6ީrϺ_';Dm/9}!;BwTFa Ff\yYuR*[~D1Qgsqoe1j9 h,1Eb< It+/wzNJ#{G+ Rk-;`v(cp6~w'1&mrj/jdJg?Lotx^3]oa\χ ˯7ֲBBbjB0`B7|ۃFqza\#'Ow ޛhmީ<m}űT3-i^fj۹k>e>E3O{QUÕ}i f=/{^]X,q藔qŽS?Wnʉa*HᦎN|-m<=ӕ?m.+Ηz-jU/:gBrwtտӚpY$nu*I[(?s\CQZYx7-apWUPd劁}imC|w/J}|l2r8XB*U8m1Fp'ke3à% ia<|ĹԲwbg\~0a(nYJ+^0HN/Gp F  5m.Oo@w1voo؅1ݼM1t~;enn0Nxc,_uwX=0m6_^μ򷱇9率6gݩ/l >=1Tg6 a< \>Qol>H,ܴê[T^ׇ 1t Ad\wH_kY85U^vw<]}X -Suu:.j;2Z}3V|Ǫˎzp^.;5?#6[9ʫ;# s=\oS6Q .cyCoDȫd>$si*0x@P)P0_x- laLyUSD䴦7N֙nά?a73kz6sK\YL>˜_˓LZVT - Y0^f6bo[fo,#bܕϮ9?Ml<'[—2_a8*9WS~|$a쑹A Adf , -pɻ^ 9fdr\ƴ;~!a)Lå.!t,FB&iK\1}3•wb} $l1,jx8+KRq+0 gca*>פm,|Kc0X{ -m?3O8R+]_/?aFfwL˕G^g6V!|U9{0H-6ӈTWt~z-?+ -P)Ҫ7zvT̉8g#a -YcJ`fiNOyz~툻}.k7a>3>(r>m{=8Àke'øo;a"Β&]X] |v<~ ;o S_0NqpP O;xՐ:$NX41,~ kՊ$)VoWaN˻7\&_f\1-ö́"UyY7m&L ӄ<̄t 6~wMIOaz(5uV)7fނCMQw%7a3ʹk-r~t ݡ˜p6y[B#L;xlubzR  5mLkqMzxY2&y)# lD2>_`hQL?a!i|N`Le,&pm{ j.N4,oߋdQ}i #_B55MH`:ӗE =mOx,K[õVv.^PG/p#D>!/G8"k6=Yds$˴lp?pܔ5/^NImòR,?x$•Hj|pEcc r? yrQ y%KbmY?4n#[&_~* rI/}rdwT2e2 9&SqO˘*>pCC*N,1*5Y(˘W82[Ƽ4y Շ3/v]μ6xkCU=ys>yec1P`,zYˑFaȵ-zY9O)4[L^fH:fjzfCӫRy/z^{:`#5L%k{ڠ@G`[9Xb>:$; ՙCЯUEݺؘr1KŲ.U=[X0=Lsie31҄}&ܦ=Lmaէ(P˴bQ568LPpj)2z\zު~rCfCWhR9p041bŖ]@fj?n6XtyTBxFZVD(jz -z޿Za[C2,q-;Sӽ.Xw_ӯ+ryƾ4ԟƦ?,8PU?VME4T54f+Gڶ.O*qt ԗjӪ4fd^)lQH.𨨳ŧLROTJEc9%އW*JH/RzYII Ieǧ!E2Ų Ozۮ]e4z[[(D;R rV@w{(MP$&4 ml&3Ws6(OP<(-+ՙewb゚|H3>9=6 C~{ -3e:ܷ'r Yx*vIJi(e Q*HOџ(#Ԟ-zH)3J_.-i|, DķPa%7hX4÷|h![e \j^g,>`J-Z\%ŞR_k˶<2C|Xc"0˙#&\P*7X=0Wi_Vk^r%9U/Hv HZҟ֖{sak#f.#KDA{WsK+U0eVBcCU`TJÿmN -3ȮC;n{Q= ˂yuY"1xrM$Wlo:vuZo@i>聝&"U󇱣+տƎGjC%nxBp_4,tm;%KbHy;3#EWHa2sLr`_6%L3dDr/ʥ!໛Nc"5mpTtKm9etst? iPTk4$# ~ts4Qi!e9 -\j`(u?= mlwy9)O+G[c`)\ 6rt:Li䨶o8~ȑ˿1*"QO#G -L3-J Rz8z46/GP-!ڍ:{JQO%oVi8 FZAOGplye ^qQ AM)F+"{nF -xFZ5] 6V'7YRTxtoMi7p(ݍY~MFҙFY!~B"z7zu8TS~1y s1><i 7hCSuKm8]sah4rh%I{%Ŵ|ѡ,=ӘQQF5oPy31"ӉBәQ<'`ka.gF6Bç3#eѦ -TOF:iڰl7hGX%x}5#HDGOf^OQ!9{7kAaHa]C -VMbڣ0LF)7V1pmjrm4:d܀اk5oFś~-Fd<: F*ywپnc$&gݽ1>VýQf+-gFPi`]Ɩ$cS^*c&5AJK˼тk捊+U*n0: -:I/ƕd>K[wÏgƛ#o! 20`0` ms.P1?HEB4WlޞW(>LJV!0\J\C~މw~W(QᏈJBL`;3;D -m>\aUZZ>D0SɟW]@Z s֘wfz,ĔhL w?rE Y9tk :No?t\*t|=OĜq_5 H>qMcCϧI58˛+\%_WiDH)@rpKhٕ =`J{ kŨZQ{8Q DӅӒr{}߮xKPlᵩcGjmYmUiy2;Nw 2 49ʉ?;;QMf FoU@iZLJ~yթҶ>Or`x9HO - -E':mA*/t6@Zz1XsJ4\>mdrje"ǟ_=9e\f\(Ĭ_~!L"˲CXNz-Z[j! uR?e\eUgly~Ux#B$clW\ᦵ>\&Z}. u$ -}]S k}|˶SFi~=Пe~=G YCsY]uA/#+z/@X: r"r2>=d _m[T-iLe G%'4]tZ -uBloSOm˗0rxsUN0R0Jc~.(i81xe -=>xA]Vo {m>ԏoٗ?Ay'ʪhD.ݾ~8Cdt-Pʴl,mȴfAlex_vJLm5>[ߢ|IrU~㹄'j_VK*~XpVm Gi4KOI͊JMjtstK &IM/n(-__FHQQd!m/#ԯ͍(kcӨ\>ʨ\1`TX Ժ߹ỦoHi"2u7< -e=T$q8Ӧ!J -PA '[(c_M3&ӿy3*~ -1@u'Y.Ld˴r+{j%z9`Fq!Y6[G}c|V!I/%M$0xc -1pMcܳIlwZ*e&qm4S;&SVmAVh#Q#a&8jF)]0bzvj%qB`d48{W-㦨Q>!} -SvZ02.YMzZ_K|B2NǴգhV Z`0q!@PkjdBPd~ N酛Lά =}zR'N+ӵMޔ7]> :~X@uBvh+[s{J_݈^ǍipS^ٕM%nGiw:z\z;Qa7CgJ -޺E3-^ -NU4v;'VZEgYsePl$-~"XfΠ$ݺIPU#rR +8bԧh%ѣ$ 1rGʦqzPrLS\mT[ҘV|R`WazvCX<BsTayJSxߡz5IDt5.0ˮy Q[^mSK8&D>Df9(BwE'v&!hf7h@fa8 ΝAg %Ail ~ؕPqtqT')@jEQ! }\=#{tcZfIs!nSJv;/ݘU[8a?la9Y Ol]8āilեl] xdWH?|:N]xN&$֩Jӕ o}wMF+p/D^[[{vюT%Mz ]ףz _zx[8~N} ?q/,}x(rF!U˘Mx?BӥGύJ>yu!͸-՚/Ndax?Z>,@2Wk Ec]9G&|ީ"Oxur +!l=]O"uy7F3EBk qK|R&JUi^H|*_?n(LploD=|8p10Qb喹1Wx1]k;m]CR@?zW#711,C2눣H{))ecSHUTx< -L>{טX+kd V.\ 4{X3S۷[KHc1xě($㙌@Ex4Nj -m{GU,kpG |6DL,Rft,VXpٍMΨ-J$:;[\ӢCr vX'O[nS@սuAZ0uHvu O@$XOۘeSB&Wq -ɦ~Q9>)5K>̐2:>L5#"GL{@T߆qŮ&4ӻ vѼcDWѠأOTvouت= M|%1Jxa>z(Iż3ܲ_ Ya\>v]iqrkEӺe}]PT6|5f|Xֈy3 ĆuZDSf?GHر7D!!e\1=O;: u?V5GvD˩;CrD`z_S pI޶ظ Fڐ q*lu=JÌу zc|_P҂ meJ df p ~UIQlYPǏ{d}O덨g1SC>",?@S -Fez;:5wg9^9zlx"?q=m㕮,W4Zp hROxj7Əjgj&awTo# "1GnSkʏ=E";tęUI+_Rn pH(gH5Gn Vi@v=)@㭄F将`"1vtw*XcrЬWxIP/>厙":VLrtvS'2$$/F/3qߚ `3`f]ˍB2lr%'wd8'آlպmar\>&;mjxM[bwMDZA<ށ9ғU簖b6Y)N#!(ؖpIuח1.KESh>vtokLXpCˢα=.ZF'vT|8䖂'[ȹ__7%7:1B J4*Wwjԙɯsb5DZ5aejq3tH{< GpH*n̠g\٥E!SV3$)$WL -j,y;bc }8$Jg"fҹDpg0g:OM?*<C -tg5⤄G]N1<ƾm3ǁ}fyjRe2P3L$jh΋sƌu\Y;`ӥ$3Mr0- u8[9[|]||d=ʢWcQїÁHwAP:DVK=lJӷ̈́H03Si ;&pR~ǔ֨ZR #3,*#p#4r4ezT`ٹ@iHޤDSo%SȽoe uٝc|T1ຓjeXP;9Ѝ"Y=b U@1dAg^$HG -T9uSRq 2 D|{/4=HS:r?;}3fP%tML1FrνֈFm'*5Z|n=-m~:Pn'*ӡz)滫jԞH.ڠ9g͞* *c{v|R#2| LYs#Z8جY%75 )^DmORw; -P}N3iQr_G{ ՗ܑu֪3u%lμN5́dh.rnaBh"EXW9c}mb~@ -ﵺu'x;QM. ڹ]=c1IzJ&ϝ0I1\~C$qbX-2x"m1TgZDFs?JHM,`UV~&hcٸ/mZ$2"p!dȩ@[ 1޵};A`\YІxvn3de -&t6CN qhs8&=Kf0K^NQ1R(:Qs\HFۊrʼnzEtèŸA03'h&*O cصP5¸Gqavwy[Zu^6w-N/04Lnc$%H4VpDV,!V;/%̎1:X7lYtvBZ.EJ&dsEM +Ae~݀QAjAG*>ݞX^Ѳ?CVTyh9;0h"_?Y ƁY'ѕ1 t{&=;"FhD|z6~}lD=f1;׽Nz>g=~<ZGWuDy:3x&\.OF3t4vȭv[pYX 6BݯG U7Oओa_O Cƍ 'PgH5oo9" Mѭ{(pN{ٍ؁)#i䐅b( qc2SQ ) - -3Pk6zx{ @% S2e3N Beʘd) OAP$DO?:o_P;G;Bpe1yR:ecK Tr3fb4:+Q4pIb>2A\cC(;qBs0N2BTEՓ4qlv0kbbL6CoeQWdviG/R¨4'WBsjBnIqhqH]#P]lc;SDFV.v)> R8^ELx3AITwbm1ZWJ6Ac%1}>,@/^F Ga%Xfع 2b5@nEA职՟05˯(}gȏҭ8Uў#to pS5LXTa 09bm! [Y`^sr-yp$'=t*reDtZy`E%uȶ T}A<6<<54]FAYF͔ -Y)qw drnqh57 ij-/ROUn+xIUJQsuq"4(lJ:ɞs~IADHSP*W &9i~K] hi0Y -?;eF\ ShnZD:-3^Bo@dT {6O(};gVH81&9BK$LCB_M/NwŴ3ѕ +;k+z1P>cLJV ASPgw ~enhd}ߋTMHu"і%XV ѪdEJWq5'_ )s5V$c]fLm!R=Cz($h -}RtX1^6MH5RĊ"Fl"i41^y裈S pqO~3@S!ŗ12Ĥ3NKa XA”M9P>삪F^K;`EC_8ˎ^?"FPY[ԯy\{9Oa*!#QlR2t?{y}ݐL: c{R0?Y<b+)5^+Jv&v[Z{8NK?Ty+,H -vʯ4El0vnx5Hg:[uz@WG]W̴Yg=^4L(@vZjiU5DgDv -8+P/p' ~*LJY ?*v`+d75˷xꊈHiaAѿ`"aD\Azt@\>LJMIWTI8UȎ%ESH&=|se ΋tc#j>4JFw\sy5x{xw楠LDG"4B}cr{LA[}G&an, ̩LUDEc"GR48Ù7" lFv}J_{Y[ֳlH- qD h9 E qԛ x0-g OX{UഛrO~PIЃKR<)Z;rp[ ,ؠk,uu: ?TUbvLEEW*H SHUR?]lc/I; ;; -ڰscOQelޏp3Ԓ>)j7 (U9: }Ḷ\{ #L:gI5#!>&y7Wa IVj 2>@*͍-(V/p)5~DTQgBrmiVC:- #]5Ԫ@,ߴP7|v@>d`mzsCJjw@Zc`'*lri8Eq&,/43\Hkݠ1f-vR+N.X4 -#ś7 Tmfx -γ.Q[8.\BeIј׮=qP% ##bWbUmtԠ ƷCx;U ȗah -LܹQr;8%9MHe U6/_*">",x]jՑn79AeQ@5jO;GJ~?j Ih1jsFAա:^$mTR 12N$-t;(;?]HMٔ!l658Иҡ PSdRϮqdDMb:r @)OVib34t+0`[+z:y**mh4Vzg[BjR-՘!)T 1ԉUqr0 JH~ Q,.~۬>f@3^{l1$uttS\]zcxyŌm s@~H2sJa>jG4m* Jˌ漞Gq;;&*V,yko+fR1n7C_n׌Ǯ,M93`MCff-ZzSid1b0H@z̕*5)AOvk;a#!RGVGTUދ$AE[@P~oDHЩd!X6-Q53Q~֖&"hҿK`ƛtr71 b8ߡZɊp굁;pk;6'jC -`c=.6Z4Mc&?`k-o#F+od L[L%<>u|sZWlX+w{k uS]\'NGTHa*MW>CDΛ0M|i̪O2/\9,zLc }P<<Ms5J7%4)NVu"fMٟ"k[QtD$kv {#6XHPy}w>tl -[bP@ F dI qs5 ûwAxEIT++wz3K2Y."9Ri6 ]ݤ7)_^O=̰$$[+*]uAE609!"R,Qؐ$M -݌Cio VvBi\H+W0>!3Q`Et+D&SA%94#^`IXb(Nw(Wz>!3,Cy2b8RCZ`c 0^=t]ò))IƟ^jڎU9;Y;O.BzIL cx !S MEڋE|9۽k lx7X޼[^򽼦 `?Ralw =fTnƾT]VS\Bv鮒=E5UL9%>Zs5Sc Ju9sX.TOÏ9Z)Zlo -C R㾜_?5H^۬ktabpCkAKw5n(ZY'v|w`}0? PPa`}(2b;CC?-Z߅Hc턞40MmŷD܉J-KZ߭jM da] ,o&{w E\ayGj_r;|$]s_V/F -D%r6CZ(NpdA7V*d u/_{#-2_ QPG`˗_| -Npy7ok4t%rר$SzQS~{M; F&81$v?[vUv2삱۰)AQpŵZJ{Č$Va倪< n/JZB3=vT8 3liLJ238E=֬ L*(]~ ݜ[K=m  +W/^yy6f1׸#"zu/ -#JxsT~{0ɗ(zN."X/¸k@גS\شoV7*L@/,c{UO+S-;4JoJ^ >RbC7/D{WS c+if+&viF -e -Nҍ(kX#+^f.mRO,HxEPP -jvN٣QRqOGTSX^<pwɓI[e#1-MӃX]\BWE<"%T$A<[ \y{(DgAo>zb*Dg)#x-9ll,KǔZI2UTGu"1UփnÄEi"I\ChʽeYsQ8 " BQ@id\4]kY^O\ʴL5{Y+1$RAP-b{I9ʮa|Eni/*+Ľ;-g!+j] .wE_'Dkx\^"PʡT5ji8P'/('*Tȃ'(+[wEłG8n\CbMb N_dGʴNNuʖ:ɰ`*$^4fh"kGib@TL"J?5dz3S -@Sz=@o5y1%"`'ֻhF7Bx27c~TۇyL~n:DI6JCTӵfP[iR$5s( l<lgl1VM5-! -CbDz˥ Z-zbS&HEc%(HE|B.!gB A\O؛mKDf7AZhg&:>y`N3Eng (}K)|~G3fp=eww-@Jj%CړA'&L0#mn0HJ(тOX#3x(7L(P b%Ɍ0^܌zL]&h0Qw;}'6 .UՏRsFFÎz4nUW!5 vɀD4S(Ѡ_[]5P7^Y2EO;2MX(ڃ^ x|$ "ֵ0Gcd[4H~+ץRb-7fckfPp7aW3cL) VuyfԍpLɸ6@jq/乢6C9i@R'l׋&*U *oc 3]֠a -JY\,Gh&m=ZkI1UNE^# m:RL,:Xas܄".*q<s7 j1}?M; 잺F`j팇ךG aQ~[f2:͙Z7 1Vj?8+S- p)lde&HX>pФ a}+*!'K0 L غf' AQ7p]hx)]BtbYG8<ida];M"4\W1,lвwGElAaa3l4,WZg-/ -聙;= X=Lf}̩H̆uxk2n `)ֲ&%bؚ/lnB|h-\c??-.w@Ѧ!\čf!mH6̘$/,Z^V@G7A-rh#h mDjˮJa,:lo#{Auom6V =4c{p2i'SV/8e w$Q&$9^W<_Zf<5 -<-W%DhR#iܩp-,ݼqŢؓ??Ovh -h(2tQVoӲ2)(HCO Ni'b~!_6t|Q+ݚ,`jH֥ -5z|m6Qpude)UxHfŔ*mǀTwa+YGD)t=y!IҧEh~(l1gLʌҀ?~I $6^M[AY1吪9GRnNj {OaϺ)8U[M!*ȪɅ^V3- -+ B ef[MQ6T"sA0B5~@(.Lr#hDY-}m9t#v|tN)P%El)+,a &ΐ|erC.b {%Jvڃ$<#Z Sz6ûBR[NѭDq< Oh&7r. -"g3N/OɒoHbbfwjS)8w< -Y,UUN:ĺŐ_+X_MEY͋k 3_"·ޔp+g9zY#[#x M.YPPsXvW;فƬnU%Y C nyu>ijmT`^؅a1jV/HrKPH_ -2( -;uu0"a&.#:۩CCSZ)xa}:U/6TἚAז}@0lǫȴCRbNLX\kem#pnf]݌,02={05q1p(Oƍtt|hX/1 cȅu [|,;45[H4 GbAW fڅHʶ{ -= )K9Yur3ȫs/re?{[XzكeLNbG<9xrbt c]Fq[7,ᙰ&@ɪ# T`̐ թ9沮 PK6r@¿"$:0Rd}ϞhC%6T&Vi'c?7=A2 g22{=y|d>/-{y\P'sd;YTd^5M}}g`ʘ -+!َ^д 0TaCբȘ "AuVf\TPp/]~T5X`/˟~w?|o~Ƿ?ӷ~6w?}o׏ܢӛ^:ُ}#cH; ҆oS(!JM3Dݵg?Q!W;ͨz3yvsD'97a81A 2$s& =^A6N@ -Q$*Uāw{6NT -endstream endobj 88 0 obj <>stream -vA8zzǍx*G+k -!(mZGֻwd80Mx1lb8ZP>;NZdD+D[Jy㡛T1šY"ydFYY7OF͖W| -}G_>n2c |.Kr"{2$.K$DU !Q`&#vM{5CÙR5R~ oٳ(YQ*YF-߽RCDv?[z.]қ,:u?H&o(} jWOa(ʟU&ND|Myl3QPoOJ)YvaF).,j{ϱ`C۠T~ a9quk."ؚKƜV{zp֊ -zuLXk]Zբz AAm}wlq@֖S4n)[F8$הzA?(U;V-3JC.gp9N^6[|ڊڊm#9ZE"Y 5R4K͊= ҎU %'9İ\GE%,zTIBCRᎳz,z؅ݞ2ē_ԅú%\H2/9Ю>V -Tj)n7[+Y0b*ie-Xg#$ -c"`iy7+qug5X a3-R$<@ \$aʬ}:pIX9,:2>pQ*1ZR+C 2`t%7oo@.F)񐐖}L`K]x8Ekޅwk~$?̪T-j!_ߪ,af YjS^ޒqSi̬YSoIH lkVט+sPPЎ" id2g5_u.X­SCE5ܽ>b,B?oYP9[+N6_޷> P3#~0;\`gXCo4B[xVX8yKnt`aʦyʈ2GVpH/[[)Urȝbj϶$H-, ڣD`[oo٥~t?Zk|`?B|:(ՆW+1,R5gFz簱DVj9E+x{EA p߭s!#y'r,'΁kP)oݛ*Yq[mvNˁ#a&4nI+Fj7cE_ MJ>!Dv#w?:nX$H%层ZPΦs)#up-^haƵ)J$ -("?} -,"1!Bj *(ʐM28O3Ti#mRL. Պ9Pj}CgT Ȑc!n$gjML{'9MNʉ[ݪ:,[hoEQLyKh-{u^M&?OJ]kOW"ʝs#Wj(#6R\# -".}Rhx[&q5a( PQfM7AV_Z`4R4kP$HǴdqua0*%V.OטBƻ둤z@ǃ)Ж'Vz9)ߎmPVtT)$vt]HΎbm?601 {] ;aG1:{OS^͟ }Z:@ {vPPEi.['XЫv l3*Rl$1uk#w/v[%kBW}֊ kJ~RK #ɽQ -|9ڮAuQogZ]f89KAYW?+> њ&G^-j-xOG|N%BKz< x'&}Ԕ>4}tF{UpPVm6HvI#e,;^9D~$}e76Mho9oV>fè=CZN8[3'V]yX{S_(YMA)>IƆ'e[4j:;3>c wTS;հ#jPFw5Fʹ^ov'Jd~c*#"7<3f!+&fT%F5pez##pgSz'Tprص)=X"\-h֔q xGș[(ѕ?h)XU u={vXk!j빰6)Iؒ I ՋN=ݮ0_Yڸ+o,cPTG]foLܯZ6eMD\Ÿ9dȟv9%;PUGP_D.39ZY 3Աv2U&wikb6l^+Mx`` e1$5xMAa 4g a%} mHDu]pp,Se;T?ėʂ 2aZ :NMV+<"SS6:UHYKRi}s~ʳ}Ēۑۤ&@aqVWGȭ_fCGgn=<#Шk(g()% ^*G"S/ΊBzaaeDV`t\Te1 !kҩYI7b>$;[9lȡ ~-nGrbtPD2C&@!(J0ƱLN!E}mYl(ѸT| `uZ`-_J{U21əm^%nTK@.~&!\cE8POI(nBkn6!ϣt$fP{$1!#*+QSK*WpޒE]HhAUn۟Iُ n#h.KmB4CecKʅXPkg#<.nIb!~XQh#I7)O - `%|)pm\t֪yN+ |D+l״M> -e.QʎFQŰ,`Dm+E1&57RQi.y'zV뱁xvM*2Q^R/u.!d,ʥfwu{WSD Bt qGr1!Xx+>{z]Y!9kYg~^Wtدv Kr@%qgg8(07$c".wIQ!d͕#\DfRm706YϺ. !6Yy*BLƐA#QhC:mՎy H/9*F$~SPXE;/|ٹ0].6RquqDvTR#G7tsNb̶oxgnV1sU/`6WzVfXza;P48]suRTQ`uV{e] [/ʀЅ|zF xلY;gzTkVadɉNhf:zji<k$!:CG6aBՠYٽ*ttmZ{/.D|trx7YivOi79!ӔH\"JBU֬~ Az"S&KZY)9VB711qP9[tMEW#EF,# ]#d蕣Mul3I|i< P k -v2^ɀ[2B/0my;ج铚ב#oSa2;Z %oIg88yn~όcJ)C3Yٷ?ևe H+xBboc$\n݊JMY$DUߟN"޺:6lXMaM5` $菈~WgW.gySYxC@Aܔ7t~AfF(ź>tr݊h9OCLz˙PhƧYe2-/دx8J),g`sق *6vF|a}>\0䥎(CھqT!X({! |tu?鸛7Њwش^mw ܐ- ;C)1c9۲q?}#u=$T#`BݏP_q*H>FclHUO~ -o ʁdp U7,\s/~JÁtPIO(TNGP3$J$hnCJzQ%s*z؛HOů -^'Pr{f&*f(& R9] \ DzY_ن1~OPwMy`M(LKՃD}!QZ -5#GJ(`uZÚwhȇk #K)*=ր Nvܤ͢|&i:GW$rǾeթvje:a/kBK%Ct~H֣8^uqyePq%Lu y{8 -oc>i ΊZ=CzrBt5Idzᰄ\ԗVʻt4?}߹ wQy^I"у5.mD/շ=!WD/`oz& 15]%E -Amh&5GnmO .V[x Id%k@b {1_A`,^Qla^Sn-D -]kZɚF#nMl'U C>|9Dg'IvN ͳ\ j";)AVp(X]$ ;ftvϼs:nP'Pg4̌KqDKaWr/Fra_H{H&B 6]\x^<\!8 qq#km=YגߨCh C% í[IbBf7W|k;MUO[pi7e%u .A;[3 {5B~tg"ꋟO&գ,z}2ډ ItNEfZ ?D 0k*MIs%FX/ʕ+Ʋ)kݥOJS}UXxwwDα$^>U7 _z"Z֍LX[1@! )s cx%t{}PbBp^i]^Qs\-JXXCK?z01kT(l҈m*u(Oĸli!:&Ќf6bkelsE g q0m"ʖۓ8cw "$+JʥK~K0Sꁏ!SDcP5KvZZ=܅FЈF ^ JG ОYNp~/?[}TPZ97`{cLfx ]Vb֨FpR8]h%`79k -Yv KlLW֊ip(rOĉ$7JtLrdW %d :oL)1lgJrqJhśesV$pkgZNRZԮ+ WV EfcjvxkGMB$^=FuY{tAP\Sutf5\6q@W˵Ih+Mzxۨ6tɪB ,k4B10lRZ|D`Y^HN"mJRCJH - PmYLHhM@g p"KBn?!dᆬ6X?B=CI]O4ecSw@@k0VXtMKPдGĊB(&ðPaelaYDux(&a:Oҵom6 -J"5;%KZ|Ǘ,"18ީU,CUfkB%KfJfQUDN;WC\ V8}S@vܟT)HPUqJ%`uE$fǼB3hIYA&IKa~yYAq-A,uݛ^BWA:ao tXtVrMKc s-V{.j)ls8:OO.)OҐ+a ART]ຓ$?|sFVƶh>:R$D؈6)&zw, 9B^dZWlXO/ސ6g~EQK#(R(^I68܂#džVden/` y -jJZZى*MrufDo(`l?[0x dwP¨vY7=SkrJ1RabT2,QvTq@{MZub4vka \/zG~Zڀw7{bo\oY뤮FRQ-T+$%@IN9N*ޡsV6Bm85񬙒[)U%inh~n4I$mH5dަ)P=XsJEnoc @'v1Rv|:KCr/>fXr?/Ӿ*D;5T6n͔ -lnDǶs%6 P!U #zHR ]&sWSM\jJcR%bcZ~Ikd4C8@}fp:tA1(7^r5&{ikbgcP,0kNnxݩMdE - l ûFd -YLiap4ź kJXki -gCP4OW{ h #o O܏E@3z|LwZZ~@aB@^/յ3;Z3\ P5HV0\WPN7S٤ȕ-ǁ٭[vK(F3BwZvntf0$/RsObn=vf/\P:Ӟ%s yӂeń{I9}8 -$ >1:D`jv?CHG\JZ ՠ ℭ@&HN:st0@]!qy`=ތoƚen.=a=qrW ]/~q4p/A؉aX(Fi^Jf]5$>92XD:ye'( sT\YnJFaV :=X,8!ޱMKZk|,[s_-]>̦BfХY_w -h~'wgsoO1ėYޜ4D^-`EF狓 #(od% ?CW^;Ƽr:luVkߴp+:U>k,_㿼_oOo/÷_~߾~?׷?p?N/?͏?/ ?o~zw7k}/sfo?}Ͽ?\E_\?sC@ __c54?ei_}]WrO?VǦ_g?~6O?(g^fu_o^|1:be=ioaR~~kᳳbADyZ[/j4ͷ9&Օf%VEF [z++:W5tX!<_0?7!Fxrc'-Kq t{e/V/:}2kIT܈S.a d?F=F^7&(d;/#ls׾+=܎;(M.vA&/嗿8EoD\Vu ho+xx{_G*ݎ,zxִz!:8Y߃g}b4_}ϧJH,a9VI:99~֪}rۣAhB6oZ.q{M 7g*jyVFxUqQʽ}9vU!F|]]4Cf4mѳ}KT#{6!G/hShݶgṧwT}=1xw'H1ucr_<%e=7w{ ,-GA2E#~UMuw-:_1{1]-xO~w͓ULjxһ]qܸ?ֈ>i۫ɗxfeki6ODFc{FuuB=b߁eqHz>=O #ysesxN zOOVaQz<[<vrƲ/:P*RQAdgO4vGLrc4sxEUbo il;hk19ڭ|S%)~yrBz>gm)`T{fYv}=q/{}׸b|F9CxxjjO@F/Qghxun_Ys뚸<*4>d@fQkwa}h t4/\4u-knLɼzݝAP4a7DT%vN_,';u=y_E -$3fcW>uZ~{ݍ+fUF6b=h bdINAdgsi|; -rփ{7JyFIQ;:``;ww=4WL!BV'Vfbݴ?6gw:y9SjK3U^32Υ˓>Mgyh?Fѵ} -g{}Fɷ(/{=uƫ_p] Q~kCe v˚h=,G~ktVR+&N#%y}RB< -/R;QB;0ğ#5mcī?ּ#gQ4Fodgh2#Eiz{ƼJA7^{~q*#-nfc3ΌBܘrxE$?$d̘Ϝߟymw u& X~ޝkҫԅFٞP# qH*nn@.`ۗ8w\[ "|{L |Upv 4V@:~#\~kSL%1 @k3FbVYdu('?cyFsnl{~Ӌjs߷0 r#'db č{q,R|gJn߁;+dƈ9D]9]-krp=s? =#Njv})D+Jug]T ˵߿; pv/745OߑsaG')#4W_'& zBdW0dl%lǒܯhni茀˧rFܱw M6;t. ;]_h_{`d}Zn/;_vJDUr O4yJqgbq,=+S=>\p"yS 7={ `$|_O*e/$Xv=ბmQ5ٍFV5+`tQeHmJ]pµ7tNy)z;$F{09j9~%np$'j`ߓ\ξ FPϿ[~=?/3ĎDcn{[vFʞvsve}>[T֑px;]5`Ku*j П_"{4OBCjoijXO-@K#"PBts+[m(㙌`wx6)Ȉx_X,IZ t\.csQQ4{#A{ɴzIGqc2*SbTh| ,.ɲh9{izf23S͖f2jc,J%r$RtܻKbm&1ql@O!AuWuvk?YO,-/#<8RO('Os{O=%&+C7^gU}㮃O/ϧK-~BЍcNώhneWeDঠBy|il;10칲qsxb 8ɕ@v]d}:R M3fB.} ,gƽw:#l‹LJ АI c0lj~:ɭ_k %4KU3Ǜ[=)cUts8x}7'hA{K7$.vڟUn/ mqڹ-Q,\ZxU-ayZpxmظ&;5;qcj^e7S\JD<| %0q< - X[kyIrOC}dƳŴHYdF{xbT5e jvٟ'DI㥼bGxeWRKcw~ͫYϯ!z~~'h}`9;)3<xQB[Pct' %;X7MHY :3"'7},F鸱S3nJex꬗AaҘ卯m'N~򏺍[Otϔ:r M#K'L"NsXϜfV"Wؐ{n͟j#,\>!Uր#D<䳽wLu3;#f7ueW<Lfؿ ֛wƗY2B\W}ҕwc=Qrlz)V,s;'a藵?:Mh(b `5>ʞ7 -{pal_d4^BƳnp]D'TS1^x|l7 5GAcp  =3ov^|:p>{yj+@[SMG oGsjZNYojDN9܋Ss -_02֐J' J s+}-Ϡ"{?@{Y:|~O2SњBTwR"2g3;n>w[sQ -J .9yCF=gj%FJw ޞAuv^8N`B_:a{T9ΗS/ZS|,Q2اj&-ԗe+T=Zx=/;T7cck&CV;rjf8ߓpIN֟{g+;սn8rNj; R[~aksQ {T%P9!P?wOiuX?۾\9ǎd_ڦ>VYޯO RjhlqzsCu_eǚ;N_=qmƮi}"{#]oI+|rf)G)es$X Ӯ'f׹/ub>zcoqԓ=(G:o|[gf2B:T97G㽧V&=diluFH{C"G z/)7\{"Jx|kh,gur9PlsQwgx?I]\άbz m\wWWp^:g'8ϰi>I PcŦ'*wu~n܋ITkv I|zdC6! ɔpSĵ(ϱ?ڼs/_~Rc !,q,r>C\Ф1/yO >yç91xM߽y0ʓ'|=9Ig}*GnƏ$5彘405=U9I8Iq;ﳶ!ݱFinzeI,~gutN{IH+%ǟ=P|"<n#HzoNQN8]!`FUEl6_-=7ƾ_ˠ$PعҦm>#mpP;XfS`Zt~aFrZgv67 I=Nõ_YwcLzm= }Om/4v#6R3 a >Smk)Zm}Q ^GU?#Z yp/h0<=/v'rg֟խ1>7! fƽK^>cl<#)dEpIhleVY*\8srNr絣ڜ0v+s˵ԧ'3_2l7^=“¦﵇ˈ:c_IfRc&GN!<8K0=I Wd$8;vc/#ʇqwczi%j;iwH\[M>W -%$O'}Xj'Dۍx^~%(!E~}}j#G +9?ƾ4m4 vc9:T6!#>`LAL1֨ QFTHY3<ld& ,EkkRZ\HaSs 1o/˃@vޤLmS)YH7ȾRAqbrNVHWJۣ \[N.jC͕Wa)zaЭT {4&R,¸WJ)x4|c3NPc DX3% -cə#VT4$QJJK:FLK!ŦR;6iv)E'hM"6#=/EBH(i`i?ԃֿh{FF3KOS )  0<&PH"0U5IRJ&$mPHXL` -W i4Vh̀v7 -9jLB -3)D"פ RO|<>VhyB)R4h -^!(|&hb,ZM4W8*808Л¢WM? RV&>QXh24 -)T%,Z4A[bR_t`lV2tfڷWMћ!Zj]@RYSnBUXSsGӨpѝЃBZs7K)H[^Lf$u fR'diz ^f̤p8fMLeZ 6lhčZx68E\/n2ō|f@8Dҩ`w,ͤT|حBQB)]ph i C-ziC\`خ%0f?R!kRR!#2] -M=4TKR.Kpƈf!n:UHrbz.XRYȐ\"BN*l,Ov[)125R!J#m6fAN H^H-ג^[MzL4C4%`ϽOA[uY+D^-x'&ɿ-,4o ean BhG\ڡ*J~j"`3hf$V\r הzVhD!Փx+]AQ -3*Y*So-{ Ђhi2RLKg9 -C4W1 -vq5lAs$ZK "yr&iׄUpml' ͥHֱubr|5`--sd]p$ RLssb3e*XhBICjb_rj48IW\SLx3i@zE\sخu),3(Zb\F*kd)&Q\Rr[J],zTQhfRIy̤-}SILq}^ɚJh$4ds|BEo&l!U>Bhѱ %E,j1rMMHGx[iQnȤ١QNQ$W!e\KM5' îfdilAô42.VJk*֤2T R"k-z -[#-UzmNp&"1~WJθW%TH`[Jlca,akLځn"FR-S գ,%%Ӓ7xZ]k04(iOIgYJ_8Yj{010x -5h"ne󠒘up\M<-ϫ>K+ 5b5EpVwK^*:hJKKQa*]o1vd"b^Qi$؃K>bY 5u`$0-R^,fdOՍ܈PKm2s)Pi$UyӤ@{FZ#%$AM^*M[\Dn3Sy"z{44ZHGwhpAiÎ\Rʋ3 CNЖg76Z$B+xRB J@%Fj"Z:Wi&R̐J4Иjc^E% -'IR[D*B&i -i.j&!7R-ڥr;: .XڸLtWQ{j@qX 3IxxWL49 X0MJ$ЮEM -A@` -Qd4 -cA6T"eכc"1M`HfVԅؕ!j~3B#,Kh'YF&ƚ'M5'\xT|sCw' -; ΝǍR~-O -viP٠J6@iq66f -f}g`b*K,-znfF-c*`, -s`=GM̤5bM'(%ɵv01 - -54E -R43ǃ4PI -+[Hwp^,As:PD+Ha"m'}BmEUP+LT\{+d= -kv -4a'][NUXDH=hK -acvCt$EAh*{ oIq8$VCQ*015i=Raᐊ kqgxfnzS)Ҏf3rTdK&B^ʚ2@I`)-$BYEa=4E*Q(f)2դR]En45,hsc-ZYK8A 3RKΪD9Rvcm&saLFST´WjLM(3M7 IvN,%\vKmI<+z5УW%T\RM -cr@QTHۥ f* f*VlWHElMϢWI \|XX.XtRB3myw5SmI?qy2j)S߿jHUF_4Z4mBZ } %uvGrn-1\-ݦb]_@dG(W"F6hAcb9r[smb#Q/&b b~"sKAKK+`p62F/sB5 %H%3݃T$7X\*@ `IIfr8h5Wjҕc\8H:@2?8NLv7h,:!0!+"v cv2վşHt~mBNz4]KRz_l$(2n\[T_m_Ԛu FkC7k{ oU;3V]AC\i_h؛.! ךZHHt*Y8D:$ߪMHID[LޫZX: &b񇿪c!|H&qɖvX -H⼒_*Khk/)BF=>e-n&jAv -q>RbI+5\O8O|v MyPL.Wc#L k[TH,}M59ý+U -?^,zմ0LU xO="ЬWY\c"-k$U!XcF*-#ji.L?TBbU??4PAZ+xstR,i7bFQh;>߾}2fڇJJ -XBZb픿zڂyS KgzJ5¤ ^獙jyc9UʹG>;ki)BtN)NUH'+*$Z+ǝK/ԫ"Z]iOg>fihlR@L0R%KiWȑ|fBHT{Q0n R肱T(gm̵9sPR.Y5bLYCõf$b!5(iX_z%/7 -CStk!2z9;}eh*77W 6VZMʖ/]'[wcCgAZgsun}Vad+ɬְ2;G{[\?[l_[L_;P}.@gbkoVVe >::+(ٲŶU+ldi co䯫M2PzXF꯱s ft읃):{[{O;-CSAk:kli>[D_nc >2o:*:v2_1 Gyc|rAC񃸠\R$>f2[:֐OE|Xt-]=6`<"sE㹂F|b!45}O+r7)'6MbJDZp}xh#?W1u3 Fd҇} >JBG:PXא~K>З GU]tTLKg2!} @}-X@cK{ S(t앎} }(о7zH.`,}6i -ߖC:賾IglGcas:32$}\ڋGţHF];'?]?~U>ŗDd҆1+$T}F \BriCYA0o.A;ذn:65dYۺsƆ\=wcBrdkV)e6=뫫DC81E^kC˖/[+GПL3Pyf(71>:J>N2KNc^fyPAmt1%+e8:Ee6 S-c][ZfrDrCx;ꑼޗJbC҇9Ma)gaËFqfC.r7 ->z= - @xj?C;UMXLp d> d U'7|Χ5N 2Y2^3 ȇs}!*g?=)H_⯯R{F}ɺwdh:r"S: NºŢu>K7NG1>GP_+?9 dpߨG~Cp$|/1o@/K%4Lf3[s31lP0'e&1tL&{L6k 574?_@60m(; Ay#Be<Ŕc_ՓlȂѠ{9hK1/KnN@Cp,oH/#l``s?yth9&s4maqiYS ٔ/änס5P;Q |Ql@ &v"@zMo~NcSZ>g3Qţid@ '΀C_3MFebDz!ICa}h@a#Y 5KG3@>~>[:jjtSRHWuk2%tt@Gݬt%\}k2[EtKz½jdˑo X[LX(6j 㗌9w(: x%}lpk%'[lL~C8DcCzu vt!;l`PЍW+f7h3'7 \b$+Fi\X(6z:m .m 7.r4N7OC`ty:o.&.s,E|X (7}б[0A\Th6(g8Q< /zl3&sm3md$Kq՟x0CiС, cМNSss3&dFl&G83;_? -c&Q@x$wmӰ,fN .ۧ1I>G kt F2Ce ҆`Q> -_3TkiA*'4*_s|0n!`2Ih!} * &"Gz4@Ek!݈6L꫖Tщd3*6p9GgC.lJ=Fa c-` cڊj8=xE2k_h=rUL]zreܐ]s&U~ڄE:d.IX٘0Ŏe: -+0{% :ݓA.XHΰ ,l!idI4_mS dߑ> }b<0bq@4qa!_*d4=t*+.c[:8-ƇL`觫t ] Ag/l)>vȖ[s'*-cC17c{ -#Yw+&s,:(s(d1p$s:K:s*z[1*ME?8t ӷ<!R T@`GD_;`R!'S#0? . -X_ c7d -Fo~E5v/3rh~UwRwM&6N: tj4[!N0t [CA>'G6&_cg}a}=1ex*d pXl eЎ0 -=. 2 zF!~ )LZl -]7lSUu,&MÄbR|N!Yv)Xt чu$\! B@sD"ѡ˪0׃ƏF6D$׈ǔ{H>頼a?O4lH%*c%.g#x!X? <#6al96HNstS)]=t ַZ@ܞ @4D|Ɣc uv5| _@kx:ӟq~놲㦠9}:Y[Uo=W8Ntrߖ7zGS1?B>/v & nṀJta rQ#0)C)xXS+ 0R_aS/~ed(@"pzhkBm Hg#[< -it ְYlJΘR/V[-ef`lӇ< JLcdpNׄwTt%2Q0LR2qAl⭆qtHGuWqӆ `lb|~"z̻1B3B:%C{'ަN&v2R?5_x-462[ƹGKffo|$.~ -XrQcHoКbcx[Le>s6{LR -1ҙSA`k Ϩ~*Ϙ~ldXde )S=!ݟMbHV_$;<$L'P udUyݒiX\t+RMR|gLfCч9%]p|>UqjR uk -r~;o9bDr~'C[H6 8]D:ck?oe;Vn ah}S:g&0kdpa_Sv3dgk<aДaظ lpP?v0YUwBzַȘ 6e ~``:GzhO|HY;fcT|  ܗ__R@| J q>TQ CX_ -u&s7-sO|/~ t# |xO6}TN43*EG 5TX0: KttJ̟w#6C&30_`'_MQTrdLtx쨑Be%s:}Th ټsZ a-}'b1{SŇ3d6MlO#.|oe5SesY8r>u -:I 5R%:@sX t``T@P6FCa#ҹ`/rG$Nga*PnLT8XS鍅B0^ ~zce|#} >2%^X37 |=f k2: #ҏ ɀqb:lQ~܈t-{h{NkE؏vO:!  *vA<:p,sMqHЬ|lgW9dWT?2$a#C->8<ИLb2ۧ#<847ě8]s3yN$j.YPE?,L #<"|Oh~ɍS 檺Tif7"s&a!i%M2N#k+B+ͦ|lJ>ҥSK؆KٌcQ5^ȮQvUhNU5ƷQ5caΈf [>.k}ј_ּo[h%5MA< &r`Pzcפ}A1KhL6ĕ-邓Ɇ!nF}Otсl/8*` _zp_Cr␸y*P5u'ב}m0_!LζYLƖ/ h[{6̞.jeEK2w  n s`m3p~I6d |<0G9;gsIY 0_g2̀g||'Ez*>.LU!lNzfC.8zߨv ~$LLL8^ 㛧uƮ~O@H٦0^,!j?}ج3T wQ]reMs0YC?e&`Uyтj5ȦeGM'Ǧ5.`-ؐ?b5b4t9?5Nl7$B|TKj1y~ +?4Pq48ޝT #!z t19m#IT~׏Ykll8)|Na}̫Nk*E"~+[tҔO9E؅)DLi -*6o5UrxS\#sdQ{Ӓ,8%8 U8uF:|?]17wjbӳⶀw@:Շ\ c5\ޭr|:D``3%њ'm,R'N>ޗ 80U{6|јu׾Vv/Vݰop.m^rZD\ݞpC;) vޚٮe|½@/}3;ļ?u0|X,{oDf* a\*O+|i %hqY‘CKg`[ |IU6~@Mn z*} wLPAngH>!=m J>Ju.CF|χ$9J&8&}[0t7B6pܨr@=?w.#ck;!GrUEddrIJly )8O~9Jǂ=JykEhnGcmc-[Fx9> ܏zіY-jlɷdkQ2{"Y=A6<$İ0" B{C/GpB0]zXNo}`B<6PHg6Oc[n><&[PV)mS`;gj"wʔfI3[Y [P gmŧ}8TXCJGU~2rGsҗt%X/w!&4-?p~>-Sɲftܖ*dX"hȧ穳rlҕ+meִ$.$ / >,{O1/Q#/4;|}%UzΌC #Gr$TM^j-jJ\Aq|# 8w~Wp>nW{>S19|kh={&[=\(fe=.h4s: t+ChݰU-ҳfCO𿳐st -8ycFnkfK_W vLӭetis T}+:wL]|QC<7ԭTiT)cwLK+5njK":mx~J*dߐup6M -v瓋'blSk.Sr”%=H\an-/%o,3Yzb7l\D6m UFTơdXGMS9;f @ -]}"~cLBqU93{9{Y}#uj|Ft>`I~[qP~pwWpvd c>}t315q#ӇgS;:1]^rƎ\Mז-wTgS]+KLR&cF?Ǣ9Ej EUՈ"|H[sss%Y|^cB^SC,8:" bbX dTDX*(e0pMK8? ℆I -rӣ VZ-[+V2;wd繍`GNC~p^1R:lAn 9%9Ąa F 4+::ǀ7 )C3io=2U>qtyO{:W yy{f 7@eC>ĩ !Q@d9ٻafO sd=^z# -Z>|cR'L1fY|NJI([.9 -SA!`cݭg¤bWΙ8>Y$S{@JBDV8UtxINI?JWNUw͂5 9tX(:&C's7ҝ #"Ϙ*O˱$}䋀=8;5s{gñ GfѢ#F&tsnB2^9 clA98?v -ұjfjZHg3#-ڹZ< -+ _M }j*гE")=e -碶 ?ќl}Lh)B-S͆gU K&ڀ|=bU˖@a䋠>2p, > !+ΛV+:,ᄳ'Ε"Įa3{g1 \T850ǁbK/D\cQ7;e 핆?8G3rQt;oO|ƪq*Ⱦ*ȥKD'6OU7,`-BױG:p11t\xKN5cP1l*~fA;>,iA~`VkuHiR fbilY\ytysYE'wK/% A^&dKDruw`.dDկɲc8㝷y: BL3NkgDSf8n>(q~pQ%M`dy eil jC6{li͆O&gll>_l\HelIE_Tuw,֓[_"~|9pkdACcSyiۦe.9@7=^JxhC: CxmqlbӫET53GЏJ\4!+FQ _,a[ wFb_—Gޫs*y -A8'tp!#NȃӐN5;4[U 5f*d88L>EU~D*r;~Y<:g?n m֨>-#_Nyirع:Z_/8]=8w$0;'oZn6]ck.-C -G$~ ewAl9't۳T5TTӓ%7YZϗ+7u}t @[.B5v/Bbv={|}AO:}t򪹪k kel}ԽD[xForrMlzrGmv ʾwʺ_[Ax^zD_x˝v>胮u8{.*P#}E_ŗTv?-$΀e*rʶNj+ٓP,[˘z+%Us+6jzDY~ш l^pඋþd/+Ȣ FlڡYl qL+`5/A9PC*)c Er߆my|PTƁ?#&ۦO/9г\yJ̯ߝs)=cW2G[o}`7's:SocY;;G};r*k=_üERq[m''++:&Oc ;pH:)i3fH޾8GjSkj;[>O<Μ~xJmW VXD|jGBQhU[іޖ$>b mGj{ߨ6\>@樢@.A-/V0 ^˴?\Awb֎ĦEBBlj%?,#]MzNZbuޏ7HSy==!ܑ GNyc?ُ rTa?ߎqr}ԶuTltYSخ |D3^w+h 6H7>YjW9DO7b.DOgr`Qs|cdZضW魯¦*YgWiDl5R+Ym[.УVpݽ|݋,U~Dۏ)_W -]^(z{},WAONoq}]y>0Wpt:|wÙNGpUm?/W6<^}ÃFEܵGQotsa]5MrdJr#;P#{r?֪$S30g_zQ'ިɣoiSg/'W;wګO?<3CDx??޾C|D{$?V5=Vis>w9T5ϗ2mGo|f>=/m1{N''b/V}ѻCOUG_j/WA՗~ԭgĩu%8%*~[jy?xFG^ɃKJw;ۗ8t;v'ι jw?{?w3>܍$|ssm}}v5v{g[[wɃtEwؗY,UgYv_k)oI>|xSH5,t˕A}þ;N'}Zu%Myƞ{ǝ;ؓjoTGQgqnŰ&ng9Tl_ /ֺ=S;=^ xH_}@wMt|u*'[jC4Ԇޫ l~^luw#X.x$u -l!6]ēSl?S?x8>XlӽOT<=NNsAFn:lϹCPdOcH͞48< vM:mCh~xl[A.~# 3I{5i9r@]_pptX&ۯ%V쿖PjJws -'w wy./TRGYKRk* rϫwǞ{2Uvew+OJq{~:7wJG6\G]y<(O"ˏ}[CzP/'œ8V޽c{o+[ش\ ןYc/G[k6LRבUQ`5̧'y쯏\^lzwaK?[s#;~%}K `Wls<♝xrz_7=o}GT]6'}\ɝypz2V\/ lhHߘz/NRMM+'N.'=,n|UU0j띄]Vd̩̻Sw+2AuՆGׯSk}3 wø=$ؙۖc'Eo-M}w7W~߼㟞ct -떗f6[>~^~JW+Gc+/6Rמ ɵvP۟ev7doc^O6tl,I[vz֛{ŖQ|3ҝKuDݾQtȒkbJ_+z=zvÖjw?;r_+Wc=vjOyòGo`}Ym{AR~%C7]̋Gg{ܧOOsﮕ8]N=zkTuLݝ"w˓; -dm -nd%R뫓/պ]nj;EQCgD"O܉);ݦIo$U6LLWtzcSrḿ,wKgBw+)/;=R^ P_j}kRrG:C&ٙ︗w+wSMN/3g{vʾ၅r+coX39F7.<[J˃"W**%TKiĿZD?|_]JW~}ܚ{Ėgز<S~JB͉+ŗ\Oz(yڕ{'9ėv/0y7F $׹97sRn$)iZw3|:{/ -nd\J|)2~[Y^و]Ygc:eoзoMEw-xwۋCUÛQ)<]w6L,SvaDɦqUUJyi|~ S)ݱ¸;e5y뮥TlZs*ASE*r ίN;g|.ĮaNu"m_w{}ޜpy}4KoԛWw -ܟt~{imwhjms65~5[{lq7umo%޼~3nr ^anͻ~]C/= Fv'Mpk+fYI\ w;lGV4Wlz#&fv34;0akc5ΧTP5w7K_r{y:qSM >Oڪ ?c^u"yj'55k3s?R5>X-pWz۽m#[-Wˑ+u)Wza3Wc]H{1 }7ń͗S\_ R)ל[5/Ǘ[ҎtֵۑE ->%RV+1a;zB_0RWxFWv7gÅrw ]sg¡+=u9|kKd_}'3\"36_,32V6|ZPgy̱{=+&_/)|&r׏s*kfWO-/>W_g[ u[O \TW|=~W+#Pu3p}翼>-|+ o':#J>(4ìu?YG[}9P6Uollll31DlgeK\JuWߐ'&ƣ뎑 L6NP6 Meg/˖dT0B\qa.ryJ/^+=w=帲ƛUUk2o5$.o^iryҫU/W==|&)+BT|lz篊9*uغc_6C2:U/NN*y^‘!Q>]3aSФI~h[ -Zwg+f훷)kO4EtdPѦb`hSO5>|B޶;}1܆΋EY?XՀ{}Wx 3-cjsS}.g6ְD#Lq?cd}d5Ԝ 4,4XWr ^qK=roU7)p*zlcNb[ىw`zZf')u{qΙW!̭۩˼holMfç1 X{dnCFɈyd\d7>;SG4yA( إ/؈^ -WQ ١SE ۰{~酢\z{pǛyy{/mmw9c>S̴i$E[`[2ִAf!cD3M[Zu-ԗU6I_n>SW%-W5߼|R޶[7^it)܆ ؞7^/w~!8Θ?nvl.>}?Oߏh5 dalƙ"q+Wdi-FRd>Y,\艞h4F˲p,U|{*TU[.mj8~1f[8 rpc׳_it%!xifuطvr8 !84uI42Vum\d1f%2[-El# -Y̐#I43Bc&h3W4v\IZ}뷂;!,[]۾*ouasۮ]߆}|+Ya0s{gݻ bR"Q$1Oσ7TYMA3l#Sx-EFˑrdbmM g@Ơ^6ͯ 6Nׄ~ J!ta y[~;b 7_|0@6%Jk +͡"ό͑ΐ2sDc~n2}8?Yp Sx|:1.DD,4ůMZt9|_G3o$_RxReu{m;v=8qײ_ dm}u+`fK9Mw[\/ G<2Ӟ4G ~>`{No.t%0B ԕh[✋&JCxtd#C/-}>0]^XͿZGemjuQǃsE=6BΰfiǭqfY0|?5I1"^ؗYao4'a;?dl&ꦸ}=kd7F5`o텬f!9hh4yEW&zU/Lr~$888FͩݛV6?UX?x6!nۍ9'od}{'wܼ~I>?lP,{K5܇a1KAo4 h<?d1 uDfݐټ@49J Ƣ-F ߣm*R^zέgq,h;Y۾AfǏ2_|9kIՒ4dn >#h'n2m*d:ۏ1vfy8bJdiM!i ٸ9N4wQ7ϯ~k\Nǧ/|+sNo,Z?󋋿s<)ĸV:lbl6bۮ!ߦCC$=~29 Y`o!7v )Eh,M'GSJ4iFXPRɗX*o'BŽyWt_M̃ަ99Ě!wլOg6|iw=Isuc`ɗlg8MfE6t^fe՜]zY{AuM997֢⛺ʟ/*}(ũp:.v/,_Wvzj/Ls/{?d>/~Rnڵ 9k1uB󄧏$OV6d:و4hUfQ%h-ڭaWu`y`4"R*.՘+/G1V,}fq.Dž8>(cӕQqҧቍxbD׿'#cq' ⏼UߍT\x - z4q3]4ꖆfK,hΊH4ӖFf"74k1SjK[ኮSLr#8{=} -AOfF/~-yuWǫY{[A,!0A!HC~&ݼз_5:( -TuA)w lR8Xq$ĸT xvMFєh{ -R:-n\Z{p%aoD,|\'d.tyw$?IWA UP,?*}%zT^S^sQB_"=FzLg^ύz%Qh"64J95_fOUX䶾Moe$OoRnDv1g}c`)ᱷGpz";\}.N_W3y0>nU|XCc`~L)AWZه3ܭ~v1/ Jq抠1Rݏڳ)bk ̮{G?н?3&J{ͼ+Z F#&81H4yl՗W0#/__x0G(s]?BdthM;%x_u=y&W*y!DX\zJ"GˏtTYT̡{WʛW2^O|ĵtakKs٣Oؠ'g*oVv2l.#5ơQ-DG/Bgxi.z[x2XN8$;"4Zq} ׇݿR/߻' }JppYKoⴕ$a}Ƭ2+Ss:=QHy/`{cKK>l<7.qpGG~Zz_Y+IsGۣD9ޥ,}Dg? ĵ'̓❿<Ҁ oTD' s;-Gݿ=NV],LQ?'AohnK|YOW4.( ,DdhB͡XS,J -*ofп(,:ǽVL_%:7{cy/EE]:`+>֫s%)eP-z~sT"Yvc{*<<t#-pJX7 -΅jHZwwb>o3A|@_pF}\fz_5:J@ DR/ D9o86G&E-rxLܜ|V~KNta>X>?CDGe0!ڠ%wt;_50]{pWW$P;B՜-=}cm;!mPp\҈%wi._K1[ʱy'=vXDhzwWi1,miH,2AԽz% -݌aFK-c|?IIjMu^,>* .~-/}v n{_GsU;#x_8igI+߸mx 8 /OwtdgD~MfrAC8"'j`3,(|mHiTeVϦ6u_Fu<[brZ̙Fsӷo*O}$MbD8,TyV>T]x/v>]Ĭ5U|m#(H?eA\yRXy5~{n= $ )Or[5@My*tŧ밻_t]T&]BH9j<^S:܂.+m -U{ -ɀJlT'ʮG~P{?)!?X< ދi}Br+_(77I {jˉ/gJw6^ -A|= }7?jO!Ij-G+윑;x"Y}SwsC˝h$Wh%wM*AqP :x{з -iߏβ&SpxYk&ci\lOكoRa3SL򷍥:JZ;؊U-D?,y^DP_sDE;E9,/gl5m6Z\m(/EvSlЊywtdpe-=er1hS<_ܓ ﱔΓ=6mjGsYLF+ƞ 0%;S^/݋(Y*iOṈ7 wZh_de"*w8IC;青m{'>-\>j~)ʓSk%!ZM1FϿhG褲Qaqjlp*DQB{ЃpuYnwt.+&i [3j>۴yB.ʌ}׺k;_b6NK/ѝ:ڗ<8ά6rH2GKL\&JiJQwbռ":IG&Kj46p\& 3Fq4h sw}GCssdTtI+)S;~pH՞w[i[ٍA;:_t/v?O+'I -ZJ3ZG_?&#cݔ.=:Z_n*>0 J7h{8KD2y=nyh϶>ul3"zBв=ݠi\FxH>uzq&}ŘN27ԛA~wW*WJ@7R=ub| 5qZ ߢw<`MyYJu~)*/OvFYfq͇E 5CjRa)RzM'Wϕ J,7`s$A+d]ERaFEp!q|Lh%}Ċqtj=;2)|3灳+'"|Qxj jи{vLlI]sfSu`:K~r4^`$9V\qZlehbgh|%jPg).ֱ:Y뚠#ѬQ -@|1Q\Sn:6k":)UEi-B`a$Zp 2W:Xz6嶭܁7tdzQ`Fw99``Ul'RM}/ˠo/ ] 7}dp:a(:g,FDL$ZC<3Quaԭ0}҃Өl*PM!Yud&~sԉқڕm|Z -u'eufK;@䲰J -IْөE#eq:LiԎNIUJ~1EVuxϯF~Ahyh$d7y.Z6orqqA>~6{sˏAn"%F8 Yjh}mZ?Q$Patn1ą~T|Sk2rߠ.[k4M,~}%䙂FD~Jj薻Kytk鶫}sTUwzg/-3A%ת{B)Tɚ SѲEN}RHІWlml&zs%p@ -%210sj͡t_SLVSf)kћލj6ŌЋg+HM^VX]OtˏLNͣkOa'ҥ'Kw\I||-Lm_B~/Cm"ԯ1 (j7&֎ {N]?9,"A 4DPu4C']>Z!;;;-&RuFTw膫CS6siIƎ~n-r[Ⴠ /žG -S'E;F'< 4Sɸv=8ƝX'­tɹszy}߻Jw~m`6TpE'kN1aO9[͉X`6{9ђLMǥqzDoK5i!1 5PUP' z{\|Ws}*TO`mnXo/zn3o2xN|߹zv\ur!?}$d5sזjq齿yK]inŔ39y5VVzd,bQ7'` з!ŻcX0~m(zPo -U:ѫ{RЅa#ţ@K#hQ[A0 hW-1`r;,|gq~b[dԛriMS*GI -FjC>6_^[4> !PE:ZcT{Gxp -9W/|< 4ؤ‘Ƈ?X8P/4ahaK:@뉮?g Bb?1Z/y)ScL,ac2t`LGAMͬ4d"҇I(SāV~VWc2Wn"yˁ=6hmb60;ݧ}OaJ ;"ڐug5_4, W&0۲5Lr-㘄ʑVEo5G-E-2^bKRIbYhr4藂?%#uZ|j So@m-R+w?e/f ɿp7z),y :QG,Az`I"ҵ=%"8ͨ>=[؜tX&b^%_ % K*&๔b<.o>82 "zUUG**].`VqڠS6_^W C|l}EQv͞ hnvN`4&bw~NްmcN W}=́|||tZ ,Dyj W5 AG31cIb3؆ko]^;ޠy~xeNXy͑l5'mM;؆)1DO/tl{o/[:)A3]Ovz)>dnԣj4m-_ -=!?*B XtWg fd=WN( ׹d5t' ~3>6Tq!`ÚbˑLנ8.#oJ\_ -Vlк -XU=y}ߊ?R]/Vr>ko\:r+Lz9>FB(*~>8[:zc?ёf w6BCJ􎁭ʊ#TE;r el۽U;le[E3 ΢p\XqA(TqXa-f^eVxeJh,A|-an` Vl^SlzK<@Xk T ceG+ ):K:n/TZܞ^χpS/qϗ꺲hqCNdΡ #uT0pK؋8Ϡmzeadl:4)ӗ$kAy~DyqY{ -YD͇f5%bՁ_,e\?ƀ_fjOlzkPц׶ފs@G!Hu6h"`$lt;q縄QyxX FC<-EdpaÀ/lw>wVj]S\I[yW废#xyDw;Ӑgr;}ɺ!p -wNjȺbYLE. [ Z<+aĜW \`"*եPmkDx5MԖqReO} ;_?Y]|E^8ЌUcFIp"C4*gkp!1Z̪\ˆ#k"#5gMo{xz+걊M}6|%hqMb]p/1Sl9MC-DgϠs ]u`6h~4٠3F}`G)2Yް>%;K"$Nw^!EL'v`g?YaUէlUS؟5yە20Lc̭-}e_zd|W^ ps^e 08 m=d)ڰ&![a|5-Us(=CQi -{&,؍2;޹oD# X`c kLWM;q4X{^D|T\䎰'U `bsfC,Ǖ!_IP -M:m -~d l)a{ - gj,<`$,!Yx}",OywrcERTȂhC8-y,6/ D`sZg%{b`)Ky=;5\*^_qd&yS%C:;'+>Yagl5.,d_y:/!i\ 1A!>r$qN9 OL!*XPi 5 NS8l2* -`s{ɐ AF&c{\c(e,_Wb̓=وm.ejV'>ѩ:cg|bgQv9ꓶĒQRY;^2vjoM1D=`?\e&o؂cٖAWJb`0؟Cr+hWВ}óKqϏjQ@r1Zqk!p.;ėbg1uo%?A0sa-*2,X_+m윢7[ł+n˞گmgR{`ú2݊m8`-Z߂<3[=|Ҏmk;sH6! <ºWY]peC -)[eFH0uY@:NZ%jlmeL-cy6|`/A{3J R8 4XM {~X -2m<د.y zךr b2a eX (n!AQqx!p -PSkN D%>@ N j, uG BU\5撱 l ⋦7`|rݯ<~wPmt"_'ta~]H}e})kȶ?wvytvMⲻƁ5C֜OM',`zV9%ݸM*bg _.b-A[Wf7[X}`@<4qK:'E] kw"µ{.ņlïφkp;oҝ+mp>(;6G՜ ΄5 Ş4Edmza1;eg-WW!NIJRaG68T]er q9떘d6TB,@|_uی֍G$# ]eV8`wA[s/9 jL:S~5 /t9 K3~a`CSH14=ȋ'7mB>Jb~8`V:/(0P  ġ| 8Gxpl .*b'pp;8tm>4 4*Ulm'. VS&ܿ"ڱ7b -zŸYl$okWRei2)-J|bq 6`Nm=E늂C5C]kW}h6|\i5 W=<ml%CasWCMݕ&U;[N8rs[j}ۀ)׍./7giRuԄac-26R]& I%*Ą 4]Z8&j?KV0*N̡/0Hea-\Oy՗s/fZ>h62KR2CF(^/0Z'g ֶ>m 0a\(=8+՟-<Ꝫ,b6{װV s,6\HxL5_^w~3u.#>| KS I0VYfE aN7YD5 8K1 LW+n=,7ڍG#g+ڰ8>yB'$O8e"2y3vS`ҰnrB زkT}Ȱ5lb -1+/1/a%`_{vyGtPc8-ؓk)biI%CL1T61&|'i_cNl<3r|tXC{3  hܔ}u?|~CӹѰ'ҕ?دֱ'ԃKE<" `m.i >r_`/lGEۭqBpl9a]v{q 10 '+mw͓XJk7Mw=vT#N ܫ'R#aP^ǵ7>w -Y%tN -0vX{3̇b񰏀jLb'w2%SӀ\UsM߂LO[ȫ gۯ}z&$S[ĭQVc_V݊jlOdfs+걢쵡گSSMm>&#߸} -]5؇)R̀U(6G؆ c\p izyr1ߍmT8·s&o5[8rwC[9#ĄL׋*'P:{8&>|_cRp {iu?XtWL Ovmr>l><.37_{iORل mDiNkztűlJ sm='؊N/zyU{1P)~`:+1 Mѹ||>>||>>||>>||>>||>>cPĠ)3ua #tSs]"C#bRysZ͕E[ ++QBdDd,~R6jy=CyX[% ns:O KSY┰~jqP"O:PA1aVi+բ#Y9Нg&a#t7l*䅿[K?Jg_JFζ[4oݒyvV1b9?='/>ħo~na' lcGu K s弭X1r٤Hc?R9 Y)/֮g_O_Xⓘ\:[+\coe;%xyzx2y2W&f" 5?5_Q7\$[$jҰlm(gj3%IZbZuWGZyqȏRSUEyyȮ%a5<]ٚ"]QX$HMIC5ea$)䳽=u'*A\:Zx@7\ )ʴ iP^Ks̚Ӭ+7V(IP,h-PIՔCI6ȬD-):4JAl%|M<dQj@ŠȡC|:mUl22#Aa3CXʘi%Q $3`BjA#*sa -8DEkp \MG$2tDd[@5)Ƃ@n\"LQ?]5ʟjLz-s m/9E @)*\τMD6)Rs"2Y_l&V竍j&"g2Vbl}"ӑdN"CrM\!i,O}E!Q4be:Hw?\M, R+r U \6c2!EORf2 Db]T0A@gH &$VHQFe YP©l|b<Ɇ y -IņP,;S^yh2c2uaC H A ) L3%069VÅ%|r(䲆)R% <Hs"P[= B.6C)s&pKFqk(FJã .&_Ȯ9xa$ o$M !p_&jR!רϛb5LMX2!jbJ@$bЬaP -Ug"Ԉt3nIsI\DTRP,) -?k~ -cm&"بPcF\`岤YOr"Rؐ7lIƊCyBs^D ˓*A|@fCXiR.RDˡT'"W -\ Dz^"=m!ET.2 -FmySvMA*J:T-> -Oܟ*{HA />H%o!eSIy67EzP\>AQ3 c3EQ~p&=6`@~ "bx@lG尊 e =B@>aF=MrIe>KP x9"CZ)HA`.A),R[{f!AVAuy<]>w.RsfG(hNG_h8253@y193Guc0tWr%T&th0^T,2&8GDQlce[U2PV|a%p=b"B95 +S%n nIJpdD%H[QA7 " $qI|4bb}o-fb.)nr&> ]RV|dU\9ȼ ɨ\iAv9>px]]/p=8҈c, SL#AݣP-΍{%NBWHY\3t'Br#o5m1%;발q@J|dD6n&p%W }=8рyB^d -F{瑱tW˓_ZqB G]lەŐ 0&GAv -b8M1H^R'GA+oG.4?T BS+_uw2K<,q~y"# B̀#H>8K - >.0$? ||9,Y|5Hqc(F!8WE4р< -2+^2O`\bIՅ if4i~s,[|6(o5yf΢;8HqX89RG"w"Tރ;ý Wd!o"q 11|08r% -!8>1xWU{#/xj0u;o%#wU>O^ | -d`%7ut)a6<(Y`R`gG< @&9sy؄8osQ@Gt>dT+>dO9MI-k"_2f'S!W<')JCW`+ ~\$Ox,@2FdpEE a9P,c[0||\'o籔 3 1 yS|9Y虲Kd{X NZd`߁ àXu$Yy+!ęOgdP7 ,i|s=|O"kX&hIz V^칀`W -WLA/ p!7x 9{r BO , ] j3βg&aITҦIsCgzpwyz$t"!)AЛOL_7>M`l)Xth6D =8;#i^9KLl܍1drn&O[:?cobAga`GĞodΎHaqya0 .= &/>}i,O43`00W@\a Rג[uHW -ȼ>ZTc{$!yXc#|r3ui3b)R,'c5 5=6l!Gq r'knA@Bg'RGmGa*l*XJ`\8[#,8G!\ v -X$Xk8Ǣ _Q]!`&#?0@Z˱c!o(@d1fDC ]a-S@siGFW!Nc7&fð%zrsa W |IYy@f$Cɹx }Kȝ y `};P0U r VY}M'oKo+ Rl -0 5G?\͜< jume -蒢vWbTo$uX7#>J|x(B-9d@vu |-)~-a>Xm$6aCR0^N[D%UvK@?KNx.f.#nԨdlˍ (luc - *nZ >f7TJ^, -^Is!`%#+&ԫjՄ  2$K\X.d2.{!]=YDmˀ uW0Xр7D95<7QC D!- };A?lG)=b1ZL xz 1 3nϘɱLr C%V~DRˀz}VKAxu>޸ -TCG<97H \?ND +~eD2H A"$A6 Z#rg -WAz[]ʘ?u`'M X 럷N~DUmg2~(D<\O4(e땾4:j9iJ0DqtBn*vY K r -) ,6@K\H |@VYҼ ˘Y8|u&%u <ւ0so6v_{(Bj萧k+e -Q:@Mj;$ۋB --)y$| =20_DGl;'_+DZ{ݎXoM!~PPO;tETMˆ5wM" bvn8p:P$ ֦(lH9CtKYXzp\O"|XްlK>stream -c%pza@jȉTl6&:&?Ĵd -(,鑶 {(cT`e]F[Nk)Ľ]ssNc.j:Hx% &[*U%֫= ` #`Qrx^Ƅz+1U1\ѱ/G)ulgaI۱X[a"$%k|ă#`PBx |J6ĕ@oaOO}u6ZUt:q 8B/;G|u@c^Y1_;L]]%τm(S*Eu[$٥%H|PC,)Y!UQ l52D3Ap -l Af#C><r(`H^n4Cs5K1W?5ef B*b'Q- P LlO8# _l(uIЦg~PxMYJ*vMSq} h%MmF5H^|7?G8.1?l}#C1a m(iC6CP!c6,⢀͍AA$Y!p8 ?n;e/f_|`F@S̡7Lb;`\ -?`˥`;sx-1~ȴA~Iq籕h=56lC1nPHCC1c -s,@nn xiC1 l(ڤPۏ|Yq}azA=k! Y gtB.&,oؤ2`%S $A -1Fx GIpG|Xp0muzr`MV.&n@iZF{kA$ӡŧH'l=_Q,p2M&`6{ `/3HŦ){-lCb O%؆Z5>O=AXS3G{74 -zm{ {s^ -}pHE1{8;߶JWcKK?z`` W>.HM]l^Z}m2);Ȣ x=,Ful -.J npz#E^iW ->g<OϣO{vJlCa8 6C6"í`5eX!>-O2u6JMU$YL*Jo?Һaߏ>+ `_}cP6iҡ>@5!TKz8f-eiC0k$E |  ss>Iq*kE!7A`6ebyh]աo"Mh8:&N(c|)D$i cKf5>(=lRƆ*u*=m 5mdཕ`K'ܨFlY!Zm|a6\zti x _l((_G|L>!+VvIPelX23Y =1i5W n4ܧ@lXC{>fG<хkXG9xqS A*ݓr58'E8R4Qx k4:pvsЫF][ { ^ eGxc{Tp1r'L@v0.__A>v{瘹xehZf]k&Z2z/_{","flWr YAżB^l}:3j ^_>pػs*g0OOy_]˼ ΰcD?`+\ XGN .ZxO7uv)a{šs}cĥxoc\XCe} q]św|m^881Xp^wB/27sWaWZ: {P|6sš5c -c% a/3܋Sp[&Xk y[@?ֹ%S7F|3=8K:u?ժP|=] YAL(! |܀z1 ֊%|» Aj _`z*Lgh kwN̎ὒSkBEsmL99s#xRtl -\1_pGX؋}4=fCoo|Zz)DZ`](K<&4#] X!^/G9p1Ŷw^fvR/ yaD͂3A -xvϣ -q Dݓa^ -F'䭂5š~`%[FnŘpM"~}rWa}aT/q^pI } p=|l -%'kB=cϔ?zFcoV&ﮃ~bظBb b8qC5' +0k (&er] -ZvÚR _C٪Ogw~6s[Ċ]fm< 먈ob?PsľVa(X[_k4*v> ƤuR{T-p!?V&&Rt.q&umھOѬ纀'a]Qu@X|VBS|C$CE8z9ܮ+72+HYmbH)CL5g>Y}O >1 W?YSnIɫ3Mb&GyrIqЗ{W=I4O gSԤW) - -4'-RƖVӥ kvCF|ˠjv۳Yu:LZ:ܾMI8ϥ(`Cڼ)}i6:ȟTf:&E%L{s%wV@%tؓud+~ּl> n6f6ꂵ$ܰ#oན U;!N ;B_l=5s=O+oIf`ޟct?m9oc7N1{Y ݌6Rdb TdLv^ge:<՘Ԓt-AV*p%_h8r~#`bvYf-e[ "߮LM'(߫:d|0UywE~b۷zeh5c-Fy{@Qрy/eh{c7C-u#G0G¦k(Vl&72j\ZRtX+I(Z֢-g3{YGF,ފK~yyZEޡ-J{E񳿨 -wҿeP6|ÑfBK@aY4ŚN}s p/x@}罿!ؤ,>#W#% v -uyGٛ$[3f<-}Rn!зkz~i)u6y{r;nz'fX瘒LLUYf6Q{EԽa@xEH4bZ]^% A gɫ̩N[ua*j]Les9¥P_ Yûw5anD%uL5[t/?3 w+?NQ44[}\Ƹ`wR;["Qv*Wz5ѨαZn_'&Ր,fF~v*  -?c~jcy3}⁲mّ[d^qcvޔQkS)(h:/iɼ4g_d}G H^4Y;Ip?H1O&k qYuIQq9IQѤನJRRt}iN:(~р򤤠􌸰 yF;bk7nC3!ҾQwG@͔_ Y1G{`Suy Yek@]OZGEm}ԁD͍_V\(Vi4ޯ63Sm^:^׆KlaǭLQ!fu;F|-n}7տϩ=-mLдqnY+[IVMZ$7B]coPMF\t^\0<^k6jAa;NgǠI(GC enљΑٵ7*"FyWJ*}db~x~Af J6l(~xB[D dKNٖ+ɖ-WNLtş-xj#~-g0HbxNѻ ?1SLi3 RỊ&ߎ;8xDtX(* -uu֡eMm -+JkCjCU6ayeeQAei1BDfݏ#?s[z&ysNܑ61!5Eu6a֡Cߠ6u6O#rѼKrʒ+d^U1Oe0t**7 6i9kRZnXhQ!ztF=Ff%o. QM~LR[P\jV)o Ol&Ey+67Y5%hd[ra~I_qkCȡ\m,1%6=Ѳ5+Y_vֻWy!w"qzYn9iNSdlG(aGZTh-Y|ŵ̯/ڽ"4֥:46#&?bGQ~ -*-N/9GJJ -I:503x ZdԐ˶]lc{]h&<^VEܨqHp[kQh}N kQ?NsM;VGTėGeyDWEEiH:ې}%;RMYHɇ@IKᯇ>YsY- G߉9<Ї>l7ѷ#df}#:8 ##b]"_6xg}ۢxMTǤ*Q]]WcCcjd7#~uqƺ8N?'7ș}o՞jO'VNռ>IqH\bkRS{ncMTJTwbf[mSl*@w؉\%g3#mbnunC9Y"ܬ0ڼ;7BKR_Kmxtg Ίp󞼘qZbccbZT7;^g_ܡ;S'8gV1~JkUwLZ[${7""N6gDw^`<؆̫OQ?6u:QxK7o]sd;]C}})!,*Aѣ:zZ9wHMٕFK"sEE߫vAmbν[Ukʤ0uSԳBӠt8;Ex^'zDD_FtSVqwe;Ň&M/q ] 8w a.(=mfz:裗iud5jp1P ӈ衄_9z6nb>%ӔMK%o"&+f3+sG/%%LXLl1$T8ۥW ]ZQoC·-M:Ef)|1.;Lj -2X婢D^1Eƽ^}I$%վ),RHC`4}nڍ_p>U&c]wJ9_k}nvLR1b:bEbt 3 8b<1OtBI~xn$L^ҳ49M/)ޯqQoi]%8f^Qi޸GY){T!J[Ǒ8G.t/,q O-wEUzŵ\-C$w.DgJ75mmةF,[D^P7=#yUA=s1[%Db41A ǟ#uɣaϟgƣ~k$I?7}2a~EͭG}Y]rTl,3JG|.y.^FAsvK"稷e>UN__O[c^v149@78|rS6 -+9|060?>!~b԰)DbD b-^ -T79'Z,Zf{D8gu~rL"0ʠXC=˃ 6q923ʢ=+Jkk{SSp\{߹enڣK(a4~#;'k"n*_? W= }؍E 4W=APUAf".Zb^BX$aoc+BgY&'~E8-qsw/ -\߼t~7ҵ24&7:[YxWc2爤2+g۪ukܺ[rp 99|q| C8> -Ͻy8 ύFPV@$XLQO,eAl5Mh4]=s\#d'Z3[6D+}>֞ 甸DT Pk6uC\cr#^ -5o{?=ZzWkC=ߙEʨC9H絎OaFb b[#4npk={gң#8<ݘUPR]ư%[rssBmc.(>e ]e E^2ANAYB̘0 ϭ./o?i1>G럄>QMXL@PHl'ۓ̙nWvgno \ RʊDzF:VDDí2( -*CݷB8U6c(,/c:kcѫa3I8MC9ii#/&&/"YMT8@Tv!v}=B[8!Ԅ(hDzA'3"Qzre -*#k_A!R 9["dz߹iҖ3'_Ɔ/~^<\%̉wm'gl#n!OXOL:n-1P~OAX8[~ܠ;ft+dPfw{F%=3kj;+]3\{kRZʜwNʃp}S`G(S+&QʏK3/'ZML>~#1s~br4l-T]=SpfžN/=.5%kBESB7o\bs*@;'m/Mu'ھCwwwOQ+  ؚט4N5eQeN0:ګRߖ9!.VYJCJz6Un1U1$497]~>zn>1$6j1cjtm Y[Q|'fo4!m$s$+xbDl0{";e7~o#JFIոbGY{cLwcl{Cl5o]&*tyEBqtMQDc7nʛ9 -{ Ib& b^kb+DͅlCS%~Q#"r;|&c-z Gl Q"risqi܈W -Q_M(1%֚ 6 q&G 5yՍ{[ȩ |RtMZp[="+_е;?)ux_m..!1=Gυ5" a\2Ǡt4c/ux穡!f8ee=r>1g68[P\A(7!Ds(hqG~KHㄝWYʕFJn?O7]-/,C3(F[jz?'T9tV:B/)R3X7ɏCc">Ư ~Q%(iP!fWCBPm(gyY9U yhbcruWb Xw4On[ -cw>~ٝcBnf7g bguxxȊ|Bǯd qF(~hs3Njr{U)NX?^Pm!dɱeAMLA0i51%̉ĒmfĒڠ{z&4$כTǭ‹-?ĥ33B(W'!֒^j2NJl&-v<h|-vOz,K~ȟ,{\&muGFOʙ~ ^`pt-i(,9/z(uO}ATٜ|7e|6Jj Z~'"HE ?]{6u7(LENK5l5u{us& ꜌i4Rssn|m&gDwX_;y;|SZED}C=9d1 {A@1OzņihX%[biD4n(n##Ml;jv;S8E{|(߸C?9fnj9IS;jSS[R!|=m{/m9 fΔ͝ i/V~yS7SݴP'%c$ӚTWDvsŧ¦Ϛ|,EQ7s&,/MyƚXEHl6N> x4Ν4iD#9R3lQw cs #zܙgڳ_a #gk,tsj蛫KB]|~8cJ7W/wkDyĒ"{ӆ.S6ip?^ |kfL_Hz 8f.꿽(/NKL=:q[+uuz6Ķ7oQvdp%s'SW}i0vK &wA_~!g`hppsV# ='q&O_x"BpkK^% (8h7 .%j>ɾh7cZNK.e\NfuQW> ?H9S.{܂e{1׏f^' v~T_L_ũ|F1bCTw/ܨo(7h^]Eغcoy~wgZRcɨP;Zr*8}΍O>qz"/L1jRa -◕jjKbQq>p4GG=ݜа3ѻGhτ`Iv\S -Km f;!vclBc6,zU~ 6P'9}xOz$h -;Յ)L؋tjF3Tw[ϒ'^Mz/tq4*9Ueҩ;o?=|94.=xځk7؋\@~׻)t7L>nt^qSvV!)&6ΙChOkn8pNum1qe<_7~S_*pJf.n7=?Sr)e>S`8ovaKv3 OVhAVľ.y -rURTgR& S UԸí|G(~X~sWB.0 -HgqkAZfv^ RgRb6I3ikhsSi/f5_$fLP"F| U~C}F{1F9UCFGѽ9Ad%2))NhlF+BqnًLg - {\2l LޢmU-av3 psֹM>Y+&jF7*pKÏ/D>d}MF?8oTNiurV.]Rd0LS"+8=ea3% ߧI˵bUޕ}L睦<o6B@]ɜu#"C`RR oR"smf6abCa*[wۖ,'JyGs g@KOrwhQ9Z{":!{l}Zd5K&|2G6~>!ZQf[oE! !8ww'XHB#.ݍ(Q K#4MnѦv9w}V>3rQc@H%U3״ʟp՞ݺН.ςɫ8WKPa/$syӴ_onl4xXõv'>?zugՉ4BWJX+tUߜƙk3)>|fVhv|OK3ftŃƤ*G~N}bЀ0hНi7_:,䜘$Ĭ#sYOO=<^b;K#qv/z^m՟+w'O>ΑmS~aw SǻSqfj7d~'LtA{ef nZ0C{[5ޤC7 ʼn+GZ콂b.!>^aiꅗFN'UڡvgFsVT/4ۋ5|B(ΧՎNͅv w7_{|Oclm̶ ;| f;Ws{l̕[{<۠+B^4bۋ͆ ]|]B-3nņ̋yĔ|J8>Q?u>{˿ph_Po:Mўb;O)?[ 78l_ >W}]\W]fĹ%g4mX.<70Β N-wګ%T vڀs -9&VM*u fTXc)G%@+A>GT.˕NSt}O6 ?BPH'gN64$aj}7A3hRB BEbi3_gPsaiOcg+|39hT;G2n^V/ݢٺ~e~6 si:jY:vf?_uRj/LȵeR˃m~%1ZEFBXat[X. _`ݤ ?󺁗Q+ƀ\ε?u>"zͅBY,uW[{ -(+,#] };5й׎@7-1mnlaP>j>\= .hwҚL>-B]™=ijy?%?z oÜV}eSjYͨ6m˴O-ɲ*/-م.frUso7}Rf3CY`fl͆+4[VٳGvKg?m,?v4^f>o~wO`>ڃ/ц"D>М2?륞{.b^sخX>4GmM,Wz|*ٛ^n [m5&stퟮ+&Hwj,W]ߞ_7J ʲAf>S,Z{mxU4+flYK: ІWN/4t~Oir;kС^Voz a6LƬ?t_#eq`4Q(옮|?_ux1ʁf[P~U+XyewJr,\۹?{ +4zZcp\fE 3[hM=t)fwM˯,N|_Wq|T-9ڑbѹ9he/6a??Ac/o|bۋ05oE9Q0V_7M7;u'ۅ|.?vA LodN:--whNOܵCu&͞-]j5^:^SfjC-$d+>Q>u5&78#Bl)jc-'hc\BKw̹JUBO}梜y.<qў.ѳhCuOweCsI\ݥsq?;%7߶~t<>cl}Jx/͆k5Ѐ ֗N>أ3G it -#Jvpq0+{w\4VͰ7W7M^;BzT|~.X|Fq|"⤘<4uY=rbNdҒLkd1vSBT; y<sШʰƜ4[Q\O{ 줜ΩX/Sݭ;+7.n{/IeC:B7!٤a͝Uz)^|2otG^9 }p~M\vdUg؆k{ vNek`^;}7Op#]eV5RBXo6)¾Z:I)ƺȬ:DKm`|`@H:X:$ޙ%-m+t>fUbˇ_餾/]{n|'?|a|Y񫏋0է -|}|[k3,.r}l@߆t#K18kW5XMNДW <<:OCsuЅ&:Ww/.6㚟lB$+J텼B2B1'.GIG IBb89`W4ӓ@N21֘=c#-!LiHceZrЫc1Ť50ZwfTR#t z;ĂO]ҥtQz0 ?m2J|l&@ [&Ic|! 景9lLG@#kqV:Iέ &98|T d>r9ABb8!4cN " Z 򁹬nDBRõUywe`vݧ~?oo$m`[_X.顆|Yc4!z zU|Fj@[h6-بٻS Jb-X{˥YG`MnOC|`5Sks lW A~k)iO!_O?eQ,ew(ꀏV,ӆfXi5)cyYbz-؜|p%t1W P:Y#㙍%Zi -.3ˡŃVWUseZ}~tbS'|I>&a(5l,xkm{FnPf瞘 -LSxarȷ~kl]KpS*58 -Q%vD+2blư.}f\x5%Z0_z˓C]-89x3-}"+?[VG) a9]-=lBO|t='6\ υ6]_T^yqvHY:58)x>hN:_lNΒsڦ⵹֓"<_%ڜ I"q-ܼ%VlNiz^r4 #g -I-U';Yu`K@lЧbQ-$u? -fMY_n&ۿpmlsLgk܃^6ܭo~Uٿ[݃Gp&1zǾ͡M1. ъ4?>jxo\ -ص`}0'v@Kʮq\|[a0OUf`Z|GGZ~Wp`%qKg+GO.wP]8.TrzVb+FrliT}ct\wQ=C/ Dw̎OjpbFsҬ3m{4[`Oȋ 5Z`B׳kZუP@ *bӲuk? x{| -t䥄"{w+^IeAz}~.kO}QMFo%6PH tK/D[eft6??gqS͠Lj -hqCo"ɲoZ> -.+4GWJsxot=m /'̯n|#O* 1c|cr쐛 ;C:cBѩYbz}H5{,f.x&fCΨΩ]dfԼ`f/F}YyCW&%|(s$~`]_} :艐u.==Gx}0WO[aݣ^Y%wQ ={7*_Z;^HC>\7ۥ \zr۝zmr/X}_rLjŖBj@p׽CfA瓎$1b:;[++qJlX%expXZ5v"i!#Bp=g,^{Dj]_Ga,XhN5dw0O1t"s[ /d>Jݝ+7fb/06Rl^!դ-֞\$Gy~b:{3 U{r=l!-nԔwz54Q칃,b/YxmzCQ\z -G.*FP_䝞E +@򈣗¶tR9|^c37Rz)̗07e -=rQh\m W3rc qŀ8+5p ipͯ4w ٱ!s*WW % 5wXMuqXqi7tݐ۷ 7ҞnrG+`aNпC}׽̯j%b 셐+EfU+wbe`ݩ ycj -]nbg1U9X >q;w}7c:Th L[V/EZsqb ayv`dk4mF򑡹2H. 783Ʈ8;xP˖.`3{|4&NS$pHapO=Z'|Wd1Y,fg(e -YzCagOu7Coy(W2@l`Stif@}Gz옭qeg<Ր^3R=I -ͱ3G/oh}G~>Ϗ4׉Afo3|x>| VZ"5\t> ]]+4g;X#yѝ| W^~t'W|-V[D}CpgIWT8:µ:Y^n}{V9W .jN \YD(f7)5>W_x;]JX~7Z?1 ~ggvZ{kx)\4wB -ֲhd{r >cI(Å[Moҽ>:gi|Ŕ/nzB+N.J|{YB&˙07Zo&Y0s]sa4kqQ6>p1>Rc2L쬆doLGӅ}7ԨY"̑ƬJƂSUH?<ߖ]SQ!i: ڑ}׽gpygLf5[aR:po_]^T7>Cw;םztq╂>M뛩MFOB>BJq@7ˋ;hQ+<=Gr#\9{ -~|PN7j K.C,qjntCr׆5bp_Աlpν={;K'fzv,Z_B i# 6T%8q6>,nS4NQ1i6Ļ`V:qg?OXြUe>զ)u0pޠW --n)A`?|3 rR\[52FU; bNc,b&쬮GKyBUkÞ*G/ -L,##-_I5$k]h -g,i1v2;bK>Co_:^- mb!hz~+N}Xe ~,ر`YD@hV920]+o9Sh|3Ԏg{T bK1}}4/F0Z2*EAG]NlSĝs ; lyаǙԬܙݤ;k; g%%?sb6D,7jRXT;`4AbP']'}s@Cz.} |W%ɘ F^@Nmn-twAl!FB);ڧI)={[ww"rS'ebhax ᡝ`~z>!Ė/6;+, E5\nbS&vd -L,ÿb^F~ajKym}o7fH.eq* -|Vwȡd.rUW,/1UٵTrO8o%y25=]϶Z|9>PQ88h<ɃF{|8x\NvD~.zNsA,:1Y~k1x`s{k<bX2Պ`R^ R|.e:bExqYHLJhc$vJ͵jBX> m2&5uK( 5&{'W4e^',:5qPltuv`S/ srn<=嗗KLͯJ=Y=DixgR+Q8+5!Yz KK ~b9qfʇK`ODɲž*`gN=v%=3Rl)g9^D,BϪdY{`gY׉-oD~+k2f a͵r{ߥݳYĚ/6X'xo#qmP2Θ0O.:wg\Y8=זҚ' !QVr%igȋ|'z;jKO?ڌ<[IR@5z>j\=8jD!Qb_=bɤ9!Y=u=m}chנ8i`ws;!ƌ -Na_dqْRu~ 3?Z J|9Rrqx(ŽF[(ł9/( `fy\6ѐyQqȮ=Fᦱwh襥iV Ş$hKV`5 SQOv[uV!w<܄]fg9VR;}lϔ^:gm$aM5&ƺZ80s{fjxTwirgMR㻔PϪ" bÕ0g6pY-pr!ϟ΃뼻gV^[N&Ss}rFlC}{X= _fwLgvzᬛ3R)97j;'1\`951b^rCF5jȏZ'G8&}]-^@Ls0oYG9kE8_䝘 -x~nu~3:FQL<~Z4cS δ';rgw -\pQ(s+ -aY@ o?R`^>Pd9[ J?-P" 1V8^88Ea+D8> L' !ᖞn,U4afcN9:3{Ryfz؃DΨhHxm џQJק^Z$6L1*VIǒ|) -X1Yv_ A`m qblGf 2.,C>Bj0ۋ;/'Og.sC9||-yJ%%UB=zqE~'{J*w'5 PمR k7ƿ]yMFjIa֘o:яcM9r #:>I.Z -PK[L81ř2?e*7M϶KMm>e-qX,+wZ?ހO5Yr;bI}|م\秛s'>XYT12|L1*F)G|8!-oV6G~C-Mk_RbåJrxic5yFK{{h5:N< ]\wIoJi6d`LktY9:VE$Zdƙuغ_Oxf^8s/}>wQWh>CV\T>;8C>$.0R\8BbG~NwJ{|03>$2' 32=`I724rrFO1:c4 -F%q -F!a X#/lI}VlXȗOɖ1t(er]dog?r%Bl&Y0n8%RE0nb)82ZNpRqx<iQJȫf:Qcl̚jEܞSŪD+.{/g!s02dewLW -gI٭S{1}nZ(5D[@UErY'&q)Gc'` G(;d",x҉>PsHlC7G`j Ǥ؂IR'P( ={?| ߐܻ|ŠmR[+z{C;@7[@Khxfo`k@]=FJ8:N*ćo5&Xs ^3u@Hd)b-k5<3JI,]d9(_̕ZG5}!2*GH7Uj#GLÒ)NU Y}btgRwc!z2Gb#E`܀dK -:h$W:6V?9bgHp5ηp -҄,h+ȱGaҘu|F{%$ˆrM8R(Gf -[Ctіbp fI%0No(?Dܐ|IʶclaTDh/щF " G6$uÍrݭqM2B\( f4Ž!@L[CI+r0u̔KJ#i#Ѩ^H5U*tg>rF+fHʱz9K}hpsO/Y!6h Nfk>̇3j Ŋ)W1({FsQ|P3XfRRx)4FgdƓ<;HF iR@!#";kSTԔ J5*NH1I -D5F`̣4F9 ѳcK vH'QM(wX"%5N4IcƘʮ+)(Bk GN/RI!2ie>Lhd+1"m$Fa3qkd&#{c~ِT9^M(玆",j+# E'as!eCcE=3՜i1ΡɃQrn4(tIl~n,M i`H{GfRdۦcMΪ$+*dZy#G0te18HFykh5wҋF^fg>BH 4eYnGYb,[̅tk!,ݐ)V<\9F)$U$w $T;@mS#Ԅrq T{I"B5" J|FȐ6WTK`%G0dFrBRhHK?c|fM8>ٔtTK`:ԲyjťMjٙE2d!V4r 9Ժ !2 f6a$m> ̖02C~H$k=58A k #J奥4pg F0Z(3$>?G0;JavQ6bY\6J2;cXKc!-O=\lO1=i"֊ͮ}L-ȧ2_ I. ݿC$ _G=#F׉F30³m!=+%XJӬ!c+!td#(%$\`|)5釼NmB"M 6''E8+lfq#4BycG#(La<儹Ȟ!~7 FGL,~#=$y,ǥ9\SbX5|-13#4Zl Irv-}<_8p%'@-=$g6T@rZBh.]+EU{k#,z'2 -ӵ+Ʂ|H̑ "ДQ,Ld5/ՌSswDCG|Qm|M924# Oe6 H- [$r!9:$_>R#)R{#)&B}kf9|rY- iɣB2Y+#Aʨ(PPqa0b~4/W2sِ?$,Ɯ8ΙRեM {EPhx[n -<Gŵm(ov n!,FDH|%b?gI_1Lb>Z̵ҫ&$%Q-4Zvq!1dߏK^9k1y_@Ԉ bN|YI9:V9w1t4pZc9rRYMfd;$}r( X@|TYA~9vrz#', y9,,Sl%YN4C, HV7DR.bIr2Jl&h``M?ݳHʊ@T@>dX=X;/lHfNHXiQdrcC['֣t>q2B+$!Tkc `᪱J:cGj $xmHspsHD}gg!&\F) R|.eaɅZ,).ÅZCZV$-ћ xDKJdz /$'t),s$>>COB i$Yib.EoĶ9@!Nl-lp(k$j_V4rINgXCV:d9%}CҬ-i1%|',)Q/ ȑQwX=9*T4YGH@j\3_y~qZ 7Qy댄8pѷ c ! ,-zOܶE!#j ł" q^/q-aO/7mZ>y,zjz!$U79|mEJ~&ICRM^EǖO7JwVCP(X 9"‰O7Hu2'!?2FB\hbl;ɭ9U0G-$?)w>-sIΐŕiKIrK9S~>+Kcwkˀ]xzM:+)BtÓG"PPs h6ݣσ~[f/!2nrO'(c/#AOIHqcE׉RXd= G䡆ԫ3z̬7I}b9\RXz$kP0$~:fpml՝?/;̺ ?5}Yu#õ"yws'(?T^4飇t"'Qȅ/fDRXuH7nHd1cI&)"2?I5T$->ߡ^ɱS X80Hg6!yc1QJeKq诊c!N蛊K: RG-ON\ qBDnxF⢜6Yl|{%YbRb^"s{.B|mRGH%Q"*_sn7."] RVgA~{Rqf|Bz 됃kz=DC"Q8~g-f譣OIKVz D/;mvz$&\ɰNgk  .t)w`/jeoN#($2?Q;%6kP$3k&\E|ሡb$<*#|+/Sϕ厜u< _ UDfEg : M6$_x bb[HoL2]_QŵHG/ ˤag>x/G0sW51 } !什ĶSjn~DTyB.ĕ5F5p(ڊ6E4N>@#GՐMa?'6Sb17k\DHH;k Eg(,w#e5zC Ruj10eB[+3BYk~H)vthy7ױge(fLfITsD|"ږeY>IO2pV}"b̑Y=Nօ4.dؚ$Y@#c`_/j @TbJ&`Lhb …kr6i]|ՍpzV?p ػ6h|(d]}B_2$z3;mR] CI#RP3> -dP@pdx$Ui<2') & ⤑5|J _f{!ּEǛVHS@X3!SXK !Et?ܭ>r2'E d3CfTO@~\B.8=01(4}oM IKvSn?*N{UO,TJ'_PDBװ*F$pNG)j!뀏fs?zWi~WAgf׶UkՅ/fAL_YDH;sHOXDNR.$rܯnlM.o7HC'HQCpe45'}h+kkDmLD~r딖_DΉ^'] 7WG ES&)ңh$pu4;$ᷱbLe{{aN[~`#":Z? \&E-<4^J9I@EY."߄Ph-YJ9fq^hE:&38~jc oH?=vA_Z)8=Gj* }(6y!z a4ҹ ?BxO衩!)# 1ec'gIӸ;H caZ5ueW-~(NHB=,4Q55VlT8h-Z]*6|NeziՎtunu#\D핥\D︈E[}5lzk:x=a!yg7@M4HK5vEQ\*+!Hxwc^3'J%!woR<[x ֻ; r=w7O!ό%iũEPc5.B$\WݕWoR\GZs6qB۳* @;Ԝ[n(F2RZʃAg{ǽ?*w-u-tgػQ.>7kz _J|RQo-R8=9؇@B\VNdi?)#oB\- \3MYys߸DX;Ӵ?7?|t,0b; V=ꨪym3 QdE(^$ߐngB:K]\{>~= }ݴ?w?Ź/`s3klz˽J3WUv{KCEȃzŗ c5* ^HJ>l-CBk)Qwg:_Ož'tBdH:ۚ5 {}`; qF(r!ggkwY(6xCav*$O% -Ku+zePQ}e aMq#8k,`v}5WW)Wb{@//=S{i/=,<RJ8'a6Z{m%O>WQB_X_^:Ol D8;|rRmm@ʈiIu^~XmۅAog~}zO OȮ}mj6FzPh`TsVp_nﬢ4[8zܪ WLO771"g,yY/`= }VMxP= )b].PJؖI50inS Z~r~?ڦGIAglq}4_L}`%zK: l[.4q Lb_nZ:cl._y 'Kj]e&#k˅{zV5Ήv͡? &V\]=ES?``.pYjeRG)gE0>%/%5tQ= rDŽi׻o'}G􌋻gRv:ڷ) K+O]*[>ZOh++V)ֱxd3(( (~_lX:8 ߋVI Bµ=$w91G-kTm@>ԇoY8280UG[Qޥ]|O;/:? X!嘣1I*9=Gft7b 5<_P0}@P-ͪ䝙2߁35WXqk%g³Ū+"gMkqYS3k/Kw޿p7I87no{?So>5$N}Yyƨ ;%*fAu@R~x 0|O9{ 蹫UZ>Aģvƨ+G[џQ^s|磭Qr{ib{Ůova@}C.v.Wo;_ؙZ~n1REc,'\!|=..a~e<\ѿklowpgw -08]/m6sOw?}z*^~%^~҅zsWr噿tb_JFwW G> -D.c8vrAL?٤#_~%K~ҋ-6CŮM㎌F-tփ 'i%J; dii֨O#RrJe8b}X|V?M 'grWg>Y?oO3@Cu(Gwe˿e >5e-Z&iez@XKK݁^ -uw.9gg{{{<ϛ].CtVۃl%k%jF]<]>* v5t]iyĭ~1~ ~#|<" A?0@/>׃G,w` qa%SDq3W~W3A<wsW뼨uӲ: aB FD+0?_~ T.}rs*[ki`ju^Ssfo9K8 EC8 Ca>`H?ހ䮨+kinFb4x_<*%1f}0 2x_4#qsq>h)L0wkr -L##IuJ6 >Hz["G_`?7_-D-%Z :Œ-_;[<*?- rS n$R0\ְ5cAN' !ZN٭ 7 -^=n'WTn.|tL՞_1 x:">-(?F>)+m1 nY9pr K~|3"K>Y+➊ a]Q0'r COh>z aH݂J]F^-AN[oセ$qߔk"MYu[෾bM^a QՆ*p{ϒȺ3QD 1$}c{m5y^h6R#k wFoH^$ hC]梺 d|9KQ|@UMjlt'76n|3LbOF ^ġݼocN̢]YUe;?JWы;Ban)\Cu=bs"kI{~`߬^Oa0/AO谿h*XWTGV|`MXRLģ߼EG>ܗTHEa f̖z5fe_9T{Jw[m^8J^V;HjmfVfn{OQ:mo[O^6=> -`G$ԫ.[Qm[^wŢ4؇TG' J6:kUas4m>>ze)YI[RϴˎwƛGc_NpnDgT^חԈQCڈ!m(v/d|M5yi],h* }`:AP/nOk/Z314a+/LTle:޾Nl·f-A(Qw:pa^ӛ -G`ڳԍvNDwn"Ĕʐd6qfcoşEZ >5K̭+ˮwHC/뾝(tZ'[G]hc<?d5q틾s'v?HIW}m=O͆c+eqPמ_ɌwNu k%јX=6TǾڰ3u6~̾,71/)J_cD깎T/Ѣ]Oݡo]ζe$ʏ~kqsw- Q=A TdFL̽)܄ߍNz3_mHvyDj|U'_5[wҊ-1LTwó#ϓ%UafcUmMaiMa>LqgeHԧ5*r˕V߄^F[qkC+Bk_hIL|K #g'įZDZa*]};t\KwK︝.m&?VMoa=1yI벳wq}/,r,xOv}'ʞ0]m%3o&Y<;}?|{VkT^{[z=9)btIktesd]sd|]S]Y#zO\xU̡5+lup1Īk4 G# z-y9dWQ^AFzCႾ@x)J&| TFI>wxسm I{eH}{ocDzh˕s9׬NjJl'/H:;361?]Z]9|,nv*nrzV[]fO|vO|zo|`]hv-DW{BуK~+ѻ3~步a=mZa-Qn;_FQTc/VƦڐLiEWTPu!/e?.dH(ho=ߖqvP) 屢-ESSeM~9⑊HǮ ٯ=,ſ%D-U:p^UI_{ɞ{TzJeUqz;C=큒K&gaE i%h!5 ~5Q2(YZbhMH*7mqcG -J&dǻ7AJKv 6|t=m~C;F۾nfd}X~XCxC}E TkEAM9h5VGlvwla[listfG‘D mg:{w |IG},Jbr_R8-qgZ2uJ%"IŃmma⎮`_[7<ƪ*L{N橎ܔ# --^Y>K|칂 B -Շo5HjC7;B|hp={Og\|6b| -y咦HJofZ8ޗ'j%5ߖJ3͌i-6#4i2F[~ϘSؗ/&8} >a-*hPt0գ!.#rj_6Yx.TM5 -|CgZyǦ^*+ֹ% 2HM@ImQcGZfHspwcLDKDo` ΚہݹI2Yb,9$E#~s6VRetolqlQDBrZ˵!YRJ}UWcm{oƒ#TE'ǏPmv= ᩅE*c}#}K]`cpi !eҷѹgUֹD;G)u!?zt\#}㯵z&_z*-juhL~~ Eb읔7sZ1]糖9C<ثiv? vwk;Mly=uʹ.˳*:6[obJeAY%Ҩ `p-G& 2믍9] yQrTUPJ@Yvo|>jd(ZWп=ksu9z$.tlX,W9`!P>_?a>2WaA,࿚*3烹K R``:54A0?ike%=bޗ{ļr~ZV㛐P(\[>03ҤK1,J_.C>nmщ"[:"J~ l_6{T6t:ijpQXR/[ !0y:\,,a6 -&)`"**+U-{Lah ϧh$-m8__h¡Aۘ} P4jvqYo7I_^S=ZoDoJbJ*ޥFEn~-fRqZcqZ oY:vV-Y -fi`"sWRw9 kEI_Bp׾Ko I_JeCo o.J.g]{WX⭷[ǯ}b ܼ[-_-J]h27H%哏SgBڽi!c`Gmi8e =o79un9xGc7 p.n8|wֹEgG@IO]UX 2sS|06Pr<ǢJqC[rτjXl{i3L}] *h,[0j=g -,_u/>ui}SʴWw'<}7IW2o}޽Mx]Y$J -J]5[U^iUܯyn;4l/oټ̕DW6'c%gy(V ?~U -}LS+3`Aנo-)wv_kNxﴍnև `´؀+SWBmR -̝̟S TgswYSYɛ2z>i39`vk,WA;^l_BYዀew S9TmHwPgFG{JUg*4kǿ jSx*-3UpQS~%Klŵ@eF2q5e;P,[ s?]/J%Ȕ?:0 m%x){w٥bYuOJMK;-<RnZc-M#&1}'0~dgqTUZqZ,[x,Xy+x`JP]f/3 א`Q89U=Eg̋8&oyw%qfRg&[\#WܻR8F7r;:_nϠ<IL62̖ MZ = Vm5{O;mq,X/ `j ]Uug[ gTkj+P,$R)0ޔzH?Tz&ֺ'4FS+=SPNjeoәmϘϦOg9WySU7sfno|T3m[,\!˷؃uA`u¾EZrz7#}Hs^A5IlP]噌\OGVwgFw[*OXKEk5чVm0mg[3~() -BJιY -K{K482~=e#lv0gnh&Y`vshXVB:*6#VEo#/8G ~[szضa*Hu׺ˊy%kHyO7}5&tW7UŚp$t?_K~hMsmy1Ka1P+EZ|h$),`!PTխ`~8L -"[ϣ5j=m˻TR38;? `,n EuL^|0|z^?p5~&&&e8 +x^wKs>/J[R=]n%}Xrk~ƶLv$&Bz> i`ǫق`+j,_r,r&x,ll#mgfVLΣGN1Bi}5Yc-{>N mߜ`w?־-W,8ꋑõ.Qq4ڶqL{2yPed&<YJ`GU`ִM`2#B ǧ_(}Dj56otHeod}S]x%Rh1(L[s&GcTx?/󈭪tipJkL¾kyU b>Qf:~X8s3Xl; .`m4@qSqۃ+&?a˅'[<^* -+cʮ)<&v.߿vczf}PB=cV>F3jݴи N (gAʅW]t"Mx gInŚC]3clUUsյF4،%Ev'qu.:zBgQ" ;%qro(v8SE#BvBs9R_Jh~h"ҵxA9oG;Ӡa*|݂zBP4$f}FiWښoO뇽]hd;Q6|q mȫYxݘ{H#ǻo&+;ז~n*cHJdm|:$d}ڥ{>uu:MXuX`k=gЪq_ikwZNרw :&G]b^Z_wCxp/ZC1ޣީ_Mi n?}?[C8e:츼ƎPW}:F,MyMzudL׃DFfxg=2km9`ԕm-?mSY0ǚ%;w /=ځ1jX4f\ApZh+(jG`Wϑvo,bgnC z>nq9AEK)Mģ1X zK}(l4>(K,Zކ -YPicdL2A;i*T|ċXյN^0SgMƌ[`,rvn~f_80_o07sؽo`9S2?/l+:ݙ.Kza7YdVgY휘9~zHް)oS -쌂)` - ' 3ɭX7mNF'^˓MM9hr, -zܟvf(6wXJBk7jЇ %?Z-F_ƢsH?4섿fMD5:"b# #` y$@׿svrC\{!xO,ގ<~b.g\* }(8k5%:hLHUWH^4]\,OUZnt.n -:6Kq*v74sfkF 4ˣhpi676J@_L-NX-H2=+X7jxu1i/Kx ?2<ؘ&Dyb -{udDfV;EE+j-C>ZPRHޣ*i{t'*_7cZl諛}Zؿe/>c㰩S̃ __X<=lkK>1/:n;Qm;/\^/[C滇(cQWw5/L y=o1gķ;{g?9mV섽%[WvRz?)ߪ.alA ,װ;-4"Uu Mzoz~j]*z&|1[f{g%;i';op?/:5s.B%5',+_/DKw\#+EO:u5:HIY+qwG\NQ>_)<?;Iϩh)]܏t-by72:&M:@kw\'7YVݮ?5Ó' Tl`v\\jha7VL\"h8Pml#mbqQ%u}ĐH>O9Hfk>eMw~fu"<+flZfRsڒK[q31C0hYil嫤z1`/(pf =ZH_ Ɲ@O-)y]=8 tXƁPb`quoJ uho7z!Hu[~>k=?0ީ)k;ΑCb*ό]Md,d42U4j+nV}"˖lڿMKF;4ao4|ɲiyօE/jv=ͲWx}E>H\y6A<2o} -L5{,K66tw ;l 䂼.vRH9r|xe٨ij,| - -ʋm 01b3b6\W`tqN_!9ö"i%>3Mp} -3L4ZvJ7is0mܜu.$];vqiE8伢8 =6\4k2V -)I"KʌfDꔢi"b%Z9" LZ;)א:SJd7kZ>cqmDA|,'{KKW[`E_5Ns}>' -9L-X/< Zs&b,r -8c!8_y/FnA{Wndu O)r@J+2,Bq.`7fp0?̥7%|6kq&x:]nR`iȫC\|uPeJ⣱%^Zol1E~qy=]誳q'g"g7 -&8) ma1Ѿ"oԈ *X𜈝Bxgx~sO^K>@dth7{[x۾" > ~FA~Muղowu7&n'!k9ص1MBƂK˶rsn~W9ɔX`ǚ`Ӭ`-@[[>m0?64!loS -|eDFE#q+y }f#%MekYٍ9xO&BrW7Y۵BddP -K617bAQ=r>`_О0ľpCaq/1O7;+yzc,`]].\x\6qTklt?;MFL=!#~g鑾 *Z%4F0XL {MNM@H -~J>frԣM}ho%fuւVe)x)?b c??:7_#XqjYɤG*j=Ld4h+zc- Ym›LP*,4G-_:SZsI2F{q[?xytppxۇL!24ɜ>ü3VQ.4[0ՌxEĔGJH:Ƀ#ۍ<ą!,g &:~cؐw}HͰ=h|i'`]y4;} ,/H+7%b7cL1R85Spw -~:`*c0E!<= oŲG4nu|3ZEΑAbH"m&"# qXM$*lSxF@hv0Bn%//E'\z;b mIx?< bQH7y[kdHw2&C@dFC;1# cN='>V.aqa=`l*/e1#q{2B|BTLH;9{1]q3%C2+ -zZJzwJ {ګ'لY{kg9 -*ՀQqwe(WJDwH/16a O<}{,`ܰ1y1#XS4b[AiH+q=e-{chTͰӎMF([s,xj$+Sя".b*a;Q.Qǹe?P1PSl&qu<:p(Qu&Wu*6yqoD}|oۼxlvV°!c_@s/{rKAi)OJ[@_vLp1}!q&l:Z]o%~[訙%A֮ZKRhosrɍӈ_9%~D<$pE^| 6qķ F]蟼k$xe?2Kb'sŎS2pҝE8=.@~)yc$͉ۜPD\LFbBy@XW6?<gGEˆM Фë -/" - qfiwjԑa6 O}C)3g n'PnnWmJi&񤲽h#m %MET%fa8o}^ ieP1&14/9vy%䟱88k˝T]䛷ћ-DO+j?[+iu`@z[+Ӊ 1*w"ѥkZ}EU+7ҧۑ] -ΙxN$%+5P=(baYmj{짘YHSں}ehDxdDSIyyv5سzطi7@\NK9 )Zrk%6qKv -RG!HϜ}b -Wt= -y-Dek!3θOUg?/,ǟXr~9F8LsC^&8@6gwjc_mF~RO]1c> N1:NHYb!xǦ0OM.L,+1Ly䒃ךG[]L(G!>ɵK;z?}lDCk-<cOC| I'/Ai'".=e{R#n+m+~pK䌌M2CÑD1yc};F*_(-* :2S3 iQjga 0/=lfj>By.: 倘Ib Ѫ*HXx(20".>8S~(Q,P(RgONmF_fƅ6]b,n22ou#|]k'yY~ - 4 Ϊ_1^k42K0,nTSfz;bzDt{f s+2ڋaAlzJ/R³rRBu//zXh\^ -YQ"Q'.QJ$@`#)n!G4VDtSE(#%qHP -+Hd3⨣sH(a;yⴒtt8,lw2i ;O:GF_M5UZ2pvU] GӪܛcZxԋDDb*c:OG-BzHvեtO t \ -r͉|P\dtNDZ)h0stA܌v_z¼F.b9 0AYG&,:'#4dq0e-Q { -TRH)pF:3&h;Nct 4s m~sT^Z[t}5ץ'y\vļu@6c?u"] |{ =A~Z Chg #,ؚv?-1J?FTMh3\ňl/,Qr Cc8ǹ<ҚG!Q>-X~us"e6ˋ]H?BGZ1-H3<(w51 1,t0^qu.=x$R`cX_>]qQU+/f6v{nt/uŰD]h-ks^0/Gq]FcB9'Wtp&V'fr=}8 =hsn.BsF;+_Y!H; wSE> 3V -ޟY䉀\hNY˓b2Tk@<5TǃqY98;ӛ^ǿŰ0;uiҫ3s/V[B,5HJtrdt.p9I,nF(v?ÙEψs~wMYGc{/Nh|H{MAQSnjg,"s 儴$Fz&NN:P_v\Jβq qO_,zS⛿Z?3rMh(B:bo"A_Uh7益a0gxHOv2Fb"%,./(>m\&N9Oڜ/u|4f=c狼!Ir=wJxi0|(o\"=ˆ;!3mIKkVXܔc2&7R5PNv^D'<'Fm,ehZD2:h9ȿ5Y h-/,o#U= \Cg!2QmY?$7?1|q/:r sž=yyEC`QQm۶Ābu[9usBUb IrPs9s9+QIi7D;nk粕@QUc1[R~KQM55W)K7C H3l)녚v,ID ?H=Gwݳ?z ּ c,j ol#s&6O|~m>kjbna-Ff R'":rmspjT 6dpcOrVכ 7,#-4%cyvq'=+q3|OK]h4 -697mѕOhw,WN"4hf?u?AUSCB(8TqزU-T#!Т7FrT4UZt -o5" 5Ӕ5 2վQ4Q;i)΢ S,.r,͘&{6u\-RB?Y=Yrk%Hn) q0 bm~wZrtޟtb&}@SIKHOb@hEޗem?@Pni -@F -+k-DLArr>x1Wm t6擏̀^717mai򥸒m$\>TU[v8ҝ}C;vW?:0GL?H3\fs6J},"&Y4E n/z$ArCjg; q+Pڸ-"hZ\Tg_.y{ς.HP_l+jgKC|^ݏ`+LAzOR©9J߼Ѭr`&j -"Zۨl_)/; g w~rn,N26bx+ިHa*9(w% Kﭱ(o0Z2~z -|]FlU20Bz4kP FuNtAc݅O) !zzLh)|D[28j[zxw l)Lr,GMDoo8h "~1kqȒmcN]R=[-СNʧ_^JllubZJ3Aᢉݓ,@}tI._޼B<جP|Y^R{.%CM >0:uYwCTՍlej9IAXk >b2}ShΜy蛩grd aeLfA9cnbX;>Ǹ.6b%H>\ԠZooKT(Es ,jQ6p?Ŕsc3QGɕ5t1TBzIU8:kmLHkVT5LE̩RСVc ܃-YMB14w 4s o-.֛isd̀}"P2X ȿX}f.t֑ϛ.Я*$P]=,SnG#ȼL>'yB 3'CY>8o=;6BPuQÏB/.r"Wں{=Y."YǐK=a_{]!/ ->M[j!E糶nؓZ8t8f=9kk`"#l'v5fa=z爉5H`F3| "1 禌3U̺19?)t'sDp.A:t,~8)B-?B2v-Э&Fz@V񵓥0V>9+W_Yuz:1!FbYdR|>] $R<sW&/\c<"rɹc&S}8! 8_ BZIUć $9@oJtm(J&WU#Ko6cL p4r仸IXomCc31[\t$3W|{ʉػyz蝫8{% {:ı4C7KTO -f[hQ&Oϧ:9ΧG>%>\A+uv2]ޅ;# pl@ ٬ 1l%B - rTO Fur!t`"賉U Gz-:Wu:ȓ]MCt?pI -Dhb _)Cq)l N+@4z"LEҩwp9zmRxw9زw׆Nٞg?ˎ=7<7k:7+RLewF!q`:tHϛs_z|=_z|=_z|=_z|=_z|=>&O^jjQWgM-3fVwz,ܱzr<7o΂EslXJG~}{k6]??ږ\>?MjbkO'/;O<}n_eoϣ8d@s$ҟ?OP_Tӷ!op}3rS,[K<-r"5wp]{z}_lܑ]kmw:Xۮ17sbDr⳩O~{ {R>9% pހM|m[#9$LzK|O,{M,n!ɐe m4LX{M< r+ #Sk Cc;fZ3`ȘɶiF..NmCs*cfŏMyHa49i7LMp(in6rגtm}7Y0[_[%cfkJ̺W3ƔDobI_c;h(|zE4Mo)_Wߴg{٢O{ї*z'gp^ӔП^:%Prqo?\-#E9Zzbm+mr$+a(YX#ַ9z* h ^&p,6D4ofr[9kCWpꭰ\:"o\2K sa^'rn:R@H)~teHxdJ68&TOVx~z \NAoX܎|0'}8kTZ=x MS!"$tg; - '-o H&GmljabfDb=e ޙZnC:l15]dz䞒 n}et1:07#S9jȜA9=e`ʧ<ߑ:s 4Uaڡnp[j n&sX{/λ_<@l/a߽\/9M;mX4FZN室੤^>a?~ -]%o##(wLL?H<[A9Z‹)_@7CxؼohGӻ;a8(7`k|8 - -Uc:pAW -~gaG@.J -3;ynd'ؾ޵g ћ!P)&ܕ'u`g/zbhOp۔BS ?`=+X{=;=9b8%k -{ w=5%F휵1KxVsJ#3f,oʝw-DrG/9y FcQjQ]d[kU xgq~lu.B|FÔנ|лۇ3WzjoآShcqDbO9x79#$w-sQ ^cX;m3q_r釞\ooRiC@GjqL h.+ɷ/a3]CKc^5=NO+z7◕;I;b!s,1O==ndeɘkRT$p}9L}r±RUO 蹣}D6?&(k> 9HPqG^a0o -4BE%3`]~ ؕzc`.+Glq1ܢbdy?I -kOmN/{7ˬ.XƘr6_o!}SXzks b-s 9@ܙ4 K#y( 7%gMC:rK^)|$R> #$'_pE9CoS:-'O7D+R]iQU=qsFRt$Ɓ[I,%$_;`6_#Bp=_q{'}P(8进Ne8%ʁGȹ|3mk\Bxt=μ}iC -.:zo9@ ݡo[5 ʀq k$zѧ 5tH֕{7?,RJ|-+VdQ~d:z~ޜSi@ks q1H<Ŏ^V7E N -ܻb_!P=?=rڬkppqGGQ;8Vr,?Yzh+=ZN9 )\~YzݙzGzXD0aHXj!R [(Ѵo`;! $8']rSyEv1CI%cdb^o7)E8Oʗnb=y_^C ...4 -I{KѓZ>84n7ɽ 5 \g.3\4 tgImΤ;ו;ew/#r;-B\ -X}po/!tʕ _E:y%|n.[$oFH<3ͻK;?r,'A8b~3G?w.ঢ়D =1l!\{YxG9BW/|sQ_YnK1໸P$>);ni*G ڋK6 Wa2?( BkHRN(g`K> v%A~/T Th:pa%c)Og@z}уh|3<;EO΃Xbxx>,asdb p~A.tW*EN§އf7I8v++2}FWN44H,7W{SEӌ_2GrC|Ǎ=9Ŵ747t"~:L?K>=\`(A}"d44sA G.KTn 9o;>w v@bD /e_KN9-J:Vd|ECS@vvaDÇW؊א5 H$f7F".=gI|H|2j У=8D0u&y"$v򟟧2"6 ?D{?s -Y*vs=+ME;[q6^ژgSMlHlᬅ#N}p PZ0ƒzO?'v(k 1w 9I>$C_ oO gH@- Z ow4I ?:ƙ,dGg`~!6 LDyZ>dz{lcN\#'OBy;3GP_KbZ(6KX3O;9Wԑ(GQE\Ջ'ݝrܸG|uUA==5p|'54:[ yTlCq0WP\P\Xȟ3vjC2Nw -сOA܇3!|>9zd.G!-զ$11`Lk ʯI۵ M༗Z(η7r{/:LjE{hq>Rځ## [`4ɑuy1{ rFるĐ;\~-/y<\E\K;6,nG " n=CK"'UHx`Qop&|AxgM!b90ףj*FqRxxX %=oFd`hc+&*J~PIy0㫧[O(:w./=Z?r>g^es,ӯ/F}[(krBk,d X܃NrEV -%-kUmn$q%`,RaN%hDTS|Lb‰|ʹ9\%F2 ؅fYON -sꑐr; !"$8$v: {@-gGWOkm.&+bk=i02jேM^H xsZw'x m6s EkuFm;2FIzxM 3b0p>G+/T#Yەl@؟䤉,Ɂp(=9/+T=QC7֓h'p.i>/R :PWz -3wW'i -endstream endobj 90 0 obj <>stream -ÃS;Ou{"iL[ yp9s~iy*+j0ЩOuxSÓW qO<9-}n qQ/e'/{:f|twΔ -GΉ< WE-?*JZ~7RWG6JH?<WBl9B®=λ~O5ȹ{ɽvWZ=ZIELFrxޯքZ!e|tDZ#DfMu -yg[*E e 9=u(2 <#cmJ"vH/ ^h)')j_aEg3@їuR>|]9΍rYbk'y:͛pq 5|5f N̂OT^ʥ]%æ#+HmC+#+>w/Ƚ:\ѩ{@4ԮEW{N٫8MsI76$fCN&yhA+ zZRAjhc@7t^eؕwu }rR|?c=hrv\mV/:0STcÉy?'J~jQ/'yDpLkϔuy!|f!oM6+HlIwKD?u>h= - ԓcO?]_#; 䎥סAƖ֝k&|($FyPgubCP~IV|kp ܆`q;sDw-Kr07q:@L1rE ԓ=ɧg Ka9cE|ܷ8G|y|(Ѓds./jS\R[/T7,ƞc$=aҚsHʖjcmx>dr+6FEHhc~1wJHŷ -Km ePҾtPΎ}ġ_*tV$N>NkK/nyqkW }l ,rUx=b l؆r5Zʕ4 -@8q:%ӴZ) seSFJ9/CknQL>*wЄ*1Ik}+B^I]N>=;'K"~rڏK1bKmBA'(b GQ?3y]CnGO_S?YoX?94ɍ Wxd&,$/WlC5 -ӵqS.ΥT_#vʙ́m4oY[h611jSXq?N} m \6]@~ 𾨑5ψ T&i hE~2N΅v ^ h> y^Rg~C1w53(eg6K9mCܠ"TnR?_őܖ<Rh`D98]Z$zkicQԄ61]yhX= QвNr"qq~I0Wxva -c2P4!xh&!# X22V2[Dj[T -uI6s&ͫ mg԰Dߠ@!UN,]+wu)cPn=|;R<@P݈TE3֔cT={VSu!ug4Tn {CvQּFxECڡEmuHH!ѣAbն v!9__ֳ7/GH{ER~ -DPHCb+紳/ &4xrb1cń!y FHՍXf62ВEfyz/F kX``ʱL GHP D^RhS L/ߴsMdN-6817BsgE\TÀelV0*hMۼb麆6j箍{%:=_ -QlyfG9QVY\%Ę79g𮦎XG<'Տ G5eĊƍVsi3ck{A `-$~F }(%E - ƐY6WoAK!:jR5ax;i a4seMʞw2P_oX4Z9 LEf@^ru2C Mt.}gͺ=V|iafu̪5MLcޑwVwt#"'y?EM+~9z^`y#6!\^,m>ݬkYbl5kUZ^a@ 6| hY&}^:荲+Kĸ#ŨT[k~#Q"u?ic(HJׅ"CR)\"t1O.6rpwK -_1'/l6bleTd`/UWO֋%Mkʇcm7~VA0C"O7j`}bzQQ'btHjc`͸ |⾩T2rf+|+3Gւ0_s[/m $GmQ{  G+I4Q@=6ճWzj6SmX!(g`vg=˘tb6 7`e.mSa}kCQ`QOCkpL'8;e벣#C!1CV'%웁,aЁU=[A(F CQu娙vĘ_1=gAr] K*5O΁^^sMaqG+[f]&3խj(l ->pd"byΥn--#S㳠?>p]܉=4YQjPP:>pYld3̇ &y_:*rJ#{3օPp{b͏qc:{{[Jbb4sX]h#Oܑ֪`}!npX1fp]t֢8տD!ŧ%"h䭨J3K^+g@S؇rrxb6kXcbBE?z a͔^Gp3QhEa6vjM@=\NuEbz-вv ܂ bZq=$7¿ T^ִuzM!MSd^\DS"MGΆaa:k:נEGTcj=˄i] CMqnҁiX+:Ew7"3f ~Y/`5 ao,bk_m,v$QX;н)b]={=13 %êBCķ®O"t"KBrb1L)vO6pr6uc Ŭa#;> ԅI~![ ~i!4h=Ӡ -}!h@k:~'UN5A a5㨲?x(3wq1]r7G碞e\ZmY~E%T0?b+qk!=/GȖ?]-VB'ׅkè: -B W2IN9Apys#LNL琿 ꛯ',ņ/W/=|od'nǭw\OEu-\IJ]B/v&AktcGf]"zZQѾn(ֶ խ[w)/}i9v({G= f>WYVdW].{N8H#-vx\g^JqHνEUDx 5(.?bCkƱ{ˣNN0)x4X:WoՊo5of zu~ -b_{7:ީåƖ ;{=N.>vV{bq􁵪LYؼNYh#W־0s'+)Ēss+ZMP="zKT -zXC|?33O<V#{S;q3zEdU/VGrC#q>*7[/+{*X Ү΃]/ UO ^+>m(Te}%|_A_I -Y+W^mZvM쁗(~4Th̝yϿ!~Q_yMnoPKo -rg;#M*nO!Wz΍ϼ>*|<[Y%Oטmu2-NZ\飺.}e!x>O=Y@yeW2̄wt*[BT3-~c3+ob_1u22 -rn'=L޽Շ{1}{C]cjǧRWU]S-_Wo{zH)GV+GrxS:biu|NyH5?Y.{a:ٲ?F ?ԌN#LTȬ5ZxBV<[6;ͤ⥇K.#"?=N%|!\{ȝbO ϬOklٛ{pǺX3I:nk']k'ƪӍoչNN=Ҕe(~J۬O~3h|*Wxf.?RV^͖ʝߵҍk|kT\|/q'_rMoDű22X^owz /ڣ-͔>:ZwqW*~f; -y4/'*DRyaݙKsgceg߳Y%{ļbMNfG۾ö޽ayힿtYy]kRi,s|M.v,D^5dýdϗ§T'j1yۺ(5Tz۞jx嫻jugY{"kv?V+ޯT^jsq?XuQڞ=A{)Iw|,;RjXdv^senCwCwZ'ˎbt1F{ҍ&,L^.7O<>,e\[{hii˶8mG-}޿[7K?d:?Z㕟^ʓ>=˯T7[ش+s(}܌ vv.wWhUiPo8lŝ~*g_N;zt鑫tx晵S8OPU{SYϏl|v+5]sm -X^euaoC e4I'Y[w]qyzīҡTx5PBf* ݝ%4n(u3p秵yF$K̅ ھ:mz4ק&kf]y7"ǽ,WIlRwI6/.p}NvoQAV.v-ϵPrWZy9fYsd~TO.l{vMs.x՝l$Ev㓅οRpw8sOd-o^> -Řؼ8#>0= UԼ_ft+uo6kKgu~yCx^QcDARK\QDKj񎎲b6fH=MdTB'{sޞ4m&t 7fir6Ә{S)'o_ܢLYԀ/jY{gb '.`k+Y_V˲So6Sߝ+?A|X" -U]hY;ۊ&D>L..mˏ~\쬋e=a:5,q\nfkxnus%(@cp؆ Iq9ޏr>ſ~{]xo<ꬼꮼ`tՁ?;Lŏm }^ĺt-]ޱĥ`A[ٽWZ oG[&W\lrΓ[_ؼu^ry Up{o; W.yv6bJ6u~ǩY)MY =Ioەz/Fƽ>i&ߌ{2OeUׇe绷VY&oI~yV-og9wwsQ<ݵUф+mv*ߴ/:#KÅ_%˰|Ӥ:__sxY~7V9-uxKji5m^\QoB޶G -_K{s9P}oƍV+m>7k|ӯ=M?u̻򦰜a9 9MIyOS{t*nvxZޫll.K!}F^vT.N?Ul) 1ʖQI!VOnkOj`^xlϯ빳oD-ܫ7/k.Kqͫ9~9ECFw֔*M9t)hO.|_0T}90#MYg8]T.8Ƚ`u~}d㳽$Y{AsptxGjx!vАѐڜ_RԐX̾xjzܬqO) oGVގ |M쫤$1đ[݆W ex]5'M~*'r?'<.7gxUu% vOFykP#y?_v0}?\%S廳AYIMqy"oGf4ez<.|\QVjZ-M-Y$A8l.ik^^SQ[dH7m^>>/U{s}ס뷧զϺL;>سw{ѵ+ݛj~_lxvoP㠒FM&*޼rz'?-"Ax˃jӿt0|mu]rn]7gnOӿw{7G4G5ذ[ڒ>xŭHu~;=.n-ז_|Ք$JH|'ǐMft{ٿ858vwVVRMIVne +Sm段rOjf%V3 b-d%3o1B.u5>}_gdU^9p52;FBNI1; o^[lH>EE巢+%!!*8ϼ?,>^˨l ͹L6O|?gbc5EfX}fB/=f<nje1ߐ>~FoLfVMRUYfʐf4yhFWK 3>3FfE+&/v`-^Vpwˮ;[y7neު ʼ^qNPVICxnn}t~lSRqxSZQɭCtLwb2n}sN-ӛ}&,-#;qT2 -nmqs6j[50;{,68ս єf$̄Q}IF0Lfӏ!A䧑pF_k3i>3w)eJ V~{ɯݮfvZ&y(}_EK%93e0L/O\h~yfj'-[̼""QsKI ٹwboTވ}=2C'fuuCod5%u <)lWgnޕJm' Gfiǹ!gIcӟCׁLǫ́!9mzfIL|#ɩs_~C2oEd &>&Ɣ|gӣ6O :r'D_&[3k[Bp[jAs̎,v͹:vO[#5ߛ!%4XP/W zu|N|2g̬Lx2b݁Fﻷ]UϚR;/d9tnyw -&17cs0'D\B ֺܮYǺDyv[ytn۽~3רLdf#fzoA^voT|u$rB᫑箇朽wvH;!޼{ZXvڝxuXcz^j}|nJClNu#ɻCJ#s~Z{ɺCWiΝ9`?zjskQ;| =؛{=P~WeF1C'1cFe,\{AVN'RY|ؽ< y%^_Kvӽj"cvhQ!E-r -%sFXNW(:w1M?#1q"滩2f]BXqtٶ-sRTݿ^V_RrFXe7A Yx7dmPۼN?7Dc3Bk3HC0Ɛ?=k3Pk"3,fFfƊPfګw\&EMbBvhCz>*51爯,#a|77YHӑcGS~0P2 _|%~/0OuW5;5p!a3#G,e.fc ?u3zV10K-jf`v(٥yw:ыQE$=Qq=ٝ7w"wV)MKpYGS`Q}}p1 Ki_ 85R[k$iED~?5_2k3,fX Qc2M#o}/X,kj«)s-,aE ɿy34ğ^sF<^5c|:Գ}_G}~0Ǒo8=gfu̸&I&1mbNٛә:uW+=y1%▛qgn 6ɫTu_{7(͐웷5޽uSąIl}]}gE=sPAQhi!s1~f&V2Swe&,#'f 3A"gF7fF\|Ff̏u=`ֺh{Cyr{" _(^Db|A7k0^p0߻ ?b{Eu}ߛQAT XAff)tH UP ذk,QkLDc=Ĩ9i$}ϳ~<{ϝU^7?a C;Sfr*co=)d1K{%2zn&15̸Y%긑ۦCO'_>6A_ r/Thd,fq;ܗz^)z`'7I-Qy_t4϶ ?3kCڈTHd^ِ9gk4<7"c8o^wȹxn(f]zmw[>/v<?="=co:bA$b[(l2d,fŒ[ƌ2♉rk ̘幌W3+haf2ty>~~57v֗_ii;V|pʕҭ6ݪixz ouHݏ'88c1͵#eLbΌ8FmӆgkhGo,3™K|#y 8gf0c$0㗖0[ǔ#U-я|w'ypw{65^r|ۗn}H+%>+lNn_緿~Ž[B~6s:us?6#eA-C5Eѓ`3Zfl`fx~c?֛ƌYD\H=37Gw{B5j?J|K$&6面+|p -:EXKL/svZoѿ~aE΅dSX'?rO+3vÉJ|&gdrXŒqwgF1xf8fZfܲ[4>5_tF?zIo#V\y~|tUM6nJeﵫ%^.۪kC R_\5ByYD]4߱M?b9̨3q>d.L/5WYgg]0_u|~S5-] ʀE8~CzgO<'<ԫ_ՁO>;,8}$w.i3~A+4HɟT##KYΓviH ~}=ɇ3vcrfҊTf&[LgYFf^#׍_ ~/n ]hqm1pK<`ղg6~.O|S6SZyzɷ3-O&M.>6]/#zC_!ӿ~ N܍|, C5uFFszf$ןˌvR0c1ή D\f\LsIӽɓ $f[g0k+zs}H+}8ӯ1_jRxZ/9x}mΗ]n>\M~ݵQ>V_(>kU_ZyE7*nov8]j#g̷Q-f>1MQ_(/90\yZ4د?ю`y#DśMh?s4?e1oJc\/,բ.=?G׬x_qK?[W?rlvһ/a ş؞Ei->\Rz{旻şZtZo1o!Šٞ|9]4IMCSHބr{U0}9h߶iD,c ̌/1.K6[#/_SxD|}=|K~?GC'nz_3eߺ(o#R }|kN:)vܟ˿VTnlx~:qa^uֵIg ;߮o -N=Ÿ\~{^vS/Y_˜F!kό -e\r~1O2ߋ}KO^{ O>Ϗ`G7U߿ 6l%20TZn=xM/|\)>~V(>6Of#rc{7?UF+UD`tғD‹Hͧ7BY:kOn^ٯ"+?E׻\beÚČT_~B~ԧևK@.taaSMBNU?^lowΓ֝QNm~xVv[/af@eǠKʛM/!c(CӌBT K0$KG.?]zX"$:0m咠4f Ft=4a6|3U,ovytχeT}U\ o.ޟY,_K&i?.|Z"za:<EnWt/yY VVm2ڛ?R|Uqprh͆b%{? yRw~tKJCҷX~ vnfTOfz@ -$}I} -ktobK$ :L_O%cD60">2rmDigKź3̢#%xLxpe+.KV>åHD9`J;^z M/=5kO=_6]| ]~'}yv! }cC-Gz[xa -=n#v8GI|=%?W -9цt|YHsUȅ<Վ=</D/%r}XaNGա7or]g7JWf(B_[b+\g_w "/fa u2ƣ'ʸ+Q\ !6ېUZfVR5Ut9?`'UZ)xwe{1O{(;lsXNpId|ɿb[og7o86IXw|;ZqEbaOz^[5v滻u'jCk<[!ɍ7l}A>W7}&gI~_Y~"*GӅI"ҷ ]܏+ڣQddY8al<&x4,I/H-8x1JgTQ{LUw-þZ__S@ŶsN{6o~?&[y{YϷ s < ]?/y^VPx]|QrC/.7s -J.1 L1 -H6aܦaV2`2J,ЄEBaH\[fX陨-,mT];-v;%m|V 'D|v;FU}t2<1^sY˰Rwz>Rԍ:8hV}8Y~U`T~w١^)}NNgwB?_>{_#K2^A䜼O -Ō*%L8"XH>qW˕:= -NbtɅЋ&~z膆w;d9[w`ފdo<9'G=?i?>X= BڟoT|OW"TUӔ' ;ɩG'wD?/he&˗ f)2 -P3K]=_-ǸOwa|ע }%+?`F).(<-*{|xEi˚FQ{~U_i}?zqGzpWm1fLT]{ipO{]vأ]p[ck昳끋o!~^vslכ}?$5,hCxed%[m~qNBZϓlQj* 1&3Kg/`ɼ ,=mV XlY~%S^:Xޏm>=/m)6F߶;z`*d?:Ld -Ł_<{Xi;^'xpw z/ >O >qJzB݇称xgϗ6?6+leKZ+ -;k5]$c6f 4F2.0PejXh<7FY֣+EKTa6ވ⤮N0ȹBETe6mZhaq@ۑtl噪N;v's{_sGAKI0dO{v בm2/qrluǃȞ~";Wc?{ue)kSTrTS%WY`\?&W3'n՜fZ٪W\g@0QҞQ\EBSwp3D8G| -_9Jn76۪8U'^K/u/Wa/cS#ys^M aF=`u矬}zJ+?_O(ciƐ@Q*W癆D٦J] -/f,zllzRb1D5T3*.LL6J5Gic߄UmzkeE>uC{ky9t~keG'N\ƣSH0EbY![k]pV"bfOc/2@"e ܖ?Ȇ>dȯBKwU7<3/V"%+T#)ZCe#-],Su^Lre.c?G㔻-a0ts3 ^ҹd~ݮ춛C0ÅGsg^$&.b9*d\7x8q!\ap2>$CnMPb rL}oc؄b36’/&(}Ɠ[+_q#/UOCd B-=u]o*Z>y1?S9X\hƃvlщl{TV|H~ʬVkpfޤ qYs+W2~J_H~"2<-c|<2Hl zZO" Y=l!Տvyd%n6Ԃ7^8$X{+uKZG%RzN>{b䃞0сq݅?*D:"Jy>U7˻_tHYupYzk`fϓxBV5+jA󛖏P`)s3c#㕻^.?'3x -]_e5fk,B Rn2,=Uk -E;G -5''/}K|Z`.ƊK,1g -)TvVxF{ߟz+I ՞"J:Hp;Y`wO $6?_/^dpLnP2m<>Uu]>FuwRwܛjfXݯz_mp|Wᠬ>1N#qx/ d /$G6̏='d 3%B/}؞K!bJTݑk97Kh8;L>/o#F[xhmpMBV{Idez0(K2eo%[PΆ'ӟ C؂`5J*}NM>ɥ[QP&Yŝ#1_T~vRqݑ`Sc !n{?ÚGh*%Yr8 I2rl`{_!M6:+Š]^h31$dV Å?etFsVg1g0?Vb);"oawR< Rˠ&Pgl 6,XO0]:T_<[4㓂呌2&0DbL|hpJ->!R=Hi 2AB`ʅ%#P~gRu} Ri$v˅9TSd>>9}>=b#?ʣ c-xk>LѾl]+Ds䮀|160SEjՎO]=-U}8IrY2m!Gj0hL 6Pn $~3"sLjve%eŗ[0F[num{"N|/6 .Jly7 -OJǜHNl!&Dm\O:8Zd ?f 0ٌCIgYemm2 -"1P%2$S5bOб# Cmc f jleyA,n$H gdt(3*C>T=A_jBO<]gt8#6,_e+U;n/ԉ!|;1D(ju2kC2*^h6nG(r"RM_D;Xa ̰N& I`73b<`5ۋ5Ǔ}9®|b9yv=Uć3z趎![.U^vA,>|!]{>=aė6ⳚI|9O*.j@U@mBky6QjSH+'4!qT[ -7iK"M\!Dhn|S^o:eV| yʝrTͭ;1gW tgW 8El_:e$ -IL/66'` .&ի$&L)1|DFl,bFRqH]tl2ZH1'gi UB\)8uB'nRi[j ^75/<JuKS}Zwjv}!0 Xr- -f*l'VY2L!f6SM\0`WR-.'~M"'߁˓ZF5e}Tout+Ο-`CKIb56TàQS}x2Ia,綷f=z]oa󹹰K؏u,f --UQW9ƧZa@j r횛yc9_bF;kmt tM#5;B@[{l:X\U7; -n7>j+UD191NotW4>,ㅸ*s!؜%OA\i +XqQØa- l"aW>TcP5?)x.uv= v=w~ Zz[{ Xa?|i#96*l@j_sWBNd.T֖4P7+tX!u$Js2UǒX7ju>Z*} -ºI櫺иF>JZge6[)uU2!cJf r _zH]+W h -MWQgMi<ǵ~P*:y1Šw yW:9לy4^Ɵx)7؂(S&_ϨN$h'K/$m+tҕluD E1*1f5{%uFTӆKXg WV˅Mq˭uBrrs=廜|F<g?V3C㺿s#6OIu{ -0_HULch˪#o6JWjʔ2)ӶԒ2/ !Όn hPm*+[Xg|hfݰb+hŭ3{;s=6ƥ"s6R4m] pxÆGXRK 1jgMu -ZG@;KYR!o4WΪZT&x)6<vJiӕԎW*b[Кk4j8 k [l&F J7tX>P)DPhC9-\ԝw{w<^NbγMw~?xkO>zDL?<Bb.ɚ+֟o4k c%#k{0oCC&zͽ*HTzQDb7m>WyD*ɵS;Y$K)Ym|*-$Zb81PВ -0#MZt6W^묩>ctM$j0L`zS ):[$N\=zu#4&K-W`qo+͞2ȸ)BgqSۋ(g\{o<:ZGyfTC_b (MrEvVA,hg z&YӅn C$f5YWvVt@].5$QT+mP` KmfGqUǕ[Pn'ppK__f5[H&]=TwbhMwisyO';p3{\ MMQ1lSIV 36Z#C7+0qa*訕pn-D+w@g  -5CĘ갮Lس*jJ;j0<^ ]"/*ImTL/ROX#BL`//1O܁|3m\::c;>ZTet#kxO.ȵ]tglFު!>S5Ϻ7=Cj;2;8Ў6}=X[?pQ=_w=Zz y# jF.vzvR@[$>Ch2\=(DL`uFZ;]ŎAG]NMwOՂ>4 {)@Ol8z -^I1Y*^dxhgY~ڌZMfِЄAhRLdu">Y Dhѵs蚵^&X -}Wuv R-/ρ -lnOcuj$Tt(1#t9z>'ͣ%a9-߰wv*݁{jgr/\vo?0mjg -YE2 -\$%Q,-U֯W?2qF@jK ۑB;d#@N-0mV5-#@_O)>lE@ -9NNhjsg\Kub'ouvnG/T;/!kyVuBb@.<(O(8RGYF0m 5 NQ$) ֿ7zV1~*Eqfþy%:sI-#4R?bw=v? Y`')vVjgnZ)\LEl W6O,/As+뚠?o;"5+UvZ{'hZ]ZHumq%j,vn.vxr'͆3DiiX!/kOP}'RcZcÉRe֫' 4óMI]kTM|6k3TK&G9UĶy- #C4:ڢQB't:BsC3=&tYb2\J-DF5`-L vM}`cmaMD]3߈quE=JbٶQЬ}.MWS:ͩF5 H&5}cI מF%IMAӱ9P=v['tB M2V)$FMI7at=_ hݶuxzqU7滛\S6;h$uc?*:BHĜ~jkw;ohC]ox|zѕؘr,tͪo -ރjU'\6N9*ԓZr;w"=wMtdN`]ekcNM%H=9@j ',g[a$;;|h@S9ZkQBl p=ߟ%Կ7 kB\M52L(^/4@g k%/<&TMŁ С֖tqܒΣ̀ӱzFcZOL1to&Da_pECzCz{1՝>9[t2ͺ}94oIGsֺ#S>@]m$4-qx]o 4& -?\JS1)[Fh;=!߹֋-gf@gRh -B -yU2IHcBI2B$|l|o=< u/6_%luv>ZCy  vYǐK=a_{XBq>ޛ6B݋磓M'k)֘([CS{c|j ?Ӫi cdӯgLu)XC=H2+Eb4r$|7mU$uXQW#OS}|< {""sut,@TC>RyDmmQgEd|Aƣ3PjhWr&5 -srqcZV%v\e܎;Ե$bc3}wЉzYcM`{jMH^ }c w:>]m8&CXqHz;\š?Gn}l'4wg#sLT5F%[pB~3%JoUof^Ss͗\q,4 U$Urb>q5J:FbN\álEl+.E -̠)$昩@ᰇdqjCZhrCP -mu=< 6Ij.K{ޔ:%BXSmΪzEHD :\#KLeG6A< [EbbRmhLk.%>\A+dȵ+#vFEAR[>qDNȷ}@Hރ'~(΃u^)ɉϦ }t|6ɷ\'B>][IЮܦaӉit? ~A/#k -MRݱT~8j5{Mgqu-aK0Vl t}_.SUUY$>6!MNS|`rt^w;wǻxw;wǻxw;wǻxw;wǻxw;wǻ0+)jexz swEAYi+"㒓r38RD'8Me'[Nظ$22e\wr]8{Lns]\fΝ?wS}m>]|'ϯd2Od2i'uG ?w\B?"׊'gљqўAb@ډ^O3\^/:I4gBs/ǿ?~,tr!?g!lGr-'Я^2gd}x3 e5#H0!A^`ԌB@]lGUL*Ti"פzyȘK|?o uxCoYzU5&!)FlZsJsYtI" E0A)#ӍUa!C=r?S0;!bc -‰6nHFG,&ZvSt cG24cЁ.I."XiPAF&:ˤBsJ ?իs) 4ك2E%}t&(Ŭ1%UXiglO)Ą\S%:94>*&LAV"Æ'iˆ0b(Yd.1 ] *UaJ)@@~<9\sMF{M)ڒ1P& .s3AU}-뙶~(%u8FUVBF|hǖ &*[RF6;l*km#]t;sx#N 35Q5]tfYH\n 0 1)ѱ &PcP ʁAWRh"EkJB@]ql\*"DopF[m"AWfАT# Y#cc*%7 +,UB!BtF~R%cAv${FWne8[R9@ɭ֖v3tÒq]z1 &bΑbb\6v'>қQdi3RJ'cn̒BZm,1B.ɈdȜ4:V|?P\,A(>րҕ9Ylcך)iF *Й/-jtw\B $!>gzuJb?l^B0LVkI,瘡CU[o'F"ݯb&A:S 2ړ]kIFG"%e TyTf: ѡUu Sߋ.mՁMj]/>n^ⓉD vs6*Vڕ]CV3R{#~YYkIN+?,y~=(wOVM\TU^g5V=FS> -=@;H-JFvAWS"E-R^0J;ȜPq#:ؤF{uߠ¯XC| -!6pEeI%[嘠@O"LTCJ#oV6 S1!B!gvu6ƅes S)|/RYg -h; aA[ðC5ibKٰTcP;(^J >Bkr:|0|#3t*jw:%$I]bl@Jj=i57MVsw<AҬ띠=6Id"m:kEr )ntj6 S0Ti:pxXhѨ-#nYtCpF !'UյǧNХ2t?!xoPщ*#R]L]luƃج7A[.|YK|R*@ 򮩴1=g= -D}r9:O%46<*J A^q\Pѕ B ACӍň\SЖ@_d5q_ZL тut~S,)pp!f(:Y &|R%TcU'S\dH|)%s2yȌߌmvjW&DRBX usA\Fw7OȦy&؂vn9 |d6E$',>311w6!im3ovCJV)$y\N%5eT dP* (ӈ͠[>sp*Z[s ]WK'͇y*RG{RzAi"l㟝5G& 2dвAAw"~gNKt(v;vU[QDqXIgėkAdX!|Uʨs]-uHm lf5%)A|$} ٢~-c|Ēǯk| CuI$^/>۬3|s"5|#o Hgf?u>EuҮuVb^pqSK.bbL?omSo<6Cj<9 U|($ Am#teWa@FR5橉mj@{^o"$Wu4Xt81Ru7d!_l@h7X - }bJ|*x ډ^kl/ov 7WbDL |%bD?Ϫ^!@AbLC~Z Ri@()uK^ 5hsɏ7H'OZ(>j_Prm# -;9:HBj (y(tɆI#5@Q7P; QC /AK*6RCSZјHƗqw\頿>rA^ r+R!qk0y"Ty.2 8KD 09-S&;MHA n3S -Jd&h'|*R7ݪv:h\I as0w@.=G F(Q&g@>~UCP3 -$qP[A=meTZt2?q9묩zb9HL<1H<S\S7hH…`- y!=P!ƒ:d!wP0g!&\L]s|*b3ȰbچZJ|?C><ޘI1VExf0c -. -R26'[par$#ez *4dGJ%uW0=:L)q!O?J lǣ%t~mDj߼_I)ܖa4Qce7~e\1ޚJ3hRj%&Bjm@e RmS T@=ǜId -h,[`J(2y$fA{)}{Nj fI\1.?v?PJ|Ieה r`Ȼ;XڂO _uuVܪ4ANd v8R5q@P>Gj(PJkz`>s I}, I₟wqW嘠~l4:H*1P/1OH4g$Ctvd. _U8%uuiP&D4I<|nt)AgiF b9F|,-;IgLuȨ;H**Z.Χ#?P3d k%{\-m`)uT*-ޟ.WF,gXE* X{ҕA. - 0hRI> - ~?D,>qi^e -U90ֿ펚cbPNO[,ltgT)kPgR*DUXu͞IOs=]_ t(WY"B_X۶6<݊- Soع,BTK@;E{ksLg|\׳ȅ|c @*n#5 !sn8L#g6I;ȤUPrH`śuqB8T L2q9Fx),!.2[ -xg/d TDr` -QL?tn8 pN̟`"9!ĥb[`Z9R{ -&=d"L/ށ0Ls~A]Z*pFO]/0l>Aru0r$y!xG1;6hru[Qo$JQg.M3V,LLvs0=9L!tO"0)20Y 3KxuNqS?FLB+C]i7 -}2qQveZF&%υ)0U&9k_]UxNTo.cŸ` -u'MX 瓳IΆob]~(Ά>\M%ժ:=?>cs: |$Mk=RS9{X |``Iq~k<1b &L/^>])^*>1:? ~N&kFLFz6r*Lc05H-Dy5!٥?Q!B8όy$Gma0lS y?"'ur:K&Y9g,0y0p:!n.D´%Pb;$`2Oפ90L\/82uω|c%6aLcck#cf/e.y x&SM"9|k|n,N/^>.ZvOcF9|?;5a.FfX~c!AZr so9b,ӄK@ l&T(PƔh` #"ɹq +*K&|k{ P)q u_|0SDq0>GmGߊ%H]gc<&.)$_jE/ױ~Z"=ކL0 &fH~_r|  8*`qL'5`'fΩsNʄ[`jxoI3c>cWGg"J IeZjMoſL"{cq+s$'i)Łcg^L -#29 XA>I~WH/D(K_'|&k$|r'~A r됧$\ Ra\bYPB¾/stb$J9%9#N(>!PJ眮dJalL!Jc$g T Qpv -SOiskJ* qB&&C eg"L#XWAu>ɹrRۨ] jRDpܯ/ƫNlC&F&1ﶒ锰NnpGT"TȄ]ҌZS7Lī>n, w"2 -9S>1ARGI`]f) !P[PJ~אc%ž"Ȇ(!Bau/PK".%S)"CbK(Ep675 q#sO -FYIN-9O$y^_:3MgP? s##JxgYKwByc2 9}RKT9H>(Dm# 866:ͬ5 <(EȐzan7p -01"`m". vl" . H1'[\⛵ʘlp*P2߅ȜTTFP0 Uuy}&fɄ:PG&57P4XmTY`'Pʀ^ g_C9â} i1Tl0P>!> >$YʎZr Ca/p R%TlL6D3&h+֨AŖl4lKttRsu!O P22!S O%Β 6 )=7G zC`*r"JjGr]i SN>cOql.e=ǒV{D!O Vp@z;5'CoQ?"*4%)]_J"iEb3"`N6cQzv#hpvߩ$8#Q#ߘOX#J%u3ImL5$s}}S??DTkple=n&Ѧ *lDlK/y}<鋰 GՁ'?ȡI4 Sg8+QQ0ݝ>8S =e44u)2z(N&R Tsa iP%:9 k l9pf(4]TÆmFr6~Iz9`k -XKm%Jf*EXqz(E\ /Mܚ'zO0֔G͔A/AM@`)dB=\_JLE|YQ wP"L EQWWaAqژb5Yf@Xx -ͬу̐$ 0;k PK)%J;izfc:WR]̘50!)E0͕ۤ2 eq,X.~^}kp =^1qe\R&T g&$o-n$zqs!W_^^?]N|Ͻ%Dz_[`sC\T6.\8c1xXM#o$Vf3[ew+-d7ŌߓeMs&h"ug, 'La1e.51>ߐz -ƅ2+W<u I|80wgYMPQ6րR& =Gr9) d٫c$"w4#f'9 {cX_ypȭb*$Q8;߶q{3u$CL(;rYKkU{友e`˖\KVe$RG%n"ʎV -a5GP6h*E(M1^+-{D,z=[J"l&图r^RD)}@)BP $}eg0pIR!lI\b\EIRL@CNjw)Zc$`&>k&GKu5pvHMw -ri1Gܬ-:.{XWեg xNP5/:~/v֙&Mw=vQwG!3Nb[2 #-0a;g9mԄu6QB}%|zғnHəP̣͗>^(0R=(aM&8r6$yy\nP;N(1;d~yg*#-ѰKhynTz"5퀲߽Vˤh&XƅJ.Y"ȘGvo9:RWRr 'D1EAm>6:rqeP&nqD$K)ZD>1[摹_Uiqդڒ]Lj?L]A&9c?¶H][BpCP&"IA -r”=])O v֨\[Dݯi:|2m2r- ؆O;3jfbGIR+BW~X}D9P9cgr1|<䙁^5EЀ+H PJ; |O̎yх^FD@u=@ -{P*HUH_9:@ ļ0:?9zzx ^>8#\13Ar2YRkKeG`z*JkU#= -FC!clșdzہx}|-0(erVAm2(g%'K\: JAmd.X؄O"5Qqz( -)D}Ae3wQ/7P/֐ (K<D}rP y]_Jzz\N%N1{_Dk@U p٥3u2E|0,nBQSﶋTc|XqfBj~~[a#燓VDeO"rT1 < GCK;g -ۧ(|u ˎ(vnC2%K|/wB.Eoe/#&.2Z8 v}HsH|WBjDQP|!B-}. A^Rˇgp/N ~ 6`5Q|:Թܓ2AK7O l=*A g'Fk8f;! L -l iOr5ȫ59~B'-aZä524!ʺ_͹@zbkH^ MpP+&q6oۆ=_K7H, 9 a3~h˃WrP.t{BLb: rE , u `Lz]]Bb?FqA_ -b=1fA} +c -v }fn/j K.,@>|PʒzBU ffD.'wA焟^@/TCAmJ@y }P~. 9A ArI ~N*D=@V=ǂ%wWA> ~VR}t*Q ^ ~~:/g}} >*B޷؟޶[V^L CQB6I1kPMFLzn:nJǗn1K0Q1?^9o H-"9PPVgBǕna.% -:tlwҾNTg6}=luɬ]4<&e$TI5OÐ/pu@HRCF@zgct5U8sY%TwDOO1.YuԵO=Fk_D?W܏{^INnuO^՜?>li:\Իfȏڍ] 9]$Kה_-2K%{RJ)b$@ ,w#x%_ 3/N@sble|0`3ٔ-6e'M#RP -MnAE4hO:U | Шꏠv&RI%#y}d^JNiɤ7d6 @J7ک-`'`tr:0W؛Pf~);D[N3I7mGOYM|ߕݩ2n7$LI͹,Tz$sUe9edYUޥ+h -IkFlƕos;EltьlbNQcw3jfݩǤ}f߬u\D-FԴ.?Z; >B %8$h -ԘHR:u!^is,l#gIL{zJo{%傸%Su9N^Z*-r?bIR#'GVZӪ --YBn6a=[a_'لfuFS+5$E[d%pEs׸2?{N4sK_  P^o5for-$架cW#GSN)wavMɽF,jŸ%VmQR6*C_`sl``c̕vmqZkř`FUFMҦq)%4A͂JFwfb27: }͏^9N~Qƽ: i#xʥpv䘅Q?3\77H/zwɻc;rj!ѥ ]eNܫa_Z9Т)sT`PZYkfnfDLˮ2F=IFީy?ZJW廋BU.>A$zLr0(w vA57<%h8/_X=ݘo.€]܈K:?jKՔ{(e^#<$-;%$߮2)9e“{r*㋖(yZPSuMѕ!9cqFC&+"[nTʁo2)ZBZsI n0>${QwTtwW.~rRq}-gpg\^!6>M~$A:}of_t' ㄬsKdR-۩O<AT`ݫf}*MSl,X[v0eo0-zԝnR;hE{y+i}q-p-o;E?9,&yAD=5lmq{Yi?!g6[u>:.c]4eP$RW\8M&{Szыsjm6r:ԭoYq#UCխ*Eد+h,V)1+.pyny٭$Ք`+:^] UTmbB~d?;I??}~\bzܥ}3Î7Dxń\:v3YhaҮ&?YkSv~+e>QTJE GCW]4C*}_omT/-n ~xTRFVT`^wQe S6+uZleGeyE''33M"@]VpZ')]г_R)( TJ:/{/K;}v¢Y0~}9|xA_%Td J)py)gwSoW3Vժ=ɳ:+g/JNȳԙWXݩ`H{d%ɫ;.}QsLQ%u!O˽l]TW:/[tp'hcUzI<%U̫s}Iټm[nƝhL9Ss:&T}b@]T !#9h)}6Aڧ]KlIGU6y@˖0|}mO#W4؉ -[5 - 53C c q1G]ci*h˭3ězA\n5Ғl|^?k^-U3wDvI~kw=Ғm.*GwO$λfyOo-] #6Y~)<[ĉƤH}[nFz{_Fu}6ހ#ʺ?^\Ii㶃T++EϾ -og1ZǚuW\t WmGĒ~7=wGز3o؎gؓ#$L1N\gѷ5\^_MɥQqen1UܪO7&[u܏}) ~nj|k CY=B?]X݌|2.``W6S{M2u5Qf5"YbW|J_#}|ԬUV\(~e!u(pf *I?%.v;igb?ɇ*Oг~ ~.ў~ɲKLMiwa.uAIj/GԹFW8eV9(s T;ܷrڨ=]B.w8Be ٛsҧu wT[p_/m̊=x%DՄ7emLÂDU?R?d71|ktl0q]=]{;_DM]clQIJLجUrSu܎8P3 )vaў>垡aCsTUYWZKm.;{EK2}(xFqR!do%m{W?I_W7F\vV/no?zJ.WVoyoQywyn/|zU7$4}Z[{9tcƕ"d^:EfMShT`{ -j:WAojBK.wH-qH,u, 0.&EKWy >4w^M)B7?P>M*GS >l'{SVc/j2dʰd0qnaozڍ_qCĤ#7̻ /̍4) ~ ۙaWU)#Q>kq9v'֭/ν':9F}\wC}zYr!ESBLj;EaZ%|ŭ ʊ⼖Ңjk:kii8a]DxzGE;WE'G3]Φy?t'pl_ AeF; _'oXWufU{v$WWj+.-9VrΡw.Y'9DEb4QwyhQEn#O&M<Ԙ&z`4LU(P'kl?e/}gl(?Ր|13n;Q{z)zՆt|v+²ai+ش?n۽hЫf5_F6CWZhk^YunCexRxhdYgޙiԔȺNե%8UۖGwx)Ժ6gH쨳 >5U!GZ2:.2mmz;KC:sdƜmuj;>_۾ yKH^fiYʺ1/|R -]p QYz!-Ԫz(vٲ>q|?WxN{7a/ۇfq.aO:s׎clOAW2' -3** o8_׹D~ LgߌRUp>q]Xv]x@g{{/C7a_?Ս8vmکoفT7DkU5 -UuZQ.<%56ɱ884奈C#s"RÂ|#/bp>#ZeQrN4EA^qo=S߻FdaY 8OXfsS˜#^b:vuVGeìOkK2e4wT4MEh/3Ъ Ν+#wUܲA '(h:hT4^a6X)_T&Dsף%Kh)[ +x3[~m2ߺGuy[WlChBkddgrxQȞżR'aT/癞n QU k3Kqիwgrz6i N{en7=E,TDUV!1hFRB4 -Z0VT?lFl,^ L ocJk8a8w -\^x֏8&ᗞ}%ߠzv͠5[4Ѣ*hH⤂թzn铵*.ƣh8}^"~z0hF,AJVGam~-oX3<7nv-D ïJfB?o -d5pƠa&cP)hڄh冽hgTA#Q=Eg溇9u |}Lȋ`2hA%1`8y]~%#\K/[c}@LŇ3!NƿGwEV^0c&c?AduAn${SY\Rnu_jںfrxD | W C棙J⭇Ev-M}nw|U_q)=e+1 -m#d;b^[e9ams\ĆNqU%:GbxW֨Д1uwoP>~1qz4g-Q?ImOg~ݼ+ ]ĕ&:%r :T 4^,SqWظ?hUhŕ fw{-1#Kr;+]%.iΩUIqŎvǿ p -4ajE8~*ľd62x14l94bb$|8##|HFơ) - i;Ђ2h14wK%h\M[Hi%-4cnUHͱz^ǨgYd>Ecj_!CcT_}To]t_}|Uc`Rl՞G0ڸ?@̃71ԡQ Kĕ7/AS'o3>qR MMy9R'EsWEKw7tLP,U>\ {teKT-ާbbX8s)-I-;b.Yo_LmkEd MT&*b$|&+ߛ=I)㵭ESb6if5GTO9;#EK¶_k߄x }W^ۃp+.th)v(un)}y26T-uuCkq2LA)X!޻Q\fN݁fϥмuh Zf٠YZ'-;XV)lj_bwq0-74<k^{:Gg(>SyBm||yQ6`Uv,L`DX6JyHi\gcBls~0o6j4jM<=BsA;Fh/ZauKagu:Ge=W =KD-^[QSȓ"6Ab{K*BMt]!%XxޭQM{8\BJVRmPvZi5}9_)@Jsjs4{ >s~h;lOW+jMqĪeؼwFXhdcC\{}Bw} NImeK -mlM_ׂ%H' 4GECM}: i 5;,%u<ZĠkZ.h( :ֵdƑ[?mK1cg>V7}n3ky:$$XiGjAS׮{z1kmv5mj;/LR3\@lA!xɑeA&}:n95Vh5Z-X"@sgoG9q C36aLi,gМPZiV2hkFoz4?;y+n0㱿fњȽCgF'rq]ա%%=e6A{xzqmCzƐ<)1`Q#`𗓇DG%4q\*hh}4O o꙲?[)#~ѶĿM=iS`DŽ%74|w~ɮj^\Ӣa0sk>Chqх}eN Uc/ N'?c9' ca3h2}B$ZL۠EVh}^o~?b?Ő %#74U;zûֹö_ߦv8U3_S"^bsQY`];;G3&Hp'y b: 5AmR)JOSGSgk!&hΓh%剖S*IZwFۮ^)7,7[3A`*Z/!۝jUy#~-'?r_ -;ynߢY M w0u[eGyMɨ7U*NVCM>c'x-ԶA+h3hhz-Z/FUHam FL\ -^S75-/ZoK>(Z~u^brzbĸge8W_m}t4Ҳec/Sg-xD?qneŶe s檨v c|:'fTE ֙:GFm#7_?K>=q~-3ןEWh6?7 2^Sao/OYh+k&kӄxSpmOק$nodbؽHjiI$3/Jx6OJBs/G_ :vKmo\2|VX ik!xzu&]XS<&w}qNYq9Gho7lZ4s T8 cq b,Aa$>;'~~ M; hR}mgٷCtѦI_%~aes^}ϙ,AxM1c*ypx1nW9~Of_KMpܥ|s`ߠk{u&uy 2:qzݒwN'2vD\x^Ǖ^g>Ս_FFmkMB,4yc7nK$4;o*B"f1u[kߌ _ej3TmМIV$A4^ǵiТ"I;H=ss~f-CW^.GߋPqMLu9}ԫߤlA1iuщR S5͈MC$*y(*w-٫*7cq?ISr2j"cV8Y@e6}n?>m!}:~ i&Zm;qsخ{2.xΠT憷`]s[SL戣m钴PY}@6Ι̟d޹Qѹ%j1O8ad8c@z;`,,Yqb8C ~IДh؊3SToW+w^2^CrS7@Yô?x̯+>Wq ^0ϫDu6I>ezs1mSGTf3g"nɑVS_ωżm9(-+>E ƯZ" E>zcңZB ii"KB˳CDO !Ͻdv?.=i[sz -"ޯ>Z`үj߳Z9gNju9ZcejhZ'xF@~k~N.cܵP$#\L5 :7yI)덯vmXB%OFMl1f1vוc>cvk"m;@+ ,Dr 5f0*0:o0.o=p(*[ZŤr%q}OGYqek_B'Yn~-x:QznS/SqV -M& |ūSx~^_>ҽ: ^u^1f|/z?YJ'~`0sc44TB6"#5-$fg8y!B -V.@,f,b/]$ImԳ̨q[ S ":m'[zRQSH*} %>7!rM)-^G=g -ކq뼅?xYώn6I|xu=HGz`alrV\vyKM,yFbb= mZ X@RKŽg'Zvx4:V?5rZTgAfŔYOn++/u>Hwv^0q3y}.s&db|^@q\ߦmx։̑:i{ ȟ^>A9oi1uR7kB[Z8΄NmPti"#x&]@xRkvPJuKV58sc)RxD\gpYƲ%%92Yv.Wm.JhƦkAϧ]iߴ)-[KE! AcL1j-7tftLdHv^Qp6|mߨwː.R_l5E#>c4DZFHhL#RXsWA2`exƑb`qgMCTOԏꢰ5ԹI㾣EWP6ft3Y8%x|}.7vIRyݙgTMk_LcW](cشo2ӂjqeS$o^4yɅI"۸)sALnF,FW"|胎Y6';5 fS!WY{Uj1w߬2=TȃsL&d -4mtRl8kT^Mqg7MaG5/;] W|R|DxNis v#K.kxA^b76zkE,7tQit1''7u~OIO*,톈6)hloRx>=^Ѯƈ333`n1`YR)ebuQJ6i7̀ߪ :5鋙*c4=u6<s|7]=Y0Uc>[\~ҧIW~^A:6H_jhLU00;Ht6b砱jFhIh -M&4B[!C}c2Xd>V$8'/;2k1ϱ0wKvehxf˨4YJo7ɩ+Ev Skǭe"=@a[iW>i}BrW1)hI쥬0;zkj靯Zw2Csk,)㞣`_AD|lSi`\P}eH$98(1[Fu <; z6<ĖmkP8} -㜠̞D@ۆM8٧.LdzW]tׄz!gu\n~*W(C~+\u'uc!g1"\Ձg8[s%d:j~QD2 (pIabtM-oET5ƖPw mucd s:OSg(q1sc -!-ĸ?o%<\g,8Nfq<`T&lGg/J2I;mtf}È)4DI DWz9 < B߮| -':n?HѧA] s3) ){ DaV R:\&<=Q[<m -m]ڵ ]qlXϔCzF ڭmv "됉0{ < aK[*P{} -D?.*ܰNiԀ QO|Zflʘ9EπX"INL$envS/:LS%h:se0zVI^t~/$ww|\յ?*L1!tbO/6M Ʋ%kzXcfh䆍 `cƦ!!vsJ!ޔ[ykSf$G#hΚkW{d旯lhwTCwzF4_v:MeIW\W5EZ5:Л*Ĉ_д3"OV]PExkw]cޗgH\X])Ws={0_|p靼{.!f?W&;ū[_ܿ{/so{5/9sJ}`ƻV[upip[|O~*œW\l?ֳkGܑ^}3Aj_n%ؿo-gM0ow?{~qK׮ p䏵c srX/7ΗMo!y5}#C}y{gy>t1y?q;C_܂>U|cHOS|~;} x/w_лxO߿C,:7` -Z_g{VxLխmUގ -?bu.n}Z'G_tTlm67r cwo?yB)J[?_~ _bNtK_k0ؿ1 I+rv`݁KB|]X؅ zB:<|^`#wN?~!M .t;ߑ?ގy"6 -.xp /u?F]SO=#`h\;B-kww2!PpW366N9߽] }/^so^?j3慫|KF7K"˟ZOE]b3=rwo\ښoTfAL9n޽:#nJl=uv}+֪`0T۞ٲ(w c0W`vn_,=y0ox= 7S.\y_,՞S1#йЙ;@-v~MswQs 0O2axB+\{a.!C t9{^y/A\/_h9s!nZc1\ÿ TwG+ޕ8wWRm`+|>9>1r^tc >"ؾt!{./zNCKaH{:Hy6E#)C@enC?Q_qʅᵏ^Xh߱L\'k/ >o; ,Xy'0W]_m}Zoüg?#p׷vRλQ};wa3CwϏ}1??==1kEx@f9V_ԅ#y[G~s]zR59UmFy:Ok KIv76srci_Q]xQb&M|nz@x7n܅ҿe;Oh >=fG54V!,Wp V6sVcE)? j'5Oy1 愪[`Қ".|;0{hOX e ƃ_н{AN!wg9'350WhCO_܌8 M4U7aCޟ>n@זg<|F 띁cMk(旮 &6.^3Jv[Ï~ c8Q>õ4M|O3 M}=8.p׷"bdq \G3`~#ϱ[7_ -Ӵ?t1G1"ewd+$[\S>)OM`sWHR[FLLn бu \'|Ё͇$=}Kq}&+:׹}oꃱ5LymU'4׷`bc.o<$#kUx(Ĩ>}0кOش0Q#^%G>x6wnxugG+F+(_|Ɨ6q>ls~.I;҇SZV?~YO\1>TyCw|h71|ݣ(GєОoF\V9Jփ`.MϾ?E~\͋O!L藻29;AN˟6֍%b`vوu5c7ǵІg]  l|=/sb8&'*!~/uG~[="f:ܦWo <ӿ W~58ۼG>_󖗮 ֦8iP>4֮߳Q8q)[lЇ5ѣ58P5՘.kj7&Fyv؟tߡ?xZ?roo:-G~}s}<w>pA u?vA<1`dw*i[L u?x^s۹U{.>S!S.d뾳,cg?6DmTvQhÎSBStבߦhZ1j'/|hk s-', }-Otgdݛn^%Mr#WK16I8ЮZ.#&^!?gY5ί>=/'s|~6rqcLyA aAG] -_^8s7m<|-zx.qDֿxUdKW喗G_s7 qlyBˇ?ӛ}>+[7 GFn b5]<=cKikzѭ1:!#GEΡO|GlɬŜ|G@=@s}yџ߼. zcBpۛ}}v{ӻޒ||x'#sOo帮;'Y5s:w0:ןhOBHYwo?Rp0 yͮ;' Xż܄G3#>i|{Zauɩ- %O|Mg7%֍A);i!i,ʩkØ1 n>qgsc;7MeݕZs6bD8|;|ǾWe̝4.B\ Ž _ yCsizl4ag&U{.A,oSagE-YCߚ[#_IDXm]3)?3OnZho vBy,E{ӑ693_u:7dZ3'Gzm#1÷pʃC#D49s<}~<;{4/f#?xu""/y|ZWM'~(ZxcTuzcy+9 qp1>m#_rs/4E"ăn˞qq<s;kz\76zߓaئ`t`rӘFLVCm#MZ;Fa`3E8^Ox`hM$_bѩτ9))7lZ[EU;/>plBxvzĿ>q=ȸX>SjpBMC{?Lyf\czsy4Lmxa|4/^{bGEӫhY.ٸ>ZYU gt}7 C;X6Zκ(__uF|Oh^uQg} kKCqqcٴ1~*ЅЯĆ14w~_`ʯ{rY;lyMewƞh.M?2/0bwŗi"\]4\.PC磍Gܬ#w"چ ?+ʃCl?=ywhlT89pX6CXK7]MKwjxm8xϧ!./zAl9~agyBހuM\5wz#ؗh+hZ̦3#+@X܄Of%uO]3^q&{»ن?{F=pCwïUG|l۴s7VCK:?u"YhG5`$vt4f !l]s@ZӧLvց|Yho#ݏ\9r8+C,K,^jxh_xagBt ΖW'anye<3^ˬЮ7Ysde$bgybgGDYyb7u?xAts[ܕ01mң"):9ȵjvfOxkoA|Ȳ6=B_MG?9Ч܄O?AB [Xee#r5[Lm^eM׎k[VA\脦6I$;yod"' -dZNs1Z嘫x?kYMV쬴@K_b("vg.ވ> b5-s@!/w-:oT3֍bj_9~(2ұv %OGȪ.?O|=?ݵ<_0V8 YF?{O{6 ,ugW޸`(_bv/!+p|tǫ}{]G^1{B7nBHq\7iZ|mN@1vh;"ǵ-oyb,??q*o!}hwOo5sG,u;A>vQ4sa8'#[]]^e|\LO0>6m'Ŏqg5l紦-gc|۴urotAƽ:?r6B_S xlRhǚVﻂl$55O|j%G <֗1 -~A_D`k^ve^ߜX1pp}SqC6G DA %P?N c(oĨC?$[L+ -b#. -}{MĖYEӿg݁uß̎M8q ~bHxpזspO$w4Kv}?YM/~>툝|Gh W sYhX! -'6hYǿ-HAA`친|MقpW77z -Kvyk >@ &P>zq>)mwӊ.w -?ʍ}c?Eq' ƢXc7o -'~2Xyɩزp'z}g#jtMK emˡ_7=;/D_м׽0MUaƈGM\]17›1uǮ xמ~aXlF }cmG,O|2D61~A!Qҋ럼 1=G"^Њ턁ڴ3 GnC>ؠ_+pW0NuL߼ 4o.ƇCjIm WaԬu a|!a΢ vVpysYx,}{W?l٢cqBʐqUm9{5Z@ Po7{~ SCO> Ym?6 l0y nC)ȫioG|M&='Ǟ?[w;[_i{ Tjͨ]} } b٧]k V>yٴ1/on5bozQQϾ'#vxcU!o?y@\%Q?yM<{dt W&6_x q}tw/c?hOg;04|㽗> GU_{s}?%)赾壼M]`,Us &\p#`gz0}]J{e} c?q>ziE#| m|S{a9B,e;6<⽂N }!b:0W\0 -޳j"mp^qPGb#+Ċuvc 0 >A @|`XG {':OCPu\'_<+"vGX6 r{pnq'!vmꇇy#xq "di+.m0qk{vCxs/Ob2'Z9 -q˭oin؟愎aW,Xzx;0#bMyIp>8|q>8|q>8|q>8|q>8|9㧧ڦŲw=fXW6;z.Z&dD:,wMFפx,隠삻\ĂD -X2>uΩ͚P[ϴ0-bDׄY,W)eARܬ( -.YV7'r -eNГDWEB=WOotK= ǎ;zѪkDW.}AF -hjkaC, rkN5dl"ZOTd;7~gH$I(jt[B?lu$Sc540ߝw33.L$2&Jes?;ޜK%ZꁚS \Kv.TC\k ghY -+C,co fK͸\̥/fSmΩ~Fvpotv -Y-5΅dfmpkM7`SiO6mgRZE{ɸ+T6fĒٜZmX*W2ll޴)$H9^2ZR4U6Jf,N0=%8`⠸ҴZ.4(KOyݙLsat*ia)IJLJT4KQƕ}զ;:]uC_4-!'8uS'8=!18-}Mc҇wƦ4!97rS':uS':uӂ D'vTsC.>RDЍPVi*DkSKIX[zHv.]ٶi%6N$j-U..'όuwu%b:{[}5Y "R锍yi)S )JtiM'!C(䐋Z%eȝ\K\KvFxri ]}{6f`8svP4C *7b.:gk(J]BqsvBsv2.K6XPq*(k_锳DP;"9sBsU\ 5ZQz%z/h60ec=w8rԢEG- XPvԢ{Q3@qaCZ):Rt\EG) xRJѺb֍K8W.3k#H$4@%3Vx{"/wDzHyJԭN_/oL#s26)bE?w;~p7> `ֆ2DIsֻȽ_$Ŕ*Iy_65+Dw -ߩkMwt gTpn' A9HїDJ_T[r{ފbmtW?y%1)#aqਟly(Idvij6y瓒q"an+qCh`y+6f463U&g7ͯa¥q:7Un>D1SG~%T2ʜ%ۻm)=VP"eI]CN,'%L,X,,W6tsםic TV\lL 9̐܇=wVNgU_U8KbXK3?eA&OM0,>mbAzʒD:Nۦ3TG5DzoRplE;sX5 -kJ3O•5GK2/_MKZLZApZCASn+z;㭠3ӗuVXlN3h%’bwH!6 mvg3$D9+QJe8+QJDDՊNJ,E RJTJqZ*]],NL͞PQOX+tpZ[wΊ)'Ǘ#;j(V.Nm$KuwԷfcK9kr؞As hKe|`,YyܞIw$rO6$s1Ṳi']>r'W+g[2ikz/~k[@ NT;akDC<#$lVePdQA;9G+b/' ;:.wԽlM {eN[O9:: ԉOM|Zzħ=Ri9F*;<-J OQ6'@uT'@uT'@j5;BT[,UH* kNZAj n[ٰC=BڠTj&J䑩 mHI畓۸D8βWvy~{Xס:f`giW!G*e/~vWc)ғxTW -endstream endobj 91 0 obj <>stream -6H,_PHtt4 sœpeokR\ NUs^ pvK賸[݃w {D9ב_BEpdCA,*~2qėX&]ES96T]?*&۞X9.G6 -168ṟcR7ɕL`Vv2ܕژJ-(Gu+Õ>,VRRUnC# R'b}3)%M_mrJϿSIZf&X+zSsN 9PφG*3bd9Y:yXzTT)f^™z'Lũ U!~w4pyORJ(~rFehm㕧 -vXj‡?t 9`{<3#4K@9W)dos}3PF5DqSN6Vr.ġ1gVHd8TpD3LR]6rOU)0XNG\QP:>'dM2gu:'zbcAC7f˴LOzD27jZ(TN_HY;znVY1?&մfĖ3t2Wp)&>vtwޗz[ReVUUVfYUQ%Q;^KYx9QP Ɍ(/rXPQ$NDFU^8W0O1Nj՝mЖX5ib\m`Ռ[$NQ]VDAtuܬpYU nQα,IĒZuKJZ(hY-)CE -sa‰"~݌"XKO^RYW Q։z[$N@s -PAƭ*`Mus(c]P` XͲO7eQͲnx+bF )nԪgAg0g}8h*5o/.*H*'V(uCLWd9'Ir6L1uMPD9*ȋAQa'V(87ψVꆁ+x<ԎȪgݼd$)H0sG4ivU&숆ሠj=#VD9peUhBd'JAs4D,;XtY0Ib܆L L\EAiyf6hʹv c`YóA5JNĜy.74q2BY 9Fb*$4Lf@EQvq -\[M.DK$`h' h-),ԈzÚa n;ڇZ X<5a+RTy gHF3 Eլr-E4m|~RLiT:h9s[\]G @ہƷ T@6h1͇> -"PoߒBGzBM*rn&Ԥ¼T$%&(K~HOypԥAW^4`EiF:ͭFP5c-B"ʚ7R:{diEO>0"Ed#Z%YD.9aɅP-UPhGYEyŋ)GkSYY&&!`.:Uac9iMjǒڡ|,b㙔I&p$fǵ[D=jQXW6C;F RuMN'ne݉6=xF +Ĝՙ* [ƎVaFzW,ڝͦS-% ЍBfNB6GƸ U0,s -}X+tR#Qᅬ;.)\3VC_CE+ǒ H_Gkx3'0]T+: -K/yu Jgt1$_ч`"Moc0m|{el -dP59f7]dY-&H9Zf=vQ>GVgn:/mX["CH^b糖7X;W8 hYaW,z^beA/Lms2P|.Safpʁ5-S">1UګymvTSyå`,iì:}1h27Dgc:xrk?nph{{S.:ﯬ:JynQTseUE(%pS?9-9YWm,f %JN"W}Zs*fX@a0嵀K+nӯ_bx GEƯBZMѳ<"zˌoFMNt-)(ҡ}A9l&sTVݫ浲RkeqAq)=@^*_MlZ7XKuVefpM"+,<(spߜ), -2 3Q9UalJhst@]ܿjI0h_YP,(v <$F` -{ -C-.ED٥wY7גט$࢏E/GoPBᓘ+rRhя5!2C^3oIA`@]R8F#Ύl|٘eB\50f1e~a%Ð܃0z/[C"U10GNg9ft>\|yr,:F1z+W_լ1Yc0/oT3gT?ȅ,%-Q#Ngat.u;<}̲.ߌq/߃"s?~e!Ò){7\?Ekp/ZQs|GzyBo38+689۔JrX%AY?2j3- AQm6xlom6ͦ⬈+Gwx'>KYĸUd#Y^4 q%s=ǥ#Q2!O͜;>,hGb5r؟utj\( H,lFl5rWq{}Fl]&Ygd_ [J*u?ޭ L--U?6G"n+t2T#UKnXi -hB\Wap&5WMaP'jQ$Km>ifmU&]A;lFRs<$CF=eɌJsǓNimhLgs7JPJJ& $%$XZfҬݚ#bQV5|B%Rn4UaINCAjԀU+=GU-)|`ŨU2 YO`%^a/ -%2#dQ#E5^! 7dAUnUQg:H<>eZ";R}* nŃ?ZNmYE=j5UnպL47m3m0&t3(0A5f۞tI!hKϏR[!d%t6&l9UQL@#i(N,T;=SWY-B_4Si՞z]S%YA*j5+ϖ6_YjN Hy%-T,R:mU*rZWYC_wB$_EtZg9Nyp_P9^PW 41(81EhbF.pgWl_  ꝇnbsZHL+Uק'g Re)"xrXð`?\ɌD৷p`_ olc 9ܞ4hu~uhz'RA8mSڠ X -֭kEHF>|ZAB)nMPq:x h.MZ+r2ϩ=TtD@v CdT&͉u-־k)Dg'k,RKl'}Z uM[OmTH-6[28ǷtZXRn L6Ǘ$(grWp.R"m _\MHnU,3NpѢ"i<5hZ, zSƎ]?~;;W ͯAjlw 959wMu^b p6tvk ި{%8T;S={boFqn9\FjgQ 5|!_PYԼڵj -6 ioTprD67ѶIu *9.x28|$qQ%9r[fhG[VF{w32rtg.M%VsmCxfI|U{T-x-Bp+0(!s0.OAt NX\W t~Bd:UM(B//V^4" -(ѡXj ze:s0PL"/֚Q=|YMkAXQD74rEM-jEm1AY-;$!WQWPY٭ƃT%Eo=.Jq ZH-[)fs\z՛fFs=n2e1n%=^ 3M"Hl,DYPƪ 9_[TTꈨ00,eE -3R`ҤY$ifզ4Xi*I%lmz+dtI$@ӕ'I+Qn0SU=ENa%a2" -q~+ŔehH՛1[i"&2Y74D=IHF.bQ`|$9IC=1k"O+ G1$i!$GDVsȵ"IA<ZkC҄*FlPhy kIl,y2%<A,ZJ0g!f͆ [g6"<Vzm@Jod4PhUղ'<2';p%Mr+ĊCv9ZNvVrhlxEtf#-391h9^׆ -djVTbF lkY7(,N-!_v|ު.fƬB0ddg!f͆ ['LL^̂&z͖kCxR2Q(EUpIݓ Jug\F14Ø+;}uxH$y,gzWu#E7W Y=\9Cf9=tnUxdL!莖UxCfᶙ ά Xg,³4M!Ϸ -OoUx+f9SF)R ZgL \YgxaVYPw̚k Et9ƟQ)Vm`,hoTm!)_ޤi=) *:13 YA -ϤYgi<UR07kvM[ܴ5D`N!7m{)۳H3eqhE ":Dz r4Ϭڐ|fZ$gpb ^˵!w,R3HsCdpo8MEhe ̨ոH$f!_Fƃ-2gA2k\)|"-d𥘆B,ҽ) QqmI B"Z Zde4"+%dWj6dS*EV`pyEYޓEXe=0V",-|Cyi Zs׆zʥDfm5jL<yW׷?Vk|s>CUg@?a&hW}& а -ߑ6 oJ ;=)&C1IT0 v<} *Zԃlc/+ "ɰO(AUEmy ET`(jcˈ8+4"򀶍IoOA)y`JTp_qWD.bB/O-} -z4|¢Ezml@a-(dxPEקNSKߟ# -wQa]|jTRNRWUDj}ʸ&V>m,< UEIG -7ng!CZHVʧwu;^T`+ZTET;_E֏),PlYl˲˶1fq-S7re^v6ȊHo9PY|h3x@{h9?:_G+"||h? yl9/9_j8v[4ى8n+v,r]1]"r+K6,rigq$qj1x!x-cU5\T:|E(j:  -FUʫFO3EV- W㫁Js8TD!rwCj:$cȌ -SYW1\7Zr-1oB(MJkarRc̮|c.Yv5Y6B5t\}5y"QLAbⵄgO^a^>':;y>eXzDcȘ2{- :^z7z8hi";@勵Kz~$kN9tXf~9-*%7Ѫs3}i=` -_?b[^P[?~<95#= 76!9WVLD|cMIZhU20k)揺' -R+  gmti'E>j"|6$9R]j%ar.LլVpS UkHdVU79TIBQQz>gc{6^q-ʺ^/j䪭Rm6Cd)* ,n^\!'`UFBJZAd"׹si'Yk]6v[yZsAH3%^{tNˑ8Y۹+RNռ8ȑsVz>Kxy"sί%tKd,ml% -TjӮܢwZpGAQ=LOh6)WEs-ZIVmFa0L  sr1@9hAŁ/D[ -mYJ;oJ{TYA0J+4ߒ'SwPŠ,^&ua:ڔNrxFX~W;][q0YYOE 0fT76^3ܢp6j {?_2vn $'=O卸˵9$u4Ls$o?x!xHF}5;HcfXs y+>~e V -] JQ!\A~WD1y*DABla@(TQR]_QFɎR)RCKސ^\0Ɨek2XK{@)~VdJeQL9z$k|J24[2 - 0UYT^C D#]We+K8Ip-+<9rWuUqYʸY) 8CI$8MZx2vNM~kHv/fa{让9TlA<ϴϏ.X2{չ0ѪILrά՘NM*w ZZ!mѯڍ4\66h-I)],u3Ew drYNu'1wUȻ--.'zs@M,Љ+"}Evg1 ,+4:mm=dl$lhӗSmm6$ŅN#" -*J#)rE\`deU&L=.%=2}3"&:3iJ(`<[STq479k5WELAGM}%hҒ=M]ַwų_zb¬dBt_94A'Մ۽9ZR]hPߝ.#]rr 1;N=FYd龜 R*?(c)lêX -X!8M\(6w-s?Dk'pkWо6I3]1gWq, qaYwWs٪QWeT4EaJ/y2{yT,z]L0Q2:O8qܐw+5z -F9̮g%!aVVEH} 3':8DpoȇxMpU68 I,֕ \3g0TQ0H,Xb1c?vbT - cwE^´i x$rI1=x' ȮzW}UEwu/m_\5פ䦳T:1xkS]|Dk-–Y)0ifE0&v08~` &bd.rdfav -HB؜utv*ծڵs]u%) RѵJ̗<[F JXG.@@$A" p鰌")E>HBuA0P_( xI:Jn>p=IzY|{3Mv>\lWt1omg0ZUf2X\-Z柙}~b:R: Na'mSc'KD:"/T!jӁoaJƸ;X .71DblPF)af?W"zcAUktS;?VCo0en_ҪYs?r׾ fXkZ;YKl}Co לS~C! {e,@LNgߡ3/qE3 ZAt";dAht :;A: AN ¹"hu&-GTCh+LNolE ~Qw*k0+ZǶ-~߻)YKt7U(Ŷ)JzC_3(@t|skpr+W]elp^5!*}j}%ǓpZV~X[= ~ķy`\0"@1@U /> -UEA -< ;p8'LHWVxHpYBgmt>EϮC @|TB^%ruV~;D~`=a񳸐$~a*ݏb=A2 eA"I A 4|y,~o@G3x~I Q()%U. -$>UޭX7R`Y0|*WyI --#]RxF!=z~\¸fDɢ[` ^ T JpiT#a AB2Bu ?0{Q뚂FVG ё)@q∇,q Ғ0J)BT@c2 Xi\Z r y *K$GaA d@rc@;E74i1ѲSa$@"0H00 -$`$7H0D= $~ PqR$%+B791% ~ ~L~1 -Ks֔BC4D0 #H,C0#_-ot7? @Q@:H~s^bi,^)"$B,Z%C<Q_ 6[vJP Ž'./]N"H%@p0`i .Kp b -I  xlLJ0` '\\'~@@ A34PU0'藠bFè1*OIL|>06̐GGOƱX"Շ& V^?>&KrjA/2'dN-v 4 a@<0irl@fQ` p0840J>rp~qN2, >3HH@6!Ʌ/03I%X-Ek)F ( M0| Ϡ2y G@ jـL+ !EIi$(6J,<*JF nU2eNXJ D'E -F9N`rGagGtpB=MFb_9%RBѪA1~ZYw0PGoXMXFi frRA$v*vbKs1B@LB5;* Y1Ca:R\n\1OrX~C\($v $ŕ#)X"ȁEq6LՇb= (L 0p]AJ hCa ̙ė`A {@N%w(+ↅ)Ɩ^8TrOVתx2&Pxy@J9|ePr6.87qkKQ'8kɿuS=P?޵I3ݑ1 SQo 3*})Ȃdžtrw IHXK/{5xM0A-QM -D -` 0c#4O~Iq´$?j~;@7`3 ?"A`[ ӖX/H&!Z"B"eAͣQ"IVŏ.r O0@O.z;'_B]8pg"P] i]`84w<|ڧ4 |A!UB/#mdГ 7 -e FaY??aV*pLAA8neL, ϛG=~(,g0c7<:?@L_y`1&@} O snP l1f$=' q,5Ge~|hf98&Y"aD 8^=3+wZΖz[ R!6D!+ -3X,i|b$@!%ʛ(nylrv;]n^l4YB/IΚ%ߕ~7A5$=l9-g m.ov5dwv{O?- \ݯd/"$jpI͖!״olph@cj=LWzc0H*m6mxU9k_4t>\la@OwJ@_EI Cp`7n&T;8d.6zy _C!)j-aW}$z 6k|SԛmWX4e0{L6K𪇲29FemgS􍹇uYhhfrnV˭9>m\[w6@~V[*.  aO]XCRr6Ѷ&?6\oVC:ԑĩ̀7qd6Šs x ~Cv\[d3/T|XqjͷE6Yl,}0s+k$op^ӝal>5z^!ABb?T8(ԺkMc %#/ <ȶR U_`yƢj'ae`S/xzSm7]on4@b!G;}&%%TΉČϯ1l?N .Zרڔ |IAd*ny՚ rӠkDtWR@u],ԛ%ER>B^dI(ּ?#Xz'!HH/J6ү%S>3ppXqbPl-Er$I"ʩT}h)#TD(MTE!(q.XBW=HQ0`#OOHp78W/rm]!( -zӃy$͆z~Ta1.{2[@7ԃ=\]Lz(?[A:,Mz\qDr?ب4D'boOBUo LJ-Ɖt_?r6tDgY:&ozI9"HmD[ D8C/_|$ X[<M,Q۳(_JMPx~JwMj^bz;f6񃗯:v/p {8wi V񟺦xaWsIDZ)Q:'|`i-9S=sXaq1I! -%v-(`SH"n(_vwY2w5Z:kq()у9ڠHqy:P&n 8-E3H^[̒89 -u:$.hU?d#|Umiuo1j;O|`L>])j-1R -r)rYL 56 -Ze7 uEA$  1d$ۑᬹsԖ!wNzޥ1 Q.Ђ[U"}9)IܬPNUf0v%0r(wSoݍ(\&U}YvW>=dưā2I*XE -MH^KW.>vݏUm:d(+0߬~3L5j} -?O(Rړ`QqC?vܪŸKdLJ` Ʈ7B+)d[ˤ0.[_Rܐq`ɑJ$]4c.zT@a^¿}3_Q -)W쎛7m$6juXjW?QFYhK_-!{Y?Sʲypb^k ) LNτvgi [P 3*K*]eY9y[Nq+Y:29$j&h'6 d1T -!:ad 0zt$B֬Rm ׄ3-$)*ZC>!I`>mRW*NƍBf7)oGR|M]RDsVypT([2ȋPs5Y(ebZK[ht|hH{z qHc :ʕ/O ݉*< а6c8)GmXGouI+Ƽtzy?}++G/,+Ty%J`"x>=Z.6r*.{WUxX6H Mܬ!TYE%'{$%B!OLSM쌴pU-Uw2ǡ5lԤ\3 c -s&T~V]fJL|&ؤ?.:~8jߔ(/ˆUqߕ߰Dcc8U<@65ا6=]؎1ƴ˦}0Q)vGl%LyZPB4m=xý& >FOvĵO2\o#U -~ XEo>|Gh$<}ëy1WM`Ux«0VCoH;<1D3LLkN2H>݉%6QWMF$`_M)~;`#^ M3:_ez 0J߮3*LC:[IC1_P}W)XA˙\ؔN]=E]3e32I!#&\G1[cY)[M6ߚH}y& 9v0k1S#=\]İ Fa䀎r.)",bْ']dV5շd%Y KRu%gL-tlѧdi``j:75] k[{3컕$\,Gf`~QvS!/+< Yu;"3Z|*~L᩹m;y^L{'Q[`d3feo5 l&p`"N"r*ZRY z3e3ʬˉi˳ 2jMg+]7cc'QzlhHtMRMD8,Q&Q lc7D@/ZPD^wZ-3f? -k?\;cQO W|LhrԤ.l$x6׾Y"A,0*8|V:{Ou_\Gb@dB7˖90җ75$d -22uF)[*qgY;]:O jAGխ? ?vx# l74SnhXAM[&}ȱ# uِ"FODnlr8D.>w$40J`"+\_݋![ #[ %/s<*)Fx^WtN.hL44tUS"y Ը|@/rg(7WA{DYU%X􀖐pR» ~mэdic  X;Td1.qz-&`#@J`pV2hJl$&gu-~#XvwHm:afpfZns_l wA#3j@+;Ed`ڟU-6T&u{ )9`"fܮ/]$;D}ѸO4yYڤOgxмuq -ͯD5aˆ܀3\EK.J$BԾC64?{4׼MXf_<£Zhػ7ңM;=IJq8M%UW %P8G!Qͦ?۝Gs{g`F&m^Ag98?{jM)$ %EU{dxjy6(C}FE#Q9,1>go jp:,`Jg s EP9_E"axJߥGHl2+bw '"ٷW)Y)spؓ@u}r1yWl| `hN6Zٴ} B]FKI˃Mjb9cNgO_XFO)98 [rJE ƒC 3['!.BPb&^y7BKFp1iD#7!/BԶFi7tD,yBM"{# -Q1<>#@͈KY-ux, yhܳ7lLKڜLPL’l, bDY{mΦO38RG4@oYrgQ&wiO}n?dE& W_IQjz÷w ?\:ʋvԏ4?WcHȊ[_M`F"&P"(_(8͹C#-q=2yܹHM >S8=\U`Le FK͊Q϶f&hLXG4 -g\.'3.hy -5hd7VY#~ .Q{_CV@k#z8ݔ`g;W}a? PxkV2r2#;yږA+(Eu'gsbD3}bbc< -ǓᵁlnPmq'w>Y!3M4]29 Cջ^49%?<+z3uL Mjl⡬0mus0a#sЯג6=Z7 qoKvBzJLt?L>6H88s6.=G"H}ZIrnl庑, %1JsL/PI?'MAB27Ce>F/*T7eSW̦]M!ȍ78Md 6XޓsfPmBRv3GN>#$]x#06LG2ʒCAh4Mlm{E2ظ"4I>j*AZXq!vXS)dC F%gνh;Qm9 -$ 64=qDD1Ƶ:.#< Y~c⹊c7T62 -~1Uj0Jx1޽ЃY[8bɹ1)2ׁ=}H Uk:V0u0l@%0}VA5ATeP6)~̻OkZگ{;-"}4Mrs=z1\u`!/0 %VäoWr뎛m,Y mhe~jyJ̺sl1eaWڲq[kQ+qIp.D9~6`۷.Fч'1AEI6@aLLAW<#lKh3x`&oX 9hG)_ھHu>u$%o"lQzC|c0Kׯ0f}G+$/^&ԫZ g;Ww6n6;z ^h{\)|vo$AAqs"_ ^2SW6QBn)&24xl 3OBM,UD1IK0i'fӻ޼3Ng -hԦ=9 Gܼ"]c d;3&,ʳ B4MYcy`#,FA&f}v+tRw-s_xe]Y3iJ #B<dZ_Ys :?4F<},ң߼OPTyVoғ= J)f;[AU g;VH>CGRʥ>Y+CH}`˯TӯGd[bUP q6d9s6??MA=m3k hAA\D#e7.LL{21 -zmpB7h[n1]ytzIY`4ұMdTG[&'=dw}(wr݇1B:킻¯5:x -u~ھm_q! ֊Ɏ1j>vh1t`X ŗC68V^ -Twc믿 {`pXhD{r1P]k`_?f|\2>q#QeV+ykMҁ Z7!&w ->،H"P'{}EќՓpje[>ndx7fSz3/Ѕ?A+7 υ5Ĭƙ^0f#]Cot%_s6tPokwzƻҎ~XqLV0T@Wsxo<ܯ -_BQz 1#z~/T7}:76U;PbI5n˭%ƒxM><"͙MK0ih=N""zC=P0LQ. Sb|șI:3-C_Kglfb/YөK̃v([)cl3')@ "F1vyh cg2Cr rFŐ}N'+|a _tL`? tĻN 7-_0h>|;Є^+fږ/9G=r#"7X Fk`ro הg0Ŗh=!"g̞ LcipΘ4Zo-%ivc5ڝܰCm^=c["E2X6н26kŊUM+a/H!r gSǐ Wܐ7^ d(w CknovC w(T|{} KWԉA=kxޛ~ת7 յa4 ewkZaz2,2l]Th(twF*Y1Z&6~7:S7ѽ1J7l1pkáŋ1fF157ٷXx-̌|XT|na߶G:zǏN1z.P=t07^Zv{dlMd&wɛH1`[h)0nL>ҷŪ) r{5^|gmz4٭hֺk17}ROcZScƒ6VoFVW_p?tc:&y:ᾮ8kn{Bov Gz]9ޡlv/f03ۄIb0wcs'n~4noy9a̟y5-AgNweXcϖ$-9UT KZr=K,Cen{,;mln{}Zk.bM>kXk/k{b[Yvu<:rcN7HZcQ3 ->ؘ E?[[&~U@FښU6Km,o5;[.7o=kPLKC>5,w_Nlr0/M7uβ:7Go}qL'ώ?^T`qƞ3Nٮ<]<έcJlq/]Mv7&kvkޛEsvcN7r'܉ۯ4-- ~iWSO}}<ga,'>^!0RʑkOt̊X#^w&7˿y-}/yޯ[7M7K5H'4lh$o^2ڰBK"{djI.e$(*juRefFRoԃÓgJӍt~Od~ ^GglWQnϻM9}kF߃z>^o|zwN[TV,p$ogIoi7͘ࣅu6hR[mŨ);X/fMDUJOm`RM8Z0iiwq$>D\!. nrx4i.͖a_* M~-5a3#$R n=G7h1Go~Ӻ.EWE?sJX4{ݖX穂H ,7nwjz]TWM7J߬W`[y 6!>OW 4Aw'#h8iL?۫n79C݁\~^Ji_`)O8Yvg*|s}GcCh_0VU7[Sd[֏hB}5([ϟ;ihUbdҼPdpd?Ʒ &|no瑗tSɆ7>wWfjQ㮩Vy:۷u dƻjf0w#'cۼ5~CV{Sޡ徑{}4_@&ҬlvԻw[s)tԈݯi%[qY2m{00Q,_?N[cZ?:߯} -<Sh\yjB˧y^~&Gsx{b/h2O^^zثՃj^÷]l7_1U O x3d;+S rw M>kPZ5hzkGnQJ!R;`\>[HSr8K#:Ut?h.|Tt4Ex\[t^}y-# sQN`J's՝E2w΍<ioTڂEJ,^"tq/YQDմ5:﫥P0_]3\=u6v((~l.'ރIpR[2a.yd8<|gF_HΩ:>SOFg&G"41Ǿ ܎xGmWݏDU>!!# -E<9X粷lg:ׂ6 Qߩoyx Z-ͰW=þfݕ7 QxSCQMhQh5;I -]w6aWvZee;1.;Y:Gt] T`(<7'J`q'A {M/ +\$ -Nf1w]W$p֋'<g:oZ=/uVΛF(_.D>aMG4oG;<:36|ZQyF ۧ5܅W!mpFmߐ6ԦKO}7 扙?HZS":%\bHۓ]>Z~>6DO:V()"R|tY-H|:^X0)jMS֘1-kn9Ɣ1<(-o~J N73?; $h0Uה#ˁ33XaeP7wcE(B}cjjPY$@EH7cM] JP/Տ67t}DpT暭of;-@Ek#̵̘F"șqkyPkVliv6P2{>_-j?^Wϳ/ZI9BuDPo*TjܪA,T/g&JAϏKemce-k SzNW%H6Wd=JP=>Rdcv4nwJPrRTjT9 M8$rw'好m橷Jucu~tMuniV)F AAu5?b}T< 1T,:%1@%SFTgՆ2Ԓ,2 ܨЬt1rW@}Bîumsh?Yq-b;QzjP DAE`8堵e3(Bm[U-lR:!\Q{[~"מ -uY2 x{KVƕ"w -rJZaa֦yTi D5%O;rN uo `_vP%Hל6Y5W':@osܮPx{E3qᘇz݆RAqGd2Ys,>CEjMQA!KnTc}s_.RۅJm*q4|HGh#y86=5PH)/j.g UX(rPj?O`Pxz41$_o֗Uէ뭋kܣnݳ_/r#ZuZ)b!MA~Vv?}ڪS|꯿} UŔFZQ^i2?K-կPXiȲZvT,Δ>F@J!S?8[#+U/$xspfzJb;mgp,;Ž[k*t`ԚM6y'ўҘSµFkn&C~h1m΋s,g(Ӽ -DdT!R*T2 - -%P_Tջա"?HJRCP#q-pO,9=8%Pc̔PٮGjIc@*@}BE1b@* `htՠ9(AmRFO]OnފrDG$ҔN:$vF :Pǽtb !X07D!b OsRnGߡ;[]*L.7 S2LF|9`C dhD5jߤG@E,l&oM^$(hCq$@l?AE6;MAİ۹Hg9ӺF"qqr0 -#9(Z0XvSx91oN -)L|79%c"yF1,Qd8Dy|}%Y}L@ `@J@Ͳy,!}jVJZN*~o ~sT+|:(+i=.[!w"SE)#@_lתAH;(@"& Z,Di$rMf##{ߚRq= Q$Q#\ H#$$! =6W%4}M;M4iJZ'4y*YǓ ]oV%I="}kJr& -JX ݋(0xnN#ͧJ&=f.&qir<ŀH$;IX'*>i BuQZ[ts l6jP#~בNVT5u}˱"*VЅ|o)ϳ^uclY76Zx6*q2q)s8;l,6bTS ~Sna^ jK7QtU᤾ AjP?n")wz9nv`@:tC쥛o AtѴlnQ+.+1˼۝CKVތ'!-VԻ3ﻪ 7Z9*1vE3խq^xas3*c6#](47uyoŽ4~|:֏پSdNa -S_?NSk}D} VNA9~Cj :/ett$Ք6:r -AorP~gyPd//ݐMP3b)S5&0:zLu&z! t9r@;k]氐BLшy0, k*WSLMq`zD۩ܛ츓h @%S{m(,/Lmtš:Ž(AЊJByC6&UlN<{(ʎn=S0q6Yάߢik⟗i(Ӯ%-]~9v-L9v-߯oi!yr>Z_ǥ+Ӯ哦%OO!F9}ϟU!ޑN;bOѝINk?vII"ٕZZBf\&V)@|U*pZnHӅvUj;M`8 NOT7C+ZE|zgGG3/RlcE7O=5ZhS{J8[F&ge}N% ՠw 0GL'&`J1Q+;HO=OrCgY4WT5:e|D ԉB=:,vڍ-ϳ^f9xe7:?APOhEo:/zs4@ƘNtEo(iNMͯáڊgƟ8E!:%(iD SP.}'zKV$~RNngU$vYAx6V^{so>ǐt -ɒqFW*3AIl?S -䂐: 5tgЕ qLDesJtM%~&+Q7 -XNw ZgMaCA}mz+~8wByn8ҕyߠT)&âV(Veކy)DveLtʼN{yjSpO ~2]BӘ]KՉ.zy/8?^^3D6d ܑvzpoPG:7O$Kv)֏c~ߤ̨ɒI+}2и+ RRJ>TG8-1ՑfwQ/2futN]ZH܋>ßMmW UcTiV>afZ$u"YxEQZA,iuTivCU?&DREKɶ/U$۾Hl[kSNh%) -Kǥ$2~T8Ukk4ݩ-gWQk*ӮQpbo*b)/S ?\(מRtQ>Q8!Y09{^>q4t7S\Bm2:t e,շC.,ڍBՐj<]$" Y9{_jdjap/:W-cp'7̠{Sӣ5l?q)\z -AwKjY9sp__!k1J|F*T.-ZWyܲ bI3B}ܩ@eLYIoc~jnP-dW:%-%";x(HHyZz~Q -U/#AV*wOa}Nim|Ps=C;VУlUfs3Nu7%K; ObSOj;N -웾拓]2Cd;> bTY= ٝmQJN -LSpqFRSfţhD>'KHjzJx7Bv.?D )Ρ) b7fk dg.Ӿ]A=o#^GƦn EF!%7/X'"Wdaw-Ӟ( SwqVاTէZ>v>.UاTw>>N\Oi 9ha)B}J]oO_o`>rH;i,!…}JU}tWz.S|ꒅ}JU}r%}>K)] :NB}J$+{Ok#}J.Rҧ -?k64szgrv3jfa^;TwSkT:QWRMn<+IP*iv2ww{]{4UTRkKZAoJZiטt;znGtCFUSH%Sk!uRuGkpo-puŷcR1=a5[s|O!pV!~~o؍RɇGV~,_}T*9& ڨSAuUGmuXl:,G[(} S tOE.<^VQ.oy[Z(I\0J Wg48 }u>LY^ES(|*]lj^BRJ$WzaȽh]VJdLU *[ZIԜ5[?]@{QӨ "94\tݫǎx۱RTB R&/D|ͫ?2&A*A 1t֏Iܫa؅ -F>݂EG>/ t0@4ӥ5hufQ'#t&SZU8 ٚe.Q: -ZՙHGᤢSrƜ^M^_uV▪Egr"Uo PUSLpSNDKҨCs,;.Bv*:f(q<а<#^yL4_CC)\0apCOxlS@>$1w/!fNYg;;Jx .bt"m &< - -7gL0OIўמ6kCɵ1lO[F ]6wC8l!!Hx왰\(᡹P=5aYMq'/X²sc$v}E8?u:( CYi`H3,6MCUŠJj*1F`YVi`?\b"FiPl+>]9Ilu\FAS- -z KPVA N6 lE%PiVD{}ϣ5pʁ1*hzir&rq!V:|k&$aq|.#*.rƢ8&|p75c.o*j|2[}2ykHׅfmv+aj\a/{hf%gf M-UMmḪA2W5|X?iJS4ބ͌4:iBQUkpÇ*Z8uϑ}m=퐇j -Ưa} SX0U~~_ZPD+ghۂcDhtNG!G8PuKξʅ -Z!Gd! âQ1[}2z\ۋ_Mze\DCTH6-&rRx:Y-l4 -8*&$8_u.*X NbG3{(o!N2{i# d.@a3 -d,%nj.NV\9d&I;dJ`X2c()7~֋8"4} -/#,^T4sfbD+>2)up4mŐa3bjqc:q"{Rq|`lRԆ/N\_]PU@ѻ"N#]%2=v'X.[YA{g.CbuC".  -ty?l{C.f nI7 ڤqq}`}cjJ3n^RD.(L_ȱM ]&ZM[mv݊Ec -Jg8ZIj5SCorzLv?6%RYyƒ0NU -;]w$͎ +RL'x[x@W<C|ӆȓEMҦX"OcNsYpiŁ}y7#iH6cQ$i'>0fqN߁{=s&b> 5#ÕqQݴꡋ΍ q> J-Ji%Ph'%PZ| 9@);{ Sc33-l0fd[sH-8#,㢫jboi',:k`CMfjI9&AF& >H'%- &iX'?/)Cϳy;7 𢣂t>:$9ےX#p>ru#9;%I,P݃j3n<2|Z6_ިAj׻T Q'k9 ..񮠋 #IϲȧD漋50!PD_\ _GvIĪᐈz? XQK2 XO]fyn3iյ7Z;|5ps~y4ͼP4ͼv3o3M ԴQlVJr)%k=/JC"ek|4Cg.RY"(pϥ3\B>9:_wi%o>.FW iTw+nl OWM;H/x) cWۉ뭁Oz;-5|V{0$mo?e|FcI6WA},j*Ϩ+"׽#vxA/Ȋx+aL@2 7ƗSj\n/~j/DsylydwKؽ]tabk ۑә)ME6kZC5;fUVww,{U/+W|+w6iG А NݠNz3} 2S٤\0"KȜqvoMbԛ 2uw|E,K'02M)Ƭ nqz*r2H!0\ ,q; hbiu@b\1m%!RM1k~fAh\$B ŝM!<[i)c4hglޫ5بE\'CVTqW :/^8ru/ tJ(Q8f+CU&ғb ?[<&ȃo^Zi~RBzdEut}$*XiDw2\b}~7"ԁ̕"=w&.vy#:wVAƩE,e8W+j{֋U4^cGG{창UV{V7({DZ͗oJY ѢabW:q:_HO?tueIܲrEpT!%zt:[/ ה4尐_sj),3v.(k W\-5dc)1Ev=wfޠg -yA /;ʔFkz^S_S2^ks^qzwŮbmJY.ݲYUG[n!>%D#N(3)lրs?[vM 5Ý&ɳKrx4tgܘժ?Cx?w -X_ɋD; =((=&Kr+ΨrAhF2ĘX?NtΊ3_t][f`hmrutǽ@e=XmƒŦw'cu$4BI. uݖW*Ǘ?AIXH1D*MPN*_mMmK:n؏8bbqm>k&=Ͳx9J܅($\`{bpdQؠnlM_xXG.0oY.,T1v(m-}<NyڥŘeY&YA=bh&t bLuHb~[fghH 1K%{W%%S4B)~xxMNP#vy0S }S-$SyLܶY {cl&|#NMIi0p(gHv&`ځXsㆁ uL<2?|N!ǵJ==9G'6q6H`ݳɃIwwl- SZ8飙`LFv_C|ǎZ@^ŦNj]bcE:;ݫڷ芞}c-4{qxmX'jSl޼V0Zkv}o:j+¬};R˽ҽe l#ƪq Xd6Mmg9<M),HvD:TQm>BaS - ֗ QΉI}!hzt51QW]ZuzdhRM!o]`}V|CVaE*ˊZ Y5V|CV`3KZ YҢV|CV,F~-3j7d63u -i>Qje!>EdBqHVg|ZC0$.]q'EbO ëXJZHtyK8Ŝ[E(u%*ZDŽsI{2],l]o81x$9xh̠w+ӧȐ^ΰƌACط֐bB /7b, -qX-_ȉhΑ[.QX*hH+7_ WyI*)C/׎=>t7(yu0tmpacm8`o:Nl[=)_鰣- |KwEh~q_'~Q'z`T^E*%AF4 H"(DTDTIEYT*W4C%* -/4DQ,M8W -? Wd# @$|_vݖU?2Nq*?BRЧ2}9Ưw׵0{]A[o9N: _Ng:C`f)u72tz/=}p' f|υEӏAԛu/xh5rsʒ} Y>vLGu^W= Jzu4Tnٚc'}PׅoGa7r:Ÿ4{ڷHr_z嵉:oC ]}[j]}p}Y=/9}z.3e_M3= ~W?\q\r s*X>zT Jy(M1R nU -pL![yU?Ml)({=4@O> ov8OlVQ0 OD[%j5h*c lwϡtf]`fڵ7@swy.`4`Vgf!7 ;MKgi10eì01;S๫,M5R ?e޸Ē0 -+2\{ -D -EB$bFHgRpm/ť$g$lS,5BU kP4IҀ"I)E$%&I׼"ЏTE 1o"M@LGFL -8wGţ7U N~5w$   w Nvs. NQph dS$ - KSAO -d2,D\& H1,q< -f:ۤh<#C #3RhXxNe̓]kÅ&(ЉjZ)Iϼ -&{Q`o x۷Jx $;Mdb.|Lxtma3,jeuaAA7^CE}WTE%(gȪ#u Rw p@4( -b ]]P,Fq\Әx 3RdL.5\׆ -TUW8Bd&_HmB\CT׿k8| mx, D?ecV K+# -O?aV.f1PT -T.H؜$ABP xa5L4E% -<^xNBS%y/tGu_c? (V?պQs~\CZ6N$e{\8(cJ;iJ/–H4(A)Lւ0p4eXHXЀA0#*Ayp‚`ϊp"А)7QCLUÊ H#eMDag$"Ss 4ɐsjM?k<`>_GW&`m)F'Ij!!\ nh{mSZ?oWf,J/pCۣ __pk/T>2?X_ϟB M -endstream endobj 6 0 obj <> endobj 5 0 obj <> endobj 7 0 obj <> endobj 33 0 obj <> endobj 35 0 obj <> endobj 34 0 obj <> endobj 36 0 obj <> endobj 51 0 obj [/View/Design] endobj 52 0 obj <>>> endobj 49 0 obj [/View/Design] endobj 50 0 obj <>>> endobj 47 0 obj [/View/Design] endobj 48 0 obj <>>> endobj 45 0 obj [/View/Design] endobj 46 0 obj <>>> endobj 21 0 obj [/View/Design] endobj 22 0 obj <>>> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 67 0 obj [66 0 R 64 0 R 65 0 R 63 0 R] endobj 92 0 obj <> endobj xref -0 93 -0000000004 65535 f -0000000016 00000 n -0000000286 00000 n -0000058121 00000 n -0000000008 00000 f -0000402280 00000 n -0000402207 00000 n -0000402356 00000 n -0000000010 00000 f -0000058172 00000 n -0000000011 00000 f -0000000012 00000 f -0000000013 00000 f -0000000014 00000 f -0000000015 00000 f -0000000016 00000 f -0000000023 00000 f -0000403415 00000 n -0000403446 00000 n -0000403299 00000 n -0000403330 00000 n -0000403183 00000 n -0000403214 00000 n -0000000024 00000 f -0000000025 00000 f -0000000026 00000 f -0000000027 00000 f -0000000028 00000 f -0000000029 00000 f -0000000030 00000 f -0000000031 00000 f -0000000032 00000 f -0000000000 00000 f -0000402426 00000 n -0000402571 00000 n -0000402500 00000 n -0000402648 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000403067 00000 n -0000403098 00000 n -0000402951 00000 n -0000402982 00000 n -0000402835 00000 n -0000402866 00000 n -0000402719 00000 n -0000402750 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000061623 00000 n -0000061768 00000 n -0000061697 00000 n -0000061845 00000 n -0000403531 00000 n -0000058595 00000 n -0000065177 00000 n -0000062493 00000 n -0000062380 00000 n -0000059226 00000 n -0000061061 00000 n -0000061109 00000 n -0000062264 00000 n -0000062295 00000 n -0000062148 00000 n -0000062179 00000 n -0000062032 00000 n -0000062063 00000 n -0000061916 00000 n -0000061947 00000 n -0000062528 00000 n -0000065251 00000 n -0000065513 00000 n -0000066891 00000 n -0000096688 00000 n -0000162277 00000 n -0000227866 00000 n -0000293455 00000 n -0000359044 00000 n -0000403577 00000 n -trailer -<<697CD4CA72C38B48B7F34A9A586412CD>]>> -startxref -403761 -%%EOF diff --git a/misc/icons/pomotroid-icon--0.2.ai b/misc/icons/pomotroid-icon--0.2.ai deleted file mode 100644 index a8d9586..0000000 --- a/misc/icons/pomotroid-icon--0.2.ai +++ /dev/null @@ -1,2308 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/OCGs[5 0 R 7 0 R 6 0 R 8 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - pomotroid-icon--0.2 - - - Adobe Illustrator CC 22.0 (Windows) - 2018-01-30T08:52:21-06:00 - 2018-01-30T08:52:21-07:00 - 2018-01-30T08:52:21-07:00 - - - - 256 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FUs13zP5d0C3+sa1qNvYRkEp68iqzU/kX7TH/VGEAlBLy7zD/zlB5KsS0ej2lzrEq/Zen1a E/7OQNJ/yTywYixM3nes/wDOT/ny7LLpttZ6ZEfssEaeUfNpDwP/AAGTGII4yw3Uvzf/ADN1Ek3H mO8SvUW7i2Hj0gEeSEAx4ix661/Xbs8rrUbq4PjLNI56U/aY9slSLQGFXYqj7XX9dtDytdRurc+M U0iHpT9lh2wUtsh0383/AMzdOINv5jvHp0Fw4uR49JxJkTAJ4izLRv8AnJ/z5aFV1K2s9TiH2mKN BKfk0Z4D/gMicQZcZeieXv8AnKDyVfFY9YtLnR5W+09PrMI/2cYWT/knkDiKRN6joXmfy7r9v9Y0 XUbe/jABf0JFZlr/ADr9pT/rDKyCGQKZ4EuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux ViXnf80/Jvk6I/pW8D3tKx6db0kuWqKiqVAQHxcgZKMCUE08B85/85KecdXL2+hIuh2J2DpSW6Ye 8jDiv+wUEfzZdHEBzYGbye9vr2+uXur24kurqU1knmdpJGPizMSTljBQwq7FXYq7FXYq7FXYq7FX Yq7FVeyvr2xuUurK4ktbqI1jnhdo5FPirKQRgV6x5M/5yU846QUt9dRdcsRsXekV0o9pFHFv9mpJ /myuWIHkzE3v3kj80/JvnGIfoq8CXtKyadcUjuVoKmiVIcDxQkZTKBDMG2W5FLsVdirsVdirsVdi rsVdirsVdirsVdirsVQesazpWi6dNqOq3UdnZQCss8poo8AO5J7AbnthAtXzj+Y3/OSeq6iZdO8o K2nWO6tqTj/SZB/xWOkQ992/1cuji72szeJTTTTyvNPI0s0hLSSOSzMx3JJO5OWsFmFXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYqvhmmglSaCRopoyGjkQlWVhuCCNwcCvbfy5/5yT1XTjFp3m9W1Gx2 VdSQf6TGP+LB0lHvs3+tlUsXczE30do+s6VrWnQ6jpV1HeWU4rFPEaqfEHuCO4O475SRTYjMCuxV 2KuxV2KuxV2KuxV2KuxV2KsU/ML8yfL3kfS/repP6t5KD9S06Mj1ZmHz+yg/ac9Pc7ZKMSUE0+SP Pn5i+ZPOupG71abjboT9VsIyRBCP8le7eLHc/LbMmMQGom2L5JDsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVZR5D/MXzJ5K1IXekzcrdyPrVhISYJh/lL2bwYbj5bZGUQUg0+t/y+/Mjy95 30v61psnpXkQH13T5CPVhY/8SQ/suNj7HbMaUSG0G2V5FLsVdirsVdirsVdirsVdirBvzU/NTS/I elqzKLvWbsH6hYVpWmxllI3WNT9LHYdyJwhbEmnyB5h8w6x5h1afVtXuGub24NXdugHZEHRVXsBm SBTWSluFDsVdirsVdiq+KGWZxHEjSSHoiAsT9AyMpACyzx45TPDEEnyTyy8la1cUaRVtkPeQ/FT/ AFVr+OYWTtHHHlu77TezOqybyAgPP9Q/TSdW35fWSgG5upJD3EYCD8eeYc+1JfwgB3uD2RxD+8nK XuofrTGLyd5fjG9sZD4u7n8AQMx5a/Kerssfs5oo/wAF+8n9aJXy5oSmosovpFf15WdXl/nFyY9j aQf5OLm8uaExqbKL6BT9WI1eX+cVl2NpD/k4oaXyd5fkG1sYz4o7j8CSMsjr8o6uNk9nNFL+CvcT +tLrn8vrJgTbXUkZ7CQBx+HDMiHakv4gC63P7I4j/dzlH30f1JLe+Stat6tGq3KDvGfip/qtT8Mz MfaOOXPZ0Wp9mdVj3iBMeX6j+i0jlhlhcxyo0cg6o4KkfQczYyBFh0OTHKB4ZAg+azJMHYq7FXYq 7FUy8veYdY8vatBq2kXDW17bmqOvQjujjoyt3BwEWkF9f/lX+aml+fNLZlUWms2gH1+wrWldhLET u0bH6VOx7E404U2A2znIMnYq7FXYq7FXYq7FWKfmR+YOl+SPL0mpXVJbyWsen2VaNNLT8EXq7dh7 kZKMbKCafGXmHzDq3mHWLjV9WnNxe3Lcnc9AOyIP2VUbAZlAU1EpbhQ7FXYq7FVSCCaeVYoUaSRt lRRUnIykIizybMWKWSQjAGUj0DLdJ8hswWXU5OI6/V4zv/sm/p9+arP2n0gPi9h2f7KE1LOa/oj9 J/V82WWen2VlH6drCsK9+I3PzPU/TmqyZZTNyNvYabSYsEeHHERH4+aIytyHYq7FXYq7FXYq7FXY qh7zT7K9j9O6hWZe3Ibj5HqPoyzHllA3E04+p0mLPHhyREh+PkxPVvIbKGl0yTkOv1eQ7/7Fv6/f m1wdp9Jj4vH9oeyhFywG/wCif0H9fzYlPBNBK0UyNHIuzIwoRm1jISFjk8flxSxyMZgxkOhU8k1u xV2KuxVMvL3mHVvL2sW+r6TObe9tm5I46Ed0cftKw2IwEWkF9m/lv+YOl+d/L0epWtIryKkeoWVa tDLT8Ubqjdx7g5iyjRbQbZXkUuxV2KuxV2KoPWdY07RdKutV1GYQWVnGZZ5T2UdgO5J2A7nbCBav in8xfPmpedfMk2rXZKW61jsLWu0MAPwr/rHqx7n2pmVGNBpJti+SQ7FXYq7FU00Ty/e6tLSIenbq aSTsNh7DxPtmLqNVHEN+fc7XszsjLq5enaA5y/HMvQtK0Ww0yHhbJ8ZH7yZt3b5n+GaDPqJ5Dcn0 jQdmYdLGsY36nqUflDnuxV2KuxV2KuxV2KuxV2KuxV2KuxVAarothqcPC5T4wP3cy7OvyP8ADL8G onjNxcDX9mYdVGsg36HqHnut+X73SZaSj1LdjSOdRsfY+B9s3+n1Uco259z5v2n2Rl0kvVvA8pfj kUrzKdU7FXYq7FWUfl1581LyV5kh1a0Je3akd/a12mgJ+Jf9YdVPY+1cjKNhINPtbRtY07WtKtdV 06YT2V5GJYJR3U9iOxB2I7HbMUim5GYFdirsVdir5l/5yT/MY6jqq+UNOl/0HTmD6kynaS57R/KI df8AKP8Ak5fij1a5l4flzB2KuxV2Kp35b8tzarN6klY7KM/G/dj/ACr/ABOYWr1YxCh9TvexexZa uXFLbEOZ7/IfjZ6Nb28FvCkECCOJBRUXoM56czI2eb6XhwwxxEICojoqZFsdirsVWu6IpZ2CqNyx NAPpwgWiUhEWTQSa984aHakqJjcOP2YRy/4Y0X8czMegyy6V73R6n2j0mLbi4z/R3+3l9qT3H5hG pFvZbdmkf+AH8cy49ld8nS5fbD+Zj+Z/QB+lBv5+1g14xQKO3wuT/wASy4dl4+8/j4OFL2t1J5Rg Pgf+Kcnn7WBTlFAw7/C4P/EsT2Xj7z+Pgsfa3UjnGB+B/wCKRlv+YRqBcWW3do3/AIEfxymXZXdJ zcXth/Px/I/oI/SnFl5w0O6IUzG3c/szDj/wwqv45iZNBlj0v3O603tHpMu3FwH+lt9vL7U5R0dQ yMGU7hgag/TmGRTvIyEhYNhdgS7FXYqp3FvBcQvBOgkicUZG6HJQmYmxza82GGSJhMXE9HnPmTy3 NpU3qR1kspD8D91P8rfwOdDpNWMoo/U+adtdiy0kuKO+I8j3eR/G6SZmuidirsVdir3D/nGz8xjp 2qt5Q1GX/QdRYvprMdo7nvH8pR0/yh/lZTlj1ZwL6ayhsdirsVYl+afneLyd5NvNVqPrrj6vp0Zo eVzIDwND1CAFz7DJQjZQTT4lmmlnmknmcyTSsXkkY1ZmY1JJPcnMppWYVdirsVTTy/okurXoiFVt 46NPIOw8B7ntmLqtQMUb69Ha9kdmS1eXh5QH1H8dS9Nt7eG3gSCBAkUY4oo7DObnMyNnm+p4cMcc BCAqI5KmRbHYq7FWNa350s7MtDZAXNwNi9f3an5j7X0ffmx0/Z8p7y2H2vMdp+0uLDcMXrn/ALEf r+HzYXqGr6jqD8rqZnFaiPog+SjbNziwQxj0h4fWdo59SbySJ8unyQeXOE7FXYq7FXYq7FUZp+r6 jp78rWZkFamPqh+anbKcuCGQeoObo+0c+mN45EeXT5M00TzpZ3hWG9Atrg7B6/u2PzP2fp+/NNqO z5Q3juPte47M9pcWaoZfRP8A2J/V8fmyXNc9O7FXYqp3FvDcQPBOgeKQcXU9xkoTMTY5tebDHJAw mLiebzLzBokuk3piNWt5KtBIe48D7jvnSaXUDLG+vV8s7X7MlpMvDzgfpP46hK8ynVOxV2Kr4ZpY Jo54XMc0TB45FNGVlNQQR3BwK+2vys87xecfJtnqtR9dQfV9RjFBxuYwOZoOgcEOPY5izjRbgbZb kUuxV8qf85Kecjq/nFNCt3rZaGnB6dGupQGlP+xXinsQcyMUaDXMvIMtYOxV2KqkEEs8yQxLykkY KijuTkZSERZ5NmLFLJIQiLlI0HqWi6VDplglslC/2ppP5nPU/wBM5jUZzknxF9Z7M0EdLhGMc+p7 yj8oc92KrZJI4o2kkYJGgJZiaAAdzhAJNBjOYiDKRoBgHmTzbNfF7WzJjs+jN0aT5+C+335vtJoR D1S3l9z53217QSzk48XpxfbL9nl8+5jebF5l2KuxV2KuxV2KuxV2KuxV2Ksk8t+bZrEpa3hMln0V urR/LxX2+7Ndq9CJ+qO0vvem7F9oJYCMeX1Yvtj+zy+Xcz+OSOWNZI2DxuAVYGoIPcZoSCDRfRIT EgJRNgrsDJ2KoDWtKh1Owe2egf7UMn8rjof65fp85xz4g4HaegjqsJxnn0PcXls8EsEzwyrxkjYq 6nsRnTxkJCxyfJsuKWORhIVKJoqeSa3Yq7FXr/8AzjX5zOkecX0K4eljri8EB6LdRAtGf9kvJPcl cqyxsWzgX1XmO2JZ5n1230Dy7qOtXFDHYW8k/AmnJlX4U+bNRcIFlBL4Pvr25vr24vbpzLdXUjzT yHq0kjFmY/MnMtpUMKuxV2Ksx8h6SGaTU5V2WsdvXx/ab+H35qO08/KA+L2nsp2fZOeQ5bR/Sf0f NmmaZ7h2KuxV595t8yG+mNnav/ocZ+Jh/uxh3/1R2+/N/odJwDil9R+x859oO2jnl4WM/uo/7I/q 7vn3MbzYvMuxV2KuxV2KuxV2KuxV2KuxV2KuxVknlLzIbGYWd0/+hyH4WP8Autj3/wBU9/vzXa7S cY4o/UPtem9n+2jgl4WQ/upf7E/q7/n3vQc0D6M7FXYqwvz5pIVo9TiXZqR3FPH9lv4fdm57Mz84 H4PD+1fZ9EZ4jntL9B/R8mHZt3i3Yq7FVexvbmxvbe9tXMV1ayJNBIOqyRsGVh8iMCvvDyxrtvr/ AJd07Wregjv7eOfgDXizL8SfNWquYhFFuBeXf85QeYTY+SrTR424y6xcjmvjDbUkf/ko0eWYhuxm XyzmQ1uxV2Kr4YnmlSKMVkkYIg8SxoMjKQAss8eMzkIx5k09a0+zjsrKG1j+zCoWvie5+k75yuXI ZyMj1fYdJpo4MUcceUR+PmiMrch2Ksa86a0bOzFlC1Li5B5kdVj6H/gun35suz9Pxy4jyH3vMe03 afg4vCifXP7I/t5fN5/m+fOnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq9A8l62byzNlM1bi2A4E9 Wj6D/gen3ZoO0NPwS4hyP3vovs12n42Lwpn1w+2P7OXyZLmuendiqH1CzjvbKa1k+zMpWvgex+g7 5ZiyGEhIdHH1emjnxSxy5SH4+TyWaJ4ZXikFJI2KOPAqaHOqjIEWHx7JjMJGMuYNLMkwdirsVfU3 /OL/AJhN95Ku9HkblLo9yeC+ENzWRP8AkosmY+UbtkC87/5yf1k3fny201WrFplmgZfCWdjIx+lO GTxDZE+bx3LWDsVdiqf+SrL6xrSyMKpbKZD4cvsr+uuYHaOThx13vQ+zOm8TVCR5QF/oH6/g9Gzn n0t2KrXdURnY0VQSxPYDrhAtEpCIJPIPKNX1B9Q1Ga6atHb92D2QbKPuzqcGIY4CL5D2jrDqc8sh 6nb3dEHlzhOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVGaRqD6fqMN0taI37wDuh2YfdlOfEMkDFz eztYdNnjkHQ7+7q9XR1dFdTVWAKkdwemcsRT69GQkARyK7Al2KvOfO1kLfWmkUUS5USe3L7Lfqrn Q9nZOLHXc+ae02m8PVGQ5TF/Hkf1/FIMz3nnYq7FXsX/ADjBrJtPPlzprNSLU7Nwq+MsDCRT9Cc8 qyjZnDmw3839SOo/mb5juCa8Lx7cH2tgIB1/4x5KA2Yy5sPyaHYq7FWc/l9bBbK6uSN5JBGD7IK/ 8b5pO1J+oR7g997I4KxTyfzpV8h+1lmap652KpJ5wvTa6HMFNHuCIV/2W7f8KDmboMfFlHlu6L2j 1PhaSVc5+n58/st5rnRvmDsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVeleT703WhwhjV7cmF v9juv/CkZzmvx8OU+e76f7OanxdJG+cPT8uX2UneYTvXYqxP8wbYNZWtyBvHIYyfZxX/AI0za9lz 9Rj3h5H2uwXihk/myr5j9jBs3bwLsVdirMPyg1I6d+Zvly4BpzvEtyfa5BgPT/jJkJjZMebHtfuj d67qN03W4uppT06vIzdtu+SCCgMKuxV2KvSvJ0Qj8v2x7yF3P0uQPwGc5r5XlL6h7OY+HRQ87P2l O8wneOxVhn5hXBrZW4O3xyMPuA/jm47Kj9ReI9sMv93D3n7gP0sNzcPFOxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxVmX5e3Bre25O3wSKPvB/hmn7Vj9Je19j8v95D3H7wf0MzzTvbuxVJPOMQk8 v3J7xlHH0OAfwOZuglWUOj9o8fFop+VH7Q81zo3y92KuxVH6BdG013TrpetvdQyjp1SRW77dsBUI DCrsVdirsVep+XFK6FZA/wC+gfv3zmNWf3sve+s9jRrSY/6qZZjOzdirAPPz11iJa7LAu3uXbN92 WP3Z9/6nzv2tlepiO6A++TGc2Ty7sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVZN5BemsSrXZ oG29w65re1B+7Hv/AFvUeyUq1Mh3wP3xZ/mhfRHYqlvmNS2hXoH++ifu3zJ0h/ex97rO2Y3pMn9V 5ZnTvkzsVdirsVdirsVdirsVep+XGLaFZE/76A+7bOY1Y/ey976z2NK9Jj/qplmM7N2KsA8/JTWI mps0C7+4ds33ZZ/dn3/qfO/a2NamJ74D75MZzZPLuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xVk3kFK6xK1Nlgbf3Lrmt7UP7se/9b1HslG9TI90D98Wf5oX0R2Kpb5jYroV6R/voj79sydIP3sf e6ztmVaTJ/VeWZ075M7FXYq7FUfr9qbTXdRtW6291NEenVJGXtt2wBSgMKuxV2KvSvJ0ok8v2w7x l0P0OSPwOc5r41lL6h7OZOLRQ8rH2lO8wneOxVhn5hW5rZXAG3xxsfuI/jm47Kl9QeI9sMX93P3j 7iP0sNzcPFOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVmX5e25re3BG3wRqfvJ/hmn7Vl9Ie 19j8X95P3D7yf0MzzTvbuxVJPOMoj8v3I7yFEH0uCfwGZugjeUOj9o8nDop+dD7Q81zo3y92KuxV H6Bam713TrVetxdQxDp1eRV77d8BUMh/N/TTp35m+Y7cinO8e4A9rkCcdf8AjJkYHZMubD8mh2Ku xVnP5fXIayurYneOQSAezin/ABpmk7Uh6hLvD33sjnvFPH/NlfzH7GWZqnrnYqknnCyN1ocxUVe3 ImX/AGOzf8KTmboMnDlHns6L2j03i6SVc4er5c/st5rnRvmDsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVeleT7I2uhwlhR7gmZv9lsv/AAoGc5r8nFlPls+n+zmm8LSRvnP1fPl9lJ3mE712KsT/ ADBuQtla2wO8khkI9kFP+N82vZcPUZdweR9rs9YoY/50r+Q/awbN28C7FXYqzD8oNNOo/mb5ctwK 8LxLgj2tgZz0/wCMeQmdkx5sy/5yf0Y2nny21JVpFqdmhZvGWBjGw+hOGRxHZlPm8dy1g7FXYqn/ AJKvfq+tLGxolypjPhy+0v6qZgdo4+LHfc9D7M6nw9UInlMV+kfq+L0bOefS3YqtdFdGRhVWBDA9 weuEGkSiJAg8i8o1fT30/UZrVq0Rv3ZPdDup+7OpwZRkgJPkPaOjOmzyxnodvd0QeXOE7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FUZpGnvqGow2q1o7fvCOyDdj92U58oxwMnN7O0Z1OeOMdTv7ur1dE VEVFFFUAKB2A6ZyxNvr0YiIAHILsCXYq85863v1jWmjU1S2URjw5fab9dM6Hs7Hw4773zT2m1Pia oxHKAr9J/V8EgzPeedirsVexf84waMbvz5c6ky1i0yzcq3hLOwjUfSnPKsp2Zw5vRP8AnKDy8b7y VaaxGvKXR7kc28Ibmkb/APJRY8hiO6Zh8s5kNbsVdiq+GV4ZUljNJI2DofAqajIyiCKLPHkMJCUe YNvWtPvI72yhuo/szKGp4HuPoO2crlxmEjE9H2HSamOfFHJHlIfj5IjK3IdirGvOmiG8sxewrW4t geYHVo+p/wCB6/fmx7P1HBLhPI/e8x7S9meNi8WA9cPtj+zn83n+b986dirsVdirsVdirsVdirsV dirsVdirsVdir0DyXohs7M3sy0uLkDgD1WPqP+C6/dmg7Q1HHLhHIfe+i+zXZng4vFmPXP7I/t5/ Jkua56d2KofULyOysprqT7MKlqeJ7D6TtlmLGZyER1cfV6mODFLJLlEfj5vJZpXmleWQ1kkYu58S xqc6qMQBQfHsmQzkZS5k2syTB2KuxV9Tf84v+XjY+SrvWJF4y6xcng3jDbVjT/ko0mY+U7tkA9R8 z6Fb6/5d1HRbigjv7eSDmRXizL8L/NWo2Vg0WRD4PvrK5sb24srpDFdWsjwzxnqskbFWU/IjMtpU MKuxV2Ksx8h6sFaTTJW2aslvXx/aX+P35qO08HKY+L2nsp2hROCR57x/SP0/NmmaZ7h2KuxV595t 8tmxmN5ap/och+JR/utj2/1T2+7N/odXxjhl9Q+1859oOxTgl4uMfupf7E/q7vl3MbzYvMuxV2Ku xV2KuxV2KuxV2KuxV2KuxVknlLy2b6YXl0n+hxn4VP8Auxh2/wBUd/uzXa7V8A4Y/Ufsem9n+xTn l4uQfuo/7I/q7/l3vQc0D6M7FXYqwvz5qwZo9MibZaSXFPH9lf4/dm57Mwc5n4PD+1faFkYInlvL 9A/T8mHZt3i3Yq7FVexsrm+vbeytUMt1dSJDBGOrSSMFVR8ycCvvDyxoVvoHl3TtFt6GOwt44OYF OTKvxP8ANmq2YhNluATPAl8qf85KeTDpHnFNdt0pY64vNyOi3UQCyD/ZLxf3JbMjFKxTXMPIMtYO xV2KqkE8sEyTRNxkjYMjDsRkZREhR5NmLLLHITialE2HqWi6rDqdglylA/2Zo/5XHUf0zmNRgOOf CX1nszXx1WEZBz6juKPyhz3YqtkjjljaORQ8bghlIqCD2OEEg2GM4CQMZCwWAeZPKU1iXurMGSz6 svVo/n4r7/fm+0muE/TLaX3vnfbXs/LATkxerF9sf2efz72N5sXmXYq7FXYq7FXYq7FXYq7FXYqy Ty35Smvil1eAx2fVV6NJ8vBff7s12r1wh6Y7y+56bsX2flnIyZfTi+2X7PP5d7P4444o1jjUJGgA VQKAAdhmhJJNl9EhARAjEUAuwMnYqgNa1WHTLB7l6F/swx/zOeg/rl+nwHJPhDgdp6+OlwnIefQd 5eWzzyzzPNK3KSRizse5OdPGIiKHJ8my5ZZJGcjcpGyp5JrdirsVev8A/ONfkw6v5xfXbhK2Ohrz Qno11KCsY/2K8n9iFyrLKhTOAfVeY7Y7FWJfmn5Ii84+TbzSqD66g+sadIaDjcxg8BU9A4JQ+xyU JUUEW+JZoZYJpIJkMc0TFJI2FGVlNCCD3BzKaVmFXYq7FU08v63LpN6JRVreSizxjuPEe47Zi6rT jLGuvR2vZHactJl4ucD9Q/HUPTbe4huIEngcPFIOSMO4zm5wMTR5vqeHNHJATgbieSpkWx2KuxVj Wt+S7O8LTWRFtcHcpT92x+Q+z9H3ZsdP2hKG0tx9rzHafs1izXPF6J/7E/q+HyYXqGkajp78bqFk FaCTqh+TDbNzizwyD0l4fWdnZ9MayRI8+nzQeXOE7FXYq7FXYq7FUZp+kajqD8bWFnFaGTog+bHb KcueGMeoubo+zs+pNY4k+fT5s00TyXZ2ZWa9IubgbhKfu1PyP2vp+7NNqO0JT2jsPte47M9msWGp 5fXP/Yj9fx+TJc1z07sVdiqncXENvA887hIoxydj2GShAyNDm15s0ccDOZqI5vMvMGty6temU1W3 jqsEZ7DxPue+dJpdOMUa69XyztftOWry8XKA+kfjqUrzKdU7FXYqvhhlnmjghQyTSsEjjUVZmY0A AHcnAr7a/K3yTF5O8m2elcR9dcfWNScb8rmQDnv3CABB7DMWcrLcBTLcil2KuxV8y/8AOSf5cnTt VXzfp0X+g6iwTUlUbR3PaT5Sjr/lD/Ky/FLo1zDw/LmDsVdirsVTvy35km0qb05KyWUh+NO6n+Zf 4jMLV6QZRY+p3vYvbUtJLhlviPMd3mPxu9Gt7iC4hSeBxJE4qrr0Oc9OBiaPN9Lw5oZIicDcT1VM i2OxV2KrXRHUq6hlOxUioP0YQaRKIkKIsJNe+T9DuiWEJt3P7UJ4/wDCmq/hmZj1+WPW/e6PU+zm ky78PAf6O32cvsSe4/L01Jt73bssifxB/hmXHtXvi6XL7H/zMnzH6Qf0IN/IOsCvGWBh2+Jwf+I5 cO1Mfcfx8XCl7JakcpQPxP8AxLk8g6wacpYFHf4nJ/4jie1Mfcfx8Vj7Jak85QHxP/Eoy3/L01Bu L3busafxJ/hlMu1e6Lm4vY/+fk+Q/ST+hOLLyfodqQxhNw4/amPL/hRRfwzEya/LLrXud1pvZzSY t+HjP9Lf7OX2JyiIihUUKo2CgUA+jMMm3eRiIigKC7Al2KuxVTuLiC3heedxHEgqzt0GShAyNDm1 5s0McTOZqI6vOfMnmSbVZvTjrHZRn4E7sf5m/gM6HSaQYhZ+p807a7alq5cMdsQ5Dv8AM/jZJMzX ROxV2KuxV7h/zjZ+XJ1HVW836jF/oOnMU01WG0lz3k+UQ6f5R/ycpyy6M4B9NZQ2OxV2KuxVB6zo +na1pV1pWowieyvIzFPEe6nuD2IO4PY74QaV8U/mL5D1LyV5km0m7Be3aslhdU2mgJ+Fv9YdGHY+ 1MyoysNJFMXySHYq7FXYqmmieYL3SZaxH1LdjWSBjsfceB98xdRpY5Rvz73a9mdr5dJL07wPOP45 F6FpWtWGpw87Z/jA/eQts6/MfxzQZ9PPGak+kaDtPDqo3jO/UdQj8oc92KuxV2KuxV2KuxV2KuxV 2KuxV2KoDVdasNMh53L/ABkfu4V3dvkP45fg088hqLga/tPDpY3kO/QdS891vzBe6tLWU+nbqaxw Kdh7nxPvm/0+ljiG3PvfN+0+18url6toDlH8cyleZTqnYq7FXYqyj8uvIepedfMkOk2gKW60kv7q m0MAPxN/rHoo7n2rkZSoJAt9raNo+naLpVrpWnQiCys4xFBEOyjuT3JO5Pc75ik23IzArsVdirsV dirFPzI/L7S/O/l6TTbqkV5FWTT72lWhlp+KN0de49wMlGVFBFvjLzD5e1by9rFxpGrQG3vbZuLo ehHZ0P7SsNwcygbaiEtwodirsVdiqpBPNBKssLtHIu6upoRkZREhR5NmLLLHISgTGQ6hluk+fGUL FqcfIdPrEY3/ANkv9PuzVZ+zOsD8HsOz/asio5xf9IfpH6vkyyz1CyvY/UtZlmXvxO4+Y6j6c1WT FKBqQp7DTavFnjxY5CQ/HyRGVuQ7FXYq7FXYq7FXYq7FUPeahZWUfqXUywr25Hc/IdT9GWY8Upmo i3H1OrxYI8WSQiPx82J6t58Zg0WmR8R0+sSDf/Yr/X7s2uDszrM/B4/tD2rJuOAV/SP6B+v5MSnn mnlaWZ2kkbdnY1JzaxiIihyePy5ZZJGUyZSPUqeSa3Yq7FXYqmXl7y9q3mHWLfSNJgNxe3LcUQdA O7uf2VUbk4CaSA+zfy3/AC+0vyR5ej021pLeS0k1C9pRppafgi9EXsPcnMWUrLaBTK8il2KuxV2K uxV2KuxVg35qflXpfnzS1VmFprNoD9Qv6VpXcxSgbtGx+lTuO4M4TpiRb5A8w+XtY8vatPpOr27W 17bmjo3Qjs6Hoyt2IzJBtrIS3Ch2KuxV2KuxVfFNLC4kido5B0dCVI+kZGUQRRZ48koHiiSD5J5Z edtatwFkZblB/vwfFT/WWn45hZOzscuWzvtN7TarHtIiY8+fzH6bTq2/MGyYAXNrJGe5jIcfjwzD n2XL+Egu9we12I/3kJR91H9SYxecfL8g3uTGfB0cfiARmPLQZR0dlj9o9FL+OveD+pEr5j0JjQXs X0mn68rOky/zS5Me2dIf8pFzeY9CU0N7F9Br+rEaTL/NKy7Z0g/ykUNL5x8vxja5Mh8ERz+JAGWR 0GU9HGye0eij/HfuB/Ul1z+YNkoItrWSQ9jIQg/DnmRDsuX8RAdbn9rsQ/u4Sl76H60lvfO2tXAK xstsh/32Pip/rNX8MzMfZ2OPPd0Wp9ptVk2iRAeXP5n9FJHLNLM5kldpJD1dyWJ+k5mxiAKDocmS UzxSJJ81mSYOxV2KuxV2Kpl5e8vax5h1aDSdIt2ub24NERegHd3PRVXuTgJpID6//Kv8q9L8iaUy Kwu9ZuwPr9/xpWm4iiB3WNT9LHc9gMac7bAKZzkGTsVdirsVdirsVdirsVdirFPzB/Lfy9530v6r qUfpXkQP1LUIwPVhY/8AEkP7SHY+x3yUZEIIt8kefPy68yeStSNpq0PK3cn6rfxgmCYf5Ldm8VO4 +W+ZMZAtRFMXySHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqyjyH+XXmTzrqQtNJh42 6EfWr+QEQQj/ACm7t4KNz8t8jKQCQLfW/wCX35b+XvJGl/VdNj9W8lA+u6hIB6szD/iKD9lBsPc7 5jSkS2gUyvIpdirsVdirsVdirsVdirsVdirsVQesaNpWtadNp2q2sd5ZTiksEoqp8CO4I7EbjthB pXzj+Y3/ADjZqunGXUfKDNqNjuzaa5/0mMf8VnpKPbZv9bLo5e9rMHiU0M0ErwzxtFNGSskbgqys NiCDuDlrBZhV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kr4YZp5UhgjaWaQhY40BZmY7AADcnAr23 8uf+cbNV1Exaj5vZtOsdmXTUP+kyD/iw9Ih7bt/q5VLL3MxB9HaRo2laNp8WnaVax2dlAKRwRLxU eJPiT3J3PfKSbbEZgV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KsS87/lZ5N84xH9K2YS9pSPUbek dytBQVehDgeDgjJRmQgi3gPnP/nGvzjpBe40J11yxG4RKRXSj3jY8W/2DEn+XLo5QebAweT3tje2 Ny9re28lrdRGkkEyNHIp8GVgCMsYKGFXYq7FXYq7FXYq7FXYq7FXYqr2Vje31ylrZW8l1dSmkcEK NJIx8FVQScCvWfJn/ONfnDV2S41510OxJBMb0lumHtGp4p/s2qP5TlcsoHJmIPffJP5W+TfJ0S/o qzD3tKPqVxSS5avX46AID4IAMplMlmBTLcil2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KpZrvljy7r9v9X1rTre/jAIT141Zlr/ACN9pT/qnCCQgh5d5h/5xf8AJV8Wk0e7udHlb7KV+swj /YSFZP8AkplgyliYPO9Z/wCcYPPloWbTbmz1OIfZUO0Ep+ayDgP+DyYyhHAWG6l+UH5m6cSLjy5e PTqbdBcjw6wGTJCYY8JY9daBrtoeN1p11bnwlhkQ9K/tKO2StFIDCrsVR9roGu3Z42unXVwfCKGR z0r+yp7YLWmQ6b+UH5m6iQLfy5eJXobhBbDw6zmPImYTwlmWjf8AOMHny7KtqVzZ6ZEftKXaeUfJ YxwP/B5E5Qy4C9E8vf8AOL/kqxKyaxd3OsSr9pK/VoT/ALCMtJ/yUyBylIg9R0Lyx5d0C3+r6Lp1 vYRkAP6EaqzU/nb7TH/WOVkksgEzwJdirsVdirsVdirsVdirsVdir//Z - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:6f8953c5-f315-8b47-860c-1518d75866f9 - uuid:4391400b-284b-4b37-bd32-7e1162cf6765 - - xmp.iid:d97ff0c7-5bd3-744c-93a1-6bd02f90a7ad - xmp.did:d97ff0c7-5bd3-744c-93a1-6bd02f90a7ad - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:d97ff0c7-5bd3-744c-93a1-6bd02f90a7ad - 2018-01-29T12:15:08-07:00 - Adobe Illustrator CC 22.0 (Windows) - / - - - saved - xmp.iid:6f8953c5-f315-8b47-860c-1518d75866f9 - 2018-01-30T08:52:19-07:00 - Adobe Illustrator CC 22.0 (Windows) - / - - - - Web - Document - 1 - False - False - - 2000.000000 - 2000.000000 - Pixels - - - - Cyan - Magenta - Yellow - Black - - - - - - Default Swatch Group - 0 - - - - White - RGB - PROCESS - 255 - 255 - 255 - - - Black - RGB - PROCESS - 0 - 0 - 0 - - - RGB Red - RGB - PROCESS - 255 - 0 - 0 - - - RGB Yellow - RGB - PROCESS - 255 - 255 - 0 - - - RGB Green - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blue - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Grays - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Web Color Group - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - Adobe PDF library 15.00 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 10 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 15 0 R/TrimBox[0.0 0.0 2000.0 2000.0]/Type/Page>> endobj 11 0 obj <>stream -HRN0 +N&W -BBX{ 7vԻvnY-`Ȭ!znh,X`kl^ͽvg.\G i8'^82ra~ƙ }<*ڄ֛L.Py{ 2/uR ]VՋN)2<yA!D>ap1 OÆ<).X ܮh#@M-eKTЦ\zCJɖԛYV'(ewzg{pRp%r%Yו S. 6UmYN*x.c I'>stream -8;Z]"9m58F%"ss-N3_aA]uq^@S]49cMVqkr!9lQ3X73X(#_(op^`PB*Gs-TrF-G(\ -kC#`2Itk7eFW<'<>$Jid=5qf'NM+r/"j<,dar&Zs\^`YCB;S_hoQ7,p[6uH'eTU-( -'[D:lV4(T>9iI,7^>42/8YPD_j"!HopjB=*+m"[(WN'j+_DL&oWKEk%''0P4Srh)M -jk$T0H>9KMom6s7+p!D`S@;_65L&IO-taeX9f!8L.J@c=\E"1#'Zh`bOJI?`,]P9: -+&HIPS+.pOdg`K6HN.7jR?[&$ask.W%:/O^Ar=Lg8]W3\6`uoAKiY`*-clH#,rIt, -Fk3Fa9)0tI-2Ct$o^51W -%E9o!mp7hcGC?r#3I-9hc7s'X#uT[4MDtGS.bo&X4@/ad_Rp9HFH=;(Y341,?_ogK -3TOeJeBqXhdJl9(rZ45;NrG1>B`2]P3O-FQQfX0s:4l)[4K!q"OJRU+YR#PkG(;9\N4/P86Q#TX>M*Ti4;(hjhfb=nN_? -q;u#!;7i"(nmI-?56WH`Xq!bbJl2*+7P[V-5lEfqM[nfL4B,+%!#Ie2g6YWaV":"p -QoTV&C8cnW!$Ff^HkWa,&B@JtB+"(>2p="#`iD(Q=2B\+W0_fFA]:1,7(eC4-jQl# -bUp7nE=Q+DRP!P2oh(?fp5ft`<)8dVEU:E*Y;de;%.5$S<&iHQWedp_;g"+CS8)L# -c_FJZB(_g8!)6+*B:\V`CiJP"!'Z"q0`~> -endstream endobj 16 0 obj [/Indexed/DeviceRGB 255 17 0 R] endobj 17 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 5 0 obj <> endobj 7 0 obj <> endobj 6 0 obj <> endobj 8 0 obj <> endobj 24 0 obj [/View/Design] endobj 25 0 obj <>>> endobj 22 0 obj [/View/Design] endobj 23 0 obj <>>> endobj 20 0 obj [/View/Design] endobj 21 0 obj <>>> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 14 0 obj <> endobj 13 0 obj [/ICCBased 26 0 R] endobj 26 0 obj <>stream -HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  - 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 -V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= -x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- -ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 -N')].uJr - wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 -n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! -zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km -endstream endobj 12 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 17.0 -%%AI8_CreatorVersion: 22.0.1 -%%For: (MT-User) () -%%Title: (pomotroid-icon--0.1.ai) -%%CreationDate: 1/30/2018 8:52 AM -%%Canvassize: 16383 -%%BoundingBox: -317 -1384 1683 616 -%%HiResBoundingBox: -317 -1384 1683 616 -%%DocumentProcessColors: Cyan Magenta Yellow Black -%AI5_FileFormat 13.0 -%AI12_BuildNumber: 249 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Registration]) -%AI3_Cropmarks: -317 -1384 1683 616 -%AI3_TemplateBox: 683.5 -384.5 683.5 -384.5 -%AI3_TileBox: 389 -767.039978027344 974.9599609375 0 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 4 -%AI17_Begin_Content_if_version_gt:17 1 -%AI9_OpenToView: -819 751 1 3708 1940 18 0 0 68 168 0 0 0 1 1 0 1 1 0 1 -%AI17_Alternate_Content -%AI9_OpenToView: -819 751 1 3708 1940 18 0 0 68 168 0 0 0 1 1 0 1 1 0 1 -%AI17_End_Versioned_Content -%AI5_OpenViewLayers: 7676 -%%PageOrigin:283 -684 -%AI7_GridSettings: 70 8 70 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MS -%%EndComments - -endstream endobj 29 0 obj <>stream -%%BoundingBox: -317 -1384 1683 616 -%%HiResBoundingBox: -317 -1384 1683 616 -%AI7_Thumbnail: 128 128 8 -%%BeginData: 29664 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45FD35FFA8A87D7D5252282E2728272E272827525253537E7EA9A9FD -%64FFA87E52522728052700FD042728272827282728052805270027272828 -%7D7DA8AFFD5CFF7D7D282805282728272827282728272827282728272827 -%2827282728272827280528275252A8A9FD56FF7D53272700272727052827 -%270528272705282727052827270528272705282727052827270528052700 -%28527EA8FD50FFA87D27282728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728055259A9FD4CFF -%A82828002727282728272827282728272827282728272827282728272827 -%28272827282728272827282728272827282728052705527DFD48FF7D5227 -%272728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272728A8FD44FFA828 -%270028272705282727052827270528272705282727052827270528272705 -%28272705282727052827270528272705282727052827270528272700527D -%FD40FFA8532728272E2728272E2728272E2728272E2728272E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E272852AFFD3DFF522700282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282727057DA8FD39FFA82728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272800527EFD36FFA85900270528272705282727052827270528272705 -%282727052827270528272705282727052827270528272705282727052827 -%270528272705282727052827270528272705282727002752FD34FFA85205 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%28272E2728272E2728272E272728A9FD31FF7D2700282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282727057EFD2FFF52282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28007DFD2DFF2E2705282727052827270528272705282727052827270528 -%272705282727052827270528052705280527052805270528052705282727 -%052827270528272705282727052827270528272705282727052827270052 -%A8FD2AFF2827272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728052E274C27524B764B764B524B522728272E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2752 -%A8FD27FFA927272728272827282728272827282728272827282728272827 -%28272805280528274C4B706FBCB5BCB5BCB5BCB5BCB5BCB5BC93946F7027 -%280528052827282728272827282728272827282728272827282728272827 -%280528A8FD25FFA927282728272827282728272827282728272827282728 -%2728272827280528277693BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB59A4B5227282728272827282728272827282728272827282728 -%2728272827282728A8FD23FFA8FD04270528272705282727052827270528 -%27270528272705280527277093BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC939A4B270528272705282727052827270528 -%2727052827270528272705280528A8FD22FF28282728272E2728272E2728 -%272E2728272E2728272E2728272E27526FBCBBBCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCBBBCB59A4B28052E2728 -%272E2728272E2728272E2728272E2728272E27282752A8FD20FF28272728 -%27282728272827282728272827282728272827280528279AB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BC6F4C052827282728272827282728272827282728272827282728 -%0052A8FD1EFF2E2827282728272827282728272827282728272827282728 -%055293BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A272827282728272827282728 -%2728272827282728272827280553FD1DFF52270528272705282727052827 -%27052827270528272705282770B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BC6F28052705282727052827270528272705282727052827270059FD1BFF -%7D27272E2728272E2728272E2728272E2728272E2728272E4BBCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC9352052E2728272E2728272E2728 -%272E2728272E2728272E0584FD19FFA82827282728272827282728272827 -%2827282728272805286FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5700528272827282728272827282728272827282728272805A8FD -%18FF520528272827282728272827282728272827282728055293BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A27282728272827 -%28272827282728272827282728272828FD17FF5900280528272705282727 -%05282727052827270528054B93BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC272827270528272705282727052827270528 -%2727052752FD15FFA82728272E2728272E2728272E2728272E2728272E27 -%76B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCBBBCB5 -%BCB5BCB5BCBBBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BC4B28272E2728272E2728272E2728272E2728272E27287DFD14FF27 -%282728272827282728272827282728272827280576B5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC939A6F704B704B706F9A6F9A93 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B28052827 -%2827282728272827282728272827280528A8FD12FF532727282728272827 -%28272827282728272827280576B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB59A6F52272827280528052805280528274C4B7693BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F28272827282728272827 -%282728272827282728057DFD11FF84272727052827270528272705282727 -%052827270570B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5944B28 -%0527052805270528272705282727052805270528277093BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BC4B270528272705282727052827270528 -%2727052805A8FD10FF532728272E2728272E2728272E2728272E27280576 -%BBBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F52272E2728272E2728 -%272E2728272E2728272E2728272E2728052E4B9AB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BC4B2E2728272E2728272E2728272E2728272E2728 -%52FD0FFFA8002827282728272827282728272827282728054CB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB594272805282728272827282728272827 -%282728272827282728272827280528054C6FBCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BC4B282728272827282728272827282728272827277DFD0E -%FF2E28272827282728272827282728272827280552B5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BC935227282728272827282728272827282728272827 -%2827282728272827282728272827284BBCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BC2728272827282728272827282728272827282752FD0DFF7D27 -%27270528272705282727052827270528052793BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BC6F2705282727052827270528272705282727052827270528 -%27270528272705282727052827270570B5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB594052827270528272705282727052827270528007DFD0CFF522728 -%272E2728272E2728272E2728272E27286FBCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BC4B28272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E055293BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB59A2728272E2728272E2728272E2728272E272828FD0BFFA8002827 -%2827282728272827282728272827284BBCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB594272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728052893BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB54C0528272827282728272827282728272827277DFD0AFF522727 -%28272827282728272827282728272827BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB59A272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827286FBCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BC9328272827282728272827282728272827282752FD09FFA827 -%272705282727052827270528272705280570B5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5940528272705282727052827270528272705282727052827270528 -%272705282727052827270528272705282727052805276FBCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BC6F282727052827270528272705282727052805A8FD08 -%FF7D2728272E2728272E2728272E2728272E274CB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCBB9A272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728272E2728272E93BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC4B28272E2728272E2728272E2728272E2727 -%53FD08FF2728272827282728272827282728272827286FBCB5BCB5BCB5BC -%B5BCB5BCB5BCB59A27282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827280528 -%93BCB5BCB5BCB5BCB5BCB5BCB5BCB59A0528272827282728272827282728 -%27282728A8FD06FF7E27272827282728272827282728272827284BBCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27282728054CB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5522728272827282728 -%272827282728272827A8FD06FF5300270528272705282727052827270528 -%0594B5BCB5BCB5BCB5BCB5BCB5BCB5BC2727052827270528272705282727 -%052827270528272705282727052827270528272705282727052827270528 -%27270528272705282727054CB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F282727 -%052827270528272705282727052752FD06FF2828272E2728272E2728272E -%2728272E2752B5BCB5BCB5BCB5BCB5BCB5BCB5BC6F28272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728272E2728272E2728272E -%2728272E2728272E2728272E2728272E0576B5BCB5BCB5BCB5BCB5BCB5BC -%B5BC4B28272E2728272E2728272E2728272E272EA8FD04FF7D2727282728 -%2728272827282728272827286FBCB5BCB5BCB5BCB5BCB5BCB5BC93282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728279AB5BCB5BC -%B5BCB5BCB5BCB5BCB59A0528272827282728272827282728272805A8FD04 -%FF7D0528272827282728272827282728272827BCB5BCB5BCB5BCB5BCB5BC -%B5BCB54C0528272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27284BBCB5BCB5BCB5BCB5BCB5BCB5BCB552272827282728272827282728 -%2728272853FD04FF272705282727052827270528272705280570B5BCB5BC -%B5BCB5BCB5BCB5BCB59A0527052827270528272705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%052827270528272705286FBCB5BCB5BCB5BCB5BCB5BCB5BC4B2827270528 -%27270528272705282727002EFFFFFFA828272E2728272E2728272E272827 -%2E272893BCB5BCB5BCB5BCB5BCB5BCB5BC2728272E2728272E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E274CB5BCB5BCB5BCB5BCB5BCB5 -%BCB59A2728272E2728272E2728272E2728272827AFFFFF7E002827282728 -%2728272827282728272827BCB5BCB5BCB5BCB5BCB5BCB5BC6F2827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27282728272827282728272827282728272827282728272827280594B5BC -%B5BCB5BCB5BCB5BCB5BCB54C052827282728272827282728272827277DFF -%FF522827282728272827282728272827280576B5BCB5BCB5BCB5BCB5BCB5 -%BCB54C052827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827284BBCB5BCB5BCB5BCB5BCB5BCB5BC4B28272827282728272827 -%2827282728057DFFFF52002827270528272705282727052827276FBCB5BC -%B5BCB5BCB5BCB5BCB59A0527052827270528272705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%052827270528272705282727052893BCB5BCB5BCB5BCB5BCB5BCB5940528 -%272705282727052827270528272728FFFF27282728272E2728272E272827 -%2E272827BCB5BCB5BCB5BCB5BCB5BCB5BC6F28272E2728272E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2776B5BCB5BCB5BCB5 -%BCB5BCB5BC932E2728272E2728272E2728272E27282752FFA82705282728 -%27282728272827282728054CB5BCB5BCB5BCB5BCB5BCB5BC934C05282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27BCB5BCB5BCB5BCB5BCB5BCB5BC27282728272827282728272827282727 -%05A8A8272827282728272827282728272827286FBCB5BCB5BCB5BCB5BCB5 -%BCB59A272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827282728272893BCB5BCB5BCB5BCB5BCB5BCB57605282728272827 -%2827282728272827277D592727270528272705282727052827270570B5BC -%B5BCB5BCB5BCB5BCB5BC6F27052827270528272705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%052827270528272705282727052827270570B5BCB5BCB5BCB5BCB5BCB5BC -%6F270528272705282727052827270528007D7D2728272E2728272E272827 -%2E2728272E93BCB5BCB5BCB5BCB5BCB5BCB552052E2728272E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E4BBCB5BCB5 -%BCB5BCB5BCB5BCB59A272E2728272E2728272E2728272E27285352272728 -%27282728272827282728272827BCB5BCB5BCB5BCB5BCB5BCB5BC27282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27280528B5BCB5BCB5BCB5BCB5BCB5BC9328052827282728272827282728 -%272805525227282728272827282728272827282728B5BCB5BCB5BCB5BCB5 -%BCB5BC932827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827BCB5BCB5BCB5BCB5BCB5BCB5BC2728272827 -%28272827282728272827282E2727052827270528272705282727052827BC -%B5BCB5BCB5BCB5BCB5BCB594052827270528272705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%05282727052827270528272705282727052827276FBCB5BCB5BCB5BCB5BC -%B5BC934C0527052827270528272705282727052E28272E2728272E272827 -%2E2728272E2752B5BCB5BCB5BCB5BCB5BCB5BC6F2E2728272E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728059ABB -%BCB5BCB5BCB5BCB5BCB5BC4B28272E2728272E2728272E2728272E272728 -%27282728272827282728272827284BBCB5BCB5BCB5BCB5BCB5BCB5700528 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2728272827286FBCB5BCB5BCB5BCB5BCB5BCB54C05282728272827282728 -%2728272827282827282728272827282728272827280576B5BCB5BCB5BCB5 -%BCB5BCB5BC6F282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827280576B5BCB5BCB5BCB5BCB5BCB5BC4B2827 -%282728272827282728272827282705282727052827270528272705282727 -%4BBCB5BCB5BCB5BCB5BCB5BCB57005270528272705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%052827270528272705282727052827270528272705284BBCB5BCB5BCB5BC -%B5BCB5BCB570052827270528272705282727052827272E2728272E272827 -%2E2728272E27280576BBBCB5BCB5BCB5BCB5BCB5BC4B28272E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%76B5BCB5BCB5BCB5BCB5BCB5BC4B2E2728272E2728272E2728272E272827 -%272827282728272827282728272827284BBCB5BCB5BCB5BCB5BCB5BCB576 -%052827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27282728272827286FBCB5BCB5BCB5BCB5BCB5BCB54C0528272827282728 -%2728272827282728282728272827282728272827282728274CB5BCB5BCB5 -%BCB5BCB5BCB5BC6F28272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%2827282728272827282728272827280576B5BCB5BCB5BCB5BCB5BCB5BC4B -%282728272827282728272827282728272727052827270528272705282727 -%05284BBCB5BCB5BCB5BCB5BCB5BCB5700528272705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%0528272705282727052827270528272705282727052827276FBCB5BCB5BC -%B5BCB5BCB5BCB54C0527052827270528272705282727052852272E272827 -%2E2728272E2728272E2752B5BCB5BCB5BCB5BCB5BCB5BC932E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%28279ABBBCB5BCB5BCB5BCB5BCB5BC4B28272E2728272E2728272E272827 -%28282827272827282728272827282728272827BCB5BCB5BCB5BCB5BCB5BC -%B59A27282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2728272827282728272893BCB5BCB5BCB5BCB5BCB5BC9328272827282728 -%27282728272827280552532728272827282728272827282728272893BCB5 -%BCB5BCB5BCB5BCB5BCB54C27282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827BCB5BCB5BCB5BCB5BCB5BCB5 -%BC2728272827282728272827282728272852522727270528272705282727 -%05282727059AB5BCB5BCB5BCB5BCB5BCB5BC4B2705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%052827270528272705282727052827270528272705282727054CB5BCB5BC -%B5BCB5BCB5BCB5BC9327052827270528272705282727052800597E052827 -%2E2728272E2728272E2728272E6FBCB5BCB5BCB5BCB5BCB5BCBB76052E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%28272E6FBCB5BCB5BCB5BCB5BCB5BCBB9A052E2728272E2728272E272827 -%2E27277D7D2727282728272827282728272827280570B5BCB5BCB5BCB5BC -%B5BCB5BC9328052827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27282728272827282728059AB5BCB5BCB5BCB5BCB5BCB5BC4B2827282728 -%2728272827282728272805A8A8272827282728272827282728272827284B -%BCB5BCB5BCB5BCB5BCB5BCB5BC2728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%2827282728272827282728272827282728274CB5BCB5BCB5BCB5BCB5BCB5 -%BCB55227282728272827282728272827282728A8A8280528272705282727 -%052827270528052793BCB5BCB5BCB5BCB5BCB5BCB5700527052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%05282727052827270528272705282727052827270528272705284BBCB5BC -%B5BCB5BCB5BCB5BCB5BC2728272705282727052827270528272727FFFF2E -%282728272E2728272E2728272E2728279ABBBCB5BCB5BCB5BCB5BCB5BC93 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%28272E279AB5BCB5BCB5BCB5BCB5BCB5BC6F2E2728272E2728272E272827 -%2E27282753FFFF59002827282728272827282728272827284BBCB5BCB5BC -%B5BCB5BCB5BCB5BC27282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27282728272827282728054CB5BCB5BCB5BCB5BCB5BCB5BCB57005282728 -%27282728272827282728272752FFFF7D2727282728272827282728272827 -%28274CB5BCB5BCB5BCB5BCB5BCB5BCB59A27282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827286FBCB5BCB5BCB5BCB5BCB5 -%BCB5BC272827282728272827282728272827280584FFFFA8052705282727 -%052827270528272705280594B5BCB5BCB5BCB5BCB5BCB5BCB54C05270528 -%272705282727052827270528272705282727052827270528272705282727 -%052827270528272705282727052827270528272705282727052827BCB5BC -%B5BCB5BCB5BCB5BCB5BC6F2827270528272705282727052827270528A8FF -%FFFF52272E2728272E2728272E2728272E27284BBCB5BCB5BCB5BCB5BCB5 -%BCB5BC6F28272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%28272E279AB5BCB5BCB5BCB5BCB5BCB5BCB5762728272E2728272E272827 -%2E2728272828FD04FF52272728272827282728272827282728272893BCB5 -%BCB5BCB5BCB5BCB5BCB5BC4B282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728054CB5BCB5BCB5BCB5BCB5BCB5BCB5BC2728272827 -%2827282728272827282728007DFD04FFA827282728272827282728272827 -%282728279AB5BCB5BCB5BCB5BCB5BCB5BCB5BC2728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272893BCB5BCB5BCB5BCB5BCB5BCB5 -%BC6F28272827282728272827282728272827277DFD04FFA8280527052827 -%270528272705282727052827BCB5BCB5BCB5BCB5BCB5BCB5BCB570052705 -%282727052827270528272705282727052827270528272705282727052827 -%27052827270528272705282727052827270528272705286FBCB5BCB5BCB5 -%BCB5BCB5BCB5BCB54C0527052827270528272705282727052827FD06FF52 -%28272E2728272E2728272E2728272E272893BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB552052E2728272E2728272E2728272E2728272E2728272E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E4BBCB5 -%BCB5BCB5BCB5BCB5BCB5BCB59A2728272E2728272E2728272E2728272E27 -%59FD06FFA805282728272827282728272827282728054CB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BC9328052827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%2827BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC27282728272827282728272827 -%28272827277DFD06FFA85227282728272827282728272827282728279AB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BC9328272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%2827282728279AB5BCB5BCB5BCB5BCB5BCB5BCB5BC932827282728272827 -%28272827282728272827FD08FF5227272705282727052827270528272705 -%2827BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F270528272705282727052827 -%270528272705282727052827270528272705282727052827270528272705 -%28272705282727059AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB54C0527052827 -%27052827270528272705280059FD08FFAF2728272E2728272E2728272E27 -%28272E27286FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F2E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%28272E2728272E2728279ABBBCB5BCB5BCB5BCB5BCB5BCB5BCB59A272827 -%2E2728272E2728272E2728272E2728A8FD09FF5205282728272827282728 -%272827282728272893BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F2805282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282794B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC2728 -%272827282728272827282728272827272EFD0AFF7D282728272827282728 -%2728272827282728054CB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC934C0528 -%272827282728272827282728272827282728272827282728272827282728 -%27282728272827282728279AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B28 -%2728272827282728272827282728272805A8FD0BFFFD0427052827270528 -%27270528272705280570B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC934C0527 -%052827270528272705282727052827270528272705282727052827270528 -%272705282727052827BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F282727 -%05282727052827270528272705280552AFFD0BFFA80528272E2728272E27 -%28272E2728272E272827BCBBBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB57627 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%28272E2728052E6FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC932E272827 -%2E2728272E2728272E2728272E27277DFD0DFF5205282728272827282728 -%272827282728272827BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A2728 -%052827282728272827282728272827282728272827282728272827282728 -%2728054C93BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB528052827282728 -%27282728272827282728272728FD0EFF7D28272827282728272827282728 -%2728272827284BBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F522728 -%27282728272827282728272827282728272827282728272827282728279A -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB55205282728272827282728 -%272827282728272805A8FD0FFF2827272705282727052827270528272705 -%2827274BBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A2727052827 -%270528272705282727052827270528272705280527054C6FBCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB54C052827270528272705282727052827 -%2705280052FD10FFAF2728272E2728272E2728272E2728272E2728272E6F -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCBBBC93762728052E272827 -%2E2728272E2728272E2728052E274C4BBCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCBB76052E2728272E2728272E2728272E2728272E2728A8 -%FD11FF7D00282728272827282728272827282728272805284BBCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC93704B282728052805280528 -%05280528274C6F9AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B576052827282728272827282728272827282728272752FD12FFA8522728 -%2728272827282728272827282728272827286FBCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC939A6F764B766F766F9A93BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB576052827282728 -%272827282728272827282728272827FD14FF7D2727270528272705282727 -%052827270528272705284BBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB57005270528272705282727052827270528 -%272705280084FD15FF5327272E2728272E2728272E2728272E2728272E27 -%284BBCBBBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5520528272E2728272E2728272E2728272E2728272E057DFD17FF2827 -%2728272827282728272827282728272827282728279AB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC932805282728272827282728 -%272827282728272827280052AFFD17FFA827282728272827282728272827 -%282728272827282728279AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BC6F2827282728272827282728272827282728272827282728A8 -%FD19FF7D00270528272705282727052827270528272705282727054C93BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B270528272705282727 -%05282727052827270528272705277DFD1BFF7D052E2728272E2728272E27 -%28272E2728272E2728272E27286FBCBBBCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB59A2728272E2728272E2728272E2728272E2728272E2728272853FD1D -%FF52002827282728272827282728272827282728272827282728279AB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC6F4C05282728272827282728272827282728 -%272827282728272728FD1FFF520528272827282728272827282728272827 -%28272827282728055293BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A4B2827282728272827 -%282728272827282728272827282728272828FD20FFA82800282727052827 -%27052827270528272705282727052827270528277093BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F4C05 -%2705282727052827270528272705282727052827270528272727FD22FFA8 -%2E2728272E2728272E2728272E2728272E2728272E2728272E272805526F -%9AB5BCBBBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BC9376272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%2827FD24FFA8280528272827282728272827282728272827282728272827 -%2827280528054C4B9A93BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BC6F7027280528272827282728272827282728272827282728272827 -%282728272727A8FD25FFA852272827282728272827282728272827282728 -%27282728272827282728272805284B766F9A93BCB5BCB5BCB5BCB5BCB5BC -%B5BC939A6F4C272805282728272827282728272827282728272827282728 -%272827282728272727FD28FFA82E00270528272705282727052827270528 -%2727052827270528272705282727052805270528274C274C4B704B4C4B4C -%272827270528052705282727052827270528272705282727052827270528 -%272705282727052727A9FD2AFF53052E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728272E2728052E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272852FD2DFF5900282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%2752FD2FFF7E272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2728272827282728272827282728272827282728272805287DFD31FFA8FD -%042705282727052827270528272705282727052827270528272705282727 -%052827270528272705282727052827270528272705282727052827270528 -%27270528272705282727052800287EFD34FF5328272E2728272E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728272E2728272E27282728 -%277DFD37FF7D280028272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827282728272827282728272727A8FD3AFF7D052827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827282728272827282728272827282728272827282728052853FD3D -%FFA828270527052827270528272705282727052827270528272705282727 -%052827270528272705282727052827270528272705282727052827270528 -%27270527005284FD40FF7E5205282728272E2728272E2728272E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E272827282EA8FD44FF7E2827052727282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2728272827282728052700527DFD48FF7D53272727282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728052852A8FD4CFFA852280027052705282727052827270528 -%272705282727052827270528272705282727052827270528272705280027 -%277DA8FD51FFA8522E05282728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728052828597DFD56FFA8A85252272700 -%282727272827282728272827282728272827282728272805280527002828 -%597DFD5EFF7D7D282E272700282728272827282728272827282728052727 -%2827525384A8FD64FFA8A87D7D5253282805282727052827272752525959 -%A8A8FD34FFFF -%%EndData - -endstream endobj 30 0 obj <>stream -%AI12_CompressedDataxk\Ǖ%]C ؃Qv TVVnqhllṡ@Q֎9'dU%v*$'No߽x՛wo߼߼s|;k!›կɳ~7/?66Y~xz^ssmCdA/1 o߾}o߼|_g79^>{'|틗wxWI6OO߾x?|0%e>^to<>+|ݻw$*sߝcR~_ᅬ ~z~WK/F{KL__Zc4)>[2:w9l?e/8Ûwu޾sJ?k߾{_hs_%tq̑Y[?ܽây;٠? g㺺R z~O\6?Q׿{OJ'kigI%;N8j׿^u|LW܈"4|Z"uۯ}۷/^'CKO[T7~׿䳟zOwA:7~C}g~m@=J-+Aʧ7|׫Kۗ^?{{^50OKlx_'טE `UG wyO\;zOwq~ٻ?↹{7}ʯ sgyg/_g_7o^wuRo>_տyW1O~yݗv׿y]g~`|\;5i[{OB|\ff۪'7_@m_ſ?pP9Ϳ+o_[W_y=|g_i-\rn?.pznwo}%{ׇ/xiah_q'?syzS?ޏ^*V_UX*ySV$Z?r#ߢZn*vUܦxa_qUҪd>u/vF7(g}.*8g`yYUɫr*R|\Z2ejXUv] -u=tY%uΫƟq,˚jugQkS`{Yqv[uqIVyYԕݮf{tx)\)\RV+qef׵rbpk ke\TX'oʷeԺ2ȈW乷k 6B^r7Xz @:K -ڝݍtZ烏>+r8Ƌ!pr -n94A1O:-$SH1tNn-6= L)㔯M +x |usu -ONUקt{Adà1t}u}>_biY w99OܸQ rsɿָ-rBAǷh5UU9VjSr+1K6ů[*؍Բlj)߬Λr] -VjUMV)vU̪UQKi WTJ;ܮvڪmWj:X+Zog02qNLnp;o> 󵝗2'Wd)(%kqRl-wru-r+P^=\ՒZpquE@)B ZYǓ[u.\ %پ}e6̞9l$]w-YJeNF``JO' OD΁<[} bx@4 -[p Bzrra 7} qd@sAHKDZfV9c*O -D - 295x[l3 '. -r .$#pqK -ƈk+>r }qs-,/^^dxUkt!+dֲ-W?ٽ+a .Ph{*=.=,VeC/nW7Ag{awݝ}Fo*%wAW<;7$0 m^hflپy [9 pnЕ׸B88C~lQGAb 2ie +QFWesy -[GɇĬ?q5{T{QQg0uapyǠyƬC0euNVK"ŔERy=?(~o⑯&GQ:)9krll[ym\d_|E/tl֎*!eZk$gA +-__G;vz/AQcׇJ1Zd}G^Zpփ\|>=w̗+ —]+2;k8]eQ=Ccy-I[64z%$2Ť6[|}$E(Bsv8o|F=^{?>r{ܯ4AT|ċW -MTGQ)M*Q~o+HOՠk>,3+h͹/Q[&qD9 8^{rwGhH_Vݐ-fUQK/fGzyuߗfqթw~o1W|07պ;[{k]"1[ZȿEf 5Yx4ױHE&"Y]JƔAD>N"7 \dQN,.Z$&+me,uUtwlSee_IRiJ$&)c틬lr꼒XrDByǐE>^IȔ"#$H"#wburE];V'7Owl @c޴qYBVZVA Oq -ݴ:?[C y=aPB˒@,7Ї%a _=׃T$z -v0e ԕs'[GLg{ҵi7VyVB%$ƕ$-ۣL6_(T7YWfvvg+Ttgi隚=s[rdн{f͹t?{=~jq\u;+g7g:z;LR2cg/ktmUµ;mV..;9%]~o]\>G.=)kY9x97r -t=2}Sn6bb>bY(1Ga-브"\GGƹcW+WwoE1R%EV4X…CU@\KCM㩫6v -WC]E n ]§ׁ˅?أE2]2j&B>$ۮq"hNXAW/"4&f*~cգn)LkIZ*#;ӝZ]Nۋe^z9-=6Eyck[{oc AuMPNr})H)"R>rinA%tP%z*ȠVqS\V:rJ*-^AѬԸvVOy*ѓ5]J}џP{Rvd?À;T} D&(M[J[ѓOu-I&ݗ\$Fx% ]>Dd$(œ`%XH(!}V^5~aM,>[Gkej|a= -Ҋ[Z{]u*67>y=V^R~~3yL-Kyct&zbEoqM -[bU"HfrkDZd%|O?ԱHl|-w|-W<-dAx[i|+o%Y]&TlޤsӣJF]I70 xЊ'zYG*Kޔ7֡f-ˢB.zSNSj۲{rz{"W| -(^mhS b -;lpџn"mr*w9u*jg hP&b/ -8Q2UBnS;Rl S,ͲY-RWh]W^ފxjaE{[s:+hiDC[uJNBĐ>JV[Ϲ1'^UMn Y*xTbW" y-:1^^XKKqbx3[^۹Q!O>I['͏+l~kx2)2QI܎꤫EFOU^}uC蠩t E]T;zMTxQ7С(:ÀuU)[k31: 0d:r[.5oWZ֖8(u ñ[}۬Ո73Q ^ULUAnőc}o@W@ G.i7KF+sCق5'6ɩl86˰d&xC .>{2͇ߙ+O9#u7BcPkq =x- -B"i(EQF%1!bcPfRel';f]ݳ|ST$H)|֝n:܈,)~nSJhʹ݀J"5[9CUJK姊"L6rc{anZ0S](~[_/1a" }ˣ{|zsEYĤACptIɦJ("PǙ\mw'_0{nu,Ք{Ei4eMUcTpס7m)Ew(?ە"V (JԦ,uƌfCq -:jPvo(N(ϠB*].+JguLzT~=#vsosfV'n:U%EIP &hBաM᜺f`֗p[lu iN(ŹgP\GHZh (!_b{dXV(W -@QubRokX3-H[|֒Z/#wn2˺S%*ڍ_Pտ1&#^d!co04u&ǽ&K1B?77]yC \_.\H=nWڝ&Y hn@ hqjC J cYO6XҸ'ʨn{GZ&XH Kh[Z}/m$؆hLٜ%<:Dkm̡:2xO)p92XF%[OeD-;G]T -g@yv`VO3>e#zu>rOaRc1M>y_?7볘$2牛DNל\s>ŝݫV6Q|4SWs_yo>AWBp@0$OjOx'3~k閎5?s=v<Ԥ,W&Ga{dn˘нCM߹\+A1*Qs>U,` `B\cK#m"n1 9`Y#\0ˈoZ~U謝Яg~\KqIp&?p>#ʍk54ؽ ܉&PG5BzOߙ}Fhَ2 ]W -Fݝwn+i6"8t-VHX99\|%ZԬT4"WMmMhb~v6 -Wm7zq*IZ$s)?;Ej[?MW[2R\cp% -r݀Q u̵=i'rxyYŨ: Tg6]G$;ᕙ2D^I:;yr`A_٫ʜY-.4*vOe6"uʑ7Ψ׋.ݣg ߶ 15t9߬S:sMsƸODfXB]Uw:t9߉݅O7@)ġ΋#ݵ8Yq܍9qݬeqT*Nx3ͨ;%U8Tp}itqt7D21ꠠ*~9^Kf@JÒC&s<3=1\UlX76 XV'v"3oD: # (#ĀuBOiTU=Zڐ|'cUwROR\r F~U>.71Z1I -ɨ5D.[.̔TOOc@Uptrx*1VZ@ueOb῭rS5">6uӹ4\(zjubm'mSt9׸i3Cs=%ۃy3CS豫mRbJEzOE4B"qJ -FU Ga -b]45EТ PFYSuTb-j4a X>Ol83@ʰJ#%̝w^ Z$ Z޿ǾG -g^$֨5hoy̳|k<F f^/WLx}O=>K&y /:e2AƁ4`D@)2%+ ּqKUdR,L+-7˒ӥ5V髚(׭_6x)WŭEuAcmkpha6n윎s\=Mø5VPMJ.n9WS5\ufJ~V֒l]Tbj+C z~_=v@65#\R}]c4%c^Xb -m/ĭ減hF]*{w=OQs3{E_sz ,6,GG qS ZTԡZrՌZ`<לB%+Nу)j(3 t3ߩ}]E:B$LBΐU`E)v˵])lQY-WC[ua1##.р]+ x#UpW[8D +GHN=ryW"_C/VP՝FIL+!r+T.vsgSYl$.BJ3@=/P\[Hf3˴/e-u Lk,AiHo)5 -^%q$?IPt|fƾϐ=.%NFʆFRS \glB l,lj=:*rԒ@"H 8Rk|(I*_0ޯ3>w%Ei wmMՖ]yshȵ=Lxw" MĘl"J!,b\AY'Yl[+Ymjuu-g)] ߌ.YF 47Xsd˯FU+TLGksV1 QdtNB4<& 2#=Cqv4eük~x0oQ] ~`G_]>έA{nufu^uз8.ZsWt Rs6ƩnsX7w ]c9*EϚҴVuvU9S^wr=Fr1&( -?>Hcg"NY6 vb?սc||GlɽcoG%:n`.!Ah Ł+gAEeԥK.M-$jRaAKV[`V-5VAM&N'|9Ww[U4ƒqX䑞rH&tY0Crx7|H:MI1s[ȡUҪ=OKĄz8vDOݒ=p}!%Nq?(RjNѳ$Kb3V}D#~ kWKrFJZ) jlϾcth,Kt(vLJVsݩhD;dϸE/'(H)?LY% >öAמZwQ m=? -v _[J|҂P=%#KūDzӏgv`s?퉟O{=qN~H3zGUᓧo߾x?|Zy?|-uٻwwo_𳫗g r>` Mۃq0$bGFfҸ\/o/mfǿ7> ÿ:|D:b9jY{_~^}w~݋7E97o^b.YW/޽y0O/7ؙz.PB]$S)Jㄣ %݅#pb{Mk+UPSj)`nVˉ8|:Z?uY0{bR(Yϕ!P1DLz2 "QC:xXs-#ZDe_oc.#Oef6ne#ħp4MAL.(!2E(ut[E%|p4ouNKx_tG| -  G9 ʀ8XSފe1?-jb7ػIxϏP4iЁAƦ6yA9AӁ\#sZ EgP6UtL߰zoL Am&Lċ- -GǸzkx;Ǧ  kH1#)˫QxFr-~LIP;[/Y.K*ۅoRN¾:b(p3 9$!6BqncXqb;/(b^H9TIMVɋh =֕)=cHm.jB>x<0bay3 ⃀ap.-1?%RO=] ȢKvy?K$Fw"NX")i{EHbx؁װsDՃƊ:Xe =V_?ghMiU]j( ^lT5tCxHv 2ҐHgq7ň4N[S^Ob hy/D3 -awN"X+ʺPɢr" -$UX› 2B́QL&31k?UX T$,C\.'![iC Q>Z~?>ڲ1m15;- H6 `Jp1cl ^ 3 zZ ό<\c(əNOev!eH&…eWj5vZ(`C۷wZ}dJt;pݭLpĖ -N`v`T7! .;k F#OV+:dxR -P/̕dyQF;Ba'c3dMy -(!vx;gh'Pe]t,\ϐlnuȫC U@jMTy)EQ1ܴIe-7p9xM'nCƜp,!#09Y%R2T4IQtZ"WIݰRnl[ -2L!d6NhH4:ao7s~`+lj^0U P05rY@agn,7,WMS238VeYH0JutLB2x` -$6De;4rJ.MpΰS5E כۉƉ&3PV^RC({QS}߽&+38;X ~hV - -\v ،SbN #GE ǷTd`/EiwrpbRBFtV*7r8`N_ZkD]G?e`H6XY>o‹,8CsHm8Y bQQl&@:(|4Ȩ*,m IY*|,xS4 -mK6@H8; " 8[ӟ68C?1]{\?a8 myFtnold*#ࢢ(2(C € hOYĔU2 @7=HʘFak$ifSA2f#q6BfЇ 2Tž_sʾ;2qKުZ1exE}\{k mI[8ݔ8^!+o,tr!Azf):2C@k(A@NS B֌sd)wЎ98ѮLO1mmspPri9 a{38rr3]13_( -*=nm3sHbRi# 9=¬4}cbi/vbcklzN3X7Z5P{Υ氨Jؚj:5h&65[T'LT -Uc5VjeǷ6_6A}OY(jmV4x@`gu#B~^TLŔ3{Tϊ?X܂rfظC -$KP٨&M,.4$U!FCq^^K B4VqtPK_>U !X)z(*L.?C`*5.#T|INU>50geq/1iҽPG/K>iG3Đ1:hwK*r{ >hˑHxLܼ7E׈W|7N[<N=`t%"{b9*=]O!˫ymT1WEbwv vca޴͔]ʉq)(&N“喦!=5 G\j$4%lS}_ =v)wV Nt1>ȕS7-[z؝xP&Z-tAIkzQր܀Ѽ<2"$%~`d9@ba8vU2c~, |a3p҃@o۾Qbj֌BJЊm4 -"*[MchԭԪkb4UfѐpjtZ%&f@7#4E{:ژ%h\?[##Dp=(4@h;j3RLGGm Ѵ߱FbH߫huwsQ/Y9}0fDEk.!fls MVs yNcZjw ji,`~]<9sG:Lcyh.X>W׫߂1nJ:7N{nJ9M8UQ(G)4dVin$*%ǘӹ# -j-F t(b-k; ֙!ugl623M40MHI.c=f2H:RPr)[l`SďdG[pĩ#H/xxdݻ+%e{,8.t?ͤwQ Zك;SB0i-e ]oaqjxu'T+$h9\bED$*E -G*/Ǝ8CANp -vAK[hG -⣈)a7_6%0!6m劂f30t(`paPx -:RjJ4rC"Quv2$Fд)s!d|D [ DG24:)] 67G-%('D;bI' H;dmT?8·h,ӆ⵨Mm/538 Z4lJh-̘'OBܚI+Ѯ- 𑜵v9 -BTT4DЬiƊ9\9+QQ(cӨBi2ͱE=ŶFŸӌimlbx]@(l)-jhi0=SGOyh>U- \ gAX67$U,c.je !:PKA1$-$ՄC\vCag]wyX:[Ӡ59B\h$Bźuڈil@Bؘ$vW%,x"FHK0 [~hη9 `S2A2Ǎjy<])%F{&<<;L[٧`錮ԛcby(2؂26^>hl0CUycNТ>iqz0nc!e[ё| -m$R@$3I[/.\>&^G':s B&-4-n#)/q;Qv%wc|:[-.~*vPXFe4w1~WrqF/6M-=g@(b|Q!`݂k*SW[tvNo#x`Q.[~t84q7b^ MEL'1{Cp$#Ԣce S - S3e6,1F'jeݸ<8XXGA15C5Hg^ڙY\J\Rnd UmaS{nQI,aGwjv;XU@bfj)3*6HJD/^k&8J~˴NcK)S2}}i'l`H}qt#ޢ/PH=aN ƵKvaZT1~ 73\Fki,TS3}ψ6Ugt}c|zI RAW8AV,NlJ[ -֯l | RKKD%ݯn`E̜^яtg gI8}d5 Mu NbF>2򖎿4#MmxB.%R ~\(*4N* }ޏ7oր0Y/] R9h bZ -cq~Yr#$(`%;7 HEũbNS _L-6-b#p*y܉n3j [XaQ^NG`o55g8,jMG9('R0BG(OԀ#NXQ<4ol ͈7dn1Fafإ?Uŕ{mPifnG*=R ce4 #c02&} Mpɘ`'%cP2& %cGɘ0' pBh<ᄎ1S>:ƄC8cL:.:0o8dt=tpǘG q1a N( q蠈qh0FLGhȉEP/>ECU-jQq,&ˢ/NbB`0,&(9.leh|8Wx#p^1"8N _;Q40>N8bD'FH} qgs2{i6GL'Ɨǰ&giDZАn-en[ld[5Me++{MD%%L[tk0˴e+:%W}=~xdhfK's -X[m':4js2}i zT(C( ZѓՅf:HVB,:N)pXcD-V^tb zV!w2ީc\wp/a ,7.צw[wfgy(ӊpJDxB`}Ptw%;#)ZaJ/&0Z?0ֆ⛙43ܛ<5] P`x.Lu%};x=ǵqwv&yxCcy1m?5:R^0lݛbnEh9J" EM!\ͽMfn9R2t.!~bxn1/P>[<0MëG.hCSEa"&9ḽmqYYTyr6e#4Q%55z|UZo -Ř\/8"=8ih!S'UN(C<=y3 31u4N4Ӣ34JXSf=C/n ,Wd!ME],/kɍ ԉl/䬘6-2VucضKrytqizZ;B}[jTY*<گź)c -9=:3u,j5jV# Z3~^GW{*yxNO!ygplߩmKiQa*D4UEj.?$mW޶A`ؔ}J.*Xe$hP@K<6dRLb#\MU7xacqS3 ĺ̫B@zE}8sGdOyh9>)-PjL81͒jM5c%u_e%`*[ZC.2cG>M+f$"u!aj1CWa%ڗDP`1QQѬ_fO&c~Ӣ1bU /̼#,Fdo.S3}1*kw/3Lnͼ%m$'H ^Kf%ʝ緊aRk]C/m4H@Ao/('[wDe̗p9wj麮|P؅Zj E9Ԩj|ߡ5S1tvi.y20SL(V$#kq0O^ kGᡏob~~q/^=w߭p)}{wyś|6 ޽]O1o߼~~Ƙw߼ _y_ h|B෫_ڧ7_u?goQG* ^^ZPCd -X W׿eO=u6&u{ӿੇ_'E&[B9WͦQV?{gR~q|:HyM \b3ӕuk&}l=t<â TrANjtTwч;?:-d-SDhDάEK:|"K$ٮýDG .nS߉A.:5^(ޯVgdABzȨX4βUkKNXw(oK:. T-TU -} ->Nn?{trpLQP<٪O#^)d[+Y&MԘҋb6!X9̠VV"-ŖJ.?-sfU$Uqf"LݲTH58UUDUTa]ץ#+؅EV Ne%9Hu`L{Q+fJ@ь/fQ@t|)#0#ɐx5#cŤ>Լ-Y ͠Vy/Hcl)K%ĔLzfV\Rc;6,0N,Z*B{Ť< F1.ݥ:k{w6'D/XQį;)1Ua*]vHQKODS zI!}&$QKSX/t`xTȤ:B{ʃ{STg0ኖT*F &c+D"h<3Ra\81Dz`FU5%7!AoD$CjiqP=vVIth> 'b ZܜRщGv;OAH:ŕKrpl1!FP؛,+ո@4R LK5B5+c(`E`&LDnD HOKٕ^EFOWZ"wϠ< MN^g09f.bU?t|0<"j'ݡUM%^RD[*|dڐoVvd;qА-%ؑ.'peP;[F4Bt덏%P8  kO0G$$92( J[V+l(zЄ7X,5mt:R/&sutdtـ-fO^H8Dv_^'{ .F4F7IK>75Iao T0 c `KDiZ0d-VA[!+|q5B7~[p 5eZɬIQ3 ,G+}1Mrk$eAr׼)#Sv̯rM i}Ks\$j sCyb/NeA|7J QKT[*:J]}˞UDG)qSۼ\Stum7ݓR!*?RcళB !㶋&q{RYFMV͘^__,pfv>O܀~Q>Qr7R7CqaD%.*5ϛjʲqY0qK7oV"{2V&[:I/@lGuS?q& b)GIkDLq$A\uB~u;$~V\4ƩeE2*"D_f^ꛃBLzVĐc}(qAC.N M]ώxQq(Iab6rp/4C( -Bh%J<~T=*:@Jjo`RR吭QB5Ɨ ܴ YȬ.vݞ@`,x6-*@c$$]0tuX3<σHbcEoNM~P {r鏂6yeEXZ A<ӝT=+k$(Bn7WO -t. GXޖN8oCx%RQFJ-BqO,_#w,cX3~kzv"a;=+0&.WNR"]\`XPxYkXj|Α@$.)PY%.(!Y[6*+jEU@oWLJ -*.HESAy Ptir]IȝdxLLz 8E-ӹ_c0(ɭ.I2~(DyH^pB؃_x[6[%|MK9|n$M -rL"ىvIn#\pE+%ߙƩ6UŹ)  *PҪjnד]rp ݾSU<oN5hM0c-mmc#4Ep{Mo1rBs󒛂4 W;?SxV Fe8TpHCmnr+j3- -A\tGVbj -QT4/hwmɊҕUq#dxM)ٛ̀S$Tm,8 XNEHjj.M+Nf:fiaENFB%P,)^̨ep5()fwaZqb%sEc4o NٚZ,85(X)YS:+wD>a#s-]CW, 𗸆EZklTPC1eUl )LSZAv -,dg1C4FrҲ4Pp X+>a #$9Tx*ٍ.J9 bV?q7i4,ӻWG6[$[<䨼b.5 sP4/+;M@sY H4(D " - -@b@YAŇE)z ı$vLV&:<15* -JΎ)R$DrW2 -r%"$- (QU9LuQаIĸ7 -#Zik@͉Ŭ:]=TL zU+ %9.Mt ڣ6n_{3ir@ i2#_i -h1 mHtۋT @(Uݔ䒠6ZyQ7&b(- *Vl&b*&[EUI{/frCm#H7# !Ma;@@$,O2Rh`'PQjB(ٔFii!}#!kjkFS-9'7CB{ &u 9[IwPbM5ؔ6x]+_rO8.: Jt'Ht.eD4xmTĮ]TS&5J~? _l-+ h;Hq+cy͔:E(jT8;%SH, -s9,:K,-O+W`<. 9N- Ζ Ђ:I+WCL/ƵK(]$5fU>h٘C&('༳ߣF,:`I7@F1h+FUzjT wI%;VU1H6(.̿~S8ЧAz=}M 3$)B)xWB-8Xu>$_°ȩ{yLT=aK @$3p;|9*U==q72)$Dk?$\qƌ Qe!UBN`s *Z5 bҏ>j[jBu7VK)2:dHO?cܴ,Zz~]}@s,n[R.VTnl(u,$>k7&j2u`-Yϱ_s4|ni[VUG++ K7-P"ˤs-h֏pn va̮5|X2$[Ǡs|a9@ /_IKIҮ2IplA4^Y0GTe+4 'M1m~#γu) xg4\"E!{>GkU'ԍ6y4Xz[+ 9Ug "g;~q57(7d+fVA_E>+(~D9pr8 -! c0eL3@MǸ%}c* :Z ŧ)@> &f8bkPэ5nzau\O@u<<w9G='x/{H_d]-erر<|W KWN - -ܰטaefuvFmL 6dQOt @=:ڣ6zIdH~_7 -ZA9=r~hFLZ{kdq ciQǖvDqs*l|<DZC6w+N@Fg✲ARVŪÄ5qh9#/B%{e5\C։qKA/]ʞz(T] t<<^ *LOϪajRD2\ 5,I 7IkXEXU.6"Ne34zNpm#T@{l$h\Z|STjGCşj~K<=d0FG@YpJ{qQe<&ĺ$º .t~>7V92ګQl P콬T#lc`gcxoL$4<%vud)ށ\㹒,& \kGtS7ۂ<nJ\^j[7w ?}lXE}["mצJSy~1Ivpy_)vpV4}u w9AWrU ƫr|QE菘Q)K.BT_4̩E1kw@6cMƥTTq;ZXQSvQDJ,Ȭw`f:.6jx֫PȪ$t9ea-?C63P#$-nK 軑a۸; }6ޓ\l -LGJA~H" P t\c@Z9E0 .+齾q}"GTQοf}3h878lXwIҞzn-h7.bWn> Fw|A`>y] tFX3pZ_wM?&)8KZ+t=ek0:%=H~d;m%> -ˆ&J wl@Ip3rp apce-5c:v(s*)Sy!"65)q@`\1.il󴕗5o= iuTE͌Nk-0& P)q ܼb%^Tn16Rc ]v)s fņIZ[qx2†gF43s34+m8Ip/ޒ*ط~r,XV8!;(yWdY6 Y0M=^uJԸg\cACPI|с}%7꿨J1PLv3]'rČ -RP*7H%( -fdhR|k2hF~4"G&9Rd'H97#bdc+'po&xntXFth;KAb 2<~x5P&":j_Dd/% -!WL<p10811Pji-R2OD ϩ߷ǧ-\)~~H,{(RWS1n,F#;}щ:2ݿVfI+="ғx5潝94D*V@VpKMQ$l*;ɇNW*fi0bB.JURJ*J]@8^Ҳ .5ea~G!Zk!6btQ, H -6^ -M&=(S: h:g{F4zL(T :$`۰rGMMI%MgC|>OdMv hҬj7Y-+!vSm&QTqjBm P^bZS ݜbkn[?Zp/;*+warFowg8&|MpsbƧGXА>ջRo(IT Z+_嚁͌}5N_<µE$]تXO*FOBj -ա~)q#_PU5?L{finA@0 `Ƕ}Ce:F ض_! GZt$6͛Fqݬ>@MX}P9Xډ֖녷2-׊.K:ď^d '0`zli+1X$E"*aq'ܖv-i -M'kB19}398_7X#J(GΌqxXT7ެyc,b@JS:_YQ4JB -6~+vNJ,B;d6أd;߹wÄ1D|Raw'XJdUI"$h00 hu35@Y*G9fO6vL^+o%lz\sԘ -$`Ezr8RZd`6<UN^1 IUP/-8'A]O`oXXtJǯEĈ❱e\pƌɡ^%pqu%Nl/[ Eir(=F0hBZmlXZ (ZŒ׸p! ^HFQy^v ɆB O cke5xF2fΐJ -m\߅vn/8fD2[_3V4 gU p7 gB|aAe#NѸ 47 -y<誝Ggɢ1܋ ,F.+-yXc@<3, -cRqA=Uç>QF/`-&[ɲf2kc=k$p - Pްa會:;m**sMVI(r hݥC¢^D(Rw-Q@$e,VJ0E#R9 *Biv,9˵r#.K!순}Yd+zNT?D|6%HбqP -Wfg"F|j$(oRPb'ĨZ ]̭_V{|^,.ӈO|xZ4|ݡ'| ^H@. ̎Y"{r($RK>JY+Gw>)gk{Yo@s4U[nF(x DI1"LFpƗio=c|<+KI("%-}C<lKsnU<\B} ҡUp__;*DR jΨF Fw2̟=ʬy.Qig ο}HSFSj#DGOpOIdPk.$50f׏yci?Vq"GMqVmJqa+[j9"͏`?ïx>)/`Bw$S'̙(FWjI "`kpeٍ2j.stF=(`d!4QI=s6 hP` -;fjgI3$mNN'ZBOnIKghTUcܘUE$|(gM9+!M}AC3U]80/9`J -jcIn},sL!rj5 p%:"`ԞCv֝h2k&-/Qè꼀 ǃmoOS -x~%C@>Z=X@i]R xY.N )MkfRwːC' -S'[޹ޫcdɚN*=ۮu{6, -ޤ~5[S&Dޔ\Vh蒭i 1ץ܂z~/e}uw>riؼXK?9w M zVk(誇a?lm$xhUMwV7>gx6cB)惺^b旌v^5>-r(́vΊ=1ns|j9n!OKȓ[OIܼrsܙ1T1^r/(UD@1b®H,S9[%4+[@gȍ橴.?u<#הIEmE^ɯe% m( \~X75^uFEK@ias@1gvq$i,~u -CmeXBx{oCmaL[MV?Oj81 J=h M)>"S1sjły8*2C`BrVzI_'AE(q mg^ӬBj -NCw퉮rٳ [jqyJzpG H 7 \kh`='J>hH{Vr1Mc4upnfӰOhhzP%N "S*͗>a>I.YCQ">g0cƲLyВT 1J;8V577s@G_L^Jz -d,Ki]Rz$Fn}Ͳ - A}SSMcJE(/4އy4#׌xNN\%@R 5Y܊̾B:)'Q -FxfK'ӔKCBwz`1hњePܽڎ䥎]|\}bk4VEc*d܍¹R:w:[6>wOI_Y쐿nkS1Q7?0M4MD&QXaGYVi]Ke1Yk.Dߪ0))n .DڡT5G2 ̮!%sB$c/**qN~o`F@d3P題wT)#JF0 rJuǘjocj/o:`HtB".rIOab%+ -* -" YHD >2(WT9xLaOr,PCs & S-uGj@q9]P},.vl)n?ϯXӲ*`#KP~ uN !)ަN"^jRni ;~xqq\nLY?8G+}WPr55 -w0woW- _iC1*7WfDIZ?27E9]߂ Ǔ1WypK˯Ǝ\'M7b >7y}_@M*=Զj7FsTA>Nf @x j7b/P Ti;,ZMo)Ɩ^ɋbkJP#!Ν'!>ESYvxRtd -|?N.Gx:󼌶Fd2iL+dVu<@3x EZgvu&z`e1$0Tv6m5[NJ8Qbj/y©7P=;^ -SZts\y f?a2j5/k}򡩣nx|B=Y56` 8i8TWO],!O:iYS\~:xƑG(8%%% -}` FFjpPg{kztܒ $M)N u8_ <[k\рn|?J(ey H3NKg1ՊWryEA3hpP[_h=`3l06 QPu9gfrP =4h''tm}/8V ; -vsJ:oB;[ⰺY)p{DZz+swns׉9Q[KN_}$`3ch\m5V/s51T ]V@gSFx MW^P.(˜bu'sX1LD  ͒[^;|M*U"T -=D2=5ʔQO?Q!-rͭak ]Å)5Rpf@  ^>q%\.qm{|)x\7 F}EڶF(Grķķ~?]YHpz/ˍ[ sH㕆k-Ҕ-{"@ev݀}LwY<`ynYwx>Z)KL5Oz݊˝9ъfF:/ʘ#M`ܣZƋ.S5]ާL-}!s'ͺl깐Уز1 4 CQ綞we8Ols|z +tW~(i*/O/*o y$9rAT|(-xU92o (Dvň-]7B-&ڭmw*/wwD[_pq,L9nKzZvnǚeO{ь^=;cpeGfB@ 2{a˼콬)Gp\'%ep\7Gqob,ϰUr"+ت# -R_K&9,Otek[i;%lZΙ\5]o懥 \`6r[ -t8G263PTzַ?/-?MLJw+U3z97Y1yb.?r_sې?Nj$vD0Lǫ53FU%k[? Zن0h,Cqyq;A]Xyxg[8bV'.劗#81;8-0GBl~kM[@/Pi]̷m7vh~L7owq9oo ]}߽efi٭ak۩A= "˗;Eeqw,L(-,%m,hM:׆3/-maM>0cw;O?` BOjhl'16۬ ?m1? 7jpfBLo9]Cc%;jkMU&&Ok/G.֨”m]`x˨N9 y 7_jı^?\ׇ|Dȶ͖gG{NlgpH#qq}r[Բ͢sK4B}Q*ٽlzA - ^>):Tr>0 c4^ [>}jw9i<ƍuf3ky pAbXfR#e|@/}f5x`|42g>d&3B>o:0V{/?Yq[6H,wekOSebCߗo -tNc`w2_>Dn`/{dnuPeC<Bpy sjHΰYF1)_|CXnyl.cp>iH<Pl8%mWE k߶xAp%݅h_{! [v sxN!()g -4L7XEO5i e4m, DOJחOY6'@tTspހs"H~yR(,YDs>|:md޻>v;n˚EOa?h4^';p0~ 0.*xNد$A62IW%V?턅){vŽ[!xk7vEhfTǂ(N8^51~ yˮnZ"IUkUEu0Ǘ0?WLD o3a/fU~c&,~^M%~ Cx#4!)3a{8bm3]̈́߾=m]SRCJ aUJƷ`Par`-CԝoML{3Z݄ܿH0kw2?܄u6+7(,[8-Gy[Z\~;s{ⅾ f^|%Zg ϾGXHߤ-|S=o }[^˷/ $"soc_~9F7PM>{Mw+FpCO8zۓ4˧}cRgֿ{pˬߥ=yeȚë q>wO~Ɯy|xiv2m+>872BˇסSRc, ?^+p%$_~6zQXxmXCި;zT,CިkGɒlFa}ϯv? yAȖɗ%H(\KƼ(U}yLECT2%/P񐊁KakJM2g5V1/ *jc^|K>xW=3 F*^ki;PUO\Og^X:,^rQrm^Vc-k{c+M:?ӫׯY^gP;5ჩCK/WxNt?>?zi e^61V~k)O^Aӡ߯hk:U/XGrΉaҪD nX--SQtA[ qmcs|J 3Z..^ϓy[4$xgP@O<{&n̂v{o(PQ`9{ٞIL/`W4f#oq]6H+ս4[ "}1j$U P7r;cn}zG+~_̘=~1r>x1IbXo_·}/gP"ǗGt8?_I$`nKqr9BK6z`?_BNYx?|h4Xh\x8Y0Hx['#_,㨡7uxHBMo||kta?||y>{O`,O^EJ\{/=&dU}DR@I>{:vG&XL6dW/a~eoCH?ٷw^[ٷvvH{iFoizv\۾7!͚\T7VeK5͇Y>2-^Ju5 -`ˣdk~X[!)˟x.ΗqB>²Vl|> Je[bsm[ߍsu 哻~ݟM_˰}݉mH߮=ogv\?Xp{U^}^?ml#ÿ/ׄ.K4?HiQE~aI'UY -{;Rm;g}nYf{>Lf11A[/)e)k98l3=,&glzA6UmHsŶwX?iJ),.La1}[+:Ñ;EUNKn jUn -o"ײ\3i굔mLfnf9æUgUtexbmc,X*(+>gT+W WWpu#Dz)<*,RMyb A{ZP g@LKMIc G V;ff\NT l-&O)ӴURg~XbNɵUjm쇣{nR>5˫Բgo$(,gR,`R,CR<}HLG;ȓ޶hW>F0꣄Va- -NBD4]ya-2Ih(G@4MB*` -Euf]'LOqO+oLNe#ų\<UZյڶ\Iv -3ib]/R%?\Z*D/JLjپ?*@X.{SBzK P^wHu$m|M1]!ןz iSJ|Iz-w(V$yCH72Z__&4m")uZI ˈPe"91sW`B ๨Ch޶)XbɾL$HxϳʔtF8,O|CDa I)/7HGHEwbw~I4j{E?|ux[1ܗ# )1 !]nɒhHUih#(l?>ӱؗM3G8 "@KrihH /7GURnk'FY<*O/o7G IHs}?M2y75;rskrHfJO3GsO>1Hu:2@]^AʁAQֳ0e@ -`뵍)΅$S}9[&6ro -HQ08Lkp4>M͋TKvΞvqGU.|çV-e(zY3rEtnETmBPndJ{8۽¹#ý֢w{צ{#bzU$M%>^z=u1ǤuS4Jwcayk1üQtz1x{c^Oq=OY`j02oD*J'5<--ûQyOuoFo҅Sxiވڕ|ݷg㩒wѾl ӲV@]X~;]nY6zBo,Q(,:44l͏gòuZ6rfn x^<%fK(,F`X6̎#h ˩qnи>\|^ʇ/0)r-˨;e2|a(}̻h] "i/ѱܾ" ?wJp~ʈ@c7|һ`XzErNØtu1ꐄH`Jb=1JHZ`t嶁NO;F7_v|2>~4O0?FZC i1TRo?F@|3:M*EiI}@R垵7FAd?p1-_~thd4K4fTQT`ƌrLttf <'B˙`@!kY-CӢNڭ6,[čx4Q7} ^fёYSTDp;jA(@{5#jc究US<#LAdõQʍUcLd==\\ΰ7,{'*۾n&z_˾OþѯJ.@]~oəxwo  4po| ټQ2k$)Bڇy#gס%IŔyʘIuM2o!$8yJp@J6y>N˟q%٬/EÙ&+xG| ̸:< Cܾ$T-E|,R1[𧷧JO+U~ P$'߻w"y2Jx~#od=ŌBDX*)!4O &(8?<:0t\.Wニ0A._C+M;CFag %`:tH۳S?`Ʃ^NcL#h3=Mu-AjaCt9``7Į-<#pk`~t,Ȝ5fޭ1e;Zt6$SkBwQxF)/9,iLJNۏ/"1 ߭jrS 1mW øi|A;PiG 8mוyz -)ew?R4Z.{Dve'@ewO=~#زu1VyzE.<(Z[w[jZeΧ]9* 0>u6jrNNT[uU6P~a_^uu-ꪆӢ^t),⡂xщy[!ʋ4 s|xLc8 /-ğO[%䲚mig◽{qO=k!W+ -1+엟q(9p6 y{{jZH0-7>}{O;DY/7ĩkYm1==4FbGO!]V>ʖza$^~l$I>lnΗZQet#kZ;:-|1L<jPӟnXBuv5 o}1 F &{ǕF0F >\Ψ\@mOPKz2,4e\ݯ $gۥY sp'C8?M0^.ۋ ;HuIޭբ{ޖcTA/ϱC=A_^cT]sAX,O>gRe׃u, Bǻq!/ 4RN&Lr?TK?VS2//+Tߗmj %UCc{o&N?Y7] 2-.u2a[$}3ǗR/SG;vMcVŷ(0_ux.!Ւpq?-4>:<Ļ|*1w;Q RҾm1>ݒvûIFjSz> -şoK$חTYoۣr.Ha娨gs#Xz4*ײ2*WLr?;3V/"pn"1w.EC`.s"7FL 埧Ã-YFr*d8iB/TV(v ou&BLB PIֺ Y2m4Fʞ*`ib؁C{܁jHQ_?@<_owE#rmI) ޘG \lgcVJkGls\ΠTtzD:B[D;gmT"jHX&4ΩѡiaJy+{8 ޣZI={;&==U~K)*a8zo@Hp;9L}Kx_P S1m(UVx=L\5T$S/a|Gz&ý3kyAjeImStm7%EMz15PP 'ZܞRW7qwԥsvoSh CQx=`WNTA؍n٭}#n `B"SΉ>;V{,bYyBVk7%Iߡ33(InR%T壜T56lW4]5ޒN&QW=sp VUzF Ϡ,7Ҙf~qsA8ySJ|@. -rD R`.nUAΓ,B󞟗.@v+LAdoLF 7]`aAG+rƖ 9CLՃzZ⢷(^:UyEvcjg b(ABi:{?T- W4aU7_DUE08q;/V:OpxyX^vw^ss!5y2]M ̲+8,'CajvAcpZ\esYdff+{~)*z1_Y$5D^fr!E;V#єُ)v, %QHHWL0_i*6?(HAxϫUuMQ]d*rP?уb$a>!\-6tC=6dsJzh]0y5"h< H[m44dž2Y:9Äv\¦_UR[nrYz#ٿ{b␶ԆꡑA^+N!xY9DNFn0O\Ox+" V>>vڼ)jZxX133H +Ԛ crG3q{+hźwy -ꁔ[7Y%"l ѨsUl=]O=x+Q9t,Hݝ -֘44koc/KvOc&H{Nx,n@3kL>&#IˡLܷ& urPŷ =t]"| (r08ln/p.?mIev^|]qlw F$e9؄ ;iqVH`b' -0"%%pc%wLƒb)it0,V2\вhsl榋&-b;y5}6_"N=V%.r.krI@NJp՝uskX jh GXZ;/R^=//i -[>+3WviGQ_h9 $ ?m@wJ#U=K&eر/z>Ng왈Ftn Ѭ,d$ܙ.L|:S&zcSŏ -"'axGD>Y 8)ѣo{S ,O!vo`̾!q`ATn L9*! Zl=ڹ1#`o5Wƫt1 FfPjh8`R-k3!66LTA` =ܟT615깖`$tB, AH!vrMU.cvn:Pꇸ78[ r[n]v9y sN%tHam>HU?P `ЙW1;Q0U`Dk8T\á H/QEa;^ M_&7ΡNr |T tS̳si5b@[ JVe!0GqsK[3mۉt(^:$aK6(hNY'JCX-d)"/߮ *C$GLj6kVIMvBhQGp":"s?5hL`TQf{fz%fe~!wd೵̭v] 3u s ( [~ZH}+fX_P`Bz {nINT 9o6!veWobL,`?s'|aD "nI;Vʷ{=l?/׬'һ"\q^0g#xt( exJHz<&vm!=Tb ;0b\slk]֟V@]-<7%.l-;<"U2A7O{8dD;}$2`+:!v3n0v7 -I>/`ctIXNF#9[Nkւcy{^|!n:84 Y"jf‡t1uvJfv۷:q䙻9tia'fc!vDZÞrLU0K#0 ՘33r{̥)R&.Ēï;ņdE1oln=U8a[b;}Mx|񞼂C&L#i?b=3"qeXJpq2>zc lGBJkB٭7O+H̯DfTɡbbMF.9Qwd2 x􄢠DC`~צKXs=&AdyqmR6VMeC}+hcfaeZ r ob%eW;@ƒwԍoizҖ,Y}+k~c̀乢Ρ" wu+K rQhJPf!28?G7`c?hziO'+~Dϐ Ub=<l ȗi7FzxÅq`ɨetkd>ݵ^qIώ녈+335ͽ_f99|lOa{:YtuށhOQ{q,~8 %:GKCL9MoG@r]G'kB`gP&rhE38dXjq<ԙ9RM[[βtS!}t+$/"JSvv".v `H9d!Jm'hLjT'=i,n`q§ =Zq ~PI~ƔGcYxSiPDyd|u#2c-~§c0ml&T.p? %ƻW5N0Q!ǎP$\YL@DE9N`R~:B2ս\/J3\!0CRCfxc4W,lfO)56 m$ݮVC8ZštsF -*B gWޛs\m7bzH +V/X(a]͇2^ǜ6 Fp@KgEsFs& X uVC -1T߀4NeČ )2"Fp -dKLD(_ dc7=a.9pUQRN~[ZiqR4DDW)Δy@2ѣU+vxK"]JO9'Hkb@:z ciLk1Jot5NUTM<+98DpcX[ryV3ל\ sTz=edyB@4R/a #0 &2k5ɉJIgW2uO'dC_,̙5v3I -{O ,W40g_ !7Ny~|e08<[Qx{AJV.'NG`;Hr\Fd)#ܹ@<ƒdἨn.Ӝ!SRUJws )1Y?>z(ͮH:\yò.(dnxurNF[,ţ~RMt~-ΔXn8ıh>Xϥ]nMмK3JKn T^kBN+?uYM!6ӨtVXƽbE#U@ OEmaay8Oe@ `+p=y׸>Q'AQ3BVJY2[ܭ1xrM z(=HZ ˨SmG7)o -^qR-dTf݅DZuM-d!@58[N'_RdiǴp$ -U¥)gAqiGR5Z!LeB#C*Tm1ZahrЛ=/"H; J$nYmUc)pN`/"T8R/KQiɫj B+`ci6= K@V YOGΆGxw !TtHmԶtnc-L0^z=H1kr֩,6rlW<@$!bo"tsFi%IEx$p Mz"|!GAs"A\kp9%~+"EY3nK|lṃ9y(Ԃ\dܓ iGH!i 1 8REشl-xB%5w0lBgw'2&zF2?p>$r^%uᐡ&|cҰ#7#葉 Ob!(VS ^1t%|ynMLjKePW/E%#pW'f?e+rW1^SJvp2 B%3rFG7$SooN؞0L{qOpjx -m -} DݖV^3ҏ9U - )@ i^U-8a:ӬT5 ҁ%*/a`+VwθV!ˬ6x]x!ϿUaUehtbg,Jnt8vOW [js~Dc6,*dSTۣC< 85?OjB95JNq+1^:H6StY!AGM~?"@IFXDkCՁliz`CD)ǡ{;{7ws!8E<‹p8񀄯 {J 7ϒF8A(0h2b<)[|5H,~7$lf/bQr.LvZ',- +ǃ@UY\[zaՐNKjW *:7-t0M*ip%8F#g栤9R`ڝ=! -;)Aa=N`I.)ˋ'=/ Zh7hfFݤf =MA,ˆD&-myDȣ`-2x󬮋eԖ`? PYlye1C4&kO(%xɪhtˆ`3X6XU[55(P/Nte8(qX478B&S@&wnNIvξp5>DY(pW6=K/?@Zu[r|fPYEDPtD 鿚xQߏZwG&;"c(`eBu赎:I kI{ ݩ?CNO=F(RtDeӨ{6%v*)M 4th-T+tY$QX΄\PU~،3+#<J*NJ[+Z7bt57‡TKt5fE -UcLhD+ubFp H{cCq;c>*yK|6+G3nמ0u3IT}$⧸"#r=^wz1c@ R~/Q"e$MJ2e9lccΎJ9Cwޚۊ穙Tc ͐|5c+KSL+Xfja"fK}T!f' A3R))|9fws -{MJ>}/}wГNذs`UgUդ"IkPTj3'tjgȳ-M ajTGLk&]v̂9N/fhwj"9zmڎ͉ڐ,Eh Vv?Ma8ZK *ӱȩ^+}JڠW, P(\e5yF%ev4]_v0Xl]Iߑ;oyB9(%\VbK^' -5C~b̶Z -f"C`0W?U7͋CqJD$p ѧSa!U& -vc)џ2mÞY=){Švf|JSȄa*VC%nTYmJ* V P;]Fq W -ݪSW/A,k!\|=+@Ttkdb'Fh<|M+RڌBL"/<|" mg&襸GŮ9;԰}D9;Oh*n8JJτ<=^$yɀذ3]V~D!䇖DfPт811u!Ԉ.Y #?~Cy -E.GdJݦRcJu">>U`sBwGwb*%.BCzݥkJSq i?꼆=BnAոJAz kպ)By& <>L萵7gJlU+=}*2)=%er2bcgHirhL=Jv.X70)ҟk<:;(>˽J@~ǼQEm#268|g/A3zIg)D)hKr+QYv'z --UfpC\8&>E'G@bj1/m֫[#%\f9%lvI!YV\4e"iĿw<;"YՖiD+y1{8AJ*r@ bF9 ܫc!o6*= 0_n9G|W-J,1X\1g1BJ?`b [|R-#`;Hۉ N\cøgڵ cS~C+P!cisv SY.,azz{܂oT$B4mTun|DB99Mwr ʾ`x9ĭyKrGI i /;Qٯlêo]!RfhPrZ'!pi9 xP WRTUhNSWu!Fȗ~^Hl8Di/0KjsBׁ'Rdm6 -qUBԵbv@rcz&+ *"ǁM4vK -È| ?;9B|&ax.(Q@OH=Z|eNo}AF6E8BJ7͆8&"K+;=6yk?uCn464'DS*2%RIuCyh1-7x=N1 }iE -=d1n"pdpR4;GfD9ܫ K BJ'rez#`(OCF] 7s_*zHkpAXݫkX0%%4ӫ[-]16g^t8kCIE(8U\S= 6 d̹o!u*|\{ѣ?#~Pt /˛w>ՒƳJI?'üGk}>1ƿ/T35B,1f041}=>Z/> SAmͺJ!gڋ;Ժ.t\ @zH_a[qp3S؇";+A{1C(?d;Ӣ]O/wJ2%>e7ٔ`H;軓 -h)x`8C2`s e^e'#?P. +[u w^\ڨGhXJb*Q:CZ%4;nw x -HÀ96$$C83Pc -*΀D1jš͹x`o,. K0r2ggnc }[ݼ>"W=Z+0w>I鷇 -3|)4B(Bq+A-F!|-I05tBZ)~5E0f hbbkԠPP!Hэ%0m&;)Ɍ͢ Q e@ڼТm(o=*M!@یW`{@5 i>zw(a{<OYY?i4=Ȼŕ,tUӞ/RMU nId̳Ո`[ϕBdxd6:?Y'Jt='˜6 /[ƲDXOqLiD*SNuT'2S5n=6LX 5ԉ][EXi1i FES -ETȥL QS wO+Eh %+"dֽWDXnrbIܻRpB)!"|Wup!@$\675%2A -JUӯk {3xRrI -"KvWH}葧dw! ֭3YAdT?I{;]KL`&.EAR3~v6IvcmTlm0q-&X,\"yLQ̬%r'6ebT4]rZ^TW!rf:_+L$(Kda@p{vVi^4\.vҷdkp$_y]2O=ta$ ;$-X452jX~ÄP)[̈y iͨ' t՛oQ%qWw2mٰRU( 0ld(=(Jc!Pu|Z Z`Q HK8 e剪n!\us U%^D4_#ӄ߻rL|=/J G`.l] zY^9FNEC0q["I|]*%/zClV)9&man -ګwv53ʔj ba]gyPLǔ k(o9L+ -iZpYQ8s$5|z -:`[[6Fq8e Za6}Ρt]L 5h?yU|rY/ =pFmŽ],s^t^5BZ٦#*dɢj87PM(!IhCk1wC۰i[;x8qIZ -+}pE -n&sN\ӜYuhͬ"?7QjFn]fE/M* ַrji|A>RqnDÔ:N[lv`*ؐuۅP% ;@W+usQ+6MFHkڵ$O3ex -0 -{7pTK!ZXi<Fr~⩀Cգ$imvOɜl*]N\ -V'+h޼mHh-{/aRB*&5 =Ӳ~mJH~Eܸi{ Rܶ$lCˌKRe4ztt"9ŽF FtJ/o^I©S:hd l\fsmCS22ER @j=]3}ɏ]?*4&%+(ϊfu{ 7&G{K=q$ /7P͚GO3)fh֮=J*+c09BYT"V{Bz goL"H-&+)Č3#OMBh_-= -4&=# &OJ]jE -$yOUAQةl$+ 3t!>Nt҂Nc(өzЦ&4 (JU5?`#7=^@*ds@%vbZ(+5@nHus5ZOgfd!N`كA9Վ-uM3'(?Gy7nˠ mŌCzhD.<yoc᠙(bEX8S 1K.Dޛu?(~%$er -,=$Ӑh78+ަ;]0ĽcXd τ]\7Iv"NV=e`c\N1u _ &с?"{DӖ-)4YRLCE>)i -ה9y<qC&yiPm-^/3|"l?ICJǘ(_nYR˗kJ_Yhv29ܕlU3 ϻry*zu'dui:Hѳc~?˟/~۟_??៾_1w_}~ooE|"LU~73/Di}`6~ LG Qo !$/jY&n۷P(M8gRgTQt5|uׯ{"Bq{ R="5H&I, -EmCD8]WOBsƒ<}웎Fr^&h> T؛e&PGo<'nir"+mm{WőxDx&ưoYV:эf8[|L鮭? -iFEЛpTÌ'b=鼩| Jp 3<| -vR𿎢%Q b''w۳q_2mx ;nVI -endstream endobj 31 0 obj <>stream ->XA^S8Aɘo:ޕ&η%T%$YmSaтrt; kW< _#R2ݤ -G%g c_4 FI|2jS;"Ҥq@m|HX4s] -+t{'Yu}=^x&!JXz3_i[6XUoڻΔ*yΞE -,w?XLlFR3o";ي{vd1qG26EIWo| -D,(DUڷ5q%oPcz~+}P5׾VLذo6Mq`dQ{Pn8} ˉ[s\ү]F 5F*{փ#VW4`Z֪-׃hooռe8F >qۧOٺ4© `$3E yj]MKZ" 2/ -݈9C#^?>QTH.4M&_rke/ ,9ԽP 4XJV6=WTU*c;)a+!)IC~@R -aLJW+ ֽrDq^+Q\ V"x77rIUҝB_Edy9og=)svGcz^ hMv!Q;nϞX*oJVhxkeuK}=M/nڭ%!ts]2n'ƚzAر n8ETZ.t=o5tYp")'e V,Vla*2x6=DJyP琚>YjV\Gavro(9!!:*-a*׍HJ wc#.!.4M,Év^Pԧ*P[O |vXi:SǔN+kj>&QXNͻY@L x5&: -4x-jE%3^ Eg&K[|@B :oԊwbABک6قӪ(KIi:s<@ dmm`%k\]X+.) Ie/Z8/$F(hjj2KDjGݞku',y,f]]TR FkIxO=9` -.=K0$ot2SS0Y2wT B[4>"% hz9{4rG46[| J{lv i9lXEot!`M}g7$_p?oBODG̼q.gQM@VZp~&DxMD%Ql^01RεMvxc=IT$$S9&>˚.wNTXS/+\V\ٺc-P(Ý/ -OV*~Ni4zSUfe9`צ𛯫@csaHbη${[S%;ڳa"gZlFW`dcUuT7;"f5aڤ$aK6'37 T/;tDx~fkhvex{ -AQBt1i s?jd5Is 攂! -䌗xCUQ@}+Cke%R;Vao%TKx]7m>9Z|$̖Đ]~>|f@[9?D9rXjpj'jy9Es/,;F"\BTr\cͣn8H&'r;y#yeV*$ -J0;Q QlV)H^g/0#u~LRMPxUZ $no?$x ,1A7)#U'R&Ӝ͒2ķ!!"wywtO)jjPg_+ 'Zk{6:u4Y!TL{LT=~ e).KSJ{nKM^E_*Ϛ;kKnGn[bv*r1Z_!6 @E 'ܗ$xj7L8+ 酅!Y]CZqWRŐv6@If%݈l漳LN" 34%ɉqAm“ sTs+29Ge%,"t~A`nDH,bOVѩUaMfo~UY#k]6"sk̉% &!Kef"PTе73YT'ȶVRGl$Uy+.45;T!X:*%۵'%,g\%sK!^|޶ʌmzB-^VKm -fV "yݎCvw ۄ+ڑ0t7C$89 'g59ϩiut]%R2,$=4~[.}j0WBV=gnˆ~㌁U>y Z|&Šhȵs]3]1k$7mRg2PcQDʑ - E9IV=Y-NUHs'@¨n0b7֤=drvI2U-fʵݬ[.ݲv_6z,|yԍ0 nfBf-DvrC@^-DrpSP[pj$q|"O!ؓNk"|t2 @NAq>\IR2ca=5b`PoFdC*ЁPҁ~LR,tHsc`[jJ,9IqW"dRn>w2e~Re+ _7ɸOhTx#\$@OޞYGEJY'.PuyXWՂ 47DMr:c&X*]9Ȗ$ʄd*?IkhIu{RHM%=4:ֶ֛W.e_Y'&Kf'#v0?u8]#*mBd}1Pk&~p.t#q -@:eKuLInUR붬*/3NqgSK.R$ddZ董TÀI0m9<(eE1*E>Kcd[I+Mse'Y\г1b -봦t},W羐1P:Jil\8DIY&\hX5 Pp~I ܆H7KBR5GZ Ɣ`y{Ɉ@iym`“0RX"Lz%_Z@H9ݻ`}a۲PqH JP璚J2ʇ(uH[ܖS ĴXMf"/ViڹFYUY xyG*dN6Z&ᐬh`L&0pZvK!o)4xXK7# 1+#W) ܉|LC$0p(ߟP݄2lBdGVIjk>IcBtG:U4W%0l1*UQ%io] Ђ --+\P2bb0tG ]8$ ivk>Td@%0_F]B6,YK$~TbDͩ#TbdCV#X}fu(98 Fs iIꆬFf H8xqǣ8@)\ړu,NyRq?MRoGYqMB 3p - 0N_z 'm]ډƟr;۴-H>|Զdn$86@ 3޺Ib~d*}5P$1G~-J +9 -Kҹbv~Rm^6[+x rQwrEG?eUW\U76NmZ"́úY8j'@ᮍOF1+H's@R}!l{ז/R9f^( Bd@ 7[^.c$W:Y"hAqqtuU"e uj`-cޓl-juμ>`n0L֎e"@wJX"ipI~o늋TSA=c-̩?(LIn*HzNn)uC@tE@Bd3wE^@ۦR43c呒y"ro{$ kv;KFNCMϒ$46@R[Δ_# ?ZH\PO)nmJWxHlv )\gqe q0mE`z<ƌ -x;_@ߪ5Zv~6$aWGa6+V6&r{1ߋ䚃С*^ߘ!n^ݞYBֽLd)o=̐PIB؀9c߈kF^c ܊$ő4eȂ;Ƈt"*x& $k?eB6B'C?XjeYcf09AdDiv=T&p -pb8 ڐRqC5Ap"<gfIF\ַh(%7y5I#DK9 /@!1B/t#?U=,P^bK(<J2HA ;1mc)޷{<ࢼ7dWTYWX;:hkEy]zbX5cw<.ktvU$AN7&[O0CJk!, 2;thP2g}h2I96O隇1l2Bʜ?pIwqL!WZz$~SPXE;/|ٹ0].6RquqDvTR#G7tsNb̶oxgnV1sU/`6WzVfXza;P48]suRTQ`uV{e] [/ʀЅ|zF xلY;gzTkVadɉNhf:zji<k$!:CG6aBՠYٽ*ttmZ{/.D|trx7YivOi79!ӔH\"JBU֬~ Az"S&KZY)9VB711qP9[tMEW#EF,# ]#d蕣Mul3I|m< P k -v2^ɀ[2B/0my;ج铚HQH@Y^7)0QP-’[Jz3V]7g1PJՁB٬۟MÈ HCIRG!m8 -[iC 񽐊҆V>tKMhEG;lZ/a6 ܻnȖmlྑnRw0|Ɖl8x$tlOٱI6a -^:Fk~ƒIyPAZ 'oA@fnRINk=@AѢ&e#}yl̓$f 3,6jj -2 ) 3o)T@C]t|a}m|֯k:C($³E6FqƇG%F_. KC0 r -'?|Է@g]* -tzVn ?%@L:$HB M']}#[%jGm!%Bm}?%Bnc jʲ^9&SIܞ٤ -ƸI†TlWx,|WaqS=~E]A&t#$ -b y{H4CfysK/8ȅ -Gݶְ%A6avi9E1|@0ғaԎY5M"Pؗ,:.TZXMW,VVG9e|r#"T| ĶxIzK?=4 *=^vd aAx!pGM6p3Tzlه2-YؽSU뽐ܼg:]/Bn^uP"&W^2Q@Uy7`ng;W֖.*k Y7zƥZ#J쭻BqYāA3F䝠W!h| Mq=Q" D֣Vׅj {!I@Ld` HV Du/#̡4Y+R-lksʍTX2p-=\=Yh$Mf2Lvmu:g؃ERT.gFIw -ǸԠ2:Y%~9ɋ!%>wK#To>$DN.ƬgF*'+(@ܚ<)I`wI&vۄ]n8s$"!qjc@ Bwn=޽_b]xSY"B-)HGֽ~/J&E1en6qܹ'kδkiv^Uz.EYȟ$&HPh8vp6   fjP-Mz2jtu.TƹP8Lr;WRf )l9tX9NUa`ņ1x`yZyak%[}. {!5}궇#}-. IzBN -Xk_*.sYҗ .[:5fJĢQSeRTTyim7S pݲLx,Т؈ K~Uw[>{O) wˤ臁rb'E}v(03Q|[]v8q`1KYKSE=:83GFfY[$?Fl +Nw͡AVZ-rG:z o%E9N8^Nq3CBp8~JʰrKFjü -[\ef-_#2? Ej& -CQ@: W.+ܫBTA >XLrO|WOzy{) ner' ֵM!CPZpbZpbJ{v|-!#$F ^_ncZo-dRmH8#'/ᠳp0eK]&М< N`c*'OMbywL/ܶ&j&3il2vxn$˫BQÁCc2 Bk{+G;6RV4bBNn"'P^'?XV+?h6<~jfCV!6[}RBI0SǝCd{6qd(J2RaF7j ;Dp Tk y4? > ̐Gsz0iP~%}&-\oIc̸\7 A4Qv5+a!-A׍4:j"4`kŅ'eSP%aK);R3u-*=0T2ܺU=$&$oV|s̗3TEY$vSVj]Y5ӛX#7_MnL~-$m]=ʢ'Y:IG Xd%`Cvbޔ4YjE\r_k-m,]?uwx`8Z|'q7*JtKrpIo%3]5ݱz-b![u`ā5C)q` 2l=A >PRLW1mA( %!TV0lM܁0:eۢ䏅5F.K%{!&CZ*e.z2QqxBD+o'(n3Y9pVv3pb&Gﱍ,"]f!%)^n3@A1ۦ]Lcқh*i#]&<7Qp'j #&l=],0f8y+qLhkkҍϪ\78E 2L;H X*dwlZ]Xkt -8h`t.` BG5s 7}]̈́ -jv} [Je+F `jwЎj/eVvSḦ(gg\`(tk&)zZ "7討KHrLO$Gve]R`MSdxr_~$騔V KX6gE -M9p68)!;ȪK {nOϰj_d֡9+lvDk*$:L5cToJ5:8]G'aVe[p+ |[A\k!D6yndxɨ7jCZk.t0ςLsz ,#`1o&-7O\*bk$<䈤(ȰNVU~D9 -.ل fQ9  BV[jcc*O?ԅq@#+P6&<x -caE޴DѺi)M[xtO(?hi2 P5ATm](׏Mar -6Sp$!](m3)_{]¸d%܎w|iR ґ]U2[e6ܽ6*T$=aaUEt|5ĕnxjw9dA9OUT[M^WDbz/4ӈvq - dRf'?^ؽ %tUZXϝ@U@)o^PQ(a-d9I=b6Gсl8^jꯓ$ 98ٽ[6 -r;.E% ; Iǚ=7anels*OBthbh" -Wx'ΒP.XI&>. isZ_<"0%IjsQ->"}lhOmE8,M0~(\\! T`V$$WgFj2Lv %juJ9ZPV-g!&F):eGDup b5GY2༑-!CjkeVU.*i1\/"ӤU'FnzBj~Y˿= xw-FNnJl.(uآN.M`JB@:P4Xs:hejC-3j^ Ϛ).B[U26vvNDB1oF?XTCmՃ=/X66R {2ns], &x6םdMfQ@9Kl0jhdIƋPdGS{kZ8Њޘ&qpf<ELtZ Y>PD^4#Wtk?Lq`=!TY];5 NP+Kka.a uKp#;M)\Irݺe ɛ -Qb?#4j}eO]젯LaC2R/e9$o/cj3Y<א7-]VLH?g雔ӇɜQ>J3-CNAaG{p(z-J| -: -JC VDat8>^pIR&p@^P3Duh -h+=VgFM BMS{ݍ5W3֟/Woz?Ϳ}E`z_߼_5?ݟV Sc]ZAg=0o޷C_[oޏS8lcEe.:Qށ M-hNDIu%섰cI U$֧ -UG /t.ϗFkύGEdߢAd5^lzRmhv\^ }|sڸ@aR;U77"FlGg9'ŏ&|+}׍ -~N浯7y4Ơh>N2Jӽ%giK'NѾ7i$7~]AsB'[i -A\C}ۑEϚֱWo1~Z^6 {̶OYk4^)e?8k% +gz'G=Z$&dhq}/x%i~>vۻoR.qŘo_='P)P4γd4O BRCȡ3" 1cm2ۤ4m[q޳ =}Dܟ@wH=5z =Նw3hǃ?&Dшǯ-.aӵ_x`o> .ϭjԬhǍelIǣ~0nWeBPÃ=RGmԽt\6=myF }O/^=]H3+x^N{}"53ꗧϮ˼ԯ%k,ۍ}G -4л}L!s/#szOn'}z -׌$`x6S>6(ׁ -V -r? ;}xq4nw.`j~W՞w5+4Xdv6{0P8jvB|uL#v(=W+)Ó7 1>2sx*]_қtlPp(OB7^oPnm |v/Í&8CxxjjO@/F/Qghxun_Ys뚸<*4>d@fQkwa}h t4/\4u-knLɼzݝAP4a7DT%vN_,';u=y_E -$3fcW>uZ~{ݍ+fUF6b=h bdINAdgsi|; -rփ{7JyFIQ;:``;ww=4WL!BV'Vfbݴ?6gw:y9SjK3U^32Υ˓>Mgyh?Fѵ} -g{}Fɷ(/{=uƫ_p] Q~kCe v˚h=,G~ktVR+&N#%y}RB< -/R;QB;0ğ#5mcī?ּ#gQ4Fodgh2#E{4s=c^e̠r\c8Αf?3ldgF!nLu9wPV=u&*F8;+FNL|Wc{.d)_yG#Auc+,2:Pձ<#H| 9rV=sse?E5ֹ[oLƽ)]Q>cf cfjDvr"ZAA59i牊ӹ܌䎑Ei>۔YOTxЍ_ӝ8XHiԹ#̓ƔaJi/Tߓ~E=!+2SxcmWD{474WtFJS9#qX;&:gn/vzf/=0>gf|/~|V_x@Uj~|o<и3M1F~u)xS8qA-*GR8x!Uր#D<䳽wLu3;#f7ueW<Lf727/vIev&+zS,X)3BwzO3/kt.<Ъ Q ˳j" 7}=o -cG}#j!(<#?e9W:(+8.i9ȅgϺ볿•wSqHOxywx -L)}//k,D0μ~y4!mOY7YAi9!^g:cs/L)@hߓ_|k8XCb(62(Iw/0NΩ*ǞC?@ldVCpo}6i,[vht{y~ޡ9+W_36"}9͗SKm04Krz#=\uDw3ǩ8^Q-//^<, [^5uh'NӤ*A]oew6I%ΠW .Ajȇwh_g\% b;0펞ҨkYR_ȦM0I졇õ' v:G,[-5Hɫq5Mm:#Cb'C/~mkx.;}sf ͣ뎘~cOtm%8ZYDʙmB8 <ЮmOw`7NߞTޚ]V[`OB_荕QOrljmon'ھPyr[X!GR;39x^rT(=99ב~BIzzέF=ݞvBl'-wq:KB 7~;*s1]]{霝@r<æ<'7̎C}h ٺq/&Qٍ(''> ل;h$$Syj/#{Oo<>hne|I5\>[qrAƴ{v?tndƬg6qIg(Ol'w$X -ŋ?NԔbӈƲT$"$i|txq:gvF%!W깗&A<;}'}rOiy7)1 m>;SL-u3)gsz>^3o_ -+ cʟ)9ݥ^CImpÿ@}|wry/@~23.fSZli!L4Z%Ε6Xon}8f6Pr 7+oRТ 08u^hLNQtvʺsg }Hma{x -mWo٧騧5wf D5~jXKh[c'G蜏OHW@8iJ=σ{yF驐wH~s8Ɛ{8#n}uwe`wYq]07^#gOyDE%,KBc+ysiov3[gZdN;=HWpF޻ߴ٩m^+7MY?mۤzz&^O3³pq8ar$|>eQeSRkW1B]'IN֞ui<\ξNαCa1GӁ{/kS#l Y;a".V]w=+8H挀(}3Xd[>%>ןzac߰%-6Em=t\FԙPz/OvH4+^259rw ቧ4Y^Hj5ם"'Ͻٱp}vQ>lw7vV^&i/9&[x$xϵUĹxE^rHbh|"Ї~Lx'ڟ߫ѯ$:$ch<#O>`ϺOmHrt0絵v+6TzatPW}xDzZ`fvLcA+\$hwxVd1333,K23ĜA)xw*7ɷlLwu9U*g 7݃B\r -$i&DNX.!!i|%FvM* \D\a* &iTԃ@A#*,^s3d>64F"55 -)[.u -0A MH;oR,f(d_K)]Ĉx|TLSR -'u++QBl' -kcpdJɋ+ \DB0V݅=RFc)hhn+DHk<^FQ`brhy(BFR1XTa$홒Kw*pKL$ %#&ዥ_b)P5䢏j4&riK" b!$h40~4qr_A_4l=H^}CC$ǧIJcf(` UJ*$ q\6l($,n*_փ+l4)f@Z5e*b!"kF)'l>Dlw+4Bh46L&xhl{SiXHMaޫ{)Fn+cA(5MFNQk* -AR AhŠ-R1`d! s3/ D -3q6zo~}+:S[X+Nצ-.gXRݪkiVNA!Usk-g -H/a\3:3)삓k24 -I=/SV`X3&b2j64FQ$'l24!43mG0n,ۑk2։FF:3 ,p:}ka,ikT% n'I2Y v XTT.$cTDӄwZH/g!- Fh>$i& TH]-<Ih7 BYQ|F>S "THM;R?>TMV!רe~┊.i8[DO!{G潴!aNlScr)`gszVH?r.IvKBph BGrx8cDI37* F1J=h, og,kdTk&}J'l6K'3qp J -rve# -vA։ -K' li /h(nkIB-ƽƆȍlbDk',A"xRpD20{F!4 #u`&PK%?5r0h45K@.ML9kJzH=+lI -<(V -,zĩ7B\hu4Lbm mY3)&%E!Ltͫ W`k8ɚVpB@q-¥b|\^Դk*Ȉ`fR]؁v\YFкR19>R\0 Fڹ.h N8zLQbx2Jɍ!U[X|^/PI 5HAc$`+X[ VIRbf*fBRdMN%n4_>!Ӽ7az6*J_h4XOȒyڢIRpHrq{Ҵ( KdRШH -'(i㫐2%ٍ̄aWN302aZJ+L5kRJmPl5FRTح*z=]'[cjv?+%PgԫĒBL$v-$0EDR@h7\ -CLQiIABIvخ5n,/,L=H\XTg4n7ڲyPIL -PmXI[|ڥF1\m{ښ"\Zڻ%/fw4L%ѥ$0.;n2Y/݈E(U4BA%aԃXrC{1Ś:0 U )z/32§ߊFknpT(4ijTڽ u&]/-.ug,W=sipz]YB\ͥ;YĠaD.^l!!zrh˳IY- NFءPfNpFs)XY'p OlPBtyHؤ8 3K3# B06vm -nebhbSiTcI0HڹU0ҞڣaƦR#nTMZg;KmCZ"~VBQEz$U -Pͥ;d|A em9M@v"Uŕo0>NPYMka=Yub憚lUiX-*ekQ,^"$HM!Y[:o|a 4ZHΌ$j8Jlp+`ϡ(PK{˴{3CH pHՆ53 N,\,k, -e:pw3bpƚ$JӸ޼`y -_Kw/-zqv!-~NNR[X#WRtrw.ҎnBJ 2Fӈ#+{rCq1b##ԭQZp(x`acs{ 1?i޹%͠b0Qr qPfO%^݋|Ah"pyEj& z0eSDwm4C -g#K -F1l&`(^ didEo'&; Ku4`hK|?`#3mt;whO$^:?6_'=. sJKm)/6h ߈YlM~Ws-I/jM[:#uuҙpL. j/4JU{kM̥R:f,"o&CM%lbj*U-M,R c_ձn ->$idKpT]X,b(q^I/%z܁T~wTABhz2zXlh7Su\J;8T)U'm -IՕ -Z.'h\>b<(&TK[A5zKFBL*$e >HX&^{*/=jZAm?<'hګ,T}Ζ51a#0k` w*Xʟ@Q( 9E: Ya!OV״KǛ -[q(b ^FS{o_>TKFH%%Lrh.-v_=tSms\iD˥3LawYLDY13f#GMŊ\X_{玵4L:K'* -ΥUyjm.4Hާ GJųiB446P -) &}We+H>3r$`" (k7 -)YPtHC*X6Mfڜ9pF({`!l|m*,Z3e1JhR4/A 5ZXrzHr)PhnqRSR`Ex?G1fSii⩐IE?ZMk+1´{KBR!Em C?zEtv`/Nh#rTElci \J!3$Ib%HfzR57-\b ZnV3hyxހ#k\D큷8zG3OY̞c@%k+69/ tv -r $.uq٪M}\ pj3` 5*T</|KW! -,ѿ\"[mY:vNAzJ~azkm-mxԇlŢ5觭̆v!ݢ)@u56G5/)a0;F7N_3+@y?8{$9 %]"}uҡ6z.Hg}Ϳ/܏v R;تh[(f '<nk>Ɩ Uڻ)1P!})/q\ֶ9||T3 чt -g}wOoGgQ?hXπlp>~29[6 -GEѤ[|~.7,TN>c³G#g+?S}9a_`7KtYWkMNJrAɬl\X:Yk.PͻֱV!9][r2k]ǎU!ИYӲɬ6Qy'=R<*72:VJ>VV2SVcNfyP#lu-3dm8:e6 -FP>) c][Jfr@rCxه葼֗ fӆMeқ+ga -Gs1u&.b";X>j"5@x"k>C;VNN[EGMؼ p d6S'Χ6}N 2oQd4uA m(_>k…fc}iLPp}m eÐl#Y;d-C2>(ߘ \b.~ -:KɅeӆ3ɃA6ljtYS}*g,:l<;Olǣ@@Ǡg@8MmWMfBRӛR>؈|BT:8}8ڟ "y#XWo}:q"4ȚqYȕ2[7>DϖU2^h.Tcx6d6J>J&]'rּSkZfw=t(~*p}'m02V9!0.}ϘtH(-q @O逾W 5?*WdJե)8 +|q^1ꈼSh_9/=.dfnFg 5 HƇ悲FRAHϐ~lHLJT.IĶ/6Ed35dҫlZ4s:9[:,C!Sޱ)_4qՓ؄lT8&h8 7*5PyD :q G31Q)C@,WZ,HG_=%dq5![N-S2H'NJUZz[X?JGO]GOࣻJ)uHȾG*(k[FO$ńf*2IsQ~)ِQg@%/9 idk8o7}(0P௧g]t]:a6 yF3j= ť7~edBٛl\D.j2#igX.p46K1捋 S>!el1t1>XX-~t@.2{ = /Å Zl|تذ|~a4PxLHHx'XK\ilξyLtic{C6Q< }S3) ClX3ZGi3ѽZ"B2~CQ ЁԡئBnBc9u*ҵ_`?w]ua>w~0{x?;JǖtCy ;@2J#zx'^Tq:_|3܃Q^胱ɯ_`5&l<5FP铛 ҙ{gif%cH }RX/&ס\9Eaˡ)')}wхvh8ąfҼwXAG![0a|$,H&0ec ~  搏* ^4  BF o˰5S>l)>OjKj0` %=C -KA*s.v -<'-Y>O2I9Mll:kl:g\Ttt:at&\flA'4OfsG.YHғF\lh,|Oy"<.GmIDlzK„d2d6$w$M4DӟtBeL"ZcHn" ƲCHH^`l&d/}egృg;-@7 Ux|!Yqޔ=4 /f #kәGR5.>yClAO{c󙢃 إZ=r G8^g} FZ\Tg-AWޡuWd/E2fD; Ŧmd 8Ev d,Dkw <&h}|b6# -cɂCd~uD 6p?3,33H"9= m`H`òFϢIYHGg#]h2ʅb]?9#騜QtFaw =3ĆITHӆau;w{X_?XlRT:<6n-?<>JEa:R:N%=}EealKѠ7|u+V0hcL r+D\mC"a̍؞84*hJ^;F:/M"|]0I1;%9S5)GEKFSqui@f Q:[Sz)ТQ{x_[`R!'S#07 * -X_g7 b"Gn|E5t/#bh~UuwRuM&4L: tj4[!N0t [@>'GI6:Ocg}a}=1ex*x,pXlx#9cd;ia{]DdCXSԦd$oZjY(}Mr k +ͤlBc IB[8#D_Ck&Uck '1)l,8IZ.} d)_|ҁI?4hJU>K\FoֱD6q1t>yF: l2ج}sa}mÐd9L!襧rS:a{5LWo͡x돰i&MɃ`=k&]+Y)7.&t#?> cMFs8-m ޷z,`7T[K嶿jA+?2Q:FgCs}(.dُ&t#:8o9@|8o X`ЛqJ-'C& Ef>Ä$|š\qm2qP-#rG#0w=9,dFclrt6ţњNZ n kC b5 2&k/mka!ThHmQҮ:W@4)P:3"LdZ2cZG#cA^f8Qӣv};]HH]&ȀkD_XJ@=Ɛ%Nv>e3w [=0UI SӦt)S3"KV4&?^Oyg: [218+;E TMw# ̣҇-"ѽ~¸1ɀ? {RN, -v|@`0L>[u(XFruSج]sج1%M >C.2, Z\L3Z n|K\VС# ̧Uf"./#Z-Uny O!9J FTJV^2ΚUQ٤-dU ;Lb:a"SR,˘K؛nv%fR1Vs]Il1-/YnPr~Rב\^N  8'O,/XH/c(x 6'b^F?"c /K`l x|ʍz g@?o8Zv; :$}WG~].efA.$y8`=6f"4̤OQ^4WhIAv1]4Ϛ,p=^HO`|l)sO<2 _ -3C7# -1dt(+ғC!dBs) bn䓷|AXɦ5Ocп9gSp_B3G -MNAz7Nn.]pxnD6}X sKbJjv@1T5=XhFm -Ix"pNj7Dos>sq㙢= C _2SHn1;[YqD5j+v W:|$Mc1x:00`a?{Y!Yñ\TH£{f0Y2c)װ~w&r<)ud5p!ct/F_=2>HޑqxX/[ =5Wtws  d81W:(;fHx=PM^E'MtMG'q -NG#Y09Ħ8$\HH>3+|R|`H+J -\!|_ | hL&33wys,?tMι܃@'ͩRA?P >'[H?iDy3U5 *k,/o(4]N94Ȧsmɚs -Jd)o?#tTR26}Gh#5kdרd~4Ϙ q0gD9SUE-ڶ>FyhLψBk'r [!`%6NE< &b"`PzS@In,=mL}?,ш;%m+ ['C|ݔ- ؜}_ p:U@%8>a4.r뎈#ڧc mA1C쭳-_`?73M7W]*e 2gL3~ s`m3p6d |<0yG;pX1_g2΄g||'Ez*:8mB]uSbp)qU!&$Lrva]HnZA4v/Bd>=yN;~JcB$Us[بWRHG=ӆHGCko X;?b[&&@qMSڻKe~w +pH٦2^n/%j;}m3UQ] -e 30Yʎz/y(&`!Uqj5ȦҥG'Ϧ6.`-ؐ?`9 b4tn1;9N0 |S@|TKl1y~ 3?8Hq48ޝwD A#!z tQ9QaU6NwS&?`\C- >O" uϖyvhhȶ? rGj Ȏ'jcD sthګ_Zj[صt} 8 |ooXFfmi%S"nG8|: `lֱX>^|Zt lb^2r>,=7Ga w3݊0j,.'h|]|zL>y:e|C| Zc\ -z0}"}ӆb_RL>@[AJ6l=7a#U~zlO$gH-c[!Ɓ/eҹReQyc `;O]#6ܨrOƩ 윎7k(\r1| Yӆ[^,uJ' _롒q`R^!!85Ð>n Z,f:f.DXY[6!x#s^a=tV"e˿Z+[j |vET 1,00?fЎq}`k&Lv8/;2宷kК2%8,Y}ؑpB?0nYuk _V<5Oq M>ҁo -!-J7eED.9fDU6IGDv{#쳏)ɵG=Lm,UGކ:l|C;nS+JU-> c ~'MT?C :*<P||jN5N@|4wZuL~(74}I]xbΓ׾+/ZwbA٠G0,ǥE5=]NoyeI4_~i6iLLDJbyaqK/㼈1\/]|8װo!ɤnF^1cLR "CGAA>m9U+dKYe#=q<p'xgQxhXaָ|"|}iĥݹkm7 #r"JUoOא/VQ̨:>>s{cj's0qA#f'k1Uyȅ|m*^FmB p/9)AWb= [yʂ)9cNh2; 9gHpi :jHbt}a4\NW2@uܷsv%  9$C̎Ji3wMJO cZ_Z폭wT[:!CSUy& 3T5C <ߵO*;eLyLq.{@ }sE]nl|dY#ݰ ]3Uu&RgaUtRNeo csCG2*tյo[c7@x^!oSqR6]Mu[fBN4Nƾwd>πcFpOxHo# {igϞC66~w=s5/:ɬm9ekorRpF:jZE]4c[2Q}]60q<)Tc!.BpnCBeկȂD`p2l4ub.\Ga6|^\rTSUqV6 y|0M2EGw -O@̄*:aHeIGܵΥc&VU^4Z^ l&Ϡ~* y p Ud99 y"N TK{8.x_mgmZ N-QCk_qXOV՝Q͏["%Xbf 倣͝kbt p' q"?}g^{?d2X}Q &u &D<0;8GrsΧswAo8P}SA|bCࣀ\.#snv8 {!S3G||bd.{\ʏ` %P>]s6%CQ~ڛ_τIi581p}H0ܕIx" >q|6YN?-PNU{՜9(9thh:^u^?S K9NUMUo1E rG՞1A8.=j9v=z`ίA2:f gS X#^֢)6 -xwT8bo"M'(HlaI85qhA)Cp ?}&]In:*O &;I6& x[MQ8dA_i%x+R3v|#tĦq%d@>Cr6|[YCBk!?m A^| :,}֣a9 2ZxY؟qf$.:jk-wR,U-]3o xfceZ;0`BFwAd OUM_Scզ؁**ȥML'4Ma-ױC:p1肱tlK O5cP>l*~fA=,aN~`VkOnRufbl\t93YE'wK/% S@^Sdy Dru6dӽ%DңF8㝻y BL3NmgDȪ8n6/ q~`BQŧK`sfd9s!eil lG6{i͆O&{l۞Vv.>klbRd99Um j7X / +/7F6 0Q?67u:9\/ 2zCkWdf4Ȼx I;ıKW⫦0!*`Liۿ ,e[Fb_—{@W%a4.nT!; pN2G7Ę#is{p0kDXUp"a[Jt-%ۺV]VLudsRUoϮ 5t1䎐[_[Rmj3]˛Ru:ʞ,>܇;FxL1]kOR{؃QtUN]2TU=Tv<q,o"^Q?^\̞4h\x{^)[_|T㣥ʲ dc"q![YI7dSfO,M_cZ{.}bRqUf/l˫5Di<>L:Uzhu}TUHUy7q"ͼzA=K|O{ cq-y79ƕ<%㸓nk^7_M5u-GkW郏Ӎn̩'~%Qke􎧶'Puj/mmOIrK;#:;@m~RtKg1U!%J%k [7Jk1>鿆EP<[j{nۇַkȝ/׫_Gъ>W4q#Oڝ=b#'s聚;ܽ>#݁_+Au'>My_0̵ܵ[?\ -q8viڽj.9cSy+n~F`tÓe}tmT~C!j| ?v+{5)w<&Hےmn{eIg%Y17,ltOS/lZEMO-ٖgkW:~^}gaom;|ʶK¸ww/2Uw%~L&\z瓝Ug9 -^\/sr+#GF+OHGz]C}6>x?Z -e㯘/ԇӻި;1hC-woCI<]A,>_Eydr`OO=Q:ՑwjKO5y-͜xD}IBF]}O]yG]Ƀ8_핧fs/'2W[ףɽdLJ5'ߪZ?-@N҇rܡ.GzCxV|J}ȷu/f#҆|= td?q$vbq=뉊8Nu%Az&B_zG_H]yK|Dz@|Q^R`oXb3[%!v9S3/])>٫ܹ[H۴. F{g[7Ƀ4귷 ٗLUg.Yv_*oA>|x]p+,xӅ^}ඓێԑ'}Zu%M~ʞ}˝;؃joURҧr7oF$ne:Xlo/Ը=]ž=^Nց؟BS^Ovu? WSXB߽mc=Ql|T"r{Kz;Km` 'Z7}4}pwxzə2{r\t~C%s+Jy7 zإfw$]uظs;9=͛=p9 `vڰ8x%l7]G,ig*$sUuWR+T Wnl1|e˰Lv\M(w5| -Jɭ˃OvUnps_=ԳmTљ䖟W;}j媂+ lKo/PR?Dӣon0&q/dn|uq;GyVEP{S7+Nsh{Zjclb.pgm?<}U7H\{7.nA}PwSU73䲿>u~u< -Ƿߗ,vl|UL/‹ƀ]Wkgv ʾo|bIdFl;$8kGeߖ*K//To[veZun/OԪ_cMp4>^^CʽۉiG3O]*K|XԔ aRe%;oƕ-ϸ]{%esTgYuڝJn$Sz^xѵЂ#݌*z7֝k"^.9t-Zbyj-U~(dqzyLuǎu yњjeId=t3//qn_'1?=VZVE݉۩?Sgzdn:Pt1AfsPw'*7\^rʈGUwR*ݎ)x/:ËΣgGQtvtAo%VlXx#"Vnk=u9v[{0߳ܡw/W/';~hA[UW.G*XҳL|ӫeBYg893_k8u]+jos{j㛓ίW2f^-z*vNo|uҭϤ[гvCrN0*a.͍ě^/Vu&WIp}o=A_د{í}ï}Xq'=Sn~9nn]y,= t.wG:ܹh_}mד#;Wr Q[[oGުy.ȅ5HgVQ\˃U! 9{?i2|]wRާ^GR?|rAv܍|tomʝ}N_)=x>bυDIJc6_Jtylۋ%`_oTWvrLqYWoE~ ->KS5zlm~ v{bø]aEGF|U^Еv=V.C-d퉞b -r]'S,|bl[|2C3+"UlGGh9+$~~wt錊?ˮ>Ur.lne:̛Y/o?[pQmѵ i՛$UlCFj5<y.;q>s%Ė4_O(Vү' ~T=^.KqԷ\DWdf͟-[诳&uX+<"ugL5 t}d:ze0z誾7]6?e+YKSe'rfU*^^}.b-gSI*?y6لH,݋ e.Ɨ_]y+yӃ,CUVЍlТʮ/{6|k)=a6Ños3}Iȴ?6p%Y>#ϡ:CocdGw\TIQ "bP9C7}b2DI3JT2UcuƜŜqN~̻{n=;{ww?{i>u u}ќEȥllVD=ݼ|a 9;/4캚߀mL+Y5UAoNTcKu7_+jzYeُ7vڧ9u 1.-\წG6 '篍~dG ~VO5Һ?[ A̕ȡh׽ jb7B}]1^ssƭgXIK-l/NN*y^‘!Q>]3aSФI~h[ -Zwg+f훷)kn+F;dQlƧg:j4 -ٯٯW-{-=:vOSMd=jw>Mp>ɥ'sݻtrn'.5nRQP_DG_مG;ڤOp D#[4q MwHF mj+v -? -aml?UڸtQs͗/my!sZN^mXTuU ؿ7.}׀=sڂq;9g?ڧ/C1h%f$ ' c)hdda uf1hƪ\da.B6[?А{I@EUOcpNF@L֋2>Iۋsԧu -anN]Dc4 /}/`V d6| -c5GKh;djLEFzs;3uD"].xe̝:U԰ -z^(ռW wܞ;60y-aH7;8L -jĽOu lK&њ6x,d3/@cƹ68sA E|׆? !sgso]vFvՋ9͗.6p3WE/smn%}ا;Qʹ&,m8S[d>n%,Z'+=ƢhYֳoOeמj q˥M /جqzg6Aq_p,vzVK9 d76"/ڬnQtN'ATrW 7.lyx`۵ ۰o>w%[? fn}/̶{7AL^?38$F)zy0~7j# )\23mtdj8Ͽh923^LW Dh4ݫنX隰{!"A_)Ġ_.l{!oCOw2^ dœ~V;ٝ/ft\ƹDi}aŔ9VD92WxΙhLM@G0k4ZndjOG<&rq<蔅\+N!'՗oU|[ -/֖]c;mǮg7>nZV㋁ne5l>))nkeaȱt1ރ20Cfqh=!3lqvYD&Qza2MvCSsфUiul$uh^vG: W],8_WձMmw.xpF6,m^" ϔ8}& FK2=+l$l'9Mcen7ѳFzmďQ3 ^jv&ΏFW~uhW_ݮ$Gcߜ*۽leSg8S{FfݷwҪizͻm7 -{4[-upofМ|ՠqP{tMWk[/4b۹,mzz'kw2>AF9/`- ZOƟ0mчtd5Mp@XL`1L<\gY],иI"d9AD"<4G։> Ou w6颰 4=űsOW:_sbNӉsҁ_E_ ^q~q`/JWFLo5tHtVRDY"CO#g! 쏧G3R4eMYb{ia4?-D.1MŠhcW0vW _/R^XQ7"yẘǻnln?9I߶7ruݼa˻k zmڤ=#ö#11K-K i -F*= l \u\olye4ҔW2t<*Lw/8 $rsz 'X8sU7p#̆9gP?=tιn 6?36u>r @ I3lȆNCkЬ̣K/k/()'4fZT|SwQSEe]80NDžN -UOMiw y"ҏBJݭu@v9vV#FN4{dcWjV7Rf8L'"31͡,͕WQ5,,Ws[Xt[X -oYősVՠ4f֊ό<帰'%}L~RZ=*nX4<obC]x(d=p_~ AJ񻑊 `AQa=Xf4|"V4qf FSlIYfh,Wdcf-bBmIaK7\uInwg[!oZ"Tُ{?8޿x5{`; E7F2(}侽WgS*.(e[}Ζ [ -?Ndꐵ3Ncb1-pAvT!ZJgemKk$pM?̥:?n'~ָ*$޿ -JPW@ ctë}. -^қB_K9H Q/D<М#m~b_ĆFi5+ɷ -qַMiam:[܍.֒o ;3B}~¼~NO{ǛBׂ߅io5ޭ<k(^x칝܏ 77!HJX+{◻UOn=&8D;.\\Q>FS{v<}8El!sԚwoGw`DizwxY bcSY8i&/m@`\~$%X#ۂwS| B샐-)p~qƒ׶1JR%/(KXI_D|n1>5j;9t_~ByJF .l[yi.{ LJр_Fvq84j%22Eh o47 EӴxK|[X㌰£蔙GLOa3VzԷ{ZU/lf?<.{ 5Vk֭4"xqeKȑ_px?VRWȂӵKCgp_pWF+$RW3{WķO .vM>Ϙ5WrejYGT? - >lbw~ɧXm>%h/>Q[9kv>i}{ChPv~?ǻrTy_}R_'X/C*Z$~n%h?չɪ6$4/M@m jƥژh -QU94xJPXWA% }8] -˿Qg`|U\x6z;z#OKZl']zu$e[/vwcʶ]$nuWuO>`Tn\)RF?P߹P7INNlЇm&#KQhwaYZ>Y%ՃC:M7VpfHı~Zc>XÜ|I.̧G|Ȟ,&$Ud|+7땳bjʓj\~/~ cM}' -60Zѣd.wi9FsK965Ǯg3?^5ۨ?gV'iJ\hyصFf:1C?2_D*3_E"=/޿*OeQ;SoB*-?33F- IҒE&h]D'n 8 :4^'8>Eq_ۻy^GM9Th*cgBmp{fn焕0]o3vOla꿥oEndQ}[Q{iTz:i1>mɤĖpDW"W1R(e u&B|iml_.m;֙='*7Nd:,ʓw :WpZ]ʨ3%m*ʐbY(4z2!ǜ\.^o|_s$(n1_eRYta%Ll>h -:"Evo+(R+DwY֎ERS:jXDUaNc7&y{G5 sGC So҉i>9G{ge7 -Փ{Qi!mXH>~29 'Kl2tYĒ Dj4JOxIhɔh包*B4BRW/-}o$T]VJ-~kfK쫕MBYv4 Χ7Q:Lzhiףe̞>T7I"I͹׋G7!ů>{en`^p(z=|| -~gok':-xl>i鎖Θ쐗ѡlB>hhG"DMlf-]}")힪*7cԦѲ˨g+VLN9h.öPyVtS[Ó'*oʇ}WәΧK=Fm ,2-qaa{!In !~9/].Ctv ?y [+ԤKh2G@-gk -R[eOV*vO7Pi#3Dj"W7#G+Gs;{1/VڿYvt=%&~aOm91CVL_|/N17BK!~a懓}BV!w)S4$I \h3P"wO0pbqn~qtCRtA}ӡ6H_3j>AoV!YdJ/AVm>d,ЗAyi"{-Cj]6l3zfjӞITt^8YAkq[ߜwʿe`h~}?/;c+J+`}}h(X⌭Ʋ F˒ |n Z1o1lL.5-v\{r};=2yRf3\Zh.ӂh՜3d{g@{qԱ%ݿ8K{_%ɉ9<_˟-,̀Y_d@n'i{hǜzR>SݱmwħW_YG͜"V/}]Zyrb$$]K)ר;;7T6J#?.@ 43@ T%U(Zwz];+<@BRڙ.ed7a {&@s[>OȥSZ>|||;?Y̦Sө/yi岽?S_ҕљ&TNIfhq D;=U)nT"]CD'CdIFuФah4ΛG\r-":"Y \GâhV࿨b @wKgԇa`3Usn,ݔ<_ށ.? X]bE:Ǫ`gJzpsnK:m12hRϮ~ui|$I^KiFhY\7rxҥGR `S&A]tmoyH&O`r-֧ zFDOZv1˨ާP/Nc䶏cS)UzY>8H.Av:J|JIyȝ&:^*}\NTL/&\[=' u9Ou} 9V)>n/?Q4l29b>HA[fZM*,E[ZVbr=QL|$(\|H*1"̨4.$NIXq9?U2N4ڜ.a-vՖ֟?"To36ʁY⮷v]{&C3Zu/Y88Eb Yt;~*Z vS mW[oЁ^DB"fN9 _}*ԑb?0ɪ7c -,eO{?zS߻_f71zlrjK⛺K`Téyt9LqDtd鎗+oA/CJ1%iTT?pxl @SO:{HfuXGla|/+3 #鵥tL.1#}ֲm/g:n,JGoG)UsV˶^_b/tM57!YfQq_} cI''E$hHNtZJ:cS5{峖"ex\JFRE, yt|$"AD%4YN3OMuU%ך*"RDȹPueD*{2 @jFDu?Zts`w=:Wb ݏ{IO$]o%{tcO=Yy%znfsPՇf}$_+dyǽZC*ΈzRnpVVvh -f.-9e>ǟ+/qҝ_9RR~5\[@euú,ј6 -!ֻK~A;Rs-8Fڰd/VWRýy!oqe=@+虀)RgX9\^SuX= $Uu@h\vOQ}Bix>3mw}\MwfmWfzw~܉o;wUϮ_.S`s1x2{@-.7oiV;VڭBr};';OrJL%5A,6D7xTc ƯEXMASJ_:z5wO -0Lp~xhӻyIwum3j;_Тfʵ%Ln,/Xl+zS.m `J(i!ňY_mkF!UgSkLyHp.cZmBI~[-UQ\yKJTمOR왢֠aTylR"L b=x5YȫO84Uf1%7>W{UDBsWAa[FIcP9֪#BӖ UH%UkxCciC# [, RMnПRCt:NO2aMMtõEʽy _,]X:қ?<>Fo<<7V'j%PW 8ID]$2اg]L« 4DR1Q|cI<[,GEg]fCZD\E٠*62NtKʽ3ApoH8 -xנۮٳݷ!6PiLGrՉ;kt%0M@k TLejMb=Yz-`epI c 楘 V֤jPa@l@Ơ&q}"LWh?[@+X]R#Ŭ4I5& vKE>'uG݃nnl0.y{ϙ痰7!>2[u5Rj׏n9!m7nstqELT&W_NjSp-;ΠLlSB=969j}a1& uo{ YVwfIww!]>H28YzI`u&q\|^hc{ȵ^\l;or.k&:N*lb;9=pۭ@ 1 ce}(壻81dnAz8:nC ,X#pEa+ԉm qs - 5b:fڞTvS|x*SuTmزCө'CNJRX-љ>5|q.X`}:6w` b*poNoi_$ܬJw0ЁyHWb?MY~uqݓ1Z]+ I֐Qǭ+4PFh'ksD6Wh*õ>70 G83X!lb-,99 bt`l0U䛺'-/9{:~5",sƌ q..7l?x(庾ue&, g(y,dPR%CCXiUDXm= Oti{ƃ3?Yև.|S212<5QaChl.,c-\n=#R6T[^k*X?;i+o -\swxd>S5Awt{sSyrLb[o:Y7C tRYW<2i<%a5Aq9ue9췂 LDETJb=ͽz6pxС"= }]dBY%` .$F Yk`V>cdM$x$FLMtO/"Z~q%WQ=Vφ;-iR+e18f-# eОtἫZ؏F1tցC(E\;֒d`gXxe^2fbgp ET5M҆ uFUoOxfU[̱ IF[ɛMC(ۄFs%g3*MAxτqTf;7td l0豷\'쇀KCW@uc [p? ru91ʴ]]I7] xsH.ajZZQQzxpI;_- -H.2fC5Ukuq6zm9`eC,䷿==ȐF|>5LEEK |Sf+Xbm3S^,`WaqX7Q[  9%ܘV+[rqUt`"{9b9>8R[Oڱ`}s`n5c&GX6+_0H5eبt). UI_O4vc$X ٠)1Ve 0O&sTt%:pbup\BBJ!a=KSf'>5م5O4X/Z3[\Ly!P5!|K;->(*ϕ\894Pa -qj [`A@(5a a|A0zYO;;myc!Y -,F̩c]Qz}x p+vMf1;MbfU7ރǟmsĹ|םU}whz߷T=챃{csȾԜҠcWք=rj?s Cp`Ym/q=q Ge<#.؉/Ljɔ4 ncӷ`?SoV(-Ƚk+vp qkԨؗnZ.5x{)y|@\awc6ᜉup/- ) ]'VY.6Mm`Lk&o{y ] ^䃰gKQc {7`^ybyJ)`!$eFdS6`?fB<^MLLx°_10h7V_'WX3q(qn˱!{Sl -XΎ<_|>||>>||>>||>>||>>256%(1h.1Bw$h]bX]?T\DŽDȐȸؠT+{xnޜVs%aAV6ClJEME^P.VV6>Aa l[-q?/.FRT8%_Z?"ӳNaC6TllPLXy -?ohyV#tYc|yMy璭ϳ+Y[bedU vݜşvw{zKbÉk?]t0O?6ɱ#t纄%E9rV,l 1ßg휅쬔V/֮g_OߖXⓘ\:[+\coe;%xyzx2y2W&f" 5?5_Q7\$[$jҰlm(gj3%IZbZuWGZyqȏRSUEyyȮ%a5<]ٚ"]QX$HMIC5ea$)䳽=u'.A\:Zx@7\ )ʴ iP^Ks̚Ӭ+7V(IP,h-PIՔCI6ȬD-):4JAl%|M<dQj@ŠȡC|:mUl22#Aa3CXʘi%Q $3`BjA#*sa -8DEkp \MG$2tDd[@5)Ƃ@n\"LQ?]5ʟjLz-s m/9E @)*\τMD6)Rs"2Y_l&V竍j&"g2Vbl}"ӑdN"CrM\!i,O}E!Q4be:Hw?\M, R+r UJZAJ,ҥ"Kte)Z .TQhܦA6?d/EJjRʑ\fC6P_Ʃ_@ dI2^ OVSd -Ȫ17A^m -[e)[L,V L0IH"Zj㇋N֡#Zk!)q3K'lY7;\l196R?$2|@ZjmeB2d ĺ<`i!HLHeS8J|yx%i2/EJ ˬ^ R`}:"V [2<6 L_Ywer)e8A@RZgJJ+ al*r:' KP:e S0kJx^CGLԤC¯Q㑟7;Qjd0YR@yP97H\bJ._S'SkH؎i)RV&)b2Q:PJ4B"MJkͤ< d:<.q~ @)&R#(w$}IuI?eԏ+υJ(Wy* {m/(w(7[ܴ{Gl̀2}b*6L(ρqEJaq_Qiáƌ2eI3oD$v}!o.+ʍ%`཈yz%)W%vLQM(>dJ -{IIZaEv8Q&R -kqPFJ'ɡJQ գ0HGgT 7n8>L>o$o -rcp -%G(6'Hb1ZP^R0DG@6JA#_&! Z2e:"u2 fY :,FʭE2φ3al҅I{ct`܂,RJϹ|$ +ԗ'UH̆<=]VCND.V$A*DzB4]e' (TtXC4[|?IUV ^."}8,KB -UE;loF󡸠}g2,AHg,M{l)7EJ<؂\7 aFוգAzH|Ìz(u -|<J!rsD ZS6\RXyY̷B(5(xdor(seBa<;(qdVhYf0/2zRfr OO7kAMŶ"x1:r5P$ץJ l$ ktAҖ HӴA dhl)E:/P. R 2 /'cRC(p,@h1r[׆_sݭ" sηfttwv"R -3ps}k.`Nx~}e"]wW;Guc1rreT&th0^,2&8GYGQlce[ -2PS}f`%p=b"B9d9++%ɋĮI -pdD%H[QA7 " $qI|4bb}nfb|)nr&> SV|dU\9ȼ ˨\Av96 px^[/p=$8҈cًӱL#A$ݣPϏ{%NFWH_7|Br#o5m~1;gj|dd&n6h5װ y=0Yy\Vd*' -N{瞱tWS_ZqD Gm\ե 0dAv + -r8M1H^R'GA+oG.4?T BN+_ug*K<,q~e2# B̀#H>8K - >.0$? |}9,Y`-Hqc(FV8W%鬭 р< -2+^ -O`\cIs if4ivs,kB60o-yfΡ;0HqX89R{g2Tރ; g!o"q qq|04 -r% -!8>=ӗ2f#xWU{C /xj0u+o5#^wWUӗ>^ xd`%7UL1a.<(9`R`gG< @&9{e؄gd8o31@Gt!xT+>dO;NI*k"_2vSOւ<') -CW`+ ~\Ox,@2FdpEE a9P,c[P9||\'o0籔 3 1 yS|9Y葲Kd{X  N^d`߁ àXu$[y+aęNgdP7,its=|O"+X8&hMz V^y`WWG@/ p!7xI{2 BO , [ j3β|`IT&#I3gGzpg -yj4t"a)AˑЛOM-G_է>M`d! XtX6D =8#i9Llڃ1dr&_K?s'obAY#F`GGof-ύHauyaP .= &(>sy#A:˓s h#C9;wZ `4@"6,"z.sgOU - -V0:,`@jzpe -"0 9EĨBI(o'F|}, dQ>Zs(ɀ.A\_ckB3ICC`앶J܋.N~&]$\AGFRcKw;WAFQh9j-ƀU:v6`+k3!}v,H1e;}Xl1j&|'Р,LS&TDʰL"+qb Ʉ+n -7w t=Y' q-(`NalKcos"rkxn>X B[@ -v{C(ڌN2R {Zal- -yA*bg:1a;*:0b$%J{^CCo;Bg}nK<0E\)X:=2x;yu{HOٯLۅ̂3@_d²0Q#>$ 2Зyg!, }q%mfK!$P^ 5xkXDzz8N%X .Hld&x&k%i_e.yLql{oX(cA׃͟&e.`A/_:2Yq6~h#Ҩag"btyx)<U u{lDv,rc1x0z)#,rq .z߂Xa<}( u7A/I}BgySD6|TcD9W YA?[/]-%ǘ]c+ ޤ6òވ/Fˁ|✖I"!ʷ# Etf Iu ЯBXϬ%GB t#}SGIJe}ݿl(X3DZ GuKb R8amJf3OהE ?W%Kz,FȷX:kO F:-ze/Cyhefp>5~7W箅Hog_o` -endstream endobj 32 0 obj <>stream -CLM`YRiG/1rMZLE) som0jEvY$tQ:$ kt╨f\@|VlJW_ؠ -$1 EȩyjWE&2 b|k+c#`)q?/s_|0SS6t'ʷEnI -b䅈/9G 5`j x-X14m+<"щ _ƞ 3l`70W u/@q81rN_,v `E=b ],K*A Pd/T [H&[Sv'8aYRsrs -_Lje,g@? Ń0:Ub"1_YxC<ȡ("j+XAo!\:A%n>6K(RΎJnUBd؆a2g{i)=m(DbC6_ IĕI69ӆsa`yYL-N~LLC^שZT@j(ct:-ȫ`iB!\lwr2fZ RDdM6X1v&R{K_utf-,LRYpo[q|\k4X-:9[:1G2_.i -0PA 2(X[ 6 %F"{Cmo{(: o W?m(|"`?xE\c 3060{$+Γfu:'l|=t獥߃ }h rj~94F W,yxw YK!wBxal^~%/V6܏88tO08cKT[capj{-$j:Ȩz:#a~YɐMإM{V}XXC ְ l Bö ^V`j&`ryA" hSDsjp &Hf }؆B&t)=f7V -v(_caQ(Wu ы8alx(sBlžnf^)iFS tA:[bIȰMlfHCކ5^)KEiU%M|N}:Kށm(GՁm(?衉.6Y tx6|.O䉏h*!Ϟ례;Z%ta)<:;a(}r44\8\ +&F ޭf?Ri -dr^6SP箅!iCaӆX dAo{O֔̓^(G/^̡#ŗga{sឱr+C r0,9E`W9E왴d1O627ZW[a| -ڸr%Iv%O\uzng] ꛳ -xoXˆ6=Zv}*{@ڬ^Z -k<11cVn/<%ˈ[%!q}GL|s0V5@AƊN(#LReSU -e_=aaF ̕t೵8G_606u`)&T+m7z=gO/M{vjlCa0(̕/66G`5eX">-O2u6ZMS$EL*Jo?Һ`ߏ+ `_}cT6k!>@5!TKz8Veɣü*0蠗$y | sSoST!޵:-My"TQ :c K}"X֎`oAuQ;yk$`M/~5JX_Ac { >>Y)a2KEO@`n6ebyh]աo"Mh<Ƞ:$N(ct9Xi cKf>,;b\Pdk:ڄv62j¥:ړNnRb EwW<`_X s}^ - -W.䞸,ӁOʶumua #!,98#<j%. ľW^l#3Ch S Q86w=ǹ81̯+7V=]w)f>`eE䒾 LGƗmo.#ga $3zهȃ\?3wWQ1Q/7 V }dlm`-XK|n{`8]u{{@ٯ+x.e^g1Xr0h.nm-?`0=a͏9j>1}X!y>.r}$  A%[w|u^81Xp^wB/ -7r`Z: {P|6rš5c -c% a/2܋+p[&Xk ~[@?ֹS`K4!OBl7O[L{-2E l#3g&{F8f/X -] q]/ۦP>%S 7Bb+|= -8K:զ -PB-]YAL) x ܀z1֊%|» AZM_`z,Jgj -v -/LL㽒SkB;+EvMl9 هs#xrLl*\1_7wGx؋}4щ=gFBootFziQ`](s&$3]X!^/G9p1Ŷw^f$vR/ ~iD΁3Avϣ -q Dܒ`^ -F'y筁5~ե`%[dž*b -8:L?>k008/8'†_ו`I -V>`ftx 25!XwGBP=R*1/u3^ EA6@? }l\S20hwzLlakӬLr~AۍYIV%Շ3EzW|=}KhPkZޏB=#֣ŊPC1*!yH DiЃb_l9kzm!鑷 a}NM쇀zMBnB|33ۿ {{1mgp洛:>3ɠ~6 h<)}Z^4'Q$5dRZܳƕ -~IjW_m54@:E~OW4vMX,c|s[2aQ` -tPC6esۄC G/;D;)*kPJl-Vfot{ Ɛ7OhH4dv>M$*6~Yr^ژIT!{TCb ~bڭ.hׂZav'ĦZ%Y%d2ԩe}lI-JfAW"3? k7{t;:ԭԝ)^zQ¾pL}Ht]J(?l=>lyc?+G>L -nL*[˫_hij)sU -%^ :΢\pz1ԡ;tJr$^ZQAy^0O*)dSk0UKիfj׀}oQK~yyRMީ%J{I򳿨vҿeP2(H^ g.e@}pۛrjbtHJqfx!POd]qeG1!a~ qIU96NI^ũCL߯Y_׻Ҽc> ? P2^ܮ>btV -|NTc!24;m0n~"~eouTn'|CQ/t#^  -邖Lch4L<(h,xu"eü;B|ҤCQ 4q.Gxx*H*/=~yI_=Z˿]M[3C>ٿbv4YmɽҢbkbCEneu'%[DNCUiOQc4&T]] .Հ,fJ}v* ?e~je{1gZӢ<+*E ,o :AqoiC[ŏﺄfȌ}5tD}?6,yla\X(}vBQ<KJv7D%%֒㚂+VKɫz z q~9Ue#ǪS(f=XƋ̻5Sΐ*?*hTKkE=Voqo?ޖ_7~ٟdٯf/CM>O5!f=cğZWRF>v#zYH] ω7(}Ya!ͭ:"d$}PcjtƄy!fzXUeiǝA/L\Ue'uT{x7Tc ۪*2Cnj;vGz}uVPDxwvAf2"ǛĹ ]NuNlNO?0Ѩ{]k6qCuyzv z#;\LBGo_4{FCOEF5D.sW^eњ-Aq{'7xǭ@uxp(iКP5='_? yuT^^#m5zwIQ_MU}]Ɵ):%(dY/żk?T[ -czaLw?ՖQ kpJz62cS+]c/$<| -n~}k?0|sJ(a /mGu~PCp \+ݫk6H$CMGES}j?eTU*)r>`"m dTQ|:DJݎpy<@h< g?|p0M$ϚNJ^5YHj/5gVCf_g~:՚jE뵤S%]tgs^$꿟z\K%Q{_F1m옒LYY3Z :uRsMo|w܉;$DǃD˖tXZHƠjJ;V!͗klB lCꬂkϕ֡eevay.>Mi1FEu~=O"Ȇ?p1Wv/Kb8F-s-w<љ)/l\t[Jĕv07"Jv u M*qK?8f1+|c=Ӌݣ"Q|%%Ty'@r}t¿}NjpM@N@m`E hFXYq>$ mo:W:߫ /n -Mmr>{7wܰx߹KONOjcc"3##6&GkL>њ!Pd,B9X9@+|aߵ=bRy%+Lkvwc4嬲jࡖKѣ:48whM1-C4F6Fx&WWC=4*vQ9g4E㘅 2{bb~-b}fEbֽ:Eeb>D:P{2M-o8uKcyhx+o# -}b} -#B - p9+VǨ*XXC}RzƦF ] 8wsUQP~{lz*NU[76}"b|bH9b!!G'fsC}z\be"BSl'!uݵ&OO#ߚCL#%fT ]N(XO,XJf`Au[ -ro?[w~S!mCXAmwI垱^ Io=cn1u{w%&+Pt]shL]ƶKAhœ?]89?pcuT]{rrl6.ʼR Kf Db1=䉙,b bvCbqUp_Ӽ_9k?a󐛨S+5qo=# -#EY1M}H#9E)t -+,uKpkmX|Nɮ09E6U73GlڥJX@]P39+qMN-sqe db,1EğuɢϟGg&~k4I?7}2iqMíE}Q]JdlWTzG{/ -# -v No¼ٯ]>ύ>䯟\.EǼnE5RHtSNo b圕(m zW2*`l&|C_ &܁IĘhYik*r )"#Ҽ#+Rk?{csP\{ˠVp߹S߲WP8 ]XGwOB4Et|?\_{Yh.wPmv[7c>xJ;M۞oˉ\kU5²(&a c`s_G*tqsdSctW}ct8֠;Ykr̈ih_5#Q?ܘezz>)j=ASeYRP+ߨ;oܣ8G=wyRSWѯ]"DTDVzEeV!Uq)<=T)yޞbf#a"1[f -q]1',Sa8G7<GṱsʪĴQKy E4FN`( %<7d[f$a(e+A_m"wD97Yc]zX/*C,3ޏDֿuwf럂>QMXB@RDl'؛-̙i'Ko\c$T8%=/t+tL)p kU`$n{nkskVl__p6Y_tƣW'i#fdSFȡqr.t@,*=hw -~AX!)1]c7N %[v:߾.ȓcqf΁spAt-piDT[nQs!1.m#>ek4ױ9|?geeCBjs3eNAc&E׶SŤ1w1@тX߁XGbUT̞f)s辒˗ -݋|KA11q%Q1=UENjrLo_ =TEx*dV|n7 Ē-}VRub3PɚXfCfK2dvOQ~­ {ϗ$凇>{X#Gz~sp -XB+pR;ܲ9s6۵|$ZQj#<E,3L9t}3&,B=&fDPXgB(7#m:I,D, 'inl6XSF8Ǚڴ_GTvjDV>}uȧzVZĤ2p׉c6r0Fkk3S6౒_bP◍ )zļZ\B~:!јX 9b]mMv](UqU_D:ׇVTWYėGM:gkgS y?&`? rGQ> - -9%J}1roH׹Jϸ's+$mή;{t{}+qs*s3/Ş&5GNX1pBZJ#J/-N3 G@~wbsZ X~9h?f{դu=J7%ʁr9 -zNCtp"N._ וSuh>m@h'@OCrEH~ߞ$4bɊC\1>KʄB5B~bYb=I%D!&-PzƧ۶ o4YD~Vi䈝\>yO <6#|rPWΘc"M/[ٲ x%uOaYoǨ P 0O"}\{\\v;sbٙs݃~̴c!EG,ZcL,~XnMykZ'lkՈ+ՉBB1;mObNU3L/:o>JvmVrZVr@yUi \oϾu9,ڴUc?]?h+$'vwĪr`hդEֆg:gLXJ̛H,bHl8El'݉=dȝa)qp<nSg*[|=/֚g g|3zu{8O0 Si+z90p>3;n{9-ټN.6ń$i}bO-',]c2_"z=jo])<?soax Kۢ˩ȩp -rp  r=Wvփ~ g - d})˨lAhp1itM"یӡӄNyK?yFTg "mY y^Ħ,YcMYI,&$% g<_|NY}h7\PϑzS4rAְ;_z/ .Oʯup:9**Q> MdȋdKE^(XRQlgX/|m& `ª3EƤ啿"@c6Ա !XZؠkMl?ykvʉ{njn7O_q{z?x*uyל:RikFt lvrg?o9ZcNTbNK6\&ODipo?4lG1a ;E-ؗlqIqi%}Ȭ.UG5/_pgOXb1ՌNw)9e폜3wNg3BZl.+mMMkv(k;7zF>;(j~t-+ժ%6p_^qEje~\f#NY5ڵ rG?R:~䥘|sچ:Io\'}|IZXw2[pkUts#يk,B. vHG(GUyUmiI?Qv7 ?v͝Dv|):-ov:yb&IN[Eܵ` y[ C epZP1qY_ľi=FY ڸC0S,iYزm|/DN#'~XM]EZXmA챸5}nF9VqƺK(Mc*0,i,svKrat^:=}\byxKN[ENOX~t&<_6wGZ-Yar0G }NQlaKQq92du{_¡#tcEnz]6}tDzG9=J}oAUMBm>πKLdR5n?p?`3?`+h 62OyR;x_w"%yumPCQyi'I~% g_5K}kwĬI -Č r>T8U;c/]ߜxo8b7=& BS<0>14um =%5BȘBX;5{Ul>8^7DyvOƖo#VҾwW0^V[Lj$lt..hoҺu{U%9CU)[ȧCQK{/gi.vh^ΙߴiVt]|cP$ x&>l%d_BXطz _08CgJmgSIEaq1#s>k{ - rзa_7u^LAԍ6Q6Iiqm,~jnƠ3K }J?W S7Sus[ ]֯Xcjttqz8mi=U=4ZBY-M b -}=:|i4si"hh] OG{Kd,z >i%~׉U,AJn2m/yUvC;G\(yYyP OEXpbmtRÒJW)}Ζ3秴=o,-æ 4(xEO=OYd׸;EBD6G2UszYr5e]tMjN%b݄vsCOd@( :7K 8Σ$8\m4Y"pR@CѢs=N殆'&=8{4KU5K$ -:c s6{>E/nKE?Y-{MǰORaN^gMW6E7q(%%}B@BI..FNU{%&v+g?G)B$559g;5uUp6H:8:tLV{/_*pܯ"H,(D^??QpOeI~nϺ$yfb5a.2_swAJV?T U2+ߨ1wN\e9}êI Ӊkxv距|`uU7Ջ/ :r  -ziŲSs]o{}/Sخ1E|fN|\b=+0sC,s6hJ;ozb'tgDzB3lv 7̅z<)B^41v{?w~4w~>6N{7Sg..S -0?w7'~>7~~7[xϕgzyWQ/ f~÷oM~s Tp~xP}yXY)\XEړة= -ߌc)>U%۽ kh߭qټ_ 2Ü6fe9kW~y]K+0g8rm`_ɩEV/kDc%iPXw7ϼn6p1.7sOpO짵^saP?;qwx+=⇯? -,&n -" ms}fNo7tFc)ЍCrFx awD1[!cnE8g.2dž/%x~ǝ&rbp{wO{Io^[?0~Ux{o;1Zgw~3M2mmSclK Cv \Յ\[M%8zh,XY8[a -͖5{Ѹbˏ}%ٿ[GcOmp f?4pď;z 4<;rxx}+͑r[@K>^ _y -~+fGp |]k7 ҝ; wͺ33}|8sw}K.^ii͊5[Ҹ8NF$ղ StW5ނx 1>HY!d7M -;;oŃ;}|ݭebzD}@/^Lr)4i -V^Yo\(95/??W7v^ş|.́^o-2Yrv6?ASOf=?G]S+ _}A31|\=kEfvXtn&A{{MdpA|'??_#د?"&b~Mx@sewN%4M Nv!aK7]Ӈ[NK569S|S-wml]Ig~fZ@s}0-cGxK0(I%(يOmt*o,t] NjhH4E -27{gw@ |vD|x6tx8sR{(g ϵ_\g|,ZxGoӝb1qWwi_hvOǫu F_w>]4阬+<['ՎB3G@k>4t21' ="r>p/d;)s*֋_w ^}mRvNnhA{o6iXs'w^y_ /%o.ѷ@wqC5܅_=ssl53}5}|=/!m8SZ;e׎Go@65\hHwWA4I:w&GIK -]Gkt϶Y8~}FW:KW^ae_~Vi"|nt+dZ/0˟/]{]y ;4QBġܠ/Lї_O:\t.0[4з!Ȓc !U%Cz4UxPcta%cΟ]7 ͸'pEfʸR{!kP,/D+&')ỷcQqBRX7N.Y ‪bj#[\ovBC*AV||1 CbRhg= _{6HgҡFf4z'!TyfX 'Оgunܩz^nL|(m:n=b9Z5@bl(44l/>dk}DH> wJexjnw5\`\>:>[:Zd!i<03v-C{|@%dDCZ*\vr\7OR*.,"߻g0,턀KK}OHksAX7_|AfU$b.<}ӭzV?ߠy⑻]|4[lԸN7Fcs0;@j Z?CivЊbj#4q=˟GHWBJ\{k -fh U,lRL!KAE];m mphhr5cu9g؉Q%W8ЛLkMd1P/iL5fOXAK!u8Rr9|>?̂4qbF1e+2(!i#C|R(bH낢:ynN:=#x`ENqs'x+i>ar3}PX=N"HHV~vD|`.w@7Qj}opmi}k`~b[~gI5X"8(2sz*0_n!$75M^>lM 6jhRtX 7VriC*aA/?`CG@6>[g8l8BZJڅEm3{_7S}|yw'hJ:Հ;z0ഡ֮nZ "qX fֱc 6'i ]LU2&N#,xfcIEcxrZG"erh`U\YV_].0İkԉ-o.o3J/ ^7|gA3ٹ'BST1x"ncTh -i BT>( - )1KjM,ngp֟'AW`zW N!La4phեc1-1BJxbuNWK-$=)9{S(]M7W.e=ssb.W^\RV+N `;n䜶xmn{$jb;.yh=/vm}  X3Bח;}_mN(z"qKO:^l7t}&|=7tVX9WV =]ԡ>~C^M`JAN*:3Wo-R~O~#m/v<Cv^y Vz~1rePuotĦ2# f ;j~`V~Jc|)r[1Vl,v<ޡv?/VͨHZȈл>oƙ;;;מZ~,Qz( )~ ٝ3 )j>1z`K+'7|Amϯrw'JǦ*,/`eH5iq'IQ޻f|hqk&-޻ |Ǟ\'[H5e^ A#<{ ˭XKEVg,@P;z‘KQd+=(f)yg -,<Ÿ-m._mM-^ -6 0j`qYBupz[kvC-:CB0s1 JM(Co3t>v]{_mu/Zfys{!$ -qYqUJAa6XwjBAhBYBO],Kz1z܆"{CX'){0Z"MۼQ|dh }n0 KƂ Ό+O0Vm[bO~IUsTQ}ŭNr5^4˯،< \ 8x/\S|I=Y&vlvD,_YSݍ[^8ʕLbb&!g4Ć']ھfgm_^!;fk\+Fm5`5L@>tkBslZ_#ub[ /C:էH7*BWW} -GHw_t;>ÕUxQ|R,pmp%e#zxrN &bS(#mCq"<k%MJ#ϕ*f5;,VOLf!ŽYbd{^ -2 w,m^DJpa3Aӛtbq~1cˬ9Pn`- Ry#G^r";9̤MIgg\u\XZG#~oTFcD(ԘL;;a8A),<ta 0!5*wv$H5;+8s1kRw{|3Ϸ%nWFb(fT8cik-}C&*avduY<cz~Y=ӡY c3y=MН_Ο~uyux fOSfCSѓЇkyfzp -Oϑ܈!rT0/2?p4rPcD vry\0P9fmKmmUIit28Q!wy>9SAG:f ][PiR -{rc]i\;~Zh7~(/}xh'>@,⷟ϵ~H,n;kQ1rCGe?;쬘쬤_'Rey;r^sۧC $`Kl -=r({K?x~Օ%KL:ǃsUv-\;Ⓟ%[lpxG}׳-r8_γjT'D%-)-j/N34ӫGDA\NLZ ^7qdbx!XW-ß1j98o?w^ v4#SmtR~gg%uvRwsP:V0ko{Ij~Es -oMxƱIf8. iكW@lIrz-˽NE[?*w+t|oyo= e񾤆[%sj[Nj [VM?ۊLb/ibg z]C9gQ #6o=BbŅ|B +uS-SkR|ouj,QYk(J%6{Ίaobt][ms1%m^<++ G.,Vsj'+x0KZnn;ډ%W|o$5ΑΑĺ7w8=s!v95k*86:1\dI/4Ӫ=_A310Uj֐Q; d%jWCY#R{Bc;h3?, B3dw̠qvduΧ_j jC[j.Jp i&,u:_I+ -ժ`࠿ib -W;8T,"O7D5q,`f, yte|Mv<(Vm-IhNا~ש=y{bN袮1=bl/%4ol=YSO}`gG.̇T<<[-kzη; *}/Y&v|ub#b!e:ق|X8qs\wi,g拇橍7I'H\[$3 λ.r|m|;Y5WgxOjŵ冴BH\sv zG<"m=ɵ}NƢZR6#OhxcbojkHpsχX2uNxVz]l[0h0B<5(#i!e]`nŃ1cB}sD+1ٶr\(aĀaT_ bGR(G\\ t3z"Jql0EuE=J~40iΥu J"!r1ٽA*׳j4ıA^T,kOxi}2;>Z:zi)zůUF./R5ؿ"FMnb|<,p%6irݵU7~ׇYY/:du[3쬢Y`IXSͷ1ܞ^ ]Z&ll.,Գ:?p%C.@ )FjV<ܡ{:n;칫זӹ1Gk\x}_.V5ٽd]y8&TJͧf%Ig 7XNM >gpDf?qfPi!$mc/ğ֡/:`F,O9[1n,0h΁ղEV`mz*5oZ^>bm,QRr~QhLଡY2ݵس"!zkբ6u9tǔ[:o|k5Mq@Z}r)>oa#R'\x/ekob@++ŎϷImoWˆ[QZu~(y'%xkxwLEv*.G.<%Ca3 1ηYu:% -bB>gX7#غ.Y~5'O,B3Gu8b?qO` ԽBpdNJ313OS {cBHi|S7^TY* 3*b19^zgfI p&BʶURd?+m -}Lr;<"~X[`e: ː9F!>ˉfP2E|;p |Rr pk^\cXD{Z Fmzy[%fRt 6)3pGδUCAR^NῑG7=rԑ1G2"5:L"'ZY/װ'}SJ^)ˉgSxbNHa6Җv|W} -GI`amu8zy 83]M(G`ʐ1RegY:5|p"17{i|31Bc מvDyJC/= dk̇ cn8=,,`L=nZWWǼy{$Ώ}Ep8!8~ -=a a1ΛWu^ t^hfg]aa싺EKmfRVZyB77D߿1vن7._j: 6lZv QM떯Ya|=q%oZx994Vm=w&煋Eϕ.m~<"7]XW9mW N - )y8*+邙pn`|7:W?ׯf+ -kKX\^k5R9F"p|_)̌Ỉ!j䌌30f1X̳84SX2F5 -31QI`iȡDfB6/k.&,[`4%%!5E%~'J)6FOp\eG i:F3N 4Td8+bX -4\@tFmDk>4e %Ed`:N>h&bT?4[5fZ~j!g&Ɣ}03!0 - K0{zGFӕYRv!^La_/9 -#} tbsFF։tDl5XA)sz:{x ^7t!ېh 1y10 EԣE ~:%BȮ)7d29)$_b[.V0 -ސ6ti0Z-g)kvzk<1j-GWFs| nvC 2Fx+%Y -XK!$Z ϵ3DRKef*uN8gs%Qjjv́!ҍ$uZ"mdk5u -SHVd6٤XkȮH)67 ْ7΄O6e6ħR*!g@r !'!4!$bx0 !0ڊ$##rlQ4f`9^ ɲ!cS1T;ʑY¡֐1f|hg9%FR8.Q/-7$sĘ,[9F U1KmtQM5{&Ibprw+FlW0Jg`%'0{hnql,-:ӖPҊ y3ұRxH3H,o4i%evM -|`};ݙܧ -l,r^`2cZ9Kxy&1ڂdٚ4HAU !ds| 3_!Ԍ${80^ -ͷ-; Yd%"t1g%PHbDH%NZTGb,|;5v!AʴS#Rm0jLv1fX)(ANc6ItT0H2{I>e6M$ƴ1 -y -{1Jb(9pjÑӋTyoĸ|(FzOf>c4+YeJHt،!pZi4c'1C%ޘ_6$UWJ)H2 !]!FYa +}Z "QOs$Mo[Qk| s!8Z˱-~7acƀ0>E#O15WbF)IU!Ea( sHs#5y%;H"^`>BH|_82bx Ү9im>橐1ŒkiX<8ƨ}S3O63Ւ,?!oZyq)|Zvf!|!2YbHtuB;<cjzp89n$BH 2MIFC%b䐭# 6Z`i N{{ZȪRyi)6YQ-a - Oφ8Q8Rra X?͆ygk"Ɵb{H8Bҁ eI`9u 1Ņl[H -~ 4kH.A.g~S̑`h-Aol(j$&X4r.8J.Y*Jɥ$ `%1_JclM!<#7F۵HIvI?Ί7${A\ƈ7GPF)'#SX,f9an4gưǽMnrB.Qi'&x pI^%quN$הX4VM*OH6(3 |,Pֱ4 iRCA,4+%$(1҇uifuB -ijT|Vd` y쀎a@A]+ c>xVI2@^,/2/Ôs0[&|IVy!H&3 鶔)u\[I!'9X/XSrq,bG6ǚZ,G$ ,LPj$,!)˔ kYr=&R24!;kK^/I2d_bK &oklv  -B$~JC#(ANXYI8Q!cy5$՚P:?hF}!f֐DxNl4kCaKZcǢo =KF>rd,V@F -2w֑?P3 Wtܹ<7| cq:#!Nj$pbB">nȧ o=u;Kxޓ1m&rQoz}H 4C!y\K cK iD^dH7I.fM|wyoa+ơI%-BWvӍRՐ;#JF!Åep R݇kI$w?NroewN:L9‘kw7IOvʝw\ eb3dq%uR%(}Δr'ݽ2`zS -k'y7Ԝ~,Mf Ŗˬnd9v{[䉤ʭتw;lr\X`ubm#emByp1 .;3'MRXT8ɚ$!ߢ\'3uK?N!nG0G_rpH !!4z!9I96r@YF/ozEYLE~|IOR UIs AOwcr?!2+ )GHCXLuRY|dbrXH"~kˁӻ B*.){Q,蟁(gM^uh/oT^gx+xb}Vrj'u!V$QUZ?Z}-$7m+B.^Gdyz)J@Z!ȁ qcST>z"^@fZ.@\.XN>$r6czI^]5dnt-zdzVc(62^gڡ_CBˤ9#D82ݰM}q|͕™o(]!!Xx5|!$k&>ޔ Y= $Ӊ^W~;Io.g$qeGk#yǼr8McY"9 ܀=߹%iYA> @5sd4wVSu!f{<́2Fs:vuD? gGtj"׭!8пd9zRyc9 5ھpھܤ} yz>,ru#\:\3|  -'~aЗ I aTWC*Pߠ=!5^IU+2 I:vI8i$l٥!Ğg5o&P',֣LH*.(gC'qqw+܄扯qzc {+.Є`1pn -M)[S!k&jGBu;EgŔÏuSEoK?:Fc W%?05,I#q550m`A:}!wZ?d:auFU/-UٵmxUZua|5;鋾s,W3/Ҏ.3#n慔% I~ܭ?. R~f xF&\9kC#r0MC)#qi_#0ڊ>ZZ),qiLJ&ܢ:彭s |W;gBBA8~}I$G-ls>*I76\]% ~~mS//랫o|Sǵ=HN3!|p~y /?cdC2m0,7"EľE$Z anN.YZnN|Iby' *,3D=O|ϟ]ЗV -Nϑڧ -Cj^b^0At."~rPzhjHHCLର YuR4.|BXاV 3wqqsxKSzR6GKMgMD͵8%ZK{Wﺊ SYl{Z#,G.$]{ۤoQ{e)l;."apCn_M(ޚ'gOXijjY(䍡)#krx0RM@28sQ? -J~Ҩ'$7|;)jIloϼ{;E=ut w3wIA uZqjس{ vGwe7?+7lT:4{<C\xk\l2)5 -Q|gL=TV8`,vqOwKww _EYhp5nڿR,2_|T[+NGNG9!P88WjUj5~ uQ@.s{&7*]x.= -0}! 7i:.{XK_̗)jl̆_F/ -EG//7̣|p8bBr\:π=; Hv(UubUEi'gJ{SN5z%{)ǩ܄1ǓZ>8z+և{϶jvqbCI< =IЕ(՜Z$~)~dq7xG,[{ G\ v'!kڏzfKs¾(jSg7.EQ.4OM XbEU:jp!z^jaLEp Ar,7$z ۙlN%aR^O`H y7]{qK+dAL!roUhl^*jtY{x/ ].S;'B&%>\=|qntȬ =/wY>G -,ΫYvFE#G\R0we8 劫K y'mأ -8+h=5p e(>=W0 g'ת+$ ە*@SQ>~)ƨN$;zx`&^z>^Dz;;VZ@p -]OwHW\\!.&G'=E~}@з~9>Ж,c62M,0hZ 5.qj/N^m(ujb;Ԏ{@ wȻ'.@&1-t|Eb'"R98#4r9k*U 3S:,cՕe 7``!(pVA-rs@;`rGԌFQא9|jF|dNZC~tbwD [{4tF!p -oFQc}Y@gQVkj]mFkɺˁPV -zL)oXi9p;yBڱ 8aBݵʪY}@?Sqq|gwU7^*=ȄpCtqvk<=௞rth-eeXͰ -҇fu[됿>*jJ'&׳.89S=?14>2ζfwM-j>XNB\h`Q'?ʅ\:oY>ZrV41i?iAyXt!IyBA݊^jٹToT_YBX|gZ8fjUJeس^=a%%8>l aϔ^G cyR:(Ik^[I(ӱU3eu7*W3[g/>T d5r -wJگJeiu,b1"iJ"?!|{RBGPpm7Ƀ/OzckVO΅AQZ"_[A=P O?m & zUVwaNu8*FH9(ftLJNz٥?:B =O 8cPK%g 7W?_}K|_~->=$6Foڹa'k۝8;"]OVϽ[ >Aݽ -)]o㤏~ĵ3޻[-%DY{ }j@qwwIdY^(P(Rw.@mB] }Y9&1ҝOf| -g#"ыMf V\qr8Yh׆W& [&QcGG6xDB=~`_|S -Y -6t-Ka(5f&,g*x؋AUyQU2Ge'u2Ä4@)މbW`~( ] -TZ^"DB޾stD"x}ZP|6$! S=Vcd'r4Y1@lnfE| UW=Aºj7 `O`݇| Au"sZ.Qdߒw;IN)qDpoP1= U6@U%+OΑug"A?bbH :vk󼠯=l"F4-ّlH?0&Eu:r֫ 7%(8>~$Nn%#mfĞ_5Cy $9Ea1ɻRRˊw~ŕ'wڅS&W649*{愻EnʿYCD*DcaO_Z×ahUı\驎KG{o㣿y#|/3;=!DSO͘-j̆]Uls0/<<&x=x?OE6gpQUM문E\Ya^U} זxg)z^򴨤4yfWBsC6K[%ՑHap@[(W7 ^X//vćn (OD3ī ysEJDނ5o|4B ښqvڈ Z$ --G" ^u -߶l>)ze'|c|7rIW]Z7aSEi]7RO~(mu -TEi|}˄ݷS:η&96%şiKʍ7-$>F/3>yԵCP{?_,;j>ҪXjTb,uݕ_݂u<_εvgbhV^ykʪu}mvSZʃP\t¼6Sa7׵gN!3TODhs)! m -F?|(uk26[WX]Б vk_g};Q֕o18(Z/lQQz(w%s{S, f8ېJ='>^uٛVj=O-9jc˷`6q[cg)G'Kz„ƪbRSR}dMaDs92OkT+ 1 뽤1j=ca{.LJVDž^В`90'*GNG-ZO_:58QuT-7FP_.w'鸖Бfq;]L>έ1{ceg\_Xh9Xo=2t#N=al'!? 7Je5g[uMyw~l6,!$ν%"6.0zn{lqsTUSDiZFȺ*%-AG* CkVHhcU)iG> -Z ->rȌ:>T:}THSSM1:+,6}g0HRƈЖ+:rY= AtȓXYhݕJqnuq [δd$ȕJEX <"]GXn$xU{UܙS)G>$Z| sՅ~?{'jԴ>n1vz̧%6Ϭ5md %M6޾ʹw!>q/O'Kj-5>gG"Zl4L Ghd2J1AP/_XgaGC\F\վmL@]͛jq6Z#δ^MMX'KUWsKeDǎ̐LƘ9o^@51s;d_Y`sHSG0 mX4>(\I/ukC}0IoJBcۯތ%GFO60z=z -S yK_U~G4?_kCdO`RO }ւ{ˤK{ļ/y[#67!*Pv.4շ.2%}`fL}Iec*.'X=b\ |ڢ/Dt:E95lllrug_}CzabjuXt X>wX:g%ll0LSD0 +U0 ,U V,[ -OH[Nq'.f#/"C!1?a@h'KaIKoBw$ qM{̵r8菥yIߔxŔTxdV&ut8Q_]~>z7#}\K!ܶZ``㦵@ⴼA@Ct.*Z0(Eۥr@׊)Փ_)0MSׁۅ"} . ʞII%]\. ?7[o郷ޱ_y[z+}[̕dkosK'΄0w9E%{%ӬCfyk*ߏ~xV K&ϴKSxq'? 6ځs0nўGو;BwސǕ/.72'QI6-(w ~ ~k lHp>"+mfC`ٰ ?B|*l,hqz.Z_orLrn{\pPs^Rpve2ׯa. mx4E_x1|q !g>NTкY`&7F?{W>3~X6^}ji)Ox;IoRe^ /${'.,HSQ^s9z-jyX < -/ /?y=(/Cu%̽Ƹ|)z?;-?s]&p" Q͛jŸl8g&әӣA -u"3;{m:EN̸bߔf8-)|+R=^N'>40hoSSU?W;j?tO`?aLT uN`(Uuzg֦Aw^$|+{'oFUWك︌GMl:|k`|&IDVFl*0YT&O'L`"0]n'(Wi -+̉9`7[z 5-RPLJ} -5}~Wf0| ɯAZR.h{ ֜&iݬ\iW 4OBڤ:a;m?k?(noʓ7e|60g -ws4`Yv>Kٶ rq)0uxp's`Ց:Fό:*TTwiл+A>RUZ -f*W(Kيk@e&0kv0w6X~^`;.K) t`J0S*8޳KIe>oY;JOYY;oYaw[O_yƣ+Zݴ-v[GLb0O PU9ffڶp9XBo NB}3Ջ赚nGȑ >/kxǩ=3͹&zόUj`o϶fP5M`nLbuT2XmVOF:[F _p*I.,^m+<WU]_!uJ8א>0oyoߣH5KA[4,TL~!PC8v@,s,Y;ՇJ]J,Qst.:`-7l5*/kz{>*y<=̯86+қd{ǣ!:Hv-YV넖j7fR%y˱\ɵP"eB߿*.~~ ٌm,9}+e7cz0g+ M`f[l XɊ C&;{&C/jal/yp!+"uXܝ>-m^1O+c?ԻD}jrMpMnpOM51I9˗̅'њ ,8cb:} 3V o[ISX`JC:_.[pΙ vENݟGSk{8_8aۖw%4$&x;_\hBGGJ_{P{f:Z$5+MO1 fSց5`-+}&gp-w,,RU 5X`}'l꘴1`֏%v~j00MLLpiMq@viW“7紡}X_|z|M{i{JRթvmyIL"|0ӜWmu=V`:.XXM@1oX8/)`F,*5΀ͬ0G)lꝲ=_cV@kh[}8q;ھ9'~}[,eYڛ+y)qM#k]i|mLeb L?yD9򗳔d!@Y KieF`̏OP<5< z3z-'km~x¡uM' }J4bQęd)PMrǨv-^[U^7ZXᙄ}iwPA>6'ˑ}Xupf|ؤw]h⦠WL~– OxTX=iWHǔ]A-SvyM\<~T&&-zzx|z^gBiq;-cQ΂ڕ sgD6&47x>|5܊5g ٪0,k9`i K`0 -8~CaOx㴃y"p|]u>6mEvJP:]5pPFׅڏ0?76s Eqk9k?8ʁsߎw`AThH,y`'zy]*ME -CLS \l9XX6qF`!;a'lkꂍ`7*.NrzZ˰65-/=m{nE ?]}ըs~h޿&Ӥ+i[K[[GOQmMԇg V{BQgn-8FuGV] OJ[|.Qs8`;U& vz`T}1e3u\=vV7k?ݙ;}L;Lsb㯴5ߤ6{>vm8ڐWM[16%zGwL:{Wv-+xTǕD-8tHK|0utmz湗J{{ϠULƿ?hHޯQMuL~4JbeRX+_bmOG!Se~47ѷpˇ&iuqy{@(uXV:zB+ߍFze<U#۰s+Zڦ̳`5}-XKv VAO33_,9i{/mc -}Ai̸6VQմ>) Z#/Xɫ݆}q?vsrSvyGc/rb#r7Qh*|P&WY <鳠ƴɘ=dػ-vҢUx:]Ec&A8]a!1aP ѻF` s5Sb:OlW!un&KFm~ᡋSe:>{~+`qƥ-jt\*Xl"c7~§-]Ș潂>u=ۊ*8!r2=̿M¯}<`4zAk͝la2>*XNt:Z#-1L1͠q`ſ|ſC`p1o^u={6r8dzH_Vu3'ӹ]n= 8î?n6 -z~MX91OWsǟؽaS 0D#S>$'N{g,"[7$oڜ$%NS':')r X6o't?R Pqmf아ʩxAojJK?>tQ[ENi {,;)jjWuxQFEŴ9FF`>@H&W<'l B4X% -yĆ]|ϤT@bQpjJVu,t1* h:)( XN6& \tmTfoh,XA i֗G(MN#mnrom< ́r[wb哱ZPy -}e{W.ѱn>0YNc^v~.d:sy1sMq8Ē2uۉ~-ѭv?/,m?]M~W/!Z}n-vRyߑlGsU8?^:>OTsn"F}ѵ8^ )W7'+'^}Z4aS-K  /y!&څ?XK!/fwZԋ[l$QO7PI{u魿k}3v`OH R{k0vA/{ .Pg[=Q9֍dEAu?0S[p٣l-d!O X\d`l{S k\<tq9_Z nut;I7nM݆_LSNM$\cg2[7GQ]nZ.nu쬁ݜ.fg|ﻍo;uFh/Ho61lh#+ȴ/i#㈧KMNycY9(ZR04/{C6 N3^SC }9E/H[<2ZJB:'g4;ז^Iy| /kNXV_.F*WtZj|u2Wѱ8}SBs/(/2xJu2S!wStsS ӻ Z>nmΙodtM`t>5;N$ot<]k'hO:)h/yVه뗹10WМBo]D(Eqf+ =gGfK!}sA| -˚qޏE>YϏyWش̤T=%fbpaѲWIM 8b_P:1C{;!Z4Sz,qPJ4s̕y oBǑ6(;*, }{$-gTK˷aN *SSPw# fUrs92X*Xh)ez㫚iRVݬXE0-٦4vylxo#k-Q1e6)j&G`#{سj-8u70!)Hر[~F~* xDp᝼rMyd, ܒM]^!ƈ\3{//&pJN Nn| Fy_]MmC;/=L}8/i6Êh@Ue i3Lh=^,iy"?&_ο-@ #c ~N7,L13tP8?!Ȫ3Yɫ!S/hr sI%hO]y޽p?ٚ|zey0 }bvmTx+ev akpYl.=m6'vtuy]줜U;sܳQ4X`x0M[@kA`bf8l&>✾tktP?b1[߬EK -y9%bbGL~1-cZ]4a^ȝ\[xnɳ'q1Bc!@{·LCv]^g0CN -wB(ŏq>wTְƈ:{/!WCTq{.tDȽ&f0ل㘟V@jH*2hV}$n>}E}#he5 !nMܬǝOO$B -sF5kc][ŗmf s),5[Y[ہ600fm}`~lhJCu@ߐ8V1ʈ= ڣXGVFяKxlƳ:4sL$oķkvɠl>bb n6łNq{|r=axR>ԇyxȵĝ!Snkaê6r2f\±vWN81icnm,^ zjo҈DlxkieHw q˗S6=Lyh?FHaXLxHU E1#,.ly1IœN̞<|&} -^lcn&AwV -YDE \23 -lW*Zij47yv./wH{&xh?Jgr[9+HعXTz1fXw4n9Ĝb̑a5BF>ٌK/z-[@\EY6pYk*W3:QFlw) c ğ k,W2! :.1] "m@97v`wM۟ q1yh]BqXr>;'s^Y݇piC=tPgP#6%嗽B,ǼxfV'f\i &04o=l;b 'øZأ K -^R^VA8񏷑{Ԫ &]G\!r;},IUY"iz[t -%<¹9d~<5Bdi9}/yg;&(\TWiķa=Fӡ39)tueGy CX@Ltư!ba{", NiwYX_Wn9K,-n #Ljc2q>jtT`tCPIy9zߊeh`A/fa#+ۃŐ>EL1D:OG VaHT"n5Pha\K^J_XOvĞA 8Q,Ly0)o"`ɀ+)ePM4Ƞˑ"vc"+F>A1ǜ{N}ùN].\XzT0+G%_bG då<[G%=# -vr/!bgKdW0,x9o ({ |w r)rWOt s6TvãcMo'D%-Qhb4h_>cKmR5x| X- 8a/05b:1qcG,>%ϱw2i}S&]dsGLL` Sq5hOH -=b%OӤHǀr.]HA7 ^a?Yז#-bQa>Y-Tc_@yUɌ~g -N3?S1a%f$􍄍i2C6w 1g4yL? 3Sc g7s(Gaq<`2G=ibxtXq{h#8.s98|LxuQJ][ v5M$65Tm .&ىD7ߜyVaCƾށ(_f'ShǕ0cBLtV&A51JN1طf/Q3\ J<]909Ў-qsJ<@mwo5 7:Aؽ ?y ~H  ez/_O*=d;# 8qz\"S- -tIH9^%/Ąb<(8my%ϤH.3̡IK%W^Evgr!*8ĩ#e nm@|ßSDg.@zH_O-Ofi 1Cl)*p2ʠcMdch^r(K98FK?c)q6p'!/k=&;E ֻ7o7'[tMW~X V:WbT EK2<)` VWt#Lo%O#3GH,KWjzP²($O1 ?uY1'xiy o3օ1“8 '%6k-g.onr -S2qJ1l&#*#,rB}39%!>z[ʨB,f7qO^ Y? Hsp熼LLqlǾڌһb)|ҝbt&BM1 ,˛aDrB9\YWbR%ũ5 &l)!>PL+WC/#|k%3*"w2 )؈XxR>Qn#^Ʒ<,Fm@dΐ!7dv xc%i8<9 q'փ=tИ4&"c4O!S瓞 |=f*S]ѭ'h7g459l嗹 G]πƄw"&~+-H-6g5ͳ«FfobW|atv2\SZms܆ ƺu Od4"sF!nI\3O_ -'/Oc1ЩQqlBN68x@ sB,rG,0"Mq|>u-K^ iT_a4·*3ڴpe -#e.x(n"bq#0nsZO^[%LxsD9h#+K}ۆr9W`4mธU:CW&`71s~Ӑ1z$OyNF9Z{.EgOg_F^̚Ϸ8i1qA 2q-`uZEYh]Y Yl^ڤXodf&\siM@~HkHVg7BP&_ϗn R;[ Z JYUB9"zYN!L*!V*pbQ7W0Wf >ptTU .-)k3#731D.OA)::*8y}#4cq#d!xM6LmTew\#U2w}g8`^v#zl0|(\tC{1ETQ{iUU⑰`Qe47`E\|F %p QJYrPVhy&q/.ڌ4! l?Ydd:vGNbqh1ŝU+^c*he`XܨhW5vD4V0eaxb(#^ qp5nDţN#]>dIj(F)9SB@qi^!"PFK㐮(WJ(fQGPvi%9 3.qZYF- 1waПŕdt v0u~kdp:ZIՋUG7Ǵ-T"9tI[>!2K=WCқ;N#lO)fR;a`6;90cq,2y\#s>3`MY9*"mY>uBOG-5#BZ g|Z蛱&Dm<җ'5j 2t~}E'{w6 Cng4uѵ7h)peMoFk -&NxNF׍0XYz 뙵8e:fuJr1igk -Z_Y( -G {BzeH; %?|jgI`o~Bcl84w_t6L@}3zf$be<o1}gTT۶-1Em9l@rUXH%3EAsΊ"AT9O>={k߻VEU֚cǘs>TXC}eؽ3=>Cjz^}mYhBN؂s]Szt׽zA+bH.0&ȘQ6hbgpWK -f֌fllΰ*-e@*;#/ڦ;v@`cO= g{Ϻz2^IRY2gXhgY#h+I;"[rԅF`ћuHvBB$h BCΡkV3_T]El=Uh>4*{LnnO_2-oZB5b +k.Ge#[ UJV٣-I^X;MY(SmŚ.S R,߾w -.Y2\5]MvΊRv}XKG-9GrKv`^hLJ77IKgh+Cp rҒ+l5K@u3LȽ]CS}2G>G+r-4C+\*m6os5ƦrBESO:"7|.jН7O9:z6\/c 7mq'Ǚĺi򥸒m$\T]v8]|YC;vw??G8H;Bfs6JYԽ,'Yn4E o-z$ArCjg 3 q+Pִ-hZ\Lg[.y{͂.XP[l3zgKC|~` -'|ڡR#ʃA}y؁r S!X -qL\-$Q]b,YZs0jgA+$bB;+G;K9+=b )G&lf.2uǖ'DW|Gk'KgyXs3DBh%Ɨ6ʛ)~RJ=>zvޓxr/4k-6:Vʋ-N$ǢFYBퟅˁḼjG/ڧ7j>g@Jξ:ʝk,+MCf$_f 4P7 Q@epXhw!BKAsCZg=~#x0Ė3A5u9[ĘSQ+'@#>BG_ jy}1 KJߤT pI6р pQt>G=͍GgMw]>,4Ï$&WѼt%3_QЬotހ\#z?igqҼ-`qr>𸬤ew_oOZ$#x2{ ' q+%Vҵik;-佈|]{2P NgMܲG1 w4UpMXczl"Vdm.6G1itP (zE X$F#ܔ1>##'f5XG%|o'EhٻGR:GT?Z[І <#2lHrρsrSRExgEqybUBM;<[QѾJkN ׎t jCp-3t+Z~^!sG߸p ]D={sF`o@^rb'!vW[ܦ\UЄIQ*nC's?KN64[I,֗\ϧ5ABK`U䥷 /]]^T%19W~b\d=$u'C]K#U(BKQ>3a$7M~mŝÄJJ:əhAއ{}iCsBG#7AV,׏64=#J^-PGB<>xzZgKW8>yzȝ῁#nwPZ>iIN<^OL_1jvK>йE?aj>| |SbQg'sLI]3I>?L_" IĠ -ayP'BJ &>X}tKC[)ТzeX H< u>?I'M! b~Q@-2[Ϧ Nj&*T$d׆}/Ewc>Q-m脛~3c~3#P*밳7CMN|{@zt^z|=_z|=_z|=_z|=_z|=_1y:7۵ۭuu:WmZlI1޶KWǘ:2i9_'{ܣ^۶Zo'vir77kW;[}>y^tytus;*;]o|3_'ynyFr-y#g_<{d%O,]_7-oq7ab6]knoɉϦ?,J$,n{7}"r󿧷m>6dz0/Y=M:7̺5F e40hȭ5l4L56 -持Ș˶jX؅F>>mSSs*fŏMyXa49k7̘Mp*jm6ВȜuL -#- ,lE1ehfI|n&՜147[ט -{tQ%w*[p -G7ٖ4}l*# ƣ}-D%@4^C(Sp81;>;f =<1:5Si@CF'z'=]#YAYK[i'T >qQk[kJ ,УP^K"c]2}\†S38A׭̠c1VGG&q5fd*'-p[0#綥120L#ZRӆpQd&*T۵6mZb+ p66m0GaڸiS~L+xJUAc,l(\I9c{& \tحz$W8<}!3ʄ3Ŕ#s;s{eBO W֣.`Rhxs{Gs=g % b{;g!GWNյs ԡ=7~QCa%yξdh_6X6wo*i_i@|zƜ%M%Xn%'sIX` -αI漍\ŀwZ6Xט"m5X 'MaCx? 9Ћ-:?',wOo_)Lвt%:|G(J%g~U6~_>0́;d|tFS4\ڞ0=SpG:NQBDO:zrE_r_A|/f1{)N.P.QN)@p>ϞeⓉD璱69==6DtcP{#~Y#i=v ?Ϣ`CKwMVF힌&EWOWOcD'U1^ -) !UxD2@-;S9ADo#cG #(2x]u~\.=!(c>@ù*Td,a["> U=ǀ]7a 63ಒq7**F&Җ)5(O|IKa =&2ƌd{! }ؘG=Ϙ[]䜓q>a]?)CoiF.hrӑ[yO %a_!9+BU)z3ز߆m >x1'B_1ЗL)g;b&|0JR\d),&)n4"θ=i>ѕG#BxFp*#-?dP<7Gn+\sŤ#hq֥KCg(gPH8|6x{y2tB}{ŸIVMV[#1%xD>4Gbn޻gTk_! 㷕#x_<JZ# N:e-/%GMp|T먈z |AQ΄!, fb?~sqvcIS[''ׂ~vaCqҟң>҇` CR{G=~vZX*G卦$~a )Lqz;j#a"EGb匦(N(G3$|_ļHy-yRt; ˧&hpqqG(WL[̰q跥}upp_Na"u6HA_(>Kj^fw$ܑxn{)/kC|{-NǔsiT:o{| CTn$^*٧_O/,9s"9|#ow6B9le\c9 7/ǟ>ϸwMhb?%eꉩg G޻C>=NW/ɸzE*b$*j(^Ņ"qM >H{P8^\2ްpmоr㞐AcBrBGa^yw=v 9O6HP;Os=C$dhGI<  G3,]bo:3i(4 ~BӁ /KyJDs ف?-z4#J'f"cztT)n"0>|>6k$Ir-8Y~ذߩ _X!O3jgaNbD\ߛ$I='K?n܉(}qAx{'aB\ʩGA z \>wV$'ĭAOD: 1 <6p8K@ 0ĖVKPi'!!(' u(!<gI!;=/SBtw[Lq]rp*70w0w s <oB@fKrfK-w -ˀce喞4ףd~qC^#9HLb< bO~[`hh>TFrjI87y9@'MA 0g!&,OL82 \W J|?!kKnKfًƃm 䎾 >GszBmu쯰e|]t2am5!}Yzh˒r0F1N3 N%/k}k u%OGzXE|wP6j8<o|885Kj'$wO?nhǀs -$&7xI%8|}5ZB^I|夎D92/-_l<6S#f5 -z;с܂u!D]3nbC 3B₠qs`pP\ K=zۤ> >i!qYj#n١ =pkx{M9T~'>pRH> iꑹ֠rW’1l4(&yJl.784^.zi\ -{ޘ2m#>uKN(]hoѨ'GŔ \'I . -vc#; ?7+-18 s. شSo+V .[ԞTEEL>'6ԇ\4_ -^wCIcQ3S~=A)^(mj@Lz&)NLʪo.VT=^~\O܎sZh@ xͻϸ|::wg- 1\PIF?9mX?\)Wĕ±K);YO1yggp92`F|#!y?wxCDI'pѹIux[ώp| 6Ӂ -\LwւG`eԄ_2&O,m8T-Y.wf t%nG``==b3*V^tk|GƲ+?SYuYp^Q.{s'(>_Vz,飆w:'O7FE]j}ިAu16&1?wTO*Bwxr!_w/2rD -endstream endobj 33 0 obj <>stream -F*&5O^htCN$y]y 6b[Tī/3nh]1$}qht?Dya=p)~r.w@՜u-9눓7b)tւ<=H|.8CSss3zOksSp {#l zܴ$/? )>QBډF8ax1}O7TEZ br:a[P-e`yF"?ڔDry_3;pRNR -p‹)g|^=.r, +'M&t7Fk k@N/$(K=7N|D|;"#GQ7)虁jcĕC#)=:/E46OrQ`s3c@3 = [~rG0Nɟ'ZC-' 0c@8ް~@shЯLYK;H^"؆j!?kE˧^K!穾g` [ݴiF1qu6m %cj*1Ԧ ~)Н16m =)M vP#%9j.Mdce <|.z]c&xkfQh2DmrAڗA Enۤx#-%x)^ ԉsI>,60XǢ mpc@c`,аD= {e D1{9]@`*G1@[tyu*yѽe?viJMTCFru ?1veld6>;hmkMWt>aACë -XVSRVO>#zwx1h%)%vtHgG& {᧠Bb=T'y֣PmKeXy?6L] )#1BY#G8mAFKr WoZ_+ܑ/y;ſQ'QsO?Xy˕lUl3HZS;LOCY#NÃtOJnWB&&fSs>|3i "tT7n` ?md%Z#4_ְ9c+BjЦ 1q9/x;q_(iuفȜZ mphcl/,@?6l6T0*hM[}b麆6j{%=_ -QluzXpG9QVY\%Ę7𮦍먑EXGayU]F1HƖ }(%E ƐY6woQK!:iR5aق[x;i q4s猔Nʟw2PT_wT<}s48%#5#e -dW7]X.}g1k5?>%G LUk6061&]d.xQòP@ɳ7'RO./(ջ7Ori\Tް˺X"R?m'&~|lFm *6Ɓ9 Am͂' ^(F>˕ ť3}ǞIUWwquu*\;44S v埙4vub|E}ma -e]PִϽ{h.j.~&<7hcpTBK|l$(m-wE-jQ"y:(#2Nbynxp&$vн=c[? -%Mk5l_Ԟ٬k v#B;yqǧfQtt:7ĽS(6:>t#"k& ?+z^`y#6!^^,k=1To))gg~#YrXeYi;E@5oԢ^db`:/Cp2UlKKү.fkn,Gm1}z>1$Nk -= Eea:1o84CS55{Iס-K>utnopVuZ63B{*UV K~O,"=ga]TOrSå}m -'=v.r|D8ŶЌϠ~)h\3 5/)h<ƈsO- _Mr}CGTʭL~ϗ5+ZcL_}?Eֿ_uclp}%EkG|AJ}q}>l AckQKC<$9xUa}治T׫0شs8ґ@|oKL}qh8pʳ]k`LuVEI܂G]LYc)/4֎ {~H\)xb2; R=:Qb}%@GPDk[$;IL?jN@=i$M>N9a_"n*~#!ANZX $$Q-Z[ymZɻvVnqGdX221M4_CmZ)Gg@|zlY ->1t1v"ƚH8(]O -uqG>!+z -HKlb#cCRT޷m K?8ͻ1[]7K} 5S;+biZ?/~{:U>L:P?"HySNX$c!^T#E>P=ʹ9BPr3sw*ղ7 -ߜአ`/ 3[kfQbU@"jOrAav%su3꙼3&{84PNΦu -/ +g@N G{φl٩u*am5 -U"rX` i Gc]{dHp2kE,h -RObkTCuL_^=GLu!KQ}bP? -(5FOΣ c+b"i8H<6y\O=pu5W@^ٱZŽԡ{p31?AV@Lۑ1^+]Զğ˛WB)[i| xYٰ? :=luZymB]*}BG^|ori>Kzȷ)M? kT26=_|,!n?/󢦁8lElݫMe! -GW5E]c q%cF(ԊLׁ2i]N5vOEc#NA;`/ -h2K=6P[tBX#w =ua㸌 ؼ{K1FzM c7ja,0MWؗ§_srF#ssXuRh|V5ZFMy)?OHN,Ɵ5ŞzIO泯/8/k$}}rfR0/~ {3..&_'utR/mhg5ɴ&5!;f]>'~f/,V1u~1\Ӹ̋ -د(f($~:kI7bZm@7)tkoUbkkQ?v5)6|/eBM1[jGji'}DQYKJEyѻ' H Gg'(*5jUNn4A˦jEū\Ÿe\ JF1{'OVFЉFu!'0mԡ*a&H!U㱇j A{Sqnɽ3(JG{ {?md5:+.nq {d(VQ~tAytݍ;\_mo`[:Yu w3h_y:UH=7/o_Pa](nl[W4VPfbzW*Jva!e(J $sl>ս6*߮ʞƺ m~s mԊ .ͧ y+\ KΤ3h-=<~ _}̳s;KV+*;V5źm3.e~9~s7/OWbwܑgr7?ˊ/;Rl㹫tӁ;yp%C& {,[^p۾7e{<4+_mB =:OذqlL 7=ڽNv2ťߕfn/[,mǿ -q]٦מ.wƆ5Xƞ=^dϽ \TgZon5WS>ȕw%",JiWծ -z1VAi ,da"խ)}OMOxx{Epߩsox+.|T_oO"$xB8H%Ÿ#/Qc8o3Տa% 4<.aupiվބs㳮.B,q#ŏJ+%_n=O|V|5[\l{Akn7zG^Y -ߨOEecr#V4k_5 3ʪP=լ_823UO g؊Wk,~]%+z̼FܼY|wRw/孿+:~dPf|Tճ$GiV/>X|M^mpT_uK<ܥTj>qu˥֧=U_J/Phx#W_jBm1C]e,W!d+a 7̥VNʋm,?=N%x)\}ĝ{bOOmkO<;o<8*NqwK٥_Oܽ' ʧw{g2&yٓ՟b>pGɧtÚ?su 5MT`ߪC]{p +k=V@~\qK[{7;+mܝ\ӳ\s/Ņw%ؤFT}&z+v -[Q#ݝ,C[ü^s;ŞOLCF!/Ú&">^eyX#ThiNeу\کY ?/{֢/doX\,IU%>⤺qϲV;7" .(vbS3Uvـ<%qz`%Rq֥a*}"}"|z2AԖ6{6JzߐNYӘRu/6 v9<;V`Zzݕ|ڑ>xO{;YW*/{X]:$\~ξ;V]RCgpUMyOy%تZx[y遇xt݋ܞbt&W嵻fO,ͪ_.H:6ټul[ɣ{骷-xmg=},[[7+?eM:> -Z2_̗>uMϼKTܾ7&̛s9(~4s6{K;Ty7)YXnN=3Ts/yRx]M:Qֽ"sۀF k!?y~9R*Ǯ% -qwxܧ+wvX=ܴa<%O#\/x7)6hHkO7m^T>TSsnhN՝\<%[sWkNu&۾˵3?ѽYQY3S]n:ۺ]y湣1n#;;zܒh|֧g,ߴd ]mҋG[^QhIꟻʮ87SٹW -c鱷ˇagr fBˌ}nC9vT4F7E&Gl,/y,_kSTӓdɶNlk//rz',jzok}H8~pr&~k!+Wʐܣ]Ja{5eʲ'|qϊK?n.=vljP64g^[jZ]?Wvc\r僆ȭ;<_zސ">kА$AJiԃ)ʮ8n2eEմZ7d͉kLM(?oQwsm.KmwJ#,L؞hۏEk"]eK];)Odq6JYdrbzʗMw}\.~c\Wsׁ\ 7SOSnϳVp˪JCO8=9VQYЮ.(-;9&1L}AP ;ng^o -ȼ|7yn`։욆Ԇ|wI6/ϨLn|#ov4['~rGg;o:R]1gQw2O/OUfZiVs]/,B~\|גn:5,Q|]/*J{u>Å/ueߏ=/zovߌՇ~Wek >N]Esxnսܲƈܘ|էki& ݂iW Gߋ҉w[G_H7:GZJ~Z-lս_#~FI)o|We䦤 -Ƿ}5(yTܙ7^V@՛[^ͳz[-(\ܒa"K?\ّR(AzKPOqt/P}>\}H!ꂆ{rď]ӎXW_Nx?sC]K:)711/1 %>*?1}:Jy{VR%܊ɫ0WiiFS|97F7Lt:gHoIٓr?u/mB2j0Nx\j?81,Hk`6̊>U{K6oO͞v;u~p`px~ QnˇWcM.w8xcҡ&Í:5MTybwAF{dA\fnrn]m`3mc[߻[?Zb-mjz{mN- N]GJ4ƕ܋(o/PjNÕoҼڪKC[K _=u34Q! Tl^]ϳy<GgiEĊ֬'__Ʋϟ ډl̲u"I]΂G1O*`V6g2L3vS}*65%WGISiHvζ/{>ڟɎqyEQSKS_}Fx7CU^VkbSR!kAugmKб3#y".aRoC7uu@[>gr:b?4'#ZxW ڰCkv͟,$̢?3Kf,Y[3{Jff i̮JTN܂ ףגb vpo-޼N|ٔ2+nT݉CpC^ctpE8[~Y{sfz-hϧ&k EfX}fB/=f<nje1ߐ>~FoLfVMRUYfʐf4yhFWK 3>3FfE+Ŧ/t`-^fpu7 κYu! ƈ䒈қ1F og݉ZOG];*mA[=o_`#z) :oXlp{A)+Is &2z5`tCO#ጾf0}fR3gL>*0n}G_|w!]|2Ih)v^=Mv|v ?%fLN(jsjG瞮Q_>"c+C ΪSٹ#GƯOJ|-yy_^&ʰ$?0S3fOcY{jnޭgY3|`f ӗh3?mr]Z^uȫzsȿou3$͵g -ooE/& '娯%%ݎ)[u=:g׵#W#r.\ S}rxa27Շ -͹ߜ\}/yFHۡ'9Ÿ]_C -[yeufum A/= .→|hЫ 0v:F8gfew0~߽:F9զ|cמ\ւ/,KlcXp#.xrTtKO_ i{~/([XD>~nm~t_nl !#5j~#_=30އ9eкx-M+{JTkagF䟹Zxvhky7.E]~;Aޔ֐[D`҆\ߺ_^.Us,aFi6؏ſڜ&ZN?_C%&C^<Ԡ㹾_UuQI̘ki?83K+5?^/ES){ng't h.C^IWNߚdH0VQ q5*>F?^9\\wozgt!Q{|kǦerwϖ:\Oн"jDay>Vq#Nhq7}枹[|+&Cr -%3Bw[;=\5<ɿ$&]|7UL_Y(hT=n{qr^λx%{"CK_/8q=,z:1;y͑jۗ  gN]߾oEYTtoC4F1#148 #>i aړA&1&2CbFmdfcoZ\͵[$ &5fI-_LuVsrFkwz>Hᓽ䜾ٹFtۭ|6%3Jk0W/Tx%\ȾQ2 _Ό=3rRFobf7No3i-ԲNki&ϻ6;r!:ľ7":EW?^vԮ«5Ui )l*nh)A޵{ 7`Fj3Cz$? "OK3#zMc 7>`3jZiee -_ 1Fxu%RbsܻVx#nH7nsKCr|h'ݫf]߾/~>Bz>KH&8R{ 11c1̌7є=т=ɔ9f3Mة30!Kwҳ !YRs(nsz`(5y=]#`;ws͹q+$\z[9iN\?ٗz^3u(ČŌ֙ƌ23gfl%3{7f"{pf1̨)rfxfu7lk@wݳ olڏz4VKʹ{>ѕk$\~v7$}SPրJZ[9qkp(F=<̽azfO;.kT -6 XAff)tH(Jv%jbh5'yo%rn?-zĸ7 -Y煭/n^x[OKF o۟ Ȟ7Gi$G[ p4co6C2vtfF-gƎgq̤RfG 3vEˌc(Z9! ]kv;*{_-h퍝WZ>8·;\rd+jMjZ^%u[tRj#Fc1͵#eLb#NxFmӆgkhGo3‰G|#y 8 cgE333Zq~u#.U-яxw#ypIw{65^r|ۗJ>$ٕs|u'/_?ynAGg-}1S:f9O_ҟ Ѳ s͖5Mؠ?3yZf f?~;c?΋ʌ]L\p=3/тGG~["}k6TH.Mlt;;WAw~Eq׷ ^7Ê >,2cܙq<ܘc=X 'c d6zRf匃3zq32S/w[w~c%i=Jn fF3Ӽ.ĩ -fe񗣬gb|fE$1f̸9jf{*3+ŷ2Ϋ?0#_Wx|_V-{2ᦄ{E~s%KZ;/oM|ҷ#tߺ[|ssRs33!=4締?_ښ8d4 Lf8iɏS/k~ز+>OA>~ҝ1bW6^u-euf u?=/T_IOת¾SͨP#Ō:?ݟLrM̌S3k>1S uxvU>\PrA X\q{3+뗮8wrc~}C*^D/)2noA΂Gr/x9OC{ĝI%82ri4y`tׇٓ|xc7֓"g&LafU nd0rxjia2>_B -Ѕ{fkgׄ&JnZ-yfѫPoo3ğ|>sdro;{?>kx0+XGR)>MSgdk?=`YGryG3nz(Laf**>̬etg<Ó2ŋPbu pͽf?{{=҇?Z&׫Oh1hpU識 "y`%q/|}5qθ/v!2Dh:?W!'{eWzńKh;ȸwa&TWfb[=_se[-6آ~{ k(~.]O}ndOa՛5(պz8C?/O}BF>^vK/7)8 YyQߕ(g+^P^sQGrgs3؎ էk=N:Mv|Expb[zaz^/6 X[#uf4fv`eK/K|\/Kxy^Wuo?$y\UnULa,ilm*`)kz?Jy1 -5m,?7ZLߨ5$^Dמk>rՁ_<ٽ_{p~])m}&/u$f̘b\ B^>5>k]_ʸ_ޖ7t7u.f|╏g{|uj+ÛRmY5׻.郂'o>7Io>_ -{ݗn I5V1.ވr/r-8Sw^U:6-KSq#i6إ 3Ĉĵ.*fm#gx㥫uzgY}?߾)^M;W?Яo9G" gpo˃3ۆ.]v5Qx3)ѹ" GO,O'/b5o(By~CT՝*fL>=翋>$.w*TaM5}/^B~rA&{Eݙ :WrnpDb+asx{^3/{_!w7ɫwv }-G&z;[xa*=n#t 8yG󉵃|<|ϥW -9цta|Y(sSș|Վ =</D/%r}8t[{K#>\ٍb핻o=W2YˆUF3̰A@R:t^|u*e+.zwyQmjr-3*M*0+- td0A+<IBW)4y$S2>߃G7OM7,;>Y/bb10`u's=_-RCK^:ݓ[]U5J~s>{FMO6>ڠM>ijD߯I"߬CdጷfA`os[_ggUiۆZa Ѩ` -[{vR,8Y>m>ҝ DEfYGلmu~|3CS_*?z+\q`k;񇿖a_/^/~pgb\n=o Sv?Z|輽@tyۅSz/qυ^{U~{e9&E$'z32+]\?YEf -Ŗ`hBG"4c {K-WkL IeBaK؝ϖU|* >|wxe^5WybHaZ͗qx/[կE#%zy1KW2AR1j]QXjUhY Җ5F" ǿ(~Pn*vQ|c.FTg4+G?3xlHk易끳o~^vslכA}?$5,hpKdGȊwʝz>/n1L8T.E-te\&NaYy D/Xz/}SK'KⱧt/|z&_>Ji&vۉmy8ڃP?*~Pa崙xx_W6XVlɮъ.tڧwc9CA^3h3Nٯ eà!'s4)<Uh[c؝̿ -p~y$nl˨l`sۇ깳\ ݑ;Zo=}|ѶBEXz?^\ |$>kOy3ƕ2gOewq|-)/Uћ=m Wl2WhWt+k>YWe&kd\a<@Z}E3~ 3M0KV122!B XmIY7Do‘s. --mjR`aqtlYN;v's{_qGCK7dO{vבm2/qrlu'Ȟ~,;Wc?{uU+kWTrPS%UY`\?&W3'n՜ĦZ٪W\kO0?Q3\BS7p3@8G| -_9Zj6r7۪8T'^K/u/W/cS#yq^M )F=`M矔>Y_x// Y'1 AcьW(bsMkrM#R٨,S.m' S=66֊O.PE"VHI暌jkc&F$K f`%H}䚣4o٪\vb~Kop RA=C{ztĵswk=3=hbّ{.|Bu#tqT'LUzcvpkE鞑 Nʴ֡^p^,]/aTW9O8203fUHqѓ]zŲS$cJb]1eB #ry|媮KH.=lYyG_wreQS7 tna+:7¯5vspy0sƖu(Kl>e|3/7#>d 0+ n]4@ߑhȭmJla _N?Psl2_dƦVX%$%V;>gsxr:yk t%kW2n߷}e޷Ji,U }@eN2E'3=?/+ -U{߸߮7;:yoj9oBj̟xO}P{8JD'/e}܄u{lio}io5c=S gk=MOwqCUm1-u5UVːCw]??ؑJ k Fln T=/qgcyKb%FL0D\;lJw,vbV-2`2$Xhbh &6~0l>)㺤g,أMb|ed>.淞+~븹DuOw_)w}·;Mx<ݳT>ʅl#5|._u8W,1]V0ZK뛕o|cKGjNNPelF.! 6Yoc* ZtH)cUCD|l3v/Xt,I]Rmŗŗ8K ->ɖbǖ(cP>Oo*%Yr)8 I4lvg{_!C6: Š]^h31$dT Å?etFsVv(/QO<5W&k_|.ŕFʁU9rW@_>T?"5jǧ.ʞ>XS9],%5N4nTX@Xd(O3E٦`OE^ i-n Bv-&cu'>L%|'|OcN`u$l`h2@'TrBE] O4۟]nl!"3,27XKMWdp'XaKġ~Ӷ13K562⼠ -Tsp2xu$3vEQo !Xˡ/@`rq>.3:\j*4ֈ mcJՎۋm2ua@|#e D @  -[Gp5! TCZ@4ςCRFYbr p)&/"uT4XaͰN& I`31yb`6ۋ5'}®>|nb鹔y齙v=Uӣr趎![.U^vF,>|.]{>=aė13I|9O*.ojUu"sE 2Qj|I#'4!ձT[ -3iK"L\!Dh nS^oeV|/y|Tŭ;1gW tgW 8EL_:e$IL/26'o .&ի$&L)1|xJl,bJRQ(]tl&2ZO6'gk UBl)8uB'RYjR ^75/<JuS}Zwv}0 Xr- -f*l'TY"M!f4SM\ 7`dR-.G~m"'߁˓ZF5e}NTou4t+Ο-`CKIbY6TàAS}x -Ial綗f=z]/ayK؏u,fR ,USWa9'ZaOj` r횫yc_bF;kmt)t%M4;A@[{lX\UW; -n7j+Ux191^o:tW4>q,*s!Ȝ%OA\iLR XqQØa- l"aWTcP5?%x&uv= v=w~Zz[{,Xa?|I96&lPjOsWB?d.R7T7'tX)u Bs2UǑX7ku>Z&}/ -ĺI櫺ҸJ>J\ge4[u92!}*f 1r _zH]+W ` -M^gMi<ǵ~H*:y1Šw yW:)ǜy ^Ɵx)5؂(S!_ONdh'K/F'n+tou@ ƅÏ2*1f5{%uqFTӆKhg ?WV˅MsʭuBRrs=|F<g?N5C㺿ss%6OEuq5S2+xkKq&n#yّrVO,Qf- Fb2m8_mamV=m"R oŧZx9UCO\4;yStZ)UV-#N΂WH46̨6^~7U<|_t;VwFXܾ~LPyz@FMd9zDĊ '"38oVL@/_|Ri%%Q+YDMǧ¶b!t`w=u}55f UQ\+h57uKrMk kcMY+ -a)&m=ߐA` #-7.BA(˸OU'&/aGnڳ7#ΟОZqx~l!Xh>Pu=#*z1ޞį*D7M.⣓LnVJPh`jaiJK$ -.7" >aW~.@;ku2"ڲ*1H%ǭMƖX@2e3MEʴ-L{'HsC"jt3y?+T8ʊQ7,4 -*=dqkLb{\ qP<3:MۇC7Lv=?~HY$fS֑Ri#v_T@}[A,͕*VնI+m - OciJtc2B r7C>.$Q/mJz.7T -T5&Pbb9guOpuŞ`<WGlƝO|7^ړO#"^,y Oy3h'g[/-Z"*cڞ29[!z&&PesN1.իtd:MF[{RJrmΪvKiJ3VGYB|T 'F -ZY!FbD X˂k5#qU fcC LoʽzaeqCgi@P3NڊT=rx6_ s~i|U%=Жι_xP,1P5"DY Tm3fH9ᣡMZFjJ; -I9fT\[qEhP>}k?0MzӑӨf[eX~/Z)XbFk'Ď;I-6Y`ƪ[F$S-'3iS;k睕R]xNo=Kyu+vQvVYvƈ/ä S]05k뭑j˶zfG -F8C@C27Qk*wsj!|Uy#4u~{ZLw%N,cG_Ob'wO]O5V"{^Ȥ(@0E.)%U -1<`x]6NWctQSmSĝSv@`M{ -P/·"4|4dS!2DH'Ojz'@jtf7AUb+vFuy>s wvGl $(1Z"]Iusphm\Ehvˈ|Ro;Es=z39vr.T;Ķ}DSVhgc.j `uSmv*vVҟYX#V y_|oo '6ϖQV'uC^ƈ" Ku'45H^93AC:؂Ŧ:nG/U;/!cyVuBB@.,(W(8RG YF 7rm 5 N$)6Bo*b}U m!6 @˗$nK'%H5ߊ]4jgmvVYf:uh&zRfm+5l<0#kBHZշxޖvm1+ q4eM2\m B۞|\륅Ѐka؟Ck8/y`cߣ jv 6 $F7֭3'hqDRKkgT;ri꾧؃ja$Xrх1Y&ll?kLMi(Kņ:kk̀v:{0DZn-tׯ3Սjw"vUrvij><[й[ϹݰFCK5iT9jJ;n'ܿQy -UݎB\R2TD"vLz[/ Vڄj+ԷڼƄO*0})ù Wz,aӡ+Ge5SvBUK쳺9_hgkgI[_ ^^A[I:\}h 淝syWw*Qʽ5-g.-V5TWDhM;oK]_xr]7q;{m<9zvޓfYڜ#iX!/kOR}'RcZcÉR֫'a 0òLI)&.\VGHr%h\#P*bۼ֍Gu Q|smahhw擊;!UT$^~Th.["0ĖuG~xO,$Df|9daXQW7@|p]QRXm44iKT/(jjkQ f26C&I| /rȵpsy;C} ih=h _CU -+QS]c"9f4uZ#xvVE8hSSuMn{ tMZ/s[.МYM{Pm*b P)2GzRwY>|v\=v箩==., ;}mMG>~CE2ȵ_3{ĘÓhzq:N[cȓjX:BwK W *U Rcȏq^`]ԓրjyRq/QM.4he%ě@k SB{ӱ-c(dBB},tְ^23YQCa.OOTjmNG7_-<;I[L=k7Am ֮{~SKIyfBx:i_if_aAcRiȥCiReÑ"krf6tQ+ Я*$PWՁ=,nΛ4Fy/"-O(DH3aShrXRa _†^'a磕9.;S_`K} K콄и+S(#Խx>*{2"!tRүu84UpN7G1%9=M6zR5T܃DΨN-X$F#GwVMV_u?4ǧð'BH(4WgCǒ?WAHI5 -,~)5GT?Z[І6u6\Hdk<:խf{.'RP};/Z<7CjUbȁu>Y>O]Kr *!n:6~wG ܫZ_5t 7០}gE=,;`;d[FmcNR lDJts@Nk qfDO jMԔnEm>5W輱\|Sƀ]MbY.G?_S@졸cX5v^_̶^]n^T!> BBzݮT{HJ֐PjjB5I>*">t$,q zS am:F*!>c4]#57p/-W0JA.;$o͊9fԶ1Ms H3 @O li*{w -YP;##hgm%q̖y"Aә cba -hsklVϥ:X3!y(pA8sX9$׮OI 4op.9!Bi#yrTO :ɳ{$'>z׃@Y$^*r-:WtylQ'As^M'N~W&B1h@-c KufRMpr㩝q6՝*d"}/.|[1& W}\WAbWgCLS #c7:=$LڃIV{y}jxw;wǻxw;wǻxw;wǻxw;wǻxw;wǻcDUaiaA}gakӢRBfHMJ Kv\̚8[8o9Rccbɓʈ3wb)aQ!sBLu\8w:oLEsfweќuLߟwqu5oywqo}ޟ@)PƆGʢ |%kW3 -jeT)U|SEd\b.cV,a|D&3ҥ f{0%g@FkW*֚% 5沨E( g@RF(BCgk{(䧂 c wX.:mN0tmcaXJ/@'4xY[;]Ǝdtij[Ǣ]\x] 癃K;/7nMtI LA~䘩A.ieKLZ5P^kKҦO` R \`A Q9Jts:VaJ|d : M,F`E 7S7 E nŤR \b\(AVUB R.8rI9Scѡ5#M@\^gݷ[3uPJ6*pP'ӫF1і)M4UL.$m#pJJ : -Dv] 8B81D6tmЙerE\ÀĤDǂO)j&*>*]JuA);tV,en~AJ]ڍC#R%f DkXX?XL4THT IPn֥7#|!Ƽ6٘2լ)&Yӫ6ƪ ]EΗ|CuV`(mI#:[P)*#gqܶRVQmfEWuYgmaHlGL2C%u~RAX|HN]J mj6k-H԰ -$ >l p!F|D E l_)J]`FA[FKUo+ךE;ts1BT H,bUCI94]]|6sPh!$J:Dh^v~/mjR֖I7Q,'H)eJ- b#93r+{ƃ@UiJNc^=D\9vҋ7w,R^'MaTR4c< mtF$I|1*D@WPe 2GF1LbFSjԦ3@@g::>kq -%T5*MRChHzM&a6Zo6C.N@D)_M $ tГ1d('VVcDJhF)plt@Clr]A ]$ڪSNӮ?0UC &i)_lI} ݼ'V%c% D7:lFY>+'eƣvW F6FV=TZ<~EiYzQJ蛈5Nk{}4<=N@;H)FvAWW"-#a - w|9UvtIߠ¯XC| -!&pEd_I%[O"RMThCJ#oV1/S1B!kvu6ƅfs S)|/RQg -h; aA]ͰxC5ibJcP;(^J >Bcr:|0|#š|3t*jw:%$I]bL@Jl=h57MyAXMU84Y;QS{l|f)Eu d &RXn^a8 tJ'03&Q[Fl ݲ6$(}|CNHO8'%tkϠK ]e~B>C :E;ޠUHAG``vMY[o6]1$%WZ*O;A][iEczf{>\\stQJ|-hlX2Ք _G7ƃ+X:ˇ9-jb  Й@&WYR:@BfPtD$`LjK&O44R1Jd:aծM2'NO&炸nE@MBlGs@, INX}4gcȿcfnC.Q9F@a )YqٍvԔ^1DQcCH6hM%6nAX̡-#hg6Tڲ4eݍdb^>n>PYԔ>ߓ@&v -h,Na\924e ǧ ">vZCݧ O:#\ b_6 -僨RFU,Dn'%B!Tbu֔k -dNR2Lj? %#[;rMI U :^\Yg(fӹEjF:ȿ j*4|0NM]Iܶ mםńz+~:Hdxlxr6:鵫5]Q"T)H~N5/25yFvOBWDj.WԀ4DڑIyL% yvYׄJS!XlTJHx TQ -y摘GEޏQ 2;[߅v4R$'Ec>bV5, (UrӉeNVb+#Z̫(H(T`P8J;GSjGj=4>Wu4Xt8)Ru7d!_L@h7X - }Nbr|*x ډ^kl/ov 7[lDt |%bD?Ϫ^`!@AbLC~Z Ri@()uK^5hs&ɏ7H' -OZ(>j_Pm# -:G@! s((Iu0܅APP Gj2ѹNkv@b⣆_Xd!nΧ11/b3@}RP8V&_C`'D:P 1 9?P]4d@qas[%MvÛ-42IkNs;?MN?^9,Uv+oUu -ι#A&|`\z@l9P#M0(a|&hHR3fH㠶{CFeCRhG;Sg$Ɗ 1# *۔#j[Oqm(J:]" -j$n|xCC5A ?8Lra3ui_ ÊSj)8c6:XbLښll)H*H]OK7XnQd|!1Snd#)Ibl@R0%-'c>|%օRYqs<9Az5Th^P@ $Ahɫx@)is5&d.hP' ^ ]mj' MhC1~[$> Ҝ t%ڑ4>~u@+C`)€&}jbQy J^Ucy -]kLX$14W # z r4@hҏ@@Hj\pͷy:NQuSozV=$ r -VcI#4$bIW>(7¤^I!(,A&P_@ƥz5TaZ;hvE5CMF;mNS?mq͗8q/Hb=R!ZǩkL7}j%U}lHl8C)7ll!_]w?rko嶭 O%vb 4[(v..;N@n^{?9?>,r;9=x}!jCpFDmwI0,e#7sq5*Mq\L1ds2R2&YB\eT%^?YɆ2. E|)΁y?,p?D4r6C ܉KcŘr`ii;8LzDܙ'|ǃ_9a6 'ƃ"T:<^a8&L}*ك`3vIB4׭)b wm<`=282='*`#u}Hޣ\g"=yY 8 azs2C%$D?3`R(e`r}g 0r38~60W' o.d㎣$0<2L*J Sa:L6fm's֘<90x]*DŽ?+AOl4  'gA /ĺqQl; }JUU/3u{"}Ǽ3x9Ĕi0qU脪\XF2؇c4q할ӆT5=] [Q^԰L;0s|u:I {sٓ$|xc>L_ |R약T|.b*ku~M&lTp+5aj[ȑ0"o;jBK _CrؗqH3`B7ئx*EaOV3[ $tFLK)rX` b`t&Bܒ]i5Jϡ6%vH&[eIs`2+ _.qdJl0-n5ǂF&;:_\› LDr X -^웽|"] |66=`3LstOvk\:*Ͱ^w1'BLܵ.YsNY* 1 -y%0QM$=Q.%))G@E&scWkU6 &|0GdrL|䓰=x__"uPO:LH:O0#2/׃!OIƥä=5(}!_F5I"0&sJrGFQ}D)B/J9]ɔ\٘B?"t&f -Ϡ~@84F G228ėr96db?s; &rW|QQKG8plmD)"tYk@yP!)"60nPaS)b:(E)EX]>0zE]8ȑbN9OD7k)(1qE[Ud S9K&50;aHp7P3%L͒ ulaMjn "Nӥ?hے4O)'<ṡE1Z b JAa}B|v|AIг8 -A8_@Kؘm+*gLlV*Q-,Li8 r&oBJ*ved,Cbo'KZ%m^ S29, {o TZE0Mʏd) L>;|@9~]ʎ{%3B -۟O w&j}'R{O $(E$UhJR*u("Dӊf i7=(EHU)m@)8Fn9~SCI~9q6pGF u1qG@AJPg4WkH8J.81P+%~(D>;zxSB(`p:RLFI -&a?xOuk>ڹ}7eUȵ -WTP԰&g BP# ^jԀc&`rya%23IStG Jƺ0%l\BC&S=ӈ;pa9&~!Չ!p$GpuF?DEȣ Wۈ_ NP -yx -8'žo`"B0QbUJ6k`:?mȭ/4_R[^'^i5fڴMD)B*&(E0ERood$@- !EԲ=b QpPRĉ" e*ҒC -BMy&x+Yø /?B8m"6uwSNӀ<}L&MT煉? _DAxa<x9䏀eOCZ.;~i(YA27pW`;}:p<ا@zPAGih ]Sd"PLbLҠJtr(B(sPsiX4X űm&r84*b;ڪK"PTS)pQ&KO_5!>O4`))^(\!vϑsSȄzpO -!b8$w9I(>E0&f741jR8lB|Y!wIA`ʩwfRK"w:$tfu^1j<aCCn#R`bI1/?%U+eA$X&\t2Az{b -4bM&DrLHZH@B*v+({K@0P* -nm\\:p6b*!Nr098R㱾4[ThI -pvmRgIR9Pvת +eG}-h,H|RJDAI;@&kR) ?n9mTRQb.^GSWZ4@)YYAAz(EM"<7}1伤nRR$*AI`>BT0O%Ϲr .J !ڝ?RڵH L'}%>LL.U$0Ak>퐚(@-8: b$YE[<~u\b Kb%kk_"u_? &3M`z2  8KُCeg%}e2%jG[=?8.a²w2s %lP -KT'Ƒ\3G_/ |Q`r{P7LplI^&ݠZ/v rQcv>P8T2OeG[*aA>76&ԩ DbkeG{KAIiM&N S\D1(B6D rtq1/J4毤.?T́Ob6}m$u(l#ʬM0WIR |b#s`z/dޫI˵% 廘1e5W P>Lr mL(B}LDԓ<σP.){Rl8p36Q󹶈(;_ *Ҵud>d -Z "wf81V%ޯ#srǐcx3j$V<*v ң +@A({ :69 -U%rPu(yaus0#!2|pFcf"je.aזB/ ʎVS+@U֪FzCQ!yز-3ķ'u"~(Z`+NQ䬂dPJPO&%u|w%R-\ =*Ekb=QRog,^n"^!yP:~y,䑉.󺾔A8.ٹtkڹKc(׀K 0gX.d>`+Y m.(8̈́'$3G'PCE䈩ɋc@x(R0vP!OQ&RQ$8()dJ+Pq%~/א4>Я|\VLTm {@ŗn~Y/@rЏÄg2;uEUŧ&ЖI$v ]|bɅD6tX@@R?<(rKB㊐39 uqP/ᜓfAkȒp@ z!7(ABTP|.Ś{>b*yЃd%Ve ǾD^ -@0'\Y5Ł|%Y -8&D\O2 /% ?pA/ցB_bu1(x-M]@rP#=fTzԭ{4K|b(|U24u8^1iA}To/!?m(^>~򇢄mPbb+6ӛt|6b@ N/݊c*ab~r@̑z[?XEr>}΄+\NK Wu@%}'ܩmzXYiyLrNIZ!|#<j!_zEYs(r$8j9\pn7沾KfJ @'Lc\fSakv37z׾jѯѹ09s>iާJ4엽9)}]}&e:uw[.&,y һ(AsHt5T)ZC[dJRItQ->0YG1J:rg$A_P ؞`fv)=ZlbN*Fϥ41ܰ*&yi.*tz6QA=Lus)ɥ~;KG&*&*a'ҰIo-l0#X^#oSq[NVuav7 @ SwbPߵ٧f?soڎJ6g7¿+SenIn7dכsY:h n5UIYidOr*-Ȳ(&KWѬ\ ׀(,+%,nw- Ħ铗f5SIY g+2[\i]~1w -| .PJpHD&"O1tBxo!OYٔG\5&x-"77 &KyKqKl'$sUZV ~m<0O{GOݭU dZlR.{¾ҁO +WjhIBJqseh斾@D =Nj5[8.I=m#yR_Jr3ڭvuz²x}ԝF썏>SN+r${RYN^?KڢmTj׫.Ƙ+f=׊3[6Wh21VM'7RKhPAJ)\entR  Gri7{u@ӾGr N -ΩK44I1 5e5f܏EonN=*7_0wdwFC6K^b+/>ٝ2.Wþ`ϵBs.ES稢L P7g'$w;rV,]e)zN#.S~ w1aD]4$w%|΃ -7HR[$)tNMa QlfAj&oxJuq^['mLU}9N7~f{>1=\d{j%t~hy')QʼGyHZXk+YwJrI&]enSrt\k'*T-Q|v<w+7Cr&#LW*EݨdRZ86v@`.yQ}H/"I\8[F([Um$_WDYܭ8$S`cV\7";#[ If)*Wu18qJ/\%(ń*ftv~z'/%T}K5goL, )uf!`ä]M~'V};>uً%GMį3iITڼ_ZxA񨤰gYA"}'mV=ˎNJObgfֱEs j?OxSgSQ(t_4^v2EaNb%*r񂸿K"ȪAS?SS^6߮f_ëUk{guVf/K_gݩ3߯4Sa>lr?ȩJWw\qAɣVKwCA{l%-+ t7_(=Nky%6yJW=\cyн/"܌;јs6>luLĩ͙f}l#BGs$Sl:sOҫ bll~ַ-a>ڞFm{)h|0k=jgJAxc4ҲUі[ gSS6=7-j%WM%>~ּ&[gZV Zz%3 -\T{"H}weZv=PFl29nSx{I2l:܌H{}`l9]G߱ueӲm?vQW -B+V}cVmb>57չJk/|.ke ێ? n"zIegDU5ΰ'{GH*/fcV$oѽjFCGңK]b|.ǹUğnL%R,/+컷AI",z+0&{4>׃e\`:lf>d]kkD=.lNQGYYQBNQh** -AUԓ~JV]vӸbm~Ufšg=ܫ+\=eM\ꂒ.^ sLp -ˬrQ~;woQ{r]]LQqYi˺7Orwzcᾶ_:ژ{Jƫ Go&*χE~~-ob6N`rɻ{ -#v`.آ֓?5Y $w^{lqgRRâ=+}kB=CKnWۇV[ן ( / .,,_])vM/v />Qe*PWc81/C&dtK$~4ajI3o_ɵpVI?1}]ϭޢ`0^7!%ɫ:"oxI[h6̵* ѷrƌ+{۟EȺ u>:q'fHШJa6uAꭃ56A6AO+.fs\ZXY%`\̋M{}iNٽKSEnu~'E}TZ4A$}زO4_,eUe>NaaEWh%z3IGo&w`_iS*Z3;¶!">9:-DSF} VrN[_{OtLs؍ -ۇ>B؋B觅wâfK>6[<y-GE֒u p6 -/b.t+ vN(t-gڻM_BA=O%^5ؾ.'¯w2| EO>Z;9/˯?D4HV\Zrڭ:( v7*BSKCV]-Nsy'Ť?h󏣂9''Ѿ嗣b /GM ?Uy13L&i>PO-~^~gP~!#xcfwt?4R2 *V῿Ve0Vic~C{.Wjr/2m0y<&aCdĆ5KvWݢc*]#:nʟ6l x~//zO9gbUTnp# -sI~oq1|::D?r_o„ƫ9pBqiB)ڴS߲nމ֪j뷣h1Ri]x9Giufۭ!܏ˆY6[ԗe*hh6$4_*gU3;%HWzAAGeNPF3t[ũh 4m -RLZ*GK &'eSv?VbQg^'ޅeu!$.;ЄRbKq o=n=u yw1*=O¨_3=.ꃣ6 g(Wenl:ޝNE/jo{oыY.8櫬BsC*S5LAc(4@#5&#)h$j)a~hY ƬyG\&ivp3b_L[)`x#o _)?YV®2qO[ ߰g>ay^ay^.G_H~75ysXNsW.wټ]v)m徱6/Z/O."^5|.()rwoZ<}1Ék_Y(|+ ~j7AMǢ -cWSд {.ϊ>7yGI{}7]us -I5e]YID}ko1B~5*yGCgS-@sqZnSݙ_G>sx);y.o^Fu |RP_z)" RN WV -Vi - 9rK>s8|Ga:MCG3v[#UZ^`/%Կ;HSz8uˀWb?VGl -gw-Ř:xZWD[da|!84li~0u}֫=ܙ>Hϵ ohhˡ[Co+D{AS#^&vx.9*5}sd 縆7 J"_u8%"3BQ)c&_`M#ӡ}8Y8ch"Z~ڞ2[y)Wĭ/^Fs+sM*.tJxPk8ana{;n_c*׬/{:ϟ?' (BM4 8F,@Gc #iSwjhˁC4U\w#-a8@Lw. ~,5{!- 'W&00[ ·Ӻ14;O;­z24Mqeo_`MJicס6!)ԉ1aQ+D|4u4hڽhY,~qЪъ+A>ñ[jcGZ;wWJ\z˝S㊋w,U)AX/!*h`%8qT}l4eb4ir4i -4yZ4Myc?m'KAշsR1wcD;Gq+-r~swy؟|ߏxk,]^_~|HهpGFxJCxfNZGӕw Ьy&h)BS"E,Z:4Q˯~x?7;alUqf$py`,Cx7xa=([O'a0|CS#Vv+dhѦchz+|F3J̹4Bf)JZhƌghcQϲ~qO}‹Ծv+s1>uC؇"Ǩ2*j"8z?xټ =?`qǁgogcO'C飗"+o^NXf4}64ih  hmNQ+0݅' ~c -#W\RQRf)tel[~q3}뼁H5YQ ) 4d18b2RCwVa͜͞Ky;|m@VAlOZvh 6KS6:ڒ $)m~X>`-8z Ʊl -9$>Ya*^4m<4i5~):yzHeRYi9owBB=_FQ;ns5xuZ{L z~{X+Z\'E*l>U6%T'2j#4sRh#h|Lw7֍rVƯ(7|U^>!y#z4 -*5:˝ So1KOh.^:>[ -54u6b>kӷ3vYJHy1AsD\JQZu Gak5A#<ږc|~No,hguHH \Ԃ|ǯ]#?Lc~}j.w_*4f6C# ʂ=M4ur4kRmk`%ZDގfa9s -|A[gl˜YΠ9%h)dO˫i~wVac5{όN~u):c W, -ÝCKJl{lb wچ!yJhT+9h'3e5~S~1IGm%{Ҧ KFo>hv 9]ռ''KEÀSa瀓|59; ! ʜ;P_5O߱rO@Jf" +ehIAr+]~:WhkC;4I#GZOv› ~wݾE ,a".<-y}#Q4J||gw*JNAQo.U?=ȇI8|kO*4g9ZmV3:vs.CIo&h%qXhY6Iv}&ew/ O>: yʨ &3ms~IX -;; ~t9 ?ւA&^* ϻ0h |9B[e*y'\?nw!eY7؜֢᥯ϸglu~q2?|8vМh xJGo4<~o\i ^lCcyl_(76W2>~`g;y5șgP;=&{w~H&CWth6fnD(Œ+h<"}_|4o7-*MQK:3GY}cU"bܮr^]#/7̟2ͰKJw3AM:Hudtݻ%N6e$[7D'Ή?b+^2|ȫ⍌֚!h -G+9l7%i8h;`m3m?mk s#sK^bqȼ5iq<ǀDvXZY6-qR6b-ܡ)g$ vQV~գ1ge墉*n:9xہ!i0Nݙ_W0}ЋTGu`xW3Xme}^b&lۦV@kgD:hϱ#l쵿83EyrPZVf/|@x=_D}&RA ƤGy?>/ҶDCgB{06\z,D_-}8_(gsԝR'r\ ~O *%; -\|~?kI:G\jxuo,[S_"KF$Lcb+3|EZv W$Y( -kLaTatZa\z::Q Tz&{I_9K,jI!2׾fEN3kZ\u!tK2h_~1}2FM桋W# Z ..|t{uY뼆cd^# -~vO`h)h7lDFjZH& -q̭Ch7)[2]YxY^HڨgQ!"p3EtJN&jd(,vUJ|Lo]C4S[zϚ5z y 6_8m)l~{ غl}':9a.2X ŔzBڴ`ڱt2ک̥{:N:8iIr;it›+~TkN -:̎)(y6c]-jY'wAd6A:vac:E\g@ei 6_/1NT5M򻌲~l6wUkz<~N/o / jywK^ߴ_OT ; 59Z>A?|r9cn}3nפ47" #qV ڠ.:4D(GL#q1,{FF<떬30Di jp(k ӗR6,=eOKKre=\z۲]кMׂOɻӂ[i RZPB.f302,ǘc[}3Խů3 o`:DMȐ켢lx-} ھQ!u]|=پk@F|\A[ilۉtИF)-ܯ.gd#wNRϚ"ȩDEaks}G.m=aOa$Lj}| uOy&&7oC4,&SN SLn6~:}6ulNј>``wlDAc5Ԍa̛VM in݅4lCd|%;HtqN^/wd -/ccaXI0Qi )nSWRao2zi[sADzD¶*i#$|҂Hb\Sf6KYav 8-;_L~ee\Y SD=G֧^9 3>c)sRۡːHrNqNQcj07yBwh^mx-J]נ25yq9A=8>? , -q>O]PZ~ CZ6f6 X$8h;TxvԾC3wjPBب>cNV -+ύ8hFY,>znJ_3ޮ2wM)eo0f sC2}'MwVO\V 1^|ҫϠq2aUK؋*tՌ%',\.(\ej>Q>< Z/ߊj"-` xRps+м1h;̜Hﮂgd˷yf-,+?<"-%!3똤;DIe[1^/)_/YE 4m8]jR 5[ٴ^\JCEo`o62E̫6 6y1q 9Kxm1}XAGAtN -Oۧ΀Q0c C&`[q×JxnڧzYDqAr8'x~M؀^F%lew2N-2oVsSiBds@ey+o]!H^?m1Nt~sw(OҿfRR^ޭtn1]Mx.zZh5Z1y.8ںz-ڵk50Bv؆)[3A&E!a xFf-¬?TP~\kU.aҨ3Σ#2 .1s3׫E8I22>jQ_t0:r3CKt[k2g4#i= Es֜^ko{F4[z3]tǝNzoPM ec\mClygNF JҶdٮq޹s`^%;Ϗ_vZGBm#/;CW|0s=an 'C8ɭp;'?EMO<~y5/T D"y /[o w]vqE.Qp%;-uo-~!x1޿z߾һjjVnjMuUX_iS1g*KЛWLߡn -/pvsŘ'/ޤts%vŁw m|jxd\pD;\䅔Sn/˃rI. z1ogw'㛿T5e=|QY|O텶~gbxgk1RٗZ7&z8_7нpj6 F\\ !hjdp#VVZ2*zݿ_ 0Pp0K E4gM?`9qr=҄.Al?Ic9)8g0Yg2k{R[|WB; 1[(V> uH]է}2۷{ڹ UoYUwG׺xTxӗaqHX0йy}񨙳CUs K1t2'c. ~*ʥ;zMxm]ORv)̿Ό[hl_C?E(C} gM}?t+J~^AORMm?qjkn^1t"y׆3)=a^7[NSmr{˞Ni֏\Q[9v/\|*oy޷( ÜJ?Gc4<_ -sOLpGUhg1K}]V\7&nsØor 󗌚3l7Ty c Xڣs 0N\8% -߽<ˈ|!*oyZW6Fˑ았q(g0!f ,XS#~g={g$ߝI s,>\ĸH;姢 }Z:CAr@̳;\8l;x)Q6E^ȅqX+Ou#8%нzB(OQsЖg̛|~skh[,{[Ոى}?O~Y6Sn]?qzwD@[?C.[xR`N/ dkUO1Buĭ7U*UoSضtY4o7xc#0'7ߚ5*q^u m? ]/_x3}{<'[߂쨺*ĝqSfjBH8eWz4bsɓ1/&UœPpU`ޢc7\Zb#E^Cu|U9)j˅UDS351oh澳5{ߟ)\ICΈ>ICd3~qpyɟ*x0r䫹C_gi8Ĕ\=?30gߗWW?u1mִ0UE=Hj})$bɨY!yjk*Z^y9h%O/y/_XT Gxɖs@sϼ~n ->>QanЁj13=gxz2y=Ɉ9|L#gC5A?zwȍzrLomW!!8!&ssl$;\ޔ#:P}QSanlᇿ; u=; --+z=7"CG.n4= п=5Ǎ#|w^d9^#=p} bĦEG`5B`^wO}~cd8jgi&a ޳ܡpkg6}]ӁfB,>.yoX{R9~cK}>ۛ}\6Fh6O쎬sYӚEy xjx06e lz -u)^j˙M#:9n뤘:d3{q<Vp7u:-X~J}06iU7N -@,wŭǗdqmCcG~(Zs 9"zú?SkȇΤOߵHzh~{ooV<<s2Gmp<^ub'b^P{jT˪.i^ռK1C=2bvݜ*o&\ܘok埼?ˊ9G s?r*̥c1O˜yIir_#{;ɁÿzӆC߹޿xX̮?o0z Z s>=D1/bŔj;c^u1Zx -M{?ނ|77#Axf}7aP\!rU_ܴYk1Cۿjל~X=QCˑ}K1[CQB^p6kbg!O͡MGv/|Uoo}n8y1 ׇo<O\S-Cssh3}!M]3_̊n zCwc#h7 -.yps1%5y=wܘGЎ‰]gQǿ'6dVˁb]xGà{_ \{]{o_xGS>!g?[}wq>Xw<ޤ{I"w)!>C࡯!ɬW͜z1~# ugӣ.n]A\' qEk -o;9V1/7ag:O1_ȟn?i]|2bzCɓE#1wSzÙMcr[rJrڮ=r*0F %FnęiX!lMgnnYwV*]mlyѯf6wUo1s* rqo}ZF=̗3/|g?M&,ل3rEmj#쬨;b|[s|+iY +m"6aS^×ag{vVϦ91`H/-Ě2Qjo?YwrlShC"|ӞO|5q|r'6[3|נ<_>{BdG1nW31c`ͣG_l?Mo~ޏD]}p+iq6=Gs)n:woy?yƳ_EЦ!f/=|wSpM»SC6q捨9‹8j_*ȯs+\mw 91Rdapa/xNt͓6-١᜿De~nm EGx&vF6~ns`_G}j/?iӛNĻO /? u4bq>]E>y)`zh dzG2bP~_uGߑ#Zym~4Z)-~ԉfՠOkĚ1xn6[wKkMLXN`3FY?>mb`gt?|m /cv: ;;'}i^7mO9]EunӺ'/#</xڎpS { ʷ,y|,֭1n%&>5ڴ'-_.r W <#<xTl'v_5zdJD\=9pU}8>r'Rj#gD;:#,w4Ī6VԴ7<}c\Nئhw62 v1=)_fvGyΚg%C-#;U; 8'Κσםݒ\6n<%ؖID.-F DPs5{ÛCOF:yAbTz:ρ>&|^8a H ~ڧ/ -o`jG/iZf̝v]زG&4O"{~+v᷿xo?vVp&v֪݈ulКg/\݄M}ՄɈNjbg ŧZ'[FoG<})F I if.Fl*qGx>sI>ĥBp7S-sWGA5c,}*b~GV>y/l/ 'r? ݧc'͊T5!&s*3Wi72|q70w=O\gV͞B;X [XW>t.2e;[}M/; s'1Yݧ7vȎ =l;m^iӊD| nɮ#|kWC6ܯdvo!ПKW?G6{'=q_*%jznEC/Ow>B2%:@kN$, -`|n><^ -?]1' -ZoߴzkGO|O7"5w?V\i^ bm9:!N&P׃o^xvxOѭo?yacT5K/ÿ?I1[}Cx/n?dcU'bKO5]8EF7-:.W-@X2w8}?Cw4@hB #\7F<\ pNWnZ˜/fߥܕ 3;zU+_Wߵ Rd۫~al[J>`M_|qM$Е;:P^\%YM~p+-Yℸ!;kþ+(sw c=٫z^bAġoTwH1v|Zvt"Ap` ݆S0G!?-W>_l߾&;s>M.[sV=~;t>#p7S!6.{)%x<ȦWy&G<Ӽpd|j° q0~p{^o *OcsU}#_'Yu 'OF'<+rߡ -/&Ѷw)"b{ZTp~rbm<#~wRpǵ|Ī}Mw8ʸ굄B{I刳k.Yxܳ"C\q^8MkMi%ͣ#4=j׸ބx\\kCʬN8=8/3*o๞Kgȳw80{p pd{yS_k 1o#u۫|!'.F cַg"~30l/_z}Ȳ 琟rc5=!?}= 8{"#0U۴ϰ\KA7d#`}Vt %D'<@v׮0ԩ7q/X?O38E;Fy[4L_*s(ρ{ gP*[¿7h -K ڇ^&GĉzZ\:{kxhBE|cF?ɻqlci#.|=9ޟ|j_Qަ0@*9.a3~3 g[my~|G/Gs˸Oh`6<~=0Xha'bo{ -.j0t v,;=r3 ϐ`C;]70X=:qLBu~AH1gFl;/訽:Lo@9KnB?cwQ'~kl(tۈ1 2w V= -ia,#=?B'!~(:/|핂Olg~7ߣ ,n5EGxeOb86C߾o}j<Aq~E}մfed^MsW8U޹޿ơ?Gṗ~9al8Gf47tOsBG0/9An<HӛϤvӼΤ8|q>8|q>8|q>8|q>8|q>SmbƎ_3KlJc+ό=H-j2il"e&#qskRcRDЍPVi*DkSIςX[zHv.]ٶiʼn6N$j-U..%όuwu%b:{[}5Y "R锍yi)S )Jti ǫ!C(䐋Z%eȝ\K\KvFxri ]}{6f`8svP4C *7b.:gk(J]BqsvBsv2.K6XPq*(k_锳DP;"9s\sU\ 5ZQz%z/h60ec=w8rԢEG- XPvԢ{Q3@qaCZ):Rt\EG) xRJѺb֍KW.3k#H$4@%3Vx{"/wDzHyJԭN_/oL#s26)bE?w;~p7> `ֆ2D sֻȽ_$Ŕ*Iy_65+Dw -ߩkMwt gTpn' A9HїDJ_T[r{ފbmtW?y%1)#aQਟly(Idtij6yq"an+qCh`yk6f463U&g7ͯa¥q:7Tn>D1SG~%T2ʜ%ۻm)=VP"eI]CN,'%%L_,,W6tsםic TV\lL 9̐܇=wVNgU_U8KbXK3?e~&OM0,>mb~zD:Nۦ3TG5DzoRply;sX5 -kJ3O•5GK2/_MKZLZApZCASn+z;㭠3ӗvVXlN3h%’bwH!6 mvg3D9+QJe8+QJD@ՊNJ,E RJTJ1Z*]],NL͞PQOXktpZ[wΊ)'Ǘ#;j(V.Nm$KuwԷfc9kr؞As hKe|`,YyܞIw$rO6$s1Ṳi']>r'W+g[2ikz/~k[@ NT;akDC<#lVePdQA;9G+b/' ;:.wԽlM {eNYO9:: ԉOM|Zzħ=Ri9F*;<-J OQ6'@uT'@uT'@j5;BT[,UH* kNZAj nٰC=BڠTj&J䑩 mHI畓۸D8>stream -;iv7T`,W.nK?՝i=1[s^rqi&y*e>H,_P-Ott4 sœpeokR\ NUs^ pvI賨[݃w {D9ב_BEpdCA,*~2qėX&]ES96T]?*&۞X9.G6 -168ṟcR7ɕL`Vv"ܕژJ-(Gu+Õ>,VRRUnC# R'b}3)%M_mrJϿSIZf&X+zSsN 9PφG*3bd9Q:yXzTT)f^™z'Lũ U!~w4pyOPJ(~rFehm㕧 -vXj‡?t 9`{<3#4K@9W)ؼdos}3PF5xqSN6Vr.ġ1gVHd8TpD3LR]6rOU)0XNG\QP:>'dM2gt:'zfcAC7f˴LOzD27jZ(TNHY;znVY1/&մf3t2Wp &>vtwޗz[ReVUUVfYUQ%Q;^KYx9QP Ɍ(/rXPQ$NDFU^8W0O1Njm!ЖX5ib\m`Ռ[$NQ]VDAtuܬpYU nQα,IĒZuKJZ(hY-)CE -sa‰"~݌"XKO^RYW Q։z[$N@s -PAƭ*`Mus(c]P` XͲO7eQͲnx+bF )nԪgAg0g}8h*5o/.*H*'V(uCLWd9'Ir6L1uMPD9*ȋAQa'V(87ψVꆁ+x<ԎȪgݼd$)H0sG4ivU&숆ሠj=#VD9peUhBd'JAs4D,;XtY0Ib܆L L\EAiyf6hʹv c`YóA5JNĜy.74q2BY 9Fb*$4Lf@EQvq -\[M.DK$`h' h-),ԈzÚa n;ڇZ X<5a+RTy gHF3 Eլr-E4m|~RLiT:h9s[\]G @ہƷ T@6h1͇> -"PoߒBGzBM*rn&Ԥ¼T$%&(K~HOypԥAW^4`EiF:ͭFP5c-B"ʚ7R:{diEO>0"Ed#Z%YD.9aɅP-UPhGYEyŋ)GkSYY&&!`.:Uac9iMjǒڡ|,b㙔I&p$fǵ[D=jQXW6C;F RuMN'ne݉6=xF +Ĝՙ* [ƎVaFzW,ڝͦS- ^׍BfNB6GƸ U0,s -}X+tR#Qᅬ;.)\3VC_CE+ǒ H_Gkx3'0]T+: -K/yu Jgt1$_ч`"Moc0m|{el -dP59f7]dY-&H9Zf=vQ>GVgn:/mX["CH^b糖7X;W8 hYaW,z^beA/Lms2P|.Safpʁ5-S">1UګymvTSyå`,iì:}1h27Dgc:xrk?nph{{S.:ﯬ:JynQTseUE(%pS?1-9YWm,f %JN"W}Zs*fX@a0嵀K+nӯ_bx GEƯBZMѳ<"zˌoFMNt-)(ҡ}A9l&sTVݫ浲RkeqAq)=@^*_MlZ7XKuVefpM"+,<(spߜ), -2 3Q9UalJhst@]ܿjI0h_YP,(v <$F` -{ -C-.ED٥wY7גט$࢏E/GoPBᓘ+rRhя5!2C^3oIA`@]R8F#Ύl|٘eB\50f1e~a%Ð܃0z/[C"U10GNg9ft>\|yr,:F1z+W_լ1Yc0/nT3gT?ȅ,%-Q#Ngat.t;<}̲.ߌp/߃"s?~e!Ò){ 7\?Ekp/ZQslGzyBo38+68c9۔JrX%AY?2jc3- AQm6xϱlom6ͦ⬈+GwX'>KYĸUd#Y^4 q%s=ǥ#Q2!O͜;>,hGb5r؟utj\( H,lFl5rWq{}Fl]&Ygd_ [J*u?ޭ L--U?6G"n+t2T#UKnXi -hB\Wap&5WMaP'jQ$Km>ifmU&]A;lFRs<$CF=eɌJsǓNimhLgs7JPJJ& $%$XZfҬݚ#bQV5|B%Rn4UaINCAjԀU+=GU-)|`ŨU2 YO`%^a/ -%2#dQ#E5^! 7dAUnUQg:H<>eZ";R}* nŃ?ZNmYE=jc5UպL47m3m0&t3(0A5f۞tI!hKϋR[!d%t6&l9UQL@#i(N,T;=SWY-B_4Si՞z]S%YA*j5+ϖ6_YjN Hy%-T,R:mu*rZWYC_wB$_EtZg9Nyp_P9^PW 41(81EhbF.pgWl_  ꝇnbsZHL+Uק'g Re)"xrXð`?\ɌD৷p`_ olc 9ܞ4hu~uhz'RA8mSڠ X -֭kEHF>|ZAB)nMPq:x h.LZ+r2ϩ=TtD@v CdT&͉u-Ҿk)Dg'k,Rl'}Z uM[OmTH-228ǷtZXRn L6'(g2Wp.R"m _\MHnU,3NpѢ"i<5hZ, zSƎ]?~lj;;W ͯAjl 959wMu^| p6tvk ^{%8T;S={boFqn9\Fjg>Q 5|!_PYԼڵj -6 ioTprD67Ѷ u *9.x"8|qP%9r[fhG[VF{w32rtg.M%smCxfq|U{T-x-Bp+0(!s0.OAt NX\W t~Bd:UM(B//V^4" -(ѡXj ze:s0PL"/֚Q=|YMkAXQD74rEM-jEm1AY-;$!WQWPY٭ƃT%Eo=.Jq ZH-[)fs\z՛fFs=n2e1n%=^ 3M"Hl,DYPƪ 9_[TTꈨ00,eE -3R`ҤY$ifզ4Xi*I%lmz+dtI$@ӕ'I+Qn0SU=ENa%a2" -q~+ŔehH՛1[i"&2Y74D=IHF.bQ`|$9IC=1k"O+ G1$i!$GDVsȵ"IA<ZkC҄*FlPhy kIl,y2%<A,ZJ0g!f͆ [g6"<Vzm@Jod4PhUղ'<2';p%Mr+ĊCv9ZNvVrhlxEtf#-391h9^׆ -djVTbF lkY7(,N-!_v|ު.fƬB0ddg!f͆ ['LL^̂&z͖kCxR2Q(EUpIݓ Jug\F14Ø+;}uxH$y,gzWu#E7W Y=\9Cf9=tnUxdL!莖UxCfᶙ ά Xg,³4M!Ϸ -OoUx+f9SF)R ZgL \YgxaVYPw̚k Et9ƟQ)Vm`,hoTm!)_ޤi=) *:13 YA -ϤYgi<UR07kvM[ܴ5D`N!7m{)۳H3eqhE ":Dz r4Ϭڐ|fZ$gpb ^˵!w,R3HsCdpo8MEhe ̨ոH$f!_Fƃ-2gA2k\)|"-d𥘆B,ҽ) QqmI B"Z Zde4"+%dWj6dS*EV`pyEYޓEXe=0V",-|Cyi Zs׆zʥDfmc5jL<y׷?Vk|s>CUf@?`&hW}& а -ߑ6 oJ ;=)&C1IT0 v<} *Zԃlc/+ "ɰO(AUEmy ET`(jcˈ8+4"򀶍IoOA)y`JTp_qWD.bB/O-} -z4|¢Ezml@a-(dxPEקNSKߟ# -wQa]|jTRNRWUDj}ʸ&V>m,< UEIG -7ng!CZHVʧwu;^T`+ZTET;_E֏),PlYl˲˶1fq-S7re^v6ȊHo9PY|h3x@{h9?:_G+"||h? yl9/9_j8v[4ى8n+v,r]1]"r+K6,rigq$qj1x!x-cU5\T:|E(j:  -FUʫFO3EV- W㫁Js8TD!rwCj:$cȌ -SYW1\7Zr-1oB(MJkarRc̮|c.Yv5Y6B5tL}5y"QLAbⵄgO^a^>':;y>eXzDcȘ2{- :^z7z8hi";@勵Kz~$kN9tXf~9-*%7Ѫs3}i=` -_?b[^P[?~<15#= 76!9WVLD|cMIZhU20k)揺' -R+  gmti'E>j"|6$9R]j%ar.LլVpS UkHdVU79TIBQQz>gc{6^q-ʺ^/j䪭Rm6Cd)* ,n^\!'`UFBJZAd"׹si'Yk]6v[yZsAH3%^{tNˑ8Y۹+RNռ8ȑsVz>Kxy"sί%tKd,ml% -TjӮܢwZpGAQ=LOh6)WEs-ZIVmFa0L  sr1@9hAŁ/D[ -mYJ;oJ{TYA0J+4ߒ'SwPŠ,^&ua:ڔNrxFX~W;][q0YYOE _7fT76^3ܢp6j {?_2vn $'=O卸˵9$u4Ls$o?x!xHF}5;HcfXs y+>~e V -] JQ!\A~WD1y*DABla@(TQR]_QFɎR)RCKސ^\0Ɨfk2XK{@)~VdJeQL9z$k|J24[2 - 0UYT^C D#]We+K8Ip-+<9rWuUqYʸY) 8CI8MZx2vNM~kHv-fa{让9Tl~<ϴϏ.X2{չ ѪILrά՘NM*w ZZ!mѯڍ4\66h-I)],u3Ew drYNu'1wUȻ--.'zs@M,Љ+"}Evg1 ,+4:mm=dl$lhSmm6$ŅN#" -*J#)rE\`deU&L=.%=2}3"&:3iJ(`<[ST1479k5WELAKGM}%hcҒ=M]ַwų_zb¬dBt_94A'Մ۽9ZR]hPߝ.#]2r 1;=<.C[ Z9EbX^bxceCr Um* {U٦ +/0HB>FYd龜 R*?(c)lêX -X!8M\(6w-s?Dk'wkWо6I3]1gWq, qaYwWs٪QבmT4EaJ/y2{yT,z]L0Q2:8~ܐw+5z -F9̮g%!aVVEH} 3':8DpoȇxMpU68 I,֕ \턌3g0TQ nK_b1c?vbT - cwE^´i x$rI1=x' ȮzW}UEwu/m_\5פ禳T:1xkS]|Dk-–Y)0if0&Zߐd}!a =d>eH@ТV{apkI$9 1` .Ib.MmfWI$9_Nj7R];UXG.@@$A" p鰌")E>HBuA0P_( xI:Jn>p=IzY|{3Mv>\lWt1omg0ZUf2X\-Z柙}~b:R: Na'mSc'KD:"/T!jӁoaJƸ;X .71DblPF)af?W"zcAUktS;?VCo0en_ҪYs?r׾ fXkZ;YKl}Co לS~C! {e,@LNgߡ3/qE3 ZAt";dAht :;A: AN ¹"hu&-GTCh+LNolE ~Qw*k0+ZǶ-~߻)YKt7U(Ŷ)JzC_3(@t|skpr+W]elp^5!*}j}%ǓpZV~X[= ~ķy`\0"@1@U /> -UEA -< ;p8'LHWVxHpYBgmt>EϮC @|TB^%ruV~;D~`=a񳸐$~a*ݏb=A2 eA"I A 4|y,~o@G3x~I Q()!U.$#>UޭX7R`Y0|*WyI --#]RxF!=z~\¸fDɢ[` ^ T JpiT#a AB2Bu ?0{Q뚂FVG ё)@q∇,q Ғ0J)BT@c2 Xi\Z r y *K$GaA d@rc@;E74i1ѲSa$@"0H00 -$`$7H0D= $~ PqR$%+B791% ~ ~L~1 -Ks֔BC4D0 #H,C0#_-ot7? @Q@:H~s^bi,^)"$B,Z%C<Q_ 6[vJP Ž'./]N"H%@p0`i .Kp b -I  xlLJ0` '\\'~@@ A34PU0'藠bFè1*OIL|>06̐GGOƱX"Շ& V^?>&KrjA/2'dN-v 4 a@<0irl@fQ` p0840J>rp~qN2, >3HH@6!Ʌ/03I%X-Ak)F ( M0| Ϡ2y G@ jـL+ !EIi$(6J,<*JF nU2eNXJ D'E -F9N`rGagGtpB=MFb_9%RBѪA1~ZYw0PGoXMXFi frRA$v*vbKs1B@LB5;* Y1Ca:R\n\1OrX~C\($v $ŕ#)X"ȁEq6LՇb= (L 0p]AJ hCa ̙ė`A {@N%w(+ↅ)Ɩ^8TrOVתx2&Pxy@J9|ePr6.87qkKQ'8kɿuS=P?޵I3ݑ1 SQo 3*})Ȃdžtrw IHXK/{5xM0A-QM -D -` 0c#4O~Iq´$?j~;@7`3 ?"A`[ ӖX/H&!Z"B"eAͣQ"IVŏ.r O0@O.z;'_B]8pg"P] i]`84w<|ڧ4 |A!UB/#mdГ 7 -e FaY??aV*pLAA8neL, ϛG=~(,g0c7<:?@L_y`1&@} O snP l1f$=' q,5Ge~|hf98&Y"aD 8^=3+wZΖz[ R!6D!+ -3X,i|b$@!%ʛ(nylrv;]n^l4YB/IΚ%ߕ~7A5$=l9-g m.ov5dwv{O?- \ݯd/"$jpI͖!״olph@cj=LWzc0H*m6mxU9k_4t>\la@OwJ@_EI Cp`7n&T;8d.6zy _C!)j-aW}$z 6k|SԛmWX4e0{L6K𪇲29FemgS􍹇uYhhfrnV˭9>m\[w6@~V[*.  aO]XCRr6Ѷ&?6\oVC:ԑĩ̀7qd6Šs x ~Cv\[d3/T|XqjͷE6Yl,}0s+k$op^ӝal>5z^!ABb?T8(ԺkMc %#/ <ȶR U_`yƢj'ae`S/xzSm7]on4@b!G;}&%%TΉČϯ1l?N .Zרڔ |IAd*ny՚ rӠkDtWR@u],ԛ%ER>B^dI(ּ?#Xz'!HH/J6ү%S>3ppXqbPl-Er$I"ʩT}h)#TD(MTE!(q.XBW=HQ0`#OOHp78W/rm]!( -zӃy$͆z~Ta1.{2[@7ԃ=\]Lz(?[A:,Mz\qDr?ب4D'boOBUo LJ-Ɖt_?r6tDgY:&ozI9"HmD[ D8C/_|$ X[<M,Q۳(_JMPx~JwMj^bz;f6񃗯:v/p {8wi V񟺦xaWsIDZ)Q:'|`i-9S=sXaq1I! -%v-(`SH"n(_vwY2w5Z:kq()у9ڠHqy:P&n 8-E3H^[̒89 -u:$.hU?d#|Umiuo1j;O|`L>])j-1R -r)rYL 56 -Ze7 uEA$  1d$ۑᬹsԖ!wNzޥ1 Q.Ђ[U"}9)IܬPNUf0v%0r(wSoݍ(\&U}YvW>=dưā2I*XE -MH^KW.>vݏUm:d(+0߬~3L5j} -?O(Rړ`QqC?vܪŸKdLJ` Ʈ7B+)d[ˤ0.[_Rܐq`ɑJ$]4c.zT@a^¿}3_Q -)W쎛7m$6juXjW?QFYhK_-!{Y?Sʲypb^k ) LNτvgi [P 3*K*]eY9y[Nq+Y:29$j&h'6 d1T -!:ad 0zt$B֬Rm ׄ3-$)*ZC>!I`>mRW*NƍBf7)oGR|M]RDsVypT([2ȋPs5Y(ebZK[ht|hH{z qHc :ʕ/O ݉*< а6c8)GmXGouI+Ƽtzy?}++G/,+Ty%J`"x>=Z.6r*.{WUxX6H Mܬ!TYE%'{$%B!OLS_jyv޴#pU-Uw2ǡ5lԤ\3 c -sъ/*X+f3T%`&}>Alҟqyjߔ(/ˆUqߕ7a#5Diqޖ. -;yhM n?m~￳ƾN&a-OYﳩmMpߝOgfTsIeד8H1{|% =.iÄ[Ģo;#D&,݌ĺ_ y貟.nZ9:d41MR.,2Yܮarxpcjg\A?:<]xfLQ6|s޴!gzFfRqв<3mnPMN팛'֠LJ۽d Χ5ào=c8M;Sڧ\w7*?h4ұQ;r|޾<&{0*Y< UiQ7$p1Og?L:#o+ZL&Dq]+&E#H&xiyxXWBoS̳q52RkwFM6JgVP/Ti*5+p9ҩQG+vFvlzF&?rĄ(pskL416e)B~[ɴ/$!Gծfm=5fOqHk1E‡p9Kt${lɓ.|]^ -ph|K[M,`%:3&:gS24Ed00a5 k[{3컕$\,Gf`~QvS!/+< Yu;"3R|*~L᩹m;y^L{'[`d3feo5 l&p`nD們UƵ& f/fYӖgkdeĚVqnDO@fD7ě*5I -qXңMln㉀^ == S[f\~yvF# &"5 I3]*ٛߎ|8\f%nNΊ׳l 6q⭞+uv- e~KT9>E1b˖~K\SD2_FCO#-uqgY;]:O jr$4j~I`%Q[# (#~~F7Aé1A@G n0hܜѰ0Mc Z *G!E(~)lr8D.>w$40J`nijV0CFK_Bx"URD𼄯0#]Шi. 7h0/4EAq0/^F_nFJx,91"-!i1pR» ~mэdi  X;Td1.qz-&`#@k{K{KqCM;' 0}$%β-Mۘ -]!{r<!pM1}jM)$ %EU{dxjy6(C}FE#Q9,Q>go jp:,`Jg s EP9_E"axJߥGHl2+bw 'n,S5boS6ؽS<'׵9]-yݣ9qwhe@K NwQ.V'-NPOS6!:=}z`=ÿ672o)1"4SnŸr -_4o@݊xsZݯ=&b ΫFn kYS{C^mG $btD,yBM"{# -Q1<>#@͈KY-ux, yhܳ7lLKڜLPL’l, bDY{mΦO38RG4@oYrgQ&wiO}n?dE& W_IQjz÷w ?\:‹vď4?WHȊ[_M`F"&P"(_(8͹C#-~zds>6p}Xçpz>JmM|LXG4 -g\.'3.hy -5hd7VY#~ c]V&ozہFdp));lyvc*J_PxkV2r2#;yږA+(Eu'gsbD3}bc< -ǓᵁlnPmq'w>Y!3M4]29 Cջ^49%?<+z3uL Mjl⡬Ę\6ՊFfo؛I9]kI_ʄڊr02 .]'Fӫ <)0&+DKD{7ksM}ZIrnl庑, %1JsL/PI?'MAB2¡2ỉ*ɛ+؎fӮf&2}9L3I6Az|){j6Ӛ4~]mlAX&m1{4#/>n=, ėH?Q&MA<>Bdp?ֶ#9AnX_3= -gcb7la1T @۔%]*x9krdˆu~U6PM/&IƼ ݙHjvk VOT0@n\c6Nl;^pޣp 6;瀲Mm7˶x<<ܚZ5| gÏ8| L[GIF`mR /q{`P+K_U>f64%3MR/bz‹~T(')i-c]J,UصbYLPqg֋Jw9D+@'xLT7"2eaw1`igx2< [>SUQٰ(ǔ&V(k+${bBfFo5J1~$ȀW_ ӦolZK4vԱӅdz,9!Θ{T -JUe @pgz˼Dɹ"J$X(@̨֛ w|9^=(i,L?ևe&}$B\wdn 8dfZ<]mE-S Sb֝c) {E`ז[]\;GtfNsq% -Ϲ[gfK}oQ}؛Tdi&tŃ-=L̶d;3W -f8Лv _7ZA]&!W>7cT|Joތ¢qh˄zUѻAlgƭætG PmwЕ=/^3N-$;:(nNd˒ˁVfj|MPe[J E~;M;&>{CgQ!si& Fn"Q$%|{]ooށbuD4jӞoܼ"]c d;3&,ʳ B4MCGRʥ>Y+CH}`˯TӯGd[bUP q6d9s6??MA=m3kTyn CF#e7.LL{21 -zmpIx1^?klj$SóJV~CA073pˡpϨ'MKE]yll]/zC38U^0v−klgK/CHw+Ų:(MIԢ3zKд`Di( e Jp7ٳ0zr=:W+Sj%L+?q~N#"ǟK 6r69U`Ӧ}Ҡ[?1Q_?1Doy(l=o]˕BWi&e-wGnkDԫ=SD~0F҅H.j9k}SΓ@P05n6RIS^)wm\Ncعk2[Sr{%O{b5h]6EjFf1T(rֿhN2/Q}APӰP6g4Y[x|@CN J4D֭AZ$%LkbXT=L@K.!ȼbs6m%v(@-9{\O]më\m Ww]\]W Y3C[ܹ?!G4Gw@p"@+vxu.Quf?gwR]WX|,n8h F 'b:V#dDaici&{MNzd?PJ'cbM:u`cwy-*_9k*uF -}۾4 Cfc4J|0בdcT1n/_mp>8_  [шL/c k3~d|FdxV5/0Z7!&w ->،D9O9'/Xϙ4|rݢ3ɦE_PiOݽn?ͦ/}ugޣ_6 $5Wn6A k/Y3&aޤw ]9]K46l&߶L:wQӥI3a2tP"eY]GyԹ_x/4Zc2"\;;G:^ZKotol %vI. Dk˭% fIf&LGe%_44pſ'IE VE(X(wc Sb|șI:3-C_Kgtfb/YөKԃv([)cl3')@ "F1vyh cg2Cr rFŐ}N'+|a _tL`? tĻN /j4o PЁ[]hs}3emvϜ#,5d0ҷk3YbKҞ 3bg=X3& [~|<=D ļvg 7@zwq ,Y -mf}yCfh K5DŪ!֊| iHiC1d,kC7ͫC2J]P;ۘnYᮗpO<ZOa:9hxyg ow{2Za6Ѳan S 7C_eՓ3|_ hZ%+FKd1Fg*F󻑨tF*V1Z1~21V X-VH@G/i:@8իqU nzϘ⋍MImr7&vt'SX5DTnO#˝M&\MZwm~4O `LzjlXjltmu>o5.}^ K:ZZSiz늳6'~jݐzT)j 1[nfb&o 3M879Inl"vs͏m62>'^3F0,Wk [B5$޽%ǴJtaiZ\]gc,me綷MmuV_c ߅_g-Tk%'m7XG̣:/:4ClQ-22\4,n6(ʶY`ldh&}7r9jmZXNja.U˽VnHTM> -RI_) LJϠ԰T &-U.3 7cx -e_\q8^&HKeؗeun_Ah oD76n=="QNYtԕ+t5z[r -"j4]ƪr-ͺұ{9oBOoUG+%ٶ'>N|OE3L괅>}L_;=SZ>3398K}Gy[E_ TC ^esƾjxMX}sl$?v_aZm{]tcV5Bj֠Uz?pEE*Ɔ|/Kq}|z0o=ۇ""O,WTm?FQ)QmX:0q;ogz{'wⶌ O/|6^G!2 Zfi+`Uwv wpn|G|Fe -h]dˢ%"K.y7+VF}t+ ]@{絵8nςͅ{4NSj+=B7,w7;…:G6ۙga?j{d0\z+;' (x 9U|r4̄R7C9۱P:1Hb*اr8$Bh''_\LZpw!;5 :T]t׬X0joj(?j-*fX9t@}OJ͊?nVˣMˁNHQ dwӛl]-=]j/r#'1Z= M@Kz:ۍewu'OD@b z^דߐz>BrA6@P,)JFx鉷A Yezxq-(`Ͷ[!DKnbm%HecUI6"גЊg(<ͼpc^QƳ~tEG+& ;xhlvnPc9UƃÍ@zl?4Sˠd`rTVx6] -FG!Av+P[|3^LčwZQR>4z룴%$hqT!EE* 72M\)݉`]h٭0~OCM‚(a{tdG3 3Os|8$BZr %4A Q *ݬ4OMLh܎?Q%x2byȥsɫB&ŐAqSO -Eʭ)cYxJt%&4m-3Zuؿ#>;"4(gnZO` 9Q:.CݽNVhpl=!_b:N+⼸l'1%׿p'K򈮺y V'[$V ,$賁qv3a ßD!,.P Jc@zYg^g팍4DnB~cm2= -yS=M)ԙN#׊3 `} -\ <{y ]apU7Qoц )oCm*0Gd0O DUOH/Z&ߴ=哯Y<c3ID#.ouxb"~/nWIu窣OIx%!-=ן!l 4eӲ&&b|͈1Giy^7,P"_p}l&@ -^q]ќ"`C-덅7θ!@+BTS7z'*Bycj=֔EP깨nT&:(O@d GE1;`ٺV *mT6b\k$jP߉^jz%hm^> fʖog (.*"u<"!TGvUU[5R -`lYXC$^i5yq hXYCŔ&޽f-y͕1vOT,l|DtSSD1;};%Dv9)BT -`{;ӓ޶ jTv%:{ ?mT:74+%ʅ :暟~ḑ(GC N ` 5PɼԠY d}*y<˵ *7*44] |*P}Dа@m3OVnNT6ޱzFePp9hm 1Emwˢ -MjP'ē+to OCaS3VTNC3kQĈOji\9@+B}lPo/{c0Au1O;>@ }ӎ\xӠCW1Tly 5gh cmzIP\3+Ɯ2h&;PPQ*(L>z`GaH r1u91A56MNPбrY . TjGPht4C9shksS,ԟ[xz֜r:bZ)O aS ZG\ov4O+ه@J |Si -OF4ƙtuQ{-{TЭ{kEqD#Sھ]kQz4 -> YVˎSřvH3\W}\("=>]|4$qGղw+ -dUe n=z/C>LOT[lMb#s6OZܻ/فA&Hdwa-D5Rss6Dsh+t^c9GVvH "(A"Ub?H*@ЫXE*X+Z*-\=L `C5)ԁb"|2TU1H4)`@|wUh65:]@s Ժ7%H-ԡ"CCJP[QT)BGĻ#nD -9]V ! R5Fbhy|,p4?'vnJ˽Crs >Q!AdWv=@!FTMqq - QŸ6h4E0J ăNzô1P -dښ?Р3UY* K2FsL&uOПGgUE2%mi4I:\* T!sj F5$ YFĨmϣ0Cdמ`2a|Sp3mM/&zLWأd#M2DRA_2)y:R(#H8yt%8VfӚWdI@3/ilJE{J%nA{}sLobDǍ 1Rݝx"@ʽ%E3 -&c12`Vnq" أv 蝘B.xcEB{vW̭(n~D #y( n'{z]n -:Mxiِeɝ$RHG3l$HUSR֦ұȸ1 mJӨɥ1bE[SШ=2Եg~' ^CmCG j? M/_-(řA޼CQ3z#.4rH.4H55Onc#O ݌)˙J> *Ӷ1n[=?RG칍]N]eJK>l?AE6;MAİ۹Hg9ӺF"qqr0 -#9(Z0XvSx91oN -)L|1[z uKe}T}pe|(2ټnT׬>&UQ t0 Nhj%Qfټnm̐~m~x_[ߜ$ -OYΈ|[!yp\|*aU4 LꙗE( [S@5QT¢T^wD 4ps-i>U61s~4)MD)D"M:QO[UFҢ"۟K78d+PptR/!s^Pr.{KyUcEy9H³Qވ˨LiC)()TfcMۦҭZ>ن$|=^'K>V{G": >:GwN6&Z;9R%M&gWji њes[iT8i ]CNylrT7?Zl,d;?SY^ uTh!J@lLJ ݈?sLjE=N *so90T P 7uT39+DD">dݩH1*qdѵF}BKQ$z&Gˢ=YgL1-zIhe; -LF@t#' - zX_ƀy=8vf=9¿NJOWk3 AlQ#'ͧgޟQdR|5T˼G=Ώ8(K"_7r59yFo5tz>ᜁ!s9iV윍4o M&Λ,^~qĒy&2mbVe{>N:P[=Q{ :u-^?[Z׼|/T=$ցBZr)TF Q4TiC -ƈ.'OkHVwZߩmh|{xN SaKij^ktzRtdY촘-ϳ^f9xe7:?APOhEo:/zs4@ƘNtEo(iNMͯáڊgƟ8E!:%(iD SP.}'zKV$~RNngU$vYAx6V^7HcHg@dIon8KͫY~|왠CwéerAH3J8RI2ZxݹZ%~G &s(],';vX}3Wަ!q6yN;x<~7J^wʼoPw*aQMe+~ 2ooCktt<^J]2O&:zieN]'< W)8'Qt΅}i߮[ADUpJIRqA "MC 2nzHL^=87#'Wu~f%; -1?oRfTLKǏdIȾuThs)~l)Bm#ٖH~Ώ3~::.SM~z$EGFz`F@۪p14+0NTV-}L,i# -*-ZWyܲ bISʘLٳZݓVƘ*6TZbuKZ'/ -K6DPeewP:0ףb?Q* 9^Gdĭ -TzS+,ԡ\-{ -6vvOG j٪ ->jP!nJvǟŰsv7}'dL_ov1O}Ĩ%!R{@;ۢ{'5nvӧ98V☍f͊G;а|NFzq:>u cnԅ׋*ܭ]Z&<tSC)SyBaKno^O>Dy樰OK88+SIi)S -U`.WاUr >> \pO -"E *S; >}>}>%Z=/Q'A*OOb}-9?҅}J+, \Ox+Dž}JU}har|s¾Sԅ -R,vaRWN|navX< i+SCڅ ~]ا$#% J}+,S*A*;u -VI0n/VاaaF ]OIW*lhi&y>b3(|a8CV_eżLodi߻O8y^TYU$ލ҃ֆ"v<8:hA($pyJǤŅ1Z:eAt31}/zX~J]V2Үf?o4α/!MwTY)ϹO+ZR?BnB? < ݩέc\9VR8>grv3jfa^;TwSkT:QWRMn<+IP*iv2ww{]{4UTRkKZAoJZiטt;znGtCFUSH%Sk!uRuGkpo-puŷcR1=a5[s|O!pV!~~o؍RɇGV~,_}T*9& ڨSAuUGmuXl:,G[(} S tOE.<^VQ.oy[Z(I\0J Wg48 }u>LY^ES(|*]1/ Լ˕XIS.{Ѻͭ -&T7 9_j.~%/fV#QEP5ri2.Ig/sb$G d I =uvd!JvG8_@u†dOEVr+i9=tX.Q(oIGY*.* GQey/޲@x{qHS]]]]KW|ǖҬbK]B|PD\^IZ3A -ԭfڽwS4bH0)w[TWnohKH_C#z/C#BC/7C<~$~D(&@HxЯ@!~QJ6C#iҋ$zH.Gr6g޺:/m-ۡY#&dG6 τ ǭ*ž]\0a .?gfRk&0 F 7Q ) re;{ -&ۡ.. -Z>5 =e[pKMxv&`C=1Ţe;%<~ȹ$!Q2Gi4zgMH:W|jd1գ#~>ۉE$l f4Q=2/՘ ȗgd;B[$)L=f/dQEyn &/%$aigwIR"m~$ y^Y1DS2٭MW -)ӋFaW{qA[}Id3ŏM>^|k:6$aq| .# -.1rΠR8&|p>>i^'u2$l! ZZoYkbZjLgg3:ݔwJ»MPN^i\LpE@ꆽVb/q Q.JSG=m `5z; t}4K'{F(JACxh|lvX3'.=|u;'`t~?04c~<k&.jyڣozdy>~Gh>>% -lO߅7|~8PCA2DȐ?>Y3mdV_(L[aW~8dWpwA=D~[MOY{ +IWKM„Uzؼ(f;3}2Y3f 2Y_P{Lt,Co&Jm>9$\<q4vVU:=T.8b{Fu껚$ ׿c(r -܏2xGZxLa;GL1E?K=ұ -2س w72gEB~7i*M2_G`mX6X, jgf\)>җDVn -931"U2giuma3 -Л`jpcZqw"{Pq|`MMRԦ8*N\V8X]MQ[U@ѻ"~#Y#2=x7$ \߫^tXh,Cb娦I@]F@яTLh< BDtz\ ڤqqkؠ}{jzH3_2D.(\]˱M ]:ZSmH -XPY! L /#F$"0qKVfK8:V) 졓4;vr8[K0{8а!iBØjHȱ&$'$x0!a=2 UjmZ~94[nzC3iDFLa|x`]QB -";g BDNK\iox\Z `^Hif 'T_l2:~20:{VN`l"N!32Y,-B瓛xPJKҘ`W@iPږfJ 3 @|cӃ@aL6 OqAaUji1Kз3uZ  ܒ0 B -$1΋`٤tN.(iqo:9?"׾ bX#g}$ -bhŒhmKd׍h팍DBUtnl_{fiiTjzN"wؼ٣XuIb2I3B n|N/XOʨ 450.[X:1"6Ƥ22j~f{iژl&i |0/ aswѭGonT߯f3l|(A63*lU!>#dݧ2ItX/ӺJqt62CH7zK(ܗK뾜%\Ok:C pz& ۍ~0@sUzq8:@d'y=7فűK4`gbLzȘ.e22K -qŗs(n8k]}\)i_+"މ:n#Mˍh44ۋ{ A_]h"WZ(R7 H`ѦȈ䣳#Gb@MFG6yE^Uo?9/\cM!rxj闤sb.Eͅe6,!\"ַ(*82gܱR.N;CM:v"+k4 cօ\ J=9k -$h.tU;ЊL~ 9u@l)!bM k~@xgl$B -'<[YWYF#h>CW#WۡQNFه,%,+@3W:>_p*k;98bٛaoTiq2Tp. GGXT_F=5Lgt5nxLGujS vK}YYߣH+#$e -㧳)BnG5cE{qL"D*{VGe_Q -A@|"R0+6jޛ -UC:+>3m}iY+#="]ÉhEE ̢҅h] ͫK8v-kUeomYn&eūoh9B"Mj3eu -=^nY$%]/rrX׈%K{Gs cw.Vc1p&HNݞ{ oPQF}2{ڮ2ņZi5W6f׬A\kO{|@'rReKwFwDV춐;|i~/(mS/M -g Mb-$=sOFcCs羋h 7%VhL#;dl/\U@e]o Ť(KDIP3 =y'K!=M=9qBέb2 ~Y+g7zz5YN`Cy; ,q87 B3—v&F?B)u$u /:& cG+mor+??:z-j,6M+8]Mȗ#-AJmF붶\e?ix|>*49CdJMRͤ.Զ\P#&ƹ, -mc 4*/5G8is;{uT *VI 8͎&wls -ι@Na3 f8?B.C)]M_ܤGm҄nA<ӴXޖG4xrgJw{ccAGsT "u$|[(oO?)f$X#z㡳sfr*9ƒv|^yb QfD)m45INp17v8"@fc3r8i,*/./6/ԉy{=E~#6v6H4`ɣNٷl-)> Nit!v; Ni 莝>fd4,6M1 6#muE?0A:{gqtEO{# }gi2%ւuc&HnM֏2~ěl/2;8R۾ҝeh/"Ǘ5v جlp[26"Z$u8'!j'Rv yubsI|vۤ^4sI *yZ8KpPRqvzWqJ:sF\vj7C96C8?NDҫZq Y UVbjfU!&N!+FfVEXYF~2j5d6;js1ʿň"AX\_!4!\vsg2$.]q EbOsIͫXMHty8Ŝ[3 NQ몌UUF/NgS`Xٰ8 xn A!VO櫑 1cx`8!O#%8__NYMY1=9Lќ#h4]8 -tC?uVǡ_ WΆYN sDTRv^>^ǣٰ׆dn3i2폆afh4p_4 '@ _…z=ݳmqZ9*saK; ڰ n bÍO@ ƒ/ Q8e(y) 22%xYET$A<*u8+dH913Wj?UןM6 *ȳnCV*-]7}[WwO탪}. 2[ l.灺?Z3G\a .g޸3оMQoEghqjgΧ!~Ix"ܸt,m+ϔ1:|cg:r⪹" EhfYE"lvH`9vP Xbyz?Zma pna!KN* 8e/j%to(r" 砑b)~*2f9hDMBe``#F`L˞׵׺M;]3[w;w\ llz5wonsF?\9K . JN_㗁:l 6Ny -KJ,'*@`$Ir<ȟ1'E™d\bf[Rqʣ 8q)Q2x@)d 5B!k(ܦd(Y(Hd~2 Y.nb:Y6#spp (H (;f /X bDaߣAؑa3n8=(p[J(,H+Vy}ApaP89@QF2s8.sbPVH1,<2f: giL(KH -= ayA: { 8x:!+Y\(gN2{PGcso xӷrx (;΍db6|xm`_34 -9 ΐ7.z.+2/PΐC>H"`f (P-fuGC1+HĉukLc ODv%u y~B6xQ(@QDV9/2BW 1KP$Y1[,o*G\(Pz[!pOY˘8ͦdʈ_?aV?Xq.:(Bf*^.rFB"Mh,B E!B$Rk Ve3"AdMC-AQW|IpCns=tayڰa3h{7_r4dN^?|aBiVɈ2TEId*$2QrJpt^;үpg8D~Wױ:jx6 y9EV -endstream endobj 9 0 obj [8 0 R 6 0 R 7 0 R 5 0 R] endobj 35 0 obj <> endobj xref -0 36 -0000000000 65535 f -0000000016 00000 n -0000000185 00000 n -0000049366 00000 n -0000000000 00000 f -0000051937 00000 n -0000052080 00000 n -0000052010 00000 n -0000052156 00000 n -0000392338 00000 n -0000049418 00000 n -0000049838 00000 n -0000055487 00000 n -0000052803 00000 n -0000052690 00000 n -0000050339 00000 n -0000051375 00000 n -0000051423 00000 n -0000052574 00000 n -0000052605 00000 n -0000052458 00000 n -0000052489 00000 n -0000052342 00000 n -0000052373 00000 n -0000052226 00000 n -0000052257 00000 n -0000052838 00000 n -0000055561 00000 n -0000055823 00000 n -0000057138 00000 n -0000087000 00000 n -0000152589 00000 n -0000218178 00000 n -0000283767 00000 n -0000349356 00000 n -0000392379 00000 n -trailer -<<559A3D0108187343BBF52B77915FD163>]>> -startxref -392579 -%%EOF diff --git a/misc/icons/pomotroid-icon--0.3.ai b/misc/icons/pomotroid-icon--0.3.ai deleted file mode 100644 index 2f3627b..0000000 --- a/misc/icons/pomotroid-icon--0.3.ai +++ /dev/null @@ -1,2254 +0,0 @@ -%PDF-1.5 % -1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - pomotroid-icon--0.3 - - - Adobe Illustrator CC 22.0 (Windows) - 2018-01-30T08:56:12-06:00 - 2018-01-30T08:56:12-07:00 - 2018-01-30T08:56:12-07:00 - - - - 256 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FUs13zP5d0C3+sa1qNvYRkEp68iqzU/kX7TH/VGEAlBLy7zD/zlB5KsS0ej2lzrEq/Zen1a E/7OQNJ/yTywYixM3nes/wDOT/ny7LLpttZ6ZEfssEaeUfNpDwP/AAGTGII4yw3Uvzf/ADN1Ek3H mO8SvUW7i2Hj0gEeSEAx4ix661/Xbs8rrUbq4PjLNI56U/aY9slSLQGFXYqj7XX9dtDytdRurc+M U0iHpT9lh2wUtsh0383/AMzdOINv5jvHp0Fw4uR49JxJkTAJ4izLRv8AnJ/z5aFV1K2s9TiH2mKN BKfk0Z4D/gMicQZcZeieXv8AnKDyVfFY9YtLnR5W+09PrMI/2cYWT/knkDiKRN6joXmfy7r9v9Y0 XUbe/jABf0JFZlr/ADr9pT/rDKyCGQKZ4EuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux ViXnf80/Jvk6I/pW8D3tKx6db0kuWqKiqVAQHxcgZKMCUE08B85/85KecdXL2+hIuh2J2DpSW6Ye 8jDiv+wUEfzZdHEBzYGbye9vr2+uXur24kurqU1knmdpJGPizMSTljBQwq7FXYq7FXYq7FXYq7FX Yq7FVeyvr2xuUurK4ktbqI1jnhdo5FPirKQRgV6x5M/5yU846QUt9dRdcsRsXekV0o9pFHFv9mpJ /myuWIHkzE3v3kj80/JvnGIfoq8CXtKyadcUjuVoKmiVIcDxQkZTKBDMG2W5FLsVdirsVdirsVdi rsVdirsVdirsVdirsVQesazpWi6dNqOq3UdnZQCss8poo8AO5J7AbnthAtXzj+Y3/OSeq6iZdO8o K2nWO6tqTj/SZB/xWOkQ992/1cuji72szeJTTTTyvNPI0s0hLSSOSzMx3JJO5OWsFmFXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYqvhmmglSaCRopoyGjkQlWVhuCCNwcCvbfy5/5yT1XTjFp3m9W1Gx2 VdSQf6TGP+LB0lHvs3+tlUsXczE30do+s6VrWnQ6jpV1HeWU4rFPEaqfEHuCO4O475SRTYjMCuxV 2KuxV2KuxV2KuxV2KuxV2KsU/ML8yfL3kfS/repP6t5KD9S06Mj1ZmHz+yg/ac9Pc7ZKMSUE0+SP Pn5i+ZPOupG71abjboT9VsIyRBCP8le7eLHc/LbMmMQGom2L5JDsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVZR5D/MXzJ5K1IXekzcrdyPrVhISYJh/lL2bwYbj5bZGUQUg0+t/y+/Mjy95 30v61psnpXkQH13T5CPVhY/8SQ/suNj7HbMaUSG0G2V5FLsVdirsVdirsVdirsVdirBvzU/NTS/I elqzKLvWbsH6hYVpWmxllI3WNT9LHYdyJwhbEmnyB5h8w6x5h1afVtXuGub24NXdugHZEHRVXsBm SBTWSluFDsVdirsVdirYBYgAVJ2AGBIBOwTey8p65dgMLf0UP7cx4fh9r8MxMmuxR637nc6b2f1e bcR4R3y2+zn9idW35e9DdXnzSJf+NmP8Mw59q/zYu8weyH+qZP8ASj9J/UmUXkXQ0+36sv8ArPT/ AIiFzHl2llPcHZY/ZbSR58Uvef1Urjyd5dp/vJX39SX/AJqyv8/m7/sDkj2c0X8z/ZS/W4+TvLtP 95Ke/qS/81Y/n83f9gU+zmi/mf7KX60PN5F0N/serF/qvX/iQbLI9pZR3FxsnstpJcuKPuP6wUuu fy96m1vPkkq/8bKf4ZkQ7V/nRdbn9kP9Tyf6YfpH6klvfKeuWgLG39ZB+3Cef4fa/DMzHrsUute9 0ep9n9Xh3MeId8d/s5/YlBBUkEUI2IOZbpiCNi1hQ7FXYq7FXYqmXl7zDrHl7VoNW0i4a2vbc1R1 6Ed0cdGVu4OAi0gvr/8AKv8ANTS/PmlsyqLTWbQD6/YVrSuwliJ3aNj9KnY9icacKbAbZzkGTsVd irsVdirsVdirFPzI/MHS/JHl6TUrqkt5LWPT7KtGmlp+CL1duw9yMlGNlBNPjLzD5h1bzDrFxq+r Tm4vbluTuegHZEH7KqNgMygKaiUtwodirsVdiq5Ed2CIpZ2NFUCpJPgBgJrmyjEyNAWWT6T5Gu5w st+/1aI7+kN5CPfsua3P2lGO0Nz9j1XZ/stkyVLMeCPd/F+z7fcy/T9G0zT1AtYFRu8h+Jz/ALI7 5qcuonk+ovZaPs3Bpx+7iAe/r80blDnOxV2KuxV2KuxV2KuxVBaho2magpF1Art2kHwuP9kN8vxa ieP6S4Os7NwagfvIgnv6/NiGreRruANLYP8AWYhv6R2kA9uzZtsHaUZbT2P2PG9oey2THcsJ4493 8X7fs9zGHR0Yo6lXU0ZSKEEeIObIG+TysomJoiitwsXYq7FXYqmXl7zDq3l7WLfV9JnNve2zckcd CO6OP2lYbEYCLSC+zfy3/MHS/O/l6PUrWkV5FSPULKtWhlp+KN1Ru49wcxZRotoNsryKXYq7FXYq 7FUHrOsadoulXWq6jMILKzjMs8p7KOwHck7AdzthAtXxT+YvnzUvOvmSbVrslLdax2FrXaGAH4V/ 1j1Y9z7UzKjGg0k2xfJIdirsVdiqO0nRr3VLj0rZPhH95KfsoPc/wyjPqI4hZc/s/s3Lqp8MBt1P QPQtF8u2GlIDGvqXJFHuGHxe4X+UZoNRq55Tvy7n0fs3sbDpB6Rc+sjz+HcE1zFds7FXYq7FXYq7 FXYq7FXYq7FXYq7FUq1ry7YaqhMi+ncgUS4UfF7Bv5hmVp9XPEduXc6ntLsbDqx6hU+khz+PeHnu raNe6Xcelcp8J/u5R9lx7H+Gb/BqI5RYfOO0OzculnwzG3Q9CgcvcB2KuxV2Kso/Lrz5qXkrzJDq 1oS9u1I7+1rtNAT8S/6w6qex9q5GUbCQafa2jaxp2taVa6rp0wnsryMSwSjup7EdiDsR2O2YpFNy MwK7FXYq7FXzL/zkn+Yx1HVV8oadL/oOnMH1JlO0lz2j+UQ6/wCUf8nL8UerXMvD8uYOxV2KuxVN dA0C51a54rVLZD++m8P8lfFjmLqtUMQ83bdk9kz1k6G0BzP6B5vSLKxtbK3W3tkEcS9h1J8Se5zn cmSUzcub6dpdLjwQEMYqIRGVuQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUPe2Nre27W9ygkibse oPiD2OWY8koG483H1Wlx54GGQXEvN9f0C50m54tV7Zz+5m8f8lvBhnRaXVDKPN8x7W7Jno50d4Hk f0HzSrMp1LsVdirsVe4f842fmMdO1VvKGoy/6DqLF9NZjtHc94/lKOn+UP8AKynLHqzgX01lDY7F XYqxL80/O8Xk7ybearUfXXH1fTozQ8rmQHgaHqEALn2GShGygmnxLNNLPNJPM5kmlYvJIxqzMxqS Se5OZTSswq7FXYqjtG0m41S9S2i2XrLJ2Re5/plGozjFGy5/ZvZ89VlEI8up7g9PsbK3srVLa3Xj FGKDxJ7k+5zmsmQzlxHm+q6XSwwYxjgKiERlbkOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV D31lb3tq9tcLyikFD4g9iPcZZjyGEuIc3H1WlhnxnHMXEvMNZ0m40u9e2l3XrFJ2dex/rnS6fOMs bD5V2l2fPS5TCXLoe8IHL3AdirsVXwzSwTRzwuY5omDxyKaMrKaggjuDgV9tflZ53i84+TbPVaj6 6g+r6jGKDjcxgczQdA4IcexzFnGi3A2y3Ipdir5U/wCclPOR1fzimhW71stDTg9OjXUoDSn/AGK8 U9iDmRijQa5l5BlrB2KuxVciM7qiAs7EBVG5JOwGAmt2UYmRAHMvTvLuippVgsZANzJRrhx/N/KD 4LnNavUHLO+nR9U7G7NGkwiP8Z3kfPu9wTXMV2zsVdirsVdirsVSfUfNejWJKNL60o2McPxEfM7K PvzLxaLJPpQ83Tazt/S4NjLil3R3/Z9rH7r8wbtiRa2qRjsZCXP3Djmwh2XH+IvOZ/a/If7uAHv3 +6kA/nbX2NRKijwCLT8a5eOzsXd9rr5e0+sJ+oD/ADQ5PO2vqamVGHgUWn4UxPZ2Lu+1Y+0+sB+o H/NCPtfzBu1IF1apIO5jJQ/ceWUT7Lj/AAl2GD2vyD+8gD7tvvtkGnea9GviEWX0ZTsI5vhJ+R3U /fmvy6LJDpY8no9H2/pc+wlwy7pbfs+1OMxHcuxV2KuxV2KuxVKvMWipqtg0YAFzHVrdz/N/KT4N mVpNQcU76dXU9s9mjV4TH+MbxPn3e4vMXRkdkcFXUkMp2II2IzpQb3fK5RMSQeYW4WLsVdir1/8A 5xr85nSPOL6FcPSx1xeCA9FuogWjP+yXknuSuVZY2LZwL6rzHbEs8z67b6B5d1HWrihjsLeSfgTT kyr8KfNmouECygl8H317c317cXt05lurqR5p5D1aSRizMfmTmW0qGFXYq7FWU+RtJE929/KtYrba KvQyHv8A7EZrO0s/DHgHM/c9Z7Ldn+JkOaQ9MOX9b9n6QzzNE+gOxV2KuxV2KoTUtTs9OtjcXT8V 6Ko3Zj4KMtw4ZZDUXE1uuxaaHHkND7T7mAa15r1DUS0aE29odhEh3Yf5bd/l0zfafRQx7neT532n 2/m1JMR6MfcOvvP4CSZmuidirsVdirsVdiqd6L5r1DTisbk3FoNjE53Uf5Ddvl0zC1Gihk3G0ne9 mdv5tMRE+vH3Hp7j+Az/AE3U7PUbYXFq/JejKdmU+DDNDmwyxmpPomi12LUw48ZsfaPei8qct2Ku xV2KuxVgfnnSRBdpfxLSK52lp0Eg7/7IZvezc/FHgPMfc+f+1PZ/h5BmiPTPn/W/b+gsWzZvJuxV 2Kq9je3Nje297auYrq1kSaCQdVkjYMrD5EYFfeHljXbfX/Luna1b0Ed/bxz8Aa8WZfiT5q1VzEIo twLy7/nKDzCbHyVaaPG3GXWLkc18Ybakj/8AJRo8sxDdjMvlnMhrdirsVbALEACpOwAwJAs0Hq+j aeun6ZBagfEi1kPi7bt+OcvqMviTMn13s3RjT4I4+oG/v6o3KHOdirsVdiqE1PUrbTrN7q4NFXZV HVmPRR88tw4TklwhxNdrYabEck+Q+09zzHVdVu9Su2uLht+iIPsovgM6XDhjjjQfK9fr8mqyGcz7 h0A7gg8ucJ2KuxV2KuxV2KuxV2KozStVu9Nu1uLdt+jofsuvgcpzYY5I0XN0GvyaXIJwPvHQjuL0 7TNSttRs0urc/C2zKeqsOqnOazYTjlwl9U0OthqcQyQ5H7D3IvKnLdirsVdiqC1nT11DTJ7Uj4nW sZ8HXdfxy/T5fDmJOD2loxqMEsfUjb39HlBBUkEUI2IOdQ+REUaLWFDsVdir6m/5xf8AMJvvJV3o 8jcpdHuTwXwhuayJ/wAlFkzHyjdsgXnf/OT+sm78+W2mq1YtMs0DL4SzsZGP0pwyeIbInzeO5awd irsVTjynZC71y3DCqQ1mf/YdP+GpmHrsnDiPns7r2f03jauIPKPqPw5fbT03ObfUnYq7FXYq7FXm vmvWjqOoFI2raW5KRAdGP7T/AE9vbOj0Wn8OFn6i+Ydv9pnU5qif3cNh595/HRJMzXROxV2KuxV2 KuxV2KuxV2KuxVO/KmtHTtQCSNS0uCElB6Kf2X+jv7Zha3T+JCx9Qd72B2mdNmqR/dz2Pl3H8dHp Wc4+nuxV2KuxV2KvMvNlkLTXLgKKJNSZP9n1/wCGrnSaHJxYh5bPlvtBpvB1cgOUvUPjz+20nzMd K7FXYq9i/wCcYNZNp58udNZqRanZuFXxlgYSKfoTnlWUbM4c2G/m/qR1H8zfMdwTXhePbg+1sBAO v/GPJQGzGXNh+TQ7FXYqzL8vbb/ey6I/liQ/ezfwzT9qz+mL23shg/vMnuj+k/oZnmne2dirsVdi qT+a9RNjo0rIaSzfuYyOxbqfoUHMvRYuPIO4bum7f1ngaWRH1S9I+P7LeZZ0r5Y7FXYq7FXYq7FX Yq7FXYq7FXYq7FXpvlTUTfaNEzmssP7mQnuV6H6VIzmtbi4Mh7ju+p9gazx9LEn6o+k/D9lJxmI7 l2KuxV2KsM/MK2/3jugP5onP3Mv8c3HZU/qi8T7X4P7vJ74/pH6WG5uHiXYq7FWYflBqR078zfLl wDTneJbk+1yDAen/ABkyExsmPNj2v3Ru9d1G6brcXU0p6dXkZu23fJBBQGFXYq7FXofkWHhofP8A 37K7fdRf+Nc5/tKV5fcH0j2Wx8Okv+dIn7h+hkWa96R2KuxV2KsH/MG6LXdrag7RoZCPdzQf8Rzd 9lw9Jk8H7X57yQx9wv57foYlm1ePdirsVdirsVdirsVdirsVdirsVdirLfy+uit3dWpO0iCQD3Q0 P/Es1XakPSJPYeyGesk8feL+W36WcZpHvHYq7FXYqx3z1Dz0Pn/vqVG++q/8bZsOzZVl94eb9qcf FpL/AJsgfvH6XnmdA+buxV2Ko/QLo2mu6ddL1t7qGUdOqSK3fbtgKhAYVdirsVdir0vycB/h209/ Ur/yNbOb1/8AfH4fc+o+zg/wKH+d/uinWYbu3Yq7FXYq8487OW1+UHoqIB8uNf450XZw/dD4vmft PInWS8hH7khzOefdirsVdirsVdirsVdirsVdirsVdiqfeSXK6/EB0ZHB+XGv8Mwe0R+6Pweg9mJE ayPmJfc9HznX0x2KuxV2KpL5wFfLt3tWnpkf8jFzM0H98Pj9zpPaMf4FP/N/3QeaZ0j5c7FXYq7F XYq7FXYq7FXpfk4j/Dtp7epX/ka2c3r/AO+Pw+59R9nD/gUP87/dFOsw3duxV2KuxV5x52Qrr8pP RkQj5cafwzouzj+6HxfM/aeJGsl5iP3JDmc8+7FXYq7FXYq7FXYq7FXYq7FXYq7FU+8koW1+Ijoq OT8uNP45g9on90fg9B7MRJ1kfIS+56PnOvpjsVdirsVSXziQPLt3v19On/IxczNB/fD4/c6T2jP+ BT/zf90HmmdI+XOxV2KuxVH6/am013UbVutvdTRHp1SRl7bdsAUoDCrsVdir0TyLLz0Ph/vqV1++ jf8AG2c/2lGsvvD6R7LZOLSV/NkR+n9LIc170jsVdirsVYP+YNqVu7W6A2kQxk+6Go/4lm77Ln6T F4P2vwVkhk7xXy3/AEsSzavHuxV2KuxV2KuxV2KuxV2KuxV2KuxVlv5fWpa7urojaNBGD7uan/iO artSfpEXsPZDBeSeTuFfPf8AQzjNI947FXYq7FWPeepeGh8P9+yov3Vb/jXNh2bG8vuDzftTk4dJ X86QH6f0PO86B83dirsVR+gWpu9d061XrcXUMQ6dXkVe+3fAVDIfzf006d+ZvmO3IpzvHuAPa5An HX/jJkYHZMubD8mh2KuxVmX5e3P+9lqT/LKg+9W/hmn7Vh9MntvZDP8A3mP3S/Qf0MzzTvbOxV2K uxVJ/NenG+0aVUFZYf30YHcr1H0qTmXosvBkHcdnTdv6Px9LID6o+ofD9lvMs6V8sdirsVdirsVd irsVdirsVdirsVdir03yppxsdGiVxSWb99ID2LdB9CgZzWty8eQ9w2fU+wNH4GliD9UvUfj+yk4z Edy7FXYq7FWGfmFc/wC8dqD/ADSuPuVf45uOyofVJ4n2vz/3eP3y/QP0sNzcPEuxV2Ksw/KDTTqP 5m+XLcCvC8S4I9rYGc9P+MeQmdkx5sy/5yf0Y2nny21JVpFqdmhZvGWBjGw+hOGRxHZlPm8dy1g7 FXYqnHlO9+qa5bkmiTVhf/Z9P+GpmHrsfFiPlu7r2f1Pg6uN8pen58vtp6bnNvqTsVdirsVdirzX zXop07UC8a0tLgl4iOin9pPo7e2dHotR4kKP1B8w7f7MOmzXEfu57jy7x+OiSZmuidirsVdirsVd irsVdirsVdiqd+VNFOo6gHkWtpbkPKT0Y/sp9Pf2zC1uo8OFD6i73sDsw6nNch+7hufPuH46PSs5 x9PdirsVdirsVeZebL363rlwQapDSFP9h1/4audJocfDiHnu+W+0Gp8bVyrlH0/Ln9tpPmY6V2Ku xV7F/wA4waMbvz5c6ky1i0yzcq3hLOwjUfSnPKsp2Zw5vRP+coPLxvvJVprEa8pdHuRzbwhuaRv/ AMlFjyGI7pmHyzmQ1uxV2KtglSCDQjcEYEg0bD1fRtQXUNMgugfidaSDwddm/HOX1GLw5mL672br BqMEcnUjf39UblDnOxV2KuxVCanpttqNm9rcD4W3Vh1Vh0YZbhzHHLiDia7RQ1OI458j9h73mOq6 Vd6bdtb3C79UcfZdfEZ0uHNHJGw+V6/QZNLkMJj3HoR3hB5c4TsVdirsVdirsVdirsVRmlaVd6ld rb2679Xc/ZRfE5TmzRxxsuboNBk1WQQgPeegHeXp2mabbadZpa24+Fd2Y9WY9WOc1mzHJLiL6pod FDTYhjhyH2nvReVOW7FXYq7FUFrOoLp+mT3RPxItIx4u2y/jl+nxeJMRcHtLWDT4JZOoG3v6PKCS xJJqTuSc6h8iJs2WsKHYq7FX1N/zi/5eNj5Ku9YkXjLrFyeDeMNtWNP+SjSZj5Tu2QD1HzPoVvr/ AJd1HRbigjv7eSDmRXizL8L/ADVqNlYNFkQ+D76yubG9uLK6QxXVrI8M8Z6rJGxVlPyIzLaVDCrs VdirKfI2rCC7ewlakVzvFXoJB2/2QzWdpYOKPGOY+56z2W7Q8PIcMj6Z8v637f0BnmaJ9AdirsVd irsVQmpaZZ6jbG3uk5L1VhsynxU5bhzSxm4uJrdDi1MODILH2j3MA1rypqGnFpEBuLQbiVBuo/y1 7fPpm+0+thk2O0nzvtPsDNpiZD14+8dPePwEkzNdE7FXYq7FXYq7FU70XypqGolZHBt7Q7mVxuw/ yF7/AD6ZhajWwx7DeTvezOwM2pIkfRj7z19w/AZ/pumWenWwt7VOK9WY7sx8WOaHNmlkNyfRNFoc WmhwYxQ+0+9F5U5bsVdirsVdirA/POrCe7SwiasVtvLToZD2/wBiM3vZuDhjxnmfufP/AGp7Q8TI MMT6Yc/637P0li2bN5N2KuxVXsbK5vr23srVDLdXUiQwRjq0kjBVUfMnAr7w8saFb6B5d07Rbehj sLeODmBTkyr8T/Nmq2YhNluATPAl8qf85KeTDpHnFNdt0pY64vNyOi3UQCyD/ZLxf3JbMjFKxTXM PIMtYOxV2KrkdkdXQlXUgqw2II3BwEXsyjIxII5h6d5d1pNVsFkJAuY6LcIP5v5gPBs5rV6c4p10 6PqnY3aQ1eES/jG0h59/uKa5iu2dirsVdirsVdiqT6j5U0a+JdovRlO5kh+En5jdT92ZeLW5IdbH m6bWdgaXPuY8Mu+O37PsY/dfl9dqSbW6SQdhICh+8cs2EO1I/wAQecz+yGQf3cwfft91oB/JOvqa CJH9w6/xpl47Rxd/2Ovl7M6wfwg/5wcnknX2NDEijxLrT8K4ntHF3/YsfZjWE/SB/nBH2v5fXbEG 6ukjHcRgufvPHKJ9qR/hDsMHshkP95MD3b/fTINO8qaNYkOsXrSjcSTfER8hso+7Nfl1uSfWh5PR 6PsDS4NxHil3y3/Z9icZiO5dirsVdirsVdiqVeYtaTSrBpAQbmSq26H+b+YjwXMrSac5Z106up7Z 7SGkwmX8Z2iPPv8AcHmLuzuzuSzsSWY7kk7k50oFbPlcpGRJPMrcLF2KuxV6/wD841+TDq/nF9du ErY6GvNCejXUoKxj/Yryf2IXKssqFM4B9V5jtjsVYl+afkiLzj5NvNKoPrqD6xp0hoONzGDwFT0D glD7HJQlRQRb4lmhlgmkgmQxzRMUkjYUZWU0IIPcHMppWYVdirsVR2jatcaXepcxbr0lj7Ovcf0y jUYBljRc/s3tCelyiceXUd4en2N7b3tqlzbtyikFR4g9wfcZzWTGYS4TzfVdLqoZ8YyQNxKIytyH Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqh769t7K1e5uG4xRip8SewHucsx4zOXCObj6rVQw YzkmaiHmGs6tcapevcy7L0ij7IvYf1zpdPgGKNB8q7S7QnqspnLl0HcEDl7gOxV2Kr4YZZ5o4IUM k0rBI41FWZmNAAB3JwK+2vyt8kxeTvJtnpXEfXXH1jUnG/K5kA579wgAQewzFnKy3AUy3IpdirsV fMv/ADkn+XJ07VV836dF/oOosE1JVG0dz2k+Uo6/5Q/ysvxS6Ncw8Py5g7FXYq7FU10DX7nSbnkt XtnP76Hx/wApfBhmLqtKMo83bdk9rT0c7G8DzH6R5vSLK+tb23W4tnEkTdx1B8COxzncmOUDUub6 dpdVjzwE8ZuJRGVuQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUPe31rZW7XFy4jiXuepPgB3OWY8 cpmo83H1Wqx4IGeQ1EPN9f1+51a55NVLZD+5h8P8pvFjnRaXSjEPN8x7W7WnrJ2doDkP0nzSrMp1 LsVdirsVe4f842flydR1VvN+oxf6DpzFNNVhtJc95PlEOn+Uf8nKcsujOAfTWUNjsVdirsVQes6P p2taVdaVqMInsryMxTxHup7g9iDuD2O+EGlfFP5i+Q9S8leZJtJuwXt2rJYXVNpoCfhb/WHRh2Pt TMqMrDSRTF8kh2KuxV2Ko7SdZvdLuPVtn+E/3kR+y49x/HKM+njlFFz+z+0sulnxQO3UdC9C0XzF YaqgEbencgVe3Y/F7lf5hmg1GkniO/LvfR+ze2cOrHpNT6xPP4d4TXMV2zsVdirsVdirsVdirsVd irsVdirsVSrWvMVhpSESN6lyRVLdT8XsW/lGZWn0k8p25d7qe0u2cOkHqNz6RHP49wee6trN7qlx 6ty3wj+7iX7CD2H8c3+DTxxCg+cdodpZdVPimdug6BA5e4DsVdirsVZR+XPkPUvOvmWDSbWsdstJ L+7AqIYAaM2/7R6KO59q5GUqCQLfa2jaPp2i6Va6Vp0IgsrOMRQRDso7k9yTuT3O+YpNtyMwK7FX Yq7FXYqxT8yPy+0vzv5ek026pFeRVk0+9pVoZafijdHXuPcDJRlRQRb4y8w+XtW8vaxcaRq0Bt72 2bi6HoR2dD+0rDcHMoG2ohLcKHYq7FXYquR3Rg6MVdTVWBoQR4EYCL5soyMTYNFk+k+ebuALFfp9 ZiG3qjaQD37Nmtz9mxlvDY/Y9V2f7U5MdRzDjj3/AMX7fs97L9P1nTNQUG1nV27xn4XH+xO+anLp 54/qD2Wj7Swagfu5Anu6/JG5Q5zsVdirsVdirsVdirsVQWoazpunqTdTqjdoxu5/2I3y7Fp55PpD g6ztLBpx+8kAe7r8mIat55u5w0Vgn1aI7eqd5CPbsubfB2bGO89z9jxvaHtTkyXHCOCPf/F+z7fe xh3d2LuxZ2NWYmpJPiTmyArk8rKRkbJsrcLF2KuxV2Kpl5e8vat5h1i30jSYDcXty3FEHQDu7n9l VG5OAmkgPs38t/y+0vyR5ej021pLeS0k1C9pRppafgi9EXsPcnMWUrLaBTK8il2KuxV2KuxV2Kux Vg35qflXpfnzS1VmFprNoD9Qv6VpXcxSgbtGx+lTuO4M4TpiRb5A8w+XtY8vatPpOr27W17bmjo3 Qjs6Hoyt2IzJBtrIS3Ch2KuxV2KuxVsEqQQaEbgjAkEjcJvZebNctAFFx6yD9iYc/wAftfjmJk0O KXSvc7nTe0Grw7CXEO6W/wBvP7U6tvzC6C6s/m8Tf8asP45hz7K/myd5g9r/APVMf+lP6D+tMYfP Whv9v1Yv9ZK/8RLZjy7NyjuLssftTpJc+KPvH6iUQPOPl0gf6XT29OT/AJpyv8hm7vtDkj2j0X8/ /Yy/U4+cPLor/pdadhHJ/wA04/kM3d9oU+0ei/n/AOxl+pDzeetDT7Hqy/6qU/4kVyyPZuU9wcbJ 7U6SPLil7h+shLrn8wuotbP5PK3/ABqo/jmRDsr+dJ1uf2v/ANTx/wCmP6B+tJb3zZrl2CpuPRQ/ sQjh+P2vxzMx6HFHpfvdHqfaDV5tjLhHdHb7ef2pQSWJJNSdyTmW6YknctYUOxV2KuxV2Kpl5e8v ax5h1aDSdIt2ub24NERegHd3PRVXuTgJpID6/wDyr/KvS/ImlMisLvWbsD6/f8aVpuIogd1jU/Sx 3PYDGnO2wCmc5Bk7FXYq7FXYq7FXYq7FXYqxT8wfy38ved9L+q6lH6V5ED9S1CMD1YWP/EkP7SHY +x3yUZEIIt8kefPy68yeStSNpq0PK3cn6rfxgmCYf5Ldm8VO4+W+ZMZAtRFMXySHYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqyjyH+XXmTzrqQtNJh426EfWr+QEQQj/Kbu3go3Py3yMpAJ At9b/l9+W/l7yRpf1XTY/VvJQPruoSAerMw/4ig/ZQbD3O+Y0pEtoFMryKXYq7FXYq7FXYq7FXYq 7FXYq7FUHrGjaVrWnTadqtrHeWU4pLBKKqfAjuCOxG47YQaV84/mN/zjZqunGXUfKDNqNjuzaa5/ 0mMf8VnpKPbZv9bLo5e9rMHiU0M0ErwzxtFNGSskbgqysNiCDuDlrBZhV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2Kr4YZp5UhgjaWaQhY40BZmY7AADcnAr238uf+cbNV1Exaj5vZtOsdmXTUP8ApMg/ 4sPSIe27f6uVSy9zMQfR2kaNpWjafFp2lWsdnZQCkcES8VHiT4k9ydz3ykm2xGYFdirsVdirsVdi rsVdirsVdirsVdirsVdirEvO/wCVnk3zjEf0rZhL2lI9Rt6R3K0FBV6EOB4OCMlGZCCLeA+c/wDn GvzjpBe40J11yxG4RKRXSj3jY8W/2DEn+XLo5QebAweT3tje2Ny9re28lrdRGkkEyNHIp8GVgCMs YKGFXYq7FXYq7FXYq7FXYq7FXYqr2Vje31ylrZW8l1dSmkcEKNJIx8FVQScCvWfJn/ONfnDV2S41 510OxJBMb0lumHtGp4p/s2qP5TlcsoHJmIPffJP5W+TfJ0S/oqzD3tKPqVxSS5avX46AID4IAMpl MlmBTLcil2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpZrvljy7r9v8AV9a063v4wCE9 eNWZa/yN9pT/AKpwgkIIeXeYf+cX/JV8Wk0e7udHlb7KV+swj/YSFZP+SmWDKWJg871n/nGDz5aF m025s9TiH2VDtBKfmsg4D/g8mMoRwFhupflB+ZunEi48uXj06m3QXI8OsBkyQmGPCWPXWga7aHjd addW58JYZEPSv7SjtkrRSAwq7FUfa6Brt2eNrp11cHwihkc9K/sqe2C1pkOm/lB+ZuokC38uXiV6 G4QWw8Os5jyJmE8JZlo3/OMHny7KtqVzZ6ZEftKXaeUfJYxwP/B5E5Qy4C9E8vf84v8AkqxKyaxd 3OsSr9pK/VoT/sIy0n/JTIHKUiD1HQvLHl3QLf6vounW9hGQA/oRqrNT+dvtMf8AWOVkksgEzwJd irsVdirsVdirsVdirsVdir//2Q== - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:5a94be12-7991-7c4d-a4ce-facc73f3e8c5 - uuid:ad6a78c1-3ce1-4458-89e0-59f1286ed493 - - uuid:3e593450-be4b-41f3-a1ac-f0c60f6cd9f7 - xmp.did:e4637d7a-1015-5a4e-8a54-8a417d835ed6 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:5a94be12-7991-7c4d-a4ce-facc73f3e8c5 - 2018-01-30T08:56:11-07:00 - Adobe Illustrator CC 22.0 (Windows) - / - - - - Web - Document - 1 - False - False - - 256.000000 - 256.000000 - Pixels - - - - Cyan - Magenta - Yellow - Black - - - - - - Default Swatch Group - 0 - - - - White - RGB - PROCESS - 255 - 255 - 255 - - - Black - RGB - PROCESS - 0 - 0 - 0 - - - RGB Red - RGB - PROCESS - 255 - 0 - 0 - - - RGB Yellow - RGB - PROCESS - 255 - 255 - 0 - - - RGB Green - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blue - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Grays - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Web Color Group - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - Adobe PDF library 15.00 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 256.0 256.0]/Type/Page>> endobj 8 0 obj <>stream -HlRKN0 @]IvK@HHl@ztqRQTʼng<)aJ7 :\^?O3"ުj.G\c}[ႂl(:d4.23!Ptdvn> <ߚBF! &b -k4l8szmwr4%>stream -8;XEH5n3u?#X%f8GiJVWr.Ns1>8Cj@RPmkinGjs>"3d12R9SNNc8( -endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 5 0 obj <> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 11 0 obj <> endobj 10 0 obj [/ICCBased 17 0 R] endobj 17 0 obj <>stream -HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  - 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 -V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= -x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- -ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 -N')].uJr - wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 -n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! -zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km -endstream endobj 9 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 17.0 -%%AI8_CreatorVersion: 22.0.1 -%%For: (MT-User) () -%%Title: (Untitled-2) -%%CreationDate: 1/30/2018 8:56 AM -%%Canvassize: 16383 -%%BoundingBox: 556 -511 810 -257 -%%HiResBoundingBox: 556.1875 -510.8125 809.8125 -257.1875 -%%DocumentProcessColors: Cyan Magenta Yellow Black -%AI5_FileFormat 13.0 -%AI12_BuildNumber: 249 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Registration]) -%AI3_Cropmarks: 555 -512 811 -256 -%AI3_TemplateBox: 683.5 -384.5 683.5 -384.5 -%AI3_TileBox: 389 -767.039978027344 974.9599609375 0 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI17_Begin_Content_if_version_gt:17 1 -%AI9_OpenToView: 217.75 -186.5 4 3708 1940 18 1 0 68 168 0 0 0 1 1 0 1 1 0 1 -%AI17_Alternate_Content -%AI9_OpenToView: 217.75 -186.5 4 3708 1940 18 1 0 68 168 0 0 0 1 1 0 1 1 0 1 -%AI17_End_Versioned_Content -%AI5_OpenViewLayers: 7 -%%PageOrigin:283 -684 -%AI7_GridSettings: 70 8 70 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MS -%%EndComments - -endstream endobj 20 0 obj <>stream -%%BoundingBox: 556 -511 810 -257 -%%HiResBoundingBox: 556.1875 -510.8125 809.8125 -257.1875 -%AI7_Thumbnail: 128 128 8 -%%BeginData: 29664 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45FD35FFA8A87D7D5252282E2728272E272827525253537E7EA9A9FD -%64FFA87E52522728052700FD042728272827282728052805270027272828 -%7D7DA8AFFD5CFF7D7D282805282728272827282728272827282728272827 -%2827282728272827280528275252A8A9FD56FF7D53272700272727052827 -%270528272705282727052827270528272705282727052827270528052700 -%28527EA8FD50FFA87D27282728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728055259A9FD4CFF -%A82828002727282728272827282728272827282728272827282728272827 -%28272827282728272827282728272827282728052705527DFD48FF7D5227 -%272728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272728A8FD44FFA828 -%270028272705282727052827270528272705282727052827270528272705 -%28272705282727052827270528272705282727052827270528272700527D -%FD40FFA8532728272E2728272E2728272E2728272E2728272E2728272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E272852AFFD3DFF522700282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282727057DA8FD39FFA82728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272800527EFD36FFA85900270528272705282727052827270528272705 -%282727052827270528272705282727052827270528272705282727052827 -%270528272705282727052827270528272705282727002752FD34FFA85205 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%28272E2728272E2728272E272728A9FD31FF7D2700282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282727057EFD2FFF52282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28007DFD2DFF2E2705282727052827270528272705282727052827270528 -%272705282727052827270528272705280527052805270528272705282727 -%052827270528272705282727052827270528272705282727052827270052 -%A8FD2AFF2827272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728052E27282752272827522728272E2728052E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2752 -%A8FD27FFA927272728272827282728272827282728272827282728272827 -%282728272805280528274C6F9A939A93BCB5BC93BCB5BC939A6F704B4C27 -%280528272827282728272827282728272827282728272827282728272827 -%280528A8FD25FFA927282728272827282728272827282728272827282728 -%272827282728272827524B9A93BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BC6F76272805282728272827282728272827282728272827282728 -%2728272827282728A8FD23FFA8FD04270528272705282727052827270528 -%27270528272705282727054C4B94B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC937027270528272705282727052827270528 -%2727052827270528272705280528A8FD22FF28282728272E2728272E2728 -%272E2728272E2728272E2728272E27284B9AB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCBBBC93762728272E2728 -%272E2728272E2728272E2728272E2728272E27282752A8FD20FF28272728 -%27282728272827282728272827282728272827282728277093BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BC4B28052827282728272827282728272827282728272827282728 -%0052A8FD1EFF2E2827282728272827282728272827282728272827282728 -%05284BBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC9376272827282728272827282728 -%2728272827282728272827280553FD1DFF52270528272705282727052827 -%2705282727052827270528054C93BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%942728052705282727052827270528272705282727052827270059FD1BFF -%7D27272E2728272E2728272E2728272E2728272E2728272E279AB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F28052E2728272E2728272E2728 -%272E2728272E2728272E0584FD19FFA82827282728272827282728272827 -%28272827282728272827BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BC934C0528272827282728272827282728272827282728272805A8FD -%18FF52052827282728272827282728272827282728272827286FBCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB57605282728272827 -%28272827282728272827282728272828FD17FF5900280528272705282727 -%0528272705282727052805276FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB594272827270528272705282727052827270528 -%2727052752FD15FFA82728272E2728272E2728272E2728272E2728272E27 -%4C93BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BC2728272E2728272E2728272E2728272E2728272E27287DFD14FF27 -%28272827282728272827282728272827282728054C93BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC2728272827 -%2827282728272827282728272827280528A8FD12FF532727282728272827 -%2827282728272827282728054C93BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC2728272827282728272827 -%282728272827282728057DFD11FF84272727052827270528272705282727 -%05282727054C93BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BC27270528272705282727052827270528 -%2727052805A8FD10FF532728272E2728272E2728272E2728272E27282752 -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCBBBC272E2728272E2728272E2728272E2728272E2728 -%52FD0FFFA8002827282728272827282728272827282728052893BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB59A27282728272827282728272827282728272827277DFD0E -%FF2E2827282728272827282728272827282728272893BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB59A0528272827282728272827282728272827282752FD0DFF7D27 -%2727052827270528272705282727052827274BBCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB570052827270528272705282727052827270528007DFD0CFF522728 -%272E2728272E2728272E2728272E27284BBCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCBBBCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5522728272E2728272E2728272E2728272E272828FD0BFFA8002827 -%28272827282728272827282728272827BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A6F764B4C274C274C274C6F -%9493BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BC93280528272827282728272827282728272827277DFD0AFF522727 -%282728272827282728272827282728059AB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A6F522728052827282728272805 -%282728277693BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BC6F28272827282728272827282728272827282752FD09FFA827 -%27270528272705282727052827270528054CB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F4C052705282727052827270528 -%27270528052705284B94B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BC27282727052827270528272705282727052805A8FD08 -%FF7D2728272E2728272E2728272E2728272E272893BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCBB9A4B2E2728272E2728272E2728 -%272E2728272E2728272E2728055293BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC2728272E2728272E2728272E2728272E2727 -%53FD08FF2728272827282728272827282728272827284BBCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC937005282728272827282728 -%2728272827282728272827282728272805284BBCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5700528272827282728272827282728 -%27282728A8FD06FF7E272728272827282728272827282728272827BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC934C052827282728 -%272827282728272827282728272827282728272827282728279AB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC93282728272827282728 -%272827282728272827A8FD06FF5300270528272705282727052827270528 -%0570B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F280527 -%052827270528272705282727052827270528272705282727052827270528 -%0570B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B282727 -%052827270528272705282727052752FD06FF2828272E2728272E2728272E -%2728272E272893BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%6F2E2728272E2728272E2728272E2728272E2728272E2728272E2728272E -%2728272E27280576B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BC2728272E2728272E2728272E2728272E272EA8FD04FF7D2727282728 -%2728272827282728272827284BBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BC6F2805282728272827282728272827282728272827282728 -%27282728272827282728272827280576B5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB54C0528272827282728272827282728272805A8FD04 -%FF7D05282728272827282728272827282728059AB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC6F2827282728272827282728272827282728 -%27282728272827282728272827282728272827282728059AB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC9328272827282728272827282728 -%2728272853FD04FF27270528272705282727052827270528054BB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC932705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%059AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC272827270528 -%27270528272705282727002EFFFFFFA828272E2728272E2728272E272827 -%2E27286FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB54C272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E27BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5762728272E2728272E2728272E2728272827AFFFFF7E002827282728 -%27282728272827282728279AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5700528272827282728272827282728272827282728272827282728 -%2728272827282728272827282728272827284BBCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BC9328272827282728272827282728272827277DFF -%FF522827282728272827282728272827282752B5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB59A05282728272827282728272827282728272827 -%28272827282728272827282728272827282728272827282728272893BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC2728272827282728272827 -%2827282728057DFFFF52002827270528272705282727052827274BBCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC272705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%05282727054CB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5700528 -%272705282727052827270528272728FFFF27282728272E2728272E272827 -%2E2728279ABBBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC9328272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E279AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BC6F2E2728272E2728272E2728272E27282752FFA82705282728 -%27282728272827282728272893BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB54C0528272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827284BBCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BC27282728272827282728272827282727 -%05A8A82728272827282728272827282728272827BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB59A27282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%2893BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB54C27282728272827 -%2827282728272827277D59272727052827270528272705282727054CB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F2705282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%05282727052827270570B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%4B270528272705282727052827270528007D7D2728272E2728272E272827 -%2E2728272E6FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB552272E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E4BBCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCBB76052E2728272E2728272E2728272E27285352272728 -%272827282728272827282728059AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BC2728272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728052893BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F28272827282728272827282728 -%27280552522728272827282728272827282728272893BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BC6F282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728059AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A2728272827 -%28272827282728272827282E272705282727052827270528272705282794 -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB57005282727052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%0528272705282727052827274BBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BC93280527052827270528272705282727052E28272E2728272E272827 -%2E2728272E272893BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B2E27 -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E27280576B5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BC2728272E2728272E2728272E2728272E272728 -%272827282728272827282728272827BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB54C052827282728272827282728272827282728272827282728 -%2728272827282728272827282728272827282728272827282728272827BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC932827282728272827282728 -%272827282728282728272827282728272827282728274CB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BC2728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%2827282728274CB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC272827 -%282728272827282728272827282705282727052827270528272705282727 -%27BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC934C0527052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%052827270528272705282727052827BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BC9327052827270528272705282727052827272E2728272E272827 -%2E2728272E27282752B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B -%28272E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2752B5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BC272E2728272E2728272E2728272E272827 -%2728272827282728272827282728272827BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB54C05282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5280528272827282728 -%27282728272827282827282728272827282728272827282728B5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B2827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827280552B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC27 -%282728272827282728272827282728272727052827270528272705282727 -%052827BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB54C052827270528 -%272705282727052827270528272705282727052827270528272705282727 -%052827270528272705282727052827274BBCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BC93280527052827270528272705282727052852272E272827 -%2E2728272E2728272E272893BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BC6F2E2728272E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E27280576BBBCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC2728272E2728272E2728272E272827 -%2828282727282728272827282728272827282794B5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5940528272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%27286FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F28272827282728 -%2728272827282728055253272827282728272827282728272827286FBCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC93282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827282728272827BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%9A0528272827282728272827282728272852522727270528272705282727 -%052827270570B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC27270528 -%272705282727052827270528272705282727052827270528272705282727 -%05282727052827270528272705282727054CB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BC6F27052827270528272705282727052800597E052827 -%2E2728272E2728272E2728272E4BBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCBB76052E2728272E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E6FBCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB576052E2728272E2728272E272827 -%2E27277D7D272728272827282728272827282728054CB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC932805282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2728059AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC272827282728 -%2728272827282728272805A8A82728272827282728272827282728272827 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B2827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728274CB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BC932827282728272827282728272827282728A8A8280528272705282727 -%05282727052827276FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A -%052705282727052827270528272705282727052827270528272705282727 -%0528272705282727052827270528272705286FBCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5940528272705282727052827270528272727FFFF2E -%282728272E2728272E2728272E27280576BBBCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB552052E2728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E4BBCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B2E2728272E2728272E272827 -%2E27282753FFFF590028272827282728272827282728272827BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC9328052827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2728059AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB54C05282728 -%27282728272827282728272752FFFF7D2727282728272827282728272827 -%28272893BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B28272827 -%282728272827282728272827282728272827282728272827282728272827 -%2827282728272827280576B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BC272827282728272827282728272827280584FFFFA8052705282727 -%052827270528272705280570B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BC2727052827270528272705282727052827270528272705282727 -%05282727052827270528272705282727052893BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BC4B2827270528272705282727052827270528A8FF -%FFFF52272E2728272E2728272E2728272E272827BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCBB9A272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728272E2728272E2728272E93BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5522728272E2728272E272827 -%2E2728272828FD04FF5227272827282728272827282728272827286FBCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB570052827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%286FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5940528272827 -%2827282728272827282728007DFD04FFA827282728272827282728272827 -%282728274CB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB57605 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827286FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BC4B28272827282728272827282728272827277DFD04FFA8280527052827 -%27052827270528272705282794B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5700528272705282727052827270528272705282727052827 -%270528272705282727052805274BBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BC93282727052827270528272705282727052827FD06FF52 -%28272E2728272E2728272E2728272E27284BBCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB59A2728272E2728272E2728272E2728272E27 -%28272E2728272E2728272E2728272E27286FBCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5762728272E2728272E2728272E2728272E27 -%59FD06FFA805282728272827282728272827282728272893BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A2728052827282728272827 -%28272827282728272827282728272827282728052893BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB59A27282728272827282728272827 -%28272827277DFD06FFA852272827282728272827282728272827280576B5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B28052827 -%28272827282728272827282728272827282728272827282776B5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC4B2827282728272827 -%28272827282728272827FD08FF5227272705282727052827270528272705 -%280594B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC93 -%4B052827270528272705282727052827270528272705280527279AB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC93282727052827 -%27052827270528272705280059FD08FFAF2728272E2728272E2728272E27 -%28272E27284BBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB59A4B28052E2728272E2728272E2728272E2728272E275293BCBB -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB552272827 -%2E2728272E2728272E2728272E2728A8FD09FF5205282728272827282728 -%27282728272827286FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BC93702728052805280528052805280528274C4B9AB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5700528 -%272827282728272827282728272827272EFD0AFF7D282728272827282728 -%2728272827282728272893BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC939A6F704B52274C27524B766FBCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC2728 -%2728272827282728272827282728272805A8FD0BFFFD0427052827270528 -%2727052827270528054CB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC93BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC27282727 -%05282727052827270528272705280552AFFD0BFFA80528272E2728272E27 -%28272E2728272E27280576BBBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F2E272827 -%2E2728272E2728272E2728272E27277DFD0DFF5205282728272827282728 -%2728272827282728059AB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F28052827282728 -%27282728272827282728272728FD0EFF7D28272827282728272827282728 -%27282728272827BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC932827282728272827282728 -%272827282728272805A8FD0FFF2827272705282727052827270528272705 -%28272727BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BC9327052827270528272705282727052827 -%2705280052FD10FFAF2728272E2728272E2728272E2728272E2728272E27 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB54C052E2728272E2728272E2728272E2728272E2728A8 -%FD11FF7D002827282728272827282728272827282728272827BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%934C052827282728272827282728272827282728272752FD12FFA8522728 -%27282728272827282728272827282728272827BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB54C052827282728 -%272827282728272827282728272827FD14FF7D2727270528272705282727 -%052827270528272705282794B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC932805270528272705282727052827270528 -%272705280084FD15FF5327272E2728272E2728272E2728272E2728272E27 -%28279ABBBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BC932E2728272E2728272E2728272E2728272E2728272E057DFD17FF2827 -%27282728272827282728272827282728272827280576B5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC6F2805282728272827282728 -%272827282728272827280052AFFD17FFA827282728272827282728272827 -%282728272827282728055293BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BC4B2827282728272827282728272827282728272827282728A8 -%FD19FF7D0027052827270528272705282727052827270528272705286FBC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB57027270528272705282727 -%05282727052827270528272705277DFD1BFF7D052E2728272E2728272E27 -%28272E2728272E2728272E27284BBCBBBCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BC93522728272E2728272E2728272E2728272E2728272E2728272853FD1D -%FF52002827282728272827282728272827282728272827282728057093BC -%B5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC -%B5BCB5BCB5BCB5BCB5BCB5BC4B2805282728272827282728272827282728 -%272827282728272728FD1FFF520528272827282728272827282728272827 -%2827282728272805284BBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BC9376272827282728272827 -%282728272827282728272827282728272828FD20FFA82800282727052827 -%27052827270528272705282727052827270528274C6FBCB5BCB5BCB5BCB5 -%BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5944B2805 -%2705282727052827270528272705282727052827270528272727FD22FFA8 -%2E2728272E2728272E2728272E2728272E2728272E2728272E2728052E27 -%7693BCBBBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCBBBCB5 -%BC6F4C272E2728272E2728272E2728272E2728272E2728272E2728272E27 -%2827FD24FFA8280528272827282728272827282728272827282728272827 -%2827280528052827706FBCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5BCB5 -%BC939A4B4C05280528272827282728272827282728272827282728272827 -%282728272727A8FD25FFA852272827282728272827282728272827282728 -%2728272827282728272827280528274C4B766F9A93BCB5BCB5BCB5BC93BC -%939A6F762728052827282728272827282728272827282728272827282728 -%272827282728272727FD28FFA82E00270528272705282727052827270528 -%272705282727052827270528272705280527052805272728272727282727 -%052805270528052705282727052827270528272705282727052827270528 -%272705282727052727A9FD2AFF53052E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728272E2728272E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272852FD2DFF5900282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%2752FD2FFF7E272827282728272827282728272827282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2728272827282728272827282728272827282728272805287DFD31FFA8FD -%042705282727052827270528272705282727052827270528272705282727 -%052827270528272705282727052827270528272705282727052827270528 -%27270528272705282727052800287EFD34FF5328272E2728272E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E2728272E2728272E2728272E2728272E2728272E27282728 -%277DFD37FF7D280028272827282728272827282728272827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827282728272827282728272727A8FD3AFF7D052827282728272827 -%282728272827282728272827282728272827282728272827282728272827 -%28272827282728272827282728272827282728272827282728052853FD3D -%FFA828270527052827270528272705282727052827270528272705282727 -%052827270528272705282727052827270528272705282727052827270528 -%27270527005284FD40FF7E5205282728272E2728272E2728272E2728272E -%2728272E2728272E2728272E2728272E2728272E2728272E2728272E2728 -%272E2728272E272827282EA8FD44FF7E2827052727282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%2728272827282728052700527DFD48FF7D53272727282728272827282728 -%272827282728272827282728272827282728272827282728272827282728 -%272827282728052852A8FD4CFFA852280027052705282727052827270528 -%272705282727052827270528272705282727052827270528272705280027 -%277DA8FD51FFA8522E05282728272E2728272E2728272E2728272E272827 -%2E2728272E2728272E2728272E2728052828597DFD56FFA8A85252272700 -%282727272827282728272827282728272827282728272805280527002828 -%597DFD5EFF7D7D282E272700282728272827282728272827282728052727 -%2827525384A8FD64FFA8A87D7D5253282805282727052827272752525959 -%A8A8FD34FFFF -%%EndData - -endstream endobj 21 0 obj <>stream -%AI12_CompressedDataxk\Ǖ%]C ؃Q:*+<ۆdw T"ߵv<9'(U!8qc?뷟z'o}˗/~~zimwo~Qɯ￾{O~;|Wo/>5?ޢV̪!܇կɳW}/?66Y~xzͫ/^^C-um1iI~K*|yo߼~~ׯ_~gBͳ{N/= sK;6OO߼x?}aZ}*kto<>o1lM{os|⫟>!ݡk1?i|zw/_긴{L}ճ7_Q tɆwo>´H/f{̛_?{şkIϟ=c[՟S?8Խm>3_*/^}q͋w|WiWwrrZϗ.Ot8^ͳ/^/{uw~D?w'pU1buA^U7jUNRs-7-zf=01bWmG +JZrUҧU>roe=}2cW ,O>)*yUVTʓOKkZL ܮ뼾^WǚW9y=לeYsY8,?jwwzrYy/+n268*/+=l/+ŕKRj%ִ캖ZnYl]naM^sMv|ZQO7ku 'n!\Nb3^|:_oηn0 N--6n1L -:EeݬyUW*W[A_J\)~UܪUnD-eSKYfsޔR0e*WW%mJ\*t0MbVEZJ'_`s*RQݬvkVmRG^Jl;uy|sZgr3yVߠa9%KID)_bkèk[ja$媖,%ՂÎC-B@Jn՚:dݒuj((d׍If#;ߘoW2(t2*Sz}:ex - r΀aR7k+@$Tj7Xk+Ӕ#4[l3&2@] 7-SyW cK,5"xS) .7Yp%ahC bnF+7ccgs#|ո{g}UHlyf2!2} -kc@ᡉ *aeKL_XoYI5 ]zA(ߛ+}1,d[ƺxgqNy -ijMm5gmIC/p|u+k)nJX\m%xF:XZHNfr; %ʲK:~y]?j.dnvzg+P*5Y %_,]P½e^"zRFCNEz4,{Sb| jqZ -t!/w)US]&7}rƳxS+i^!PrbԢ2d->'!z)Yv:r55|ft'tD34Kr )Ns/CuvϥSNS}=U8UA \ƱʯDVLa"GPJūΕ8JFĢ'(f!RYעu*E"h*hQԺuA+A'"li9("t ja)\*pD*"WERSŮ[(x -//K[+jξʿ(E]-e![l+UZ'r9tib7eC `I1m4 -rKhy*\n\zbwK"_(bd-bk#P|xr~\A{K/սtJA:kC-7JӯZ5RhkO#jm7inXK%rifwL6j6mt]Bks}esИJgDvP( -z< B\j7XtTaxImQ܂.T1g a1Dh j8b:N`>F.b@²ads5%Ә|#bPBr1,_ L2S10LSO>Ss"W.ӹDr4<sQX vJ 7pbai{i<] 71Z1V\M=:Ab:Lń}#QFmTQBi+mu.tt \F긢j-Ov[ --[(ۖ k3Ӛk.Q+Yxyj<StZy냡C!9D{i1lLG짏i{zO&:$}.w86ގ:@Tf:;CBӡ&;ObcD%i0y*}O-"< -O,hXat2,*Sت=J>'f!أ[::>'6g CK%@83fr=-C`mwZ.,JlFG=||=>6?>zrIXKdcۊ΋/ms"7 zcv=V/Z 8 Z]izLJL=WJ'C=w=҅⃽)c>߹]^YmhLʴT/ʘ!CWH'l)} OŽފA+a=o' ,&,$Q,2EGIOmy3*~1C$^DݏRhoOT}.qJBy%!DJ+:~Z+= %ekx_wM.Wo -jh+P覭%СقZCa2P]$b Y>,K%X%u"aS/O^觮;:bRtMKt홻zv'T$%{t6k}ާi=_U^=W鵬M@]|eL5eWjstGnD.Az'ZhD P PJBcVCr,̤dNCwj+gHJS"=;5Uuw MYSݦДswQJE k8 -rVa+O!El%j&1ܴ `bwPTz%^.b6/JEx\ّRcZx-NUn*5G(ԥu]%EpW{ip -Wr< ` kFPJ[AN+vL5lN [QB7ʘ;*eQ״8EV9 -VK7?1\,;V eQ6.e{m z|ŻG!'4I*4钒M,AQED+3N`8 Xl)>hʚlo\۩J1n]9CqoRP~+SEPةMY>)͆>jCuԠP2PA~?U\V -=r=Lޫ;F<[NhuJ]VgڡVLj<5 C'9u͂Y/!4W%ය @"ҜPnsɓO @PB aN$2 P%1U3ִf[$/v%Y%_FvS;e?*uuo1{q=TKxlAn_ǕR\77gAIM\s u$ - 5-5r5 Ge ^ 8 ^ AO |'h!);Tjkf5 BwSyqU pk[3-ж6^oebۘFhZ`T{`VdTۘ3׮9mϔY-#vn9_.ZSlgq HQ~(?RoG#E|w=j&|J8N`b^*B'u8<sDy_Mޣ>a{ӨG!=x}TcDMG0;CD`hhM{=MbsX!oCom\]~{ԯ;M6܀<Ʋҟmƕ?UϙΥq35QjdmMڱ -vϑ -a-=WZA,Ci<NlI Ѡ9KxtۘCudRr$dXS -)Kз%= [ˈZpwF ΀')(g|cSG|+ ZW/lqäǬù?c|~/ng1ykId>Q%T/zWgm9eql)[\-i`U8젟4.lEց됍#)5nQ]ZGmpAmbks Y;zwu4;qۉ/4ҽnÅuBs׻ nՁRCGkq4GWqs G8YqiF4:Uf*QM1MwMKrq~d6oeb AAU`?As%?MV(yf{' c}q 2n8m *N 0D2fB F 2 -uFAFd7 @IQ0G4Өzz!#7 ( ,?,S@<|]nb -cdQ1j\ط\)ß}ǀvF7ZpUcʞ -[xq=~-WgI?gk9E}lsU7iQ75hQ6rrDO>٦sq&gzJν4 cLJcWUۚĒhPE X"4? -hjXEm0:8Zh*’|pDg%aF`Kp;':ý޷Hﴼ{}@T#IQ;kXgW %[ym7,O_VD;z{|7,M -_u8 -ReOi$@9ReJEV2Ayx_q?Wɤ9Y2Y &kVZn%KkW5Q[lR:1ݯ[;@aY=,wc]"lhSE)97[U{qk9=:)a\ 7sͧj9%ٺ մWzYlm"kFil|%i6xK n^Ų^֡[/!q7䋻T\*m;,Cg?H$qA6yYmb9AY9L֧)z{Cϭޫx9J&!V,@5SP -f &;gU tIt!zRk7[Sآ~Z,s'4bXG͕G,\Vpk1.(^Fxū)qpV ?{D@!-?<_ǭhW";sГhWBV\|ɿ*Φ.nI\ޕ-gz_fi_Z QR dY\Rj6ZJ6I~y%u͌}!{F]0vK܍ 1VՍץA$n3ߪ "DžRA@ٖY -A+i/zuj9U%NE )qtQ< T`_#g6}. KZۓ&A*-/$kѐk18{ 3{E<-f1ٖEj5k--ZCzYĸPqIcsOeNf0V #."5+XD[ Rû~]%6*in>Y_iV4;jb坄h(mqUQyM&dWGz&S*i"ʆyp#.}M`1n>,ҏh] ڝ[:oqOS\HGͯѣإmSn^Ar.U5?i.Nsv[z~'bMPf~| ƦJExt+1n=[S0c `~. &6줯߽o{_?<*3H-MeL=/㒙=A`)V~ݽqw;ދ)VSuhmV|l&3|ګ{|9v q{<gJ4tݤ\BH@;'W,ςxBl rYRa\[?h$_?^>{Wj=['w{p5(^e&I=|ʴK\hZHԤ‚~حcZ:jPUC'ΛL:O=s&i%)LK#=5 ,[Mȃa0U>oxul}c涐CU{S;F'P}W #n7yq^"%ǽ{;BMOCW՜gIf$&G|=~zK ݍەvS4l4'|XCPSvȞq^h OvP2Sw׳JAfJkW >TF jHZzP֩gazf̣k ^qs.L2ɠwzpQؚtZWΕ)MV`tԍ 8530yZHb,9ut-`MOG{Y0y߿˯_? -'7._gox䧇?#l FRdEFOUQN us͉z 56ǥcL &!zZ#RCAՆ~%2 eѸ*>8?B|-Qk҇0\QkAYmă6qqyCP[{W&Ey/ŵ~l&ߝ")XFHɴ -f?ok7q\X.\XK vn/k!]>d za8G:G[6V6ffLX .f Ÿ qxaDQCY/PRklQ>9  N?0 IDVPJN lh{NS+,UPN| R l\1$ebwwht)QފTz>Z ϑP -PE0\,|?s> -TרvG(dlL)u%%Vr'-D, E֭6yp -H?"35#76:iv p%S.xȘ3%6cD&;"DJf& 4NR*)V37܍x+SA)&8 C#mFyn#yŁZc8 2#fX.+Wq< Acڍ÷*CiJ~Ъ, F.IHXFLw]YA_mKHy RFk@4 bTgq-ZxEgh.tUۚ6 |^7Z,*4 -HUuT[ 5REm5)#K;opaF Pb)ޚIgǑ[dgukqxG6"x6۟K' G>D<#>"ψnM7Lc\T>@AB[?rJFIވ#lmTd>О݅ -5ĕ|bzP|(+ы{ $PT݃Ɗ9n2jITTҧ -$+EPE%Ʌ'X|^EtLBHm:v>7у;`/DU KlaxёH +fzU Y"5M D6j5 -g[ @%z=YzLu`[uY,QQ`FK5W[-:Wb̃kJ? w 1gHcq:`"qIm -<ꚜGT/E - &'DEv\FwR#pb︕ʓb|_J ݙѿHeM -9p -*o\lR]־PK:?<;IT:>0{"D ->fRitc7Tj&ʳt<ʯb\Wy?9wZ'Vڤ48γb߯uUug,S}^yc xE9[M-vaw&xC+u,(^'>K.4bDtJ}gqF=U._ۺ -&ӋY9i< -/%Wx+4^-u(O ~ Z3 t|A&Ϧ]TpObʵ eU]U ZjiKNij&L =bx&Tc8>3Գ/-K #s2}{i.#>r(98!#NJnϧK91;8e~$c_\xTCwc3v(6۹T[;ڂdїj?w4Ž?.]JQr.rꦥ4tvRbD.(iC99`6T00^f?`@䕤oL#Y, î__f؏%4Z6̀|nSz(m7JL͚QbOhV Zb^AX%x ciUZuM@pJЬW<N[@ЬfhO'QO `YcukD}chN:cm_-`F6:s4B<;P {bn66+O~ƌhqh#،-5s{ 8j?/i,S]mNA?ek'ghZi,z[34MItUibQ)iQB\u -<4h7 -!-DS}:wDAM<~x~nbZ Trcm:0dC-f^~}!I  4Ie,@_QZ)XSG - -Xn"_:eqK ,Zx -11 p8u/L{w,}o݅g@"ʺD+{0|}J(&͢ܣ,K4͵:l#ND*w~S|Ā-1`:C}:K hd:Z(PHE't1 PrT!.hiTt (^A|1 %̠FQ1Ƴ&ƣ\Qlnc .TOaCWJMf\\cuhQ9NN$èV0%t.d1hPzk~}!訷}4Y&FG?ڠ\ba!aaWHuDh1wGU,I>0bG4xp`ts̀ -0S7Q ePIP^Xf&'Af\ $W[3i%8ÓpA>.G4SF//4Aھb,xqJT?J04P oslQO8o14CZAG3ު>jjFP-hcmKίZt4L4`ZUKWY= lllUr,u1&1L_ukpE$T,$!RN -m+]!]>^J%B,f(jl(. -ݪt,9 -O(,4gS2t(6aԔX-Uվ=4d^*ĩ 7 Q&ac3KC &æQaE4bLrȹ2L&6bE ?S ,D\mhSŝ@0ZWf#dTTRXn\1k'QKUV{PkDT]! ,FAiVh& *yр1$]6sU{zStW\%x #hqg s`Z 5A\E|E#H/'R%ѩqC&O` -i,>(#pxzGGzE+KAKZYCqPe I;.k5]P`a]/A&4j qW-m)qmngm6"gڦ# 6&c8(#HE)Ö$mN"%̳xdq~ -t< -.`=oxp&StFPMJ 1ulApr{c T4Gҡ*Hh<1X^ihQ48XX7=\?g >d41b r/b8-a 1c8vE6@vnP4wѤ.*<3ͅXKG bQќ%nv A7dRcqr~ JVđ^z4NEjĄp0fǢ PƋ%_L<5bغߍ n}/#Ӱ7.QS3ȻZ&ty0 ޡ^[yj<8B*AW xPp5o9DsN}yG7SNr&$b*[)-O-]L`vZ oU553E <:*z[ - gha0j]-z/>0nc!e[ё| -m$R@$3I[/.\>&^G':s B&-4-n#)/q;Qv%wc|:[-.~*vPXFe4w1~WrqF/6M-=g@(b|Q!`݂k*SW[tvNo#x`Q.[~p84q7b^ MEL'1{Cp$#Ԣce S - S3e6,1F'jeݸ<8XXGA15C5Hg^ڙY\J\Rnd UmaS{nQI,aGwjv;XU@bfj)3*6HJD/^k&8J~˴NcK)S2}}iGl`H}qt#ޢ/PH=aN ƵKvaZT1~ 73\Fki,TS3}ψ6Ugt}c|zI RAW8AV,NlJ[ -֯l | RKKD%ݯn`E̜^яtg gI8}d5 Mu NbF>2򖎿4#MmxB.%R ~\(*4N* }ޏ7oր0Y/] R9h bZ -cq~Yr#$(`%;7 HEũbNS _L-6-b#p*y܉n3j [XaQ^NG`o55g8,jMG9('R0BG(OԀ#NXQ<4ol ͈7dn1Fafإ?Uŕ{mPifnG*=R ce4 #c02&} Mpɘ`'%cP2& %cGɘ0' pBh<ᄎ1S>:ƄC8cL:.:0o8dt=tpǘG q1a N( q蠈qh0FLGhȉEP/>ECU-jQq,&ˢ/NbB`0,&(9.leh|8Wx#p^1"8N _;Q40>N8bD'FH} qgs2{i6GL'Ɨǰ&giDZАn-en[ld[5Me++{MD%%L[tk0˴e+:%W}=~xdhfK's -X[m':4js2}i zT(C( Zѓ A50NuYtS4$:i3}(+x5J[T*Q2#@B6+ en1Sef@_44Y.n\"4M448PZRFO5 6 .C3@KvF.1SÔ _La$?$` 73if7C(j xjJ 3>]%aK(v(tH{k$L𴇖?b/jt`7܊0 r4DBj = ,N b%{%RO q$F܊sd]B4B ?5+ ק!8Ac_|ޯ۷-y`כW-\FSD<$MB=Jsؘ[j!E`#lD Foi0zkKkjPN|1^$qsEzp,BNʝP@+JyU{~ffbhiEgh֕{_Js-CYgg|SC20X_X>A1._ -Y1mZX=eưm-5='B:+Nv~1՘Ty&8r$) -8B$.։.XRȟ++*kՄ Zk\$2#KPjyy]me;=D3Պ }qڃ.MEETAt]zfT\E0FLcS*`A- :Ԣ_LK1O*[<`[{h Ο/ц`RC1Т ~LMS< 桵%qo_J&̢"fJ!"j 0Yrqmȓbp5U7 ƁL͈B" -/Ph"'OC2r:QM= PdNBƫ%:3y4KB5Ռ}Al Rh}Lv*!\4ċID7]?4mj_AM DDFiD~>amG_ƈV10({<mLhVŬ B߽05HzFnN 5x-^(w*~K)w!K} Z I}/n_gi,+>0P7 *йCzmbK%<5 !/1Xأ7r  hiw]lv@!Æ?G3y@+06S󃖊==奆e\ei.K{pTK$L;Q% ⑀{HSG=V+jG osZ.rR; /T>5S֨٥)Zfɵx6-<.p{坯<Ɲ=v:Z4`$-XZ^kZAobkG"Pl1_KLܩDAbfh݂TP>5Q֨O٥)YPdL2$f#O"Z~T,:_`fM]\f~x?2[%8w/_]w~#=weNn?{trpLQP<٪O#^)d[+Y&MԘҋb6!X9̠VV"-ŖJ.?-sfU$Uqf"LݲTH58UUDUTa]ץ#+؅EV Ne%9Hu`L{Q+fJ@ь/fQ@t|)#0#ɐx5#cŤ>Լ-Y ͠Vy/Hcl)K%ĔLzfV\Rc;6,0N,Z*B{Ť< F1.ݥ:k{w6'D/XQį;)1Ua*]vHQKODS zI!}&$QKSX/t`xTȤ:B{ʃ{STg0ኖT*F &c+D"h<3Ra\81Dz`FU5%7!AoD$CjiqP=vVIth> 'b ZܜRщGv;OAH:ŕKrpl1!FP؛,+ո@4R LK5B5+c(`E`&LDnD HOKٕ^EFOWZ"wϠ< MN^g09f.bU?t|0<"j'ݡUM%^RD[*|dڐoVvd;qА-%ؑ.'peP;[F4Bt덏%P8  kO0G$$92( J[V+l(zЄ7X,5mt:R/&sutdtـ-fO^H8Dv_^'{ .F4F7IK>75Iao T0 c `KDiZ0d-VA[!+|q5B7~[p 5eZɬIQ3 ,G+}1Mrk$eAr׼)#Sv̯rM i}Ks\$j sCyb/NeA|7J QKT[*:J]}˞UDG)qSۼ\Stum7ݓR!*?RcళB !㶋&q{RYFMV͘^__,pfv>O܀~Q>Qr7R7CqaD%.*5ϛjʲqY0qK7oV"{2V&[:I/@lGuS?q& b)GIkDLq$A\uB~u;$~V\4ƩeE2*"D_f^ꛃBLzVĐc}(qAC.N M]ώxQq(Iab6rp/4C( -Bh%J<~T=*:@Jjo`RR吭QB5Ɨ ܴ YȬ.vݞ@`,x6-*@c$$]0tuX3<σHbcEoNM~P {r鏂6yeEXZ A<ӝT=+k$(Bn7WO -t. GXޖN8oCx%RQFJ-BqO,_#w,cX3~kzv"a;=+0&.WNR"]\`XPxYkXj|Α@$.)PY%.(!Y[6*+jEU@oWLJ -*.HESAy Ptir]IȝdxLLz 8E-ӹ_c0(ɭ.I2~(DyH^pB؃_x[6[%|MK9|n$M -rL"ىvIn#\pE+%ߙƩ6UŹ)  *PҪjnד]rp ݾSU<oN5hM0c-mmc#4Ep{Mo1rBs󒛂4 W;?SxV Fe8TpHCmnr+j3- -A\tGVbj -QT4/hwmɊҕUq#dxM)ٛ̀S$Tm,8 XNEHjj.M+Nf:fiaENFB%P,)^̨ep5()fwaZqb%sEc4o NٚZ,85(X)YS:+wD>a#s-]CW, 𗸆EZklTPC1eUl )LSZAv -,dg1C4FrҲ4Pp X+>a #$9Tx*ٍ.J9 bV?q7i4,ӻWG6[$[<䨼b.5 sP4/+;M@sY H4(D " - -@b@YAŇE)z ı$vLV&:<15* -JΎ)R$DrW2 -r%"$- (QU9LuQаIĸ7 -#Zik@͉Ŭ:]=TL zU+ %9.Mt ڣ6n_{3ir@ i2#_i -h1 mHtۋT @(Uݔ䒠6ZyQ7&b(- *Vl&b*&[EUI{/frCm#H7# !Ma;@@$,O2Rh`'PQjB(ٔFii!}#!kjkFS-9'7CB{ &u 9[IwPbM5ؔ6x]+_rO8.: Jt'Ht.eD4xmTĮ]TS&5J~? _l-+ h;Hq+cy͔:E(jT8;%SH, -s9,:K,-O+W`<. 9N- Ζ Ђ:I+WCL/ƵK(]$5fU>h٘C&('༳ߣF,:`I7@F1h+FUzjT wI%;VU1H6(.̿~S8ЧAz=}M ?{o3;ϝ~[4l :dfn'06 g^"Yg'F`?E(rq's盦RDG)Bh o@* -8cF(tͲe!a'_t{S͹\Rd`FNGH{5-x5!G޺D+٥v2էLw1NzOhnFNn=>URw{G7[u )aw+*7n:j^M:,hد9>7f+檣򆥛kiXeR4G_ZWEƋ0f>rAXEEYc90WIƆ$iQxvc /@,#bF䄓&D6yyl?@:B3.=SG5*ZH{GFJ^y,̭8ZX䎿ٌ qv[UEРMAj?"8D9k12C Ccܒ1Xn~_ӔI  HLe`3l5xƚE7l' ό:r ?sKP#ʎTp=l/Q2w9TITcbAj|nk0Txt3yzqMs&IW2Ռ'p u:A,Ք8/#"aAt$kRC3Ei:tD7Wx_-̥{0QG`233A10(a]M xg=~$2$~]PGp?VK#&= [ńXxǍ1aNm(cK;BJI8z9|Iu >"@!sny 3EqNY vxl)bUCašYQNJ!¿ݒ2RMb!D͍8 إї.ep~=}EmK|H -gq/F'`gհp5)"T$_jܛF$L\5a,"*hjj=RN'6x]*xeh4.c> Qm)*O5%R2#gg W\8m2kob]da]c:?{@Aը`6(^YC*sҿ|1pj0`k[k@GZ}#f f*l-Pbܯql$>ZX0ٻB-K!bJ~hitpNz6rҠ?F@Un !/.NÈA^V31zz7U&:-tG 46?L -GRtnG ё@∫ZU)>Wϩ֒K*a*=on/A i5->"7Fv*~#ߓH$q2-E6;豕(pXZZFw̉lIz CpC/74zewN]L c%?-ߔ>"%Gc -Ht -ћe(|PNVyqjq7f # -Tt\EF@:@x\QS5#:mSBd 7w%./5u~ǻ>D ln>R-kS%XI.6Zvibn -m ?fpɉ{(}Pt:.1 -FljV"^߸>#__꾙cvgJyz4b6uWxi}v 4 +7^kfJ;n>lGT}`z.:`8wvCec-Ry2@5]zY$C?V6 AV&$7C;;؎Thm'xAZ XOedINfKĔ !8 eqcK?Mt -O{_<46Mp8ǣ86bĎO!^ K|N =)-ޭ^pA(L"{n bЛ(E6ef%{~Q3WSze_ϙ:Ǖj[d|"gG^T>AW\AI⾧$;X`7?eK|+I(F4eJ gefSՓ½ЙlvN8O"acBo|=9w p$y[% 0]s|&k˟Z}I҄L"JGPx/0қ?^m֦-HLΈG\O›H߮l4jgg֜kd '<5<-g;7ğZ`w;[AydKuZfpA/<Ѩ %'c{f9g?<BTD)HӜ L -x&Eu7L*D)(ie"@eCax6C ~f$HtJw9]nLυXVVŚ1X9)C}JJ<Az8 0c .ØH46OyKОߊafv'(Ԕn^1L/Xe)TұY7nbC$k-8׾Kߛ_T%sy(&;™.|R9bF[)Nn(k3^2N)Jf nx5XqU4b#?#)1\pVF_}}mV7uP:I ,# :% 1p `<蚃p(/"oE˗t֐+Knp&w -e R(4E)tiBg {VXTaۿӖTj?[$=@lgNՋט7#ՀMZ_+QӤghINj"EH+ KXAy%( EԝC+Y[341!AUI$<>,u5EgaB`>4tzT];6`Rf`ʽM &c-lczŪwd3RYmVUYmOͽYJf sv/Z]:LUu:'.fKdh\r-xƅ^~x"m@8tw 'RSr}'n&u<ZGM&ǭ^F xax, ~fPPl񛎏(`"%clq4Qʈ"j -t>آa3SiU +A|1>W%e!;N:WC" -2Q#U@)) AGUvW)MF@ tr=*p-eD'w&vOyzA3۽૊T_c8_?_ۿ/O/CoaPG q) -%J^. @/i0Gi-͂5{{1:BaQFK vbtvt&Ky)g43䍽qg#=&*n cgmXvv &@P&Τ観W{h eqƏsڦAG; iPFzeϩ6BW(RUG -V8C5!d`y(p/l)nN15٭}N;J9#73zD&8b91ӣn,hG]jD7D$E|*zӋٯr -T`fƾQ pBEѯQa{"b~. lUB'!v5P/yTf=x4@od bc۾!n2Lll[ٯmu|-{M#cm"QIU&rF c"OgS5a$KAk5"k*KlyU>8?yOܱ61j)G§L]R!FS?-VnV&>(Q,?DkK[kE%zsG/t2}z\z0j@k ,`̢s[]0y8nK;Ζ4 -5կH#gF\A8`_v o<1u]H )/Ce%S JBO ?GcE 2QȝܻaTWo"_>)۰;,%CH$oW K4tZPqpQAT@ m# -էD&pa^ѷ hg6sU9jLhJ0s|ry|=9)-20y߂*k'/$*ay~ c ' -7,L:pעLbD؉2.b8cP⸺c'L6-49F}#Z4Pf6 uEp,Tbks}E$X(nT<^u/ctNs\dC!s|Чφݵ2ٚgnLMq^3gC%6Bq7vn3"Xŭ+}tD]wVIXn3|kh\NUC<_lt#3dz^#  <1 SR ̉1DqҊr_aS(l#Ap0^dY3558ZƄ{{N(o0sx6{Ĺ&+9}H4JaQ/";Vy( @nrԁ2hb+ V_VvVFÆ[ZmXB4;`肁S%vDξ,h2='*"k>~̒yf^$SeKmCG(+\D@3e>W{Rr7)(1EC -bTw/ =b/ziD>yDP-_>Ap $I Qf,Fy=9h%%|BI`Ho#q;Ƴ,7 9E Ъ-SQ7#_Vb`d"$^Gjro&G#8K4l7HXǿ1n>|@ ``^o}'ܟٍ z6~m9ȵQ T^ H^۱*іDћ5{8hF|\ PdwK@x}M@VϘ} fʎrq -uqd╥$AXe 9EA*.s>EφW*8A[믯i"u5gn#^݃ wXiQe< tJ43?z>y)@өhz586[D5DUُ ?.6%z9?,rl$+2V!Iަu+y 6,]WkϭH. -(#2cpA~IؽO[$SG;˯]Ԃ>/83-/3y0,BP%I qPbA!$$LZLկi8$ f[}@eG_&}#Yz=l+xYT'K^9MEĐ9\ -[oKW J\0j!;N4d QW뗨baTu^VY)Ds| -!bqLs gx,A4.)u|]<,53;eȡzZ㈩-\JU 1wdMha mW=Ty{yoR?`)"o@.+4tD4RnAl?KA2Ǿ{w; \9ش\ls,z K;|&i=H+5XLt0[WĶFcu .GØRľ{5+C[2F\Ilx -dx I-YS@UԍZv_f75ĩ؁TU&"x(v,]ΰNӣ,tV+4~ۮZ2Ikج5voU͔S~a"P#w -lf -E9^!_1O'^CVZ7Er j}ZU#ZTRP\U;d*۔%Sy#\߅Qv[?%PԺrcLWQWMIݗ7ڊJ0j$b:!u1Z -M{,{$օtAZT< Y0wPƂC99ys@ǩǖ#5 _S~p>ADQ;W,iYDGh0%(pe{:egv吔RoS'NG/5)7d㴄jYK~cp8uCEG& Wy{+\(IWӚGTl+AXG`ഡD -_ Ej3J$-âh윮oAI+ͯI B&j\Vx5|O_~E9x - V VA`k tYJ4ŝXcKSES5T%rNǢᩬA;skvsT)Fk:km2Z>VzY'#<y^F[O#2V`M4E8*%1=G\KhliQйX][, Upya@ ^1ݎH 24=,Lc6>ﳑ|u*m(2vP|PeU,+m $b3x2H' -H@9YP}D̸wm<1?gƫ(?rځbu2% 4 =HQޔZ/-+RZ b-o >; E57M/"Ej`(i3bQeQ]mkT<٘n 'u*yϨ(mS1d:^L<+=qs\z8WҬ#xS)2ot\ nwBͫKFd>n=^ Bwa]5ӨFǙB_z׎@_m60m~ ;kh>}tEbV|-ގFR(CT:mmξFv)Vօ*ݚp:eŨG7V*h~1_¬).="Ctνc*Eϯ@dBպsLmf9V 62Abۈ$}[Nӯg-N6W~)E?ziwU $<#4 N-n}W1M>==FPP$=_Sp$ShLMnwC!D^[5:1cXfab2Sw`Pr022OF)p2Qc<†] r_\:ix=2~F^ciEld;Vu- v4@T:Ștg#Ix@Z6ꍿ"|7VG__7/oOO_?̓ww/zw.AC]s6 -펚 '%(wI]QE|sH>!y˚G rbDִG@+w䧮CJ4Db\).}ijR<#om^>`0u #ߏ G{N83guH:n&T': ﭵE؁h@7ʍyL -jȲ꼅Hs陎s - '\K%3jūE"XNEQW4a/4TCj6r((33SKK(A^KSU\t+Ʉ;p9OU%@7 -坭arqXݬXWFЏ\ -]˕9p;UWY9tGqs-%/>uGng V陂1C9f L -. - 3Ǐ)#<&Q{(OAaL:\E~Tbq9&贓cST~E ܼo -OUϢosm{#vvO[ -[, 8tFh˭}$iJCwiJ=O 2n@JqˏH>;,c< ,F;av%HA=nNωԜCXwavhEpAym{ep c@ߎe&Rn?dMQ?E]L 쇩.~M>aՓfZ6\HQlYM@LWz^cW!|{(s[;2'9>lq+?J4r䧗|ط<v9 *>kK}GfGcdCf˳=G^yuq'SPz}|>zktjf9j%c >w荨_y^Їd|=y_/*e9@j1kB- r>Vj};cִuq:3\͙p>3ݚI<0c>\|3ky2IӊR!7?F~ˬ8x-e$xYl25秩21d\RK7Rq:' -c1B/d"7l=2:!! y}<^9yW~c5$g,cLߘ~/[c>!,762Ooaqe"btEЧxa/pxp }?m'WY _y+PCvBώ;a<е;a"FSR4~ 3cAi'[Dv? |CX -3jg_#,?oL>\7޿Ҿ-/A闆e{9ʷ/ du}ڛcVq  Rg'_o{AӾ1z)3~cc|ʎeKμ|2GdՆ8X? c<^>Qs4|x no|x]rF)) y}XWDTI/?^(u~6`A[!oTםBN=*!oԵdIL y>W܍ bdˏW$P.oc^n㎪~_ƼL!d*iC\}(xH\0U& } -Gf+ۘ1/pUۙ#ym'uէ3l,jlrE/k9(E/+ɱ5޽z&c I׬]M3rsyzҚT!W+zO]'l^ym^l^?K絔U/በЋJWC5˪W,#T9İqiU"?{(Ak:6ܱ9>|h%d{<-qm^3('7fA;˽7TR(lOt$&җyo~+3w8 󈿮kBGW - q]|ip IupsuU ]*Bwmt^91>|NǕsTq|/l?f|}|_wrb~$P_/۾ֳ?p(K#}X:ݤ 08G?|KQ=/O!vw~n4,.<}٬wyJ$g-/qЛ:q<|y@7>5A0>mu0}{"%mH۽k>{M"sv$Rg {oWSoy,b|BTN۫XB0o?2덷! ۻk[rqirf^4|={E^}wHm fMO^. Xru+2%ìWl -@זk@˚wrJo}5D?rmS ߭xtOmxN8w}!ak Y6>W%m}ﲭt196-Jƹe}G ]Ϧ/ezm[LY>\p{6oiu;r* /ڍ l/֟6w_˗LLOkBn[ RzԎ$Jmy -O޴"*,h>,KZv=|]&-KڲJJR3O=E *6m${b[ -p߻MafHo侭`ȝԢFG*%m -NJyS}wrumkY^M˙pZ6nm&3]kaӪl rڳ*rnicyY}b^OUATu*+٫?\Uëi:ݑcYڴ0yNUWqgQ5шԫkBKlQqE */tx?F(Xz5w)]{ɖ:BE輻kr^nb;Ϗvjhj*yib*$=)E;򞶛9w7S[)e -c>Nֱegj7kOcS|E ocfߓVg*R_ѝlHiC%nۚNza5p\vZuٌ q5em "z"iٙru{)寮sl؅нLK-܅3l J^&ۤ#k +`ai3 .'\^mj٧iZꉪ[hs,1*6TE=WY Uj@7R@3)v0)!T>sPXIouRf|w\QQBuRcb+Hp{Yp!\N݊]zv\}C{ŰJr$S# &Dxjf eeڢ: @.@ c'uawO`XY.^P/ O%RΝXV0-?;,!JI)seӗE)"w"eF˅%o7=7]V6*~8lmk&cM>dl4+P-K̚gLYK޾#@#smٖG&TukLf9rĄ J&*-Z{mK$ꅖ41.r)]\ڒ{Ob.l-vČed"h{n -&lJHblvp~ -,Ji)!pu`m/ʻ|YP:v.|bQ$fOD=$4/.lSɻPzxIR*V_dLVn -!."RXHh;fZX>&\LԘ.ِH)Fz>$iՖ;+faMk?6ǴqtuH0y;vG13$؇cW.__@ H9'|=Qa;xW -}};~}0vzvòsVZw^QZmh~:ZĭOQ֑mGdI R4O{Gcrut4s 6_fXY˦DwIpLVYZC4|wsIyQ *nm7G׵]nn޷# jts゚n&ؚ}9 -59l3GWK 'MM ./ i`Y2r l KFNB>By9@w7FV$Ji(Viz5EIA\ -YOGEu%DQgOi8ꉣD *mGhwB+2os ":"6! 72׈~EdzH݂WHkѻkӽ1w=*&SJWcҺ)mF0ۼϵcYaި^:h<˽1]HW/F8ψ捧K05lIa7"dy捚x('㺷w7B)<4oEwF>u۳Tɻh_6 C@GiHv .I,F杮q,x7^z\(MP] SGa:-Hb{ew.curn_FAa;%H 8HN?Fe s1>WݏQH,R=_ƌ"V`9@?'ah:uH|$0%]T%$^~ctr~'ק -y/;F>oz[vn?Fbr'p#mhnc)ط Gknz> BZ> rZڛC#ܠD/?:42G}3*ʨ *0ocF9&]d:QH}:3l !f0 TȐRttf,TʡViH'V-?<OF{Cɬ)*d"8w{fҝ| =5kT[ު|YL@{ S(*1&__FgXttm_mHxAۯeHC'SgraW%] _?7qDL7sʁ~7qEl(5!üؒ|b˼Qe̤&H`}7Zp ۼQq%@J%MF<\A'ϸlVևwr˗WnѢxpdm>AfqL xnE*"V>\HH-S -%§*r?Kky(;_{Nj%b<1k^IWϧܒ]nrYͶL3޽'G ÐO8? YbuYvpP{POu=@ tzK-$W۾n=B꧝[,ԗԵ,옞m#joz#[dthgeK|G/?6ݤ6lbs}2]c:VCx{sYk r>M&P eO~7RCl ,:;T{B跾ȘiJ|ZAvD_VhJp@#o#mwtl.gT.enG 綧وJ%YtY2.SWR[!qd/EI$cj=o1 ءVĠ/19 ,Wto3 xx:rrV!8L)ela`LP֥hgywp)T -K]RL6_*!qmt$:/S@?$5mQ#tx? n¶'Z_\X)ʝN::<,.fy+ҶWF[$Fև -˲Z?ܴևDexauQ?@/ñrd/`wvX}j1>\ (:ͯP̯T|!kc..ed@WK'#Օc^6V[^UUڣ_Uϧg5lUm*ҵ=,ԲDf+b uSK!xN]WOM]c#x𩜠oR~P8oR Qj0{Fi e%q:=m'cܡ~L/KmuѧӴ0rz'([Ymeⱽ۷{O}蟬JME l0h-z۾LN Sg+[}/Iκo<DjIOK}bJ] ;~(p ?YQi߶InnI$ax#Ze=MϷ% bR?*,׷Qcew$rTԃesy,{kG|X+&+q8Z];"! -9 #MDNG\ATRD|92g~4PI!*had+ek }Ƅ7:~&BTZO!$k,{BvS^neOMD1@=@5$Fc먯R `7܊;" Y oL#i{6߳S+@D#9fjgd*x:="J- -3t6*Br$,dTд0=BLN=Nfv*%z07GuT $^a{N>XR% ^IOk/P[ԩ☶z*A+ &.xW LS -̀xQ#pޙǠ]OOꤶөqeɛ&Aǚ N(NP-ceknW; n9)QM![<WG^o' F7uVؾU[yK!nDJ=@p謼!z̛MEPL[7jQNݚH6J`+yċ.boI_~'BAɞ98 -FS{ +ЪSFP؅gPsɛ@iL3D?Bڸ9R O~%DA y\P9"`Rv)0Z IyK|~X ^`Unq - 2ia>!N?-(K)?x%ңn5`Z tjt`@J@^<  1{`^r;'n:cZ:TmcB:Wױ2%xOu(=U -nAy:5IŁ7U#.LР?E_n9cK|! IA= qQ/"Oɱd`c`CT1z !FW4~R=NJu*Vj ]Ԫ/W -L*"B8nz+'Bhn<<,/^\i;Bs -;Tֹ9nḠn 4t -mKe\OG-B^LގW tx&Ա!Te`SM&e,|90aVƂډЋ,=hvG5*Y$HH2*W7g$yo.uL,}8čvJnGj `1L-#'2Ym=z+803 $36)PG=OI@U©؄$:U yR@/i;xh`wkϮP7њꡤ"[zTYKoxk/`dz7R#re[ZA(JRtsy}^YhUb'OxN"Z ,,'PǟȜCv bAh+Ȅ;UBicV]CnUde>I9hvf(W>^ p!bɾ`QD*-+oX맸 A|g.&A23 -/kmt[j^G/B`jD&[:=Fq(~CfqIq/08TAAPPwqs - -oXqkes-lŹfɇVFLJRcDd`O}}JPC052$}zX^|C0@wq6w,Ԕ* 4{Ns [U Ļ>VB /G%wFs[B!0|z;NtZ8-N.}mxyZ׹O23b=qsƬӂOq"/wf3آPhG ;ܒ($+&^IugBvN*x{ܺ(.2ch9ub\L10@k -.X|!݈]9N =Gi[M9Zr8L˟ڇ6$`GC2M /IqQi86;#WzRl†8+i$dP1acے8;ecIhǎm4:I+].{hY4z9GsEQkwRnʾp@WRd+9 Rf5$ F'FDQ%8N:95pxNHk5#L-n杗)y`4A QT-p+(x -z@6;䪞 @S%|Gq dXS3QLl#V:]hV2Luu>L)G0#zHA"Qѷ);7mfߐ8 O Y*LSs&rID-yrΘ]0]܁Wշ+k{UxԘAcIƼePxU2v+v+/>,PYT{L!:8~8In3(54 -0VjwQb fy 0AyDŽOQw\KJ0:!zqEe ;FL*1;s(iCܛthꭄ{ -A.s<\wRX͹ j'Q0Gl*(l0@a*G5{~`_*Po//Ciwʛ]Pg'^o N})وZι41Zh-Z]FUzύظTO6De:Q/|wUSiۥ]4'ٓB@S!Yeuq@NoWSJ@O!#kcD 5&}uf!U4E܋#8b{In~G|q&M0*W(3U=^?;NZqV͙׉9 R-?YP~3qM(0BV$o'Ʌ7C;bl1&0IOfp>0"K7v$NlrasVXCYF}OM;LhG * -wpL?P TFD3,9A~+!лPc'"7`k<ڐ߮Í |LA2ēfhՉ!cbG{ܱfkCЩ7w:]j[\=jkV݈?S[B8QnU3qS:ff20rb7X$Pn J$kup'b#ZT-'5kAռT=/lQUgt z5GHmq:IttF%b[843F1;aO9*X\őljԙs9=s)bWNbCI2HR"|uSژ7ɏud67垿*^ư-1L&_ JxO^Ap!cKۑQ1`q82,%S8]=B1u6#DVn{!%5֛K$Wvt e*P1&k(;2UZ|mzBQ`!0P?k%Fȼ6)+Zb!F^꾕n41rh԰vFO7+vE pkc;F74c=JKiK~쬾{5eD݀1f@\QPͻ:NHkߥH_Ԅln d4~%(Oܟ01XMc4H4]ŧˋ?"ZgJ*O\w ^6pvS˴g=R=,f: T Ǐ'@knH?Og`vu#ܥ!h7#r.Cc #K5!T03Bd_ t2i5vȸDd-^-gYd>qOΩ\u;;0e$R 6nypW&5\x*ʓ4PA0@@aj-8xFoo?$?cJƣ,F*)q;=gjm -_\gC#^}v:$vj[Ib۱&^/ -xG\59Tu9DLr h7[94nu@bo8az& d=cRӣՠ9 .5g?{Ď,C7%>_˃͇6<}Qpj.2Ioh#$Uΐ4Fti"l@{B늙B[:쑢NjrI%(NK y8호Jh]lNgn$@I@֢\0GQelf6O]q5ԚT 9>9(U$l/u\YHy+ևIɾ)=icJs# -ّHR2{פbεlyQ|܁NC``@gں`V Ԉk.o{. Y``cHDW_q6n1k(9 -&PA;L Aχ*w@H-0jH%sdZH:C&4B܎HЇ س sPRtyX)BqRHt [M0h0Q$œf i-43F |nu`Bj{I UaDWxÖ\<"QJ OyV2jKDžK,<邲!ڵ'[jdU4:aD`D,j}T-@vo'yp8,P!) ;7Jn$r;g_IPcd+PEVD؇BrK:ҭF9b>g3,""(:_MckS\Kv;O1atnIyN)U|?G(2MAi՜H1rgD%֡;oMmL1m_fp 1ؕ)g&i^3SPL0B %S Qݾ}* 3FwH3B@RSpֽ&%޾;nm'lعyD0W -ªj{r5Hp *~5 :3˦05b&U֏DMw x]`;fA3;ts\k5YN6pnmTmHl E4Z+q0^ly vqp ؁\tK_<zn\K9J kcŢ2snOU1tx 5QNp  -T`)LgbhyO2t7@Y:BS+ExAi"FSdb_f>1^dٌGk,dC5OI5UK.%K!܅SoX!c:E$ ʪ`I=d WLYy?Oo&ͤl ~x%+O.𡦐pÚ_3K;h'cQp8u")v>! *)* - -aP+f;r(t -ѿ3\IеR]SJ A9gKfQ!-Ý=7(}KB%F e.gp`=b }RT >O%\{KmЍ}+x(y nYI<ʒ2;Lw Vb;,6ȝ7)Bd 0BCJrciRT Uy*,6%~+Go(.@xn)嫗Wq.x 52Cn#4Ms -mH!& -ۆrRţbʜL Qkjď>C"LVMCy|F q%%GgBE/ dNcl@.vX|CK"^3qhAEZjDZ zBzQ[➒Z29c -3$4FC4&jڍR%kc;u -x^t?fBO5gL΍^% c(bqCxq3 =HBz3hC4|q ȋ,k vss w`kn%Y=a]Enfc^BN ȲR媤),I#y1ΪTM#:wXcĈ1ރ}(`w!w C\D]eh=s4T#r}mW!Bl@U{@^aڀes -ۑ/9خq5 ^aF=O'm.]w7Iokx'M4VT^D1hX/G?wr\Mh.(]P $zzյʝ 9m)qn ;qBW7ME -WtwDS>z$3l$ (g -JW}EݤiP LAmhNȧTd6K'6)yB7#nbZn{ Pc`2Ҋ" zLc'9XE - ET/hPw ͈r0W9@&0;ʕOe/> ~GP(0o}T>yb<2 W1]װaJJhWZc8vmν~q蓴P&+ pz^{bm Șs7FCTBzѹG_1;G vZ^'7#}xd|/tfOT2{\$5YЍ -H݋uH W2C,F>T4iBZmt7vԇm3z\&<!]dWr -Y2dI 0L{[ lxJ`L> -a #TB<~62`@*H0hb.ɂȳu- gy: hm3ҳߊ$uXj Y䘴Z+Tk" B*S -%/vݪGY%B1u#S2.xM="ZK2y(jeGPi "g+|`G耉nUl!xFǡ s5hqذB}8}v15@?We4v[OwtER<$z̽{yeBke<%Cث@q;7b&J\92 ZL_Dmnd6fnl;ĵ&i)@т}FXF)9msNsfB U6ZΊTr D~~ -Yu 6\g 4,bXߊJ#LBO"\KβFUˮSj8H|wclA:nɃ`CvP \oBE -DP.$]X.Epp4!ij;p?l7U@ K($0Qy/q@nha/[PX ,+˕Yˋz`NaV"AC?%sjt9q*Z៌[z~tJ"콄I & Z ,O˦t)eH#)>qY5@jHqz2 -3/2K9M(bA;q0GADg+yRl'a N9ۛB舢^5y*rݛk͵U0CM?%Li nE'+I IϗÁwEKxUI2ow*\ K7o\(FO].8 ]컮E -:gSSI!ģ_ȗ $)$A -|},ZN|${\/Ќ| `!&LA]q HGΞ˜ Cc"*PYhB}]~&x7%fr6mHU޳h^rOqmMb5szpO& X䤚uBb~ _vuMz;\h]z&{dzJҺEY1` -d@1 ]oJ08Q4]O^ȽFl9yR3O_(Ovl G ]\ǵ#;L9IQ3Ʈ̭ao_TƘ mƮ̉"1yJ;Hn[g$V!T4<~HPOWo2ߵ_fCoZ󾛞y橐#JvrmsuA+CTSf"yHtS/areqo\9 i=Iqm>7pUun 5 jJYfeEj3,ƙM=⧆n9 -ZsC x&sc$j(8 -,ywT쩶 .QdM\3lW&S`R @5kI)9$v!`Xګ)2>\@{ N`#`])nƠvcДt -mmG+EANK6 7}8a@eP⨢92P j-A?DYarD#Yz:E7# q2n *Eͩvhk| ?9A;Sq#(]5]xo+f$4KDØ ri]&{̈́Di+ͧd%QdJRt~o G 1}.(P2vS'ݾ*Elb?:+V#_~U;xkX_Pi% A2I7|gTX-Jo"j:9v&ާetL5ýuҮ7G+1mo,[޷6ٟ܇:xG$?DNMuNLP̅)sWʹux-Jh;9q`ݞS"i3ƃ] -endstream endobj 22 0 obj <>stream -q#^wJ*f -v1|FJ|֑7t(*&1ju N߁VYQAx&U8jf&(H?6QVh0$MQB& XlC¢!7R\'L>b;4 QUBH+ H⇮zupT T[p, -EV`b:,}`3rJ֟xw/VKG&s=- -nH}S'fA!gվ,45~p`L{[铀fJĆvxQm #slv3@Em66(#HXN\ݚK~214U޳Ba>ZVhD{up~[l-/1re0y>e-|ħNIDo5%n)h[WlZ\]iliP?F)$эDryi0[({aΡut!NJUjdx(zܬTHYW[ I!LP=:_P;>]H':ڵ]•M@ŻyKN"@/"Ḱ|;XMs;ʕ3o0EKܬ߷bbcV!bVBk:R:B?c{C a1,QѬn UnDАTj)va unb (h-(e+|B>UazJ͖J{֡ -?tZYK4Vو7XruhJ\Y͢/j/VDX by# 9I2z_s=a=kh;iԥJ̼T6 -6/&L)X)~iePKQJ<${R^7NCw! ?`*nK`׷d4Ko~@~씗졷dܔC3+T$[5HhG!&pZ5fD(J'&.#&{bnYWzgݴ V#pP~M"wO~ϛ!r$5Tf֊uA #̈%e*'L>qA!hz9P[7N^z,]#""!fGj֦mJrbm> Rs (a>vV,[v}?&|_.O$4J!yuK(d@`ٴjoF)39l_Zo -ޞu033pQrP)@<ܽw\H{މ\6ˉ5sơT -Ǜ}f|uzwxVۧ]lr`cŃȫ*eX [Ҋ*XrAzWC@uH&j$e&O+`I=zjy`$6 ܥyH}w(\ 5rءq-zt0D"0$u@ȏiBNt̻}d5+!B%=k"*!Ze5Te]rm"췃ǛI &_M,7uYrDŊY82E)lEQ i;b(2b</m礞I:U%@l\vm -j?H;{+|K5e\#^ =f r.nt6ZJ6VUGüc]O!m^Zz.MJdx;s HbSO+LW`뱆6n[Fk7 Ց(D03MFY4gN)(򧝠@xɎ7TK >tVV́k/ul/{,k{fvښX7M5 -}3%nXGlA ?ޅwlt̎\G!'Q {a -^T18QCa$%DU*5f<ʞF܍`ar,'Ѻ=WfU,"@BI#s**fu;:Km ^12؛\W{Kl$ս@\Klji J2 @(I'[Lq z2rPEyk>yB.e2,i HXI_-C|Q)Bx'\>yGw9TNy)n % |Bn̮eցgNSG -Oԡ=NCo @%9q,SD[Vx 2LJ=/)HnjQڔiw]55R!e#";ʜ]Bi¹TVo& E]xa~C9He}"lk%||ɖIRN!KSXC"ŪR]k}RR~U<%ȇm!6|+e6niflP(*8dwK.?MbL Mw==DÛ+yr(qvZ3h9]GU+E*H#J#G`!p(d5q[l7h -9AQ%IHנg"fۼ> !N\K > -~5@2O|!p&3U>K%KP3dۣER^uQd:gy -$* /*xxjMj/C&j*S -H b\͚u-k/1e—Gbf(nBo@*) -)1BT.'n 7%%e@6;K(I'B}^4i=tf)G'a-:@ -e$/:S#Fym$A:TH %䈚)RNA'L=8Ē} B&aNwOCQ_b,~%5SF6 -/ u3VZH)إP. @xZP3FvIT'cKTY0ْDP9z^%')Y| -cnO -1uI]Ǜ&^z -R ڥ,67+|$|,d$懺kDCeTx\/ -x΅n4Na`rrRl 4 8ԽխjZJrݖR2}`׉4ljEQz \˚=rx -=(Ҕ09Z 5GG`(FQ%grL7cksP2iٹi$ z6UL!3]u֔]X~ܔ./Y JǀW) 0ׂ '6()ˤ kqƐvOu17IFriU0\HCh[Kv7јlY^5/xo1>(m"V-R?qLx2] -+X)\X ){WOC"t[#J4.U:8_)A)*Xj;dWt.^!o{L$mcrf*GIby[?R3&>O#oC}/O{}VZy8ŨN`9GYՐܥg e֌q)WMRӚd"t!!h퐣[؄n"ݭi®A8&¤ K'A HCtf1bƮ\RO\Fu˖2|>;~k)L@֊"mWBW;5݈" *k3>O1:3He X$~RUM[=LDn tRZsI#-3kFpd fe*d; {H=BfSʡ@M(*Im';`LHJ~fmzfT$uAE:o4lM --H-X sJ6\{*zdk37 -5mBٻjTQ:#n1,)3QpmsuMd)rTTZ8K+^ezl+*?GLhKE0riݯyՔ3]B9u\l -bެ%gjV!fHu@Z֙ߒ~I\ف .>M1XKݣDRTYs<&pp!W/Ts{E!#mֳn _z`ʟз81iulEz+ZaŐnhq#~f^ K+mJ\BVm Q>>&Ukң+W ^*he:0!$g.H5-r@ȉ"/Chn=xEdBx/F{\s:Tū3$9Yګs6[(TҺWXS,_*ɵ\ [0gQ7Pz{k dٞ[d8rYopN$[]B_Z䢁d 6p@^dzHSKM,GZn>M㗈X1 񶺯+H?oipU -b*/KTy6$}@!Ы2D7 zm5*zuEq$<פIgMųNG7A1I_BĘbm1rlIJ'yŹUJ}QB@G &0:ͮ}PNN,gpAS#n&=B YG􃲜p#ٴY㋢E ~uM^ m҈0ђFN' 2(FHLF3pGU@3K`+𻣗ؠ;D RP@Nv[peO)( D|+ZQ^($vק7Vzfu{@P=xֽ-~̐ҚG9K:39+T?䙢x(9$ںaFLA (Sa92g:"kDGaSgϧނ3ץ=לLgY^?մח؎ Ą5bS>Cь Eӗ -;fa/Kbޟ]qd )!xz\zD( *VjюKǁ`v.:mMj\ e{4{ ݜSg&^}Tn g4a " VMM_2 }NU%ۑK22\Fn1A:T"Ư - ٘>=KT&/0$0*X*^6M;PW\%vRvN62SXRH/ c8:UUQV"(LUDC$*l'>.9> ^Qv瞛Mz Jn"}M9&̺&7) -.$\ W Ao;&8+M;3o3HD|0z/&oV|ߤD0_W -Q i`0?AJH!nW*xY\}|.}k Cf"@׆×R >dDIUL+\ծi{ )$ * ަn1 Nn\>=6ոan^YWtK-9 2 -t!߯??^l6!elcΙ`1U="srb#YN^ĺbu4ŚIPif䑍n@C1P5hV5@vJr;]A.eyۀKK !Q/{ 40<ލFVjچSnZgr4o#R8P5_BPF_ԪɒEJN0ըs|LLTmŃ]SHQ<)"HaFkzhx[tLR2_8*8#iĚ!׷}2`D L[{6kfu|~H,Cm(Ha-%[R=Nz+Nޮ3FRJf@ lVOEaDY$0 ФjXA[l &(yh?RSr*ɠ(Qĭrw6t!N"VSXӷp=4 #"YK/YTi?z$P$?7@ 9]_Eb(JO5ݯ\"Z"Á%yr&$DE6{ ->6K^A!LUY"Mp}À#R`#[/u%!wNƓ|[r 3.\B`:= K7ˆp &T$!|.UƾS ɭ5I`#ڶېi!?%Bnc jʲ^9&SIܞ٤ -ƸI†TlWx,|WaqS=~E]A&t#$ -b y{H4CfysK/8ȅ -Gݶְ%zlsJsc*q5`'À-7)k( ,kQEɡܱ/EY~u]vYlsZbGDDm/l]{hbecT8={\@ S]A¬C^›lf`{eZpgakb{{!-yPu^ܼݭEfMY6e8,!%%Ձn'6~wbk-]T@_=osEK l10pGȕ [wu^㲲fLtW;AѯBb{j Dil;G@ 3B8zɾ_ GC9i: hW8[(c хBe(ZzV{{H!7b';d)xѫZ=5ۜ|Y'uӃ :"],jm qYAetj'Jd4sՓCСK|6G&|mIR\RYόtUN~)VP5)xR8G(vM. 5pHD -BZknoM {8{&Zl0] DL[R\{$-_Lc-54ls9-xIO¯׶i״b,J!\TB?ItM*& LqmA"-qiA03dN[ۛ:em4]x1sMrqtv&oR`).s-,sW c* Z>ŒJ4J\Ckl"mGB[\BRwQ?(靤־T|:\"4)$z(إ/?PA"\peg *)H%=V4b+ %C~'U`;癵ZEtb@8УKʋr.~˝p*:g$p|z="aAJԆy\aC%~[PFdr*~*DXLtv]E]VW@}*K*^>7fpZZ W.ɝ4XZ\d6u Aii)YDk6Gd5x}9G k%MHS!7D.Qd.ukLC@s`89"V.<6ۋ1Ǣ:Pdr[WTzT8~wX̤iC4M๑, MF e+k4 JJ@HZӔ 90Fm5վj_݊s >@L(-AD@j -t=DH)']QkVX1v7Hy,/3AIol5zAǿ(9"~ʟ:Y)-BE"{&ݡ,C_"vhnoȱՔ3!=X%eݢ*Ug{ q6D%l7#H$Zj᎝1[ ~E]yg -Qr XaǮN* T'ȁGJPeM(̖*,z3*BQtbKnv(o>E`eC3隤f(0{ -P^=3pZkq2# IKحlZ}YbN R-@$&IN2H]zl{ J"h#d@y}`Y' i[OhoI&O1wIh]B,5H}Nr84 -V.(HNݨ.34OÁ|2TS5/ 7,t 3CäC p1%-36:r}4DrլF Q3\5^7訉8M-OAjH/mܦHZ[pֵ7ZPpVjY͕c3_xrtSe}{>\MY=vgKDNLoc~i61]Y$ t(^vbB"dE$%SczƢyS\p>d !r}l -hw}Ehd(AsC.%l(vDt ×kjlցu#V 0Ɓ7PC\"%@I1^_?ƴq0P9WZl7qpm?ҏ p,9ʆ4"8i!>`D> D׻xwd Y1_`6GL`wSUVxSSph@IW hlvS21n[ZHIo4YvDDQYgC-lk:w]C#1%!.J7>r钇Lfzc&hT0Q"%T `M8ƒݥ?hVwa)4QWQjD1n VdM3Xv5bD*1o/d#o9*AlB=55A;gw1Z MmN㚂b֣䟝quGR,կ"F k!2ܠ:FS ,q"M0:?ٕeCwI5قN'yi '[c|uc\ƢR:Z&,aٜ+6Z٤T V, -(պ>=ê~YQA0InDlQf=Fֲ+]:C,tY lj7wo2lirmmp|9A%6 ]k_Eh< Z2-xP̃t-lTV2<XWr=ӫEC<# :;=T[uV1)Z3+@g.P;FR[~Yo֏P{?|R!S$@٘tTP*o!zE릥8T>4me=b8J0,;dB`fQuD>^?37b)l؄N9蓄t[[ͨH|nw 㒵p;2!KHG:v+Nw*vU!+ː"n$sڨPɒwxTѵNWBnĻUD d]%?U -TURo5y]1oL#)`tRVI}BbR$l^Vg\GF& {?c&Uqг>hNbcc_?/Ow/J6]oۯw'_@ ƺ΃XY{[ea߼oT߼ڟq~lcEe.:Qށ M-hNDIu%섰cI U$֧ -UG /t.FkύGEdߢAd5^lzRmhv\^ }|sڸ@aR;U77"FlGg9'ŏ&|+}׍ -~N浯7y4Ơh>N2Jӽ%giK'NѾ7i$7~]AsB'[i -!@JD~#=5c?8Db|>Na}?l`m+xiR4~}Fth҃3xNjehE(D囖{K}zwȍ+|/yn[ CG:}??q}5Z|L|ehv+f|Ix -_\r=O@[|JD@8X33՞8zk/w{_oܻKj5X=ާ״eq:w X?w}^}ک~?>Kֆ ?_0ܝ8:x]{T6ˎ^6@ogO1n)`zϏ2}̀WD̀|xnl I{99v>):&9}u W\ JxO,owp^MLjƱo#^xD#h,ݹYaXG=])v10ǥL1@f~R}>'/*Z?v'H<^㾟H,9T]a_Ba{糘lfݾUYh/|iTgv%vxC_u<$ƧQqF~O Wzm޲xB -I*#._eѤg^>ڼ|S?~"ģ4^}bvonĺ&.ϳ -{;СY]hwFdaߠ;ڮ4ި8bwjv=p?X*Y{S{z)Yr\Z=ߎ©aލҹ~z@ihze;.Ng@ͽ3B{(FgU;b~ljX7폇Majzt0Fڒxbp&ġfƌLhs)O{r,τQkty™vz^r=dOWzi<#\yBP1Hąu0*D,ԊSz>oIdiB~P-=˱N1{זe4b'RA \}QsN|j:v{SƧ`I^9#dCk4愮' nb=7:]?:k_#n#Pg&+߈=_2SIpگ񌼣ؠvxX$x[9+۞- bȷ Ykmjq^?(ٱR}wN -م1bsx";B`N9yWE|˚ivDOnCBr4]mʬ'ъRYjdeo*{GBQU~/\F<*5sS`en7MRhܙp#{\?pO:aivw)8|1nO^:>m$?' y?_J{DK9 VyO`dh'TMvU}E@<1]6wRRܧp S#rހ|4Q^q&lGZNdIܸ?;23&E$%f)_>Lzt>#>7ј۞ݜ]Yu#)e<'dλo?}oW R~-׮xd6(Аڛg&,7o P҈HPx.V&{8x&j(X$lg?m`!M'}J2"K&'1qB=7؜FTlrH^c2-bQl~gT;r ml|Z`-FZT?Dz` >R2n|g>X۫jLiSHPh#U],=:O{ n#NFS^8FqOIЍYvƸ˩iRK_24tSdz#[{YD,)P'3~>E8_{L: {l~BNrv?=mnvn?~'Ť}B:댠YKjC,Kq]bA5qv74$r,- ۮ߆ltrZB3'E8axL"ynO} -X\m)8fߍ|y.D*wn"#'aKH[ܺv.2{K=jW0`b^o8EiwvX >^?6 ;rbX"ᅚWٍi9?.-C L=OzZ^cdÓP{ߨ(,G1-v2ўu2UMFYF€ǩot=I yx)^v=7Bl~؝$ejk>{_ Zb߅+p+XΟNbʌ?O^|8PԘA" zz Ez/z}VcC+Ό9Ini,=Q:nlԠ,nY4%:}v8Fq47GykŦSjnA֓ 3jΤ\D]e.)y߄tXO?s ?tF(N ~F@eeZ5y1؂ay6XMd}pfgB!co?@m?g,}*\gy:z=9~%>+\yIo:T/h^~'_0$ ~.;H͑"l2hO[觝>i\O^^ -VuSܟh}֛Ѯ8f9z)=~l5$ `,ty}9J_K3ОF#)S')p(U̙΢ϝkzrxxTlƺc?k@{A7Op픋-Rj7!w9Qϧ|yuqyG|BBgbo'zff{/?G4yPDFNX5U'qoKhKL:)0"{I eيU;E{ks XIiZj;($\;'ku/$9N_~jxyq%ԔC_%>/\ gށq~hwþKn/מH#3˙#|g 竫jca/vҢy93$"|i퇼C/2= $73lC~һy|?'i鉦ʝrb՚xry3?ِMȺFB2!2¸q6s6\˗XC>E'Aq>-4iLK^iSB}^vNfz6hwo66*;q2x,zwN|e[;;IMy/:h,;LMOUN'1NG7h|FxlwlQbꪞ{|oҹ? ߙ~=w'Ǫ]vw@*3%;J!^7"{6W쑭9#Ϲ>9Jg.-zOj;^|}*tp/s)~Qեv7bK;| a2( vizw9g70kY}2X_ ƙeMBc:/vp.pWݘ#?^Cjo[CShz>]HG=E%͸T3!{F T(/ZVGj;9B|T=~F׽QHVy3' OO{E0gu뻮3?/Cj낙q!8[E7~#.*Yg\[/ϋLL~fZ>LԺ&s_FnGB 3N]m#Zݸi4| V#$A!<1N+j+7>*#Y[<"kYok> xGGc Qico.xʙnQ ߆Î #i7)v.\^>:NrЯ3DNYpe -~t -| - -uHtxF|ju -8e 31)9p2 YǏeKf3 L ݧwfV}O$f{fΩ6T Ij"i$>p6b&rij&!.|6 r=(a!ABBMBikYh7k4R<@Ͱ 5\AfbbFI= -4B0=0-]N<`#3 l,o(`)R]^Һx\@ -C[yYҤ&ejJbF¼A%OK4%pRBR)6pp6GVj4Ƚ2KE$ n]#i4bFƽMTJi&H.&v"`,c%OҞ)}WKz!TP_1b2X* /65ر9OKA.8qFh*y) BF)MwM'E#܃752\r|ZHIpX4`oB - PBIzwP5 iÆBfUh=rf`MBkQϩUSf"RI!&-_hCyB#lzH8ĖAS -A3!Fcj -ljƶW1-jih2BѤiTH˜-a!Q ,SmƖ"Ͱ0[ @Ԩ0gз3Ӿ}m Rzʚu+ڭƚ;FmKR/0ךYJFpf -m5#c0.8&N#l2oe&m 1lb"V/JfC#nQX"q&#MB3׶Hz}&R&hnl,*)C1:#0 W;&KUv4k mr+"O2YHE K nLMn5|RH K -U*,ELL{0S4;3 Siצ&_*`iыvk.66jK5VcQ\c=Fhb&1k:F)AL|TV0Qu.Wj)9X}ORPXB*KdxP&֟j'Ru]\Fzi;Xh+ -Zaڴړ5,X! QX+[Hoha)_veTRT( -kH7<ǕϛZH\:T&N~:oTK3j=rLȅ؉X{O M*̥͟szMtB:YQ!Z?\z^iO4}ڀp_<-5KCcsbї*1XH}]B3*GBHޫvcE=B??[od͙3gr)ȪIkfb"m5#Y )TLF)L:HL$.:֊&G!5_,Vsڛ -ySi=o+I- -t|_մ&#zT\).RԦ`?Z$+Ji b6.OUf8/;F>-23 1@(]O)k.',Q(p%Vڿ*h??Z Xbe}NJtxS~4نߧ/^pXeI`HSpkFu?Rmb QFQax!X ʍ  :e!TPa- -oaGbMk؄ |!٭wUFVx~%_)%z ,s tv]^cHl/4c!ݔ7Md+y\ !P[xL NǏ)+CSb`jR|:ulK]> :*>mvj #[Nf)=ػ%)b*bڹp:[~Jz-[OxYYYaEɖ-Za#[mMlx; }[']o+5Rl5ctMgʖG}˖/\~liw=]_cK{!"ryQc gX?38 Jm璪&5؊I|J.d4ǢkOџ/7 !o5~^XlLX>i -S: GsꍩC@tLp0?v >tkOQ>*YǺ#])gH?5Jce*']:p89 Kn[;f:DctclCEp1cMS(g9DM=ct>lAxf gCq 䭟q!C^<(E'791Llx.3&"g$6I\8&3*8gҗ H' y#u Qdžuӱu)W$֭S56Ѽhӵl'[J)=tY_]%z)ZZ|Z>*τg3@!\ߎѱVv)^vjo2{K -*nk-Yi-[g)/1(\8MtlY[ujt2#*S!THW@7~>!dn -]<ޘ4H=^4'6rqQH1Q ?O3/U w>j"W~ƒ->f叇kh$;Oh. c:s> ujpoyȒꀘ|`@>q2?5 =^Qa F=5@K†#MGw}χUa|R~ \Rd.a2:KoEa҇1>)@6)l/s -7TΙt\86$o<ȞGsEπ9i22OĄ7P|b:$c֟ "y#}X7}:i<ІqY -2;7>TώU2h.Tcx[֯dJ>JF]7jּsZfw=u(~*}7}jب\ؒ}l>W:t$4ԅ{ t@_;q ϏW oGRYԁJ_מCzOJȅsGp19|xhud9/ٗ1c -0ٻfY[f1kl(:)@?A%b\Qޑ)/Af$Ke㸴\\rT.vH҇cyCzg gxΣG1[ΧnkKkEFϚ`Ȧ}&u.ډ꤭_{m2`1 ҫlzTs9W6*M &RQ>qlb$6d,[< I -Fz J\<ɸ}غϨ WV+eVkdB[)}@}%m==f.ꫧt]cR.:kT_3~=T#[dp ק}SbJFUcd̹C)x?AlhH+рt d eGX+9e+e*G¹'T㬫^Ӡ AGpޑgSndP^1\F\٠@o$h>WO'!]1vO{ŠFqi[gpi;gqѕ5q -y8#ӹ}sA7q;g.2G ]h@냎u؂ G&rFA9Ù\x{`A51lo'#Y / NJgy,Ä挀wĥnC1!˾7bS6>J߹I7Upx0 -H2#he1u]xt>iN9XXK{X_?m^0A:(c(6Vȍh (X"]K' R9U9b]}q AzD}H>' ^qQ!X{d3? 曁܏FGuH~1㨰4W5\ܘ1M<7M? +M:Hz57ߐ1,;Mv=I9.'x\ftЗO8Ɓo@.,{K` :28 'byF2= +XOuTdx6pov0|t8.Ḉ1\DH>$u=l0(l ]u,؊`Ka؈|r\r!0oX.zVX7\*Ui>&sزQ@-S]3 0F̢̢s̡_@EԎc*&?AgultILPpЅ k\R6Yvʘ1F)/S1ecm_0Ә-@1IX̆ۂbH! 8IBk c \T/e0 X?; |@1ވ,ZwVVkQa@=/—!h^CB둋Le*;.2ौ3&,q HvpY#-Ә}s`Ȯ|0QEh IBƄ`6,kQ0_`,Yy ﰎpGre&<&U$nJg ;@W98.8g{G?][>J ZX>7aKCܚC?Wmi_;Ŀ8 !PSPȺ_1fACX%0#ө_)S؊TTh*t_|_`K j@2<"کt8o~lpH,V}2$m1~ U0JU+{1ߞMD󫪿k\6q'͆CW -qɠk - 8?zgL<1; a9,sP%c2`;0(EvQAv_IC4z;^`M~fҚ?gS좿gKogl5g&o-/w&xs -sNzK>3' -qf]w#q\V-X0~lDЧ4'&hF%=CI #|qfCrF(W!/ p!<GǎvG< tO , `ρGr0}0~_OAPPgD_k l¦!z 7 $CluIc`ܔZiϘ[D? \7MD7{ߪ~豸q;Pmoܾ%ֆ `dhk-л?Eg*@}0~a 0q@ob>W>ĥC?fn | MJ\qm2~0-#F!0=\KGc]lo06G:QhM/`5g}TrƔj}ؖh)w6c>50dP`*`{${ ׀@w& }+/9q`t`0 bo5äfF:CØd<6ܘhk dX8م+`ޕѬPo_6(i7;6t -?ƌH0)LDH*īmw2}T<td5/7}v<=6PWŢ 2֡1H1co ==lO?`dVOuUrd]v 0>挈㒕LQ{٫v(aJǕu <|:tbDU£s`to0nyLl6- uS=0_ <:~$Scl,2\Bd6{l6{,&qSǂϐ*G"~[<̖/ƛWtXpg,5[g͈͏ϖ(XL\VEgΜx[KxFSyc#+^%.[LqIlC%Y&e28m`#stELcRb4]I*?nllk?cR6b|>lΡ/KV2e\[u$W?xΉ &{? BMWO稾h"*![3y@/rC$lCCמr֡=0YX P>( 1%=sج]8Å N`rԆɪK=+]Du/KEcc9G-}C13>8ee( BLP`!Ȧ~#$P3lx -~Y-_E{雦2w7tYTT(:񗰬_҆сhl^sϦS`KO%2Q͟;Alz[']dSeGT*k/?B F^ b뀭h.?o8 8_4);*><%i2`{-p'x++*^zSN">|N1(ZCrQ5= {A#}hV9r gRGՀOo, Z5ARn+[)ºG Y1_}Hm_`!p7~lpMxeFΧkكDtbDX+J~[| a =tLP[| QcClCrȅfc>'7!;)< yxo7(d>q٘7ǡ!ތ} @;4t"Qsɂ*ad:e||BsHnJT]0W]$M5q3 Nc.l:uY{^A"^l6dSB.^6_f y Fv*EGs90 sFT7S<]q]oDG:Xo} 0H2GؔFC.i -_0I & \Gc*𗘷!D'nLO6u3گp(~_gs 7Vi:xSGS;!;pdwNo2arb2|L@s4Zζ߳at/V+.ZfОh]wC8%@]#kK|0G lX؟?:9Kb^:m<#C><t(TdS|𭃟s5K1W11&v"BWDSBIl}Ԯ:X1&VOT]q)e -qekt -'}0ptXF #&e2`bZ>Kt/L`ADaWln^1X`(=N#Yz24$ j&;ѹh?Gǰa ~94F O)źt' 9&QnjS ?7~ y\@0Z1o OM#~Z[^fcɰLA<=p ->`^uZ4x7uP(-?X٢|Ι,.t$H'gJTUyWd ؘZ.М#sTw,ڛd/I1C t7ҙ H3W- x)>J8?5wćn}!8`.$q(P21s؂8AqF=u@Q)ؿ4#va]Ӱe=_."/&K~cHPbˋeNa=T:V;?FX{(-DELv ?2kk62ρa~D@ЋΪlWkdK]%[1Tҷ#!L3:߰/x9lBDneGB3R>Zv5ZSf竻ꛥ22r{hgZ+Rv !=bKƀI08Qtׇb}A:Hb=Efl`|#ӥǍ33h"@V~o}p5⨠rz+Ѡ!@k,>sR'U">7p:68O˭e^i+p<p'tw!рxhxhaָ|1|!}iĥݹ+sfm? - #jJUӝoOWm/VRĘ :>a㽂u[G뉀5 \<wd˘]s\Ξ/1C mXE?Yf_cɐ!w׳"9B!Tk Zx!@7.WmLPp -o):k fe&Ј;ϙQe˹ݳ*S?3Zy@N4M¾wf>πcFHpODo򭆳#{雧Ϟ C>.>ѱ9uE}7}pke6v moXlkj<BmZI_2gZ0}S>0q<)Tc .FpnCBbeԖ)IDP02|}rGbu)`31lQsl Oet嘟4w- U|҈;(=<͡'VU]2Z^,v l&Ϡa - y pCٚM+rBbq$vwt?Z Oϧ"RA)k_qaX'4LR՟U-yBxjZٱȾ#;m;p:;ٔ҉`pr E&l/!&0 1J\19> ž~lH;EL@qhB҆5p tdD]`惉|Q^41 q(;:h#е0e#\]?RBjR 5~A8 d9rB9o6c* >:/u0E\ :PjӇP^`)*HF&Ri{3SW ~VqWgYu l6>_Ŝ6{ B -2r= -PUE.[rpEZ/ftR,"61x7B!]r\NCr‘tLX,'3M@.@7ZWҹ;f2 ԝS$.#*F0dTh{}1Ȗb7waVߓqׁ|X} 4sFĉI{#xMG ~ -/әRMg]e;43A(!N= r&CWx ι 4 |Jop?#!XgOlWI哸s 8a13;V̞NBt!Qؘ2r !Gn}>&vİ2v9"rW'ⵊ0/ĩMwJ9Uwkd֮ddhȉF8T7r8͟㾑Q}LUyZ& _ 'LTݹspNC"=Ӊͯ1[߮c5qYftlZ!`+Z4QS _ `] >15M-p"8u0d sܨ <]G兰tb!Sxp2f8b1z !+MD -o_jo`=4Σ~WpXs 1kSh /_lB3EC8h8z51B6q&C+uIX_3eKʁiS%T3+UKB:c &`7o شQ]}7mSUW-w,O)S.88adՏdeGKJnBl6<+oX2g/87o,nM_ = _1܅e!q^i@>YqޔlZa'=q$!v ;iƁ8[x 4&沷ƶ󏺉)i49꞉~4&O|K~3Vm3PGUA._ :yU|֘akAx=ұ!7pjC^ -]tZ`S3CRdM sH\CCJOǾO6SLcrϣΛc -8,t,<_b~ad/^Hl B6!k.Xb%{4ؼs -&~M31ӱObBwqZ=#o|GV2q+!|D?*9mB\OԜ7'[Pe@/HOc[l`V;gcLl6|29{gcۿ*ekB*cp-@L,:/cl}j,GU͉_#ez⨈ϛM6 .tɑRzCWd֩wk>wc-/^-J8~V ^1nGd ڵh57¾. < -~rS[si! R8JWx%pϰL /h e 9۞_Z., |`=ҽl}\;Uu엦 _t9{ضAθs/ z ~;%WUϖ-]Kȭ].kfõ%3]U+kbE;Bn{mEc>dT-oS=J -+ҳ s_D;u1Ft-Áۥdv=V:/((l~ki!y͟u,oP[_V=^ \̞|uVvuwWQ]ː(:>j|m>6>Y\1~*[81(}CL)ĎO6C>R;ZS҇G }}w7vSh{hx"zS;zBsZԮľ$=}.Gn;RP6FbY2Ghr 2Fnyi}lZ)zBCv 6u-G صbg U[_/ajru?#~OAzM?`A ~toQm}i{l>z[}7EyiKxv:1'8~RDEzj: NUgq/o<n= n?$N/)Mĩ7,qRu9͐\B]ﮖr({:z܈?RGQ?q%ZM ]5x4.GJγ̡<f{+£swR53?QcI-VV1o+ju#;^ "_JpBkܩ~O˶?Xe˛HdV#LhlPFuWgO ܧ܇ķg9/Os_fRߦrz=n/nL_[z#J]8Zν~?%=CO>UUEN7?b~xN@P_rGW -1̏ݾAۑ;qweWC3ًn/6p y˟tm˯sN0?޺O_(RSľbvgq:ϢrT]MygOlӝbGO]gWjjkUE#D=sb5ƞ|pf [wq>cԪ/i#7C?ܱǞOU~[:ގB>؍u+w7Qu;2g|hxqjlѭtzG[Gn㫋e.oNWy?]R6^me`gSJgS:pA#لSg m-@R&bќ:"'g˝u}~U̝hߜYlvrKtuV2taw}J'{C:7o|tlkniBPgs? -wt{g觝>OګU_M̹[2jÇs% Eί/2~-bWS*x$/Ux>]Ϳ]Ƚsyqz>pZʆ_Sf[~^x#?S -η+3_yWJNO9SZfruڼ†op?=.`>=c}HEPgsNo/OXJٚ;+#_ELR`{Do#J];9Jc_[דcm[,@Uxa]T)NԻRF~J^{G|ğxßy_ƝxI&ݶ=//2}voi۽~7ݵTu{VX4+ T:]I=zC]y4gOˆl-{C\'{k]zr!estgyM܊e˶L,{/콈aD]r#݈7oG\Szz\I׳kT;}ߑX#=W{=| rn :+\ʿ*`^,&߿Nf~z~wrыXWxbuf9XQؔ kSpw'+7]_xGeEwS+߉-t/È:#/gGY|NL!6N|#frejs{k,fg6^:s]Iq|x)2bgRUۥ\{;ĕʝG6|ǽ[orz|9[V ,~^A{2]!M>w7:t*ǷWʸ_:TUP/^J&"$RSK,u'>nǖ}̍WjN\w-zjGyӮt;̹'ܵ{Շͻ16ʯd έ̹Sr&NqM꼛 ׉?uxy Tp#RzK+|56jBFb:{) };n*=nvǻ[^ތbnNW >gnGWfbK#J6=rUO۷k[OO )ɻU]w-bԊU*4Wyu__(t~uY?0Gw!vk swW]mݟTUǧY޼JfS|OۣO{m?F??Pl?YcSG6kKn{,Em5ŝ)5w+^.[O=k_pkk0Vzuzm gO4;i_[[5`J?]+Qwd{=wff5Q5WI[5Dݮu>ńHgQY|CաݍrlJ(myVMeyΛnW>i ~\~?ԝC)xkݽz֯9rmq͸5'ҳoodʭn\^K|Zܞ,޽O~;<龺Ի /$[vBRދII/&oZطJʭ9~9ܕؒvݎ,V}.!]z?Z bw喇՗‹=.?0+F>c _߳WYA4!zI3~L(=SYs6|jy񹼪 :j7^*xᢺ.l\ᆪi5;l[g~;QqDާ?f:|5ˉzcdSdcde#e!}Nd >.[btVu>Q6A6]5^6Xwlgqzg GΗMh*={_$Uz^wQb s'/VWzJ\%/Ǖ5L^y;!vQ}=xNk/gT^ͬx7I1%]E5Td=֫>UV&VՑXd)f@6u21; PQ2CѲi# e ,le9. -?9hq݇I+zVܳHw7/s)l׫t -F)=zyׅ†Ksjw^)hu-ۘ3Wj -;Q]tks //gS|!eoߞe?r͵rDb\Ϗ[YmN_!|?8#|_Z5Һ?[ 7ř+CًѮ{~U_ߩ -y~.yc[ϝñ,Ї͗76B?9WxR7/6Arq̩A)|mj{xn84jMFf.fYZԭHp~&+/+U]/k~]A^cRuȗ|ܺ8ft?f(Mn{H=/),^{Ms[xګwC&WF_!]o$Cui|jKZn{ٲo԰_T'iø] /oq)!GWs=Fζ]mĥmW? -hc2;=hw@t>67$}-8M;$6;K6.m+ݺ9p=ԥ棗r:/gݮkG`UMw -C5 xϜݎ!kAYO}wz4ZT3dm4Rs22аF:S4cU._}^0{{1-OhȽ]ݤ~"Ù뱍i8me'v#`k &߁mϞ9g곺F_0WSy) Kߠb+?*ĂOAc &x 2mL!ɰHo2u#S}whPdKå_"ß쯌bCarAϳEۿZnm'gw2 dAt[XÉ(܏fZXOƶh-2YLqEbdn-EMclj,+\ūٵHrySK86kzǙM{ݸrN >K6[/Ǿu?.Ée$9Khdk "1+єJ4mI,dQbYLј3AFc=J#\_ ~'JowUn–G ] W_a0sdݿ bR"U$1Oσ7TYMA3l#Sx-EFˑrdbmM g@Ơ^6o 6Nׅ~ J!=użp?lx9 -sY/fw|qe 5SfzP[?gFHgHx^9g1?7>ìhYm b<>Cc"hSWsh:ݎ懜T_寣W S/ul)\[[vxY/r0圦{uWe#|{D iOmǣ ~~CStl=}7M[daMD!QhT4-MqEV!K hk:ԡy՗pB.z/\^wB]W6=U|Qυ 3lUڼIk%'SUBQK9M'7J~ ү/_ 1n7?kȷ.CELGBOf)v!ht 4ah6~[ƍ]cJ8AT4ǯa4T_0QEkǶi y2#Cz+ `/M,q 2G3d+db0OF֫p|wW&Jxrqa׿5^[KS_Qv0 AZ OZ!b㐻^m!26fAfzk נYG5g^^PvCgasSNh:gJ/ʺ6|qa# W: ޏKAT{[ fv±sΝ"F<}i(<#?DǮլƥ:3p<<NpEf6b4i-CYT +F vkU7X'X:现鎰߲#{5ˑAmin+K;nyqaO<"J~t[iF }w1D_VÑW_?G*UE*.>ON~WE`=f8_[Ię.MuKC%Ehz4gE$iKi\G -%LJ-pUש_& -o _ÿ[#Z_Re?\? o -}y鸇Wi\Pߗsvs^ix}9IwGľ bkNW?ٓooӛ<}x3;4uǹ]9%e_w -fx-Q}*&y*( - -V=ᅰS<_{Nl>xvVs?&zDO a_Uq?{Lp Rw\y"}T|yqC>5tL^3aňe-Ǧp5M^#ۀvU/HKW!F!!1@|ŏ!!ZtKN Ņ-E]JƼ.W*y)DX\zJ"GˏtTYT̡ۙ[W3]O|ĵtaks٣O٠g+ު e.]lGjC["#8^&Fs}Ӑ]>Mwex>< -+\F84;2,Zqc ׇݿR߻'^~ ->-8ۥ7qJg0>c\Zʕ9frGp^P($Vߥ%c  8K#D-o=O}ە#FyA_ -s_ړS_A5K}_voTVci@ Qh Le_T$.Ov~\&ۨbР7M4%>Z}Zhkciv2DUX,GJ -*o2_p{TL?/dKF1VIrYwn<"V".iWwq뵹2mލ9N*zo,e W1^Q=kXQ]8pHuA,kBB~B5\$-;;Ah k>/MGMGg8Yhya._3=_5:F@ DR/ D9o86G&E-rxLܜ|V~kNtq>X>?CDGe0!ڠ%wv;߸5g0]o{r7W&P;B՜-=}cm!mPp\҈%wi._K1[ʱy'=vDDh.S =cd!YҐ$-Yd{Fxڀ XIySD{I>AbPy"siS;>~y#8[LWkT4BVsr]i&[m[x6 -]ցcxycQUGm؍{yUrM\PTFwvbZ/OΑY5^r(ﴐ,N~d^/ pq7!MW! XyDX?A|[b|:9 'Kl2tYĒ Dj4JOxIhɔh包*B4BRW//}Gѯ%T]oVJ-~kfk쫕MBYv4 Χ7Q:Lzhie̞>T7I"Io -nC_oK}b݂EAQz$\ -NtF|7.G/$^?8N-19!/Cل}E$`/. -_[tDR=UUn볩MeQW0;s&\m(d%&IӷE'+N<U޹ U׮3Kϖ2{&1kdlė ,2-qaa{!I!~9/].CtvK?y [+ԤKh2G@-g -R[eOW*vO7Pi#3Dj'"W"G(Gs;{1/Wڿ^vt=k%&~iOm91CVL_|/N1Bk!~aG}BV!w)S4$I \h3P"wO0pbqn~qtCRtA}ӡ6H_3j>Aﬖz,j2 w| >Jn2Uv,=!.A=3i$*X:so^20ObUA?>LT\h,R{ڿBqVcنmeՆb>LaRd7yGGfZ6S&;U{z.S}9|H]k]dg{ ؊SMS;>82_Үe{t~KWFgVP9c$ť&jM4TQjފt #U%5IU8C8ok49/sAˑdj2Jpqn%֢q[-6-eB6Sj{>ʣ!UT9vS|I{h$`u/+?uj/e--ɠH{/:W?ſ${-eqz/nJJ/7qOuq%R"MbLTMd m{bsꍒ>6uuT77{d_"=_.HMV]?z*O>\pJ@sR|_ݤ_ -~+ݥhd4sura$rtmTXT^sb{c =IP: ->.YWTbDQi:\H&Z |ccseZi$yhxLJ!Ōy~6{sˏAn"%F8 Yjh}mZ?Q$Pat~1ԅ~T|Sk2rߠ.[k4M,~C%乂ޕ;Ԅ-5mlo/C.]W JE֙p'f躪kM"t\2"UG=mXZOAgm5KwMd:;{A+W'=́鮷?:1KOb姟fIw=v`7Z9ucC3d>z*dyZC*ΈzRnpVVvh -f.-9;;2 s7d[//)k2u5Yj1]mf׳CPB8vTZpa1 Ⱥ_." -{8rC><Fq{&6%W3_KS.4:s4`$$Vt=z@H^7jh'ѸڣDK -i˥'|gg/.y)H[;̮eky߼Y}4Zi -boo8``2M&LF)͆L#f}!O-Ac \\"VM1V#tpyClRHpa~{Pz>BѰvB4ذ%VDן[3qD?K/9fgrVK[ߺEsɀĖc44,?l:h$kˢyv6'A+ݑ?$-`x &6WXOė'i{sȗT@ӕJ-g&Z*ucTg -_q`&J);0j830EvWy@|q12ĠC7¸ǞD5w)(^ƠVJP<YWsd8ma'n4ɚΎb|st"~smqDMoQ! I^-\vZThE4jzM0/n߈j]:T-d~0~wd {ǔ_caj{B^- mjH%63_.̈ɴ1d-__edX 8VHCCӖq1GJATKL:4vL;ͨJ1Y ,X֝]qw9:!O_AFqAcJٶ%lrHbȄiYtRHq@ aHKCcuue >b?1Z/y)ScL,ac2t`LGAMͬ4d"҇I(SāV~VWc2Wn"yہ=6hmb60;ݧ}_|_TmȺs aʚۂ/O= >:=AǕ ¶l\c8&r$U[M!G𑅨9,AK-A|$4EKĹ8GXܠ? O$jIu:xZe”6t닔{YDu7E}/xx -;'KoCNKpgptmwO H8e8`3O6' WhB(}Gu?YeTkLYԮ@sBl)o"j"=jM|h qwAئL}Y-{sms9cL|8A繳2!B"}\e)q&*H)M42*hєk\vΉ\Lx胱MWWUeJbН7A[c(eYuH\ZuOB~ά+1GkyI}3;bz_ԑh1FQٺ+UM>^ ؁VpԠ`- ؝ 6m,iASsmΗΧ>·>LBVp]@t`?3=$(;:mowRvܑȷD<[+sk,`;;mxlڑ 6LM'zzĤ`{{s}o}aIA)@~wO&,vTkDWVi 5.hU Qjr-0kZEtX0*5gm}ayB36^Y4y.ЀwlqW<.M?x'b%tfҷ&H!!b褳NDХcƩrڭT9`Լ}| T=F𛠷Zܠ7L"ț/㚯/.+h/e7o:X~n0Ruzhq{:z!?zH{M|}_2 9eU8^(P8/a/<镅ݓ׃^ T:L_yK幻'ei+f#6ƖU.Ŷ{'ң qajt~Wj~9B>qh\ \CE^۞x+JOu~#٠ZĂD"e}πA?gQ=؞5\%\v ^kgOe [vh:㱃@xIʓ%{>:է0/e7 9O[º@l xz!wWlW%C) 8-X)N:0#JAct ; ۯc{_y:qҐ$M`ʸh zʸBed0Nlp6G4msr;q縄QyxX FC<-EdpaÀ/lwpVj]S\I[y]W_#dyDw;ȳKgs;}ɺ!p -wNjȺbYLE. [ Z<+aĜW \`"*եPmkDx5MԖqRe| ;_?Y]|E^8ЌUcFIp"C4*gkp!1Z̪\ˆ#k"#5gMo{xf+걊M}6|݅%hqMb=p/1Sl9MC-DgϠs ]u`6h~4٠3F}`G)2Y쮇ް>%;K"$Nw^!EL'v`g?YaUէmUS؟5yە20Lc̭-}e_zd|WY ps^e 08 m=d)ڰ&![a|5/Uw(=CQi -{&,؍2;޹߉@Gر#ǾlvL'h+|)0u_p5a=O@`/̇X+/B> FL/7Unt N>X; ,ؒS@@JΓ=x򃽒\:d `g1<ߕˍIS# FfC dg20F΁k:k:SUN0*[}@ 7Mb:FB ;rRp}[Nqʨ: ח({oT;iNncGY߾{*r , o8u.g%hu6]~2Y?`g% c"5( -C m IL. -8#hPtp f x}őL  RGd[՜n-x T`/r5'ĬNhxʑ9yX0?1`u~C # 0;M'ɜb*&Cޞ26ql |I\6d#8S [Q۟:;vhGH򉝵^GEY{ȫO*KFIeAjpۆ{1ݳ -;'$5=Wpi= -n a 'd[-;]k+sO`e:]\W @K=*J.b}?EElHjM.q[/ù_rvgˆէóI"R`} srlE Z-{fkO*Kv<>Kuenpl-Z߂<3[=|Ҏmk;sH6! <ºWY]pe# -)[eFH0uY@:NZ%jlmeL-cy6|`/A{3J R8 4XM {~X -2m<د.y zךr b2a eX (n!AQqx!p -PSkN D%>@ N j, uG BU\5撱 l ⋦`|ro<~wPt"_'ta~]H}e})|zR?fd_8;ݼw:|pE&q]@˚!kΧvB`=ϒn&^`g /痀 +-I>0[ fNո%5_;EQwbtn =bCU6Wgõ8w\΁6^UGf8{RLj΄hU{gšb="ԁjpErók+K'$AV%irA)ڰXgTET2̄u[LX2M!q>/ mFau i2y s-5&d)Ϛ -qY}%yp?0cF)$އL^|ptDEݓ 6Bp]!%v1i0IKͥEVAфPmAO86uZړxix~b6kʃ*)_FMNXa1d=O,B5㫏͇x\vw)4mٔS`K>8qއvVaD`q0&uE5>4m>kR YȚUEtx†+Ķw -Q]wWݥ}{c}9#}AǮ ?z">dpA·),q_6k{ -u"ˋM%9sY{yZTF15aXXwƸTpl(ER -1i >v1M'I)ayϒo_"Ls9L9RsYXb#S^\򋙰>ҡk5 > - L Ym%=+<5L%f( -wO2 -pgbK2z*˿ 57+e<]%#u-yrhyH.H6.#XC #ض++wM#Ls`☏ĬB& `` ';:SW]Lj O*;b$87eq4yŰ>#/t.v4`ct+u,I92`=G-`å7M]Wb O0󻱍jGpD :FyKBGCn.\w~+,C605総<|lyEO Aس(걆0<~<rgGn2#X)M3!~xئpiut&g8? ΁2uC?BLȴZW$<1y`<Đ+1BmK[ۦ#2O^fy`nad?pٞɰ 0H-+eNx*&LpfnS$2NKwZӛO̤+MgSL #m}/7a>VDp%}_}ʏ{>Nc">?wSӃt2=Wb@Λs||>>||>>||>>||>>||>>)S\cC]F#t8z. -H%%OuLHt I JHY`k5Wme3VD IiHPttYbeoe0/6`2+Go?2o.ENe SuA#b?=??>oCńZVg8Bw ;]̷Gn ~.j<+_+rU(~!+;nѼ%VvKYO,ϟ[K^NY颻EF.Ou;%,)2$ٗbqȭf^ ot>Km,ggg^Z} >}YbeObrlsBNFŋA Wg_ _iP/.C|Ej&S^5i:xE1 +"eOSUˌ@#r aiR(cUj[yCDi\:H2 "p5$H[@ $r.HHȑ/ A\aDB+CG&k+6BRYMgʫO**o8:SYNHtD&V d&)xl$BtLy9S>&Kԅq '40ΔVDTtN R[ ˡt`K/x Ήxb*T͟P#͸ P&%sy:Re|Ha@ٳ<*W(Hrn:\POא* ӔSlL(7Rd)RuUViʅ@yE6rIyt@y>]@$RMFPHF~ʨW P T|]A^(QQQn>@it>Ue9b9T*m2P㊔b҆C;er!˒g(g> ʉHIbC2ް]V&+K 9#{).JRJJ7혢,sMQ}2j Z® q iM> f9-㠼XwOC!dՙGa %"oj q|f|}H % v\iKP"mO`#b(`\ylcуF>*$MCdpu?D "eͲ5tX&[{dȟ Ug6h3: 0-(/eY*.sHW/O0# ybH z#J.R\]*p&HU{`#Qi O( M5:P(鰆Ri0(<>qR %\Dp"YvN%ٸCqAEqdXbcEY`؀-R&o4-6<^yn*6+3SG>P6%x,A).2C戴>i #mCHoمP%kPZ f Pʮr}y6wP"cq ,5En %`.AY_d~Zos>n.m-HEPAV)bu伡?k4HKY`Hd邤-i.RHu_\8@ dnAr$?X\˶-qWwwBҽ  "DHwƝ!.W ! ߒ}Y"}~߃7V͚sYUcHPZyҙE)pܚDX<|i}xb},z]Ϗ`Q.Qќ4\ -pdטrXIJ|xH -] e8:N\8Pty>;Bc@ȑP-wB%f.gACĿ{QXdLp ˶8"ge='.MÒK(6 G{ E s1j> W6ݓܓ0>:+K0o@E%$ @!H㒮1h$?ZR {]R 7G+L|?΃&5ryQC _ ,scd_&` {+ pYbFxh>Ʌcnh|Li GG[K="9B޳4f)zAOṅ8FqK%AzNw{ϞW Ӥ̱Ip9hx aHEًX+SAz>6B8-{\ȕP+hN_dX 3F@"'⋆F _G_}V0>Rsg9X% >>}c}4K@&q Vb`}DLgfÃrLK v"EccpMDK&~*j93E rjl8/kPݚ 8?X`pHƈ8lP}<1el#܂X~ vc1AqyC>*0%.Fo?!gA<Hꁵ>qF9 j2c~wW YIX~pj8ЙD 2 hxpMЧ:&αh.WT4tw`e;4.rX,)AQtHW\rQ$FL#0,eE{~$U_yyRxVA6 ozn8c(Br'{qusA02Ts_D܂@V8# @_kcnțR18[ H!W3/OZDBdYB<(ݕ[=I\ ĈAx$^5ʇPq9|{*bk1u'rO8z"`mc,}QI{E)Ēޱ ~h-Tz~} }dւyaX!^mc -613G9SJiڋe\)i8|dde;؄zAR B$RdQ]q L&%]HW='k|zz:! -@88'O &{@?(@Сo]+])(S`,.ױzo!^toD@>lqNɃ$["?8^!ew"#vzCl -ӆ>YO_oPY4Af/ -y4m0BB;D"sX8IJY =eȾbOrK?& -mC-c{òq>Kw^y!٫irM -endstream endobj 23 0 obj <>stream -!'REۘW@)Tg' LܓRo wwm4jvY pQ:$ kt╨f\_tFlJWOX$1 EȩyjWLT>.V G>㌎u<tOc; K4Oڍҝ( -z$)ܒ#<׀RMLУ`VҘ!`?D'E|} {:d Oւ\ 4a8I|5}%z.f[wZ2?`ln/ G -䅠ixq;<6J`J@L -q|vRЗ{3vy5Hp0 -zXB(@7{HC.匥X"R!i 1@s l)<ťD?|ۯ١,)PAjRTpm*ι EJ0FQˆ/9/cA3߃ _m(;\wVhA_qܝyYɔn:S'QW|u&`"E,=Iw zc`V75,wc9[௨fBU(@ p^ȄD3Z7М6`Ca&Yl5Ц ]`:׸?yhoa~jja5?`{auC[D<"}E['˭3Ar-{qH4d&^GWuT, l۰"A'e08'a@gtjU۱ 'd\>cKw` -ğa /<-VL`M}(l] ې _m(I0ޅ5aTز]ltN3vQ"[˘m*u@Bk sN xÜ䶁/0g='}3C:_ =4ť>& >AҖ,:]KƢcr&iDz(N:F$nA2zX< -,Ό|"F1J". .J)d" -Pmýw۠xrTl\M6!fP8?Zm(ny)[D5Ŏ1sİ -pKfL ᢋ3=X -!\~CM⚢ w"NZ2-+:0`gsm\8X\ -ɮg] ꟳxoXˆ6u{¬6*_Ҥ^Z kBc+TMtX;xM|`-8:Ҡ"$YK=~uZqU tȋM"ׁMƹ%qȷөjjŖBTQr':֣ }BX֎`oAuQyĮ `M/~5JX_Ac { >>Ii:k7A`6ebyh]աo"Ih88%N(cr)T$}i cKf5<(=lZƖʇu*=m> 5mdн`K'ܨFlY!Zm|a.Bzti x _l((_g|L>+VvIPen/ jlgJ/l(N~[k[f9_R&DYX!LOJJ/Zիs G($}еn -wGؚ"#Tӵ91-le6BlS3{ah#`Lj9(azaE=#rpDu,N%Џګ{`7` S|6=S#^5`sz8֩`}ֆG{DJx_9XFؓ!u)x}(GC5XrpFx89ՊݤDV^l#3CWk*?CQ81w =ǹ81̯ח=]w%f.`eC䖾 LKƗn}o,mf! $3z9)\?3wVP1/plNN>2 ,~W=}.񹵄J/x_׀e2%3l,9 -4~sQSﶏV `]qN랰uƘ>qi4<hPnY@<')yai,%AHfǴ6v'1;e?N!%G&~?-=ƱǽQ?:@or|hO[♜1yi,yv$X5 -2 HGogP\ {s9(KaC_lQ {y[!aG"KB߼U8lDyk­PO*/% I@a/6_Gu9Xؠx#^CaMg2'TϨt-xDWu~auOc_lWTlVl24uf}}ƴ`mEWڟyѤ\\ C~RnXC 7!w2[̞Tbn!fn+X լaz]] j*6:kkTBN7s!^S#pۘ}Tj -^#GʄD_'d-S 3\pX< +JϪ^_(rN{Ȱ؂dG<]1u%B&0w)C0mi>rLI'ek7y׾sSPy,}i?9扞4?#zty)b2z4٘wL.'-} w3Dt z6IMr2ˮL RˌE:d)cTbnCo}TRnœa{6.AISg <" 繴elHS1e/͆Z ;ێ>Ȇmqt"I7hA|o)O3i׬yWBø 8u|71w3oy9AއiDW~8{'(sU: ZЏ~y ɓ&wk%juqR&y?=`\'6ѕ#+0]Cd-pESbǐY缧xd.D l֡Na7bsY6U>8(|RDBx4Ć].z1{aw ;_;Fc -ZDC/ T2dz*z@1C\BW4mڰ^+ԗ\$7*LFڬMC/Y,ȴd}>-Fy{@Qрy/axRz8^ZIɳ -+AnDtC(nWhAZ0Gf-2ZZ[Fo"A_ -{$/ -ﴊ%kMO|oc^Ol)œeoTlAXժJ Va5tZ: ѩIn56 -_h<ɿ. ~/i?#><Xs80Ss)b~>Fqz̈́*dƔw[|%~ªr{3>=E&!3>"Q^{etN5AVaoɓrKVmD_nEOͨ_;؛$#vSԋ> 0NJ-<ǔtf*ߟg:RDL^7z+{-j-j6/ 6[8+Z΂j|ic^r>iᨆG^k8#\ -U5k]M)hEq|p5wM7 xeʏKS<%j%V)5)+r;X4^VPaʕ^Mi4slz„[EWj~5$ӽ]DJDAO_ٯ}>@h,x[tK̻"(.rΛ2jwWQ_sȑcM{JA"VA a~}dڀEiaQqG[$*i1m-8^UيKL . KZ/묄oDMgٗ뮃 (+O Jψ -ΠgbѽpqlFP7~QE}G ޒPI_uW+i -Jf+Ӕ,Ղ_`O:̢ASs0],G\5 ߮C_R>sg&/+.H^[Ir+4HWܩ6c%n}j!,h<-zQJQ9y`A}f!tոJ|ͺ"xZѮq^jD²ZU)[vmq5yyEe8ĸ uqMɱm2Pf'Ѓ\4K|*2}u@ү j|Ô[oCfu;F|-n}7ӿϩ-4>d?ROۄi 9zsWӏ>H4i(jW>.`Z/yUyl(*^J_rIycdɐƑkϾ1jgqG;ǛVGZE] {EΓO&GP̻Le5QPc(7MMY;Pt8~536=&#.76$|KJEp`@᷶C=5oˑ=8jx5QnТM]\s﵊JdlB^*VGM˶&eJgf#ב!oKK֑OIq]Ot?t z E^hJL J JLv JIR||#ݣ3]ٵN7*#FTK+}eb~x~If 6l(zxB[y-dKNٖ+V-WNLwş-K&8FV[Paֽǝwm~(y!cZ?80]Ҏ3?e429uk%wgM_kwqiMX(dž* -W::!Evᅕ᥵6U56e*R222XƴWR3ǜ1u<7W(|yPp!U]tf}eĽVo뽧.L".// 72]gȧIaA Is:ԴԽ6$97|K֕C]d"=bv߉;}3ڶ52&SvQZTg^h& _o_g!2ͻ*7Yz,]]#TbP KWr{BQ^AnsћEAfő·MgjdF(/z~X邨_ŵu^.5T" ͒6/a qPnݔrfioʅѦ}ő zrevͲĄ:ؘ:D֬dqI(YvNGsPgC@l\FcBA%iN43xGNck[RS}YP~RTZg#,iU8ܐ_Fq uM* H>xM(?yGyP|%%U&Gt{-}vjhuPNPMpU hNPQ~ޣ., /#o8EWFޭu,j Omt>s'w̨'s\L8UGVėzDeyF9TEEiH:ې}%[*&ļT)T)H/x!u~=l\u9+tKv‘wb>:ic/7[]:H-yCQgi2x~_c^[CU8o[׷Mj4]?yQBɲjlXGl\̢7^gsb>N1zWΚV~"|qkDQ sD-v5~[&:DDU$f5Ŧ{ Ml}Mr1#ɥ:2Ѯ*6F[H8J+"{ --sc.$F$hϊa~Lwv: zPɋ9ٞw%66=ֻ> Aş@u~78}{;tbg*TZSV.EuOz]]y9#Ңz$?6|c^}:XǝxϚĻo\/K#s߸nuC[i;]E@} }YZPrVim`Qrg}@ .ZwHMٕF瘢KaQ!AUPHy]yƩ;LbVUb=Ě*24LШ4/.e/}d7^{FEbdiҰ;nʊ~3鮌8~'2Էޱ%+bni1?m1NV* + b.1Jgf/!Z"9M4t\b1 ,b1Yn61s1wRBiZbĊC+boϹ]z՜5;$xʴ4gL[NeO9E&UGGyT&W&$]rLDO'RKt_CSxLmІ֋!hœ?ܵ99=t}md= -:AsN*LjJ눅3J -5 &b,zLB?) %iJĺmF^pyKƫh4 plM -{MoQOG7c.WſJ+^{!Ey1*KY1J{go\ ]" -K"ReQq--n/I <љ;g E="av˖*,'iy]UȜ~N~|%b21M"Ft]s!Ǣ~ύGLXA($vQros}EgQ?it_TQ>B+QwݣJ -\#rbW"eUN??On[c^v1,%@78|rS6 -+9|060?>!~b԰)DbD b- -n r(GZ^*,p|= -嘈ENផfyAl>|y睋4+ʲ=+Jkk {sSH\{됈H߹enڣK(a4~#;'k"n*_? W= }؍E 4W=AP%U".b^BX$ac+OBBc V S߂F\;)ZB,\OոDu>[&$~U8=qKw./ -ܢ߼t~OVR\#ˬDIz%2SfxmU5]NnڭLI8wƜ8NH^<Fq(N fSF,&('$i4p.'A9EnQSeˀW"凾FEkϑ9%7ڄa]:X\)"Ka͚{ǿ^_|mG;3ݡsCu(1x)LHaI<~k n 9z/lUz/ӍQ %h \߸'7$Ԗ;EzSMP-Č >ӑs4Iĩ -&Q=<Ϝƛ>Id^xEx-=%Y[l^kTJԩ"2 -QK}YJjuk+oB3ߏyd'qTiδ\Ĭ{9Kԉy YxĬņub-b2XFrj['z9yp-o|J6{JΌqJJ޸D)rB(a"hNT['yr4 C9phhd1Cn&1krb֔uĜ{%kIJ-ÒRHYH3 Eubun 9M>yVA OJy5H(.pO@5>u}s@cL}@cbms`Rx՘1ڤqzmzu -0r1gbԵ(7 Ao1knBqnb.7%. ם$Vhݕ=E%[۪;r`g/*SGC>q 1kH3χ 뛱7_)#n)흶={;.=ǿbjbj;k;-Rm0lSprʞs,+uh.qtI-q#4;L߉1?k9' cQsS Wk4)[bE81o#7vKsz1bw--5nVQ;=+'{ĭWV-R nQPiq: _6s wbML$`l]c hCBKoz* leaRT! ekIob5yX' #6Y^\;qUn 4>Uܖ}Ul=%N@lD qڈ=eNS:w#n#'t~L ^`ypt-i((9/|(uO}~Tٜ |7c|6%j -Z~'"HE(?]{6u7( V jk{6SIJb+8lGvݗ՜v=g˙_;[t~~w {V=j:׹zeA)GWrfƁlS#Ph2ǎ@nƸ~g<=C+B=+Ւ,Toĥ6=so!ah_3Sۤé攻DVK]k#/ݡbO%M@9a̙wsg:_=TM,T7m'5 8G ɴ&:}\ѩ)Et:*&qs>KQ"hꍆĜ K/?bS,&-'oMvO3/ s' ?quQ.Hr- 8sgoŝ0(XCiC; R{6*8L}p}l9Kݜ?*'m~>@?dy1Ȱ[黵F¼w"qyYCAq4Y53f/=Aea^X'%&GL-Ă::=[bۉ÷T}│Uq|28s⁓cu]+4 -{%!@N30R48}t9.^ueyt8mAwhx/ZBBpkK^ŷ -?h?.%j>ɾh7gZNJ.e_NfuQW> ?H9S.{܂e{1׏f^'vT^L_ũ|$F "CTw/ܩo(7h]]Eغcou~¦w.gZRmcɨn@;Zr*8}΍O>qz"/L㙜1lꞍ[,`f\q?}ϸALGum&b6>]8LE3[9Z۫'x@o6"VO"a"h𔨮C\ H$UBk17/l_1~ nS7JE䟶-mUOKޔښyIםv9mdV~2t /BQam w0 -WT#VXn[< -=:ޭ=4BKה8#M 4;hi?-e t`1mlb9nxMhFO:Y^t|$=B2gƥO;u =8{q\jޯz9eØ_ԍkt1n*:9sM3c-fr<ΉNm?&t=՘wWmލaKMxFT\J٥;_?vv>m`I~Ec,+YohAVľڮy -D.rU$RTgR&S UԸí|G(~XqsnWB.0 -LgykAZfv_ SgRbI3ikhsSiڨ^"_b&Gnl%lbn'Bf1YY_%ϣh7)t3xhRZ"ί]TsCt >=fh[~.1A6C7 T] -'7s?p ;k1Ω:M7: '+)ϔy( OyMA=uBc6B_Y0֎s^dj1S`#׍Pޠ=璱e[eemj1]ug0˨}t|n*Z~G5qN-P(i.0wU{^|& c\g:V~ol.zvJ#rZr&$4EG7fzX)Cc3{ x\'&/YE]ߧJ]pjqy3.%37`Q)aL|4˿6 YD4}4c7>n]8reHrCG69I[_0Hjiء{[uq5 -Hsntuq:/9b5xBYـ4K&=bBSEPYܳȋFpZNCSPݽR'x!˛hꞺ -8$v g٫fw -~V;E+PW~TK7N_SErK.v ptOMYdR5k_d lտu~.²EQFEct,4Ìo;~(mC4] Ű)T -YNYE:<β4b'#rjuN -ģȈkh9m )em,c-̶~ߊBBpNXU=T%!F\Q@ FiJMs{}g~Jgiko&֡oW8w u?v ~O^ԝ] -{!؞럦zpgҰK?(PY*p{Yj]?yYu\n$mV 3?]:8͘b6P3,$>Afu.;4GL`u -[hvoު&bog .N\X%8Ҋgct=t r\( KCT/4r/gt:qM/>?.5Ҝc\z^\GBAt>vXvj.kz_Ͻm{ugkNeMǔx?h0l݉/:Ks%fcTw(ڃa^Iz_o^n6HOs^}opC/vc^g>E&ԎSjMc,yFӿ_͇{GΏ/߆rWi>oEyJf>qf$f bӽO/B5K',=}w@hҭu־q\pΘhs^v?L<6.^͵#V1ɶjR1lK9*Z ɧ>ꅧp_uZ{YBJ89vdƧ!{V oA -o//K{;+ XH{;?[qA?8ŧ9qza5.k@U0G\t]d7aO}XH>v,7Q|Ho!hsp8f 3BQr̭'!_\EpE/|𸓐d5Wp_n_|!Λi/mKx'4Ϸo/Ӟm'P̷oF]_i?^-x|j}LPyi~._vA70+kӕޟ6W͚+5gk6]ٲrfϞ=^=Ylcq4ykh|c, 6'朖.؜q'_/<5߽#g_}kDG^D̯ =o.Ήiߩ;.;6w Z`x+4 siiF>w宭K7ilRhfel(>6Vo %i%[񩍎R卥􁮫1I MfHATc~lh=Anȗzn_cU:z|3cpV7wE+~S,#6N.-֟._I_Xx.a]اk9ugSǻxi6,_ٷOt:1؜4?ISLTK7ņ˄o]޻䢱Rl\&Æ)#q\hh9ÇFP5椡'U\]$WZ̼t~3]`'tNzѝnݹ\vqCޫ~M*;?) 5h& k+OKxAxE8!n'wonc{&O=>b>6\ۣM?#u*[k, {7} -*:h怇*Je}M)dIJit5Ef%Zj-o@JRݭց'i\΄(iiXkhV7 ǯ[>w"?r7J'}*?+ ?t[? *_}\M>Us]+fq>9y+پaFU9Ja8Ÿ)+sI'f6Y2J::NHu<BP5\Lw|+ NxH]3UT꜖O7/>`3AcHL* kTW:ЌF4*,K73`NOٍ;W]-X30%MG G,>7]_Vˠ&H, m5'C]l矚N/@ L g@G:@BtX'bKGB\=$fƮthAӕHكsHKNΗUVJŅܱwWS{WW\[\p`Q{-]~.}k拲o>ìJDǠo\j}t?oW@^,_ { VIu}`3zb9u-. @.f.:;1 -zi-V,% t +9h 8dbN@J.#.#8,^a.&к4c} ,xw .Yp&n#4YԷ(&pV}E`31$mb2O*E i]P]0|Igg:br/Y)Nrnd0a2m'#Y`ʰ #tRIn(eu&_"ͻo->cwO }+}#iC6kTZrO^`N53hrCt|9𰕜Z(T[&g g _r[KIm&{+?J/<d-C V|pg1W64M_$N:sl#-IJf_Є`l,hRNT]tY-"++ˠfc :Mr%74 sFec_l`7r3h7;T`**ÕODӍX`pZ -T!Q*%Z!%5c6u#4S%T,.;h -֣X\7Zj9ě)l1]Ytt,F%>2FHiO j鹅'>gr}c>jإ>gx.4Q2ʋ}CjeשL}MAsBb_vr6m>DQlDž*\H5kl-gfuMk@O@\ 9;WHxhG8Aͪox^Og>8m!nh1or3%@7kf3cBl=[5An}𓮮z$8;E'0;TN>h-o҈%ŦpV)VC{ڷW+胉'>$v~_RvZm? -!~Z5 Cť:[?ڤ?C? -K#-s^>[9zr /_<(=w!-sŰ[1"ǖcOt[zi&s%)7bV1{*5,_q5t??`~r@躷,D%Q* -C<􍅼sT\],lwC#oZZ^0MQ꯬?%wlsd,JfX;n~N≾ЃJzfR܏g~{Ì~-n7wޤ{wa2ؓd iq~Ы9zD=gd hz"C/P8ri>U1Jl,%,b\^\EG;W"Kf|X ,. W:@]okp vڟy7CG{Hcf.Y cHun~ g>ώ}YSwJ(<_j ŊK; 7޾dy_vu G?Z!wstb~tGb=u׸e~U+<5o[`/X!.7+jX) ,NM#W8Ur;ZhC߹Yv֡B[]`%زz)B/FCSdo˳4e&[Ki74 ͕ DrXp1v} -cK[X88/jt=*ʑ޹W럆^tq1q' DZ~|ꙏ:绽"b18C-S ;K꯻QbGULb$K7ϰ,=r׋=dlk(s=- ȧxMRh9|yC=r}x~N 2#~ cHZ^J\(tcL3=?g:4ab Քq#}:?kϵ׻;o404լiJ^L}h5zRbbڏ^kv⭒X;,gT9WvxɨU`bgYibL %YcB_=\>PX\R)< hxi51Qd,j:rb"[`K΃=f&5Y~7$VW -EQbh?b>Y. "j;׬vm*)Ng0*/">r*hsHl b 1JYޑ>MJa\{,ߺ˘4k8/C CӏeE%|Y-`gYx`-1Rthu0 'U`bg󚝕4B DV[,oG v|nt{,0Cr)[SV糺Ce 3p3ϯ>`yIxpʮkG|`~+͓cOzC?yZꄨđ|@7EYM5itƃrz#?sw bO։R[c^ Ò?V /˗Je2sY-#筸.΂FzdvVD#.WnUJfxmcԐ0I9ԯ{_B86[?L!-{ -M8INeשb[{O-za8CL3ޗpk5qQ-\Ru౗tk_rx10aiRg[I5%M,Y{('_ 2baCGhCSY/9@|yjej~TR%J;k ]fY1qM ykM|w7ߋءU}eȅjNdb?f 8R bW;_=wm&992Xgg/.pMŒg1"F';)Z>Q=h&[JQ2j'y,DʓtWq(k$|_jXb,|t|pRc#Y\#.zn4KM9Buho@%4^_ !$NG+i%V]^Z 7MLjP7ւ<(`\&Ν Œ`!} "U -Me2)͗۾ z܏:GYb\:oOC̉]5S>\:{'BL-wV͟;pꩠ,EgK9=Ӡe-P"bg~V%^;ΒNly#b[Y7L\}0[ 'n.%"|<:{k=qVW~ryE~ᄏog?IܐfI oLRQAU#Rm RzK& !_Vm  FG`9ʹ5dL 59 xp6fLTpr{E2&V<0̖KAbP - nFOD) 7|BG/f5͹xAiU@5VN 37CzY|86ȋEv67Of3GKG/-EOCjx(<%E[굲WĨmB/pސE~¿wPݖ2M -&4k=ŔV'ҔYcxU9 l# k6193@ 8U KĖ;mߥzVU'g=}ȷ;֨Xj;syw\8c=wr:7;F>Hp7bb+!f"5c:=k_;gݤМJɹT3٬58˩a 6z?4:Q#@~%:%X=9B̈~R;|+_"&QՍׁ99Z(14 --\Ob[KGòm8C%8CWJ/ > -I651K&׽{VY/B%T0c7ws-.i1ȎbRȥԢqdb(p=!;cWz^D_ALWt }b[bم"YݲVbBhn=_GߺV5X _bE.T~-%_Y넜?| 8{ PC -u'.7l1?_™ )[~&&bI`=aoL twc93s&˕3C$rF%X,F#Gk3\4^R쏽>")aDQٶJ*8eMATɲCRnxgGk lPg>r6`WwaV^?(9|9x:> vCjUfȁ;onS*Y.bыg.C81ث'WR=Ag.JX^ 1 rm7MwVӞN -L|֩~glʑ[g1Nr\.0Jo8lZ*`‰,4MY)U<5i*5]]%v~]jzo,ko)܌;bYQ3|گb1kL*sk.:?̵|;Z̢6cQ6JY< Il9Ш|;5D -Y>*U3zn l\ޔf'.WGuL>`5_CqѨMP#O~lVN!c]3sљ*yuWB=3[jq~r 37H'V8Й#S:8HqWSF'0'٭Vsmzxb5~{q^3ay(ָT{>e>8W`Ţ̮֘]3V / h*GB;3$σ>yJ8+e9lJO ),YvݎʰOQ: :mG//g+` _r;fP\=KGfXW][$4:"s/moz"Vh8ړn׿t;Oi_svlŁE)Myyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy7ootОѶѶ\h'Ǐb_[',0!,&: >y3r+ M̾;>,4,}Qy)=_B9><\ow~YoVhCfk@C!ڠ$+5|f}Ƌ02ƙ{#=.|4G12 mŶiVZ?A $t ZK_?3t;gW -5H8O+!֐91UM1u1KyvÕ0zaKƨe&P0*T0: 9 [eͥxeKfB~"HߏC)#"{C<+bH6!8Zqch)*gqCK֐r ⏎è h͇Ɠ 乤LRB^U7DGffLTO-2Ęf&&ZAv{<FpQ\#H(cR08Kn"$؋ 5u:G!4w!Rl(:1M8&+=1cN8ZOG!~aKN1Cb޾!f>3U9&HzQ)V>HA#0#D<~d+2{gK6:C~$+0DA2O8Lcא -IHX _oN0W:QvjD TiNR Ҭ1+e12i`[f@=)jBIf/qݧ̦IrĘ6TTv]!O|/FI %^[m8rzJ2 E>OH/gbvE#^i#11$X+&c줠6~ht5dˆjB8%>w4~IfgTX)g(:9kM- ++ꙩM 1p.H匒s[a FKzg+Hvd9nIC;2ۖ2$C6clrVD%1 7$_W! ٽ=b '+(+A2v[~@^dx0j2{>I|`bC)#`?p >8czd.[ a96ZH:p"`:zݸ9!4N4 m Y/R:f %/rj95B2M4>(12-EYMqX.X ѥ K%@)$$KilI?ug&phib90?)Y`d7{/ը;!D9 |d -,'mF MNȅ 7B>*dd!ɫd<.ΉƪII|xf3:6Ƴ!MZ`(蚥t:cFzź%Fn ͢C Nt5CHXc^306_-?ʐ+.-d6dA04n1żAJfk8XLrg̗kk<|?aф(99,Dn'!@<٤*S -FsY#@ gq|Ƙ?1|ȉ<qx >K5gfWy)6PojFZo ȕח ͟oko ᪫i1^Jo$y{dTZ)[ ?a;)5uWV`l]Q,Cbdbe",~fb, _#<Kxw|lSkʑDLvx*߰OШ5FjqM I ѹvM%(ܯ򱸖 -|IcI)X@6LN_X3!%v(#;΂lIK4lTM%_IɕRFx.G!B 9;tG|=1NΆ $a1̅QtΔj.h_hH>H`l(ȆEsr{THw8z.mD ~[p a6:`'B++d>K!fZ˽U*ee^5!AH.jŐײ 4\9'~t\zfXYY͓FLmpsڧ L$ρб: 0ȹqc̑j2#!#@GIOvb αkI ai6m>_{c)$aCWC fװ5zVf%!/kPGkPVC  ?}f> 16JX_͐+Ɛt)K.$RgIp.,r8Բ$hބ]h'Z^W- scp~w$9YVKa#!G H#i%u8WR̀w_+~ZJvÁdր= -~zPX-}b$,'Ƥ"TƣNXST+ZH֐:$!喐 Ju%$e0|-YPng>$74WB&1$Tg~+_~%IKl$1{`4 tww"^[Bd_P\=(}! ~ c:P2*},ZyXkMl-}wg gM' -Ms)"~[b>R HLwbkidCY#9VWGHr}O)f|(d_ Kzdl 3P~z!տ9mՂc3Tk i&Ŭɔ/;m#,Rr83IeR>@hxj7.B?|QrrD(Zo@!_N|Ap< 1BgInΩbV)G8rmx&Nn LLr,NC]J>D\ϙcT\Y"\.d^^Coי]aM$/<OE}2{-,Gy/wtkt{<@[5~ztMB] ,N 4²m#c쑰MH?"5.^dۥ~gf$Iu` -"#Y1$[1kdwx)dMByɻc3?A9$QO=#Q??Ǧ@.}0% VCqC"ӏO2II xnPzm9p|rz䂸_R%Bw;c63匶b+w%jpYSuwo;o>@R,ѰJN$r0 9Dju>j[qǿX~"m1VE눓,oB=Rh{\ >90ra1bbדR\ L˥WǝĐBNfLo1k&p̭ 5ELjx%4{BL;kW|T24zBG@);.oR8S#?+p_"BA[u@2ddD؛R$? gAd:+o'e4Vױ$LhXxm$:].jET7ggO=|5g,O[> ־BB.˳A<6$zg!?BFtOi=3bBl=bzJ4O͒sO9#NS-b:$΀BlȪ8 ࣀR[R:F9P=ubWc -qπR?]oב5EN؉mIb[JY9]D -vYxgX}})@>Sj%$tpw|pa\<9J[dQY|&^Q#B@IB?$fr˔3k^,^#!@0;k6Co}JX^J:ko&|!qo3s|׋,'1"XNuJ=\;L_pK3|9V+{s! w\Dh%ډE(vX;"흁_3".rxG COt$W[Y]}z$/w|Vn=@"'5+:3Xl-m"!o;[?Bxl|{DNgj:/pdg`F:r~ɰU^& ;1ţ|?ʅÿθIk#!7YaosWkC!w̷/,?!o)>l -9ϰA︈E_"B2G$/Yk(:@a),MS)ڿ"_] Rŵ\ @J;_E{ ȻY=3(C1[g7K2u@$Ҟ rS7;ն$-!Hz§ca}p.}9p|X #p@֮<'(.@M5dQ,[oU*o,'4fB[.\ۗtϷ!OC҇^nгZ]poޕA{@!"!Iԛ9ljHeJQ :Ҵ# J{Q^>IYN0I'|1Tb24ĔS -¤P>tBz RZl$7.n<5.BoL A2z{"pEp,ٍ1@#xk/uDHH\r{`Tw -߻ﭢ~b~=XRbh?a&V1"i$ ,Hv<:NQ ̽}5^|47CèJ{EE -==4^. f' }7~r`Eb&@@@zb&rr Լu!~uckjpExA* :AψԄp4"/6.8oRb́LB}(Bfp&\׸Dk?̂W)Ş0B-҉O6I,爛Ař#Ts_ vGɝ J9rVTa}@Q YlK8>_4EO@]juԿ{"CM Ii)>!=+4~NEAO Ԫa{5.]5no)Cw -]v@ax⬩g`¡Dkxj]Wu*m{Ov?ȅk3p"j,p"RE$4.r e[ӱ 5 YS 8 14ezmZΠFZɵHg.W^AĻ6q?V>E- c}s_`׶aA~yf.<N+N-B{vq"". sJb?=B(՚ /yڞmUY]?eڡrCA4,ɵg֪P|:=Vnn˝= ލu\[VW 5|kpb(7>} -JwJvҏ;n~=Zqnل|F~qåG/d!}XWcBk+2;E "80 P8_l|``;5sy;ä5E>P,!DP*>3g2&WZ.guM]6_Jޱlc|VZpFH?6Ah=3rQJ3=qr9"##s@{~rajeԧ`T9tu -rvVg]e 8:L>7*]th#V򨔚BT:#!0A͈֩¡WkoV^"șa}݁F(DCQc@|;jb3 >j`-X큳+h9Ywu9JA=/-znھ 9;OH;6g"L"oB9BYu!O?g*..㎿&KGn(?8.b픝GS.lxVBR`kqZGEM;D|Йz '}*='S="SFiأE'|I+ 7$GpK 9G?[CF9`4"-(ΰSY<$x:/QH^=[K-;+KksY+gQCJ {ث'ؿDg|/M}!2K{ay,ϐRJǑ> {Ͱk+ %~:z Z*q~bL ܹ;wjĘl;flVFLKsj. z<\{e h~n%DvkP|5B=腊E3>gBkr\}gy=۔V]bB ya?c\vbiX-rd71gs ỌN>\T*5861^3 U\.4,̷®qNԯkեa5r)sR+.?ZO9+򰴆A./<}a//u΀Huu]t(;?&4XM{(U}'=!;g\='/ ͷѾUL=0hW^Z~XV WzB5^Y ̷2?M#C,fYD9-@ U\XDg;Y^/bOJh&y0~V׀[wbza죲x-zJɹ?9j[Kk+ ->|‘ل@*<ڊ.?{~)gX)ŌIR9B7@Ss]A|g -miV%l5o&ΐI[+)(8,-V]Yg9kZX?$䟚5]Ý~^W忼ݏIɿypCytGzy'qϢŷW\Ov3Feء/AgW5rͭRƓO{{\@]B'u4f5F]w<ڊr;mjNKC{+v} &ʈ\p=Ϸsw/-v/|b'@sJE/.g< -vw +Ͻ亾ކ׈ ^;`3v|gG?^h/}zٮo{}⭟O;,(֋P+Q>>.>.<++?|OWrO7jCd8pQ réǜ0~ j%`p@<&+Y^lyل /vܥox%wd4n]|,>O+U*YNx';hO NF=(1_lTo,c'7ҷi74](89+:ۧ*W7p‡>@?2埾+_-e-Z&iez@XKK݁^ -uw.9gg{{{<ϛHuu_kƅiݺQh\1lUt%#$>y:ɛ=lֈ)UMQEYin[S[S7{Ta7I1 -GXWy)^0jJDa?z)4Z,?+|XgNf3bPG6GFيqOWp dIqɭZyQlWGʂ/] >a5ycDްq;jh&HgC PbQ>KƂn\E"zaI=}\̻Մ_=LP{U :/s3]h줸NBu9Q1;Q,` -̏ł19KA_`yܜJZ+ZWD\wΒ53AѐDtG(y- P3R7 +JBZ)ޅe8ϣw { Y -^ ~>nCjw4m i -];8o>{cݷE!ޖj)؏"WKA1QyEɫ3‚NnŃj{WO5H/:Ԯ}<Ƀƣ! 5ChXɂ~#SgcvAM"GBpW _6ln='HO φ$ģaJNJz},dC9BV&+m7Oduꊸ"HXWF>`A 1,v6^z#=hRdnvWKŖ<=[n'I7%nvmgXGv7G8rXB޳dE)9 bTD>'Ql_ {أa^xnMtTĈZ[?;-7C6x'"Pׄ.C4_Rz7aߵEb'/Mdģ;ߌ>ؓQ?qh7/~a$(?&yWbVUcYϼUNPc*׆PF8Gep"~R_8X7+b賗SEh2LC0KSk0u29:/8֕+=ՑXS})hx|7op{đeR`g=hu@^skbYm%՞ǝpiHTlY.pwֹ+=^Vtjror^o,E/[=ڋVԝ>j~^U\YvpҦxawK:R2\)o""h %>*fŖ_ŎM0$Te0Q=px5 !o[[F=V[W5ZqA~YA[D= SԫN[S'EO섏{&Q. /VT[&lj]/= վFѾI6ï A@aU3z؜:Mu4xzpvCGV$Ǧ3m]főؠ?܇(%x5"oԐ6b|]|K8w%cG{GZuK-JBlz%XNԷK[˹֮L A =o-5[Yモv-;ۮaYKykԝ\f*,Ѽ8X,u#)D~i=ѝm.1" >2$٠@ahwVnR&s+ -++:2nmo'G"D#}QO?@?YM\oIvm,b37~37RUl,|2=6e]'ڮoGfo4&}O UnE걯6c*.ˬMLK -mz##ն~KmsWSw[WømǺ-~]-*q~TOpYdsu7aw3wR)xG=ѫ.{*_qUɠ?WM~l,&b t 7U,HdIoUCcXUc[jj@SXSXjz,),SY~h>g1R&iʸr%!7z4#Vg,loЊ+Z,RD)Y V'ѳV;nv -?hke3:;n{ǹau?~OsL^Һ]k ˺-^ƓndyI4̟DW9dcFy`I=OuO=ߞ&6ĹDĆ^mr-nrjs(]R]YY_ԹDWV<^^$shJ4y)m "Ś8{BswȇCB^KAGUGG^GP{3/i}"F}{%#CuRϝ7&|xB^qY^r%\G5 G NpMl/w6D:Gnsz]\ջyY]^X(6]E 8ѕxyިP`R|JyeykiEOy}i~vuXK=ksꋕ) 6$ӫAiU*wnfKmK> -|Ϸg躝f>T -}aqpykK@QԔ&oYb_CgNx"m-HkKo %5yKoջǠ=1Wnҗ^gRYܱ8PAO{mYX,ipCsCZ~ uH|pMp_M̻>JVZJ zy6Q«e ٥qоҢj 2yO&߶oYum_QZsQPS}ί):'ts][[pd e3HۙÞv¾2yQ+ \w?έ..tKzܙcRgR`[C[+Xkߍj;Ӟy#7ȇDˡqփ{`CoGz[ ?M;Ǝ\ޓ5_bX9vB,a)=f۷.ć<ɢdI Lh3AZd4BiMV_3?Է{}勧I'-2k_ùOX;.7,LhˈzWvM) yS=:Pkę֫i^d)JunI>L2Rc5P`_ؑz;'!h&vA}wncL+ lI|?\Mfg%kР}?).rmHbV=R_i`Uh}XޛȨ?2x|#T[]OACxj;o -آw>wHf';\kpmim{t.Yu.cNQ -}sH"^4;}HkJZ]"Ӆ߫ÄBQ<{'hVgGL;ꠠm~NOj4`C`nuu7ar:nOfmn3򬊎~u9xYqP|V4mh%;jˑ kcv`^U>P]󆄚xm?n8:;oڜv9Gq~^1,e$.%`XT|x,O_45@&'Ug. <恩 -s `RpjTe3Xp'XN 8+_Li{Zyo4b{1o\yĦ&$T.ׅELÌ4RbLˡR [[tbcȖN8þ4[?7 ]0,cV0V2|H7Ll^ε+nK笄m ` -&c:| -f -J`Sp,)}`\[w~R㮗?.pV;/ -j0!KK/gCOfİ~kwiQ9$r۶_ YlܴX7țcw}EUK`%ܕ`]Z3zW+)x:uCå~җR8 i۠Kq%qƽx-};k87{KzŽrRL} |n ~ԙ.v~uX;o-Ceo< -46~֠z`*/7>NWܙ]@;~wƍ1(pGb^1A#ڿ6\f1$*:" we^RYy@8/ommIGtxŲ,q,2a_Om-N>C[kMi?[Mo6]unYQw0PSn<֮3?BL5eM1Ʊ/fܐ/};3=V<=[^ 'xi -Zw?̄#(g*gsƯ˗f Ot~ZTz2-"Up7 Oz?)M|Rt+[w|^EI}j#k._uWVWlZ<+}^5[', ۋ[6s3683)zmi㙹s1{}2S\0Si%X 8v[dк>Ga>':ǡzء53eW\|`ם/EWx9g#.Bq!jys^ֿCU$C}:3{zԟ>H϶Ndߜ}cwtoћM罨3u W;<՚XRQ ǰ;oz{WJcG >㟔ħmjb0{ -3'jtCm瘎 L;;5|N N/2Lڴ޾"(ˀo|eTͨ*J{^#{PQ Comx҄:?uH*hÚv;~zC7+Ә$dx)7VX́}U`J0Ma9q#;GWQxKoz¼E - q5Q Uf/O_B FA95[Kݥboӹ#6;maC1026JxTPT'sgT{]`ԭ`-@yfOLnX1UΧײ{i;۶;aעPnV" .ƾw~od_:R=QRU噊.zt7/?ڇ4^JKLEUj:Ea_}0[q-PLfM.O lv 24B[ x^{v)GV]-yRS)++{-+,{ 2x~|ETXEn_~Ig pUp  VE+8` -T 5$dxtNUOo}x"<[]{\-Y|b /0kz3Qjwn84Um -/9d< |/o -7#&J+v[c~t&Gg3桹ә`θy`U`ޔ@Uy3)*,L5 W-`ai]/zVH9Ҝr/e o}[85TuWy&9]AZMU mVgRsn0 tx_fO۶̙ڧI,izUJ4_gUۈ N%bb߅Vܫagc=⻫<k`3?l9@~omQ?1_ޮO;\ͺx.).-Jx7Wݒ64닒TOi/m[IV\:uڮm""/9ɲPfq3}#Xm`3X -Z˗\ ( 9%,He[`623QS>kjZhMmSG:nG7$Xݏo˕e,K{sEv=/b<λ)6bpKTr0o3>mӞLlT1'3(Ar",Q(+c)5mPgA/Q{FEcz/R?sw}O8\3SN0D|O Z ?8Ӗ,EQծ%[s%:@u-< 6c`#v lFo( ov0^OKއ߁晻rCNI>JTHP1'FcԗR?ZZ8}-'t-^GP9pNQ,~4 -~~ %Do;ϠX(Tazi\;X m0+u]&nبl>d6:`Z]qB{<~IY_[Ok6Ӧ&C廧mϭhKoߜuҔ~ί 7ݤwTv%Mpki ~)ɝc=,UcO(4̭Ǩ.ڪ Zic˖//إ<`l``S]>8/l;zˡ -?=~u5׳\;~~ziwZl&?aoNԳ g\BikV{9^7ҦDIGzεe﹛b('8YvOrNn-VVo<2cZiopϴ*iWmci5:QXi~WW+{P 龢=wWӺvڂO&N}p!2;.c/0h%jS'b^o^](:=S`Y𻽌皣jd6~vX0u[ OTy̱+w N4*if%;mv`}mZ/h1V5W&ڊ?J'4zAsݛ8ؙ;yÃ޼3>nnNPRnJ.<>h%Vnâ^lR_& -MDR7'}Tژ6S {|NZ -Thrl$+,3&,Ӗ:zXl1q{NVsf_UG>BU>s}U״.^zdr͏?Gix]G}%3#"o1?c .ܫvXL ʼNwd:ҭG}صFAo<ٯi+w;'jΣ7lʿ攨3;`dIB}EDr7Mщ1vdS$e3qSdb.]* -0ჽP9/Z-a_i 7n?귖`ї5O4 ;`c'EMm~/6HH 䪝'$m^Ac#D0ذ4 -H_, -ZMɪ4w.UM'E="A~dx!ηRʬ Z`8p{=z M(Z3)~ZiMm9S90syS|2V *Q7`ϲ` :{&+)||xKnυLg?6f>1rX^AF.r;ٯ%N煥gicѯ7 -%c6Dː#֭5ԮT*;hJ^x8]牊~Mب/ǫ!:frV$od˾O8l4Aue|}'OO1|O̴NT[{ W!֯:!X66sA+ӻB^/f[yY9*(1^rOjN7;a/FIn|VnU쬱ݬᭆh䷪KjoP5,Nh9FUz^1Q=ӆcfU>V5oB*˽ y7tо --vdCٺW^;lfO] -T&z֡kW vZp&/}_oh&LezcT~"SSD]Xj:@@g -181slЇBA%/dUk55Cz1Pr`YDrA^J}o ]Ҏ041"zlK':*gܺl(u"|fj0{4B5U;KS=myX!q ;E#5*1p2"jsXU+0e"h="leT~X\lI]1$zYc:OaY9tY'16dpL ;L"ZV[*G X -\Ǹ:FBph0=uq';SFpJ^W4jq X)Xqf?o$^8RyuGDZ|9|i6)Aw*t -sdu3cWn.|S> A+8;9?Lo|U3Mʾ:u沥4۴obҿ?6¹m`7u%/;Elw{Vpv^6; ;b o (oPv6bn"P.1)[2K< 5~ro||T}$TiiAq ލsӈ0 -{qG%)T_%f=uXM<j!qZu!mi {%:-ϵrU_P5k|w @E!fYg;Yxf:?0yS1 $wż-RR3a.韽B+WW >ջ'[O]O,/^f7W^îj{̮[<` 5 座]Ž.[vb 3*qGyc1^{6j ,fúibu@h?L 7]ӗgmN(ᰭHEr2pnLv S9 V,fkL~7gDiuqD'1hݖN1~G,x ᛵwT!/D@)/:_uL k9 k-y6Td4.FH#ho>9xЃiѾRы`fIZ'';7PA;ο9vɵkmXN/CBx-$/Dgq0玪Q`%~1jȜ*9=qş7&Pr -h@Y{IErH).b_;6. 1 v]gjuZ0'9Cyx~F ;2p̵GBpi2e2:(wX Vn(3aʼĵ~=5$.GZ'eVO}Ř:G\C{(; i":RR3%._]%T"owhl׽.q?c~/wD6~\^OlF{; {|čm=dz ;;NgcfB[XL#fo5" -`'<'bgޙ0߅`EGmҪ^#6;{"];č}st)DH~ΨvmLq3л{ҲܬxN2e=رf+4k9سr 8u;,c̏ M)`".r9FA{kHJB߃3q ovSxVbvcޓܕvv.GL,&AXP)"n:X=' Oj؇P5R3d*xmͻ7Z~XFNK8JiyC"9{mܾm{ū]@OM@ /|c8LWX}!r`&3GAh) *ᗺ~5fţm"/&@x)Tٓ!71\uX܋xD`2K.`pYm`m3wp=rFiP2k'%9vd#b )f#.DOr2b=!6.DzZdn!JXxxVf#ipo}’Gɛl^n:y9g;*\Ͽ=f]~< ~E=17J:C$M{ԃV!G\8ww7^\#G<=ޣ!S>M20|ej"V36 720w5h>^p:tpQ:1呮CNv#qa#6]@l3,y_ĢC XW4N_@8  -M:rEa}1pT&Gtqn*:)O:GB[ ,[q<(ŌVQ8sde{CH 1HGB1|q΢†n5`xp턨A]y٢8 -CѝGz ||XS*C 7&@L'&nbŧ9VoZybOY%k3~+ - >5 ?8mT㭈KJ`K~q}O@ {"1϶Q*"9둁V8jIE^gN&s -V ޤl. | - N2 XG `qPNT " ī1L'#rĺCE 31l"?0``j( -;qL)`'~6"2ڽS,^ޔ#m]ƣBzA9f4ڞyfj~Llf.B1(,~S!M,ϑ+n6qa ǷvGIqϣ3" -=bTk+aݮ&}"FyaEۄ4;vF#6/9ݪ0l;D\RPy -C5<ЗS b`|L_H ֪p9F0[ɩ4:j&k}A'vP0>01br#4"?nuN-* g! Mx\.&F!a'/o wOLҺ\es甌9\tgѾz=:Nπ _dt`@E9 is6'ѫPlg9 䙴 v0`e94i‹lB\.YEڝ8u>Aح oSsHkɬ:-!f(핰q0w['DŽwI80;=TxRu@}d`ͣm t4RcqBwV&ZI8DxRetEQHo&3gq}6ħ]bb QZ3Siϋ! '!ܽi!ܐ7) ٝZW}}6@zW8BSdX#ޱ)&<JEnB; -Fҽu>#Aq} -Y?w%E56{mfxdf<ƙ)55 ]gSG:/Up$f ;.yDX -CJ·:摩jz}2Nk*BFLCgԟYXtsDOPBh@9 h*j#mB*bJ<!,hļ#Ji5K7ʪ-Ӂ$qEƗ9qa" '[Gn_I^B,n C2tkLM ՔjގY -濌"3po^쟵z $탧𬜔P݃K˄71nAb1yDDzԇȶxIyˇ_Ҡ#Im3=؈_>e#g[(n +2]=sʈq {5Ji3=ٌ8cN8$:7ap?%Nk40˨e!.<##,.{SW`MU .\]kU?zQ(b3QX9ӑ>iкG@;Afui#C*y_zsbi)%ݬӡ3V -Zg4 &y':=] b".7Wf0|dC~cvQI<+GE-˧N(->?Ml=i0LYKqô0 >7Ҁp -tΌ$i0B+Cg4UWV]_uI1/A"jsOĹHaq^a#?pCO1£2?0F3Y0f3:CnH;/fDCt~e1OF+Ѷ99iS0 6{1?#K;Kܢ-Hfq.i/χwDHblO }3DHٸGFmAF.=r~ ]| A @>)LA\]*K165<pw>OW\aeUKtM^Ǭ"Kphef]1h#zZ ڜWDcQ\g5јP#\(牬\as=="1z5H8= \xÄ -}vV΂TOBȸvy"`2&|S,(+{%Z&%6!{ Uf`cDN)"}&f/w1,n4:N]ܢ拮;8o ҿ]o`"`t'Jpf3\~wb֢^0^SvY1f#>H9!, ఑xӅλ!0D&5ig1ҿl&H ^xpLbt\3[nqMf;n}g.Bjd)h._^mVehRbꦬqos;wEq%ѵ]BӐ=e;{ ȅqhMx|2H7Yʱqs9>QB]׌(!m?8a. -EFtF)`+q)^W -YmH/`ރe9ۈu,% fIK ㋭ZKK; [HdYH ig!dTvO, O("q -v.bΆ)\obFtc=ڶmsBm9l@rUXH$AQr9S9(D%Px½fy^m}\(s>Ɯ1F}P-~)x?Ȓܦ}k˕ZD)'zT 6Tv BkcB;x$v]X,ڣ Z@=k^r1l5 EƄ@z@'>KXRphjbna-Ff R%" -:rm}h:jT 6pcOrVכ+7,#-4%cyvq'=3a+lwKhlzs6v?E|W1Ps4}W+SW\ -z|sSMdKV#Ph;B -^Q^OVUz)w WOWVTEDeT;*ϿA+vV` 0%WM>xxpuSm~2zE;kWAKΑR" `h)wG9 -$- - R3P?,%=x1Wm|F t6ᓎτ^ 62xsMq)f:|)$q[?!>2w~+yejaOtg~OE/vF1YiܡR_h)yl;è5FS>;+^CХ\+䙣TMF(4gȻ94)uKK*i6XY;R9|m[#0Or},jg5,Tv{Mp  cf-wE; %hP})Rҡ9RhXCČqGgCRt b㨛(C {9..1Qzx-b=GfJAcEC/oA;+~ -5-4{գi#s(պW qe~"w9D{EqN~9[M&b'ſIacLͶjp־.у*RGC>O92K*dHyV-/|>=Pt21ߪa=?$K!)15'۰? IlYp/CfOh?q"*)9_ȺX*Ў. -t~mB[ƟƢBUO&IVՍO't hIu#J&;cMcº`]͸@[Y}-*hgq)g烏5KkΗfP,h@3\^hghg Ygpy׾GVAy)$~-lBȲ|d)>Tk.;H~ BizEiOBY'gA:{OUa\䃳PӐl4O$WָKf&0X5P/2//y[h8!qYQr2;29|]hџ8IGvVDw61r/Qu)|Ϥ-@sAP'Lӎ,#6ϼL1 Y%ϠpQ SdrI$/kZ)jR(0׭;K }CͭNq;um;UU)[QCqER`x2Ƚ)n}P_1T3]Y!d蚫5Yuht8b?q)YlhΘΧ1͹u O1+5'[bL$[a$J<7W}o 4G)GH.Zg -O1<.,9~r{/(c ]:<е^hRLj%./ƚ˩OQ -h=4CJ⶟M? K@W 6EYj:1XZ_ѽ'5bP|7O].kIVt{BEbḻ}tӃ>ymrkomrr Vs@K%qF=J S~)Rz,]+SZ̫.:=kۘwԐo#,RO{>{.9GV)RN]!ϻTs}1zQ9g~\1S>LI u /ygV-mGJC͂Mk_7%vDw'ʉ*G|$gy Ss9.;p[ybv~Զ1MV-u$̳KW|{ȊIػyz蕣8{{2ı4C'STOf[h}S&,:9ΧG>%>\A+uv2ޅ;# pl@̋ 0lťB2 rTO Furt`"賉 GzQ --:Wu:ȓ]MCʉYt?p -Dhb _)q) N-H4j",EW9zmRpoزwӆN?ˎ00; {?80GhFMy_z|=_z|=_z|=_z|=_z|=?Snj@n@)7/ ϘYi1PLjPtr38_'{ܣ5;X$׾kl۷[ѧzKg z|=n7_m;P,ЛOqI|Hۭ`gCșg,]6w'˖.-xy[ˉְv} rGq[gv!oɉϡ?K.J$.ĵn{7}br m6z0z,]=:6fC140a50j˭4L5 46̆ufȘɶiF.ο.m]sjcf叛xHar49inuMMLp(i6rӒ#um} ,C ̭wن1e`jA|9~fՌ15[Xט -;tQ$w*8[p -;G7ّ0}l*&}DO4|Np С\OtWK(jQXۼ -v;zG Rz? ,[@a -\/8XwmV p39ȭx+R8xV{P.pN7 -.YsU/~W?yo2lzM% Sڣ(o|cq?=bR.bXw|`7g ng2y>m86kܮZ-h CSȡ"8tg; - '-o H&Gmljabfa`"12GLy- !t6њ.Z2r= -krO]n >[۲:rhV/mp؊odΠۑ<]KP`l4f k[؞4ߙ2s \5UaکnZp[j n&s]X[/Ϋ_4@b b߽\/9M+uP8VRN੤^q#`?~ -ݽ%o+#0g\L;X4۽rQn y 1*wJJn;B;ڡ F(,Xڔ)HRU@8; ;v(WRpXI^I#vێ'=I{qm -eYbұYK`5@v~F2'+zg~M)tʺW#9 =lڃ3#'Smס=7>Ô!Ex!dh_6_2w o"jnXO|ƌ%M%X%'3QH` -v-ʝcyk ,M`!.QE1hO\z]y~J- s[t -~ :>Y1&t8'ᄁcDe.?jKt /yTz$ \KNГI -w8P2+a3nz0)̑tգt侂^(OW^?CS@} ='!%c9E=lF;|(zxi6zl*'ljzF FrWpigP#x >ah-w3Ew -Y9\_=}Փh\D)`8TU{!8zhwTD #<1wԡ9s`DGn <%^ʇA|!|#|0|#8W9G~͔K&%8$Irǂ}ż__ʣ;:"Ҟq2n_\P\ {)QAG ܏>Y 8"CE ?΅p ɓϒ1+n,p4P͔N{wJީWa_ph{jM.x)D=j0{'g۹K +'>l΃}`_>х -8RI[ To`یQ<&`gCcn6|%b@?ϨIJr|oʻhK&Pn/1fpўS pIgf  }3p#oP&ݡ`N0衁s3&0)}(HN"η08ĝéX(|Kpn/&iӏD2‡+)H=7|O"JCylErokH N]c#q$$SAljҞv[h"r:Wb;S~pF ӟ߃9,D~GyEUNI!~ s\ ∭8pOm3)A& d6$gpBȑx 8\VnNs=ڋO'35;$։[ -/w$3zMd$WQXj\sc-;k$qh L|b2ĸc31{<VNvnd6h<7Xܿs4#yyg/&L۵YMcȧpdnZತܹ$O[j#'dӢM6G:SFK~eyȂ2[^-;V}m1z}!4Ln㡍904LG 9M0KS|1yǜɵ F ^o+wl N$T]iAvze,hPl'>z2zj@9#S+ʗ}OM{:(?*q |Mtw V`]@n:W.3Hͷ!àsAqA@xʹM08c9ۤ> >yqYzk#n٥ =pkx;M)X~'>pRH> ixg뒹춀rW܂15(&yFl֯784^.zh\ -;ޘ2#>uKNDyQ_N+K(N3\ܑwCnQdIQ\Հ?LʃW5U^xVQb չ̻=ze!;>*swvc1;u u6rEiϔ[Zcc{z&]/|J(n^+֯oKw#+!㐗R#pw".A &BcO,71e. d=:+)GB~ʥ︻/Os=<'n1u;^V?}{#x !; 6 >{=i49kM!;D %prG$Ձ]ZO-5AB0ܮ!zeg`gQ2dUoWi#a&&&ý\OP|8ZG )v ZOo 8>stream - M>C_eIr3Mo%xI;v(!C:?f@יON9=ڃo7/ >,*.{.[E` yfJQq)I$8'\@oX6(nW\Fyg>"A#s~%#; K0[}ʭnuF!_G$ 5/<Ky |000?Xw 5Fs/-DƦ^+ĝ)T_7KiW.8}e[ճ] ?=|xE~ܿ_1x ;z!v CR瀟gsMI)?J-$E+~ $[ՓDs\!ㅘ)$wA@2~=\\i9|MēywqWq! -?p|PʈOx]},Š'*rn-wl41 kq;ɽC}'C$sBJ!'ܵ=-)qXx-4S1Gw:I\2Hʽ˺N9)1 -49e{>1||GE)uD漋%VH;=_ /֓BK&<>aAWC u)iFp)-ZCh8O*W@cOQҾ`m 0Oi9\eK1ƀ6<[S9ɕ kY#jI_(hcn1wJp -Km yPܶtPΎ}τa_*tV$N:AkK/vTyQӏW }l ,TUX-|l؆r5f^ׯ@8q*wЄB0Ik}+B^I.]N:; 'K"~rڏK1bmA'(b GQ?+i8]CnKLN_S/IoX?94ɍ Wxt,$/WlC5 -ӵĂ/ͣT_=fʙ́m۵iF12s5Om %cb"1Ԧt~)Н16m ;=+#L v}P#%9j.M⾙dc <|ܦe.z]c&xkfQH2DmrAʛA El٬({#-%x)^ ԉsiߓ|XfmlnES ->>s2wY2az,GA: ȉPc 1r Ɓ%T\~Ïb¹T3~NC҄m6hc7`Xɘn}oQ+%v a4/]}P: -8W[3 tܥ֥JyRG-KcJBSt%KR5[SMZ[OAׅzԝW0[/ ;6FiZf/wm j!FCc 6Fx6qTۂ؍ʛ@}9[޴R2#_ w#Nv7~Wl5X:S3d ֟0%2FQ[9]}954tEU ܮȅ4M-& 5`}0r?{ En2V0k~@KVshBu3as).W3Q/~"A-y9KMAb&09r^vP~ʎCo790 ^t _W_P89 BED^ru2C Mt .}gͼ3N|C`fMcޑw%WwI#r\O^_|3H=96#6gm}T\h H;cfN{OTUb/pWJKڝ:rcEDd*+C͹\ȸLRD)RTDp;r { 0آ6nL(iXg_^ -<5jt?x]@kv_18gXXQn|O*>z2xȶy;( ~J Csaih|'LH=8[HX?<`;1Vl|iZ*/jlƍXyhS J8>ڛ\tcxUܺUyXl] XGC</}/4oj(=RlؤXQg0G A[2,5L" e"@7jQX/2W0x՗!Pwb*rgv~ iE - X^hB7#Ͻ<OA=GS'aOG)OkJk 5 pLxcڊ2i[SON/w=٤ P%oPd:W-K[h!ӽle)+=׿ZWY -pvl|t.*%)ҁ|ϳƀ;Q>g}bbGhsqgRm 4J^0jcDhcgBj$@hա#y*V&KWei~Rڶk&/"_C߯z12c{8> "5#>~XֺMCׄ1T訥!I<Ԭ:wUyl՘ l幜w(h DDׁw$ 8h<8ٲw}m:f"$KG]H(/4֎ {~H\)j2; R=:Qb}%@GPrLk$?YL=jN@=i$MR1 1zƚo(8׈t 1$BE|B.:rFqG@9o/؏zxsi b2f -ߗ*i㪦rVJEulţ_W}ǫ}t~Dl'A5HǾCh1QG:z s f\eF>a4eq`"tY##Qk^7k6ˁĊV`EԞ䂽&QJg3y'=PMzU5phC_@V<t.2&? XGٺ[TXjث }б4JκCȐxÇ g# ,4PUKgb/-K`fjE>t`eW= -`!кcA -LO};rb̯?}I 玣siB/Z +빦ЊcsM? /ccNa}FbOD.V]^L5FAC~6tP?:C{e<Z7k ԑf‰EWIa8.bZ'T5"OLk#\S3 gCuI^A:7y_(+z IWк4د|ăӱVLu .omEgbX_:/j؏f\tm5/v& UX;н)b]92]/K5j|3GVDNFڿWiMw4(GޟwG!D{QPGY8쩷vڒj:r{S^ R:Ky s:l$4'>{sStq})|= k b*=gAJRY|2F'wbA xIBH>"h%{r_C'Bfyn!]CNBkXº#jƑ(~"LQg6n5oXSC=KڲKaˊ|i#103(t̠su%]^GI7 4-:تMݧREQ$f-:*ɏ-F #ŧGkb(_VMU9nצZ6/(ʺVq>?b+~{5+GĖ=[#VB'ׅkè: -\(UL2IN>IpąsNOΐg ꓧ+L(͆ W-=|oe'nǭw<:EW6{ҵܙN"xů?t*gо$t|a>_ںVª^Z^/*3:͞)#T#T=1"P?H4$؞~ym]ϕ<[u.b56K$;Kҩ6+x <5Wu4þU8 G:8+Svp+h.uwB޻nytYyMkRFi,s|Ż.7/D^5`ӽ$$ӋxWq§x1ǧ5jѹ:e+5DzۖbDe=#I-}ԹO7;[YkW)/Y|:(\}mϞο{ޖR]pE}CyGy)вFxSy呛xtՃi^{Uc}wf;yV'b׼XovTq筽IՃTۦTUk=VjMd3VR~O;Yï싏‡8姦4WsOml J;X~{>zu"RxNbgq~7[ Չ&kMVܙgJ~_oJo=u>P~G/婝/>zjkzu'"6Ys?$ଊ{n9JbNf9<;|ט"kOyy%kycv{揍W?p禲{~dyy\S5l+;zoy1so20ح]w/NOgf"Х>uzʚƽz1yy.[|Xoz/+.2~W]60kKGU^Y}XnaCx~bslaxsJ"W'r6K=Khu:kGki}Vof?6#[X:ӳ;].sw([T=)K ?+r.UQŢ.LY${m%Yf+!6Inק3ׯ#\ﭔZWZܔ.8Y@5C}{J*Qv>gkq2JYh|rWKL|\!}kl\kvsw6nߋ-fpòZó#6e9>;QV^ת΋z$%31*>D}Q@GiuS4lK;\~Ʃ̪Ь亸<\wWS ֯Ω\0nΝ~#g: -{?pd㿳B].囶deGEݣ4S}uxջo\5_x!o4;(5ZkN)I|[zˋ7wl.n{u4աԇǚwlNv|'# M'ɼ+k ͮx]R՘t#Ÿ[0I?|oj{Q:n+kVp˖;IVk3ۭkoJ5m23[]Mjl~ؐPP]fZI~EO;FZ<[KJ*|s9ok3ߞtm.*|(ȭD^*8ԡhAx[RaēG!Mxm ;X]q7"%od 7$䝿Q^C|Fm?"'1xsGݞ/ei ʽvO}/+-DAGc"Շ[jwep{Q@ܴY\b_,^3tf?1sb/5fV5glxܽA࠺̊+1Ede܌λ]~3Bv#1'`<8W ۞# .vT^Ž}7G癷 !W~wڑ[b }Zb@dfc&e&08f8 ygf,knTienjeƐWaj2C4aFc L1c%čY0rӥ TnfyW]s;"۵7 ,ɩʋiL, -kL-,{i:ntnƽoΫzo߄6y>؝BPo[7s}*5HO+sO]eL֛L=ӝLa$3 `1:14id&c-3e~LZuq7uo4{ٟ>.o^%Ŷ(yËCMIoD -WUu32lmڽ=aY/ -V_q^`Fك쬆]Iݯ~}SΝFvZw{ڈk|4XL̞3Yo容9r~xՈZS&1CAL_ui{g!M~Ң 8Pd~P$h;=Kx{'\}9Qw1!K}#Ns#.+ntV͘슛Y{nDduFԍ̳WC3y6D}Np:8'q??ɽNbi9m9^udL30r8>4U`lT_~Mz5x%@Pu[si$3zlff]T{7>te+mOt؟Ws="Y5wòɸ|'0=!9)32 VFf9=HԚ3%=8.벯[FoHr }&gkA,nkχn cC>o$~vfV?`LQ3:e{5y?νz`Ybü[1ǓW# _zFHVKmPN烀Lcm<-ݼng?}6ްȎJFk|G{g -3q3wsh7)>=_Rx%>ȵ7B]=w'87Bsn] ˹z=4+n:!-7..'>&]uufu{nڽt}|5]ʌLm=9MzKM~߇νyAs}ɿīdF3C'3cGc,*{V]g LvB>R \`8շ9+>5w/$`'=X;Qhۓj/^i}Ə㟯s^Ͽ;C ǣ ڏ?! ˝7#8XKе,zXὛ!9>Rv+^paCr}f]x'*CrJ%3rp:w~{|݁kyL{}&HLnj7H*{/v-b/esZXn_wfHVHu`}fa Y$s6u̚}=P?'jfFjgkqN|X'0õ0{MfiMb͌\¬vM{yAI<@L -Oˑ>%ZV&>&<$!fm+ 93 PbJf֠a_@pMNaFZ|3b3f̨aK3#c : u me5ZuO7vk=Ҵ' إȬB -hYnhٛ{^?|R91.yך/~ 54""?c/5g63fĀq!Yȗh,4Hjku-(J| w=W+~Pݛynu+w|Hgݫg[߾/~>Bz>KH!8J{" 3t3č?Ʉ3ɜ3ل5v=3̸i3 !c2.%gQr+65fٹj3s{A bf=uNPF߻.wJќhC ~/ =>gP42933t3v̔9JfۙÉ;SdNT0ʙ3|nYcУ_to4zmkz,ڭ,BBO+$1>ڝ@Ar5P|?TZ7U)(H/3̮S ґA"4 HaX&֘{QsNIwɹy~; :2euOo^wȹxn(f]zmw[>/v<?="=co:bA$b[(l2d,fŒ[ƌ2♉rk ̘幌W3+haf2ty>~~57v֗_ii;V|pʕҭ6ݪixz ouHݏ'88c1͵#eLbΌ8FmӆgkhGo,3™K|#y 8gf0c$0㗖0[ǔ#U-я|w'ypw{65^r|ۗn}H+%>+lNn_緿~Ž[B~6s:ss?6#eA-C5Eѓ`3Zfl`fx~c?֛ƌYD\H=37Gw{B5j?J|K$&6面+|p -:EXKL/svZoѿ~aE΅dSX'?rO+3vÉJ|&gdrXŒqwgF1xf8fZfܲ[4>5_tF?zIo#V\y~|tUM6nJeﵫ%^.۪kC R_\5ByYD]4߱M?b9̨3q>d.L/5WYgg]0_u|~S5-] ʀE8~CzgO<'<ԫ_ՁO>;,8}$w.i3~A+4HɟT##KYΓviH ~}=ɇ3vcrfҊTf&[LgYFf^#׍_ ~/n ]hqm1pK<`ղg6~.O|S6SZyzɷ3-O&M.>6]/#zC_!ӿ~ N܍|, C5uFFszf$ןˌvR0c1ή D\f\LsIӽɓ $f[g0k+zs}H+}8ӯ1_jRxZ/9x}mΗ]n>\M~ݵQ>V_(>kU_ZyE7*nov8]j#g̷Q-f>1MQ_(/90\yZ4د?ю`y#DśMh?s4?e1OJc\/,բ.=?G׬x_qK?[W?rlvһ/a ş؞Ei->\Rz{旻şZtZo1o!Šٞ|9]4IMCSHބr{U0}9h߶iD,c ̌/1.K6[#/_SxD|}=|K~?GC'nz_3eߺ(o#R }|kN:)vܟ˿VTnlx~:qa^uֵIg ;߮o -N=Ÿ\~{^vS/Y˜F!kό -e\r~1O2ߋ}KO^{ O>Ϗ`G7U߿ 6l%20TZn=xM/|\)>~V(>6Of#rc{7?UF+UD`tғD‹Hͧ7BY:kOn^ٯ"+?E׻\beÚČT_~B~ԧևK@.taaSMBNU?^lowΓ֝QNm~xVv[/af@eǠKʛM/!c(CӌBT K0$KG.?]zX"$:0m咠4f Ft=4a6|3U,ovytχeT}U\ o.ޟY,_K&i?.|Z"za:<EnWt/yY VVm2ڛ?R|Uqprh͆b%{? yRw~tKJCҷX~ vnfTOfz@ -$}I} -ktobK$ :L_O%cD60">2rmDigKź3̢#%xLxpe+.KV>åHD9`J;^z M/=5kO=_6]| ]~'}yv! }cC-Gz[xa -=n#v8GI|=%?W -9цt|YHsUȅ<Վ=</D/%r}XaNGա7or]g7JWf(B_[b+\g_w "/fa u2ƣ'ʸ+Q\ !6ېUZfVR5Ut9?`'UZ)xwe{1O{(;lsXNpId|ɿb[og7o86IXw|;ZqEbaOz^[5v滻u'jCk<[!ɍ7l}A>W7}&gI~_Y~"*GӅI"ҷ ]܏+ڣQddY8al<&x4,I/H-8x1JgTQ{LUw-þZ__S@ŶsN{6o~?&[y{YϷ s < ]?/y^VPx]|QrC/.7s -J.1 L1 -H6aܦaV2`2J,ЄEBaH\[fX陨-,mT];-v;%m|V 'D|v;FU}t2<1^sY˰Rwz>Rԍ:8hV}8Y~U`T~w١^)}NNgwB?_>{_#K2^A䜼O -Ō*%L8"XH>qW˕:= -NbtɅЋ&~z膆w;d9[w`ފdo<9'G=?i?>X= BڟoT|OW"TUӔ' ;ɩG'wD?/he&˗ f)2 -P3K]=_-ǸOwa|ע }%+?`F).(<-*{|xEi˚FQ{~U_i}?zqGzpWm1fLT]{ipO{]vأ]p[ck昳끋o!~^vslכ}?$5,hCxed%[m~qNBZϓlQj* 1&3Kg/`ɼ ,=mV XlY~%S^:Xޏm>=/m)6F߶;z`*d?:Ld -Ł_<{Xi;^'xpw z/ >O >qJzB݇称xgϗ6?6+leKZ+ -;k5]$c6f 4F2.0PejXh<7FY֣+EKTa6ވ⤮N0ȹBETe6mZhaq@ۑtl噪N;v's{_sGAKI0dO{v בm2/qrluǃȞ~";Wc?{ue)kSTrTS%WY`\?&W3'n՜fZ٪W\g@0QҞQ\EBSwp3D8G| -_9Jn76۪8U'^K/u/Wa/cS#ys^M aF=`u矬}zJ+?_O(ciƐ@Q*W癆D٦J] -/f,zllzRb1D5T3*.LL6J5Gic߄UmzkeE>uC{ky9t~keG'N\ƣSH0EbY![k]pV"bfOc/2@"e ܖ?Ȇ>dȯBKwU7<3/V"%+T#)ZCe#-],Su^Lre.c?G㔻-a0ts3 ^ҹd~ݮ춛C0ÅGsg^$&.b9*d\7x8q!\ap2>$CnMPb rL}oc؄b36’/&(}Ɠ[+_q#/UOCd B-=u]o*Z>y1?S9X\hƃvlщl{TV|H~ʬVkpfޤ qYs+W2~J_H~"2<-c|<2Hl zZO" Y=l!Տvyd%n6Ԃ7^8$X{+uKZG%RzN>{b䃞0сq݅?*D:"Jy>U7˻_tHYupYzk`fϓxBV5+jA󛖏P`)s3c#㕻^.?'3x -]_e5fk,B Rn2,=Uk -E;G -5''/}K|Z`.ƊK,1g -)TvVxF{ߟz+I ՞"J:Hp;Y`wO $6?_/^dpLnP2m<>Uu]>FuwRwܛjfXݯz_mp|Wᠬ>1N#qx/ d /$G6̏='d 3%B/}؞K!bJTݑk97Kh8;L>/o#F[xhmpMBV{Idez0(K2eo%[PΆ'ӟ C؂`5J*}NM>ɥ[QP&Yŝ#1_T~vRqݑ`Sc !n{?ÚGh*%Yr8 I2rl`{_!M6:+Š]^h31$dV Å?etFsVg1g0?Vb);"oawR< Rˠ&Pgl 6,XO0]:T_<[4㓂呌2&0DbL|hpJ->!R=Hi 2AB`ʅ%#P~gRu} Ri$v˅9TSd>>9}>=b#?ʣ c-xk>LѾl]+Ds䮀|160SEjՎO]=-U}8IrY2m!Gj0hL 6Pn $~3"sLjve%eŗ[0F[num{"N|/6 .Jly7 -OJǜHNl!&Dm\O:8Zd ?f 0ٌCIgYemm2 -"1P%2$S5bOб# Cmc f jleyA,n$H gdt(3*C>T=A_jBO<]gt8#6,_e+U;n/ԉ!|;1D(ju2kC2*^h6nG(r"RM_D;Xa ̰N& I`73b<`5ۋ5Ǔ}9®|b9yv=Uć3z趎![.U^vA,>|!]{>=aė6ⳚI|9O*.j@U@mBky6QjSH+'4!qT[ -7iK"M\!Dhn|S^o:eV| yʝrTͭ;1gW tgW 8El_:e$ -IL/66'` .&ի$&L)1|DFl,bFRqH]tl2ZH1'gi UB\)8uB'nRi[j ^75/<JuKS}Zwjv}!0 Xr- -f*l'VY2L!f6SM\0`WR-.'~M"'߁˓ZF5e}Tout+Ο-`CKIb56TàQS}x2Ia,綷f=z]oa󹹰K؏u,f --UQW9ƧZa@j r횛yc9_bF;kmt tM#5;B@[{l:X\U7; -n7>j+UD191NotW4>,ㅸ*s!؜%OA\i +XqQØa- l"aW>TcP5?)x.uv= v=w~ Zz[{ Xa?|i#96*l@j_sWBNd.T֖4P7+tX!u$Js2UǒX7ju>Z*} -ºI櫺иF>JZge6[)uU2!cJf r _zH]+W h -MWQgMi<ǵ~P*:y1Šw yW:9לy4^Ɵx)7؂(S&_ϨN$h'K/$m+tҕluD E1*1f5{%uFTӆKXg WV˅Mq˭uBrrs=廜|F<g?V3C㺿s#6OIu{ -0_HULch˪#o6JWjʔ2)ӶԒ2/ !Όn hPm*+[Xg|hfݰb+hŭ3{;s=6ƥ"s6R4m] pxÆGXRK 1jgMu -ZG@;KYR!o4WΪZT&x)6<vJiӕԎW*b[Кk4j8 k [l&F J7tX>P)DPhC9-\ԝw{w<^NbγM w~?xkO>zDL?<Bb.ɚ+֟o4k c%#k{0oCC&zͽ*HTzQDb7m>WyD*ɵS;Y$K)Ym|*-$Zb81PВ -0#MZt6W^묩>ctM$j0L`zS ):[$N\=zu#4&K-W`qo+͞2ȸ)BgqSۋ(g\{o<:ZGyfTC_b (MrEvVA,hg z&YӅn C$f5YWvVt@].5$QT+mP` KmfGqUǕ[Pn'ppK__f5[H&]=TwbhMwisyO';p3{\ MMQ1lSIV 36Z#C7+0qa*訕pn-D+w@g  -5CĘ갮Lس*jJ;j0<^ ]"/*ImTL/ROX#BL`//1O܁|3m\::c;>ZTet#kxO.ȵ]tglFު!>S5Ϻ7=Cj;2;8Ў6}=X[?pQ=_w=Zz y# jF.vzvR@[$>Ch2\=(DL`uFZ;]ŎAG]NMwOՂ>4 {)@Ol8z -^I1Y*^dxhgY~ڌZMfِЄAhRLdu">Y Dhѵs蚵^&X -}Wuv R-/ρ -lnOcuj$Tt(1#t9z>'ͣ%a9-߰wv*݁{jgr/\vo?0mjg -YE2 -\$%Q,-U֯W?2qF@jK ۑB;d#@N-0mV5-#@_O)>lE@ -9NNhjsg\Kub'ouvnG/T;/!kyVuBb@.<(O(8RGYF0m 5 NQ$) ֿ7zV1~*Eqfþy%:sI-#4R?bw=v? Y`')vVjgnZ)\LEl W6O,/As+뚠?o;"5+UvZ{'hZ]ZHumq%j,vn.vxr'͆3DiiX!/kOP}'RcZcÉRe֫' 4óMI]kTM|6k3TK&G9UĶy- #C4:ڢQB't:BsC3=&tYb2\J-DF5`-L vM}`cmaMD]3߈quE=JbٶQЬ}.MWS:ͩF5 H&5}cI מF%IMAӱ9P=v['tB M2V)$FMI7at=_ hݶuxzqU7滛\S6;h$uc?*:BHĜ~jkw;ohC]ox|zѕؘr,tͪo -ރjU'\6N9*ԓZr;w"=wMtdN`]ekcNM%H=9@j ',g[a$;;|h@S9ZkQBl p=ߟ%Կ7 kB\M52L(^/4@g k%/<&TMŁ С֖tqܒΣ̀ӱzFcZOL1to&Da_pECzCz{1՝>9[t2ͺ}94oIGsֺ#S>@]m$4-qx]o 4& -?\JS1)[Fh;=!߹֋-gf@gRh -B -yU2IHcBI2B$|l|o=< u/6_%luv>ZCy  vYǐK=a_{XBq>ޛ6B݋磓M'k)֘([CS{c|j ?Ӫi cdӯgLu)XC=H2+Eb4r$|7mU$uXQW#OS}|< {""sut,@TC>RyDmmQgEd|Aƣ3PjhWr&5 -srqcZV%v\e܎;Ե$bc3}wЉzYcM`{jMH^ }c w:>]m8&CXqHz;\š?Gn}l'4wg#sLT5F%[pB~3%JoUof^Ss͗\q,4 U$Urb>q5J:FbN\álEl+.E -̠)$昩@ᰇdqjCZhrCP -mu=< 6Ij.K{ޔ:%BXSmΪzEHD :\#KLeG6A< [EbbRmhLk.%>\A+dȵ+#vFEAR[>qDNȷ}@Hރ'~(΃u^)ɉϦ }t|6ɷ\'B>][IЮܦaӉit? ~A/#k -MRݱT~8j5{Mgqu-aK0Vl t}_.SUUY$>6!MNS|`rt^w;wǻxw;wǻxw;wǻxw;wǻxw;wǻ0+)jexz swEAYi+"㒓r38RD'8Me'[Nظ$22e\wr]8{Lns]\fΝ?wS}m>]|'ϯd2Od2i'uG ?w\B?"׊'gљqўAb@ډ^O3\^/:I4gBs/ǿ?~,tr!?g!lGr-'Я^2gd}x3 e5#H0!A^`ԌB@]lGUL*Ti"פzyȘK|?o uxCoYzU5&!)FlZsJsYtI" E0A)#ӍUa!C=r?S0;!bc -‰6nHFG,&ZvSt cG24cЁ.I."XiPAF&:ˤBsJ ?իs) 4ك2E%}t&(Ŭ1%UXiglO)Ą\S%:94>*&LAV"Æ'iˆ0b(Yd.1 ] *UaJ)@@~<9\sMF{M)ڒ1P& .s3AU}-뙶~(%u8FUVBF|hǖ &*[RF6;l*km#]t;sx#N 35Q5]tfYH\n 0 1)ѱ &PcP ʁAWRh"EkJB@]ql\*"DopF[m"AWfАT# Y#cc*%7 +,UB!BtF~R%cAv${FWne8[R9@ɭ֖v3tÒq]z1 &bΑbb\6v'>қQdi3RJ'cn̒BZm,1B.ɈdȜ4:V|?P\,A(>րҕ9Ylcך)iF *Й/-jtw\B $!>gzuJb?l^B0LVkI,瘡CU[o'F"ݯb&A:S 2ړ]kIFG"%e TyTf: ѡUu Sߋ.mՁMj]/>n^ⓉD vs6*Vڕ]CV3R{#~YYkIN+?,y~=(wOVM\TU^g5V=FS> -=@;H-JFvAWS"E-R^0J;ȜPq#:ؤF{uߠ¯XC| -!6pEeI%[嘠@O"LTCJ#oV6 S1!B!gvu6ƅes S)|/RYg -h; aA[ðC5ibKٰTcP;(^J >Bkr:|0|#3t*jw:%$I]bl@Jj=i57MVsw<AҬ띠=6Id"m:kEr )ntj6 S0Ti:pxXhѨ-#nYtCpF !'UյǧNХ2t?!xoPщ*#R]L]luƃج7A[.|YK|R*@ 򮩴1=g= -D}r9:O%46<*J A^q\Pѕ B ACӍň\SЖ@_d5q_ZL тut~S,)pp!f(:Y &|R%TcU'S\dH|)%s2yȌߌmvjW&DRBX usA\Fw7OȦy&؂vn9 |d6E$',>311w6!im3ovCJV)$y\N%5eT dP* (ӈ͠[>sp*Z[s ]WK'͇y*RG{RzAi"l㟝5G& 2dвAAw"~gNKt(v;vU[QDqXIgėkAdX!|Uʨs]-uHm lf5%)A|$} ٢~-c|Ēǯk| CuI$^/>۬3|s"5|#o Hgf?u>EuҮuVb^pqSK.bbL?omSo<6Cj<9 U|($ Am#teWa@FR5橉mj@{^o"$Wu4Xt81Ru7d!_l@h7X - }bJ|*x ډ^kl/ov 7WbDL |%bD?Ϫ^!@AbLC~Z Ri@()uK^ 5hsɏ7H'OZ(>j_Prm# -;9:HBj (y(tɆI#5@Q7P; QC /AK*6RCSZјHƗqw\頿>rA^ r+R!qk0y"Ty.2 8KD 09-S&;MHA n3S -Jd&h'|*R7ݪv:h\I as0w@.=G F(Q&g@>~UCP3 -$qP[A=meTZt2?q9묩zb9HL<1H<S\S7hH…`- y!=P!ƒ:d!wP0g!&\L]s|*b3ȰbچZJ|?C><ޘI1VExf0c -. -R26'[par$#ez *4dGJ%uW0=:L)q!O?J lǣ%t~mDj߼_I)ܖa4Qce7~e\1ޚJ3hRj%&Bjm@e RmS T@=ǜId -h,[`J(2y$fA{)}{Nj fI\1.?v?PJ|Ieה r`Ȼ;XڂO _uuVܪ4ANd v8R5q@P>Gj(PJkz`>s I}, I₟wqW嘠~l4:H*1P/1OH4g$Ctvd. _U8%uuiP&D4I<|nt)AgiF b9F|,-;IgLuȨ;H**Z.Χ#?P3d k%{\-m`)uT*-ޟ.WF,gXE* X{ҕA. - 0hRI> - ~?D,>qi^e -U90ֿ펚cbPNO[,ltgT)kPgR*DUXu͞IOs=]_ ?X۶6<݊- Soع,BTK@;E{ksLg|\׳ȅ|c7L: oZU&F.(o=w!jCpFDmwI0,e#7sq5*Mq\L1ds2R2&YB\eT%^?YɆ2. E|)΁y?,p?D4r6C ܉KcŘr`ii;8LzDܙ'|ǃ_9a6 'ƃ"T:<^a8&L}*ك`3vIB4׭)b wm<`=282='*`#u}Hޣ\g"=yY 8 azs2C%$D?3`R(e`r}g 0r38~60W' o.d㎣$0<2L*J Sa:L6fm's֘<90x]*DŽ?+AOl4  'gA /ĺqQl; }JUU/3u{"}Ǽ3x9Ĕi0qU脪\XF2؇c4q할ӆT5=] [Q^԰L;0s|u:I {sٓ$|xc>L_ |R약T|.b*ku~M&lTp+5aj[ȑ0"o;jBK _CrؗqH3`B7ئx*EaOV3[ $tFLK)rX` b`t&Bܒ]i5Jϡ6%vH&[eIs`2+ _.qdJl0-n5ǂF&;:_\› LDr X -^웽|"] |66=`3LstOvk\:*Ͱ^w1'BLܵ.YsNY* 1 -y%0QM$=Q.%))G@E&scWkU6 &|0GdrL|䓰=x__"uPO:LH:O0#2/׃!OIƥä=5(}!_F5I"0&sJrGFQ}D)B/J9]ɔ\٘B?"t&f -Ϡ~@84F G228ėr96db?s; &rW|QQKG8plmD)"tYk@yP!)"60nPaS)b:(E)EX]>0zE]8ȑbN9OD7k)(1qE[Ud S9K&50;aHp7P3%L͒ ulaMjn "Nӥ?hے4O)'<ṡE1Z b JAa}B|v|AIг8 -A8_@Kؘm+*gLlV*Q-,Li8 r&oBJ*ved,Cbo'KZ%m^ S29, {o TZE0Mʏd) L>;|@9~]ʎ{%3B -۟O w&j}'R{O $(E$UhJR*u("Dӊf i7=(EHU)m@)8Fn9~SCI~9q6pGF u1qG@AJPg4WkH8J.81P+%~(D>;zxSB(`p:RLFI -&a?xOuk>ڹ}7eUȵ -WTP԰&g BP# ^jԀc&`rya%23IStG Jƺ0%l\BC&S=ӈ;pa9&~!Չ!p$GpuF?DEȣ Wۈ_ NP -yx -8'žo`"B0QbUJ6k`:?mȭ/4_R[^'^i5fڴMD)B*&(E0ERood$@- !EԲ=b QpPRĉ" e*ҒC -BMy&x+Yø /?B8m"6uwSNӀ<}L&MT煉? _DAxa<x9䏀eOCZ.;~i(YA27pW`;}:p<ا@zPAGih ]Sd"PLbLҠJtr(B(sPsiX4X űm&r84*b;ڪK"PTS)pQ&KO_5!>O4`))^(\!vϑsSȄzpO -!b8$w9I(>E0&f741jR8lB|Y!wIA`ʩwfRK"w:$tfu^1j<aCCn#R`bI1/?%U+eA$X&\t2Az{b -4bM&DrLHZH@B*v+({K@0P* -nm\\:p6b*!Nr098R㱾4[ThI -pvmRgIR9Pvת +eG}-h,H|RJDAI;@&kR) ?n9mTRQb.^GSWZ4@)YYAAz(EM"<7}1伤nRR$*AI`>BT0O%Ϲr .J !ڝ?RڵH L'}%>LL.U$0Ak>퐚(@-8: b$YE[<~u\b Kb%kk_"u_? &3M`z2  8KُCeg%}e2%jG[=?8.a²w2s %lP -KT'Ƒ\3G_/ |Q`r{P7LplI^&ݠZ/v rQcv>P8T2OeG[*aA>76&ԩ DbkeG{KAIiM&N S\D1(B6D rtq1/J4毤.?T́Ob6}m$u(l#ʬM0WIR |b#s`z/dޫI˵% 廘1e5W P>Lr mL(B}LDԓ<σP.){Rl8p36Q󹶈(;_ *Ҵud>d -Z "wf81V%ޯ#srǐcx3j$V<*v ң +@A({ :69 -U%rPu(yaus0#!2|pFcf"je.aזB/ ʎVS+@U֪FzCQ!yز-3ķ'u"~(Z`+NQ䬂dPJPO&%u|w%R-\ =*Ekb=QRog,^n"^!yP:~y,䑉.󺾔A8.ٹtkڹKc(׀K 0gX.d>`+Y m.(8̈́'$3G'PCE䈩ɋc@x(R0vP!OQ&RQ$8()dJ+Pq%~/א4>Я|\VLTm {@ŗn~Y/@rЏÄg2;uEUŧ&ЖI$v ]|bɅD6tX@@R?<(rKB㊐39 uqP/ᜓfAkȒp@ z!7(ABTP|.Ś{>b*yЃd%Ve ǾD^ -@0'\Y5Ł|%Y -8&D\O2 /% ?pA/ցB_bu1(x-M]@rP#=fTzԭ{4K|b(|U24u8^1iA}To/!?m(^>~򇢄mPbb+6ӛt|6b@ N/݊c*ab~r@̑z[?XEr>}΄+\NK Wu@%}'ܩmzXYiyLrNIZ!|#<j!_zEYs(r$8j9\pn7沾KfJ @'Lc\fSakv37z׾jѯѹ09s>iާJ4엽9)}]}&e:uw[.&,y һ(AsHt5T)ZC[dJRItQ->0YG1J:rg$A_P ؞`fv)=ZlbN*Fϥ41ܰ*&yi.*tz6QA=Lus)ɥ~;KG&*&*a'ҰIo-l0#X^#oSq[NVuav7 @ SwbPߵ٧f?soڎJ6g7¿+SenIn7dכsY:h n5UIYidOr*-Ȳ(&KWѬ\ ׀(,+%,nw- Ħ铗f5SIY g+2[\i]~1w -| .PJpHD&"O1tBxo!OYٔG\5&x-"77 &KyKqKl'$sUZV ~m<0O{GOݭU dZlR.{¾ҁO +WjhIBJqseh斾@D =Nj5[8.I=m#yR_Jr3ڭvuz²x}ԝF썏>SN+r${RYN^?KڢmTj׫.Ƙ+f=׊3[6Wh21VM'7RKhPAJ)\entR  Gri7{u@ӾGr N -ΩK44I1 5e5f܏EonN=*7_0wdwFC6K^b+/>ٝ2.Wþ`ϵBs.ES稢L P7g'$w;rV,]e)zN#.S~ w1aD]4$w%|΃ -7HR[$)tNMa QlfAj&oxJuq^['mLU}9N7~f{>1=\d{j%t~hy')QʼGyHZXk+YwJrI&]enSrt\k'*T-Q|v<w+7Cr&#LW*EݨdRZ86v@`.yQ}H/"I\8[F([Um$_WDYܭ8$S`cV\7";#[ If)*Wu18qJ/\%(ń*ftv~z'/%T}K5goL, )uf!`ä]M~'V};>uً%GMį3iITڼ_ZxA񨤰gYA"}'mV=ˎNJObgfֱEs j?OxSgSQ(t_4^v2EaNb%*r񂸿K"ȪAS?SS^6߮f_ëUk{guVf/K_gݩ3߯4Sa>lr?ȩJWw\qAɣVKwCA{l%-+ t7_(=Nky%6yJW=\cyн/"܌;јs6>luLĩ͙f}l#BGs$Sl:sOҫ bll~ַ-a>ڞFm{)h|0k=jgJAxc4ҲUі[ gSS6=7-j%WM%>~ּ&[gZV Zz%3 -\T{"H}weZv=PFl29nSx{I2l:܌H{}`l9]G߱ueӲm?vQW -B+V}cVmb>57չJk/|.ke ێ? n"zIegDU5ΰ'{GH*/fcV$oѽjFCGңK]b|.ǹUğnL%R,/+컷AI",z+0&{4>׃e\`:lf>d]kkD=.lNQGYYQBNQh** -AUԓ~JV]vӸbm~Ufšg=ܫ+\=eM\ꂒ.^ sLp -ˬrQ~;woQ{r]]LQqYi˺7Orwzcᾶ_:ژ{Jƫ Go&*χE~~-ob6N`rɻ{ -#v`.آ֓?5Y $w^{lqgRRâ=+}kB=CKnWۇV[ן ( / .,,_])vM/v />Qe*PWc81/C&dtK$~4ajI3o_ɵpVI?1}]ϭޢ`0^7!%ɫ:"oxI[h6̵* ѷrƌ+{۟EȺ u>:q'fHШJa6uAꭃ56A6AO+.fs\ZXY%`\̋M{}iNٽKSEnu~'E}TZ4A$}زO4_,eUe>NaaEWh%z3IGo&w`_iS*Z3;¶!">9:-DSF} VrN[_{OtLs؍ -ۇ>B؋B觅wâfK>6[<y-GE֒u p6 -/b.t+ vN(t-gڻM_BA=O%^5ؾ.'¯w2| EO>Z;9/˯?D4HV\Zrڭ:( v7*BSKCV]-Nsy'Ť?h󏣂9''Ѿ嗣b /GM ?Uy13L&i>PO-~^~gP~!#xcfwt?4R2 *V῿Ve0Vic~C{.Wjr/2m0y<&aCdĆ5KvWݢc*]#:nʟ6l x~//zO9gbUTnp# -sI~oq1|::D?r_o„ƫ9pBqiB)ڴS߲nމ֪j뷣h1Ri]x9Giufۭ!܏ˆY6[ԗe*hh6$4_*gU3;%HWzAAGeNPF3t[ũh 4m -RLZ*GK &'eSv?VbQg^'ޅeu!$.;ЄRbKq o=n=u yw1*=O¨_3=.ꃣ6 g(Wenl:ޝNE/jo{oыY.8櫬BsC*S5LAc(4@#5&#)h$j)a~hY ƬyG\&ivp3b_L[)`x#o _)?YV®2qO[ ߰g>ay^ay^.G_H~75ysXNsW.wټ]v)m徱6/Z/O."^5|.()rwoZ<}1Ék_Y(|+ ~j7AMǢ -cWSд {.ϊ>7yGI{}7]us -I5e]YID}ko1B~5*yGCgS-@sqZnSݙ_G>sx);y.o^Fu |RP_z)" RN WV -Vi - 9rK>s8|Ga:MCG3v[#UZ^`/%Կ;HSz8uˀWb?VGl -gw-Ř:xZWD[da|!84li~0u}֫=ܙ>Hϵ ohhˡ[Co+D{AS#^&vx.9*5}sd 縆7 J"_u8%"3BQ)c&_`M#ӡ}8Y8ch"Z~ڞ2[y)Wĭ/^Fs+sM*.tJxPk8ana{;n_c*׬/{:ϟ?' (BM4 8F,@Gc #iSwjhˁC4U\w#-a8@Lw. ~,5{!- 'W&00[ ·Ӻ14;O;­z24Mqeo_`MJicס6!)ԉ1aQ+D|4u4hڽhY,~qЪъ+A>ñ[jcGZ;wWJ\z˝S㊋w,U)AX/!*h`%8qT}l4eb4ir4i -4yZ4Myc?m'KAշsR1wcD;Gq+-r~swy؟|ߏxk,]^_~|HهpGFxJCxfNZGӕw Ьy&h)BS"E,Z:4Q˯~x?7;alUqf$py`,Cx7xa=([O'a0|CS#Vv+dhѦchz+|F3J̹4Bf)JZhƌghcQϲ~qO}‹Ծv+s1>uC؇"Ǩ2*j"8z?xټ =?`qǁgogcO'C飗"+o^NXf4}64ih  hmNQ+0݅' ~c -#W\RQRf)tel[~q3}뼁H5YQ ) 4d18b2RCwVa͜͞Ky;|m@VAlOZvh 6KS6:ڒ $)m~X>`-8z Ʊl -9$>Ya*^4m<4i5~):yzHeRYi9owBB=_FQ;ns5xuZ{L z~{X+Z\'E*l>U6%T'2j#4sRh#h|Lw7֍rVƯ(7|U^>!y#z4 -*5:˝ So1KOh.^:>[ -54u6b>kӷ3vYJHy1AsD\JQZu Gak5A#<ږc|~No,hguHH \Ԃ|ǯ]#?Lc~}j.w_*4f6C# ʂ=M4ur4kRmk`%ZDގfa9s -|A[gl˜YΠ9%h)dO˫i~wVac5{όN~u):c W, -ÝCKJl{lb wچ!yJhT+9h'3e5~S~1IGm%{Ҧ KFo>hv 9]ռ''KEÀSa瀓|59; ! ʜ;P_5O߱rO@Jf" +ehIAr+]~:WhkC;4I#GZOv› ~wݾE ,a".<-y}#Q4J||gw*JNAQo.U?=ȇI8|kO*4g9ZmV3:vs.CIo&h%qXhY6Iv}&ew/ O>: yʨ &3ms~IX -;; ~t9 ?ւA&^* ϻ0h |9B[e*y'\?nw!eY7؜֢᥯ϸglu~q2?|8vМh xJGo4<~o\i ^lCcyl_(76W2>~`g;y5șgP;=&{w~H&CWth6fnD(Œ+h<"}_|4o7-*MQK:3GY}cU"bܮr^]#/7̟2ͰKJw3AM:Hudtݻ%N6e$[7D'Ή?b+^2|ȫ⍌֚!h -G+9l7%i8h;`m3m?mk s#sK^bqȼ5iq<ǀDvXZY6-qR6b-ܡ)g$ vQV~գ1ge墉*n:9xہ!i0Nݙ_W0}ЋTGu`xW3Xme}^b&lۦV@kgD:hϱ#l쵿83EyrPZVf/|@x=_D}&RA ƤGy?>/ҶDCgB{06\z,D_-}8_(gsԝR'r\ ~O *%; -\|~?kI:G\jxuo,[S_"KF$Lcb+3|EZv W$Y( -kLaTatZa\z::Q Tz&{I_9K,jI!2׾fEN3kZ\u!tK2h_~1}2FM桋W# Z ..|t{uY뼆cd^# -~vO`h)h7lDFjZH& -q̭Ch7)[2]YxY^HڨgQ!"p3EtJN&jd(,vUJ|Lo]C4S[zϚ5z y 6_8m)l~{ غl}':9a.2X ŔzBڴ`ڱt2ک̥{:N:8iIr;it›+~TkN -:̎)(y6c]-jY'wAd6A:vac:E\g@ei 6_/1NT5M򻌲~l6wUkz<~N/o / jywK^ߴ_OT ; 59Z>A?|r9cn}3nפ47" #qV ڠ.:4D(GL#q1,{FF<떬30Di jp(k ӗR6,=eOKKre=\z۲]кMׂOɻӂ[i RZPB.f302,ǘc[}3Խů3 o`:DMȐ켢lx-} ھQ!u]|=پk@F|\A[ilۉtИF)-ܯ.gd#wNRϚ"ȩDEaks}G.m=aOa$Lj}| uOy&&7oC4,&SN SLn6~:}6ulNј>``wlDAc5Ԍa̛VM in݅4lCd|%;HtqN^/wd -/ccaXI0Qi )nSWRao2zi[sADzD¶*i#$|҂Hb\Sf6KYav 8-;_L~ee\Y SD=G֧^9 3>c)sRۡːHrNqNQcj07yBwh^mx-J]נ25yq9A=8>? , -q>O]PZ~ CZ6f6 X$8h;TxvԾC3wjPBب>cNV -+ύ8hFY,>znJ_3ޮ2wM)eo0f sC2}'MwVO\V 1^|ҫϠq2aUK؋*tՌ%',\.(\ej>Q>< Z/ߊj"-` xRps+м1h;̜Hﮂgd˷yf-,+?<"-%!3똤;DIe[1^/)_/YE 4m8]jR 5[ٴ^\JCEo`o62E̫6 6y1q 9Kxm1}XAGAtN -Oۧ΀Q0c C&`[q×JxnڧzYDqAr8'x~M؀^F%lew2N-2oVsSiBds@ey+o]!H^?m1Nt~sw(OҿfRR^ޭtn1]Mx.zZh5Z1y.8ںz-ڵk50Bv؆)[3A&E!a xFf-¬?TP~\kU.aҨ3Σ#2 .1s3׫E8I22>jQ_t0:r3CKtrvU\5몦SfVzS>zK|F_݊k6zs]u)؁+z`þ˽?_3;[gn?[ov3Ky|k_ʿk=뭾727ƿ7Zo^23lkũ[C܆0 c00/5/ ~swo=߱v/ 5g>S߮Vkioo}v> >'⻉ZGUYs\99؜yb.0(\Ө<-{>~*d]Oz쪛oRMec\mClyYΕdNE JҶtq߽ s`^楻..X~F˂gFBm#,?W~0s=an ꧾվß8p''?yMO<y5T; D~y*_z 5/|9]~ߣ7?;>^l؏<"sxu.wgW*Vx?O ,/[wַ.y|EgLE֖*oCy#7p1==|s .Ĝ򈫄xxh뚿W?`^@|.D;=s -g4,AU]Z/h5Q̡K>sncꄑݻhik0osZ:n^׺dTx3W`qHX0йe}ɨCUs 1t2b. ~ʥ?v]xHR~ﳄ)Όhl_CG>E(C} u6*qG<cu{!> s/xEΨiFjӉϪC<ȆSg׷l -.? sOѝ-{2%;/@_/kb\홟:s9}I~Ltm1=y,5g@o -$'ıµG;a q BKןgBTlX#빫1QΨ%;aC=[_`OuxBo,]S|w%5F̱ ̇Jp##A7#+NG\b4t䀘gZ4l?t9Q6E\^ňqXu#<-н{B)OQs箅6̛|;}{h,{Ոى}ї>ޏ}wy+6Sn?qzH@[?C.[tJ`.. dvkUO]1Bu7U+UoSضlY4o7xc#0'7ߚ/5*q_u m?ʧᦗw|&]+/;_9⓭soavT]Cc{׸`i3g5V^$2vM_39䩘*a|aNzO*0 % f`.{)`oTS^f;GQޚZ5B̪`"} ʍP7\sV4s׍}OM-f3p>y)YݏE^mп -a&,7sV<= -2BKv&1 #|FXB]n w7;/\Ǯ! {.C'tE!n\x[ ,uayt˫(s֤gD!rǾ ?3G{xJ/k0r緅 r51e>S}/ 9U5O_m5m̧`U`1EΜI/?͗DY,5>1Om|XVKUk0/ )xkKvy1*/z~ޝwύTa'gT_< -<-:Q-b&ݔ,_M?5x#81 sclWCwܨ'gVqG}]Q,}hNb27Fbyh'<$Ug:uCO}?~ۓp\ڳ0?Xɟ߆yB|~fahZэB߸ sDqg흟W:jӟ~s!anIo$?=w?>ǙM_tu#w m8t%2t% _35/^M?ƿdc} WVeZSn=#s|~;%A\;F!FE˄ֽ|¦y.O'.<Ƴis3w;;^1_A^[}7?ÜE`4@s1Oz7G݀؉>Ԟղ˚w5}rQ]7kcD07E'?6>䏦3bQ€ܯsizP /z0n^| -a@uȑ zuro^!n/0sFcL9=6<œhO0X`W9|clƹ/5'>Qa 0 );ZLƘ1p]6 -|ӾOg`/}^ C_=-'DHtM`6ݬ?M_vykNGb>ǁLG߬\w/_CW[11rϳxcP~o~7>o?c7cdv,uA #0b P?Dw#PcVMb7=w]"΍sqp'E~tGџ -ѕ|r!}|]g!;$e!o(}.7ЏG@vĜ{6EӲG9PW?y9E[K`o1/>a|^xO3hy;#{>|v/i1ZLv5-rq961 ~hi=Ϊu~-f4=y>;)cʃ bhsb<Zwo>V"~7ikco^vu({$ū"^0.t= -߼ecJD\>g>޼Yѭߺ _o(>b?6"v1rѷ( g>s\OC\>3ώn}׍yq /=*p|;bOfp.<ψw;Ew;ؿ[ lu~1ޜ{ۛ4}烅/g{?gXĜ}}/u=Gw<4=5ΪA6k7Թ@{zEͺ{yaXu&λhv9`1*&,_>9I# ӝރ v =KNElYo(y7x$nJo<)n bPNKO QNugQN^܈tÍ83>+mܹl--KԚS%k\ܑ_;w~:/8fP4=uQ.m^OxبbfZ'tOӃ` ; l6 s bgy;+j_:Jv& - l욱MAǞ}wFxccbc(b5П?x%)`͙_i'X>9lA-PP/!W7t˙1Qyߣyy/5󌦷hmFm}pǫiq6>ɣӺ⎷n -ݗD=u9`zřh dz2bP~m_ ޕ#Vym+}4Z)-yԉf}ՠOk1xn6 -[wkMJXN`3FY>>b`gt?r /cvz ;}i^mKNù9];Gun <{G.xڎp { ʷ,}B,֭1n:p5&>5ڴG-[^!jDž ׮ <<xTl'|Wr'Rj#gD;:#,bUsUus NiZ -q1.'lS;[^k`{/B~#sO }W~X0߱BˀG8k>ڼ˚s~ MGm~H?41wȄE/]OɄzbg2b4=21W7aS?ag5!~2bgװYi;k遖) ĖQE\}kZK[C^Zt6qg ,bj_9~(2ұv %OGȪ.?O|=?ݵ<_Q}?zJݬHUb=s|U#h0~zq q}mš߸*{ oY*8 K~%0AB,^0ׄ0Gzr;k}f3agn9㍍#66uQnjxږz·x|Q>?Lx`r#^a(|#{x-ޟ>C 1i- P,s|v}\x17!.iOزt͋VxSߌ>XbY _R -v'ّc_3F纳Oo\l/ ; חs?8>}\J#/=i7!vesYxV 84 ->6s|O ܘO^7D;rp#ຝ{(90}}\ᭇ.·2 n> -.^y'mi_bǸ3UsZSǖ1mZEy:97F: ^{@l9m)}Jg<})cM]A6'mx> K5yssv Aӊ/"|5{/GӲy/oN@8a -8_á~ -~a s' ߱@`7bԡ|-&OTq_q~=&bˬ"[t]_ݎ3tOfǎ&ts?}$@oD|#酫Ck]DB\zY4{~VMk\N&}lA8wN{›]EX󛎎~W =Cpmq%5 cB? tn?u=֍g8iS;FzF\ӈ"Z8}ODNcQ7?~R}c߼Pli5x覥ƅЯK枝/xh^^ہ*0ucģu t{.C.k_M_:cqezkB?0``,Ev#g{꾱e'>D"_h[(O^ˣ? /hv@mZ`!FCpl/tSlx+O:oބk7~mzL N6p0j0 gz;+5<|s^]${>B=@o1}%/niϺxu@dݓ"V~_SwquLnC6Wn@=TdOK6sўwߙAu=_A*`WHmއgX' G0;^'C VƳg翸1n̯o>Cگ#|6zF_] ի}Vt %D'<@v׮0ԩ7q/X?O38EFy[4LĕO\*:YF]0.pyhxvG|y"$  l4HضǮ~Ofо7'vY8P?{dyDAp+lG^ djG17={ (ρ{ gP*[¿h -ȃK ڇߨ&GĉzZ|:{kxh+BE|cFˇ>Żp lcKi#/|W9߾rZ_QަS0@*9.3}= g[m}a|.ǾkʸOhТ`6>~ͽ0XhW&|oO$ߓ?]`rՙX~fg>!Ëv7&#Va mt7☄,{CxSc][Ύ,~AxaQ.u>(ހr(#ėX5B?cwQ'~kl(Lۈ1 2 V= -ia{,#ߓA'!~(:/r핂Olg;ߣ ,n=uEGxeOr86߼o{Z<Aq~E}մvdQMsW85߽ѿeǡ?Gṗ1al-8V747tOsBG0+,= An<H[ΦvӼ֤8|q>8|q>8|q>8|q>8|q>Smb;Ǝ_3KlJc+ό=H-j2il"e&#qskRcjD:A!vLowMqː:Tp&QٱiûRcL Nt9ѩ:ѩ:is;z!bB"TaFvX%ga-PqP$;Cl۴D e'*gƺ~yzӬ͆Vkm6ܖ2-xS8d%2ۭxkw23lVaɲMp+YֺR,@{<ܚN3.w Z^.VK?՝i%W\\|g<[14t5gֈvxjVG(ewt҉T2M'5馠0گR9F6`S [D?{;ƴgi(JP_>bDvaGR锍yi)S )JtiM'!C(䐋Z%eȝ\K\KvFxri ]}{6f`8svP4C *7b.:gk(J]BqsvBsv2.K6XPq*(k_锳DP;"9sBsU\ 5ZQz%z/h60ec=w8rԢEG- XPvԢ{Q3@qaCZ):Rt\EG) xRJѺb֍K8W.3k#H$4@%3Vx{"/wDzHyJԭN_/oL#s26)bE/S;?Nƛ? iykC"9o^/by/;kgԵ;:] w3q*8@РzJV"/-g9=xoEMJQ6˼ƔΑ NlpiOUJ♡32B2<3Ls2m%۔`lcl{b9\9sryiKw5?Oڈ[z+6ѥ;[%v朵LXlĠ ɹ鄍X⥲i>lOa-=Nq#gC(::r!-*$Hnj5'H 5N-lߡmPCarRލsTN6$ȤKQm\"GNzJMSsd4-ړ1Wo'c4R3֚.lgٿ+>stream -5mY"*.؆ItI\;K0V{+δZ֘-9T jɼB2Y^$/}V$:lR9I`)R.I_Ь{%Cq{Ӊl:HUY0/Lv<’mWtkuоa8hVa㟝̣ D5V) '٪9/8; -%Yϭ{;=/"8 sQ?8Q,.DӜLdbVu*.~tlbmO,#ac91ǃ|)`؛J\ws+;Ju mL%a#l`뺕gqf+)Z* mU)u1}3)%M_mrJϿSIZf&X+zSsN 9PφG*3bd9Y:yXzTT)f^™z'Lũ U!~w4pyORJ(~rFehm㕧 -vXj‡?t 9`{<3#4K@9W)dos}3PF5DqSN6Vr.ġ1gVHd8TpD3LR]6rOU)0XNG\QP:>'dM2gu:'zbcAC7f˴LOzD27jZ(TN_HY;znVY1?&մfĖ3t2Wp)&>vtwޗz[ReVUUVfYUQ%Q;^KYx9QP Ɍ(/rXPQ$NDFU^8W0O1Nj՝mЖX5ib\m`Ռ[$NQ]VDAtuܬpYU nQα,IĒZuKJZ(hY-)CE -sa‰"~݌"XKO^RYW Q։z[$N@s -PAƭ*`Mus(c]P` XͲO7eQͲnx+bF )nԪgAg0g}8h*5o/.*H*'V(uCLWd9'Ir6L1uMPD9*ȋAQa'V(87ψVꆁ+x<ԎȪgݼd$)H0sG4ivU&숆ሠj=#VD9peUhBd'JAs4D,;XtY0Ib܆L L\EAiyf6hʹv c`YóA5JNĜy.74q2BY 9Fb*$4Lf@EQvq -\[M.DK$`h' h-),ԈzÚa n;ڇZ X<5a+RTy gHF3 Eլr-E4m|~RLiT:h9s[\]G @ہƷ T@6h1͇> -"PoߒBGzBM*rn&Ԥ¼T$%&(K~HOypԥAW^4`EiF:ͭFP5c-B"ʚ7R:{diEO>0"Ed#Z%YD.9aɅP-UPhGYEyŋ)GkSYY&&!`.:Uac9iMjǒڡ|,b㙔I&p$fǵ[D=jQXW6C;F RuMN'ne݉6=xF +Ĝՙ* [ƎVaFzW,ڝͦS-% ЍBfNB6GƸ U0,s -}X+tR#Qᅬ;.)\3VC_CE+ǒ H_Gkx3'0]T+: -K/yu Jgt1$_ч`"Moc0m|{el -dP59f7]dY-&H9Zf=vQ>GVgn:/mX["CH^b糖7X;W8 hYaW,z^beA/Lms2P|.Safpʁ5-S">1UګymvTSyå`,iì:}1h27Dgc:xrk?nph{{S.:ﯬ:JynQTseUE(%pS?9-9YWm,f %JN"W}Zs*fX@a0嵀K+nӯ_bx GEƯBZMѳ<"zˌoFMNt-)(ҡ}A9࿵l&sTVݫ浲RkeqAq)=@^*_MlZ7XKuVefpM"+,<(spߜ), -2 3Q9UalJhst@]ܿjI0h_YP,(v <$F` -{ -C-.ED٥wY7גט$࢏E/GoPBᓘ+rRhя5!2C^3oIA`@]R8F#Ύl|٘eB\50f1e~a%Ð܃0z/[C"U10GNg9ft>\|yr,:F1z+W_լ1Yc0/oT3gT?ȅ,%-Q#Ngat.u;<}̲.ߌq/߃"s?~e!Ò){7\?Ekp/ZQs|GzyBo38+689۔JrX%AY?2j3- AQm6xlom6ͦ⬈+Gwx'>KYĸUd#Y^4 q%s=ǥ#Q2!O͜;>,hGb5r؟utj\( H,lFl5rWq{}Fl]&Ygd_ [J*uޭ L--U?6G"n+t2T#UKnXi -hB\Wap&5WMaP'jQ$Km>ifmU&]A;lFRs<$CF=eɌJsǓNimhLgs7JPJJ& $%$XZfҬݚ#bQV5|B%Rn4UaINCAjԀU+=GU-)|`ŨU2 YONnpWI2բM*FȪ3o²ZJ>jKS[OD[~նMM5*7j]^&qM6[ә6uښY3qmOg:ZKF[jf-Ovy2ޒ{~@KNjpDsYDAg -{Nɪ( -&s^EM'@{Ҭ/4 jOҋ驒, jQ|jgK,i5<Œ`jUIc)ZIcNmYHf;!f"C:-ȳ=XDn' Z_x~]l1lrT$N۔6hhVu+GQVЧP|jrTɲD/bp -'cNr\N"k"LHVAT.HE -3o;3 D7 ` UNYzϥ <MPq:x h.MZ+r2ϩ=TtD@v CdT&͉u-־k)Dg'k,RKl'}Z uM[OmTH-6[28ǷtZXRn L6Ǘ$(grWp.R"m _\MHnXfEEjxjдX665+?z{/ w~w~ __z<" -0Psknsѽbrj|l| #Q3YKDaaMq`4pZz)K<"eE\V)"L+57%b"OD[9Mdnh" !zJM&g!L+x]Ģ:7Hr=zb0Dx W,OvKD9Vs5[ r4ЬtFZDgrbrj[ Hլ*:+dٜ&/ oPXZBU]b)͌Y`.GJC͚ NZᙼMn-׆ -dQ3*'ABɹƵc4hV1WNwr5Vw[IYΈ Fo,Azr̚sz|m)3 ɢCB- *:>9x5A3 @h=V ]tw}۸FV`>-8^O1R)MƦbt_t, Qd{A\nQTL}FQ"(Zl.FTYmTL} ~R%p]dOUJ=6v½%"hwzm|jOoa-ԃlc -SnA!؄*">e]lw*ZQCod -RSKާB -w:"RS6oci,J?,.(Wdr{^Ԓw}/*"~LaᖘjgSf[,^13mYʧ9-TAVDj}˸ΙjgNx@g9_C2>ZCx@[l9_fyVqΗۊȬ4NaΗv,^q#g{芁[I^rag$YOݥ<"H/EUP X)E40M*FRȖ*:M1Zd5UH2Ô jz,hl  P̺-?I{~B[|,W;U -Zlirm. -UN#+`'A_'Պl-k4tLk1UhY(3ڇ cub>eK=^{ Y2L f:ߓԕ2_Ko(1@NJ^1b,-4. S#Vqi⫽kZ(幽hYzMhg ->ɫ8BC?8-pnH&KQCF2O<Hj~uu? ,w9jtXaVP]߭5rVC.SZav0' -vҝNpIl.SJG\ri5w|r߫7U: ⪀MPURckk^+֪_rӯn[j$:qQ[je@y0=IMMM r*7Crj<1̨0zu5*&Ҥt!&'5:W=f;eM`WUl!ZAWCG)$- _!^Kxv Y{#gSKO[N49,#G/[Ҡꕡwӫ#I>`X+/^@CeWSߢRr:7z*ЇAm*j` #P~,c)/ǓYs -1pj#|eŤ)ItG?ğ Q؋V[,_;-C - l+}"i0k\ %бH ֶK7֡qQ(K-,na)—hkiPI#HyVFX,„P͊n>(iPNhUUq3Jd}qn*磪{6gBJ*ֱh3D" βe~V%:NjԊ)逬d|5ԯM-(z?Wo}jh%9'.tovPᑬ>πۼx?_&X"lUEIA[7yEDÑ2@Ĉ,1ji JÉ,GEe(/z,> YjU #lo|Y&[z iϺgEN^ܪHYCLx(NǬD!@%`Mo SA:2*hA=UqUm\2.!(YsNұ2 #wUg\UEE<]!p3MaN <(ktAu:G/cGd7~xkF,ZK3L:~% W ^$̺]Tۤ{'KLEo]ZPbF27ݺgFq])蚅yek2XUjZI6KGX.Z7n{Huq=XǤ.mv@֚\<5GY1_\rY-S303q.1fgKZZ4xVKD. 'D^$~8gY^dqsc'ڝ 8w -H.QOd»xLdrы@ -Q9|> ¼3'"=lѥ-Ϋ⚷kBYS%KE#kq$0ȘOt%#JTZ۪dj+њWC&8n -~JgXջ14X6UQ%7iZ55vk.r~.p\blQ.kөD4 -y%e$So:qEX\$~o,\e&WM06M_W|x͆OЩ`VQDAY^ b$EUxQU Q$B殸QWm:g32nڏKge6G9w߰nNx$, %"g+k$2pg9Lˌ;C٩N8GB9*êVe/2k֊{L mt#oGlcdS(! E벎"UMMv]s㕲o74 -%U@/yȊ$+z9+N:PM#,JbRyeB*sEs PVA3 q̱ -[{z^[jC @8B=Q@!]vJWd"$%^hTA4V*y,y:sRV) EYʊ( -+4R[ -+U$cQe_Tۇ41c͐"Z@ G*Y,(0@ǁ4EaJ/y2 -'͛z5ecbB1)U}8ʼns%^%đ0ZT=`*( CX *ZFcI=8gǙ~ {C> +mӮ1ƙXH`IEeph'e9-ΆڅtGuGb$V`;(>YQ)," }a޴<Zeqbx' ȮzW}UEwu/m_\5פ䦳T:1xk׸\|Dk-–Y)0ifE0&Zߐd}q ={|}k ͶoO7;;hCiym70|sv^t3lnsE|oěO$`~S"{k<Ϯ6 j:+kEm?`  -膝 めA Zn< f~P* Q1u!l^ɯ$`r0EK/:k.tA:p+ -!߄T{P$Ņ,$nfQ2x AA3,C$ ,_,t Ƞ` @TS~\d7H<|pC!"wR1@XU -JP*WS,eD)E,> $AxF뎖.)DWgIYF=?.fa\TE3"dm6P -M0DPtqU*DeaA*0!A^FOr = t(uM!` LH5HR A@#!D(AQ!0dg)rPنĄ`~Pѥh}U iE%|dN98gvo?ø@'VF}PHiDi?˙ $Sz\?R|r¾Z16!b҄ g8  *'pP wT+ !EIi$$6JB,<*JFrnT2eNXJ D'E -F9N=`rGagGtpB=MFb_9%RBѪ@1GYw0PGoXMXFi frRA$v*vbKs1B@HA Qp BL X sMPp Z݌uL9+rUbcXdf`{`CH9N@3;lri?!X.TF;e@S @ʢ8WGyxcA9@+ZJeTH̀6t@I01 Ԋ r'PGWkXqFck/dWr_pq*QxL9U\Q}Q+kuo<xo( |jkQ~95MܚR=D N/Zoih&o7Tu|wu/br;2Dv*>aafCAttB>XೃNB.]yJ_6 -"j -maB~[k783hahLFh@`$\{I=w(X|W3 ?[A`[ ӖX/H&!Z"B"eAͣQ"IV%.z3r O0@O.z?'_B]8pg"P] i]d84w<|FacW*`N6Gf2ID@ v G,0 r+" VC71_X|kpBM䣉 -Mb,O="8ӗD$|@ @"аp?(f*ӂF,+((] GIl ld]Ra ,{d#9b;8JCA 8vB>PӃo~ İFcƐHR&tBBȤS&LJ^V hQW +Td4@͙{,@4>1f"rP||T~em\[g6@~W/["./j  au.,b)5 &?:XoV:{!So$l; |%Ql\7;f _o lW?a6#X=XaWI>ہ1 ڧal'7z\ ABb?T8v܉lsKhYC_q k]ˋ$VEgOf7;Ly\mn#]2ol{@b!G;}*%%U΋Č?1\7 .Zר ڔ . 2S7c Y_ֽA -q6a$ -%v֣L "n)nwY2w;Z:kq@%AQT (7K "L1 $tg9AN`Do2Ų|J_rO1B㿌֗^[CZOqNa0ƲO3đs-^P)wpI!Et G&ډAB+ﳱ.{D!g Y -* ޑ fe͍LD$f$/<2&%7٠ -;%طo>#%_dmG û\~0Yو2P/A_lru r \[Ckn zY(<،XpЄnm^:%0bzljdB|{sA^WKQ\q(߮>ihMG 3)DU?Ox=fPɺYf;0<Ճ6n$D[/,/\*)o-\n^5aF'8rCN Ɲ&a$G*tQGnu|V -ʄx%:Ew_/O| mB'Hqwcl.DB%\u()UdPet^cʨy˯:뤷E'F*[{K˛6|{rU@TcUP~QE1y#BQZIfV(vQmr3,'%q_&|j33NsނZWYXU2,Rd/Į\rIUm]_AАͱ%Q\6C;$n ͥZ։ L8&Vѣcd%iEZfK&kre%)IYuI!K]$o4Wq66nRIy\>hj*#&z$D -!F^,: D)ZBkC+4@BuD3mW5]#@KpQx{a?XHNP1lД?3#~Zep&0_(i/q}B`7YLg'J?_޲«zK bz2/D1L_粋@F\e=/:@LlfuIB-:.5#*YO)~꿮X_\V+Ŧfcxoc`Ú鑷_赭uޤۣ>Y27SL=7N`BvW/ c{$ԝÕHro-HיOWvx;@î'IOͮmu[HqL&|K$=+G|56aYfH'׽5 .{ cmE$"flu*ZZYw($ܼ08^]f%Lu-o -g,/L_ TSS ٿ%7K9D9y0Ak/x.%}ڝzGgTz;jŢ]a_%؃VaoH{Z )y 6~%OWf+}e;e>܇WJ:U 듯[x`R;g}']͔1Ye>[' W\z$`k^JVn\/qcDەu|qS3N"ؚvw<9rE/ڴTIhf5>"1D? ЈJ-CmzI+^bps=0lĨ*EMԵ|Ò7IDϔF"9uH4z>xZbaS&Vő6{%g%_ja֔tng=nHiYBA) `r&ʤnJMEO'KT_>&m5"Lraj004񒅦C>V?Oe1~>JC{yG%Ymڛ5ŸnǼtd]9m> t.1="yǭUo#mgM/M `Y$}5E]$kΎ-[D$=4)"hWf3ݳRnP#- ֚"wH/ĺrK&fTS^NvIj"Nm}<#5鶧Ņ7\L7W~Kݣ1=4-zrlQϫ,jō 9 0Z q`@i7" N0$ 3挆V -{>XZ=W߃9_x"6q{<@Q:FLT|X Jp/!| `TI1 -H(&,ܠCTW6"P#U@oE_"c|Ÿbc$&5(UƲxfq-N#mTX>D’I6./nT`aՃH?K&uHҔ!܁GO#FnYċN<$[4<|Yj:fiK X ОG)39H4Ѳ<ғ{"ۛ~Y9&1۪#E\- oMfF5gVoғc%ѴC)R)"SI.2ng9)®EG=xG _qSkI-&6:{ VDޝز9Yn9̶g+^h`Ȁ[>ŀ :/<9x TXK"{ -x0xw~<ǯ0}Oo^IԴG:%vjJLƒ|F*J -umID%h>z(Yk㑿ʿ)_ N|['@j h]i{X2C@Yjtgv<j -2GT?&r2CCzOydb"@<|rq\9'2zd.Tp*MN.0˫VE*&A1q(2ɺ$roiC>或,-1g\3]y-#~cmz+|W0BǕu&*D3ۀ` ٶ22=1_"~T"$6**Td%-%",'֞ID}e_yP\` qʼn&% -Ça]߈H%ch%* MF հ=o?ނ%NrĨV7ɐoTnt~&N.يrbN[Q"ZPxcs?i/"4snn|.njPo&3Kl2lF'g/zia 9̺ͱy%uo d4K"2 rAtf|7{̘rP r{}1=c %Z)rNڌ L zfd*22"~i>5u3't;S*E͇}gkNuD,REP)*YZyLlLH[R+%O>*Xf`QuĿYp_hAV^<2mU+`#yK2Le#DD~:jj!6%&w. v< wÏC>[ӂ' $]9֊ IMk;𔧴V6􅦉[% s"L@gMޭDT-8'^TJ%ԟuf`'a@+KVJ:zB$c7D:'rq}ϫ\6dۏ='C6Wsmd1@pLͽ ;0= 9y -R%*ucAR^h& OcɓEDn:h}',ݒujK Z{)B$dl bR>t)!~4MpN.M܇BL)0}MPc] ێ@p((@?@xPR ʖ]!>x =d_.CalqoFƅ4?i]+JDfvA ;74 {^bG9(ɽw,QnyXB!kZTg&}h͙lt?ldC .&w {\o_Ѧ:^rR{Upʋ7%p4]v}pK ^lDDQĄ塎ui,Wa_쭗`-?d[xEd$^"Әր1D5QI^.<N*5S ma#rJkw*%[+ʅ[]P~M!ՠ9t4֓9*n ~L4Dhd_q.Z/<Бr7*<_4Xh${C-iHiU4ƻywљh|8>G-cPբќd_Gp) Ơalhq]%2Ёtg+0id{HXEKHİzz\2BhUy7Rh ؁Z"qHzc r,.6\mgq!vZ^t6ghWMb\wd -D&p].z \::+|27 f~2Zpn9O6tt5Fz %怉Z.rwMSm7zdZ(wǘX SAXv}/pzWΚJQB€f1]Un&) UwS2&f6E3 -n?D%7$|\$6{cSAuͷ/|G麗F\qF_{k2xO݌:&!|rnڼI7|qVZjzG'z=l>5<!\zB_WO#eG:'HQf1 d8m\4Kzk'y*M9)-۽ LiG10>n^WbSLe._GuuN0Lq2bg*k|yܵ_x^hC~ gG5`bFv{j+dFKTy'75a,&}:Hy|鹖#{G_mW&>eGg>|;4I(J趂 ,BA:JΗ].0L* aW|K ֕1矾idrŷkҢ$Q$;{Q>s)+ ]~vB>Sl -lp'ӕ_p@NѩY+˅vLcW*K IrA]>Vy3r9._X~E =&77O)&uqFj|3w_&g8έ.4Yreiyf1 -GD&l} ,̝ruMW,p5V .~={19YxM{sn&kz&h3꽉ܰm^c -XE㶴M,6e mzhL1k5Ŋ eJSnZח\+a*\^M7T쒦ջ0U̍龛7ex|05wfҝ5=5gFm6kuSqui㷦5MD4?}ok}n`6tvf*U6[S>~|0ׄٳ0NL91>Esf7G‹Ws։/sz\s|v33߾*J7f ö0?krf6M@#7y-7A`b/-Vt[O)XH)h Xi%8l,яВ}>[2wŊP'r4f-Ϙdq,oҩv֖>|R%caYcƚ]+K;=tK"R 旡xieLgHeNz.ˮV.[p׬^v–a4~lvm{eV•ʵ^wMwU֯Us\Yoɼ}jϦ_W sQZ {s[mk~51I54KtamX1}ku4X׺8Z6yGE#TiT}[5~mkM+[{7.ۆ̓6ym Tqbc&wz3!&l}l.h/7uӳ[,E0mdvR×vUmqxQNbXJI8f*rz/'r^Sg8ˎi9h;Ϋs:y{qn/.c梂wW`2u\1o\׵5X㶿[Rn*wsz/&7qWzJ{t=N[1x.$=ɻ4.=+xm=Somٍ +R2̛oioyKoPΊ\>O/+}=?> ǀv{2J)qj!Lbɫ;J ;cCɇ%K]2$j$)*fsQevF'S`ѳ׭F;2t:@WT~ ]&QonUm.,Z'O\S6j@> -<*@3"_n'8k&H~\Wg;ӝgW:_ rQ^&ofnHٔ+`PXK?'gRIP!jPR*tGCK`vN:~WI#j"2OsLƶ42o~hl;D+J-h"9Vǽh'~ ?bt,;bwq/޼,VwKx,}ߕ72"j^{o^zP~]t쨻b|`q[qK˦{n7K@xN6Nۺ-7_>,'t0ʟŎwI&r -XL[E*6AU^;w+;UqR~U߷mJ~`.QDdk͠6{(}C=uc0_]`:ڨh;>8{MC~x'֍ȴhfy/7gˑ2Vr4|h=̭0}d -o=8{OK)}z{Ϧd^?7<}!K_n^W*fz޷]p_}[6fla,y؞·wCNDZ}u.oDyNTMUfYZ/xm^}CNq>=bݟ7_ `Ԇt7w0AhUt4Ed\͛t_CeE'S|_]&6 Ygi3dUggO;r07?D>\qal|]|Dlfe@nvQc9zgBC)ڡpH(jwv & -8ܦ+ᆰPhY|bkv\ n67D}zߠ ,ͰVoӻf7 QxBQMhQh5;I ]g68L@Xwt@}OJ͊?Yg@`r~WRk\O@FJod7iujyt|7H^\95lŴKPZ 7]q]ڋФ -j[~7n,;S;x%"ԋSB^ A4R -^g/{⭡@ChVY^\?\Vwi)MlHzb*I2ԆWZZqż#VyAbc7>n+sxQGt2oBJ [f=-G -x6bђ`Zv"`jTl?vQ΂ -Ѧ*Za1h6`9ޠn -b6 -WDxxg8i%>!Csg>JKRL0* y-*dTi\LuoJ(@ `w:b[a>lQBNXVwg,3Os|_8$BZr %4A Q *ݬ4MLh܎?Q%x2byȕ򩋛l!C 㡼 -7Z[;>FS"KI%&4m-Zuܿ#>;"4('nZu0zlnvN:ҳ7 -| >47K XÎa)΋.fc\r wTt~#袳ɧWpoݢ{ _Ys*|205NA&@p;yz..P Jh@gRp>WoiG~TfO Z㇧+Vc&]<>:O&sOkru1y2EbOv ?`J;jSeGN ̟ FxJ:&ݫbăh˛[>3y=5rdG:UE4QSBmx$~w }Jk+8*\~ʆ12-nȚx}`5?#֧:i_g9$'M Ľo 4[ڙҷ+7YaePFH{{sE(Bm3U5ˬ{"GM/K >f/E%HU@kYyG"G8ˊP͹>swJP\f,Wz2[= MgWm6ґevҥ}ZQ;qvT?:ќ*bުA֫T/z&FA-/OKeQ}cck SzA^9/oJP]HMm{fbaz!rhUΦ_oԖէ뭛kn>_r#NizyР0Ψ?}ԟMvQ{}]|4$qjGպw+GtQ?}C!LtWle,b=s7uՄokK_s},6Z$uZ kA6SXd5nmyq,$v\W~!lU ->LB~ -T]\7ӫ*TzW:TI Z -B=L 5jrb WjjP܃`Z50FL՜xv0 T -ԧwUh6%:]@s Ԛ7%H+5ա"CCJP[QΘTi@ć3nD -9]6 !Ӕ횸A;?i3}pQZ=&p5p;n) Y Z&CZ8`C dhDUjߤG@Օ'5{D= 5ŵDS sXr*`/si+pHBCh]^* K2FsL@џGgUDgKڈt3-!7het+LRyJkI@Q[bGaȮ=i e$)R4f/&zLWkd#My8dR(wJPVB)p@+^Kpx^+g/l 8lg],ٓ )LcV1{L:|_֘K+%a$2^Mk^'Ͼf<)I)!OL~1Đ4?bG9;e'VgE{K=*fQMƀs%e P>D: إv -u?<+4 ݬWܪG; b}K;c.S􍗮`, )Yu&B (}?O:S9e#`ER6 n5Eƍa흒4?4\j)V5a j3q1!CO]{VjQLjz4t5mzqjzFM \ܟrqVCuV?Dyrs{ѷuN Gz3z+ -%[WUmMoes{}y;wv)- pi"DM}6:(+i#2.[&ӗNߍӉEqyQ:ЗapN9@r(E} Q\SkBȞ,n緦ƭr\O3HTD< hf?hve( IHBjfU #MliBP1EoIkUՋ uf ܫd%O.|YV4J*JsEE( [S@5QT¢T&^wD 4po斎4*A[hKr}"sPHv},ıNT|F*17-mԠjGFi/i#!kcE(T j4h.Do^mlTd7<S;ج/6bTS5 ~Sn`^ jK7QtuI}g؃BUM?7~"DR r,)M`@:tC쥛o AtѴlnQ+.+1|8\cVь'!-VUGLݙ@]].6*qJ}}U rusor#i^wtbVbwdrNxX^vZ%Oׯc{8H~AxDtCR<61BTmjWsml3ՙ\~ަSH;}_248b -F?aiXF\Mu725Łn%Fnbroʲt3R%sBoQ5Y=S01ޯ&g(bwB+r+! ٘Tɂ˳3y@q*;=v2d3Ϲf$|mvݎOO־_Χ]oOV{g2wzؓ'/Lk?vIE"ٕZZBjݜ'V)@*8#wBU];M*vT&UYK0cl'T@ŊVQƤ@(X1x@6ߜRfR+qj/t~#95N䬌OInZ&dIgr;D}¥nٝ^H8^i{q[(tF=ǀ#Mr[eEN+S9xLF^EZK}iNm"i`$&݈1`^r-X`/ݚB -ߔxm!Dv5r|Jy hL1 '[C{yS5DQ_׮z>A+|hԛA !Mbdi|i2v4em ۧZUЫۓuVwuUVS%-";x HHyZr~Q -S/#r!N*wOamN -46~uyGSSՂzkSf7Nהx4$K;Ob8j;N -웶wn嫝} y FOIΘ۩48qѻXc6B-'@&)]ERX?)ݨ3]W[aLL<tSS)SԹ l7fk ň}23ṪFi߮`|L>o c0DtoQȠ>l3ɇ?)y |}J1I<<}JC -J2!^اT'IaBW(\}JU}:)S,Se}"|d. -T+V_'ޒ]ا¢ -"~\اT )!7g-3Tاԕf }CxҾWا3)U2\eOIFs)Uɕ -4*VYاT&vqTاw -VI0nVgaaF ] -8i64sztR3(|a:AV_eżz&7nS24MfrgU61wJPَGc 1@'tLFZ\5,=@gLa2zc6b)ub[˄Jt=~vib+^'CHD9d}SCrV>pJ~4t߯nB? < ߫NXrs\yoq|Z'IewNv@hSWRMn<)IP 4um2ww{C{4UTRsZAoJ΍ZiטtލܜGiifJ'͕8?=N9q!]qJjkLtu+97 VA&VfRlJצo ]$r65K(GMKaMBc|Sv7 c@Z7Gڛ;x ^I~ 1O14GαO{91K(SFpGW}™|WEÏǩ(0o ޽{޿_*:=g^_ftq{t6'z_#zT؋F -dj-l7x@B|<ܛwzS4<'fs"O*ڃ Q6*q@|uOJE"ԺT;AW_*ȷN꨷̀eTteAaj1;e"s -<(g&29K úo$>U:{=NY^ŖS(|*]>BRJ$WٻaȽj]B%r)p-ȻZI`[jPϯā.yIٽiT5CB.Jcg\W!GT  -j双jkvՠv…DXi|YhQjz0jvcO*[Zģ ڗMb\ [ާWP OG鞉u]LJMA/qU\tpɵnćIEiqUƜ^M^_uR▪Egժj4*&)'\jʦ{a4\q'PUĭ=CYCN%7 %t+IFKvi'7Ji`!+[On|¥LtbOoDn'~i߂ΞgWk6LN''a}< 'ֽhP9"-JuL{nu$1zrmoC¦c~ܝ˓ΝHn'0)/#0ٹ3y!{F7;B,p~i?(R5 IɞF匘aIĿN]fQ⥁ ז.t -QuC*B(◼<CU,ۓ'"M4쀞2M^ iUip[*%F=^o]hQ=uK#6Wxb%:$GD7?(I4Z?*I4RNI$h='}ZI]x^.+%_sY+ufTd&3Ȍ"L"2d+ ;SNuv/VNuwuuuu ]희P%+4W=Y -ܙ~zdvGMVhrd1YpU,jܜO:8uýHC vZpSIxuZmLxhBZMxhLWCk nE[9FZf;-Մ'Fʎ )ۡxh]t$<))vNx3> ͂#5}+&p#$eԦO`@hf y-ۡRx`Cl ZmGIxqCvmHx[ iljOxwɸŲ]C uX [$<}Zo5fs`C54EVmZ~GHxhp IxxXmn{xCyhn]&  7ת:TpbNni& %F:F}ڮ Mb -HvAF9mfAqZ C-B~2A;\P7uЊ,hers$B.]-K>g9;nVENnSJ7 -9/,e;`o=Z;8]%Q}|E~Z_+sbLҫ=iϧԋYRyQ XM/@ߋ -xЭpUsJ[Sat" ν`)D<F D4" <Ϗ1m -g%m ]K>|)ͩff)T0j2L/~{jxVԖ Zˤ4SnI8 <ޕ8(<7C4%]S8$Ѷ_ N!'^}3f_?QP']jQ2hD5<5F1䃛KEjsxg|"Zx{r5 2_d foڬr$"Z)AZ5ݏ;V!"o#O#ii#qKO(Y6jB/WsI7qՐzQn|y=s.v猢[8.M'Ȥl06+iMmǗbm|K&)܀k]1 -sdDh3QYDʎ_$Xܛ[ 鷯!1$;8|a@_#2_sGIa.8,g1xxAA5 0\ ުqcw -& mkL ~siN$}}>{\Ϻ(0`#g?8/}ve$zhS$ $qgIȟS/-b9FYDb 0ʵ -c䦶 -pqȾ\6!㇣XpF;KO]Zq&rae哵Xѥѣn4}Նt+ .۠&جVql?uZ6R|scV g I(:RC'Ivl_ĵTUiل&xN1TdeUZ OdnwLa]17}ŕgI?ub%7`Կ{zCqYħ#7 -g 0v!t|AGI߳؎DY5顑R NGXb#p ۙXGosa\96NssY~Loyu5],F<e;IGD.l#LeF_^/L5C.Կ;!mUoX3;s|zbvy+$7"-lnG(\B#Nmۜ҈QA9(^6E$%B*ɍpMwP9==8 | :Kqx`qU{ p5W@\l-txa=1͞Wɋ(ѧQ]xO!gͳPfN+(VȘ^5_+UXzHi]3 -ױ@OSַ:rr+A17zi*lXӑƿKvKיb޴BKr7de<_:AVs?:v8ݽ5rEf:xrsD1"K܏ U qL/kS{1 -bS^S?πuz3(Z&:/n2^Ei!s]R< -}ۡȸ|ZxƃfRwKQX=N\Ό*"g q-犍6Ǯmkw w2&gb"TčDNs @; PbainK'A">e_@1T*SYICj@m@S9∈q-ą[W;&iU NyP s:ǯ?D -Dͪvᚉ]6,Q5U`t0 -[)]QW.ҘnYwep_;/~dXtXQL(ΦH [k(= Z4@s Ћ5<1ѐ-+<u*Γ+[ƈ|ISR iJFg;߶#aC:2 n+[He;it*%* c[lV䅙{nL72W|-5:S):9N0SpJkNa@nhYuc_lR:lD5eSn?"ӹׁݜ8Gp^[ֈ4x`8\UF-҆vߐK#>(2mZ:寣j.3\"ANOt秊3-CAlc*Au"T6Ykcm'2dGr5u}xNs.)LuIu6 9*ͯ 6Ka[uSF*b|*@h*ٵbKe^d1P9j:EVz!jec -t>^Ɛ:PXQ+CVjbb9bƐPV6hQ+CV,Fl Y9fƐPQ+pOpuq- V V/lZʹʵ - ldI+>Mbi"3>TP|/9gzQ -̆ -L7%jôOq[b׸ ШA!:VbUV~ 6j< ˵f< ?&)zB a3\ը` -Eɐ6N*/W3TDѤ<7s|K@s{ij.s=_fFh:ca]Τӱ}]gҎ?-FlժfLT+f1; *slHA+:`emV3x vl0‡y!, hpHDOİsш !!*' b4*p E(EWVKIT87JуXMW?v>?6pdM?%1 -" ıp(B lB4<$E#a$@f5h`k'Ka\F@[ -`n"MĊbx4[ȱXq2ZzUo8MFjԕMF ḅ3z.{X)ᢜi4i 2|)H?3+YGj̅ -`}4\~(+%W?z37}/kCMFН&k_zX{F $EXQOBa6$Fy#`6+4o 0zBOq ˍ]d`Bb8$Yk|,bPDĆaؑr/!0(& O_&% lDr`_fp EBffzcKeB B>YC;Vr5ZC-fc@/Kn~<Nrq=`)6y=F3JM{ "CWE$lyJz%7[~^J9YOh EE_7@—g}./ӹl_|LOG@/Y -endstream endobj 6 0 obj [5 0 R] endobj 26 0 obj <> endobj xref -0 27 -0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000048038 00000 n -0000000000 00000 f -0000049735 00000 n -0000388735 00000 n -0000048089 00000 n -0000048476 00000 n -0000052718 00000 n -0000050034 00000 n -0000049921 00000 n -0000048793 00000 n -0000049173 00000 n -0000049221 00000 n -0000049805 00000 n -0000049836 00000 n -0000050069 00000 n -0000052791 00000 n -0000053053 00000 n -0000054377 00000 n -0000084255 00000 n -0000149844 00000 n -0000215433 00000 n -0000281022 00000 n -0000346611 00000 n -0000388758 00000 n -trailer -<<1411E0EBE6883E408E63E3533E47FF90>]>> -startxref -388958 -%%EOF diff --git a/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/.openspec.yaml b/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/.openspec.yaml new file mode 100644 index 0000000..85ae75c --- /dev/null +++ b/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-02-26 diff --git a/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/design.md b/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/design.md new file mode 100644 index 0000000..7f1c4ea --- /dev/null +++ b/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/design.md @@ -0,0 +1,76 @@ +## Context + +Pomotroid uses a flat key/value SQLite settings table. The active theme is stored as a single `theme` string (theme name). The frontend loads this on startup, looks up the theme JSON by name, and applies its CSS custom properties to `:root`. Eighteen bundled themes exist; some are light (GitHub, Solarized Light, Rosé Pine Dawn), most are dark. + +There is currently no OS color-scheme detection in the codebase. The `applyTheme()` store function applies a theme object's colors directly to the document root — it is the single apply point shared by both the main window and the settings window. + +## Goals / Non-Goals + +**Goals:** +- Replace the single `theme` setting with `theme_mode` + `theme_light` + `theme_dark` +- Resolve the active theme at startup and on live OS change using a shared utility +- Migrate existing users' `theme` value into both new picker fields automatically +- Update the Appearance section UI to expose mode selector + two independent pickers +- Remove the `theme` field from settings entirely (no redundant derived state) + +**Non-Goals:** +- Filtering or categorizing themes as "light" or "dark" in the UI or JSON +- Adding new Pomotroid Light/Dark theme variants (separate future work) +- Per-round-type theme overrides +- Syncing the resolved theme name back to the DB on every OS change + +## Decisions + +### 1. Frontend-only OS signal detection + +**Decision**: Use `window.matchMedia('(prefers-color-scheme: dark)')` in the frontend. No Rust involvement. + +**Rationale**: `applyTheme()` is purely frontend. The Rust side never needs to know the resolved theme — it only stores user preferences. Adding a Tauri theme event would require new commands and cross-window event plumbing for no gain. + +**Alternative considered**: Tauri `on_system_theme_changed` window event → emit custom IPC event → frontend listener. Adds ~3 extra layers for the same result. + +### 2. Remove `theme` field entirely (Option B) + +**Decision**: Delete `theme` from `DEFAULTS`, the `Settings` struct, and `types.ts`. Startup derives the active theme from `theme_mode` + `theme_light`/`theme_dark` + OS query every time. + +**Rationale**: Keeping a cached `theme` field creates a second source of truth. It would need to be updated on every OS change and every picker change, and could drift. Deriving it fresh on startup is cheap (one `matchMedia.matches` call) and eliminates the drift problem. + +**Alternative considered**: Keep `theme` as a write-through cache. Rejected because it needs to be kept in sync across two windows and OS changes, which adds complexity without benefit. + +### 3. Shared `resolveThemeName()` utility + +**Decision**: Extract a single `resolveThemeName(settings, osDark): string` function, imported by both `+page.svelte` and `settings/+page.svelte`. + +**Rationale**: Both windows need identical resolution logic. A shared utility ensures consistency and avoids drift between the two implementations. + +### 4. Deferred preview for inactive picker + +**Decision**: Clicking a theme in the non-active picker saves the selection (via `setSetting`) but does not call `applyTheme()`. + +**Rationale**: Applying a theme that contradicts the current OS/mode would be confusing. The user is configuring a future state. The active theme only changes when the picker is currently the active one (mode=Light selects in light picker, mode=Dark selects in dark picker, mode=Auto uses the picker that matches current OS). + +**Alternative considered**: Always apply as preview regardless of active state. Rejected — too surprising when auto-mode is active and OS is dark but user is configuring light picker. + +### 5. DB migration for existing users + +**Decision**: Add a one-time migration in `db/migrations.rs` that reads the current `theme` value and writes it to `theme_light` and `theme_dark` if those keys are absent. + +**Rationale**: The seed/defaults mechanism only inserts "Pomotroid" for missing keys. Existing users with custom themes (e.g. Nord) would silently revert to Pomotroid without a migration. The migration runs once during startup, before the settings are loaded. + +## Risks / Trade-offs + +- **Startup flash on slow OS query**: `matchMedia` is synchronous, so there is no async gap. No risk. +- **Settings window out of sync**: If the user changes the OS theme while the settings window is open and focused on Appearance, the active picker highlight needs to update. The `matchMedia` listener in the settings page must handle this. +- **`theme` removal is breaking**: Any external tooling reading the settings DB directly will lose the `theme` key. Acceptable — this is an internal implementation detail. + +## Migration Plan + +1. New migration added to `db/migrations.rs` runs on startup +2. If `theme_light` key is absent: read `theme`, write to `theme_light` and `theme_dark`, set `theme_mode = "auto"` +3. Delete `theme` key from settings table (or leave as orphan — no functional impact either way) +4. Seed inserts `theme_mode/light/dark` defaults for brand-new installs +5. No rollback path needed — migration is additive and non-destructive to user data + +## Open Questions + +- None. All decisions resolved during exploration. diff --git a/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/proposal.md b/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/proposal.md new file mode 100644 index 0000000..7f586b5 --- /dev/null +++ b/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/proposal.md @@ -0,0 +1,32 @@ +## Why + +Pomotroid's theme system is a manual, single-choice picker — users must remember to switch themes when moving between light and dark environments. Adding OS-aware automatic theme switching reduces friction and aligns the app with modern desktop expectations. + +## What Changes + +- Add a theme mode selector: **Auto**, **Light**, **Dark** +- Add separate light theme and dark theme pickers (both show all available themes) +- In Auto mode, the active theme is determined by the OS `prefers-color-scheme` signal, switching live when the OS changes +- In Light/Dark mode, the user's explicit picker selection is always used regardless of OS +- **BREAKING**: Remove the single `theme` setting field; replace with `theme_mode`, `theme_light`, and `theme_dark` +- Add a DB migration that copies the existing `theme` value to both `theme_light` and `theme_dark` for existing users, and sets `theme_mode` to `"auto"` +- Both the main window and the settings window respond to live OS theme changes + +## Capabilities + +### New Capabilities + +- `theme-mode`: Mode selector (Auto/Light/Dark) controlling how the active theme is resolved from the two pickers and the OS color scheme signal + +### Modified Capabilities + +- none + +## Impact + +- **Rust**: `settings/defaults.rs`, `settings/mod.rs`, `db/migrations.rs` — new fields, new migration +- **Frontend**: `src/lib/types.ts`, `src/lib/stores/settings.ts` — new fields on Settings interface +- **Frontend**: `AppearanceSection.svelte` — new UI (mode selector + two pickers replacing single picker) +- **Frontend**: both `src/routes/+page.svelte` and `src/routes/settings/+page.svelte` — startup theme resolution, live `matchMedia` listener +- **Frontend**: new shared `resolveThemeName()` utility +- **No new dependencies** — uses native `window.matchMedia` API diff --git a/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/specs/theme-mode/spec.md b/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/specs/theme-mode/spec.md new file mode 100644 index 0000000..fcaa893 --- /dev/null +++ b/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/specs/theme-mode/spec.md @@ -0,0 +1,84 @@ +## ADDED Requirements + +### Requirement: Theme mode selection +The system SHALL provide three theme modes — Auto, Light, and Dark — that control how the active theme is resolved. The active mode SHALL be persisted in settings as `theme_mode` with values `"auto"`, `"light"`, or `"dark"`. + +#### Scenario: Default mode is Auto +- **WHEN** a new user launches the app for the first time +- **THEN** `theme_mode` is `"auto"` + +#### Scenario: User selects Light mode +- **WHEN** the user selects Light mode +- **THEN** `theme_mode` is saved as `"light"` and the light theme picker's selection becomes the active theme immediately + +#### Scenario: User selects Dark mode +- **WHEN** the user selects Dark mode +- **THEN** `theme_mode` is saved as `"dark"` and the dark theme picker's selection becomes the active theme immediately + +#### Scenario: User selects Auto mode +- **WHEN** the user selects Auto mode +- **THEN** `theme_mode` is saved as `"auto"` and the active theme is resolved from the OS color scheme immediately + +### Requirement: Independent light and dark theme pickers +The system SHALL maintain two independent theme selections: `theme_light` and `theme_dark`. Both pickers SHALL display all available themes. Defaults SHALL be `"Pomotroid"` for both. + +#### Scenario: Light theme selection when Light mode active +- **WHEN** mode is `"light"` and the user selects a theme from the light picker +- **THEN** `theme_light` is saved and the selected theme is applied immediately + +#### Scenario: Dark theme selection when Dark mode active +- **WHEN** mode is `"dark"` and the user selects a theme from the dark picker +- **THEN** `theme_dark` is saved and the selected theme is applied immediately + +#### Scenario: Deferred preview for inactive picker +- **WHEN** the user selects a theme from the picker that is not currently active +- **THEN** the selection is saved but the visible theme does not change + +#### Scenario: Deferred light picker in Auto mode with OS dark +- **WHEN** mode is `"auto"`, the OS is dark, and the user selects a theme from the light picker +- **THEN** `theme_light` is saved but the active theme remains the dark theme + +### Requirement: Active theme resolution +The system SHALL resolve the active theme using: Auto → OS dark? `theme_dark` : `theme_light`; Light → `theme_light`; Dark → `theme_dark`. The `theme` settings field SHALL be removed; the active theme SHALL always be derived at runtime. + +#### Scenario: Auto mode resolves to dark theme on dark OS +- **WHEN** `theme_mode` is `"auto"` and `prefers-color-scheme` is `dark` +- **THEN** the active theme is `theme_dark` + +#### Scenario: Auto mode resolves to light theme on light OS +- **WHEN** `theme_mode` is `"auto"` and `prefers-color-scheme` is `light` +- **THEN** the active theme is `theme_light` + +#### Scenario: Light mode ignores OS +- **WHEN** `theme_mode` is `"light"` regardless of OS color scheme +- **THEN** the active theme is always `theme_light` + +#### Scenario: Dark mode ignores OS +- **WHEN** `theme_mode` is `"dark"` regardless of OS color scheme +- **THEN** the active theme is always `theme_dark` + +### Requirement: Live OS color scheme response +When `theme_mode` is `"auto"`, the application SHALL respond to OS color scheme changes without requiring a restart. Both the main window and the settings window SHALL update simultaneously. + +#### Scenario: OS switches to dark while app is open in Auto mode +- **WHEN** `theme_mode` is `"auto"` and the OS switches to dark mode +- **THEN** the active theme changes to `theme_dark` immediately in all open windows + +#### Scenario: OS switches to light while app is open in Auto mode +- **WHEN** `theme_mode` is `"auto"` and the OS switches to light mode +- **THEN** the active theme changes to `theme_light` immediately in all open windows + +#### Scenario: OS change ignored when not in Auto mode +- **WHEN** `theme_mode` is `"light"` or `"dark"` and the OS color scheme changes +- **THEN** the active theme does not change + +### Requirement: Migration for existing users +On first launch after the update, the system SHALL migrate existing single-theme settings to the new three-field model with no visible change to the user. + +#### Scenario: Existing user with custom theme +- **WHEN** `theme_light` is absent from the settings DB and `theme` exists with value e.g. `"Nord"` +- **THEN** `theme_light` and `theme_dark` are both set to `"Nord"` and `theme_mode` is set to `"auto"` + +#### Scenario: Brand new install +- **WHEN** no settings exist in the DB +- **THEN** `theme_mode = "auto"`, `theme_light = "Pomotroid"`, `theme_dark = "Pomotroid"` are seeded as defaults diff --git a/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/tasks.md b/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/tasks.md new file mode 100644 index 0000000..24b18f4 --- /dev/null +++ b/openspec/changes/archive/2026-02-26-auto-light-and-dark-mode/tasks.md @@ -0,0 +1,40 @@ +## 1. Rust — Settings & DB + +- [x] 1.1 Add `theme_mode`, `theme_light`, `theme_dark` defaults to `settings/defaults.rs`; remove `theme` default +- [x] 1.2 Replace `theme: String` with `theme_mode: String`, `theme_light: String`, `theme_dark: String` in `settings/mod.rs` +- [x] 1.3 Add DB migration in `db/migrations.rs`: if `theme_light` absent, copy `theme` → `theme_light` + `theme_dark`, set `theme_mode = "auto"`, then delete `theme` key +- [x] 1.4 Run `cargo test` — fix any breakage from removing the `theme` field + +## 2. Frontend — Types & Store + +- [x] 2.1 Remove `theme: string` and add `theme_mode: string`, `theme_light: string`, `theme_dark: string` to `Settings` interface in `types.ts` +- [x] 2.2 Update default object in `stores/settings.ts` to match new fields + +## 3. Frontend — Shared Resolution Utility + +- [x] 3.1 Create `src/lib/utils/theme.ts` exporting `resolveThemeName(settings: Settings, osDark: boolean): string` + +## 4. Frontend — Window Integration + +- [x] 4.1 Update `src/routes/+page.svelte` startup theme load to use `resolveThemeName()` instead of `s.theme` +- [x] 4.2 Add `matchMedia('(prefers-color-scheme: dark)')` change listener in `+page.svelte`; on change, if `theme_mode === 'auto'` resolve and apply theme +- [x] 4.3 Update `src/routes/settings/+page.svelte` startup theme load to use `resolveThemeName()` +- [x] 4.4 Add matching `matchMedia` listener in `settings/+page.svelte` +- [x] 4.5 Update both `onSettingsChanged` handlers — remove `theme` field reference, re-resolve on any of `theme_mode`, `theme_light`, or `theme_dark` change + +## 5. Frontend — Appearance Section UI + +- [x] 5.1 Replace the single theme list in `AppearanceSection.svelte` with a mode selector (Auto / Light / Dark) — three-button segmented control style +- [x] 5.2 Add a Light theme picker (same card layout as current picker) wired to `theme_light` +- [x] 5.3 Add a Dark theme picker wired to `theme_dark` +- [x] 5.4 Implement active-card highlight logic: light picker shows active card when mode=light, or mode=auto and OS is light; dark picker shows active card when mode=dark, or mode=auto and OS is dark +- [x] 5.5 Implement deferred preview: clicking a card in the non-active picker saves via `setSetting` only; clicking in the active picker saves and calls `applyTheme()` +- [x] 5.6 Update mode selector `onclick` handlers to resolve and apply theme immediately on mode change + +## 6. Cleanup & Verification + +- [x] 6.1 Search codebase for any remaining references to `settings.theme` (the old single field) and update or remove them +- [x] 6.2 Run `npm run check` — confirm zero type errors +- [x] 6.3 Smoke test: new install defaults (auto mode, both pickers show Pomotroid active) +- [x] 6.4 Smoke test: switching modes and pickers — correct theme applies or defers +- [x] 6.5 Smoke test: live OS switch while in Auto mode — theme changes in both windows diff --git a/openspec/changes/archive/2026-02-27-add-localization/.openspec.yaml b/openspec/changes/archive/2026-02-27-add-localization/.openspec.yaml new file mode 100644 index 0000000..85ae75c --- /dev/null +++ b/openspec/changes/archive/2026-02-27-add-localization/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-02-26 diff --git a/openspec/changes/archive/2026-02-27-add-localization/design.md b/openspec/changes/archive/2026-02-27-add-localization/design.md new file mode 100644 index 0000000..e41501f --- /dev/null +++ b/openspec/changes/archive/2026-02-27-add-localization/design.md @@ -0,0 +1,94 @@ +## Context + +Pomotroid has all user-visible strings hardcoded in English across 8+ Svelte components and in the Rust notification module. There is no existing i18n infrastructure. The app runs as a Tauri SPA (single-page application with `adapter-static`) in two windows — `main` and `settings` — which share the same JS bundle. The settings system already supports per-key persistence and live propagation via `settings:changed` events, which we can leverage for the language preference. + +## Goals / Non-Goals + +**Goals:** +- Translate all user-visible strings in the frontend via Paraglide message functions +- Detect system locale automatically; allow user override via a language dropdown in System settings +- Ship 5 locales at launch: `en` (base), `es`, `fr`, `de`, `ja` +- Refactor notification strings to be constructed on the frontend (translated), then passed to Rust as plain title + body + +**Non-Goals:** +- RTL language support (layout changes required — future work) +- Pluralization beyond what Paraglide's ICU message format handles naturally +- Community translation tooling / Inlang editor integration (the message format is compatible, but no workflow is set up now) +- Translating theme names or custom user data + +## Decisions + +### D1 — Paraglide JS v2 over svelte-i18n or custom solution + +**Decision**: Use `@inlang/paraglide-js`. + +**Rationale**: Paraglide generates type-safe message functions at build time. Each message is a named function (e.g., `m.settings_title()`) — dead-code elimination removes unused messages, and TypeScript catches missing/renamed keys. `svelte-i18n` uses a runtime lookup store (`$_('key')`) which is less type-safe and can't tree-shake. A custom solution adds maintenance burden. + +**Alternatives considered**: `svelte-i18n` (runtime, less type-safe), `i18next` (heavyweight, browser-focused), custom JSON loader (no type safety). + +### D2 — Strategy: `['baseLocale']` (no URL-based routing) + +**Decision**: Configure Paraglide with `strategy: ['baseLocale']` and call `setLocale()` imperatively at startup. + +**Rationale**: Paraglide's default strategies route locale via URL path (e.g., `/en/`, `/fr/`). Tauri SPA apps use a flat file structure; URL-based routing would break navigation and the `adapter-static` fallback. With `['baseLocale']`, Paraglide only changes locale via `setLocale()` — matching exactly how settings-driven locale switching works. + +**Alternatives considered**: URL-based routing (incompatible with Tauri SPA), storing locale in `localStorage` (bypasses the settings system). + +### D3 — Language setting stored in SQLite (`language` key) + +**Decision**: Add `language` to the settings DB with default `'auto'`. The `Settings` struct gains a `language: String` field; a MIGRATION_3 inserts the default row. + +**Rationale**: Consistent with how all other user preferences are stored. `settings:changed` propagates the new value to both windows automatically — no extra IPC needed for the settings window to pick up a language change made in the main window (or vice versa). + +**Locale codes**: The stored value is either `'auto'` or an IETF BCP 47 tag (`'es'`, `'fr'`, `'de'`, `'ja'`). `'auto'` at runtime reads `navigator.language`, matches to the closest supported locale (prefix match: `'fr-CA'` → `'fr'`), falling back to `'en'`. + +### D4 — Locale init in both page files + +**Decision**: Both `+page.svelte` and `settings/+page.svelte` call `setLocale()` on mount. They also call it again inside `onSettingsChanged` when `language` changes. + +**Rationale**: Each Tauri window is an independent browser context. A locale change in one window won't automatically affect the other unless each window listens to `settings:changed` and re-calls `setLocale()`. This is consistent with how theme changes are handled across windows. + +### D5 — Notification strings constructed on the frontend (Option B) + +**Decision**: Remove hardcoded English strings from `notifications/mod.rs`. Add a `notification_show(title: String, body: String)` Tauri command. In `+page.svelte`'s `onRoundChange` handler, construct translated title/body strings with Paraglide and call `notification_show`. + +**Rationale**: Rust has no concept of the user's chosen locale — the settings value is stored as a string and Rust has no message catalog. Constructing notification strings on the frontend means translations are consistent with the rest of the UI. The lean `notification_show` command is simpler and more testable than passing locale codes to Rust. + +**Alternatives considered**: Passing a locale code to Rust and building a Rust-side message catalog (high complexity, duplicated strings), keeping English-only notifications (inconsistent UX). + +### D6 — `paths: { relative: false }` in svelte.config.js + +**Decision**: Add `paths: { relative: false }` to the adapter-static config. + +**Rationale**: Paraglide's Vite plugin emits imports using absolute base-path URLs. `adapter-static` by default rewrites asset URLs to relative paths, which corrupts the Paraglide runtime imports. `relative: false` preserves absolute paths and makes the build work correctly. + +### D7 — Machine-translated launch locales + +**Decision**: Ship `es`, `fr`, `de`, `ja` as machine-translated starter files. All strings are short, contextual, and easy to verify. + +**Rationale**: Getting 4 locales out at launch demonstrates the system works and seeds community corrections. The short strings (labels, button text, section headings) are low-risk for machine translation — errors are obvious and easy to fix. + +## Risks / Trade-offs + +- **[Risk] Paraglide Vite plugin conflicts with SvelteKit** → Mitigation: add `paraglideVitePlugin()` to `vite.config.ts` plugins array (not `svelte.config.js`); this is the documented path for SvelteKit integration. +- **[Risk] Both windows calling `setLocale()` on mount may cause a brief flash** → Mitigation: locale loading is synchronous; there is no async gap between mount and the `setLocale()` call, so no flash in practice. +- **[Risk] Machine translations contain errors** → Mitigation: strings are short and visible; wrong translations are easy for native speakers to spot and report. All message keys are typed, so corrections are a simple JSON edit. +- **[Trade-off] Paraglide generates a messages module** → The generated `src/paraglide/` directory must be committed or gitignored. Decision: commit it (small, stable after initial generation; makes builds reproducible without re-running codegen). + +## Migration Plan + +1. Install `@inlang/paraglide-js`; run init to scaffold `project.inlang/` and `messages/en.json` +2. Add MIGRATION_3 to insert `language = 'auto'` default row +3. Update Settings struct and frontend types +4. Configure Vite plugin and svelte.config.js fix +5. Extract all strings to `messages/en.json`; generate machine translations for `es`, `fr`, `de`, `ja` +6. Replace hardcoded strings in all components with `m.*()` calls +7. Add locale init logic to both page files +8. Refactor notification dispatch (new command + frontend handler) +9. Add language dropdown to SystemSection.svelte + +**Rollback**: Language feature is additive — removing the `language` setting row and reverting message function calls restores the English-only state. No data loss. + +## Open Questions + +- None — all major decisions are resolved from the explore session. diff --git a/openspec/changes/archive/2026-02-27-add-localization/proposal.md b/openspec/changes/archive/2026-02-27-add-localization/proposal.md new file mode 100644 index 0000000..12c455e --- /dev/null +++ b/openspec/changes/archive/2026-02-27-add-localization/proposal.md @@ -0,0 +1,30 @@ +## Why + +Pomotroid currently has all user-visible strings hardcoded in English, limiting its reach to non-English-speaking users. Adding i18n support broadens the audience and makes the app accessible to users whose system locale is not English, with a clear path for community contributions of additional translations. + +## What Changes + +- Install and configure **Paraglide JS v2** (`@inlang/paraglide-js`) as the i18n library — compile-time, type-safe, tree-shakable message functions +- Extract all ~50 user-visible strings from the frontend into Paraglide message files (`messages/en.json` as base, plus machine-translated `es`, `fr`, `de`, `ja`) +- Add a `language` setting (`'auto'` default) stored in SQLite; a dropdown in the **System** settings section lets users override the detected locale +- Startup logic reads the `language` setting and calls `setLocale()` accordingly; `'auto'` maps `navigator.language` to the closest supported locale +- Refactor notification dispatch: frontend constructs translated notification strings (using Paraglide) and calls a new lean `notification_show(title, body)` Rust command — removes hardcoded English strings from `notifications/mod.rs` +- Fix `svelte.config.js` adapter-static compatibility: add `paths: { relative: false }` +- Configure Paraglide strategy as `['baseLocale']` (no URL routing — correct for Tauri SPA) + +## Capabilities + +### New Capabilities + +- `localization`: Paraglide-based i18n system — message files, locale detection, language setting, language override UI + +### Modified Capabilities + +- `settings`: New `language` DB key and `language` field on `Settings` struct; language selector in System section + +## Impact + +- **Frontend**: `vite.config.ts` (Paraglide Vite plugin), `svelte.config.js` (paths fix), all 6 settings section components, `Timer.svelte`, `TimerFooter.svelte`, `+page.svelte`, `settings/+page.svelte` (locale init + notification dispatch) +- **Backend**: `settings/defaults.rs` (new key), `settings/mod.rs` (new field + load), `db/migrations.rs` (MIGRATION_3), `commands.rs` (new `notification_show` command), `notifications/mod.rs` (simplified to take title+body) +- **New files**: `messages/en.json`, `messages/es.json`, `messages/fr.json`, `messages/de.json`, `messages/ja.json` +- **Dependencies**: `@inlang/paraglide-js` (npm) diff --git a/openspec/changes/archive/2026-02-27-add-localization/specs/localization/spec.md b/openspec/changes/archive/2026-02-27-add-localization/specs/localization/spec.md new file mode 100644 index 0000000..df9028f --- /dev/null +++ b/openspec/changes/archive/2026-02-27-add-localization/specs/localization/spec.md @@ -0,0 +1,67 @@ +## ADDED Requirements + +### Requirement: Paraglide-based message catalog +The system SHALL use Paraglide JS v2 (`@inlang/paraglide-js`) to manage all user-visible strings. All strings SHALL be defined in message files (`messages/.json`) and accessed through generated type-safe message functions (`m.()`). The base locale SHALL be `en`. + +#### Scenario: Type-safe message access +- **WHEN** a developer references a message key that does not exist +- **THEN** TypeScript SHALL report a compile error + +#### Scenario: Unused message tree-shaking +- **WHEN** the app is built for production +- **THEN** message functions for unused keys SHALL be eliminated from the bundle + +### Requirement: Supported locales at launch +The system SHALL ship five locales: English (`en`, base), Spanish (`es`), French (`fr`), German (`de`), and Japanese (`ja`). Non-English locales MAY be machine-translated. All locale message files SHALL contain translations for every key defined in `messages/en.json`. + +#### Scenario: All keys present in non-English locales +- **WHEN** a non-English message file is loaded +- **THEN** every key defined in `messages/en.json` SHALL have a corresponding entry + +#### Scenario: Fallback to English for missing keys +- **WHEN** a message key is missing in the active locale's file +- **THEN** the English string SHALL be displayed as a fallback + +### Requirement: Automatic locale detection +The system SHALL default to `language = 'auto'`. When `'auto'` is active, the locale SHALL be resolved from `navigator.language` by matching the closest supported locale (prefix match). If no match is found, the locale SHALL fall back to `en`. + +#### Scenario: Exact locale match +- **WHEN** `navigator.language` is `'fr'` +- **THEN** the active locale SHALL be `fr` + +#### Scenario: Region-qualified locale match +- **WHEN** `navigator.language` is `'de-AT'` +- **THEN** the active locale SHALL be `de` + +#### Scenario: Unsupported locale fallback +- **WHEN** `navigator.language` is `'zh-CN'` +- **THEN** the active locale SHALL fall back to `en` + +### Requirement: User language override +The system SHALL allow the user to override the detected locale via a language dropdown in the System settings section. The selected locale SHALL be persisted as the `language` setting and applied immediately without requiring an app restart. + +#### Scenario: User selects a specific language +- **WHEN** the user selects `'fr'` from the language dropdown +- **THEN** all UI strings in both windows SHALL immediately display in French + +#### Scenario: User resets to automatic detection +- **WHEN** the user selects `'Auto'` from the language dropdown +- **THEN** `language` is saved as `'auto'` and the locale is re-resolved from `navigator.language` + +### Requirement: Locale applied in both windows +The system SHALL apply the active locale in both the main timer window and the settings window. When the `language` setting changes, both windows SHALL re-call `setLocale()` in response to the `settings:changed` event. + +#### Scenario: Language change propagates to both windows +- **WHEN** the user changes the language setting while the settings window is open +- **THEN** both the timer window and the settings window SHALL update their displayed strings + +### Requirement: Translated desktop notifications +The system SHALL send desktop notifications with titles and bodies constructed from translated Paraglide message strings. Notification string construction SHALL happen on the frontend; the Rust backend SHALL receive a pre-translated `title` and `body`. + +#### Scenario: Work round complete notification in active locale +- **WHEN** a work round completes and the active locale is `fr` +- **THEN** the notification title and body SHALL be in French + +#### Scenario: Notification Rust command accepts arbitrary title and body +- **WHEN** `notification_show(title, body)` is called from the frontend +- **THEN** Rust SHALL display the notification with the provided title and body without any string construction diff --git a/openspec/changes/archive/2026-02-27-add-localization/specs/settings/spec.md b/openspec/changes/archive/2026-02-27-add-localization/specs/settings/spec.md new file mode 100644 index 0000000..28acd6f --- /dev/null +++ b/openspec/changes/archive/2026-02-27-add-localization/specs/settings/spec.md @@ -0,0 +1,16 @@ +## ADDED Requirements + +### Requirement: Language setting +The system SHALL store a `language` setting in the settings database with a default value of `'auto'`. The value SHALL be either `'auto'` or a supported IETF BCP 47 locale tag (`'en'`, `'es'`, `'fr'`, `'de'`, `'ja'`). The `Settings` struct SHALL expose a `language: String` field, and `types.ts` SHALL mirror this field. + +#### Scenario: Default language is auto +- **WHEN** a new user launches the app for the first time +- **THEN** the `language` setting SHALL be `'auto'` + +#### Scenario: Language setting persists across restarts +- **WHEN** the user sets `language` to `'de'` and restarts the app +- **THEN** the `language` setting SHALL be `'de'` after restart + +#### Scenario: Language setting migration for existing users +- **WHEN** an existing user upgrades from a version without the `language` setting +- **THEN** MIGRATION_3 SHALL insert `language = 'auto'` as a default row diff --git a/openspec/changes/archive/2026-02-27-add-localization/tasks.md b/openspec/changes/archive/2026-02-27-add-localization/tasks.md new file mode 100644 index 0000000..7b2f1bf --- /dev/null +++ b/openspec/changes/archive/2026-02-27-add-localization/tasks.md @@ -0,0 +1,73 @@ +## 1. Setup — Paraglide and build config + +- [x] 1.1 Install `@inlang/paraglide-js` npm package +- [x] 1.2 Run `npx @inlang/paraglide-js init` to scaffold `project.inlang/` and `messages/en.json`; set supported locales to `en, es, fr, de, ja` in `project.inlang/settings.json` +- [x] 1.3 Add `paraglide` Vite plugin to `vite.config.js` with `strategy: ['baseLocale']` and `outdir: './src/paraglide'` +- [x] 1.4 Add `paths: { relative: false }` to the adapter config in `svelte.config.js` + +## 2. Backend — language setting + +- [x] 2.1 Add `("language", "auto")` entry to `src-tauri/src/settings/defaults.rs` +- [x] 2.2 Add `pub language: String` to the `Settings` struct in `settings/mod.rs`; update `Default`, `load()`, and the `defaults_round_trip` test +- [x] 2.3 Add `MIGRATION_3` to `db/migrations.rs` that inserts `language = 'auto'` with `INSERT OR IGNORE`; bump schema version to 3; update `migration_is_idempotent` test + +## 3. Frontend types + +- [x] 3.1 Add `language: string` field to the `Settings` interface in `src/lib/types.ts` +- [x] 3.2 Add `language: 'auto'` to the default settings object in `src/lib/stores/settings.ts` + +## 4. Notification refactor — Rust side + +- [x] 4.1 Remove `round_notification_text()` from `notifications/mod.rs`; change `notify_round_change` signature to `notify(app, title, body, enabled)` that calls the platform dispatch directly; update the test +- [x] 4.2 Add `notification_show(title: String, body: String, app: AppHandle)` Tauri command to `commands.rs` that calls `notifications::dispatch` (extract `dispatch` as `pub` if needed) +- [x] 4.3 Register `notification_show` in `lib.rs` invoke_handler and import +- [x] 4.4 Update the `notify_round_change` call in `timer/mod.rs` to pass hardcoded English strings as a temporary measure (they will be replaced by the frontend in task 9.2); or remove the call entirely and rely solely on the frontend + +## 5. Message catalog — English base + +- [x] 5.1 Populate `messages/en.json` with all user-visible strings: round labels (Focus, Short Break, Long Break), settings nav labels (Timer, Appearance, Notifications, Shortcuts, System, About), settings group headings, toggle labels and descriptions, notification title/body strings for each round type, and any remaining UI strings + +## 6. Message catalog — translations + +- [x] 6.1 Create machine-translated `messages/es.json` (Spanish) with all keys from `en.json` +- [x] 6.2 Create machine-translated `messages/fr.json` (French) with all keys from `en.json` +- [x] 6.3 Create machine-translated `messages/de.json` (German) with all keys from `en.json` +- [x] 6.4 Create machine-translated `messages/ja.json` (Japanese) with all keys from `en.json` + +## 7. Locale initialization + +- [x] 7.1 Add `ipc/index.ts` wrapper: `notificationShow(title: string, body: string)` +- [x] 7.2 Add locale resolve helper `resolveLocale(language: string): string` to `src/lib/utils/locale.ts` — maps `'auto'` to `navigator.language` prefix-matched against supported locales, falls back to `'en'` +- [x] 7.3 Add locale init to `src/routes/+page.svelte` on mount: read `settings.language`, call `setLocale(resolveLocale(language))` +- [x] 7.4 Add `language` change handler in the `onSettingsChanged` callback in `+page.svelte`: call `setLocale()` when `language` changes +- [x] 7.5 Add locale init to `src/routes/settings/+page.svelte` on mount (same pattern) +- [x] 7.6 Add `language` change handler in `onSettingsChanged` in `settings/+page.svelte` + +## 8. String extraction — settings sections + +- [x] 8.1 Replace hardcoded strings in `TimerSection.svelte` with `m.*()` calls (group headings, slider labels, toggle labels/descriptions) +- [x] 8.2 Replace hardcoded strings in `AppearanceSection.svelte` with `m.*()` calls (mode labels, group headings) +- [x] 8.3 Replace hardcoded strings in `NotificationsSection.svelte` with `m.*()` calls (group headings, toggle labels/descriptions) +- [x] 8.4 Replace hardcoded strings in `SystemSection.svelte` with `m.*()` calls (group headings, toggle labels/descriptions) +- [x] 8.5 Replace hardcoded strings in `ShortcutsSection.svelte` with `m.*()` calls +- [x] 8.6 Replace hardcoded strings in `AboutSection.svelte` with `m.*()` calls + +## 9. String extraction — core components and navigation + +- [x] 9.1 Replace round labels in `Timer.svelte` `roundLabel()` function with `m.*()` calls (Focus, Short Break, Long Break) +- [x] 9.2 Replace `"Settings"` title in `SettingsTitlebar.svelte` with `m.settings_title()` +- [x] 9.3 Replace settings nav label strings in `settings/+page.svelte` with `m.*()` calls + +## 10. Notification dispatch — frontend + +- [x] 10.1 Remove notification dispatch from the Rust timer (if not done in 4.4): confirm `notify_round_change` is no longer called from `timer/mod.rs` +- [x] 10.2 Add notification dispatch to `+page.svelte` `onRoundChange` handler: if `$settings.notifications_enabled`, construct translated title/body using `m.*()` and call `notificationShow(title, body)` + +## 11. Language dropdown in System settings + +- [x] 11.1 Add a language selector control to `SystemSection.svelte` under a new "Language" group heading; options are Auto + the 5 supported locales with their native names; persist via `setSetting('language', value)` and call `setLocale()` on change + +## 12. Validation + +- [x] 12.1 `npm run check` — 0 type errors, 0 warnings +- [x] 12.2 `cargo test` — all tests pass diff --git a/openspec/changes/archive/2026-02-27-build-version/.openspec.yaml b/openspec/changes/archive/2026-02-27-build-version/.openspec.yaml new file mode 100644 index 0000000..d1c6cc6 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-build-version/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-02-27 diff --git a/openspec/changes/archive/2026-02-27-build-version/design.md b/openspec/changes/archive/2026-02-27-build-version/design.md new file mode 100644 index 0000000..c66d689 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-build-version/design.md @@ -0,0 +1,96 @@ +## Context + +The About section of the settings window currently hardcodes `const VERSION = '1.0.0'` in `AboutSection.svelte`. This string is entirely disconnected from the actual build — there is no way to determine which commit a running binary was compiled from. Two binaries built from different commits show the same version string. + +`build.rs` already exists (`src-tauri/build.rs`) and contains only `tauri_build::build()`. It is the correct and idiomatic place to perform git introspection at compile time. + +The CI workflow uses `actions/checkout@v4` with default depth 1 (shallow clone), which prevents `git describe` from finding ancestor tags and computing commit distances. Full history is needed for commit count. + +## Goals / Non-Goals + +**Goals:** +- Every compiled binary carries a unique, traceable version string baked in at compile time. +- The string conforms to semver: `1.0.0-dev.{n}+{short-sha}` for dev builds, `1.0.0+{short-sha}` for release builds. +- Short SHA (7 chars) is displayed in Settings → About for readability. +- Full SHA is logged to the log file on startup for grep/traceability. +- `tauri.conf.json` remains the single source of truth for the base version number. +- Zero runtime overhead — the string is a compile-time constant. + +**Non-Goals:** +- Automatic version bumping or tag management. +- Exposing branch name in the version string (too noisy, changes often). +- A separate build number counter outside of git commit distance. +- Changing the `tauri.conf.json` version value at build time. + +## Decisions + +### D1: `build.rs` as the injection point + +**Decision**: Extend `src-tauri/build.rs` to run `git describe`, parse its output, and emit `cargo:rustc-env=APP_BUILD_VERSION=`. The string is accessed in Rust via the compile-time macro `env!("APP_BUILD_VERSION")`. + +**Alternatives considered**: +- *Vite `define` plugin*: Would work for the frontend, but the string would not be available in Rust (e.g., for startup logging). Split injection in two places introduces drift risk. +- *Runtime environment variable*: Requires the launching environment to set the variable; doesn't work for distributed binaries. +- *Patching `tauri.conf.json` before build*: Modifies a tracked file; requires cleanup; pollutes git diff. + +`build.rs` is the correct Rust idiom. `env!()` is zero-cost. One source, accessible everywhere. + +### D2: `git describe --tags --long --always --dirty` as the data source + +**Decision**: Use `git describe --tags --long --always --dirty`. + +- `--tags`: Match any tag (not just annotated). +- `--long`: Always output `{tag}-{count}-g{sha}` format, even when count is 0 (on the exact tag). Uniform parsing regardless of release/dev state. +- `--always`: Fall back to bare SHA if no tags exist at all. +- `--dirty`: Append `-dirty` if working tree has uncommitted changes. + +Output format: `v1.0.0-80-g20b2d87[-dirty]` + +Parsed into semver: +| count | dirty | result | +|-------|-------|--------| +| 0 | no | `1.0.0+20b2d87` | +| 0 | yes | `1.0.0+20b2d87.dirty` | +| N > 0 | no | `1.0.0-dev.N+20b2d87` | +| N > 0 | yes | `1.0.0-dev.N+20b2d87.dirty` | + +The `g` prefix from git describe is stripped; build metadata contains a clean 7-char hex SHA. + +**Fallback**: If `git describe` fails (no git binary, detached non-tagged repo), `build.rs` falls back to `{base_version}+unknown`. Base version is read from `tauri.conf.json` at build time. + +### D3: `cargo:rerun-if-changed` triggers + +**Decision**: Emit two rerun triggers: +``` +cargo:rerun-if-changed=.git/HEAD +cargo:rerun-if-changed=.git/refs/ +``` + +Without these, Cargo caches `build.rs` output and the version string becomes stale after commits. `.git/HEAD` changes on every commit and checkout. `.git/refs/` changes when tags are created or moved. + +### D4: Short SHA in UI, full SHA in logs + +**Decision**: The IPC command `app_version()` returns the version string with 7-char SHA (e.g., `1.0.0-dev.80+20b2d87`). A separate startup log line in `lib.rs` records the full 40-char SHA. + +The full SHA is captured via `git rev-parse HEAD` in `build.rs` and emitted as `APP_BUILD_SHA` alongside `APP_BUILD_VERSION`. + +### D5: New `app_version` Tauri command (no settings involvement) + +**Decision**: Expose the build version via a new read-only command `app_version() -> &'static str`. It is not a setting; it does not go through the settings system. The frontend calls it once on About section mount. + +### D6: CI checkout depth + +**Decision**: Add `fetch-depth: 0` to all three `actions/checkout@v4` steps in `build.yml`. This gives the CI full tag history, enabling commit count in CI-produced artifacts. Without it, `git describe` falls back to the SHA-only path and the commit count is absent. + +## Risks / Trade-offs + +- **`-dirty` in release binaries**: If someone builds a release from a dirty working tree, the binary is labeled `dirty`. This is accurate and intentional — it's a signal, not an error. +- **CI build time**: `fetch-depth: 0` fetches full history. On a project with few commits this is negligible. Worth monitoring if the repo grows very large. +- **No git binary at build time**: Unlikely in any normal dev or CI environment, but handled gracefully by the fallback to `+unknown`. +- **Shallow clone outside CI**: If someone clones with `--depth 1` locally and builds, they get `+unknown` or a bare SHA. Acceptable. + +## Migration Plan + +No runtime migration required. The change is entirely at compile time and in the UI display layer. No database changes, no settings changes, no breaking IPC changes. The new `app_version` command is additive. + +Rollout: merge to master, next build picks up the new version string automatically. diff --git a/openspec/changes/archive/2026-02-27-build-version/proposal.md b/openspec/changes/archive/2026-02-27-build-version/proposal.md new file mode 100644 index 0000000..a64b6ce --- /dev/null +++ b/openspec/changes/archive/2026-02-27-build-version/proposal.md @@ -0,0 +1,33 @@ +## Why + +The About screen currently shows a hardcoded `VERSION = '1.0.0'` string that provides no information about the exact build being run. When debugging issues, there is no way to tell which commit a binary was compiled from. A semver-conformant build identifier — baked in at compile time via `build.rs` — gives every binary a unique, traceable version string at zero runtime cost. + +## What Changes + +- `build.rs` is extended to call `git describe` at compile time, parse the output, and emit a `APP_BUILD_VERSION` environment variable baked into the binary. +- A new Tauri command `app_version()` exposes the build version string to the frontend. +- `AboutSection.svelte` replaces its hardcoded `VERSION` constant with an IPC call to `app_version()`. +- The full commit SHA is logged to the log file on startup, while the short SHA is displayed in the UI. +- The CI workflow gains `fetch-depth: 0` so commit counts are available in CI artifacts. +- `Cargo.toml` version is aligned to `1.0.0` to match `tauri.conf.json`. + +## Capabilities + +### New Capabilities + +- `build-version`: Compile-time build version string derived from `git describe`, formatted as semver with pre-release and build metadata. Exposed via IPC and displayed in Settings → About. + +### Modified Capabilities + +*(none — no existing spec-level requirements change)* + +## Impact + +- **`src-tauri/build.rs`**: New git describe logic + `cargo:rerun-if-changed` triggers. +- **`src-tauri/src/commands.rs`**: New `app_version` command. +- **`src-tauri/src/lib.rs`**: Log full SHA on startup. +- **`src/lib/ipc/index.ts`**: New `appVersion()` wrapper. +- **`src/lib/components/settings/sections/AboutSection.svelte`**: Replace hardcoded version with IPC-fetched value. +- **`.github/workflows/build.yml`**: Add `fetch-depth: 0` to all checkout steps. +- **`src-tauri/Cargo.toml`**: Align version to `1.0.0`. +- No new dependencies; no DB migrations; no settings changes. diff --git a/openspec/changes/archive/2026-02-27-build-version/specs/build-version/spec.md b/openspec/changes/archive/2026-02-27-build-version/specs/build-version/spec.md new file mode 100644 index 0000000..927d074 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-build-version/specs/build-version/spec.md @@ -0,0 +1,64 @@ +## ADDED Requirements + +### Requirement: Build version string baked in at compile time +The system SHALL compute a semver-conformant build version string during `cargo build` by invoking `git describe --tags --long --always --dirty` in `build.rs` and emitting the result as the compile-time environment variable `APP_BUILD_VERSION`. The full commit SHA SHALL be emitted separately as `APP_BUILD_SHA` via `git rev-parse HEAD`. + +#### Scenario: Dev build (commits since last tag) +- **WHEN** the binary is compiled from a commit that is N > 0 commits after the most recent tag +- **THEN** `APP_BUILD_VERSION` SHALL be `{base}-dev.{N}+{short-sha}` (e.g. `1.0.0-dev.80+20b2d87`) + +#### Scenario: Release build (on exact tag) +- **WHEN** the binary is compiled from a commit that is exactly at a tag +- **THEN** `APP_BUILD_VERSION` SHALL be `{base}+{short-sha}` (e.g. `1.0.0+20b2d87`) + +#### Scenario: Dirty working tree +- **WHEN** the binary is compiled with uncommitted changes present +- **THEN** `APP_BUILD_VERSION` SHALL include a `.dirty` suffix in the build metadata (e.g. `1.0.0-dev.80+20b2d87.dirty`) + +#### Scenario: No git history or no tags +- **WHEN** `git describe` fails (no git binary, no tags, detached shallow clone) +- **THEN** `APP_BUILD_VERSION` SHALL fall back to `{base}+unknown` where `{base}` is read from `tauri.conf.json` + +#### Scenario: Incremental rebuild after a new commit +- **WHEN** a new commit is made and `cargo build` is run again +- **THEN** the build script SHALL re-execute and produce an updated `APP_BUILD_VERSION` reflecting the new commit + +--- + +### Requirement: Build version exposed via IPC command +The system SHALL provide a Tauri command `app_version` that returns `APP_BUILD_VERSION` as a `&'static str`. This command SHALL be callable by the frontend at any time and returns the compile-time-baked version string. + +#### Scenario: Command returns baked version +- **WHEN** the frontend invokes `app_version` +- **THEN** the response SHALL be the `APP_BUILD_VERSION` string compiled into the binary + +--- + +### Requirement: Build version displayed in Settings → About +The system SHALL display the build version string in Settings → About in place of the previously hardcoded version constant. The displayed string SHALL use the short-SHA form (7 characters). + +#### Scenario: Version displayed on About mount +- **WHEN** the user opens Settings → About +- **THEN** the version line SHALL show the full semver build string (e.g. `1.0.0-dev.80+20b2d87`) + +#### Scenario: Version string is never empty +- **WHEN** `app_version` returns successfully +- **THEN** the About section SHALL display the returned string; if the call fails, it SHALL fall back to displaying the base version from `tauri.conf.json` + +--- + +### Requirement: Full commit SHA logged on startup +The system SHALL log the full 40-character commit SHA (from `APP_BUILD_SHA`) at INFO level during application startup, alongside the build version string. + +#### Scenario: Startup log includes full SHA +- **WHEN** the application starts +- **THEN** the log file SHALL contain an INFO entry with both the build version string and the full commit SHA (e.g. `[app] version=1.0.0-dev.80+20b2d87 sha=20b2d87173870d939002efe84fddff2e944eabd6`) + +--- + +### Requirement: CI workflow fetches full git history +The CI build workflow SHALL use `fetch-depth: 0` on all checkout steps so that `git describe` has access to full tag history and can compute commit distances in CI-produced artifacts. + +#### Scenario: CI artifact carries commit count +- **WHEN** a binary is built in CI from a commit that is N commits after the last tag +- **THEN** the binary's `APP_BUILD_VERSION` SHALL include the commit count N (e.g. `1.0.0-dev.80+abc1234`) diff --git a/openspec/changes/archive/2026-02-27-build-version/tasks.md b/openspec/changes/archive/2026-02-27-build-version/tasks.md new file mode 100644 index 0000000..9e761a3 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-build-version/tasks.md @@ -0,0 +1,46 @@ +## 1. Build Script + +- [x] 1.1 In `src-tauri/build.rs`, add a function that runs `git describe --tags --long --always --dirty` and captures stdout +- [x] 1.2 Parse the describe output into its components: base version tag, commit count, short SHA, dirty flag +- [x] 1.3 Read the base version from `tauri.conf.json` as the fallback source of truth +- [x] 1.4 Implement the semver formatting logic: `{base}-dev.{n}+{sha}` for dev, `{base}+{sha}` for release, `.dirty` suffix when applicable +- [x] 1.5 Handle the fallback case (`git describe` fails or no tags): emit `{base}+unknown` +- [x] 1.6 Run `git rev-parse HEAD` and capture the full 40-char SHA +- [x] 1.7 Emit `cargo:rustc-env=APP_BUILD_VERSION=` with the computed semver string +- [x] 1.8 Emit `cargo:rustc-env=APP_BUILD_SHA=` with the full commit SHA +- [x] 1.9 Emit `cargo:rerun-if-changed=.git/HEAD` to invalidate cache on new commits +- [x] 1.10 Emit `cargo:rerun-if-changed=.git/refs/` to invalidate cache on tag changes +- [x] 1.11 Keep the existing `tauri_build::build()` call intact + +## 2. Rust Backend + +- [x] 2.1 In `src-tauri/src/commands.rs`, add `app_version` command that returns `env!("APP_BUILD_VERSION")` as `&'static str` +- [x] 2.2 Register `app_version` in the `tauri::Builder::invoke_handler` list in `src-tauri/src/lib.rs` +- [x] 2.3 In `src-tauri/src/lib.rs` startup, add an INFO log entry: `[app] version={APP_BUILD_VERSION} sha={APP_BUILD_SHA}` +- [x] 2.4 Align `src-tauri/Cargo.toml` version to `1.0.0` to match `tauri.conf.json` + +## 3. Frontend IPC + +- [x] 3.1 In `src/lib/ipc/index.ts`, add `appVersion(): Promise` wrapper that invokes `app_version` + +## 4. About Section + +- [x] 4.1 In `AboutSection.svelte`, remove the hardcoded `const VERSION = '1.0.0'` constant +- [x] 4.2 Add `import { appVersion } from '$lib/ipc'` +- [x] 4.3 Declare `let version = $state('...')` with a loading placeholder +- [x] 4.4 In `onMount`, call `appVersion()` and set `version` from the result; on error, fall back to the base version from `tauri.conf.json` +- [x] 4.5 Update the version display to use the reactive `version` state variable +- [x] 4.6 Update `RELEASE_URL` to derive the tag from the base version only (strip pre-release/build metadata before constructing the GitHub releases URL) + +## 5. CI Workflow + +- [x] 5.1 In `.github/workflows/build.yml`, add `fetch-depth: 0` to the Linux `actions/checkout@v4` step +- [x] 5.2 Add `fetch-depth: 0` to the macOS `actions/checkout@v4` step +- [x] 5.3 Add `fetch-depth: 0` to the Windows `actions/checkout@v4` step + +## 6. Verification + +- [x] 6.1 Run `cargo check` in `src-tauri/` — no errors +- [x] 6.2 Run `npm run check` — no type errors +- [ ] 6.3 Run `npm run tauri dev`, open Settings → About, confirm version string shows git-derived value (not `1.0.0`) +- [ ] 6.4 Confirm the log file on startup contains a line with the full SHA diff --git a/openspec/changes/archive/2026-02-27-log-to-file/.openspec.yaml b/openspec/changes/archive/2026-02-27-log-to-file/.openspec.yaml new file mode 100644 index 0000000..d1c6cc6 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-log-to-file/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-02-27 diff --git a/openspec/changes/archive/2026-02-27-log-to-file/design.md b/openspec/changes/archive/2026-02-27-log-to-file/design.md new file mode 100644 index 0000000..0a595e7 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-log-to-file/design.md @@ -0,0 +1,118 @@ +## Context + +Pomotroid currently has no persistent diagnostic output. All error handling uses `eprintln!` (stderr), which is discarded in production AppImage/dmg/exe builds. When users encounter bugs they have nothing to submit. `tauri-plugin-log` is already declared in `Cargo.toml` but never registered; `tracing` and `tracing-subscriber` are declared but entirely unused. The work is primarily wiring and instrumentation rather than new infrastructure. + +## Goals / Non-Goals + +**Goals:** +- Rotating log file written to the OS-conventional application log directory +- All existing `eprintln!` replaced with structured `log::` calls at the appropriate level +- Every error path and major lifecycle event instrumented +- Runtime-switchable log level (INFO ↔ DEBUG) controlled by a persisted `verbose_logging` setting +- Rust panics captured to the log file before process termination +- JS-side logging (Svelte windows) routed to the same file via `@tauri-apps/plugin-log` +- User can open the log directory from Settings → About + +**Non-Goals:** +- Structured / machine-parseable log format (plain text is sufficient for bug reports) +- Remote log shipping or crash reporting services +- Log viewing UI within the app +- Per-module log-level filtering + +## Decisions + +### Use `tauri-plugin-log`, remove `tracing` + +**Chosen:** `tauri-plugin-log` (already a declared dependency, uses the `log` crate). + +`tracing` is a richer framework (spans, structured fields, async-native) but `tauri-plugin-log` does not integrate with it and adding a compatible bridge (`tracing-log`) adds complexity for no user-visible benefit. All instrumentation in Pomotroid is sequential enough that flat log lines are sufficient. `tracing` and `tracing-subscriber` are removed from `Cargo.toml`. + +**Macros used:** `log::error!`, `log::warn!`, `log::info!`, `log::debug!` from the `log` crate (re-exported by the plugin). + +--- + +### Log level strategy: Debug ceiling, runtime-switchable global gate + +The plugin is initialized with `LevelFilter::Debug` as its ceiling (so the file writer can always accept DEBUG messages if the gate opens). The global `log::set_max_level()` gate is set at startup from the `verbose_logging` setting: + +``` +verbose_logging = false → log::set_max_level(LevelFilter::Info) +verbose_logging = true → log::set_max_level(LevelFilter::Debug) +``` + +When the setting is toggled at runtime, the `settings_set` command handler calls `log::set_max_level()` immediately — no restart required. A log line is emitted at INFO level each time the level changes, so the boundary is visible in the file. + +**Why not TRACE?** TRACE-level `rodio`/`tokio` output from dependencies would dominate the file. DEBUG is sufficient and targeted. + +--- + +### Rotation: KeepOne, 5 MB per file + +`RotationStrategy::KeepOne` keeps the current log plus one archived file — a bounded ~10 MB total disk footprint. 5 MB per file is large enough to capture a full debugging session without excessive disk use. + +--- + +### Log file path + +`tauri-plugin-log` resolves via `app.path().app_log_dir()` using the app identifier `com.splode.pomotroid`: + +| Platform | Path | +|---|---| +| Linux | `~/.local/share/com.splode.pomotroid/logs/pomotroid.log` | +| macOS | `~/Library/Logs/com.splode.pomotroid/pomotroid.log` | +| Windows | `%APPDATA%\com.splode.pomotroid\logs\pomotroid.log` | + +--- + +### Panic hook placement + +The hook is registered inside `setup()` after the plugin chain has run (the logger is initialized during `.plugin()` calls in the builder). Registering inside `setup()` guarantees the hook can call `log::error!` and reach the file writer. + +```rust +std::panic::set_hook(Box::new(|info| { + log::error!("PANIC: {info}"); +})); +``` + +--- + +### `verbose_logging` as a persisted setting + +Stored as `"true"/"false"` under the key `verbose_logging` in the settings SQLite table, with `false` as the default. Added via a new DB migration (Migration 4). Added to the `Settings` struct and `defaults::DEFAULTS`. The `settings_set` command already handles arbitrary key/value pairs; the only special handling needed is the `log::set_max_level()` side-effect when the key is `verbose_logging`. + +--- + +### `open_log_dir` command + +A new Tauri command that calls `tauri_plugin_opener::open_path(app.path().app_log_dir())`. The frontend calls it via `ipc/index.ts`. No return value needed — opener handles the OS file manager interaction. Gracefully logs a warning if the path cannot be resolved. + +--- + +### JS-side logging + +`@tauri-apps/plugin-log` (the JS counterpart) forwards `info()`, `warn()`, `error()`, `debug()` calls from the Svelte webviews to the same file via IPC. Applied at: +- `+page.svelte`: startup lifecycle, IPC errors, theme/locale initialization +- `settings/+page.svelte`: same +- `locale.svelte.ts`: locale changes + +Discipline mirrors Rust: errors on failure paths, info on successful major operations. + +## Risks / Trade-offs + +- **`log::set_max_level()` is global** — affects all crates, including third-party deps (rodio, tokio). At DEBUG level, noisy crates may emit spurious lines. Mitigation: the plugin's per-target level filter (`LevelFilter::Debug`) provides a ceiling, and if dependency noise is a problem a module filter can be added in a follow-up. +- **Panic hook may not reach the file** — if the panic occurs on the logging thread itself or before plugin init. Mitigation: accepted risk; the hook covers the vast majority of panics. +- **5 MB may rotate mid-session** — a heavy debug session could roll the file, losing earlier entries. Mitigation: `KeepOne` means the previous file is still present; combined they cover ~10 MB. + +## Migration Plan + +1. DB Migration 4 added to `migrations.rs`: `INSERT OR IGNORE INTO settings (key, value) VALUES ('verbose_logging', 'false')` +2. `Settings` struct gains `verbose_logging: bool` field +3. `defaults::DEFAULTS` gains `("verbose_logging", "false")` +4. `settings::load()` gains `verbose_logging: parse_bool(&map, "verbose_logging", false)` +5. Plugin registered as first plugin in `lib.rs` builder chain (so logging is available to all subsequent setup code) +6. `log::set_max_level()` called in `setup()` after loading initial settings +7. Existing tests updated: `defaults_round_trip` asserts `!s.verbose_logging` + +## Open Questions + +- None. All decisions made during exploration. diff --git a/openspec/changes/archive/2026-02-27-log-to-file/proposal.md b/openspec/changes/archive/2026-02-27-log-to-file/proposal.md new file mode 100644 index 0000000..1ffcede --- /dev/null +++ b/openspec/changes/archive/2026-02-27-log-to-file/proposal.md @@ -0,0 +1,33 @@ +## Why + +When users encounter issues running Pomotroid, there is no persistent diagnostic record — all runtime errors go to stderr and are lost in production. A structured log file makes it possible for users to capture and submit diagnostics when filing bug reports. + +## What Changes + +- Wire up the already-declared `tauri-plugin-log` dependency to write a rotating log file to the OS-conventional log directory +- Remove the unused `tracing` and `tracing-subscriber` dependencies +- Replace all `eprintln!` calls throughout the Rust backend with structured `log::` macro calls +- Add logging at every error path and major operation (DB open, timer events, audio, WebSocket, shortcuts, tray, themes, notifications) +- Add a panic hook so Rust panics are captured in the log before the process terminates +- Add a `verbose_logging` boolean setting (default `false`) that switches the log level between INFO and DEBUG at runtime and persists across restarts +- Add a new `open_log_dir` Tauri command that opens the log directory in the OS file manager +- Add JS-side logging via `@tauri-apps/plugin-log` in both Svelte windows, applying the same error/info discipline as the Rust side +- Add a "Verbose Logging" toggle to Settings → Advanced +- Add an "Open Log Folder" button to Settings → About + +## Capabilities + +### New Capabilities + +- `diagnostic-logging`: Persistent rotating log file with OS-conventional path, runtime log-level control via Verbose Logging setting, and UI access points for users to retrieve logs for bug reports + +### Modified Capabilities + +- `settings`: New `verbose_logging` boolean setting added to the settings schema, SQLite DB, and frontend types + +## Impact + +- **Rust**: `src-tauri/Cargo.toml` (remove tracing deps), `src-tauri/src/lib.rs` (plugin init, panic hook), all modules under `src-tauri/src/` (instrumentation), `src-tauri/src/settings/` (new key), `src-tauri/src/db/` (migration), `src-tauri/src/commands.rs` (new command + verbose_logging handler) +- **Frontend**: `package.json` (add `@tauri-apps/plugin-log`), `src/lib/ipc/index.ts` (new command wrapper), `src/lib/types.ts` (Settings type), `src/routes/+page.svelte`, `src/routes/settings/+page.svelte`, `src/lib/locale.svelte.ts` (JS logging), `src/lib/components/settings/sections/AdvancedSection.svelte`, `src/lib/components/settings/sections/AboutSection.svelte` +- **Capabilities**: `src-tauri/capabilities/default.json` (log plugin permissions) +- **Localization**: All 5 locale files under `messages/` (new keys for verbose_logging and open_log_folder labels) diff --git a/openspec/changes/archive/2026-02-27-log-to-file/specs/diagnostic-logging/spec.md b/openspec/changes/archive/2026-02-27-log-to-file/specs/diagnostic-logging/spec.md new file mode 100644 index 0000000..5c14079 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-log-to-file/specs/diagnostic-logging/spec.md @@ -0,0 +1,140 @@ +## ADDED Requirements + +### Requirement: Log file written to OS-conventional directory +The system SHALL write a persistent log file to the platform's conventional application log directory, resolved via `app.path().app_log_dir()` using the app identifier `com.splode.pomotroid`. + +#### Scenario: Log directory on Linux +- **WHEN** Pomotroid runs on Linux +- **THEN** log files are written under `~/.local/share/com.splode.pomotroid/logs/` + +#### Scenario: Log directory on macOS +- **WHEN** Pomotroid runs on macOS +- **THEN** log files are written under `~/Library/Logs/com.splode.pomotroid/` + +#### Scenario: Log directory on Windows +- **WHEN** Pomotroid runs on Windows +- **THEN** log files are written under `%APPDATA%\com.splode.pomotroid\logs\` + +--- + +### Requirement: Log rotation limits disk usage +The system SHALL rotate log files using a 5 MB per-file size limit and SHALL retain at most one archived log file alongside the current file (KeepOne strategy), bounding total log disk usage to approximately 10 MB. + +#### Scenario: File rotates at 5 MB +- **WHEN** the active log file reaches 5 MB +- **THEN** the active file is archived and a new log file is started + +#### Scenario: Only one archive retained +- **WHEN** a rotation occurs and an archived log file already exists +- **THEN** the previous archive is replaced by the newly archived file + +--- + +### Requirement: Default log level captures errors, warnings, and key lifecycle events +The system SHALL default to INFO log level, capturing `error`, `warn`, and `info` messages while suppressing `debug` messages when Verbose Logging is disabled. + +#### Scenario: Error logged at INFO level +- **WHEN** Verbose Logging is disabled and a runtime error occurs +- **THEN** the error is written to the log file + +#### Scenario: Debug suppressed at INFO level +- **WHEN** Verbose Logging is disabled +- **THEN** debug-level messages are not written to the log file + +--- + +### Requirement: Rust panics captured before process termination +The system SHALL install a custom panic hook that writes the panic information to the log file before the process terminates. + +#### Scenario: Panic captured in log +- **WHEN** a Rust panic occurs anywhere in the process +- **THEN** a log entry at ERROR level containing the panic message and location is written to the log file before termination + +--- + +### Requirement: Startup metadata logged +The system SHALL log the following information at INFO level on every startup: application version, resolved app data directory path, and successful database open. + +#### Scenario: Startup info in log +- **WHEN** the application starts successfully +- **THEN** the log contains the app version, data directory path, and a DB open success message + +#### Scenario: DB open failure logged +- **WHEN** the database cannot be opened +- **THEN** the failure is logged at ERROR level before the process exits + +--- + +### Requirement: All Rust error paths instrumented +The system SHALL replace all existing `eprintln!` calls with `log::` macro calls at the appropriate level. Every code path that can produce a `Result::Err` or an unrecoverable condition SHALL emit a log entry. + +#### Scenario: Audio failure logged +- **WHEN** the audio output stream cannot be opened +- **THEN** a WARN-level entry is written (audio is non-fatal) + +#### Scenario: WebSocket bind failure logged +- **WHEN** the WebSocket server fails to bind to its configured port +- **THEN** an ERROR-level entry is written including the address and error detail + +#### Scenario: Shortcut registration failure logged +- **WHEN** a global shortcut cannot be registered +- **THEN** a WARN-level entry is written with the key string and error detail + +#### Scenario: Tray build failure logged +- **WHEN** the system tray icon cannot be built +- **THEN** a WARN-level entry is written with the error detail + +#### Scenario: Theme watcher failure logged +- **WHEN** the file system watcher for custom themes cannot be created or fails +- **THEN** a WARN-level entry is written + +#### Scenario: Notification failure logged +- **WHEN** a desktop notification cannot be sent +- **THEN** a WARN-level entry is written + +#### Scenario: Timer session record failure logged +- **WHEN** writing a completed session to the database fails +- **THEN** an ERROR-level entry is written + +--- + +### Requirement: Major successful operations logged at INFO +The system SHALL emit INFO-level log entries for major lifecycle operations that succeed, including: database open, WebSocket server successfully bound, timer round completion, and settings save. + +#### Scenario: WebSocket server bind logged +- **WHEN** the WebSocket server successfully binds to a port +- **THEN** an INFO-level entry records the bound address + +#### Scenario: Timer round completion logged +- **WHEN** a work or break round completes naturally or is skipped +- **THEN** an INFO-level entry records the round type and completion reason + +--- + +### Requirement: JS-side events logged to the same file +The system SHALL use `@tauri-apps/plugin-log` in both Svelte windows to forward frontend log calls to the same log file. JS logging SHALL apply the same level discipline as Rust: errors on failure paths, info on successful major operations. + +#### Scenario: Frontend IPC error logged +- **WHEN** an IPC call from a Svelte window fails +- **THEN** an error-level entry is written to the log file from the frontend context + +#### Scenario: Frontend initialization logged +- **WHEN** a Svelte window completes its startup sequence (settings loaded, theme applied) +- **THEN** an info-level entry is written confirming successful initialization + +#### Scenario: Locale change logged +- **WHEN** the active locale is changed +- **THEN** an info-level entry records the new locale value + +--- + +### Requirement: Open Log Folder accessible from Settings → About +The system SHALL provide a button in Settings → About that opens the log directory in the OS file manager. + +#### Scenario: Open Log Folder button opens file manager +- **WHEN** the user clicks "Open Log Folder" in Settings → About +- **THEN** the OS file manager opens at the log directory + +#### Scenario: Log path displayed +- **WHEN** the user views Settings → About +- **THEN** the resolved log directory path is displayed as text alongside the button diff --git a/openspec/changes/archive/2026-02-27-log-to-file/specs/settings/spec.md b/openspec/changes/archive/2026-02-27-log-to-file/specs/settings/spec.md new file mode 100644 index 0000000..103a79b --- /dev/null +++ b/openspec/changes/archive/2026-02-27-log-to-file/specs/settings/spec.md @@ -0,0 +1,29 @@ +## ADDED Requirements + +### Requirement: Verbose Logging setting persisted and applied on startup +The system SHALL store a `verbose_logging` boolean setting (DB key: `verbose_logging`, default `false`) in SQLite. On startup the log level SHALL be set to DEBUG when `verbose_logging` is `true`, and INFO otherwise, before any other application setup runs. + +#### Scenario: Default value is false +- **WHEN** the application runs for the first time with no existing settings +- **THEN** `verbose_logging` is `false` and the log level is INFO + +#### Scenario: Verbose logging persists across restarts +- **WHEN** the user enables Verbose Logging and restarts the application +- **THEN** the log level is set to DEBUG from the first log entry onward + +--- + +### Requirement: Verbose Logging toggled at runtime via Settings → Advanced +The system SHALL provide a "Verbose Logging" toggle in Settings → Advanced. Toggling it SHALL take effect immediately (changing the global log level via `log::set_max_level()`) without requiring an application restart, and SHALL persist the new value to the database. + +#### Scenario: Enabling Verbose Logging takes immediate effect +- **WHEN** the user enables Verbose Logging +- **THEN** subsequent log entries include DEBUG-level messages without restarting + +#### Scenario: Disabling Verbose Logging takes immediate effect +- **WHEN** the user disables Verbose Logging +- **THEN** DEBUG-level messages are suppressed from subsequent log entries without restarting + +#### Scenario: Toggle change recorded in log +- **WHEN** Verbose Logging is enabled or disabled +- **THEN** an INFO-level log entry records the change (e.g. "Verbose logging enabled — log level set to DEBUG") diff --git a/openspec/changes/archive/2026-02-27-log-to-file/tasks.md b/openspec/changes/archive/2026-02-27-log-to-file/tasks.md new file mode 100644 index 0000000..d857d60 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-log-to-file/tasks.md @@ -0,0 +1,76 @@ +## 1. Dependencies and Cargo cleanup + +- [x] 1.1 Remove `tracing` and `tracing-subscriber` from `src-tauri/Cargo.toml` +- [x] 1.2 Verify `tauri-plugin-log = "2"` is present in `Cargo.toml` (already declared) +- [x] 1.3 Add `@tauri-apps/plugin-log` to `package.json` and install + +## 2. Settings schema — verbose_logging + +- [x] 2.1 Add `("verbose_logging", "false")` to `defaults::DEFAULTS` in `src-tauri/src/settings/defaults.rs` +- [x] 2.2 Add `pub verbose_logging: bool` field to the `Settings` struct in `src-tauri/src/settings/mod.rs` +- [x] 2.3 Add `verbose_logging: parse_bool(&map, "verbose_logging", false)` to `settings::load()` +- [x] 2.4 Add `Default` value `verbose_logging: false` to `Settings::default()` +- [x] 2.5 Add Migration 4 to `src-tauri/src/db/migrations.rs`: `INSERT OR IGNORE INTO settings (key, value) VALUES ('verbose_logging', 'false')` +- [x] 2.6 Update `migrations::run()` to apply migration 4 when `version < 4` +- [x] 2.7 Update `settings` tests: add `assert!(!s.verbose_logging)` to `defaults_round_trip`; update migration idempotency test to expect version 4 + +## 3. Logging infrastructure — Rust + +- [x] 3.1 Register `tauri_plugin_log` as the first plugin in the builder chain in `src-tauri/src/lib.rs`, configured with: file target (`LogDir`, filename `"pomotroid"`), `max_file_size(5 * 1024 * 1024)`, `RotationStrategy::KeepOne`, `LevelFilter::Debug` ceiling +- [x] 3.2 In `setup()`, after loading `initial_settings`, call `log::set_max_level(LevelFilter::Debug)` if `verbose_logging` is true, else `log::set_max_level(LevelFilter::Info)` +- [x] 3.3 In `setup()`, register a panic hook: `std::panic::set_hook(Box::new(|info| { log::error!("PANIC: {info}"); }))` +- [x] 3.4 Log startup metadata in `setup()`: app version (`env!("CARGO_PKG_VERSION")`), resolved `app_data_dir` path, and DB open success at INFO level + +## 4. Rust instrumentation — replace eprintln! and add error logging + +- [x] 4.1 `src-tauri/src/websocket/mod.rs`: replace 3× `eprintln!` with `log::error!`/`log::warn!`; add `log::info!` when server successfully binds (include address) +- [x] 4.2 `src-tauri/src/notifications/mod.rs`: replace `eprintln!` with `log::warn!` +- [x] 4.3 `src-tauri/src/timer/mod.rs`: replace `eprintln!` with `log::error!`; add `log::info!` on round completion (include round type and whether skipped) +- [x] 4.4 `src-tauri/src/tray/mod.rs`: replace 4× `eprintln!` with `log::warn!` +- [x] 4.5 `src-tauri/src/audio/mod.rs`: replace 5× `eprintln!` with `log::warn!` +- [x] 4.6 `src-tauri/src/shortcuts/mod.rs`: replace 2× `eprintln!` with `log::warn!` +- [x] 4.7 `src-tauri/src/themes/watcher.rs`: replace 5× `eprintln!` with `log::warn!`/`log::error!` +- [x] 4.8 `src-tauri/src/commands.rs`: add `log::error!` for any command that returns an error result (settings save, stats queries, audio commands) + +## 5. verbose_logging runtime toggle — Rust command + +- [x] 5.1 In `src-tauri/src/commands.rs`, add a special case in the `settings_set` handler (or a dedicated handler) for the `verbose_logging` key: after saving to DB, call `log::set_max_level()` and emit an INFO log entry announcing the change + +## 6. New Tauri command — open_log_dir + +- [x] 6.1 Add `open_log_dir` command in `src-tauri/src/commands.rs`: resolve `app.path().app_log_dir()`, call `tauri_plugin_opener::open_path(log_dir, None::<&str>)`, log a warning if resolution fails +- [x] 6.2 Add `get_log_dir` command in `src-tauri/src/commands.rs`: resolve and return `app.path().app_log_dir()` as a `String` (for displaying the path in the UI) +- [x] 6.3 Register `open_log_dir` and `get_log_dir` in the `invoke_handler!` macro in `lib.rs` + +## 7. Capabilities + +- [x] 7.1 Add `"log:default"` (or equivalent `tauri-plugin-log` permission) to `src-tauri/capabilities/default.json` + +## 8. Frontend types and IPC + +- [x] 8.1 Add `verbose_logging: boolean` to the `Settings` interface in `src/lib/types.ts` +- [x] 8.2 Add `openLogDir()` and `getLogDir()` wrappers to `src/lib/ipc/index.ts` + +## 9. JS-side logging + +- [x] 9.1 In `src/routes/+page.svelte`: import `{ info, warn, error }` from `@tauri-apps/plugin-log`; add `info()` on successful init (settings loaded, theme applied, locale set); add `error()` on IPC failures in `onMount` +- [x] 9.2 In `src/routes/settings/+page.svelte`: same pattern — `info()` on init, `error()` on IPC failures +- [x] 9.3 In `src/lib/locale.svelte.ts`: add `info()` call when locale changes + +## 10. Settings UI — Verbose Logging toggle + +- [x] 10.1 Add `verbose_logging` toggle to `src/lib/components/settings/sections/AdvancedSection.svelte` using the same `Toggle` component pattern as other boolean settings +- [x] 10.2 Add locale keys `"settings_verbose_logging"` and `"settings_verbose_logging_desc"` to all 5 locale files (`messages/en.json`, `es.json`, `fr.json`, `de.json`, `ja.json`) and recompile Paraglide +- [x] 10.3 Use the new locale keys in `AdvancedSection.svelte` + +## 11. Settings UI — Open Log Folder (About) + +- [x] 11.1 Add `get_log_dir` call in `onMount` of `src/routes/settings/+page.svelte` (or inside `AboutSection.svelte`) to resolve and display the log path +- [x] 11.2 Add "Open Log Folder" button and log path display to `src/lib/components/settings/sections/AboutSection.svelte`; button calls `openLogDir()` IPC wrapper +- [x] 11.3 Add locale keys `"settings_open_log_folder"` and `"settings_log_path"` to all 5 locale files and recompile Paraglide +- [x] 11.4 Use the new locale keys in `AboutSection.svelte` + +## 12. Validation + +- [x] 12.1 Run `cargo test` in `src-tauri/` — all tests pass including updated migration and settings tests +- [x] 12.2 Run `npm run check` — 0 errors, 0 warnings diff --git a/openspec/changes/archive/2026-02-27-mini-controls/.openspec.yaml b/openspec/changes/archive/2026-02-27-mini-controls/.openspec.yaml new file mode 100644 index 0000000..34b5b23 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-mini-controls/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-02-28 diff --git a/openspec/changes/archive/2026-02-27-mini-controls/design.md b/openspec/changes/archive/2026-02-27-mini-controls/design.md new file mode 100644 index 0000000..0e0f9d9 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-mini-controls/design.md @@ -0,0 +1,53 @@ +## Context + +The timer UI scales via CSS `zoom` applied to a `.timer` wrapper div in `Timer.svelte`. In compact mode the dial fills all available space calculated as `Math.min(w - 16, h - TITLEBAR_H - 16 - COMPACT_BOTTOM_PAD) / 220`. Adding controls *inside* the zoom wrapper would make them tiny at small window sizes (uiScale can be as low as 0.4). They must therefore live **outside** the zoom wrapper at a fixed rendered size. + +`Timer.svelte` currently renders one root element: the zoomed `.timer` div. The restructure adds a `.timer-outer` wrapper (flex column, centered) with the zoom div on top and the mini controls below — only in compact mode. + +## Goals / Non-Goals + +**Goals:** +- Restart-round, play/pause, and skip buttons visible in compact mode +- Controls render at a fixed size regardless of uiScale +- Visual weight is low — does not compete with the dial +- No new IPC commands, no new backend changes + +**Non-Goals:** +- Round label or footer in compact mode +- Configurable control visibility +- Touch/swipe interactions + +## Decisions + +### D1: Controls outside the zoom wrapper + +**Decision**: Wrap the existing zoomed `.timer` div and the new mini controls in a `.timer-outer` flex-column div. The zoom only applies to the inner div; the controls inherit no scale. + +**Alternative considered**: Absolute-positioned overlay on `
` in `+page.svelte`. Rejected — spreads timer control logic into the page, breaks component encapsulation. + +### D2: New `MiniControls.svelte` component + +**Decision**: Extract the three compact buttons into a dedicated component. It imports `timerToggle`, `timerRestartRound`, `timerSkip` from `$lib/ipc` and `$timerState` from `$lib/stores/timer` directly (for the play/pause icon state). + +**Rationale**: Keeps `Timer.svelte` lean; the component can be independently styled and tested. + +### D3: Icon sizes and button dimensions + +**Decision**: Buttons are 24×24px with 10px icons (restart/skip) and 12px play/pause icon. The strip's total height is ~28px. Gap between buttons: 14px. No text labels. Colors: `--color-foreground-darker` at rest, `--color-foreground` on hover for side buttons; play/pause gets a thin circular border matching the main play/pause button's style but at 24px diameter. + +**Rationale**: Compact enough to fit in the reserved bottom space without obscuring the dial; recognisable as the same actions as the full controls. + +### D4: COMPACT_BOTTOM_PAD increase + +**Decision**: Increase `COMPACT_BOTTOM_PAD` from `20` to `48` in `+page.svelte`. This reserves 28px for the control strip + 8px gap + 12px breathing room below, ensuring the uiScale calculation doesn't allocate that space to the dial. + +`main.compact` padding-bottom decreases from `20px` to `8px` — the controls themselves provide visual anchoring at the bottom. + +## Risks / Trade-offs + +- **Slightly smaller dial in compact mode**: At 300px height, uiScale drops from ~1.0 to ~0.89. Acceptable — the dial is still large and the controls add functional value. +- **Very small windows** (< 200px): At extreme sizes the controls may feel crowded. The 0.4 minimum uiScale clamp is unchanged; controls stay at their fixed 24px height regardless. + +## Migration Plan + +Pure frontend change. No data migration. No backend changes. Ships in a single PR. diff --git a/openspec/changes/archive/2026-02-27-mini-controls/proposal.md b/openspec/changes/archive/2026-02-27-mini-controls/proposal.md new file mode 100644 index 0000000..9811835 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-mini-controls/proposal.md @@ -0,0 +1,27 @@ +## Why + +Compact mode (window < 300px in either dimension) shows only the timer dial with no controls. Users who keep the app in a corner as a tiny clock-like widget have no way to pause, restart, or skip without resizing the window. A slim control strip below the dial restores that access without disrupting the minimal aesthetic. + +## What Changes + +- A new `MiniControls.svelte` component renders three small icon-only buttons: restart current round, play/pause, skip round +- `Timer.svelte` is restructured to place the mini controls **outside** the zoom wrapper so they render at a fixed size independent of uiScale +- `COMPACT_BOTTOM_PAD` in `+page.svelte` increases from 20 → 48 to reserve space for the control strip in the uiScale calculation +- The existing `main.compact` bottom padding adjusts to account for the control strip taking that visual role + +## Capabilities + +### New Capabilities + +- `mini-controls`: Compact timer controls (restart, play/pause, skip) displayed below the dial in compact/mini window mode. + +### Modified Capabilities + +*(none — no existing spec-level requirements change)* + +## Impact + +- `src/routes/+page.svelte`: `COMPACT_BOTTOM_PAD` constant change +- `src/lib/components/Timer.svelte`: restructure to wrap zoom div, add `MiniControls` below it when `isCompact` +- `src/lib/components/MiniControls.svelte`: new component +- No backend, IPC, settings, or localization changes diff --git a/openspec/changes/archive/2026-02-27-mini-controls/specs/mini-controls/spec.md b/openspec/changes/archive/2026-02-27-mini-controls/specs/mini-controls/spec.md new file mode 100644 index 0000000..58f4794 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-mini-controls/specs/mini-controls/spec.md @@ -0,0 +1,30 @@ +## ADDED Requirements + +### Requirement: Mini controls displayed in compact mode +When the timer window is in compact mode (either dimension < 300px), the system SHALL display a slim row of three icon-only buttons below the timer dial: restart current round, play/pause, and skip round. These controls SHALL be rendered at a fixed size independent of the dial's zoom scale. + +#### Scenario: Controls appear in compact mode +- **WHEN** the window width or height drops below 300px +- **THEN** the restart, play/pause, and skip buttons SHALL be visible below the dial + +#### Scenario: Controls absent in normal mode +- **WHEN** the window is at or above the compact threshold in both dimensions +- **THEN** the mini controls SHALL NOT be rendered (the full controls row is shown instead) + +#### Scenario: Play/pause icon reflects running state +- **WHEN** the timer is running +- **THEN** the play/pause button SHALL show a pause icon +- **WHEN** the timer is paused or idle +- **THEN** the play/pause button SHALL show a play icon + +#### Scenario: Restart button restarts current round +- **WHEN** the user clicks the restart button in compact mode +- **THEN** the current round's elapsed time SHALL reset to zero without advancing the sequence + +#### Scenario: Skip button advances to next round +- **WHEN** the user clicks the skip button in compact mode +- **THEN** the timer SHALL advance to the next round in the sequence + +#### Scenario: Controls scale independently of dial +- **WHEN** the dial zoom scale is at its minimum (0.4) +- **THEN** the mini control buttons SHALL still render at their full defined size (24×24px) diff --git a/openspec/changes/archive/2026-02-27-mini-controls/tasks.md b/openspec/changes/archive/2026-02-27-mini-controls/tasks.md new file mode 100644 index 0000000..47ff17b --- /dev/null +++ b/openspec/changes/archive/2026-02-27-mini-controls/tasks.md @@ -0,0 +1,27 @@ +## 1. Page Layout Adjustment + +- [x] 1.1 In `src/routes/+page.svelte`, increase `COMPACT_BOTTOM_PAD` from `20` to `48` +- [x] 1.2 In the same file, change `main.compact { padding-bottom: 20px }` to `padding-bottom: 8px` + +## 2. MiniControls Component + +- [x] 2.1 Create `src/lib/components/MiniControls.svelte` +- [x] 2.2 Import `timerToggle`, `timerRestartRound`, `timerSkip` from `$lib/ipc` +- [x] 2.3 Import `timerState` from `$lib/stores/timer` for play/pause icon state +- [x] 2.4 Render three icon-only buttons in a row: restart (back icon), play/pause (fade-switched icon matching timer state), skip (forward icon) +- [x] 2.5 Style buttons: 24×24px, icon sizes 10px (side) / 12px (play/pause), gap 14px, colors `--color-foreground-darker` at rest → `--color-foreground` on hover; play/pause has a thin 1.5px circular border + +## 3. Timer Component Restructure + +- [x] 3.1 In `Timer.svelte`, wrap the existing `
` in a new `
` element +- [x] 3.2 Import `MiniControls` from `./MiniControls.svelte` +- [x] 3.3 After the zoom div, conditionally render `{#if isCompact}{/if}` +- [x] 3.4 Add `.timer-outer` CSS: `display: flex; flex-direction: column; align-items: center; gap: 8px` + +## 4. Verification + +- [x] 4.1 Run `npm run check` — no type errors +- [x] 4.2 Resize window below 300px — mini controls appear below dial +- [x] 4.3 Resize window above 300px — mini controls disappear, full controls visible +- [x] 4.4 Click each mini button and confirm correct action fires +- [x] 4.5 Confirm play/pause icon switches correctly between running/paused states diff --git a/openspec/changes/archive/2026-02-27-organize-default-reset/.openspec.yaml b/openspec/changes/archive/2026-02-27-organize-default-reset/.openspec.yaml new file mode 100644 index 0000000..d1c6cc6 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-organize-default-reset/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-02-27 diff --git a/openspec/changes/archive/2026-02-27-organize-default-reset/design.md b/openspec/changes/archive/2026-02-27-organize-default-reset/design.md new file mode 100644 index 0000000..51b344c --- /dev/null +++ b/openspec/changes/archive/2026-02-27-organize-default-reset/design.md @@ -0,0 +1,59 @@ +## Context + +The Settings window has six sections (Timer, Appearance, Notifications, Shortcuts, System, About). The "Reset to Defaults" button currently sits at the bottom of `TimerSection.svelte` and calls `resetSettings()`, which invokes the `settings_reset_defaults` Tauri command. That command deletes all 26 rows from the `settings` table and re-seeds factory defaults — affecting every section, not just timers. The About section is the natural home for a global administrative action: it already hosts external navigation (release notes, source code, log folder) and is understood by users as a meta/informational area rather than a settings-editing area. + +## Goals / Non-Goals + +**Goals:** +- Move the reset action to `AboutSection.svelte`, visually separated from the navigation links. +- Add inline two-step confirmation: first click reveals "Are you sure?" with Cancel and Reset buttons; second click fires the reset; Cancel restores the original button. +- Remove the reset UI from `TimerSection.svelte` entirely. +- Keep all changes frontend-only — no backend or IPC changes. + +**Non-Goals:** +- Section-scoped resets (reset only timer settings, etc.) — out of scope for this change. +- Undo/restore after reset — out of scope. +- Any new Tauri dialog plugin usage. +- Changes to `settings_reset_defaults` command behavior. + +## Decisions + +### D1: About section as the destination + +**Decision**: Place the reset row in `AboutSection.svelte`, below the existing links group and separated by a visual gap or separator. + +**Alternatives considered**: +- *System section*: Already dense with WebSocket, language, logging, tray, and window groups. Adding a destructive action there adds cognitive weight to an area users visit frequently to adjust integrations. +- *Persistent footer*: A global footer always in view would give the action unwarranted prominence for something that should rarely be used. +- *Timer section* (status quo): Misleading scope — users infer it resets only timer settings. + +About is visited infrequently (meta/administrative use), which matches the expected frequency of a factory reset. + +### D2: Inline two-step confirmation + +**Decision**: Use a `$state` boolean (`confirming`) in `AboutSection.svelte`. When `confirming` is false, show a single "Reset All Settings" button styled as a muted/danger row. When `confirming` is true, replace it with a "Are you sure?" label and two buttons: "Cancel" (sets `confirming = false`) and "Reset" (calls `resetSettings()`, then sets `confirming = false`). + +**Alternatives considered**: +- *Native `confirm()` dialog from `tauri-plugin-dialog`*: Already installed. Rejected because the OS dialog is a stylistic mismatch — the app has a distinctive custom aesthetic and an OS modal breaks that context at exactly the moment the user should feel in control. +- *Countdown/cancel pattern*: Async timer state is more complexity than warranted for a settings panel. Inline two-step is simpler and equally legible. +- *Hold-to-confirm*: Unfamiliar on desktop, no existing pattern in the app. + +### D3: Styling the reset row + +**Decision**: Style the initial "Reset All Settings" button using `--color-foreground-darker` (muted) with a hover state that shifts toward a danger color. The confirmation state uses `--color-accent` for the Reset button to draw attention. Both states use the existing `.link-row` border/padding pattern from the About section for visual consistency. + +**Rationale**: The action should be findable but not alarming at a glance. The danger signal should appear only when the user has already shown intent (the first click). + +### D4: Localization + +**Decision**: Add new i18n keys for the reset row label, confirmation prompt text, and the confirm/cancel button labels. Follow the existing `about_*` key namespace. + +## Risks / Trade-offs + +- **No undo**: Once confirmed, settings are gone. Mitigated by the two-step confirmation and the fact that re-customization is straightforward. +- **Confirmation state persists if user navigates away and back**: If `confirming = true` and the user switches sections and returns, the confirmation prompt would still be visible. Mitigation: reset `confirming` to false in an `$effect` that watches the active section, or simply accept it as harmless — the user would just see "Are you sure?" again and can Cancel. +- **Timer section cleanup**: Removing the reset button from TimerSection removes a feature that power users may have muscle-memoried. Low risk given the button was incorrectly placed. + +## Migration Plan + +No data migration. No backend changes. Pure frontend relocation. Rollout is a single PR merge. diff --git a/openspec/changes/archive/2026-02-27-organize-default-reset/proposal.md b/openspec/changes/archive/2026-02-27-organize-default-reset/proposal.md new file mode 100644 index 0000000..580769d --- /dev/null +++ b/openspec/changes/archive/2026-02-27-organize-default-reset/proposal.md @@ -0,0 +1,27 @@ +## Why + +The "Reset to Defaults" button currently lives inside the Timer section, but the underlying `settings_reset_defaults` command resets all 26 settings globally — timers, appearance, shortcuts, system, language, and more. This scope mismatch creates a misleading UI: a user in the Timer section reasonably expects the button to reset only timer settings. Moving it to the About section (where administrative/meta actions already live) and adding inline two-step confirmation prevents accidental full resets and accurately represents the action's scope. + +## What Changes + +- Remove the "Reset to Defaults" button and its handler from `TimerSection.svelte` +- Add a "Reset All Settings" row to `AboutSection.svelte` with a two-step inline confirmation (first click shows "Are you sure? [Cancel] [Reset]", second click fires the reset) +- No backend changes — `settings_reset_defaults` command is unchanged + +## Capabilities + +### New Capabilities + +*(none — this is a UI reorganization, no new capability is introduced)* + +### Modified Capabilities + +- `settings`: The reset-to-defaults interaction moves from the Timer section to the About section; the confirmation pattern changes from no-confirmation to inline two-step. + +## Impact + +- `src/lib/components/settings/sections/TimerSection.svelte`: remove `resetSettings` import, `handleReset()` function, and reset button row +- `src/lib/components/settings/sections/AboutSection.svelte`: add `resetSettings` import, `$state` for confirmation mode, inline two-step reset row +- `src/lib/ipc/index.ts`: no changes (wrapper already exists) +- `src-tauri/`: no changes +- Localization: new i18n keys needed for reset row label and confirmation prompt diff --git a/openspec/changes/archive/2026-02-27-organize-default-reset/specs/settings/spec.md b/openspec/changes/archive/2026-02-27-organize-default-reset/specs/settings/spec.md new file mode 100644 index 0000000..4fe8c02 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-organize-default-reset/specs/settings/spec.md @@ -0,0 +1,24 @@ +## MODIFIED Requirements + +### Requirement: Reset to factory defaults via Settings → About +The system SHALL provide a "Reset All Settings" action in Settings → About. The action SHALL use an inline two-step confirmation: the first interaction reveals a confirmation prompt with Cancel and Reset controls; only the second (Reset) interaction fires `settings_reset_defaults`. Cancelling at any point SHALL restore the original button without performing a reset. The action resets all settings globally (all 26 keys) to factory defaults. + +#### Scenario: Reset button is visible in About section +- **WHEN** the user navigates to Settings → About +- **THEN** a "Reset All Settings" row SHALL be visible below the navigation links + +#### Scenario: First click enters confirmation state +- **WHEN** the user clicks "Reset All Settings" +- **THEN** the row SHALL replace the button with a confirmation prompt and Cancel / Reset buttons + +#### Scenario: Cancel dismisses confirmation without resetting +- **WHEN** the user clicks Cancel in the confirmation state +- **THEN** the row SHALL return to the initial "Reset All Settings" button and no settings SHALL be changed + +#### Scenario: Confirm fires global reset +- **WHEN** the user clicks Reset in the confirmation state +- **THEN** `settings_reset_defaults` SHALL be invoked, all settings SHALL revert to factory defaults, and the row SHALL return to the initial button + +#### Scenario: Reset no longer available in Timer section +- **WHEN** the user navigates to Settings → Timer +- **THEN** no reset button SHALL be present in that section diff --git a/openspec/changes/archive/2026-02-27-organize-default-reset/tasks.md b/openspec/changes/archive/2026-02-27-organize-default-reset/tasks.md new file mode 100644 index 0000000..ac70de4 --- /dev/null +++ b/openspec/changes/archive/2026-02-27-organize-default-reset/tasks.md @@ -0,0 +1,35 @@ +## 1. Timer Section Cleanup + +- [x] 1.1 In `TimerSection.svelte`, remove `resetSettings` from the `'$lib/ipc'` import +- [x] 1.2 Remove the `handleReset()` async function +- [x] 1.3 Remove the `.reset-row` div and its `reset-btn` button from the template +- [x] 1.4 Remove the `.reset-row` and `.reset-btn` CSS rules (and `.reset-btn:hover`) + +## 2. Localization Keys + +- [x] 2.1 In `messages/en.json`, add `about_reset_all` ("Reset All Settings") and `about_reset_confirm` ("Are you sure? This will reset all settings to defaults.") +- [x] 2.2 Add the same two keys to `messages/es.json`, `messages/fr.json`, `messages/de.json`, `messages/ja.json` (use equivalent translations) + +## 3. About Section — Reset UI + +- [x] 3.1 In `AboutSection.svelte`, add `resetSettings` to the `'$lib/ipc'` import +- [x] 3.2 Add `import { settings } from '$lib/stores/settings'` +- [x] 3.3 Declare `let confirming = $state(false)` +- [x] 3.4 Add a `handleReset()` async function: calls `resetSettings()`, sets `settings.set(updated)`, resets `confirming = false` +- [x] 3.5 Add the reset row to the template below the links group: when `!confirming` show a single button calling `() => (confirming = true)`; when `confirming` show the confirmation prompt with Cancel (`() => (confirming = false)`) and Reset (`handleReset`) buttons +- [x] 3.6 Style the reset row: use `.link-row` base pattern; initial button muted (`--color-foreground-darker`); confirmation Reset button uses `--color-accent` or a danger-adjacent color; Cancel is neutral + +## 4. Audio Reset (oversight fix) + +- [x] 4.1 In `settings_reset_defaults`, walk `{app_data_dir}/audio/` and delete files matching the three custom stems +- [x] 4.2 Clear all three slots in `AudioManager`'s in-memory `custom_paths` on reset +- [x] 4.3 In `NotificationsSection.svelte`, extract `refreshAudioInfo()` and subscribe to `onSettingsChanged` so audio state refreshes after reset without restart + +## 5. Verification + +- [x] 5.1 Run `npm run check` — no type errors +- [x] 5.2 Run `cargo check` — no errors +- [x] 5.3 Confirm no reset button in Timer section +- [x] 5.4 In About section: click "Reset All Settings" — row switches to confirmation state +- [x] 5.5 Click Cancel — row returns to initial button, no settings changed +- [x] 5.6 Click "Reset All Settings" then Reset — all settings revert to defaults diff --git a/openspec/changes/archive/2026-02-28-macos-shortcuts/.openspec.yaml b/openspec/changes/archive/2026-02-28-macos-shortcuts/.openspec.yaml new file mode 100644 index 0000000..34b5b23 --- /dev/null +++ b/openspec/changes/archive/2026-02-28-macos-shortcuts/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-02-28 diff --git a/openspec/changes/archive/2026-02-28-macos-shortcuts/design.md b/openspec/changes/archive/2026-02-28-macos-shortcuts/design.md new file mode 100644 index 0000000..e7411bb --- /dev/null +++ b/openspec/changes/archive/2026-02-28-macos-shortcuts/design.md @@ -0,0 +1,52 @@ +## Context + +Global shortcuts use `tauri-plugin-global-shortcut`, which registers OS-level hotkeys. On macOS, the OS silently drops all global key events unless the app has been granted Accessibility access in System Settings → Privacy & Security → Accessibility. Additionally, the existing defaults (`Control+F1–F4`) map to media/system keys on Mac keyboards and use the wrong modifier convention (`Control` instead of `Command`). + +The settings shortcut defaults are seeded via `INSERT OR IGNORE` in `seed_defaults()` (`src-tauri/src/settings/defaults.rs` + `mod.rs`). Since the INSERT is idempotent (first-write wins), macOS-specific values can be injected before the cross-platform defaults are applied without any schema changes. + +## Goals / Non-Goals + +**Goals:** +- Seed `Command+Shift+1–4` as default shortcuts on macOS for new installs +- Expose a Rust IPC command that returns macOS Accessibility trust status +- Show a dismissing notice in ShortcutsSection when Accessibility is not granted +- Re-check trust on settings window focus so the notice disappears automatically once access is granted + +**Non-Goals:** +- Automatically requesting Accessibility permission (macOS doesn't allow programmatic prompts) +- Changing shortcuts for existing macOS installs that have already saved preferences +- Modifying shortcut behavior on Windows or Linux + +## Decisions + +### Decision 1: Platform-aware seeding via pre-insertion, not branched DEFAULTS + +**Chosen:** Insert macOS shortcut rows first (before the main `DEFAULTS` loop) using `#[cfg(target_os = "macos")]`. Since `seed_defaults` uses `INSERT OR IGNORE`, these rows win on first launch and the general defaults are skipped for those keys. + +**Alternative considered:** Maintain separate `DEFAULTS` and `MACOS_DEFAULTS` const arrays. Rejected — more code duplication, still needs the same `#[cfg]` guard, less clear intent. + +**Alternative considered:** Runtime `cfg!()` macro inside a single loop. Rejected — const arrays can't be conditionally sliced cleanly at runtime; compile-time `#[cfg]` is the idiomatic Rust approach. + +### Decision 2: `AXIsProcessTrusted` via `extern "C"` linkage + +**Chosen:** Declare `AXIsProcessTrusted()` via `extern "C"` with `#[link(name = "ApplicationServices", kind = "framework")]`. Returns `bool` directly, no args. Wrapped in a `#[cfg(target_os = "macos")]` block; other platforms return `true` unconditionally. + +**Alternative considered:** `accessibility` crate. Rejected — adds a dependency for a single function call that's trivially bindable. + +**Alternative considered:** Running a shell command to check. Rejected — fragile, slow, wrong abstraction. + +### Decision 3: Re-check on window focus, not polling + +**Chosen:** In `ShortcutsSection.svelte`, when `trusted` is `false`, attach a `visibilitychange` / `focus` listener on the settings window that re-calls `accessibilityTrusted()`. Remove the listener once `trusted` becomes `true`. + +**Alternative considered:** Periodic `setInterval` poll. Rejected — wastes IPC cycles when settings window isn't even open. + +### Decision 4: Notice placement — top of ShortcutsSection, macOS-only + +The notice renders conditionally: only on macOS (detected via the existing `isMac` platform utility) and only when `trusted === false`. It shows above the shortcut rows with a direct deep-link to System Settings using `tauri-plugin-opener`. + +## Risks / Trade-offs + +- **AXIsProcessTrusted linkage on non-macOS builds**: The `extern "C"` block is `#[cfg(target_os = "macos")]` so it compiles out entirely on Windows/Linux. Linux and Windows CI builds are unaffected. +- **Existing macOS users with Ctrl+F1–F4 saved**: The `INSERT OR IGNORE` seeding only applies on first launch. Existing users who already have rows in the DB keep their current (broken) shortcuts. They can manually update them in Settings → Shortcuts. This is intentional — we don't clobber saved preferences. +- **macOS Sequoia permission UX**: Apple has moved some privacy panes in recent macOS versions. The deep-link URL `x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility` works on Ventura/Sonoma/Sequoia but Apple could change it. Low risk for now. diff --git a/openspec/changes/archive/2026-02-28-macos-shortcuts/proposal.md b/openspec/changes/archive/2026-02-28-macos-shortcuts/proposal.md new file mode 100644 index 0000000..c2b194e --- /dev/null +++ b/openspec/changes/archive/2026-02-28-macos-shortcuts/proposal.md @@ -0,0 +1,28 @@ +## Why + +Global keyboard shortcuts are silently non-functional on macOS due to two compounding issues: the OS requires explicit Accessibility permission before any app can receive global key events, and the default shortcuts (`Control+F1–F4`) conflict with macOS media keys and system conventions. Users on macOS have no working shortcuts and no indication of why. + +## What Changes + +- Seed macOS-specific default shortcuts (`Command+Shift+1–4`) instead of `Control+F1–F4` on first launch +- Add a Rust IPC command that queries macOS Accessibility trust status (`AXIsProcessTrusted`) +- Show a contextual notice in the Shortcuts settings section on macOS when Accessibility access is not granted, with a direct link to open System Settings +- Re-check trust status whenever the settings window regains focus (so the notice dismisses automatically once the user grants access) + +## Capabilities + +### New Capabilities +- `macos-shortcuts`: macOS-specific shortcut defaults and Accessibility permission detection/guidance + +### Modified Capabilities +- `shortcuts`: Default shortcut values are now platform-aware (macOS gets `Command+Shift+1–4`) + +## Impact + +- `src-tauri/src/settings/defaults.rs` — macOS shortcut default values +- `src-tauri/src/settings/mod.rs` — platform-aware seeding in `seed_defaults()` +- `src-tauri/src/commands.rs` — new `accessibility_trusted()` command (macOS: `AXIsProcessTrusted`; other platforms: returns `true`) +- `src-tauri/src/lib.rs` — register new command +- `src/lib/ipc/index.ts` — `accessibilityTrusted()` TypeScript wrapper +- `src/lib/components/settings/sections/ShortcutsSection.svelte` — permission notice banner, focus re-check +- `messages/*.json` (all 7 locales) — 2–3 new i18n keys for the notice text diff --git a/openspec/changes/archive/2026-02-28-macos-shortcuts/specs/macos-shortcuts/spec.md b/openspec/changes/archive/2026-02-28-macos-shortcuts/specs/macos-shortcuts/spec.md new file mode 100644 index 0000000..045805f --- /dev/null +++ b/openspec/changes/archive/2026-02-28-macos-shortcuts/specs/macos-shortcuts/spec.md @@ -0,0 +1,44 @@ +## ADDED Requirements + +### Requirement: macOS Accessibility permission detection +On macOS, the system SHALL expose an IPC command `accessibility_trusted` that returns a boolean indicating whether the application has been granted Accessibility access by the operating system. On all other platforms the command SHALL return `true` unconditionally. + +#### Scenario: Accessibility not granted on macOS +- **WHEN** the app has not been granted Accessibility access in macOS System Settings +- **THEN** `accessibility_trusted` SHALL return `false` + +#### Scenario: Accessibility granted on macOS +- **WHEN** the app has been granted Accessibility access in macOS System Settings +- **THEN** `accessibility_trusted` SHALL return `true` + +#### Scenario: Non-macOS platform +- **WHEN** `accessibility_trusted` is called on Windows or Linux +- **THEN** it SHALL return `true` + +### Requirement: Accessibility permission notice in Shortcuts settings +On macOS, when Accessibility access is not granted, the system SHALL display a notice at the top of the Shortcuts settings section informing the user that global shortcuts require Accessibility access, and providing a button that opens the relevant macOS System Settings pane directly. + +#### Scenario: Notice shown when not trusted +- **WHEN** the user opens the Shortcuts section on macOS +- **AND** Accessibility access has not been granted +- **THEN** a notice SHALL be displayed above the shortcut inputs explaining the requirement + +#### Scenario: Notice includes action link +- **WHEN** the notice is visible +- **THEN** it SHALL contain a control that opens System Settings → Privacy & Security → Accessibility when activated + +#### Scenario: Notice absent when trusted +- **WHEN** Accessibility access has been granted +- **THEN** no notice SHALL be shown and the Shortcuts section SHALL display normally + +#### Scenario: Notice absent on non-macOS +- **WHEN** the app is running on Windows or Linux +- **THEN** no Accessibility notice SHALL appear in the Shortcuts section + +### Requirement: Accessibility status re-checked on window focus +When Accessibility access has not yet been granted, the system SHALL re-check trust status each time the settings window regains focus, and SHALL automatically dismiss the notice once access is confirmed. + +#### Scenario: Notice dismisses after access granted +- **WHEN** the user grants Accessibility access in System Settings +- **AND** returns focus to the Pomotroid settings window +- **THEN** the notice SHALL disappear without requiring a restart or manual refresh diff --git a/openspec/changes/archive/2026-02-28-macos-shortcuts/specs/shortcuts/spec.md b/openspec/changes/archive/2026-02-28-macos-shortcuts/specs/shortcuts/spec.md new file mode 100644 index 0000000..ba0dc51 --- /dev/null +++ b/openspec/changes/archive/2026-02-28-macos-shortcuts/specs/shortcuts/spec.md @@ -0,0 +1,18 @@ +## MODIFIED Requirements + +### Requirement: Platform-aware default shortcut bindings +The system SHALL seed shortcut defaults that are appropriate for the host operating system. On macOS, defaults SHALL use the `Command+Shift` modifier with digit keys (`1`–`4`) to avoid conflicts with macOS media keys and follow platform conventions. On Windows and Linux, defaults SHALL use `Control+F1`–`F4`. + +#### Scenario: macOS first launch shortcut defaults +- **WHEN** the application is launched for the first time on macOS +- **AND** no shortcut preferences have been saved +- **THEN** the default shortcuts SHALL be `Command+Shift+1` (toggle), `Command+Shift+2` (reset), `Command+Shift+3` (skip), `Command+Shift+4` (restart round) + +#### Scenario: Windows/Linux first launch shortcut defaults +- **WHEN** the application is launched for the first time on Windows or Linux +- **AND** no shortcut preferences have been saved +- **THEN** the default shortcuts SHALL be `Control+F1` (toggle), `Control+F2` (reset), `Control+F3` (skip), `Control+F4` (restart round) + +#### Scenario: Existing preferences preserved +- **WHEN** the application launches and shortcut preferences already exist in the database +- **THEN** the existing saved shortcuts SHALL be used regardless of platform diff --git a/openspec/changes/archive/2026-02-28-macos-shortcuts/tasks.md b/openspec/changes/archive/2026-02-28-macos-shortcuts/tasks.md new file mode 100644 index 0000000..449ee84 --- /dev/null +++ b/openspec/changes/archive/2026-02-28-macos-shortcuts/tasks.md @@ -0,0 +1,30 @@ +## 1. macOS Default Shortcuts + +- [x] 1.1 In `src-tauri/src/settings/defaults.rs`, remove the four `shortcut_*` entries from the `DEFAULTS` const (they will be seeded by platform-specific logic) +- [x] 1.2 In `src-tauri/src/settings/mod.rs`, update `seed_defaults()` to insert macOS shortcut defaults (`Super+Shift+1–4`) via `#[cfg(target_os = "macos")]` before falling through to the main `DEFAULTS` loop +- [x] 1.3 Add the `shortcut_*` keys back to the non-macOS path (inside `#[cfg(not(target_os = "macos"))]`) so Windows/Linux still seed `Control+F1–F4` +- [x] 1.4 Update `Settings::default()` in `mod.rs` to use `Super+Shift+1` etc. on macOS (used as fallback when DB load fails) +- [x] 1.5 Update the `seed_defaults` unit tests to assert macOS defaults on macOS and Ctrl+F-key defaults otherwise (or mark them `#[cfg]`) + +## 2. Accessibility Trusted IPC Command + +- [x] 2.1 In `src-tauri/src/commands.rs`, add `accessibility_trusted()` command: on macOS, declare `extern "C" { fn AXIsProcessTrusted() -> bool; }` with `#[link(name = "ApplicationServices", kind = "framework")]` inside a `#[cfg(target_os = "macos")]` block and call it; on other platforms return `true` +- [x] 2.2 Register `accessibility_trusted` in the `invoke_handler` in `src-tauri/src/lib.rs` +- [x] 2.3 Add `accessibilityTrusted(): Promise` wrapper to `src/lib/ipc/index.ts` + +## 3. Shortcuts Section Notice (Frontend) + +- [x] 3.1 Add i18n keys to all 7 locale files (`en`, `es`, `fr`, `de`, `ja`, `zh`, `pt`): `shortcuts_accessibility_notice` (explanatory text) and `shortcuts_accessibility_open` (button label) +- [x] 3.2 In `ShortcutsSection.svelte`, add `let trusted = $state(true)` and call `accessibilityTrusted()` in an async init block on mount (macOS only via `isMac`) +- [x] 3.3 Add a `visibilitychange` / window `focus` event listener that re-calls `accessibilityTrusted()` when `trusted` is `false`; unlisten once `trusted` becomes `true` +- [x] 3.4 Render the notice banner above the shortcut rows when `isMac && !trusted`: include the explanatory text and an "Open Settings" button that calls `openUrl('x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility')` via `tauri-plugin-opener` +- [x] 3.5 Style the notice banner (warning color, subtle border, compact layout) + +## 4. Verification + +- [x] 4.1 Run `npm run check` — 0 errors +- [x] 4.2 Run `cargo test` in `src-tauri/` — all tests pass +- [x] 4.3 (macOS) Fresh install: confirm shortcuts default to `⌘⇧1–4` +- [x] 4.4 (macOS, no Accessibility) Open Settings → Shortcuts: notice is visible with working "Open Settings" link +- [x] 4.5 (macOS) Grant Accessibility access, return to settings window: notice dismisses automatically +- [x] 4.6 (macOS, Accessibility granted) Confirm `⌘⇧1` toggles the timer globally diff --git a/openspec/changes/archive/2026-03-01-statistics-visualization/.openspec.yaml b/openspec/changes/archive/2026-03-01-statistics-visualization/.openspec.yaml new file mode 100644 index 0000000..0b4defe --- /dev/null +++ b/openspec/changes/archive/2026-03-01-statistics-visualization/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-03-01 diff --git a/openspec/changes/archive/2026-03-01-statistics-visualization/design.md b/openspec/changes/archive/2026-03-01-statistics-visualization/design.md new file mode 100644 index 0000000..c2e5d7c --- /dev/null +++ b/openspec/changes/archive/2026-03-01-statistics-visualization/design.md @@ -0,0 +1,81 @@ +## Context + +The sessions table (schema v1) already records every round with `started_at`, `ended_at`, `round_type`, `duration_secs`, and `completed`. Two commands (`stats_get_all_time`, `stats_get_session`) exist but are minimal — they power no UI today. The settings window pattern (a `WebviewWindow` opened from `Titlebar.svelte`, sharing the capabilities file and CSS theme) is the model for the statistics window. + +## Goals / Non-Goals + +**Goals:** +- Dedicated statistics window with three tabs: Today, This Week, All Time +- Today tab: stat cards (rounds, focus time, completion rate) + hourly session timeline +- This Week tab: per-day bar chart (7 days) + current streak counter +- All Time tab: 52-week heatmap grid + lifetime totals + longest streak +- Stats button in the main titlebar (left side, alongside settings icon on Linux/Windows; right side on macOS) +- All charts rendered as pure SVG — no external library dependencies +- Streak active until midnight: yesterday's streak is preserved until end of the current day +- Heatmap uses a fixed 4-level intensity scale (0 / 1–3 / 4–7 / 8+) mapped to theme colors + +**Non-Goals:** +- Editing or deleting session history +- Export to CSV/JSON +- Per-project or tag-based tracking +- Push notifications or reminders based on stats + +## Decisions + +### 1. Window architecture: dedicated `WebviewWindow` at `/stats` + +**Decision**: Third Tauri `WebviewWindow` (label `"stats"`, url `"/stats"`), following the same pattern as the settings window. + +**Rationale**: Stats is a distinct view with its own lifecycle — it can be open while the timer is running without interfering. Re-using the settings window (e.g., adding a Stats section) would embed a wide heatmap inside a fixed 720px sidebar layout and mix concerns. + +**Alternative considered**: Settings section — rejected because the heatmap needs ~800px width and stats is not a setting. + +### 2. No external charting library + +**Decision**: All charts (bar chart, heatmap) are rendered with pure inline SVG computed from data in Svelte components. + +**Rationale**: The app has no existing chart dependency. The two chart types needed (bar chart, calendar grid) are geometrically trivial — a bar chart is rectangles, a heatmap is a grid of `` elements. Adding a library (Chart.js, D3, etc.) would add ~200–500 KB and complicate theming. Pure SVG reads from CSS custom properties naturally. + +**Alternative considered**: D3.js — rejected (overkill, bundle size, theming complexity). + +### 3. Timezone: SQLite `'localtime'` modifier + +**Decision**: All per-day grouping uses `date(started_at, 'unixepoch', 'localtime')` rather than UTC. + +**Rationale**: A session at 11 PM local time in Tokyo is `started_at` in UTC the following day. Grouping by UTC date produces wrong daily totals for users outside UTC. SQLite's built-in `'localtime'` modifier uses the OS timezone, matching what the user sees on their clock. + +**Alternative considered**: Storing local date alongside unix timestamp — rejected (redundant, requires migration, locale changes would corrupt historical data). + +### 4. Streak computation: Rust, not SQL + +**Decision**: Fetch per-day counts from SQLite (`get_heatmap_data` returns all days with at least 1 completed work session), then compute current and longest streaks in Rust by walking the sorted date list. + +**Rationale**: A recursive SQL CTE for streaks is possible but fragile and hard to test. Walking a `Vec` in Rust is straightforward, unit-testable, and handles the "until midnight" grace period cleanly (if today has no sessions, check whether yesterday had sessions — if yes, streak is still alive). + +**Alternative considered**: SQL recursive CTE — rejected (complex, hard to test, timezone-sensitive). + +### 5. Heatmap intensity scale: fixed 4-level + +**Decision**: 0 rounds → level 0 (empty); 1–3 → level 1; 4–7 → level 2; 8+ → level 3. Colors derived from `--color-focus-round` at varying opacity via `color-mix(in oklch, var(--color-focus-round) N%, var(--color-background))`. + +**Rationale**: A fixed scale is predictable and immediately legible (the user always knows what "full" looks like). A relative scale (max = personal best) would shift meaning as data grows. + +**Alternative considered**: Relative-to-max scale — deferred to a future iteration. + +### 6. IPC shape: two new commands + +**Decision**: +- `stats_get_detailed` → `{ today: DailyStats, week: Vec, streak: StreakInfo }` — batched to minimize round-trips for the common case (Today + This Week tabs) +- `stats_get_heatmap` → `Vec` — separate command since it queries a full year of data and is only needed for the All Time tab + +**Rationale**: Batching daily + weekly into one call avoids two sequential async invocations on tab switch. Heatmap is separated because it's heavier and only needed on demand. + +## Risks / Trade-offs + +- **SQLite `'localtime'` accuracy**: The OS timezone is used at query time, not at session-recording time. If a user changes their timezone while the app is open, historical grouping could shift. This is an acceptable edge case — the data itself (unix timestamps) is always correct; only the day-grouping presentation changes. +- **Heatmap width**: 52 weeks × (cell + gap) requires ~800px. Window is set to 820×540. If the OS scales the window differently (HiDPI), the grid may overflow. Mitigation: use `overflow-x: auto` on the heatmap container. +- **Empty state**: New users will see mostly empty charts. Each view needs a graceful empty state rather than showing a blank SVG grid. + +## Open Questions + +_None — all decisions resolved during explore phase._ diff --git a/openspec/changes/archive/2026-03-01-statistics-visualization/proposal.md b/openspec/changes/archive/2026-03-01-statistics-visualization/proposal.md new file mode 100644 index 0000000..3dfc994 --- /dev/null +++ b/openspec/changes/archive/2026-03-01-statistics-visualization/proposal.md @@ -0,0 +1,32 @@ +## Why + +Pomotroid already captures session data (round type, duration, completion) to SQLite on every round, but there is no UI to surface it. Users have no way to see how productive they've been — today, this week, or historically. Adding a dedicated Statistics window gives that data a home and makes Pomotroid meaningfully more useful as a focus tool. + +## What Changes + +- Add a **Statistics window** (third `WebviewWindow`, route `/stats`) accessible via a new chart icon in the main window titlebar +- Expose three **new Rust query functions** for daily, weekly, and yearly (heatmap) data, plus streak computation +- Add two **new Tauri commands**: `stats_get_detailed` (daily + weekly + streak) and `stats_get_heatmap` (52-week per-day counts) +- Add `stats` to the capability windows list so it inherits the shared permissions + +## Capabilities + +### New Capabilities + +- `statistics`: Dedicated stats window with three tabs — Today (stat cards + hourly breakdown), This Week (daily bar chart + streak), All Time (annual heatmap + lifetime totals) + +### Modified Capabilities + +- `shortcuts`: No change to requirements — `shortcuts` window entry point pattern is being reused as a model (not a behavioral change) + +## Impact + +- **`src-tauri/src/db/queries.rs`**: New query functions (`get_daily_stats`, `get_weekly_stats`, `get_heatmap_data`, `get_streak`) +- **`src-tauri/src/commands.rs`**: Two new commands (`stats_get_detailed`, `stats_get_heatmap`) +- **`src-tauri/src/lib.rs`**: Register new commands in `generate_handler!` +- **`src-tauri/capabilities/default.json`**: Add `"stats"` to `windows` array +- **`src/lib/ipc/index.ts`**: Two new typed invoke wrappers +- **`src/routes/stats/+page.svelte`**: New stats route (full page with tabs) +- **`src/lib/components/stats/`**: New component directory — `DailyView.svelte`, `WeeklyView.svelte`, `YearlyView.svelte`, `StatCard.svelte`, `HeatmapGrid.svelte` +- **`src/lib/components/Titlebar.svelte`**: Add stats button alongside existing settings button +- No new npm dependencies — charts implemented as pure SVG, adapting to CSS custom properties diff --git a/openspec/changes/archive/2026-03-01-statistics-visualization/specs/statistics/spec.md b/openspec/changes/archive/2026-03-01-statistics-visualization/specs/statistics/spec.md new file mode 100644 index 0000000..d5fbfa4 --- /dev/null +++ b/openspec/changes/archive/2026-03-01-statistics-visualization/specs/statistics/spec.md @@ -0,0 +1,118 @@ +## ADDED Requirements + +### Requirement: Statistics window accessible from main titlebar +The system SHALL provide a chart/stats icon button in the main window titlebar. Activating it SHALL open a dedicated statistics window (Tauri `WebviewWindow`, label `"stats"`, route `/stats`). If the window is already open, it SHALL be focused rather than opened a second time. The window SHALL be non-resizable, decoration-free on Linux/Windows (matching settings window behavior), and sized at approximately 820×540. + +#### Scenario: Opening stats window for the first time +- **WHEN** the user clicks the stats icon in the main titlebar +- **THEN** a new statistics window opens at the `/stats` route + +#### Scenario: Stats window already open +- **WHEN** the user clicks the stats icon while the statistics window is already open +- **THEN** the existing window is focused (no duplicate window created) + +#### Scenario: Theme applied to stats window +- **WHEN** the statistics window opens +- **THEN** it applies the same active theme as the main window via CSS custom properties + +--- + +### Requirement: Three-tab navigation within the statistics window +The statistics window SHALL display three tabs: **Today**, **This Week**, and **All Time**. The default active tab SHALL be **Today**. Switching tabs SHALL load the corresponding data view without reopening the window. + +#### Scenario: Default tab on open +- **WHEN** the statistics window is first opened +- **THEN** the Today tab is active and Today data is displayed + +#### Scenario: Switching tabs +- **WHEN** the user clicks a tab +- **THEN** the corresponding view is rendered with its data + +--- + +### Requirement: Today tab — stat cards +The Today tab SHALL display three summary stat cards: +1. **Rounds** — count of completed work sessions today (local date) +2. **Focus Time** — total minutes of completed work sessions today, formatted as `Xh Ym` (hours and minutes) +3. **Completion Rate** — percentage of started work sessions that were completed today, shown as `N%` + +#### Scenario: Day with sessions +- **WHEN** the user has completed work sessions today +- **THEN** all three stat cards reflect today's accurate counts + +#### Scenario: No sessions today +- **WHEN** no sessions have been recorded today +- **THEN** cards show `0` / `0h 0m` / `—` (completion rate shown as dash when no sessions started) + +--- + +### Requirement: Today tab — hourly timeline +The Today tab SHALL display an hourly breakdown of sessions across the 24-hour day as a bar chart, where bar height represents the number of completed work rounds in that hour. Hours with no sessions SHALL render as a minimal baseline (not zero-height bars that are invisible). + +#### Scenario: Sessions at various hours +- **WHEN** the user has sessions at multiple hours of the day +- **THEN** bars are taller for hours with more sessions + +#### Scenario: Empty day +- **WHEN** no sessions exist for today +- **THEN** all bars appear at minimal height with an empty-state label + +--- + +### Requirement: This Week tab — daily bar chart +The This Week tab SHALL display a bar chart of completed work rounds for each of the last 7 calendar days (local date), with day labels (Mon–Sun or equivalent). The bar for today SHALL be visually distinguished (e.g., accent color or highlight). + +#### Scenario: Week with mixed activity +- **WHEN** some days have sessions and others do not +- **THEN** bars reflect per-day completed round counts; empty days show zero-height bars + +#### Scenario: Today's bar +- **WHEN** viewing the weekly chart +- **THEN** today's bar is visually distinct from past days + +--- + +### Requirement: This Week tab — streak counter +The This Week tab SHALL display the **current streak**: the number of consecutive calendar days (local date) ending today or yesterday on which the user completed at least one work session. A streak SHALL remain active until midnight of the current day — if yesterday had sessions but today does not yet, the streak is still displayed as active. + +#### Scenario: Active streak including yesterday +- **WHEN** the user completed sessions yesterday but not yet today +- **THEN** the streak counter shows the consecutive-day count including yesterday (streak still live) + +#### Scenario: Active streak including today +- **WHEN** the user has completed at least one session today +- **THEN** today is included in the streak count + +#### Scenario: Streak broken +- **WHEN** neither today nor yesterday has a completed session +- **THEN** streak counter shows 0 + +--- + +### Requirement: All Time tab — annual heatmap +The All Time tab SHALL display a 52-week × 7-day heatmap grid (GitHub contribution graph style) where each cell represents one calendar day. Cell color intensity SHALL reflect the number of completed work rounds on that day using a fixed 4-level scale: 0 rounds (background), 1–3 (level 1), 4–7 (level 2), 8+ (level 3). Colors SHALL be derived from the active theme's `--color-focus-round` at varying opacity levels blended into `--color-background`. + +#### Scenario: Day with high round count +- **WHEN** a day has 8 or more completed work rounds +- **THEN** its cell displays at maximum intensity (level 3) + +#### Scenario: Day with no rounds +- **WHEN** a day has no completed work rounds +- **THEN** its cell displays at background intensity (level 0, visually empty) + +#### Scenario: Theme change while stats window is open +- **WHEN** the active theme changes while the stats window is open +- **THEN** heatmap cell colors update to reflect the new theme colors + +--- + +### Requirement: All Time tab — lifetime totals +The All Time tab SHALL display total lifetime stats: total completed work rounds, total focus time (formatted as hours), and longest streak ever recorded. + +#### Scenario: All-time data display +- **WHEN** the user opens the All Time tab +- **THEN** lifetime totals are shown accurately derived from the full sessions table + +#### Scenario: First launch (empty database) +- **WHEN** no sessions exist in the database +- **THEN** all totals show zero values with an appropriate empty state message diff --git a/openspec/changes/archive/2026-03-01-statistics-visualization/tasks.md b/openspec/changes/archive/2026-03-01-statistics-visualization/tasks.md new file mode 100644 index 0000000..cb9f841 --- /dev/null +++ b/openspec/changes/archive/2026-03-01-statistics-visualization/tasks.md @@ -0,0 +1,53 @@ +## 1. Rust — Data Layer + +- [x] 1.1 Add `get_daily_stats(conn)` query in `queries.rs` — returns rounds, minutes, completion rate, and per-hour counts (today resolved internally via SQLite `date('now', 'localtime')`) +- [x] 1.2 Add `get_weekly_stats(conn)` query — returns `Vec` for the last 7 local calendar days (date string + completed round count) +- [x] 1.3 Add `get_heatmap_data(conn)` query — returns `Vec` (date string + count) for all days with at least 1 completed work session, all-time (no date limit; frontend paginates by year) +- [x] 1.4 Add `compute_streak(days: &[String]) -> StreakInfo` function in Rust — takes sorted list of "YYYY-MM-DD" date strings, returns `{ current: u32, longest: u32 }` applying the "active until midnight" rule; uses custom day-number arithmetic (no chrono dependency) +- [x] 1.5 Add unit tests for `compute_streak` covering: active streak with no session today, active streak with session today, broken streak, longest-streak tracking + +## 2. Rust — Commands + +- [x] 2.1 Add `stats_get_detailed` command in `commands.rs` — queries daily stats + weekly stats + streak, returns combined struct `DetailedStats { today: DailyStats, week: Vec, streak: StreakInfo }` +- [x] 2.2 Add `stats_get_heatmap` command in `commands.rs` — calls `get_heatmap_data` and returns `Vec` plus lifetime totals (total rounds, total hours, longest streak) +- [x] 2.3 Register both commands in `generate_handler!` in `lib.rs` + +## 3. Config & IPC + +- [x] 3.1 Add `"stats"` to the `windows` array in `capabilities/default.json` +- [x] 3.2 Add `statsGetDetailed()` and `statsGetHeatmap()` typed invoke wrappers in `src/lib/ipc/index.ts` +- [x] 3.3 Add corresponding TypeScript types for `DetailedStats`, `DailyStats`, `DayStat`, `StreakInfo`, `HeatmapEntry`, `HeatmapStats` in `src/lib/types.ts` + +## 4. Titlebar Entry Point + +- [x] 4.1 Add `openStats()` function to `Titlebar.svelte` — mirrors `openSettings()` pattern (get-by-label, focus if exists, else create new `WebviewWindow('stats', { url: '/stats', width: 840, height: 520, resizable: false, decorations: isMac })`) +- [x] 4.2 Add stats icon button (bar-chart SVG) to the titlebar alongside the settings button — left side on Linux/Windows, right side on macOS + +## 5. Stats Window — Shell + +- [x] 5.1 Create `src/routes/stats/+page.svelte` — full page shell with theme initialization (same `onMount` pattern as settings page), three-tab nav (Today / This Week / All Time), default tab = Today +- [x] 5.2 Stats-specific titlebar with window title and close button, inline in `+page.svelte` + +## 6. Frontend — Today Tab + +- [x] 6.1 ~~Create `src/lib/components/stats/StatCard.svelte`~~ — dropped; stat cards implemented inline in `DailyView.svelte` (no reuse elsewhere) +- [x] 6.2 Create `src/lib/components/stats/DailyView.svelte` — three inline stat cards (Rounds, Focus Time, Completion Rate) + hourly bar chart SVG (24 bars, each bar = rounds in that hour); include empty state when no data +- [x] 6.3 Wire `statsGetDetailed` IPC call in the stats page; pass `today` data to `DailyView` + +## 7. Frontend — This Week Tab + +- [x] 7.1 Create `src/lib/components/stats/WeeklyView.svelte` — 7-bar SVG bar chart (one bar per day, today's bar highlighted with `--color-focus-round`, past days muted); streak counter displayed above chart; include empty state +- [x] 7.2 Wire `week` and `streak` data from `statsGetDetailed` response to `WeeklyView` + +## 8. Frontend — All Time Tab + +- [x] 8.1 ~~Create `src/lib/components/stats/HeatmapGrid.svelte`~~ — dropped; heatmap grid implemented inline in `YearlyView.svelte` (no reuse elsewhere) +- [x] 8.2 Create `src/lib/components/stats/YearlyView.svelte` — inline 52–53 week heatmap grid + year navigation (prev/next) + three lifetime stat cards (Total Rounds, Total Hours, Longest Streak); include empty state for first launch +- [x] 8.3 Wire `statsGetHeatmap` IPC call (load on All Time tab activation); pass data to `YearlyView`; handle `settings:changed` / `themes:changed` events to re-apply theme if received while open + +## 9. Polish & Verification + +- [x] 9.1 Verify `cargo test` passes (all existing + new streak unit tests) — 60/60 pass +- [x] 9.2 Verify `npm run check` passes (no TypeScript errors in new files) — 0 errors, 0 warnings +- [x] 9.3 Manual smoke test: stats window updates live on round completion via `onRoundChange` (not just on next open); heatmap renders correctly on All Time tab +- [x] 9.4 Verify stats window respects active theme — `onSettingsChanged` and `onThemesChanged` both handled; locale changes also reactive via `setLocale` diff --git a/openspec/config.yaml b/openspec/config.yaml new file mode 100644 index 0000000..3678efe --- /dev/null +++ b/openspec/config.yaml @@ -0,0 +1,58 @@ +schema: spec-driven + +context: | + ## Project: Pomotroid + A Pomodoro timer desktop application. Full rewrite from Electron + Vue 2 → Tauri 2.x + Rust + Svelte 5 + SQLite. + + ## Tech Stack + - **Frontend**: SvelteKit (adapter-static, fallback: index.html), Svelte 5 runes ($state, $derived, $effect) + - **Backend**: Tauri 2, Rust, SQLite via rusqlite + - **Build**: `npm run tauri dev` (dev), `npm run tauri build` (release) + - **Type checking**: `npm run check` (svelte-check) + - **Rust tests**: `cargo test` in src-tauri/ + + ## Architecture + + ### Windows + - `main` — the timer window (src/routes/+page.svelte) + - `settings` — opened programmatically via WebviewWindow from Titlebar.svelte (src/routes/settings/+page.svelte) + - Both windows share the same capabilities and CSS theme + + ### IPC Layer + - All frontend↔backend calls go through src/lib/ipc/index.ts (typed wrappers around invoke/listen) + - Rust commands in src-tauri/src/commands.rs + - Events emitted by Rust: timer:tick, timer:reset, timer:paused, timer:resumed, timer:round-change, settings:changed, themes:changed + + ### Settings + - Stored in SQLite as flat key/value strings (src-tauri/src/settings/) + - DB keys differ from struct field names (e.g. DB `work_rounds` → struct `long_break_interval`) + - DB migration system in src-tauri/src/db/migrations.rs — versioned, transactional + - Frontend store: src/lib/stores/settings.ts; types: src/lib/types.ts (must mirror Rust Settings struct) + - Single settings_set command saves one key at a time and emits settings:changed to all windows + + ### Timer + - Engine runs in a background Rust thread; TimerController is the public API (src-tauri/src/timer/mod.rs) + - SequenceState (src-tauri/src/timer/sequence.rs) tracks round type and count + - TimerEvent::Complete { skipped: bool } — skipped=true for Skip commands, false for natural completion + + ### Theme System + - 18 bundled themes as JSON files; CSS custom properties applied to :root via applyTheme() (src/lib/stores/theme.ts) + - Three-field model: theme_mode (auto/light/dark) + theme_light + theme_dark + - Active theme resolved at runtime via resolveThemeName() (src/lib/utils/theme.ts) + - OS color scheme detected via window.matchMedia('(prefers-color-scheme: dark)') — frontend only, no Rust involvement + - Tray icon colors updated by Rust when theme-related settings change (mode-aware: dark→theme_dark, else→theme_light) + + ### UI Conventions + - Decoration-free window; custom titlebar in Titlebar.svelte + - Settings window: sidebar nav with 6 sections — Timer, Appearance, Notifications, Shortcuts, System, About + - Settings section components in src/lib/components/settings/sections/ + - Compact mode: isCompact = w < 300 || h < 300 — hides footer/label/play-pause, shows only timer dial + - uiScale applied via CSS zoom on .timer div + - Hardcoded colors use CSS custom properties or color-mix(in oklch, ...) — never raw rgba() values + + ## Conventions + - No auto-commit; always ask before committing or pushing + - Svelte 5 runes only — no legacy $: reactive statements or writable stores for component state + - CSS: semantic variables (--color-background, --color-foreground, --color-accent, etc.) for all theme-sensitive colors + - Overlays/borders: color-mix(in oklch, var(--color-foreground) N%, transparent) pattern + - Tauri capabilities in src-tauri/capabilities/default.json — both windows share this file diff --git a/openspec/specs/build-version/spec.md b/openspec/specs/build-version/spec.md new file mode 100644 index 0000000..927d074 --- /dev/null +++ b/openspec/specs/build-version/spec.md @@ -0,0 +1,64 @@ +## ADDED Requirements + +### Requirement: Build version string baked in at compile time +The system SHALL compute a semver-conformant build version string during `cargo build` by invoking `git describe --tags --long --always --dirty` in `build.rs` and emitting the result as the compile-time environment variable `APP_BUILD_VERSION`. The full commit SHA SHALL be emitted separately as `APP_BUILD_SHA` via `git rev-parse HEAD`. + +#### Scenario: Dev build (commits since last tag) +- **WHEN** the binary is compiled from a commit that is N > 0 commits after the most recent tag +- **THEN** `APP_BUILD_VERSION` SHALL be `{base}-dev.{N}+{short-sha}` (e.g. `1.0.0-dev.80+20b2d87`) + +#### Scenario: Release build (on exact tag) +- **WHEN** the binary is compiled from a commit that is exactly at a tag +- **THEN** `APP_BUILD_VERSION` SHALL be `{base}+{short-sha}` (e.g. `1.0.0+20b2d87`) + +#### Scenario: Dirty working tree +- **WHEN** the binary is compiled with uncommitted changes present +- **THEN** `APP_BUILD_VERSION` SHALL include a `.dirty` suffix in the build metadata (e.g. `1.0.0-dev.80+20b2d87.dirty`) + +#### Scenario: No git history or no tags +- **WHEN** `git describe` fails (no git binary, no tags, detached shallow clone) +- **THEN** `APP_BUILD_VERSION` SHALL fall back to `{base}+unknown` where `{base}` is read from `tauri.conf.json` + +#### Scenario: Incremental rebuild after a new commit +- **WHEN** a new commit is made and `cargo build` is run again +- **THEN** the build script SHALL re-execute and produce an updated `APP_BUILD_VERSION` reflecting the new commit + +--- + +### Requirement: Build version exposed via IPC command +The system SHALL provide a Tauri command `app_version` that returns `APP_BUILD_VERSION` as a `&'static str`. This command SHALL be callable by the frontend at any time and returns the compile-time-baked version string. + +#### Scenario: Command returns baked version +- **WHEN** the frontend invokes `app_version` +- **THEN** the response SHALL be the `APP_BUILD_VERSION` string compiled into the binary + +--- + +### Requirement: Build version displayed in Settings → About +The system SHALL display the build version string in Settings → About in place of the previously hardcoded version constant. The displayed string SHALL use the short-SHA form (7 characters). + +#### Scenario: Version displayed on About mount +- **WHEN** the user opens Settings → About +- **THEN** the version line SHALL show the full semver build string (e.g. `1.0.0-dev.80+20b2d87`) + +#### Scenario: Version string is never empty +- **WHEN** `app_version` returns successfully +- **THEN** the About section SHALL display the returned string; if the call fails, it SHALL fall back to displaying the base version from `tauri.conf.json` + +--- + +### Requirement: Full commit SHA logged on startup +The system SHALL log the full 40-character commit SHA (from `APP_BUILD_SHA`) at INFO level during application startup, alongside the build version string. + +#### Scenario: Startup log includes full SHA +- **WHEN** the application starts +- **THEN** the log file SHALL contain an INFO entry with both the build version string and the full commit SHA (e.g. `[app] version=1.0.0-dev.80+20b2d87 sha=20b2d87173870d939002efe84fddff2e944eabd6`) + +--- + +### Requirement: CI workflow fetches full git history +The CI build workflow SHALL use `fetch-depth: 0` on all checkout steps so that `git describe` has access to full tag history and can compute commit distances in CI-produced artifacts. + +#### Scenario: CI artifact carries commit count +- **WHEN** a binary is built in CI from a commit that is N commits after the last tag +- **THEN** the binary's `APP_BUILD_VERSION` SHALL include the commit count N (e.g. `1.0.0-dev.80+abc1234`) diff --git a/openspec/specs/diagnostic-logging/spec.md b/openspec/specs/diagnostic-logging/spec.md new file mode 100644 index 0000000..5c14079 --- /dev/null +++ b/openspec/specs/diagnostic-logging/spec.md @@ -0,0 +1,140 @@ +## ADDED Requirements + +### Requirement: Log file written to OS-conventional directory +The system SHALL write a persistent log file to the platform's conventional application log directory, resolved via `app.path().app_log_dir()` using the app identifier `com.splode.pomotroid`. + +#### Scenario: Log directory on Linux +- **WHEN** Pomotroid runs on Linux +- **THEN** log files are written under `~/.local/share/com.splode.pomotroid/logs/` + +#### Scenario: Log directory on macOS +- **WHEN** Pomotroid runs on macOS +- **THEN** log files are written under `~/Library/Logs/com.splode.pomotroid/` + +#### Scenario: Log directory on Windows +- **WHEN** Pomotroid runs on Windows +- **THEN** log files are written under `%APPDATA%\com.splode.pomotroid\logs\` + +--- + +### Requirement: Log rotation limits disk usage +The system SHALL rotate log files using a 5 MB per-file size limit and SHALL retain at most one archived log file alongside the current file (KeepOne strategy), bounding total log disk usage to approximately 10 MB. + +#### Scenario: File rotates at 5 MB +- **WHEN** the active log file reaches 5 MB +- **THEN** the active file is archived and a new log file is started + +#### Scenario: Only one archive retained +- **WHEN** a rotation occurs and an archived log file already exists +- **THEN** the previous archive is replaced by the newly archived file + +--- + +### Requirement: Default log level captures errors, warnings, and key lifecycle events +The system SHALL default to INFO log level, capturing `error`, `warn`, and `info` messages while suppressing `debug` messages when Verbose Logging is disabled. + +#### Scenario: Error logged at INFO level +- **WHEN** Verbose Logging is disabled and a runtime error occurs +- **THEN** the error is written to the log file + +#### Scenario: Debug suppressed at INFO level +- **WHEN** Verbose Logging is disabled +- **THEN** debug-level messages are not written to the log file + +--- + +### Requirement: Rust panics captured before process termination +The system SHALL install a custom panic hook that writes the panic information to the log file before the process terminates. + +#### Scenario: Panic captured in log +- **WHEN** a Rust panic occurs anywhere in the process +- **THEN** a log entry at ERROR level containing the panic message and location is written to the log file before termination + +--- + +### Requirement: Startup metadata logged +The system SHALL log the following information at INFO level on every startup: application version, resolved app data directory path, and successful database open. + +#### Scenario: Startup info in log +- **WHEN** the application starts successfully +- **THEN** the log contains the app version, data directory path, and a DB open success message + +#### Scenario: DB open failure logged +- **WHEN** the database cannot be opened +- **THEN** the failure is logged at ERROR level before the process exits + +--- + +### Requirement: All Rust error paths instrumented +The system SHALL replace all existing `eprintln!` calls with `log::` macro calls at the appropriate level. Every code path that can produce a `Result::Err` or an unrecoverable condition SHALL emit a log entry. + +#### Scenario: Audio failure logged +- **WHEN** the audio output stream cannot be opened +- **THEN** a WARN-level entry is written (audio is non-fatal) + +#### Scenario: WebSocket bind failure logged +- **WHEN** the WebSocket server fails to bind to its configured port +- **THEN** an ERROR-level entry is written including the address and error detail + +#### Scenario: Shortcut registration failure logged +- **WHEN** a global shortcut cannot be registered +- **THEN** a WARN-level entry is written with the key string and error detail + +#### Scenario: Tray build failure logged +- **WHEN** the system tray icon cannot be built +- **THEN** a WARN-level entry is written with the error detail + +#### Scenario: Theme watcher failure logged +- **WHEN** the file system watcher for custom themes cannot be created or fails +- **THEN** a WARN-level entry is written + +#### Scenario: Notification failure logged +- **WHEN** a desktop notification cannot be sent +- **THEN** a WARN-level entry is written + +#### Scenario: Timer session record failure logged +- **WHEN** writing a completed session to the database fails +- **THEN** an ERROR-level entry is written + +--- + +### Requirement: Major successful operations logged at INFO +The system SHALL emit INFO-level log entries for major lifecycle operations that succeed, including: database open, WebSocket server successfully bound, timer round completion, and settings save. + +#### Scenario: WebSocket server bind logged +- **WHEN** the WebSocket server successfully binds to a port +- **THEN** an INFO-level entry records the bound address + +#### Scenario: Timer round completion logged +- **WHEN** a work or break round completes naturally or is skipped +- **THEN** an INFO-level entry records the round type and completion reason + +--- + +### Requirement: JS-side events logged to the same file +The system SHALL use `@tauri-apps/plugin-log` in both Svelte windows to forward frontend log calls to the same log file. JS logging SHALL apply the same level discipline as Rust: errors on failure paths, info on successful major operations. + +#### Scenario: Frontend IPC error logged +- **WHEN** an IPC call from a Svelte window fails +- **THEN** an error-level entry is written to the log file from the frontend context + +#### Scenario: Frontend initialization logged +- **WHEN** a Svelte window completes its startup sequence (settings loaded, theme applied) +- **THEN** an info-level entry is written confirming successful initialization + +#### Scenario: Locale change logged +- **WHEN** the active locale is changed +- **THEN** an info-level entry records the new locale value + +--- + +### Requirement: Open Log Folder accessible from Settings → About +The system SHALL provide a button in Settings → About that opens the log directory in the OS file manager. + +#### Scenario: Open Log Folder button opens file manager +- **WHEN** the user clicks "Open Log Folder" in Settings → About +- **THEN** the OS file manager opens at the log directory + +#### Scenario: Log path displayed +- **WHEN** the user views Settings → About +- **THEN** the resolved log directory path is displayed as text alongside the button diff --git a/openspec/specs/localization/spec.md b/openspec/specs/localization/spec.md new file mode 100644 index 0000000..df9028f --- /dev/null +++ b/openspec/specs/localization/spec.md @@ -0,0 +1,67 @@ +## ADDED Requirements + +### Requirement: Paraglide-based message catalog +The system SHALL use Paraglide JS v2 (`@inlang/paraglide-js`) to manage all user-visible strings. All strings SHALL be defined in message files (`messages/.json`) and accessed through generated type-safe message functions (`m.()`). The base locale SHALL be `en`. + +#### Scenario: Type-safe message access +- **WHEN** a developer references a message key that does not exist +- **THEN** TypeScript SHALL report a compile error + +#### Scenario: Unused message tree-shaking +- **WHEN** the app is built for production +- **THEN** message functions for unused keys SHALL be eliminated from the bundle + +### Requirement: Supported locales at launch +The system SHALL ship five locales: English (`en`, base), Spanish (`es`), French (`fr`), German (`de`), and Japanese (`ja`). Non-English locales MAY be machine-translated. All locale message files SHALL contain translations for every key defined in `messages/en.json`. + +#### Scenario: All keys present in non-English locales +- **WHEN** a non-English message file is loaded +- **THEN** every key defined in `messages/en.json` SHALL have a corresponding entry + +#### Scenario: Fallback to English for missing keys +- **WHEN** a message key is missing in the active locale's file +- **THEN** the English string SHALL be displayed as a fallback + +### Requirement: Automatic locale detection +The system SHALL default to `language = 'auto'`. When `'auto'` is active, the locale SHALL be resolved from `navigator.language` by matching the closest supported locale (prefix match). If no match is found, the locale SHALL fall back to `en`. + +#### Scenario: Exact locale match +- **WHEN** `navigator.language` is `'fr'` +- **THEN** the active locale SHALL be `fr` + +#### Scenario: Region-qualified locale match +- **WHEN** `navigator.language` is `'de-AT'` +- **THEN** the active locale SHALL be `de` + +#### Scenario: Unsupported locale fallback +- **WHEN** `navigator.language` is `'zh-CN'` +- **THEN** the active locale SHALL fall back to `en` + +### Requirement: User language override +The system SHALL allow the user to override the detected locale via a language dropdown in the System settings section. The selected locale SHALL be persisted as the `language` setting and applied immediately without requiring an app restart. + +#### Scenario: User selects a specific language +- **WHEN** the user selects `'fr'` from the language dropdown +- **THEN** all UI strings in both windows SHALL immediately display in French + +#### Scenario: User resets to automatic detection +- **WHEN** the user selects `'Auto'` from the language dropdown +- **THEN** `language` is saved as `'auto'` and the locale is re-resolved from `navigator.language` + +### Requirement: Locale applied in both windows +The system SHALL apply the active locale in both the main timer window and the settings window. When the `language` setting changes, both windows SHALL re-call `setLocale()` in response to the `settings:changed` event. + +#### Scenario: Language change propagates to both windows +- **WHEN** the user changes the language setting while the settings window is open +- **THEN** both the timer window and the settings window SHALL update their displayed strings + +### Requirement: Translated desktop notifications +The system SHALL send desktop notifications with titles and bodies constructed from translated Paraglide message strings. Notification string construction SHALL happen on the frontend; the Rust backend SHALL receive a pre-translated `title` and `body`. + +#### Scenario: Work round complete notification in active locale +- **WHEN** a work round completes and the active locale is `fr` +- **THEN** the notification title and body SHALL be in French + +#### Scenario: Notification Rust command accepts arbitrary title and body +- **WHEN** `notification_show(title, body)` is called from the frontend +- **THEN** Rust SHALL display the notification with the provided title and body without any string construction diff --git a/openspec/specs/macos-shortcuts/spec.md b/openspec/specs/macos-shortcuts/spec.md new file mode 100644 index 0000000..b37e4d6 --- /dev/null +++ b/openspec/specs/macos-shortcuts/spec.md @@ -0,0 +1,42 @@ +### Requirement: macOS Accessibility permission detection +On macOS, the system SHALL expose an IPC command `accessibility_trusted` that returns a boolean indicating whether the application has been granted Accessibility access by the operating system. On all other platforms the command SHALL return `true` unconditionally. + +#### Scenario: Accessibility not granted on macOS +- **WHEN** the app has not been granted Accessibility access in macOS System Settings +- **THEN** `accessibility_trusted` SHALL return `false` + +#### Scenario: Accessibility granted on macOS +- **WHEN** the app has been granted Accessibility access in macOS System Settings +- **THEN** `accessibility_trusted` SHALL return `true` + +#### Scenario: Non-macOS platform +- **WHEN** `accessibility_trusted` is called on Windows or Linux +- **THEN** it SHALL return `true` + +### Requirement: Accessibility permission notice in Shortcuts settings +On macOS, when Accessibility access is not granted, the system SHALL display a notice at the top of the Shortcuts settings section informing the user that global shortcuts require Accessibility access, and providing a button that opens the relevant macOS System Settings pane directly. + +#### Scenario: Notice shown when not trusted +- **WHEN** the user opens the Shortcuts section on macOS +- **AND** Accessibility access has not been granted +- **THEN** a notice SHALL be displayed above the shortcut inputs explaining the requirement + +#### Scenario: Notice includes action link +- **WHEN** the notice is visible +- **THEN** it SHALL contain a control that opens System Settings → Privacy & Security → Accessibility when activated + +#### Scenario: Notice absent when trusted +- **WHEN** Accessibility access has been granted +- **THEN** no notice SHALL be shown and the Shortcuts section SHALL display normally + +#### Scenario: Notice absent on non-macOS +- **WHEN** the app is running on Windows or Linux +- **THEN** no Accessibility notice SHALL appear in the Shortcuts section + +### Requirement: Accessibility status re-checked on window focus +When Accessibility access has not yet been granted, the system SHALL re-check trust status each time the settings window regains focus, and SHALL automatically dismiss the notice once access is confirmed. + +#### Scenario: Notice dismisses after access granted +- **WHEN** the user grants Accessibility access in System Settings +- **AND** returns focus to the Pomotroid settings window +- **THEN** the notice SHALL disappear without requiring a restart or manual refresh diff --git a/openspec/specs/mini-controls/spec.md b/openspec/specs/mini-controls/spec.md new file mode 100644 index 0000000..c478dde --- /dev/null +++ b/openspec/specs/mini-controls/spec.md @@ -0,0 +1,28 @@ +### Requirement: Mini controls displayed in compact mode +When the timer window is in compact mode (either dimension < 300px), the system SHALL display a slim row of three icon-only buttons below the timer dial: restart current round, play/pause, and skip round. These controls SHALL be rendered at a fixed size independent of the dial's zoom scale. + +#### Scenario: Controls appear in compact mode +- **WHEN** the window width or height drops below 300px +- **THEN** the restart, play/pause, and skip buttons SHALL be visible below the dial + +#### Scenario: Controls absent in normal mode +- **WHEN** the window is at or above the compact threshold in both dimensions +- **THEN** the mini controls SHALL NOT be rendered (the full controls row is shown instead) + +#### Scenario: Play/pause icon reflects running state +- **WHEN** the timer is running +- **THEN** the play/pause button SHALL show a pause icon +- **WHEN** the timer is paused or idle +- **THEN** the play/pause button SHALL show a play icon + +#### Scenario: Restart button restarts current round +- **WHEN** the user clicks the restart button in compact mode +- **THEN** the current round's elapsed time SHALL reset to zero without advancing the sequence + +#### Scenario: Skip button advances to next round +- **WHEN** the user clicks the skip button in compact mode +- **THEN** the timer SHALL advance to the next round in the sequence + +#### Scenario: Controls scale independently of dial +- **WHEN** the dial zoom scale is at its minimum (0.4) +- **THEN** the mini control buttons SHALL still render at their full defined size (24×24px) diff --git a/openspec/specs/settings/spec.md b/openspec/specs/settings/spec.md new file mode 100644 index 0000000..415a275 --- /dev/null +++ b/openspec/specs/settings/spec.md @@ -0,0 +1,77 @@ +## ADDED Requirements + +### Requirement: Verbose Logging setting persisted and applied on startup +The system SHALL store a `verbose_logging` boolean setting (DB key: `verbose_logging`, default `false`) in SQLite. On startup the log level SHALL be set to DEBUG when `verbose_logging` is `true`, and INFO otherwise, before any other application setup runs. + +#### Scenario: Default value is false +- **WHEN** the application runs for the first time with no existing settings +- **THEN** `verbose_logging` is `false` and the log level is INFO + +#### Scenario: Verbose logging persists across restarts +- **WHEN** the user enables Verbose Logging and restarts the application +- **THEN** the log level is set to DEBUG from the first log entry onward + +--- + +--- + +### Requirement: Language setting +The system SHALL store a `language` setting in the settings database with a default value of `'auto'`. The value SHALL be either `'auto'` or a supported IETF BCP 47 locale tag (`'en'`, `'es'`, `'fr'`, `'de'`, `'ja'`). The `Settings` struct SHALL expose a `language: String` field, and `types.ts` SHALL mirror this field. + +#### Scenario: Default language is auto +- **WHEN** a new user launches the app for the first time +- **THEN** the `language` setting SHALL be `'auto'` + +#### Scenario: Language setting persists across restarts +- **WHEN** the user sets `language` to `'de'` and restarts the app +- **THEN** the `language` setting SHALL be `'de'` after restart + +#### Scenario: Language setting migration for existing users +- **WHEN** an existing user upgrades from a version without the `language` setting +- **THEN** MIGRATION_3 SHALL insert `language = 'auto'` as a default row + +--- + +### Requirement: Verbose Logging toggled at runtime via Settings → Advanced +The system SHALL provide a "Verbose Logging" toggle in Settings → Advanced. Toggling it SHALL take effect immediately (changing the global log level via `log::set_max_level()`) without requiring an application restart, and SHALL persist the new value to the database. + +#### Scenario: Enabling Verbose Logging takes immediate effect +- **WHEN** the user enables Verbose Logging +- **THEN** subsequent log entries include DEBUG-level messages without restarting + +#### Scenario: Disabling Verbose Logging takes immediate effect +- **WHEN** the user disables Verbose Logging +- **THEN** DEBUG-level messages are suppressed from subsequent log entries without restarting + +#### Scenario: Toggle change recorded in log +- **WHEN** Verbose Logging is enabled or disabled +- **THEN** an INFO-level log entry records the change (e.g. "Verbose logging enabled — log level set to DEBUG") + +--- + +### Requirement: Reset to factory defaults via Settings → About +The system SHALL provide a "Reset All Settings" action in Settings → About. The action SHALL use an inline two-step confirmation: the first interaction reveals a confirmation prompt with Cancel and Reset controls; only the second (Reset) interaction fires `settings_reset_defaults`. Cancelling at any point SHALL restore the original button without performing a reset. The action resets all settings globally (all 26 keys) to factory defaults, including clearing any custom alert sounds from disk and from the audio engine's in-memory state. + +#### Scenario: Reset button is visible in About section +- **WHEN** the user navigates to Settings → About +- **THEN** a "Reset All Settings" row SHALL be visible below the navigation links + +#### Scenario: First click enters confirmation state +- **WHEN** the user clicks "Reset All Settings" +- **THEN** the row SHALL replace the button with a confirmation prompt and Cancel / Reset buttons + +#### Scenario: Cancel dismisses confirmation without resetting +- **WHEN** the user clicks Cancel in the confirmation state +- **THEN** the row SHALL return to the initial "Reset All Settings" button and no settings SHALL be changed + +#### Scenario: Confirm fires global reset +- **WHEN** the user clicks Reset in the confirmation state +- **THEN** `settings_reset_defaults` SHALL be invoked, all settings SHALL revert to factory defaults, and the row SHALL return to the initial button + +#### Scenario: Custom alert sounds are cleared on reset +- **WHEN** the user confirms a full settings reset +- **THEN** any custom alert sound files SHALL be deleted from disk and the audio engine SHALL revert to built-in sounds immediately, without requiring a restart + +#### Scenario: Reset no longer available in Timer section +- **WHEN** the user navigates to Settings → Timer +- **THEN** no reset button SHALL be present in that section diff --git a/openspec/specs/shortcuts/spec.md b/openspec/specs/shortcuts/spec.md new file mode 100644 index 0000000..c7941be --- /dev/null +++ b/openspec/specs/shortcuts/spec.md @@ -0,0 +1,16 @@ +### Requirement: Platform-aware default shortcut bindings +The system SHALL seed shortcut defaults that are appropriate for the host operating system. On macOS, defaults SHALL use the `Command+Shift` modifier with digit keys (`1`–`4`) to avoid conflicts with macOS media keys and follow platform conventions. On Windows and Linux, defaults SHALL use `Control+F1`–`F4`. + +#### Scenario: macOS first launch shortcut defaults +- **WHEN** the application is launched for the first time on macOS +- **AND** no shortcut preferences have been saved +- **THEN** the default shortcuts SHALL be `Command+Shift+1` (toggle), `Command+Shift+2` (reset), `Command+Shift+3` (skip), `Command+Shift+4` (restart round) + +#### Scenario: Windows/Linux first launch shortcut defaults +- **WHEN** the application is launched for the first time on Windows or Linux +- **AND** no shortcut preferences have been saved +- **THEN** the default shortcuts SHALL be `Control+F1` (toggle), `Control+F2` (reset), `Control+F3` (skip), `Control+F4` (restart round) + +#### Scenario: Existing preferences preserved +- **WHEN** the application launches and shortcut preferences already exist in the database +- **THEN** the existing saved shortcuts SHALL be used regardless of platform diff --git a/openspec/specs/statistics/spec.md b/openspec/specs/statistics/spec.md new file mode 100644 index 0000000..fbd50e5 --- /dev/null +++ b/openspec/specs/statistics/spec.md @@ -0,0 +1,125 @@ +### Requirement: Statistics window accessible from main titlebar +The system SHALL provide a chart/stats icon button in the main window titlebar. Activating it SHALL open a dedicated statistics window (Tauri `WebviewWindow`, label `"stats"`, route `/stats`). If the window is already open, it SHALL be focused rather than opened a second time. The window SHALL be non-resizable, decoration-free on Linux/Windows (matching settings window behavior), and sized at approximately 820×540. + +#### Scenario: Opening stats window for the first time +- **WHEN** the user clicks the stats icon in the main titlebar +- **THEN** a new statistics window opens at the `/stats` route + +#### Scenario: Stats window already open +- **WHEN** the user clicks the stats icon while the statistics window is already open +- **THEN** the existing window is focused (no duplicate window created) + +#### Scenario: Theme applied to stats window +- **WHEN** the statistics window opens +- **THEN** it applies the same active theme as the main window via CSS custom properties + +--- + +### Requirement: Three-tab navigation within the statistics window +The statistics window SHALL display three tabs: **Today**, **This Week**, and **All Time**. The default active tab SHALL be **Today**. Switching tabs SHALL load the corresponding data view without reopening the window. + +#### Scenario: Default tab on open +- **WHEN** the statistics window is first opened +- **THEN** the Today tab is active and Today data is displayed + +#### Scenario: Switching tabs +- **WHEN** the user clicks a tab +- **THEN** the corresponding view is rendered with its data + +--- + +### Requirement: Today tab — stat cards +The Today tab SHALL display three summary stat cards: +1. **Rounds** — count of completed work sessions today (local date) +2. **Focus Time** — total minutes of completed work sessions today, formatted as `Xh Ym` (hours and minutes) +3. **Completion Rate** — percentage of started work sessions that were completed today, shown as `N%` + +#### Scenario: Day with sessions +- **WHEN** the user has completed work sessions today +- **THEN** all three stat cards reflect today's accurate counts + +#### Scenario: No sessions today +- **WHEN** no sessions have been recorded today +- **THEN** cards show `0` / `0h 0m` / `—` (completion rate shown as dash when no sessions started) + +--- + +### Requirement: Today tab — hourly timeline +The Today tab SHALL display an hourly breakdown of sessions across the 24-hour day as a bar chart, where bar height represents the number of completed work rounds in that hour. Hours with no sessions SHALL render as a minimal baseline (not zero-height bars that are invisible). + +#### Scenario: Sessions at various hours +- **WHEN** the user has sessions at multiple hours of the day +- **THEN** bars are taller for hours with more sessions + +#### Scenario: Empty day +- **WHEN** no sessions exist for today +- **THEN** all bars appear at minimal height with an empty-state label + +--- + +### Requirement: This Week tab — daily bar chart +The This Week tab SHALL display a bar chart of completed work rounds for each of the last 7 calendar days (local date), with day labels (Mon–Sun or equivalent). The bar for today SHALL be visually distinguished (e.g., accent color or highlight). + +#### Scenario: Week with mixed activity +- **WHEN** some days have sessions and others do not +- **THEN** bars reflect per-day completed round counts; empty days show zero-height bars + +#### Scenario: Today's bar +- **WHEN** viewing the weekly chart +- **THEN** today's bar is visually distinct from past days + +--- + +### Requirement: This Week tab — streak counter +The This Week tab SHALL display the **current streak**: the number of consecutive calendar days (local date) ending today or yesterday on which the user completed at least one work session. A streak SHALL remain active until midnight of the current day — if yesterday had sessions but today does not yet, the streak is still displayed as active. + +#### Scenario: Active streak including yesterday +- **WHEN** the user completed sessions yesterday but not yet today +- **THEN** the streak counter shows the consecutive-day count including yesterday (streak still live) + +#### Scenario: Active streak including today +- **WHEN** the user has completed at least one session today +- **THEN** today is included in the streak count + +#### Scenario: Streak broken +- **WHEN** neither today nor yesterday has a completed session +- **THEN** streak counter shows 0 + +--- + +### Requirement: All Time tab — annual heatmap +The All Time tab SHALL display a heatmap grid (GitHub contribution graph style) where each cell represents one calendar day, navigable by year. Cell color intensity SHALL reflect the number of completed work rounds on that day using a fixed 4-level scale: 0 rounds (background), 1–3 (level 1), 4–7 (level 2), 8+ (level 3). Colors SHALL be derived from the active theme's `--color-focus-round` at varying opacity levels blended into `--color-background`. + +#### Scenario: Day with high round count +- **WHEN** a day has 8 or more completed work rounds +- **THEN** its cell displays at maximum intensity (level 3) + +#### Scenario: Day with no rounds +- **WHEN** a day has no completed work rounds +- **THEN** its cell displays at background intensity (level 0, visually empty) + +#### Scenario: Theme change while stats window is open +- **WHEN** the active theme changes while the stats window is open +- **THEN** heatmap cell colors update to reflect the new theme colors + +--- + +### Requirement: All Time tab — lifetime totals +The All Time tab SHALL display total lifetime stats: total completed work rounds, total focus time (formatted as hours), and longest streak ever recorded. + +#### Scenario: All-time data display +- **WHEN** the user opens the All Time tab +- **THEN** lifetime totals are shown accurately derived from the full sessions table + +#### Scenario: First launch (empty database) +- **WHEN** no sessions exist in the database +- **THEN** all totals show zero values with an appropriate empty state message + +--- + +### Requirement: Statistics window reacts to timer events +The statistics window, when open, SHALL update its data views in real time when a timer round completes. The Today and This Week tabs SHALL refresh immediately; the All Time tab SHALL refresh only if it has been previously loaded. + +#### Scenario: Round completes while stats window is open +- **WHEN** a timer round completes and the statistics window is open +- **THEN** the Today and This Week views update to reflect the newly recorded session without requiring the window to be closed and reopened diff --git a/openspec/specs/theme-mode/spec.md b/openspec/specs/theme-mode/spec.md new file mode 100644 index 0000000..fcaa893 --- /dev/null +++ b/openspec/specs/theme-mode/spec.md @@ -0,0 +1,84 @@ +## ADDED Requirements + +### Requirement: Theme mode selection +The system SHALL provide three theme modes — Auto, Light, and Dark — that control how the active theme is resolved. The active mode SHALL be persisted in settings as `theme_mode` with values `"auto"`, `"light"`, or `"dark"`. + +#### Scenario: Default mode is Auto +- **WHEN** a new user launches the app for the first time +- **THEN** `theme_mode` is `"auto"` + +#### Scenario: User selects Light mode +- **WHEN** the user selects Light mode +- **THEN** `theme_mode` is saved as `"light"` and the light theme picker's selection becomes the active theme immediately + +#### Scenario: User selects Dark mode +- **WHEN** the user selects Dark mode +- **THEN** `theme_mode` is saved as `"dark"` and the dark theme picker's selection becomes the active theme immediately + +#### Scenario: User selects Auto mode +- **WHEN** the user selects Auto mode +- **THEN** `theme_mode` is saved as `"auto"` and the active theme is resolved from the OS color scheme immediately + +### Requirement: Independent light and dark theme pickers +The system SHALL maintain two independent theme selections: `theme_light` and `theme_dark`. Both pickers SHALL display all available themes. Defaults SHALL be `"Pomotroid"` for both. + +#### Scenario: Light theme selection when Light mode active +- **WHEN** mode is `"light"` and the user selects a theme from the light picker +- **THEN** `theme_light` is saved and the selected theme is applied immediately + +#### Scenario: Dark theme selection when Dark mode active +- **WHEN** mode is `"dark"` and the user selects a theme from the dark picker +- **THEN** `theme_dark` is saved and the selected theme is applied immediately + +#### Scenario: Deferred preview for inactive picker +- **WHEN** the user selects a theme from the picker that is not currently active +- **THEN** the selection is saved but the visible theme does not change + +#### Scenario: Deferred light picker in Auto mode with OS dark +- **WHEN** mode is `"auto"`, the OS is dark, and the user selects a theme from the light picker +- **THEN** `theme_light` is saved but the active theme remains the dark theme + +### Requirement: Active theme resolution +The system SHALL resolve the active theme using: Auto → OS dark? `theme_dark` : `theme_light`; Light → `theme_light`; Dark → `theme_dark`. The `theme` settings field SHALL be removed; the active theme SHALL always be derived at runtime. + +#### Scenario: Auto mode resolves to dark theme on dark OS +- **WHEN** `theme_mode` is `"auto"` and `prefers-color-scheme` is `dark` +- **THEN** the active theme is `theme_dark` + +#### Scenario: Auto mode resolves to light theme on light OS +- **WHEN** `theme_mode` is `"auto"` and `prefers-color-scheme` is `light` +- **THEN** the active theme is `theme_light` + +#### Scenario: Light mode ignores OS +- **WHEN** `theme_mode` is `"light"` regardless of OS color scheme +- **THEN** the active theme is always `theme_light` + +#### Scenario: Dark mode ignores OS +- **WHEN** `theme_mode` is `"dark"` regardless of OS color scheme +- **THEN** the active theme is always `theme_dark` + +### Requirement: Live OS color scheme response +When `theme_mode` is `"auto"`, the application SHALL respond to OS color scheme changes without requiring a restart. Both the main window and the settings window SHALL update simultaneously. + +#### Scenario: OS switches to dark while app is open in Auto mode +- **WHEN** `theme_mode` is `"auto"` and the OS switches to dark mode +- **THEN** the active theme changes to `theme_dark` immediately in all open windows + +#### Scenario: OS switches to light while app is open in Auto mode +- **WHEN** `theme_mode` is `"auto"` and the OS switches to light mode +- **THEN** the active theme changes to `theme_light` immediately in all open windows + +#### Scenario: OS change ignored when not in Auto mode +- **WHEN** `theme_mode` is `"light"` or `"dark"` and the OS color scheme changes +- **THEN** the active theme does not change + +### Requirement: Migration for existing users +On first launch after the update, the system SHALL migrate existing single-theme settings to the new three-field model with no visible change to the user. + +#### Scenario: Existing user with custom theme +- **WHEN** `theme_light` is absent from the settings DB and `theme` exists with value e.g. `"Nord"` +- **THEN** `theme_light` and `theme_dark` are both set to `"Nord"` and `theme_mode` is set to `"auto"` + +#### Scenario: Brand new install +- **WHEN** no settings exist in the DB +- **THEN** `theme_mode = "auto"`, `theme_light = "Pomotroid"`, `theme_dark = "Pomotroid"` are seeded as defaults diff --git a/package-lock.json b/package-lock.json index 89752eb..368aa26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18993 +1,2328 @@ { "name": "pomotroid", - "version": "0.13.0", - "lockfileVersion": 1, + "version": "1.0.0", + "lockfileVersion": 3, "requires": true, - "dependencies": { - "7zip-bin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz", - "integrity": "sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==", - "dev": true - }, - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/compat-data": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz", - "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==", - "dev": true - }, - "@babel/core": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.2.tgz", - "integrity": "sha512-OgC1mON+l4U4B4wiohJlQNUU3H73mpTyYY3j/c8U9dr9UagGGSm+WFpzjy/YLdoyjiG++c1kIDgxCo/mLwQJeQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helpers": "^7.14.0", - "@babel/parser": "^7.14.2", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", - "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", - "dev": true, - "requires": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", - "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.7.tgz", - "integrity": "sha512-DQwjiKJqH4C3qGiyQCAExJHoZssn49JTMJgZ8SANGgVFdkupcUhLOdkAeoC6kmHZCPfoDG5M0b6cFlSN5wW7Ew==", - "dev": true, - "requires": { - "@babel/types": "^7.8.7", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", - "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", - "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.12.13", - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz", - "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.15", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.2.tgz", - "integrity": "sha512-6YctwVsmlkchxfGUogvVrrhzyD3grFJyluj5JgDlQrwfMLJSt5tdAzFZfPf4H2Xoi5YLcQ6BxfJlaOBHuctyIw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", - "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", - "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "regexpu-core": "^4.7.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", - "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.13.0", - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/traverse": "^7.13.0", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", - "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", - "dev": true, - "requires": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", - "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", - "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz", - "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==", - "dev": true, - "requires": { - "@babel/traverse": "^7.13.15", - "@babel/types": "^7.13.16" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", - "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", - "dev": true, - "requires": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", - "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-module-transforms": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz", - "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.14.0", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.2", - "@babel/types": "^7.14.2" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", - "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", - "dev": true, - "requires": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", - "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", - "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-wrap-function": "^7.13.0", - "@babel/types": "^7.13.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", - "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", - "dev": true, - "requires": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", - "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" - } - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", - "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", - "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", - "dev": true, - "requires": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", - "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", - "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.1" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz", - "integrity": "sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.12.13", - "@babel/types": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.12.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", - "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.12.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.16.tgz", - "integrity": "sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", - "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.12.13", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - } - }, - "@babel/types": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", - "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/helpers": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz", - "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==", - "dev": true, - "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.14.0", - "@babel/types": "^7.14.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/generator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.2.tgz", - "integrity": "sha512-OnADYbKrffDVai5qcpkMxQ7caomHOoEwjkouqnN2QhydAjowFAZcsdecFIRUBdb+ZcruwYE4ythYmF1UBZU5xQ==", - "dev": true, - "requires": { - "@babel/types": "^7.14.2", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", - "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz", - "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.14.2", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.14.2", - "@babel/types": "^7.14.2", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.7.tgz", - "integrity": "sha512-9JWls8WilDXFGxs0phaXAZgpxTZhSk/yOYH2hTHC0X1yC7Z78IJfvR1vJ+rmJKq3I35td2XzXzN6ZLYlna+r/A==", - "dev": true - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", - "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.13.12" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.2.tgz", - "integrity": "sha512-b1AM4F6fwck4N8ItZ/AtC4FP/cqZqmKRQ4FaTDutwSYyjuhtvsGEMLK4N/ztV/ImP40BjIDyMgBQAeAMsQYVFQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", - "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.13.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.13.11.tgz", - "integrity": "sha512-fJTdFI4bfnMjvxJyNuaf8i9mVcZ0UhetaGEUHaHV9KEnibLugJkZAtXikR8KcYj+NYmI4DZMS8yQAyg+hvfSqg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-class-static-block": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.2.tgz", - "integrity": "sha512-LauAqDd/VjQDtae58QgBcEOE42NNP+jB2OE+XeC3KBI/E+BhhRjtr5viCIrj1hmu1YvrguLipIPRJZmS5yUcFw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.2", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-decorators": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-do-expressions": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.14.0.tgz", - "integrity": "sha512-a/H0V6MvPbj4iki1XQstRQhHGuUF27tyqrmLmzDTYhYdasz6rdcyf8dhGBZbMnuxKsYV5pPqUkc+xdzDUweRQw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-do-expressions": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.2.tgz", - "integrity": "sha512-oxVQZIWFh91vuNEMKltqNsKLFWkOIyJc95k2Gv9lWVyDfPUQGSSlbDEgWuJUU1afGE9WwlzpucMZ3yDRHIItkA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-export-default-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.12.13.tgz", - "integrity": "sha512-idIsBT+DGXdOHL82U+8bwX4goHm/z10g8sGGrQroh+HCRcm7mDv/luaGdWJQMTuCX2FsdXS7X0Nyyzp4znAPJA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-export-default-from": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.2.tgz", - "integrity": "sha512-sRxW3z3Zp3pFfLAgVEvzTFutTXax837oOatUIvSG9o5gRj9mKwm3br1Se5f4QalTQs9x4AzlA/HrCWbQIHASUQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-function-bind": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.12.13.tgz", - "integrity": "sha512-HdFUUOUhB5WuNug+rfhcRvjqjjtKdJlWr6kgIezpbh9xiIEza/pPWw+bJeH2GdGeUyNqhRIYeFKt0M3/xXWp1w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-function-bind": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } - } - }, - "@babel/plugin-proposal-function-sent": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.12.13.tgz", - "integrity": "sha512-nw5dSsy0+o+WBE372ooERkkZmFv2KJcujzTB5SdhQPKIElVA1pa7hclD23Vzl4VlcoJsC7KCCXpww2qAkbrrKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-wrap-function": "^7.12.13", - "@babel/plugin-syntax-function-sent": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.2.tgz", - "integrity": "sha512-w2DtsfXBBJddJacXMBhElGEYqCZQqN99Se1qeYn8DVLB33owlrlLftIbMzn5nz1OITfDVknXF433tBrLEAOEjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.2.tgz", - "integrity": "sha512-1JAZtUrqYyGsS7IDmFeaem+/LJqujfLZ2weLR9ugB0ufUPjzf8cguyVT1g5im7f7RXxuLq1xUxEzvm68uYRtGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.2.tgz", - "integrity": "sha512-ebR0zU9OvI2N4qiAC38KIAK75KItpIPTpAtd2r4OZmMFeKbKJpUFLYP2EuDut82+BmYi8sz42B+TfTptJ9iG5Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.2.tgz", - "integrity": "sha512-DcTQY9syxu9BpU3Uo94fjCB3LN9/hgPS8oUL7KrSW3bA2ePrKZZPJcc5y0hoJAM9dft3pGfErtEUvxXQcfLxUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.2.tgz", - "integrity": "sha512-hBIQFxwZi8GIp934+nj5uV31mqclC1aYDhctDu5khTi9PCCUOczyy0b34W0oE9U/eJXiqQaKyVsmjeagOaSlbw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.14.0", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.14.2" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.2.tgz", - "integrity": "sha512-XtkJsmJtBaUbOxZsNk0Fvrv8eiqgneug0A6aqLFZ4TSkar2L5dSXWcnUKHgmjJt49pyB/6ZHvkr3dPgl9MOWRQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.2.tgz", - "integrity": "sha512-qQByMRPwMZJainfig10BoaDldx/+VDtNcrA7qdNaEOAj6VXud+gfrkA8j4CRAU5HjnWREXqIpSpH30qZX1xivA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-pipeline-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.12.13.tgz", - "integrity": "sha512-p6ypYNG6oKPHO73jPjyBVrZMcc2bWWn8ByusDzStzlPmWNElcErf+pZGB6Lt5f23T9LFFTB7rqOr8BQMc1nSiQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-pipeline-operator": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", - "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz", - "integrity": "sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-create-class-features-plugin": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-proposal-throw-expressions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.12.13.tgz", - "integrity": "sha512-zhItTJGy2xLYneBdOk9CeyuEXWJt9J+pwTEIDl+A/VKMCq6E9ij3l1RRuTYBwtktTO9bCcIfA4/+d0HibVWSEA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/plugin-syntax-throw-expressions": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", - "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz", - "integrity": "sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", - "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-do-expressions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.12.13.tgz", - "integrity": "sha512-xm52bNA0O8QPH4rBXXJ/VLaQ6UGocUS3/fbgZO5z+KDUU7y8iFy8cnIwuRS/NNGjs18sOquzJfH0EasQv+F1oQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-default-from": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.12.13.tgz", - "integrity": "sha512-gVry0zqoums0hA+EniCYK3gABhjYSLX1dVuwYpPw9DrLNA4/GovXySHVg4FGRsZht09ON/5C2NVx3keq+qqVGQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-function-bind": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.12.13.tgz", - "integrity": "sha512-8tkZMgbO5s/WkVnl04rBvULapZeXOHkaEW+w7oSzmEKwD6hDCtaAKouhgpoMa3uo8zC1HFpjlVh85PUVqvAxHw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } - } - }, - "@babel/plugin-syntax-function-sent": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.12.13.tgz", - "integrity": "sha512-Uv9lAv+/vX8hmvC2rTUvywJacR517eRqTKfLZrtLAoMGUjfQSZ0nPEFJWmfJs1H54zBaIj15ATfUnkheZnSK9w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", - "dev": true - } - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-pipeline-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.12.13.tgz", - "integrity": "sha512-IHs5FTRPJv7M7K0IurpuCTU1ILnhAXDi+YW8dIddJywIDWEYAaV90pSk1RnHRAyExn8szPER1SaraZdZLxKOGw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz", - "integrity": "sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-syntax-throw-expressions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.12.13.tgz", - "integrity": "sha512-vbpx/IxHR3qqWEfYeiVLq4+RFj2F4GjsMzoXEx/YU/pgmTA6o7T92DQHWIeetg7msKQFnyG1PwmPLWMlAn+Fmg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", - "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", - "dev": true - } - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", - "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", - "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", - "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-remap-async-to-generator": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", - "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.2.tgz", - "integrity": "sha512-neZZcP19NugZZqNwMTH+KoBjx5WyvESPSIOQb4JHpfd+zPfqcH65RMu5xJju5+6q/Y2VzYrleQTr+b6METyyxg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-classes": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.2.tgz", - "integrity": "sha512-7oafAVcucHquA/VZCsXv/gmuiHeYd64UJyyTYU+MPfNu0KeNlxw06IeENBO8bJjXVbolu+j1MM5aKQtH1OMCNg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.12.13", - "@babel/helper-function-name": "^7.14.2", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", - "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", - "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.13.17", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz", - "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", - "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", - "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", - "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", - "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", - "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/helper-function-name": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz", - "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.14.2" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.2.tgz", - "integrity": "sha512-IoVDIHpsgE/fu7eXBeRWt8zLbDrSvD7H1gpomOkPpBoEN8KCruCqSDdqo8dddwQQrui30KSvQBaMUOJiuFu6QQ==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/plugin-transform-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", - "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", - "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.2.tgz", - "integrity": "sha512-hPC6XBswt8P3G2D1tSV2HzdKvkqOpmbyoy+g73JG0qlF/qx2y3KaMmXb1fLrpmWGLZYA0ojCvaHdzFWjlmV+Pw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.14.2", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz", - "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-simple-access": "^7.13.12", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.13.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", - "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.13.0", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-identifier": "^7.12.11", - "babel-plugin-dynamic-import-node": "^2.3.3" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz", - "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.14.0", - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", - "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", - "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", - "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13", - "@babel/helper-replace-supers": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.2.tgz", - "integrity": "sha512-NxoVmA3APNCC1JdMXkdYXuQS+EMdqy0vIwyDHeKHiJKRxmp1qGSdb0JLEIoPRhkx6H/8Qi3RJ3uqOCYw8giy9A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", - "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.13.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", - "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", - "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.2.tgz", - "integrity": "sha512-LyA2AiPkaYzI7G5e2YI4NCasTfFe7mZvlupNprDOB7CdNUHb2DQC4uV6oeZ0396gOcicUzUCh0MShL6wiUgk+Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-plugin-utils": "^7.13.0", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", - "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-spread": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", - "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", - "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", - "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.13.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", - "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", - "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", - "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.13", - "@babel/helper-plugin-utils": "^7.12.13" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - } - } - }, - "@babel/preset-env": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.2.tgz", - "integrity": "sha512-7dD7lVT8GMrE73v4lvDEb85cgcQhdES91BSD7jS/xjC6QY8PnRhux35ac+GCpbiRhp8crexBvZZqnaL6VrY8TQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.14.0", - "@babel/helper-compilation-targets": "^7.13.16", - "@babel/helper-plugin-utils": "^7.13.0", - "@babel/helper-validator-option": "^7.12.17", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", - "@babel/plugin-proposal-async-generator-functions": "^7.14.2", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-class-static-block": "^7.13.11", - "@babel/plugin-proposal-dynamic-import": "^7.14.2", - "@babel/plugin-proposal-export-namespace-from": "^7.14.2", - "@babel/plugin-proposal-json-strings": "^7.14.2", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.2", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2", - "@babel/plugin-proposal-numeric-separator": "^7.14.2", - "@babel/plugin-proposal-object-rest-spread": "^7.14.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.2", - "@babel/plugin-proposal-optional-chaining": "^7.14.2", - "@babel/plugin-proposal-private-methods": "^7.13.0", - "@babel/plugin-proposal-private-property-in-object": "^7.14.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.0", - "@babel/plugin-syntax-top-level-await": "^7.12.13", - "@babel/plugin-transform-arrow-functions": "^7.13.0", - "@babel/plugin-transform-async-to-generator": "^7.13.0", - "@babel/plugin-transform-block-scoped-functions": "^7.12.13", - "@babel/plugin-transform-block-scoping": "^7.14.2", - "@babel/plugin-transform-classes": "^7.14.2", - "@babel/plugin-transform-computed-properties": "^7.13.0", - "@babel/plugin-transform-destructuring": "^7.13.17", - "@babel/plugin-transform-dotall-regex": "^7.12.13", - "@babel/plugin-transform-duplicate-keys": "^7.12.13", - "@babel/plugin-transform-exponentiation-operator": "^7.12.13", - "@babel/plugin-transform-for-of": "^7.13.0", - "@babel/plugin-transform-function-name": "^7.12.13", - "@babel/plugin-transform-literals": "^7.12.13", - "@babel/plugin-transform-member-expression-literals": "^7.12.13", - "@babel/plugin-transform-modules-amd": "^7.14.2", - "@babel/plugin-transform-modules-commonjs": "^7.14.0", - "@babel/plugin-transform-modules-systemjs": "^7.13.8", - "@babel/plugin-transform-modules-umd": "^7.14.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", - "@babel/plugin-transform-new-target": "^7.12.13", - "@babel/plugin-transform-object-super": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.14.2", - "@babel/plugin-transform-property-literals": "^7.12.13", - "@babel/plugin-transform-regenerator": "^7.13.15", - "@babel/plugin-transform-reserved-words": "^7.12.13", - "@babel/plugin-transform-shorthand-properties": "^7.12.13", - "@babel/plugin-transform-spread": "^7.13.0", - "@babel/plugin-transform-sticky-regex": "^7.12.13", - "@babel/plugin-transform-template-literals": "^7.13.0", - "@babel/plugin-transform-typeof-symbol": "^7.12.13", - "@babel/plugin-transform-unicode-escapes": "^7.12.13", - "@babel/plugin-transform-unicode-regex": "^7.12.13", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.14.2", - "babel-plugin-polyfill-corejs2": "^0.2.0", - "babel-plugin-polyfill-corejs3": "^0.2.0", - "babel-plugin-polyfill-regenerator": "^0.2.0", - "core-js-compat": "^3.9.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/helper-plugin-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", - "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/types": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz", - "integrity": "sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "to-fast-properties": "^2.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", - "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/register": { - "version": "7.13.16", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.13.16.tgz", - "integrity": "sha512-dh2t11ysujTwByQjXNgJ48QZ2zcXKQVdV8s0TbeMI0flmtGWCdTwK9tJiACHXPLmncm5+ktNn/diojA45JE4jg==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.0", - "source-map-support": "^0.5.16" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "@babel/runtime": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz", - "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.7", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", - "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", - "dev": true - } - } - }, - "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/traverse": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", - "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.6", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/types": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", - "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - } - } - }, - "@electron/get": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.12.3.tgz", - "integrity": "sha512-NFwSnVZQK7dhOYF1NQCt+HGqgL1aNdj0LUSx75uCqnZJqyiWCVdAMFV4b4/kC8HjUJAnsvdSEmjEt4G2qNQ9+Q==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "filenamify": "^4.1.0", - "fs-extra": "^8.1.0", - "global-agent": "^2.0.2", - "global-tunnel-ng": "^2.7.1", - "got": "^9.6.0", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@electron/universal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.0.4.tgz", - "integrity": "sha512-ajZoumi4XwqwmZe8YVhu4XGkZBCPyWZsVCQONPTIe9TUlleSN+dic3YpXlaWcilx/HOzTdldTKtabNTeI0gDoA==", - "dev": true, - "requires": { - "@malept/cross-spawn-promise": "^1.1.0", - "asar": "^3.0.3", - "debug": "^4.3.1", - "dir-compare": "^2.4.0", - "fs-extra": "^9.0.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@eslint/eslintrc": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz", - "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@types/debug": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", - "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/fs-extra": { - "version": "9.0.11", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.11.tgz", - "integrity": "sha512-mZsifGG4QeQ7hlkhO56u7zt/ycBgGxSVsFI/6lGTU34VtwkiqrrSDgw0+ygs8kFGWcXnFQWMrzF2h7TtDFNixA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.5.tgz", - "integrity": "sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.1.tgz", - "integrity": "sha512-hx6zWtudh3Arsbl3cXay+JnkvVgCKzCWKv42C9J01N2T2np4h8w5X8u6Tpz5mj38kE3M9FM0Pazx8vKFFMnjLQ==", - "dev": true - }, - "@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "@types/verror": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.4.tgz", - "integrity": "sha512-OjJdqx6QlbyZw9LShPwRW+Kmiegeg3eWNI41MQQKaG3vjdU2L9SRElntM51HmHBY1cu7izxQJ1lMYioQh3XMBg==", - "dev": true, - "optional": true - }, - "@types/yargs": { - "version": "15.0.13", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz", - "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.0.tgz", - "integrity": "sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==", - "dev": true - }, - "@vue/component-compiler-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", - "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==", - "dev": true, - "requires": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.14", - "postcss-selector-parser": "^6.0.2", - "prettier": "^1.18.2", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "accessibility-developer-tools": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz", - "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=", - "dev": true - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true - }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true - }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "dependencies": { - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - } - } - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "animejs": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/animejs/-/animejs-3.2.1.tgz", - "integrity": "sha512-sWno3ugFryK5nhiDm/2BKeFCpZv7vzerWUcUPyAZLDhMek3+S/p418ldZJbJXo5ZUOpfm2kP2XRO4NJcULMy9A==" - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ansi-colors": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true - }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "app-builder-bin": { - "version": "3.5.12", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.12.tgz", - "integrity": "sha512-lQARM2AielmFoBeIo6LZigAe+58Wwe07ZWkt+wVeDxzyieNmeWjlvz/V5dKzinydwdHd+CNswN86sww46yijjA==", - "dev": true - }, - "app-builder-lib": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.10.5.tgz", - "integrity": "sha512-/W8nlGamJCtKlQtsMWwU9vb+cX4pTNY+rJWCuc7oXUykVSMS50W7LhQusIjCelNfymUQ1XCu6cXEY/ylqhX12A==", - "dev": true, - "requires": { - "7zip-bin": "~5.0.3", - "@develar/schema-utils": "~2.6.5", - "@electron/universal": "1.0.4", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "22.10.5", - "builder-util-runtime": "8.7.3", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.3.2", - "ejs": "^3.1.6", - "electron-publish": "22.10.5", - "fs-extra": "^9.1.0", - "hosted-git-info": "^3.0.8", - "is-ci": "^2.0.0", - "istextorbinary": "^5.12.0", - "js-yaml": "^4.0.0", - "lazy-val": "^1.0.4", - "minimatch": "^3.0.4", - "normalize-package-data": "^3.0.0", - "read-config-file": "6.0.0", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.4", - "temp-file": "^3.3.7" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "normalize-package-data": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz", - "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "resolve": "^1.20.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-includes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.2.tgz", - "integrity": "sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "get-intrinsic": "^1.0.1", - "is-string": "^1.0.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "asar": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.0.3.tgz", - "integrity": "sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "dependencies": { - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - } - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "babel-helper-evaluate-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.1.0.tgz", - "integrity": "sha1-ldmMTqNhUEg9sufT7J4ZVKcmKcs=", - "dev": true - }, - "babel-helper-flip-expressions": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.1.2.tgz", - "integrity": "sha1-d/ZlL53pxCQB2Ce9RuvSEJ4+8Yo=", - "dev": true - }, - "babel-helper-is-nodes-equiv": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", - "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=", - "dev": true - }, - "babel-helper-is-void-0": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.1.1.tgz", - "integrity": "sha1-cvIaOrugvvODf5F0/KcxrtmgKIg=", - "dev": true - }, - "babel-helper-mark-eval-scopes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.1.1.tgz", - "integrity": "sha1-RVQ0Xt+fJUlCe9IJjlMCU/ivKZI=", - "dev": true - }, - "babel-helper-remove-or-void": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz", - "integrity": "sha1-nX4YVtxvr8tBsoOkFnMNwYRPZtc=", - "dev": true - }, - "babel-helper-to-multiple-sequence-expressions": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.1.1.tgz", - "integrity": "sha1-XxuDKznkrPlU6RN/AlE5XHEZazU=", - "dev": true - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-minify-builtins": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.1.3.tgz", - "integrity": "sha1-TyGn3LUfkaBOpx1H/w6OOwX+wCE=", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.1.0" - } - }, - "babel-plugin-minify-constant-folding": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.1.3.tgz", - "integrity": "sha1-V70XKt+LjXStfJlhLrlQQU6+o8o=", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.1.0" - } - }, - "babel-plugin-minify-dead-code-elimination": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.1.7.tgz", - "integrity": "sha1-d09TbzR7mDk6J7qnF4cpaIE8NCw=", - "dev": true, - "requires": { - "babel-helper-mark-eval-scopes": "^0.1.1", - "babel-helper-remove-or-void": "^0.1.1", - "lodash.some": "^4.6.0" - } - }, - "babel-plugin-minify-flip-comparisons": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.1.2.tgz", - "integrity": "sha1-4oa0C3WZsY3+oZUHHkJ5Rlz8GIQ=", - "dev": true, - "requires": { - "babel-helper-is-void-0": "^0.1.1" - } - }, - "babel-plugin-minify-guarded-expressions": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.1.2.tgz", - "integrity": "sha1-38PUc7A2LZYF084KweIjKMYNEAc=", - "dev": true, - "requires": { - "babel-helper-flip-expressions": "^0.1.2" - } - }, - "babel-plugin-minify-infinity": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.1.2.tgz", - "integrity": "sha1-Xxz2fd7cuhPIoA2oMlQt8AkaHNQ=", - "dev": true - }, - "babel-plugin-minify-mangle-names": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.1.3.tgz", - "integrity": "sha1-v6JGYaZ5T7A4M1h+VYKLZUSeBv4=", - "dev": true, - "requires": { - "babel-helper-mark-eval-scopes": "^0.1.1" - } - }, - "babel-plugin-minify-numeric-literals": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.1.1.tgz", - "integrity": "sha1-1LiwySX4dHFO4z7ksmZ4WD185/s=", - "dev": true - }, - "babel-plugin-minify-replace": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.1.2.tgz", - "integrity": "sha1-uQuecatNOzYyVimpG+q+E7CxasE=", - "dev": true - }, - "babel-plugin-minify-simplify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.1.2.tgz", - "integrity": "sha1-qWjxZY/esvx1noH+Mx2Jgp3w9rk=", - "dev": true, - "requires": { - "babel-helper-flip-expressions": "^0.1.2", - "babel-helper-is-nodes-equiv": "^0.0.1", - "babel-helper-to-multiple-sequence-expressions": "^0.1.1" - } - }, - "babel-plugin-minify-type-constructors": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.1.2.tgz", - "integrity": "sha1-21PFt2y44vzUXYYvFxBMeHYTN+4=", - "dev": true, - "requires": { - "babel-helper-is-void-0": "^0.1.1" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", - "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.0", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", - "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.0", - "core-js-compat": "^3.9.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", - "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.0" - } - }, - "babel-plugin-transform-inline-consecutive-adds": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.1.2.tgz", - "integrity": "sha1-VELp8cGceKeJn4pN7m/UgfYQAfU=", - "dev": true - }, - "babel-plugin-transform-member-expression-literals": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.0.tgz", - "integrity": "sha512-bxtac+8w755ctVeDs4vU98RhWY49eW1wO02HAN+eirZYSKk/dVrKONIznXbHmxWKxT4UX1rpTKOCyezuzLpbTw==", - "dev": true - }, - "babel-plugin-transform-merge-sibling-variables": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.0.tgz", - "integrity": "sha512-9G1URVEEKoQLDqe0GwqYudECN7kE/q0OCNo5TiD1iwWnnaKi97xY915l5r2KKUvNflXEm9c3faNWknSXYQ7h6Q==", - "dev": true - }, - "babel-plugin-transform-minify-booleans": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.0.tgz", - "integrity": "sha512-JtpyTRyF+wF/r7GSxpRbNCrVve5M/aCC8xoGcnFItaPUDqjxKmFYvBzMc9u+g0lgo8NWjuZLc16MYaIwkHKD/A==", - "dev": true - }, - "babel-plugin-transform-property-literals": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.0.tgz", - "integrity": "sha512-B8s+71+4DPye9+pmZiPGgLPy3YqcmIuvE/9UcZLczPlwL5ALwF6qRUdLC3Fk17NhL6jxp4u33ZVZ8R4kvASPzw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "babel-plugin-transform-regexp-constructors": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.1.1.tgz", - "integrity": "sha1-MSq3SHzIihxi7iXqG2CH6JuHeZw=", - "dev": true - }, - "babel-plugin-transform-remove-console": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.0.tgz", - "integrity": "sha512-mck9//yGTwObqqqDzY/sISO88/5/XfIB3ILb4uJLXk2xq124NT4yQVjFSRgVSbLcNq8OyBAn2acxKUqg4W/okQ==", - "dev": true - }, - "babel-plugin-transform-remove-debugger": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.0.tgz", - "integrity": "sha512-i/HWGjsmL2d1N2dl+eIzf44XpSP5v7hi1/GXB0xzom9kjrU8js3T8Kadizn95ZxfHK592Vg8P4JJWP/fvimEWw==", - "dev": true - }, - "babel-plugin-transform-remove-undefined": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.1.2.tgz", - "integrity": "sha1-4ev1ERD2seBmXyg4Lvc/leUCNlI=", - "dev": true - }, - "babel-plugin-transform-simplify-comparison-operators": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.0.tgz", - "integrity": "sha512-EJyfYeph0CSekwQuwWVwJqy2go/bETkR95iaWQ/HTUis7tkCGNYmXngaFzuIXdmoPXfvmXYCvAXR4/93hqHVjw==", - "dev": true - }, - "babel-plugin-transform-undefined-to-void": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.0.tgz", - "integrity": "sha512-AVDVEmp0S9mbF1O8zekWbsOOmqnR08PZah5NRZJqSvJnFgiL0ep4Lwo4EymH8OieJR2QgQdR3q71TNW+wiVn4g==", - "dev": true - }, - "babel-preset-babili": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/babel-preset-babili/-/babel-preset-babili-0.1.4.tgz", - "integrity": "sha1-rZ1mUQAvW8PwfKswB4EWf1RyS/I=", - "dev": true, - "requires": { - "babel-plugin-minify-builtins": "^0.1.3", - "babel-plugin-minify-constant-folding": "^0.1.3", - "babel-plugin-minify-dead-code-elimination": "^0.1.7", - "babel-plugin-minify-flip-comparisons": "^0.1.2", - "babel-plugin-minify-guarded-expressions": "^0.1.2", - "babel-plugin-minify-infinity": "^0.1.2", - "babel-plugin-minify-mangle-names": "^0.1.3", - "babel-plugin-minify-numeric-literals": "^0.1.1", - "babel-plugin-minify-replace": "^0.1.2", - "babel-plugin-minify-simplify": "^0.1.2", - "babel-plugin-minify-type-constructors": "^0.1.2", - "babel-plugin-transform-inline-consecutive-adds": "^0.1.2", - "babel-plugin-transform-member-expression-literals": "^6.8.4", - "babel-plugin-transform-merge-sibling-variables": "^6.8.5", - "babel-plugin-transform-minify-booleans": "^6.8.2", - "babel-plugin-transform-property-literals": "^6.8.4", - "babel-plugin-transform-regexp-constructors": "^0.1.1", - "babel-plugin-transform-remove-console": "^6.8.4", - "babel-plugin-transform-remove-debugger": "^6.8.4", - "babel-plugin-transform-remove-undefined": "^0.1.2", - "babel-plugin-transform-simplify-comparison-operators": "^6.8.4", - "babel-plugin-transform-undefined-to-void": "^6.8.2", - "lodash.isplainobject": "^4.0.6" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "babili-webpack-plugin": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babili-webpack-plugin/-/babili-webpack-plugin-0.1.2.tgz", - "integrity": "sha1-FkrAPVky9qUhQ+f/wG8nEcZRtvI=", - "dev": true, - "requires": { - "babel-core": "^6.24.1", - "babel-preset-babili": "^0.1.4", - "webpack-sources": "^1.0.1" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - } - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "binaryextensions": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-4.15.0.tgz", - "integrity": "sha512-MkUl3szxXolQ2scI1PM14WOT951KnaTNJ0eMKg7WzOI4kvSxyNo/Cygx4LOBNhwyINhAuSQpJW1rYD9aBSxGaw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5" - } - }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - } - } - }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boolean": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.2.tgz", - "integrity": "sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g==", - "dev": true, - "optional": true - }, - "boxen": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", - "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builder-util": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.10.5.tgz", - "integrity": "sha512-/MkLhmyo1gU3xMwXJxccQaRj/9tm5eTd6ZyebTf8SYouY4r3hRser+LxhOm/f8Z9W6oJvfPe0jc9TFsxYfMcsg==", - "dev": true, - "requires": { - "7zip-bin": "~5.0.3", - "@types/debug": "^4.1.5", - "@types/fs-extra": "^9.0.7", - "app-builder-bin": "3.5.12", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.7.3", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "fs-extra": "^9.1.0", - "is-ci": "^2.0.0", - "js-yaml": "^4.0.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.3.7" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "builder-util-runtime": { - "version": "8.7.3", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.3.tgz", - "integrity": "sha512-1Q2ReBqFblimF5g/TLg2+0M5Xzv0Ih5LxJ/BMWXvEy/e6pQKeeEpbkPMGsN6OiQgkygaZo5VXCXIjOkOQG5EoQ==", - "dev": true, - "requires": { - "debug": "^4.3.2", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } - } - }, - "caniuse-lite": { - "version": "1.0.30001228", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz", - "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "cfonts": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cfonts/-/cfonts-2.9.2.tgz", - "integrity": "sha512-TdqmOFEs5mx4S/ypJAXVsM7vaWFAsdEnrGUahPLQpzjI5SRBpoU4azF/BGzwEV0sFnJmbC4tT/Y7jp8LyZSfAA==", - "dev": true, - "requires": { - "chalk": "^4.1.1", - "window-size": "^1.1.1" - } - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "change-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.0.tgz", - "integrity": "sha1-bJyONfh5CHCoK2sHRb6MPL75sIE=", - "dev": true, - "requires": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.2.0", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", - "dev": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", - "dev": true, - "optional": true, - "requires": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "optional": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "coalescy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", - "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "requires": { - "color-name": "^1.1.1" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, - "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "requires": { - "color": "3.0.x", - "text-hex": "1.0.x" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "optional": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "dev": true, - "requires": { - "bluebird": "^3.1.1" - } - }, - "constant-case": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", - "dev": true, - "requires": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", - "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", - "dev": true, - "requires": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", - "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "core-js": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", - "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=", - "dev": true - }, - "core-js-compat": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.12.1.tgz", - "integrity": "sha512-i6h5qODpw6EsHAoIdQhKoZdWn+dGBF3dSS8m5tif36RlWvW3A6+yu2S16QHUo3CrkzrnEskMAt9f8FxmY9fhWQ==", - "dev": true, - "requires": { - "browserslist": "^4.16.6", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "optional": true, - "requires": { - "buffer": "^5.1.0" - }, - "dependencies": { - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "optional": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - } - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "css-loader": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", - "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.0", - "semver": "^6.3.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "postcss": { - "version": "7.0.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", - "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" - }, - "dependencies": { - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - } - } - }, - "css-what": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", - "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - }, - "dependencies": { - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - } - } - }, - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "del": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", - "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", - "dev": true, - "requires": { - "globby": "^10.0.1", - "graceful-fs": "^4.2.2", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.1", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0" - }, - "dependencies": { - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true - }, - "devtron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/devtron/-/devtron-1.4.0.tgz", - "integrity": "sha1-tedIvW6Vu+cL/MaKrm/mlhGUQeE=", - "dev": true, - "requires": { - "accessibility-developer-tools": "^2.11.0", - "highlight.js": "^9.3.0", - "humanize-plus": "^1.8.1" - } - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "dir-compare": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-2.4.0.tgz", - "integrity": "sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==", - "dev": true, - "requires": { - "buffer-equal": "1.0.0", - "colors": "1.0.3", - "commander": "2.9.0", - "minimatch": "3.0.4" - }, - "dependencies": { - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - } - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "dmg-builder": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.10.5.tgz", - "integrity": "sha512-58FEpfH8PEFqjbUNka4bYr52snRT8+LSXrP4gy6EZWOVICbOlmTOYj988pfoLam5C5iXb3odmyUQqwWOxlsEUw==", - "dev": true, - "requires": { - "app-builder-lib": "22.10.5", - "builder-util": "22.10.5", - "dmg-license": "^1.0.8", - "fs-extra": "^9.1.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.0.0", - "sanitize-filename": "^1.6.3" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "dmg-license": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.9.tgz", - "integrity": "sha512-Rq6qMDaDou2+aPN2SYy0x7LDznoJ/XaG6oDcH5wXUp+WRWQMUYE6eM+F+nex+/LSXOp1uw4HLFoed0YbfU8R/Q==", - "dev": true, - "optional": true, - "requires": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "cli-truncate": "^1.1.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.6", - "plist": "^3.0.1", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "requires": { - "utila": "~0.4" - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", - "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - } - } - }, - "domutils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.6.0.tgz", - "integrity": "sha512-y0BezHuy4MDYxh6OvolXYsH+1EMGmFbwv5FKW7ovwMG6zTPWqNPq3WF9ayZssFq+UlKdffGLbOEaghNdaOm1WA==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "dependencies": { - "dom-serializer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.1.tgz", - "integrity": "sha512-Pv2ZluG5ife96udGgEDovOOOA5UELkltfJpnIExPrAk1LTvecolUGn6lIaoLh86d83GiB86CjzciMd9BuRB71Q==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "entities": "^2.0.0" - } - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } - } - }, - "dot-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true - }, - "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "editions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/editions/-/editions-6.1.0.tgz", - "integrity": "sha512-h6nWEyIocfgho9J3sTSuhU/WoFOu1hTX75rPBebNrbF38Y9QFDjCDizYXdikHTySW7Y3mSxli8bpDz9RAtc7rA==", - "dev": true, - "requires": { - "errlop": "^4.0.0", - "version-range": "^1.0.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", - "dev": true, - "requires": { - "jake": "^10.6.1" - } - }, - "electron": { - "version": "11.4.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-11.4.1.tgz", - "integrity": "sha512-FaH15/yN5vSkKk4mieXemEl1AdQ9P+tsBVsgS+uTVa1agnHDcxMxyoPmtme8NsyLCgobVWHIwNtKD1jSADmzXA==", - "dev": true, - "requires": { - "@electron/get": "^1.0.1", - "@types/node": "^12.0.12", - "extract-zip": "^1.0.3" - }, - "dependencies": { - "@types/node": { - "version": "12.19.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.15.tgz", - "integrity": "sha512-lowukE3GUI+VSYSu6VcBXl14d61Rp5hA1D+61r16qnwC0lYNSqdxcvRh0pswejorHfS+HgwBasM8jLXz0/aOsw==", - "dev": true - } - } - }, - "electron-builder": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.10.5.tgz", - "integrity": "sha512-0q/289UUJUhRou6lZKDz/wzK6WprIQ6VXMTmaI+w9qXvSNugPC9UA5s2zXInOkjZOvO/xKnjeyiavrVSHYF3tA==", - "dev": true, - "requires": { - "@types/yargs": "^15.0.13", - "app-builder-lib": "22.10.5", - "bluebird-lst": "^1.0.9", - "builder-util": "22.10.5", - "builder-util-runtime": "8.7.3", - "chalk": "^4.1.0", - "dmg-builder": "22.10.5", - "fs-extra": "^9.1.0", - "is-ci": "^2.0.0", - "lazy-val": "^1.0.4", - "read-config-file": "6.0.0", - "sanitize-filename": "^1.6.3", - "update-notifier": "^5.1.0", - "yargs": "^16.2.0" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "electron-debug": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-3.2.0.tgz", - "integrity": "sha512-7xZh+LfUvJ52M9rn6N+tPuDw6oRAjxUj9SoxAZfJ0hVCXhZCsdkrSt7TgXOiWiEOBgEV8qwUIO/ScxllsPS7ow==", - "dev": true, - "requires": { - "electron-is-dev": "^1.1.0", - "electron-localshortcut": "^3.1.0" - } - }, - "electron-devtools-installer": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz", - "integrity": "sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.2", - "semver": "^7.2.1", - "tslib": "^2.1.0", - "unzip-crx-3": "^0.2.0" - }, - "dependencies": { - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - } - } - }, - "electron-is-accelerator": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", - "integrity": "sha1-UJ5RDCala1Xhf4Y6SwThEYRqsns=", - "dev": true - }, - "electron-is-dev": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.2.0.tgz", - "integrity": "sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==", - "dev": true - }, - "electron-localshortcut": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz", - "integrity": "sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q==", - "dev": true, - "requires": { - "debug": "^4.0.1", - "electron-is-accelerator": "^0.1.0", - "keyboardevent-from-electron-accelerator": "^2.0.0", - "keyboardevents-areequal": "^0.2.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "electron-publish": { - "version": "22.10.5", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.10.5.tgz", - "integrity": "sha512-dHyuazv3P3j1Xyv7pdwTwAvxWab2pCb0G0Oa6qWQoCc4b1/mRGY00M7AvYW1cPuUijj9zYAf1HmXfM6MifaMlA==", - "dev": true, - "requires": { - "@types/fs-extra": "^9.0.7", - "bluebird-lst": "^1.0.9", - "builder-util": "22.10.5", - "builder-util-runtime": "8.7.3", - "chalk": "^4.1.0", - "fs-extra": "^9.1.0", - "lazy-val": "^1.0.4", - "mime": "^2.5.0" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "electron-to-chromium": { - "version": "1.3.727", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz", - "integrity": "sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - } - } - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "env-paths": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true - }, - "errlop": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/errlop/-/errlop-4.1.0.tgz", - "integrity": "sha512-vul6gGBuVt0M2TPi1/WrcL86+Hb3Q2Tpu3TME3sbVhZrYf7J1ZMHCodI25RQKCVurh56qTfvgM0p3w5cT4reSQ==", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", - "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "optional": true - }, - "es6-templates": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", - "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", - "dev": true, - "requires": { - "recast": "~0.11.12", - "through": "~2.3.6" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz", - "integrity": "sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.21", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.4", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.0", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", - "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-config-standard": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz", - "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==", - "dev": true - }, - "eslint-friendly-formatter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-4.0.1.tgz", - "integrity": "sha1-J9UE3IN/fK3b8gGy6EpO5zC6Pvo=", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "coalescy": "1.0.0", - "extend": "^3.0.0", - "minimist": "^1.2.0", - "strip-ansi": "^4.0.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, - "dependencies": { - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-4.0.2.tgz", - "integrity": "sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==", - "dev": true, - "requires": { - "find-cache-dir": "^3.3.1", - "fs-extra": "^8.1.0", - "loader-utils": "^2.0.0", - "object-hash": "^2.0.3", - "schema-utils": "^2.6.5" - }, - "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "schema-utils": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", - "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", - "dev": true, - "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - } - } - }, - "eslint-plugin-es": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.0.tgz", - "integrity": "sha512-6/Jb/J/ZvSebydwbBJO1R9E5ky7YeElfK56Veh7e4QGFHCXoIXGH9HhVz+ibJLM3XJ1XjP+T7rKBLUa/Y7eIng==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", - "dev": true - } - } - }, - "eslint-plugin-html": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.1.2.tgz", - "integrity": "sha512-bhBIRyZFqI4EoF12lGDHAmgfff8eLXx6R52/K3ESQhsxzCzIE6hdebS7Py651f7U3RBotqroUnC3L29bR7qJWQ==", - "dev": true, - "requires": { - "htmlparser2": "^6.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - } - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", - "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", - "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", - "dev": true - }, - "eslint-plugin-standard": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", - "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", - "dev": true - }, - "eslint-plugin-vue": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz", - "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==", - "dev": true, - "requires": { - "natural-compare": "^1.4.0", - "semver": "^5.6.0", - "vue-eslint-parser": "^7.0.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - }, - "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", - "dev": true, - "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "dev": true - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - } - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-glob": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz", - "integrity": "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", - "dev": true - }, - "fastq": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", - "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", - "dev": true, - "requires": { - "reusify": "^1.0.0" - } - }, - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "fecha": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", - "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "dependencies": { - "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "file-stream-rotator": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.5.7.tgz", - "integrity": "sha512-VYb3HZ/GiAGUCrfeakO8Mp54YGswNUHvL7P09WQcXAJNSj3iQ5QraYSp3cIn1MUyw6uzfgN/EFOarCNa4JvUHQ==", - "requires": { - "moment": "^2.11.2" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", - "dev": true - }, - "filenamify": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.2.0.tgz", - "integrity": "sha512-pkgE+4p7N1n7QieOopmn3TqJaefjdWXwEkj2XLZJLKfOgcQKkn11ahvGNgTD8mLggexLiDFQxeTs14xVU22XPA==", - "dev": true, - "requires": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.1", - "trim-repeated": "^1.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "dependencies": { - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "dependencies": { - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true - } - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", - "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "dependencies": { - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - } - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-agent": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.12.tgz", - "integrity": "sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "core-js": "^3.6.5", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "dependencies": { - "core-js": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", - "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==", - "dev": true, - "optional": true - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "optional": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - } - } - }, - "global-tunnel-ng": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", - "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", - "dev": true, - "optional": true, - "requires": { - "encodeurl": "^1.0.2", - "lodash": "^4.17.10", - "npm-conf": "^1.1.3", - "tunnel": "^0.0.6" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - }, - "globalthis": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", - "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", - "dev": true, - "optional": true, - "requires": { - "define-properties": "^1.1.3" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "optional": true, - "requires": { - "object-keys": "^1.0.12" - } - } - } - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - } - }, - "globule": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", - "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - } - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "^1.0.2" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", - "dev": true - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "header-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" - } - }, - "highlight.js": { - "version": "9.18.5", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.5.tgz", - "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", - "dev": true, - "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", - "dev": true - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "dev": true, - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "humanize-plus": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/humanize-plus/-/humanize-plus-1.8.2.tgz", - "integrity": "sha1-pls0RZrWNnrbs3B6gqPJ+RYWcDA=", - "dev": true - }, - "iconv-corefoundation": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.6.tgz", - "integrity": "sha512-1NBe55C75bKGZaY9UHxvXG3G0gEp0ziht7quhuFrW3SPgZDw9HI6qvYXRSV5M/Eupyu8ljuJ6Cba+ec15PZ4Xw==", - "dev": true, - "optional": true, - "requires": { - "cli-truncate": "^1.1.0" - } - }, - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "in-publish": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", - "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "dev": true, - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "invariant": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz", - "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - }, - "dependencies": { - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - } - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", - "dev": true, - "requires": { - "lower-case": "^1.1.0" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - }, - "dependencies": { - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - } - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", - "dev": true, - "requires": { - "upper-case": "^1.1.0" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istextorbinary": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-5.12.0.tgz", - "integrity": "sha512-wLDRWD7qpNTYubk04+q3en1+XZGS4vYWK0+SxNSXJLaITMMEK+J3o/TlOMyULeH1qozVZ9uUkKcyMA8odyxz8w==", - "dev": true, - "requires": { - "binaryextensions": "^4.15.0", - "editions": "^6.1.0", - "textextensions": "^5.11.0" - } - }, - "jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", - "dev": true, - "requires": { - "async": "0.9.x", - "chalk": "^2.4.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "js-base64": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", - "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jszip": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.6.0.tgz", - "integrity": "sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==", - "dev": true, - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "keyboardevent-from-electron-accelerator": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz", - "integrity": "sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==", - "dev": true - }, - "keyboardevents-areequal": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", - "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==", - "dev": true - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", - "dev": true - }, - "kind-of": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", - "dev": true, - "requires": { - "is-buffer": "^1.0.2" - } - }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lazy-val": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", - "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "requires": { - "immediate": "~3.0.5" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.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._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", - "dev": true - }, - "lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._baseclone": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", - "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", - "dev": true, - "requires": { - "lodash._arraycopy": "^3.0.0", - "lodash._arrayeach": "^3.0.0", - "lodash._baseassign": "^3.0.0", - "lodash._basefor": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basefor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.clonedeep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", - "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", - "dev": true, - "requires": { - "lodash._baseclone": "^3.0.0", - "lodash._bindcallback": "^3.0.0" - } - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", - "dev": true - }, - "lodash.istypedarray": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", - "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.keysin": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz", - "integrity": "sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8=", - "dev": true, - "requires": { - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.merge": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-3.3.2.tgz", - "integrity": "sha1-DZDZPtY3sYeEN7s+IWASYNev6ZQ=", - "dev": true, - "requires": { - "lodash._arraycopy": "^3.0.0", - "lodash._arrayeach": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.isplainobject": "^3.0.0", - "lodash.istypedarray": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.keysin": "^3.0.0", - "lodash.toplainobject": "^3.0.0" - }, - "dependencies": { - "lodash.isplainobject": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz", - "integrity": "sha1-moI4rhayAEMpYM1zRlEtASP79MU=", - "dev": true, - "requires": { - "lodash._basefor": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.keysin": "^3.0.0" - } - } - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.some": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", - "dev": true - }, - "lodash.toplainobject": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz", - "integrity": "sha1-KHkK2ULSk9eKpmOgfs9/UsoEGY0=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keysin": "^3.0.0" - } - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "log-update": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", - "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", - "dev": true, - "requires": { - "ansi-escapes": "^1.0.0", - "cli-cursor": "^1.0.2" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "^1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - } - } - }, - "logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "^3.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", - "dev": true, - "requires": { - "lower-case": "^1.1.2" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "optional": true, - "requires": { - "escape-string-regexp": "^4.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "optional": true - } - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "mime": { - "version": "2.4.7", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", - "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", - "dev": true - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.0.tgz", - "integrity": "sha512-dVWGuWJlQw2lZxsxBI3hOsoxg1k3DruLR0foHQLSkQMfk+qLJbv9dUk8fjmjWQKN9ef2n54ehA2FjClAsQhrWQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "multispinner": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/multispinner/-/multispinner-0.2.1.tgz", - "integrity": "sha1-wcwQDPxAxpe4oSw6JegVmOzMKfQ=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "figures": "^1.4.0", - "kind-of": "^2.0.1", - "lodash.clonedeep": "^3.0.2", - "lodash.merge": "^3.3.2", - "log-update": "^1.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - } - } - }, - "nan": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", - "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", - "dev": true, - "requires": { - "xml-char-classes": "^1.0.0" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "node-loader": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-0.6.0.tgz", - "integrity": "sha1-x5fvUQle1YWZArFX9jhPY2HgWug=", - "dev": true - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true - }, - "node-notifier": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.1.tgz", - "integrity": "sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA==", - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, - "node-sass": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", - "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "2.2.5", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, - "npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "dev": true, - "optional": true, - "requires": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - } - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "requires": { - "boolbase": "~1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" - }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, - "object-is": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", - "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - } - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - } - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", - "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "requires": { - "fn.name": "1.x.x" - } - }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "dev": true, - "requires": { - "retry": "^0.12.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", - "dev": true, - "requires": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", - "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==", - "dev": true, - "optional": true, - "requires": { - "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7", - "xmldom": "^0.5.0" - }, - "dependencies": { - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "optional": true - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true, - "optional": true - } - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" - }, - "dependencies": { - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.29", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.29.tgz", - "integrity": "sha512-ba0ApvR3LxGvRMMiUa9n0WR4HjzcYm7tS+ht4/2Nd0NLtHpPIH77fuB9Xh1/yJVz9O/E/95Y/dn8ygWsyffXtw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" - } - }, - "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", - "dev": true, - "optional": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true, - "optional": true - }, - "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, - "read-config-file": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.0.0.tgz", - "integrity": "sha512-PHjROSdpceKUmqS06wqwP92VrM46PZSTubmNIMJ5DrMwg1OgenSTSEHIkCa6TiOJ+y/J0xnG1fFwG3M+Oi1aNA==", - "dev": true, - "requires": { - "dotenv": "^8.2.0", - "dotenv-expand": "^5.1.0", - "js-yaml": "^3.13.1", - "json5": "^2.1.2", - "lazy-val": "^1.0.4" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "dependencies": { - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", - "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "dev": true, - "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - } - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", - "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", - "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", - "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - } - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "regexpu-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", - "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.2.0", - "regjsgen": "^0.5.1", - "regjsparser": "^0.6.4", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.2.0" - } - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "regjsgen": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true - }, - "regjsparser": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", - "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz", - "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==", - "dev": true, - "requires": { - "css-select": "^1.1.0", - "dom-converter": "~0.2", - "htmlparser2": "~3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" - }, - "dependencies": { - "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.1", - "domutils": "1.1", - "readable-stream": "1.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true - }, - "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "optional": true, - "requires": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true, - "optional": true - } - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "requires": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "sass-graph": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", - "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^13.3.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - }, - "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, - "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", - "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", - "dev": true - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", - "dev": true, - "requires": { - "node-forge": "^0.10.0" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "semver-compare": { + "packages": { + "": { + "name": "pomotroid", "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", - "dev": true, - "optional": true - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" - } - }, - "serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, + "license": "MIT", + "dependencies": { + "@inlang/paraglide-js": "^2.13.0", + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-dialog": "^2.6.0", + "@tauri-apps/plugin-log": "^2.8.0", + "@tauri-apps/plugin-notification": "^2.3.3", + "@tauri-apps/plugin-opener": "^2" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.6", + "@sveltejs/kit": "^2.9.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tauri-apps/cli": "^2", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "typescript": "~5.6.2", + "vite": "^6.0.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", "optional": true, - "requires": { - "type-fest": "^0.13.1" - }, - "dependencies": { - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "optional": true - } - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - } - } - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true, - "optional": true - }, - "snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", - "dev": true, - "requires": { - "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", - "websocket-driver": "^0.7.4" - } - }, - "sockjs-client": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", - "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", - "dev": true, - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.4.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - } - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - } - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" + "node_modules/@inlang/paraglide-js": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@inlang/paraglide-js/-/paraglide-js-2.13.0.tgz", + "integrity": "sha512-m7JQiTeLC3tY3DusUCc4iRWlsKoMuDLhw4iGhkY0yI96ki7PK42DLsi1kMk8ubSVenKOwgrs7eqQZN1Htvkhew==", + "license": "MIT", + "dependencies": { + "@inlang/recommend-sherlock": "^0.2.1", + "@inlang/sdk": "^2.7.0", + "commander": "11.1.0", + "consola": "3.4.0", + "json5": "2.2.3", + "unplugin": "^2.1.2", + "urlpattern-polyfill": "^10.0.0" + }, + "bin": { + "paraglide-js": "bin/run.js" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" + "node_modules/@inlang/recommend-sherlock": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@inlang/recommend-sherlock/-/recommend-sherlock-0.2.1.tgz", + "integrity": "sha512-ckv8HvHy/iTqaVAEKrr+gnl+p3XFNwe5D2+6w6wJk2ORV2XkcRkKOJ/XsTUJbPSiyi4PI+p+T3bqbmNx/rDUlg==", + "license": "MIT", + "dependencies": { + "comment-json": "^4.2.3" } }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.2" + "node_modules/@inlang/sdk": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@inlang/sdk/-/sdk-2.7.0.tgz", + "integrity": "sha512-yJNBD0o8i29TTJqWX5uDRHxnalDGcsUDctxepzFXsUfkzqGWfiFBxODdxvReqvM2CuKAAOo/kib/F1UcgdYFNQ==", + "license": "MIT", + "dependencies": { + "@lix-js/sdk": "0.4.7", + "@sinclair/typebox": "^0.31.17", + "kysely": "^0.27.4", + "sqlite-wasm-kysely": "0.3.0", + "uuid": "^13.0.0" + }, + "engines": { + "node": ">=18.0.0" } }, - "style-loader": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", - "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "schema-utils": "^2.6.6" - }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", "dependencies": { - "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "schema-utils": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", - "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", - "dev": true, - "requires": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - } - } + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "requires": { - "debug": "^4.1.0" - }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", - "dev": true, - "requires": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" } }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "ajv": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.3.0.tgz", - "integrity": "sha512-RYE7B5An83d7eWnDR8kbdaIFqmKCNsP16ay1hDbJEU+sa0e3H9SebskCt0Uufem6cfAVu7Col6ubcn/W+Sm8/Q==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", - "dev": true - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" }, - "temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "requires": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", "dependencies": { - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, + "node_modules/@lix-js/sdk": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@lix-js/sdk/-/sdk-0.4.7.tgz", + "integrity": "sha512-pRbW+joG12L0ULfMiWYosIW0plmW4AsUdiPCp+Z8rAsElJ+wJ6in58zhD3UwUcd4BNcpldEGjg6PdA7e0RgsDQ==", + "license": "Apache-2.0", "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "@lix-js/server-protocol-schema": "0.1.1", + "dedent": "1.5.1", + "human-id": "^4.1.1", + "js-sha256": "^0.11.0", + "kysely": "^0.27.4", + "sqlite-wasm-kysely": "0.3.0", + "uuid": "^10.0.0" }, - "dependencies": { - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } + "engines": { + "node": ">=18" } }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "textextensions": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-5.12.0.tgz", - "integrity": "sha512-IYogUDaP65IXboCiPPC0jTLLBzYlhhw2Y4b0a2trPgbHNGGGEfuHE6tds+yDcCf4mpNDaGISFzwSSezcXt+d6w==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "node_modules/@lix-js/sdk/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "node_modules/@lix-js/server-protocol-schema": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@lix-js/server-protocol-schema/-/server-protocol-schema-0.1.1.tgz", + "integrity": "sha512-jBeALB6prAbtr5q4vTuxnRZZv1M2rKe8iNqRQhFJ4Tv7150unEa0vKyz0hs8Gl3fUGsWaNJBh3J8++fpbrpRBQ==", + "license": "Apache-2.0" + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.58.0.tgz", + "integrity": "sha512-mr0tmS/4FoVk1cnaeN244A/wjvGDNItZKR8hRhnmCzygyRXYtKF5jVDSIILR1U97CTzAYmbgIj/Dukg62ggG5w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.58.0.tgz", + "integrity": "sha512-+s++dbp+/RTte62mQD9wLSbiMTV+xr/PeRJEc/sFZFSBRlHPNPVaf5FXlzAL77Mr8FtSfQqCN+I598M8U41ccQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.58.0.tgz", + "integrity": "sha512-MFWBwTcYs0jZbINQBXHfSrpSQJq3IUOakcKPzfeSznONop14Pxuqa0Kg19GD0rNBMPQI2tFtu3UzapZpH0Uc1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.58.0.tgz", + "integrity": "sha512-yiKJY7pj9c9JwzuKYLFaDZw5gma3fI9bkPEIyofvVfsPqjCWPglSHdpdwXpKGvDeYDms3Qal8qGMEHZ1M/4Udg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.58.0.tgz", + "integrity": "sha512-x97kCoBh5MOevpn/CNK9W1x8BEzO238541BGWBc315uOlN0AD/ifZ1msg+ZQB05Ux+VF6EcYqpiagfLJ8U3LvQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.58.0.tgz", + "integrity": "sha512-Aa8jPoZ6IQAG2eIrcXPpjRcMjROMFxCt1UYPZZtCxRV68WkuSigYtQ/7Zwrcr2IvtNJo7T2JfDXyMLxq5L4Jlg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.58.0.tgz", + "integrity": "sha512-Ob8YgT5kD/lSIYW2Rcngs5kNB/44Q2RzBSPz9brf2WEtcGR7/f/E9HeHn1wYaAwKBni+bdXEwgHvUd0x12lQSA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.58.0.tgz", + "integrity": "sha512-K+RI5oP1ceqoadvNt1FecL17Qtw/n9BgRSzxif3rTL2QlIu88ccvY+Y9nnHe/cmT5zbH9+bpiJuG1mGHRVwF4Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.58.0.tgz", + "integrity": "sha512-T+17JAsCKUjmbopcKepJjHWHXSjeW7O5PL7lEFaeQmiVyw4kkc5/lyYKzrv6ElWRX/MrEWfPiJWqbTvfIvjM1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.58.0.tgz", + "integrity": "sha512-cCePktb9+6R9itIJdeCFF9txPU7pQeEHB5AbHu/MKsfH/k70ZtOeq1k4YAtBv9Z7mmKI5/wOLYjQ+B9QdxR6LA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.58.0.tgz", + "integrity": "sha512-iekUaLkfliAsDl4/xSdoCJ1gnnIXvoNz85C8U8+ZxknM5pBStfZjeXgB8lXobDQvvPRCN8FPmmuTtH+z95HTmg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.58.0.tgz", + "integrity": "sha512-68ofRgJNl/jYJbxFjCKE7IwhbfxOl1muPN4KbIqAIe32lm22KmU7E8OPvyy68HTNkI2iV/c8y2kSPSm2mW/Q9Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.58.0.tgz", + "integrity": "sha512-dpz8vT0i+JqUKuSNPCP5SYyIV2Lh0sNL1+FhM7eLC457d5B9/BC3kDPp5BBftMmTNsBarcPcoz5UGSsnCiw4XQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.58.0.tgz", + "integrity": "sha512-4gdkkf9UJ7tafnweBCR/mk4jf3Jfl0cKX9Np80t5i78kjIH0ZdezUv/JDI2VtruE5lunfACqftJ8dIMGN4oHew==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.58.0.tgz", + "integrity": "sha512-YFS4vPnOkDTD/JriUeeZurFYoJhPf9GQQEF/v4lltp3mVcBmnsAdjEWhr2cjUCZzZNzxCG0HZOvJU44UGHSdzw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.58.0.tgz", + "integrity": "sha512-x2xgZlFne+QVNKV8b4wwaCS8pwq3y14zedZ5DqLzjdRITvreBk//4Knbcvm7+lWmms9V9qFp60MtUd0/t/PXPw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.58.0.tgz", + "integrity": "sha512-jIhrujyn4UnWF8S+DHSkAkDEO3hLX0cjzxJZPLF80xFyzyUIYgSMRcYQ3+uqEoyDD2beGq7Dj7edi8OnJcS/hg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.58.0.tgz", + "integrity": "sha512-+410Srdoh78MKSJxTQ+hZ/Mx+ajd6RjjPwBPNd0R3J9FtL6ZA0GqiiyNjCO9In0IzZkCNrpGymSfn+kgyPQocg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.58.0.tgz", + "integrity": "sha512-ZjMyby5SICi227y1MTR3VYBpFTdZs823Rs/hpakufleBoufoOIB6jtm9FEoxn/cgO7l6PM2rCEl5Kre5vX0QrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.58.0.tgz", + "integrity": "sha512-ds4iwfYkSQ0k1nb8LTcyXw//ToHOnNTJtceySpL3fa7tc/AsE+UpUFphW126A6fKBGJD5dhRvg8zw1rvoGFxmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.58.0.tgz", + "integrity": "sha512-fd/zpJniln4ICdPkjWFhZYeY/bpnaN9pGa6ko+5WD38I0tTqk9lXMgXZg09MNdhpARngmxiCg0B0XUamNw/5BQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.58.0.tgz", + "integrity": "sha512-YpG8dUOip7DCz3nr/JUfPbIUo+2d/dy++5bFzgi4ugOGBIox+qMbbqt/JoORwvI/C9Kn2tz6+Bieoqd5+B1CjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.58.0.tgz", + "integrity": "sha512-b9DI8jpFQVh4hIXFr0/+N/TzLdpBIoPzjt0Rt4xJbW3mzguV3mduR9cNgiuFcuL/TeORejJhCWiAXe3E/6PxWA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.58.0.tgz", + "integrity": "sha512-CSrVpmoRJFN06LL9xhkitkwUcTZtIotYAF5p6XOR2zW0Zz5mzb3IPpcoPhB02frzMHFNo1reQ9xSF5fFm3hUsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.58.0.tgz", + "integrity": "sha512-QFsBgQNTnh5K0t/sBsjJLq24YVqEIVkGpfN2VHsnN90soZyhaiA9UUHufcctVNL4ypJY0wrwad0wslx2KJQ1/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sinclair/typebox": { + "version": "0.31.28", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.31.28.tgz", + "integrity": "sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ==", + "license": "MIT" + }, + "node_modules/@sqlite.org/sqlite-wasm": { + "version": "3.48.0-build4", + "resolved": "https://registry.npmjs.org/@sqlite.org/sqlite-wasm/-/sqlite-wasm-3.48.0-build4.tgz", + "integrity": "sha512-hI6twvUkzOmyGZhQMza1gpfqErZxXRw6JEsiVjUbo7tFanVD+8Oil0Ih3l2nGzHdxPI41zFmfUQG7GHqhciKZQ==", + "license": "Apache-2.0", + "bin": { + "sqlite-wasm": "bin/index.js" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.53.0", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.53.0.tgz", + "integrity": "sha512-Brh/9h8QEg7rWIj+Nnz/2sC49NUeS8g3Qd9H5dTO3EbWG8vCEUl06jE+r5jQVDMHdr1swmCkwZkONFsWelGTpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.6.3", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "set-cookie-parser": "^3.0.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.3.3", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "typescript": { + "optional": true } } }, - "thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "node_modules/@sveltejs/kit/node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", "dev": true, - "requires": { - "setimmediate": "^1.0.4" + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" } }, - "title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "node_modules/@sveltejs/kit/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, + "license": "MIT", "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.0.6" }, - "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" } }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", "dev": true, - "requires": { - "escape-string-regexp": "^1.0.2" + "license": "MIT", + "dependencies": { + "debug": "^4.3.7" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "node_modules/@sveltejs/vite-plugin-svelte-inspector/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "requires": { - "glob": "^7.1.2" + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "node_modules/@sveltejs/vite-plugin-svelte-inspector/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "requires": { - "utf8-byte-length": "^1.0.1" - } + "license": "MIT" }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "node_modules/@sveltejs/vite-plugin-svelte/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, + "license": "MIT", "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", - "dev": true - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "node_modules/@sveltejs/vite-plugin-svelte/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "optional": true + "license": "MIT" }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" + "node_modules/@tauri-apps/api": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.10.1.tgz", + "integrity": "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/@tauri-apps/cli": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.10.0.tgz", + "integrity": "sha512-ZwT0T+7bw4+DPCSWzmviwq5XbXlM0cNoleDKOYPFYqcZqeKY31KlpoMW/MOON/tOFBPgi31a2v3w9gliqwL2+Q==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.10.0", + "@tauri-apps/cli-darwin-x64": "2.10.0", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.0", + "@tauri-apps/cli-linux-arm64-gnu": "2.10.0", + "@tauri-apps/cli-linux-arm64-musl": "2.10.0", + "@tauri-apps/cli-linux-riscv64-gnu": "2.10.0", + "@tauri-apps/cli-linux-x64-gnu": "2.10.0", + "@tauri-apps/cli-linux-x64-musl": "2.10.0", + "@tauri-apps/cli-win32-arm64-msvc": "2.10.0", + "@tauri-apps/cli-win32-ia32-msvc": "2.10.0", + "@tauri-apps/cli-win32-x64-msvc": "2.10.0" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.10.0.tgz", + "integrity": "sha512-avqHD4HRjrMamE/7R/kzJPcAJnZs0IIS+1nkDP5b+TNBn3py7N2aIo9LIpy+VQq0AkN8G5dDpZtOOBkmWt/zjA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "prelude-ls": "^1.2.1" + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" } }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.10.0.tgz", + "integrity": "sha512-keDmlvJRStzVFjZTd0xYkBONLtgBC9eMTpmXnBXzsHuawV2q9PvDo2x6D5mhuoMVrJ9QWjgaPKBBCFks4dK71Q==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.10.0.tgz", + "integrity": "sha512-e5u0VfLZsMAC9iHaOEANumgl6lfnJx0Dtjkd8IJpysZ8jp0tJ6wrIkto2OzQgzcYyRCKgX72aKE0PFgZputA8g==", + "cpu": [ + "arm" + ], "dev": true, - "requires": { - "is-typedarray": "^1.0.0" + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.10.0.tgz", + "integrity": "sha512-YrYYk2dfmBs5m+OIMCrb+JH/oo+4FtlpcrTCgiFYc7vcs6m3QDd1TTyWu0u01ewsCtK2kOdluhr/zKku+KP7HA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true - }, - "unicode-canonical-property-names-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", - "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.10.0.tgz", + "integrity": "sha512-GUoPdVJmrJRIXFfW3Rkt+eGK9ygOdyISACZfC/bCSfOnGt8kNdQIQr5WRH9QUaTVFIwxMlQyV3m+yXYP+xhSVA==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^1.0.4", - "unicode-property-aliases-ecmascript": "^1.0.4" + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "unicode-match-property-value-ecmascript": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", - "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.10.0.tgz", + "integrity": "sha512-JO7s3TlSxshwsoKNCDkyvsx5gw2QAs/Y2GbR5UE2d5kkU138ATKoPOtxn8G1fFT1aDW4LH0rYAAfBpGkDyJJnw==", + "cpu": [ + "riscv64" + ], "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.10.0.tgz", + "integrity": "sha512-Uvh4SUUp4A6DVRSMWjelww0GnZI3PlVy7VS+DRF5napKuIehVjGl9XD0uKoCoxwAQBLctvipyEK+pDXpJeoHng==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "unique-slug": "^2.0.0" + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.10.0.tgz", + "integrity": "sha512-AP0KRK6bJuTpQ8kMNWvhIpKUkQJfcPFeba7QshOQZjJ8wOS6emwTN4K5g/d3AbCMo0RRdnZWwu67MlmtJyxC1Q==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "imurmurhash": "^0.1.4" + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.10.0.tgz", + "integrity": "sha512-97DXVU3dJystrq7W41IX+82JEorLNY+3+ECYxvXWqkq7DBN6FsA08x/EFGE8N/b0LTOui9X2dvpGGoeZKKV08g==", + "cpu": [ + "arm64" + ], "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.10.0.tgz", + "integrity": "sha512-EHyQ1iwrWy1CwMalEm9z2a6L5isQ121pe7FcA2xe4VWMJp+GHSDDGvbTv/OPdkt2Lyr7DAZBpZHM6nvlHXEc4A==", + "cpu": [ + "ia32" + ], "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "unzip-crx-3": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", - "integrity": "sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==", + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.10.0.tgz", + "integrity": "sha512-NTpyQxkpzGmU6ceWBTY2xRIEaS0ZLbVx1HE1zTA3TY/pV3+cPoPPOs+7YScr4IMzXMtOw7tLw5LEXo5oIG3qaQ==", + "cpu": [ + "x64" + ], "dev": true, - "requires": { - "jszip": "^3.1.0", - "mkdirp": "^0.5.1", - "yaku": "^0.16.6" + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, + "node_modules/@tauri-apps/plugin-dialog": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.6.0.tgz", + "integrity": "sha512-q4Uq3eY87TdcYzXACiYSPhmpBA76shgmQswGkSVio4C82Sz2W4iehe9TnKYwbq7weHiL88Yw19XZm7v28+Micg==", + "license": "MIT OR Apache-2.0", "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } + "@tauri-apps/api": "^2.8.0" } }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true + "node_modules/@tauri-apps/plugin-log": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-log/-/plugin-log-2.8.0.tgz", + "integrity": "sha512-a+7rOq3MJwpTOLLKbL8d0qGZ85hgHw5pNOWusA9o3cf7cEgtYHiGY/+O8fj8MvywQIGqFv0da2bYQDlrqLE7rw==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } }, - "upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", - "dev": true, - "requires": { - "upper-case": "^1.1.1" + "node_modules/@tauri-apps/plugin-notification": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-notification/-/plugin-notification-2.3.3.tgz", + "integrity": "sha512-Zw+ZH18RJb41G4NrfHgIuofJiymusqN+q8fGUIIV7vyCH+5sSn5coqRv/MWB9qETsUs97vmU045q7OyseCV3Qg==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" } }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - }, + "node_modules/@tauri-apps/plugin-opener": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.3.tgz", + "integrity": "sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ==", + "license": "MIT OR Apache-2.0", "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } + "@tauri-apps/api": "^2.8.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } + "license": "MIT" }, - "url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "node_modules/@types/node": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "dev": true, - "requires": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.6", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } + "undici-types": "~7.18.0" } }, - "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } + "license": "MIT" }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, - "dependencies": { - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - } + "engines": { + "node": ">=0.4.0" } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } }, - "utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", - "dev": true + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "license": "MIT" }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "requires": { - "inherits": "2.0.3" + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true, + "optional": true, + "peer": true }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "node_modules/comment-json": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.5.1.tgz", + "integrity": "sha512-taEtr3ozUmOB7it68Jll7s0Pwm+aoiHyXKrEC8SEodL4rNpdfDLqa7PfBlrgFoCNNdR8ImL+muti5IGvktJAAg==", + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "uuid": { + "node_modules/consola": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "node_modules/dedent": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } } }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/devalue": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz", + "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } + "license": "MIT" }, - "version-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/version-compare/-/version-compare-1.1.0.tgz", - "integrity": "sha512-zVKtPOJTC9x23lzS4+4D7J+drq80BXVYAmObnr5zqxxFVH7OffJ1lJlAS7LYsQNV56jx/wtbw0UV7XHLrvd6kQ==", - "dev": true + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "version-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/version-range/-/version-range-1.1.0.tgz", - "integrity": "sha512-R1Ggfg2EXamrnrV3TkZ6yBNgITDbclB3viwSjbZ3+eK0VVNK4ajkYJTnDz5N0bIMYDtK9MUBvXJUnKO5RWWJ6w==", + "node_modules/esrap": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.3.tgz", + "integrity": "sha512-8fOS+GIGCQZl/ZIlhl59htOlms6U8NvX6ZYgYHpRU/b6tVSh3uHkOHZikl3D4cMbYM0JlpBe+p/BkZEi8J9XIQ==", "dev": true, - "requires": { - "version-compare": "^1.0.0" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" } }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "vue": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", - "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==" - }, - "vue-electron": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/vue-electron/-/vue-electron-1.0.6.tgz", - "integrity": "sha1-55jgMYC4kzU53v4x+S5TuSQrlAY=" + "node_modules/human-id": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz", + "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==", + "license": "MIT", + "bin": { + "human-id": "dist/cli.js" + } }, - "vue-eslint-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.0.0.tgz", - "integrity": "sha512-yR0dLxsTT7JfD2YQo9BhnQ6bUTLsZouuzt9SKRP7XNaZJV459gvlsJo4vT2nhZ/2dH9j3c53bIx9dnqU2prM9g==", + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", "dev": true, - "requires": { - "debug": "^4.1.1", - "eslint-scope": "^5.0.0", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "lodash": "^4.17.15" - }, + "license": "MIT", "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "@types/estree": "^1.0.6" } }, - "vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", - "dev": true + "node_modules/js-sha256": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.11.1.tgz", + "integrity": "sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg==", + "license": "MIT" }, - "vue-html-loader": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/vue-html-loader/-/vue-html-loader-1.2.4.tgz", - "integrity": "sha1-VM5Im+BgZckdwqEXMSLz4ATgolM=", - "dev": true, - "requires": { - "es6-templates": "^0.2.2", - "fastparse": "^1.0.0", - "html-minifier": "^2.1.5", - "loader-utils": "^1.0.2", - "object-assign": "^4.1.0" + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "clean-css": { - "version": "3.4.28", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", - "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", - "dev": true, - "requires": { - "commander": "2.8.x", - "source-map": "0.4.x" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - } - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "html-minifier": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-2.1.7.tgz", - "integrity": "sha1-kFHW/LvPIU7TB+GtdPQyu5rWVcw=", - "dev": true, - "requires": { - "change-case": "3.0.x", - "clean-css": "3.4.x", - "commander": "2.9.x", - "he": "1.1.x", - "ncname": "1.0.x", - "relateurl": "0.2.x", - "uglify-js": "2.6.x" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "uglify-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", - "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", - "dev": true, - "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } + "engines": { + "node": ">=6" } }, - "vue-loader": { - "version": "15.9.7", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.7.tgz", - "integrity": "sha512-qzlsbLV1HKEMf19IqCJqdNvFJRCI58WNbS6XbPqK13MrLz65es75w392MSQ5TsARAfIjUw+ATm3vlCXUJSOH9Q==", + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, - "requires": { - "@vue/component-compiler-utils": "^3.1.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "vue-hot-reload-api": "^2.3.0", - "vue-style-loader": "^4.1.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "vue-style-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", - "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", - "dev": true, - "requires": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" + "node_modules/kysely": { + "version": "0.27.6", + "resolved": "https://registry.npmjs.org/kysely/-/kysely-0.27.6.tgz", + "integrity": "sha512-FIyV/64EkKhJmjgC0g2hygpBv5RNWVPyNCqSAD7eTCv6eFWNIi4PN1UvdSJGicN/o35bnevgis4Y0UDC0qi8jQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" } }, - "vue-template-compiler": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz", - "integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==", + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, - "requires": { - "de-indent": "^1.0.2", - "he": "^1.1.0" + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "vuex": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", - "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==" + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - }, - "dependencies": { - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "optional": true - } - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/rollup": { + "version": "4.58.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.58.0.tgz", + "integrity": "sha512-wbT0mBmWbIvvq8NeEYWWvevvxnOyhKChir47S66WCxw1SXqhw7ssIYejnQEVt7XYQpsj2y8F9PM+Cr3SNEa0gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.58.0", + "@rollup/rollup-android-arm64": "4.58.0", + "@rollup/rollup-darwin-arm64": "4.58.0", + "@rollup/rollup-darwin-x64": "4.58.0", + "@rollup/rollup-freebsd-arm64": "4.58.0", + "@rollup/rollup-freebsd-x64": "4.58.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.58.0", + "@rollup/rollup-linux-arm-musleabihf": "4.58.0", + "@rollup/rollup-linux-arm64-gnu": "4.58.0", + "@rollup/rollup-linux-arm64-musl": "4.58.0", + "@rollup/rollup-linux-loong64-gnu": "4.58.0", + "@rollup/rollup-linux-loong64-musl": "4.58.0", + "@rollup/rollup-linux-ppc64-gnu": "4.58.0", + "@rollup/rollup-linux-ppc64-musl": "4.58.0", + "@rollup/rollup-linux-riscv64-gnu": "4.58.0", + "@rollup/rollup-linux-riscv64-musl": "4.58.0", + "@rollup/rollup-linux-s390x-gnu": "4.58.0", + "@rollup/rollup-linux-x64-gnu": "4.58.0", + "@rollup/rollup-linux-x64-musl": "4.58.0", + "@rollup/rollup-openbsd-x64": "4.58.0", + "@rollup/rollup-openharmony-arm64": "4.58.0", + "@rollup/rollup-win32-arm64-msvc": "4.58.0", + "@rollup/rollup-win32-ia32-msvc": "4.58.0", + "@rollup/rollup-win32-x64-gnu": "4.58.0", + "@rollup/rollup-win32-x64-msvc": "4.58.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, + "license": "MIT", "optional": true, - "requires": { - "chokidar": "^2.1.8" + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "dev": true, - "requires": { - "minimalistic-assert": "^1.0.0" + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" } }, - "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "node_modules/set-cookie-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.0.1.tgz", + "integrity": "sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, + "license": "MIT" + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" } }, - "webpack-dev-middleware": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", - "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", - "selfsigned": "^1.10.8", - "semver": "^6.3.0", - "serve-index": "^1.9.1", - "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", - "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" - }, + "node_modules/sqlite-wasm-kysely": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/sqlite-wasm-kysely/-/sqlite-wasm-kysely-0.3.0.tgz", + "integrity": "sha512-TzjBNv7KwRw6E3pdKdlRyZiTmUIE0UttT/Sl56MVwVARl/u5gp978KepazCJZewFUnlWHz9i3NQd4kOtP/Afdg==", "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "@sqlite.org/sqlite-wasm": "^3.48.0-build2" + }, + "peerDependencies": { + "kysely": "*" } }, - "webpack-hot-middleware": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", - "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", + "node_modules/svelte": { + "version": "5.53.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.53.0.tgz", + "integrity": "sha512-7dhHkSamGS2vtoBmIW2hRab+gl5Z60alEHZB4910ePqqJNxAWnDAxsofVmlZ2tREmWyHNE+A1nCKwICAquoD2A==", "dev": true, - "requires": { - "ansi-html": "0.0.7", - "html-entities": "^1.2.0", - "querystring": "^0.2.0", - "strip-ansi": "^3.0.0" + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.6.3", + "esm-env": "^1.2.1", + "esrap": "^2.2.2", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" } }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "node_modules/svelte-check": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.3.tgz", + "integrity": "sha512-4HtdEv2hOoLCEsSXI+RDELk9okP/4sImWa7X02OjMFFOWeSdFF3NFy3vqpw0z+eH9C88J9vxZfUXz/Uv2A1ANw==", "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/svelte-check/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", "dependencies": { - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true - } + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "node_modules/svelte-check/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "license": "MIT", + "engines": { + "node": ">=12.0.0" }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true } } }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "node_modules/svelte-check/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "node_modules/svelte/node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", "dev": true, - "requires": { - "isexe": "^2.0.0" + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "node_modules/terser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", + "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "requires": { - "string-width": "^4.0.0" - } + "optional": true, + "peer": true }, - "window-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-1.1.1.tgz", - "integrity": "sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA==", + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "requires": { - "define-property": "^1.0.0", - "is-number": "^3.0.0" + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" } }, - "winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", - "requires": { - "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", - "is-stream": "^2.0.0", - "logform": "^2.2.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" - }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", - "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - } + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "winston-daily-rotate-file": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.5.5.tgz", - "integrity": "sha512-ds0WahIjiDhKCiMXmY799pDBW+58ByqIBtUcsqr4oDoXrAI3Zn+hbgFdUxzMfqA93OG0mPLYVMiotqTgE/WeWQ==", - "requires": { - "file-stream-rotator": "^0.5.7", - "object-hash": "^2.0.1", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", - "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true } } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, - "requires": { - "errno": "~0.1.7" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "worker-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", - "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", - "requires": { - "loader-utils": "^1.0.0", - "schema-utils": "^0.4.0" + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } + "engines": { + "node": ">=14.17" } }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/unplugin": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", + "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", + "license": "MIT", "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } + "terser": { + "optional": true }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "tsx": { + "optional": true }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } + "yaml": { + "optional": true } } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", - "dev": true - }, - "xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "optional": true - }, - "xmldom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", - "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==", + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "optional": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yaku": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", - "integrity": "sha1-HRlceKqbW/hHnIlblQT9TwhHmE4=", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/vite/node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true } } }, - "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", - "dev": true + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } + "license": "MIT" } } } diff --git a/package-tauri.json b/package-tauri.json new file mode 100644 index 0000000..855ba2e --- /dev/null +++ b/package-tauri.json @@ -0,0 +1,29 @@ +{ + "name": "pomotroid-tauri", + "version": "0.1.0", + "description": "", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "tauri": "tauri" + }, + "license": "MIT", + "dependencies": { + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.6", + "@sveltejs/kit": "^2.9.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "typescript": "~5.6.2", + "vite": "^6.0.3", + "@tauri-apps/cli": "^2" + } +} diff --git a/package.json b/package.json index f68baf1..3f01827 100644 --- a/package.json +++ b/package.json @@ -1,160 +1,41 @@ { "name": "pomotroid", - "version": "0.13.0", + "version": "1.0.0", + "description": "A simple and visually-pleasing Pomodoro timer", "author": { "email": "flyweight@pm.me", "name": "Christopher Murphy", "url": "https://github.com/splode" }, - "description": "A simple and visually-pleasing Pomodoro timer", "homepage": "https://github.com/Splode/pomotroid", "license": "MIT", - "main": "./dist/electron/main.js", "repository": "github:splode/pomotroid", + "type": "module", "scripts": { - "build": "node .electron-vue/build.js && electron-builder", - "build:win32": "node .electron-vue/build.js && electron-builder --ia32", - "build:dir": "node .electron-vue/build.js && electron-builder --dir", - "build:clean": "cross-env BUILD_TARGET=clean node .electron-vue/build.js", - "build:web": "cross-env BUILD_TARGET=web node .electron-vue/build.js", - "dev": "node .electron-vue/dev-runner.js", - "dist": "node .electron-vue/build.js && electron-builder -w -l -o", - "lint": "eslint --ext .js,.vue -f ./node_modules/eslint-friendly-formatter src", - "lint:fix": "eslint --ext .js,.vue -f ./node_modules/eslint-friendly-formatter --fix src", - "pack": "npm run pack:main && npm run pack:renderer", - "pack:main": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.main.config.js", - "pack:renderer": "cross-env NODE_ENV=production webpack --progress --colors --config .electron-vue/webpack.renderer.config.js", - "postinstall": "npm run lint:fix" - }, - "build": { - "productName": "Pomotroid", - "appId": "com.splode.pomotroid", - "directories": { - "output": "build" - }, - "files": [ - "dist/electron/**/*" - ], - "dmg": { - "contents": [ - { - "x": 410, - "y": 150, - "type": "link", - "path": "/Applications" - }, - { - "x": 130, - "y": 150, - "type": "file" - } - ] - }, - "mac": { - "artifactName": "pomotroid-${version}-macos.${ext}", - "category": "public.app-category.productivity", - "icon": "./build/icons/icon.png" - }, - "win": { - "icon": "./build/icons/icon.ico", - "target": [ - "nsis", - "portable" - ] - }, - "nsis": { - "artifactName": "pomotroid-${version}-setup.${ext}" - }, - "portable": { - "artifactName": "pomotroid-${version}-portable.${ext}" - }, - "linux": { - "artifactName": "pomotroid-${version}-linux.${ext}", - "category": "Utility", - "icon": "./build/icons", - "target": [ - "AppImage", - "deb", - "snap", - "tar.gz" - ] - }, - "snap": { - "summary": "Pomotroid is a simple and visually-pleasing Pomodoro timer." - } + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "paraglide:compile": "paraglide-js compile --project ./project.inlang --outdir ./src/paraglide", + "check": "npm run paraglide:compile && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "npm run paraglide:compile && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "tauri": "tauri" }, "dependencies": { - "animejs": "^3.2.1", - "node-notifier": "^8.0.1", - "vue": "^2.6.12", - "vue-electron": "^1.0.6", - "vuex": "^3.6.2", - "winston": "^3.3.3", - "winston-daily-rotate-file": "^4.5.5", - "worker-loader": "^2.0.0", - "ws": "^7.4.6" + "@inlang/paraglide-js": "^2.13.0", + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-dialog": "^2.6.0", + "@tauri-apps/plugin-log": "^2.8.0", + "@tauri-apps/plugin-notification": "^2.3.3", + "@tauri-apps/plugin-opener": "^2" }, "devDependencies": { - "@babel/core": "^7.14.2", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-decorators": "^7.14.2", - "@babel/plugin-proposal-do-expressions": "^7.14.0", - "@babel/plugin-proposal-export-default-from": "^7.12.13", - "@babel/plugin-proposal-export-namespace-from": "^7.14.2", - "@babel/plugin-proposal-function-bind": "^7.12.13", - "@babel/plugin-proposal-function-sent": "^7.12.13", - "@babel/plugin-proposal-json-strings": "^7.14.2", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.2", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.2", - "@babel/plugin-proposal-numeric-separator": "^7.14.2", - "@babel/plugin-proposal-optional-chaining": "^7.14.2", - "@babel/plugin-proposal-pipeline-operator": "^7.12.13", - "@babel/plugin-proposal-throw-expressions": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-transform-runtime": "^7.14.2", - "@babel/preset-env": "^7.14.2", - "@babel/register": "^7.13.16", - "@babel/runtime": "^7.14.0", - "babel-eslint": "^10.1.0", - "babel-loader": "^8.2.2", - "babili-webpack-plugin": "^0.1.2", - "cfonts": "^2.9.2", - "chalk": "^4.1.1", - "copy-webpack-plugin": "^5.1.1", - "cross-env": "^7.0.3", - "css-loader": "^3.6.0", - "del": "^5.1.0", - "devtron": "^1.4.0", - "electron": "^11.0.1", - "electron-builder": "^22.10.5", - "electron-debug": "^3.2.0", - "electron-devtools-installer": "^3.2.0", - "eslint": "^7.26.0", - "eslint-config-standard": "^14.1.1", - "eslint-friendly-formatter": "^4.0.1", - "eslint-loader": "^4.0.2", - "eslint-plugin-html": "^6.1.2", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.3.1", - "eslint-plugin-standard": "^4.0.1", - "eslint-plugin-vue": "^6.2.2", - "file-loader": "^6.2.0", - "html-webpack-plugin": "^3.2.0", - "mini-css-extract-plugin": "^0.11.0", - "multispinner": "^0.2.1", - "node-loader": "^0.6.0", - "node-sass": "^4.14.1", - "sass-loader": "^8.0.2", - "style-loader": "^1.2.1", - "url-loader": "^4.1.1", - "vue-html-loader": "^1.2.4", - "vue-loader": "^15.9.7", - "vue-style-loader": "^4.1.3", - "vue-template-compiler": "^2.6.12", - "webpack": "^4.44.2", - "webpack-dev-server": "^3.11.2", - "webpack-hot-middleware": "^2.25.0" + "@sveltejs/adapter-static": "^3.0.6", + "@sveltejs/kit": "^2.9.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tauri-apps/cli": "^2", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "typescript": "~5.6.2", + "vite": "^6.0.3" } } diff --git a/project.inlang/settings.json b/project.inlang/settings.json new file mode 100644 index 0000000..a1fd581 --- /dev/null +++ b/project.inlang/settings.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://inlang.com/schema/project-settings", + "baseLocale": "en", + "locales": ["en", "es", "fr", "de", "ja", "zh", "pt"], + "modules": [ + "https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js", + "https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js" + ], + "plugin.inlang.messageFormat": { + "pathPattern": "./src/messages/{locale}.json" + } +} diff --git a/scripts/bump-version.sh b/scripts/bump-version.sh new file mode 100755 index 0000000..c748bc3 --- /dev/null +++ b/scripts/bump-version.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +# bump-version.sh — Bump version, update CHANGELOG, commit, and tag. +# +# Usage: +# ./scripts/bump-version.sh +# +# Example: +# ./scripts/bump-version.sh 1.1.0 +# +# What it does: +# 1. Validates the version argument (semver X.Y.Z) +# 2. Updates version in tauri.conf.json, Cargo.toml, and package.json +# 3. Renames [Unreleased] in CHANGELOG.md to [vX.Y.Z] - YYYY-MM-DD +# 4. Commits all changes and creates an annotated git tag +# +# After running, push with: +# git push origin main --follow-tags + +set -euo pipefail + +# ── Validate input ──────────────────────────────────────────────────────────── + +if [[ $# -ne 1 ]]; then + echo "Usage: $0 " + echo " e.g. $0 1.1.0" + exit 1 +fi + +VERSION="$1" + +if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Error: version must be in X.Y.Z format (got: $VERSION)" + exit 1 +fi + +# Resolve repo root (script can be called from anywhere) +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$REPO_ROOT" + +# ── Check working tree ──────────────────────────────────────────────────────── + +if [[ -n "$(git status --porcelain)" ]]; then + echo "Error: working tree has uncommitted changes. Commit or stash first." + exit 1 +fi + +# ── Check [Unreleased] exists ───────────────────────────────────────────────── + +if ! grep -q '^\[Unreleased\]' CHANGELOG.md; then + echo "Error: CHANGELOG.md has no [Unreleased] section." + echo "Add one with the changes for this release before bumping." + exit 1 +fi + +DATE="$(date +%Y-%m-%d)" + +echo "Bumping to v${VERSION} (${DATE})..." + +# ── Update tauri.conf.json ──────────────────────────────────────────────────── + +TAURI_CONF="src-tauri/tauri.conf.json" +sed -i "s/\"version\": \"[0-9]*\.[0-9]*\.[0-9]*\"/\"version\": \"${VERSION}\"/" "$TAURI_CONF" +echo " ✓ ${TAURI_CONF}" + +# ── Update Cargo.toml (first occurrence — the package version) ──────────────── + +CARGO_TOML="src-tauri/Cargo.toml" +# Only update the first `version = "..."` line (the [package] entry) +sed -i "0,/^version = \"[0-9]*\.[0-9]*\.[0-9]*\"/s//version = \"${VERSION}\"/" "$CARGO_TOML" +echo " ✓ ${CARGO_TOML}" + +# ── Update package.json ─────────────────────────────────────────────────────── + +PACKAGE_JSON="package.json" +sed -i "s/\"version\": \"[0-9]*\.[0-9]*\.[0-9]*\"/\"version\": \"${VERSION}\"/" "$PACKAGE_JSON" +echo " ✓ ${PACKAGE_JSON}" + +# ── Update Cargo.lock (regenerate after Cargo.toml change) ─────────────────── + +cargo generate-lockfile --manifest-path src-tauri/Cargo.toml --quiet 2>/dev/null || true +echo " ✓ src-tauri/Cargo.lock (refreshed)" + +# ── Update CHANGELOG.md ─────────────────────────────────────────────────────── + +CHANGELOG="CHANGELOG.md" +# Replace the [Unreleased] header with [vX.Y.Z] - YYYY-MM-DD +sed -i "s/^\[Unreleased\]/[v${VERSION}] - ${DATE}/" "$CHANGELOG" +echo " ✓ ${CHANGELOG} ([Unreleased] → [v${VERSION}] - ${DATE})" + +# ── Git commit + tag ────────────────────────────────────────────────────────── + +git add \ + "$TAURI_CONF" \ + "$CARGO_TOML" \ + "src-tauri/Cargo.lock" \ + "$PACKAGE_JSON" \ + "$CHANGELOG" + +git commit -m "chore: release v${VERSION}" + +git tag -a "v${VERSION}" -m "v${VERSION}" + +echo "" +echo "Done! Committed and tagged v${VERSION}." +echo "" +echo "Push to trigger the release workflow:" +echo " git push origin main --follow-tags" diff --git a/scripts/seed-db.py b/scripts/seed-db.py new file mode 100755 index 0000000..14c85b2 --- /dev/null +++ b/scripts/seed-db.py @@ -0,0 +1,216 @@ +#!/usr/bin/env python3 +"""Seed the Pomotroid database with realistic historical session data. + +Usage: + python3 scripts/seed-db.py [options] + +Options: + --days N Days of history to generate (default: 730 ≈ 2 years) + --db PATH Override the database path + --clear Delete all existing sessions before inserting + --dry-run Print a summary without writing to the database + --seed N Random seed for reproducible output (default: 42) + +The script generates realistic Pomodoro session sequences — work rounds, +short breaks, and long breaks — with natural weekday/weekend variation, +streaks, and quiet periods. Sessions are in proper 4-work-per-cycle order +matching Pomotroid's default sequence. + +The database must already exist (launch Pomotroid at least once first). +""" + +import argparse +import os +import platform +import random +import sqlite3 +import sys +from datetime import date, datetime, timedelta + + +# ── Platform database path ──────────────────────────────────────────────────── + +APP_ID = "com.splode.pomotroid" +DB_NAME = "pomotroid.db" + + +def default_db_path() -> str: + system = platform.system() + if system == "Linux": + base = os.environ.get("XDG_DATA_HOME", os.path.expanduser("~/.local/share")) + return os.path.join(base, APP_ID, DB_NAME) + if system == "Darwin": + return os.path.expanduser( + f"~/Library/Application Support/{APP_ID}/{DB_NAME}" + ) + if system == "Windows": + appdata = os.environ.get("APPDATA", "") + return os.path.join(appdata, APP_ID, DB_NAME) + print(f"Unsupported platform: {system}", file=sys.stderr) + sys.exit(1) + + +# ── Session generation ──────────────────────────────────────────────────────── + +WORK_SECS = 1500 # 25 minutes +SHORT_SECS = 300 # 5 minutes +LONG_SECS = 900 # 15 minutes + +ROUNDS_PER_CYCLE = 4 # Work rounds before a long break + + +def make_session(ts: int, duration: int, round_type: str, completed: int = 1) -> dict: + return { + "started_at": ts, + "ended_at": ts + duration, + "round_type": round_type, + "duration_secs": duration, + "completed": completed, + } + + +def generate_sessions(days: int, rng: random.Random) -> list[dict]: + """Generate realistic session history for `days` days ending today.""" + sessions = [] + today = date.today() + start_day = today - timedelta(days=days - 1) + + for offset in range(days): + day = start_day + timedelta(days=offset) + weekday = day.weekday() # 0 = Monday … 6 = Sunday + + # Weekday/weekend activity profiles + if weekday >= 5: # weekend + if rng.random() > 0.28: + continue + num_cycles = rng.randint(1, 2) + else: # weekday + if rng.random() > 0.78: + continue + # Weight toward 2–3 cycles; occasional marathon day + num_cycles = rng.choices([1, 2, 3, 4], weights=[10, 35, 40, 15])[0] + + # Session start time: between 8 am and 1 pm local time + hour = rng.randint(8, 13) + minute = rng.choice([0, 15, 30, 45]) + ts = int(datetime(day.year, day.month, day.day, hour, minute).timestamp()) + + for cycle in range(num_cycles): + for work_idx in range(ROUNDS_PER_CYCLE): + # Work round + sessions.append(make_session(ts, WORK_SECS, "work")) + ts += WORK_SECS + + is_last_work = work_idx == ROUNDS_PER_CYCLE - 1 + is_last_cycle = cycle == num_cycles - 1 + + if is_last_work: + # Long break ends the cycle — omit after the very last work round + if not is_last_cycle: + sessions.append(make_session(ts, LONG_SECS, "long-break")) + ts += LONG_SECS + else: + # Short break between work rounds (occasionally skipped) + if rng.random() > 0.08: + sessions.append(make_session(ts, SHORT_SECS, "short-break")) + ts += SHORT_SECS + + # Brief gap between cycles (5–20 min of non-Pomotroid time) + if not is_last_cycle: + ts += rng.randint(5, 20) * 60 + + return sessions + + +# ── Database I/O ────────────────────────────────────────────────────────────── + +INSERT_SQL = """ + INSERT INTO sessions (started_at, ended_at, round_type, duration_secs, completed) + VALUES (:started_at, :ended_at, :round_type, :duration_secs, :completed) +""" + + +def summarise(sessions: list[dict]) -> None: + work_sessions = [s for s in sessions if s["round_type"] == "work"] + short_sessions = [s for s in sessions if s["round_type"] == "short-break"] + long_sessions = [s for s in sessions if s["round_type"] == "long-break"] + focus_hours = sum(s["duration_secs"] for s in work_sessions) / 3600 + + active_days = len({ + date.fromtimestamp(s["started_at"]) + for s in work_sessions + }) + + print(f" Total sessions : {len(sessions)}") + print(f" Work : {len(work_sessions)}") + print(f" Short breaks : {len(short_sessions)}") + print(f" Long breaks : {len(long_sessions)}") + print(f" Active days : {active_days}") + print(f" Focus time : {focus_hours:.1f} hours") + + +def seed(db_path: str, sessions: list[dict], *, clear: bool, dry_run: bool) -> None: + print(f"Database : {db_path}") + summarise(sessions) + + if dry_run: + print("\nDry run — no changes written.") + return + + if not os.path.exists(db_path): + print( + f"\nError: database not found at:\n {db_path}\n" + "Launch Pomotroid at least once to create the database, then re-run.", + file=sys.stderr, + ) + sys.exit(1) + + with sqlite3.connect(db_path) as conn: + if clear: + deleted = conn.execute("DELETE FROM sessions").rowcount + print(f"\nCleared : {deleted} existing session(s) deleted") + + conn.executemany(INSERT_SQL, sessions) + print(f"\nInserted : {len(sessions)} sessions") + + +# ── Entry point ─────────────────────────────────────────────────────────────── + +def main() -> None: + parser = argparse.ArgumentParser( + description="Seed the Pomotroid database with test session history.", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=__doc__.strip(), + ) + parser.add_argument( + "--days", type=int, default=730, metavar="N", + help="Days of history to generate (default: 730 ≈ 2 years)", + ) + parser.add_argument( + "--db", metavar="PATH", + help="Override database path (default: platform app-data location)", + ) + parser.add_argument( + "--clear", action="store_true", + help="Delete all existing sessions before inserting", + ) + parser.add_argument( + "--dry-run", action="store_true", + help="Print a summary without writing to the database", + ) + parser.add_argument( + "--seed", type=int, default=42, metavar="N", + help="Random seed for reproducible output (default: 42)", + ) + + args = parser.parse_args() + + db_path = args.db or default_db_path() + rng = random.Random(args.seed) + sessions = generate_sessions(args.days, rng) + + seed(db_path, sessions, clear=args.clear, dry_run=args.dry_run) + + +if __name__ == "__main__": + main() diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore new file mode 100644 index 0000000..b21bd68 --- /dev/null +++ b/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 0000000..2aeae0b --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,6652 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "alsa" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" +dependencies = [ + "alsa-sys", + "bitflags 2.11.0", + "cfg-if", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "android_log-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" + +[[package]] +name = "android_logger" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3" +dependencies = [ + "android_log-sys", + "env_filter", + "log", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "base64 0.22.1", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.11.0", + "cexpr", + "clang-sys", + "itertools", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.117", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +dependencies = [ + "serde_core", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "borsh" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +dependencies = [ + "once_cell", + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "byte-unit" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6d47a4e2961fb8721bcfc54feae6455f2f64e7054f9bc67e875f0e77f4c58d" +dependencies = [ + "rust_decimal", + "schemars 1.2.1", + "serde", + "utf8-width", +] + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.11.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link 0.2.1", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading 0.8.9", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "libc", +] + +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ceec7a6067e62d6f931a2baf6f3a751f4a892595bcec1461a3c94ef9949864b6" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cpal" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" +dependencies = [ + "alsa", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2", + "ndk 0.8.0", + "ndk-context", + "oboe", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.54.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + +[[package]] +name = "deranged" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "embed-resource" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.12+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "env_filter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "fern" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29" +dependencies = [ + "log", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +dependencies = [ + "cfg-if", + "libc", + "libredox", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix", + "windows-link 0.2.1", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.11.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "global-hotkey" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9247516746aa8e53411a0db9b62b0e24efbcf6a76e0ba73e5a91b512ddabed7" +dependencies = [ + "crossbeam-channel", + "keyboard-types", + "objc2", + "objc2-app-kit", + "once_cell", + "serde", + "thiserror 2.0.18", + "windows-sys 0.59.0", + "x11rb", + "xkeysym", +] + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.12", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever", + "match_token", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "inotify" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d36139f1c97c42c0c86a411910b04e48d4939a0376e6e0f989420cbdee0120e5" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.11.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kqueue" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser", + "html5ever", + "indexmap 2.13.0", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "lewton" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" +dependencies = [ + "byteorder", + "ogg", + "tinyvec", +] + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading 0.7.4", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.182" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] + +[[package]] +name = "libredox" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +dependencies = [ + "bitflags 2.11.0", + "libc", + "redox_syscall 0.7.1", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +dependencies = [ + "value-bag", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "mac-notification-sys" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fd3f75411f4725061682ed91f131946e912859d0044d39c4ec0aac818d7621" +dependencies = [ + "cc", + "objc2", + "objc2-foundation", + "time", +] + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.11.0", + "jni-sys", + "log", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys", + "log", + "ndk-sys 0.6.0+11769913", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "notify" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" +dependencies = [ + "bitflags 2.11.0", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio 0.8.11", + "walkdir", + "windows-sys 0.48.0", +] + +[[package]] +name = "notify-rust" +version = "4.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21af20a1b50be5ac5861f74af1a863da53a11c38684d9818d82f1c42f7fdc6c2" +dependencies = [ + "futures-lite", + "log", + "mac-notification-sys", + "serde", + "tauri-winrt-notification", + "zbus", +] + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-javascript-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" +dependencies = [ + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-security" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-javascript-core", + "objc2-security", +] + +[[package]] +name = "oboe" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" +dependencies = [ + "jni", + "ndk 0.8.0", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" +dependencies = [ + "cc", +] + +[[package]] +name = "ogg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" +dependencies = [ + "byteorder", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "open" +version = "5.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.0", + "quick-xml 0.38.4", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "pomotroid" +version = "1.0.0" +dependencies = [ + "axum", + "futures-util", + "log", + "notify", + "rodio", + "rusqlite", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-dialog", + "tauri-plugin-global-shortcut", + "tauri-plugin-log", + "tauri-plugin-notification", + "tauri-plugin-opener", + "tiny-skia", + "tokio", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.10+spec-1.0.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_syscall" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rfd" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" +dependencies = [ + "block2", + "dispatch2", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.60.2", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rodio" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b1bb7b48ee48471f55da122c0044fcc7600cfcc85db88240b89cb832935e611" +dependencies = [ + "cpal", + "hound", + "lewton", + "symphonia", +] + +[[package]] +name = "rusqlite" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" +dependencies = [ + "bitflags 2.11.0", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rust_decimal" +version = "1.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61f703d19852dbf87cbc513643fa81428361eb6940f1ac14fd58155d295a3eb0" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk 0.9.0", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall 0.5.18", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "symphonia" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5773a4c030a19d9bfaa090f49746ff35c75dfddfa700df7a5939d5e076a57039" +dependencies = [ + "lazy_static", + "symphonia-bundle-mp3", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4872dd6bb56bf5eac799e3e957aa1981086c3e613b27e0ac23b176054f7c57ed" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-core" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea00cc4f79b7f6bb7ff87eddc065a1066f3a43fe1875979056672c9ef948c2af" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36306ff42b9ffe6e5afc99d49e121e0bd62fe79b9db7b9681d48e29fa19e6b16" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.34.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" +dependencies = [ + "bitflags 2.11.0", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "lazy_static", + "libc", + "log", + "ndk 0.9.0", + "ndk-context", + "ndk-sys 0.6.0+11769913", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "parking_lot", + "raw-window-handle", + "scopeguard", + "tao-macros", + "unicode-segmentation", + "url", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463ae8677aa6d0f063a900b9c41ecd4ac2b7ca82f0b058cc4491540e55b20129" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows 0.61.3", +] + +[[package]] +name = "tauri-build" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca7bd893329425df750813e95bd2b643d5369d929438da96d5bbb7cc2c918f74" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac423e5859d9f9ccdd32e3cf6a5866a15bedbf25aa6630bcb2acde9468f6ae3" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.117", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6a1bd2861ff0c8766b1d38b32a6a410f6dc6532d4ef534c47cfb2236092f59" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692a77abd8b8773e107a42ec0e05b767b8d2b7ece76ab36c6c3947e34df9f53f" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-plugin-dialog" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9204b425d9be8d12aa60c2a83a289cf7d1caae40f57f336ed1155b3a5c0e359b" +dependencies = [ + "log", + "raw-window-handle", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.18", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed390cc669f937afeb8b28032ce837bac8ea023d975a2e207375ec05afaf1804" +dependencies = [ + "anyhow", + "dunce", + "glob", + "percent-encoding", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.18", + "toml 0.9.12+spec-1.1.0", + "url", +] + +[[package]] +name = "tauri-plugin-global-shortcut" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "424af23c7e88d05e4a1a6fc2c7be077912f8c76bd7900fd50aa2b7cbf5a2c405" +dependencies = [ + "global-hotkey", + "log", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", +] + +[[package]] +name = "tauri-plugin-log" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7545bd67f070a4500432c826e2e0682146a1d6712aee22a2786490156b574d93" +dependencies = [ + "android_logger", + "byte-unit", + "fern", + "log", + "objc2", + "objc2-foundation", + "serde", + "serde_json", + "serde_repr", + "swift-rs", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "tauri-plugin-notification" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01fc2c5ff41105bd1f7242d8201fdf3efd70749b82fa013a17f2126357d194cc" +dependencies = [ + "log", + "notify-rust", + "rand 0.9.2", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "time", + "url", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc624469b06f59f5a29f874bbc61a2ed737c0f9c23ef09855a292c389c42e83f" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "url", + "windows 0.61.3", + "zbus", +] + +[[package]] +name = "tauri-runtime" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b885ffeac82b00f1f6fd292b6e5aabfa7435d537cef57d11e38a489956535651" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows 0.61.3", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5204682391625e867d16584fedc83fc292fb998814c9f7918605c789cd876314" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows 0.61.3", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcd169fccdff05eff2c1033210b9b94acd07a47e6fa9a3431cf09cfd4f01c87e" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever", + "http", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 0.9.12+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "tauri-winrt-notification" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b1e66e07de489fe43a46678dd0b8df65e0c973909df1b60ba33874e297ba9b9" +dependencies = [ + "quick-xml 0.37.5", + "thiserror 2.0.18", + "windows 0.61.3", + "windows-version", +] + +[[package]] +name = "tempfile" +version = "3.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +dependencies = [ + "fastrand", + "getrandom 0.4.1", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.49.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +dependencies = [ + "bytes", + "libc", + "mio 1.1.1", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.14", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.13.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "winnow 0.7.14", +] + +[[package]] +name = "toml_parser" +version = "1.0.9+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +dependencies = [ + "winnow 0.7.14", +] + +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.11.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +dependencies = [ + "getrandom 0.4.1", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "value-bag" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff9c7baef35ac3c0e17d8bfc9ad75eb62f85a2f02bccc906699dadb0aa9c622" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24699cd39db9966cf6e2ef10d2f72779c961ad905911f395ea201c3ec9f545d" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39455e84ad887a0bbc93c116d72403f1bb0a39e37dd6f235a43e2128a0c7f1fd" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff4761f60b0b51fd13fec8764167b7bbcc34498ce3e52805fe1db6f2d56b6d6" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6a171c53d98021a93a474c4a4579d76ba97f9517d871bc12e27640f218b6dd" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668fa5d00434e890a452ab060d24e3904d1be93f7bb01b70e5603baa2b8ab23b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows 0.61.3", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wry" +version = "0.54.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb26159b420aa77684589a744ae9a9461a95395b848764ad12290a14d960a11a" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dpi", + "dunce", + "gdkx11", + "gtk", + "html5ever", + "http", + "javascriptcore-rs", + "jni", + "kuchikiki", + "libc", + "ndk 0.9.0", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "gethostname", + "rustix", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.14", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow 0.7.14", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zvariant" +version = "5.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.14", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 0.7.14", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..a0e05eb --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "pomotroid" +version = "1.0.0" +description = "A simple and visually-pleasing Pomodoro timer" +authors = ["Christopher Murphy "] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +# The `_lib` suffix may seem redundant but it is necessary +# to make the lib name unique and wouldn't conflict with the bin name. +# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 +name = "pomotroid_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = ["tray-icon"] } +tauri-plugin-opener = "2" +tauri-plugin-log = "2" +log = "0.4" +tauri-plugin-notification = "2" +tauri-plugin-global-shortcut = "2" +tauri-plugin-dialog = "2" + +rusqlite = { version = "0.31", features = ["bundled"] } + +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +tokio = { version = "1", features = ["full"] } +axum = { version = "0.7", features = ["ws"] } +futures-util = "0.3" + +rodio = { version = "0.17", default-features = false, features = ["wav", "mp3", "vorbis"] } +tiny-skia = "0.11" +notify = "6" + diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..68251bf --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,151 @@ +use std::process::Command; + +fn main() { + // Rerun when git HEAD changes (new commit, checkout) or when tags move. + println!("cargo:rerun-if-changed=.git/HEAD"); + println!("cargo:rerun-if-changed=.git/refs/"); + // Rerun if the canonical version source changes. + println!("cargo:rerun-if-changed=tauri.conf.json"); + + let base_version = read_base_version(); + + // Full 40-char SHA for the log line. + let full_sha = run_git(&["rev-parse", "HEAD"]) + .map(|s| s.trim().to_string()) + .unwrap_or_else(|| "unknown".to_string()); + + // Build version string from git describe. + let build_version = match run_git(&["describe", "--tags", "--long", "--always", "--dirty"]) { + Some(raw) => { + let raw = raw.trim(); + match parse_describe(raw) { + Some(info) => format_version(&info), + // --always fallback: no tags, describe returned just a raw SHA. + None => format_fallback_from_sha(&base_version, raw), + } + } + None => format!("{base_version}+unknown"), + }; + + println!("cargo:rustc-env=APP_BUILD_VERSION={build_version}"); + println!("cargo:rustc-env=APP_BUILD_SHA={full_sha}"); + + tauri_build::build() +} + +// --------------------------------------------------------------------------- +// Git helpers +// --------------------------------------------------------------------------- + +fn run_git(args: &[&str]) -> Option { + Command::new("git") + .args(args) + .output() + .ok() + .filter(|o| o.status.success()) + .and_then(|o| String::from_utf8(o.stdout).ok()) +} + +// --------------------------------------------------------------------------- +// Version parsing +// --------------------------------------------------------------------------- + +struct DescribeInfo { + tag: String, + count: u32, + sha: String, + dirty: bool, +} + +/// Parse `git describe --tags --long --always --dirty` output. +/// +/// Expected form: `v1.0.0-80-g20b2d87[-dirty]` +/// Uses rsplitn so tag names containing hyphens are handled correctly. +fn parse_describe(s: &str) -> Option { + let (s, dirty) = s + .strip_suffix("-dirty") + .map(|t| (t, true)) + .unwrap_or((s, false)); + + // rsplitn(3) from the right: ["g20b2d87", "80", "v1.0.0"] + let parts: Vec<&str> = s.rsplitn(3, '-').collect(); + if parts.len() != 3 { + return None; + } + + let sha_part = parts[0]; // "g20b2d87" + let count_part = parts[1]; // "80" + let tag_part = parts[2]; // "v1.0.0" + + let count = count_part.parse::().ok()?; + let sha = sha_part.strip_prefix('g')?; + let tag = tag_part.trim_start_matches('v'); + + Some(DescribeInfo { + tag: tag.to_string(), + count, + sha: sha.to_string(), + dirty, + }) +} + +/// Format a parsed describe into a semver string. +/// +/// | count | dirty | result | +/// |-------|-------|---------------------------------| +/// | 0 | no | `1.0.0+20b2d87` | +/// | 0 | yes | `1.0.0+20b2d87.dirty` | +/// | N > 0 | no | `1.0.0-dev.N+20b2d87` | +/// | N > 0 | yes | `1.0.0-dev.N+20b2d87.dirty` | +fn format_version(info: &DescribeInfo) -> String { + let base = if info.count == 0 { + format!("{}+{}", info.tag, info.sha) + } else { + format!("{}-dev.{}+{}", info.tag, info.count, info.sha) + }; + if info.dirty { + format!("{base}.dirty") + } else { + base + } +} + +/// Fallback when no tags exist: describe returned a bare SHA (from --always). +/// Input looks like `20b2d87` or `20b2d87-dirty`. +fn format_fallback_from_sha(base_version: &str, raw: &str) -> String { + let (sha, dirty) = raw + .strip_suffix("-dirty") + .map(|s| (s, true)) + .unwrap_or((raw, false)); + // Strip 'g' prefix if somehow present. + let sha = sha.strip_prefix('g').unwrap_or(sha); + if dirty { + format!("{base_version}+{sha}.dirty") + } else { + format!("{base_version}+{sha}") + } +} + +// --------------------------------------------------------------------------- +// Base version source of truth +// --------------------------------------------------------------------------- + +/// Read "version" from tauri.conf.json (same directory as build.rs = src-tauri/). +/// Falls back to "1.0.0" if the file is unreadable or the field is missing. +fn read_base_version() -> String { + std::fs::read_to_string("tauri.conf.json") + .ok() + .and_then(|content| extract_json_str_field(&content, "version")) + .unwrap_or_else(|| "1.0.0".to_string()) +} + +/// Minimal JSON string-field extractor — avoids a serde_json build-dependency. +fn extract_json_str_field(json: &str, field: &str) -> Option { + let key = format!("\"{}\"", field); + let pos = json.find(&key)?; + let rest = json[pos + key.len()..].trim_start(); + let rest = rest.strip_prefix(':')?.trim_start(); + let rest = rest.strip_prefix('"')?; + let end = rest.find('"')?; + Some(rest[..end].to_string()) +} diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 0000000..eb3afed --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,26 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main", "settings", "stats"], + "permissions": [ + "core:default", + "log:default", + "core:window:allow-close", + "core:window:allow-minimize", + "core:webview:allow-create-webview-window", + "core:window:allow-show", + "core:window:allow-set-focus", + "core:window:allow-start-dragging", + "core:window:allow-start-resize-dragging", + "core:window:allow-toggle-maximize", + "core:window:allow-is-maximized", + "opener:default", + "dialog:default", + "dialog:allow-open", + "notification:allow-is-permission-granted", + "notification:allow-request-permission", + "notification:allow-show", + "notification:allow-notify" + ] +} diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 0000000..72c0c87 Binary files /dev/null and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..0a8c60b Binary files /dev/null and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png new file mode 100644 index 0000000..9e72d51 Binary files /dev/null and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/64x64.png b/src-tauri/icons/64x64.png new file mode 100644 index 0000000..29abeeb Binary files /dev/null and b/src-tauri/icons/64x64.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000..cb272f5 Binary files /dev/null and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000..5dc6d17 Binary files /dev/null and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000..5e6d74e Binary files /dev/null and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000..179349f Binary files /dev/null and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000..5483f4a Binary files /dev/null and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000..516c148 Binary files /dev/null and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000..caac3d3 Binary files /dev/null and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000..b92d37a Binary files /dev/null and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000..ca08c88 Binary files /dev/null and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000..de6ae13 Binary files /dev/null and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..2ffbf24 --- /dev/null +++ b/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..329909c Binary files /dev/null and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..73bfd49 Binary files /dev/null and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..e871c2a Binary files /dev/null and b/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..18c688f Binary files /dev/null and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..1729066 Binary files /dev/null and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..9aa13e6 Binary files /dev/null and b/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..59951ca Binary files /dev/null and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..15f3f7b Binary files /dev/null and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..f25e5f7 Binary files /dev/null and b/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..573ebcc Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..56e385c Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..95384db Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..f700a3a Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..f5f9805 Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..5690559 Binary files /dev/null and b/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/src-tauri/icons/android/values/ic_launcher_background.xml b/src-tauri/icons/android/values/ic_launcher_background.xml new file mode 100644 index 0000000..ea9c223 --- /dev/null +++ b/src-tauri/icons/android/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #fff + \ No newline at end of file diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns new file mode 100644 index 0000000..cc17f55 Binary files /dev/null and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000..95a5c69 Binary files /dev/null and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 0000000..bbb30d4 Binary files /dev/null and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@1x.png b/src-tauri/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 0000000..c412608 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/src-tauri/icons/ios/AppIcon-20x20@2x-1.png new file mode 100644 index 0000000..ba14995 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@2x.png b/src-tauri/icons/ios/AppIcon-20x20@2x.png new file mode 100644 index 0000000..ba14995 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-20x20@3x.png b/src-tauri/icons/ios/AppIcon-20x20@3x.png new file mode 100644 index 0000000..a97a168 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-20x20@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@1x.png b/src-tauri/icons/ios/AppIcon-29x29@1x.png new file mode 100644 index 0000000..7af34b7 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/src-tauri/icons/ios/AppIcon-29x29@2x-1.png new file mode 100644 index 0000000..26c8026 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@2x.png b/src-tauri/icons/ios/AppIcon-29x29@2x.png new file mode 100644 index 0000000..26c8026 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-29x29@3x.png b/src-tauri/icons/ios/AppIcon-29x29@3x.png new file mode 100644 index 0000000..b436c74 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-29x29@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@1x.png b/src-tauri/icons/ios/AppIcon-40x40@1x.png new file mode 100644 index 0000000..ba14995 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/src-tauri/icons/ios/AppIcon-40x40@2x-1.png new file mode 100644 index 0000000..297ca70 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@2x-1.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@2x.png b/src-tauri/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 0000000..297ca70 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-40x40@3x.png b/src-tauri/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 0000000..5bbe5dc Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-40x40@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-512@2x.png b/src-tauri/icons/ios/AppIcon-512@2x.png new file mode 100644 index 0000000..2106fa9 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-512@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-60x60@2x.png b/src-tauri/icons/ios/AppIcon-60x60@2x.png new file mode 100644 index 0000000..5bbe5dc Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-60x60@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-60x60@3x.png b/src-tauri/icons/ios/AppIcon-60x60@3x.png new file mode 100644 index 0000000..b2f3ff7 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-60x60@3x.png differ diff --git a/src-tauri/icons/ios/AppIcon-76x76@1x.png b/src-tauri/icons/ios/AppIcon-76x76@1x.png new file mode 100644 index 0000000..b32512e Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-76x76@1x.png differ diff --git a/src-tauri/icons/ios/AppIcon-76x76@2x.png b/src-tauri/icons/ios/AppIcon-76x76@2x.png new file mode 100644 index 0000000..c859f30 Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-76x76@2x.png differ diff --git a/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png new file mode 100644 index 0000000..a6dc4bc Binary files /dev/null and b/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png differ diff --git a/src-tauri/src/audio/mod.rs b/src-tauri/src/audio/mod.rs new file mode 100644 index 0000000..d7698b5 --- /dev/null +++ b/src-tauri/src/audio/mod.rs @@ -0,0 +1,317 @@ +/// Rust audio playback via rodio. +/// +/// All four audio assets are embedded at compile time so they are available +/// even when the app is hidden to the system tray. +/// +/// Architecture: +/// A dedicated OS thread owns the `OutputStream` (not `Send` on macOS). +/// `AudioManager` communicates with that thread via a `SyncSender`. +/// Tauri manages `Arc` as state; it is `Send + Sync`. +/// +/// Custom audio: +/// Per-cue custom files are stored in `{app_data_dir}/audio/` with fixed +/// stems (`custom_work_alert`, `custom_short_break_alert`, +/// `custom_long_break_alert`). The audio thread tries the custom file first +/// and falls back to the embedded bytes if the file is missing or unreadable. +use std::io::Cursor; +use std::path::{Path, PathBuf}; +use std::sync::{Arc, Mutex}; +use std::sync::mpsc; + +use rodio::{Decoder, OutputStream, Sink}; + +use crate::settings::Settings; + +// --------------------------------------------------------------------------- +// Embedded audio assets +// --------------------------------------------------------------------------- + +const ALERT_WORK: &[u8] = include_bytes!("../../../static/audio/alert-work.mp3"); +const ALERT_SHORT_BREAK: &[u8] = include_bytes!("../../../static/audio/alert-short-break.mp3"); +const ALERT_LONG_BREAK: &[u8] = include_bytes!("../../../static/audio/alert-long-break.mp3"); +const TICK: &[u8] = include_bytes!("../../../static/audio/tick.mp3"); + +// --------------------------------------------------------------------------- +// Public types +// --------------------------------------------------------------------------- + +#[derive(Debug, Clone, Copy)] +pub enum AudioCue { + WorkAlert, + ShortBreakAlert, + LongBreakAlert, + Tick, +} + +/// Paths to currently active custom audio files (one per alert cue). +/// `None` means the embedded default is used. +#[derive(Default)] +pub struct CustomAudioPaths { + pub work_alert: Option, + pub short_break_alert: Option, + pub long_break_alert: Option, +} + +/// Serialisable snapshot of custom audio file names (sent to the frontend). +#[derive(serde::Serialize)] +pub struct CustomAudioInfo { + pub work_alert: Option, + pub short_break_alert: Option, + pub long_break_alert: Option, +} + +struct PlayRequest { + cue: AudioCue, + /// Resolved custom file path, if one is configured for this cue. + custom_path: Option, + volume: f32, +} + +/// Settings subset relevant to the audio engine. +#[derive(Clone)] +struct AudioSettings { + volume: f32, + tick_sounds_work: bool, + tick_sounds_break: bool, +} + +impl From<&Settings> for AudioSettings { + fn from(s: &Settings) -> Self { + Self { + volume: s.volume, + tick_sounds_work: s.tick_sounds_during_work, + tick_sounds_break: s.tick_sounds_during_break, + } + } +} + +/// Thread-safe audio manager. Register as `Arc` in Tauri state. +pub struct AudioManager { + tx: mpsc::SyncSender, + settings: Arc>, + pub custom_paths: Arc>, +} + +impl AudioManager { + /// Spawn the audio thread and return an `Arc`. + /// If the system audio device is unavailable, returns `None` (app still works, just silent). + pub fn new(initial: &Settings) -> Option> { + let (tx, rx) = mpsc::sync_channel::(8); + + std::thread::Builder::new() + .name("audio".to_string()) + .spawn(move || audio_thread(rx)) + .ok()?; + + Some(Arc::new(Self { + tx, + settings: Arc::new(Mutex::new(AudioSettings::from(initial))), + custom_paths: Arc::new(Mutex::new(CustomAudioPaths::default())), + })) + } + + /// Update volume and tick-sound settings from a new `Settings` snapshot. + pub fn apply_settings(&self, s: &Settings) { + *self.settings.lock().unwrap() = AudioSettings::from(s); + } + + /// Play the given cue at the current stored volume. + /// Non-blocking: drops the request if the channel is full. + pub fn play_cue(&self, cue: AudioCue) { + let volume = self.settings.lock().unwrap().volume; + if volume <= 0.0 { + return; + } + // Resolve custom path (Tick always uses the embedded sound). + let custom_path = { + let paths = self.custom_paths.lock().unwrap(); + match cue { + AudioCue::WorkAlert => paths.work_alert.clone(), + AudioCue::ShortBreakAlert => paths.short_break_alert.clone(), + AudioCue::LongBreakAlert => paths.long_break_alert.clone(), + AudioCue::Tick => None, + } + }; + let _ = self.tx.try_send(PlayRequest { cue, custom_path, volume }); + } + + /// Returns true if tick sounds are enabled for the given round type string. + pub fn tick_enabled_for(&self, round_type: &str) -> bool { + let s = self.settings.lock().unwrap(); + match round_type { + "work" => s.tick_sounds_work, + _ => s.tick_sounds_break, + } + } + + /// Set a custom file path for the given cue slot. + /// `cue` must be `"work_alert"`, `"short_break_alert"`, or `"long_break_alert"`. + pub fn set_custom_path(&self, cue: &str, path: PathBuf) { + let mut paths = self.custom_paths.lock().unwrap(); + match cue { + "work_alert" => paths.work_alert = Some(path), + "short_break_alert" => paths.short_break_alert = Some(path), + "long_break_alert" => paths.long_break_alert = Some(path), + _ => {} + } + } + + /// Remove the custom path for the given cue slot, reverting to the built-in sound. + pub fn clear_custom_path(&self, cue: &str) { + let mut paths = self.custom_paths.lock().unwrap(); + match cue { + "work_alert" => paths.work_alert = None, + "short_break_alert" => paths.short_break_alert = None, + "long_break_alert" => paths.long_break_alert = None, + _ => {} + } + } + + /// Return the display names (file names only) of any configured custom files. + pub fn get_custom_info(&self) -> CustomAudioInfo { + let paths = self.custom_paths.lock().unwrap(); + let name = |p: &Option| -> Option { + p.as_ref() + .and_then(|pb| pb.file_name()) + .and_then(|n| n.to_str()) + .map(String::from) + }; + CustomAudioInfo { + work_alert: name(&paths.work_alert), + short_break_alert: name(&paths.short_break_alert), + long_break_alert: name(&paths.long_break_alert), + } + } +} + +// --------------------------------------------------------------------------- +// Startup helper — scan disk for previously saved custom files +// --------------------------------------------------------------------------- + +/// Fixed file stems used when copying custom audio files into the config dir. +pub const STEM_WORK: &str = "custom_work_alert"; +pub const STEM_SHORT: &str = "custom_short_break_alert"; +pub const STEM_LONG: &str = "custom_long_break_alert"; + +/// Scan `audio_dir` for any saved custom audio files and return the paths. +pub fn find_custom_files(audio_dir: &Path) -> CustomAudioPaths { + let find = |stem: &str| -> Option { + let entries = std::fs::read_dir(audio_dir).ok()?; + entries + .filter_map(|e| e.ok().map(|e| e.path())) + .find(|p| p.file_stem().and_then(|s| s.to_str()) == Some(stem)) + }; + CustomAudioPaths { + work_alert: find(STEM_WORK), + short_break_alert: find(STEM_SHORT), + long_break_alert: find(STEM_LONG), + } +} + +// --------------------------------------------------------------------------- +// Audio thread +// --------------------------------------------------------------------------- + +fn audio_thread(rx: mpsc::Receiver) { + // OutputStream must stay alive for the lifetime of this thread. + let (_stream, handle) = match OutputStream::try_default() { + Ok(pair) => pair, + Err(e) => { + log::warn!("[audio] failed to open output stream: {e}"); + return; + } + }; + + while let Ok(req) = rx.recv() { + let sink = match Sink::try_new(&handle) { + Ok(s) => s, + Err(e) => { log::warn!("[audio] sink error: {e}"); continue; } + }; + sink.set_volume(req.volume); + + // Try the custom file first; fall back to the embedded asset on any error. + let used_custom = if let Some(path) = req.custom_path { + match std::fs::File::open(&path).map(std::io::BufReader::new) { + Ok(reader) => match Decoder::new(reader) { + Ok(source) => { sink.append(source); true } + Err(e) => { + log::warn!("[audio] decode error for {path:?}: {e}"); + false + } + }, + Err(e) => { + log::warn!("[audio] cannot open {path:?}: {e}"); + false + } + } + } else { + false + }; + + if !used_custom { + let bytes: &'static [u8] = match req.cue { + AudioCue::WorkAlert => ALERT_WORK, + AudioCue::ShortBreakAlert => ALERT_SHORT_BREAK, + AudioCue::LongBreakAlert => ALERT_LONG_BREAK, + AudioCue::Tick => TICK, + }; + match Decoder::new(Cursor::new(bytes)) { + Ok(source) => sink.append(source), + Err(e) => log::warn!("[audio] embedded decode error: {e}"), + } + } + + sink.detach(); // let it finish without blocking + } +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn audio_cue_bytes_are_non_empty() { + assert!(!ALERT_WORK.is_empty()); + assert!(!ALERT_SHORT_BREAK.is_empty()); + assert!(!ALERT_LONG_BREAK.is_empty()); + assert!(!TICK.is_empty()); + } + + #[test] + fn tick_enabled_for_round_types() { + let settings = Settings { + tick_sounds_during_work: true, + tick_sounds_during_break: false, + ..Settings::default() + }; + let mgr = AudioManager { + tx: mpsc::sync_channel(1).0, + settings: Arc::new(Mutex::new(AudioSettings::from(&settings))), + custom_paths: Arc::new(Mutex::new(CustomAudioPaths::default())), + }; + assert!(mgr.tick_enabled_for("work")); + assert!(!mgr.tick_enabled_for("short-break")); + assert!(!mgr.tick_enabled_for("long-break")); + } + + #[test] + fn custom_paths_set_and_clear() { + let settings = Settings::default(); + let mgr = AudioManager { + tx: mpsc::sync_channel(1).0, + settings: Arc::new(Mutex::new(AudioSettings::from(&settings))), + custom_paths: Arc::new(Mutex::new(CustomAudioPaths::default())), + }; + mgr.set_custom_path("work_alert", PathBuf::from("/tmp/test.mp3")); + assert_eq!( + mgr.custom_paths.lock().unwrap().work_alert, + Some(PathBuf::from("/tmp/test.mp3")) + ); + mgr.clear_custom_path("work_alert"); + assert!(mgr.custom_paths.lock().unwrap().work_alert.is_none()); + } +} diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs new file mode 100644 index 0000000..3dd9743 --- /dev/null +++ b/src-tauri/src/commands.rs @@ -0,0 +1,575 @@ +/// All #[tauri::command] functions exposed to the Svelte frontend via Tauri IPC. +/// +/// Commands are grouped by domain: Timer, Settings, Themes, Stats. +/// Each command returns `Result` so errors surface cleanly in JS. +use log::LevelFilter; +use tauri::{AppHandle, Emitter, Manager, State}; + +use std::sync::Arc; + +use crate::audio::{self, AudioManager}; +use crate::notifications; +use crate::db::{queries, DbState}; +use crate::settings::{self, Settings}; +use crate::shortcuts; +use crate::themes::{self, Theme}; +use crate::timer::{TimerController, TimerSnapshot}; +use crate::tray::{self, TrayState}; +use crate::websocket::{self, WsState}; + +// --------------------------------------------------------------------------- +// CMD-01 — Timer commands +// --------------------------------------------------------------------------- + +/// Toggle the timer: start if idle, resume if paused, pause if running. +/// This is the primary action bound to the space bar and the play/pause button. +#[tauri::command] +pub fn timer_toggle(timer: State<'_, TimerController>) { + timer.toggle(); +} + +/// Reset the current round's timer without advancing the sequence. +#[tauri::command] +pub fn timer_reset(timer: State<'_, TimerController>) { + timer.reset(); +} + +/// Skip the current round: fires Complete immediately and advances to the next. +#[tauri::command] +pub fn timer_skip(timer: State<'_, TimerController>) { + timer.skip(); +} + +/// Restart the current round from zero without advancing the sequence. +/// Round type and round number are preserved; only elapsed time is reset. +#[tauri::command] +pub fn timer_restart_round(timer: State<'_, TimerController>) { + timer.restart_round(); +} + +/// Return a full snapshot of the current timer state. +/// Called once on frontend mount to hydrate stores. +#[tauri::command] +pub fn timer_get_state(timer: State<'_, TimerController>) -> TimerSnapshot { + timer.get_snapshot() +} + +// --------------------------------------------------------------------------- +// CMD-02 — Settings commands +// --------------------------------------------------------------------------- + +/// Return all current settings. +#[tauri::command] +pub fn settings_get(db: State<'_, DbState>) -> Result { + let conn = db.lock().map_err(|e| e.to_string())?; + settings::load(&conn).map_err(|e| { + log::error!("[settings] failed to load settings: {e}"); + e.to_string() + }) +} + +/// Persist a single setting and emit `settings:changed` with the updated set. +/// +/// `key` must be one of the DB column names (see `settings::defaults::DEFAULTS`). +/// `value` is always a string; the loader converts it to the appropriate type. +#[tauri::command] +pub fn settings_set( + key: String, + value: String, + db: State<'_, DbState>, + timer: State<'_, TimerController>, + tray_state: State<'_, Arc>, + ws_state: State<'_, Arc>, + app: AppHandle, +) -> Result { + log::debug!("[settings] set {key}={value}"); + let new_settings = { + let conn = db.lock().map_err(|e| e.to_string())?; + settings::save_setting(&conn, &key, &value).map_err(|e| { + log::error!("[settings] failed to save '{key}': {e}"); + e.to_string() + })?; + // When SIT is turned off, cascade-reset the dependent tray settings so + // the close-to-tray handler cannot hide the window with no icon to + // restore from. + if key == "tray_icon_enabled" && value == "false" { + settings::save_setting(&conn, "min_to_tray", "false").map_err(|e| e.to_string())?; + settings::save_setting(&conn, "min_to_tray_on_close", "false").map_err(|e| e.to_string())?; + } + settings::load(&conn).map_err(|e| { + log::error!("[settings] failed to reload after save: {e}"); + e.to_string() + })? + }; + + // Apply verbose_logging change immediately without a restart. + if key == "verbose_logging" { + if new_settings.verbose_logging { + log::set_max_level(LevelFilter::Debug); + log::info!("Verbose logging enabled — log level set to DEBUG"); + } else { + log::set_max_level(LevelFilter::Info); + log::info!("Verbose logging disabled — log level set to INFO"); + } + } + + // Keep the timer engine in sync when time-related settings change. + timer.apply_settings(new_settings.clone()); + + // If the timer is idle, broadcast a reset snapshot immediately so the + // frontend's dial and display reflect the new duration without requiring + // the user to manually start/reset the timer. + { + let snap = timer.get_snapshot(); + if !snap.is_running && !snap.is_paused { + app.emit("timer:reset", &snap).ok(); + } + } + + // Propagate volume and tick-sound changes to the audio engine (optional state). + if let Some(audio) = app.try_state::>() { + audio.apply_settings(&new_settings); + } + + // Apply always-on-top window flag immediately when the setting changes, + // accounting for the current round type so break_always_on_top takes + // effect without waiting for the next round transition. + if matches!(key.as_str(), "always_on_top" | "break_always_on_top") { + if let Some(window) = app.get_webview_window("main") { + let snap = timer.get_snapshot(); + let is_break = snap.round_type != "work"; + let effective_aot = new_settings.always_on_top + && !(new_settings.break_always_on_top && is_break); + let _ = window.set_always_on_top(effective_aot); + } + } + + // Sync tray countdown mode when the dial setting changes, then immediately + // re-render the icon so it matches the dial without waiting for a timer event. + if key == "dial_countdown" { + *tray_state.countdown_mode.lock().unwrap() = new_settings.dial_countdown; + let snap = timer.get_snapshot(); + let progress = if snap.total_secs > 0 { + snap.elapsed_secs as f32 / snap.total_secs as f32 + } else { + 0.0 + }; + tray::update_icon(&tray_state, &snap.round_type, snap.is_paused, progress); + } + + // Update tray icon colors when the active theme changes. + if matches!(key.as_str(), "theme_mode" | "theme_light" | "theme_dark") { + let data_dir = app.path().app_data_dir().map_err(|e| e.to_string())?; + let tray_theme_name = match new_settings.theme_mode.as_str() { + "dark" => &new_settings.theme_dark, + _ => &new_settings.theme_light, + }; + if let Some(theme) = themes::find(&data_dir, tray_theme_name) { + *tray_state.colors.lock().unwrap() = tray::TrayColors::from_colors_map(&theme.colors); + let snap = timer.get_snapshot(); + let progress = if snap.total_secs > 0 { + snap.elapsed_secs as f32 / snap.total_secs as f32 + } else { + 0.0 + }; + tray::update_icon(&tray_state, &snap.round_type, snap.is_paused, progress); + } + } + + // Create or destroy the tray when tray_icon_enabled or min_to_tray changes. + // The tray exists when either flag is true. + if matches!(key.as_str(), "tray_icon_enabled" | "min_to_tray") { + if new_settings.tray_icon_enabled || new_settings.min_to_tray { + tray::create_tray(&app, &tray_state); + } else { + tray::destroy_tray(&tray_state); + } + } + + // Re-register global shortcuts when any shortcut key changes. + if matches!(key.as_str(), "shortcut_toggle" | "shortcut_reset" | "shortcut_skip" | "shortcut_restart") { + shortcuts::register_all(&app, &new_settings); + } + + // Start or stop the WebSocket server when the enabled flag or port changes. + if matches!(key.as_str(), "websocket_enabled" | "websocket_port") { + let ws = Arc::clone(&*ws_state); + let port = new_settings.websocket_port; + let enabled = new_settings.websocket_enabled; + let app_clone = app.clone(); + tauri::async_runtime::spawn(async move { + // Always stop the old server first. + websocket::stop(&ws).await; + if enabled { + websocket::start(port, app_clone, &ws).await; + } + }); + } + + app.emit("settings:changed", &new_settings).ok(); + Ok(new_settings) +} + +// --------------------------------------------------------------------------- +// CMD-06 — Shortcuts command +// --------------------------------------------------------------------------- + +/// Re-register all global shortcuts from the current settings. +/// The frontend can call this after bulk-updating shortcut settings. +#[tauri::command] +pub fn shortcuts_reload(db: State<'_, DbState>, app: AppHandle) -> Result<(), String> { + let conn = db.lock().map_err(|e| e.to_string())?; + let s = settings::load(&conn).map_err(|e| e.to_string())?; + shortcuts::register_all(&app, &s); + Ok(()) +} + +/// Reset all settings to factory defaults and return the resulting settings. +#[tauri::command] +pub fn settings_reset_defaults( + db: State<'_, DbState>, + timer: State<'_, TimerController>, + tray_state: State<'_, Arc>, + app: AppHandle, +) -> Result { + log::info!("[settings] reset to defaults"); + let new_settings = { + let conn = db.lock().map_err(|e| e.to_string())?; + // Delete all rows so seed_defaults can insert fresh defaults. + conn.execute("DELETE FROM settings", []) + .map_err(|e| e.to_string())?; + settings::seed_defaults(&conn).map_err(|e| e.to_string())?; + settings::load(&conn).map_err(|e| e.to_string())? + }; + + timer.apply_settings(new_settings.clone()); + *tray_state.countdown_mode.lock().unwrap() = new_settings.dial_countdown; + + // Broadcast a reset snapshot so the frontend dial and display reflect the + // restored default durations without requiring the user to manually reset. + { + let snap = timer.get_snapshot(); + if !snap.is_running && !snap.is_paused { + app.emit("timer:reset", &snap).ok(); + } + } + + // After reset, defaults have tray_icon_enabled=false and min_to_tray=false, + // so destroy any active tray icon. + tray::destroy_tray(&tray_state); + + let data_dir = app.path().app_data_dir().map_err(|e| e.to_string())?; + + // Clear custom alert sounds: delete files from disk and reset in-memory paths. + if let Some(audio_state) = app.try_state::>() { + let audio_dir = data_dir.join("audio"); + for stem in [audio::STEM_WORK, audio::STEM_SHORT, audio::STEM_LONG] { + if let Ok(entries) = std::fs::read_dir(&audio_dir) { + for entry in entries.filter_map(|e| e.ok()) { + let p = entry.path(); + if p.file_stem().and_then(|s| s.to_str()) == Some(stem) { + let _ = std::fs::remove_file(&p); + } + } + } + } + audio_state.clear_custom_path("work_alert"); + audio_state.clear_custom_path("short_break_alert"); + audio_state.clear_custom_path("long_break_alert"); + log::info!("[audio] custom sounds cleared on settings reset"); + } + + let tray_theme_name = match new_settings.theme_mode.as_str() { + "dark" => &new_settings.theme_dark, + _ => &new_settings.theme_light, + }; + if let Some(theme) = themes::find(&data_dir, tray_theme_name) { + *tray_state.colors.lock().unwrap() = tray::TrayColors::from_colors_map(&theme.colors); + } + app.emit("settings:changed", &new_settings).ok(); + Ok(new_settings) +} + +// --------------------------------------------------------------------------- +// CMD-03 — Theme commands +// --------------------------------------------------------------------------- + +/// List all available themes (17 bundled + any user-created ones). +#[tauri::command] +pub fn themes_list(app: AppHandle) -> Result, String> { + let data_dir = app + .path() + .app_data_dir() + .map_err(|e| e.to_string())?; + Ok(themes::list_all(&data_dir)) +} + +// --------------------------------------------------------------------------- +// CMD-04 — Stats commands +// --------------------------------------------------------------------------- + +/// Batched stats for Today + This Week tabs (minimises IPC round-trips). +#[tauri::command] +pub fn stats_get_detailed(db: State<'_, DbState>) -> Result { + let conn = db.lock().map_err(|e| e.to_string())?; + let today = queries::get_daily_stats(&conn).map_err(|e| { + log::error!("[stats] failed to query daily stats: {e}"); + e.to_string() + })?; + let week = queries::get_weekly_stats(&conn).map_err(|e| { + log::error!("[stats] failed to query weekly stats: {e}"); + e.to_string() + })?; + let streak = queries::get_streak(&conn).map_err(|e| { + log::error!("[stats] failed to query streak: {e}"); + e.to_string() + })?; + Ok(DetailedStats { today, week, streak }) +} + +/// Heatmap data + lifetime totals for the All Time tab. +#[tauri::command] +pub fn stats_get_heatmap(db: State<'_, DbState>) -> Result { + let conn = db.lock().map_err(|e| e.to_string())?; + let entries = queries::get_heatmap_data(&conn).map_err(|e| { + log::error!("[stats] failed to query heatmap data: {e}"); + e.to_string() + })?; + let raw = queries::get_all_time_stats(&conn).map_err(|e| { + log::error!("[stats] failed to query all-time stats: {e}"); + e.to_string() + })?; + let streak = queries::get_streak(&conn).map_err(|e| { + log::error!("[stats] failed to query streak for heatmap: {e}"); + e.to_string() + })?; + Ok(HeatmapStats { + entries, + total_rounds: raw.completed_work_sessions as u32, + total_hours: (raw.total_work_secs / 3600) as u32, + longest_streak: streak.longest, + }) +} + +// --------------------------------------------------------------------------- +// CMD-05 — Window commands +// --------------------------------------------------------------------------- + +/// Show or hide the main window. +#[tauri::command] +pub fn window_set_visibility(visible: bool, app: AppHandle) -> Result<(), String> { + log::debug!("[window] set visibility={visible}"); + let window = app + .get_webview_window("main") + .ok_or_else(|| "main window not found".to_string())?; + if visible { + window.show().map_err(|e| e.to_string())?; + window.set_focus().map_err(|e| e.to_string())?; + } else { + window.hide().map_err(|e| e.to_string())?; + } + Ok(()) +} + +// --------------------------------------------------------------------------- +// CMD-07 — Audio commands +// --------------------------------------------------------------------------- + +/// Copy a user-selected audio file into the app config dir for the given cue slot. +/// +/// `cue` must be one of: `"work_alert"`, `"short_break_alert"`, `"long_break_alert"`. +/// `src_path` is the full path to the file chosen by the user. +/// +/// The file is stored with a fixed stem (e.g. `custom_work_alert.mp3`) so that +/// selecting a new file for the same slot automatically replaces the old one — +/// no orphan files accumulate. +/// +/// Returns the original filename for display in the UI. +#[tauri::command] +pub fn audio_set_custom( + cue: String, + src_path: String, + app: AppHandle, +) -> Result { + let audio_state = app + .try_state::>() + .ok_or_else(|| "audio engine is not available".to_string())?; + + let stem = cue_to_stem(&cue)?; + + let audio_dir = app + .path() + .app_data_dir() + .map_err(|e| e.to_string())? + .join("audio"); + std::fs::create_dir_all(&audio_dir).map_err(|e| e.to_string())?; + + let src = std::path::Path::new(&src_path); + let ext = src + .extension() + .and_then(|e| e.to_str()) + .unwrap_or("mp3"); + + // Remove any existing custom file for this slot (preserves zero orphans). + if let Ok(entries) = std::fs::read_dir(&audio_dir) { + for entry in entries.filter_map(|e| e.ok()) { + let p = entry.path(); + if p.file_stem().and_then(|s| s.to_str()) == Some(stem) { + let _ = std::fs::remove_file(&p); + } + } + } + + let dest = audio_dir.join(format!("{stem}.{ext}")); + std::fs::copy(src, &dest).map_err(|e| e.to_string())?; + + audio_state.set_custom_path(&cue, dest); + + let display_name = src + .file_name() + .and_then(|n| n.to_str()) + .unwrap_or("custom") + .to_string(); + log::info!("[audio] custom sound set cue={cue} file={display_name}"); + Ok(display_name) +} + +/// Restore the built-in sound for the given cue slot by deleting the custom file. +#[tauri::command] +pub fn audio_clear_custom(cue: String, app: AppHandle) -> Result<(), String> { + let audio_state = app + .try_state::>() + .ok_or_else(|| "audio engine is not available".to_string())?; + + let stem = cue_to_stem(&cue)?; + + let audio_dir = app + .path() + .app_data_dir() + .map_err(|e| e.to_string())? + .join("audio"); + + if let Ok(entries) = std::fs::read_dir(&audio_dir) { + for entry in entries.filter_map(|e| e.ok()) { + let p = entry.path(); + if p.file_stem().and_then(|s| s.to_str()) == Some(stem) { + std::fs::remove_file(&p).map_err(|e| e.to_string())?; + } + } + } + + audio_state.clear_custom_path(&cue); + log::info!("[audio] custom sound cleared cue={cue}"); + Ok(()) +} + +/// Return the display names of any currently configured custom audio files. +/// Fields are `null` when the built-in sound is in use for that slot. +#[tauri::command] +pub fn audio_get_custom_info(app: AppHandle) -> Result { + let audio_state = app + .try_state::>() + .ok_or_else(|| "audio engine is not available".to_string())?; + Ok(audio_state.get_custom_info()) +} + +// --------------------------------------------------------------------------- +// CMD-08 — Notification command +// --------------------------------------------------------------------------- + +/// Show a desktop notification with the given title and body. +/// +/// String construction (including translation) is the caller's (frontend's) +/// responsibility. This command is a thin platform-dispatch wrapper. +#[tauri::command] +pub fn notification_show(title: String, body: String, app: AppHandle) { + notifications::show(&app, &title, &body); +} + +// --------------------------------------------------------------------------- +// CMD-09 — Diagnostic log commands +// --------------------------------------------------------------------------- + +/// Open the application log directory in the OS file manager. +#[tauri::command] +pub fn open_log_dir(app: AppHandle) { + match app.path().app_log_dir() { + Ok(log_dir) => { + if let Err(e) = tauri_plugin_opener::open_path(&log_dir, None::<&str>) { + log::warn!("[log] failed to open log dir {}: {e}", log_dir.display()); + } + } + Err(e) => log::warn!("[log] failed to resolve log dir: {e}"), + } +} + +/// Return the compile-time build version string. +#[tauri::command] +pub fn app_version() -> &'static str { + env!("APP_BUILD_VERSION") +} + +// --------------------------------------------------------------------------- +// CMD-10 — Platform commands +// --------------------------------------------------------------------------- + +/// Returns whether the app has macOS Accessibility permission. +/// On macOS, calls AXIsProcessTrusted() from the ApplicationServices framework. +/// On all other platforms, always returns true. +#[tauri::command] +pub fn accessibility_trusted() -> bool { + #[cfg(target_os = "macos")] + { + #[link(name = "ApplicationServices", kind = "framework")] + extern "C" { + fn AXIsProcessTrusted() -> bool; + } + unsafe { AXIsProcessTrusted() } + } + #[cfg(not(target_os = "macos"))] + { + true + } +} + +/// Return the application log directory path as a string. +#[tauri::command] +pub fn get_log_dir(app: AppHandle) -> Result { + app.path() + .app_log_dir() + .map(|p| p.to_string_lossy().into_owned()) + .map_err(|e| { + log::warn!("[log] failed to resolve log dir: {e}"); + e.to_string() + }) +} + +fn cue_to_stem(cue: &str) -> Result<&'static str, String> { + match cue { + "work_alert" => Ok(audio::STEM_WORK), + "short_break_alert" => Ok(audio::STEM_SHORT), + "long_break_alert" => Ok(audio::STEM_LONG), + _ => Err(format!("unknown audio cue: '{cue}'")), + } +} + +// --------------------------------------------------------------------------- +// Stats payload types +// --------------------------------------------------------------------------- + +/// Batched payload for Today + This Week tabs. +#[derive(serde::Serialize)] +pub struct DetailedStats { + pub today: queries::DailyStats, + pub week: Vec, + pub streak: queries::StreakInfo, +} + +/// Payload for the All Time tab. +#[derive(serde::Serialize)] +pub struct HeatmapStats { + pub entries: Vec, + pub total_rounds: u32, + pub total_hours: u32, + pub longest_streak: u32, +} diff --git a/src-tauri/src/db/migrations.rs b/src-tauri/src/db/migrations.rs new file mode 100644 index 0000000..004551d --- /dev/null +++ b/src-tauri/src/db/migrations.rs @@ -0,0 +1,98 @@ +use rusqlite::{Connection, Result}; + +/// Full schema for version 1. Tables use IF NOT EXISTS so the batch is +/// idempotent, but the schema_version check in `run()` prevents re-execution. +const MIGRATION_1: &str = " + CREATE TABLE IF NOT EXISTS schema_version ( + version INTEGER NOT NULL + ); + + CREATE TABLE IF NOT EXISTS settings ( + key TEXT PRIMARY KEY NOT NULL, + value TEXT NOT NULL + ); + + CREATE TABLE IF NOT EXISTS sessions ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + started_at INTEGER NOT NULL, + ended_at INTEGER, + round_type TEXT NOT NULL CHECK(round_type IN ('work', 'short-break', 'long-break')), + duration_secs INTEGER NOT NULL CHECK(duration_secs > 0), + completed INTEGER NOT NULL DEFAULT 0 CHECK(completed IN (0, 1)) + ); + + CREATE TABLE IF NOT EXISTS custom_themes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL UNIQUE, + colors TEXT NOT NULL + ); + + CREATE INDEX IF NOT EXISTS idx_sessions_started_at ON sessions(started_at); + CREATE INDEX IF NOT EXISTS idx_sessions_round_type ON sessions(round_type); + + INSERT INTO schema_version VALUES (1); +"; + +/// Apply any pending migrations. Each migration is wrapped in a transaction +/// so a partial failure leaves the database unchanged. +pub fn run(conn: &Connection) -> Result<()> { + let version = current_version(conn)?; + + if version < 1 { + conn.execute_batch(&format!("BEGIN; {MIGRATION_1} COMMIT;"))?; + } + + Ok(()) +} + +/// Returns the current schema version, or 0 if the database is fresh. +fn current_version(conn: &Connection) -> Result { + let table_exists: bool = conn.query_row( + "SELECT COUNT(*) > 0 FROM sqlite_master WHERE type='table' AND name='schema_version'", + [], + |row| row.get(0), + )?; + + if !table_exists { + return Ok(0); + } + + conn.query_row( + "SELECT COALESCE(MAX(version), 0) FROM schema_version", + [], + |row| row.get(0), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn migration_is_idempotent() { + let conn = Connection::open_in_memory().unwrap(); + run(&conn).unwrap(); + // Second run must not error (version check prevents re-application). + run(&conn).unwrap(); + let v: i64 = conn + .query_row("SELECT MAX(version) FROM schema_version", [], |r| r.get(0)) + .unwrap(); + assert_eq!(v, 1); + } + + #[test] + fn all_tables_created() { + let conn = Connection::open_in_memory().unwrap(); + run(&conn).unwrap(); + for table in &["settings", "sessions", "custom_themes", "schema_version"] { + let count: i64 = conn + .query_row( + "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name=?1", + [table], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(count, 1, "table '{table}' was not created"); + } + } +} diff --git a/src-tauri/src/db/mod.rs b/src-tauri/src/db/mod.rs new file mode 100644 index 0000000..cf5041d --- /dev/null +++ b/src-tauri/src/db/mod.rs @@ -0,0 +1,24 @@ +pub mod migrations; +pub mod queries; + +use rusqlite::{Connection, Result}; +use std::sync::{Arc, Mutex}; + +/// Thread-safe handle to the SQLite connection. +/// Registered as Tauri managed state so commands can access it. +pub type DbState = Arc>; + +/// Open (or create) the `pomotroid.db` file inside `app_data_dir`, +/// enable WAL mode for better concurrent read performance, +/// and run any pending schema migrations. +pub fn open(app_data_dir: &std::path::Path) -> Result { + let db_path = app_data_dir.join("pomotroid.db"); + let conn = Connection::open(&db_path)?; + + // WAL mode: readers don't block writers and vice-versa. + conn.execute_batch("PRAGMA journal_mode=WAL; PRAGMA foreign_keys=ON;")?; + + migrations::run(&conn)?; + + Ok(Arc::new(Mutex::new(conn))) +} diff --git a/src-tauri/src/db/queries.rs b/src-tauri/src/db/queries.rs new file mode 100644 index 0000000..47a1cba --- /dev/null +++ b/src-tauri/src/db/queries.rs @@ -0,0 +1,417 @@ +use rusqlite::{params, Connection, Result}; +use serde::Serialize; + +// --------------------------------------------------------------------------- +// Session CRUD (DATA-03) +// --------------------------------------------------------------------------- + +/// Inserts a new session row when a round begins. +/// Returns the row ID so it can be passed to `complete_session` later. +pub fn insert_session( + conn: &Connection, + round_type: &str, + duration_secs: u32, +) -> Result { + let started_at = unix_now(); + conn.execute( + "INSERT INTO sessions (started_at, round_type, duration_secs, completed) + VALUES (?1, ?2, ?3, 0)", + params![started_at, round_type, duration_secs], + )?; + Ok(conn.last_insert_rowid()) +} + +/// Updates a session when the round ends (by completion or skip). +pub fn complete_session( + conn: &Connection, + session_id: i64, + completed: bool, +) -> Result<()> { + conn.execute( + "UPDATE sessions SET ended_at = ?1, completed = ?2 WHERE id = ?3", + params![unix_now(), completed as i64, session_id], + )?; + Ok(()) +} + +// --------------------------------------------------------------------------- +// Stats queries +// --------------------------------------------------------------------------- + +#[derive(Debug, Serialize)] +pub struct SessionStats { + pub total_work_sessions: i64, + pub completed_work_sessions: i64, + /// Sum of duration_secs for all *completed* work sessions. + pub total_work_secs: i64, +} + +pub fn get_all_time_stats(conn: &Connection) -> Result { + let total_work_sessions: i64 = conn.query_row( + "SELECT COUNT(*) FROM sessions WHERE round_type = 'work'", + [], + |r| r.get(0), + )?; + + let completed_work_sessions: i64 = conn.query_row( + "SELECT COUNT(*) FROM sessions WHERE round_type = 'work' AND completed = 1", + [], + |r| r.get(0), + )?; + + let total_work_secs: i64 = conn.query_row( + "SELECT COALESCE(SUM(duration_secs), 0) + FROM sessions WHERE round_type = 'work' AND completed = 1", + [], + |r| r.get(0), + )?; + + Ok(SessionStats { + total_work_sessions, + completed_work_sessions, + total_work_secs, + }) +} + +// --------------------------------------------------------------------------- +// Detailed stats queries (DATA-04) +// --------------------------------------------------------------------------- + +#[derive(Debug, Serialize)] +pub struct DailyStats { + pub rounds: u32, + pub focus_mins: u32, + /// None when no work sessions were started today (avoids 0/0). + pub completion_rate: Option, + /// Completed work rounds per hour of the day (index 0 = midnight). + pub by_hour: Vec, +} + +#[derive(Debug, Serialize)] +pub struct DayStat { + /// Local calendar date in "YYYY-MM-DD" format. + pub date: String, + pub rounds: u32, +} + +#[derive(Debug, Serialize)] +pub struct HeatmapEntry { + /// Local calendar date in "YYYY-MM-DD" format. + pub date: String, + pub count: u32, +} + +#[derive(Debug, Serialize)] +pub struct StreakInfo { + pub current: u32, + pub longest: u32, +} + +/// Completed work rounds and focus time for today (local calendar date). +pub fn get_daily_stats(conn: &Connection) -> Result { + let today: String = conn.query_row( + "SELECT date('now', 'localtime')", + [], + |r| r.get(0), + )?; + + let total: i64 = conn.query_row( + "SELECT COUNT(*) FROM sessions + WHERE round_type = 'work' + AND date(started_at, 'unixepoch', 'localtime') = ?1", + [&today], + |r| r.get(0), + )?; + + let completed: i64 = conn.query_row( + "SELECT COUNT(*) FROM sessions + WHERE round_type = 'work' AND completed = 1 + AND date(started_at, 'unixepoch', 'localtime') = ?1", + [&today], + |r| r.get(0), + )?; + + let focus_secs: i64 = conn.query_row( + "SELECT COALESCE(SUM(duration_secs), 0) FROM sessions + WHERE round_type = 'work' AND completed = 1 + AND date(started_at, 'unixepoch', 'localtime') = ?1", + [&today], + |r| r.get(0), + )?; + + let mut by_hour = vec![0u32; 24]; + let mut stmt = conn.prepare( + "SELECT CAST(strftime('%H', datetime(started_at, 'unixepoch', 'localtime')) AS INTEGER) as h, + COUNT(*) as cnt + FROM sessions + WHERE round_type = 'work' AND completed = 1 + AND date(started_at, 'unixepoch', 'localtime') = ?1 + GROUP BY h", + )?; + let rows = stmt.query_map([&today], |r| Ok((r.get::<_, i64>(0)?, r.get::<_, u32>(1)?)))?; + for row in rows.flatten() { + let (h, cnt) = row; + if (0..24).contains(&h) { + by_hour[h as usize] = cnt; + } + } + + Ok(DailyStats { + rounds: completed as u32, + focus_mins: (focus_secs / 60) as u32, + completion_rate: if total > 0 { Some(completed as f32 / total as f32) } else { None }, + by_hour, + }) +} + +/// Completed work rounds per local calendar day for the last 7 days. +pub fn get_weekly_stats(conn: &Connection) -> Result> { + let mut stmt = conn.prepare( + "SELECT date(started_at, 'unixepoch', 'localtime') as day, + COUNT(*) as rounds + FROM sessions + WHERE round_type = 'work' AND completed = 1 + AND date(started_at, 'unixepoch', 'localtime') >= date('now', 'localtime', '-6 days') + GROUP BY day + ORDER BY day", + )?; + let rows = stmt.query_map([], |r| Ok(DayStat { date: r.get(0)?, rounds: r.get(1)? }))? + .collect(); + rows +} + +/// Completed work rounds per local calendar day, all time (no date limit). +/// The frontend slices this into per-year views for navigation. +pub fn get_heatmap_data(conn: &Connection) -> Result> { + let mut stmt = conn.prepare( + "SELECT date(started_at, 'unixepoch', 'localtime') as day, + COUNT(*) as cnt + FROM sessions + WHERE round_type = 'work' AND completed = 1 + GROUP BY day + ORDER BY day", + )?; + let rows = stmt.query_map([], |r| Ok(HeatmapEntry { date: r.get(0)?, count: r.get(1)? }))? + .collect(); + rows +} + +/// Current and longest work-session streaks (consecutive local calendar days). +/// A streak stays active until midnight: if yesterday had sessions but today does not, +/// the streak is still counted as current. +pub fn get_streak(conn: &Connection) -> Result { + let today: String = conn.query_row( + "SELECT date('now', 'localtime')", + [], + |r| r.get(0), + )?; + + let mut stmt = conn.prepare( + "SELECT date(started_at, 'unixepoch', 'localtime') as day + FROM sessions + WHERE round_type = 'work' AND completed = 1 + GROUP BY day + ORDER BY day", + )?; + let days: Vec = stmt + .query_map([], |r| r.get(0))? + .flatten() + .collect(); + + Ok(compute_streak(&days, &today)) +} + +// --------------------------------------------------------------------------- +// Streak helpers +// --------------------------------------------------------------------------- + +/// Convert a "YYYY-MM-DD" string to a day number for arithmetic comparison. +/// Uses the proleptic Gregorian calendar; absolute value is arbitrary — only +/// differences between dates matter. +fn date_to_day_num(s: &str) -> Option { + let mut parts = s.splitn(3, '-'); + let y: i32 = parts.next()?.parse().ok()?; + let m: i32 = parts.next()?.parse().ok()?; + let d: i32 = parts.next()?.parse().ok()?; + let y = if m <= 2 { y - 1 } else { y }; + let m = if m <= 2 { m + 12 } else { m }; + Some(y * 365 + y / 4 - y / 100 + y / 400 + (153 * m - 457) / 5 + d) +} + +pub fn compute_streak(days: &[String], today: &str) -> StreakInfo { + let nums: Vec = days.iter().filter_map(|s| date_to_day_num(s)).collect(); + if nums.is_empty() { + return StreakInfo { current: 0, longest: 0 }; + } + + let today_n = match date_to_day_num(today) { + Some(n) => n, + None => return StreakInfo { current: 0, longest: 0 }, + }; + + // Current streak — alive if most recent session day is today or yesterday. + let last = *nums.last().unwrap(); + let current = if last == today_n || last == today_n - 1 { + let mut count = 0u32; + let mut expected = last; + for &n in nums.iter().rev() { + if n == expected { + count += 1; + expected -= 1; + } else { + break; + } + } + count + } else { + 0 + }; + + // Longest streak. + let mut longest = 1u32; + let mut run = 1u32; + for i in 1..nums.len() { + if nums[i] == nums[i - 1] + 1 { + run += 1; + if run > longest { longest = run; } + } else { + run = 1; + } + } + + StreakInfo { current, longest } +} + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +fn unix_now() -> i64 { + std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default() + .as_secs() as i64 +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::db::migrations; + + fn setup() -> Connection { + let conn = Connection::open_in_memory().unwrap(); + migrations::run(&conn).unwrap(); + conn + } + + #[test] + fn insert_and_complete_session() { + let conn = setup(); + let id = insert_session(&conn, "work", 1500).unwrap(); + assert!(id > 0); + + complete_session(&conn, id, true).unwrap(); + + let completed: i64 = conn + .query_row( + "SELECT completed FROM sessions WHERE id = ?1", + [id], + |r| r.get(0), + ) + .unwrap(); + assert_eq!(completed, 1); + } + + #[test] + fn stats_empty_db() { + let conn = setup(); + let stats = get_all_time_stats(&conn).unwrap(); + assert_eq!(stats.total_work_sessions, 0); + assert_eq!(stats.completed_work_sessions, 0); + assert_eq!(stats.total_work_secs, 0); + } + + #[test] + fn compute_streak_empty() { + let info = compute_streak(&[], "2024-03-15"); + assert_eq!(info.current, 0); + assert_eq!(info.longest, 0); + } + + #[test] + fn compute_streak_active_today() { + let days = vec!["2024-03-13".to_string(), "2024-03-14".to_string(), "2024-03-15".to_string()]; + let info = compute_streak(&days, "2024-03-15"); + assert_eq!(info.current, 3); + assert_eq!(info.longest, 3); + } + + #[test] + fn compute_streak_active_until_midnight() { + // Yesterday had sessions, today does not — streak still live. + let days = vec!["2024-03-13".to_string(), "2024-03-14".to_string()]; + let info = compute_streak(&days, "2024-03-15"); + assert_eq!(info.current, 2); + } + + #[test] + fn compute_streak_broken() { + // Last session was 2 days ago — streak is broken. + let days = vec!["2024-03-12".to_string(), "2024-03-13".to_string()]; + let info = compute_streak(&days, "2024-03-15"); + assert_eq!(info.current, 0); + } + + #[test] + fn compute_streak_longest_across_break() { + let days = vec![ + "2024-03-01".to_string(), "2024-03-02".to_string(), "2024-03-03".to_string(), + "2024-03-10".to_string(), "2024-03-11".to_string(), + ]; + let info = compute_streak(&days, "2024-03-11"); + assert_eq!(info.current, 2); + assert_eq!(info.longest, 3); + } + + #[test] + fn get_daily_stats_empty() { + let conn = setup(); + let stats = get_daily_stats(&conn).unwrap(); + assert_eq!(stats.rounds, 0); + assert_eq!(stats.focus_mins, 0); + assert!(stats.completion_rate.is_none()); + assert_eq!(stats.by_hour.len(), 24); + } + + #[test] + fn get_weekly_stats_empty() { + let conn = setup(); + let stats = get_weekly_stats(&conn).unwrap(); + assert!(stats.is_empty()); + } + + #[test] + fn get_heatmap_data_empty() { + let conn = setup(); + let entries = get_heatmap_data(&conn).unwrap(); + assert!(entries.is_empty()); + } + + #[test] + fn stats_counts_correctly() { + let conn = setup(); + + let id1 = insert_session(&conn, "work", 1500).unwrap(); + complete_session(&conn, id1, true).unwrap(); + + let id2 = insert_session(&conn, "work", 1500).unwrap(); + complete_session(&conn, id2, false).unwrap(); // skipped + + let _id3 = insert_session(&conn, "short-break", 300).unwrap(); + + let stats = get_all_time_stats(&conn).unwrap(); + assert_eq!(stats.total_work_sessions, 2); + assert_eq!(stats.completed_work_sessions, 1); + assert_eq!(stats.total_work_secs, 1500); + } +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000..8157dca --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,238 @@ +pub mod audio; +pub mod commands; +pub mod db; +pub mod notifications; +pub mod settings; +pub mod shortcuts; +pub mod themes; +pub mod timer; +pub mod tray; +pub mod websocket; + +use std::sync::Arc; + +use log::LevelFilter; +use tauri::Manager; +use tauri_plugin_log::{Builder as LogBuilder, RotationStrategy, Target, TargetKind}; + +use commands::{ + accessibility_trusted, + app_version, + audio_clear_custom, audio_get_custom_info, audio_set_custom, + get_log_dir, open_log_dir, + notification_show, + settings_get, settings_reset_defaults, settings_set, + shortcuts_reload, + stats_get_detailed, stats_get_heatmap, + themes_list, + timer_get_state, timer_reset, timer_restart_round, timer_skip, timer_toggle, + window_set_visibility, +}; + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin( + LogBuilder::new() + .targets([Target::new(TargetKind::LogDir { file_name: None })]) + .max_file_size(5 * 1024 * 1024) + .rotation_strategy(RotationStrategy::KeepOne) + .level(LevelFilter::Debug) + .build(), + ) + .plugin(tauri_plugin_opener::init()) + .plugin(tauri_plugin_global_shortcut::Builder::new().build()) + .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_notification::init()) + .setup(|app| { + // Capture Rust panics to the log file before the process terminates. + std::panic::set_hook(Box::new(|info| { + log::error!("PANIC: {info}"); + })); + + let app_data_dir = app + .path() + .app_data_dir() + .expect("failed to resolve app data directory"); + + std::fs::create_dir_all(&app_data_dir) + .expect("failed to create app data directory"); + + // --- Database --- + let db = match db::open(&app_data_dir) { + Ok(d) => { + log::info!( + "[app] version={} sha={}", + env!("APP_BUILD_VERSION"), + env!("APP_BUILD_SHA") + ); + log::info!( + "Pomotroid v{} — data dir: {}", + env!("CARGO_PKG_VERSION"), + app_data_dir.display() + ); + log::info!("Database opened successfully"); + d + } + Err(e) => { + log::error!("Failed to open database: {e}"); + panic!("failed to open database: {e}"); + } + }; + { + let conn = db.lock().unwrap(); + settings::seed_defaults(&conn).expect("failed to seed default settings"); + } + app.manage(db.clone()); + + // --- Tray state (always created; icon populated only when min_to_tray is on) --- + let tray_state = tray::TrayState::new(); + app.manage(Arc::clone(&tray_state)); + + // --- Load settings once (used by Timer, Audio, etc.) --- + let initial_settings = { + let conn = db.lock().unwrap(); + settings::load(&conn).expect("failed to load settings") + }; + + // Apply the persisted log level before any further setup. + if initial_settings.verbose_logging { + log::set_max_level(LevelFilter::Debug); + log::info!("Verbose logging enabled — log level set to DEBUG"); + } else { + log::set_max_level(LevelFilter::Info); + } + + // Sync tray state from saved settings. + *tray_state.countdown_mode.lock().unwrap() = initial_settings.dial_countdown; + let tray_theme_name = match initial_settings.theme_mode.as_str() { + "dark" => &initial_settings.theme_dark, + _ => &initial_settings.theme_light, + }; + if let Some(theme) = themes::find(&app_data_dir, tray_theme_name) { + *tray_state.colors.lock().unwrap() = tray::TrayColors::from_colors_map(&theme.colors); + } + + // --- Audio engine (optional — graceful if no audio device) --- + if let Some(audio) = audio::AudioManager::new(&initial_settings) { + // Restore any previously saved custom audio files. + let audio_dir = app_data_dir.join("audio"); + if audio_dir.exists() { + let custom = audio::find_custom_files(&audio_dir); + *audio.custom_paths.lock().unwrap() = custom; + } + app.manage(audio); + } + + // --- Timer controller (needs settings + AppHandle + TrayState + DB) --- + let timer = timer::TimerController::new( + app.handle().clone(), + initial_settings.clone(), + Arc::clone(&tray_state), + db.clone(), + ); + app.manage(timer); + + // Create initial tray icon if tray_icon_enabled is on, or if an + // existing user has min_to_tray enabled (backwards compatibility). + if initial_settings.tray_icon_enabled || initial_settings.min_to_tray { + tray::create_tray(app.handle(), &tray_state); + } + + // --- Theme hot-reload watcher --- + // The watcher must stay alive for the duration of the app. + // Wrap in a Mutex so it satisfies Send + Sync for Tauri manage. + if let Some(watcher) = themes::watcher::spawn_watcher( + app_data_dir.clone(), + app.handle().clone(), + ) { + app.manage(std::sync::Mutex::new(watcher)); + } + + // --- Global shortcuts --- + shortcuts::register_all(app.handle(), &initial_settings); + + // --- WebSocket server (opt-in) --- + let ws_state = websocket::WsState::new(); + app.manage(Arc::clone(&ws_state)); + + if initial_settings.websocket_enabled { + let port = initial_settings.websocket_port; + let app_clone = app.handle().clone(); + tauri::async_runtime::spawn(async move { + websocket::start(port, app_clone, &ws_state).await; + }); + } + + // --- Window event handlers --- + let main_window = app + .get_webview_window("main") + .expect("main window not found"); + + // The config sets decorations:true so macOS renders the window correctly + // (decorations:false prevents event processing on macOS). On every other + // platform, restore the decorations-free window immediately; the window is + // still hidden at this point so there is no visible flash. + #[cfg(not(target_os = "macos"))] + let _ = main_window.set_decorations(false); + + // Apply always-on-top from saved settings on startup. + if initial_settings.always_on_top { + let _ = main_window.set_always_on_top(true); + } + + // CloseRequested: hide to tray instead of quitting if min_to_tray_on_close. + let db_for_close = db.clone(); + let win_for_close = main_window.clone(); + main_window.on_window_event(move |event| { + if let tauri::WindowEvent::CloseRequested { api, .. } = event { + let hide = db_for_close + .lock() + .ok() + .and_then(|conn| settings::load(&conn).ok()) + .map(|s| s.min_to_tray_on_close) + .unwrap_or(false); + if hide { + api.prevent_close(); + let _ = win_for_close.hide(); + } + } + }); + + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + // Timer + timer_toggle, + timer_reset, + timer_restart_round, + timer_skip, + timer_get_state, + // Settings + settings_get, + settings_set, + settings_reset_defaults, + // Themes + themes_list, + // Stats + stats_get_detailed, + stats_get_heatmap, + // Window + window_set_visibility, + // Shortcuts + shortcuts_reload, + // Audio + audio_set_custom, + audio_clear_custom, + audio_get_custom_info, + // Notifications + notification_show, + // Diagnostics + open_log_dir, + get_log_dir, + accessibility_trusted, + app_version, + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..01cc599 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,6 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +fn main() { + pomotroid_lib::run() +} diff --git a/src-tauri/src/notifications/mod.rs b/src-tauri/src/notifications/mod.rs new file mode 100644 index 0000000..b9cb312 --- /dev/null +++ b/src-tauri/src/notifications/mod.rs @@ -0,0 +1,57 @@ +/// Desktop notification dispatch. +/// +/// Notification strings are constructed on the frontend (translated via +/// Paraglide) and passed to `dispatch` as plain `title` and `body` strings. +/// This keeps all i18n logic in the frontend; Rust is locale-agnostic. +/// +/// On Linux, `tauri-plugin-notification` uses `notify-rust` / `zbus` which +/// fails to connect to the D-Bus session bus from within the Tauri process +/// context. We spawn `notify-send` (libnotify-bin, installed by default on +/// Ubuntu/GNOME) as a subprocess instead — it inherits the correct session +/// environment and works reliably. +/// +/// On macOS and Windows the Tauri plugin is used as normal. +use tauri::AppHandle; + +// --------------------------------------------------------------------------- +// Public API +// --------------------------------------------------------------------------- + +/// Send a notification with the given title and body if enabled. +/// Called from the `notification_show` Tauri command. +pub fn show(app: &AppHandle, title: &str, body: &str) { + dispatch(app, title, body); +} + +// --------------------------------------------------------------------------- +// Platform dispatch +// --------------------------------------------------------------------------- + +#[cfg(target_os = "linux")] +pub fn dispatch(_app: &AppHandle, title: &str, body: &str) { + let _ = std::process::Command::new("notify-send") + .args(["--app-name=Pomotroid", "--urgency=normal", "--expire-time=5000", title, body]) + .spawn(); +} + +#[cfg(not(target_os = "linux"))] +pub fn dispatch(app: &AppHandle, title: &str, body: &str) { + use tauri_plugin_notification::NotificationExt; + if let Err(e) = app.notification().builder().title(title).body(body).show() { + log::warn!("[notifications] failed to send notification: {e}"); + } +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + #[test] + fn show_fn_exists() { + // Compile-time check: `show` is callable with the right signature. + // Runtime dispatch is not testable without an AppHandle. + let _: fn(&tauri::AppHandle, &str, &str) = super::show; + } +} diff --git a/src-tauri/src/settings/defaults.rs b/src-tauri/src/settings/defaults.rs new file mode 100644 index 0000000..b28a039 --- /dev/null +++ b/src-tauri/src/settings/defaults.rs @@ -0,0 +1,31 @@ +/// All default key-value pairs seeded into the `settings` table on first launch. +/// Values are stored as TEXT in SQLite; the loader in `mod.rs` parses them +/// into their proper Rust types. +/// +/// Time values are stored in **minutes**; they are converted to seconds on load. +/// Volume is stored on a **0–100** integer scale; converted to 0.0–1.0 on load. +pub const DEFAULTS: &[(&str, &str)] = &[ + ("always_on_top", "false"), + ("break_always_on_top", "false"), + ("auto_start_work", "true"), + ("auto_start_break", "true"), + ("tray_icon_enabled", "false"), + ("min_to_tray", "false"), + ("min_to_tray_on_close", "false"), + ("notifications", "false"), + ("work_rounds", "4"), + ("dial_countdown", "true"), + ("theme_mode", "auto"), + ("theme_light", "Pomotroid Light"), + ("theme_dark", "Pomotroid"), + ("tick_sounds_work", "false"), + ("tick_sounds_break", "false"), + ("time_work_mins", "25"), + ("time_short_break_mins", "5"), + ("time_long_break_mins", "15"), + ("volume", "100"), + ("websocket_enabled", "false"), + ("websocket_port", "1314"), + ("language", "auto"), + ("verbose_logging", "false"), +]; diff --git a/src-tauri/src/settings/mod.rs b/src-tauri/src/settings/mod.rs new file mode 100644 index 0000000..45a27f3 --- /dev/null +++ b/src-tauri/src/settings/mod.rs @@ -0,0 +1,365 @@ +pub mod defaults; + +use rusqlite::{params, Connection, Result}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; + +/// All user-configurable settings, fully typed. +/// +/// Time fields are in **seconds** (converted from stored minutes). +/// `volume` is in the **0.0–1.0** range (converted from stored 0–100). +/// +/// This struct is serialized to JSON and sent to the Svelte frontend via Tauri IPC. +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct Settings { + pub always_on_top: bool, + pub break_always_on_top: bool, + pub auto_start_work: bool, + pub auto_start_break: bool, + pub tray_icon_enabled: bool, + pub min_to_tray: bool, + pub min_to_tray_on_close: bool, + pub notifications_enabled: bool, + /// Number of work rounds before a long break. + pub long_break_interval: u32, + /// When true the dial arc starts full and subtracts; when false it fills from empty. + pub dial_countdown: bool, + pub theme_mode: String, + pub theme_light: String, + pub theme_dark: String, + pub tick_sounds_during_work: bool, + pub tick_sounds_during_break: bool, + /// Work round duration in seconds. + pub time_work_secs: u32, + /// Short break duration in seconds. + pub time_short_break_secs: u32, + /// Long break duration in seconds. + pub time_long_break_secs: u32, + /// Audio volume in the 0.0–1.0 range. + pub volume: f32, + pub shortcut_toggle: String, + pub shortcut_reset: String, + pub shortcut_skip: String, + pub shortcut_restart: String, + pub websocket_enabled: bool, + pub websocket_port: u16, + pub language: String, + pub verbose_logging: bool, +} + +impl Default for Settings { + fn default() -> Self { + Self { + always_on_top: false, + break_always_on_top: false, + auto_start_work: true, + auto_start_break: true, + tray_icon_enabled: false, + min_to_tray: false, + min_to_tray_on_close: false, + notifications_enabled: false, + long_break_interval: 4, + dial_countdown: true, + theme_mode: "auto".to_string(), + theme_light: "Pomotroid Light".to_string(), + theme_dark: "Pomotroid".to_string(), + tick_sounds_during_work: false, + tick_sounds_during_break: false, + time_work_secs: 25 * 60, + time_short_break_secs: 5 * 60, + time_long_break_secs: 15 * 60, + volume: 1.0, + #[cfg(target_os = "macos")] + shortcut_toggle: "Super+Shift+1".to_string(), + #[cfg(not(target_os = "macos"))] + shortcut_toggle: "Control+F1".to_string(), + #[cfg(target_os = "macos")] + shortcut_reset: "Super+Shift+2".to_string(), + #[cfg(not(target_os = "macos"))] + shortcut_reset: "Control+F2".to_string(), + #[cfg(target_os = "macos")] + shortcut_skip: "Super+Shift+3".to_string(), + #[cfg(not(target_os = "macos"))] + shortcut_skip: "Control+F3".to_string(), + #[cfg(target_os = "macos")] + shortcut_restart: "Super+Shift+4".to_string(), + #[cfg(not(target_os = "macos"))] + shortcut_restart: "Control+F4".to_string(), + websocket_enabled: false, + websocket_port: 1314, + language: "auto".to_string(), + verbose_logging: false, + } + } +} + +/// Seed the `settings` table with default values for any missing keys. +/// Uses `INSERT OR IGNORE` so existing customizations are preserved. +/// +/// Shortcut defaults are platform-specific and seeded before the common +/// defaults so that INSERT OR IGNORE lets them win on first launch. +pub fn seed_defaults(conn: &Connection) -> Result<()> { + // Platform-specific shortcut defaults (seeded first so they win). + #[cfg(target_os = "macos")] + let shortcut_defaults: &[(&str, &str)] = &[ + ("shortcut_toggle", "Super+Shift+1"), + ("shortcut_reset", "Super+Shift+2"), + ("shortcut_skip", "Super+Shift+3"), + ("shortcut_restart", "Super+Shift+4"), + ]; + #[cfg(not(target_os = "macos"))] + let shortcut_defaults: &[(&str, &str)] = &[ + ("shortcut_toggle", "Control+F1"), + ("shortcut_reset", "Control+F2"), + ("shortcut_skip", "Control+F3"), + ("shortcut_restart", "Control+F4"), + ]; + + for (key, value) in shortcut_defaults { + conn.execute( + "INSERT OR IGNORE INTO settings (key, value) VALUES (?1, ?2)", + params![key, value], + )?; + } + + for (key, value) in defaults::DEFAULTS { + conn.execute( + "INSERT OR IGNORE INTO settings (key, value) VALUES (?1, ?2)", + params![key, value], + )?; + } + Ok(()) +} + +/// Load all settings from the database. Falls back to `Settings::default()` +/// values for any key that is missing or cannot be parsed. +pub fn load(conn: &Connection) -> Result { + let mut stmt = conn.prepare("SELECT key, value FROM settings")?; + let map: HashMap = stmt + .query_map([], |row| Ok((row.get::<_, String>(0)?, row.get::<_, String>(1)?)))? + .filter_map(|r| r.ok()) + .collect(); + + let d = Settings::default(); + Ok(Settings { + always_on_top: parse_bool(&map, "always_on_top", d.always_on_top), + break_always_on_top: parse_bool(&map, "break_always_on_top", d.break_always_on_top), + auto_start_work: parse_bool(&map, "auto_start_work", d.auto_start_work), + auto_start_break: parse_bool(&map, "auto_start_break", d.auto_start_break), + tray_icon_enabled: parse_bool(&map, "tray_icon_enabled", d.tray_icon_enabled), + min_to_tray: parse_bool(&map, "min_to_tray", d.min_to_tray), + min_to_tray_on_close: parse_bool(&map, "min_to_tray_on_close", d.min_to_tray_on_close), + notifications_enabled: parse_bool(&map, "notifications", d.notifications_enabled), + long_break_interval: parse_u32(&map, "work_rounds", d.long_break_interval), + dial_countdown: parse_bool(&map, "dial_countdown", d.dial_countdown), + theme_mode: map + .get("theme_mode") + .cloned() + .unwrap_or(d.theme_mode), + theme_light: map + .get("theme_light") + .cloned() + .unwrap_or(d.theme_light), + theme_dark: map + .get("theme_dark") + .cloned() + .unwrap_or(d.theme_dark), + tick_sounds_during_work: parse_bool(&map, "tick_sounds_work", d.tick_sounds_during_work), + tick_sounds_during_break: parse_bool( + &map, + "tick_sounds_break", + d.tick_sounds_during_break, + ), + // DB stores minutes; expose seconds to the frontend and timer engine. + time_work_secs: parse_u32(&map, "time_work_mins", d.time_work_secs / 60) * 60, + time_short_break_secs: parse_u32(&map, "time_short_break_mins", d.time_short_break_secs / 60) * 60, + time_long_break_secs: parse_u32(&map, "time_long_break_mins", d.time_long_break_secs / 60) * 60, + // DB stores 0–100; convert to 0.0–1.0. + volume: (parse_u32(&map, "volume", (d.volume * 100.0) as u32) as f32 / 100.0) + .clamp(0.0, 1.0), + shortcut_toggle: map + .get("shortcut_toggle") + .cloned() + .unwrap_or(d.shortcut_toggle), + shortcut_reset: map + .get("shortcut_reset") + .cloned() + .unwrap_or(d.shortcut_reset), + shortcut_skip: map + .get("shortcut_skip") + .cloned() + .unwrap_or(d.shortcut_skip), + shortcut_restart: map + .get("shortcut_restart") + .cloned() + .unwrap_or(d.shortcut_restart), + websocket_enabled: parse_bool(&map, "websocket_enabled", d.websocket_enabled), + websocket_port: parse_u32(&map, "websocket_port", d.websocket_port as u32) as u16, + language: map.get("language").cloned().unwrap_or(d.language), + verbose_logging: parse_bool(&map, "verbose_logging", d.verbose_logging), + }) +} + +/// Upsert a single setting by its DB key. The caller is responsible for +/// converting typed values back to their stored string representation. +pub fn save_setting(conn: &Connection, key: &str, value: &str) -> Result<()> { + conn.execute( + "INSERT INTO settings (key, value) VALUES (?1, ?2) + ON CONFLICT(key) DO UPDATE SET value = excluded.value", + params![key, value], + )?; + Ok(()) +} + +// --------------------------------------------------------------------------- +// Private helpers +// --------------------------------------------------------------------------- + +fn parse_bool(map: &HashMap, key: &str, default: bool) -> bool { + map.get(key).map(|v| v == "true").unwrap_or(default) +} + +fn parse_u32(map: &HashMap, key: &str, default: u32) -> u32 { + map.get(key) + .and_then(|v| v.parse().ok()) + .unwrap_or(default) +} + +// --------------------------------------------------------------------------- +// Tests (DATA-02 acceptance criteria) +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + use crate::db::migrations; + + fn setup() -> Connection { + let conn = Connection::open_in_memory().unwrap(); + migrations::run(&conn).unwrap(); + conn + } + + #[test] + fn defaults_round_trip() { + let conn = setup(); + seed_defaults(&conn).unwrap(); + let s = load(&conn).unwrap(); + + assert_eq!(s.time_work_secs, 25 * 60); + assert_eq!(s.time_short_break_secs, 5 * 60); + assert_eq!(s.time_long_break_secs, 15 * 60); + assert_eq!(s.long_break_interval, 4); + assert!((s.volume - 1.0).abs() < f32::EPSILON); + #[cfg(target_os = "macos")] + { + assert_eq!(s.shortcut_toggle, "Super+Shift+1"); + assert_eq!(s.shortcut_reset, "Super+Shift+2"); + assert_eq!(s.shortcut_skip, "Super+Shift+3"); + assert_eq!(s.shortcut_restart, "Super+Shift+4"); + } + #[cfg(not(target_os = "macos"))] + { + assert_eq!(s.shortcut_toggle, "Control+F1"); + assert_eq!(s.shortcut_reset, "Control+F2"); + assert_eq!(s.shortcut_skip, "Control+F3"); + assert_eq!(s.shortcut_restart, "Control+F4"); + } + assert!(!s.always_on_top); + assert!(!s.websocket_enabled); + assert_eq!(s.websocket_port, 1314); + assert_eq!(s.theme_mode, "auto"); + assert_eq!(s.theme_light, "Pomotroid Light"); + assert_eq!(s.theme_dark, "Pomotroid"); + assert_eq!(s.language, "auto"); + assert!(!s.verbose_logging); + } + + #[test] + fn seed_is_idempotent() { + let conn = setup(); + seed_defaults(&conn).unwrap(); + // Second seed must not overwrite existing values. + save_setting(&conn, "always_on_top", "true").unwrap(); + seed_defaults(&conn).unwrap(); + let s = load(&conn).unwrap(); + assert!(s.always_on_top, "seed_defaults must not overwrite saved value"); + } + + #[test] + fn save_and_reload_bool() { + let conn = setup(); + seed_defaults(&conn).unwrap(); + save_setting(&conn, "always_on_top", "true").unwrap(); + let s = load(&conn).unwrap(); + assert!(s.always_on_top); + } + + #[test] + fn save_and_reload_volume() { + let conn = setup(); + seed_defaults(&conn).unwrap(); + save_setting(&conn, "volume", "50").unwrap(); + let s = load(&conn).unwrap(); + assert!((s.volume - 0.5).abs() < f32::EPSILON); + } + + #[test] + fn save_and_reload_time() { + let conn = setup(); + seed_defaults(&conn).unwrap(); + save_setting(&conn, "time_work_mins", "30").unwrap(); + let s = load(&conn).unwrap(); + assert_eq!(s.time_work_secs, 30 * 60); + } + + #[test] + fn missing_keys_fall_back_to_defaults() { + let conn = setup(); + // No seed — table is empty. + let s = load(&conn).unwrap(); + assert_eq!(s, Settings::default()); + } + + #[test] + fn reset_defaults_restores_all_settings() { + // Mutate several settings (timer-related and others). + let conn = setup(); + seed_defaults(&conn).unwrap(); + save_setting(&conn, "time_work_mins", "45").unwrap(); + save_setting(&conn, "time_short_break_mins", "10").unwrap(); + save_setting(&conn, "work_rounds", "8").unwrap(); + save_setting(&conn, "always_on_top", "true").unwrap(); + + // Simulate the reset_defaults command: wipe all rows then re-seed. + conn.execute("DELETE FROM settings", []).unwrap(); + seed_defaults(&conn).unwrap(); + + let s = load(&conn).unwrap(); + // Timer settings must be restored to defaults. + assert_eq!(s.time_work_secs, 25 * 60, "work duration must reset to 25 min"); + assert_eq!(s.time_short_break_secs, 5 * 60, "short break must reset to 5 min"); + assert_eq!(s.long_break_interval, 4, "work rounds must reset to 4"); + // Non-timer settings are also wiped and reseeded to their defaults. + assert!(!s.always_on_top, "always_on_top must reset to default false"); + } + + #[test] + fn boolean_settings_survive_multiple_writes() { + // Writing the same boolean key repeatedly must not corrupt the value. + let conn = setup(); + seed_defaults(&conn).unwrap(); + + for _ in 0..5 { + save_setting(&conn, "auto_start_work", "true").unwrap(); + } + let s = load(&conn).unwrap(); + assert!(s.auto_start_work, "auto_start_work must remain true after repeated writes"); + + for _ in 0..5 { + save_setting(&conn, "auto_start_work", "false").unwrap(); + } + let s = load(&conn).unwrap(); + assert!(!s.auto_start_work, "auto_start_work must be false after repeated false writes"); + } +} diff --git a/src-tauri/src/shortcuts/mod.rs b/src-tauri/src/shortcuts/mod.rs new file mode 100644 index 0000000..b7f60cb --- /dev/null +++ b/src-tauri/src/shortcuts/mod.rs @@ -0,0 +1,217 @@ +/// Global shortcut registration via tauri-plugin-global-shortcut. +/// +/// Default shortcuts: +/// - toggle: Ctrl+F1 (start/pause/resume) +/// - reset: Ctrl+F2 +/// - skip: Ctrl+F3 +/// +/// All shortcuts are unregistered before re-registering, so calling +/// `register_all` is idempotent. +use tauri::{AppHandle, Manager}; +use tauri_plugin_global_shortcut::{Code, GlobalShortcutExt, Modifiers, Shortcut, ShortcutState}; + +use crate::settings::Settings; +use crate::timer::TimerController; + +// --------------------------------------------------------------------------- +// Parsing +// --------------------------------------------------------------------------- + +/// Parse a shortcut string like "Control+F1" into a `Shortcut`. +/// +/// Supported modifiers (case-insensitive): Control, Shift, Alt, Super/Meta. +/// Supported keys: F1–F12, letter keys, digit keys, named keys. +/// Returns `None` if parsing fails — the caller falls back to the default. +pub fn parse_shortcut(s: &str) -> Option { + let parts: Vec<&str> = s.split('+').map(str::trim).collect(); + if parts.is_empty() { + return None; + } + + let key_str = parts.last()?; + let modifier_strs = &parts[..parts.len() - 1]; + + let mut mods = Modifiers::empty(); + for m in modifier_strs { + match m.to_ascii_lowercase().as_str() { + "control" | "ctrl" => mods |= Modifiers::CONTROL, + "shift" => mods |= Modifiers::SHIFT, + "alt" | "option" => mods |= Modifiers::ALT, + "super" | "meta" | "cmd" | "command" => mods |= Modifiers::SUPER, + _ => return None, // unknown modifier + } + } + + let code = parse_code(key_str)?; + Some(Shortcut::new(Some(mods), code)) +} + +fn parse_code(key: &str) -> Option { + Some(match key.to_ascii_lowercase().as_str() { + "f1" => Code::F1, "f2" => Code::F2, "f3" => Code::F3, + "f4" => Code::F4, "f5" => Code::F5, "f6" => Code::F6, + "f7" => Code::F7, "f8" => Code::F8, "f9" => Code::F9, + "f10" => Code::F10, "f11" => Code::F11, "f12" => Code::F12, + "a" => Code::KeyA, "b" => Code::KeyB, "c" => Code::KeyC, + "d" => Code::KeyD, "e" => Code::KeyE, "f" => Code::KeyF, + "g" => Code::KeyG, "h" => Code::KeyH, "i" => Code::KeyI, + "j" => Code::KeyJ, "k" => Code::KeyK, "l" => Code::KeyL, + "m" => Code::KeyM, "n" => Code::KeyN, "o" => Code::KeyO, + "p" => Code::KeyP, "q" => Code::KeyQ, "r" => Code::KeyR, + "s" => Code::KeyS, "t" => Code::KeyT, "u" => Code::KeyU, + "v" => Code::KeyV, "w" => Code::KeyW, "x" => Code::KeyX, + "y" => Code::KeyY, "z" => Code::KeyZ, + "0" => Code::Digit0, "1" => Code::Digit1, "2" => Code::Digit2, + "3" => Code::Digit3, "4" => Code::Digit4, "5" => Code::Digit5, + "6" => Code::Digit6, "7" => Code::Digit7, "8" => Code::Digit8, + "9" => Code::Digit9, + "space" => Code::Space, + "enter" | "return" => Code::Enter, + "escape" | "esc" => Code::Escape, + "tab" => Code::Tab, + "backspace" => Code::Backspace, + "delete" => Code::Delete, + "arrowup" | "up" => Code::ArrowUp, + "arrowdown" | "down" => Code::ArrowDown, + "arrowleft" | "left" => Code::ArrowLeft, + "arrowright" | "right" => Code::ArrowRight, + _ => return None, + }) +} + +// --------------------------------------------------------------------------- +// Registration +// --------------------------------------------------------------------------- + +/// Unregister all current shortcuts and register the four actions defined +/// in `settings`. Silent on individual parse/register failures. +pub fn register_all(app: &AppHandle, settings: &Settings) { + let gsm = app.global_shortcut(); + + // Unregister everything first to avoid stale bindings. + let _ = gsm.unregister_all(); + + let shortcuts = [ + (settings.shortcut_toggle.as_str(), ShortcutAction::Toggle), + (settings.shortcut_reset.as_str(), ShortcutAction::Reset), + (settings.shortcut_skip.as_str(), ShortcutAction::Skip), + (settings.shortcut_restart.as_str(), ShortcutAction::RestartRound), + ]; + + for (key_str, action) in shortcuts { + let Some(shortcut) = parse_shortcut(key_str) else { + log::warn!("[shortcuts] could not parse shortcut '{key_str}'"); + continue; + }; + + let action_name = action.as_str(); + let app_clone = app.clone(); + if let Err(e) = gsm.on_shortcut(shortcut, move |_app, _shortcut, event| { + // Fire only on key-press. Without this filter the callback fires on + // both press and release, causing Toggle to cancel itself immediately. + if event.state == ShortcutState::Pressed { + fire_action(&app_clone, action); + } + }) { + log::warn!("[shortcuts] failed to register '{key_str}': {e}"); + } else { + log::debug!("[shortcuts] registered '{key_str}' → {action_name}"); + } + } +} + +/// Unregister all global shortcuts (called on app exit or when disabled). +pub fn unregister_all(app: &AppHandle) { + let _ = app.global_shortcut().unregister_all(); +} + +// --------------------------------------------------------------------------- +// Action dispatch +// --------------------------------------------------------------------------- + +#[derive(Clone, Copy)] +enum ShortcutAction { + Toggle, + Reset, + Skip, + RestartRound, +} + +impl ShortcutAction { + fn as_str(self) -> &'static str { + match self { + Self::Toggle => "toggle", + Self::Reset => "reset", + Self::Skip => "skip", + Self::RestartRound => "restart-round", + } + } +} + +fn fire_action(app: &AppHandle, action: ShortcutAction) { + log::info!("[shortcut] fired: {}", action.as_str()); + let Some(timer) = app.try_state::() else { return }; + match action { + ShortcutAction::Toggle => timer.toggle(), + ShortcutAction::Reset => timer.reset(), + ShortcutAction::Skip => timer.skip(), + ShortcutAction::RestartRound => timer.restart_round(), + } +} + +// --------------------------------------------------------------------------- +// IPC command wiring +// --------------------------------------------------------------------------- + +/// Re-register shortcuts from a new configuration. +/// Called by the frontend via `settings_set` when shortcut keys change. +pub fn apply_new_settings(app: &AppHandle, settings: &Settings) { + register_all(app, settings); +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_ctrl_f1() { + let s = parse_shortcut("Control+F1"); + assert!(s.is_some(), "Control+F1 must parse"); + } + + #[test] + fn parse_ctrl_f2() { + assert!(parse_shortcut("Control+F2").is_some()); + } + + #[test] + fn parse_ctrl_f3() { + assert!(parse_shortcut("Control+F3").is_some()); + } + + #[test] + fn parse_ctrl_f4() { + assert!(parse_shortcut("Control+F4").is_some()); + } + + #[test] + fn parse_super_modifier() { + assert!(parse_shortcut("Super+F1").is_some(), "Super modifier must parse"); + } + + #[test] + fn parse_multi_modifier() { + assert!(parse_shortcut("Control+Shift+F5").is_some()); + } + + #[test] + fn parse_invalid_returns_none() { + assert!(parse_shortcut("").is_none()); + assert!(parse_shortcut("NotAModifier+F1").is_none()); + assert!(parse_shortcut("Control+NotAKey").is_none()); + } +} diff --git a/src-tauri/src/themes/mod.rs b/src-tauri/src/themes/mod.rs new file mode 100644 index 0000000..37f29dc --- /dev/null +++ b/src-tauri/src/themes/mod.rs @@ -0,0 +1,187 @@ +pub mod watcher; + +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::path::Path; + +// --------------------------------------------------------------------------- +// Theme type +// --------------------------------------------------------------------------- + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Theme { + pub name: String, + /// CSS custom property values keyed by their full property name (e.g. "--color-background"). + pub colors: HashMap, + /// True for user-created themes in {app_data_dir}/themes/. + #[serde(default)] + pub is_custom: bool, +} + +// --------------------------------------------------------------------------- +// Bundled themes embedded at compile time +// --------------------------------------------------------------------------- + +/// Raw JSON for every built-in theme, embedded into the binary via include_str!. +/// The path is relative to this source file (src-tauri/src/themes/mod.rs). +const BUNDLED_JSON: &[&str] = &[ + include_str!("../../../static/themes/andromeda.json"), + include_str!("../../../static/themes/ayu.json"), + include_str!("../../../static/themes/catppuccin-frappe.json"), + include_str!("../../../static/themes/catppuccin-latte.json"), + include_str!("../../../static/themes/catppuccin-macchiato.json"), + include_str!("../../../static/themes/catppuccin-mocha.json"), + include_str!("../../../static/themes/city-lights.json"), + include_str!("../../../static/themes/cobalt2.json"), + include_str!("../../../static/themes/dracula.json"), + include_str!("../../../static/themes/darcula.json"), + include_str!("../../../static/themes/dva.json"), + include_str!("../../../static/themes/everforest.json"), + include_str!("../../../static/themes/github.json"), + include_str!("../../../static/themes/github-dark.json"), + include_str!("../../../static/themes/graphite.json"), + include_str!("../../../static/themes/gruvbox.json"), + include_str!("../../../static/themes/gruvbox-light.json"), + include_str!("../../../static/themes/horizon.json"), + include_str!("../../../static/themes/kanagawa.json"), + include_str!("../../../static/themes/material-palenight.json"), + include_str!("../../../static/themes/monokai.json"), + include_str!("../../../static/themes/monokai-pro.json"), + include_str!("../../../static/themes/night-owl.json"), + include_str!("../../../static/themes/nord.json"), + include_str!("../../../static/themes/one-dark.json"), + include_str!("../../../static/themes/panda.json"), + include_str!("../../../static/themes/pomotroid.json"), + include_str!("../../../static/themes/pomotroid-light.json"), + include_str!("../../../static/themes/popping-and-locking.json"), + include_str!("../../../static/themes/rose-pine.json"), + include_str!("../../../static/themes/rose-pine-dawn.json"), + include_str!("../../../static/themes/rose-pine-moon.json"), + include_str!("../../../static/themes/solarized-dark.json"), + include_str!("../../../static/themes/solarized-light.json"), + include_str!("../../../static/themes/spandex.json"), + include_str!("../../../static/themes/synthwave.json"), + include_str!("../../../static/themes/tokyo-night.json"), +]; + +/// Parse all bundled theme JSON strings. Panics at startup if any are malformed +/// (a compile-time-like assertion that the shipped assets are valid). +pub fn load_bundled() -> Vec { + BUNDLED_JSON + .iter() + .filter_map(|raw| { + serde_json::from_str::(raw) + .ok() + .and_then(|v| parse_theme_value(v, false)) + }) + .collect() +} + +// --------------------------------------------------------------------------- +// Custom themes — loaded from {app_data_dir}/themes/ at runtime +// --------------------------------------------------------------------------- + +/// Load user-defined themes from the given directory. Non-fatal: bad files are +/// logged and skipped so one corrupt theme cannot prevent the app from starting. +pub fn load_custom(themes_dir: &Path) -> Vec { + let Ok(entries) = std::fs::read_dir(themes_dir) else { + return Vec::new(); + }; + + entries + .filter_map(|entry| { + let path = entry.ok()?.path(); + if path.extension()?.to_str()? != "json" { + return None; + } + let raw = std::fs::read_to_string(&path).ok()?; + let value = serde_json::from_str::(&raw).ok()?; + parse_theme_value(value, true) + }) + .collect() +} + +/// Return all themes: bundled first, then custom. Custom themes with the same +/// name as a bundled theme override the bundled version. +pub fn list_all(app_data_dir: &Path) -> Vec { + let mut themes = load_bundled(); + let custom = load_custom(&app_data_dir.join("themes")); + + for custom_theme in custom { + // Replace built-in with same name, or append. + if let Some(existing) = themes.iter_mut().find(|t| t.name == custom_theme.name) { + *existing = custom_theme; + } else { + themes.push(custom_theme); + } + } + + themes +} + +/// Look up a single theme by name (case-insensitive). +pub fn find(app_data_dir: &Path, name: &str) -> Option { + list_all(app_data_dir) + .into_iter() + .find(|t| t.name.eq_ignore_ascii_case(name)) +} + +// --------------------------------------------------------------------------- +// Parsing helper +// --------------------------------------------------------------------------- + +fn parse_theme_value(v: serde_json::Value, is_custom: bool) -> Option { + let name = v.get("name")?.as_str()?.to_string(); + let colors_obj = v.get("colors")?.as_object()?; + let colors: HashMap = colors_obj + .iter() + .filter_map(|(k, v)| Some((k.clone(), v.as_str()?.to_string()))) + .collect(); + Some(Theme { name, colors, is_custom }) +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn all_bundled_themes_parse() { + let themes = load_bundled(); + assert_eq!(themes.len(), 37, "expected 37 bundled themes"); + } + + #[test] + fn bundled_themes_have_required_color_keys() { + let required = [ + "--color-long-round", + "--color-short-round", + "--color-focus-round", + "--color-background", + "--color-background-light", + "--color-foreground", + "--color-accent", + ]; + for theme in load_bundled() { + for key in &required { + assert!( + theme.colors.contains_key(*key), + "theme '{}' is missing '{key}'", + theme.name + ); + } + } + } + + #[test] + fn pomotroid_theme_is_bundled() { + let themes = load_bundled(); + assert!( + themes.iter().any(|t| t.name == "Pomotroid"), + "Pomotroid theme must be bundled" + ); + } +} diff --git a/src-tauri/src/themes/watcher.rs b/src-tauri/src/themes/watcher.rs new file mode 100644 index 0000000..b431c77 --- /dev/null +++ b/src-tauri/src/themes/watcher.rs @@ -0,0 +1,112 @@ +/// Directory watcher for `{app_data_dir}/themes/` using the `notify` crate. +/// +/// Debounces filesystem events by 500 ms to avoid multiple reloads when a +/// text editor writes a file in multiple stages. +/// +/// On a debounced event: +/// 1. Re-scans the custom themes directory. +/// 2. Re-builds the merged `Vec` (bundled + custom). +/// 3. Emits `themes:changed` with the new list to all frontend windows. +use std::path::{Path, PathBuf}; +use std::sync::mpsc; +use std::time::Duration; + +use notify::{Event, RecommendedWatcher, RecursiveMode, Watcher}; +use tauri::{AppHandle, Emitter}; + +use super::{list_all, Theme}; + +// --------------------------------------------------------------------------- +// Public API +// --------------------------------------------------------------------------- + +/// Spawn a background thread that watches `themes_dir` for changes and emits +/// `themes:changed` on the `app` handle whenever the custom theme list changes. +/// +/// Returns the `RecommendedWatcher` — drop it to stop watching. +/// The watcher must outlive the app; store it in Tauri managed state or a +/// `static` to prevent it from being dropped early. +pub fn spawn_watcher( + app_data_dir: PathBuf, + app: AppHandle, +) -> Option { + let themes_dir = app_data_dir.join("themes"); + + // Ensure the custom themes directory exists. + if let Err(e) = std::fs::create_dir_all(&themes_dir) { + log::warn!("[themes/watcher] failed to create themes dir: {e}"); + return None; + } + + let (tx, rx) = mpsc::channel::>(); + + let mut watcher = match RecommendedWatcher::new(tx, notify::Config::default()) { + Ok(w) => w, + Err(e) => { + log::warn!("[themes/watcher] failed to create watcher: {e}"); + return None; + } + }; + + if let Err(e) = watcher.watch(&themes_dir, RecursiveMode::NonRecursive) { + log::warn!("[themes/watcher] failed to watch {}: {e}", themes_dir.display()); + return None; + } + + // Debounce thread. + std::thread::Builder::new() + .name("themes-watcher".to_string()) + .spawn(move || debounce_loop(rx, &app_data_dir, &app)) + .ok(); + + Some(watcher) +} + +// --------------------------------------------------------------------------- +// Debounce loop (runs on the themes-watcher thread) +// --------------------------------------------------------------------------- + +const DEBOUNCE: Duration = Duration::from_millis(500); + +fn debounce_loop( + rx: mpsc::Receiver>, + app_data_dir: &Path, + app: &AppHandle, +) { + while let Ok(first) = rx.recv() { + // Log and ignore watcher errors. + if let Err(e) = first { + log::warn!("[themes/watcher] watch error: {e}"); + continue; + } + + // Drain additional events that arrive within the debounce window. + drain_within(&rx, DEBOUNCE); + + // Reload and emit. + reload_and_emit(app_data_dir, app); + } +} + +/// Consume all events from `rx` that arrive within `window` ms of the first. +fn drain_within(rx: &mpsc::Receiver>, window: Duration) { + let deadline = std::time::Instant::now() + window; + loop { + let remaining = deadline.saturating_duration_since(std::time::Instant::now()); + if remaining.is_zero() { + break; + } + match rx.recv_timeout(remaining) { + Ok(_) => continue, // keep draining + Err(_) => break, // timeout or channel closed + } + } +} + +/// Re-scan themes directory and emit `themes:changed` with the updated list. +fn reload_and_emit(app_data_dir: &Path, app: &AppHandle) { + let themes: Vec = list_all(app_data_dir); + if let Err(e) = app.emit("themes:changed", &themes) { + log::warn!("[themes/watcher] emit error: {e}"); + } +} diff --git a/src-tauri/src/timer/engine.rs b/src-tauri/src/timer/engine.rs new file mode 100644 index 0000000..0b1929b --- /dev/null +++ b/src-tauri/src/timer/engine.rs @@ -0,0 +1,515 @@ +/// Drift-correcting timer engine running on a dedicated OS thread. +/// +/// Uses `std::time::Instant` (monotonic clock) and `recv_timeout` to +/// schedule ticks against a fixed timeline rather than sleeping for a +/// constant 1 s. This eliminates cumulative drift from wakeup latency. +/// +/// Sleep/wake behaviour (OQ-1): on `Suspend` the engine saves `elapsed_secs` +/// and blocks; on `WakeResume` it restarts from that position without advancing. +use std::sync::mpsc::{self, Receiver, RecvTimeoutError, Sender}; +use std::time::{Duration, Instant}; + +// --------------------------------------------------------------------------- +// Public types +// --------------------------------------------------------------------------- + +#[derive(Debug, Clone)] +pub enum TimerCommand { + Start, + Pause, + Resume, + Reset, + /// Immediately fires a `Complete` event (user-initiated skip). + Skip, + /// Change the total duration; moves engine to Idle so caller must Start. + Reconfigure { duration_secs: u32 }, + /// OS sleep detected: freeze elapsed position, block until WakeResume. + Suspend, + /// OS wake detected: resume from the saved elapsed position. + WakeResume, + Shutdown, +} + +#[derive(Debug, Clone)] +pub enum TimerEvent { + Tick { elapsed_secs: u32, total_secs: u32 }, + Complete { skipped: bool }, + Paused { elapsed_secs: u32 }, + Resumed { elapsed_secs: u32 }, + Reset, + Suspended { elapsed_secs: u32 }, +} + +/// Cheap-to-clone handle for sending commands to the engine thread. +#[derive(Clone)] +pub struct EngineHandle { + pub cmd_tx: Sender, +} + +impl EngineHandle { + pub fn send(&self, cmd: TimerCommand) { + // Ignore send errors: the thread may have exited on Shutdown. + let _ = self.cmd_tx.send(cmd); + } +} + +/// Spawn the timer engine thread. +/// +/// `tick_interval` is 1 second in production; tests pass a shorter value +/// (e.g. 20 ms) to keep test execution fast. +pub fn spawn(duration_secs: u32, tick_interval: Duration) -> (EngineHandle, Receiver) { + let (cmd_tx, cmd_rx) = mpsc::channel::(); + let (event_tx, event_rx) = mpsc::channel::(); + + std::thread::Builder::new() + .name("timer-engine".to_string()) + .spawn(move || run_loop(duration_secs, event_tx, cmd_rx, tick_interval)) + .expect("failed to spawn timer engine thread"); + + (EngineHandle { cmd_tx }, event_rx) +} + +// --------------------------------------------------------------------------- +// Internal state machine +// --------------------------------------------------------------------------- + +struct RunningSegment { + /// When this run segment started (used for drift-correction). + start: Instant, + /// `elapsed_secs` at the moment this segment began (0 on Start, N on Resume). + elapsed_at_start: u32, + /// Ticks fired within this segment. + ticks: u32, +} + +enum Phase { + Idle, + Running(RunningSegment), + Paused, + Suspended, +} + +enum Transition { + Stay, + To(Phase), + Break, +} + +fn run_loop( + duration_secs: u32, + event_tx: Sender, + cmd_rx: Receiver, + tick_interval: Duration, +) { + let mut total_secs = duration_secs; + let mut elapsed_secs: u32 = 0; + let mut phase = Phase::Idle; + + 'engine: loop { + let tr = match &mut phase { + // ----------------------------------------------------------------- + Phase::Idle => match cmd_rx.recv() { + Ok(TimerCommand::Start) => { + elapsed_secs = 0; + Transition::To(Phase::Running(RunningSegment { + start: Instant::now(), + elapsed_at_start: 0, + ticks: 0, + })) + } + Ok(TimerCommand::Reconfigure { duration_secs: d }) => { + total_secs = d; + Transition::Stay + } + // Reset while Idle: emit the event so the listener can update + // the frontend and send a follow-up Reconfigure. Without this + // handler the command would be silently swallowed, leaving the + // listener blocked in recv() and the UI stale. + Ok(TimerCommand::Reset) => { + elapsed_secs = 0; + let _ = event_tx.send(TimerEvent::Reset); + Transition::Stay + } + // Skip while Idle: advance to the next round without starting. + Ok(TimerCommand::Skip) => { + let _ = event_tx.send(TimerEvent::Complete { skipped: true }); + Transition::Stay + } + Ok(TimerCommand::Shutdown) | Err(_) => Transition::Break, + _ => Transition::Stay, + }, + + // ----------------------------------------------------------------- + Phase::Paused | Phase::Suspended => match cmd_rx.recv() { + Ok(TimerCommand::Resume | TimerCommand::WakeResume) => { + let _ = event_tx.send(TimerEvent::Resumed { elapsed_secs }); + Transition::To(Phase::Running(RunningSegment { + start: Instant::now(), + elapsed_at_start: elapsed_secs, + ticks: 0, + })) + } + Ok(TimerCommand::Reset) => { + elapsed_secs = 0; + let _ = event_tx.send(TimerEvent::Reset); + Transition::To(Phase::Idle) + } + Ok(TimerCommand::Skip) => { + elapsed_secs = 0; + let _ = event_tx.send(TimerEvent::Complete { skipped: true }); + Transition::To(Phase::Idle) + } + Ok(TimerCommand::Reconfigure { duration_secs: d }) => { + total_secs = d; + elapsed_secs = 0; + Transition::To(Phase::Idle) + } + Ok(TimerCommand::Shutdown) | Err(_) => Transition::Break, + _ => Transition::Stay, + }, + + // ----------------------------------------------------------------- + Phase::Running(seg) => { + // Drift-correcting sleep: target the absolute instant of the + // next scheduled tick rather than sleeping for a fixed period. + let next_tick = seg.start + tick_interval * (seg.ticks + 1); + let wait = next_tick.saturating_duration_since(Instant::now()); + + match cmd_rx.recv_timeout(wait) { + // --- tick fired --- + Err(RecvTimeoutError::Timeout) => { + seg.ticks += 1; + elapsed_secs = seg.elapsed_at_start + seg.ticks; + let _ = event_tx.send(TimerEvent::Tick { elapsed_secs, total_secs }); + + if elapsed_secs >= total_secs { + let _ = event_tx.send(TimerEvent::Complete { skipped: false }); + elapsed_secs = 0; + Transition::To(Phase::Idle) + } else { + Transition::Stay + } + } + Err(RecvTimeoutError::Disconnected) => Transition::Break, + + // --- commands --- + Ok(TimerCommand::Pause) => { + let _ = event_tx.send(TimerEvent::Paused { elapsed_secs }); + Transition::To(Phase::Paused) + } + Ok(TimerCommand::Suspend) => { + let _ = event_tx.send(TimerEvent::Suspended { elapsed_secs }); + Transition::To(Phase::Suspended) + } + Ok(TimerCommand::Skip) => { + elapsed_secs = 0; + let _ = event_tx.send(TimerEvent::Complete { skipped: true }); + Transition::To(Phase::Idle) + } + Ok(TimerCommand::Reset) => { + elapsed_secs = 0; + let _ = event_tx.send(TimerEvent::Reset); + Transition::To(Phase::Idle) + } + Ok(TimerCommand::Reconfigure { duration_secs: d }) => { + total_secs = d; + elapsed_secs = 0; + Transition::To(Phase::Idle) + } + Ok(TimerCommand::Shutdown) => Transition::Break, + _ => Transition::Stay, + } + } + }; + + match tr { + Transition::Stay => {} + Transition::To(new_phase) => phase = new_phase, + Transition::Break => break 'engine, + } + } +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + use std::time::Duration; + + /// Short tick used by all tests so the suite runs in < 1 s total. + const TICK: Duration = Duration::from_millis(20); + + fn drain(rx: &Receiver) -> Vec { + let mut events = Vec::new(); + while let Ok(e) = rx.recv_timeout(Duration::from_millis(5)) { + events.push(e); + } + events + } + + fn collect_until_complete(rx: &Receiver, timeout: Duration) -> Vec { + let deadline = Instant::now() + timeout; + let mut events = Vec::new(); + loop { + let remaining = deadline.saturating_duration_since(Instant::now()); + if remaining.is_zero() { + break; + } + match rx.recv_timeout(remaining) { + Ok(e) => { + let done = matches!(e, TimerEvent::Complete { .. }); + events.push(e); + if done { + break; + } + } + Err(_) => break, + } + } + events + } + + #[test] + fn fires_correct_number_of_ticks_and_completes() { + let (handle, rx) = spawn(5, TICK); + handle.send(TimerCommand::Start); + + let events = collect_until_complete(&rx, Duration::from_secs(2)); + + let ticks: Vec<_> = events + .iter() + .filter(|e| matches!(e, TimerEvent::Tick { .. })) + .collect(); + assert_eq!(ticks.len(), 5, "expected 5 ticks, got {}", ticks.len()); + assert!( + matches!(events.last(), Some(TimerEvent::Complete { .. })), + "last event must be Complete" + ); + } + + #[test] + fn elapsed_secs_increments_monotonically() { + let (handle, rx) = spawn(4, TICK); + handle.send(TimerCommand::Start); + + let events = collect_until_complete(&rx, Duration::from_secs(2)); + let mut last_elapsed = 0; + for e in &events { + if let TimerEvent::Tick { elapsed_secs, .. } = e { + assert!(*elapsed_secs > last_elapsed); + last_elapsed = *elapsed_secs; + } + } + } + + #[test] + fn pause_stops_ticks_and_resume_continues() { + let (handle, rx) = spawn(6, TICK); + handle.send(TimerCommand::Start); + + // Let 2 ticks fire, then pause. + std::thread::sleep(TICK * 2 + TICK / 2); + handle.send(TimerCommand::Pause); + + // Collect events so far. + std::thread::sleep(TICK * 3); // no ticks should arrive during this gap + let events_before_resume = drain(&rx); + + let paused = events_before_resume + .iter() + .filter(|e| matches!(e, TimerEvent::Paused { .. })) + .count(); + let ticks_before_pause = events_before_resume + .iter() + .filter(|e| matches!(e, TimerEvent::Tick { .. })) + .count(); + assert_eq!(paused, 1, "expected 1 Paused event"); + assert!(ticks_before_pause >= 2, "should have at least 2 ticks before pause"); + + // Resume and let the rest complete. + handle.send(TimerCommand::Resume); + let events_after = collect_until_complete(&rx, Duration::from_secs(2)); + + assert!( + events_after + .iter() + .any(|e| matches!(e, TimerEvent::Resumed { .. })), + "expected Resumed event" + ); + assert!( + events_after + .iter() + .any(|e| matches!(e, TimerEvent::Complete { .. })), + "expected Complete after resume" + ); + } + + #[test] + fn reset_returns_to_zero_and_fires_reset_event() { + let (handle, rx) = spawn(10, TICK); + handle.send(TimerCommand::Start); + std::thread::sleep(TICK * 2 + TICK / 2); + handle.send(TimerCommand::Reset); + + let events = drain(&rx); + assert!( + events.iter().any(|e| matches!(e, TimerEvent::Reset)), + "expected Reset event" + ); + // No Complete should have fired. + assert!( + !events.iter().any(|e| matches!(e, TimerEvent::Complete { .. })), + "Complete must not fire on Reset" + ); + } + + #[test] + fn skip_fires_complete_immediately() { + let (handle, rx) = spawn(30, TICK); + handle.send(TimerCommand::Start); + std::thread::sleep(TICK / 2); + handle.send(TimerCommand::Skip); + + let events = collect_until_complete(&rx, Duration::from_millis(500)); + assert!( + events.iter().any(|e| matches!(e, TimerEvent::Complete { .. })), + "Skip must trigger Complete" + ); + // Should have completed well before 30 ticks elapsed. + let ticks = events + .iter() + .filter(|e| matches!(e, TimerEvent::Tick { .. })) + .count(); + assert!(ticks < 5, "Skip should complete before many ticks fire"); + } + + #[test] + fn suspend_and_wake_resume_preserves_position() { + let (handle, rx) = spawn(10, TICK); + handle.send(TimerCommand::Start); + + // Let 3 ticks fire, then suspend. + std::thread::sleep(TICK * 3 + TICK / 2); + handle.send(TimerCommand::Suspend); + + let before = drain(&rx); + let suspended_elapsed = before.iter().find_map(|e| { + if let TimerEvent::Suspended { elapsed_secs } = e { + Some(*elapsed_secs) + } else { + None + } + }); + assert!( + suspended_elapsed.is_some(), + "expected Suspended event with elapsed_secs" + ); + let saved = suspended_elapsed.unwrap(); + assert!(saved >= 3, "elapsed at suspend should be >= 3 s, got {saved}"); + + // Gap: simulate OS sleep (no ticks must fire). + std::thread::sleep(TICK * 5); + let during_suspend = drain(&rx); + assert!( + !during_suspend.iter().any(|e| matches!(e, TimerEvent::Tick { .. })), + "no ticks must fire while suspended" + ); + + // Wake and verify the timer continues from the saved position. + handle.send(TimerCommand::WakeResume); + let after = collect_until_complete(&rx, Duration::from_secs(2)); + + let resumed = after.iter().find_map(|e| { + if let TimerEvent::Resumed { elapsed_secs } = e { + Some(*elapsed_secs) + } else { + None + } + }); + assert_eq!( + resumed, + Some(saved), + "Resumed event must carry the same elapsed_secs as Suspended" + ); + assert!( + after.iter().any(|e| matches!(e, TimerEvent::Complete { .. })), + "timer must complete after WakeResume" + ); + } + + #[test] + fn shutdown_terminates_thread_cleanly() { + let (handle, _rx) = spawn(60, TICK); + handle.send(TimerCommand::Start); + std::thread::sleep(TICK); + // Shutdown must not deadlock or panic. + handle.send(TimerCommand::Shutdown); + // Give the thread time to exit gracefully. + std::thread::sleep(Duration::from_millis(50)); + } + + #[test] + fn reset_while_idle_emits_reset_event() { + // Before this fix Reset was silently dropped in Phase::Idle, leaving + // the event listener blocked and the frontend stale. + let (handle, rx) = spawn(5, TICK); + // Do NOT start — engine begins in Idle. + handle.send(TimerCommand::Reset); + + let events = drain(&rx); + assert!( + events.iter().any(|e| matches!(e, TimerEvent::Reset)), + "Reset while Idle must emit a Reset event" + ); + } + + #[test] + fn reconfigure_changes_duration_in_idle() { + // Spawn with duration=10, then Reconfigure to 3 before Start. + // The engine must use the new duration when Started. + let (handle, rx) = spawn(10, TICK); + handle.send(TimerCommand::Reconfigure { duration_secs: 3 }); + handle.send(TimerCommand::Start); + + let events = collect_until_complete(&rx, Duration::from_secs(2)); + let ticks = events + .iter() + .filter(|e| matches!(e, TimerEvent::Tick { .. })) + .count(); + assert_eq!(ticks, 3, "Reconfigure to 3s should yield 3 ticks, got {ticks}"); + assert!( + matches!(events.last(), Some(TimerEvent::Complete { .. })), + "last event must be Complete after reconfigured timer" + ); + } + + #[test] + fn drift_complete_within_tolerance() { + // 5 ticks at TICK (20 ms) = nominal 100 ms. + // Allow generous ±100 ms for CI scheduling jitter while still + // catching runaway drift (e.g. the engine sleeping for 1 s instead of 20 ms). + let (handle, rx) = spawn(5, TICK); + let t0 = Instant::now(); + handle.send(TimerCommand::Start); + + let events = collect_until_complete(&rx, Duration::from_millis(600)); + let wall = t0.elapsed(); + + assert!( + matches!(events.last(), Some(TimerEvent::Complete { .. })), + "timer must complete" + ); + let nominal = TICK * 5; // 100 ms + assert!( + wall >= nominal / 2, + "completed suspiciously fast ({wall:?}); possible clock issue" + ); + assert!( + wall <= nominal + Duration::from_millis(200), + "drift exceeded tolerance: {wall:?} for nominal {nominal:?}" + ); + } +} diff --git a/src-tauri/src/timer/mod.rs b/src-tauri/src/timer/mod.rs new file mode 100644 index 0000000..3c2168a --- /dev/null +++ b/src-tauri/src/timer/mod.rs @@ -0,0 +1,484 @@ +pub mod engine; +pub mod sequence; + +use std::sync::{Arc, Mutex}; +use std::time::Duration; + +use serde::Serialize; +use tauri::{AppHandle, Emitter, Manager}; + +use crate::audio::{AudioCue, AudioManager}; +use crate::db::{queries, DbState}; +use crate::settings::Settings; +use crate::tray::{self, TrayState}; +use crate::websocket::{self, WsState}; + +use engine::{EngineHandle, TimerCommand, TimerEvent}; +use sequence::{RoundType, SequenceState}; + +// --------------------------------------------------------------------------- +// Snapshot — serialized to JSON for the frontend +// --------------------------------------------------------------------------- + +/// Full timer state snapshot. Sent as the payload of Tauri events and +/// returned by the `timer_get_state` IPC command. +#[derive(Debug, Clone, Serialize)] +pub struct TimerSnapshot { + /// "work" | "short-break" | "long-break" + pub round_type: String, + pub elapsed_secs: u32, + pub total_secs: u32, + pub is_running: bool, + /// True if the timer has been started and then paused (elapsed > 0, not running). + pub is_paused: bool, + pub work_round_number: u32, + pub work_rounds_total: u32, +} + +// --------------------------------------------------------------------------- +// Shared mutable state between the controller and the event-listener thread +// --------------------------------------------------------------------------- + +struct TimerShared { + elapsed_secs: u32, + is_running: bool, +} + +// --------------------------------------------------------------------------- +// TimerController — public API registered as Tauri state +// --------------------------------------------------------------------------- + +pub struct TimerController { + engine: EngineHandle, + sequence: Arc>, + settings: Arc>, + shared: Arc>, + /// Kept alive so TrayState is not dropped if lib.rs forgets its copy. + #[allow(dead_code)] + tray: Arc, +} + +impl TimerController { + /// Construct and start the background threads. + /// Call once from `lib.rs` during Tauri `setup`. + pub fn new( + app: AppHandle, + settings: Settings, + tray: Arc, + db: DbState, + ) -> Self { + let seq = SequenceState::new(settings.long_break_interval); + let duration = seq.current_duration_secs(&settings); + + let (engine, event_rx) = engine::spawn(duration, Duration::from_secs(1)); + + let sequence = Arc::new(Mutex::new(seq)); + let settings_arc = Arc::new(Mutex::new(settings)); + let shared = Arc::new(Mutex::new(TimerShared { + elapsed_secs: 0, + is_running: false, + })); + + // Clone handles for the event-listener thread. + let seq_thread = Arc::clone(&sequence); + let settings_thread = Arc::clone(&settings_arc); + let shared_thread = Arc::clone(&shared); + let engine_thread = engine.clone(); + let tray_thread = Arc::clone(&tray); + + std::thread::Builder::new() + .name("timer-events".to_string()) + .spawn(move || { + listen_events( + app, + event_rx, + ListenContext { + sequence: seq_thread, + settings: settings_thread, + shared: shared_thread, + engine: engine_thread, + tray: tray_thread, + db, + }, + ); + }) + .expect("failed to spawn timer event listener"); + + Self { + engine, + sequence, + settings: settings_arc, + shared, + tray, + } + } + + // --- Commands --- + + /// Toggle: start a fresh timer if idle, resume if paused, pause if running. + pub fn toggle(&self) { + let s = self.shared.lock().unwrap(); + if s.is_running { + log::info!("[timer] pause"); + self.engine.send(TimerCommand::Pause); + } else if s.elapsed_secs > 0 { + log::info!("[timer] resume"); + self.engine.send(TimerCommand::Resume); + } else { + log::info!("[timer] start"); + self.engine.send(TimerCommand::Start); + } + } + + pub fn reset(&self) { + log::info!("[timer] reset"); + self.sequence.lock().unwrap().reset(); + // Send only Reset — the event listener's Reset handler will follow up + // with Reconfigure once the engine is confirmed Idle. Sending + // Reconfigure here first would push the engine into Idle before Reset + // arrives, causing Reset to be silently dropped and the UI to freeze. + self.engine.send(TimerCommand::Reset); + } + + /// Restart only the current round's timer without touching the sequence. + /// Round type, round number, and position in the work/break cycle are all + /// preserved — only the elapsed time is zeroed. + pub fn restart_round(&self) { + log::info!("[timer] restart round"); + self.engine.send(TimerCommand::Reset); + } + + pub fn skip(&self) { + log::info!("[timer] skip"); + self.engine.send(TimerCommand::Skip); + } + + pub fn suspend(&self) { + self.engine.send(TimerCommand::Suspend); + } + + pub fn wake_resume(&self) { + self.engine.send(TimerCommand::WakeResume); + } + + /// Update the duration for the current round when settings change. + /// Only takes effect after the next Start/Resume (current countdown is not interrupted). + pub fn reconfigure(&self) { + let duration = { + let seq = self.sequence.lock().unwrap(); + let settings = self.settings.lock().unwrap(); + seq.current_duration_secs(&settings) + }; + self.engine.send(TimerCommand::Reconfigure { duration_secs: duration }); + } + + // --- Query --- + + pub fn get_snapshot(&self) -> TimerSnapshot { + let seq = self.sequence.lock().unwrap(); + let settings = self.settings.lock().unwrap(); + let shared = self.shared.lock().unwrap(); + + TimerSnapshot { + round_type: seq.current_round.as_str().to_string(), + elapsed_secs: shared.elapsed_secs, + total_secs: seq.current_duration_secs(&settings), + is_running: shared.is_running, + is_paused: !shared.is_running && shared.elapsed_secs > 0, + work_round_number: seq.work_round_number, + work_rounds_total: seq.work_rounds_total, + } + } + + /// Apply new settings values. Updates the in-memory copy and, if the + /// timer is idle (not running and no elapsed progress), reconfigures the + /// engine so the next Start uses the new duration. + /// + /// When the timer is running or paused, the current countdown is left + /// untouched; the new duration takes effect at the start of the next + /// round or after a manual reset. Sending Reconfigure to a running + /// engine transitions it to Idle, which would freeze the timer. + pub fn apply_settings(&self, new: Settings) { + // Sync work_rounds_total so the round counter and advance() logic both + // reflect the new long_break_interval immediately. + self.sequence.lock().unwrap().work_rounds_total = new.long_break_interval; + *self.settings.lock().unwrap() = new; + let s = self.shared.lock().unwrap(); + let is_idle = !s.is_running && s.elapsed_secs == 0; + drop(s); + if is_idle { + self.reconfigure(); + } + } +} + +// --------------------------------------------------------------------------- +// Background event listener thread +// --------------------------------------------------------------------------- + +struct ListenContext { + sequence: Arc>, + settings: Arc>, + shared: Arc>, + engine: EngineHandle, + tray: Arc, + db: DbState, +} + +fn listen_events( + app: AppHandle, + event_rx: std::sync::mpsc::Receiver, + ctx: ListenContext, +) { + let ListenContext { sequence, settings, shared, engine, tray, db } = ctx; + // Track last tray progress to throttle redraws to ≥ 1% delta. + let mut last_tray_progress: f32 = -1.0; + // Active session row ID for recording (None = not started yet). + let mut current_session_id: Option = None; + + while let Ok(event) = event_rx.recv() { + match event { + TimerEvent::Tick { elapsed_secs, total_secs } => { + { + let mut s = shared.lock().unwrap(); + s.elapsed_secs = elapsed_secs; + s.is_running = true; + } + let _ = app.emit( + "timer:tick", + serde_json::json!({ "elapsed_secs": elapsed_secs, "total_secs": total_secs }), + ); + + // --- Session recording: start on first tick of a new round --- + if elapsed_secs == 1 && current_session_id.is_none() { + let rt = sequence.lock().unwrap().current_round.as_str().to_string(); + let total = { + let seq = sequence.lock().unwrap(); + let s = settings.lock().unwrap(); + seq.current_duration_secs(&s) + }; + if let Ok(conn) = db.lock() { + match queries::insert_session(&conn, &rt, total) { + Ok(id) => current_session_id = Some(id), + Err(e) => log::error!("[timer] failed to record session: {e}"), + } + } + } + + // --- Tick sound --- + let rt = sequence.lock().unwrap().current_round.as_str().to_string(); + if let Some(audio) = app.try_state::>() { + if audio.tick_enabled_for(&rt) { + audio.play_cue(AudioCue::Tick); + } + } + + // Update tray arc — throttle to 1% visual change. + let progress = if total_secs > 0 { + elapsed_secs as f32 / total_secs as f32 + } else { + 0.0 + }; + if (progress - last_tray_progress).abs() >= 0.01 { + tray::update_icon(&tray, &rt, false, progress); + last_tray_progress = progress; + } + } + + TimerEvent::Complete { skipped: was_skipped } => { + let completed_round = sequence.lock().unwrap().current_round.as_str().to_string(); + log::info!( + "[timer] round complete type={completed_round} skipped={was_skipped}" + ); + + // --- Session recording: mark the completed round --- + if let Some(session_id) = current_session_id.take() { + if let Ok(conn) = db.lock() { + let _ = queries::complete_session(&conn, session_id, !was_skipped); + } + } + + // Advance sequence. + let (next_round, next_duration, auto_start_work, auto_start_break) = { + let mut seq = sequence.lock().unwrap(); + let s = settings.lock().unwrap(); + let (rt, dur) = seq.advance(&s); + (rt, dur, s.auto_start_work, s.auto_start_break) + }; + + // Reset shared state for the new round. + { + let mut s = shared.lock().unwrap(); + s.elapsed_secs = 0; + s.is_running = false; + } + + // Prepare the engine for the next round. + engine.send(TimerCommand::Reconfigure { + duration_secs: next_duration, + }); + + // Emit round-change with the new snapshot. + let snapshot = build_snapshot(&sequence, &settings, &shared); + let _ = app.emit("timer:round-change", snapshot); + + // Desktop notifications are dispatched by the frontend via the + // notification_show command after receiving the timer:round-change + // event, so translated strings can be used. + + // Audio alert for the new round. + if let Some(audio) = app.try_state::>() { + let cue = match next_round { + RoundType::Work => AudioCue::WorkAlert, + RoundType::ShortBreak => AudioCue::ShortBreakAlert, + RoundType::LongBreak => AudioCue::LongBreakAlert, + }; + audio.play_cue(cue); + } + + // Lower-priority-during-breaks: when always_on_top is on and + // break_always_on_top is enabled, disable always-on-top for + // breaks and restore it when work resumes. + let (always_on_top, break_always_on_top) = { + let s = settings.lock().unwrap(); + (s.always_on_top, s.break_always_on_top) + }; + if always_on_top { + if let Some(window) = app.get_webview_window("main") { + let is_break = next_round != RoundType::Work; + let _ = window.set_always_on_top(!(break_always_on_top && is_break)); + } + } + + // Update tray to reflect new round type and reset progress. + // Use -1.0 (same as initialisation and Reset) so the very + // first tick of the new round always passes the ≥1% threshold, + // regardless of how long the round is. Using 0.0 here caused + // a ≥15-second blank period before the arc started animating. + let rt = sequence.lock().unwrap().current_round.as_str().to_string(); + tray::update_icon(&tray, &rt, false, 0.0); + last_tray_progress = -1.0; + + // Broadcast round-change to any connected WebSocket clients. + if let Some(ws) = app.try_state::>() { + let snap = build_snapshot(&sequence, &settings, &shared); + websocket::broadcast_round_change(&ws, snap); + } + + // Auto-start if configured. + let should_auto = match next_round { + RoundType::Work => auto_start_work, + _ => auto_start_break, + }; + if should_auto { + log::debug!("[timer] auto-starting {}", next_round.as_str()); + engine.send(TimerCommand::Start); + } + } + + TimerEvent::Paused { elapsed_secs } => { + log::info!("[timer] paused elapsed={elapsed_secs}s"); + shared.lock().unwrap().is_running = false; + let _ = app.emit("timer:paused", serde_json::json!({ "elapsed_secs": elapsed_secs })); + + // Show pause bars in tray. + let rt = sequence.lock().unwrap().current_round.as_str().to_string(); + let total = { + let seq = sequence.lock().unwrap(); + let s = settings.lock().unwrap(); + seq.current_duration_secs(&s) + }; + let progress = if total > 0 { elapsed_secs as f32 / total as f32 } else { 0.0 }; + tray::update_icon(&tray, &rt, true, progress); + } + + TimerEvent::Resumed { elapsed_secs } => { + log::info!("[timer] resumed elapsed={elapsed_secs}s"); + shared.lock().unwrap().is_running = true; + let _ = app.emit("timer:resumed", serde_json::json!({ "elapsed_secs": elapsed_secs })); + + // Restore arc in tray. + let rt = sequence.lock().unwrap().current_round.as_str().to_string(); + let total = { + let seq = sequence.lock().unwrap(); + let s = settings.lock().unwrap(); + seq.current_duration_secs(&s) + }; + let progress = if total > 0 { elapsed_secs as f32 / total as f32 } else { 0.0 }; + tray::update_icon(&tray, &rt, false, progress); + last_tray_progress = progress; + } + + TimerEvent::Reset => { + log::debug!("[timer] idle"); + // Abandon the active session (leave DB row as-is). + current_session_id = None; + + { + let mut s = shared.lock().unwrap(); + s.elapsed_secs = 0; + s.is_running = false; + } + let snapshot = build_snapshot(&sequence, &settings, &shared); + let _ = app.emit("timer:reset", snapshot); + + // Reconfigure the engine with the current round's duration so + // the next Start uses the correct (possibly settings-updated) + // total. This is safe here because the engine is guaranteed + // to be in Idle when it emits Reset (all three phases — + // Running, Paused, and now Idle — transition to/stay Idle + // before sending the event). + let duration = { + let seq = sequence.lock().unwrap(); + let s = settings.lock().unwrap(); + seq.current_duration_secs(&s) + }; + engine.send(TimerCommand::Reconfigure { duration_secs: duration }); + + // Reset tray to idle (empty arc). + let rt = sequence.lock().unwrap().current_round.as_str().to_string(); + tray::update_icon(&tray, &rt, false, 0.0); + last_tray_progress = -1.0; + } + + TimerEvent::Suspended { elapsed_secs } => { + log::info!("[timer] suspended by system elapsed={elapsed_secs}s"); + shared.lock().unwrap().is_running = false; + let _ = app.emit( + "timer:suspended", + serde_json::json!({ "elapsed_secs": elapsed_secs }), + ); + + // Show pause bars while suspended. + let rt = sequence.lock().unwrap().current_round.as_str().to_string(); + let total = { + let seq = sequence.lock().unwrap(); + let s = settings.lock().unwrap(); + seq.current_duration_secs(&s) + }; + let progress = if total > 0 { elapsed_secs as f32 / total as f32 } else { 0.0 }; + tray::update_icon(&tray, &rt, true, progress); + } + } + } +} + +fn build_snapshot( + sequence: &Arc>, + settings: &Arc>, + shared: &Arc>, +) -> TimerSnapshot { + let seq = sequence.lock().unwrap(); + let s = settings.lock().unwrap(); + let sh = shared.lock().unwrap(); + + TimerSnapshot { + round_type: seq.current_round.as_str().to_string(), + elapsed_secs: sh.elapsed_secs, + total_secs: seq.current_duration_secs(&s), + is_running: sh.is_running, + is_paused: !sh.is_running && sh.elapsed_secs > 0, + work_round_number: seq.work_round_number, + work_rounds_total: seq.work_rounds_total, + } +} diff --git a/src-tauri/src/timer/sequence.rs b/src-tauri/src/timer/sequence.rs new file mode 100644 index 0000000..9412ccd --- /dev/null +++ b/src-tauri/src/timer/sequence.rs @@ -0,0 +1,299 @@ +/// Pomodoro round sequencing: work → short-break → work → … → long-break → work (cycle). +/// +/// Mirrors the original app's behaviour: +/// - After each completed work round, check if `work_round_number >= work_rounds_total`. +/// If yes → long break; otherwise → short break. +/// - After short break → advance work_round_number, next round is Work. +/// - After long break → reset work_round_number to 1, next round is Work. +use serde::{Deserialize, Serialize}; + +use crate::settings::Settings; + +// --------------------------------------------------------------------------- +// Round type +// --------------------------------------------------------------------------- + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum RoundType { + Work, + ShortBreak, + LongBreak, +} + +impl RoundType { + pub fn as_str(self) -> &'static str { + match self { + RoundType::Work => "work", + RoundType::ShortBreak => "short-break", + RoundType::LongBreak => "long-break", + } + } +} + +// --------------------------------------------------------------------------- +// Sequence state +// --------------------------------------------------------------------------- + +#[derive(Debug, Clone, Serialize)] +pub struct SequenceState { + pub current_round: RoundType, + /// Which work round we're currently in (1-based). Displayed to the user. + pub work_round_number: u32, + /// Total work rounds before a long break (from settings). + pub work_rounds_total: u32, +} + +impl SequenceState { + pub fn new(work_rounds_total: u32) -> Self { + Self { + current_round: RoundType::Work, + work_round_number: 1, + work_rounds_total, + } + } + + /// Duration of the current round in seconds, taken from settings. + pub fn current_duration_secs(&self, settings: &Settings) -> u32 { + match self.current_round { + RoundType::Work => settings.time_work_secs, + RoundType::ShortBreak => settings.time_short_break_secs, + RoundType::LongBreak => settings.time_long_break_secs, + } + } + + /// Advance to the next round. Returns `(next_round_type, duration_secs)`. + /// + /// Call this when the engine fires `TimerEvent::Complete`. + pub fn advance(&mut self, settings: &Settings) -> (RoundType, u32) { + self.current_round = match self.current_round { + RoundType::Work => { + if self.work_round_number >= self.work_rounds_total { + RoundType::LongBreak + } else { + RoundType::ShortBreak + } + } + RoundType::ShortBreak => { + self.work_round_number += 1; + RoundType::Work + } + RoundType::LongBreak => { + self.work_round_number = 1; + RoundType::Work + } + }; + + let duration = self.current_duration_secs(settings); + (self.current_round, duration) + } + + /// Reset the sequence to the initial state (used by the Reset command). + pub fn reset(&mut self) { + self.current_round = RoundType::Work; + self.work_round_number = 1; + } +} + +// --------------------------------------------------------------------------- +// Tests (TIMER-02 acceptance: full cycles with various work_rounds values) +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + + /// Build a minimal `Settings` with the given durations. + fn settings(work: u32, short: u32, long: u32) -> Settings { + Settings { + time_work_secs: work, + time_short_break_secs: short, + time_long_break_secs: long, + long_break_interval: 4, + ..Settings::default() + } + } + + /// Simulate `n` full cycles (each cycle = work_rounds × work + breaks + long break) + /// and return a flat list of (round_type, duration) pairs. + fn simulate_cycle(work_rounds: u32, cycles: u32) -> Vec<(RoundType, u32)> { + let s = settings(1500, 300, 900); + let mut seq = SequenceState::new(work_rounds); + let mut result = Vec::new(); + + // Record initial state. + result.push((seq.current_round, seq.current_duration_secs(&s))); + + let total_rounds_per_cycle = work_rounds * 2; // work + break per work session, then long + let steps = total_rounds_per_cycle * cycles; + + for _ in 0..steps { + let (rt, dur) = seq.advance(&s); + result.push((rt, dur)); + } + result + } + + #[test] + fn single_work_round_cycle() { + // work_rounds=1: Work → LongBreak → Work → LongBreak → … + let rounds = simulate_cycle(1, 3); + let types: Vec<_> = rounds.iter().map(|(rt, _)| *rt).collect(); + assert_eq!( + types, + vec![ + RoundType::Work, + RoundType::LongBreak, + RoundType::Work, + RoundType::LongBreak, + RoundType::Work, + RoundType::LongBreak, + RoundType::Work, + ] + ); + } + + #[test] + fn two_work_rounds_cycle() { + // work_rounds=2: Work → Short → Work → Long → Work → Short → … + let rounds = simulate_cycle(2, 2); + let types: Vec<_> = rounds.iter().map(|(rt, _)| *rt).collect(); + assert_eq!( + types, + vec![ + RoundType::Work, + RoundType::ShortBreak, + RoundType::Work, + RoundType::LongBreak, + RoundType::Work, + RoundType::ShortBreak, + RoundType::Work, + RoundType::LongBreak, + RoundType::Work, + ] + ); + } + + #[test] + fn four_work_rounds_cycle() { + // The default work_rounds=4 cycle. + let s = settings(1500, 300, 900); + let mut seq = SequenceState::new(4); + + // Initial state check (before any advance). + assert_eq!(seq.current_round, RoundType::Work); + assert_eq!(seq.current_duration_secs(&s), 1500); + + // Expected results of successive advance() calls. + let expected = vec![ + (RoundType::ShortBreak, 300u32), // Work(1) → ShortBreak + (RoundType::Work, 1500), // ShortBreak → Work(2) + (RoundType::ShortBreak, 300), // Work(2) → ShortBreak + (RoundType::Work, 1500), // ShortBreak → Work(3) + (RoundType::ShortBreak, 300), // Work(3) → ShortBreak + (RoundType::Work, 1500), // ShortBreak → Work(4) + (RoundType::LongBreak, 900), // Work(4) → LongBreak (4 == total) + (RoundType::Work, 1500), // LongBreak → Work(1) — cycle 2 + (RoundType::ShortBreak, 300), // Work(1) → ShortBreak + ]; + + for (i, (exp_type, exp_dur)) in expected.iter().enumerate() { + let (rt, dur) = seq.advance(&s); + assert_eq!( + rt, *exp_type, + "step {i}: expected {exp_type:?}, got {rt:?}" + ); + assert_eq!( + dur, *exp_dur, + "step {i}: expected duration {exp_dur}, got {dur}" + ); + } + } + + #[test] + fn twelve_work_rounds_cycle() { + let s = settings(1500, 300, 900); + let mut seq = SequenceState::new(12); + + // Simulate one full cycle: 12 work + 11 short + 1 long = 24 advances. + let mut work_count = 0; + let mut short_count = 0; + let mut long_count = 0; + + for _ in 0..24 { + let (rt, _) = seq.advance(&s); + match rt { + RoundType::Work => work_count += 1, + RoundType::ShortBreak => short_count += 1, + RoundType::LongBreak => long_count += 1, + } + } + + // After 24 advances from the initial Work state we should have: + // 11 short breaks, 1 long break, and 12 work rounds. + assert_eq!(short_count, 11, "12-round cycle should have 11 short breaks"); + assert_eq!(long_count, 1, "12-round cycle should have 1 long break"); + assert_eq!(work_count, 12, "12-round cycle should have 12 work rounds"); + } + + #[test] + fn work_round_number_resets_after_long_break() { + let s = settings(1500, 300, 900); + let mut seq = SequenceState::new(2); + + seq.advance(&s); // → ShortBreak + assert_eq!(seq.work_round_number, 1); + + seq.advance(&s); // → Work(2) + assert_eq!(seq.work_round_number, 2); + + seq.advance(&s); // → LongBreak + assert_eq!(seq.work_round_number, 2, "number stays during long break"); + + seq.advance(&s); // → Work(1) — cycle reset + assert_eq!(seq.work_round_number, 1, "number must reset to 1 after long break"); + } + + #[test] + fn reset_returns_to_initial_state() { + let s = settings(1500, 300, 900); + let mut seq = SequenceState::new(4); + + seq.advance(&s); + seq.advance(&s); + seq.reset(); + + assert_eq!(seq.current_round, RoundType::Work); + assert_eq!(seq.work_round_number, 1); + assert_eq!(seq.current_duration_secs(&s), 1500); + } + + #[test] + fn work_round_number_increments_on_each_work_completion() { + // Verifies that work_round_number advances by 1 after each Work→Break→Work + // transition and resets to 1 after a long break. + let s = settings(1500, 300, 900); + let mut seq = SequenceState::new(4); + + assert_eq!(seq.work_round_number, 1, "initial work_round_number is 1"); + + // Complete work rounds 1→2→3→4. + for expected in 2..=4u32 { + seq.advance(&s); // Work(n) → ShortBreak + seq.advance(&s); // ShortBreak → Work(n+1) + assert_eq!( + seq.work_round_number, expected, + "work_round_number should be {expected} after completing round {}", + expected - 1 + ); + } + + // Work(4) → LongBreak → Work(1). + seq.advance(&s); // → LongBreak + seq.advance(&s); // → Work(1) + assert_eq!( + seq.work_round_number, 1, + "work_round_number must reset to 1 after long break" + ); + } +} diff --git a/src-tauri/src/tray/mod.rs b/src-tauri/src/tray/mod.rs new file mode 100644 index 0000000..0862618 --- /dev/null +++ b/src-tauri/src/tray/mod.rs @@ -0,0 +1,407 @@ +/// System tray management with dynamic arc icon via tiny-skia. +/// +/// The tray icon is a 32×32 RGBA image: +/// - Solid filled background circle in the theme's background color. +/// - Progress arc from 12 o'clock sweeping clockwise, colored by round type. +/// - While paused: two vertical bars drawn over the background (no arc). +/// +/// Colors come from the active theme, updated when theme changes. +/// The tray is created/destroyed when `min_to_tray` setting changes. +use std::f32::consts::{FRAC_PI_2, PI, TAU}; +use std::sync::{Arc, Mutex}; + +use tauri::{ + image::Image, + menu::{Menu, MenuItem}, + tray::{MouseButton, MouseButtonState, TrayIcon, TrayIconBuilder, TrayIconEvent}, + AppHandle, Manager, +}; +use tiny_skia::{Color, Paint, PathBuilder, Pixmap, Stroke, Transform}; + +// --------------------------------------------------------------------------- +// Theme colors for tray rendering +// --------------------------------------------------------------------------- + +/// Color tokens needed for tray icon rendering. +#[derive(Clone)] +pub struct TrayColors { + pub background: [u8; 4], + pub focus_round: [u8; 4], + pub short_round: [u8; 4], + pub long_round: [u8; 4], + pub foreground: [u8; 4], +} + +impl Default for TrayColors { + fn default() -> Self { + // Pomotroid theme defaults (matches pomotroid.json bundled theme). + Self { + background: [47, 56, 75, 255], // #2F384B + focus_round: [226, 93, 96, 255], // #E25D60 + short_round: [53, 188, 174, 255], // #35BCAE + long_round: [89, 174, 209, 255], // #59AED1 + foreground: [255, 255, 255, 255], // #FFFFFF + } + } +} + +impl TrayColors { + /// Build a `TrayColors` from a theme's CSS-variable color map. + /// Falls back to `TrayColors::default()` values for any key that is + /// missing or unparseable. + pub fn from_colors_map(colors: &std::collections::HashMap) -> Self { + let d = Self::default(); + let get = |key: &str, fallback: [u8; 4]| { + colors.get(key) + .and_then(|hex| parse_hex_color(hex)) + .unwrap_or(fallback) + }; + Self { + background: get("--color-background", d.background), + focus_round: get("--color-focus-round", d.focus_round), + short_round: get("--color-short-round", d.short_round), + long_round: get("--color-long-round", d.long_round), + foreground: get("--color-foreground", d.foreground), + } + } +} + +/// Parse a CSS hex color (#RRGGBB or #RRGGBBAA) into [r, g, b, a]. +pub fn parse_hex_color(hex: &str) -> Option<[u8; 4]> { + let h = hex.strip_prefix('#')?; + match h.len() { + 6 => { + let r = u8::from_str_radix(&h[0..2], 16).ok()?; + let g = u8::from_str_radix(&h[2..4], 16).ok()?; + let b = u8::from_str_radix(&h[4..6], 16).ok()?; + Some([r, g, b, 255]) + } + 8 => { + let r = u8::from_str_radix(&h[0..2], 16).ok()?; + let g = u8::from_str_radix(&h[2..4], 16).ok()?; + let b = u8::from_str_radix(&h[4..6], 16).ok()?; + let a = u8::from_str_radix(&h[6..8], 16).ok()?; + Some([r, g, b, a]) + } + _ => None, + } +} + +// --------------------------------------------------------------------------- +// Shared tray state +// --------------------------------------------------------------------------- + +/// Tauri-managed state for the tray icon (uses the default Wry runtime). +pub struct TrayState { + pub icon: Mutex>>, + pub colors: Mutex, + pub countdown_mode: Mutex, +} + +impl TrayState { + pub fn new() -> Arc { + Arc::new(Self { + icon: Mutex::new(None), + colors: Mutex::new(TrayColors::default()), + countdown_mode: Mutex::new(false), + }) + } +} + +// --------------------------------------------------------------------------- +// Tray lifecycle +// --------------------------------------------------------------------------- + +/// Show the system tray icon. +/// +/// If the icon has already been created (e.g. it was previously hidden), it is +/// made visible again without allocating a second OS icon. A new icon is only +/// built on the very first call. +pub fn create_tray(app: &AppHandle, state: &Arc) { + // Re-show existing icon if present — avoids duplicate OS tray entries. + { + let guard = state.icon.lock().unwrap(); + if let Some(existing) = guard.as_ref() { + let _ = existing.set_visible(true); + log::info!("[tray] shown (reused existing icon)"); + return; + } + } + + let show_item = match MenuItem::with_id(app, "show", "Show", true, None::<&str>) { + Ok(i) => i, + Err(e) => { log::warn!("[tray] menu item error: {e}"); return; } + }; + let exit_item = match MenuItem::with_id(app, "exit", "Exit", true, None::<&str>) { + Ok(i) => i, + Err(e) => { log::warn!("[tray] menu item error: {e}"); return; } + }; + let menu = match Menu::with_items(app, &[&show_item, &exit_item]) { + Ok(m) => m, + Err(e) => { log::warn!("[tray] menu error: {e}"); return; } + }; + + // Render the initial idle icon using the current state (respects countdown mode + // and theme colors already set before create_tray is called). + let image = { + let colors = state.colors.lock().unwrap().clone(); + let countdown = *state.countdown_mode.lock().unwrap(); + let bytes = render_tray_icon_rgba(&colors, false, 0.0, "work", countdown); + Image::new_owned(bytes, SIZE, SIZE) + }; + + let tray = TrayIconBuilder::new() + .icon(image) + .tooltip("Pomotroid") + .menu(&menu) + .on_tray_icon_event(|tray_icon, event| { + // Left-click: toggle window visibility. + if let TrayIconEvent::Click { + button: MouseButton::Left, + button_state: MouseButtonState::Up, + .. + } = event + { + let app = tray_icon.app_handle(); + if let Some(window) = app.get_webview_window("main") { + match window.is_visible() { + Ok(true) => { + log::debug!("[tray] left-click → hide"); + let _ = window.hide(); + } + _ => { + log::debug!("[tray] left-click → show"); + let _ = window.show(); + let _ = window.set_focus(); + } + } + } + } + }) + .on_menu_event(|app, event| { + match event.id().as_ref() { + "show" => { + log::info!("[tray] show"); + if let Some(window) = app.get_webview_window("main") { + let _ = window.show(); + let _ = window.set_focus(); + } + } + "exit" => { + log::info!("[tray] exit"); + app.exit(0); + } + _ => {} + } + }) + .build(app); + + match tray { + Ok(t) => { + *state.icon.lock().unwrap() = Some(t); + log::info!("[tray] created"); + } + Err(e) => log::warn!("[tray] failed to build tray icon: {e}"), + } +} + +/// Hide the system tray icon. +/// +/// The underlying `TrayIcon` is kept alive so it can be shown again without +/// allocating a second OS icon. Dropping the handle is not sufficient to +/// remove the icon on all platforms; `set_visible(false)` is the reliable path. +pub fn destroy_tray(state: &Arc) { + let guard = state.icon.lock().unwrap(); + if let Some(existing) = guard.as_ref() { + let _ = existing.set_visible(false); + log::info!("[tray] hidden"); + } +} + +// --------------------------------------------------------------------------- +// Icon update (called from the timer event listener) +// --------------------------------------------------------------------------- + +/// Re-render and push a new RGBA icon to the tray. +/// +/// - `round_type`: "work" | "short-break" | "long-break" +/// - `paused`: show pause bars instead of an arc +/// - `progress`: 0.0 (empty) to 1.0 (full, i.e. elapsed/total) +pub fn update_icon(state: &Arc, round_type: &str, paused: bool, progress: f32) { + let guard = state.icon.lock().unwrap(); + let Some(tray) = guard.as_ref() else { return }; + + let colors = state.colors.lock().unwrap().clone(); + let countdown = *state.countdown_mode.lock().unwrap(); + let bytes = render_tray_icon_rgba(&colors, paused, progress, round_type, countdown); + + let image = Image::new_owned(bytes, SIZE, SIZE); + let _ = tray.set_icon(Some(image)); +} + +// --------------------------------------------------------------------------- +// Icon rendering (tiny-skia) +// --------------------------------------------------------------------------- + +// Render at 64×64 so the icon looks sharp on HiDPI displays (Ubuntu often +// runs at 1.5× or 2× scale). The tray host scales it down on standard +// density displays; the larger source means the circle stays clean either way. +const SIZE: u32 = 64; +const CENTER: f32 = SIZE as f32 / 2.0; +const RADIUS: f32 = CENTER - 5.0; // 5 px margin keeps the stroke inside the canvas +const STROKE_WIDTH: f32 = 6.0; +// Track opacity: the "empty" part of the ring at this brightness on a dark panel. +// 22% white on #1a1a1a ≈ #383838 — invisible. 65% ≈ #a6a6a6 — clearly visible. +const TRACK_ALPHA: u8 = 165; // ≈ 65 % + +fn rgba_color(c: [u8; 4]) -> Color { + Color::from_rgba8(c[0], c[1], c[2], c[3]) +} + +/// Render a 64×64 RGBA tray icon as a **ring** with a progress arc. +/// +/// Using a ring (stroke-only circle) on a transparent background means the +/// icon reads as a clear circle regardless of panel colour or scale factor, +/// unlike a solid filled disc which looks like a dark blob at small sizes. +pub fn render_tray_icon_rgba( + colors: &TrayColors, + paused: bool, + progress: f32, + round_type: &str, + countdown: bool, +) -> Vec { + let mut pixmap = Pixmap::new(SIZE, SIZE).expect("pixmap alloc"); + + let mut paint = Paint { anti_alias: true, ..Default::default() }; + + let stroke = Stroke { + width: STROKE_WIDTH, + line_cap: tiny_skia::LineCap::Round, + ..Default::default() + }; + + // Track ring: full circle at low opacity — defines the circular shape. + { + let [r, g, b, _] = colors.foreground; + paint.set_color(Color::from_rgba8(r, g, b, TRACK_ALPHA)); + } + let ring = { + let mut pb = PathBuilder::new(); + pb.push_circle(CENTER, CENTER, RADIUS); + pb.finish().expect("ring path") + }; + pixmap.stroke_path(&ring, &paint, &stroke, Transform::identity(), None); + + if paused { + // Two vertical bars centred in the ring. + paint.set_color(rgba_color(colors.foreground)); + let bar_h = RADIUS * 0.75; + let bar_w = STROKE_WIDTH * 0.7; + let bar_gap = STROKE_WIDTH * 1.1; + let bar_y = CENTER - bar_h / 2.0; + for x in [CENTER - bar_gap / 2.0 - bar_w, CENTER + bar_gap / 2.0] { + if let Some(rect) = tiny_skia::Rect::from_xywh(x, bar_y, bar_w, bar_h) { + let p = PathBuilder::from_rect(rect); + pixmap.fill_path( + &p, &paint, tiny_skia::FillRule::Winding, + Transform::identity(), None, + ); + } + } + } else { + // Progress arc from 12 o'clock, clockwise, in the round-type colour. + let arc_color = match round_type { + "short-break" => rgba_color(colors.short_round), + "long-break" => rgba_color(colors.long_round), + _ => rgba_color(colors.focus_round), + }; + paint.set_color(arc_color); + + // In elapsed mode the arc grows as time passes; in countdown mode it shrinks. + let effective = if countdown { 1.0 - progress } else { progress }; + let sweep = effective.clamp(0.0, 1.0) * TAU; + if sweep > 0.001 { + let start = -FRAC_PI_2; + let end = start + sweep; + let path = build_arc_path(CENTER, CENTER, RADIUS, start, end); + pixmap.stroke_path(&path, &paint, &stroke, Transform::identity(), None); + } + } + + pixmap.take() +} + +/// Approximate a circular arc with cubic Bézier segments (max π/2 per segment). +fn build_arc_path(cx: f32, cy: f32, r: f32, start: f32, end: f32) -> tiny_skia::Path { + let total = end - start; + let n = ((total / (PI / 2.0)).ceil() as usize).max(1); + let step = total / n as f32; + let mut pb = PathBuilder::new(); + + for i in 0..n { + let a0 = start + step * i as f32; + let a1 = a0 + step; + arc_segment(&mut pb, cx, cy, r, a0, a1, i == 0); + } + + pb.finish().unwrap_or_else(|| { + PathBuilder::from_rect(tiny_skia::Rect::from_xywh(cx, cy, 1.0, 1.0).unwrap()) + }) +} + +/// Append one arc segment (≤ π/2) as a cubic Bézier. +fn arc_segment(pb: &mut PathBuilder, cx: f32, cy: f32, r: f32, a0: f32, a1: f32, first: bool) { + let alpha = ((a1 - a0) / 4.0).tan() * 4.0 / 3.0; + let (s0, c0) = a0.sin_cos(); + let (s1, c1) = a1.sin_cos(); + let x0 = cx + r * c0; let y0 = cy + r * s0; + let x3 = cx + r * c1; let y3 = cy + r * s1; + let x1 = x0 - alpha * r * s0; let y1 = y0 + alpha * r * c0; + let x2 = x3 + alpha * r * s1; let y2 = y3 - alpha * r * c1; + if first { pb.move_to(x0, y0); } + pb.cubic_to(x1, y1, x2, y2, x3, y3); +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn render_returns_correct_byte_count() { + let bytes = render_tray_icon_rgba(&TrayColors::default(), false, 0.5, "work", false); + assert_eq!(bytes.len(), (SIZE * SIZE * 4) as usize); + } + + #[test] + fn render_paused_returns_correct_byte_count() { + let bytes = render_tray_icon_rgba(&TrayColors::default(), true, 0.0, "work", false); + assert_eq!(bytes.len(), (SIZE * SIZE * 4) as usize); + } + + #[test] + fn render_zero_progress_returns_correct_byte_count() { + let bytes = render_tray_icon_rgba(&TrayColors::default(), false, 0.0, "work", false); + assert_eq!(bytes.len(), (SIZE * SIZE * 4) as usize); + } + + #[test] + fn parse_hex_6_digit() { + assert_eq!(parse_hex_color("#FF8800"), Some([255, 136, 0, 255])); + } + + #[test] + fn parse_hex_8_digit() { + assert_eq!(parse_hex_color("#FF880080"), Some([255, 136, 0, 128])); + } + + #[test] + fn parse_hex_invalid() { + assert_eq!(parse_hex_color("not-a-color"), None); + assert_eq!(parse_hex_color("#ZZZ"), None); + assert_eq!(parse_hex_color(""), None); + } +} diff --git a/src-tauri/src/websocket/mod.rs b/src-tauri/src/websocket/mod.rs new file mode 100644 index 0000000..74adbce --- /dev/null +++ b/src-tauri/src/websocket/mod.rs @@ -0,0 +1,238 @@ +/// Optional opt-in WebSocket server via tokio + axum. +/// +/// Binds to `127.0.0.1:{port}` (localhost only — never all interfaces). +/// +/// Protocol: +/// Client → Server: `{ "type": "getState" }` +/// Server → Client: `{ "type": "state", "payload": TimerSnapshot }` +/// `{ "type": "roundChange", "payload": TimerSnapshot }` (broadcast) +/// `{ "type": "error", "message": "..." }` (startup failure) +/// +/// Lifecycle: +/// - `start(port, app)` spawns a Tokio task; sets running handle in `WsState`. +/// - `stop()` aborts the task. +/// - On port conflict: emits `websocket:error` Tauri event instead of panicking. +use std::net::SocketAddr; +use std::sync::Arc; + +use axum::{ + extract::{ws::{Message, WebSocket, WebSocketUpgrade}, State as AxumState}, + response::IntoResponse, + routing::get, + Router, +}; +use futures_util::{SinkExt, StreamExt}; +use tauri::{AppHandle, Emitter, Manager}; +use tokio::{ + net::TcpListener, + sync::broadcast, + task::JoinHandle, +}; + +use crate::timer::{TimerController, TimerSnapshot}; + +// --------------------------------------------------------------------------- +// Broadcast channel payload +// --------------------------------------------------------------------------- + +/// Events broadcast to all connected WebSocket clients. +#[derive(Clone, serde::Serialize)] +#[serde(tag = "type", rename_all = "camelCase")] +pub enum WsEvent { + RoundChange { payload: TimerSnapshot }, +} + +// --------------------------------------------------------------------------- +// Server state shared between connections +// --------------------------------------------------------------------------- + +#[derive(Clone)] +struct ServerState { + app: AppHandle, + broadcast_tx: broadcast::Sender, +} + +// --------------------------------------------------------------------------- +// Tauri-managed WebSocket state +// --------------------------------------------------------------------------- + +pub struct WsState { + task: tokio::sync::Mutex>>, + pub broadcast_tx: broadcast::Sender, +} + +impl WsState { + pub fn new() -> Arc { + let (broadcast_tx, _) = broadcast::channel(64); + Arc::new(Self { + task: tokio::sync::Mutex::new(None), + broadcast_tx, + }) + } +} + +// --------------------------------------------------------------------------- +// Lifecycle +// --------------------------------------------------------------------------- + +/// Start the WebSocket server on `127.0.0.1:{port}`. +/// +/// Emits `websocket:error` if the port is already in use. +/// No-ops if already running (call `stop` first to change port). +pub async fn start(port: u16, app: AppHandle, state: &Arc) { + let addr: SocketAddr = ([127, 0, 0, 1], port).into(); + let listener = match TcpListener::bind(addr).await { + Ok(l) => l, + Err(e) => { + log::error!("[ws] failed to bind {addr}: {e}"); + let _ = app.emit( + "websocket:error", + serde_json::json!({ "message": e.to_string(), "port": port }), + ); + return; + } + }; + + let server_state = ServerState { + app: app.clone(), + broadcast_tx: state.broadcast_tx.clone(), + }; + + let router = Router::new() + .route("/ws", get(ws_handler)) + .with_state(server_state); + + let handle = tokio::spawn(async move { + if let Err(e) = axum::serve(listener, router).await { + log::error!("[ws] server error: {e}"); + } + }); + + *state.task.lock().await = Some(handle); + log::info!("[ws] listening on ws://127.0.0.1:{port}/ws"); +} + +/// Stop the WebSocket server (aborts the task). +pub async fn stop(state: &Arc) { + if let Some(handle) = state.task.lock().await.take() { + handle.abort(); + } +} + +// --------------------------------------------------------------------------- +// WebSocket handler +// --------------------------------------------------------------------------- + +async fn ws_handler( + ws: WebSocketUpgrade, + AxumState(state): AxumState, +) -> impl IntoResponse { + ws.on_upgrade(move |socket| handle_socket(socket, state)) +} + +async fn handle_socket(socket: WebSocket, state: ServerState) { + let (mut sender, mut receiver) = socket.split(); + let mut rx = state.broadcast_tx.subscribe(); + + // Task: forward broadcast events to this client. + let mut send_task = tokio::spawn(async move { + while let Ok(event) = rx.recv().await { + let json = match serde_json::to_string(&event) { + Ok(s) => s, + Err(_) => continue, + }; + if sender.send(Message::Text(json)).await.is_err() { + break; + } + } + }); + + // Main loop: handle incoming messages from this client. + let app = state.app.clone(); + let broadcast_tx = state.broadcast_tx.clone(); + let mut recv_task = tokio::spawn(async move { + while let Some(Ok(msg)) = receiver.next().await { + match msg { + Message::Text(text) => { + handle_client_message(&text, &app, &broadcast_tx).await; + } + Message::Close(_) => break, + _ => {} + } + } + }); + + // If either task finishes, abort the other. + tokio::select! { + _ = &mut send_task => recv_task.abort(), + _ = &mut recv_task => send_task.abort(), + } +} + +async fn handle_client_message( + text: &str, + app: &AppHandle, + _broadcast_tx: &broadcast::Sender, +) { + let Ok(msg) = serde_json::from_str::(text) else { + return; + }; + + if let Some("getState") = msg.get("type").and_then(|t| t.as_str()) { + if let Some(timer) = app.try_state::() { + let snapshot = timer.get_snapshot(); + let response = serde_json::json!({ + "type": "state", + "payload": snapshot, + }); + // Note: we can't send directly here without the sender; + // the client will receive state via the next broadcast. + // For an immediate reply, broadcast it. + let _ = app.emit("timer:state-query", response); + } + } +} + +// --------------------------------------------------------------------------- +// Public API for broadcasting from the timer event listener +// --------------------------------------------------------------------------- + +/// Broadcast a `roundChange` event to all connected WebSocket clients. +pub fn broadcast_round_change(state: &Arc, snapshot: TimerSnapshot) { + // Ignore send errors when there are no subscribers. + let _ = state.broadcast_tx.send(WsEvent::RoundChange { payload: snapshot }); +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn ws_state_can_be_created() { + let state = WsState::new(); + // broadcast_tx should have 0 receivers initially. + assert_eq!(state.broadcast_tx.receiver_count(), 0); + } + + #[test] + fn ws_event_serializes_correctly() { + use crate::timer::TimerSnapshot; + let snap = TimerSnapshot { + round_type: "work".into(), + elapsed_secs: 60, + total_secs: 1500, + is_running: true, + is_paused: false, + work_round_number: 1, + work_rounds_total: 4, + }; + let event = WsEvent::RoundChange { payload: snap }; + let json = serde_json::to_string(&event).unwrap(); + assert!(json.contains("\"type\":\"roundChange\"")); + assert!(json.contains("\"elapsed_secs\":60")); + } +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..0bcdf76 --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,92 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "Pomotroid", + "version": "1.0.0", + "identifier": "com.splode.pomotroid", + "build": { + "beforeDevCommand": "npm run dev", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "npm run build", + "frontendDist": "../build" + }, + "app": { + "windows": [ + { + "title": "Pomotroid", + "width": 360, + "height": 478, + "minWidth": 240, + "minHeight": 240, + "resizable": true, + "decorations": true, + "titleBarStyle": "Overlay", + "hiddenTitle": true, + "backgroundColor": "#2F384B", + "visible": false + } + ], + "security": { + "csp": "default-src 'self'; style-src 'self' 'unsafe-inline'; media-src 'self'" + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/64x64.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "category": "Utility", + "copyright": "Copyright © 2017–2026 Christopher Murphy (Splode). MIT License.", + "shortDescription": "A beautiful Pomodoro timer", + "longDescription": "Pomotroid is a simple, configurable and visually pleasing Pomodoro timer. Keep track of your work sessions and take breaks with a clean, themeable interface.", + "linux": { + "deb": { + "depends": [] + }, + "appimage": { + "bundleMediaFramework": true + }, + "rpm": { + "depends": [] + } + }, + "macOS": { + "dmg": { + "windowPosition": { + "x": 400, + "y": 100 + }, + "windowSize": { + "width": 660, + "height": 400 + }, + "appPosition": { + "x": 180, + "y": 170 + }, + "applicationFolderPosition": { + "x": 480, + "y": 170 + } + }, + "minimumSystemVersion": "10.13" + }, + "windows": { + "nsis": { + "displayLanguageSelector": false, + "installerIcon": "icons/icon.ico", + "headerImage": "icons/128x128.png", + "installMode": "perMachine" + }, + "wix": { + "language": "en-US" + } + } + } +} diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..347113c --- /dev/null +++ b/src/app.css @@ -0,0 +1,65 @@ +/* Global CSS — CSS custom properties for theming. + The active theme overrides these values at runtime via Tauri IPC. */ + +:root { + /* Theme colors (defaults; overridden by the active theme at runtime) */ + --color-long-round: #c75000; + --color-short-round: #417505; + --color-focus-round: #b01c2e; + --color-background: #2f384b; + --color-background-light: #3e4a5d; + --color-foreground: #d7e1f4; + --color-foreground-darker: #a3aec4; + --color-accent: #ff6347; + + /* Derived chrome tokens — adapt automatically between dark and light themes. + color-mix with transparent produces the foreground color at N% opacity, + which creates subtle dark overlays on light themes and light overlays on + dark themes without any hardcoded rgba(255,255,255,...) values. */ + --color-separator: color-mix(in oklch, var(--color-foreground) 8%, transparent); + --color-hover: color-mix(in oklch, var(--color-foreground) 10%, transparent); + + /* Transition timing tokens — components reference these for consistency */ + --transition-default: 0.2s ease; + --transition-snappy: 0.12s cubic-bezier(0.4, 0, 0.2, 1); + --transition-slow: 0.35s ease; +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html, +body { + height: 100%; + width: 100%; + overflow: hidden; + font-family: system-ui, -apple-system, sans-serif; + background-color: var(--color-background); + color: var(--color-foreground); + user-select: none; +} + +/* --------------------------------------------------------------------------- + Keyframes (available to all scoped component stylesheets) + --------------------------------------------------------------------------- */ + +@keyframes app-fade-in { + from { + opacity: 0; + transform: scale(0.98); + } + to { + opacity: 1; + transform: scale(1); + } +} + +@keyframes icon-fade-in { + from { opacity: 0; transform: scale(0.8); } + to { opacity: 1; transform: scale(1); } +} diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..f479f9d --- /dev/null +++ b/src/app.html @@ -0,0 +1,12 @@ + + + + + + Pomotroid + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/index.ejs b/src/index.ejs deleted file mode 100644 index 5e51210..0000000 --- a/src/index.ejs +++ /dev/null @@ -1,25 +0,0 @@ - - - - - Pomotroid - <% if (htmlWebpackPlugin.options.nodeModules) { %> - - - <% } %> - - -
- - - - - - diff --git a/src/lib/components/MiniControls.svelte b/src/lib/components/MiniControls.svelte new file mode 100644 index 0000000..df3e0eb --- /dev/null +++ b/src/lib/components/MiniControls.svelte @@ -0,0 +1,102 @@ + + +
+ + + + + + + + +
+ + diff --git a/src/lib/components/ShortcutInput.svelte b/src/lib/components/ShortcutInput.svelte new file mode 100644 index 0000000..a5ec5c4 --- /dev/null +++ b/src/lib/components/ShortcutInput.svelte @@ -0,0 +1,101 @@ + + + + + + diff --git a/src/lib/components/Timer.svelte b/src/lib/components/Timer.svelte new file mode 100644 index 0000000..b21295a --- /dev/null +++ b/src/lib/components/Timer.svelte @@ -0,0 +1,254 @@ + + +
+
+ +
+ + +
+ + {#if !isCompact} + +
+ {roundLabel(state.round_type)} +
+ + +
+ + + + + + + + +
+ + + {/if} +
+ + {#if isCompact} + + {/if} +
+ + diff --git a/src/lib/components/TimerDial.svelte b/src/lib/components/TimerDial.svelte new file mode 100644 index 0000000..3ea6ebc --- /dev/null +++ b/src/lib/components/TimerDial.svelte @@ -0,0 +1,84 @@ + + + + + diff --git a/src/lib/components/TimerDisplay.svelte b/src/lib/components/TimerDisplay.svelte new file mode 100644 index 0000000..db25409 --- /dev/null +++ b/src/lib/components/TimerDisplay.svelte @@ -0,0 +1,41 @@ + + +
+ {display} +
+ + diff --git a/src/lib/components/TimerFooter.svelte b/src/lib/components/TimerFooter.svelte new file mode 100644 index 0000000..ad8ef05 --- /dev/null +++ b/src/lib/components/TimerFooter.svelte @@ -0,0 +1,179 @@ + + + + + diff --git a/src/lib/components/Titlebar.svelte b/src/lib/components/Titlebar.svelte new file mode 100644 index 0000000..b0f7005 --- /dev/null +++ b/src/lib/components/Titlebar.svelte @@ -0,0 +1,201 @@ + + +{#snippet settingsBtn()} + +{/snippet} + +{#snippet statsBtn()} + +{/snippet} + + + + diff --git a/src/lib/components/settings/SettingsTitlebar.svelte b/src/lib/components/settings/SettingsTitlebar.svelte new file mode 100644 index 0000000..4fee91c --- /dev/null +++ b/src/lib/components/settings/SettingsTitlebar.svelte @@ -0,0 +1,70 @@ + + + + + diff --git a/src/lib/components/settings/SettingsToggle.svelte b/src/lib/components/settings/SettingsToggle.svelte new file mode 100644 index 0000000..2237198 --- /dev/null +++ b/src/lib/components/settings/SettingsToggle.svelte @@ -0,0 +1,101 @@ + + + + + diff --git a/src/lib/components/settings/sections/AboutSection.svelte b/src/lib/components/settings/sections/AboutSection.svelte new file mode 100644 index 0000000..3831218 --- /dev/null +++ b/src/lib/components/settings/sections/AboutSection.svelte @@ -0,0 +1,251 @@ + + +
+
+ + + + +
+

Pomotroid

+

Version {version}

+
+
+ + + +
+ {#if !confirming} + + {:else} +
+ {m.about_reset_confirm()} +
+ + +
+
+ {/if} +
+ +

+ Built with Tauri, Svelte, and Rust.
+ MIT License — Copyright © 2017–2026 Christopher Murphy. +

+
+ + diff --git a/src/lib/components/settings/sections/AppearanceSection.svelte b/src/lib/components/settings/sections/AppearanceSection.svelte new file mode 100644 index 0000000..3eef09e --- /dev/null +++ b/src/lib/components/settings/sections/AppearanceSection.svelte @@ -0,0 +1,298 @@ + + +
+ + +
{m.appearance_group_mode()}
+
+ {#each [['auto', m.appearance_mode_auto()], ['light', m.appearance_mode_light()], ['dark', m.appearance_mode_dark()]] as [value, label] (value)} + + {/each} +
+ + +
+ {m.appearance_group_light_theme()} + {#if lightIsActive}{m.appearance_badge_active()}{/if} +
+
+ {#each themes as theme (theme.name)} + {@const bg = theme.colors['--color-background'] ?? '#2f384b'} + {@const fg = theme.colors['--color-foreground'] ?? '#d7e1f4'} + {@const accent = theme.colors['--color-accent'] ?? '#e25d60'} + {@const focusRound = theme.colors['--color-focus-round'] ?? '#e25d60'} + {@const shortRound = theme.colors['--color-short-round'] ?? '#3baf82'} + {@const longRound = theme.colors['--color-long-round'] ?? '#3d85c8'} + {@const isSelected = theme.name === $settings.theme_light} + + {/each} +
+ + +
+ {m.appearance_group_dark_theme()} + {#if darkIsActive}{m.appearance_badge_active()}{/if} +
+
+ {#each themes as theme (theme.name)} + {@const bg = theme.colors['--color-background'] ?? '#2f384b'} + {@const fg = theme.colors['--color-foreground'] ?? '#d7e1f4'} + {@const accent = theme.colors['--color-accent'] ?? '#e25d60'} + {@const focusRound = theme.colors['--color-focus-round'] ?? '#e25d60'} + {@const shortRound = theme.colors['--color-short-round'] ?? '#3baf82'} + {@const longRound = theme.colors['--color-long-round'] ?? '#3d85c8'} + {@const isSelected = theme.name === $settings.theme_dark} + + {/each} +
+ +
+ + diff --git a/src/lib/components/settings/sections/NotificationsSection.svelte b/src/lib/components/settings/sections/NotificationsSection.svelte new file mode 100644 index 0000000..11974fa --- /dev/null +++ b/src/lib/components/settings/sections/NotificationsSection.svelte @@ -0,0 +1,313 @@ + + +
+
{m.notif_group_alert()}
+ + {#each CUE_LIST as { id, label } (id)} +
+
+ {label()} + + {getFileName(id) ?? m.notif_audio_default()} + +
+
+ {#if getFileName(id) !== null} + + {/if} + +
+
+ {/each} + +
{m.notif_group_desktop()}
+ + toggle('notifications', $settings.notifications_enabled)} + /> + +
{m.notif_group_tick()}
+ + toggle('tick_sounds_work', $settings.tick_sounds_during_work)} + /> + toggle('tick_sounds_break', $settings.tick_sounds_during_break)} + /> + +
{m.notif_group_volume()}
+ +
+
+ {m.notif_label_volume()} + {Math.round(localVolume * 100)}% +
+
+ +
+
+
+
+ + diff --git a/src/lib/components/settings/sections/ShortcutsSection.svelte b/src/lib/components/settings/sections/ShortcutsSection.svelte new file mode 100644 index 0000000..18895bd --- /dev/null +++ b/src/lib/components/settings/sections/ShortcutsSection.svelte @@ -0,0 +1,145 @@ + + +
+ {#if isMac && !trusted} +
+

{m.shortcuts_accessibility_notice()}

+ +
+ {/if} + +

{m.shortcuts_note()}

+ +
+ {m.shortcuts_toggle_timer()} + setShortcut('shortcut_toggle', v)} + /> +
+ +
+ {m.shortcuts_reset_timer()} + setShortcut('shortcut_reset', v)} + /> +
+ +
+ {m.shortcuts_skip_round()} + setShortcut('shortcut_skip', v)} + /> +
+ +
+ {m.shortcuts_restart_round()} + setShortcut('shortcut_restart', v)} + /> +
+
+ + diff --git a/src/lib/components/settings/sections/SystemSection.svelte b/src/lib/components/settings/sections/SystemSection.svelte new file mode 100644 index 0000000..b914e88 --- /dev/null +++ b/src/lib/components/settings/sections/SystemSection.svelte @@ -0,0 +1,323 @@ + + +
+
{m.system_group_integrations()}
+ + toggle('websocket_enabled', $settings.websocket_enabled)} + /> + + {#if $settings.websocket_enabled} +
+ {m.system_label_port()} + +
+

+ Listens on ws://127.0.0.1:{$settings.websocket_port}/ws. + Send {"{ \"type\": \"getState\" }"} to query the current timer state. + Round changes are broadcast automatically. +

+ {/if} + +
{m.system_group_language()}
+ +
+
+ + + {#if langOpen} +
    + {#each LANGUAGES as lang (lang.value)} + +
  • selectLanguage(lang.value)} + >{lang.label}
  • + {/each} +
+ {/if} +
+
+ +
{m.advanced_group_logging()}
+ + toggle('verbose_logging', $settings.verbose_logging)} + /> + +
{m.system_group_tray()}
+ + + toggle('tray_icon_enabled', $settings.tray_icon_enabled)} + /> + + {#if $settings.tray_icon_enabled} + + {#if !isMac} + toggle('min_to_tray', $settings.min_to_tray)} + /> + {/if} + + toggle('min_to_tray_on_close', $settings.min_to_tray_on_close)} + /> + {/if} + +
{m.system_group_window()}
+ + toggle('always_on_top', $settings.always_on_top)} + /> + {#if $settings.always_on_top} + toggle('break_always_on_top', $settings.break_always_on_top)} + /> + {/if} +
+ + diff --git a/src/lib/components/settings/sections/TimerSection.svelte b/src/lib/components/settings/sections/TimerSection.svelte new file mode 100644 index 0000000..0aae8ac --- /dev/null +++ b/src/lib/components/settings/sections/TimerSection.svelte @@ -0,0 +1,205 @@ + + +
+
+
+ {m.timer_slider_focus()} + {workMins}:00 +
+
+ handleChange('time_work_mins', (e.target as HTMLInputElement).valueAsNumber)} + /> +
+
+
+ +
+
+ {m.timer_slider_short_break()} + {shortMins}:00 +
+
+ handleChange('time_short_break_mins', (e.target as HTMLInputElement).valueAsNumber)} + /> +
+
+
+ +
+
+ {m.timer_slider_long_break()} + {longMins}:00 +
+
+ handleChange('time_long_break_mins', (e.target as HTMLInputElement).valueAsNumber)} + /> +
+
+
+ +
+
+ {m.timer_slider_rounds()} + {rounds} +
+
+ handleChange('work_rounds', (e.target as HTMLInputElement).valueAsNumber)} + /> +
+
+
+ + toggle('auto_start_work', $settings.auto_start_work)} + /> + toggle('auto_start_break', $settings.auto_start_break)} + /> + toggle('dial_countdown', $settings.dial_countdown)} + /> + +
+ + diff --git a/src/lib/components/stats/DailyView.svelte b/src/lib/components/stats/DailyView.svelte new file mode 100644 index 0000000..e6cfd96 --- /dev/null +++ b/src/lib/components/stats/DailyView.svelte @@ -0,0 +1,231 @@ + + +
+ +
+
+ {m.stats_rounds()} + {today?.rounds ?? '—'} +
+
+
+ {m.stats_focus_time()} + {today ? fmtTime(today.focus_mins) : '—'} +
+
+
+ {m.stats_completion()} + {today ? fmtRate(today.completion_rate) : '—'} +
+
+ + +
+
+ {m.stats_sessions_by_hour()} + {#if !hasData} + {m.stats_no_sessions_today()} + {/if} +
+ +
+ + {#each byHour as count, h} + {@const barH = Math.max(2, Math.round((count / maxHour) * CHART_H))} + {@const x = h * (BAR_W + BAR_GAP)} + {@const y = CHART_H - barH} + + + + + + {#if hourLabels.includes(h)} + {h === 0 ? '12a' : h === 12 ? '12p' : h < 12 ? `${h}a` : `${h - 12}p`} + {/if} + {/each} + + + + +
+
+
+ + diff --git a/src/lib/components/stats/WeeklyView.svelte b/src/lib/components/stats/WeeklyView.svelte new file mode 100644 index 0000000..95ee817 --- /dev/null +++ b/src/lib/components/stats/WeeklyView.svelte @@ -0,0 +1,254 @@ + + +
+ +
+
+ {m.stats_this_week()} + {totalWeek} {m.stats_rounds().toLowerCase()} +
+ {#if streak} +
+ {m.stats_current_streak()} + + {#if streak.current > 0} + {streak.current} + {streak.current === 1 ? m.stats_day() : m.stats_days()} + {:else} + {m.stats_no_active_streak()} + {/if} + +
+ {/if} +
+ + +
+ {#if !hasData} +
+ {m.stats_no_sessions_week()} +
+ {:else} +
+ + {#each days as day, i} + {@const barH = Math.max(day.rounds > 0 ? 4 : 0, Math.round((day.rounds / maxRounds) * CHART_H))} + {@const x = i * (BAR_W + BAR_GAP)} + {@const y = CHART_H - barH} + + + + + + {#if day.rounds > 0} + {day.rounds} + {/if} + + + {day.short} + {/each} + + + + +
+ {/if} +
+
+ + diff --git a/src/lib/components/stats/YearlyView.svelte b/src/lib/components/stats/YearlyView.svelte new file mode 100644 index 0000000..bff86b2 --- /dev/null +++ b/src/lib/components/stats/YearlyView.svelte @@ -0,0 +1,502 @@ + + + + + + + +
+ {#if heatmap === null} +
{m.stats_loading()}
+ {:else} + +
+
+ + +
+ + {selectedYear} + +
+ + + { tooltip = null; }} + role="img" + aria-label="Annual activity heatmap" + > + + {#each months as mo} + {mo.label} + {/each} + + + {#each Object.entries(ROW_LABELS) as [rowIdx, rowLabel]} + {rowLabel} + {/each} + + + {#each grid as col, w} + {#each col as cell, d} + {@const cx = LEFT_OFFSET + w * STRIDE} + {@const cy = MONTH_LABEL_H + d * STRIDE} + showTooltip(e, cell)} + onmouseleave={() => { tooltip = null; }} + /> + {/each} + {/each} + + + {#if tooltip} + {@const tw = tooltip.text.length * 6.5 + 16} + {@const tx = Math.min(tooltip.x - tw / 2, SVG_W - tw - 4)} + + + {tooltip.text} + + {/if} + + + +
+ {m.stats_legend_less()} + {#each [0, 1, 2, 3] as lvl} +
+ {/each} + {m.stats_legend_more()} +
+
+
+ + +
+
+ {m.stats_total_rounds()} + {heatmap.total_rounds.toLocaleString()} +
+
+
+ {m.stats_focus_hours()} + {fmtHours(heatmap.total_hours)} +
+
+
+ {m.stats_best_streak()} + + {heatmap.longest_streak > 0 ? heatmap.longest_streak : '—'} + {#if heatmap.longest_streak > 0} + {m.stats_days()} + {/if} + +
+
+ + {#if !hasData} +
{m.stats_empty_history()}
+ {/if} + {/if} +
+ + diff --git a/src/lib/ipc/index.ts b/src/lib/ipc/index.ts new file mode 100644 index 0000000..d9f153e --- /dev/null +++ b/src/lib/ipc/index.ts @@ -0,0 +1,110 @@ +// Typed wrappers around Tauri invoke() and listen(). +// All backend communication goes through this module. + +import { invoke } from '@tauri-apps/api/core'; +import { listen, type UnlistenFn } from '@tauri-apps/api/event'; +import { open as dialogOpen } from '@tauri-apps/plugin-dialog'; +import type { TimerState, Settings, Theme, CustomAudioInfo, DetailedStats, HeatmapStats } from '$lib/types'; + +// --- Timer commands --- + +export const timerToggle = () => invoke('timer_toggle'); +export const timerReset = () => invoke('timer_reset'); +export const timerRestartRound = () => invoke('timer_restart_round'); +export const timerSkip = () => invoke('timer_skip'); +export const getTimerState = () => invoke('timer_get_state'); + +// --- Settings commands --- + +export const getSettings = () => invoke('settings_get'); +/** Save a single setting key/value pair and receive the full updated settings. */ +export const setSetting = (key: string, value: string) => + invoke('settings_set', { key, value }); +export const resetSettings = () => invoke('settings_reset_defaults'); +export const reloadShortcuts = () => invoke('shortcuts_reload'); + +// --- Theme commands --- + +export const getThemes = () => invoke('themes_list'); + +// --- Notification commands --- + +export const notificationShow = (title: string, body: string) => + invoke('notification_show', { title, body }); + +// --- Window commands --- + +export const setWindowVisibility = (visible: boolean) => + invoke('window_set_visibility', { visible }); + +// --- Audio commands --- + +export const getCustomAudioInfo = () => + invoke('audio_get_custom_info'); + +/** Copy `srcPath` to the config dir for `cue`; returns the display name. */ +export const setCustomAudio = (cue: string, srcPath: string) => + invoke('audio_set_custom', { cue, srcPath }); + +/** Delete the custom file for `cue` and revert to the built-in sound. */ +export const clearCustomAudio = (cue: string) => + invoke('audio_clear_custom', { cue }); + +/** Open a native file picker filtered to audio formats. Returns a path or null. */ +export const openAudioFilePicker = (): Promise => + dialogOpen({ + multiple: false, + filters: [{ name: 'Audio', extensions: ['mp3', 'wav', 'ogg', 'flac'] }], + }) as Promise; + +// --- Diagnostic log commands --- + +/** Open the application log directory in the OS file manager. */ +export const openLogDir = () => invoke('open_log_dir'); + +/** Return the resolved log directory path as a string. */ +export const getLogDir = () => invoke('get_log_dir'); + +/** Return the compile-time build version string (e.g. `1.0.0-dev.80+20b2d87`). */ +export const appVersion = () => invoke('app_version'); + +// --- Stats commands --- + +/** Daily + weekly data + streak in one call (Today and This Week tabs). */ +export const statsGetDetailed = () => invoke('stats_get_detailed'); + +/** Heatmap entries + lifetime totals (All Time tab). */ +export const statsGetHeatmap = () => invoke('stats_get_heatmap'); + +// --- Platform commands --- + +export const accessibilityTrusted = () => invoke('accessibility_trusted'); + +// --- Event listeners --- + +export const onTimerTick = ( + cb: (payload: { elapsed_secs: number; total_secs: number }) => void, +): Promise => + listen<{ elapsed_secs: number; total_secs: number }>('timer:tick', (e) => cb(e.payload)); + +export const onTimerPaused = ( + cb: (payload: { elapsed_secs: number }) => void, +): Promise => + listen<{ elapsed_secs: number }>('timer:paused', (e) => cb(e.payload)); + +export const onTimerResumed = ( + cb: (payload: { elapsed_secs: number }) => void, +): Promise => + listen<{ elapsed_secs: number }>('timer:resumed', (e) => cb(e.payload)); + +export const onRoundChange = (cb: (state: TimerState) => void): Promise => + listen('timer:round-change', (e) => cb(e.payload)); + +export const onTimerReset = (cb: (state: TimerState) => void): Promise => + listen('timer:reset', (e) => cb(e.payload)); + +export const onSettingsChanged = (cb: (settings: Settings) => void): Promise => + listen('settings:changed', (e) => cb(e.payload)); + +export const onThemesChanged = (cb: (themes: Theme[]) => void): Promise => + listen('themes:changed', (e) => cb(e.payload)); diff --git a/src/lib/locale.svelte.ts b/src/lib/locale.svelte.ts new file mode 100644 index 0000000..273419d --- /dev/null +++ b/src/lib/locale.svelte.ts @@ -0,0 +1,26 @@ +import { overwriteGetLocale, baseLocale, locales } from '$paraglide/runtime.js'; +import { resolveLocale } from '$lib/utils/locale'; +import { info } from '@tauri-apps/plugin-log'; + +type SupportedLocale = (typeof locales)[number]; + +// Module-level reactive state (Svelte 5 rune). +// Reading this inside any Svelte template expression — even through a function +// call chain like m.nav_timer() → getLocale() → currentLocale — creates a +// tracked dependency. When currentLocale changes, all those expressions +// automatically re-evaluate without a page reload. +let currentLocale: SupportedLocale = $state(baseLocale as SupportedLocale); + +// Override Paraglide's getLocale so that every m.*() call reads from our +// reactive $state instead of its internal plain-JS variable. +overwriteGetLocale(() => currentLocale); + +/** + * Change the active locale. Call this instead of Paraglide's setLocale. + * Accepts the raw DB value ('auto' | BCP-47 tag) and resolves it. + */ +export function setLocale(language: string): void { + const resolved = resolveLocale(language) as SupportedLocale; + currentLocale = resolved; + info(`[locale] locale set to ${resolved}`).catch(() => {}); +} diff --git a/src/lib/stores/settings.ts b/src/lib/stores/settings.ts new file mode 100644 index 0000000..defc2b0 --- /dev/null +++ b/src/lib/stores/settings.ts @@ -0,0 +1,37 @@ +// Reactive settings store. +// Loaded once on startup from Rust via settings_get; updated on save. + +import { writable } from 'svelte/store'; +import type { Settings } from '$lib/types'; + +const defaults: Settings = { + time_work_secs: 1500, + time_short_break_secs: 300, + time_long_break_secs: 900, + long_break_interval: 4, + auto_start_work: false, + auto_start_break: false, + tray_icon_enabled: false, + min_to_tray: false, + min_to_tray_on_close: false, + notifications_enabled: false, + always_on_top: false, + break_always_on_top: false, + volume: 1.0, + tick_sounds_during_work: false, + tick_sounds_during_break: false, + shortcut_toggle: 'Control+F1', + shortcut_reset: 'Control+F2', + shortcut_skip: 'Control+F3', + shortcut_restart: 'Control+F4', + websocket_enabled: false, + websocket_port: 1314, + theme_mode: 'auto', + theme_light: 'Pomotroid', + theme_dark: 'Pomotroid', + dial_countdown: true, + language: 'auto', + verbose_logging: false, +}; + +export const settings = writable(defaults); diff --git a/src/lib/stores/theme.ts b/src/lib/stores/theme.ts new file mode 100644 index 0000000..183ccd3 --- /dev/null +++ b/src/lib/stores/theme.ts @@ -0,0 +1,13 @@ +// Theme store. +// Applies theme colors to CSS custom properties on :root. + +import type { Theme } from '$lib/types'; + +/** Apply a theme's colors to the document root CSS custom properties. + * Theme keys already include the `--` prefix (e.g. "--color-background"). */ +export function applyTheme(theme: Theme): void { + const root = document.documentElement; + for (const [key, value] of Object.entries(theme.colors)) { + root.style.setProperty(key, value); + } +} diff --git a/src/lib/stores/timer.ts b/src/lib/stores/timer.ts new file mode 100644 index 0000000..b6519b7 --- /dev/null +++ b/src/lib/stores/timer.ts @@ -0,0 +1,17 @@ +// Reactive timer state store. +// Populated by Tauri event listeners (timer:tick, timer:round-change, etc.). + +import { writable } from 'svelte/store'; +import type { TimerState } from '$lib/types'; + +const initial: TimerState = { + round_type: 'work', + elapsed_secs: 0, + total_secs: 25 * 60, + is_running: false, + is_paused: false, + work_round_number: 1, + work_rounds_total: 4, +}; + +export const timerState = writable(initial); diff --git a/src/lib/types.ts b/src/lib/types.ts new file mode 100644 index 0000000..ea9defe --- /dev/null +++ b/src/lib/types.ts @@ -0,0 +1,102 @@ +// Shared TypeScript types mirroring Rust structs (must stay in sync with Rust serde output). + +export type RoundType = 'work' | 'short-break' | 'long-break'; + + +/** Mirrors Rust `TimerSnapshot` — emitted via timer:tick / timer:round-change events + * and returned by the `timer_get_state` IPC command. */ +export interface TimerState { + round_type: RoundType; + elapsed_secs: number; + total_secs: number; + is_running: boolean; + is_paused: boolean; + work_round_number: number; // current work round (1-based) + work_rounds_total: number; // total work rounds before long break +} + +/** Mirrors Rust `Settings` struct returned by `settings_get`. */ +export interface Settings { + time_work_secs: number; + time_short_break_secs: number; + time_long_break_secs: number; + long_break_interval: number; + auto_start_work: boolean; + auto_start_break: boolean; + tray_icon_enabled: boolean; + min_to_tray: boolean; + min_to_tray_on_close: boolean; + notifications_enabled: boolean; + always_on_top: boolean; + break_always_on_top: boolean; + volume: number; // 0.0–1.0 + tick_sounds_during_work: boolean; + tick_sounds_during_break: boolean; + shortcut_toggle: string; + shortcut_reset: string; + shortcut_skip: string; + shortcut_restart: string; + websocket_enabled: boolean; + websocket_port: number; + theme_mode: string; // 'auto' | 'light' | 'dark' + theme_light: string; + theme_dark: string; + dial_countdown: boolean; + language: string; // 'auto' | 'en' | 'es' | 'fr' | 'de' | 'ja' + verbose_logging: boolean; +} + +/** Mirrors Rust `CustomAudioInfo` — null means the built-in sound is active. */ +export interface CustomAudioInfo { + work_alert: string | null; + short_break_alert: string | null; + long_break_alert: string | null; +} + +/** Mirrors Rust `Theme` struct. Color keys include the `--` CSS var prefix. */ +export interface Theme { + name: string; + colors: Record; // keys like "--color-background", "--color-focus-round" + is_custom: boolean; +} + +// --------------------------------------------------------------------------- +// Stats types — mirror Rust structs in commands.rs / queries.rs +// --------------------------------------------------------------------------- + +export interface DailyStats { + rounds: number; + focus_mins: number; + completion_rate: number | null; // null when no sessions started today + by_hour: number[]; // 24 entries, index = hour of day +} + +export interface DayStat { + date: string; // "YYYY-MM-DD" + rounds: number; +} + +export interface HeatmapEntry { + date: string; // "YYYY-MM-DD" + count: number; +} + +export interface StreakInfo { + current: number; + longest: number; +} + +/** Returned by stats_get_detailed — Today + This Week + streak in one call. */ +export interface DetailedStats { + today: DailyStats; + week: DayStat[]; + streak: StreakInfo; +} + +/** Returned by stats_get_heatmap — heatmap entries + lifetime totals. */ +export interface HeatmapStats { + entries: HeatmapEntry[]; + total_rounds: number; + total_hours: number; + longest_streak: number; +} diff --git a/src/lib/utils/locale.ts b/src/lib/utils/locale.ts new file mode 100644 index 0000000..acd6271 --- /dev/null +++ b/src/lib/utils/locale.ts @@ -0,0 +1,32 @@ +// Locale resolution utility. +// Maps the stored `language` setting to a Paraglide locale tag. + +import { locales, baseLocale } from '$paraglide/runtime.js'; + +/** Supported locale tags (matches project.inlang locales). */ +export type SupportedLocale = typeof locales[number]; + +/** + * Resolve the active locale from the stored `language` setting. + * + * - `'auto'` → detect from `navigator.language`, prefix-matching supported locales. + * - Any known locale tag → return as-is. + * - Unknown tag or no match → fallback to `baseLocale` ('en'). + */ +export function resolveLocale(language: string): SupportedLocale { + const tag = language === 'auto' ? navigator.language : language; + return matchLocale(tag); +} + +function matchLocale(tag: string): SupportedLocale { + // Exact match first. + if ((locales as readonly string[]).includes(tag)) { + return tag as SupportedLocale; + } + // Prefix match: 'de-AT' → 'de'. + const prefix = tag.split('-')[0]; + if ((locales as readonly string[]).includes(prefix)) { + return prefix as SupportedLocale; + } + return baseLocale as SupportedLocale; +} diff --git a/src/lib/utils/platform.ts b/src/lib/utils/platform.ts new file mode 100644 index 0000000..7df3383 --- /dev/null +++ b/src/lib/utils/platform.ts @@ -0,0 +1,2 @@ +/** True when running on macOS inside the Tauri desktop app. */ +export const isMac = /Macintosh|Mac OS X/.test(navigator.userAgent); diff --git a/src/lib/utils/theme.ts b/src/lib/utils/theme.ts new file mode 100644 index 0000000..cd9cd52 --- /dev/null +++ b/src/lib/utils/theme.ts @@ -0,0 +1,19 @@ +import type { Settings } from '$lib/types'; + +/** + * Resolve the active theme name from settings and the current OS color scheme. + * + * - `auto` → use `theme_dark` when OS is dark, `theme_light` otherwise + * - `light` → always `theme_light` + * - `dark` → always `theme_dark` + */ +export function resolveThemeName(settings: Settings, osDark: boolean): string { + switch (settings.theme_mode) { + case 'light': + return settings.theme_light; + case 'dark': + return settings.theme_dark; + default: // 'auto' + return osDark ? settings.theme_dark : settings.theme_light; + } +} diff --git a/src/main/index.dev.js b/src/main/index.dev.js deleted file mode 100644 index 0add049..0000000 --- a/src/main/index.dev.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * This file is used specifically and only for development. It installs - * `electron-debug` & `vue-devtools`. There shouldn't be any need to - * modify this file, but it can be used to extend your development - * environment. - */ - -// Install `electron-debug` with `devtron` -require('electron-debug')({ showDevTools: true }) - -// Install `vue-devtools` -require('electron').app.on('ready', () => { - const installExtension = require('electron-devtools-installer') - installExtension - .default(installExtension.VUEJS_DEVTOOLS) - .then(() => {}) - .catch(err => { - console.log('Unable to install `vue-devtools`: \n', err) - }) -}) - -// Require `main` process to boot app -require('./index') diff --git a/src/main/index.js b/src/main/index.js deleted file mode 100644 index b16e9f3..0000000 --- a/src/main/index.js +++ /dev/null @@ -1,250 +0,0 @@ -'use strict' - -import { logger } from './../renderer/utils/logger' -import { createLocalStore } from './../renderer/utils/LocalStore' -import { - app, - globalShortcut, - BrowserWindow, - ipcMain, - Tray, - nativeImage -} from 'electron' -import { init as websocketInit } from './sockets' - -const electron = require('electron') -const path = require('path') -const localStore = createLocalStore() - -/** - * Set `__static` path to static files in production - * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html - */ -if (process.env.NODE_ENV !== 'development') { - global.__static = path.join(__dirname, '/static').replace(/\\/g, '\\\\') -} - -let mainWindow, tray -const winURL = - process.env.NODE_ENV === 'development' - ? 'http://localhost:9080' - : `file://${__dirname}/index.html` - -app.disableHardwareAcceleration() - -app.whenReady().then(() => { - logger.info('app ready') - createWindow() - const minToTray = localStore.get('minToTray') - const alwaysOnTop = localStore.get('alwaysOnTop') - - if (minToTray) { - createTray() - } - - // this must be set after window has been created on ubuntu 18.04 - mainWindow.setAlwaysOnTop(alwaysOnTop) - - // remove menu to stop the window being closed on Ctrl+W. See #121 - mainWindow.setMenu(null) - - // load shortcuts from storage - loadGlobalShortcuts(localStore.get('globalShortcuts')) - - // launch local websocket on port 1314 - websocketInit(1314) -}) - -app.on('window-all-closed', () => { - logger.info('quitting app...') - if (process.platform !== 'darwin') { - app.quit() - } -}) - -app.on('activate', () => { - if (mainWindow === null) { - createWindow() - } -}) - -ipcMain.on('toggle-alwaysOnTop', (event, arg) => { - mainWindow.setAlwaysOnTop(arg) -}) - -let breakAlwaysOnTop - -ipcMain.on('toggle-breakAlwaysOnTop', (event, arg) => { - breakAlwaysOnTop = arg - if (breakAlwaysOnTop === false) { - mainWindow.setAlwaysOnTop(true) - } -}) - -ipcMain.on('onBreak', (event, arg) => { - if (breakAlwaysOnTop === true) { - mainWindow.setAlwaysOnTop(!arg) - } -}) - -ipcMain.on('toggle-minToTray', (event, arg) => { - if (arg) { - createTray() - } else { - tray.destroy() - } -}) - -ipcMain.on('window-close', (event, arg) => { - mainWindow.close() -}) - -ipcMain.on('window-minimize', (event, arg) => { - if (arg) { - mainWindow.hide() - } else { - mainWindow.minimize() - } -}) - -ipcMain.on('tray-icon-update', (event, image) => { - const nativeImg = nativeImage.createFromDataURL(image) - tray.setImage(nativeImg) -}) - -ipcMain.on('reload-global-shortcuts', (event, shortcuts) => { - // reload shortcuts when they are modified. - logger.info('reload global shortcuts') - globalShortcut.unregisterAll() - loadGlobalShortcuts(shortcuts) -}) - -function getNewWindowPosition() { - const windowBounds = mainWindow.getBounds() - const trayBounds = tray.getBounds() - - const electronScreen = electron.screen - const primaryDisplay = electronScreen.getPrimaryDisplay() - - // Center window horizontally below the tray icon - const x = Math.round( - trayBounds.x + trayBounds.width / 2 - windowBounds.width / 2 - ) - - // Position window 4 pixels vertically below the tray icon - // Adjust according if tray is at the bottom - let y = Math.round(trayBounds.y + trayBounds.height + 4) - if (y > primaryDisplay.workAreaSize.height) { - y = trayBounds.y - trayBounds.height - windowBounds.height - } - - return { x: x, y: y } -} - -function toggleWindow() { - if (mainWindow === null) { - createWindow() - } else { - mainWindow.isVisible() ? mainWindow.hide() : mainWindow.show() - } - - if (process.platform === 'darwin') { - const position = getNewWindowPosition() - mainWindow.setPosition(position.x, position.y, false) - } -} - -function createTray() { - const trayIconFile = - process.platform === 'darwin' ? 'icon--macos--tray.png' : 'icon.png' - tray = new Tray(path.join(__static, trayIconFile)) - tray.setToolTip('Pomotroid\nClick to Restore') - const contextMenu = electron.Menu.buildFromTemplate([ - { - label: 'View', - click: function() { - toggleWindow() - } - }, - { - label: 'Exit', - click: function() { - app.isQuiting = true - app.quit() - } - } - ]) - tray.on('click', () => { - toggleWindow() - }) - tray.setContextMenu(contextMenu) -} - -function createWindow() { - const alwaysOnTop = localStore.get('alwaysOnTop') - mainWindow = new BrowserWindow({ - alwaysOnTop, - backgroundColor: '#2F384B', - fullscreenable: false, - frame: false, - icon: - process.platform === 'darwin' - ? path.join(__static, 'icon--macos.png') - : path.join(__static, 'icon.png'), - resizable: false, - useContentSize: true, - width: 360, - height: 478, - webPreferences: { - backgroundThrottling: false, - nodeIntegration: true, - enableRemoteModule: true - } - }) - - mainWindow.loadURL(winURL) - - // send event to renderer on window restore - mainWindow.on('restore', () => { - mainWindow.webContents.send('win-restore') - }) - - // send event to renderer on window show - mainWindow.on('show', () => { - mainWindow.webContents.send('win-show') - }) - - mainWindow.on('closed', () => { - mainWindow = null - }) -} - -function loadGlobalShortcuts(globalShortcuts) { - Object.keys(globalShortcuts).forEach(key => { - logger.info(`Registering shortcut for ${key}: ${globalShortcuts[key]}`) - globalShortcut.register(globalShortcuts[key], () => { - logger.info(`Command received: ${key}`) - mainWindow.webContents.send('event-bus', key) - }) - }) -} - -/** - * Auto Updater - * - * Uncomment the following code below and install `electron-updater` to - * support auto updating. Code Signing with a valid certificate is required. - * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-electron-builder.html#auto-updating - */ - -/* -import { autoUpdater } from 'electron-updater' - -autoUpdater.on('update-downloaded', () => { - autoUpdater.quitAndInstall() -}) - -app.on('ready', () => { - if (process.env.NODE_ENV === 'production') autoUpdater.checkForUpdates() -}) - */ diff --git a/src/main/sockets.js b/src/main/sockets.js deleted file mode 100644 index 4de88f7..0000000 --- a/src/main/sockets.js +++ /dev/null @@ -1,99 +0,0 @@ -import { ipcMain } from 'electron' -import { logger } from './../renderer/utils/logger' -const WebSocket = require('ws') - -let wss -let timerState = 'idle' - -// Events -const GET_STATE = 'getState' -const ROUND_CHANGE = 'roundChange' - -/* Handle a round change from the renderer */ -ipcMain.on(ROUND_CHANGE, (_event, round) => { - timerState = round - - const message = { - event: ROUND_CHANGE, - data: { - state: timerState - } - } - - sendGlobalMessage(message) -}) - -/** - * Handle an incoming websocket message - * @param {WebSocketClient} ws - The client instance - * @param {string} data - The raw data sent to the websocket - */ -export const handleMessage = (ws, data) => { - const parsedData = JSON.parse(data) - - switch (parsedData.event) { - case GET_STATE: - sendMessage(ws, { - event: GET_STATE, - data: { - state: timerState - } - }) - - break - default: - } -} - -/** - * Send a websocket message to every connected client - * @param {Object} data - Data to send to every connected client - */ -export const sendGlobalMessage = data => { - const parsedData = JSON.stringify(data) - - wss.clients.forEach(client => { - if (client.readyState === WebSocket.OPEN) { - client.send(parsedData) - } - }) -} - -/** - * Send a websocket message to an individual client - * @param {WebSocketClient} ws - The client instance - * @param {Object} data - Data to send to the client - */ -export const sendMessage = (ws, data) => { - const parsedData = JSON.stringify(data) - - ws.send(parsedData) -} - -/** - * Initialize a local websocket instance and establish handlers - * @param {Number} port - The port to run the websocket on - */ -export const init = port => { - wss = new WebSocket.Server({ - port - }) - - wss.on('message', data => { - logger.info(`New Websocket Message ${data}`) - }) - - wss.on('error', err => { - logger.error(err) - }) - - wss.on('connection', ws => { - logger.info('New Websocket Connection') - - ws.on('message', data => { - handleMessage(ws, data) - }) - }) - - logger.info(`Initialized local websocket on ${port}`) -} diff --git a/src/messages/de.json b/src/messages/de.json new file mode 100644 index 0000000..c9f5423 --- /dev/null +++ b/src/messages/de.json @@ -0,0 +1,122 @@ +{ + "settings_title": "Einstellungen", + + "nav_timer": "Timer", + "nav_appearance": "Erscheinungsbild", + "nav_notifications": "Benachrichtigungen", + "nav_shortcuts": "Tastenkürzel", + "nav_system": "System", + "nav_about": "Über", + + "round_label_work": "Fokus", + "round_label_short_break": "Kurze Pause", + "round_label_long_break": "Lange Pause", + + "timer_slider_focus": "Fokus", + "timer_slider_short_break": "Kurze Pause", + "timer_slider_long_break": "Lange Pause", + "timer_slider_rounds": "Runden bis zur langen Pause", + "timer_toggle_auto_start_work": "Arbeit automatisch starten", + "timer_toggle_auto_start_work_desc": "Die nächste Arbeitssitzung automatisch starten, wenn eine Pause endet.", + "timer_toggle_auto_start_break": "Pausen automatisch starten", + "timer_toggle_auto_start_break_desc": "Automatisch eine Pause starten, wenn eine Arbeitssitzung endet.", + "timer_toggle_countdown": "Countdown-Zifferblatt", + "timer_toggle_countdown_desc": "Der Bogen beginnt voll und nimmt im Laufe der Zeit ab.", + "timer_reset": "Zurücksetzen", + "timer_reset_defaults": "Auf Standardwerte zurücksetzen", + + "appearance_group_mode": "Modus", + "appearance_mode_auto": "Auto", + "appearance_mode_light": "Hell", + "appearance_mode_dark": "Dunkel", + "appearance_group_light_theme": "Helles Design", + "appearance_group_dark_theme": "Dunkles Design", + "appearance_badge_active": "aktiv", + "appearance_badge_custom": "benutzerdefiniert", + + "notif_group_desktop": "Desktop", + "notif_toggle_desktop": "Desktop-Benachrichtigungen", + "notif_toggle_desktop_desc": "Eine Systembenachrichtigung anzeigen, wenn jede Runde endet.", + "notif_group_volume": "Lautstärke", + "notif_label_volume": "Lautstärke", + "notif_group_tick": "Tickgeräusche", + "notif_toggle_tick_work": "Arbeitssitzungen", + "notif_toggle_tick_work_desc": "Ein Tickgeräusch während der Arbeitssitzungen abspielen.", + "notif_toggle_tick_break": "Pausensitzungen", + "notif_toggle_tick_break_desc": "Ein Tickgeräusch während der Pausensitzungen abspielen.", + "notif_group_alert": "Alarmtöne", + "notif_alert_work": "Arbeitsalarm", + "notif_alert_short_break": "Kurzpausen-Alarm", + "notif_alert_long_break": "Langpausen-Alarm", + "notif_audio_default": "Standard", + "notif_btn_restore": "Wiederherstellen", + "notif_btn_choose": "Datei auswählen", + + "system_group_window": "Fenster", + "system_toggle_aot": "Immer im Vordergrund", + "system_toggle_aot_desc": "Das Timer-Fenster über allen anderen Fenstern halten.", + "system_toggle_break_aot": "Niedrigere Priorität während Pausen", + "system_toggle_break_aot_desc": "Immer im Vordergrund während einer Pause deaktivieren.", + "system_group_tray": "Systemablage", + "system_toggle_show_tray": "Im Systembereich anzeigen", + "system_toggle_show_tray_desc": "Zeigt ein dauerhaftes Symbol im Systembereich an.", + "system_toggle_min_tray": "In Ablage minimieren", + "system_toggle_min_tray_desc": "Fenster beim Minimieren in die Ablage ausblenden.", + "system_toggle_close_tray": "In Ablage schließen", + "system_toggle_close_tray_desc": "In die Ablage ausblenden statt beim Schließen zu beenden.", + "system_group_integrations": "Integrationen", + "system_toggle_websocket": "WebSocket-Server", + "system_toggle_websocket_desc": "Einen lokalen WebSocket-Endpunkt für externe Integrationen bereitstellen (Port {port}).", + "system_label_port": "Port", + "system_group_language": "Sprache", + + "shortcuts_accessibility_notice": "Globale Tastenkürzel erfordern unter macOS Zugriff auf die Bedienungshilfen. Aktiviere Pomotroid unter Systemeinstellungen → Datenschutz & Sicherheit → Bedienungshilfen.", + "shortcuts_accessibility_open": "Systemeinstellungen öffnen", + "shortcuts_note": "Globale Tastenkürzel funktionieren auch, wenn das Fenster nicht fokussiert ist. Klicke auf ein Feld und drücke die gewünschte Tastenkombination, um sie aufzuzeichnen.", + "shortcuts_toggle_timer": "Timer umschalten", + "shortcuts_reset_timer": "Timer zurücksetzen", + "shortcuts_skip_round": "Runde überspringen", + "shortcuts_restart_round": "Runde neu starten", + + "advanced_group_logging": "Protokollierung", + "advanced_toggle_verbose_logging": "Ausführliche Protokollierung", + "advanced_toggle_verbose_logging_desc": "Detaillierte Debug-Protokollierung aktivieren, um Probleme zu diagnostizieren.", + + "about_release_notes": "Versionshinweise", + "about_source_code": "Quellcode & Lizenz", + "about_open_log_folder": "Protokollordner öffnen", + "about_reset_all": "Alle Einstellungen zurücksetzen", + "about_reset_confirm": "Dadurch werden alle Einstellungen auf die Standardwerte zurückgesetzt.", + + "stats_title": "Statistiken", + "stats_tab_today": "Heute", + "stats_tab_week": "Diese Woche", + "stats_tab_alltime": "Gesamt", + "stats_rounds": "Runden", + "stats_focus_time": "Fokuszeit", + "stats_completion": "Abschlussrate", + "stats_sessions_by_hour": "Sitzungen nach Stunde", + "stats_no_sessions_today": "Heute keine Sitzungen", + "stats_this_week": "Diese Woche", + "stats_current_streak": "Aktuelle Serie", + "stats_no_sessions_week": "Keine Sitzungen diese Woche", + "stats_no_active_streak": "Keine aktive Serie", + "stats_day": "Tag", + "stats_days": "Tage", + "stats_total_rounds": "Runden gesamt", + "stats_focus_hours": "Fokusstunden", + "stats_best_streak": "Beste Serie", + "stats_legend_less": "Weniger", + "stats_legend_more": "Mehr", + "stats_loading": "Lade\u2026", + "stats_empty_history": "Schlie\u00dfe deine erste Sitzung ab, um deine Historie zu sehen", + "stats_prev_year": "Vorheriges Jahr", + "stats_next_year": "N\u00e4chstes Jahr", + + "notification_work_title": "Pause vorbei — Zeit zum Fokussieren!", + "notification_work_body": "Zeit, wieder an die Arbeit zu gehen. Du schaffst das!", + "notification_short_break_title": "Arbeitsrunde abgeschlossen!", + "notification_short_break_body": "Mach eine kurze Pause. Strecken, atmen, entspannen.", + "notification_long_break_title": "Arbeitssitzung beendet!", + "notification_long_break_body": "Du hast dir eine lange Pause verdient. Geh weg und tanke neue Energie." +} diff --git a/src/messages/en.json b/src/messages/en.json new file mode 100644 index 0000000..cd74276 --- /dev/null +++ b/src/messages/en.json @@ -0,0 +1,122 @@ +{ + "settings_title": "Settings", + + "nav_timer": "Timer", + "nav_appearance": "Appearance", + "nav_notifications": "Notifications", + "nav_shortcuts": "Shortcuts", + "nav_system": "System", + "nav_about": "About", + + "round_label_work": "Focus", + "round_label_short_break": "Short Break", + "round_label_long_break": "Long Break", + + "timer_slider_focus": "Focus", + "timer_slider_short_break": "Short Break", + "timer_slider_long_break": "Long Break", + "timer_slider_rounds": "Rounds until Long Break", + "timer_toggle_auto_start_work": "Auto-start Work", + "timer_toggle_auto_start_work_desc": "Automatically begin the next work session after a break ends.", + "timer_toggle_auto_start_break": "Auto-start Breaks", + "timer_toggle_auto_start_break_desc": "Automatically begin a break when a work session ends.", + "timer_toggle_countdown": "Countdown Dial", + "timer_toggle_countdown_desc": "Arc starts full and subtracts as time passes.", + "timer_reset": "Reset", + "timer_reset_defaults": "Reset to Defaults", + + "appearance_group_mode": "Mode", + "appearance_mode_auto": "Auto", + "appearance_mode_light": "Light", + "appearance_mode_dark": "Dark", + "appearance_group_light_theme": "Light Theme", + "appearance_group_dark_theme": "Dark Theme", + "appearance_badge_active": "active", + "appearance_badge_custom": "custom", + + "notif_group_desktop": "Desktop", + "notif_toggle_desktop": "Desktop Notifications", + "notif_toggle_desktop_desc": "Show a system notification when each round ends.", + "notif_group_volume": "Volume", + "notif_label_volume": "Volume", + "notif_group_tick": "Tick Sounds", + "notif_toggle_tick_work": "Work Sessions", + "notif_toggle_tick_work_desc": "Play a ticking sound during work sessions.", + "notif_toggle_tick_break": "Break Sessions", + "notif_toggle_tick_break_desc": "Play a ticking sound during break sessions.", + "notif_group_alert": "Alert Sounds", + "notif_alert_work": "Work Alert", + "notif_alert_short_break": "Short Break Alert", + "notif_alert_long_break": "Long Break Alert", + "notif_audio_default": "Default", + "notif_btn_restore": "Restore", + "notif_btn_choose": "Choose File", + + "system_group_window": "Window", + "system_toggle_aot": "Always on Top", + "system_toggle_aot_desc": "Keep the timer window above all other windows.", + "system_toggle_break_aot": "Lower Priority During Breaks", + "system_toggle_break_aot_desc": "Disable always-on-top while a break is running.", + "system_group_tray": "System Tray", + "system_toggle_show_tray": "Show in System Tray", + "system_toggle_show_tray_desc": "Display a persistent icon in the system tray.", + "system_toggle_min_tray": "Minimize to Tray", + "system_toggle_min_tray_desc": "Hide the window to the tray when minimized.", + "system_toggle_close_tray": "Close to Tray", + "system_toggle_close_tray_desc": "Hide to the tray instead of quitting when the window is closed.", + "system_group_integrations": "Integrations", + "system_toggle_websocket": "WebSocket Server", + "system_toggle_websocket_desc": "Expose a local WebSocket endpoint for external integrations (port {port}).", + "system_label_port": "Port", + "system_group_language": "Language", + + "shortcuts_accessibility_notice": "Global shortcuts require Accessibility access on macOS. Enable Pomotroid in System Settings → Privacy & Security → Accessibility.", + "shortcuts_accessibility_open": "Open System Settings", + "shortcuts_note": "Global shortcuts work even when the window is not focused. Click a field and press your desired key combination to record it.", + "shortcuts_toggle_timer": "Toggle Timer", + "shortcuts_reset_timer": "Reset Timer", + "shortcuts_skip_round": "Skip Round", + "shortcuts_restart_round": "Restart Round", + + "advanced_group_logging": "Logging", + "advanced_toggle_verbose_logging": "Verbose Logging", + "advanced_toggle_verbose_logging_desc": "Enable detailed debug logging to help diagnose issues.", + + "about_release_notes": "Release Notes", + "about_source_code": "Source Code & License", + "about_open_log_folder": "Open Log Folder", + "about_reset_all": "Reset All Settings", + "about_reset_confirm": "This will reset all settings to defaults.", + + "stats_title": "Statistics", + "stats_tab_today": "Today", + "stats_tab_week": "This Week", + "stats_tab_alltime": "All Time", + "stats_rounds": "Rounds", + "stats_focus_time": "Focus Time", + "stats_completion": "Completion", + "stats_sessions_by_hour": "Sessions by Hour", + "stats_no_sessions_today": "No sessions recorded today", + "stats_this_week": "This Week", + "stats_current_streak": "Current Streak", + "stats_no_sessions_week": "No sessions this week", + "stats_no_active_streak": "No active streak", + "stats_day": "day", + "stats_days": "days", + "stats_total_rounds": "Total Rounds", + "stats_focus_hours": "Focus Hours", + "stats_best_streak": "Best Streak", + "stats_legend_less": "Less", + "stats_legend_more": "More", + "stats_loading": "Loading\u2026", + "stats_empty_history": "Complete your first session to see your history", + "stats_prev_year": "Previous year", + "stats_next_year": "Next year", + + "notification_work_title": "Break over — focus time!", + "notification_work_body": "Time to get back to work. You've got this!", + "notification_short_break_title": "Work round complete!", + "notification_short_break_body": "Take a short break. Stretch, breathe, relax.", + "notification_long_break_title": "Work session done!", + "notification_long_break_body": "You've earned a long break. Step away and recharge." +} diff --git a/src/messages/es.json b/src/messages/es.json new file mode 100644 index 0000000..6f8aec5 --- /dev/null +++ b/src/messages/es.json @@ -0,0 +1,122 @@ +{ + "settings_title": "Configuración", + + "nav_timer": "Temporizador", + "nav_appearance": "Apariencia", + "nav_notifications": "Notificaciones", + "nav_shortcuts": "Atajos", + "nav_system": "Sistema", + "nav_about": "Acerca de", + + "round_label_work": "Enfoque", + "round_label_short_break": "Pausa corta", + "round_label_long_break": "Pausa larga", + + "timer_slider_focus": "Enfoque", + "timer_slider_short_break": "Pausa corta", + "timer_slider_long_break": "Pausa larga", + "timer_slider_rounds": "Rondas hasta la pausa larga", + "timer_toggle_auto_start_work": "Iniciar trabajo automáticamente", + "timer_toggle_auto_start_work_desc": "Comenzar automáticamente la siguiente sesión de trabajo cuando termine un descanso.", + "timer_toggle_auto_start_break": "Iniciar descansos automáticamente", + "timer_toggle_auto_start_break_desc": "Comenzar automáticamente un descanso cuando termine una sesión de trabajo.", + "timer_toggle_countdown": "Dial de cuenta regresiva", + "timer_toggle_countdown_desc": "El arco comienza lleno y se reduce a medida que pasa el tiempo.", + "timer_reset": "Restablecer", + "timer_reset_defaults": "Restablecer valores predeterminados", + + "appearance_group_mode": "Modo", + "appearance_mode_auto": "Auto", + "appearance_mode_light": "Claro", + "appearance_mode_dark": "Oscuro", + "appearance_group_light_theme": "Tema claro", + "appearance_group_dark_theme": "Tema oscuro", + "appearance_badge_active": "activo", + "appearance_badge_custom": "personalizado", + + "notif_group_desktop": "Escritorio", + "notif_toggle_desktop": "Notificaciones de escritorio", + "notif_toggle_desktop_desc": "Mostrar una notificación del sistema cuando termine cada ronda.", + "notif_group_volume": "Volumen", + "notif_label_volume": "Volumen", + "notif_group_tick": "Sonidos de tic-tac", + "notif_toggle_tick_work": "Sesiones de trabajo", + "notif_toggle_tick_work_desc": "Reproducir un sonido de tic-tac durante las sesiones de trabajo.", + "notif_toggle_tick_break": "Sesiones de descanso", + "notif_toggle_tick_break_desc": "Reproducir un sonido de tic-tac durante las sesiones de descanso.", + "notif_group_alert": "Sonidos de alerta", + "notif_alert_work": "Alerta de trabajo", + "notif_alert_short_break": "Alerta de pausa corta", + "notif_alert_long_break": "Alerta de pausa larga", + "notif_audio_default": "Predeterminado", + "notif_btn_restore": "Restaurar", + "notif_btn_choose": "Elegir archivo", + + "system_group_window": "Ventana", + "system_toggle_aot": "Siempre encima", + "system_toggle_aot_desc": "Mantener la ventana del temporizador sobre todas las demás ventanas.", + "system_toggle_break_aot": "Menor prioridad durante los descansos", + "system_toggle_break_aot_desc": "Desactivar siempre encima mientras se ejecuta un descanso.", + "system_group_tray": "Bandeja del sistema", + "system_toggle_show_tray": "Mostrar en la bandeja del sistema", + "system_toggle_show_tray_desc": "Muestra un icono permanente en la bandeja del sistema.", + "system_toggle_min_tray": "Minimizar a la bandeja", + "system_toggle_min_tray_desc": "Ocultar la ventana en la bandeja al minimizar.", + "system_toggle_close_tray": "Cerrar a la bandeja", + "system_toggle_close_tray_desc": "Ocultar a la bandeja en lugar de salir cuando se cierra la ventana.", + "system_group_integrations": "Integraciones", + "system_toggle_websocket": "Servidor WebSocket", + "system_toggle_websocket_desc": "Exponer un endpoint WebSocket local para integraciones externas (puerto {port}).", + "system_label_port": "Puerto", + "system_group_language": "Idioma", + + "shortcuts_accessibility_notice": "Los atajos globales requieren acceso de Accesibilidad en macOS. Habilita Pomotroid en Configuración del Sistema → Privacidad y Seguridad → Accesibilidad.", + "shortcuts_accessibility_open": "Abrir Configuración del Sistema", + "shortcuts_note": "Los atajos globales funcionan incluso cuando la ventana no está enfocada. Haz clic en un campo y presiona la combinación de teclas deseada para registrarla.", + "shortcuts_toggle_timer": "Activar/Pausar temporizador", + "shortcuts_reset_timer": "Reiniciar temporizador", + "shortcuts_skip_round": "Saltar ronda", + "shortcuts_restart_round": "Reiniciar ronda", + + "advanced_group_logging": "Registro", + "advanced_toggle_verbose_logging": "Registro detallado", + "advanced_toggle_verbose_logging_desc": "Habilitar el registro de depuración detallado para ayudar a diagnosticar problemas.", + + "about_release_notes": "Notas de la versión", + "about_source_code": "Código fuente y licencia", + "about_open_log_folder": "Abrir carpeta de registros", + "about_reset_all": "Restablecer toda la configuración", + "about_reset_confirm": "Esto restablecerá toda la configuración a los valores predeterminados.", + + "stats_title": "Estad\u00edsticas", + "stats_tab_today": "Hoy", + "stats_tab_week": "Esta semana", + "stats_tab_alltime": "Total", + "stats_rounds": "Rondas", + "stats_focus_time": "Tiempo de enfoque", + "stats_completion": "Completadas", + "stats_sessions_by_hour": "Sesiones por hora", + "stats_no_sessions_today": "Sin sesiones hoy", + "stats_this_week": "Esta semana", + "stats_current_streak": "Racha actual", + "stats_no_sessions_week": "Sin sesiones esta semana", + "stats_no_active_streak": "Sin racha activa", + "stats_day": "d\u00eda", + "stats_days": "d\u00edas", + "stats_total_rounds": "Rondas totales", + "stats_focus_hours": "Horas de enfoque", + "stats_best_streak": "Mejor racha", + "stats_legend_less": "Menos", + "stats_legend_more": "M\u00e1s", + "stats_loading": "Cargando\u2026", + "stats_empty_history": "Completa tu primera sesi\u00f3n para ver tu historial", + "stats_prev_year": "A\u00f1o anterior", + "stats_next_year": "A\u00f1o siguiente", + + "notification_work_title": "¡Descanso terminado — hora de enfocarse!", + "notification_work_body": "Es hora de volver al trabajo. ¡Tú puedes!", + "notification_short_break_title": "¡Ronda de trabajo completada!", + "notification_short_break_body": "Tómate un descanso corto. Estírate, respira, relájate.", + "notification_long_break_title": "¡Sesión de trabajo terminada!", + "notification_long_break_body": "Te has ganado un descanso largo. Aléjate y recarga energías." +} diff --git a/src/messages/fr.json b/src/messages/fr.json new file mode 100644 index 0000000..0361cf0 --- /dev/null +++ b/src/messages/fr.json @@ -0,0 +1,122 @@ +{ + "settings_title": "Paramètres", + + "nav_timer": "Minuteur", + "nav_appearance": "Apparence", + "nav_notifications": "Notifications", + "nav_shortcuts": "Raccourcis", + "nav_system": "Système", + "nav_about": "À propos", + + "round_label_work": "Concentration", + "round_label_short_break": "Pause courte", + "round_label_long_break": "Pause longue", + + "timer_slider_focus": "Concentration", + "timer_slider_short_break": "Pause courte", + "timer_slider_long_break": "Pause longue", + "timer_slider_rounds": "Tours avant la pause longue", + "timer_toggle_auto_start_work": "Démarrage automatique du travail", + "timer_toggle_auto_start_work_desc": "Commencer automatiquement la prochaine session de travail après une pause.", + "timer_toggle_auto_start_break": "Démarrage automatique des pauses", + "timer_toggle_auto_start_break_desc": "Commencer automatiquement une pause lorsqu'une session de travail se termine.", + "timer_toggle_countdown": "Cadran à rebours", + "timer_toggle_countdown_desc": "L'arc commence plein et se réduit au fil du temps.", + "timer_reset": "Réinitialiser", + "timer_reset_defaults": "Rétablir les paramètres par défaut", + + "appearance_group_mode": "Mode", + "appearance_mode_auto": "Auto", + "appearance_mode_light": "Clair", + "appearance_mode_dark": "Sombre", + "appearance_group_light_theme": "Thème clair", + "appearance_group_dark_theme": "Thème sombre", + "appearance_badge_active": "actif", + "appearance_badge_custom": "personnalisé", + + "notif_group_desktop": "Bureau", + "notif_toggle_desktop": "Notifications du bureau", + "notif_toggle_desktop_desc": "Afficher une notification système à la fin de chaque tour.", + "notif_group_volume": "Volume", + "notif_label_volume": "Volume", + "notif_group_tick": "Sons de tic-tac", + "notif_toggle_tick_work": "Sessions de travail", + "notif_toggle_tick_work_desc": "Jouer un son de tic-tac pendant les sessions de travail.", + "notif_toggle_tick_break": "Sessions de pause", + "notif_toggle_tick_break_desc": "Jouer un son de tic-tac pendant les sessions de pause.", + "notif_group_alert": "Sons d'alerte", + "notif_alert_work": "Alerte travail", + "notif_alert_short_break": "Alerte pause courte", + "notif_alert_long_break": "Alerte pause longue", + "notif_audio_default": "Par défaut", + "notif_btn_restore": "Restaurer", + "notif_btn_choose": "Choisir un fichier", + + "system_group_window": "Fenêtre", + "system_toggle_aot": "Toujours au premier plan", + "system_toggle_aot_desc": "Garder la fenêtre du minuteur au-dessus de toutes les autres fenêtres.", + "system_toggle_break_aot": "Priorité réduite pendant les pauses", + "system_toggle_break_aot_desc": "Désactiver toujours au premier plan pendant une pause.", + "system_group_tray": "Barre des tâches", + "system_toggle_show_tray": "Afficher dans la barre des tâches", + "system_toggle_show_tray_desc": "Affiche une icône permanente dans la barre des tâches.", + "system_toggle_min_tray": "Réduire dans la barre des tâches", + "system_toggle_min_tray_desc": "Masquer la fenêtre dans la barre lors de la réduction.", + "system_toggle_close_tray": "Fermer dans la barre des tâches", + "system_toggle_close_tray_desc": "Se masquer dans la barre plutôt que de quitter lors de la fermeture.", + "system_group_integrations": "Intégrations", + "system_toggle_websocket": "Serveur WebSocket", + "system_toggle_websocket_desc": "Exposer un endpoint WebSocket local pour les intégrations externes (port {port}).", + "system_label_port": "Port", + "system_group_language": "Langue", + + "shortcuts_accessibility_notice": "Les raccourcis globaux nécessitent l'accès à l'Accessibilité sur macOS. Activez Pomotroid dans Réglages Système → Confidentialité et sécurité → Accessibilité.", + "shortcuts_accessibility_open": "Ouvrir les Réglages Système", + "shortcuts_note": "Les raccourcis globaux fonctionnent même lorsque la fenêtre n'est pas active. Cliquez sur un champ et appuyez sur la combinaison de touches souhaitée pour l'enregistrer.", + "shortcuts_toggle_timer": "Basculer le minuteur", + "shortcuts_reset_timer": "Réinitialiser le minuteur", + "shortcuts_skip_round": "Passer le tour", + "shortcuts_restart_round": "Redémarrer le tour", + + "advanced_group_logging": "Journalisation", + "advanced_toggle_verbose_logging": "Journalisation détaillée", + "advanced_toggle_verbose_logging_desc": "Activer la journalisation de débogage détaillée pour aider à diagnostiquer les problèmes.", + + "about_release_notes": "Notes de version", + "about_source_code": "Code source et licence", + "about_open_log_folder": "Ouvrir le dossier de journaux", + "about_reset_all": "Réinitialiser tous les paramètres", + "about_reset_confirm": "Cela réinitialisera tous les paramètres aux valeurs par défaut.", + + "stats_title": "Statistiques", + "stats_tab_today": "Aujourd'hui", + "stats_tab_week": "Cette semaine", + "stats_tab_alltime": "Total", + "stats_rounds": "Rondes", + "stats_focus_time": "Temps de focus", + "stats_completion": "Compl\u00e9tion", + "stats_sessions_by_hour": "Sessions par heure", + "stats_no_sessions_today": "Aucune session aujourd'hui", + "stats_this_week": "Cette semaine", + "stats_current_streak": "S\u00e9rie en cours", + "stats_no_sessions_week": "Aucune session cette semaine", + "stats_no_active_streak": "Aucune s\u00e9rie active", + "stats_day": "jour", + "stats_days": "jours", + "stats_total_rounds": "Rondes totales", + "stats_focus_hours": "Heures de focus", + "stats_best_streak": "Meilleure s\u00e9rie", + "stats_legend_less": "Moins", + "stats_legend_more": "Plus", + "stats_loading": "Chargement\u2026", + "stats_empty_history": "Terminez votre premi\u00e8re session pour voir votre historique", + "stats_prev_year": "Ann\u00e9e pr\u00e9c\u00e9dente", + "stats_next_year": "Ann\u00e9e suivante", + + "notification_work_title": "Pause terminée — au travail !", + "notification_work_body": "Il est temps de se remettre au travail. Vous pouvez le faire !", + "notification_short_break_title": "Tour de travail terminé !", + "notification_short_break_body": "Prenez une courte pause. Étirez-vous, respirez, détendez-vous.", + "notification_long_break_title": "Session de travail terminée !", + "notification_long_break_body": "Vous méritez une longue pause. Éloignez-vous et rechargez les batteries." +} diff --git a/src/messages/ja.json b/src/messages/ja.json new file mode 100644 index 0000000..d0f582d --- /dev/null +++ b/src/messages/ja.json @@ -0,0 +1,122 @@ +{ + "settings_title": "設定", + + "nav_timer": "タイマー", + "nav_appearance": "外観", + "nav_notifications": "通知", + "nav_shortcuts": "ショートカット", + "nav_system": "システム", + "nav_about": "このアプリについて", + + "round_label_work": "集中", + "round_label_short_break": "短い休憩", + "round_label_long_break": "長い休憩", + + "timer_slider_focus": "集中", + "timer_slider_short_break": "短い休憩", + "timer_slider_long_break": "長い休憩", + "timer_slider_rounds": "長い休憩までのラウンド数", + "timer_toggle_auto_start_work": "作業を自動開始", + "timer_toggle_auto_start_work_desc": "休憩が終わったら次の作業セッションを自動的に開始します。", + "timer_toggle_auto_start_break": "休憩を自動開始", + "timer_toggle_auto_start_break_desc": "作業セッションが終わったら休憩を自動的に開始します。", + "timer_toggle_countdown": "カウントダウンダイヤル", + "timer_toggle_countdown_desc": "アークが満タンから始まり、時間の経過とともに減少します。", + "timer_reset": "リセット", + "timer_reset_defaults": "デフォルトにリセット", + + "appearance_group_mode": "モード", + "appearance_mode_auto": "自動", + "appearance_mode_light": "ライト", + "appearance_mode_dark": "ダーク", + "appearance_group_light_theme": "ライトテーマ", + "appearance_group_dark_theme": "ダークテーマ", + "appearance_badge_active": "アクティブ", + "appearance_badge_custom": "カスタム", + + "notif_group_desktop": "デスクトップ", + "notif_toggle_desktop": "デスクトップ通知", + "notif_toggle_desktop_desc": "各ラウンドが終了したときにシステム通知を表示します。", + "notif_group_volume": "音量", + "notif_label_volume": "音量", + "notif_group_tick": "チクタク音", + "notif_toggle_tick_work": "作業セッション", + "notif_toggle_tick_work_desc": "作業セッション中にチクタク音を再生します。", + "notif_toggle_tick_break": "休憩セッション", + "notif_toggle_tick_break_desc": "休憩セッション中にチクタク音を再生します。", + "notif_group_alert": "アラート音", + "notif_alert_work": "作業アラート", + "notif_alert_short_break": "短い休憩アラート", + "notif_alert_long_break": "長い休憩アラート", + "notif_audio_default": "デフォルト", + "notif_btn_restore": "復元", + "notif_btn_choose": "ファイルを選択", + + "system_group_window": "ウィンドウ", + "system_toggle_aot": "常に前面に表示", + "system_toggle_aot_desc": "タイマーウィンドウを他のすべてのウィンドウの上に保持します。", + "system_toggle_break_aot": "休憩中は優先度を下げる", + "system_toggle_break_aot_desc": "休憩中は常に前面に表示を無効にします。", + "system_group_tray": "システムトレイ", + "system_toggle_show_tray": "システムトレイに表示", + "system_toggle_show_tray_desc": "システムトレイに常時アイコンを表示します。", + "system_toggle_min_tray": "トレイに最小化", + "system_toggle_min_tray_desc": "最小化時にウィンドウをトレイに隠します。", + "system_toggle_close_tray": "トレイに閉じる", + "system_toggle_close_tray_desc": "ウィンドウを閉じるときに終了せずにトレイに隠します。", + "system_group_integrations": "統合", + "system_toggle_websocket": "WebSocketサーバー", + "system_toggle_websocket_desc": "外部連携用のローカルWebSocketエンドポイントを公開します(ポート {port})。", + "system_label_port": "ポート", + "system_group_language": "言語", + + "shortcuts_accessibility_notice": "macOSでグローバルショートカットを使用するには、アクセシビリティのアクセス許可が必要です。システム設定 → プライバシーとセキュリティ → アクセシビリティでPomotroidを有効にしてください。", + "shortcuts_accessibility_open": "システム設定を開く", + "shortcuts_note": "グローバルショートカットはウィンドウにフォーカスがない場合でも機能します。フィールドをクリックして、記録したいキーの組み合わせを押してください。", + "shortcuts_toggle_timer": "タイマーの切り替え", + "shortcuts_reset_timer": "タイマーのリセット", + "shortcuts_skip_round": "ラウンドをスキップ", + "shortcuts_restart_round": "ラウンドを再開", + + "advanced_group_logging": "ログ記録", + "advanced_toggle_verbose_logging": "詳細ログ", + "advanced_toggle_verbose_logging_desc": "問題の診断に役立つ詳細なデバッグログを有効にします。", + + "about_release_notes": "リリースノート", + "about_source_code": "ソースコードとライセンス", + "about_open_log_folder": "ログフォルダを開く", + "about_reset_all": "すべての設定をリセット", + "about_reset_confirm": "すべての設定がデフォルト値にリセットされます。", + + "stats_title": "統計", + "stats_tab_today": "今日", + "stats_tab_week": "今週", + "stats_tab_alltime": "通算", + "stats_rounds": "ラウンド", + "stats_focus_time": "集中時間", + "stats_completion": "完了率", + "stats_sessions_by_hour": "時間帯別セッション", + "stats_no_sessions_today": "今日はセッションがありません", + "stats_this_week": "今週", + "stats_current_streak": "現在の連続記録", + "stats_no_sessions_week": "今週はセッションがありません", + "stats_no_active_streak": "連続記録なし", + "stats_day": "日", + "stats_days": "日", + "stats_total_rounds": "合計ラウンド", + "stats_focus_hours": "集中時間(時間)", + "stats_best_streak": "最長連続記録", + "stats_legend_less": "少", + "stats_legend_more": "多", + "stats_loading": "読み込み中…", + "stats_empty_history": "最初のセッションを完了すると履歴が表示されます", + "stats_prev_year": "前の年", + "stats_next_year": "次の年", + + "notification_work_title": "休憩終了 — 集中する時間です!", + "notification_work_body": "仕事に戻る時間です。頑張って!", + "notification_short_break_title": "作業ラウンド完了!", + "notification_short_break_body": "短い休憩を取ってください。ストレッチ、深呼吸、リラックス。", + "notification_long_break_title": "作業セッション完了!", + "notification_long_break_body": "長い休憩を取る資格があります。その場を離れてリフレッシュしてください。" +} diff --git a/src/messages/pt.json b/src/messages/pt.json new file mode 100644 index 0000000..fbd00ed --- /dev/null +++ b/src/messages/pt.json @@ -0,0 +1,122 @@ +{ + "settings_title": "Configurações", + + "nav_timer": "Temporizador", + "nav_appearance": "Aparência", + "nav_notifications": "Notificações", + "nav_shortcuts": "Atalhos", + "nav_system": "Sistema", + "nav_about": "Sobre", + + "round_label_work": "Foco", + "round_label_short_break": "Pausa Curta", + "round_label_long_break": "Pausa Longa", + + "timer_slider_focus": "Foco", + "timer_slider_short_break": "Pausa Curta", + "timer_slider_long_break": "Pausa Longa", + "timer_slider_rounds": "Rodadas até a Pausa Longa", + "timer_toggle_auto_start_work": "Iniciar Trabalho Automaticamente", + "timer_toggle_auto_start_work_desc": "Iniciar automaticamente a próxima sessão de trabalho após o fim de uma pausa.", + "timer_toggle_auto_start_break": "Iniciar Pausas Automaticamente", + "timer_toggle_auto_start_break_desc": "Iniciar automaticamente uma pausa quando uma sessão de trabalho terminar.", + "timer_toggle_countdown": "Mostrador de Contagem Regressiva", + "timer_toggle_countdown_desc": "O arco começa cheio e diminui conforme o tempo passa.", + "timer_reset": "Redefinir", + "timer_reset_defaults": "Redefinir para Padrões", + + "appearance_group_mode": "Modo", + "appearance_mode_auto": "Automático", + "appearance_mode_light": "Claro", + "appearance_mode_dark": "Escuro", + "appearance_group_light_theme": "Tema Claro", + "appearance_group_dark_theme": "Tema Escuro", + "appearance_badge_active": "ativo", + "appearance_badge_custom": "personalizado", + + "notif_group_desktop": "Área de Trabalho", + "notif_toggle_desktop": "Notificações na Área de Trabalho", + "notif_toggle_desktop_desc": "Exibir uma notificação do sistema quando cada rodada terminar.", + "notif_group_volume": "Volume", + "notif_label_volume": "Volume", + "notif_group_tick": "Sons de Tique-Taque", + "notif_toggle_tick_work": "Sessões de Trabalho", + "notif_toggle_tick_work_desc": "Reproduzir um som de tique-taque durante as sessões de trabalho.", + "notif_toggle_tick_break": "Sessões de Pausa", + "notif_toggle_tick_break_desc": "Reproduzir um som de tique-taque durante as sessões de pausa.", + "notif_group_alert": "Sons de Alerta", + "notif_alert_work": "Alerta de Trabalho", + "notif_alert_short_break": "Alerta de Pausa Curta", + "notif_alert_long_break": "Alerta de Pausa Longa", + "notif_audio_default": "Padrão", + "notif_btn_restore": "Restaurar", + "notif_btn_choose": "Escolher Arquivo", + + "system_group_window": "Janela", + "system_toggle_aot": "Sempre Visível", + "system_toggle_aot_desc": "Manter a janela do temporizador acima de todas as outras janelas.", + "system_toggle_break_aot": "Reduzir Prioridade Durante Pausas", + "system_toggle_break_aot_desc": "Desativar sempre visível enquanto uma pausa estiver em andamento.", + "system_group_tray": "Bandeja do Sistema", + "system_toggle_show_tray": "Mostrar na Bandeja do Sistema", + "system_toggle_show_tray_desc": "Exibir um ícone persistente na bandeja do sistema.", + "system_toggle_min_tray": "Minimizar para a Bandeja", + "system_toggle_min_tray_desc": "Ocultar a janela na bandeja ao minimizar.", + "system_toggle_close_tray": "Fechar para a Bandeja", + "system_toggle_close_tray_desc": "Ocultar na bandeja em vez de sair ao fechar a janela.", + "system_group_integrations": "Integrações", + "system_toggle_websocket": "Servidor WebSocket", + "system_toggle_websocket_desc": "Expor um endpoint WebSocket local para integrações externas (porta {port}).", + "system_label_port": "Porta", + "system_group_language": "Idioma", + + "shortcuts_accessibility_notice": "Os atalhos globais requerem acesso de Acessibilidade no macOS. Ative o Pomotroid em Configurações do Sistema → Privacidade e Segurança → Acessibilidade.", + "shortcuts_accessibility_open": "Abrir Configurações do Sistema", + "shortcuts_note": "Os atalhos globais funcionam mesmo quando a janela não está em foco. Clique em um campo e pressione a combinação de teclas desejada para gravá-la.", + "shortcuts_toggle_timer": "Alternar Temporizador", + "shortcuts_reset_timer": "Redefinir Temporizador", + "shortcuts_skip_round": "Pular Rodada", + "shortcuts_restart_round": "Reiniciar Rodada", + + "advanced_group_logging": "Registro", + "advanced_toggle_verbose_logging": "Log Detalhado", + "advanced_toggle_verbose_logging_desc": "Habilitar log de depuração detalhado para ajudar a diagnosticar problemas.", + + "about_release_notes": "Notas de Versão", + "about_source_code": "Código-Fonte e Licença", + "about_open_log_folder": "Abrir Pasta de Logs", + "about_reset_all": "Redefinir Todas as Configurações", + "about_reset_confirm": "Isso redefinirá todas as configurações para os valores padrão.", + + "stats_title": "Estat\u00edsticas", + "stats_tab_today": "Hoje", + "stats_tab_week": "Esta semana", + "stats_tab_alltime": "Total", + "stats_rounds": "Rodadas", + "stats_focus_time": "Tempo de foco", + "stats_completion": "Conclus\u00e3o", + "stats_sessions_by_hour": "Sess\u00f5es por hora", + "stats_no_sessions_today": "Nenhuma sess\u00e3o hoje", + "stats_this_week": "Esta semana", + "stats_current_streak": "Sequ\u00eancia atual", + "stats_no_sessions_week": "Nenhuma sess\u00e3o esta semana", + "stats_no_active_streak": "Sem sequ\u00eancia ativa", + "stats_day": "dia", + "stats_days": "dias", + "stats_total_rounds": "Rodadas totais", + "stats_focus_hours": "Horas de foco", + "stats_best_streak": "Melhor sequ\u00eancia", + "stats_legend_less": "Menos", + "stats_legend_more": "Mais", + "stats_loading": "Carregando\u2026", + "stats_empty_history": "Complete sua primeira sess\u00e3o para ver seu hist\u00f3rico", + "stats_prev_year": "Ano anterior", + "stats_next_year": "Pr\u00f3ximo ano", + + "notification_work_title": "Pausa encerrada — hora de focar!", + "notification_work_body": "Hora de voltar ao trabalho. Você consegue!", + "notification_short_break_title": "Rodada de trabalho concluída!", + "notification_short_break_body": "Faça uma pausa curta. Alongue-se, respire, relaxe.", + "notification_long_break_title": "Sessão de trabalho concluída!", + "notification_long_break_body": "Você merece uma pausa longa. Afaste-se e recarregue as energias." +} diff --git a/src/messages/zh.json b/src/messages/zh.json new file mode 100644 index 0000000..366b691 --- /dev/null +++ b/src/messages/zh.json @@ -0,0 +1,122 @@ +{ + "settings_title": "设置", + + "nav_timer": "计时器", + "nav_appearance": "外观", + "nav_notifications": "通知", + "nav_shortcuts": "快捷键", + "nav_system": "系统", + "nav_about": "关于", + + "round_label_work": "专注", + "round_label_short_break": "短休息", + "round_label_long_break": "长休息", + + "timer_slider_focus": "专注", + "timer_slider_short_break": "短休息", + "timer_slider_long_break": "长休息", + "timer_slider_rounds": "长休息前的轮数", + "timer_toggle_auto_start_work": "自动开始工作", + "timer_toggle_auto_start_work_desc": "休息结束后自动开始下一个工作时段。", + "timer_toggle_auto_start_break": "自动开始休息", + "timer_toggle_auto_start_break_desc": "工作时段结束后自动开始休息。", + "timer_toggle_countdown": "倒计时表盘", + "timer_toggle_countdown_desc": "表盘从满格开始,随时间推移减少。", + "timer_reset": "重置", + "timer_reset_defaults": "恢复默认设置", + + "appearance_group_mode": "模式", + "appearance_mode_auto": "自动", + "appearance_mode_light": "浅色", + "appearance_mode_dark": "深色", + "appearance_group_light_theme": "浅色主题", + "appearance_group_dark_theme": "深色主题", + "appearance_badge_active": "活跃", + "appearance_badge_custom": "自定义", + + "notif_group_desktop": "桌面", + "notif_toggle_desktop": "桌面通知", + "notif_toggle_desktop_desc": "每个轮次结束时显示系统通知。", + "notif_group_volume": "音量", + "notif_label_volume": "音量", + "notif_group_tick": "滴答声", + "notif_toggle_tick_work": "工作时段", + "notif_toggle_tick_work_desc": "工作时段中播放滴答声。", + "notif_toggle_tick_break": "休息时段", + "notif_toggle_tick_break_desc": "休息时段中播放滴答声。", + "notif_group_alert": "提示音", + "notif_alert_work": "工作提示", + "notif_alert_short_break": "短休息提示", + "notif_alert_long_break": "长休息提示", + "notif_audio_default": "默认", + "notif_btn_restore": "恢复", + "notif_btn_choose": "选择文件", + + "system_group_window": "窗口", + "system_toggle_aot": "始终置顶", + "system_toggle_aot_desc": "将计时器窗口保持在所有其他窗口之上。", + "system_toggle_break_aot": "休息期间降低优先级", + "system_toggle_break_aot_desc": "休息进行时禁用始终置顶。", + "system_group_tray": "系统托盘", + "system_toggle_show_tray": "显示在系统托盘", + "system_toggle_show_tray_desc": "在系统托盘中显示持久图标。", + "system_toggle_min_tray": "最小化到托盘", + "system_toggle_min_tray_desc": "最小化时将窗口隐藏到托盘。", + "system_toggle_close_tray": "关闭到托盘", + "system_toggle_close_tray_desc": "关闭窗口时隐藏到托盘而不退出。", + "system_group_integrations": "集成", + "system_toggle_websocket": "WebSocket 服务器", + "system_toggle_websocket_desc": "为外部集成公开本地 WebSocket 端点(端口 {port})。", + "system_label_port": "端口", + "system_group_language": "语言", + + "shortcuts_accessibility_notice": "在 macOS 上使用全局快捷键需要辅助功能权限。请在系统设置 → 隐私与安全性 → 辅助功能中启用 Pomotroid。", + "shortcuts_accessibility_open": "打开系统设置", + "shortcuts_note": "全局快捷键即使窗口未聚焦也能使用。点击字段并按下所需的按键组合进行录制。", + "shortcuts_toggle_timer": "切换计时器", + "shortcuts_reset_timer": "重置计时器", + "shortcuts_skip_round": "跳过轮次", + "shortcuts_restart_round": "重新开始轮次", + + "advanced_group_logging": "日志记录", + "advanced_toggle_verbose_logging": "详细日志", + "advanced_toggle_verbose_logging_desc": "启用详细调试日志以帮助诊断问题。", + + "about_release_notes": "发行说明", + "about_source_code": "源代码与许可证", + "about_open_log_folder": "打开日志文件夹", + "about_reset_all": "重置所有设置", + "about_reset_confirm": "这将把所有设置重置为默认值。", + + "stats_title": "统计", + "stats_tab_today": "今天", + "stats_tab_week": "本周", + "stats_tab_alltime": "总计", + "stats_rounds": "番茄钟数", + "stats_focus_time": "专注时间", + "stats_completion": "完成率", + "stats_sessions_by_hour": "每小时会话", + "stats_no_sessions_today": "今天没有会话", + "stats_this_week": "本周", + "stats_current_streak": "当前连续", + "stats_no_sessions_week": "本周没有会话", + "stats_no_active_streak": "无连续记录", + "stats_day": "天", + "stats_days": "天", + "stats_total_rounds": "总番茄钟数", + "stats_focus_hours": "专注小时数", + "stats_best_streak": "最长连续", + "stats_legend_less": "少", + "stats_legend_more": "多", + "stats_loading": "加载中…", + "stats_empty_history": "完成第一个会话后即可查看历史记录", + "stats_prev_year": "上一年", + "stats_next_year": "下一年", + + "notification_work_title": "休息结束 — 专注时间到!", + "notification_work_body": "是时候回到工作了。你能做到!", + "notification_short_break_title": "工作轮次完成!", + "notification_short_break_body": "休息一下。伸伸腰、深呼吸、放松。", + "notification_long_break_title": "工作时段完成!", + "notification_long_break_body": "你赢得了一次长休息。离开一下,充充电。" +} diff --git a/src/renderer/App.vue b/src/renderer/App.vue deleted file mode 100644 index a4ccf9a..0000000 --- a/src/renderer/App.vue +++ /dev/null @@ -1,69 +0,0 @@ - - - - - diff --git a/src/renderer/assets/fonts/Lato-Regular.ttf b/src/renderer/assets/fonts/Lato-Regular.ttf deleted file mode 100644 index 04ea8ef..0000000 Binary files a/src/renderer/assets/fonts/Lato-Regular.ttf and /dev/null differ diff --git a/src/renderer/assets/fonts/RobotoMono-Light.ttf b/src/renderer/assets/fonts/RobotoMono-Light.ttf deleted file mode 100644 index 63229b2..0000000 Binary files a/src/renderer/assets/fonts/RobotoMono-Light.ttf and /dev/null differ diff --git a/src/renderer/assets/stylesheets/_animations.scss b/src/renderer/assets/stylesheets/_animations.scss deleted file mode 100644 index 0043bc6..0000000 --- a/src/renderer/assets/stylesheets/_animations.scss +++ /dev/null @@ -1,35 +0,0 @@ -@keyframes fade-in { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - -// vue transitions - -.fade-enter-active, -.fade-leave-active { - transition: $transitionSnappy; -} -.fade-enter, -.fade-leave-to { - opacity: 0; -} - -.slide-left-enter-active, -.slide-left-leave-active { - transition: $transitionSnappy; -} - -.slide-left-enter, -.slide-left-leave-to { - opacity: 0.5; - transform: translateX(-100vw); -} - -.slide-left-enter-to, -.slide-left-leave { - transform: translateX(0); -} diff --git a/src/renderer/assets/stylesheets/_base.scss b/src/renderer/assets/stylesheets/_base.scss deleted file mode 100644 index 169d717..0000000 --- a/src/renderer/assets/stylesheets/_base.scss +++ /dev/null @@ -1,66 +0,0 @@ -body { - background-color: var(--color-background); - color: var(--color-foreground); - cursor: default; - font-family: 'Lato', sans-serif; - margin: 0; - user-select: none; -} - -h1, -p { - margin: 0; - padding: 0; -} - -.Container { - padding: 0 18px; -} - -.Drawer-heading { - font-size: 14px; - letter-spacing: 0.05rem; - padding-top: 10px; - text-align: center; -} - -.Icon-group { - align-items: center; - display: flex; - justify-content: center; -} - -.Icon-wrapper { - align-items: center; - display: flex; - justify-content: center; - width: 20px; - height: 20px; -} - -.Icon-wrapper--double--right { - padding: 18px 18px 18px 9px; -} - -.Icon-wrapper--double--left { - padding: 18px 9px 18px 18px; -} - -.Icon-wrapper--single { - padding: 18px; -} - -.Icon { - -webkit-app-region: no-drag; -} - -.TextButton { - color: var(--color-foreground-darker); - font-size: 14px; - letter-spacing: 0.05em; - margin-top: 12px; - transition: $transitionDefault; - &:hover { - color: var(--color-accent); - } -} diff --git a/src/renderer/assets/stylesheets/_scrollbar.scss b/src/renderer/assets/stylesheets/_scrollbar.scss deleted file mode 100644 index 2942ed7..0000000 --- a/src/renderer/assets/stylesheets/_scrollbar.scss +++ /dev/null @@ -1,11 +0,0 @@ -*::-webkit-scrollbar { - width: 3px; - height: 3px; -} -*::-webkit-scrollbar-track { - background: var(--color-background); -} -*::-webkit-scrollbar-thumb { - background-color: var(--color-background-lightest); - border-radius: 0; -} diff --git a/src/renderer/assets/stylesheets/_slider.scss b/src/renderer/assets/stylesheets/_slider.scss deleted file mode 100644 index 8f61e59..0000000 --- a/src/renderer/assets/stylesheets/_slider.scss +++ /dev/null @@ -1,77 +0,0 @@ -.Slider-wrapper { - position: relative; -} - -.Slider-wrapper--vert { - transform: rotate(-90deg); -} - -.Slider { - position: relative; - width: 100%; - -webkit-appearance: none; - &:focus { - outline: 0; - } - &::-webkit-slider-runnable-track { - background-color: var(--color-background); - width: 100%; - height: 3px; - } - &::-webkit-slider-thumb { - background-color: var(--color-background-lightest); - border: 2px solid var(--color-background-lightest); - border-radius: 100%; - margin-top: -8px; - width: 18px; - height: 18px; - -webkit-appearance: none; - -webkit-app-region: no-drag; - } -} - -.Slider--blue { - &::-webkit-slider-thumb { - background-color: var(--color-long-round); - border: 2px solid var(--color-long-round); - -webkit-app-region: no-drag; - } -} - -.Slider--green { - &::-webkit-slider-thumb { - background-color: var(--color-short-round); - border: 2px solid var(--color-short-round); - -webkit-app-region: no-drag; - } -} - -.Slider--red { - &::-webkit-slider-thumb { - background-color: var(--color-focus-round); - border: 2px solid var(--color-focus-round); - -webkit-app-region: no-drag; - } -} - -.Slider-bar { - position: absolute; - top: calc(50% + 3px); - height: 3px; -} - -.Slider-bar--blue { - background-color: var(--color-long-round); -} - -.Slider-bar--blueGrey { - background-color: var(--color-background-lightest); -} - -.Slider-bar--green { - background-color: var(--color-short-round); -} - -.Slider-bar--red { - background-color: var(--color-focus-round); -} diff --git a/src/renderer/assets/stylesheets/_variables.scss b/src/renderer/assets/stylesheets/_variables.scss deleted file mode 100644 index 8eee717..0000000 --- a/src/renderer/assets/stylesheets/_variables.scss +++ /dev/null @@ -1,36 +0,0 @@ -@font-face { - font-family: 'Lato'; - src: url(~@/assets/fonts/Lato-Regular.ttf); - font-weight: 400; -} - -@font-face { - font-family: 'RobotoMono'; - src: url(~@/assets/fonts/RobotoMono-Light.ttf); - font-weight: 200; -} - -$colorBlue: #0bbddb; -$colorGreen: #05ec8c; -$colorRed: #ff4e4d; -$colorBlueGrey: #858c99; -$colorLightNavy: #3d4457; -$colorNavy: #2f384b; -$colorWhite: #f6f2eb; -$colorBlueGrey--lighter: #c0c9da; -$colorBlueWhite: #dbe1ef; - -$transitionDefault: all 0.3s ease; -$transitionSnappy: all 0.3s cubic-bezier(0.07, 0.95, 0, 1); - -:root { - --color-long-round: #{$colorBlue}; - --color-short-round: #{$colorGreen}; - --color-focus-round: #{$colorRed}; - --color-background: #{$colorNavy}; - --color-background-light: #{$colorLightNavy}; - --color-background-lightest: #{$colorBlueGrey}; - --color-foreground: #{$colorWhite}; - --color-foreground-darker: #{$colorBlueGrey--lighter}; - --color-foreground-darkest: #{$colorBlueWhite}; -} diff --git a/src/renderer/assets/stylesheets/main.scss b/src/renderer/assets/stylesheets/main.scss deleted file mode 100644 index a4158dd..0000000 --- a/src/renderer/assets/stylesheets/main.scss +++ /dev/null @@ -1,5 +0,0 @@ -@import 'variables'; -@import 'animations'; -@import 'scrollbar'; -@import 'slider'; -@import 'base'; diff --git a/src/renderer/components/Audio.vue b/src/renderer/components/Audio.vue deleted file mode 100644 index 560bec9..0000000 --- a/src/renderer/components/Audio.vue +++ /dev/null @@ -1,82 +0,0 @@ - - - diff --git a/src/renderer/components/ShortcutInput.vue b/src/renderer/components/ShortcutInput.vue deleted file mode 100644 index 1e9b518..0000000 --- a/src/renderer/components/ShortcutInput.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - - - diff --git a/src/renderer/components/Titlebar.vue b/src/renderer/components/Titlebar.vue deleted file mode 100644 index 7301a62..0000000 --- a/src/renderer/components/Titlebar.vue +++ /dev/null @@ -1,200 +0,0 @@ - - - - - diff --git a/src/renderer/components/TrayIcon.vue b/src/renderer/components/TrayIcon.vue deleted file mode 100644 index cc045e4..0000000 --- a/src/renderer/components/TrayIcon.vue +++ /dev/null @@ -1,163 +0,0 @@ - - - diff --git a/src/renderer/components/drawer/Drawer-about.vue b/src/renderer/components/drawer/Drawer-about.vue deleted file mode 100644 index 78ba184..0000000 --- a/src/renderer/components/drawer/Drawer-about.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - - diff --git a/src/renderer/components/drawer/Drawer-menu.vue b/src/renderer/components/drawer/Drawer-menu.vue deleted file mode 100644 index 8b12f88..0000000 --- a/src/renderer/components/drawer/Drawer-menu.vue +++ /dev/null @@ -1,195 +0,0 @@ - - - - - diff --git a/src/renderer/components/drawer/Drawer-settings.vue b/src/renderer/components/drawer/Drawer-settings.vue deleted file mode 100644 index 536fa2c..0000000 --- a/src/renderer/components/drawer/Drawer-settings.vue +++ /dev/null @@ -1,296 +0,0 @@ - - - - - diff --git a/src/renderer/components/drawer/Drawer-theme.vue b/src/renderer/components/drawer/Drawer-theme.vue deleted file mode 100644 index f529885..0000000 --- a/src/renderer/components/drawer/Drawer-theme.vue +++ /dev/null @@ -1,95 +0,0 @@ - - - - - diff --git a/src/renderer/components/drawer/Drawer-timer.vue b/src/renderer/components/drawer/Drawer-timer.vue deleted file mode 100644 index 735b983..0000000 --- a/src/renderer/components/drawer/Drawer-timer.vue +++ /dev/null @@ -1,227 +0,0 @@ - - - - - diff --git a/src/renderer/components/drawer/Drawer.vue b/src/renderer/components/drawer/Drawer.vue deleted file mode 100644 index c7e66a0..0000000 --- a/src/renderer/components/drawer/Drawer.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/src/renderer/components/notification/Notification-win.vue b/src/renderer/components/notification/Notification-win.vue deleted file mode 100644 index 0d830d4..0000000 --- a/src/renderer/components/notification/Notification-win.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - diff --git a/src/renderer/components/notification/Notification.vue b/src/renderer/components/notification/Notification.vue deleted file mode 100644 index 2584b2c..0000000 --- a/src/renderer/components/notification/Notification.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - diff --git a/src/renderer/components/timer/Timer-controller.vue b/src/renderer/components/timer/Timer-controller.vue deleted file mode 100644 index da2d6a7..0000000 --- a/src/renderer/components/timer/Timer-controller.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - diff --git a/src/renderer/components/timer/Timer-dial.vue b/src/renderer/components/timer/Timer-dial.vue deleted file mode 100644 index 87c4b0f..0000000 --- a/src/renderer/components/timer/Timer-dial.vue +++ /dev/null @@ -1,239 +0,0 @@ - - - - - diff --git a/src/renderer/components/timer/Timer-footer.vue b/src/renderer/components/timer/Timer-footer.vue deleted file mode 100644 index b829559..0000000 --- a/src/renderer/components/timer/Timer-footer.vue +++ /dev/null @@ -1,286 +0,0 @@ - - - - - diff --git a/src/renderer/components/timer/Timer.vue b/src/renderer/components/timer/Timer.vue deleted file mode 100644 index 8e714a8..0000000 --- a/src/renderer/components/timer/Timer.vue +++ /dev/null @@ -1,422 +0,0 @@ - - - - - diff --git a/src/renderer/main.js b/src/renderer/main.js deleted file mode 100644 index 5b73504..0000000 --- a/src/renderer/main.js +++ /dev/null @@ -1,14 +0,0 @@ -import Vue from 'vue' - -import App from './App' -import store from './store' - -if (!process.env.IS_WEB) Vue.use(require('vue-electron')) -Vue.config.productionTip = false - -/* eslint-disable no-new */ -new Vue({ - components: { App }, - store, - template: '' -}).$mount('#app') diff --git a/src/renderer/store/index.js b/src/renderer/store/index.js deleted file mode 100644 index b74a038..0000000 --- a/src/renderer/store/index.js +++ /dev/null @@ -1,11 +0,0 @@ -import Vue from 'vue' -import Vuex from 'vuex' - -import { modules } from './modules' - -Vue.use(Vuex) - -export default new Vuex.Store({ - modules, - strict: process.env.NODE_ENV !== 'production' -}) diff --git a/src/renderer/store/modules/Timer.js b/src/renderer/store/modules/Timer.js deleted file mode 100644 index 15ad0af..0000000 --- a/src/renderer/store/modules/Timer.js +++ /dev/null @@ -1,182 +0,0 @@ -import { localStore } from './index' -import { defaults } from './../../utils/LocalStore' - -const state = { - round: 1, - workRounds: parseInt(localStore.get('workRounds')), - totalWorkRounds: 0, - tickSounds: localStore.get('tickSounds'), - tickSoundsDuringBreak: localStore.get('tickSoundsDuringBreak'), - timeLongBreak: parseInt(localStore.get('timeLongBreak')), - timeShortBreak: parseInt(localStore.get('timeShortBreak')), - timeWork: parseInt(localStore.get('timeWork')), - currentRound: 'work', // work, short-break, long-break - volume: localStore.get('volume') || 100, - globalShortcuts: localStore.get('globalShortcuts') || {} -} - -const getters = { - round() { - return state.round - }, - workRounds() { - return state.workRounds - }, - tickSounds() { - return state.tickSounds - }, - tickSoundsDuringBreak() { - return state.tickSoundsDuringBreak - }, - totalWorkRounds() { - return state.totalWorkRounds - }, - timeLongBreak() { - return state.timeLongBreak - }, - timeShortBreak() { - return state.timeShortBreak - }, - timeWork() { - return state.timeWork - }, - currentRound() { - return state.currentRound - }, - volume() { - return state.volume - }, - globalShortcuts() { - return state.globalShortcuts - } -} - -const mutations = { - INCREMENT_ROUND(state) { - state.round += 1 - }, - - RESET_ROUND(state) { - state.round = 1 - }, - - INCREMENT_TOTAL_WORK_ROUNDS(state) { - state.totalWorkRounds += 1 - }, - - RESET_DEFAULTS(state) { - state.workRounds = defaults.workRounds - state.timeLongBreak = defaults.timeLongBreak - state.timeShortBreak = defaults.timeShortBreak - state.timeWork = defaults.timeWork - }, - - SET_CURRENT_ROUND(state, payload) { - state.currentRound = payload - }, - - SET_TICK_SOUNDS(state, payload) { - state.tickSounds = payload - }, - - SET_TICK_SOUNDS_DURING_BREAK(state, payload) { - state.tickSoundsDuringBreak = payload - }, - - SET_TIME_LONG_BREAK(state, payload) { - state.timeLongBreak = payload - }, - - SET_TIME_SHORT_BREAK(state, payload) { - state.timeShortBreak = payload - }, - - SET_TIME_WORK(state, payload) { - state.timeWork = payload - }, - - SET_WORK_ROUNDS(state, payload) { - state.workRounds = payload - }, - - SET_VOLUME(state, payload) { - state.volume = payload - }, - - SET_GLOBAL_SHORTCUTS(state, shortcuts) { - state.globalShortcuts = shortcuts - } -} - -const actions = { - incrementRound({ commit }) { - commit('INCREMENT_ROUND') - }, - - resetRound({ commit }) { - commit('RESET_ROUND') - }, - - incrementTotalWorkRounds({ commit }) { - commit('INCREMENT_TOTAL_WORK_ROUNDS') - }, - - resetDefaults({ commit }) { - commit('RESET_DEFAULTS') - localStore.set('workRounds', defaults.workRounds) - localStore.set('timeLongBreak', defaults.timeLongBreak) - localStore.set('timeShortBreak', defaults.timeShortBreak) - localStore.set('timeWork', defaults.timeWork) - }, - - setCurrentRound({ commit }, payload) { - commit('SET_CURRENT_ROUND', payload) - }, - - setTickSounds({ commit }, payload) { - commit('SET_TICK_SOUNDS', payload) - localStore.set('tickSounds', payload) - }, - - setTickSoundsDuringBreak({ commit }, payload) { - commit('SET_TICK_SOUNDS_DURING_BREAK', payload) - localStore.set('tickSoundsDuringBreak', payload) - }, - - setTimeLongBreak({ commit }, payload) { - commit('SET_TIME_LONG_BREAK', payload) - localStore.set('timeLongBreak', payload) - }, - - setTimeShortBreak({ commit }, payload) { - commit('SET_TIME_SHORT_BREAK', payload) - localStore.set('timeShortBreak', payload) - }, - - setTimeWork({ commit }, payload) { - commit('SET_TIME_WORK', payload) - localStore.set('timeWork', payload) - }, - - setWorkRounds({ commit }, payload) { - commit('SET_WORK_ROUNDS', payload) - localStore.set('workRounds', payload) - }, - - setVolume({ commit }, payload) { - commit('SET_VOLUME', payload) - localStore.set('volume', payload) - }, - - setGlobalShortcuts({ commit }, globalShortcuts) { - commit('SET_GLOBAL_SHORTCUTS', globalShortcuts) - localStore.set('globalShortcuts', globalShortcuts) - } -} - -export default { - state, - getters, - mutations, - actions -} diff --git a/src/renderer/store/modules/View.js b/src/renderer/store/modules/View.js deleted file mode 100644 index 77f1c89..0000000 --- a/src/renderer/store/modules/View.js +++ /dev/null @@ -1,102 +0,0 @@ -import { localStore } from './index' - -const state = { - currentDrawer: 'appDrawerTimer', - drawerOpen: false, - autoStartWorkTimer: - localStore.get('autoStartWorkTimer') === undefined - ? true - : localStore.get('autoStartWorkTimer'), - autoStartBreakTimer: - localStore.get('autoStartBreakTimer') === undefined - ? true - : localStore.get('autoStartBreakTimer'), - alwaysOnTop: localStore.get('alwaysOnTop'), - breakAlwaysOnTop: localStore.get('breakAlwaysOnTop'), - minToTray: localStore.get('minToTray'), - minToTrayOnClose: localStore.get('minToTrayOnClose'), - notifications: localStore.get('notifications'), - os: process.platform, - theme: localStore.get('theme') || 'Pomotroid' -} - -const getters = { - autoStartWorkTimer() { - return state.autoStartWorkTimer - }, - - autoStartBreakTimer() { - return state.autoStartBreakTimer - }, - - currentDrawer() { - return state.currentDrawer - }, - - drawerOpen() { - return state.drawerOpen - }, - - alwaysOnTop() { - return state.alwaysOnTop - }, - - breakAlwaysOnTop() { - return state.breakAlwaysOnTop - }, - - minToTray() { - return state.minToTray - }, - - minToTrayOnClose() { - return state.minToTrayOnClose - }, - - notifications() { - return state.notifications - }, - - os() { - return state.os - }, - - theme() { - return state.theme - } -} - -const mutations = { - SET_SETTING(state, payload) { - localStore.set(payload.key, payload.val) - }, - - SET_VIEW_STATE(state, payload) { - state[payload.key] = payload.val - }, - - TOGGLE_DRAWER(state) { - state.drawerOpen = !state.drawerOpen - } -} - -const actions = { - setSetting({ commit }, payload) { - commit('SET_SETTING', payload) - }, - - setViewState({ commit }, payload) { - commit('SET_VIEW_STATE', payload) - }, - - toggleDrawer({ commit }) { - commit('TOGGLE_DRAWER') - } -} - -export default { - state, - getters, - mutations, - actions -} diff --git a/src/renderer/store/modules/index.js b/src/renderer/store/modules/index.js deleted file mode 100644 index 90878ca..0000000 --- a/src/renderer/store/modules/index.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * The file enables `@/store/index.js` to import all vuex modules - * in a one-shot manner. There should not be any reason to edit this file. - */ - -import { createLocalStore } from '@/utils/LocalStore' - -const localStore = createLocalStore() -const files = require.context('.', false, /\.js$/) -const modules = {} - -files.keys().forEach(key => { - if (key === './index.js') return - modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default -}) - -export { modules, localStore } diff --git a/src/renderer/utils/EventBus.js b/src/renderer/utils/EventBus.js deleted file mode 100644 index 8fb4236..0000000 --- a/src/renderer/utils/EventBus.js +++ /dev/null @@ -1,3 +0,0 @@ -import Vue from 'vue' - -export const EventBus = new Vue() diff --git a/src/renderer/utils/LocalStore.js b/src/renderer/utils/LocalStore.js deleted file mode 100644 index 5c4a80d..0000000 --- a/src/renderer/utils/LocalStore.js +++ /dev/null @@ -1,150 +0,0 @@ -import { logger } from './../utils/logger' -const electron = require('electron') -const fs = require('fs') -const path = require('path') - -export const defaults = generateSettings() - -/** - * Returns a default user-settings object. - * - * @returns {object} The default user-settings. - */ -function generateSettings() { - return { - alwaysOnTop: false, - breakAlwaysOnTop: false, - autoStartWorkTimer: true, - autoStartBreakTimer: true, - minToTray: false, - minToTrayOnClose: false, - notifications: true, - workRounds: 4, - theme: null, - tickSounds: false, - tickSoundsDuringBreak: true, - timeLongBreak: 15, - timeShortBreak: 5, - timeWork: 25, - volume: 100, - globalShortcuts: { // If new shortcuts are added, the migrations of this should be handled - 'call-timer-toggle': 'Control+F1', - 'call-timer-reset': 'Control+F2', - 'call-timer-skip': 'Control+F3' - } - } -} - -/** - * Creates and returns an instance of LocalStore with defaults. - * - * @export - * @returns {LocalStore} Instance of LocalStore. - */ -export function createLocalStore() { - // copy defaults object - return new LocalStore('user-preferences', Object.assign({}, defaults)) -} - -/** - * Stores user configuration on the filesystem. - * - * @export - * @class LocalStore - */ -export default class LocalStore { - /** - *Creates an instance of LocalStore. - * @param {string} filename - The filename to store. - * @param {object} data - Existing data or defaults to populate the LocalStore. - * @memberof LocalStore - */ - constructor(filename, data) { - const userDataPath = userDir() - this.path = path.join(userDataPath, filename + '.json') - this.data = parseDataFile(this.path, data) - logger.info(`Preferences loaded from ${this.path}`) - } - - /** - * Retrieve the value of a key-value pair from data. - * - * @param {string} key - The key to access. - * @returns {*} The accessed value. - * @memberof LocalStore - */ - get(key) { - return this.data[key] - } - - /** - * Set and store a key-value pair in local storage data. - * - * @param {string} key - The key name. - * @param {*} val - The value of the key property. - * @memberof LocalStore - */ - set(key, val) { - this.data[key] = val - fs.writeFileSync(this.path, JSON.stringify(this.data), err => { - if (err) { - logger.error(err) - } - }) - } -} - -/** - * Attempts to parse a JSON data file given a filepath, - * or returns given defaults. - * - * @param {string} filePath - The filepath of the file to be read. - * @param {*} defaults - Defaults to be returned in the event of an error. - * @returns {object|*} - */ -function parseDataFile(filePath, defaults) { - if (!fs.existsSync(filePath)) { - fs.writeFile(filePath, JSON.stringify(defaults), err => { - if (err) { - logger.error(err) - } - }) - return defaults - } else { - try { - return JSON.parse(fs.readFileSync(filePath)) - } catch (error) { - logger.error(error) - return defaults - } - } -} - -/** - * Create a directory at the given path if it doesn't exist. - * - * @export - * @param {string} path - The directory path. - */ -export function initDirectory(path) { - if (!fs.existsSync(path)) { - logger.info(`creating directory: ${path}`) - fs.mkdirSync(path) - } -} - -/** - * Get the 'userData' directory in the current environment. - * - * @export - * @returns {string} The userData path. - */ -export function userDir() { - let path - try { - path = (electron.app || electron.remote.app).getPath('userData') - } catch (error) { - logger.errror('failed to get user direoctory', error) - } - return path -} diff --git a/src/renderer/utils/Themer.js b/src/renderer/utils/Themer.js deleted file mode 100644 index 8700638..0000000 --- a/src/renderer/utils/Themer.js +++ /dev/null @@ -1,74 +0,0 @@ -import { readdirSync, readFileSync } from 'fs' -import { join } from 'path' -import { initDirectory, userDir } from './LocalStore' - -/** - * Themer provides custom application styling. - */ -class Themer { - constructor() { - const localDir = join(__static, 'themes') - const customDir = join(userDir(), 'themes') - initDirectory(customDir) - this.themes = [] - this._load([localDir, customDir]) - } - - /** - * Apply a theme with the given name. The name should correspond to the - * filename _without_ its extension. For example, 'dracula'. - * - * @param string themeName - The name of the theme. - */ - apply(themeName) { - const theme = this.getTheme(themeName) - for (const k in theme.colors) { - document.documentElement.style.setProperty(k, theme.colors[k]) - } - } - - /** - * Get a theme by name. - * - * @param string themeName - The name of the theme. - */ - getTheme(themeName) { - return this.themes.find(e => { - return e.name === themeName - }) - } - - /** - * Get the name of a given theme. - * - * @param {object} theme - The theme. - */ - getThemeName(theme) { - return theme.name - } - - /** - * Get the value of a given theme's color property. - * - * @param {object} theme - The theme. - * @param string value - The theme key to query. - */ - getThemeValue(theme, value) { - return theme.colors[value] - } - - /** - * Load themes from theme files. - */ - _load(directories) { - directories.forEach(d => { - const files = readdirSync(d) - files.forEach(f => { - const theme = JSON.parse(readFileSync(join(d, f))) - this.themes.push(theme) - }) - }) - } -} - -export default new Themer() diff --git a/src/renderer/utils/Timer.js b/src/renderer/utils/Timer.js deleted file mode 100644 index eb6503d..0000000 --- a/src/renderer/utils/Timer.js +++ /dev/null @@ -1,58 +0,0 @@ -export default class Timer extends EventTarget { - constructor(min) { - super() - this.time = 0 - this.totalSeconds = min * 60 - - this._complete = new Event('complete') - this._pause = new Event('pause') - this._reset = new Event('reset') - } - - start() { - if (!this.timerInt) { - this.timerInt = setInterval(() => { - this.time += 1 - if (this.time >= this.totalSeconds) { - this.pause() - this.dispatchEvent(this._complete) - } else { - this.dispatchEvent( - new CustomEvent('tick', { - detail: { time: this.time, totalSeconds: this.totalSeconds } - }) - ) - } - }, 1000) - this.dispatchEvent( - new CustomEvent('start', { - detail: { time: this.time, totalSeconds: this.totalSeconds } - }) - ) - } - } - - pause() { - clearInterval(this.timerInt) - delete this.timerInt - this.dispatchEvent(this._pause) - } - - reset() { - clearInterval(this.timerInt) - delete this.timerInt - this.time = 0 - this.dispatchEvent(this._reset) - } - - resume() { - if (!this.timerInt) { - this.start() - this.dispatchEvent( - new CustomEvent('resume', { - detail: { time: this.time, totalSeconds: this.totalSeconds } - }) - ) - } - } -} diff --git a/src/renderer/utils/logger.js b/src/renderer/utils/logger.js deleted file mode 100644 index 1240417..0000000 --- a/src/renderer/utils/logger.js +++ /dev/null @@ -1,43 +0,0 @@ -import electron from 'electron' -import os from 'os' -import path from 'path' -import winston from 'winston' -require('winston-daily-rotate-file') - -const app = electron.app || electron.remote.app -app.setAppLogsPath(path.join(app.getPath('userData'), 'logs')) -const userDataPath = app.getPath('logs') -const jsonWithTimestamp = winston.format.combine( - winston.format.timestamp(), - winston.format.json() -) - -const logger = winston.createLogger({ - defaultMeta: { hostname: os.hostname() }, - format: jsonWithTimestamp, - transports: [ - new winston.transports.File({ - filename: path.join(userDataPath, 'pomotroid-error.log'), - level: 'error', - maxsize: 1000 - }), - new winston.transports.DailyRotateFile({ - filename: path.join(userDataPath, 'pomotroid-%DATE%.log'), - maxFiles: '14d', - maxSize: '20m' - }) - ] -}) - -// -// If we're not in production then log to the `console` with the format: -// `${info.level}: ${info.message} JSON.stringify({ ...rest }) ` -// -if (process.env.NODE_ENV !== 'production') { - logger.add(new winston.transports.Console({ - format: winston.format.simple(), - level: 'debug' - })) -} - -export { logger } diff --git a/src/renderer/utils/timer.worker.js b/src/renderer/utils/timer.worker.js deleted file mode 100644 index 239dd50..0000000 --- a/src/renderer/utils/timer.worker.js +++ /dev/null @@ -1,86 +0,0 @@ -import Timer from './Timer' - -let timer - -self.onmessage = function(msg) { - switch (msg.data.event) { - case 'create': - handleCreate(msg.data.min) - break - case 'pause': - handlePause() - break - case 'reset': - handleReset() - break - case 'resume': - handleResume() - break - case 'start': - handleStart() - break - default: - break - } -} - -// External event handlers - -function handleCreate(min) { - timer = new Timer(min) - timer.addEventListener('complete', handleTimerComplete) - timer.addEventListener('pause', handleTimerPause) - timer.addEventListener('reset', handleTimerReset) - timer.addEventListener('start', handleTimerStart) - timer.addEventListener('tick', handleTimerTick) -} - -function handlePause() { - if (!timer) return - timer.pause() -} - -function handleReset() { - if (!timer) return - timer.reset() -} - -function handleResume() { - if (!timer) return - timer.resume() -} - -function handleStart() { - if (!timer) return - timer.start() -} - -// Internal timer event handlers - -function handleTimerComplete() { - self.postMessage({ event: 'complete' }) -} - -function handleTimerPause() { - self.postMessage({ event: 'pause' }) -} - -function handleTimerReset() { - self.postMessage({ event: 'reset' }) -} - -function handleTimerStart(event) { - self.postMessage({ - event: 'start', - elapsed: event.detail.time, - totalSeconds: event.detail.totalSeconds - }) -} - -function handleTimerTick(event) { - self.postMessage({ - event: 'tick', - elapsed: event.detail.time, - totalSeconds: event.detail.totalSeconds - }) -} diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts new file mode 100644 index 0000000..9d24899 --- /dev/null +++ b/src/routes/+layout.ts @@ -0,0 +1,5 @@ +// Tauri doesn't have a Node.js server to do proper SSR +// so we use adapter-static with a fallback to index.html to put the site in SPA mode +// See: https://svelte.dev/docs/kit/single-page-apps +// See: https://v2.tauri.app/start/frontend/sveltekit/ for more info +export const ssr = false; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..ffb0870 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,204 @@ + + + +{#if !isMac} + +
startResize('North')} role="none">
+ +
startResize('South')} role="none">
+ +
startResize('East')} role="none">
+ +
startResize('West')} role="none">
+ +
startResize('NorthEast')} role="none">
+ +
startResize('NorthWest')} role="none">
+ +
startResize('SouthEast')} role="none">
+ +
startResize('SouthWest')} role="none">
+{/if} + +
+ +
+ +
+
+ + diff --git a/src/routes/settings/+page.svelte b/src/routes/settings/+page.svelte new file mode 100644 index 0000000..4dc7245 --- /dev/null +++ b/src/routes/settings/+page.svelte @@ -0,0 +1,200 @@ + + +
+ + +
+ + + + +
+ {#if active === 'timer'} + + {:else if active === 'appearance'} + + {:else if active === 'notifications'} + + {:else if active === 'shortcuts'} + + {:else if active === 'system'} + + {:else if active === 'about'} + + {/if} +
+
+
+ + diff --git a/src/routes/stats/+page.svelte b/src/routes/stats/+page.svelte new file mode 100644 index 0000000..ed8f601 --- /dev/null +++ b/src/routes/stats/+page.svelte @@ -0,0 +1,242 @@ + + +
+ + + + +
+ + + +
+ + +
+ {#if activeTab === 'today'} + + {:else if activeTab === 'week'} + + {:else} + + {/if} +
+
+ + diff --git a/static/themes/catppuccin-frappe.json b/static/themes/catppuccin-frappe.json new file mode 100644 index 0000000..aa5a25f --- /dev/null +++ b/static/themes/catppuccin-frappe.json @@ -0,0 +1,15 @@ +{ + "name": "Catppuccin Frappé", + "colors": { + "--color-long-round": "#8caaee", + "--color-short-round": "#a6d189", + "--color-focus-round": "#e78284", + "--color-background": "#303446", + "--color-background-light": "#414559", + "--color-background-lightest": "#626880", + "--color-foreground": "#c6d0f5", + "--color-foreground-darker": "#b5bfe2", + "--color-foreground-darkest": "#949cbb", + "--color-accent": "#ca9ee6" + } +} diff --git a/static/themes/catppuccin-latte.json b/static/themes/catppuccin-latte.json new file mode 100644 index 0000000..bd022d9 --- /dev/null +++ b/static/themes/catppuccin-latte.json @@ -0,0 +1,15 @@ +{ + "name": "Catppuccin Latte", + "colors": { + "--color-long-round": "#209fb5", + "--color-short-round": "#40a02b", + "--color-focus-round": "#d20f39", + "--color-background": "#eff1f5", + "--color-background-light": "#e6e9ef", + "--color-background-lightest": "#bcc0cc", + "--color-foreground": "#4c4f69", + "--color-foreground-darker": "#6c6f85", + "--color-foreground-darkest": "#8c8fa1", + "--color-accent": "#8839ef" + } +} diff --git a/static/themes/catppuccin-macchiato.json b/static/themes/catppuccin-macchiato.json new file mode 100644 index 0000000..2968d9a --- /dev/null +++ b/static/themes/catppuccin-macchiato.json @@ -0,0 +1,15 @@ +{ + "name": "Catppuccin Macchiato", + "colors": { + "--color-long-round": "#8aadf4", + "--color-short-round": "#a6da95", + "--color-focus-round": "#ed8796", + "--color-background": "#24273a", + "--color-background-light": "#363a4f", + "--color-background-lightest": "#5b6078", + "--color-foreground": "#cad3f5", + "--color-foreground-darker": "#b8c0e0", + "--color-foreground-darkest": "#939ab7", + "--color-accent": "#c6a0f6" + } +} diff --git a/static/themes/catppuccin-mocha.json b/static/themes/catppuccin-mocha.json new file mode 100644 index 0000000..5740b5e --- /dev/null +++ b/static/themes/catppuccin-mocha.json @@ -0,0 +1,15 @@ +{ + "name": "Catppuccin Mocha", + "colors": { + "--color-long-round": "#89b4fa", + "--color-short-round": "#a6e3a1", + "--color-focus-round": "#f38ba8", + "--color-background": "#1e1e2e", + "--color-background-light": "#313244", + "--color-background-lightest": "#585b70", + "--color-foreground": "#cdd6f4", + "--color-foreground-darker": "#bac2de", + "--color-foreground-darkest": "#9399b2", + "--color-accent": "#cba6f7" + } +} diff --git a/static/themes/cobalt2.json b/static/themes/cobalt2.json new file mode 100644 index 0000000..50102e7 --- /dev/null +++ b/static/themes/cobalt2.json @@ -0,0 +1,15 @@ +{ + "name": "Cobalt2", + "colors": { + "--color-long-round": "#80fcff", + "--color-short-round": "#3ad900", + "--color-focus-round": "#ff3600", + "--color-background": "#193549", + "--color-background-light": "#1f4662", + "--color-background-lightest": "#2a5f8f", + "--color-foreground": "#b0d9fb", + "--color-foreground-darker": "#7ab3d9", + "--color-foreground-darkest": "#4e8ab5", + "--color-accent": "#ff9d00" + } +} diff --git a/static/themes/darcula.json b/static/themes/darcula.json new file mode 100644 index 0000000..0e75de8 --- /dev/null +++ b/static/themes/darcula.json @@ -0,0 +1,15 @@ +{ + "name": "Darcula", + "colors": { + "--color-long-round": "#6897bb", + "--color-short-round": "#6a8759", + "--color-focus-round": "#c75450", + "--color-background": "#2b2b2b", + "--color-background-light": "#313335", + "--color-background-lightest": "#4e5254", + "--color-foreground": "#a9b7c6", + "--color-foreground-darker": "#808080", + "--color-foreground-darkest": "#5c5f61", + "--color-accent": "#ffc66d" + } +} diff --git a/static/themes/dracula.json b/static/themes/dracula.json index 67a29d1..be1159a 100644 --- a/static/themes/dracula.json +++ b/static/themes/dracula.json @@ -5,7 +5,7 @@ "--color-short-round": "#50fa7b", "--color-focus-round": "#ff5555", "--color-background": "#282a36", - "--color-background-light": "#363846", + "--color-background-light": "#44475a", "--color-background-lightest": "#6272a4", "--color-foreground": "#f8f8f2", "--color-foreground-darker": "#ffb86c", diff --git a/static/themes/everforest.json b/static/themes/everforest.json new file mode 100644 index 0000000..29d2155 --- /dev/null +++ b/static/themes/everforest.json @@ -0,0 +1,15 @@ +{ + "name": "Everforest", + "colors": { + "--color-long-round": "#7fbbb3", + "--color-short-round": "#a7c080", + "--color-focus-round": "#e67e80", + "--color-background": "#2d353b", + "--color-background-light": "#3d484d", + "--color-background-lightest": "#596a6d", + "--color-foreground": "#d3c6aa", + "--color-foreground-darker": "#9da9a0", + "--color-foreground-darkest": "#859289", + "--color-accent": "#a7c080" + } +} diff --git a/static/themes/github-dark.json b/static/themes/github-dark.json new file mode 100644 index 0000000..1bab739 --- /dev/null +++ b/static/themes/github-dark.json @@ -0,0 +1,15 @@ +{ + "name": "GitHub Dark", + "colors": { + "--color-long-round": "#58a6ff", + "--color-short-round": "#3fb950", + "--color-focus-round": "#f85149", + "--color-background": "#0d1117", + "--color-background-light": "#161b22", + "--color-background-lightest": "#30363d", + "--color-foreground": "#e6edf3", + "--color-foreground-darker": "#8b949e", + "--color-foreground-darkest": "#6e7681", + "--color-accent": "#58a6ff" + } +} diff --git a/static/themes/gruvbox-light.json b/static/themes/gruvbox-light.json new file mode 100644 index 0000000..f13d8d6 --- /dev/null +++ b/static/themes/gruvbox-light.json @@ -0,0 +1,15 @@ +{ + "name": "Gruvbox Light", + "colors": { + "--color-long-round": "#076678", + "--color-short-round": "#79740e", + "--color-focus-round": "#9d0006", + "--color-background": "#fbf1c7", + "--color-background-light": "#ebdbb2", + "--color-background-lightest": "#bdae93", + "--color-foreground": "#3c3836", + "--color-foreground-darker": "#665c54", + "--color-foreground-darkest": "#928374", + "--color-accent": "#b57614" + } +} diff --git a/static/themes/horizon.json b/static/themes/horizon.json new file mode 100644 index 0000000..449d894 --- /dev/null +++ b/static/themes/horizon.json @@ -0,0 +1,15 @@ +{ + "name": "Horizon", + "colors": { + "--color-long-round": "#25b0bc", + "--color-short-round": "#09f7a0", + "--color-focus-round": "#e95678", + "--color-background": "#1c1e26", + "--color-background-light": "#232530", + "--color-background-lightest": "#2e303e", + "--color-foreground": "#cbced3", + "--color-foreground-darker": "#6c6f93", + "--color-foreground-darkest": "#4f5275", + "--color-accent": "#e95678" + } +} diff --git a/static/themes/kanagawa.json b/static/themes/kanagawa.json new file mode 100644 index 0000000..9d028c3 --- /dev/null +++ b/static/themes/kanagawa.json @@ -0,0 +1,15 @@ +{ + "name": "Kanagawa", + "colors": { + "--color-long-round": "#7e9cd8", + "--color-short-round": "#76946a", + "--color-focus-round": "#c34043", + "--color-background": "#1f1f28", + "--color-background-light": "#2a2a37", + "--color-background-lightest": "#54546d", + "--color-foreground": "#dcd7ba", + "--color-foreground-darker": "#c8c093", + "--color-foreground-darkest": "#727169", + "--color-accent": "#957fb8" + } +} diff --git a/static/themes/material-palenight.json b/static/themes/material-palenight.json new file mode 100644 index 0000000..b421c51 --- /dev/null +++ b/static/themes/material-palenight.json @@ -0,0 +1,15 @@ +{ + "name": "Material Palenight", + "colors": { + "--color-long-round": "#82aaff", + "--color-short-round": "#c3e88d", + "--color-focus-round": "#f07178", + "--color-background": "#292d3e", + "--color-background-light": "#33374e", + "--color-background-lightest": "#4e5579", + "--color-foreground": "#a6accd", + "--color-foreground-darker": "#676e95", + "--color-foreground-darkest": "#4e5579", + "--color-accent": "#c792ea" + } +} diff --git a/static/themes/monokai-pro.json b/static/themes/monokai-pro.json new file mode 100644 index 0000000..a7310cf --- /dev/null +++ b/static/themes/monokai-pro.json @@ -0,0 +1,15 @@ +{ + "name": "Monokai Pro", + "colors": { + "--color-long-round": "#78dce8", + "--color-short-round": "#a9dc76", + "--color-focus-round": "#ff6188", + "--color-background": "#2d2a2e", + "--color-background-light": "#403e41", + "--color-background-lightest": "#5b595c", + "--color-foreground": "#fcfcfa", + "--color-foreground-darker": "#939293", + "--color-foreground-darkest": "#727072", + "--color-accent": "#ffd866" + } +} diff --git a/static/themes/night-owl.json b/static/themes/night-owl.json new file mode 100644 index 0000000..0655f87 --- /dev/null +++ b/static/themes/night-owl.json @@ -0,0 +1,15 @@ +{ + "name": "Night Owl", + "colors": { + "--color-long-round": "#82aaff", + "--color-short-round": "#addb67", + "--color-focus-round": "#ef5350", + "--color-background": "#011627", + "--color-background-light": "#0d2231", + "--color-background-lightest": "#1d3b53", + "--color-foreground": "#d6deeb", + "--color-foreground-darker": "#7fa3b3", + "--color-foreground-darkest": "#637777", + "--color-accent": "#c792ea" + } +} diff --git a/static/themes/panda.json b/static/themes/panda.json new file mode 100644 index 0000000..d5a97da --- /dev/null +++ b/static/themes/panda.json @@ -0,0 +1,15 @@ +{ + "name": "Panda", + "colors": { + "--color-long-round": "#6fc1ff", + "--color-short-round": "#19f9d8", + "--color-focus-round": "#ff2c6d", + "--color-background": "#292a2b", + "--color-background-light": "#333434", + "--color-background-lightest": "#676b79", + "--color-foreground": "#e6e6e6", + "--color-foreground-darker": "#b3b3b3", + "--color-foreground-darkest": "#676b79", + "--color-accent": "#19f9d8" + } +} diff --git a/static/themes/pomotroid-light.json b/static/themes/pomotroid-light.json new file mode 100644 index 0000000..471458b --- /dev/null +++ b/static/themes/pomotroid-light.json @@ -0,0 +1,15 @@ +{ + "name": "Pomotroid Light", + "colors": { + "--color-long-round": "#6aaec4", + "--color-short-round": "#3a7d58", + "--color-focus-round": "#c84840", + "--color-background": "#f5f0e8", + "--color-background-light": "#ede6db", + "--color-background-lightest": "#c4bdb5", + "--color-foreground": "#2f384b", + "--color-foreground-darker": "#55647a", + "--color-foreground-darkest": "#8899b0", + "--color-accent": "#3a7d58" + } +} diff --git a/static/themes/rose-pine-dawn.json b/static/themes/rose-pine-dawn.json new file mode 100644 index 0000000..7a187f5 --- /dev/null +++ b/static/themes/rose-pine-dawn.json @@ -0,0 +1,15 @@ +{ + "name": "Rosé Pine Dawn", + "colors": { + "--color-focus-round": "#b4637a", + "--color-short-round": "#56949f", + "--color-long-round": "#907aa9", + "--color-background": "#faf4ed", + "--color-background-light": "#fffaf3", + "--color-background-lightest": "#f2e9e1", + "--color-foreground": "#575279", + "--color-foreground-darker": "#797593", + "--color-foreground-darkest": "#9893a5", + "--color-accent": "#ea9d34" + } +} diff --git a/static/themes/rose-pine-moon.json b/static/themes/rose-pine-moon.json new file mode 100644 index 0000000..bedbc20 --- /dev/null +++ b/static/themes/rose-pine-moon.json @@ -0,0 +1,15 @@ +{ + "name": "Rosé Pine Moon", + "colors": { + "--color-long-round": "#c4a7e7", + "--color-short-round": "#9ccfd8", + "--color-focus-round": "#eb6f92", + "--color-background": "#232136", + "--color-background-light": "#2a273f", + "--color-background-lightest": "#56526e", + "--color-foreground": "#e0def4", + "--color-foreground-darker": "#908caa", + "--color-foreground-darkest": "#6e6a86", + "--color-accent": "#c4a7e7" + } +} diff --git a/static/themes/rose-pine.json b/static/themes/rose-pine.json new file mode 100644 index 0000000..0d03386 --- /dev/null +++ b/static/themes/rose-pine.json @@ -0,0 +1,15 @@ +{ + "name": "Rosé Pine", + "colors": { + "--color-long-round": "#c4a7e7", + "--color-short-round": "#9ccfd8", + "--color-focus-round": "#eb6f92", + "--color-background": "#191724", + "--color-background-light": "#1f1d2e", + "--color-background-lightest": "#524f67", + "--color-foreground": "#e0def4", + "--color-foreground-darker": "#908caa", + "--color-foreground-darkest": "#6e6a86", + "--color-accent": "#c4a7e7" + } +} diff --git a/static/themes/solarized-dark.json b/static/themes/solarized-dark.json new file mode 100644 index 0000000..3c861a7 --- /dev/null +++ b/static/themes/solarized-dark.json @@ -0,0 +1,15 @@ +{ + "name": "Solarized Dark", + "colors": { + "--color-long-round": "#2aa198", + "--color-short-round": "#859900", + "--color-focus-round": "#dc322f", + "--color-background": "#002b36", + "--color-background-light": "#073642", + "--color-background-lightest": "#586e75", + "--color-foreground": "#839496", + "--color-foreground-darker": "#657b83", + "--color-foreground-darkest": "#586e75", + "--color-accent": "#268bd2" + } +} diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..23c3028 --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,24 @@ +// Tauri doesn't have a Node.js server to do proper SSR +// so we use adapter-static with a fallback to index.html to put the site in SPA mode +// See: https://svelte.dev/docs/kit/single-page-apps +// See: https://v2.tauri.app/start/frontend/sveltekit/ for more info +import adapter from "@sveltejs/adapter-static"; +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + kit: { + adapter: adapter({ + fallback: "index.html", + }), + paths: { + relative: false, + }, + alias: { + $paraglide: './src/paraglide', + }, + }, +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f4d0a0e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..f7ff4b7 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,40 @@ +import { defineConfig } from "vite"; +import { sveltekit } from "@sveltejs/kit/vite"; +import { paraglideVitePlugin } from "@inlang/paraglide-js"; + +const host = process.env.TAURI_DEV_HOST; + +// https://vite.dev/config/ +export default defineConfig(async () => ({ + plugins: [ + paraglideVitePlugin({ + project: "./project.inlang", + outdir: "./src/paraglide", + strategy: ["globalVariable", "baseLocale"], + emitTsDeclarations: true, + }), + sveltekit(), + ], + + // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` + // + // 1. prevent Vite from obscuring rust errors + clearScreen: false, + // 2. tauri expects a fixed port, fail if that port is not available + server: { + port: 1420, + strictPort: true, + host: host || false, + hmr: host + ? { + protocol: "ws", + host, + port: 1421, + } + : undefined, + watch: { + // 3. tell Vite to ignore watching `src-tauri` + ignored: ["**/src-tauri/**"], + }, + }, +}));