diff --git a/android/app/build.gradle b/android/app/build.gradle
index d0932d6..4a3db4e 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -85,7 +85,7 @@ dependencies {
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
implementation 'com.android.support:multidex:1.0.3'
- implementation 'com.facebook.android:facebook-android-sdk:[5,6)'
+ implementation 'com.google.firebase:firebase-analytics:17.2.2'
}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 2a8acd4..aa08b40 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -28,6 +28,7 @@
+
>
@@ -37,7 +38,8 @@
-
+
@@ -57,5 +59,5 @@
-
+
diff --git a/cloud_functions/.firebaserc b/cloud_functions/.firebaserc
new file mode 100644
index 0000000..9cacdf2
--- /dev/null
+++ b/cloud_functions/.firebaserc
@@ -0,0 +1,5 @@
+{
+ "projects": {
+ "default": "guava-27f21"
+ }
+}
diff --git a/cloud_functions/.gitignore b/cloud_functions/.gitignore
new file mode 100644
index 0000000..f626852
--- /dev/null
+++ b/cloud_functions/.gitignore
@@ -0,0 +1,65 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+firebase-debug.log*
+
+# Firebase cache
+.firebase/
+
+# Firebase config
+
+# Uncomment this if you'd like others to create their own Firebase project.
+# For a team working on the same Firebase project(s), it is recommended to leave
+# it commented so all members can deploy to the same project(s) in .firebaserc.
+# .firebaserc
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
diff --git a/cloud_functions/firebase.json b/cloud_functions/firebase.json
new file mode 100644
index 0000000..67a1501
--- /dev/null
+++ b/cloud_functions/firebase.json
@@ -0,0 +1,8 @@
+{
+ "functions": {
+ "predeploy": [
+ "npm --prefix \"$RESOURCE_DIR\" run lint",
+ "npm --prefix \"$RESOURCE_DIR\" run build"
+ ]
+ }
+}
diff --git a/cloud_functions/functions/.gitignore b/cloud_functions/functions/.gitignore
new file mode 100644
index 0000000..7fbb8b4
--- /dev/null
+++ b/cloud_functions/functions/.gitignore
@@ -0,0 +1,8 @@
+## Compiled JavaScript files
+**/*.js
+**/*.js.map
+
+# Typescript v1 declaration files
+typings/
+
+node_modules/
\ No newline at end of file
diff --git a/cloud_functions/functions/package-lock.json b/cloud_functions/functions/package-lock.json
new file mode 100644
index 0000000..4c6e675
--- /dev/null
+++ b/cloud_functions/functions/package-lock.json
@@ -0,0 +1,2336 @@
+{
+ "name": "functions",
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+ "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@firebase/app-types": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz",
+ "integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg=="
+ },
+ "@firebase/auth-interop-types": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz",
+ "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw=="
+ },
+ "@firebase/component": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.15.tgz",
+ "integrity": "sha512-HqFb1qQl1vtlUMIzPM15plNz27jqM8DWjuQQuGeDfG+4iRRflwKfgNw1BOyoP4kQ8vOBCL7t/71yPXSomNdJdQ==",
+ "requires": {
+ "@firebase/util": "0.2.50",
+ "tslib": "^1.11.1"
+ }
+ },
+ "@firebase/database": {
+ "version": "0.6.6",
+ "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.6.tgz",
+ "integrity": "sha512-TqUJOaCATF/h3wpqhPT9Fz1nZI6gBv/M2pHZztUjX4A9o9Bq93NyqUurYiZnGB7zpSkEADFCVT4f0VBrWdHlNw==",
+ "requires": {
+ "@firebase/auth-interop-types": "0.1.5",
+ "@firebase/component": "0.1.15",
+ "@firebase/database-types": "0.5.1",
+ "@firebase/logger": "0.2.5",
+ "@firebase/util": "0.2.50",
+ "faye-websocket": "0.11.3",
+ "tslib": "^1.11.1"
+ }
+ },
+ "@firebase/database-types": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.1.tgz",
+ "integrity": "sha512-onQxom1ZBYBJ648w/VNRzUewovEDAH7lvnrrpCd69ukkyrMk6rGEO/PQ9BcNEbhlNtukpsqRS0oNOFlHs0FaSA==",
+ "requires": {
+ "@firebase/app-types": "0.6.1"
+ }
+ },
+ "@firebase/logger": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.5.tgz",
+ "integrity": "sha512-qqw3m0tWs/qrg7axTZG/QZq24DIMdSY6dGoWuBn08ddq7+GLF5HiqkRj71XznYeUUbfRq5W9C/PSFnN4JxX+WA=="
+ },
+ "@firebase/util": {
+ "version": "0.2.50",
+ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.50.tgz",
+ "integrity": "sha512-vFE6+Jfc25u0ViSpFxxq0q5s+XmuJ/y7CL3ud79RQe+WLFFg+j0eH1t23k0yNSG9vZNM7h3uHRIXbV97sYLAyw==",
+ "requires": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "@google-cloud/common": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.4.0.tgz",
+ "integrity": "sha512-zWFjBS35eI9leAHhjfeOYlK5Plcuj/77EzstnrJIZbKgF/nkqjcQuGiMCpzCwOfPyUbz8ZaEOYgbHa759AKbjg==",
+ "optional": true,
+ "requires": {
+ "@google-cloud/projectify": "^1.0.0",
+ "@google-cloud/promisify": "^1.0.0",
+ "arrify": "^2.0.0",
+ "duplexify": "^3.6.0",
+ "ent": "^2.2.0",
+ "extend": "^3.0.2",
+ "google-auth-library": "^5.5.0",
+ "retry-request": "^4.0.0",
+ "teeny-request": "^6.0.0"
+ }
+ },
+ "@google-cloud/firestore": {
+ "version": "3.8.6",
+ "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-3.8.6.tgz",
+ "integrity": "sha512-ox80NbrM1MLJgvAAUd1quFLx/ie/nSjrk1PtscSicpoYDlKb9e6j7pHrVpbopBMyliyfNl3tLJWaDh+x+uCXqw==",
+ "optional": true,
+ "requires": {
+ "deep-equal": "^2.0.0",
+ "functional-red-black-tree": "^1.0.1",
+ "google-gax": "^1.15.3",
+ "readable-stream": "^3.4.0",
+ "through2": "^3.0.0"
+ }
+ },
+ "@google-cloud/paginator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-2.0.3.tgz",
+ "integrity": "sha512-kp/pkb2p/p0d8/SKUu4mOq8+HGwF8NPzHWkj+VKrIPQPyMRw8deZtrO/OcSiy9C/7bpfU5Txah5ltUNfPkgEXg==",
+ "optional": true,
+ "requires": {
+ "arrify": "^2.0.0",
+ "extend": "^3.0.2"
+ }
+ },
+ "@google-cloud/projectify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-1.0.4.tgz",
+ "integrity": "sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg==",
+ "optional": true
+ },
+ "@google-cloud/promisify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-1.0.4.tgz",
+ "integrity": "sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==",
+ "optional": true
+ },
+ "@google-cloud/storage": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-4.7.0.tgz",
+ "integrity": "sha512-f0guAlbeg7Z0m3gKjCfBCu7FG9qS3M3oL5OQQxlvGoPtK7/qg3+W+KQV73O2/sbuS54n0Kh2mvT5K2FWzF5vVQ==",
+ "optional": true,
+ "requires": {
+ "@google-cloud/common": "^2.1.1",
+ "@google-cloud/paginator": "^2.0.0",
+ "@google-cloud/promisify": "^1.0.0",
+ "arrify": "^2.0.0",
+ "compressible": "^2.0.12",
+ "concat-stream": "^2.0.0",
+ "date-and-time": "^0.13.0",
+ "duplexify": "^3.5.0",
+ "extend": "^3.0.2",
+ "gaxios": "^3.0.0",
+ "gcs-resumable-upload": "^2.2.4",
+ "hash-stream-validation": "^0.2.2",
+ "mime": "^2.2.0",
+ "mime-types": "^2.0.8",
+ "onetime": "^5.1.0",
+ "p-limit": "^2.2.0",
+ "pumpify": "^2.0.0",
+ "readable-stream": "^3.4.0",
+ "snakeize": "^0.1.0",
+ "stream-events": "^1.0.1",
+ "through2": "^3.0.0",
+ "xdg-basedir": "^4.0.0"
+ },
+ "dependencies": {
+ "gaxios": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.0.3.tgz",
+ "integrity": "sha512-PkzQludeIFhd535/yucALT/Wxyj/y2zLyrMwPcJmnLHDugmV49NvAi/vb+VUq/eWztATZCNcb8ue+ywPG+oLuw==",
+ "optional": true,
+ "requires": {
+ "abort-controller": "^3.0.0",
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^5.0.0",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.3.0"
+ }
+ }
+ }
+ },
+ "@grpc/grpc-js": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.5.tgz",
+ "integrity": "sha512-Hm+xOiqAhcpT9RYM8lc15dbQD7aQurM7ZU8ulmulepiPlN7iwBXXwP3vSBUimoFoApRqz7pSIisXU8pZaCB4og==",
+ "optional": true,
+ "requires": {
+ "semver": "^6.2.0"
+ }
+ },
+ "@grpc/proto-loader": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.4.tgz",
+ "integrity": "sha512-HTM4QpI9B2XFkPz7pjwMyMgZchJ93TVkL3kWPW8GDMDKYxsMnmf4w2TNMJK7+KNiYHS5cJrCEAFlF+AwtXWVPA==",
+ "optional": true,
+ "requires": {
+ "lodash.camelcase": "^4.3.0",
+ "protobufjs": "^6.8.6"
+ }
+ },
+ "@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=",
+ "optional": true
+ },
+ "@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+ "optional": true
+ },
+ "@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "optional": true
+ },
+ "@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=",
+ "optional": true
+ },
+ "@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
+ "optional": true,
+ "requires": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
+ "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=",
+ "optional": true
+ },
+ "@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=",
+ "optional": true
+ },
+ "@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=",
+ "optional": true
+ },
+ "@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=",
+ "optional": true
+ },
+ "@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=",
+ "optional": true
+ },
+ "@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "optional": true
+ },
+ "@types/body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
+ "requires": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/connect": {
+ "version": "3.4.33",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz",
+ "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/express": {
+ "version": "4.17.3",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz",
+ "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==",
+ "requires": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "@types/express-serve-static-core": {
+ "version": "4.17.8",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.8.tgz",
+ "integrity": "sha512-1SJZ+R3Q/7mLkOD9ewCBDYD2k0WyZQtWYqF/2VvoNN2/uhI49J9CDN4OAm+wGMA0DbArA4ef27xl4+JwMtGggw==",
+ "requires": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*"
+ }
+ },
+ "@types/fs-extra": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz",
+ "integrity": "sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w==",
+ "optional": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/lodash": {
+ "version": "4.14.157",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.157.tgz",
+ "integrity": "sha512-Ft5BNFmv2pHDgxV5JDsndOWTRJ+56zte0ZpYLowp03tW+K+t8u8YMOzAnpuqPgzX6WO1XpDIUm7u04M8vdDiVQ==",
+ "dev": true
+ },
+ "@types/long": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
+ "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==",
+ "optional": true
+ },
+ "@types/mime": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.2.tgz",
+ "integrity": "sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q=="
+ },
+ "@types/node": {
+ "version": "8.10.61",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.61.tgz",
+ "integrity": "sha512-l+zSbvT8TPRaCxL1l9cwHCb0tSqGAGcjPJFItGGYat5oCTiq1uQQKYg5m7AF1mgnEBzFXGLJ2LRmNjtreRX76Q=="
+ },
+ "@types/qs": {
+ "version": "6.9.3",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.3.tgz",
+ "integrity": "sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA=="
+ },
+ "@types/range-parser": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
+ "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA=="
+ },
+ "@types/serve-static": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.4.tgz",
+ "integrity": "sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug==",
+ "requires": {
+ "@types/express-serve-static-core": "*",
+ "@types/mime": "*"
+ }
+ },
+ "abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "optional": true,
+ "requires": {
+ "event-target-shim": "^5.0.0"
+ }
+ },
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "agent-base": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz",
+ "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==",
+ "optional": true,
+ "requires": {
+ "debug": "4"
+ }
+ },
+ "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"
+ }
+ },
+ "array-filter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz",
+ "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=",
+ "optional": true
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ },
+ "arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "optional": true
+ },
+ "available-typed-arrays": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz",
+ "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==",
+ "optional": true,
+ "requires": {
+ "array-filter": "^1.0.0"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "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==",
+ "optional": true
+ },
+ "bignumber.js": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
+ "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==",
+ "optional": 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==",
+ "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": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
+ },
+ "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==",
+ "optional": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ },
+ "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"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "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
+ },
+ "compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "optional": true,
+ "requires": {
+ "mime-db": ">= 1.43.0 < 2"
+ }
+ },
+ "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": "2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+ "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+ "optional": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.0.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "configstore": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+ "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+ "optional": 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"
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "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=="
+ }
+ }
+ },
+ "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=="
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ },
+ "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=",
+ "optional": true
+ },
+ "cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
+ "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==",
+ "optional": true
+ },
+ "date-and-time": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.13.1.tgz",
+ "integrity": "sha512-/Uge9DJAT+s+oAcDxtBhyR8+sKjUnZbYmyhbmWjTHNtX7B7oWD8YyYdeXcBRbwSj6hVvj+IQegJam7m7czhbFw==",
+ "optional": true
+ },
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "optional": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "deep-equal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.3.tgz",
+ "integrity": "sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA==",
+ "optional": true,
+ "requires": {
+ "es-abstract": "^1.17.5",
+ "es-get-iterator": "^1.1.0",
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.2",
+ "is-regex": "^1.0.5",
+ "isarray": "^2.0.5",
+ "object-is": "^1.1.2",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "regexp.prototype.flags": "^1.3.0",
+ "side-channel": "^1.0.2",
+ "which-boxed-primitive": "^1.0.1",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+ },
+ "dicer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
+ "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
+ "requires": {
+ "streamsearch": "0.1.2"
+ }
+ },
+ "diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true
+ },
+ "dot-prop": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
+ "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
+ "optional": true,
+ "requires": {
+ "is-obj": "^2.0.0"
+ }
+ },
+ "duplexify": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+ "optional": true,
+ "requires": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "optional": true
+ },
+ "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==",
+ "optional": 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"
+ }
+ },
+ "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==",
+ "optional": true
+ }
+ }
+ },
+ "ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "optional": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "ent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+ "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+ "optional": true
+ },
+ "es-abstract": {
+ "version": "1.17.6",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
+ "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
+ "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.0",
+ "is-regex": "^1.1.0",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "es-get-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz",
+ "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==",
+ "optional": true,
+ "requires": {
+ "es-abstract": "^1.17.4",
+ "has-symbols": "^1.0.1",
+ "is-arguments": "^1.0.4",
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-string": "^1.0.5",
+ "isarray": "^2.0.5"
+ }
+ },
+ "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==",
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ },
+ "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
+ },
+ "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
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ },
+ "event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "optional": true
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "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": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "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=="
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "optional": true
+ },
+ "fast-text-encoding": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz",
+ "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==",
+ "optional": true
+ },
+ "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==",
+ "requires": {
+ "websocket-driver": ">=0.5.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "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"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "firebase-admin": {
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-8.13.0.tgz",
+ "integrity": "sha512-krXj5ncWMJBhCpXSn9UFY6zmDWjFjqgx+1e9ATXKFYndEjmKtNBuJzqdrAdDh7aTUR7X6+0TPx4Hbc08kd0lwQ==",
+ "requires": {
+ "@firebase/database": "^0.6.0",
+ "@google-cloud/firestore": "^3.0.0",
+ "@google-cloud/storage": "^4.1.2",
+ "@types/node": "^8.10.59",
+ "dicer": "^0.3.0",
+ "jsonwebtoken": "^8.5.1",
+ "node-forge": "^0.7.6"
+ }
+ },
+ "firebase-functions": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.7.0.tgz",
+ "integrity": "sha512-+ROj2Gs2/KyM+T8jYo7AKaHynFsN49sXbgZMll3zuGa9/8oiDsXp9e1Iy2JMkFmSZg67jeYw5Ue2OSpz0XiqFQ==",
+ "requires": {
+ "@types/express": "4.17.3",
+ "cors": "^2.8.5",
+ "express": "^4.17.1",
+ "lodash": "^4.17.14"
+ }
+ },
+ "firebase-functions-test": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-0.2.1.tgz",
+ "integrity": "sha512-+ZaNrDoRVy0ar4NGtrYbqVTsnitL3/Ud5yC7ElZUkX3956j+AzPCcrsCfa+5GJnpnVODXkMKpw9AySFJ/12nvA==",
+ "dev": true,
+ "requires": {
+ "@types/lodash": "^4.14.104",
+ "lodash": "^4.17.5"
+ }
+ },
+ "foreach": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
+ "optional": true
+ },
+ "forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "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=",
+ "optional": true
+ },
+ "gaxios": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz",
+ "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==",
+ "optional": true,
+ "requires": {
+ "abort-controller": "^3.0.0",
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^5.0.0",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.3.0"
+ }
+ },
+ "gcp-metadata": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz",
+ "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==",
+ "optional": true,
+ "requires": {
+ "gaxios": "^2.1.0",
+ "json-bigint": "^0.3.0"
+ }
+ },
+ "gcs-resumable-upload": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.3.tgz",
+ "integrity": "sha512-sf896I5CC/1AxeaGfSFg3vKMjUq/r+A3bscmVzZm10CElyRanN0XwPu/MxeIO4LSP+9uF6yKzXvNsaTsMXUG6Q==",
+ "optional": true,
+ "requires": {
+ "abort-controller": "^3.0.0",
+ "configstore": "^5.0.0",
+ "gaxios": "^2.0.0",
+ "google-auth-library": "^5.0.0",
+ "pumpify": "^2.0.0",
+ "stream-events": "^1.0.4"
+ }
+ },
+ "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"
+ }
+ },
+ "google-auth-library": {
+ "version": "5.10.1",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz",
+ "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==",
+ "optional": true,
+ "requires": {
+ "arrify": "^2.0.0",
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "fast-text-encoding": "^1.0.0",
+ "gaxios": "^2.1.0",
+ "gcp-metadata": "^3.4.0",
+ "gtoken": "^4.1.0",
+ "jws": "^4.0.0",
+ "lru-cache": "^5.0.0"
+ }
+ },
+ "google-gax": {
+ "version": "1.15.3",
+ "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.15.3.tgz",
+ "integrity": "sha512-3JKJCRumNm3x2EksUTw4P1Rad43FTpqrtW9jzpf3xSMYXx+ogaqTM1vGo7VixHB4xkAyATXVIa3OcNSh8H9zsQ==",
+ "optional": true,
+ "requires": {
+ "@grpc/grpc-js": "~1.0.3",
+ "@grpc/proto-loader": "^0.5.1",
+ "@types/fs-extra": "^8.0.1",
+ "@types/long": "^4.0.0",
+ "abort-controller": "^3.0.0",
+ "duplexify": "^3.6.0",
+ "google-auth-library": "^5.0.0",
+ "is-stream-ended": "^0.1.4",
+ "lodash.at": "^4.6.0",
+ "lodash.has": "^4.5.2",
+ "node-fetch": "^2.6.0",
+ "protobufjs": "^6.8.9",
+ "retry-request": "^4.0.0",
+ "semver": "^6.0.0",
+ "walkdir": "^0.4.0"
+ }
+ },
+ "google-p12-pem": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz",
+ "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==",
+ "optional": true,
+ "requires": {
+ "node-forge": "^0.9.0"
+ },
+ "dependencies": {
+ "node-forge": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz",
+ "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==",
+ "optional": true
+ }
+ }
+ },
+ "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==",
+ "optional": true
+ },
+ "gtoken": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz",
+ "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==",
+ "optional": true,
+ "requires": {
+ "gaxios": "^2.1.0",
+ "google-p12-pem": "^2.0.0",
+ "jws": "^4.0.0",
+ "mime": "^2.2.0"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "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=="
+ },
+ "hash-stream-validation": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.3.tgz",
+ "integrity": "sha512-OEohGLoUOh+bwsIpHpdvhIXFyRGjeLqJbT8Yc5QTZPbRM7LKywagTQxnX/6mghLDOrD9YGz88hy5mLN2eKflYQ==",
+ "optional": true,
+ "requires": {
+ "through2": "^2.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "optional": true
+ },
+ "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==",
+ "optional": 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"
+ }
+ },
+ "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==",
+ "optional": true
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "optional": true,
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+ }
+ }
+ },
+ "http-parser-js": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz",
+ "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ=="
+ },
+ "http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "optional": true,
+ "requires": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "optional": true,
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "optional": 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.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "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=="
+ },
+ "is-arguments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+ "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+ "optional": true
+ },
+ "is-bigint": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz",
+ "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==",
+ "optional": true
+ },
+ "is-boolean-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz",
+ "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==",
+ "optional": true
+ },
+ "is-callable": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
+ "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw=="
+ },
+ "is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
+ },
+ "is-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz",
+ "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==",
+ "optional": true
+ },
+ "is-number-object": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
+ "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==",
+ "optional": true
+ },
+ "is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "optional": true
+ },
+ "is-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
+ "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-set": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz",
+ "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==",
+ "optional": true
+ },
+ "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==",
+ "optional": true
+ },
+ "is-stream-ended": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz",
+ "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==",
+ "optional": 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==",
+ "optional": true
+ },
+ "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==",
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-typed-array": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz",
+ "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==",
+ "optional": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.0",
+ "es-abstract": "^1.17.4",
+ "foreach": "^2.0.5",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "optional": true
+ },
+ "is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "optional": true
+ },
+ "is-weakset": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
+ "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==",
+ "optional": true
+ },
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "optional": 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.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "json-bigint": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.1.tgz",
+ "integrity": "sha512-DGWnSzmusIreWlEupsUelHrhwmPPE+FiQvg+drKfk2p+bdEYa5mp4PJ8JsCWqae0M2jQNb0HPvnwvf1qOTThzQ==",
+ "optional": true,
+ "requires": {
+ "bignumber.js": "^9.0.0"
+ }
+ },
+ "jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "requires": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "dependencies": {
+ "jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "requires": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+ }
+ }
+ },
+ "jwa": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
+ "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
+ "optional": true,
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+ "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+ "optional": true,
+ "requires": {
+ "jwa": "^2.0.0",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "lodash": {
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
+ },
+ "lodash.at": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz",
+ "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=",
+ "optional": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "optional": true
+ },
+ "lodash.has": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz",
+ "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=",
+ "optional": true
+ },
+ "lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
+ },
+ "lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
+ },
+ "lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
+ },
+ "lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
+ },
+ "lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+ },
+ "long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
+ "optional": 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==",
+ "optional": true,
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "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==",
+ "optional": true,
+ "requires": {
+ "semver": "^6.0.0"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ },
+ "mime": {
+ "version": "2.4.6",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+ "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+ "optional": 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=="
+ },
+ "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==",
+ "requires": {
+ "mime-db": "1.44.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "optional": 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": "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.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+ },
+ "node-fetch": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
+ "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==",
+ "optional": true
+ },
+ "node-forge": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz",
+ "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw=="
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+ },
+ "object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
+ },
+ "object-is": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
+ "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
+ "optional": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+ },
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "requires": {
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
+ }
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+ "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+ "optional": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "optional": true,
+ "requires": {
+ "p-try": "^2.0.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==",
+ "optional": true
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "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-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="
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "optional": true
+ },
+ "protobufjs": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.9.0.tgz",
+ "integrity": "sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg==",
+ "optional": true,
+ "requires": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/long": "^4.0.1",
+ "@types/node": "^13.7.0",
+ "long": "^4.0.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "13.13.12",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.12.tgz",
+ "integrity": "sha512-zWz/8NEPxoXNT9YyF2osqyA9WjssZukYpgI4UYZpOjcyqwIUqWGkcCionaEb9Ki+FULyPyvNFpg/329Kd2/pbw==",
+ "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==",
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "optional": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "pumpify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz",
+ "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==",
+ "optional": true,
+ "requires": {
+ "duplexify": "^4.1.1",
+ "inherits": "^2.0.3",
+ "pump": "^3.0.0"
+ },
+ "dependencies": {
+ "duplexify": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz",
+ "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==",
+ "optional": true,
+ "requires": {
+ "end-of-stream": "^1.4.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1",
+ "stream-shift": "^1.0.0"
+ }
+ }
+ }
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+ },
+ "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=="
+ },
+ "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==",
+ "requires": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "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==",
+ "optional": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "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==",
+ "optional": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ }
+ },
+ "resolve": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "retry-request": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz",
+ "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==",
+ "optional": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "through2": "^3.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=="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "optional": true
+ },
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "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": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "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=="
+ }
+ }
+ },
+ "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==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+ },
+ "side-channel": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz",
+ "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==",
+ "optional": true,
+ "requires": {
+ "es-abstract": "^1.17.0-next.1",
+ "object-inspect": "^1.7.0"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "optional": true
+ },
+ "snakeize": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz",
+ "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=",
+ "optional": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ },
+ "stream-events": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz",
+ "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==",
+ "optional": true,
+ "requires": {
+ "stubs": "^3.0.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==",
+ "optional": true
+ },
+ "streamsearch": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
+ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
+ "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
+ "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "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==",
+ "optional": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ },
+ "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==",
+ "optional": true
+ }
+ }
+ },
+ "stubs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz",
+ "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=",
+ "optional": 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"
+ }
+ },
+ "teeny-request": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.3.tgz",
+ "integrity": "sha512-TZG/dfd2r6yeji19es1cUIwAlVD8y+/svB1kAC2Y0bjEyysrfbO8EZvJBRwIE6WkwmUoB7uvWLwTIhJbMXZ1Dw==",
+ "optional": true,
+ "requires": {
+ "http-proxy-agent": "^4.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "node-fetch": "^2.2.0",
+ "stream-events": "^1.0.5",
+ "uuid": "^7.0.0"
+ }
+ },
+ "through2": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
+ "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
+ "optional": true,
+ "requires": {
+ "inherits": "^2.0.4",
+ "readable-stream": "2 || 3"
+ }
+ },
+ "toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+ },
+ "tslib": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+ "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
+ },
+ "tslint": {
+ "version": "5.20.1",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz",
+ "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^4.0.1",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.8.0",
+ "tsutils": "^2.29.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "optional": 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==",
+ "optional": true,
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "typescript": {
+ "version": "3.9.6",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.6.tgz",
+ "integrity": "sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw==",
+ "dev": true
+ },
+ "unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "optional": true,
+ "requires": {
+ "crypto-random-string": "^2.0.0"
+ }
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "optional": true
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+ },
+ "uuid": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+ "optional": true
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ },
+ "walkdir": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
+ "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==",
+ "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==",
+ "requires": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ }
+ },
+ "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=="
+ },
+ "which-boxed-primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz",
+ "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==",
+ "optional": true,
+ "requires": {
+ "is-bigint": "^1.0.0",
+ "is-boolean-object": "^1.0.0",
+ "is-number-object": "^1.0.3",
+ "is-string": "^1.0.4",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "which-collection": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "optional": true,
+ "requires": {
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-weakmap": "^2.0.1",
+ "is-weakset": "^2.0.1"
+ }
+ },
+ "which-typed-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz",
+ "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==",
+ "optional": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.2",
+ "es-abstract": "^1.17.5",
+ "foreach": "^2.0.5",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.1",
+ "is-typed-array": "^1.1.3"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "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==",
+ "optional": true,
+ "requires": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "xdg-basedir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+ "optional": true
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "optional": true
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "optional": true
+ }
+ }
+}
diff --git a/cloud_functions/functions/package.json b/cloud_functions/functions/package.json
new file mode 100644
index 0000000..08e276b
--- /dev/null
+++ b/cloud_functions/functions/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "functions",
+ "scripts": {
+ "lint": "tslint --project tsconfig.json",
+ "build": "tsc",
+ "serve": "npm run build && firebase emulators:start --only functions",
+ "shell": "npm run build && firebase functions:shell",
+ "start": "npm run shell",
+ "deploy": "firebase deploy --only functions",
+ "logs": "firebase functions:log"
+ },
+ "engines": {
+ "node": "10"
+ },
+ "main": "lib/index.js",
+ "dependencies": {
+ "firebase-admin": "^8.10.0",
+ "firebase-functions": "^3.6.1"
+ },
+ "devDependencies": {
+ "tslint": "^5.12.0",
+ "typescript": "^3.8.0",
+ "firebase-functions-test": "^0.2.0"
+ },
+ "private": true
+}
diff --git a/cloud_functions/functions/src/index.ts b/cloud_functions/functions/src/index.ts
new file mode 100644
index 0000000..d1992fd
--- /dev/null
+++ b/cloud_functions/functions/src/index.ts
@@ -0,0 +1,34 @@
+import * as functions from 'firebase-functions';
+import * as admin from 'firebase-admin';
+admin.initializeApp();
+// // Start writing Firebase Functions
+// // https://firebase.google.com/docs/functions/typescript
+//
+const db = admin.firestore();
+const fcm = admin.messaging();
+
+export const helloWorld = functions.https.onRequest((request, response) => {
+ response.send("Hello from Firebase!");
+});
+
+export const sendToDevice = functions.firestore.document('users').onCreate(async snapshot => {
+
+ const querySnapshot = await db.collection('tokens').get();
+
+ const tokens = new Array();
+
+ querySnapshot.forEach(async tokenDoc => {
+ tokens.push(tokenDoc.data().token);
+ });
+
+ const payload : admin.messaging.MessagingPayload = {
+ notification : {
+ title : 'Guava ',
+ body : 'How are you today? ',
+ click_action : 'FLUTTER_NOTIFICATION_CLICK'
+ }
+ };
+
+ return fcm.sendToDevice(tokens , payload);
+
+});
diff --git a/cloud_functions/functions/tsconfig.json b/cloud_functions/functions/tsconfig.json
new file mode 100644
index 0000000..7ce05d0
--- /dev/null
+++ b/cloud_functions/functions/tsconfig.json
@@ -0,0 +1,15 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "noImplicitReturns": true,
+ "noUnusedLocals": true,
+ "outDir": "lib",
+ "sourceMap": true,
+ "strict": true,
+ "target": "es2017"
+ },
+ "compileOnSave": true,
+ "include": [
+ "src"
+ ]
+}
diff --git a/cloud_functions/functions/tslint.json b/cloud_functions/functions/tslint.json
new file mode 100644
index 0000000..98b2bfd
--- /dev/null
+++ b/cloud_functions/functions/tslint.json
@@ -0,0 +1,115 @@
+{
+ "rules": {
+ // -- Strict errors --
+ // These lint rules are likely always a good idea.
+
+ // Force function overloads to be declared together. This ensures readers understand APIs.
+ "adjacent-overload-signatures": true,
+
+ // Do not allow the subtle/obscure comma operator.
+ "ban-comma-operator": true,
+
+ // Do not allow internal modules or namespaces . These are deprecated in favor of ES6 modules.
+ "no-namespace": true,
+
+ // Do not allow parameters to be reassigned. To avoid bugs, developers should instead assign new values to new vars.
+ "no-parameter-reassignment": true,
+
+ // Force the use of ES6-style imports instead of /// imports.
+ "no-reference": true,
+
+ // Do not allow type assertions that do nothing. This is a big warning that the developer may not understand the
+ // code currently being edited (they may be incorrectly handling a different type case that does not exist).
+ "no-unnecessary-type-assertion": true,
+
+ // Disallow nonsensical label usage.
+ "label-position": true,
+
+ // Disallows the (often typo) syntax if (var1 = var2). Replace with if (var2) { var1 = var2 }.
+ "no-conditional-assignment": true,
+
+ // Disallows constructors for primitive types (e.g. new Number('123'), though Number('123') is still allowed).
+ "no-construct": true,
+
+ // Do not allow super() to be called twice in a constructor.
+ "no-duplicate-super": true,
+
+ // Do not allow the same case to appear more than once in a switch block.
+ "no-duplicate-switch-case": true,
+
+ // Do not allow a variable to be declared more than once in the same block. Consider function parameters in this
+ // rule.
+ "no-duplicate-variable": [true, "check-parameters"],
+
+ // Disallows a variable definition in an inner scope from shadowing a variable in an outer scope. Developers should
+ // instead use a separate variable name.
+ "no-shadowed-variable": true,
+
+ // Empty blocks are almost never needed. Allow the one general exception: empty catch blocks.
+ "no-empty": [true, "allow-empty-catch"],
+
+ // Functions must either be handled directly (e.g. with a catch() handler) or returned to another function.
+ // This is a major source of errors in Cloud Functions and the team strongly recommends leaving this rule on.
+ "no-floating-promises": true,
+
+ // Do not allow any imports for modules that are not in package.json. These will almost certainly fail when
+ // deployed.
+ "no-implicit-dependencies": true,
+
+ // The 'this' keyword can only be used inside of classes.
+ "no-invalid-this": true,
+
+ // Do not allow strings to be thrown because they will not include stack traces. Throw Errors instead.
+ "no-string-throw": true,
+
+ // Disallow control flow statements, such as return, continue, break, and throw in finally blocks.
+ "no-unsafe-finally": true,
+
+ // Expressions must always return a value. Avoids common errors like const myValue = functionReturningVoid();
+ "no-void-expression": [true, "ignore-arrow-function-shorthand"],
+
+ // Disallow duplicate imports in the same file.
+ "no-duplicate-imports": true,
+
+
+ // -- Strong Warnings --
+ // These rules should almost never be needed, but may be included due to legacy code.
+ // They are left as a warning to avoid frustration with blocked deploys when the developer
+ // understand the warning and wants to deploy anyway.
+
+ // Warn when an empty interface is defined. These are generally not useful.
+ "no-empty-interface": {"severity": "warning"},
+
+ // Warn when an import will have side effects.
+ "no-import-side-effect": {"severity": "warning"},
+
+ // Warn when variables are defined with var. Var has subtle meaning that can lead to bugs. Strongly prefer const for
+ // most values and let for values that will change.
+ "no-var-keyword": {"severity": "warning"},
+
+ // Prefer === and !== over == and !=. The latter operators support overloads that are often accidental.
+ "triple-equals": {"severity": "warning"},
+
+ // Warn when using deprecated APIs.
+ "deprecation": {"severity": "warning"},
+
+ // -- Light Warnings --
+ // These rules are intended to help developers use better style. Simpler code has fewer bugs. These would be "info"
+ // if TSLint supported such a level.
+
+ // prefer for( ... of ... ) to an index loop when the index is only used to fetch an object from an array.
+ // (Even better: check out utils like .map if transforming an array!)
+ "prefer-for-of": {"severity": "warning"},
+
+ // Warns if function overloads could be unified into a single function with optional or rest parameters.
+ "unified-signatures": {"severity": "warning"},
+
+ // Prefer const for values that will not change. This better documents code.
+ "prefer-const": {"severity": "warning"},
+
+ // Multi-line object literals and function calls should have a trailing comma. This helps avoid merge conflicts.
+ "trailing-comma": {"severity": "warning"}
+ },
+
+ "defaultSeverity": "error"
+}
diff --git a/images/camilia.jpg b/images/camilia.jpg
deleted file mode 100644
index b2e7518..0000000
Binary files a/images/camilia.jpg and /dev/null differ
diff --git a/images/default.png b/images/default.png
deleted file mode 100644
index 822078a..0000000
Binary files a/images/default.png and /dev/null differ
diff --git a/images/facebook.png b/images/facebook.png
deleted file mode 100644
index 1c3d7fe..0000000
Binary files a/images/facebook.png and /dev/null differ
diff --git a/images/food.jpg b/images/food.jpg
deleted file mode 100644
index 2fc4dcb..0000000
Binary files a/images/food.jpg and /dev/null differ
diff --git a/images/health.jpg b/images/health.jpg
deleted file mode 100644
index a71d28c..0000000
Binary files a/images/health.jpg and /dev/null differ
diff --git a/images/onboarding/cooking.png b/images/onboarding/cooking.png
new file mode 100644
index 0000000..160b158
Binary files /dev/null and b/images/onboarding/cooking.png differ
diff --git a/images/onboarding/health2.png b/images/onboarding/health2.png
new file mode 100644
index 0000000..b2eff82
Binary files /dev/null and b/images/onboarding/health2.png differ
diff --git a/images/onboarding/medical.png b/images/onboarding/medical.png
new file mode 100644
index 0000000..0fed6d5
Binary files /dev/null and b/images/onboarding/medical.png differ
diff --git a/images/onboarding/working_out.png b/images/onboarding/working_out.png
new file mode 100644
index 0000000..ee68c0e
Binary files /dev/null and b/images/onboarding/working_out.png differ
diff --git a/images/beef.jpeg b/images/recipes/beef.jpeg
similarity index 100%
rename from images/beef.jpeg
rename to images/recipes/beef.jpeg
diff --git a/images/chiken.jpg b/images/recipes/chiken.jpg
similarity index 100%
rename from images/chiken.jpg
rename to images/recipes/chiken.jpg
diff --git a/images/greek.jpg b/images/recipes/greek.jpg
similarity index 100%
rename from images/greek.jpg
rename to images/recipes/greek.jpg
diff --git a/images/marsala.jpeg b/images/recipes/marsala.jpeg
similarity index 100%
rename from images/marsala.jpeg
rename to images/recipes/marsala.jpeg
diff --git a/images/nutty-chicken-sate-strips.jpg b/images/recipes/nutty-chicken-sate-strips.jpg
similarity index 100%
rename from images/nutty-chicken-sate-strips.jpg
rename to images/recipes/nutty-chicken-sate-strips.jpg
diff --git a/images/pomegranate-chicken.jpg b/images/recipes/pomegranate-chicken.jpg
similarity index 100%
rename from images/pomegranate-chicken.jpg
rename to images/recipes/pomegranate-chicken.jpg
diff --git a/images/prawn-harissa-spaghetti.jpg b/images/recipes/prawn-harissa-spaghetti.jpg
similarity index 100%
rename from images/prawn-harissa-spaghetti.jpg
rename to images/recipes/prawn-harissa-spaghetti.jpg
diff --git a/images/ree.jpeg b/images/recipes/ree.jpeg
similarity index 100%
rename from images/ree.jpeg
rename to images/recipes/ree.jpeg
diff --git a/images/spiced-carrot.jpg b/images/recipes/spiced-carrot.jpg
similarity index 100%
rename from images/spiced-carrot.jpg
rename to images/recipes/spiced-carrot.jpg
diff --git a/images/yogurt-cake.jpeg b/images/recipes/yogurt-cake.jpeg
similarity index 100%
rename from images/yogurt-cake.jpeg
rename to images/recipes/yogurt-cake.jpeg
diff --git a/images/sick.jpg b/images/sick.jpg
deleted file mode 100644
index 11b0b78..0000000
Binary files a/images/sick.jpg and /dev/null differ
diff --git a/images/working_out.gif b/images/working_out.gif
new file mode 100644
index 0000000..55e8422
Binary files /dev/null and b/images/working_out.gif differ
diff --git a/lib/Animation/FadeAnimation.dart b/lib/Animation/FadeAnimation.dart
deleted file mode 100644
index 055a9af..0000000
--- a/lib/Animation/FadeAnimation.dart
+++ /dev/null
@@ -1,33 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:simple_animations/simple_animations.dart';
-
-class FadeAnimation extends StatelessWidget {
- final double delay;
- final Widget child;
-
- FadeAnimation(this.delay, this.child);
-
- @override
- Widget build(BuildContext context) {
- final tween = MultiTrackTween([
- Track("opacity").add(Duration(milliseconds: 500), Tween(begin: 0.0, end: 1.0)),
- Track("translateY").add(
- Duration(milliseconds: 500), Tween(begin: -30.0, end: 0.0),
- curve: Curves.easeOut)
- ]);
-
- return ControlledAnimation(
- delay: Duration(milliseconds: (500 * delay).round()),
- duration: tween.duration,
- tween: tween,
- child: child,
- builderWithChild: (context, child, animation) => Opacity(
- opacity: animation["opacity"],
- child: Transform.translate(
- offset: Offset(0, animation["translateY"]),
- child: child
- ),
- ),
- );
- }
-}
\ No newline at end of file
diff --git a/lib/Others/loading.dart b/lib/Others/loading.dart
new file mode 100644
index 0000000..1699bae
--- /dev/null
+++ b/lib/Others/loading.dart
@@ -0,0 +1,16 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_spinkit/flutter_spinkit.dart';
+
+class Loading extends StatelessWidget {
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ color: Colors.white,
+ child: SpinKitPumpingHeart(
+ color: Colors.blue,
+ size: 50.0,
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/Others/moods.dart b/lib/Others/moods.dart
index 1ebc792..4c144ec 100644
--- a/lib/Others/moods.dart
+++ b/lib/Others/moods.dart
@@ -1,4 +1,6 @@
+import 'package:app/Others/theme.dart';
import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
class MoodsSelector extends StatefulWidget {
// MoodsSelector({Key key}) : super(key: key);
@@ -14,6 +16,7 @@ class _MoodsSelectorState extends State {
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
return Center(
child: ToggleButtons(
selectedColor: Colors.blueAccent,
diff --git a/lib/Others/theme.dart b/lib/Others/theme.dart
new file mode 100644
index 0000000..bfadfdc
--- /dev/null
+++ b/lib/Others/theme.dart
@@ -0,0 +1,14 @@
+import 'package:flutter/material.dart';
+
+class ThemeChanger with ChangeNotifier {
+ ThemeData _themeData;
+
+ ThemeChanger(this._themeData);
+
+ getTheme() => _themeData;
+ setTheme(ThemeData theme) {
+ _themeData = theme;
+
+ notifyListeners();
+ }
+}
diff --git a/lib/Others/utisl.dart b/lib/Others/utisl.dart
index edbc19c..d49b3ca 100644
--- a/lib/Others/utisl.dart
+++ b/lib/Others/utisl.dart
@@ -7,16 +7,15 @@ const lightColor = Colors.greenAccent;
const darkRedColor = Colors.cyan;
const lightRedColor = Color(0xFFFD685A);
-const purpleGradient = LinearGradient(
+const cyanGradient = LinearGradient(
colors: [darkColor, midColor, lightColor],
stops: [0.0, 0.5, 1.0],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
);
-
-const redGradient = LinearGradient(
- colors: [darkRedColor, lightRedColor],
- stops: [0.0, 1.0],
+const whiteGradient = LinearGradient(
+ colors: [Colors.black54, Colors.black54, Colors.black12],
+ stops: [0.0, 0.5, 1.0],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
);
diff --git a/lib/Recipes/eight.dart b/lib/Recipes/eight.dart
new file mode 100644
index 0000000..9881240
--- /dev/null
+++ b/lib/Recipes/eight.dart
@@ -0,0 +1,229 @@
+import 'package:app/Others/theme.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+class EightRecipe extends StatefulWidget {
+ @override
+ _EightRecipeState createState() => _EightRecipeState();
+}
+
+class _EightRecipeState extends State {
+
+ final String image = "images/recipes/chiken.jpg";
+ var favIcon = Icon(Icons.favorite_border);
+
+ void btnToggle(){
+ if (favIcon != Icon(Icons.favorite)) {
+ favIcon = Icon(Icons.favorite);
+ } else if(favIcon == Icon(Icons.favorite)) {
+ favIcon = Icon(Icons.favorite_border);
+ }
+ }
+ _video() async {
+ const url = 'https://www.youtube.com/watch?v=UzUqoLe4At0';
+ if (await canLaunch(url)) {
+ await launch(url);
+ } else {
+ throw 'Could not launch $url';
+ }
+ }
+ @override
+ Widget build(BuildContext context) {
+ final theme = Provider.of(context);
+ return Scaffold(
+ body: Stack(
+ children: [
+ Container(
+ foregroundDecoration: BoxDecoration(
+ color: Colors.black26
+ ),
+ height: 400,
+ child: Image.asset(image, fit: BoxFit.cover)),
+ SingleChildScrollView(
+ padding: const EdgeInsets.only(top: 16.0,bottom: 20.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const SizedBox(height: 250),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal:16.0),
+ child: Text(
+ "Chicken Satay Salad",
+ style: TextStyle(color: Colors.white, fontSize: 28.0, fontWeight: FontWeight.bold),
+ ),
+ ),
+ Row(
+ children: [
+ const SizedBox(width: 16.0),
+ Container(
+ padding: const EdgeInsets.symmetric(
+ vertical: 8.0,
+ horizontal: 16.0,
+ ),
+ decoration: BoxDecoration(
+ color: Colors.grey,
+ borderRadius: BorderRadius.circular(20.0)),
+ child: Text(
+ "255 reviews",
+ style: TextStyle(color: Colors.white, fontSize: 13.0),
+ ),
+ ),
+ Spacer(),
+ IconButton(
+ color: Colors.white,
+ icon: favIcon,
+ onPressed: () {
+ setState(() {
+ btnToggle();
+ });
+ },
+ )
+ ],
+ ),
+ Container(
+ padding: const EdgeInsets.all(32.0),
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Row(
+ children: [
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ children: [
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ const SizedBox(height: 30.0),
+ SizedBox(
+ width: double.infinity,
+ child: RaisedButton(
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),
+ color: Colors.blueAccent,
+ textColor: Colors.white,
+ child: Text("Video", style: TextStyle(
+ fontWeight: FontWeight.normal
+ ),),
+ padding: const EdgeInsets.symmetric(
+ vertical: 16.0,
+ horizontal: 32.0,
+ ),
+ onPressed: _video,
+ ),
+ ),
+ const SizedBox(height: 30.0),
+ Text("Ingredients".toUpperCase(), style: TextStyle(
+ fontWeight: FontWeight.w600,
+ fontSize: 14.0
+ ),),
+ const SizedBox(height: 10.0),
+ Text(
+ """
+1 pound extra-lean ground beef
+
+1 onion, diced
+
+4 cloves garlic, minced
+
+1 jalapeno, minced
+
+1 red pepper, diced
+
+1 can small red beans or pinto beans, preferably low sodium drained and rinsed
+
+1 1/2 cups no-salt-added tomato sauce
+
+2 tablespoons tomato paste
+
+1 tablespoon red wine vinegar
+
+1 tablespoon molasses
+
+1 tablespoon Worcestershire sauce
+
+1 teaspoon mustard powder
+
+3/4 teaspoon salt
+
+Freshly ground black pepper
+
+8 whole-wheat burger buns
+
+ """,
+ textAlign: TextAlign.justify, style: TextStyle(
+ fontWeight: FontWeight.w300,
+ fontSize: 14.0
+ ),),
+ const SizedBox(height: 10.0),
+ Text("Method".toUpperCase(), style: TextStyle(
+ fontWeight: FontWeight.w600,
+ fontSize: 14.0
+ ),),
+ Text(
+ """
+1. Brown the meat and the onion in a large nonstick skillet over medium-high heat for 5 minutes,
+2. breaking up the meat into crumbles as it cooks. Pour the drippings out of the pan and discard.
+3. Add the garlic, jalapeno, and red pepper and cook 5 minutes more, stirring occasionally.
+4. Stir in the rest of the ingredients, reduce heat to low, and simmer for 5 minutes more.
+5. Place a half-cup scoop of the mixture onto each bun and serve.
+
+ """
+ , textAlign: TextAlign.justify, style: TextStyle(
+ fontWeight: FontWeight.w300,
+ fontSize: 14.0
+ ),),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ Positioned(
+ top: 0,
+ left: 0,
+ right: 0,
+ child: AppBar(
+ backgroundColor: Colors.transparent,
+ elevation: 0,
+ centerTitle: true,
+ title: Text("DETAIL",style: TextStyle(
+ fontSize: 16.0,
+ fontWeight: FontWeight.normal
+ ),),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
+
diff --git a/lib/Recipes/five.dart b/lib/Recipes/five.dart
index 6e43cd6..ac0a76e 100644
--- a/lib/Recipes/five.dart
+++ b/lib/Recipes/five.dart
@@ -1,4 +1,6 @@
+import 'package:app/Others/theme.dart';
import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class FiveRecipe extends StatefulWidget {
@@ -9,7 +11,7 @@ class FiveRecipe extends StatefulWidget {
class _FiveRecipeState extends State {
- final String image = "images/ree.jpeg";
+ final String image = "images/recipes/ree.jpeg";
var favIcon = Icon(Icons.favorite_border);
void btnToggle(){
@@ -29,6 +31,7 @@ class _FiveRecipeState extends State {
}
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
return Scaffold(
body: Stack(
children: [
@@ -81,7 +84,7 @@ class _FiveRecipeState extends State {
),
Container(
padding: const EdgeInsets.all(32.0),
- color: Colors.white,
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
diff --git a/lib/Recipes/four.dart b/lib/Recipes/four.dart
index 715e4f0..d76c9c4 100644
--- a/lib/Recipes/four.dart
+++ b/lib/Recipes/four.dart
@@ -1,4 +1,6 @@
+import 'package:app/Others/theme.dart';
import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class FourRecipe extends StatefulWidget {
@@ -9,7 +11,7 @@ class FourRecipe extends StatefulWidget {
class _FourRecipeState extends State {
- final String image = "images/beef.jpeg";
+ final String image = "images/recipes/beef.jpeg";
var favIcon = Icon(Icons.favorite_border);
void btnToggle(){
@@ -29,6 +31,8 @@ class _FourRecipeState extends State {
}
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
+
return Scaffold(
body: Stack(
children: [
@@ -81,7 +85,7 @@ class _FourRecipeState extends State {
),
Container(
padding: const EdgeInsets.all(32.0),
- color: Colors.white,
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
diff --git a/lib/Recipes/nine.dart b/lib/Recipes/nine.dart
new file mode 100644
index 0000000..c5c0cae
--- /dev/null
+++ b/lib/Recipes/nine.dart
@@ -0,0 +1,229 @@
+import 'package:app/Others/theme.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+class NineRecipe extends StatefulWidget {
+ @override
+ _NineRecipeState createState() => _NineRecipeState();
+}
+
+class _NineRecipeState extends State {
+
+ final String image = "images/recipes/chiken.jpg";
+ var favIcon = Icon(Icons.favorite_border);
+
+ void btnToggle(){
+ if (favIcon != Icon(Icons.favorite)) {
+ favIcon = Icon(Icons.favorite);
+ } else if(favIcon == Icon(Icons.favorite)) {
+ favIcon = Icon(Icons.favorite_border);
+ }
+ }
+ _video() async {
+ const url = 'https://www.youtube.com/watch?v=UzUqoLe4At0';
+ if (await canLaunch(url)) {
+ await launch(url);
+ } else {
+ throw 'Could not launch $url';
+ }
+ }
+ @override
+ Widget build(BuildContext context) {
+ final theme = Provider.of(context);
+ return Scaffold(
+ body: Stack(
+ children: [
+ Container(
+ foregroundDecoration: BoxDecoration(
+ color: Colors.black26
+ ),
+ height: 400,
+ child: Image.asset(image, fit: BoxFit.cover)),
+ SingleChildScrollView(
+ padding: const EdgeInsets.only(top: 16.0,bottom: 20.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const SizedBox(height: 250),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal:16.0),
+ child: Text(
+ "Chicken Satay Salad",
+ style: TextStyle(color: Colors.white, fontSize: 28.0, fontWeight: FontWeight.bold),
+ ),
+ ),
+ Row(
+ children: [
+ const SizedBox(width: 16.0),
+ Container(
+ padding: const EdgeInsets.symmetric(
+ vertical: 8.0,
+ horizontal: 16.0,
+ ),
+ decoration: BoxDecoration(
+ color: Colors.grey,
+ borderRadius: BorderRadius.circular(20.0)),
+ child: Text(
+ "255 reviews",
+ style: TextStyle(color: Colors.white, fontSize: 13.0),
+ ),
+ ),
+ Spacer(),
+ IconButton(
+ color: Colors.white,
+ icon: favIcon,
+ onPressed: () {
+ setState(() {
+ btnToggle();
+ });
+ },
+ )
+ ],
+ ),
+ Container(
+ padding: const EdgeInsets.all(32.0),
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Row(
+ children: [
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ children: [
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ const SizedBox(height: 30.0),
+ SizedBox(
+ width: double.infinity,
+ child: RaisedButton(
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),
+ color: Colors.blueAccent,
+ textColor: Colors.white,
+ child: Text("Video", style: TextStyle(
+ fontWeight: FontWeight.normal
+ ),),
+ padding: const EdgeInsets.symmetric(
+ vertical: 16.0,
+ horizontal: 32.0,
+ ),
+ onPressed: _video,
+ ),
+ ),
+ const SizedBox(height: 30.0),
+ Text("Ingredients".toUpperCase(), style: TextStyle(
+ fontWeight: FontWeight.w600,
+ fontSize: 14.0
+ ),),
+ const SizedBox(height: 10.0),
+ Text(
+ """
+1 pound extra-lean ground beef
+
+1 onion, diced
+
+4 cloves garlic, minced
+
+1 jalapeno, minced
+
+1 red pepper, diced
+
+1 can small red beans or pinto beans, preferably low sodium drained and rinsed
+
+1 1/2 cups no-salt-added tomato sauce
+
+2 tablespoons tomato paste
+
+1 tablespoon red wine vinegar
+
+1 tablespoon molasses
+
+1 tablespoon Worcestershire sauce
+
+1 teaspoon mustard powder
+
+3/4 teaspoon salt
+
+Freshly ground black pepper
+
+8 whole-wheat burger buns
+
+ """,
+ textAlign: TextAlign.justify, style: TextStyle(
+ fontWeight: FontWeight.w300,
+ fontSize: 14.0
+ ),),
+ const SizedBox(height: 10.0),
+ Text("Method".toUpperCase(), style: TextStyle(
+ fontWeight: FontWeight.w600,
+ fontSize: 14.0
+ ),),
+ Text(
+ """
+1. Brown the meat and the onion in a large nonstick skillet over medium-high heat for 5 minutes,
+2. breaking up the meat into crumbles as it cooks. Pour the drippings out of the pan and discard.
+3. Add the garlic, jalapeno, and red pepper and cook 5 minutes more, stirring occasionally.
+4. Stir in the rest of the ingredients, reduce heat to low, and simmer for 5 minutes more.
+5. Place a half-cup scoop of the mixture onto each bun and serve.
+
+ """
+ , textAlign: TextAlign.justify, style: TextStyle(
+ fontWeight: FontWeight.w300,
+ fontSize: 14.0
+ ),),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ Positioned(
+ top: 0,
+ left: 0,
+ right: 0,
+ child: AppBar(
+ backgroundColor: Colors.transparent,
+ elevation: 0,
+ centerTitle: true,
+ title: Text("DETAIL",style: TextStyle(
+ fontSize: 16.0,
+ fontWeight: FontWeight.normal
+ ),),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
+
diff --git a/lib/Recipes/one.dart b/lib/Recipes/one.dart
index d0810e6..41de8c0 100644
--- a/lib/Recipes/one.dart
+++ b/lib/Recipes/one.dart
@@ -1,4 +1,6 @@
+import 'package:app/Others/theme.dart';
import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class Recipe extends StatefulWidget {
@@ -8,7 +10,7 @@ class Recipe extends StatefulWidget {
class _RecipeState extends State {
- final String image = "images/chiken.jpg";
+ final String image = "images/recipes/chiken.jpg";
var favIcon = Icon(Icons.favorite_border);
void btnToggle(){
@@ -28,6 +30,7 @@ void btnToggle(){
}
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
return Scaffold(
body: Stack(
children: [
@@ -80,7 +83,7 @@ void btnToggle(){
),
Container(
padding: const EdgeInsets.all(32.0),
- color: Colors.white,
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
diff --git a/lib/Recipes/seven.dart b/lib/Recipes/seven.dart
new file mode 100644
index 0000000..f9f43a8
--- /dev/null
+++ b/lib/Recipes/seven.dart
@@ -0,0 +1,229 @@
+import 'package:app/Others/theme.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+class SevenRecipe extends StatefulWidget {
+ @override
+ _SevenRecipeState createState() => _SevenRecipeState();
+}
+
+class _SevenRecipeState extends State {
+
+ final String image = "https://food.fnr.sndimg.com/content/dam/images/food/fullset/2011/11/4/1/CCHAP402_Sloppy-Joes_s4x3.jpg.rend.hgtvcom.826.620.suffix/1382540648899.jpeg";
+ var favIcon = Icon(Icons.favorite_border);
+
+ void btnToggle(){
+ if (favIcon != Icon(Icons.favorite)) {
+ favIcon = Icon(Icons.favorite);
+ } else if(favIcon == Icon(Icons.favorite)) {
+ favIcon = Icon(Icons.favorite_border);
+ }
+ }
+ _video() async {
+ const url = 'https://www.youtube.com/watch?v=UzUqoLe4At0';
+ if (await canLaunch(url)) {
+ await launch(url);
+ } else {
+ throw 'Could not launch $url';
+ }
+ }
+ @override
+ Widget build(BuildContext context) {
+ final theme = Provider.of(context);
+ return Scaffold(
+ body: Stack(
+ children: [
+ Container(
+ foregroundDecoration: BoxDecoration(
+ color: Colors.black26
+ ),
+ height: 400,
+ child: Image.network(image, fit: BoxFit.cover)),
+ SingleChildScrollView(
+ padding: const EdgeInsets.only(top: 16.0,bottom: 20.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const SizedBox(height: 250),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal:16.0),
+ child: Text(
+ "Sloppy Joes",
+ style: TextStyle(color: Colors.white, fontSize: 28.0, fontWeight: FontWeight.bold),
+ ),
+ ),
+ Row(
+ children: [
+ const SizedBox(width: 16.0),
+ Container(
+ padding: const EdgeInsets.symmetric(
+ vertical: 8.0,
+ horizontal: 16.0,
+ ),
+ decoration: BoxDecoration(
+ color: Colors.grey,
+ borderRadius: BorderRadius.circular(20.0)),
+ child: Text(
+ "255 reviews",
+ style: TextStyle(color: Colors.white, fontSize: 13.0),
+ ),
+ ),
+ Spacer(),
+ IconButton(
+ color: Colors.white,
+ icon: favIcon,
+ onPressed: () {
+ setState(() {
+ btnToggle();
+ });
+ },
+ )
+ ],
+ ),
+ Container(
+ padding: const EdgeInsets.all(32.0),
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Row(
+ children: [
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ children: [
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ const SizedBox(height: 30.0),
+ SizedBox(
+ width: double.infinity,
+ child: RaisedButton(
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),
+ color: Colors.blueAccent,
+ textColor: Colors.white,
+ child: Text("Video", style: TextStyle(
+ fontWeight: FontWeight.normal
+ ),),
+ padding: const EdgeInsets.symmetric(
+ vertical: 16.0,
+ horizontal: 32.0,
+ ),
+ onPressed: _video,
+ ),
+ ),
+ const SizedBox(height: 30.0),
+ Text("Ingredients".toUpperCase(), style: TextStyle(
+ fontWeight: FontWeight.w600,
+ fontSize: 14.0
+ ),),
+ const SizedBox(height: 10.0),
+ Text(
+ """
+1 pound extra-lean ground beef
+
+1 onion, diced
+
+4 cloves garlic, minced
+
+1 jalapeno, minced
+
+1 red pepper, diced
+
+1 can small red beans or pinto beans, preferably low sodium drained and rinsed
+
+1 1/2 cups no-salt-added tomato sauce
+
+2 tablespoons tomato paste
+
+1 tablespoon red wine vinegar
+
+1 tablespoon molasses
+
+1 tablespoon Worcestershire sauce
+
+1 teaspoon mustard powder
+
+3/4 teaspoon salt
+
+Freshly ground black pepper
+
+8 whole-wheat burger buns
+
+ """,
+ textAlign: TextAlign.justify, style: TextStyle(
+ fontWeight: FontWeight.w300,
+ fontSize: 14.0
+ ),),
+ const SizedBox(height: 10.0),
+ Text("Method".toUpperCase(), style: TextStyle(
+ fontWeight: FontWeight.w600,
+ fontSize: 14.0
+ ),),
+ Text(
+ """
+1. Brown the meat and the onion in a large nonstick skillet over medium-high heat for 5 minutes,
+2. breaking up the meat into crumbles as it cooks. Pour the drippings out of the pan and discard.
+3. Add the garlic, jalapeno, and red pepper and cook 5 minutes more, stirring occasionally.
+4. Stir in the rest of the ingredients, reduce heat to low, and simmer for 5 minutes more.
+5. Place a half-cup scoop of the mixture onto each bun and serve.
+
+ """
+ , textAlign: TextAlign.justify, style: TextStyle(
+ fontWeight: FontWeight.w300,
+ fontSize: 14.0
+ ),),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ Positioned(
+ top: 0,
+ left: 0,
+ right: 0,
+ child: AppBar(
+ backgroundColor: Colors.transparent,
+ elevation: 0,
+ centerTitle: true,
+ title: Text("DETAIL",style: TextStyle(
+ fontSize: 16.0,
+ fontWeight: FontWeight.normal
+ ),),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
+
diff --git a/lib/Recipes/six.dart b/lib/Recipes/six.dart
index 335362c..0b28d04 100644
--- a/lib/Recipes/six.dart
+++ b/lib/Recipes/six.dart
@@ -1,4 +1,6 @@
+import 'package:app/Others/theme.dart';
import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class SixRecipe extends StatefulWidget {
@@ -8,7 +10,7 @@ class SixRecipe extends StatefulWidget {
class _SixRecipeState extends State {
- final String image = "images/nutty-chicken-sate-strips.jpg";
+ final String image = "images/recipes/nutty-chicken-sate-strips.jpg";
var favIcon = Icon(Icons.favorite_border);
void btnToggle(){
@@ -28,6 +30,7 @@ void btnToggle(){
}
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
return Scaffold(
body: Stack(
children: [
@@ -80,7 +83,7 @@ void btnToggle(){
),
Container(
padding: const EdgeInsets.all(32.0),
- color: Colors.white,
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
diff --git a/lib/Recipes/ten.dart b/lib/Recipes/ten.dart
new file mode 100644
index 0000000..b6384c7
--- /dev/null
+++ b/lib/Recipes/ten.dart
@@ -0,0 +1,229 @@
+import 'package:app/Others/theme.dart';
+import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+class TenRecipe extends StatefulWidget {
+ @override
+ _TenRecipeState createState() => _TenRecipeState();
+}
+
+class _TenRecipeState extends State {
+
+ final String image = "images/recipes/chiken.jpg";
+ var favIcon = Icon(Icons.favorite_border);
+
+ void btnToggle(){
+ if (favIcon != Icon(Icons.favorite)) {
+ favIcon = Icon(Icons.favorite);
+ } else if(favIcon == Icon(Icons.favorite)) {
+ favIcon = Icon(Icons.favorite_border);
+ }
+ }
+ _video() async {
+ const url = 'https://www.youtube.com/watch?v=UzUqoLe4At0';
+ if (await canLaunch(url)) {
+ await launch(url);
+ } else {
+ throw 'Could not launch $url';
+ }
+ }
+ @override
+ Widget build(BuildContext context) {
+ final theme = Provider.of(context);
+ return Scaffold(
+ body: Stack(
+ children: [
+ Container(
+ foregroundDecoration: BoxDecoration(
+ color: Colors.black26
+ ),
+ height: 400,
+ child: Image.asset(image, fit: BoxFit.cover)),
+ SingleChildScrollView(
+ padding: const EdgeInsets.only(top: 16.0,bottom: 20.0),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const SizedBox(height: 250),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal:16.0),
+ child: Text(
+ "Chicken Satay Salad",
+ style: TextStyle(color: Colors.white, fontSize: 28.0, fontWeight: FontWeight.bold),
+ ),
+ ),
+ Row(
+ children: [
+ const SizedBox(width: 16.0),
+ Container(
+ padding: const EdgeInsets.symmetric(
+ vertical: 8.0,
+ horizontal: 16.0,
+ ),
+ decoration: BoxDecoration(
+ color: Colors.grey,
+ borderRadius: BorderRadius.circular(20.0)),
+ child: Text(
+ "255 reviews",
+ style: TextStyle(color: Colors.white, fontSize: 13.0),
+ ),
+ ),
+ Spacer(),
+ IconButton(
+ color: Colors.white,
+ icon: favIcon,
+ onPressed: () {
+ setState(() {
+ btnToggle();
+ });
+ },
+ )
+ ],
+ ),
+ Container(
+ padding: const EdgeInsets.all(32.0),
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Row(
+ children: [
+ Expanded(
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ children: [
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ Icon(
+ Icons.star,
+ color: Colors.amber,
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ const SizedBox(height: 30.0),
+ SizedBox(
+ width: double.infinity,
+ child: RaisedButton(
+ shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30.0)),
+ color: Colors.blueAccent,
+ textColor: Colors.white,
+ child: Text("Video", style: TextStyle(
+ fontWeight: FontWeight.normal
+ ),),
+ padding: const EdgeInsets.symmetric(
+ vertical: 16.0,
+ horizontal: 32.0,
+ ),
+ onPressed: _video,
+ ),
+ ),
+ const SizedBox(height: 30.0),
+ Text("Ingredients".toUpperCase(), style: TextStyle(
+ fontWeight: FontWeight.w600,
+ fontSize: 14.0
+ ),),
+ const SizedBox(height: 10.0),
+ Text(
+ """
+1 pound extra-lean ground beef
+
+1 onion, diced
+
+4 cloves garlic, minced
+
+1 jalapeno, minced
+
+1 red pepper, diced
+
+1 can small red beans or pinto beans, preferably low sodium drained and rinsed
+
+1 1/2 cups no-salt-added tomato sauce
+
+2 tablespoons tomato paste
+
+1 tablespoon red wine vinegar
+
+1 tablespoon molasses
+
+1 tablespoon Worcestershire sauce
+
+1 teaspoon mustard powder
+
+3/4 teaspoon salt
+
+Freshly ground black pepper
+
+8 whole-wheat burger buns
+
+ """,
+ textAlign: TextAlign.justify, style: TextStyle(
+ fontWeight: FontWeight.w300,
+ fontSize: 14.0
+ ),),
+ const SizedBox(height: 10.0),
+ Text("Method".toUpperCase(), style: TextStyle(
+ fontWeight: FontWeight.w600,
+ fontSize: 14.0
+ ),),
+ Text(
+ """
+1. Brown the meat and the onion in a large nonstick skillet over medium-high heat for 5 minutes,
+2. breaking up the meat into crumbles as it cooks. Pour the drippings out of the pan and discard.
+3. Add the garlic, jalapeno, and red pepper and cook 5 minutes more, stirring occasionally.
+4. Stir in the rest of the ingredients, reduce heat to low, and simmer for 5 minutes more.
+5. Place a half-cup scoop of the mixture onto each bun and serve.
+
+ """
+ , textAlign: TextAlign.justify, style: TextStyle(
+ fontWeight: FontWeight.w300,
+ fontSize: 14.0
+ ),),
+ ],
+ ),
+ ),
+ ],
+ ),
+ ),
+ Positioned(
+ top: 0,
+ left: 0,
+ right: 0,
+ child: AppBar(
+ backgroundColor: Colors.transparent,
+ elevation: 0,
+ centerTitle: true,
+ title: Text("DETAIL",style: TextStyle(
+ fontSize: 16.0,
+ fontWeight: FontWeight.normal
+ ),),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
+
diff --git a/lib/Recipes/three.dart b/lib/Recipes/three.dart
index 378d15b..bf5a0d7 100644
--- a/lib/Recipes/three.dart
+++ b/lib/Recipes/three.dart
@@ -1,4 +1,6 @@
+import 'package:app/Others/theme.dart';
import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class ThirdRecipe extends StatefulWidget {
@@ -9,7 +11,7 @@ class ThirdRecipe extends StatefulWidget {
class _ThirdRecipeState extends State {
- final String image = "images/yogurt-cake.jpeg";
+ final String image = "images/recipes/yogurt-cake.jpeg";
var favIcon = Icon(Icons.favorite_border);
void btnToggle(){
@@ -29,6 +31,8 @@ class _ThirdRecipeState extends State {
}
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
+
return Scaffold(
body: Stack(
children: [
@@ -81,7 +85,7 @@ class _ThirdRecipeState extends State {
),
Container(
padding: const EdgeInsets.all(32.0),
- color: Colors.white,
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
diff --git a/lib/Recipes/two.dart b/lib/Recipes/two.dart
index de5d911..59667fb 100644
--- a/lib/Recipes/two.dart
+++ b/lib/Recipes/two.dart
@@ -1,4 +1,6 @@
+import 'package:app/Others/theme.dart';
import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class SecondRecipe extends StatefulWidget {
@@ -10,7 +12,7 @@ class SecondRecipe extends StatefulWidget {
class _SecondRecipeState extends State {
- final String image = "images/marsala.jpeg";
+ final String image = "images/recipes/marsala.jpeg";
var favIcon = Icon(Icons.favorite_border);
void btnToggle(){
@@ -30,6 +32,8 @@ class _SecondRecipeState extends State {
}
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
+
return Scaffold(
body: Stack(
children: [
@@ -82,7 +86,7 @@ class _SecondRecipeState extends State {
),
Container(
padding: const EdgeInsets.all(32.0),
- color: Colors.white,
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
diff --git a/lib/Widgets/messaging.dart b/lib/Widgets/messaging.dart
deleted file mode 100644
index 5f60b72..0000000
--- a/lib/Widgets/messaging.dart
+++ /dev/null
@@ -1,54 +0,0 @@
-import 'package:app/models/messages.dart';
-import 'package:firebase_messaging/firebase_messaging.dart';
-import 'package:flutter/material.dart';
-
-class Messaging extends StatefulWidget {
- @override
- _MessagingState createState() => _MessagingState();
-}
-
-class _MessagingState extends State {
- final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
- final List messages = [];
-
- @override
- void initState() {
- super.initState();
- _firebaseMessaging.configure(
- onMessage: (Map message) async {
- print("onMessage: $message");
- final notification = message['notification'];
- setState(() {
- messages.add(Message(
- title: notification['title'], body: notification['body']));
- });
- },
- onLaunch: (Map message) async {
- print("onLaunch: $message");
-
- final notification = message['data'];
- setState(() {
- messages.add(Message(
- title: '${notification['title']}',
- body: '${notification['body']}',
- ));
- });
- },
- onResume: (Map message) async {
- print("onResume: $message");
- },
- );
- _firebaseMessaging.requestNotificationPermissions(
- const IosNotificationSettings(sound: true, badge: true, alert: true));
- }
-
- @override
- Widget build(BuildContext context) => ListView(
- children: messages.map(buildMessage).toList(),
- );
-
- Widget buildMessage(Message message) => ListTile(
- title: Text(message.title),
- subtitle: Text(message.body),
- );
-}
\ No newline at end of file
diff --git a/lib/auth/login.dart b/lib/auth/login.dart
new file mode 100644
index 0000000..cb8ade5
--- /dev/null
+++ b/lib/auth/login.dart
@@ -0,0 +1,227 @@
+import 'package:app/main.dart';
+import 'package:flutter/material.dart';
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:flutter/services.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+import '../Others/loading.dart';
+
+
+class Login extends StatefulWidget {
+ @override
+ _LoginState createState() => _LoginState();
+}
+
+class _LoginState extends State {
+
+ TextEditingController _email = TextEditingController();
+
+ TextEditingController _passowrd = TextEditingController();
+
+ final _formKey = GlobalKey();
+
+ bool loading = false;
+ @override
+ Widget build(BuildContext context) {
+ return loading ? Loading() : Scaffold(
+ resizeToAvoidBottomPadding: false,
+ body: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Container(
+ child: Stack(
+ children: [
+ Container(
+ padding: EdgeInsets.fromLTRB(15.0, 110.0, 0.0, 0.0),
+ child: Text('Hello',
+ style: TextStyle(
+ fontSize: 80.0, fontWeight: FontWeight.bold)),
+ ),
+ Container(
+ padding: EdgeInsets.fromLTRB(16.0, 175.0, 0.0, 0.0),
+ child: Text('There',
+ style: TextStyle(
+ fontSize: 80.0, fontWeight: FontWeight.bold)),
+ ),
+ Container(
+ padding: EdgeInsets.fromLTRB(220.0, 175.0, 0.0, 0.0),
+ child: Text('.',
+ style: TextStyle(
+ fontSize: 80.0,
+ fontWeight: FontWeight.bold,
+ color: Colors.blue)),
+ )
+ ],
+ ),
+ ),
+ Form(
+ key: _formKey,
+ child: Container(
+ padding: EdgeInsets.only(top: 35.0, left: 20.0, right: 20.0),
+ child: Column(
+ children: [
+ TextFormField(
+ controller: _email,
+ validator: (value) {
+ if (value.isEmpty) {
+ return 'Enter your email';
+ }
+ },
+ decoration: InputDecoration(
+
+ labelText: 'EMAIL',
+
+ labelStyle: TextStyle(
+ fontFamily: 'Montserrat',
+ fontWeight: FontWeight.bold,
+ color: Colors.grey),
+ focusedBorder: UnderlineInputBorder(
+ borderSide: BorderSide(color: Colors.blue))),
+ ),
+ SizedBox(height: 20.0),
+ TextFormField(
+ validator: (value) {
+ if (value.isEmpty) {
+ return "Enter your password";
+
+ }
+ },
+ controller: _passowrd,
+ decoration: InputDecoration(
+ labelText: 'PASSWORD',
+ labelStyle: TextStyle(
+ fontFamily: 'Montserrat',
+ fontWeight: FontWeight.bold,
+ color: Colors.grey),
+ focusedBorder: UnderlineInputBorder(
+ borderSide: BorderSide(color: Colors.blue))),
+ obscureText: true,
+ ),
+ SizedBox(height: 5.0),
+ Container(
+ alignment: Alignment(1.0, 0.0),
+ padding: EdgeInsets.only(top: 15.0, left: 20.0),
+ child: InkWell(
+ child: GestureDetector(
+ onTap: () {
+ Navigator.pushNamed(context, '/reset_password');
+ },
+ child: Text(
+ 'Forgot Password',
+ style: TextStyle(
+ color: Colors.blue,
+ fontWeight: FontWeight.bold,
+ fontFamily: 'Montserrat',
+ decoration: TextDecoration.underline),
+ ),
+ ),
+ ),
+ ),
+ SizedBox(height: 40.0),
+ Container(
+ height: 40.0,
+ child: Material(
+ borderRadius: BorderRadius.circular(20.0),
+ shadowColor: Colors.blue,
+ color: Colors.blueAccent,
+ elevation: 7.0,
+ child: Builder(
+ builder: (context) => GestureDetector(
+ onTap: () async{
+ if (_formKey.currentState.validate()) {
+ try {
+
+ var result = await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email.text, password: _passowrd.text);
+ if (result != null) {
+ setState(() {
+ loading = true;
+ });
+ SharedPreferences prefs = await SharedPreferences.getInstance();
+ prefs.setString('email', result.user.email);
+ Navigator.pushReplacement(context,
+ MaterialPageRoute(builder: (BuildContext ctx) => OnBoarding()));
+ }else{
+ setState(() {
+ loading = false;
+ });
+ }
+ }on PlatformException catch (e) {
+ Scaffold.of(context).showSnackBar(SnackBar(content: Text(e.message.toString())));
+ }
+ }
+
+ },
+ child: Center(
+ child: Text(
+ 'LOGIN',
+ style: TextStyle(
+ color: Colors.white,
+ fontWeight: FontWeight.bold,
+ fontFamily: 'Montserrat'),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ // SizedBox(height: 20.0),
+ // Container(
+ // height: 40.0,
+ // color: Colors.transparent,
+ // child: Container(
+ // decoration: BoxDecoration(
+ // border: Border.all(
+ // color: Colors.black,
+ // style: BorderStyle.solid,
+ // width: 1.0),
+ // color: Colors.transparent,
+ // borderRadius: BorderRadius.circular(20.0)),
+ // child: Row(
+ // mainAxisAlignment: MainAxisAlignment.center,
+ // children: [
+ // // Center(
+ // // child:
+ // // ImageIcon(AssetImage('assets/facebook.png')),
+ // // ),
+ // // SizedBox(width: 10.0),
+ // // Center(
+ // // child: Text('Log in with facebook',
+ // // style: TextStyle(
+ // // fontWeight: FontWeight.bold,
+ // // fontFamily: 'Montserrat')),
+ // // )
+ // ],
+ // ),
+ // ),
+ // )
+ ],
+ ),
+ ),
+ ),
+ SizedBox(height: 15.0),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(
+ 'New to Guava ?',
+ style: TextStyle(fontFamily: 'Montserrat'),
+ ),
+ SizedBox(width: 5.0),
+ InkWell(
+ onTap: () {
+ Navigator.of(context).pushNamed('/register');
+ },
+ child: Text(
+ 'Register',
+ style: TextStyle(
+ color: Colors.blue,
+ fontFamily: 'Montserrat',
+ fontWeight: FontWeight.bold,
+ decoration: TextDecoration.underline),
+ ),
+ )
+ ],
+ )
+ ],
+ ));
+ }
+}
\ No newline at end of file
diff --git a/lib/auth/register.dart b/lib/auth/register.dart
new file mode 100644
index 0000000..5149d62
--- /dev/null
+++ b/lib/auth/register.dart
@@ -0,0 +1,195 @@
+import 'package:app/Others/loading.dart';
+import 'package:flutter/material.dart';
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:cloud_firestore/cloud_firestore.dart';
+import 'package:flutter/services.dart';
+
+class Register extends StatefulWidget {
+ @override
+ _RegisterState createState() => _RegisterState();
+}
+
+class _RegisterState extends State {
+
+ TextEditingController _name = TextEditingController();
+ TextEditingController _email = TextEditingController();
+ TextEditingController _passowrd = TextEditingController();
+
+ final _formKey = GlobalKey();
+ bool loading = false;
+
+
+ @override
+ Widget build(BuildContext context) {
+ return loading ? Loading() : Scaffold(
+ resizeToAvoidBottomPadding: false,
+ body: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <
+ Widget>[
+ Container(
+ child: Stack(
+ children: [
+ Container(
+ padding: EdgeInsets.fromLTRB(15.0, 110.0, 0.0, 0.0),
+ child: Text(
+ 'Signup',
+ style:
+ TextStyle(fontSize: 80.0, fontWeight: FontWeight.bold),
+ ),
+ ),
+ Container(
+ padding: EdgeInsets.fromLTRB(260.0, 125.0, 0.0, 0.0),
+ child: Text(
+ '.',
+ style: TextStyle(
+ fontSize: 80.0,
+ fontWeight: FontWeight.bold,
+ color: Colors.blue),
+ ),
+ )
+ ],
+ ),
+ ),
+ Form(
+ key: _formKey,
+ child: Container(
+ padding: EdgeInsets.only(top: 35.0, left: 20.0, right: 20.0),
+ child: Column(
+ children: [
+ TextFormField(
+ controller: _name,
+ validator: (value) {
+ if (value.isEmpty) {
+ return "Enter your name";
+ }
+ },
+ decoration: InputDecoration(
+ labelText: 'NAME ',
+ labelStyle: TextStyle(
+ fontFamily: 'Montserrat',
+ fontWeight: FontWeight.bold,
+ color: Colors.grey),
+ focusedBorder: UnderlineInputBorder(
+ borderSide: BorderSide(color: Colors.blue))),
+ ),
+ SizedBox(height: 10.0),
+ TextFormField(
+ controller: _email,
+ validator: (value) {
+ if (value.isEmpty) {
+ return "Enter your email";
+ }
+ },
+ decoration: InputDecoration(
+ labelText: 'EMAIL',
+ labelStyle: TextStyle(
+ fontFamily: 'Montserrat',
+ fontWeight: FontWeight.bold,
+ color: Colors.grey),
+ // hintText: 'EMAIL',
+ // hintStyle: ,
+ focusedBorder: UnderlineInputBorder(
+ borderSide: BorderSide(color: Colors.blue))),
+ ),
+ SizedBox(height: 10.0),
+ TextFormField(
+ controller: _passowrd,
+ validator: (value) {
+ if (value.isEmpty) {
+ return "Enter your password";
+ }
+ },
+ decoration: InputDecoration(
+ labelText: 'PASSWORD ',
+ labelStyle: TextStyle(
+ fontFamily: 'Montserrat',
+ fontWeight: FontWeight.bold,
+ color: Colors.grey),
+ focusedBorder: UnderlineInputBorder(
+ borderSide: BorderSide(color: Colors.blue))),
+ obscureText: true,
+ ),
+ SizedBox(height: 50.0),
+ Container(
+ height: 40.0,
+ child: Material(
+ borderRadius: BorderRadius.circular(20.0),
+ shadowColor: Colors.blue,
+ color: Colors.blueAccent,
+ elevation: 7.0,
+ child: Builder(
+ builder: (context) => GestureDetector(
+ onTap: () async{
+ if (_formKey.currentState.validate()) {
+ try {
+ var result = await FirebaseAuth.instance.createUserWithEmailAndPassword(email: _email.text, password: _passowrd.text);
+ if (result != null ) {
+ setState(() {
+ loading = true;
+ });
+ Firestore.instance.collection('users').document().setData({
+ 'name' : _name.text,
+ 'email': _email.text,
+ });
+ Navigator.pushNamed(context, '/login');
+ } else{
+ setState(() {
+ loading = false;
+ });
+ }
+ }on PlatformException catch (error) {
+ Scaffold.of(context).showSnackBar(SnackBar(content: Text(error.message.toString())));
+
+ }
+
+ }
+ },
+ child: Center(
+ child: Text(
+ 'SIGNUP',
+ style: TextStyle(
+ color: Colors.white,
+ fontWeight: FontWeight.bold,
+ fontFamily: 'Montserrat'),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ SizedBox(height: 20.0),
+ Container(
+ height: 40.0,
+ color: Colors.transparent,
+ child: Container(
+ decoration: BoxDecoration(
+ border: Border.all(
+ color: Colors.black,
+ style: BorderStyle.solid,
+ width: 1.0),
+ color: Colors.transparent,
+ borderRadius: BorderRadius.circular(20.0)),
+ child: InkWell(
+ onTap: () {
+ Navigator.of(context).pop();
+ },
+ child:
+
+ Center(
+ child: Text('Go Back',
+ style: TextStyle(
+ fontWeight: FontWeight.bold,
+ fontFamily: 'Montserrat')),
+ ),
+
+
+ ),
+ ),
+ ),
+ ],
+ )),
+ ),
+ ],
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/auth/reset_password.dart b/lib/auth/reset_password.dart
new file mode 100644
index 0000000..56fadc7
--- /dev/null
+++ b/lib/auth/reset_password.dart
@@ -0,0 +1,123 @@
+import 'package:app/Others/loading.dart';
+import 'package:flutter/material.dart';
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:flutter/services.dart';
+
+class Reset_Password extends StatefulWidget {
+ @override
+ _Reset_PasswordState createState() => _Reset_PasswordState();
+}
+
+class _Reset_PasswordState extends State {
+
+ TextEditingController _email = TextEditingController();
+ final _formKey = GlobalKey();
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text("Reset Password"),
+ backgroundColor: Colors.blue[900],
+ automaticallyImplyLeading: false,
+ centerTitle: true,
+
+ ),
+ body: Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Form(
+ key: _formKey,
+ child: TextFormField(
+ validator: (value) {
+ if (value.isEmpty) {
+ return "Enter your email";
+ }
+ },
+ controller: _email,
+ decoration: InputDecoration(
+
+ labelText: 'EMAIL',
+
+ labelStyle: TextStyle(
+ fontFamily: 'Montserrat',
+ fontWeight: FontWeight.bold,
+ color: Colors.grey),
+ focusedBorder: UnderlineInputBorder(
+ borderSide: BorderSide(color: Colors.blue))),
+ ),
+ ),
+ SizedBox(height: 40.0),
+ Container(
+ height: 40.0,
+ child: Material(
+ borderRadius: BorderRadius.circular(20.0),
+ shadowColor: Colors.blue,
+ color: Colors.blueAccent,
+ elevation: 7.0,
+ child: Builder(
+ builder: (context) => GestureDetector(
+ onTap: () async{
+ if (_formKey.currentState.validate()) {
+ try {
+ await FirebaseAuth.instance.sendPasswordResetEmail(email: _email.text);
+ } on PlatformException catch (e) {
+ Scaffold.of(context).showSnackBar(SnackBar(content: Text(e.message.toString())));
+ }
+
+
+ // var result = await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email.text, password: _passowrd.text);
+ // if (result != null) {
+ // Navigator.pushNamed(context, '/onboarding');
+ // }
+ }
+ },
+ child: Center(
+ child: Text(
+ 'Reset Password',
+ style: TextStyle(
+ color: Colors.white,
+ fontWeight: FontWeight.bold,
+ fontFamily: 'Montserrat'),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ SizedBox(height: 20.0),
+ Container(
+ height: 40.0,
+ color: Colors.transparent,
+ child: Container(
+ decoration: BoxDecoration(
+ border: Border.all(
+ color: Colors.black,
+ style: BorderStyle.solid,
+ width: 1.0),
+ color: Colors.transparent,
+ borderRadius: BorderRadius.circular(20.0)),
+ child: InkWell(
+ onTap: () {
+ Navigator.of(context).pop();
+ },
+ child:
+
+ Center(
+ child: Text('Go Back',
+ style: TextStyle(
+ fontWeight: FontWeight.bold,
+ fontFamily: 'Montserrat')),
+ ),
+
+
+ ),
+ ),
+ ),
+
+ ],
+ ),
+
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/details/patient_detail.dart b/lib/details/patient_detail.dart
new file mode 100644
index 0000000..d3f232a
--- /dev/null
+++ b/lib/details/patient_detail.dart
@@ -0,0 +1,258 @@
+import 'package:cloud_firestore/cloud_firestore.dart';
+import 'package:flutter/material.dart';
+
+class Foods extends StatefulWidget {
+
+ final DocumentSnapshot food;
+ Foods({this.food});
+
+ @override
+ _FoodsState createState() => _FoodsState();
+}
+
+class _FoodsState extends State {
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text('Foods'),
+ backgroundColor: Colors.red,
+ ),
+ body: GridView.count(
+ crossAxisCount: 2,
+ children: [
+ new Container(
+ child: Card(
+ elevation: 10.0,
+ child: Column(
+ children:[
+ Image.network(
+ '${widget.food.data['food_1_img']}',
+ fit: BoxFit.cover,
+ height: 140.0,
+ width: 200.0,
+ ),
+ SizedBox(height: 5.0),
+
+ Padding(
+ padding: EdgeInsets.only(right: 5.0, left: 5.0),
+ child: Text(
+ widget.food.data['food_1'],
+ style: TextStyle(
+ fontWeight: FontWeight.bold,
+ color: Colors.red,
+ fontSize: 15.0,
+ ),
+ ),
+ ),
+
+
+ ],
+
+
+ ),
+
+ ),
+ ),
+ new Container(
+ child: Card(
+ elevation: 10.0,
+ child: Column(
+ children:[
+ Image.network(
+ '${widget.food.data['food_2_img']}',
+ fit: BoxFit.cover,
+ height: 140.0,
+ width: 200.0,
+ ),
+ SizedBox(height: 5.0),
+
+ Padding(
+ padding: EdgeInsets.only(right: 5.0, left: 5.0),
+ child: Text(
+ widget.food.data['food_2'],
+ style: TextStyle(
+ fontWeight: FontWeight.bold,
+ color: Colors.red,
+ fontSize: 20.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ new Container(
+ child: Card(
+ elevation: 10.0,
+ child: Column(
+ children:[
+ Image.network(
+ '${widget.food.data['food_3_img']}',
+ fit: BoxFit.cover,
+ height: 140.0,
+ width: 200.0,
+ ),
+ SizedBox(height: 5.0),
+
+ Padding(
+ padding: EdgeInsets.only(right: 5.0, left: 5.0),
+ child: Text(
+ widget.food.data['food_3'],
+ style: TextStyle(
+ fontWeight: FontWeight.bold,
+ color: Colors.red,
+ fontSize: 20.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ new Container(
+ child: Card(
+ elevation: 10.0,
+ child: Column(
+ children:[
+ Image.network(
+ '${widget.food.data['food_4_img']}',
+ fit: BoxFit.cover,
+ height: 140.0,
+ width: 200.0,
+ ),
+ SizedBox(height: 5.0),
+
+ Padding(
+ padding: EdgeInsets.only(right: 5.0, left: 5.0),
+ child: Text(
+ widget.food.data['food_4'],
+ style: TextStyle(
+ fontWeight: FontWeight.bold,
+ color: Colors.red,
+ fontSize: 20.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ new Container(
+ child: Card(
+ elevation: 10.0,
+ child: Column(
+ children:[
+ Image.network(
+ '${widget.food.data['food_5_img']}',
+ fit: BoxFit.cover,
+ height: 140.0,
+ width: 200.0,
+ ),
+ SizedBox(height: 5.0),
+
+ Padding(
+ padding: EdgeInsets.only(right: 5.0, left: 5.0),
+ child: Text(
+ widget.food.data['food_5'],
+ style: TextStyle(
+ fontWeight: FontWeight.bold,
+ color: Colors.red,
+ fontSize: 15.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ new Container(
+ child: Card(
+ elevation: 10.0,
+ child: Column(
+ children:[
+ Image.network(
+ '${widget.food.data['food_6_img']}',
+ fit: BoxFit.cover,
+ height: 140.0,
+ width: 200.0,
+ ),
+ SizedBox(height: 5.0),
+
+ Padding(
+ padding: EdgeInsets.only(right: 5.0, left: 5.0),
+ child: Text(
+ widget.food.data['food_6'],
+ style: TextStyle(
+ fontWeight: FontWeight.bold,
+ color: Colors.red,
+ fontSize: 20.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ new Container(
+ child: Card(
+ elevation: 10.0,
+ child: Column(
+ children:[
+ Image.network(
+ '${widget.food.data['food_7_img']}',
+ fit: BoxFit.cover,
+ height: 140.0,
+ width: 200.0,
+ ),
+ SizedBox(height: 5.0),
+
+ Padding(
+ padding: EdgeInsets.only(right: 5.0, left: 5.0),
+ child: Text(
+ widget.food.data['food_7'],
+ style: TextStyle(
+ fontWeight: FontWeight.bold,
+ color: Colors.red,
+ fontSize: 20.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ new Container(
+ child: Card(
+ elevation: 10.0,
+ child: Column(
+ children:[
+ Image.network(
+ '${widget.food.data['food_8_img']}',
+ fit: BoxFit.cover,
+ height: 140.0,
+ width: 200.0,
+ ),
+ SizedBox(height: 5.0),
+
+ Padding(
+ padding: EdgeInsets.only(right: 5.0, left: 5.0),
+ child: Text(
+ widget.food.data['food_8'],
+ style: TextStyle(
+ fontWeight: FontWeight.bold,
+ color: Colors.red,
+ fontSize: 20.0,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/main.dart b/lib/main.dart
index 74ed7be..0dd58ed 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,78 +1,130 @@
-// import 'package:app/pages/groceries.dart';
+import 'package:app/auth/login.dart';
+import 'package:app/auth/register.dart';
+import 'package:app/auth/reset_password.dart';
import 'package:app/pages/calendar.dart';
import 'package:app/pages/paitent.dart';
import 'package:app/pages/recipes.dart';
import 'package:app/pages/settings.dart';
-import 'package:app/patients/corona.dart';
+import 'package:app/pages/working_out.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:provider/provider.dart';
+import 'package:shared_preferences/shared_preferences.dart';
import './pages/calories_calculator.dart';
-import 'package:app/patients/diabetes.dart';
-import 'package:app/patients/flu.dart';
-import 'package:app/patients/heart.dart';
import 'package:curved_navigation_bar/curved_navigation_bar.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'Misc/Terms.dart';
import 'Misc/privacy.dart';
+import 'Others/theme.dart';
+import 'Recipes/eight.dart';
import 'Recipes/five.dart';
import 'Recipes/four.dart';
+import 'Recipes/nine.dart';
import 'Recipes/one.dart';
+import 'Recipes/seven.dart';
import 'Recipes/six.dart';
+import 'Recipes/ten.dart';
import 'Recipes/three.dart';
import 'Recipes/two.dart';
-//import 'Widgets/messaging.dart';
+import 'details/patient_detail.dart';
import 'pages/home.dart';
-import 'package:splashscreen/splashscreen.dart';
import 'package:introduction_screen/introduction_screen.dart';
import 'pages/diet.dart';
-void main() => runApp(MaterialApp(
- home: Splash(),
- routes: {
- '/onboarding': (context) => OnBoarding(),
- '/navigate': (context) => Navigation(),
- '/settings': (context) => Settings(),
- '/terms' : (context) => Terms(),
- '/calories_calc' : (context) => Calculator(),
- '/calendar' : (context) => Calendar(),
- '/privacy' : (context) => Privacy(),
- '/heart' : (context) => Heart(),
- '/flu' : (context) => Flu(),
- '/corona' : (context) => Corona(),
- '/diabetes' : (context) => Diabetes(),
- '/r1': (context) => Recipe(),
- '/r2': (context) => SecondRecipe(),
- '/r3': (context) => ThirdRecipe(),
- '/r4': (context) => FourRecipe(),
- '/r5': (context) => FiveRecipe(),
- '/r6': (context) => SixRecipe(),
-
-
- },
-));
-
-class Splash extends StatefulWidget {
+bool dark = false;
+var email;
+void main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+ SharedPreferences prefs = await SharedPreferences.getInstance();
+ dark = prefs.getBool('dark') ?? false;
+ email = prefs.getString('email');
+ runApp(MyApp());
+}
+
+ class MyApp extends StatefulWidget {
@override
- _SplashState createState() => _SplashState();
+ _MyAppState createState() => _MyAppState();
}
-class _SplashState extends State {
+class _MyAppState extends State {
@override
+ Widget build(BuildContext context) {
+ return ChangeNotifierProvider(
+ create: (_) => !dark ? ThemeChanger(ThemeData.light()): ThemeChanger(ThemeData.dark()),
+ child: new MaterialAppWithTheme(),
+ );
+
+ }
+}
+class MaterialAppWithTheme extends StatefulWidget {
+ @override
+ _MaterialAppWithThemeState createState() => _MaterialAppWithThemeState();
+}
+
+class _MaterialAppWithThemeState extends State {
+
+ @override
Widget build(BuildContext context) {
- return SplashScreen(
- seconds: 15,
- backgroundColor: Colors.white10,
- image: Image.asset('images/Guava.png'),
- loaderColor: Colors.black,
- photoSize: 200.0,
- navigateAfterSeconds: OnBoarding(),
+ final theme = Provider.of(context);
+
+ return MaterialApp(
+ home: email == null ? Login() : Navigation(),
+ theme: theme.getTheme(),
+ routes: {
+ '/onboarding': (context) => OnBoarding(),
+ '/food': (context) => Foods(),
+ '/navigate': (context) => Navigation(),
+ '/settings': (context) => Settings(),
+ '/login': (context) => Login(),
+ '/register': (context) => Register(),
+ '/reset_password': (context) => Reset_Password(),
+ '/terms' : (context) => Terms(),
+ '/calories_calc' : (context) => Calculator(),
+ '/calendar' : (context) => Calendar(),
+ '/privacy' : (context) => Privacy(),
+ '/r1': (context) => Recipe(),
+ '/r2': (context) => SecondRecipe(),
+ '/r3': (context) => ThirdRecipe(),
+ '/r4': (context) => FourRecipe(),
+ '/r5': (context) => FiveRecipe(),
+ '/r6': (context) => SixRecipe(),
+ '/r7': (context) => SevenRecipe(),
+ '/r8': (context) => EightRecipe(),
+ '/r9': (context) => NineRecipe(),
+ '/r10': (context) => TenRecipe(),
+ },
);
}
}
+
+// class Splash extends StatefulWidget {
+// @override
+// _SplashState createState() => _SplashState();
+// }
+
+// class _SplashState extends State {
+
+
+// @override
+
+// Widget build(BuildContext context) {
+// return SplashScreen(
+// seconds: 15,
+// backgroundColor: Colors.white10,
+// image: Image.asset('images/Guava.png'),
+// loaderColor: Colors.black,
+// photoSize: 200.0,
+// );
+// }
+// }
+
+
class Navigation extends StatefulWidget {
@override
+
_NavigationState createState() => _NavigationState();
}
@@ -84,7 +136,8 @@ class _NavigationState extends State {
Patient(),
Recipes(),
Diet(),
- // Grocery(),
+ WorkingOut(),
+ //Grocery(),
// Profile(),
];
@@ -96,6 +149,7 @@ class _NavigationState extends State {
}
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
return Scaffold(
body: Column(
children: [
@@ -105,14 +159,14 @@ class _NavigationState extends State {
],
),
bottomNavigationBar: CurvedNavigationBar(
- color: Colors.blue[800],
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.blue[800],
backgroundColor: Colors.transparent,
items: [
- Icon(Icons.tag_faces, size: 30, color: Colors.white),
- Icon(Icons.add, size: 30, color: Colors.white),
- Icon(Icons.fastfood, size: 30, color: Colors.white),
- Icon(Icons.filter_vintage, size: 30, color: Colors.white),
- // Icon(Icons.person_pin, size: 30, color: Colors.white),
+ Icon(FontAwesomeIcons.laughBeam, size: 30, color: Colors.white),
+ Icon(FontAwesomeIcons.heartbeat, size: 30, color: Colors.white),
+ Icon(FontAwesomeIcons.appleAlt, size: 30, color: Colors.white),
+ Icon(FontAwesomeIcons.spa, size: 30, color: Colors.white),
+ Icon(FontAwesomeIcons.dumbbell, size: 30, color: Colors.white),
],
onTap: ( int index) {
@@ -135,33 +189,40 @@ class OnBoarding extends StatelessWidget {
"that will care about your health more than u do",
),
PageViewModel(
- image: Image.asset('images/health.jpg'),
+ image: Image.asset('images/onboarding/health2.png'),
title: 'Health Treatment',
body: "We are giving the top doctors' advices to remain healthy, and "
"we will check you daily because your health is our top priority",
),
PageViewModel(
- image: Image.asset('images/food.jpg'),
+ image: Image.asset('images/onboarding/cooking.png'),
title: 'Healthy Foods',
body: "We'll recommend top healthy-recipes that're provided by professional chef-bloggers "
"besides it's ingredients and it's cooking technique ",
),
PageViewModel(
- image: Image.asset('images/sick.jpg'),
+ image: Image.asset('images/onboarding/medical.png'),
title: 'Situations!',
body: "Don't Worry! We will make sure that you'll be provided per your health situation and "
"we won't stop caring ",
),
+ PageViewModel(
+ image: Image.asset('images/onboarding/working_out.png'),
+ title: 'Working Out',
+ body: "The perfect mind comes with a healthy body, so we are recommending some excersies for you to make your body remains in its health shape ",
+ ),
];
}
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
return Scaffold(
body: IntroductionScreen(
done: Text('Get Started', style: TextStyle(color: Colors.black),),
- globalBackgroundColor: Colors.white,
+ globalBackgroundColor: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[850] : Colors.white,
pages: getPages(),
- onDone: () => Navigator.pushNamed(context, '/navigate'),
+ onDone: () => Navigator.pushReplacement(context,
+ MaterialPageRoute(builder: (BuildContext ctx) => Navigation())),
),
);
}
diff --git a/lib/models/messages.dart b/lib/models/messages.dart
deleted file mode 100644
index 3f23036..0000000
--- a/lib/models/messages.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-import 'package:flutter/material.dart';
-
-@immutable
-class Message {
- final String title;
- final String body;
-
- const Message({
- @required this.title,
- @required this.body,
- });
-}
\ No newline at end of file
diff --git a/lib/pages/calendar.dart b/lib/pages/calendar.dart
index 6a52317..1f64615 100644
--- a/lib/pages/calendar.dart
+++ b/lib/pages/calendar.dart
@@ -7,31 +7,7 @@ class Calendar extends StatefulWidget {
}
class _CalendarState extends State {
- CalendarController _controller;
- Map> _events;
- @override
- void initState() {
- super.initState();
- _controller = CalendarController();
- _events = {};
- }
-
- Map encodeMap(Map map) {
- Map newMap = {};
- map.forEach((key, value) {
- newMap[key.toString()] = map[key];
- });
- return newMap;
- }
-
- Map decodeMap(Map map) {
- Map newMap = {};
- map.forEach((key, value) {
- newMap[DateTime.parse(key)] = map[key];
- });
- return newMap;
- }
@override
Widget build(BuildContext context) {
return Scaffold(
@@ -44,17 +20,6 @@ class _CalendarState extends State {
body: SingleChildScrollView(
child: Column(
children: [
- TableCalendar(
- calendarController: _controller,
- events: _events,
- calendarStyle: CalendarStyle(
- todayColor: Colors.greenAccent[400],
- selectedColor: Colors.black,
-
- holidayStyle: TextStyle().copyWith(color: Colors.blue[800]),
-
- ),
- ),
],
),
),
diff --git a/lib/pages/calories_calculator.dart b/lib/pages/calories_calculator.dart
index 11f2888..fd2f818 100644
--- a/lib/pages/calories_calculator.dart
+++ b/lib/pages/calories_calculator.dart
@@ -163,6 +163,8 @@ class _CalculatorState extends State {
Padding(
padding: const EdgeInsets.all(8.0),
child: RaisedButton(
+ color: Colors.greenAccent,
+
child: Text("Calculate"),
onPressed: Calculate,
),
diff --git a/lib/pages/diet.dart b/lib/pages/diet.dart
index 82a4c98..14d520e 100644
--- a/lib/pages/diet.dart
+++ b/lib/pages/diet.dart
@@ -1,5 +1,8 @@
+import 'package:app/Others/theme.dart';
import 'package:flutter/material.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:liquid_progress_indicator/liquid_progress_indicator.dart';
+import 'package:provider/provider.dart';
final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
@@ -21,11 +24,12 @@ class _DietState extends State {
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
title: Text('Diet'),
- backgroundColor: Colors.blue[800],
+ backgroundColor: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.blue[800],
actions: [
IconButton(
icon: Icon(Icons.settings),
@@ -37,28 +41,7 @@ class _DietState extends State {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- Container(
- margin: EdgeInsets.only(left: 80),
- child: Row(
- children: [
- Text(
- """
-Hello!
-I'm Dr.Camilia
- """,
- style:
- TextStyle(fontWeight: FontWeight.bold, fontSize: 20.0),
- ),
- Padding(
- padding: const EdgeInsets.all(8.0),
- child: CircleAvatar(
- backgroundImage: AssetImage('images/camilia.jpg'),
- radius: 45.0,
- ),
- ),
- ],
- ),
- ),
+
Row(
children: [
Container(
@@ -95,20 +78,11 @@ I'm Dr.Camilia
children: [
Center(
child: IconButton(
- icon: Icon(Icons.add_circle),
+ icon: Icon(FontAwesomeIcons.calculator),
onPressed: () => Navigator.pushNamed(context, '/calories_calc'),
iconSize: 40.0,
color: Colors.greenAccent,
splashColor: Colors.transparent,
- ),
- ),
- Center(
- child: IconButton(
- icon: Icon(Icons.calendar_today),
- onPressed: () => Navigator.pushNamed(context, '/calendar'),
- iconSize: 40.0,
- color: Colors.greenAccent,
- splashColor: Colors.transparent,
),
),
],
diff --git a/lib/pages/groceries.dart b/lib/pages/groceries.dart
index 74cd4fb..e7dabc6 100644
--- a/lib/pages/groceries.dart
+++ b/lib/pages/groceries.dart
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
+
class Grocery extends StatefulWidget {
@override
_GroceryState createState() => _GroceryState();
@@ -37,7 +38,8 @@ class _GroceryState extends State
fontFamily: 'Varela',
fontSize: 42.0,
fontWeight: FontWeight.bold,
- ),),
+ ),
+ ),
TabBar(
controller: _tabController,
indicatorColor: Colors.transparent,
diff --git a/lib/pages/home.dart b/lib/pages/home.dart
index e6fe207..4da1451 100644
--- a/lib/pages/home.dart
+++ b/lib/pages/home.dart
@@ -1,7 +1,12 @@
+import 'package:app/Others/theme.dart';
import 'package:app/Others/utisl.dart';
import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
import '../Others/moods.dart';
+import 'package:firebase_messaging/firebase_messaging.dart';
+import 'package:cloud_firestore/cloud_firestore.dart';
+
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
@@ -9,11 +14,23 @@ class Home extends StatefulWidget {
class _HomeState extends State {
+ final FirebaseMessaging _fcm = FirebaseMessaging();
+
+ @override
+ void initState() {
+ _fcm.getToken().then((token) {
+ Firestore.instance.collection('tokens').document().setData({
+ 'token' : token,
+ });
+ });
+ super.initState();
+ }
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
return Scaffold(
- backgroundColor: mainBgColor,
+ backgroundColor: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[850] : mainBgColor,
body: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
@@ -61,7 +78,8 @@ class _HomeState extends State {
);
}
- Positioned _moodsHolder() {
+ Widget _moodsHolder() {
+ final theme = Provider.of(context);
return Positioned(
bottom: -45,
child: Container(
@@ -72,7 +90,7 @@ class _HomeState extends State {
.width - 40,
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
- color: Colors.white,
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.black : Colors.white,
borderRadius: BorderRadius.all(Radius.circular(28)),
boxShadow: [
BoxShadow(
@@ -86,11 +104,12 @@ class _HomeState extends State {
);
}
- Container _backBgCover() {
+ Widget _backBgCover() {
+ final theme = Provider.of(context);
return Container(
height: 260.0,
decoration: BoxDecoration(
- gradient: purpleGradient,
+ gradient: (theme.getTheme() == ThemeData.dark() ) ? whiteGradient : cyanGradient,
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(40),
bottomRight: Radius.circular(40),
@@ -133,6 +152,7 @@ class _HomeState extends State {
Widget _areaSpecialistsText() {
+ final theme = Provider.of(context);
return Container(
margin: EdgeInsets.only(top: 20.0, bottom: 20.0),
child: Row(
@@ -143,7 +163,7 @@ class _HomeState extends State {
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
- color: Colors.black,
+ color: (theme.getTheme() == ThemeData.dark() ) ? Colors.white : Colors.black,
),
),
],
@@ -471,7 +491,7 @@ class _HomeState extends State {
CircleAvatar(
backgroundColor: Color(0xFFD9D9D9),
backgroundImage: NetworkImage(
- 'https://i.pinimg.com/originals/47/03/09/4703093a70ba47001bf2c86319aae091.gif',
+ 'https://i.pinimg.com/originals/ce/78/ed/ce78ed7de1ec6e604578b61755717cf4.gif',
),
radius: 36.0,
),
@@ -492,7 +512,7 @@ class _HomeState extends State {
),
children: [
TextSpan(
- text: 'Move more',
+ text: 'Working Out',
style: TextStyle(
color: Colors.black,
fontSize: 16,
diff --git a/lib/pages/paitent.dart b/lib/pages/paitent.dart
index 063caf2..8c17fb1 100644
--- a/lib/pages/paitent.dart
+++ b/lib/pages/paitent.dart
@@ -1,374 +1,128 @@
-import 'package:app/Others/utisl.dart';
+import 'package:app/Others/theme.dart';
+import 'package:app/details/patient_detail.dart';
+import 'package:cloud_firestore/cloud_firestore.dart';
+import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
-
+import 'package:provider/provider.dart';
class Patient extends StatefulWidget {
@override
_PatientState createState() => _PatientState();
}
class _PatientState extends State {
-
+ Future getPosts() async{
+ var firestore = Firestore.instance;
+ QuerySnapshot qn = await firestore.collection('patients').getDocuments();
+ return qn.documents;
+ }
+ navigateToDetail(DocumentSnapshot food){
+ Navigator.push(context, MaterialPageRoute(builder: (context) => Foods(food: food)));
+ }
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
return Scaffold(
appBar: AppBar(
- automaticallyImplyLeading: false,
- backgroundColor: Colors.blue[800],
- title: Text('Patient'),
+ title: Text("Patient"),
+ backgroundColor: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.blue[800],
actions: [
- IconButton(icon: Icon(Icons.settings),
- onPressed: () => Navigator.pushNamed(context, '/settings')),
+ IconButton(
+ icon: Icon(Icons.settings),
+ onPressed: () => Navigator.pushNamed(context, '/settings')
+ ),
],
-
),
- backgroundColor: mainBgColor,
- body: SingleChildScrollView(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.start,
- children: [
- SizedBox(
- height: 50.0,
- ),
- SingleChildScrollView(
- scrollDirection: Axis.vertical,
- child: Padding(
- padding: EdgeInsets.only(top: 1.0,left: 5.0),
- child: Column(
- mainAxisAlignment: MainAxisAlignment.start,
+ body: Padding(
+ padding: const EdgeInsets.all(10.0),
+ child: FutureBuilder(
+ future: getPosts(),
+ builder: (_,snapshot){
+ if (snapshot.connectionState == ConnectionState.waiting) {
+ return Center(child: Text("Loading"),);
+ } else{
+ return ListView.builder(
+ itemCount: snapshot.data.length,
+ itemBuilder: (_,index){
+ return GestureDetector(
+ onTap: () => navigateToDetail(snapshot.data[index]),
+ child: Container(
+ padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0),
+ margin: EdgeInsets.only(
+ bottom: 5.0,
+ top: 15.0,
+ ),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(12.0),
+ boxShadow: [
+ BoxShadow(
+ color: Colors.grey.withOpacity(0.2),
+ spreadRadius: 1.0,
+ blurRadius: 6.0,
+ ),
+ ]),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
children: [
- _firstpatient(),
- _secondadvice(),
- _thirdadvice(),
- _fourthadvice(),
-
- //_specialistsCardInfo(),
-
- ],
- ),
- ),
-
- ),
- ],
- ),
- ),
- );
- }
-
-
-
- Widget _firstpatient() {
- return Container(
- padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0),
- margin: EdgeInsets.only(
- bottom: 20.0,
- ),
- decoration: BoxDecoration(
- color: Colors.white,
- borderRadius: BorderRadius.circular(12.0),
- boxShadow: [
- BoxShadow(
- color: Colors.grey.withOpacity(0.2),
- spreadRadius: 1.0,
- blurRadius: 6.0,
- ),
- ]),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- GestureDetector(
- onTap: () {
- Navigator.pushNamed(context, '/heart');
- },
- child: Row(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- CircleAvatar(
- backgroundColor: Color(0xFFD9D9D9),
- backgroundImage: NetworkImage(
- 'https://image.freepik.com/free-vector/vector-realistic-human-heart_77430-10.jpg'
- ),
- radius: 36.0,
- ),
- SizedBox(
- width: 10.0,
- ),
- Column(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- RichText(
- text: TextSpan(
- style: TextStyle(
- color: Colors.purple,
- fontSize: 12,
- fontWeight: FontWeight.w400,
- height: 1.3,
- ),
- children: [
- TextSpan(
- text: 'Heart ',
- style: TextStyle(
- color: Colors.black,
- fontSize: 16,
- fontWeight: FontWeight.w600,
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ CircleAvatar(
+ backgroundColor: Color(0xFFD9D9D9),
+ backgroundImage: NetworkImage('${snapshot.data[index].data['image']}'),
+ radius: 36.0,
),
- ),
- ],
- ),
- ),
- SizedBox(
- height: 6.0,
- ),
-
- ],
-
- ),
-
- ],
-
- ),
- ),
- ],
- ),
- );
- }
-
- Widget _secondadvice() {
- return Container(
- padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0),
- margin: EdgeInsets.only(
- bottom: 20.0,
- ),
- decoration: BoxDecoration(
- color: Colors.white,
- borderRadius: BorderRadius.circular(12.0),
- boxShadow: [
- BoxShadow(
- color: Colors.grey.withOpacity(0.2),
- spreadRadius: 1.0,
- blurRadius: 6.0,
- ),
- ]),
- child: GestureDetector(
- onTap: () {
- Navigator.pushNamed(context, '/flu');
- },
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- CircleAvatar(
- backgroundColor: Color(0xFFD9D9D9),
- backgroundImage: NetworkImage(
- 'https://image.freepik.com/free-vector/person-with-cold-concept_23-2148406700.jpg'
- ),
- radius: 36.0,
- ),
- SizedBox(
- width: 10.0,
- ),
- Column(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- RichText(
- text: TextSpan(
- style: TextStyle(
- color: Colors.purple,
- fontSize: 12,
- fontWeight: FontWeight.w400,
- height: 1.3,
- ),
- children: [
- TextSpan(
- text: 'Flu ',
- style: TextStyle(
- color: Colors.black,
- fontSize: 16,
- fontWeight: FontWeight.w600,
+ SizedBox(
+ width: 10.0,
),
- ),
- ],
- ),
- ),
- SizedBox(
- height: 6.0,
- ),
-
- ],
+ Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ RichText(
+ text: TextSpan(
+ style: TextStyle(
+ color: Colors.purple,
+ fontSize: 12,
+ fontWeight: FontWeight.w400,
+ height: 1.3,
+ ),
+ children: [
+ TextSpan(
+ text: snapshot.data[index].data['name'],
+ style: TextStyle(
+ color: Colors.black,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ],
+ ),
+ ),
+ SizedBox(
+ height: 6.0,
+ ),
+
+ ],
- ),
+ ),
- ],
+ ],
- ),
- ],
- ),
- ),
- );
- }
-
- Widget _thirdadvice() {
- return Container(
- padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0),
- margin: EdgeInsets.only(
- bottom: 20.0,
- ),
- decoration: BoxDecoration(
- color: Colors.white,
- borderRadius: BorderRadius.circular(12.0),
- boxShadow: [
- BoxShadow(
- color: Colors.grey.withOpacity(0.2),
- spreadRadius: 1.0,
- blurRadius: 6.0,
- ),
- ]),
- child: GestureDetector(
- onTap: () {
- Navigator.pushNamed(context, '/corona');
- },
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- CircleAvatar(
- backgroundColor: Color(0xFFD9D9D9),
- backgroundImage: NetworkImage(
- 'https://i.pinimg.com/736x/a1/9d/c2/a19dc2a04f0de08e11c6ec5dd6b9f9b9.jpg',
- ),
- radius: 36.0,
- ),
- SizedBox(
- width: 10.0,
- ),
- Column(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- RichText(
- text: TextSpan(
- style: TextStyle(
- color: Colors.purple,
- fontSize: 12,
- fontWeight: FontWeight.w400,
- height: 1.3,
),
- children: [
- TextSpan(
- text: 'Corona',
- style: TextStyle(
- color: Colors.black,
- fontSize: 16,
- fontWeight: FontWeight.w600,
- ),
- ),
- ],
- ),
- ),
- SizedBox(
- height: 6.0,
+ ],
),
+ ),
+ );
+ });
- ],
-
- ),
-
- ],
-
- ),
- ],
- ),
+ }
+ },),
),
);
}
+}
- Widget _fourthadvice() {
- return Container(
- padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0),
- margin: EdgeInsets.only(
- bottom: 20.0,
- ),
- decoration: BoxDecoration(
- color: Colors.white,
- borderRadius: BorderRadius.circular(12.0),
- boxShadow: [
- BoxShadow(
- color: Colors.grey.withOpacity(0.2),
- spreadRadius: 1.0,
- blurRadius: 6.0,
- ),
- ]),
- child: GestureDetector(
- onTap: () {
- Navigator.pushNamed(context, '/diabetes');
- },
- child: Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- CircleAvatar(
- backgroundColor: Color(0xFFD9D9D9),
- backgroundImage: NetworkImage(
- 'https://i2.wp.com/www.additudemag.com/wp-content/uploads/2020/04/The-ADHD-Diabetes-Link_1920x1080.jpg?resize=1280%2C720px&ssl=1',
- ),
- radius: 36.0,
- ),
- SizedBox(
- width: 10.0,
- ),
- Column(
- mainAxisAlignment: MainAxisAlignment.start,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- RichText(
- text: TextSpan(
- style: TextStyle(
- color: Colors.purple,
- fontSize: 12,
- fontWeight: FontWeight.w400,
- height: 1.3,
- ),
- children: [
- TextSpan(
- text: 'Diabetes',
- style: TextStyle(
- color: Colors.black,
- fontSize: 16,
- fontWeight: FontWeight.w600,
- ),
- ),
- ],
- ),
- ),
- SizedBox(
- height: 6.0,
- ),
-
- ],
-
- ),
-
- ],
- ),
- ],
- ),
- ),
- );
- }
-}
\ No newline at end of file
diff --git a/lib/pages/recipes.dart b/lib/pages/recipes.dart
index d62a1aa..25d8bb8 100644
--- a/lib/pages/recipes.dart
+++ b/lib/pages/recipes.dart
@@ -1,5 +1,7 @@
+import 'package:app/Others/theme.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:provider/provider.dart';
class Recipes extends StatefulWidget {
@@ -11,10 +13,11 @@ class _RecipesState extends State {
@override
Widget build(BuildContext context) {
+ final theme = Provider.of(context);
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
- backgroundColor: Colors.blue[800],
+ backgroundColor: (theme.getTheme() == ThemeData.dark() ) ? Colors.grey[900] : Colors.blue[800],
title: Text('Recipes'),
actions: [
IconButton(icon: Icon(Icons.settings),
@@ -57,7 +60,7 @@ class _RecipesState extends State {
child: Image(
fit: BoxFit.contain,
alignment: Alignment.topRight,
- image: AssetImage('images/chiken.jpg'),
+ image: AssetImage('images/recipes/chiken.jpg'),
),
),
),
@@ -139,7 +142,7 @@ class _RecipesState extends State {
fit: BoxFit.contain,
alignment: Alignment.topRight,
image: AssetImage(
- 'images/yogurt-cake.jpeg'),
+ 'images/recipes/yogurt-cake.jpeg'),
),
),
),
@@ -178,7 +181,7 @@ class _RecipesState extends State {
child: Image(
fit: BoxFit.contain,
alignment: Alignment.topRight,
- image: AssetImage("images/beef.jpeg"),
+ image: AssetImage("images/recipes/beef.jpeg"),
),),
),
],)
@@ -218,7 +221,7 @@ class _RecipesState extends State {
fit: BoxFit.contain,
alignment: Alignment.topRight,
image: AssetImage(
- "images/ree.jpeg"),
+ "images/recipes/ree.jpeg"),
),),
),
],)
@@ -258,7 +261,7 @@ class _RecipesState extends State {
fit: BoxFit.contain,
alignment: Alignment.topRight,
image: AssetImage(
- "images/nutty-chicken-sate-strips.jpg"),
+ "images/recipes/nutty-chicken-sate-strips.jpg"),
),),
),
],)
@@ -267,6 +270,46 @@ class _RecipesState extends State {
),
),
),
+ Padding(
+ padding: const EdgeInsets.all(16.0),
+ child: Container(
+ child: new FittedBox(
+
+ child: GestureDetector(
+ onTap: () => Navigator.pushNamed(context, '/r7'),
+ child: Material(
+ color: Colors.white,
+ elevation: 14.0,
+ borderRadius: BorderRadius.circular(24.0),
+ shadowColor: Color(0x802196F3),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Container(
+ child: Padding(
+ padding: const EdgeInsets.only(left: 16.0),
+ child: myDetailsContainer7(),
+ ),
+ ),
+
+ Container(
+ width: 250,
+ height: 180,
+ child: ClipRRect(
+ borderRadius: new BorderRadius.circular(24.0),
+ child: Image(
+ fit: BoxFit.contain,
+ alignment: Alignment.topRight,
+ image: NetworkImage('https://food.fnr.sndimg.com/content/dam/images/food/fullset/2011/11/4/1/CCHAP402_Sloppy-Joes_s4x3.jpg.rend.hgtvcom.966.725.suffix/1382540648899.jpeg'),
+ ),
+ )
+ ),
+ ],)
+ ),
+ ),
+ ),
+ ),
+ ),
],
@@ -510,3 +553,48 @@ Widget myDetailsContainer6() {
],
);
}
+Widget myDetailsContainer7() {
+ return Column(
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ children: [
+ Padding(
+ padding: const EdgeInsets.only(left: 8.0),
+ child: Container(child: Text("Sloppy Joes",
+ style: TextStyle(color: Colors.blueAccent,
+ fontSize: 24.0,
+ fontWeight: FontWeight.bold),)),
+ ),
+ Padding(
+ padding: const EdgeInsets.only(left: 8.0),
+ child: Container(
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ children: [
+ Container(child: Text("5.0",
+ style: TextStyle(color: Colors.black54, fontSize: 18.0,),)),
+ Container(child: Icon(
+ FontAwesomeIcons.solidStar, color: Colors.amber,
+ size: 15.0,),),
+ Container(child: Icon(
+ FontAwesomeIcons.solidStar, color: Colors.amber,
+ size: 15.0,),),
+ Container(child: Icon(
+ FontAwesomeIcons.solidStar, color: Colors.amber,
+ size: 15.0,),),
+ Container(child: Icon(
+ FontAwesomeIcons.solidStar, color: Colors.amber,
+ size: 15.0,),),
+ Container(child: Icon(
+ FontAwesomeIcons.solidStar, color: Colors.amber,
+ size: 15.0,),),
+ Container(child: Text(" (89)",
+ style: TextStyle(color: Colors.black54, fontSize: 18.0,),)),
+ ],)),
+ ),
+ Container(child: Text("Ellie Krieger",
+ style: TextStyle(color: Colors.black54,
+ fontSize: 18.0,
+ fontWeight: FontWeight.bold),)),
+ ],
+ );
+}
\ No newline at end of file
diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart
index 224487f..286d6ac 100644
--- a/lib/pages/settings.dart
+++ b/lib/pages/settings.dart
@@ -1,5 +1,10 @@
+import 'package:app/Others/theme.dart';
import 'package:flutter/material.dart';
+import 'package:font_awesome_flutter/font_awesome_flutter.dart';
+import 'package:provider/provider.dart';
import 'package:settings_ui/settings_ui.dart';
+import 'package:url_launcher/url_launcher.dart';
+import 'package:shared_preferences/shared_preferences.dart';
const url = "https://flutter.io";
@@ -12,74 +17,127 @@ class Settings extends StatefulWidget {
}
class _SettingsState extends State {
- // bool _value = false;
+ bool value = false;
String _version = '5.0';
+ _video() async {
+ const url = 'https://mazenomar.pythonanywhere.com/';
+ if (await canLaunch(url)) {
+ await launch(url);
+ } else {
+ throw 'Could not launch $url';
+ }
+ }
+bool check;
+ checkNight() async{
+ SharedPreferences prefs = await SharedPreferences.getInstance();
+ check = prefs.getBool('dark');
+ print(check);
+ if(check){
+ setState(() {
+ value = true;
+ });
+ } else{
+ setState(() {
+ value = false;
+ });
+ }
+ }
+ @override
+ void initState() {
+ checkNight();
+ super.initState();
+ }
+
@override
Widget build(BuildContext context) {
+ ThemeChanger _themeChanger = Provider.of(context);
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.black,
title: Text('Settings'),
),
-// bottomNavigationBar: BottomNavigationBar(
-// currentIndex: _currentindex,
-// items: [
-// BottomNavigationBarItem(icon: Icon(Icons.tag_faces), title: Text("")),
-// BottomNavigationBarItem(icon: Icon(Icons.fastfood), title: Text("")),
-// BottomNavigationBarItem(icon: Icon(Icons.add_shopping_cart), title: Text("")),
-// ],
-// onTap: (int index) {
-// setState(() {
-// _currentindex = index;
-// });
-// },
-// ),
- body: SettingsList(
- sections: [
- SettingsSection(
- title: 'Section',
- tiles: [
- SettingsTile(
- title: 'Language',
- subtitle: 'English',
- leading: Icon(Icons.language),
- onTap: () {},
- ),
- SettingsTile(
- title: 'Permissions',
- leading: Icon(Icons.lock_open),
- onTap: () {},
- ),
- ],
- ),
- SettingsSection(
- title: 'Misc',
- tiles: [
- SettingsTile(
- title: 'Terms and Conditions',
- leading: Icon(Icons.assignment),
- onTap: () => Navigator.pushNamed(context, '/terms'),
- ),
- SettingsTile(
- title: 'Privacy Policy',
- leading: Icon(Icons.description),
- onTap: () => Navigator.pushNamed(context, '/privacy'),
- ),
- ],
- ),
- SettingsSection(
- title: 'About',
- tiles: [
- SettingsTile(
- title: 'Version',
- subtitle: _version,
- leading: Icon(Icons.info),
- onTap: () {},
- ),
- ],
- ),
- ],
+ body: Container(
+ child: SettingsList(
+ sections: [
+ SettingsSection(
+ title: 'Section',
+ tiles: [
+ SettingsTile(
+ title: 'Language',
+ subtitle: 'English',
+ leading: Icon(Icons.language),
+ onTap: () {},
+ ),
+ SettingsTile(
+ title: 'Permissions',
+ leading: Icon(Icons.lock_open),
+ onTap: () {},
+ ),
+ ],
+ ),
+ SettingsSection(
+ title: 'Theme',
+ tiles: [
+ SettingsTile.switchTile(
+ title: value ? 'Day' : 'Night',
+ leading: value ? Icon(FontAwesomeIcons.solidSun) : Icon(FontAwesomeIcons.moon),
+ switchValue: value,
+ onToggle: (val) async{
+ setState(() {
+ value = !value;
+ });
+ if (value) {
+ _themeChanger.setTheme(ThemeData.dark());
+ SharedPreferences prefs = await SharedPreferences.getInstance();
+ prefs.setBool('dark', true);
+ } else {
+ _themeChanger.setTheme(ThemeData.light());
+ SharedPreferences prefs = await SharedPreferences.getInstance();
+ prefs.setBool('dark', false);
+ }
+ },
+ ),
+ ],
+ ),
+ SettingsSection(
+ title: 'Misc',
+ tiles: [
+ SettingsTile(
+ title: 'Terms and Conditions',
+ leading: Icon(Icons.assignment),
+ onTap: () => Navigator.pushNamed(context, '/terms'),
+ ),
+ SettingsTile(
+ title: 'Privacy Policy',
+ leading: Icon(Icons.description),
+ onTap: () => Navigator.pushNamed(context, '/privacy'),
+ ),
+ ],
+ ),
+ SettingsSection(
+ title: 'About',
+ tiles: [
+ SettingsTile(
+ title: 'Version',
+ subtitle: _version,
+ leading: Icon(Icons.info),
+ onTap: () {},
+ ),
+ ],
+ ),
+ SettingsSection(
+ title: 'Owner',
+ tiles: [
+ SettingsTile(
+ title: 'Mazen Omar',
+ leading: Icon(Icons.person),
+ onTap: _video,
+ ),
+ ],
+ ),
+ ],
+ ),
),
);
}
diff --git a/lib/pages/working_out.dart b/lib/pages/working_out.dart
new file mode 100644
index 0000000..12c9d46
--- /dev/null
+++ b/lib/pages/working_out.dart
@@ -0,0 +1,404 @@
+import 'package:app/Others/theme.dart';
+import 'package:app/auth/login.dart';
+import 'package:app/pages/settings.dart';
+import 'package:flutter/material.dart';
+import 'package:liquid_progress_indicator/liquid_progress_indicator.dart';
+import 'package:firebase_auth/firebase_auth.dart';
+import 'package:provider/provider.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+
+class WorkingOut extends StatefulWidget {
+ @override
+ _WorkingOutState createState() => _WorkingOutState();
+}
+
+class _WorkingOutState extends State {
+ @override
+ Widget build(BuildContext context) {
+ final theme = Provider.of(context);
+ return Scaffold(
+ appBar: AppBar(
+ automaticallyImplyLeading: false,
+ backgroundColor: (theme.getTheme() == ThemeData.dark()) ? Colors
+ .grey[900] : Colors.blue[800],
+ title: Text('Working Out'),
+ actions: [
+ IconButton(icon: Icon(Icons.settings),
+ onPressed: () => Navigator.pushNamed(context, '/settings')),
+ ],
+ ),
+ body: SingleChildScrollView(
+ child: Column(
+ children: [
+ Padding(
+ padding: const EdgeInsets.all(8.0),
+ child: Image(
+ image: AssetImage('images/working_out.gif'),
+ width: 200.0,
+ ),
+ ),
+ Container(
+ child: Text("10 min workout for each per day"),
+ ),
+ Container(
+ padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0),
+ margin: EdgeInsets.only(
+ bottom: 5.0,
+ top: 15.0,
+ ),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(12.0),
+ boxShadow: [
+ BoxShadow(
+ color: Colors.grey.withOpacity(0.2),
+ spreadRadius: 1.0,
+ blurRadius: 6.0,
+ ),
+ ]),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ CircleAvatar(
+ backgroundColor: Color(0xFFD9D9D9),
+ backgroundImage: NetworkImage(
+ 'https://cdn.dribbble.com/users/1532610/screenshots/3906806/___.gif'),
+ radius: 36.0,
+ ),
+ SizedBox(
+ width: 10.0,
+ ),
+ Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ RichText(
+ text: TextSpan(
+ style: TextStyle(
+ color: Colors.purple,
+ fontSize: 12,
+ fontWeight: FontWeight.w400,
+ height: 1.3,
+ ),
+ children: [
+ TextSpan(
+ text: 'Push up',
+ style: TextStyle(
+ color: Colors.black,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ],
+ ),
+ ),
+ SizedBox(
+ height: 6.0,
+ ),
+
+ ],
+
+ ),
+
+ ],
+
+ ),
+ ],
+ ),
+ ),
+ Container(
+ padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0),
+ margin: EdgeInsets.only(
+ bottom: 5.0,
+ top: 15.0,
+ ),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(12.0),
+ boxShadow: [
+ BoxShadow(
+ color: Colors.grey.withOpacity(0.2),
+ spreadRadius: 1.0,
+ blurRadius: 6.0,
+ ),
+ ]),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ CircleAvatar(
+ backgroundColor: Color(0xFFD9D9D9),
+ backgroundImage: NetworkImage(
+ 'https://hips.hearstapps.com/ame-prod-menshealth-assets.s3.amazonaws.com/main/assets/bodyweight-squat.gif?resize=480:*'),
+ radius: 36.0,
+ ),
+ SizedBox(
+ width: 10.0,
+ ),
+ Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ RichText(
+ text: TextSpan(
+ style: TextStyle(
+ color: Colors.purple,
+ fontSize: 12,
+ fontWeight: FontWeight.w400,
+ height: 1.3,
+ ),
+ children: [
+ TextSpan(
+ text: 'Standard Squat',
+ style: TextStyle(
+ color: Colors.black,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ],
+ ),
+ ),
+ SizedBox(
+ height: 6.0,
+ ),
+
+ ],
+
+ ),
+
+ ],
+
+ ),
+ ],
+ ),
+ ),
+ Container(
+ padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0),
+ margin: EdgeInsets.only(
+ bottom: 5.0,
+ top: 15.0,
+ ),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(12.0),
+ boxShadow: [
+ BoxShadow(
+ color: Colors.grey.withOpacity(0.2),
+ spreadRadius: 1.0,
+ blurRadius: 6.0,
+ ),
+ ]),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ CircleAvatar(
+ backgroundColor: Color(0xFFD9D9D9),
+ backgroundImage: NetworkImage(
+ 'https://i.pinimg.com/originals/34/cb/99/34cb992c8c0c57e896a22c1036a7c038.gif'),
+ radius: 36.0,
+ ),
+ SizedBox(
+ width: 10.0,
+ ),
+ Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ RichText(
+ text: TextSpan(
+ style: TextStyle(
+ color: Colors.purple,
+ fontSize: 12,
+ fontWeight: FontWeight.w400,
+ height: 1.3,
+ ),
+ children: [
+ TextSpan(
+ text: 'Jumping Jacks',
+ style: TextStyle(
+ color: Colors.black,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ],
+ ),
+ ),
+ SizedBox(
+ height: 6.0,
+ ),
+
+ ],
+
+ ),
+
+ ],
+
+ ),
+ ],
+ ),
+ ),
+ Container(
+ padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0),
+ margin: EdgeInsets.only(
+ bottom: 5.0,
+ top: 15.0,
+ ),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(12.0),
+ boxShadow: [
+ BoxShadow(
+ color: Colors.grey.withOpacity(0.2),
+ spreadRadius: 1.0,
+ blurRadius: 6.0,
+ ),
+ ]),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ CircleAvatar(
+ backgroundColor: Color(0xFFD9D9D9),
+ backgroundImage: NetworkImage(
+ 'https://media1.tenor.com/images/25f33bf7a836e92d9ac08cd7cef017c2/tenor.gif?itemid=16591507'),
+ radius: 36.0,
+ ),
+ SizedBox(
+ width: 10.0,
+ ),
+ Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ RichText(
+ text: TextSpan(
+ style: TextStyle(
+ color: Colors.purple,
+ fontSize: 12,
+ fontWeight: FontWeight.w400,
+ height: 1.3,
+ ),
+ children: [
+ TextSpan(
+ text: 'Hip Bridge',
+ style: TextStyle(
+ color: Colors.black,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ],
+ ),
+ ),
+ SizedBox(
+ height: 6.0,
+ ),
+
+ ],
+
+ ),
+
+ ],
+
+ ),
+ ],
+ ),
+ ),
+ Container(
+ padding: EdgeInsets.symmetric(vertical: 14.0, horizontal: 18.0),
+ margin: EdgeInsets.only(
+ bottom: 5.0,
+ top: 15.0,
+ ),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(12.0),
+ boxShadow: [
+ BoxShadow(
+ color: Colors.grey.withOpacity(0.2),
+ spreadRadius: 1.0,
+ blurRadius: 6.0,
+ ),
+ ]),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ CircleAvatar(
+ backgroundColor: Color(0xFFD9D9D9),
+ backgroundImage: NetworkImage(
+ 'https://media0.giphy.com/media/2UqZvQq4p9DjTBDVRc/giphy.gif'),
+ radius: 36.0,
+ ),
+ SizedBox(
+ width: 10.0,
+ ),
+ Column(
+ mainAxisAlignment: MainAxisAlignment.start,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ RichText(
+ text: TextSpan(
+ style: TextStyle(
+ color: Colors.purple,
+ fontSize: 12,
+ fontWeight: FontWeight.w400,
+ height: 1.3,
+ ),
+ children: [
+ TextSpan(
+ text: 'Plank',
+ style: TextStyle(
+ color: Colors.black,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ ),
+ ],
+ ),
+ ),
+ SizedBox(
+ height: 6.0,
+ ),
+
+ ],
+
+ ),
+
+ ],
+
+ ),
+ ],
+ ),
+ ),
+
+ ],
+ ),
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/lib/patients/corona.dart b/lib/patients/corona.dart
deleted file mode 100644
index 3ea9c28..0000000
--- a/lib/patients/corona.dart
+++ /dev/null
@@ -1,255 +0,0 @@
-import 'package:flutter/material.dart';
-// import 'package:font_awesome_flutter/font_awesome_flutter.dart';
-
-class Corona extends StatefulWidget {
-
- @override
- _CoronaState createState() => _CoronaState();
-}
-
-class _CoronaState extends State {
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(
- backgroundColor: Colors.green[600],
- title: Text('Corona'),
- ),
- body: GridView.count(
- crossAxisCount: 2,
- children: [
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://edge.bonnieplants.com/www/uploads/20180920004011/red-bell-pepper.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Red bell peppers",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.green[600],
- fontSize: 20.0,
- ),
- ),
- ),
-
-
- ],
-
-
- ),
-
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://static.independent.co.uk/s3fs-public/thumbnails/image/2020/05/20/19/istock-1143163513.jpg?w968h681',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Strawberries",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.green[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.jessicagavin.com/wp-content/uploads/2019/09/types-of-garlic-1-1200.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Garlic",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.green[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.seriouseats.com/2019/06/20190614-yogurt-vicky-wasik-8-1500x1125.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Yogurt",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.green[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://i.ytimg.com/vi/zoUz8d_e-Ww/maxresdefault.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Chickpeas",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.green[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://snaped.fns.usda.gov/sites/default/files/styles/crop_ratio_7_5/public/seasonal-produce/2018-05/mushrooms.jpg?h=b754914e&itok=Kldbq8Du',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Mushrooms",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.green[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.jessicagavin.com/wp-content/uploads/2019/05/how-to-cook-broccoli-20-1200.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Broccoli",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.green[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://sc01.alicdn.com/kf/HTB1HCEMq5OYBuNjSsD4q6zSkFXaF.jpg_350x350.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Sunflower seeds",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.green[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- ],
- ),
- );
- }
-}
diff --git a/lib/patients/diabetes.dart b/lib/patients/diabetes.dart
deleted file mode 100644
index dafe9b8..0000000
--- a/lib/patients/diabetes.dart
+++ /dev/null
@@ -1,255 +0,0 @@
-import 'package:flutter/material.dart';
-// import 'package:font_awesome_flutter/font_awesome_flutter.dart';
-
-class Diabetes extends StatefulWidget {
-
- @override
- _DiabetesState createState() => _DiabetesState();
-}
-
-class _DiabetesState extends State {
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(
- backgroundColor: Colors.pink[600],
- title: Text('Diabetes'),
- ),
- body: GridView.count(
- crossAxisCount: 2,
- children: [
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/articles/health_tools/fatty_fish_that_are_high_in_omega_3s_slideshow/493ss_thinkstock_rf_atlantic_mackerel.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Fatty Fish",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.pink[600],
- fontSize: 20.0,
- ),
- ),
- ),
-
-
- ],
-
-
- ),
-
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://miro.medium.com/max/7160/0*Qg-sACv60IYe7Iav.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Leafy Greens",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.pink[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://i0.wp.com/images-prod.healthline.com/hlcmsresource/images/AN_images/scoop-of-cinnamon-1296x728.jpg?w=1155&h=1528',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Cinnamon",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.pink[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.simplyrecipes.com/wp-content/uploads/2014/07/hard-boiled-eggs-horiz-800.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Eggs",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.pink[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://5.imimg.com/data5/WD/HY/MY-4195389/chia-seeds-500x500.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Chia Seeds",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.pink[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://i0.wp.com/cdn-prod.medicalnewstoday.com/content/images/articles/327/327455/turmeric-root-and-powder.jpg?w=1155&h=1675',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Turmeric",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.pink[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.seriouseats.com/2019/06/20190614-yogurt-vicky-wasik-8-1500x1125.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Yogurt",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.pink[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://images-na.ssl-images-amazon.com/images/I/71QAe7Xq-yL._SL1117_.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Nuts",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.pink[600],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- ],
- ),
- );
- }
-}
diff --git a/lib/patients/flu.dart b/lib/patients/flu.dart
deleted file mode 100644
index e9db3c7..0000000
--- a/lib/patients/flu.dart
+++ /dev/null
@@ -1,255 +0,0 @@
-import 'package:flutter/material.dart';
-// import 'package:font_awesome_flutter/font_awesome_flutter.dart';
-
-class Flu extends StatefulWidget {
-
- @override
- _FluState createState() => _FluState();
-}
-
-class _FluState extends State {
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(
- backgroundColor: Colors.purple[900],
- title: Text('Flu'),
- ),
- body: GridView.count(
- crossAxisCount: 2,
- children: [
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://food.fnr.sndimg.com/content/dam/images/food/fullset/2019/9/10/0/FNK_Chicken-Broth_H_s4x3.jpg.rend.hgtvcom.826.620.suffix/1568395014401.jpeg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Broth",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.purple[900],
- fontSize: 20.0,
- ),
- ),
- ),
-
-
- ],
-
-
- ),
-
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://i.ytimg.com/vi/o91gT73mQhg/maxresdefault.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Chicken Soup",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.purple[900],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.jessicagavin.com/wp-content/uploads/2019/09/types-of-garlic-1-1200.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Garlic",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.purple[900],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.seriouseats.com/2019/06/20190614-yogurt-vicky-wasik-8-1500x1125.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Yogurt",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.purple[900],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/article_thumbnails/slideshows/foods_with_vitamin_c_besides_oranges_slideshow/1800x1200_foods_with_vitamin_c_besides_oranges_slideshow.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Vit. C Fruits",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.purple[900],
- fontSize: 15.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://miro.medium.com/max/7160/0*Qg-sACv60IYe7Iav.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Leafy greens",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.purple[900],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.jessicagavin.com/wp-content/uploads/2019/05/how-to-cook-broccoli-20-1200.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Broccoli",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.purple[900],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.eatingbirdfood.com/wp-content/uploads/2019/04/egg-white-protein-oatmeal-4.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Oatmeal",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.purple[900],
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- ],
- ),
- );
- }
-}
diff --git a/lib/patients/heart.dart b/lib/patients/heart.dart
deleted file mode 100644
index 1524075..0000000
--- a/lib/patients/heart.dart
+++ /dev/null
@@ -1,255 +0,0 @@
-import 'package:flutter/material.dart';
-// import 'package:font_awesome_flutter/font_awesome_flutter.dart';
-
-class Heart extends StatefulWidget {
-
- @override
- _HeartState createState() => _HeartState();
-}
-
-class _HeartState extends State {
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(
- backgroundColor: Colors.red[900],
- title: Text('Heart'),
- ),
- body: GridView.count(
- crossAxisCount: 2,
- children: [
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://images-prod.healthline.com/hlcmsresource/images/AN_images/berry-almond-salad-1296x728.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Leafy Green Vegetables",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.red,
- fontSize: 15.0,
- ),
- ),
- ),
-
-
- ],
-
-
- ),
-
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://static01.nyt.com/images/2020/03/17/well/askwell-wholegrains/askwell-wholegrains-mediumSquareAt3X.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Whole Grains",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.red,
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://images.unsplash.com/photo-1474480109237-15a7ca8f0685?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1053&q=80',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Berries",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.red,
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.verywellhealth.com/thmb/dFmKvt9jP4QzC1ddY9U4UbvP8mw=/2077x1443/filters:fill(87E3EF,1)/avocadosGettyImages-961101662-5b9eda1bc9e77c0050a7fafa.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Avocados",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.red,
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://omegaquant.com/wp-content/uploads/2019/04/omega-3s-in-fish-and-fish-oil.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Fatty Fish and Fish Oil",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.red,
- fontSize: 15.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.healthline.com/hlcmsresource/images/AN_images/AN378-Walnuts-Hands-732x549-thumb.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Walnuts",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.red,
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://www.gracefullittlehoneybee.com/wp-content/uploads/2014/09/Slow-Cooker-Pinto-Beans-3.jpg',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Beans",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.red,
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- new Container(
- child: Card(
- elevation: 10.0,
- child: Column(
- children:[
- Image.network(
- 'https://i1.wp.com/www.eatthis.com/wp-content/uploads/2017/10/dark-chocolate-bar-squares.jpg?fit=1024%2C750&ssl=1',
- fit: BoxFit.cover,
- height: 140.0,
- width: 200.0,
- ),
- SizedBox(height: 5.0),
-
- Padding(
- padding: EdgeInsets.only(right: 5.0, left: 5.0),
- child: Text(
- "Dark Chocolates",
- style: TextStyle(
- fontWeight: FontWeight.bold,
- color: Colors.red,
- fontSize: 20.0,
- ),
- ),
- ),
- ],
- ),
- ),
- ),
- ],
- ),
- );
- }
-}
diff --git a/pubspec.lock b/pubspec.lock
index 293ac46..717ff18 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -50,6 +50,27 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0+1"
+ cloud_firestore:
+ dependency: "direct main"
+ description:
+ name: cloud_firestore
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.13.7"
+ cloud_firestore_platform_interface:
+ dependency: transitive
+ description:
+ name: cloud_firestore_platform_interface
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.1.2"
+ cloud_firestore_web:
+ dependency: transitive
+ description:
+ name: cloud_firestore_web
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.1.1+2"
collection:
dependency: transitive
description:
@@ -98,14 +119,63 @@ packages:
name: curved_navigation_bar
url: "https://pub.dartlang.org"
source: hosted
- version: "0.3.2"
+ version: "0.3.3"
dots_indicator:
dependency: transitive
description:
name: dots_indicator
url: "https://pub.dartlang.org"
source: hosted
- version: "1.1.0"
+ version: "1.2.0"
+ firebase:
+ dependency: transitive
+ description:
+ name: firebase
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "7.3.0"
+ firebase_auth:
+ dependency: "direct main"
+ description:
+ name: firebase_auth
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.16.1"
+ firebase_auth_platform_interface:
+ dependency: transitive
+ description:
+ name: firebase_auth_platform_interface
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.1.8"
+ firebase_auth_web:
+ dependency: transitive
+ description:
+ name: firebase_auth_web
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.1.3+1"
+ firebase_core:
+ dependency: transitive
+ description:
+ name: firebase_core
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.4.5"
+ firebase_core_platform_interface:
+ dependency: transitive
+ description:
+ name: firebase_core_platform_interface
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.0.4"
+ firebase_core_web:
+ dependency: transitive
+ description:
+ name: firebase_core_web
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.1.1+2"
firebase_messaging:
dependency: "direct main"
description:
@@ -118,20 +188,20 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
- flutter_facebook_login:
+ flutter_html:
dependency: "direct main"
description:
- name: flutter_facebook_login
+ name: flutter_html
url: "https://pub.dartlang.org"
source: hosted
- version: "3.0.0"
- flutter_html:
+ version: "1.0.0"
+ flutter_spinkit:
dependency: "direct main"
description:
- name: flutter_html
+ name: flutter_spinkit
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.0"
+ version: "4.1.2+1"
flutter_svg:
dependency: transitive
description:
@@ -163,6 +233,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.14.0+3"
+ http:
+ dependency: transitive
+ description:
+ name: http
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.12.1"
+ http_parser:
+ dependency: transitive
+ description:
+ name: http_parser
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "3.1.4"
image:
dependency: transitive
description:
@@ -183,14 +267,14 @@ packages:
name: introduction_screen
url: "https://pub.dartlang.org"
source: hosted
- version: "1.0.8"
+ version: "1.0.9"
js:
dependency: transitive
description:
name: js
url: "https://pub.dartlang.org"
source: hosted
- version: "0.6.1+1"
+ version: "0.6.2"
liquid_progress_indicator:
dependency: "direct main"
description:
@@ -212,6 +296,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.8"
+ nested:
+ dependency: transitive
+ description:
+ name: nested
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "0.0.4"
open_iconic_flutter:
dependency: transitive
description:
@@ -240,6 +331,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.4"
+ pedantic:
+ dependency: transitive
+ description:
+ name: pedantic
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.9.0"
petitparser:
dependency: transitive
description:
@@ -254,6 +352,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.1"
+ platform_detect:
+ dependency: transitive
+ description:
+ name: platform_detect
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.4.0"
plugin_platform_interface:
dependency: transitive
description:
@@ -261,6 +366,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
+ provider:
+ dependency: "direct main"
+ description:
+ name: provider
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "4.3.0"
+ pub_semver:
+ dependency: transitive
+ description:
+ name: pub_semver
+ url: "https://pub.dartlang.org"
+ source: hosted
+ version: "1.4.4"
quiver:
dependency: transitive
description:
@@ -288,14 +407,14 @@ packages:
name: shared_preferences
url: "https://pub.dartlang.org"
source: hosted
- version: "0.5.7+2"
+ version: "0.5.7+3"
shared_preferences_macos:
dependency: transitive
description:
name: shared_preferences_macos
url: "https://pub.dartlang.org"
source: hosted
- version: "0.0.1+9"
+ version: "0.0.1+10"
shared_preferences_platform_interface:
dependency: transitive
description:
@@ -310,13 +429,6 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.2+7"
- simple_animations:
- dependency: "direct main"
- description:
- name: simple_animations
- url: "https://pub.dartlang.org"
- source: hosted
- version: "1.3.12"
simple_gesture_detector:
dependency: transitive
description:
@@ -398,14 +510,14 @@ packages:
name: url_launcher
url: "https://pub.dartlang.org"
source: hosted
- version: "5.4.7"
+ version: "5.4.11"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
url: "https://pub.dartlang.org"
source: hosted
- version: "0.0.1+5"
+ version: "0.0.1+7"
url_launcher_platform_interface:
dependency: transitive
description:
@@ -419,7 +531,7 @@ packages:
name: url_launcher_web
url: "https://pub.dartlang.org"
source: hosted
- version: "0.1.1+5"
+ version: "0.1.2"
vector_math:
dependency: transitive
description:
@@ -433,7 +545,7 @@ packages:
name: video_player
url: "https://pub.dartlang.org"
source: hosted
- version: "0.10.11+1"
+ version: "0.10.11+2"
video_player_platform_interface:
dependency: transitive
description:
@@ -447,7 +559,7 @@ packages:
name: video_player_web
url: "https://pub.dartlang.org"
source: hosted
- version: "0.1.3+1"
+ version: "0.1.3+2"
wakelock:
dependency: transitive
description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 07b4d34..c8885c7 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -11,7 +11,7 @@ description: A new Flutter application.
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
-version: 1.0.0+1
+version: 5.0.0+1
environment:
sdk: ">=2.1.0 <3.0.0"
@@ -26,16 +26,18 @@ dependencies:
settings_ui: ^0.2.0
flutter_html: ^1.0.0
firebase_messaging: ^6.0.16
- simple_animations: ^1.3.3
font_awesome_flutter: ^8.8.1
url_launcher: ^5.4.7
introduction_screen: ^1.0.8
cupertino_icons: ^0.1.3
- shared_preferences: ^0.5.7+2
- flutter_facebook_login: ^3.0.0
liquid_progress_indicator: ^0.3.2
table_calendar: ^2.2.3
-
+ firebase_auth: ^0.16.1
+ cloud_firestore: ^0.13.7
+ shared_preferences: ^0.5.7+3
+ flutter_spinkit: "^4.1.2"
+ provider: ^4.3.0
+
dev_dependencies:
flutter_test:
sdk: flutter
@@ -56,6 +58,10 @@ flutter:
# To add assets to your application, add an assets section, like this:
assets:
- images/
+ - images/onboarding/
+ - images/recipes/
+
+
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware.