diff --git a/package-lock.json b/package-lock.json index 9981744652217d6fb750aea73a717b279797a75b..53fbe6a2f757f97cd9fb3d49af611e6ab3658bb7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,1410 +4,486 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "requires": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "@ant-design/icons": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.5.0.tgz", + "integrity": "sha512-ZAKJcmr4DBV3NWr8wm2dCxNKN4eFrX+qCaPsuFejP6FRsf+m5OKxvCVi9bSp1lmKWeOI5yECAx5s0uFm4QHuPw==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.0.0", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "insert-css": "^2.0.0", + "rc-util": "^5.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "@ant-design/icons-svg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz", + "integrity": "sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ==" + }, + "@ant-design/react-slick": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.28.2.tgz", + "integrity": "sha512-nkrvXsO29pLToFaBb3MlJY4McaUFR4UHtXTz6A5HBzYmxH4SwKerX54mWdGc/6tKpHvS3vUwjEOt2T5XqZEo8Q==", + "requires": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "lodash": "^4.17.15", + "resize-observer-polyfill": "^1.5.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.10.1" } }, "@babel/compat-data": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.1.tgz", - "integrity": "sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz", + "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==", "requires": { - "browserslist": "^4.8.2", + "browserslist": "^4.12.0", "invariant": "^2.2.4", "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "@babel/core": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.4.tgz", - "integrity": "sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ==", - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helpers": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4", - "convert-source-map": "^1.7.0", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", + "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.2", + "@babel/helpers": "^7.2.0", + "@babel/parser": "^7.2.2", + "@babel/template": "^7.2.2", + "@babel/traverse": "^7.2.2", + "@babel/types": "^7.2.2", + "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", - "lodash": "^4.17.13", + "lodash": "^4.17.10", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" + "ms": "^2.1.1" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.10.2", "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", + "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.10.1" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", + "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-explode-assignable-expression": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-builder-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", - "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz", + "integrity": "sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw==", "requires": { - "@babel/types": "^7.8.3", - "esutils": "^2.0.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/types": "^7.10.1" } }, - "@babel/helper-call-delegate": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", - "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz", + "integrity": "sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ==", "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-module-imports": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-compilation-targets": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.3.tgz", - "integrity": "sha512-JLylPCsFjhLN+6uBSSh3iYdxKdeO9MNmoY96PE/99d8kyBFaXLORtAVhqN6iHa+wtPeqxKLghDOZry0+Aiw9Tw==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", + "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", "requires": { - "@babel/compat-data": "^7.8.1", - "browserslist": "^4.8.2", + "@babel/compat-data": "^7.10.1", + "browserslist": "^4.12.0", "invariant": "^2.2.4", - "levenary": "^1.1.0", + "levenary": "^1.1.1", "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", + "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", - "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", + "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", "requires": { - "@babel/helper-regex": "^7.8.3", - "regexpu-core": "^4.6.0" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-regex": "^7.10.1", + "regexpu-core": "^4.7.0" } }, "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", + "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/helper-function-name": "^7.10.1", + "@babel/types": "^7.10.1", "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", + "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", "requires": { - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", + "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", + "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.10.1" } }, "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz", + "integrity": "sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==", "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.10.1" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", + "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.10.1" } }, "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", + "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.10.1" } }, "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", - "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", + "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", + "requires": { + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1", "lodash": "^4.17.13" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", + "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", "requires": { - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/types": "^7.10.1" } }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", + "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==" }, "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", + "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", "requires": { "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", + "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-wrap-function": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-wrap-function": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", + "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-member-expression-to-functions": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", + "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", "requires": { - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/template": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", + "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.10.1" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", + "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==" + }, "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", + "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-function-name": "^7.10.1", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", + "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", "requires": { + "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==" + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz", + "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-remap-async-to-generator": "^7.10.1", "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.7.4.tgz", - "integrity": "sha512-EcuXeV4Hv1X3+Q1TsuOmyyxeTRiSqurGJ26+I/FW1WbymmRRapVORm6x1Zl3iDIHyRxEs+VXWp6qnlcfcJSbbw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz", + "integrity": "sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.7.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-proposal-decorators": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.4.tgz", - "integrity": "sha512-GftcVDcLCwVdzKmwOBDjATd548+IE+mBo7ttgatqNDR7VG7GqIuZPtRWlMLHbhTXhcnFZiGER8iIYl1n/imtsg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.3.0.tgz", + "integrity": "sha512-3W/oCUmsO43FmZIqermmq6TKaRSYhmh/vybPfVFwQWdSb8xwki38uAIvknCRzuyHRuYfCYmJzL9or1v0AffPjg==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.7.4", + "@babel/helper-create-class-features-plugin": "^7.3.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-decorators": "^7.7.4" + "@babel/plugin-syntax-decorators": "^7.2.0" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", - "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz", + "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", - "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz", + "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-json-strings": "^7.8.0" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", + "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.7.4.tgz", - "integrity": "sha512-CG605v7lLpVgVldSY6kxsN9ui1DxFOyepBfuX2AzU2TNriMAYApoU55mrGw9Jr4TlrTzPCG10CL8YXyi+E/iPw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz", + "integrity": "sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-numeric-separator": "^7.7.4" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-numeric-separator": "^7.10.1" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", + "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.1" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", + "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", - "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", + "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz", + "integrity": "sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" + } + }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", - "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz", + "integrity": "sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-async-generators": { @@ -1418,12 +494,20 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", + "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1" + } + }, "@babel/plugin-syntax-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", - "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz", + "integrity": "sha512-a9OAbQhKOwSle1Vr0NJu/ISg1sPfdEkfRKWpgPuzhnWWzForou2gIeUIIwjAMHRekhhpJ7eulZlYs0H14Cbi+g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-dynamic-import": { @@ -1435,11 +519,11 @@ } }, "@babel/plugin-syntax-flow": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", - "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.1.tgz", + "integrity": "sha512-b3pWVncLBYoPP60UOTc7NMlbtsHQ6ITim78KQejNHK6WJ2mzV5kCcg4mIWpasAfJEgwVTibwo2e+FU7UEIKQUg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-json-strings": { @@ -1451,11 +535,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz", + "integrity": "sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { @@ -1467,11 +551,11 @@ } }, "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", + "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-object-rest-spread": { @@ -1499,356 +583,194 @@ } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", - "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz", + "integrity": "sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-syntax-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", - "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.1.tgz", + "integrity": "sha512-X/d8glkrAtra7CaQGMiGs/OGa6XgUzqPcBXCIGFCpCqnfGlT0Wfbzo/B89xHhnInTaItPK8LALblVXcUOEh95Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", + "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", + "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", "requires": { - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-remap-async-to-generator": "^7.8.3" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-remap-async-to-generator": "^7.10.1" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", + "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", + "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-plugin-utils": "^7.10.1", "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", - "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-define-map": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", + "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-define-map": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-optimise-call-expression": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", + "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-destructuring": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", - "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", + "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", - "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz", + "integrity": "sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", - "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz", + "integrity": "sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", + "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.7.4.tgz", - "integrity": "sha512-w9dRNlHY5ElNimyMYy0oQowvQpwt/PRHI0QS98ZJCTZU2bvSnKXo5zEiD5u76FBPigTm8TkqzmnUTg16T7qbkA==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.2.3.tgz", + "integrity": "sha512-xnt7UIk9GYZRitqCnsVMjQK1O2eKZwFB3CvvHjf5SGx6K6vr/MScCKQDnf1DxRaj501e3pXjti+inbSXX2ZUoQ==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.7.4" + "@babel/plugin-syntax-flow": "^7.2.0" } }, "@babel/plugin-transform-for-of": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz", - "integrity": "sha512-ZjXznLNTxhpf4Q5q3x1NsngzGA38t9naWH8Gt+0qYZEJAcvPI9waSStSh56u19Ofjr7QmD0wUsQ8hw8s/p1VnA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", + "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", + "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==" - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", + "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", + "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", - "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz", + "integrity": "sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==", "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", - "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", + "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-simple-access": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-simple-access": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", - "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz", + "integrity": "sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==", "requires": { - "@babel/helper-hoist-variables": "^7.8.3", - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "babel-plugin-dynamic-import-node": "^2.3.0" + "@babel/helper-hoist-variables": "^7.10.1", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", - "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz", + "integrity": "sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==", "requires": { - "@babel/helper-module-transforms": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-named-capturing-groups-regex": { @@ -1860,409 +782,337 @@ } }, "@babel/plugin-transform-new-target": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", - "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz", + "integrity": "sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", + "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-replace-supers": "^7.10.1" } }, "@babel/plugin-transform-parameters": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.3.tgz", - "integrity": "sha512-/pqngtGb54JwMBZ6S/D3XYylQDFtGjWrnoCF4gXZOUpFV/ujbxnoNGNvDGu6doFWRPBveE72qTx/RRU44j5I/Q==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", + "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", "requires": { - "@babel/helper-call-delegate": "^7.8.3", - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-get-function-arity": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", + "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz", - "integrity": "sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.1.tgz", + "integrity": "sha512-V4os6bkWt/jbrzfyVcZn2ZpuHZkvj3vyBU0U/dtS8SZuMS7Rfx5oknTrtfyXJ2/QZk8gX7Yls5Z921ItNpE30Q==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", - "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz", + "integrity": "sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", - "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz", + "integrity": "sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw==", "requires": { - "@babel/helper-builder-react-jsx": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-builder-react-jsx": "^7.10.1", + "@babel/helper-builder-react-jsx-experimental": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.1.tgz", + "integrity": "sha512-XwDy/FFoCfw9wGFtdn5Z+dHh6HXKHkC6DwKNWpN74VWinUagZfDcEJc3Y8Dn5B3WMVnAllX8Kviaw7MtC5Epwg==", + "requires": { + "@babel/helper-builder-react-jsx-experimental": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", - "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz", + "integrity": "sha512-4p+RBw9d1qV4S749J42ZooeQaBomFPrSxa9JONLHJ1TxCBo3TzJ79vtmG2S2erUT8PDDrPdw4ZbXGr2/1+dILA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", - "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz", + "integrity": "sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-jsx": "^7.10.1" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.1.tgz", + "integrity": "sha512-mfhoiai083AkeewsBHUpaS/FM1dmUENHBMpS/tugSJ7VXqXO5dCN1Gkint2YvM1Cdv1uhmAKt1ZOuAjceKmlLA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-regenerator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", - "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", + "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", "requires": { - "regenerator-transform": "^0.14.0" + "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", - "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz", + "integrity": "sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-runtime": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.7.4.tgz", - "integrity": "sha512-O8kSkS5fP74Ad/8pfsCMGa8sBRdLxYoSReaARRNSz3FbFQj3z/QUvoUmJ28gn9BO93YfnXc3j+Xyaqe8cKDNBQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.2.0.tgz", + "integrity": "sha512-jIgkljDdq4RYDnJyQsiWbdvGeei/0MOTtSHKO/rfbd/mXBxNpdlulMx49L0HQ4pug1fXannxoqCI+fYSle9eSw==", "requires": { - "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", "resolve": "^1.8.1", "semver": "^5.5.1" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", + "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", + "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", + "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-regex": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/helper-regex": "^7.10.1" } }, "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", + "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-annotate-as-pure": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.3.tgz", - "integrity": "sha512-3TrkKd4LPqm4jHs6nPtSDI/SV9Cm5PRJkHLUgTcqRQQTMAZ44ZaAdDZJtvWFSaRcvT0a1rTmJ5ZA5tDKjleF3g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz", + "integrity": "sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-typescript": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", - "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.1.tgz", + "integrity": "sha512-v+QWKlmCnsaimLeqq9vyCsVRMViZG1k2SZTlcZvB+TqyH570Zsij8nvVUZzOASCRiQFUxkLrn9Wg/kH0zgy5OQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-syntax-typescript": "^7.10.1" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz", + "integrity": "sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-typescript": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", + "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1" } }, "@babel/preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.3.tgz", - "integrity": "sha512-Rs4RPL2KjSLSE2mWAx5/iCH+GC1ikKdxPrhnRS6PfFVaiZeom22VFKN4X8ZthyN61kAaR05tfXTbCvatl9WIQg==", - "requires": { - "@babel/compat-data": "^7.8.0", - "@babel/helper-compilation-targets": "^7.8.3", - "@babel/helper-module-imports": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-proposal-async-generator-functions": "^7.8.3", - "@babel/plugin-proposal-dynamic-import": "^7.8.3", - "@babel/plugin-proposal-json-strings": "^7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-proposal-object-rest-spread": "^7.8.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", - "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", + "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", + "requires": { + "@babel/compat-data": "^7.10.1", + "@babel/helper-compilation-targets": "^7.10.2", + "@babel/helper-module-imports": "^7.10.1", + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-proposal-async-generator-functions": "^7.10.1", + "@babel/plugin-proposal-class-properties": "^7.10.1", + "@babel/plugin-proposal-dynamic-import": "^7.10.1", + "@babel/plugin-proposal-json-strings": "^7.10.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", + "@babel/plugin-proposal-numeric-separator": "^7.10.1", + "@babel/plugin-proposal-object-rest-spread": "^7.10.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", + "@babel/plugin-proposal-optional-chaining": "^7.10.1", + "@babel/plugin-proposal-private-methods": "^7.10.1", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.1", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-json-strings": "^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.1", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.8.3", - "@babel/plugin-transform-async-to-generator": "^7.8.3", - "@babel/plugin-transform-block-scoped-functions": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/plugin-transform-classes": "^7.8.3", - "@babel/plugin-transform-computed-properties": "^7.8.3", - "@babel/plugin-transform-destructuring": "^7.8.3", - "@babel/plugin-transform-dotall-regex": "^7.8.3", - "@babel/plugin-transform-duplicate-keys": "^7.8.3", - "@babel/plugin-transform-exponentiation-operator": "^7.8.3", - "@babel/plugin-transform-for-of": "^7.8.3", - "@babel/plugin-transform-function-name": "^7.8.3", - "@babel/plugin-transform-literals": "^7.8.3", - "@babel/plugin-transform-member-expression-literals": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.8.3", - "@babel/plugin-transform-modules-systemjs": "^7.8.3", - "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.10.1", + "@babel/plugin-transform-arrow-functions": "^7.10.1", + "@babel/plugin-transform-async-to-generator": "^7.10.1", + "@babel/plugin-transform-block-scoped-functions": "^7.10.1", + "@babel/plugin-transform-block-scoping": "^7.10.1", + "@babel/plugin-transform-classes": "^7.10.1", + "@babel/plugin-transform-computed-properties": "^7.10.1", + "@babel/plugin-transform-destructuring": "^7.10.1", + "@babel/plugin-transform-dotall-regex": "^7.10.1", + "@babel/plugin-transform-duplicate-keys": "^7.10.1", + "@babel/plugin-transform-exponentiation-operator": "^7.10.1", + "@babel/plugin-transform-for-of": "^7.10.1", + "@babel/plugin-transform-function-name": "^7.10.1", + "@babel/plugin-transform-literals": "^7.10.1", + "@babel/plugin-transform-member-expression-literals": "^7.10.1", + "@babel/plugin-transform-modules-amd": "^7.10.1", + "@babel/plugin-transform-modules-commonjs": "^7.10.1", + "@babel/plugin-transform-modules-systemjs": "^7.10.1", + "@babel/plugin-transform-modules-umd": "^7.10.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", - "@babel/plugin-transform-new-target": "^7.8.3", - "@babel/plugin-transform-object-super": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.8.3", - "@babel/plugin-transform-property-literals": "^7.8.3", - "@babel/plugin-transform-regenerator": "^7.8.3", - "@babel/plugin-transform-reserved-words": "^7.8.3", - "@babel/plugin-transform-shorthand-properties": "^7.8.3", - "@babel/plugin-transform-spread": "^7.8.3", - "@babel/plugin-transform-sticky-regex": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/plugin-transform-typeof-symbol": "^7.8.3", - "@babel/plugin-transform-unicode-regex": "^7.8.3", - "@babel/types": "^7.8.3", - "browserslist": "^4.8.2", + "@babel/plugin-transform-new-target": "^7.10.1", + "@babel/plugin-transform-object-super": "^7.10.1", + "@babel/plugin-transform-parameters": "^7.10.1", + "@babel/plugin-transform-property-literals": "^7.10.1", + "@babel/plugin-transform-regenerator": "^7.10.1", + "@babel/plugin-transform-reserved-words": "^7.10.1", + "@babel/plugin-transform-shorthand-properties": "^7.10.1", + "@babel/plugin-transform-spread": "^7.10.1", + "@babel/plugin-transform-sticky-regex": "^7.10.1", + "@babel/plugin-transform-template-literals": "^7.10.1", + "@babel/plugin-transform-typeof-symbol": "^7.10.1", + "@babel/plugin-transform-unicode-escapes": "^7.10.1", + "@babel/plugin-transform-unicode-regex": "^7.10.1", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.10.2", + "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "levenary": "^1.1.0", + "levenary": "^1.1.1", "semver": "^5.5.0" - }, - "dependencies": { - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" } }, "@babel/preset-react": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", - "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.10.1.tgz", + "integrity": "sha512-Rw0SxQ7VKhObmFjD/cUcKhPTtzpeviEFX1E6PgP+cYOhQ98icNqtINNFANlsdbQHrmeWnqdxA4Tmnl1jy5tp3Q==", "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-transform-react-display-name": "^7.8.3", - "@babel/plugin-transform-react-jsx": "^7.8.3", - "@babel/plugin-transform-react-jsx-self": "^7.8.3", - "@babel/plugin-transform-react-jsx-source": "^7.8.3" + "@babel/helper-plugin-utils": "^7.10.1", + "@babel/plugin-transform-react-display-name": "^7.10.1", + "@babel/plugin-transform-react-jsx": "^7.10.1", + "@babel/plugin-transform-react-jsx-development": "^7.10.1", + "@babel/plugin-transform-react-jsx-self": "^7.10.1", + "@babel/plugin-transform-react-jsx-source": "^7.10.1", + "@babel/plugin-transform-react-pure-annotations": "^7.10.1" } }, "@babel/preset-typescript": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.7.4.tgz", - "integrity": "sha512-rqrjxfdiHPsnuPur0jKrIIGQCIgoTWMTjlbWE69G4QJ6TIOVnnRnIJhUxNTL/VwDmEAVX08Tq3B1nirer5341w==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.1.0.tgz", + "integrity": "sha512-LYveByuF9AOM8WrsNne5+N79k1YxjNB6gmpCQsnuSBAcV8QUeB+ZUxQzL7Rz7HksPbahymKkq2qBR+o36ggFZA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.7.4" + "@babel/plugin-transform-typescript": "^7.1.0" } }, "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/runtime-corejs3": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.8.3.tgz", - "integrity": "sha512-lrIU4aVbmlM/wQPzhEvzvNJskKyYptuXb0fGC0lTQTupTOYtR2Vqbu6/jf8vTr4M8Wt1nIzxVrSvPI5qESa/xA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", + "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", "requires": { - "core-js-pure": "^3.0.0", - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", + "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/code-frame": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1" } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", + "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.1", + "@babel/helper-function-name": "^7.10.1", + "@babel/helper-split-export-declaration": "^7.10.1", + "@babel/parser": "^7.10.1", + "@babel/types": "^7.10.1", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" }, "dependencies": { "debug": { @@ -2272,339 +1122,521 @@ "requires": { "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, - "@cnakazawa/watch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", - "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "@ckeditor/ckeditor5-adapter-ckfinder": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-adapter-ckfinder/-/ckeditor5-adapter-ckfinder-26.0.0.tgz", + "integrity": "sha512-X6B2zHyX5FHoox7fQvg1wykkPj+4h6VjwRe3+R6JPGWnTkgGzhMsufz2U0zym0rgvekEo0vADR3WPZEB//SNRA==", "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" + "ckeditor5": "^26.0.0" } }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + "@ckeditor/ckeditor5-autoformat": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autoformat/-/ckeditor5-autoformat-26.0.0.tgz", + "integrity": "sha512-s44X6nKlfCUGODvvf2UeVGdgt14dI87T4lX69PEIqmAvDIiAhp5iLkUpMRHRn3+lIrqO3nDd9igq4SRGgZaggw==", + "requires": { + "ckeditor5": "^26.0.0" + } }, - "@csstools/normalize.css": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", - "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" + "@ckeditor/ckeditor5-basic-styles": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-26.0.0.tgz", + "integrity": "sha512-r6G9IuKMGM6T9piTmVn5qIKyv7dGDj5wn0kTcn9i3GHPkg4AW2U5OltC3Cusd9ghPW4oQKclbfTSfNteMpCF7g==", + "requires": { + "ckeditor5": "^26.0.0" + } }, - "@emotion/hash": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz", - "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==" + "@ckeditor/ckeditor5-block-quote": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-26.0.0.tgz", + "integrity": "sha512-ijhSly3DUI3u+FrTZoys+RlpCy0dWyvYOZV0d2dsV2cba/Z/b3lfKMNSmNQT1Y1sYzMm9dQS7m50IW0wiISGgw==", + "requires": { + "ckeditor5": "^26.0.0" + } }, - "@emotion/is-prop-valid": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.6.tgz", - "integrity": "sha512-mnZMho3Sq8BfzkYYRVc8ilQTnc8U02Ytp6J1AwM6taQStZ3AhsEJBX2LzhA/LJirNCwM2VtHL3VFIZ+sNJUgUQ==", + "@ckeditor/ckeditor5-build-classic": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-26.0.0.tgz", + "integrity": "sha512-e8gf+ndcB1Fbv4h03djDpCBrY3fuP55N4rSHkBUr3m8B+Gdn31PG0BQnjwh+2/uwBR4iGmu+SgK0Kj1BpWtkbQ==", "requires": { - "@emotion/memoize": "0.7.4" + "@ckeditor/ckeditor5-adapter-ckfinder": "^26.0.0", + "@ckeditor/ckeditor5-autoformat": "^26.0.0", + "@ckeditor/ckeditor5-basic-styles": "^26.0.0", + "@ckeditor/ckeditor5-block-quote": "^26.0.0", + "@ckeditor/ckeditor5-ckfinder": "^26.0.0", + "@ckeditor/ckeditor5-cloud-services": "^26.0.0", + "@ckeditor/ckeditor5-easy-image": "^26.0.0", + "@ckeditor/ckeditor5-editor-classic": "^26.0.0", + "@ckeditor/ckeditor5-essentials": "^26.0.0", + "@ckeditor/ckeditor5-heading": "^26.0.0", + "@ckeditor/ckeditor5-image": "^26.0.0", + "@ckeditor/ckeditor5-indent": "^26.0.0", + "@ckeditor/ckeditor5-link": "^26.0.0", + "@ckeditor/ckeditor5-list": "^26.0.0", + "@ckeditor/ckeditor5-media-embed": "^26.0.0", + "@ckeditor/ckeditor5-paragraph": "^26.0.0", + "@ckeditor/ckeditor5-paste-from-office": "^26.0.0", + "@ckeditor/ckeditor5-table": "^26.0.0", + "@ckeditor/ckeditor5-typing": "^26.0.0" } }, - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + "@ckeditor/ckeditor5-ckfinder": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckfinder/-/ckeditor5-ckfinder-26.0.0.tgz", + "integrity": "sha512-Fv52MpGY5bQ+Du8k41dt9p98bgnIAboJceq4W8+FOpoEUEP9eA1aPacVgqpwOR6N4YNO2G4IpyqqnWRVNWwf1A==", + "requires": { + "ckeditor5": "^26.0.0" + } }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + "@ckeditor/ckeditor5-clipboard": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-26.0.0.tgz", + "integrity": "sha512-gayzt7KOM8vlaSTtUJqKKAjnZBYpsxumLPXZKtHKWYzyL3SFEaKJF3MH6QT4MYPSGJ9KnIpEQcx4OKCQbAy2iQ==", + "requires": { + "@ckeditor/ckeditor5-core": "^26.0.0", + "@ckeditor/ckeditor5-engine": "^26.0.0", + "@ckeditor/ckeditor5-utils": "^26.0.0" + } }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + "@ckeditor/ckeditor5-cloud-services": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-cloud-services/-/ckeditor5-cloud-services-26.0.0.tgz", + "integrity": "sha512-DR9NOUsYdL6NyfjyTCFKqju6h0B50yMQ4WwaLon0LcnuG5jyJYsGFwRn9iMwSdjjQOZvFkl+Q+dEE7t2/dgbWw==", + "requires": { + "ckeditor5": "^26.0.0" + } }, - "@hapi/bourne": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", - "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + "@ckeditor/ckeditor5-core": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-26.0.0.tgz", + "integrity": "sha512-0ldhqp5gD3RoCXzRSEaAf7Lwh50HIC7BF5BeZVJCynIWZlk2RhZWtR1xArVxOoRhABwu9xNTFkLr8Cqlx4LNeg==", + "requires": { + "@ckeditor/ckeditor5-engine": "^26.0.0", + "@ckeditor/ckeditor5-ui": "^26.0.0", + "@ckeditor/ckeditor5-utils": "^26.0.0", + "lodash-es": "^4.17.15" + } }, - "@hapi/hoek": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", - "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==" + "@ckeditor/ckeditor5-easy-image": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-easy-image/-/ckeditor5-easy-image-26.0.0.tgz", + "integrity": "sha512-CSYh4jfe/wuuBbTmClfgxQkohS7i9kBzs/AepZGQg+Ege8YfacF2uTHICO1Mu4ojBdGD3qRlW8EpyFgFA4xetg==", + "requires": { + "ckeditor5": "^26.0.0" + } }, - "@hapi/joi": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", - "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "@ckeditor/ckeditor5-editor-classic": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-26.0.0.tgz", + "integrity": "sha512-qf4LleS21tXJc4oKHWU439t7SYhkR7eJRAjjJNsxhosanTUp4DMb7OlOHNhTzfLuOwtc563NLOWyTf8PTWYtUw==", "requires": { - "@hapi/address": "2.x.x", - "@hapi/bourne": "1.x.x", - "@hapi/hoek": "8.x.x", - "@hapi/topo": "3.x.x" + "ckeditor5": "^26.0.0", + "lodash-es": "^4.17.15" } }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "@ckeditor/ckeditor5-engine": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-26.0.0.tgz", + "integrity": "sha512-6jPj1XjzcpQj5dp6a0agL394t8KTSej/eKx9rcIb0GxEGSOWD8eJ3B5PAvyeepBXsPyQWDw6QxEmwwPE1qUlBg==", "requires": { - "@hapi/hoek": "^8.3.0" + "@ckeditor/ckeditor5-utils": "^26.0.0", + "lodash-es": "^4.17.15" } }, - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "@ckeditor/ckeditor5-enter": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-26.0.0.tgz", + "integrity": "sha512-1ju7Zon7hZmLjMHDIdnahY3Q41rzIaFXMNeZNxm/SMpuTLHOLufxxLhA02jJbgGylM+NW9pyLurLc8wteIsmsg==", "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" + "@ckeditor/ckeditor5-core": "^26.0.0", + "@ckeditor/ckeditor5-engine": "^26.0.0", + "@ckeditor/ckeditor5-utils": "^26.0.0" } }, - "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "@ckeditor/ckeditor5-essentials": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-26.0.0.tgz", + "integrity": "sha512-472HTZmXx4n5Bv+Hq8OKkUkyo4OgF8M8fdgQaIRn9OjfaUv2vCmw74nrD3xGEv5MqAfeciGbkgI0MY+H8dDJwA==", "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - } + "ckeditor5": "^26.0.0" } }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "@ckeditor/ckeditor5-heading": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-26.0.0.tgz", + "integrity": "sha512-gWeYMoxg5k4grqV48rwzHakyPRmt2QyNOPIAo3Nf1QC+vCuCO6EmsYvDLo9KIIt5mvkOCb6ILJiTEHFjtuyJQA==", "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" + "ckeditor5": "^26.0.0" } }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "@ckeditor/ckeditor5-image": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-image/-/ckeditor5-image-26.0.0.tgz", + "integrity": "sha512-l1+xjAMadj/e8g09s8T5UocLJVj/vSBitwHhNScGYfGexw3C1xaxNj18AFAN4804p9dgxxNTHph3b6tfpoULpA==", "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" + "@ckeditor/ckeditor5-ui": "^26.0.0", + "ckeditor5": "^26.0.0" } }, - "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "@ckeditor/ckeditor5-indent": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-26.0.0.tgz", + "integrity": "sha512-l1SjgLqgAru+KHYPsWrJjqyviiIHp25s+saL3KNCjTLatJ6o1vb51jxjHBUeWTvNPtMGceBAlL+RYHBOXymAFg==", "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "ckeditor5": "^26.0.0" } }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "@ckeditor/ckeditor5-link": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-26.0.0.tgz", + "integrity": "sha512-bqJeDwd6cD7m3H8iSQxWZcRdPb/2n1kStxTleme2PTo/IKauBbdC+GcaRgPElRMtRX1jRBFlmjEeDfw8ka8/2Q==", "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "@ckeditor/ckeditor5-ui": "^26.0.0", + "ckeditor5": "^26.0.0", + "lodash-es": "^4.17.15" } }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "@ckeditor/ckeditor5-list": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-list/-/ckeditor5-list-26.0.0.tgz", + "integrity": "sha512-qPBJZPa1hp9krnNuaAeNoRrIdSYsaRFcgmLFTuZp4zVbqH1nj2yfOlf9kjd33Y+1O/HLU4KOA+CZUJqTgl6BTQ==", "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" + "ckeditor5": "^26.0.0" } }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "@ckeditor/ckeditor5-media-embed": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-media-embed/-/ckeditor5-media-embed-26.0.0.tgz", + "integrity": "sha512-ug1qNttu+k98Qpz7Ot/Fb07qeo5d+1QZNNZrS8sUer70P57EjaolRqmC+OQE/evBAZ8D001k71fmVsVBHb8A9g==", "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" + "@ckeditor/ckeditor5-ui": "^26.0.0", + "ckeditor5": "^26.0.0" } }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "@ckeditor/ckeditor5-paragraph": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-26.0.0.tgz", + "integrity": "sha512-HP346zeN5WmFxpWoMkl6ZvjIpa9/muA01NRF0alwLMeTgaauiZRLFC/3tJfcFa9UyYqW8q9/QKB0BPOE3dpvDA==", "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "@ckeditor/ckeditor5-core": "^26.0.0", + "@ckeditor/ckeditor5-ui": "^26.0.0", + "@ckeditor/ckeditor5-utils": "^26.0.0" + } + }, + "@ckeditor/ckeditor5-paste-from-office": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-26.0.0.tgz", + "integrity": "sha512-i9AXf8meBvkvj38BGyoy6imdhsDOliK1D5OjTS3THMVeRNDC+Hj9dHkHZyFk5XIC/ZUJJ2TCXw+7TbNU1yPQJA==", + "requires": { + "ckeditor5": "^26.0.0" + } + }, + "@ckeditor/ckeditor5-react": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-react/-/ckeditor5-react-3.0.2.tgz", + "integrity": "sha512-hOAREzVUp8dwE8vV8qgxIGBOJzaxCm8N2aEhtbCq6QZbGLW9dckdfGKVmbtgEnCQgueVXEUqfDyUIXM6LtXDHA==", + "requires": { + "prop-types": "^15.7.2" + } + }, + "@ckeditor/ckeditor5-select-all": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-26.0.0.tgz", + "integrity": "sha512-EeGVH6rbHSyeqiTJqTdyU46F9celxNHskID1HFYHjVbznj69bFCJ6yIwtDRprp99rKpQKIAEThl1JjS1Y+qiCw==", + "requires": { + "@ckeditor/ckeditor5-core": "^26.0.0", + "@ckeditor/ckeditor5-ui": "^26.0.0", + "@ckeditor/ckeditor5-utils": "^26.0.0" + } + }, + "@ckeditor/ckeditor5-table": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-table/-/ckeditor5-table-26.0.0.tgz", + "integrity": "sha512-Cr3cEgpbSYAD2vRE2O+OSUYe0JVIjy0MZAE5MJ+xCnbUnjxeUZcdiQNWKCYEcc9wRjcsSBRnuvCjrY2ZbVO1KQ==", + "requires": { + "ckeditor5": "^26.0.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-typing": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-26.0.0.tgz", + "integrity": "sha512-UknfqItAFMLgT0aE2yNfB2oFCWVz7sbKaYVferWYBnPhOGMoz8nFjfSQsqqHobNXDq+UwERDYUhe3xEBvQm0Nw==", + "requires": { + "@ckeditor/ckeditor5-core": "^26.0.0", + "@ckeditor/ckeditor5-engine": "^26.0.0", + "@ckeditor/ckeditor5-utils": "^26.0.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-ui": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-26.0.0.tgz", + "integrity": "sha512-68uN2cm+KI/Pzs7Pgz0uNRQO8CR8g98AgIOOPPyabdMAozlL2TsAKjBE6LwJYefWZ4a6I8BD05qFprjEQzCBqg==", + "requires": { + "@ckeditor/ckeditor5-utils": "^26.0.0", + "ckeditor5": "^26.0.0", + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-undo": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-26.0.0.tgz", + "integrity": "sha512-JHRtO2rkYSF8tSE0Nmkl1h9qH2MskHQ6QiKmysO7JI3Mgyz2cQ5IkRDtlUJsl+JtpzE2j63/mPad8puG1BErWQ==", + "requires": { + "@ckeditor/ckeditor5-core": "^26.0.0", + "@ckeditor/ckeditor5-engine": "^26.0.0", + "@ckeditor/ckeditor5-ui": "^26.0.0" + } + }, + "@ckeditor/ckeditor5-upload": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-26.0.0.tgz", + "integrity": "sha512-n8x+hThr6Y8XOdGOfALLBicFMfWVVXzCDd5JpWuQGyDV1W3fIZEfHsQoIlAcDOkOn7d6G6Wuns1QZm3cKawJdg==", + "requires": { + "@ckeditor/ckeditor5-core": "^26.0.0", + "@ckeditor/ckeditor5-ui": "^26.0.0", + "@ckeditor/ckeditor5-utils": "^26.0.0" + } + }, + "@ckeditor/ckeditor5-utils": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-26.0.0.tgz", + "integrity": "sha512-Ht75tCV0ZpL7H2HA7rFYoOOTc+C98p7dMvw83DDSHSDTWJ4D+Z6LqLmuGhSMYlzvrn8mljPCn/1EoZY9KvI9pw==", + "requires": { + "lodash-es": "^4.17.15" + } + }, + "@ckeditor/ckeditor5-widget": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-26.0.0.tgz", + "integrity": "sha512-G3S7ckNpyvsGeltBrTxWKkF5UlTaP4p1AeuySd8umchayK48HZSDsQXXEq67hvrZ/J7skFis7faGGwuve/fq0w==", + "requires": { + "@ckeditor/ckeditor5-core": "^26.0.0", + "@ckeditor/ckeditor5-engine": "^26.0.0", + "@ckeditor/ckeditor5-typing": "^26.0.0", + "@ckeditor/ckeditor5-ui": "^26.0.0", + "@ckeditor/ckeditor5-utils": "^26.0.0", + "lodash-es": "^4.17.15" + } + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + }, + "@ctrl/tinycolor": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz", + "integrity": "sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ==" + }, + "@emotion/cache": { + "version": "10.0.29", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", + "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", + "requires": { + "@emotion/sheet": "0.9.4", + "@emotion/stylis": "0.8.5", + "@emotion/utils": "0.11.3", + "@emotion/weak-memoize": "0.2.5" + } + }, + "@emotion/core": { + "version": "10.0.28", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.28.tgz", + "integrity": "sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA==", + "requires": { + "@babel/runtime": "^7.5.5", + "@emotion/cache": "^10.0.27", + "@emotion/css": "^10.0.27", + "@emotion/serialize": "^0.11.15", + "@emotion/sheet": "0.9.4", + "@emotion/utils": "0.11.3" + } + }, + "@emotion/css": { + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", + "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", + "requires": { + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3", + "babel-plugin-emotion": "^10.0.27" + } + }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "requires": { + "@emotion/memoize": "0.7.4" + } + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "@emotion/serialize": { + "version": "0.11.16", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", + "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "requires": { + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", + "csstype": "^2.5.7" + } + }, + "@emotion/sheet": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", + "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" + }, + "@emotion/styled": { + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.0.27.tgz", + "integrity": "sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==", + "requires": { + "@emotion/styled-base": "^10.0.27", + "babel-plugin-emotion": "^10.0.27" + } + }, + "@emotion/styled-base": { + "version": "10.0.31", + "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.31.tgz", + "integrity": "sha512-wTOE1NcXmqMWlyrtwdkqg87Mu6Rj1MaukEoEmEkHirO5IoHDJ8LgCQL4MjJODgxWxXibGR3opGp1p7YvkNEdXQ==", + "requires": { + "@babel/runtime": "^7.5.5", + "@emotion/is-prop-valid": "0.8.8", + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3" + } + }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + }, + "@fortawesome/fontawesome": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome/-/fontawesome-1.1.8.tgz", + "integrity": "sha512-c0/MtkPVT0fmiFcCyYoPjkG9PkMOvfrZw2+0BaJ+Rh6UEcK1AR/LaRgrHHjUkbAbs9LXxQJhFS8CJ4uSnK2+JA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.1.7" + } + }, + "@fortawesome/fontawesome-common-types": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.1.7.tgz", + "integrity": "sha512-ego8jRVSHfq/iq4KRZJKQeUAdi3ZjGNrqw4oPN3fNdvTBnLCSntwVCnc37bsAJP9UB8MhrTfPnZYxkv2vpS4pg==" + }, + "@fortawesome/fontawesome-free-solid": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free-solid/-/fontawesome-free-solid-5.0.13.tgz", + "integrity": "sha512-b+krVnqkdDt52Yfev0x0ZZgtxBQsLw00Zfa3uaVWIDzpNZVtrEXuxldUSUaN/ihgGhSNi8VpvDAdNPVgCKOSxw==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.1.7" } }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "@fortawesome/react-fontawesome": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.14.tgz", + "integrity": "sha512-4wqNb0gRLVaBm/h+lGe8UfPPivcbuJ6ecI4hIgW0LjI7kzpYB9FkN0L9apbVzg+lsBdcTf0AlBtODjcSX5mmKA==", "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "prop-types": "^15.7.2" } }, "@material-ui/core": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.0.tgz", - "integrity": "sha512-zrrr8mPU5DDBYaVil4uJYauW41PjSn5otn7cqGsmWOY0t90fypr9nNgM7rRJaPz2AP6oRSDx1kBQt2igf5uelg==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.2.tgz", + "integrity": "sha512-/D1+AQQeYX/WhT/FUk78UCRj8ch/RCglsQLYujYTIqPSJlwZHKcvHidNeVhODXeApojeXjkl0tWdk5C9ofwOkQ==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.9.0", - "@material-ui/system": "^4.7.1", - "@material-ui/types": "^5.0.0", - "@material-ui/utils": "^4.7.1", + "@material-ui/styles": "^4.11.2", + "@material-ui/system": "^4.11.2", + "@material-ui/types": "^5.1.0", + "@material-ui/utils": "^4.11.2", "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.2", - "convert-css-length": "^2.0.1", - "hoist-non-react-statics": "^3.2.1", - "normalize-scroll-left": "^0.2.0", - "popper.js": "^1.14.1", + "clsx": "^1.0.4", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "1.16.1-lts", "prop-types": "^15.7.2", - "react-is": "^16.8.0", - "react-transition-group": "^4.3.0" + "react-is": "^16.8.0 || ^17.0.0", + "react-transition-group": "^4.4.0" } }, "@material-ui/icons": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.5.1.tgz", - "integrity": "sha512-YZ/BgJbXX4a0gOuKWb30mBaHaoXRqPanlePam83JQPZ/y4kl+3aW0Wv9tlR70hB5EGAkEJGW5m4ktJwMgxQAeA==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.2.tgz", + "integrity": "sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ==", "requires": { "@babel/runtime": "^7.4.4" } }, "@material-ui/lab": { - "version": "4.0.0-alpha.40", - "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.40.tgz", - "integrity": "sha512-VwXCNFJKfctu9Ot9XP5u2SSzXpm2Fn7F/o08bUfrJDkMCuRc8MCGVnNhT+guZRZa35rR97uWKc3SGQ/LAv8yEg==", + "version": "4.0.0-alpha.57", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.57.tgz", + "integrity": "sha512-qo/IuIQOmEKtzmRD2E4Aa6DB4A87kmY6h0uYhjUmrrgmEAgbbw9etXpWPVXuRK6AGIQCjFzV6WO2i21m1R4FCw==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.7.1", + "@material-ui/utils": "^4.11.2", "clsx": "^1.0.4", "prop-types": "^15.7.2", - "react-is": "^16.8.0" + "react-is": "^16.8.0 || ^17.0.0" } }, "@material-ui/styles": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.9.0.tgz", - "integrity": "sha512-nJHum4RqYBPWsjL/9JET8Z02FZ9gSizlg/7LWVFpIthNzpK6OQ5OSRR4T4x9/p+wK3t1qNn3b1uI4XpnZaPxOA==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.2.tgz", + "integrity": "sha512-xbItf8zkfD3FuGoD9f2vlcyPf9jTEtj9YTJoNNV+NMWaSAHXgrW6geqRoo/IwBuMjqpwqsZhct13e2nUyU9Ljw==", "requires": { "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.7.4", - "@material-ui/types": "^5.0.0", - "@material-ui/utils": "^4.7.1", - "clsx": "^1.0.2", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "^5.1.0", + "@material-ui/utils": "^4.11.2", + "clsx": "^1.0.4", "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.2.1", + "hoist-non-react-statics": "^3.3.2", "jss": "^10.0.3", "jss-plugin-camel-case": "^10.0.3", "jss-plugin-default-unit": "^10.0.3", @@ -2617,28 +1649,29 @@ } }, "@material-ui/system": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.7.1.tgz", - "integrity": "sha512-zH02p+FOimXLSKOW/OT2laYkl9bB3dD1AvnZqsHYoseUaq0aVrpbl2BGjQi+vJ5lg8w73uYlt9zOWzb3+1UdMQ==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.11.2.tgz", + "integrity": "sha512-BELFJEel5E+5DMiZb6XXT3peWRn6UixRvBtKwSxqntmD0+zwbbfCij6jtGwwdJhN1qX/aXrKu10zX31GBaeR7A==", "requires": { "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.7.1", + "@material-ui/utils": "^4.11.2", + "csstype": "^2.5.2", "prop-types": "^15.7.2" } }, "@material-ui/types": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.0.0.tgz", - "integrity": "sha512-UeH2BuKkwDndtMSS0qgx1kCzSMw+ydtj0xx/XbFtxNSTlXydKwzs5gVW5ZKsFlAkwoOOQ9TIsyoCC8hq18tOwg==" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", + "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==" }, "@material-ui/utils": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.7.1.tgz", - "integrity": "sha512-+ux0SlLdlehvzCk2zdQ3KiS3/ylWvuo/JwAGhvb8dFVvwR21K28z0PU9OQW2PGogrMEdvX3miEI5tGxTwwWiwQ==", + "version": "4.11.2", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.2.tgz", + "integrity": "sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA==", "requires": { "@babel/runtime": "^7.4.4", "prop-types": "^15.7.2", - "react-is": "^16.8.0" + "react-is": "^16.8.0 || ^17.0.0" } }, "@mrmlnc/readdir-enhanced": { @@ -2718,6 +1751,51 @@ "@svgr/plugin-jsx": "^4.3.3", "camelcase": "^5.3.1", "cosmiconfig": "^5.2.1" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "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==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, "@svgr/hast-util-to-babel-ast": { @@ -2737,6 +1815,44 @@ "@svgr/babel-preset": "^4.3.3", "@svgr/hast-util-to-babel-ast": "^4.3.2", "svg-parser": "^2.0.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", + "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", + "requires": { + "@babel/code-frame": "^7.10.1", + "@babel/generator": "^7.10.2", + "@babel/helper-module-transforms": "^7.10.1", + "@babel/helpers": "^7.10.1", + "@babel/parser": "^7.10.2", + "@babel/template": "^7.10.1", + "@babel/traverse": "^7.10.1", + "@babel/types": "^7.10.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "@svgr/plugin-svgo": { @@ -2747,116 +1863,149 @@ "cosmiconfig": "^5.2.1", "merge-deep": "^3.0.2", "svgo": "^1.2.2" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "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==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, "@svgr/webpack": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz", - "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.1.0.tgz", + "integrity": "sha512-d09ehQWqLMywP/PT/5JvXwPskPK9QCXUjiSkAHehreB381qExXf5JFCBWhfEyNonRbkIneCeYM99w+Ud48YIQQ==", "requires": { - "@babel/core": "^7.4.5", + "@babel/core": "^7.1.6", "@babel/plugin-transform-react-constant-elements": "^7.0.0", - "@babel/preset-env": "^7.4.5", + "@babel/preset-env": "^7.1.6", "@babel/preset-react": "^7.0.0", - "@svgr/core": "^4.3.3", - "@svgr/plugin-jsx": "^4.3.3", - "@svgr/plugin-svgo": "^4.3.1", - "loader-utils": "^1.2.3" + "@svgr/core": "^4.1.0", + "@svgr/plugin-jsx": "^4.1.0", + "@svgr/plugin-svgo": "^4.0.3", + "loader-utils": "^1.1.0" } }, - "@types/babel__core": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", - "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "@syncfusion/ej2-base": { + "version": "18.3.52", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-base/-/ej2-base-18.3.52.tgz", + "integrity": "sha512-g32+xrxnktzz7PhAPlmVhM/Lu4Ad+VuEYDOIw6+/tTHc4FkfNglZxyNmom+9J4bfDkz9AyVv0JmbPyeBxDvETg==", "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@syncfusion/ej2-icons": "~18.3.47" } }, - "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "@syncfusion/ej2-buttons": { + "version": "18.3.47", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-buttons/-/ej2-buttons-18.3.47.tgz", + "integrity": "sha512-V/uzgfaE4f0bfbxKbztIs4Px6cVEVYKKoSMMTWxGFOAD1Ol2Hp055MJzDjQTzmoaq7TlLjyHXGZDsYoKGuguGw==", "requires": { - "@babel/types": "^7.0.0" + "@syncfusion/ej2-base": "~18.3.47" } }, - "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "@syncfusion/ej2-icons": { + "version": "18.3.47", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-icons/-/ej2-icons-18.3.47.tgz", + "integrity": "sha512-SSasO60RF0wZuPvz7KUMhvqeZgHCBOrCy2IjPywg3YDOgH244E90NasE0jfGm/1HDdkkVhxWATh8bZh79Ivg/g==" + }, + "@syncfusion/ej2-inputs": { + "version": "18.3.52", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-inputs/-/ej2-inputs-18.3.52.tgz", + "integrity": "sha512-+uN/eGlCsoPISsx/j/HA3MO1TQALDiRVVPe/Cr9kmtxirgIFfkFeY5kOZ3vbYho+5fomSU/4JQX1FMXNV3xQ9A==", "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@syncfusion/ej2-base": "~18.3.52", + "@syncfusion/ej2-buttons": "~18.3.47", + "@syncfusion/ej2-popups": "~18.3.52", + "@syncfusion/ej2-splitbuttons": "~18.3.52" } }, - "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", + "@syncfusion/ej2-popups": { + "version": "18.3.52", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-popups/-/ej2-popups-18.3.52.tgz", + "integrity": "sha512-5+dAQaUkMYH59Ka82Rg7d4RvjP5dQm5GtZWGbAkN9TpIh4wfDhLTeBOhN87f7n8RsuDA9bBtCRk1YEdBfTpEGw==", "requires": { - "@babel/types": "^7.3.0" + "@syncfusion/ej2-base": "~18.3.52", + "@syncfusion/ej2-buttons": "~18.3.47" } }, - "@types/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "@syncfusion/ej2-react-base": { + "version": "18.3.52", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-react-base/-/ej2-react-base-18.3.52.tgz", + "integrity": "sha512-dpNnTPjUUxfkdb0BxeUcBs9DPJ/ngf9ipbd5eLwJPE7XFlrOJ1owEoqDqXIeW9pI+eVu9L3hF25TI287T5b9Sw==", "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" + "@syncfusion/ej2-base": "~18.3.52" } }, - "@types/istanbul-lib-coverage": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "@syncfusion/ej2-react-inputs": { + "version": "18.3.52", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-react-inputs/-/ej2-react-inputs-18.3.52.tgz", + "integrity": "sha512-qhMFm4uMUKTashS/mX+jbxwWP3dm49V2t6b7XyZ03wAxDk2wUxchqx2AwhSNBBzTWGYXh1ZvWIujjegXIS9kqQ==", "requires": { - "@types/istanbul-lib-coverage": "*" + "@syncfusion/ej2-base": "~18.3.52", + "@syncfusion/ej2-inputs": "18.3.52", + "@syncfusion/ej2-react-base": "~18.3.52" } }, - "@types/istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "@syncfusion/ej2-splitbuttons": { + "version": "18.3.52", + "resolved": "https://registry.npmjs.org/@syncfusion/ej2-splitbuttons/-/ej2-splitbuttons-18.3.52.tgz", + "integrity": "sha512-KgZ4MGpohJzhX5HoRE+unMkeiU0d9tJbNgEhmhLKK4IsXeVx579gc9ftlTtmofjtOU9UyyHvjmYI6y+gobprww==", "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" + "@syncfusion/ej2-base": "~18.3.52", + "@syncfusion/ej2-popups": "~18.3.52" } }, - "@types/json-schema": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", - "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==" - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + "@types/cookie": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", + "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" }, - "@types/node": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.5.0.tgz", - "integrity": "sha512-Onhn+z72D2O2Pb2ql2xukJ55rglumsVo1H6Fmyi8mlU9SvKdBk/pUSUAiBY/d9bAOF7VVWajX3sths/+g6ZiAQ==" + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } }, "@types/parse-json": { "version": "4.0.0", @@ -2864,253 +2013,196 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prop-types": { - "version": "15.7.1", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz", - "integrity": "sha512-CFzn9idOEpHrgdw8JsoTkaDDyRWk1jrzIV8djzcgpq0y9tG4B4lFT+Nxh52DVpDXV+n4+NPNv7M1Dj5uMp6XFg==" + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" }, "@types/react": { - "version": "16.8.23", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.23.tgz", - "integrity": "sha512-abkEOIeljniUN9qB5onp++g0EY38h7atnDHxwKUFz1r3VH1+yG1OKi2sNPTyObL40goBmfKFpdii2lEzwLX1cA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.0.tgz", + "integrity": "sha512-aj/L7RIMsRlWML3YB6KZiXB3fV2t41+5RBGYF8z+tAKU43Px8C3cYUZsDvf1/+Bm4FK21QWBrDutu8ZJ/70qOw==", "requires": { "@types/prop-types": "*", - "csstype": "^2.2.0" + "csstype": "^3.0.2" + }, + "dependencies": { + "csstype": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", + "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==" + } } }, "@types/react-transition-group": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.3.tgz", - "integrity": "sha512-Hk8jiuT7iLOHrcjKP/ZVSyCNXK73wJAUz60xm0mVhiRujrdiI++j4duLiL282VGxwAgxetHQFfqA29LgEeSkFA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.0.tgz", + "integrity": "sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==", "requires": { "@types/react": "*" } }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" - }, - "@types/yargs": { - "version": "13.0.7", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.7.tgz", - "integrity": "sha512-Sg9kNeJz+V+W+0fugcVhHC+mNHnydDR1RJrW5Qn2jVrDQARF8wfPVqIqwEzZp+bneuEBIm2ClsJ1/je42ZBzSg==", - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.18.0.tgz", - "integrity": "sha512-kuO8WQjV+RCZvAXVRJfXWiJ8iYEtfHlKgcqqqXg9uUkIolEHuUaMmm8/lcO4xwCOtaw6mY0gStn2Lg4/eUXXYQ==", - "requires": { - "@typescript-eslint/experimental-utils": "2.18.0", - "eslint-utils": "^1.4.3", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.18.0.tgz", - "integrity": "sha512-J6MopKPHuJYmQUkANLip7g9I82ZLe1naCbxZZW3O2sIxTiq/9YYoOELEKY7oPg0hJ0V/AQ225h2z0Yp+RRMXhw==", - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "2.18.0", - "eslint-scope": "^5.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.18.0.tgz", - "integrity": "sha512-SJJPxFMEYEWkM6pGfcnjLU+NJIPo+Ko1QrCBL+i0+zV30ggLD90huEmMMhKLHBpESWy9lVEeWlQibweNQzyc+A==", - "requires": { - "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "2.18.0", - "@typescript-eslint/typescript-estree": "2.18.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "@typescript-eslint/typescript-estree": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.18.0.tgz", - "integrity": "sha512-gVHylf7FDb8VSi2ypFuEL3hOtoC4HkZZ5dOjXvVjoyKdRrvXAOPSzpNRnKMfaUUEiSLP8UF9j9X9EDLxC0lfZg==", - "requires": { - "debug": "^4.1.1", - "eslint-visitor-keys": "^1.1.0", - "glob": "^7.1.6", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^6.3.0", - "tsutils": "^3.17.1" - } + "@types/tapable": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.2.tgz", + "integrity": "sha512-42zEJkBpNfMEAvWR5WlwtTH22oDzcMjFsL9gDGExwF8X8WvAiw7Vwop7hPw03QT8TKfec83LwbHj6SvpqM4ELQ==" }, "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==" }, "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==" }, "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==" }, "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", "requires": { - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==" }, "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==" }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" } }, "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", "requires": { - "@xtuc/long": "4.2.2" + "@xtuc/long": "4.2.1" } }, "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==" }, "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" } }, "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" } }, "@xtuc/ieee754": { @@ -3119,9 +2211,9 @@ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==" }, "abab": { "version": "2.0.3", @@ -3138,73 +2230,62 @@ } }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "acorn": "^5.0.0" }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" } } }, - "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" - }, - "acorn-walk": { + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" + }, + "acorn-walk": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" }, "address": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", - "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" - }, - "adjust-sourcemap-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", - "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", - "requires": { - "assert": "1.4.1", - "camelcase": "5.0.0", - "loader-utils": "1.2.3", - "object-path": "0.11.4", - "regex-parser": "2.2.10" - }, - "dependencies": { - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" - } - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", + "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" }, - "aggregate-error": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", - "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "ajax-request": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/ajax-request/-/ajax-request-1.2.3.tgz", + "integrity": "sha1-mfy+wdbSeS+F+pSVNTMr0U9fN5A=", "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "file-system": "^2.1.1", + "utils-extend": "^1.0.7" } }, "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3233,12 +2314,9 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "requires": { - "type-fest": "^0.8.1" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, "ansi-html": { "version": "0.0.7", @@ -3246,9 +2324,9 @@ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "3.2.1", @@ -3258,6 +2336,65 @@ "color-convert": "^1.9.0" } }, + "antd": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/antd/-/antd-4.13.1.tgz", + "integrity": "sha512-KaveTRGKOFrbas3FO0ktXaZrSMDpDWz3FpuLbafV7R973BNz2yo+IG8ia2KPEfpRtGYUvpnKlDUNQZWhotoYhQ==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons": "^4.5.0", + "@ant-design/react-slick": "~0.28.1", + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.2.6", + "copy-to-clipboard": "^3.2.0", + "lodash": "^4.17.20", + "moment": "^2.25.3", + "rc-cascader": "~1.4.0", + "rc-checkbox": "~2.3.0", + "rc-collapse": "~3.1.0", + "rc-dialog": "~8.5.1", + "rc-drawer": "~4.3.0", + "rc-dropdown": "~3.2.0", + "rc-field-form": "~1.19.0", + "rc-image": "~5.2.3", + "rc-input-number": "~7.0.0-alpha.4", + "rc-mentions": "~1.5.0", + "rc-menu": "~8.10.0", + "rc-motion": "^2.4.0", + "rc-notification": "~4.5.2", + "rc-pagination": "~3.1.2", + "rc-picker": "~2.5.1", + "rc-progress": "~3.1.0", + "rc-rate": "~2.9.0", + "rc-resize-observer": "^1.0.0", + "rc-select": "~12.1.0", + "rc-slider": "~9.7.1", + "rc-steps": "~4.1.0", + "rc-switch": "~3.2.0", + "rc-table": "~7.13.0", + "rc-tabs": "~11.7.0", + "rc-textarea": "~0.3.0", + "rc-tooltip": "~5.1.0", + "rc-tree": "~4.1.0", + "rc-tree-select": "~4.3.0", + "rc-trigger": "^5.2.1", + "rc-upload": "~4.0.0-alpha.6", + "rc-util": "^5.8.1", + "scroll-into-view-if-needed": "^2.2.25", + "warning": "^4.0.3" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -3265,6 +2402,267 @@ "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "requires": { + "default-require-extensions": "^1.0.0" } }, "aproba": { @@ -3289,15 +2687,13 @@ "commander": "^2.11.0" } }, - "arity-n": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", - "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" - }, "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } }, "arr-flatten": { "version": "1.1.0", @@ -3314,6 +2710,11 @@ "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -3329,6 +2730,21 @@ "is-string": "^1.0.5" } }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -3343,9 +2759,76 @@ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } + } }, "arrify": { "version": "1.0.1", @@ -3373,14 +2856,37 @@ "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "requires": { + "object-assign": "^4.1.1", "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } } }, "assert-plus": { @@ -3404,11 +2910,11 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.14" } }, "async-each": { @@ -3421,6 +2927,11 @@ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, + "async-validator": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.5.1.tgz", + "integrity": "sha512-DDmKA7sdSAJtTVeNZHrnr2yojfFaoeW8MfQN8CeuXg8DDQHTqKk9Fdv38dSvnesHoO8MUwMI2HphOeSyIF+wmQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3432,33 +2943,46 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", - "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", + "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", "requires": { - "browserslist": "^4.8.3", - "caniuse-lite": "^1.0.30001020", + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001061", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.26", - "postcss-value-parser": "^4.0.2" + "postcss": "^7.0.30", + "postcss-value-parser": "^4.1.0" }, "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -3468,49 +2992,29 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" }, "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", "requires": { - "follow-redirects": "1.5.10" + "follow-redirects": "^1.10.0" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" } } }, "axobject-query": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.1.tgz", - "integrity": "sha512-lF98xa/yvy6j3fBHAgQXIYl+J4eZadOSqsPojemUqClzNbBV38wWGpUbQbVEyf4eUF5yF7eHmGgGA2JiHyjeqw==", - "requires": { - "@babel/runtime": "^7.7.4", - "@babel/runtime-corejs3": "^7.7.4" - } + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz", + "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==" }, "babel-code-frame": { "version": "6.26.0", @@ -3522,11 +3026,6 @@ "js-tokens": "^3.0.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -3549,14 +3048,6 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -3564,17 +3055,22 @@ } } }, + "babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==" + }, "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-9.0.0.tgz", + "integrity": "sha512-itv1MwE3TMbY0QtNfeL7wzak1mV47Uy+n6HtSOO4Xd7rvmO+tsGQSgyOEEgo6Y2vHZKZphaoelNeSVj4vkLA1g==", "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.0.0", "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" } }, "babel-extract-comments": { @@ -3585,135 +3081,120 @@ "babylon": "^6.18.0" } }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", - "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" }, "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" } } }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", + "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", + "requires": { + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" + } + }, "babel-loader": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", - "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", + "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", "requires": { "find-cache-dir": "^2.0.0", "loader-utils": "^1.0.2", "mkdirp": "^0.5.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } + "util.promisify": "^1.0.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" } }, "babel-plugin-dynamic-import-node": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", - "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { "object.assign": "^4.1.0" } }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "babel-plugin-emotion": { + "version": "10.0.33", + "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz", + "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" + "@babel/helper-module-imports": "^7.0.0", + "@emotion/hash": "0.8.0", + "@emotion/memoize": "0.7.4", + "@emotion/serialize": "^0.11.16", + "babel-plugin-macros": "^2.0.0", + "babel-plugin-syntax-jsx": "^6.18.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "find-root": "^1.1.0", + "source-map": "^0.5.7" } }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "requires": { - "@types/babel__traverse": "^7.0.6" + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" } }, + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=" + }, "babel-plugin-macros": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.7.1.tgz", - "integrity": "sha512-HNM284amlKSQ6FddI4jLXD+XTqF0cTYOe5uemOIZxHJHnamC+OhFQ57rMF9sgnYhkJQptVl9U1SKVZsV9/GLQQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { "@babel/runtime": "^7.7.2", "cosmiconfig": "^6.0.0", "resolve": "^1.12.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "parse-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", - "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1", - "lines-and-columns": "^1.1.6" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } } }, "babel-plugin-named-asset-import": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.5.tgz", - "integrity": "sha512-sGhfINU+AuMw9oFAdIn/nD5sem3pn/WgxAfDZ//Q3CnF+5uaho7C7shh2rKLk6sKE/XkfmyibghocwKdVjLIKg==" + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", + "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==" }, "babel-plugin-styled-components": { "version": "1.10.7", @@ -3751,191 +3232,300 @@ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" + "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" } }, "babel-preset-react-app": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.0.tgz", - "integrity": "sha512-0qMOv/pCcCQWxX1eNyKD9GlzZTdzZIK/Pq3O6TGe65tZSJTSplw1pFlaPujm0GjBj4g3GeCQbP08vvzlH7OGHg==", - "requires": { - "@babel/core": "7.7.4", - "@babel/plugin-proposal-class-properties": "7.7.4", - "@babel/plugin-proposal-decorators": "7.7.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.7.4", - "@babel/plugin-proposal-numeric-separator": "7.7.4", - "@babel/plugin-proposal-object-rest-spread": "7.7.4", - "@babel/plugin-proposal-optional-chaining": "7.7.4", - "@babel/plugin-syntax-dynamic-import": "7.7.4", - "@babel/plugin-transform-destructuring": "7.7.4", - "@babel/plugin-transform-flow-strip-types": "7.7.4", - "@babel/plugin-transform-react-display-name": "7.7.4", - "@babel/plugin-transform-runtime": "7.7.4", - "@babel/preset-env": "7.7.4", - "@babel/preset-react": "7.7.4", - "@babel/preset-typescript": "7.7.4", - "@babel/runtime": "7.7.4", - "babel-plugin-dynamic-import-node": "2.3.0", - "babel-plugin-macros": "2.7.1", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-7.0.2.tgz", + "integrity": "sha512-mwCk/u2wuiO8qQqblN5PlDa44taY0acq7hw6W+a70W522P7a9mIcdggL1fe5/LgAT7tqCq46q9wwhqaMoYKslQ==", + "requires": { + "@babel/core": "7.2.2", + "@babel/plugin-proposal-class-properties": "7.3.0", + "@babel/plugin-proposal-decorators": "7.3.0", + "@babel/plugin-proposal-object-rest-spread": "7.3.2", + "@babel/plugin-syntax-dynamic-import": "7.2.0", + "@babel/plugin-transform-classes": "7.2.2", + "@babel/plugin-transform-destructuring": "7.3.2", + "@babel/plugin-transform-flow-strip-types": "7.2.3", + "@babel/plugin-transform-react-constant-elements": "7.2.0", + "@babel/plugin-transform-react-display-name": "7.2.0", + "@babel/plugin-transform-runtime": "7.2.0", + "@babel/preset-env": "7.3.1", + "@babel/preset-react": "7.0.0", + "@babel/preset-typescript": "7.1.0", + "@babel/runtime": "7.3.1", + "babel-loader": "8.0.5", + "babel-plugin-dynamic-import-node": "2.2.0", + "babel-plugin-macros": "2.5.0", "babel-plugin-transform-react-remove-prop-types": "0.4.24" }, "dependencies": { - "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "@babel/plugin-proposal-class-properties": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz", + "integrity": "sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg==", "requires": { - "@babel/types": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz", - "integrity": "sha512-TbYHmr1Gl1UC7Vo2HVuj/Naci5BEGNZ0AJhzqD2Vpr6QPFWpUmBRLrIDjedzx7/CShq0bRDS2gI4FIs77VHLVQ==", + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz", + "integrity": "sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.7.4" + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" } }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz", - "integrity": "sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==", + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4" + "@babel/helper-plugin-utils": "^7.0.0" } }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.4.tgz", - "integrity": "sha512-JmgaS+ygAWDR/STPe3/7y0lNlHgS+19qZ9aC06nYLwQ/XB7c0q5Xs+ksFU3EDnp9EiEsO0dnRAOKeyLHTZuW3A==", + "@babel/plugin-transform-classes": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz", + "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==", "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.1.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.7.4" + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "globals": "^11.1.0" } }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz", - "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==", + "@babel/plugin-transform-destructuring": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz", + "integrity": "sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", - "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", + "@babel/plugin-transform-react-constant-elements": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.2.0.tgz", + "integrity": "sha512-YYQFg6giRFMsZPKUM9v+VcHOdfSQdz9jHCx3akAi3UYgyjndmdYGSXylQ/V+HswQt4fL8IklchD9HTsaOCrWQQ==", "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.7.4.tgz", - "integrity": "sha512-sBbIvqYkthai0X0vkD2xsAwluBp+LtNHH+/V4a5ydifmTtb8KOVOlrMIk/MYmIc4uTYDnjZUHQildYNo36SRJw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", + "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/preset-env": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.4.tgz", - "integrity": "sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.1.tgz", + "integrity": "sha512-FHKrD6Dxf30e8xgHQO0zJZpUPfVZg+Xwgz5/RdSWCbza9QLNk4Qbp40ctRoqDxml3O8RMzB1DU55SXeDG6PqHQ==", "requires": { - "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.7.4", - "@babel/plugin-proposal-dynamic-import": "^7.7.4", - "@babel/plugin-proposal-json-strings": "^7.7.4", - "@babel/plugin-proposal-object-rest-spread": "^7.7.4", - "@babel/plugin-proposal-optional-catch-binding": "^7.7.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.7.4", - "@babel/plugin-syntax-async-generators": "^7.7.4", - "@babel/plugin-syntax-dynamic-import": "^7.7.4", - "@babel/plugin-syntax-json-strings": "^7.7.4", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4", - "@babel/plugin-syntax-optional-catch-binding": "^7.7.4", - "@babel/plugin-syntax-top-level-await": "^7.7.4", - "@babel/plugin-transform-arrow-functions": "^7.7.4", - "@babel/plugin-transform-async-to-generator": "^7.7.4", - "@babel/plugin-transform-block-scoped-functions": "^7.7.4", - "@babel/plugin-transform-block-scoping": "^7.7.4", - "@babel/plugin-transform-classes": "^7.7.4", - "@babel/plugin-transform-computed-properties": "^7.7.4", - "@babel/plugin-transform-destructuring": "^7.7.4", - "@babel/plugin-transform-dotall-regex": "^7.7.4", - "@babel/plugin-transform-duplicate-keys": "^7.7.4", - "@babel/plugin-transform-exponentiation-operator": "^7.7.4", - "@babel/plugin-transform-for-of": "^7.7.4", - "@babel/plugin-transform-function-name": "^7.7.4", - "@babel/plugin-transform-literals": "^7.7.4", - "@babel/plugin-transform-member-expression-literals": "^7.7.4", - "@babel/plugin-transform-modules-amd": "^7.7.4", - "@babel/plugin-transform-modules-commonjs": "^7.7.4", - "@babel/plugin-transform-modules-systemjs": "^7.7.4", - "@babel/plugin-transform-modules-umd": "^7.7.4", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4", - "@babel/plugin-transform-new-target": "^7.7.4", - "@babel/plugin-transform-object-super": "^7.7.4", - "@babel/plugin-transform-parameters": "^7.7.4", - "@babel/plugin-transform-property-literals": "^7.7.4", - "@babel/plugin-transform-regenerator": "^7.7.4", - "@babel/plugin-transform-reserved-words": "^7.7.4", - "@babel/plugin-transform-shorthand-properties": "^7.7.4", - "@babel/plugin-transform-spread": "^7.7.4", - "@babel/plugin-transform-sticky-regex": "^7.7.4", - "@babel/plugin-transform-template-literals": "^7.7.4", - "@babel/plugin-transform-typeof-symbol": "^7.7.4", - "@babel/plugin-transform-unicode-regex": "^7.7.4", - "@babel/types": "^7.7.4", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.3.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.2.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.2.0", + "@babel/plugin-transform-classes": "^7.2.0", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.2.0", + "@babel/plugin-transform-dotall-regex": "^7.2.0", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.2.0", + "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "@babel/plugin-transform-modules-systemjs": "^7.2.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.2.0", + "browserslist": "^4.3.4", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", - "semver": "^5.5.0" + "semver": "^5.3.0" } }, "@babel/preset-react": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.7.4.tgz", - "integrity": "sha512-j+vZtg0/8pQr1H8wKoaJyGL2IEk3rG/GIvua7Sec7meXVIvGycihlGMx5xcU00kqCJbwzHs18xTu3YfREOqQ+g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", + "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.7.4", - "@babel/plugin-transform-react-jsx": "^7.7.4", - "@babel/plugin-transform-react-jsx-self": "^7.7.4", - "@babel/plugin-transform-react-jsx-source": "^7.7.4" + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0" } }, "@babel/runtime": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.4.tgz", - "integrity": "sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz", + "integrity": "sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==", "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.12.0" } }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "babel-plugin-dynamic-import-node": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", + "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" + "object.assign": "^4.1.0" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "babel-plugin-macros": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.5.0.tgz", + "integrity": "sha512-BWw0lD0kVZAXRD3Od1kMrdmfudqzDzYv2qrN3l2ISR1HVp1EgLKfbOrYV9xmY5k3qx3RIu5uPAUZZZHpo0o5Iw==", + "requires": { + "cosmiconfig": "^5.0.5", + "resolve": "^1.8.1" + } + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "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==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "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" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" } } }, @@ -3960,6 +3550,67 @@ } } }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "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" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + } + } + }, "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", @@ -4025,6 +3676,15 @@ } } }, + "base64-img": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/base64-img/-/base64-img-1.0.4.tgz", + "integrity": "sha1-PiLVXWx0okVT2EDSsbwSp9sHjTU=", + "requires": { + "ajax-request": "^1.2.0", + "file-system": "^2.1.0" + } + }, "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", @@ -4043,24 +3703,26 @@ "tweetnacl": "^0.14.3" } }, + "bfj": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", + "requires": { + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "hoopy": "^0.1.2", + "tryer": "^1.0.0" + } + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" }, "bluebird": { "version": "3.7.2", @@ -4068,9 +3730,9 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" }, "body-parser": { "version": "1.19.0", @@ -4102,11 +3764,6 @@ "ms": "2.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -4142,30 +3799,13 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "brorand": { @@ -4174,9 +3814,9 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browser-resolve": { "version": "1.11.3", @@ -4234,20 +3874,29 @@ "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" } }, "browserify-zlib": { @@ -4259,13 +3908,14 @@ } }, "browserslist": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.5.tgz", - "integrity": "sha512-4LMHuicxkabIB+n9874jZX/az1IaZ5a+EUuvD7KFOu9x/Bd5YHyO0DIz2ls/Kl8g0ItS4X/ilEgf4T1Br0lgSg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", "requires": { - "caniuse-lite": "^1.0.30001022", - "electron-to-chromium": "^1.3.338", - "node-releases": "^1.1.46" + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" } }, "bser": { @@ -4284,13 +3934,6 @@ "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } } }, "buffer-from": { @@ -4323,13 +3966,6 @@ "walker": "1.x", "winston": "*", "wrench": "1.3.x" - }, - "dependencies": { - "uglify-js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.5.tgz", - "integrity": "sha1-S1v/+Rhu/7qoiOTJ6UvZ/EyUkp0=" - } } }, "builtin-status-codes": { @@ -4343,37 +3979,30 @@ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", - "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", "requires": { - "chownr": "^1.1.2", + "bluebird": "^3.5.5", + "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", - "fs-minipass": "^2.0.0", "glob": "^7.1.4", - "graceful-fs": "^4.2.2", - "infer-owner": "^1.0.4", + "graceful-fs": "^4.1.15", "lru-cache": "^5.1.1", - "minipass": "^3.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", + "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", - "p-map": "^3.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.7.1", - "ssri": "^7.0.0", - "unique-filename": "^1.1.1" + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" }, "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" } } }, @@ -4393,6 +4022,16 @@ "unset-value": "^1.0.0" } }, + "call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -4404,8 +4043,15 @@ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "requires": { "callsites": "^2.0.0" - } - }, + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, "caller-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", @@ -4415,9 +4061,9 @@ } }, "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { "version": "3.0.0", @@ -4450,16 +4096,16 @@ } }, "caniuse-lite": { - "version": "1.0.30001023", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz", - "integrity": "sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA==" + "version": "1.0.30001179", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001179.tgz", + "integrity": "sha512-blMmO0QQujuUWZKyVrD1msR4WNDAqb/UPO1Sw2WWsQ7deoM5bJiicKnWJ1Y0NS/aGINSnKPIWBMw5luX+NDUCA==" }, "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", "requires": { - "rsvp": "^4.8.4" + "rsvp": "^3.3.3" } }, "case-sensitive-paths-webpack-plugin": { @@ -4473,9 +4119,9 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4487,6 +4133,11 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "check-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==" + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -4506,561 +4157,54 @@ "upath": "^1.1.1" }, "dependencies": { + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "optional": true, "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "optional": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "optional": 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" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "optional": 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==", - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "optional": true - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "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=", - "optional": true - }, - "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 - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "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 - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "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" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "optional": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "optional": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "optional": true - } + "nan": "^2.12.1" } }, "glob-parent": { @@ -5082,6 +4226,27 @@ } } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -5090,9 +4255,9 @@ } }, "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "chrome-trace-event": { "version": "1.0.2", @@ -5103,9 +4268,9 @@ } }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" }, "cipher-base": { "version": "1.0.4", @@ -5116,6 +4281,30 @@ "safe-buffer": "^5.0.1" } }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" + }, + "ckeditor5": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-26.0.0.tgz", + "integrity": "sha512-+IXvCdc+19ykAt7t6idyq+61lkVtfFP/6d0lMid07/BKasnd7P4bk1+F1i2Ld/OlzsvUPXvwPMGovngIY6K0LA==", + "requires": { + "@ckeditor/ckeditor5-clipboard": "^26.0.0", + "@ckeditor/ckeditor5-core": "^26.0.0", + "@ckeditor/ckeditor5-engine": "^26.0.0", + "@ckeditor/ckeditor5-enter": "^26.0.0", + "@ckeditor/ckeditor5-paragraph": "^26.0.0", + "@ckeditor/ckeditor5-select-all": "^26.0.0", + "@ckeditor/ckeditor5-typing": "^26.0.0", + "@ckeditor/ckeditor5-ui": "^26.0.0", + "@ckeditor/ckeditor5-undo": "^26.0.0", + "@ckeditor/ckeditor5-upload": "^26.0.0", + "@ckeditor/ckeditor5-utils": "^26.0.0", + "@ckeditor/ckeditor5-widget": "^26.0.0" + } + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -5143,9 +4332,9 @@ "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, "clean-css": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.2.tgz", - "integrity": "sha512-yKycArwReQXbOD/3pmsPmt6p7oUBww8MisDabL2pCUWkbVONvCJoBdCjgY4ZVQmKX5juz/JB9oDcP6XzGUpjwQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "requires": { "source-map": "~0.6.0" }, @@ -5157,52 +4346,40 @@ } } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "requires": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ansi-regex": "^3.0.0" } } } @@ -5220,9 +4397,9 @@ } }, "clsx": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz", - "integrity": "sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" }, "co": { "version": "4.6.0", @@ -5254,9 +4431,9 @@ } }, "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.2" @@ -5301,17 +4478,6 @@ "requires": { "color": "3.0.x", "text-hex": "1.0.x" - }, - "dependencies": { - "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - } } }, "combined-stream": { @@ -5342,14 +4508,6 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, - "compose-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", - "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", - "requires": { - "arity-n": "^1.0.4" - } - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -5380,13 +4538,18 @@ "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==" } } }, + "compute-scroll-into-view": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", + "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -5401,6 +4564,35 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "confusing-browser-globals": { @@ -5434,6 +4626,13 @@ "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": { @@ -5441,23 +4640,25 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, - "convert-css-length": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/convert-css-length/-/convert-css-length-2.0.1.tgz", - "integrity": "sha512-iGpbcvhLPRKUbBc0Quxx7w/bV14AC3ItuBEGMahA5WTYqB8lq9jH0kTXFheCBASsYnqeMFZhiTruNxr1N59Axg==" - }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { "safe-buffer": "~5.1.1" + }, + "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==" + } } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "cookie-signature": { "version": "1.0.6", @@ -5482,17 +4683,25 @@ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, + "copy-to-clipboard": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz", + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==", + "requires": { + "toggle-selection": "^1.0.6" + } + }, "core-js": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", - "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==" + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.0.tgz", + "integrity": "sha512-W2VYNB0nwQQE7tKS7HzXd7r2y/y2SVJl4ga6oH/dnaLFzM0o2lB2P3zCkWj5Wc/zyMYjtgd5Hmhk0ObkQFZOIA==" }, "core-js-compat": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", - "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", "requires": { - "browserslist": "^4.8.3", + "browserslist": "^4.8.5", "semver": "7.0.0" }, "dependencies": { @@ -5503,25 +4712,21 @@ } } }, - "core-js-pure": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz", - "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==" - }, "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=" }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" } }, "create-ecdh": { @@ -5531,6 +4736,13 @@ "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "create-hash": { @@ -5568,13 +4780,6 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } } }, "crypto-browserify": { @@ -5595,32 +4800,39 @@ "randomfill": "^1.0.3" } }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "postcss": "^7.0.5" }, "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } } } }, - "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", - "requires": { - "postcss": "^7.0.5" - } - }, "css-color-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", @@ -5638,6 +4850,31 @@ "requires": { "postcss": "^7.0.1", "timsort": "^0.3.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "css-has-pseudo": { @@ -5654,6 +4891,16 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", @@ -5663,38 +4910,39 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } } } }, "css-loader": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.2.0.tgz", - "integrity": "sha512-QTF3Ud5H7DaZotgdcJjGMvyDj5F3Pn1j/sC6VBEOVp94cbwqyIBdcs/quzj4MC1BKQSrTpQznegH/5giYbhnCQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz", + "integrity": "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==", "requires": { - "camelcase": "^5.3.1", - "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.17", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.2", - "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^3.0.0", - "postcss-value-parser": "^4.0.0", - "schema-utils": "^2.0.0" - }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" - } + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" } }, "css-prefers-color-scheme": { @@ -5703,6 +4951,31 @@ "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", "requires": { "postcss": "^7.0.5" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "css-select": { @@ -5721,6 +4994,16 @@ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" }, + "css-selector-tokenizer": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz", + "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==", + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2", + "regexpu-core": "^4.6.0" + } + }, "css-to-react-native": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz", @@ -5747,24 +5030,19 @@ } } }, - "css-unit-converter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", - "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" - }, "css-vendor": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.7.tgz", - "integrity": "sha512-VS9Rjt79+p7M0WkPqcAza4Yq1ZHrsHrwf7hPL/bjQB+c1lwmAI+1FXxYTYt818D/50fFVflw0XKleiBN5RITkg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", "requires": { - "@babel/runtime": "^7.6.2", + "@babel/runtime": "^7.8.3", "is-in-browser": "^1.0.2" } }, "css-what": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", - "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==" }, "cssdb": { "version": "4.4.0", @@ -5790,6 +5068,74 @@ "cssnano-preset-default": "^4.0.7", "is-resolvable": "^1.0.0", "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "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==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "cssnano-preset-default": { @@ -5827,24 +5173,74 @@ "postcss-reduce-transforms": "^4.0.2", "postcss-svgo": "^4.0.2", "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" - }, + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, "cssnano-util-raw-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "cssnano-util-same-parent": { @@ -5853,11 +5249,32 @@ "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" }, "csso": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", - "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", "requires": { - "css-tree": "1.0.0-alpha.37" + "css-tree": "1.0.0-alpha.39" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } } }, "cssom": { @@ -5874,24 +5291,15 @@ } }, "csstype": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.6.tgz", - "integrity": "sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==" + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.10.tgz", + "integrity": "sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==" }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "damerau-levenshtein": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", @@ -5927,12 +5335,17 @@ } } }, + "date-fns": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.19.0.tgz", + "integrity": "sha512-X3bf2iTPgCAQp9wvjOQytnf5vO5rESYRXlPIVcgSbtT5OTScPcsf9eZU+B/YIkKAtYr5WeCii58BgATrNitlWg==" + }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { - "ms": "^2.1.1" + "ms": "2.0.0" } }, "decamelize": { @@ -5964,12 +5377,41 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" }, "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", + "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", "requires": { - "execa": "^1.0.0", + "execa": "^0.10.0", "ip-regex": "^2.1.0" + }, + "dependencies": { + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + } + } + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "requires": { + "strip-bom": "^2.0.0" } }, "define-properties": { @@ -6023,17 +5465,16 @@ } }, "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "requires": { - "@types/glob": "^7.1.1", "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" }, "dependencies": { "globby": { @@ -6055,15 +5496,10 @@ } } }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - }, "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, @@ -6091,6 +5527,14 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "^2.0.0" + } + }, "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", @@ -6117,11 +5561,6 @@ "requires": { "ms": "2.0.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -6135,10 +5574,10 @@ "kuler": "1.0.x" } }, - "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "diffie-hellman": { "version": "5.0.3", @@ -6148,6 +5587,13 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "dir-glob": { @@ -6157,6 +5603,21 @@ "requires": { "arrify": "^1.0.1", "path-type": "^3.0.0" + }, + "dependencies": { + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } } }, "dns-equal": { @@ -6189,6 +5650,11 @@ "esutils": "^2.0.2" } }, + "dom-align": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz", + "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA==" + }, "dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -6198,18 +5664,18 @@ } }, "dom-helpers": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.3.tgz", - "integrity": "sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.0.tgz", + "integrity": "sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==", "requires": { - "@babel/runtime": "^7.6.3", - "csstype": "^2.6.7" + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" }, "dependencies": { "csstype": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz", - "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", + "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==" } } }, @@ -6265,22 +5731,22 @@ } }, "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", "requires": { - "is-obj": "^1.0.0" + "is-obj": "^2.0.0" } }, "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.0.0.tgz", + "integrity": "sha512-FlWbnhgjtwD+uNLUGHbMykMOYQaTivdHEmYwAKFjn6GKe/CqY0fNae93ZHTd20snh9ZLr8mTzIL9m0APQ1pjQg==" }, "dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", + "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=" }, "duplexer": { "version": "0.1.1", @@ -6296,6 +5762,35 @@ "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "ecc-jsbn": { @@ -6313,33 +5808,40 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.340", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.340.tgz", - "integrity": "sha512-hRFBAglhcj5iVYH+o8QU0+XId1WGoc0VGowJB1cuJAt3exHGrivZvWeAO5BRgBZqwZtwxjm8a5MQeGoT/Su3ww==" + "version": "1.3.473", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.473.tgz", + "integrity": "sha512-smevlzzMNz3vMz6OLeeCq5HRWEj2AcgccNPYnAx4Usx0IOciq9DU36RJcICcS09hXoY7t7deRfVYKD14IrGb9A==" }, "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } } }, "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "enabled": { "version": "1.0.2", @@ -6363,9 +5865,9 @@ } }, "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.2.0.tgz", + "integrity": "sha512-S7eiFb/erugyd1rLb6mQ3Vuq+EXHv5cpCkNqqIkYkBgN2QdFnyCZzFBleqwGEx4lgNGYij81BWnCrFNK7vxvjQ==", "requires": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", @@ -6380,18 +5882,45 @@ "errno": "^0.1.3", "readable-stream": "^2.0.1" } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } } } }, "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==" }, "env-variable": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.5.tgz", - "integrity": "sha512-zoB603vQReOFvTg5xMl9I1P2PnHsHQQKTEowsKKD7nseUfJq6UWzK+4YtlWUO1nhiQUxe6XMkk+JleSZD1NZFA==" + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", + "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" }, "errno": { "version": "0.1.7", @@ -6407,31 +5936,31 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { "is-arrayish": "^0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + } } }, "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "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.1.5", - "is-regex": "^1.0.5", + "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.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - }, - "dependencies": { - "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==" - } + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, "es-to-primitive": { @@ -6444,35 +5973,6 @@ "is-symbol": "^1.0.2" } }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -6484,9 +5984,9 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.13.0.tgz", - "integrity": "sha512-eYk2dCkxR07DsHA/X2hRBj0CFAZeri/LyDMc0C8JT1Hqi6JnVpMhJ7XFITbb0+yZS3lVkaPL2oCkZ3AVmeVbMw==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.2.tgz", + "integrity": "sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A==", "requires": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -6504,101 +6004,110 @@ } }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.12.0.tgz", + "integrity": "sha512-LntwyPxtOHrsJdcSwyQKVtHofPHdv+4+mFwEe91r2V13vqpM8yLr7b1sW+Oo/yheOPkWYsYlYJCkzlFAt8KV7g==", "requires": { "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", + "ajv": "^6.5.3", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", + "doctrine": "^2.1.0", + "eslint-scope": "^4.0.0", + "eslint-utils": "^1.3.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^5.0.0", "esquery": "^1.0.1", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "file-entry-cache": "^2.0.0", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob": "^7.1.2", + "globals": "^11.7.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "inquirer": "^6.1.0", + "js-yaml": "^3.12.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", - "lodash": "^4.17.14", + "lodash": "^4.17.5", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", "progress": "^2.0.0", "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "semver": "^5.5.1", + "strip-ansi": "^4.0.0", + "strip-json-comments": "^2.0.1", + "table": "^5.0.2", + "text-table": "^0.2.0" }, "dependencies": { - "doctrine": { + "ansi-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "esutils": "^2.0.2" + "ms": "^2.1.1" } }, - "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { - "type-fest": "^0.8.1" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "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==", "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "resolve-from": { + "strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } } } }, "eslint-config-prettier": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz", - "integrity": "sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", + "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", "dev": true, "requires": { "get-stdin": "^6.0.0" } }, "eslint-config-react-app": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.1.0.tgz", - "integrity": "sha512-hBaxisHC6HXRVvxX+/t1n8mOdmCVIKgkXsf2WoUkJi7upHJTwYTsdCmx01QPOjKNT34QMQQ9sL0tVBlbiMFjxA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-3.0.8.tgz", + "integrity": "sha512-Ovi6Bva67OjXrom9Y/SLJRkrGqKhMAL0XCH8BizPhjEVEhYczl2ZKiNZI2CuqO5/CJwAfMwRXAVGY0KToWr1aA==", "requires": { - "confusing-browser-globals": "^1.0.9" + "confusing-browser-globals": "^1.0.6" } }, "eslint-import-resolver-node": { @@ -6617,38 +6126,25 @@ "requires": { "ms": "2.0.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", - "requires": { - "path-parse": "^1.0.6" - } } } }, "eslint-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.2.tgz", - "integrity": "sha512-S5VnD+UpVY1PyYRqeBd/4pgsmkvSokbHqTXAQMpvCyRr3XN2tvSLo9spm2nEpqQqh9dezw3os/0zWihLeOg2Rw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.1.tgz", + "integrity": "sha512-1GrJFfSevQdYpoDzx8mEE2TDWsb/zmFuY09l6hURg1AeFIKQOvZ+vH0UPjzmd1CZIbfTV5HUkMeBmFiDBkgIsQ==", "requires": { - "fs-extra": "^8.1.0", - "loader-fs-cache": "^1.0.2", - "loader-utils": "^1.2.3", - "object-hash": "^1.3.1", - "schema-utils": "^2.2.0" + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" } }, "eslint-module-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", - "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", "requires": { "debug": "^2.6.9", "pkg-dir": "^2.0.0" @@ -6662,83 +6158,39 @@ "ms": "2.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { + "pkg-dir": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "requires": { - "find-up": "^2.1.0" + "find-up": "^2.1.0" } } } }, "eslint-plugin-flowtype": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", - "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", + "version": "2.50.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.1.tgz", + "integrity": "sha512-9kRxF9hfM/O6WGZcZPszOVPd2W0TLHBtceulLTsGfwMPtiCCLnCW0ssRiOOiXyqrCA20pm1iXdXm7gQeN306zQ==", "requires": { - "lodash": "^4.17.15" + "lodash": "^4.17.10" } }, "eslint-plugin-import": { - "version": "2.18.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", - "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", + "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", "requires": { - "array-includes": "^3.0.3", "contains-path": "^0.1.0", - "debug": "^2.6.9", + "debug": "^2.6.8", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.0", + "eslint-import-resolver-node": "^0.3.1", + "eslint-module-utils": "^2.2.0", + "has": "^1.0.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.3", "read-pkg-up": "^2.0.0", - "resolve": "^1.11.0" + "resolve": "^1.6.0" }, "dependencies": { "debug": { @@ -6758,19 +6210,6 @@ "isarray": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -6782,41 +6221,6 @@ "strip-bom": "^3.0.0" } }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -6833,11 +6237,6 @@ "pify": "^2.0.0" } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -6856,148 +6255,71 @@ "find-up": "^2.0.0", "read-pkg": "^2.0.0" } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" } } }, "eslint-plugin-jsx-a11y": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", - "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.1.2.tgz", + "integrity": "sha512-7gSSmwb3A+fQwtw0arguwMdOdzmKUgnUcbSNlo+GjKLAQFuC2EZxWqG9XHRI8VscBJD5a8raz3RuxQNFW+XJbw==", "requires": { - "@babel/runtime": "^7.4.5", "aria-query": "^3.0.0", "array-includes": "^3.0.3", "ast-types-flow": "^0.0.7", - "axobject-query": "^2.0.2", + "axobject-query": "^2.0.1", "damerau-levenshtein": "^1.0.4", - "emoji-regex": "^7.0.2", + "emoji-regex": "^6.5.1", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1" + "jsx-ast-utils": "^2.0.1" }, "dependencies": { "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz", + "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==" } } }, "eslint-plugin-prettier": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", - "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", + "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-plugin-react": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.18.0.tgz", - "integrity": "sha512-p+PGoGeV4SaZRDsXqdj9OWcOrOpZn8gXoGPcIQTzo2IDMbAKhNDnME9myZWqO3Ic4R3YmwAZ1lDjWl2R2hMUVQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz", + "integrity": "sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==", "dev": true, "requires": { "array-includes": "^3.1.1", + "array.prototype.flatmap": "^1.2.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.3", - "object.entries": "^1.1.1", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "object.entries": "^1.1.2", "object.fromentries": "^2.0.2", "object.values": "^1.1.1", "prop-types": "^15.7.2", - "resolve": "^1.14.2" + "resolve": "^1.18.1", + "string.prototype.matchall": "^4.0.2" }, "dependencies": { - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - } - }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } } @@ -7006,12 +6328,13 @@ "eslint-plugin-react-hooks": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", - "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" + "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==", + "dev": true }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -7026,18 +6349,18 @@ } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz", + "integrity": "sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ==" }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", + "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" + "acorn": "^6.0.7", + "acorn-jsx": "^5.0.0", + "eslint-visitor-keys": "^1.0.0" } }, "esprima": { @@ -7046,11 +6369,18 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==" + } } }, "esrecurse": { @@ -7067,9 +6397,9 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -7077,9 +6407,9 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" }, "events": { "version": "3.1.0", @@ -7104,9 +6434,12 @@ } }, "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "requires": { + "merge": "^1.2.0" + } }, "execa": { "version": "1.0.0", @@ -7128,61 +6461,32 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" }, "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "^2.1.0" } }, "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", "requires": { - "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" + "jest-diff": "^23.6.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" } }, "express": { @@ -7227,6 +6531,11 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7235,11 +6544,6 @@ "ms": "2.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -7249,21 +6553,11 @@ "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - } - } - }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + }, + "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==" } } }, @@ -7302,67 +6596,11 @@ } }, "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } + "is-extglob": "^1.0.0" } }, "extsprintf": { @@ -7371,9 +6609,9 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { "version": "1.2.0", @@ -7394,25 +6632,289 @@ "micromatch": "^3.1.10" }, "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extglob": "^2.1.0" + "is-extendable": "^0.1.0" } } } - } + }, + "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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } } }, "fast-json-stable-stringify": { @@ -7430,10 +6932,15 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==" + }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "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" } @@ -7452,40 +6959,66 @@ "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" }, "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "requires": { "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", + "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true + "file-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/file-match/-/file-match-1.0.2.tgz", + "integrity": "sha1-ycrSZdLIrfOoFHWw30dYWQafrvc=", + "requires": { + "utils-extend": "^1.0.6" + } + }, + "file-system": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/file-system/-/file-system-2.2.2.tgz", + "integrity": "sha1-fWWDPjojR9zZVqgTxncVPtPt2Yc=", + "requires": { + "file-match": "^1.0.1", + "utils-extend": "^1.0.4" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } }, "filesize": { "version": "3.6.1", @@ -7493,22 +7026,23 @@ "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "requires": { - "is-extendable": "^0.1.0" + "isarray": "1.0.0" } } } @@ -7534,11 +7068,6 @@ "requires": { "ms": "2.0.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -7552,28 +7081,49 @@ "pkg-dir": "^3.0.0" } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "^3.0.0" + "locate-path": "^2.0.0" } }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "fine-uploader": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/fine-uploader/-/fine-uploader-5.16.2.tgz", + "integrity": "sha1-DYeNoc0nU/gGg6wJHfXa/5/7jEQ=" + }, + "fine-uploader-wrappers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fine-uploader-wrappers/-/fine-uploader-wrappers-1.0.1.tgz", + "integrity": "sha1-BEqUMgdr0CrBQEhm7G4Zf8Zi/L8=", "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "object-assign": "4.1.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=" + } } }, - "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } }, "flatten": { "version": "1.0.3", @@ -7587,26 +7137,45 @@ "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" - } - }, - "follow-redirects": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz", - "integrity": "sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ==", - "requires": { - "debug": "^3.0.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "ms": "^2.1.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" } } } }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -7626,9 +7195,9 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "fork-ts-checker-webpack-plugin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.0.tgz", - "integrity": "sha512-6OkRfjuNMNqb14f01xokcWcKV5Ekknc2FvziNpcTYru+kxIYFA2MtuuBI19MHThZnjSBhoi35Dcq+I0oUkFjmQ==", + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.0.0-alpha.6.tgz", + "integrity": "sha512-s/V+58nLrUjuXyzYk8AL11XG8bxIirTbafDLMn26sL59HQx8QvvsRTqOkhq4MV0coIkog1jZuH/E9Abm8zFZ2g==", "requires": { "babel-code-frame": "^6.22.0", "chalk": "^2.4.1", @@ -7636,70 +7205,336 @@ "micromatch": "^3.1.10", "minimatch": "^3.0.4", "semver": "^5.6.0", - "tapable": "^1.0.0", - "worker-rpc": "^0.1.0" + "tapable": "^1.0.0" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "requires": { - "minipass": "^3.0.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs-write-stream-atomic": { @@ -7711,6 +7546,35 @@ "iferr": "^0.1.5", "imurmurhash": "^0.1.4", "readable-stream": "1 || 2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "fs.realpath": { @@ -7719,3222 +7583,5519 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": 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=" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", - "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "optional": true, "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", - "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - } - } - }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" - }, - "gud": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", - "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" - }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } - } - }, - "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "harmony-reflect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", - "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" - }, - "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-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - } - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, "requires": { - "is-buffer": "^1.1.5" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - }, - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - } - }, - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" - }, - "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==" - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - } - } - }, - "html-webpack-plugin": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz", - "integrity": "sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ==", - "requires": { - "html-minifier": "^3.5.20", - "loader-utils": "^1.1.0", - "lodash": "^4.17.11", - "pretty-error": "^2.1.1", - "tapable": "^1.1.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "util.promisify": { + }, + "balanced-match": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } - } - } - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" }, - "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "chownr": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "optional": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "ms": "2.0.0" } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" - }, - "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" - } - }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" - }, - "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", - "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" - }, - "hyphenate-style-name": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", - "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" - }, - "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" - } - }, - "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "requires": { - "postcss": "^7.0.14" - } - }, - "identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", - "requires": { - "harmony-reflect": "^1.4.6" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "immer": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", - "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "minipass": "^2.2.1" } - } - } - }, - "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", - "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "optional": 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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "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" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "optional": true + } } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + "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=" }, - "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "get-intrinsic": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", + "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "dev": true, "requires": { - "kind-of": "^3.0.2" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" } }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { - "binary-extensions": "^1.0.0" - }, - "dependencies": { - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - } + "pump": "^3.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { - "ci-info": "^2.0.0" + "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" } }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "requires": { - "kind-of": "^3.0.2" + "is-glob": "^2.0.0" } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" }, "dependencies": { "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "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==" }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "gzip-size": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", + "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", "requires": { - "is-extglob": "^2.1.1" + "duplexer": "^0.1.1", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } } }, - "is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "requires": { - "kind-of": "^3.0.2" + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "uglify-js": { + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.4.tgz", + "integrity": "sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA==", + "optional": true, + "requires": { + "commander": "~2.20.3" + } + } } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "requires": { - "is-path-inside": "^2.1.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "harmony-reflect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", + "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { - "path-is-inside": "^1.0.2" + "function-bind": "^1.1.1" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "isobject": "^3.0.1" + "ansi-regex": "^2.0.0" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "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==" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { - "has": "^1.0.3" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, - "is-regexp": { + "has-values": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "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==" - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-what": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.5.1.tgz", - "integrity": "sha512-NHeqazf97ZVerGNEDmYG4+J4UY3uDQOjaJNMIMXw2i/tFfMconSgSK8Z27Y4VWMbM96E9ylroUSnD7jXRjzBwA==" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "has-flag": "^3.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" } } } }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" } }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { - "html-escaper": "^2.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" - }, - "dependencies": { - "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", - "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^13.3.0" - } - } + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" } }, - "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", - "realpath-native": "^1.1.0" - } + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" }, - "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "react-is": "^16.7.0" } }, - "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "requires": { - "detect-newline": "^2.1.0" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" }, - "jest-environment-jsdom-fourteen": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-0.1.0.tgz", - "integrity": "sha512-4vtoRMg7jAstitRzL4nbw83VmGH8Rs13wrND3Ud2o1fczDhMUF32iIrNKwYGgeOPUdfvZU4oy8Bbv+ni1fgVCA==", + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "requires": { - "jest-mock": "^24.5.0", - "jest-util": "^24.5.0", - "jsdom": "^14.0.0" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" }, "dependencies": { - "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" - }, - "jsdom": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", - "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.1.3", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "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" } }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "async-limiter": "~1.0.0" + "safe-buffer": "~5.1.0" } } } }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" + "whatwg-encoding": "^1.0.1" } }, - "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" + "html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==" }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" }, "dependencies": { - "fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "optional": true, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" + "commander": "~2.19.0", + "source-map": "~0.6.1" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "optional": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + } + } + } + } + }, + "html-webpack-plugin": { + "version": "4.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-alpha.2.tgz", + "integrity": "sha512-tyvhjVpuGqD7QYHi1l1drMQTg5i+qRxpQEGbdnYFREgOKy7aFDf/ocQ/V1fuEDlQx7jV2zMap3Hj2nE9i5eGXw==", + "requires": { + "@types/tapable": "1.0.2", + "html-minifier": "^3.2.3", + "loader-utils": "^1.1.0", + "lodash": "^4.17.10", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "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": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "requires": { + "http-proxy": "^1.16.2", + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "is-extendable": "^0.1.0" } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "optional": true, + } + } + }, + "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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "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" + "is-descriptor": "^0.1.0" } }, - "has-unicode": { + "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "optional": true, + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "is-extendable": "^0.1.0" } }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "optional": true, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "minimatch": "^3.0.4" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "optional": true, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "optional": true, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { - "number-is-nan": "^1.0.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, - "isarray": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "optional": true - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true - }, - "needle": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "optional": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "npm-normalize-package-bin": "^1.0.1" + "is-descriptor": "^1.0.0" } }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "optional": true - }, - "npm-packlist": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", - "optional": true, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "is-extendable": "^0.1.0" } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "is-extendable": "^0.1.0" } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "optional": true, + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "wrappy": "1" + "is-buffer": "^1.1.5" } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "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=", - "optional": true - }, - "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 - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "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" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "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 - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "optional": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "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" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "optional": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "optional": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "optional": true } } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } } } }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" - } + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - } + "hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { - "@jest/types": "^24.9.0" + "safer-buffer": ">= 2.1.2 < 3" } }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" }, - "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "requires": { - "@jest/types": "^24.9.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "postcss": "^6.0.1" } }, - "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" + "harmony-reflect": "^1.4.6" } }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, - "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - } + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, - "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "image-to-base64": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/image-to-base64/-/image-to-base64-2.1.1.tgz", + "integrity": "sha512-G8EZaxl8dmYUXCmaC/1W4oqwj+yiY+qhF9A81TbdOtxdK9BAN3oV440Jofexp4J2oRsbHIUJtl3rlDqdjmiZOQ==", "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" + "node-fetch": "^2.6.0" } }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } + "immer": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", + "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" + "import-from": "^2.1.0" } }, - "jest-watch-typeahead": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.2.tgz", - "integrity": "sha512-f7VpLebTdaXs81rg/oj4Vg/ObZy2QtGzAmGLNsqUS5G5KtSN68tFcIsbvNODfNyQxU78g7D8x77o3bgfBTR+2Q==", + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.1", - "jest-regex-util": "^24.9.0", - "jest-watcher": "^24.3.0", - "slash": "^3.0.0", - "string-length": "^3.1.0", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "string-length": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", - "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", - "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^5.2.0" - } - } + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" + "resolve-from": "^3.0.0" }, "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" } } }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" }, "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "requires": { - "has-flag": "^3.0.0" + "find-up": "^2.1.0" } } } }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "indefinite-observable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/indefinite-observable/-/indefinite-observable-2.0.1.tgz", + "integrity": "sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ==", + "requires": { + "symbol-observable": "1.2.0" + } }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" }, "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "jsmin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/jsmin/-/jsmin-1.0.1.tgz", - "integrity": "sha1-570NzWSWw79IYyNb9GGj2YqjuYw=" + "insert-css": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz", + "integrity": "sha1-610Ql7dUL0x56jBg067gfQU4gPQ=" }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + "install": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", + "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==" }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "internal-ip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "requires": { + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" + } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + } }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "requires": { - "jsonify": "~0.0.0" + "loose-envify": "^1.0.0" } }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" }, - "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "requires": { - "minimist": "^1.2.0" - } + "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==" }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "graceful-fs": "^4.1.6" + "kind-of": "^3.0.2" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, - "jss": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.0.4.tgz", - "integrity": "sha512-GqHmeDK83qbqMAVjxyPfN1qJVTKZne533a9bdCrllZukUM8npG/k+JumEPI86IIB5ifaZAHG2HAsUziyxOiooQ==", + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "requires": { - "@babel/runtime": "^7.3.1", - "csstype": "^2.6.5", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" + "binary-extensions": "^1.0.0" + }, + "dependencies": { + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + } } }, - "jss-plugin-camel-case": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.0.4.tgz", - "integrity": "sha512-+wnqxJsyfUnOn0LxVg3GgZBSjfBCrjxwx7LFxwVTUih0ceGaXKZoieheNOaTo5EM4w8bt1nbb8XonpQCj67C6A==", - "requires": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.0.4" - } + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "jss-plugin-default-unit": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.0.4.tgz", - "integrity": "sha512-T0mhL/Ogp/quvod/jAHEqKvptLDxq7Cj3a+7zRuqK8HxUYkftptN89wJElZC3rshhNKiogkEYhCWenpJdFvTBg==", - "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.0.4" - } + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==" }, - "jss-plugin-global": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.0.4.tgz", - "integrity": "sha512-N8n9/GHENZce+sqE4UYiZiJtI+t+erT/BypHOrNYAfIoNEj7OYsOEKfIo2P0GpLB3QyDAYf5eo9XNdZ8veEkUA==", + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.0.4" + "ci-info": "^1.5.0" } }, - "jss-plugin-nested": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.0.4.tgz", - "integrity": "sha512-QM21BKVt8LDeoRfowvAMh/s+/89VYrreIIE6ch4pvw0oAXDWw1iorUPlqLZ7uCO3UL0uFtQhJq3QMLN6Lr1v0A==", + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.0.4", - "tiny-warning": "^1.0.2" + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" } }, - "jss-plugin-props-sort": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.0.4.tgz", - "integrity": "sha512-WoETdOCjGskuin/OMt2uEdDPLZF3vfQuHXF+XUHGJrq0BAapoyGQDcv37SeReDlkRAbVXkEZPsIMvYrgHSHFiA==", + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.0.4" + "has": "^1.0.3" } }, - "jss-plugin-rule-value-function": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.0.4.tgz", - "integrity": "sha512-0hrzOSWRF5ABJGaHrlnHbYZjU877Ofzfh2id3uLtBvemGQLHI+ldoL8/+6iPSRa7M8z8Ngfg2vfYhKjUA5gA0g==", + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "@babel/runtime": "^7.3.1", - "jss": "10.0.4" + "kind-of": "^3.0.2" } }, - "jss-plugin-vendor-prefixer": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.0.4.tgz", - "integrity": "sha512-4JgEbcrdeMda1qvxTm1CnxFJAWVV++VLpP46HNTrfH7VhVlvUpihnUNs2gAlKuRT/XSBuiWeLAkrTqF4NVrPig==", - "requires": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.7", - "jss": "10.0.4" - } + "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==" }, - "jsx-ast-utils": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", - "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "requires": { - "array-includes": "^3.0.3", - "object.assign": "^4.1.0" - } - }, - "jxLoader": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jxLoader/-/jxLoader-0.1.1.tgz", - "integrity": "sha1-ATTqUUTlM7WU/B/yX/GU4jXFPs0=", - "requires": { - "js-yaml": "0.3.x", - "moo-server": "1.3.x", - "promised-io": "*", - "walker": "1.x" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { - "js-yaml": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-0.3.7.tgz", - "integrity": "sha1-1znY7oZGHlSzVNan19HyrZoWf2I=" + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "requires": { - "is-buffer": "^1.1.5" + "is-primitive": "^2.0.0" } }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, - "kuler": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", - "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", - "requires": { - "colornames": "^1.1.1" - } + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" }, - "last-call-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", - "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "requires": { - "lodash": "^4.17.5", - "webpack-sources": "^1.1.0" + "is-extglob": "^1.0.0" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" }, - "lcid": { + "is-negative-zero": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "requires": { - "invert-kv": "^2.0.0" + "kind-of": "^3.0.2" } }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "requires": { - "leven": "^3.1.0" + "is-path-inside": "^1.0.0" } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "path-is-inside": "^1.0.1" } }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "isobject": "^3.0.1" } }, - "loader-fs-cache": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", - "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "^1.0.0" - } - } - } + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - } + "has-symbols": "^1.0.1" } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + "is-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz", + "integrity": "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==" }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "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==" }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" + "html-comment-regex": "^1.1.0" } }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "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": { - "lodash._reinterpolate": "^3.0.0" + "has-symbols": "^1.0.1" } }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "logform": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", - "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", - "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^2.3.3", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" - } + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, - "loglevel": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", - "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==" + "is-what": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.8.0.tgz", + "integrity": "sha512-UKeBoQfV8bjlM4pmx1FLDHdxslW/1mTksEs8ReVsilPmUv5cORd4+2/wFcviI3cUjrLybxCjzc8DnodAzJ/Wrg==" }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isemail": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", + "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "punycode": "2.x.x" } }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "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==", - "requires": { - "yallist": "^3.0.2" + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" }, "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "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==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } } } }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==" + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "^1.0.0" + } } } }, - "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", "requires": { - "tmpl": "1.0.x" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" } }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "requires": { + "handlebars": "^4.0.3" + } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", + "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", "requires": { - "p-defer": "^1.0.0" + "import-local": "^1.0.0", + "jest-cli": "^23.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "jest-cli": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", + "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.4.2", + "jest-config": "^23.6.0", + "jest-environment-jsdom": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve-dependencies": "^23.6.0", + "jest-runner": "^23.6.0", + "jest-runtime": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "jest-watcher": "^23.4.0", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "prompts": "^0.1.9", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^11.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "jest-changed-files": { + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "requires": { + "throat": "^4.0.0" + } }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "jest-config": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", + "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", "requires": { - "object-visit": "^1.0.0" + "babel-core": "^6.0.0", + "babel-jest": "^23.6.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^23.4.0", + "jest-environment-node": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^23.6.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "pretty-format": "^23.6.0" + }, + "dependencies": { + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "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" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + } } }, - "material-design-icons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/material-design-icons/-/material-design-icons-3.0.1.tgz", - "integrity": "sha1-mnHEh0chjrylHlGmbaaCA4zct78=" + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "detect-newline": "^2.1.0" } }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + "jest-each": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", + "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", + "requires": { + "chalk": "^2.0.1", + "pretty-format": "^23.6.0" + } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0", + "jsdom": "^11.5.1" + } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0" } }, - "memoize-one": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", - "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==" + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==" }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "jest-haste-map": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", + "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", + "jest-docblock": "^23.2.0", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0" } }, - "merge-anything": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-2.4.4.tgz", - "integrity": "sha512-l5XlriUDJKQT12bH+rVhAHjwIuXWdAIecGwsYjv2LJo+dA1AeRTmeQS+3QBpO6lEthBMDi2IUMpLC1yyRvGlwQ==", + "jest-jasmine2": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", + "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", "requires": { - "is-what": "^3.3.1" + "babel-traverse": "^6.0.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^23.6.0", + "is-generator-fn": "^1.0.0", + "jest-diff": "^23.6.0", + "jest-each": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "pretty-format": "^23.6.0" } }, - "merge-deep": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", - "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", + "jest-leak-detector": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", + "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", "requires": { - "arr-union": "^3.1.0", - "clone-deep": "^0.2.4", - "kind-of": "^3.0.2" + "pretty-format": "^23.6.0" } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "jest-matcher-utils": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", + "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + } }, - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" + "jest-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=" }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "jest-pnp-resolver": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.0.2.tgz", + "integrity": "sha512-H2DvUlwdMedNGv4FOliPDnxani6ATWy70xe2eckGJgkLoMaWzRPqpSlc5ShqX0Ltk5OhRQvPQY2LLZPOpgcc7g==" }, - "microevent.ts": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", - "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=" }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" - }, - "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" - }, - "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "jest-resolve": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", + "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", "requires": { - "mime-db": "1.43.0" + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "mini-create-react-context": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", - "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "jest-resolve-dependencies": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", + "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", "requires": { - "@babel/runtime": "^7.4.0", - "gud": "^1.0.0", - "tiny-warning": "^1.0.2" + "jest-regex-util": "^23.3.0", + "jest-snapshot": "^23.6.0" } }, - "mini-css-extract-plugin": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", - "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "jest-runner": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", + "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-docblock": "^23.2.0", + "jest-haste-map": "^23.6.0", + "jest-jasmine2": "^23.6.0", + "jest-leak-detector": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-runtime": "^23.6.0", + "jest-util": "^23.4.0", + "jest-worker": "^23.2.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" }, "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } } } }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "minipass": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", - "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "jest-runtime": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", + "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", "requires": { - "minipass": "^3.0.0" + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.1.6", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^11.0.0" + }, + "dependencies": { + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "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" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + } } }, - "minipass-pipeline": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", - "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", - "requires": { - "minipass": "^3.0.0" - } + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=" }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "jest-snapshot": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "babel-types": "^6.0.0", + "chalk": "^2.0.1", + "jest-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.6.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.6.0", + "semver": "^5.5.0" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "jest-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^23.4.0", + "mkdirp": "^0.5.1", + "slash": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" }, "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" } } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "jest-watch-typeahead": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.2.1.tgz", + "integrity": "sha512-xdhEtKSj0gmnkDQbPTIHvcMmXNUDzYpHLEJ5TFqlaI+schi2NI96xhWiZk9QoesAS7oBmKwWWsHazTrYl2ORgg==", "requires": { - "minimist": "0.0.8" + "ansi-escapes": "^3.0.0", + "chalk": "^2.4.1", + "jest-watcher": "^23.1.0", + "slash": "^2.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, - "moo-server": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/moo-server/-/moo-server-1.3.0.tgz", - "integrity": "sha1-XceVaVZaENbv7VQ5SR5p0jkuWPE=" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "jest-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" } }, - "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==" + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "requires": { + "merge-stream": "^1.0.1" + } }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "joi": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-11.4.0.tgz", + "integrity": "sha512-O7Uw+w/zEWgbL6OcHbyACKSj0PkQeUgmehdoXVSxt92QFCq4+1390Rwh5moI2K/OgC7D8RHRZqHZxT2husMJHA==", "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" + "hoek": "4.x.x", + "isemail": "3.x.x", + "topo": "2.x.x" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "optional": true + "js-yaml": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-0.3.7.tgz", + "integrity": "sha1-1znY7oZGHlSzVNan19HyrZoWf2I=" }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" }, "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" } } }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "jsmin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jsmin/-/jsmin-1.0.1.tgz", + "integrity": "sha1-570NzWSWw79IYyNb9GGj2YqjuYw=" }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { - "lower-case": "^1.1.1" + "jsonify": "~0.0.0" } }, - "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=", "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" + "string-convert": "^0.2.0" + } + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jss": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.5.0.tgz", + "integrity": "sha512-B6151NvG+thUg3murLNHRPLxTLwQ13ep4SH5brj4d8qKtogOx/jupnpfkPGSHPqvcwKJaCLctpj2lEk+5yGwMw==", + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "indefinite-observable": "^2.0.1", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "csstype": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.5.tgz", + "integrity": "sha512-uVDi8LpBUKQj6sdxNaTetL6FpeCqTjOvAQuQUa/qAqq8oOd4ivkbhgnqayl0dnPal8Tb/yB1tF+gOvCBiicaiQ==" + } + } + }, + "jss-plugin-camel-case": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.5.0.tgz", + "integrity": "sha512-GSjPL0adGAkuoqeYiXTgO7PlIrmjv5v8lA6TTBdfxbNYpxADOdGKJgIEkffhlyuIZHlPuuiFYTwUreLUmSn7rg==", + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.5.0" + } + }, + "jss-plugin-default-unit": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.5.0.tgz", + "integrity": "sha512-rsbTtZGCMrbcb9beiDd+TwL991NGmsAgVYH0hATrYJtue9e+LH/Gn4yFD1ENwE+3JzF3A+rPnM2JuD9L/SIIWw==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0" + } + }, + "jss-plugin-global": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.5.0.tgz", + "integrity": "sha512-FZd9+JE/3D7HMefEG54fEC0XiQ9rhGtDHAT/ols24y8sKQ1D5KIw6OyXEmIdKFmACgxZV2ARQ5pAUypxkk2IFQ==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0" + } + }, + "jss-plugin-nested": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.5.0.tgz", + "integrity": "sha512-ejPlCLNlEGgx8jmMiDk/zarsCZk+DV0YqXfddpgzbO9Toamo0HweCFuwJ3ZO40UFOfqKwfpKMVH/3HUXgxkTMg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.5.0.tgz", + "integrity": "sha512-kTLRvrOetFKz5vM88FAhLNeJIxfjhCepnvq65G7xsAQ/Wgy7HwO1BS/2wE5mx8iLaAWC6Rj5h16mhMk9sKdZxg==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.5.0.tgz", + "integrity": "sha512-jXINGr8BSsB13JVuK274oEtk0LoooYSJqTBCGeBu2cG/VJ3+4FPs1gwLgsq24xTgKshtZ+WEQMVL34OprLidRA==", + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.5.0", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.5.0.tgz", + "integrity": "sha512-rux3gmfwDdOKCLDx0IQjTwTm03IfBa+Rm/hs747cOw5Q7O3RaTUIMPKjtVfc31Xr/XI9Abz2XEupk1/oMQ7zRA==", + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.5.0" + } + }, + "jsx-ast-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", + "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", + "requires": { + "array-includes": "^3.1.1", + "object.assign": "^4.1.0" + } + }, + "jxLoader": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jxLoader/-/jxLoader-0.1.1.tgz", + "integrity": "sha1-ATTqUUTlM7WU/B/yX/GU4jXFPs0=", + "requires": { + "js-yaml": "0.3.x", + "moo-server": "1.3.x", + "promised-io": "*", + "walker": "1.x" + } + }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==" + }, + "kuler": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "requires": { + "colornames": "^1.1.1" + } + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + } + } + }, + "loader-fs-cache": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", + "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "logform": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", + "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "loglevel": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "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==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "material-design-icons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/material-design-icons/-/material-design-icons-3.0.1.tgz", + "integrity": "sha1-mnHEh0chjrylHlGmbaaCA4zct78=" + }, + "material-ui-popup-state": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/material-ui-popup-state/-/material-ui-popup-state-1.8.0.tgz", + "integrity": "sha512-czXksi+b1I1Dgemp82UNUBjIy9DV60ttw6a9fyk60UX/Axqmf4hzcp/ulhd3JcMS5HgmmO1Vw/DNkV10ngj16A==", + "requires": { + "@babel/runtime": "^7.12.5", + "@material-ui/types": "^4.1.1", + "classnames": "^2.2.6", + "prop-types": "^15.7.2" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@material-ui/types": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-4.1.1.tgz", + "integrity": "sha512-AN+GZNXytX9yxGi0JOfxHrRTbhFybjUJ05rnsBVjcB+16e466Z0Xe5IxawuOayVZgTBNDxmPKo5j4V6OnMtaSQ==", + "requires": { + "@types/react": "*" + } + } + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + } + } + }, + "memoize-one": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", + "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==" + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" + }, + "merge-anything": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-2.4.4.tgz", + "integrity": "sha512-l5XlriUDJKQT12bH+rVhAHjwIuXWdAIecGwsYjv2LJo+dA1AeRTmeQS+3QBpO6lEthBMDi2IUMpLC1yyRvGlwQ==", + "requires": { + "is-what": "^3.3.1" + } + }, + "merge-deep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", + "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", + "requires": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } + } + }, + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + }, + "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": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mini-create-react-context": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", + "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==", + "requires": { + "@babel/runtime": "^7.5.5", + "tiny-warning": "^1.0.3" + } + }, + "mini-css-extract-plugin": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz", + "integrity": "sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==", + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "mini-store": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/mini-store/-/mini-store-3.0.6.tgz", + "integrity": "sha512-YzffKHbYsMQGUWQRKdsearR79QsMzzJcDDmZKlJBqt5JNkqpyJHYlK6gP61O36X+sLf76sO9G6mhKBe83gIZIQ==", + "requires": { + "hoist-non-react-statics": "^3.3.2", + "shallowequal": "^1.0.2" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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==" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "moo-server": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/moo-server/-/moo-server-1.3.0.tgz", + "integrity": "sha1-XceVaVZaENbv7VQ5SR5p0jkuWPE=" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "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==" + } + } + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node-releases": { + "version": "1.1.58", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.58.tgz", + "integrity": "sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==" + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + }, + "npm": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/npm/-/npm-7.6.2.tgz", + "integrity": "sha512-XXlLw6+HNG5GXt/T+xOAK8QXQ3x3VhIOBmWtiTw6yavFeTelleN2uAf8zG7HwSv9pBxLA4FHx7vGmlMKxAkqDQ==", + "requires": { + "@npmcli/arborist": "^2.2.7", + "@npmcli/ci-detect": "^1.2.0", + "@npmcli/config": "^1.2.9", + "@npmcli/run-script": "^1.8.3", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "archy": "~1.0.0", + "byte-size": "^7.0.1", + "cacache": "^15.0.5", + "chalk": "^4.1.0", + "chownr": "^2.0.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.6.0", + "columnify": "~1.5.4", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "hosted-git-info": "^3.0.8", + "ini": "^2.0.0", + "init-package-json": "^2.0.2", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "^2.3.1", + "leven": "^3.1.0", + "libnpmaccess": "^4.0.1", + "libnpmdiff": "^2.0.4", + "libnpmfund": "^1.0.2", + "libnpmhook": "^6.0.1", + "libnpmorg": "^2.0.1", + "libnpmpack": "^2.0.1", + "libnpmpublish": "^4.0.0", + "libnpmsearch": "^3.1.0", + "libnpmteam": "^2.0.2", + "libnpmversion": "^1.0.11", + "make-fetch-happen": "^8.0.14", + "minipass": "^3.1.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^7.1.2", + "nopt": "^5.0.0", + "npm-audit-report": "^2.1.4", + "npm-package-arg": "^8.1.1", + "npm-pick-manifest": "^6.1.0", + "npm-profile": "^5.0.2", + "npm-registry-fetch": "^9.0.0", + "npm-user-validate": "^1.0.1", + "npmlog": "~4.1.2", + "opener": "^1.5.2", + "pacote": "^11.3.0", + "parse-conflict-json": "^1.1.1", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^3.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "ssri": "^8.0.1", + "tar": "^6.1.0", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^1.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^2.0.2", + "write-file-atomic": "^3.0.3" + }, + "dependencies": { + "@npmcli/arborist": { + "version": "2.2.7", + "bundled": true, + "requires": { + "@npmcli/installed-package-contents": "^1.0.7", + "@npmcli/map-workspaces": "^1.0.2", + "@npmcli/metavuln-calculator": "^1.1.0", + "@npmcli/move-file": "^1.1.0", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^1.0.1", + "@npmcli/run-script": "^1.8.2", + "bin-links": "^2.2.1", + "cacache": "^15.0.3", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.1", + "mkdirp-infer-owner": "^2.0.0", + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.1.0", + "npm-pick-manifest": "^6.1.0", + "npm-registry-fetch": "^9.0.0", + "pacote": "^11.2.6", + "parse-conflict-json": "^1.1.1", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^2.0.2", + "readdir-scoped-modules": "^1.1.0", + "semver": "^7.3.4", + "tar": "^6.1.0", + "treeverse": "^1.0.4", + "walk-up-path": "^1.0.0" + } + }, + "@npmcli/ci-detect": { + "version": "1.3.0", + "bundled": true + }, + "@npmcli/config": { + "version": "1.2.9", + "bundled": true, + "requires": { + "ini": "^2.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^5.0.0", + "semver": "^7.3.4", + "walk-up-path": "^1.0.0" + } + }, + "@npmcli/disparity-colors": { + "version": "1.0.1", + "bundled": true, + "requires": { + "ansi-styles": "^4.3.0" + } + }, + "@npmcli/git": { + "version": "2.0.6", + "bundled": true, + "requires": { + "@npmcli/promise-spawn": "^1.1.0", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.3", + "npm-pick-manifest": "^6.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.2", + "unique-filename": "^1.1.1", + "which": "^2.0.2" + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "bundled": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/map-workspaces": { + "version": "1.0.3", + "bundled": true, + "requires": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "read-package-json-fast": "^2.0.1" + } + }, + "@npmcli/metavuln-calculator": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cacache": "^15.0.5", + "pacote": "^11.1.11", + "semver": "^7.3.2" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "bundled": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/name-from-folder": { + "version": "1.0.1", + "bundled": true + }, + "@npmcli/node-gyp": { + "version": "1.0.2", + "bundled": true + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "bundled": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "1.8.3", + "bundled": true, + "requires": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "infer-owner": "^1.0.4", + "node-gyp": "^7.1.0", + "puka": "^1.0.1", + "read-package-json-fast": "^2.0.1" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "bundled": true + }, + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "agent-base": { + "version": "6.0.2", + "bundled": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.1.4", + "bundled": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "bundled": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "bundled": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "ansi-styles": { + "version": "4.3.0", + "bundled": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true + }, + "aproba": { + "version": "2.0.0", + "bundled": true + }, + "archy": { + "version": "1.0.0", + "bundled": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asap": { + "version": "2.0.6", + "bundled": true + }, + "asn1": { + "version": "0.2.4", + "bundled": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true + }, + "aws-sign2": { + "version": "0.7.0", + "bundled": true + }, + "aws4": { + "version": "1.11.0", + "bundled": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "bundled": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bin-links": { + "version": "2.2.1", + "bundled": true, + "requires": { + "cmd-shim": "^4.0.1", + "mkdirp": "^1.0.3", + "npm-normalize-package-bin": "^1.0.0", + "read-cmd-shim": "^2.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^3.0.3" + } + }, + "binary-extensions": { + "version": "2.2.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "builtins": { + "version": "1.0.3", + "bundled": true + }, + "byte-size": { + "version": "7.0.1", + "bundled": true + }, + "cacache": { + "version": "15.0.5", + "bundled": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "caseless": { + "version": "0.12.0", + "bundled": true + }, + "chalk": { + "version": "4.1.0", + "bundled": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "2.0.0", + "bundled": true + }, + "cidr-regex": { + "version": "3.1.1", + "bundled": true, + "requires": { + "ip-regex": "^4.1.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "bundled": true + }, + "cli-columns": { + "version": "3.1.2", + "bundled": true, + "requires": { + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "cli-table3": { + "version": "0.6.0", + "bundled": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "bundled": true + }, + "string-width": { + "version": "4.2.0", + "bundled": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "bundled": true + }, + "cmd-shim": { + "version": "4.1.0", + "bundled": true, + "requires": { + "mkdirp-infer-owner": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "color-convert": { + "version": "2.0.1", + "bundled": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "bundled": true + }, + "colors": { + "version": "1.4.0", + "bundled": true, + "optional": true + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "bundled": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "common-ancestor-path": { + "version": "1.0.1", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.3.1", + "bundled": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "bundled": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "requires": { + "clone": "^1.0.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "depd": { + "version": "1.1.2", + "bundled": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "diff": { + "version": "5.0.0", + "bundled": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "bundled": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "bundled": true + }, + "encoding": { + "version": "0.1.13", + "bundled": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "env-paths": { + "version": "2.2.0", + "bundled": true + }, + "err-code": { + "version": "2.0.3", + "bundled": true + }, + "extend": { + "version": "3.0.2", + "bundled": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "bundled": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true + }, + "form-data": { + "version": "2.3.3", + "bundled": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-minipass": { + "version": "2.1.0", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "function-bind": { + "version": "1.1.1", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "bundled": true + }, + "har-schema": { + "version": "2.0.0", + "bundled": true + }, + "har-validator": { + "version": "5.1.5", + "bundled": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "bundled": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "bundled": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "hosted-git-info": { + "version": "3.0.8", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "bundled": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "bundled": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "bundled": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.6.2", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "indent-string": { + "version": "4.0.0", + "bundled": true + }, + "infer-owner": { + "version": "1.0.4", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true + }, + "ini": { + "version": "2.0.0", + "bundled": true + }, + "init-package-json": { + "version": "2.0.2", + "bundled": true, + "requires": { + "glob": "^7.1.1", + "npm-package-arg": "^8.1.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "^3.0.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "ip": { + "version": "1.1.5", + "bundled": true + }, + "ip-regex": { + "version": "4.3.0", + "bundled": true + }, + "is-cidr": { + "version": "4.0.2", + "bundled": true, + "requires": { + "cidr-regex": "^3.1.1" + } + }, + "is-core-module": { + "version": "2.2.0", + "bundled": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, + "is-lambda": { + "version": "1.0.1", + "bundled": true + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "bundled": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "bundled": true + }, + "json-stringify-nice": { + "version": "1.1.1", + "bundled": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "just-diff": { + "version": "3.0.2", + "bundled": true + }, + "just-diff-apply": { + "version": "3.0.0", + "bundled": true + }, + "leven": { + "version": "3.1.0", + "bundled": true + }, + "libnpmaccess": { + "version": "4.0.1", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^8.0.0", + "npm-registry-fetch": "^9.0.0" + } + }, + "libnpmdiff": { + "version": "2.0.4", + "bundled": true, + "requires": { + "@npmcli/disparity-colors": "^1.0.1", + "@npmcli/installed-package-contents": "^1.0.7", + "binary-extensions": "^2.2.0", + "diff": "^5.0.0", + "minimatch": "^3.0.4", + "npm-package-arg": "^8.1.1", + "pacote": "^11.3.0", + "tar": "^6.1.0" + } + }, + "libnpmfund": { + "version": "1.0.2", + "bundled": true, + "requires": { + "@npmcli/arborist": "^2.0.0" + } + }, + "libnpmhook": { + "version": "6.0.1", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^9.0.0" + } + }, + "libnpmorg": { + "version": "2.0.1", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^9.0.0" + } + }, + "libnpmpack": { + "version": "2.0.1", + "bundled": true, + "requires": { + "@npmcli/run-script": "^1.8.3", + "npm-package-arg": "^8.1.0", + "pacote": "^11.2.6" + } + }, + "libnpmpublish": { + "version": "4.0.0", + "bundled": true, + "requires": { + "normalize-package-data": "^3.0.0", + "npm-package-arg": "^8.1.0", + "npm-registry-fetch": "^9.0.0", + "semver": "^7.1.3", + "ssri": "^8.0.0" + } + }, + "libnpmsearch": { + "version": "3.1.0", + "bundled": true, + "requires": { + "npm-registry-fetch": "^9.0.0" + } + }, + "libnpmteam": { + "version": "2.0.2", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^9.0.0" + } + }, + "libnpmversion": { + "version": "1.0.11", + "bundled": true, + "requires": { + "@npmcli/git": "^2.0.6", + "@npmcli/run-script": "^1.8.3", + "read-package-json-fast": "^2.0.1", + "semver": "^7.3.4", + "stringify-package": "^1.0.1" + } + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-fetch-happen": { + "version": "8.0.14", + "bundled": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + } + }, + "mime-db": { + "version": "1.45.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.28", + "bundled": true, + "requires": { + "mime-db": "1.45.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "3.1.3", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.3.3", + "bundled": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "bundled": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "bundled": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "bundled": true + }, + "mkdirp-infer-owner": { + "version": "2.0.0", + "bundled": true, + "requires": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + } + }, + "ms": { + "version": "2.1.3", + "bundled": true + }, + "mute-stream": { + "version": "0.0.8", + "bundled": true + }, + "node-gyp": { + "version": "7.1.2", + "bundled": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + } + }, + "nopt": { + "version": "5.0.0", + "bundled": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "3.0.0", + "bundled": true, + "requires": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-audit-report": { + "version": "2.1.4", + "bundled": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "bundled": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true + }, + "npm-package-arg": { + "version": "8.1.1", + "bundled": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "2.1.4", + "bundled": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.0", + "bundled": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + } + }, + "npm-profile": { + "version": "5.0.2", + "bundled": true, + "requires": { + "npm-registry-fetch": "^9.0.0" + } + }, + "npm-registry-fetch": { + "version": "9.0.0", + "bundled": true, + "requires": { + "@npmcli/ci-detect": "^1.0.0", + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.1", + "bundled": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.9.0", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.2", + "bundled": true + }, + "p-map": { + "version": "4.0.0", + "bundled": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "pacote": { + "version": "11.3.0", + "bundled": true, + "requires": { + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.8.2", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^9.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + } + }, + "parse-conflict-json": { + "version": "1.1.1", + "bundled": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "just-diff": "^3.0.1", + "just-diff-apply": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "path-parse": { + "version": "1.0.6", + "bundled": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true + }, + "promise-all-reject-late": { + "version": "1.0.1", + "bundled": true + }, + "promise-call-limit": { + "version": "1.0.1", + "bundled": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true + }, + "promise-retry": { + "version": "2.0.1", + "bundled": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "requires": { + "read": "1" + } + }, + "psl": { + "version": "1.8.0", + "bundled": true + }, + "puka": { + "version": "1.0.1", + "bundled": true + }, + "punycode": { + "version": "2.1.1", + "bundled": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true + }, + "qs": { + "version": "6.5.2", + "bundled": true + }, + "read": { + "version": "1.0.7", + "bundled": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "2.0.0", + "bundled": true + }, + "read-package-json": { + "version": "3.0.1", + "bundled": true, + "requires": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^3.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-json-fast": { + "version": "2.0.2", + "bundled": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": 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" + } }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "readdir-scoped-modules": { + "version": "1.1.0", + "bundled": true, "requires": { - "inherits": "2.0.3" + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "request": { + "version": "2.88.2", + "bundled": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "bundled": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } - } - } - }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "node-releases": { - "version": "1.1.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", - "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", - "requires": { - "semver": "^6.3.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { + }, + "resolve": { + "version": "1.20.0", + "bundled": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "retry": { + "version": "0.12.0", + "bundled": true + }, + "rimraf": { + "version": "3.0.2", + "bundled": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "7.3.4", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.3", + "bundled": true + }, + "smart-buffer": { + "version": "4.1.0", + "bundled": true + }, + "socks": { + "version": "2.5.1", + "bundled": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.0", + "bundled": true, + "requires": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + } + }, + "spdx-correct": { + "version": "3.1.1", + "bundled": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "bundled": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "bundled": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "bundled": true + }, + "sshpk": { + "version": "1.16.1", + "bundled": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "8.0.1", + "bundled": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-package": { + "version": "1.0.1", + "bundled": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "bundled": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "6.1.0", + "bundled": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true + }, + "treeverse": { + "version": "1.0.4", + "bundled": true + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "bundled": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "bundled": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "uri-js": { + "version": "4.4.1", + "bundled": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "uuid": { + "version": "3.4.0", + "bundled": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "walk-up-path": { + "version": "1.0.0", + "bundled": true + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "2.0.2", + "bundled": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write-file-atomic": { + "version": "3.0.3", + "bundled": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true } } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "normalize-scroll-left": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/normalize-scroll-left/-/normalize-scroll-left-0.2.0.tgz", - "integrity": "sha512-t5oCENZJl8TGusJKoCJm7+asaSsPuNmK6+iEjrZ5TyBj2f02brCRsd4c83hwtu+e5d4LCSBZ0uoDlMjBo+A8yA==" - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -11007,20 +13168,19 @@ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" }, "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "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-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" - }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -11038,126 +13198,86 @@ "function-bind": "^1.1.1", "has-symbols": "^1.0.0", "object-keys": "^1.0.11" - } - }, - "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "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==" - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "requires": { - "has": "^1.0.3" - } - } - } - }, - "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + } + }, + "object.entries": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", + "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", + "es-abstract": "^1.18.0-next.1", "has": "^1.0.3" }, "dependencies": { "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "has-symbols": "^1.0.1" } }, - "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==" - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, "requires": { - "has": "^1.0.3" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } } } }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "object.getownpropertydescriptors": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", @@ -11167,6 +13287,15 @@ "es-abstract": "^1.17.0-next.1" } }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -11218,42 +13347,27 @@ "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" }, "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "open": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.0.0.tgz", - "integrity": "sha512-K6EKzYqnwQzk+/dzJAQSBORub3xlBTxMz+ntpZpH/LyCa1o6KjXhuN+2npAaI9jaSmU3R1Q8NWf4KUWcyytGsQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "requires": { - "is-wsl": "^2.1.0" - }, - "dependencies": { - "is-wsl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", - "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==" - } + "mimic-fn": "^1.0.0" } }, "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", "requires": { "is-wsl": "^1.1.0" } }, "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A==", "requires": { - "cssnano": "^4.1.10", + "cssnano": "^4.1.0", "last-call-webpack-plugin": "^3.0.0" } }, @@ -11283,6 +13397,11 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", @@ -11303,14 +13422,6 @@ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" }, - "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "requires": { - "p-reduce": "^1.0.0" - } - }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -11322,51 +13433,35 @@ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" } }, "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" - }, - "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", - "requires": { - "retry": "^0.12.0" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" }, "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==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "parallel-transform": { "version": "1.2.0", @@ -11376,6 +13471,35 @@ "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "param-case": { @@ -11392,13 +13516,6 @@ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "requires": { "callsites": "^3.0.0" - }, - "dependencies": { - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - } } }, "parse-asn1": { @@ -11414,13 +13531,26 @@ "safe-buffer": "^5.1.1" } }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" } }, "parse5": { @@ -11479,20 +13609,24 @@ "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "requires": { "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } } }, "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -11506,10 +13640,16 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "optional": true + }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", @@ -11524,92 +13664,89 @@ "pinkie": "^2.0.0" } }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { "find-up": "^3.0.0" - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "requires": { - "find-up": "^2.1.0" }, "dependencies": { "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "locate-path": "^2.0.0" + "locate-path": "^3.0.0" } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.0.0" } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" } } }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" + }, "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" }, "pnp-webpack-plugin": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz", - "integrity": "sha512-jd9olUr9D7do+RN8Wspzhpxhgp1n6Vd0NtQ4SFkmIACZoEL1nkyAdW9Ygrinjec0vgDcWjscFQQ1gDW8rsfKTg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.2.1.tgz", + "integrity": "sha512-W6GctK7K2qQiVR+gYSv/Gyt6jwwIH4vwdviFqx+Y2jAtVf5eZyYIDf5Ac2NCDMBiX5yWscBLZElPTsyA1UtVVA==", "requires": { - "ts-pnp": "^1.1.2" + "ts-pnp": "^1.0.0" } }, "popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + "version": "1.16.1-lts", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", + "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" }, "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", + "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", "requires": { "async": "^2.6.2", "debug": "^3.1.1", @@ -11623,6 +13760,11 @@ "requires": { "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -11632,33 +13774,39 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", - "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "requires": { - "chalk": "^2.4.2", + "chalk": "^2.4.1", "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "supports-color": "^5.4.0" }, "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -11676,60 +13824,80 @@ } } }, - "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", - "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^6.0.2" - } - }, - "postcss-browser-comments": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz", - "integrity": "sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig==", + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", "requires": { - "postcss": "^7" + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, - "postcss-calc": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", - "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", "requires": { - "css-unit-converter": "^1.1.1", - "postcss": "^7.0.5", - "postcss-selector-parser": "^5.0.0-rc.4", - "postcss-value-parser": "^3.3.1" + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" }, "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "has-flag": "^3.0.0" } } } }, - "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - } - }, "postcss-color-gray": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", @@ -11738,6 +13906,31 @@ "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.5", "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-color-hex-alpha": { @@ -11747,6 +13940,31 @@ "requires": { "postcss": "^7.0.14", "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-color-mod-function": { @@ -11757,6 +13975,31 @@ "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-color-rebeccapurple": { @@ -11766,6 +14009,31 @@ "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-colormin": { @@ -11778,6 +14046,31 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-convert-values": { @@ -11787,6 +14080,31 @@ "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-custom-media": { @@ -11795,6 +14113,31 @@ "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", "requires": { "postcss": "^7.0.14" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-custom-properties": { @@ -11804,6 +14147,31 @@ "requires": { "postcss": "^7.0.17", "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-custom-selectors": { @@ -11820,6 +14188,16 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", @@ -11829,6 +14207,19 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -11846,6 +14237,16 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", @@ -11855,23 +14256,86 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } } } }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "requires": { - "postcss": "^7.0.0" - } - }, "postcss-discard-duplicates": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-discard-empty": { @@ -11880,6 +14344,31 @@ "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-discard-overridden": { @@ -11888,6 +14377,31 @@ "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-double-position-gradients": { @@ -11897,6 +14411,31 @@ "requires": { "postcss": "^7.0.5", "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-env-function": { @@ -11906,6 +14445,31 @@ "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-flexbugs-fixes": { @@ -11914,6 +14478,31 @@ "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-focus-visible": { @@ -11922,6 +14511,31 @@ "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", "requires": { "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-focus-within": { @@ -11930,6 +14544,31 @@ "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", "requires": { "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-font-variant": { @@ -11938,6 +14577,31 @@ "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", "requires": { "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-gap-properties": { @@ -11946,6 +14610,31 @@ "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", "requires": { "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-image-set-function": { @@ -11955,6 +14644,31 @@ "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-initial": { @@ -11964,6 +14678,31 @@ "requires": { "lodash.template": "^4.5.0", "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-lab-function": { @@ -11974,6 +14713,31 @@ "@csstools/convert-colors": "^1.4.0", "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-load-config": { @@ -11983,6 +14747,51 @@ "requires": { "cosmiconfig": "^5.0.0", "import-cwd": "^2.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "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==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, "postcss-loader": { @@ -11996,14 +14805,27 @@ "schema-utils": "^1.0.0" }, "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" } } } @@ -12014,6 +14836,31 @@ "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", "requires": { "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-media-minmax": { @@ -12022,6 +14869,31 @@ "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", "requires": { "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-merge-longhand": { @@ -12033,6 +14905,31 @@ "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-merge-rules": { @@ -12048,15 +14945,38 @@ "vendors": "^1.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { - "dot-prop": "^4.1.1", + "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -12067,6 +14987,31 @@ "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-minify-gradients": { @@ -12078,6 +15023,31 @@ "is-color-stop": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-minify-params": { @@ -12091,6 +15061,31 @@ "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-minify-selectors": { @@ -12104,60 +15099,74 @@ "postcss-selector-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "has-flag": "^3.0.0" } } } }, "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", "requires": { - "postcss": "^7.0.5" + "postcss": "^6.0.1" } }, "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" - } + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" } }, "postcss-modules-scope": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", - "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" } }, "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" } }, "postcss-nesting": { @@ -12166,18 +15175,31 @@ "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", "requires": { "postcss": "^7.0.2" - } - }, - "postcss-normalize": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-8.0.1.tgz", - "integrity": "sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ==", - "requires": { - "@csstools/normalize.css": "^10.1.0", - "browserslist": "^4.6.2", - "postcss": "^7.0.17", - "postcss-browser-comments": "^3.0.0", - "sanitize.css": "^10.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-normalize-charset": { @@ -12186,6 +15208,31 @@ "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-normalize-display-values": { @@ -12196,6 +15243,31 @@ "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-normalize-positions": { @@ -12207,6 +15279,31 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-normalize-repeat-style": { @@ -12218,6 +15315,31 @@ "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-normalize-string": { @@ -12228,6 +15350,31 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-normalize-timing-functions": { @@ -12238,6 +15385,31 @@ "cssnano-util-get-match": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-normalize-unicode": { @@ -12248,6 +15420,31 @@ "browserslist": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-normalize-url": { @@ -12261,10 +15458,28 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -12275,6 +15490,31 @@ "requires": { "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-ordered-values": { @@ -12285,6 +15525,31 @@ "cssnano-util-get-arguments": "^4.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-overflow-shorthand": { @@ -12293,6 +15558,31 @@ "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", "requires": { "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-page-break": { @@ -12301,6 +15591,31 @@ "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", "requires": { "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-place": { @@ -12310,29 +15625,54 @@ "requires": { "postcss": "^7.0.2", "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.5.0.tgz", + "integrity": "sha512-RdsIrYJd9p9AouQoJ8dFP5ksBJEIegA4q4WzJDih8nevz3cZyIP/q1Eaw3pTVpUAu3n7Y32YmvAW3X07mSRGkw==", "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", + "autoprefixer": "^9.4.2", + "browserslist": "^4.3.5", + "caniuse-lite": "^1.0.30000918", "css-blank-pseudo": "^0.1.4", "css-has-pseudo": "^0.10.0", "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", + "cssdb": "^4.3.0", + "postcss": "^7.0.6", + "postcss-attribute-case-insensitive": "^4.0.0", "postcss-color-functional-notation": "^2.0.1", "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-hex-alpha": "^5.0.2", "postcss-color-mod-function": "^3.0.3", "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", + "postcss-custom-media": "^7.0.7", + "postcss-custom-properties": "^8.0.9", "postcss-custom-selectors": "^5.1.2", "postcss-dir-pseudo-class": "^5.0.0", "postcss-double-position-gradients": "^1.0.0", @@ -12354,6 +15694,31 @@ "postcss-replace-overflow-wrap": "^3.0.0", "postcss-selector-matches": "^4.0.0", "postcss-selector-not": "^4.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-pseudo-class-any-link": { @@ -12370,6 +15735,16 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", @@ -12379,6 +15754,19 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -12391,6 +15779,31 @@ "caniuse-api": "^3.0.0", "has": "^1.0.0", "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-reduce-transforms": { @@ -12402,6 +15815,31 @@ "has": "^1.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-replace-overflow-wrap": { @@ -12410,6 +15848,31 @@ "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", "requires": { "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-safe-parser": { @@ -12418,6 +15881,31 @@ "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", "requires": { "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-selector-matches": { @@ -12427,6 +15915,31 @@ "requires": { "balanced-match": "^1.0.0", "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-selector-not": { @@ -12436,6 +15949,31 @@ "requires": { "balanced-match": "^1.0.0", "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-selector-parser": { @@ -12457,6 +15995,31 @@ "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-unique-selectors": { @@ -12467,6 +16030,31 @@ "alphanum-sort": "^1.0.0", "postcss": "^7.0.0", "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } } }, "postcss-value-parser": { @@ -12489,10 +16077,10 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "prettier": { "version": "1.18.2", @@ -12510,9 +16098,9 @@ } }, "pretty-bytes": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", - "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" }, "pretty-error": { "version": "2.1.1", @@ -12524,20 +16112,18 @@ } }, "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" } } }, @@ -12552,9 +16138,9 @@ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "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==" }, "progress": { "version": "2.0.3", @@ -12562,9 +16148,9 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", - "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz", + "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==", "requires": { "asap": "~2.0.6" } @@ -12575,17 +16161,17 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "promised-io": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/promised-io/-/promised-io-0.3.5.tgz", - "integrity": "sha1-StIXuzZYvKrplGsXqGaOzYUeE1Y=" + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/promised-io/-/promised-io-0.3.6.tgz", + "integrity": "sha512-bNwZusuNIW4m0SPR8jooSyndD35ggirHlxVl/UhIaZD/F0OBv9ebfc6tNmbpZts3QXHggkjIBH8lvtnzhtcz0A==" }, "prompts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", - "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.3" + "kleur": "^2.0.1", + "sisteransi": "^0.1.1" } }, "prop-types": { @@ -12599,12 +16185,12 @@ } }, "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "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.0" + "ipaddr.js": "1.9.1" } }, "prr": { @@ -12613,9 +16199,9 @@ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, "public-encrypt": { "version": "4.0.3", @@ -12628,6 +16214,13 @@ "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + } } }, "pump": { @@ -12675,15 +16268,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -12699,58 +16283,537 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "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" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + } + } + }, + "rc-align": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.9.tgz", + "integrity": "sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "dom-align": "^1.7.0", + "rc-util": "^5.3.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-cascader": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-1.4.2.tgz", + "integrity": "sha512-JVuLGrSi+3G8DZyPvlKlGVWJjhoi9NTz6REHIgRspa5WnznRkKGm2ejb0jJtz0m2IL8Q9BG4ZA2sXuqAu71ltQ==", + "requires": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.0.1", + "warning": "^4.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "rc-checkbox": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz", + "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + } + }, + "rc-collapse": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.1.0.tgz", + "integrity": "sha512-EwpNPJcLe7b+5JfyaxM9ZNnkCgqArt3QQO0Cr5p5plwz/C9h8liAmjYY5I4+hl9lAjBqb7ZwLu94+z+rt5g1WQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.2.1", + "shallowequal": "^1.1.0" + } + }, + "rc-dialog": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.5.2.tgz", + "integrity": "sha512-3n4taFcjqhTE9uNuzjB+nPDeqgRBTEGBfe46mb1e7r88DgDo0lL4NnxY/PZ6PJKd2tsCt+RrgF/+YeTvJ/Thsw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.6.1" + } + }, + "rc-drawer": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-4.3.1.tgz", + "integrity": "sha512-GMfFy4maqxS9faYXEhQ+0cA1xtkddEQzraf6SAdzWbn444DrrLogwYPk1NXSpdXjLCLxgxOj9MYtyYG42JsfXg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.7.0" + } + }, + "rc-dropdown": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.2.0.tgz", + "integrity": "sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-trigger": "^5.0.4" + } + }, + "rc-field-form": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.19.0.tgz", + "integrity": "sha512-FZFyE6FmhR4xGO3MVo86J2sHIM6t/W4UqN94nVqZC/9PLhzSaKuM0i9UfwFMtuENP2hxFANEQZMBrD/2Zd43pg==", + "requires": { + "@babel/runtime": "^7.8.4", + "async-validator": "^3.0.3", + "rc-util": "^5.8.0" + } + }, + "rc-image": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.2.3.tgz", + "integrity": "sha512-8qWNerW1rN0s4zAF6oEa+Zm7UzM+PwTxbGdufvnR3Gcp2M0bcfoEPk9V+RgTxmzGNNELxmrMHloPL4LV5BZu3Q==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-dialog": "~8.5.0", + "rc-util": "^5.0.6" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "rc-input-number": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.0.1.tgz", + "integrity": "sha512-LOPEwhEjkJzDd+0mOMNZdRKjEsZJOXVxmNr3sfiONu9PUCRf366GDlARh+AcSd/jWvFzEa070wpr2gg0i/5BfQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + } + }, + "rc-mentions": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.5.3.tgz", + "integrity": "sha512-NG/KB8YiKBCJPHHvr/QapAb4f9YzLJn7kDHtmI1K6t7ZMM5YgrjIxNNhoRKKP9zJvb9PdPts69Hbg4ZMvLVIFQ==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-menu": "^8.0.1", + "rc-textarea": "^0.3.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.0.1" + } + }, + "rc-menu": { + "version": "8.10.6", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-8.10.6.tgz", + "integrity": "sha512-RVkd8XChwSmVOdNULbqLNnABthRZWnhqct1Q74onEXTClsXvsLADMhlIJtw/umglVSECM+14TJdIli9rl2Bzlw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "mini-store": "^3.0.1", + "rc-motion": "^2.0.1", + "rc-trigger": "^5.1.2", + "rc-util": "^5.7.0", + "resize-observer-polyfill": "^1.5.0", + "shallowequal": "^1.1.0" + } + }, + "rc-motion": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.1.tgz", + "integrity": "sha512-TWLvymfMu8SngPx5MDH8dQ0D2RYbluNTfam4hY/dNNx9RQ3WtGuZ/GXHi2ymLMzH+UNd6EEFYkOuR5JTTtm8Xg==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.2.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "rc-notification": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.5.5.tgz", + "integrity": "sha512-YIfhTSw+h5GsSdgMnuMx24wqiPlg3FeamuOlkh9RkyHx+SeZVAKzQ0juy2NGvPEF2hDWi5xTqxUqLdo0L2AmGg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.2.0", + "rc-util": "^5.0.1" + } + }, + "rc-overflow": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.0.2.tgz", + "integrity": "sha512-GXj4DAyNxm4f57LvXLwhJaZoJHzSge2l2lQq64MZP7NJAfLpQqOLD+v9JMV9ONTvDPZe8kdzR+UMmkAn7qlzFA==", + "requires": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.5.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "rc-pagination": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.1.4.tgz", + "integrity": "sha512-6nFsNXGfBb6Hh3SNeTHuEaAWiq33PdDA4rdi2Ba2LIri6XUeOCmWLFPUwZyx+NJn+ODGCxsl5BEVcfLbNsxtGg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1" + } + }, + "rc-picker": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.5.7.tgz", + "integrity": "sha512-b5ZWCKds1u4H9fP0EpJ8YUX16VhueK6E7TxgK+rRjpbKwI1bOUy59F/OkUXjdACJdDmbsDMDZogpW7KzoqtzvA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "date-fns": "^2.15.0", + "moment": "^2.24.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.4.0", + "shallowequal": "^1.1.0" + } + }, + "rc-progress": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.1.3.tgz", + "integrity": "sha512-Jl4fzbBExHYMoC6HBPzel0a9VmhcSXx24LVt/mdhDM90MuzoMCJjXZAlhA0V0CJi+SKjMhfBoIQ6Lla1nD4QNw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6" + } + }, + "rc-rate": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.1.tgz", + "integrity": "sha512-MmIU7FT8W4LYRRHJD1sgG366qKtSaKb67D0/vVvJYR0lrCuRrCiVQ5qhfT5ghVO4wuVIORGpZs7ZKaYu+KMUzA==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + } + }, + "rc-resize-observer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz", + "integrity": "sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.0.0", + "resize-observer-polyfill": "^1.5.1" + } + }, + "rc-select": { + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-12.1.5.tgz", + "integrity": "sha512-UElTMw0+XvYJmVfsHTWvLR42RKNf5qyN3Ed/JfuZQceIPK1/3ugGRjdEOKBsPmPyNB5389NAROCV4tQd9fmqwg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.0.0", + "rc-trigger": "^5.0.4", + "rc-util": "^5.0.1", + "rc-virtual-list": "^3.2.0" + } + }, + "rc-slider": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.7.1.tgz", + "integrity": "sha512-r9r0dpFA3PEvxBhIfVi1lVzxuSogWxeY+tGvi2AqMM1rPgaOXQ7WbtT+9kVFkJ9K8TntA/vYPgiCCKfN29KTkw==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-tooltip": "^5.0.1", + "rc-util": "^5.0.0", + "shallowequal": "^1.1.0" + } + }, + "rc-steps": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-4.1.3.tgz", + "integrity": "sha512-GXrMfWQOhN3sVze3JnzNboHpQdNHcdFubOETUHyDpa/U3HEKBZC3xJ8XK4paBgF4OJ3bdUVLC+uBPc6dCxvDYA==", + "requires": { + "@babel/runtime": "^7.10.2", + "classnames": "^2.2.3", + "rc-util": "^5.0.1" + } + }, + "rc-switch": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz", + "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.0.1" + } + }, + "rc-table": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.13.1.tgz", + "integrity": "sha512-zg2ldSRHj1ENGsSykSKV5axnWkSaaly+wjRcD1Bspx4WHrf3m/I1WYjpVvOeer2e06bfKb6lmkK0HLxQ1cZtsg==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.4.0", + "shallowequal": "^1.1.0" + } + }, + "rc-tabs": { + "version": "11.7.3", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.7.3.tgz", + "integrity": "sha512-5nd2NVss9TprPRV9r8N05SjQyAE7zDrLejxFLcbJ+BdLxSwnGnk3ws/Iq0smqKZUnPQC0XEvnpF3+zlllUUT2w==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "^3.1.3", + "rc-menu": "^8.6.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.5.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } + }, + "rc-textarea": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.3.4.tgz", + "integrity": "sha512-ILUYx831ZukQPv3m7R4RGRtVVWmL1LV4ME03L22mvT56US0DGCJJaRTHs4vmpcSjFHItph5OTmhodY4BOwy81A==", + "requires": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.7.0" + } + }, + "rc-tooltip": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.0.tgz", + "integrity": "sha512-pFqD1JZwNIpbdcefB7k5xREoHAWM/k3yQwYF0iminbmDXERgq4rvBfUwIvlCqqZSM7HDr9hYeYr6ZsVNaKtvCQ==", "requires": { - "performance-now": "^2.1.0" + "@babel/runtime": "^7.11.2", + "rc-trigger": "^5.0.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } } }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "rc-tree": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-4.1.5.tgz", + "integrity": "sha512-q2vjcmnBDylGZ9/ZW4F9oZMKMJdbFWC7um+DAQhZG1nqyg1iwoowbBggUDUaUOEryJP+08bpliEAYnzJXbI5xQ==", "requires": { - "safe-buffer": "^5.1.0" + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.0.0", + "rc-virtual-list": "^3.0.1" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "rc-tree-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-4.3.0.tgz", + "integrity": "sha512-EEXB9dKBsJNJuKIU5NERZsaJ71GDGIj5uWLl7A4XiYr2jXM4JICfScvvp3O5jHMDfhqmgpqNc0z90mHkgh3hKg==", "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "^12.0.0", + "rc-tree": "^4.0.0", + "rc-util": "^5.0.5" } }, - "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==" + "rc-trigger": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.3.tgz", + "integrity": "sha512-6Fokao07HUbqKIDkDRFEM0AGZvsvK0Fbp8A/KFgl1ngaqfO1nY037cISCG1Jm5fxImVsXp9awdkP7Vu5cxjjog==", + "requires": { + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-align": "^4.0.0", + "rc-motion": "^2.0.0", + "rc-util": "^5.5.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + } + } }, - "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==", + "rc-upload": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.0.1.tgz", + "integrity": "sha512-h7iLt22U0C2ObpqTU7MDoAV/FDwHTUEFjMd6uidA4ipoJ7gP7C74gOQOtl5OPQTVUDATUndnSAt9uyC1znlo9A==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + } + }, + "rc-util": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.8.1.tgz", + "integrity": "sha512-kXV/QjL+azh3AxMk68gm8+nltVoL6bjeJJULAZLRCLus2Fhvo/aaMZokxYov/E0dbfjo31I78pF4yVljqQB7bA==", + "requires": { + "@babel/runtime": "^7.12.5", + "react-is": "^16.12.0", + "shallowequal": "^1.1.0" }, "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } } } }, + "rc-virtual-list": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.2.6.tgz", + "integrity": "sha512-8FiQLDzm3c/tMX0d62SQtKDhLH7zFlSI6pWBAPt+TUntEqd3Lz9zFAmpvTu8gkvUom/HCsDSZs4wfV4wDPWC0Q==", + "requires": { + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.0.7" + } + }, "react": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz", - "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -12758,204 +16821,276 @@ } }, "react-app-polyfill": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.5.tgz", - "integrity": "sha512-RcbV6+msbvZJZUIK/LX3UafPtoaDSJgUWu4sqBxHKTVmBsnlU2QWCKJRBRmgjxu+ivW/GPINbPWRM4Ppa6Lbgw==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-0.2.2.tgz", + "integrity": "sha512-mAYn96B/nB6kWG87Ry70F4D4rsycU43VYTj3ZCbKP+SLJXwC0x6YCbwcICh3uW8/C9s1VgP197yx+w7SCWeDdQ==", + "requires": { + "core-js": "2.6.4", + "object-assign": "4.1.1", + "promise": "8.0.2", + "raf": "3.4.1", + "whatwg-fetch": "3.0.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.4.tgz", + "integrity": "sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A==" + } + } + }, + "react-cookie": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-4.0.3.tgz", + "integrity": "sha512-cmi6IpdVgTSvjqssqIEvo779Gfqc4uPGHRrKMEdHcqkmGtPmxolGfsyKj95bhdLEKqMdbX8MLBCwezlnhkHK0g==", "requires": { - "core-js": "^3.4.1", - "object-assign": "^4.1.1", - "promise": "^8.0.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.3", - "whatwg-fetch": "^3.0.0" + "@types/hoist-non-react-statics": "^3.0.1", + "hoist-non-react-statics": "^3.0.0", + "universal-cookie": "^4.0.0" } }, "react-dev-utils": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-10.0.0.tgz", - "integrity": "sha512-8OKSJvl8ccXJDNf0YGw377L9v1OnT16skD/EuZWm0M/yr255etP4x4kuUCT1EfFfJ7Rhc4ZTpPTfPrvgiXa50Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-8.0.0.tgz", + "integrity": "sha512-TK8cj7eghvxfe7bfBluLGpI/upo4EXC+G74hYmPucAG8C2XcbT+vKnlWPwLnABb75Zk+mR6D556Da+yvDjljrw==", "requires": { - "@babel/code-frame": "7.5.5", - "address": "1.1.2", - "browserslist": "4.7.3", + "@babel/code-frame": "7.0.0", + "address": "1.0.3", + "browserslist": "4.4.1", "chalk": "2.4.2", "cross-spawn": "6.0.5", "detect-port-alt": "1.1.6", "escape-string-regexp": "1.0.5", "filesize": "3.6.1", "find-up": "3.0.0", - "fork-ts-checker-webpack-plugin": "3.1.0", + "fork-ts-checker-webpack-plugin": "1.0.0-alpha.6", "global-modules": "2.0.0", "globby": "8.0.2", - "gzip-size": "5.1.1", + "gzip-size": "5.0.0", "immer": "1.10.0", - "inquirer": "6.5.0", - "is-root": "2.1.0", + "inquirer": "6.2.1", + "is-root": "2.0.0", "loader-utils": "1.2.3", - "open": "^7.0.0", + "opn": "5.4.0", "pkg-up": "2.0.0", - "react-error-overlay": "^6.0.4", + "react-error-overlay": "^5.1.4", "recursive-readdir": "2.2.2", - "shell-quote": "1.7.2", - "strip-ansi": "5.2.0", + "shell-quote": "1.6.1", + "sockjs-client": "1.3.0", + "strip-ansi": "5.0.0", "text-table": "0.2.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", "requires": { "@babel/highlight": "^7.0.0" } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" - }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "browserslist": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.3.tgz", - "integrity": "sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ==", - "requires": { - "caniuse-lite": "^1.0.30001010", - "electron-to-chromium": "^1.3.306", - "node-releases": "^1.1.40" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz", + "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "caniuse-lite": "^1.0.30000929", + "electron-to-chromium": "^1.3.103", + "node-releases": "^1.1.3" } }, - "cli-cursor": { + "emojis-list": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "^2.0.0" - } + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "escape-string-regexp": "^1.0.5" + "locate-path": "^3.0.0" } }, "inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "external-editor": "^3.0.3", + "external-editor": "^3.0.0", "figures": "^2.0.0", - "lodash": "^4.17.12", + "lodash": "^4.17.10", "mute-stream": "0.0.7", "run-async": "^2.2.0", - "rxjs": "^6.4.0", + "rxjs": "^6.1.0", "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^5.0.0", "through": "^2.3.6" } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { - "mimic-fn": "^1.0.0" + "p-try": "^2.0.0" } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "p-limit": "^2.0.0" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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==" + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } + "ansi-regex": "^4.0.0" } } } }, "react-dom": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz", - "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.18.0" + "scheduler": "^0.19.1" + } + }, + "react-dropdown": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/react-dropdown/-/react-dropdown-1.9.0.tgz", + "integrity": "sha512-BDApCUhs0qHqnFW3b54SuqI200FOOsmiy0dejdmtdTn/MMY11jcou3CLX1oT2Qa1PdN7viTyAGT8YCpK5qb9xg==", + "requires": { + "classnames": "^2.2.3" + } + }, + "react-dropdown-select": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/react-dropdown-select/-/react-dropdown-select-4.7.1.tgz", + "integrity": "sha512-yoF39vFN+F2TaRK1EXnhiz+8jyv40E7+MRUD/X/UsMr2dnYFWoFMMrTIVXcjVnDCFlU+yAvZYRqb+8b60bUuyw==", + "requires": { + "@emotion/core": "^10.0.27", + "@emotion/styled": "^10.0.27" + } + }, + "react-easy-crop": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-2.1.2.tgz", + "integrity": "sha512-LHXQFyJVXGMgmjSzX1KMeX1uE/dI26O2608DsrlCDwRKOkaS7Kb6pQjeS30efGfzrRkUD5Qff+ANxhaPO+pVNg==", + "requires": { + "@emotion/core": "^10.0.27", + "@emotion/styled": "^10.0.27", + "tslib": "1.11.2" } }, "react-easy-swipe": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/react-easy-swipe/-/react-easy-swipe-0.0.16.tgz", - "integrity": "sha1-Wj2Umo+XXQW+kqgYJUMV0TGKgeo=", + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/react-easy-swipe/-/react-easy-swipe-0.0.21.tgz", + "integrity": "sha512-OeR2jAxdoqUMHIn/nS9fgreI5hSpgGoL5ezdal4+oO7YSSgJR8ga+PkYGJrSrJ9MKlPcQjMQXnketrD7WNmNsg==", "requires": { "prop-types": "^15.5.8" } }, "react-error-overlay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.4.tgz", - "integrity": "sha512-ueZzLmHltszTshDMwyfELDq8zOA803wQ1ZuzCccXa1m57k1PxSHfflPD5W9YIiTXLs0JTLzoj6o1LuM5N6zzNA==" + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz", + "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" + }, + "react-event-listener": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.6.tgz", + "integrity": "sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==", + "requires": { + "@babel/runtime": "^7.2.0", + "prop-types": "^15.6.0", + "warning": "^4.0.1" + } + }, + "react-fine-uploader": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/react-fine-uploader/-/react-fine-uploader-1.1.1.tgz", + "integrity": "sha512-aUOZO3Wr8OynK2LyF2QMPHSe6gWSonNyk/hgo6olBRim92T/sa07pcy/sR2ljucrv9IaJC61Qb8ZGGfcs/I82A==", + "requires": { + "fine-uploader-wrappers": "^1.0.1", + "object-assign": "4.1.1", + "react-transition-group": "2.x" + }, + "dependencies": { + "dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "requires": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + } + } }, "react-google-login": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/react-google-login/-/react-google-login-5.0.7.tgz", - "integrity": "sha512-e/OU8PcvtVetD73hZ9/g4k4K3GrOHb0bTXU1i2xZBzSCCfDY/QW6M7oQpwvPwyZ3C3clz0YWUFJkxX65PSdgQg==", + "version": "5.1.25", + "resolved": "https://registry.npmjs.org/react-google-login/-/react-google-login-5.1.25.tgz", + "integrity": "sha512-N7SZkjTEX9NsC3hywXs68SPJWAHo6M19Bs1OIFPirG0yomGF7KnbKjSqoiIfxz1V7fKAt8bkfBAzogwnGWYTeQ==", "requires": { "@types/react": "*", "prop-types": "^15.6.0" @@ -12970,17 +17105,46 @@ } }, "react-icons": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-3.8.0.tgz", - "integrity": "sha512-rA/8GRKjPulft8BSBSMsHkE1AGPqJ7LjNsyk0BE7XjG70Iz62zOled2SJk7LDo8x9z86a3xOstDlKlMZ4pAy7A==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-3.11.0.tgz", + "integrity": "sha512-JRgiI/vdF6uyBgyZhVyYJUZAop95Sy4XDe/jmT3R/bKliFWpO/uZBwvSjWEdxwzec7SYbEPNPck0Kff2tUGM2Q==", "requires": { "camelcase": "^5.0.0" } }, + "react-image-crop": { + "version": "8.6.6", + "resolved": "https://registry.npmjs.org/react-image-crop/-/react-image-crop-8.6.6.tgz", + "integrity": "sha512-2iQHKp12dYb6Fu2iN/Mg19BeLMgrbdOuKkU9k0RH7CHX6ZZylOlhfCM3/RsECbKnjGJRtGpXniGF+/i9CGis1A==", + "requires": { + "clsx": "^1.1.1", + "core-js": "^3.6.5", + "prop-types": "^15.7.2" + } + }, + "react-input-mask": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-input-mask/-/react-input-mask-2.0.4.tgz", + "integrity": "sha512-1hwzMr/aO9tXfiroiVCx5EtKohKwLk/NT8QlJXHQ4N+yJJFyUuMT+zfTpLBwX/lK3PkuMlievIffncpMZ3HGRQ==", + "requires": { + "invariant": "^2.2.4", + "warning": "^4.0.2" + } + }, "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-moment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/react-moment/-/react-moment-1.0.0.tgz", + "integrity": "sha512-J4iIiwUT4oZcL7cp2U7naQKbQtqvmzGXXBMg/DLj+Pi7n9EW0VhBRx/1aJ1Tp2poCqTCAPoadLEoUIkReGnNNg==" }, "react-recaptcha": { "version": "2.3.10", @@ -12988,25 +17152,25 @@ "integrity": "sha512-IyanbozsYCuHvTYDuskZTIEcRAMG/sdvAu5b29iQWoC8Kd3Zk9WGCv2oNxh6RfGHvSvgHAyaLjmC6ei/yMsJ7g==" }, "react-responsive-carousel": { - "version": "3.1.51", - "resolved": "https://registry.npmjs.org/react-responsive-carousel/-/react-responsive-carousel-3.1.51.tgz", - "integrity": "sha512-hb74s8Cj9g3ppNxQeDwsIekTp2EOFO2MdmYXKIqjFS3oMHQE9Fg1lKn4j5tiIhAQAKQlNgy6hfqeS2aIO/Sicg==", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/react-responsive-carousel/-/react-responsive-carousel-3.2.10.tgz", + "integrity": "sha512-O8MV2LoR07BttvWaXesyWkE6s8xRW6p6HiMkelZ3TuPYQwKnlw+fYtZN+bQ3/1jg0D5JQGATY4Hnw/4WEXHnag==", "requires": { "classnames": "^2.2.5", "prop-types": "^15.5.8", - "react-easy-swipe": "^0.0.16" + "react-easy-swipe": "^0.0.21" } }, "react-router": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", - "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", "requires": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", "hoist-non-react-statics": "^3.1.0", "loose-envify": "^1.3.1", - "mini-create-react-context": "^0.3.0", + "mini-create-react-context": "^0.4.0", "path-to-regexp": "^1.7.0", "prop-types": "^15.6.2", "react-is": "^16.6.0", @@ -13015,93 +17179,121 @@ } }, "react-router-dom": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.2.tgz", - "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", "requires": { "@babel/runtime": "^7.1.2", "history": "^4.9.0", "loose-envify": "^1.3.1", "prop-types": "^15.6.2", - "react-router": "5.1.2", + "react-router": "5.2.0", "tiny-invariant": "^1.0.2", "tiny-warning": "^1.0.0" } }, + "react-router-hash-link": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/react-router-hash-link/-/react-router-hash-link-2.3.1.tgz", + "integrity": "sha512-QVYLaBLmRGovSbQv4Tbjqnl9JMEQ8c5rWebkZU16ovgZtpmNIf2znGj3uWaKkAL7lhuYBPcC3OAfhw7lk/QwNw==", + "requires": { + "prop-types": "^15.7.2" + } + }, "react-scripts": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.3.0.tgz", - "integrity": "sha512-hzPc6bxCc9GnsspWqk494c2Gpd0dRbk/C8q76BNQIENi9GMwoxFljOEcZoZcpFpJgQ45alxFR6QaLt+51qie7g==", - "requires": { - "@babel/core": "7.7.4", - "@svgr/webpack": "4.3.3", - "@typescript-eslint/eslint-plugin": "^2.8.0", - "@typescript-eslint/parser": "^2.8.0", - "babel-eslint": "10.0.3", - "babel-jest": "^24.9.0", - "babel-loader": "8.0.6", - "babel-plugin-named-asset-import": "^0.3.5", - "babel-preset-react-app": "^9.1.0", - "camelcase": "^5.3.1", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-2.1.8.tgz", + "integrity": "sha512-mDC8fYWCyuB9VROti8OCPdHE79UEchVVZmuS/yaIs47VkvZpgZqUvzghYBswZRchqnW0aARNY8xXrzoFRhhK7A==", + "requires": { + "@babel/core": "7.2.2", + "@svgr/webpack": "4.1.0", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "9.0.0", + "babel-jest": "23.6.0", + "babel-loader": "8.0.5", + "babel-plugin-named-asset-import": "^0.3.1", + "babel-preset-react-app": "^7.0.2", + "bfj": "6.1.1", "case-sensitive-paths-webpack-plugin": "2.2.0", - "css-loader": "3.2.0", - "dotenv": "8.2.0", - "dotenv-expand": "5.1.0", - "eslint": "^6.6.0", - "eslint-config-react-app": "^5.1.0", - "eslint-loader": "3.0.2", - "eslint-plugin-flowtype": "3.13.0", - "eslint-plugin-import": "2.18.2", - "eslint-plugin-jsx-a11y": "6.2.3", - "eslint-plugin-react": "7.16.0", - "eslint-plugin-react-hooks": "^1.6.1", - "file-loader": "4.3.0", - "fs-extra": "^8.1.0", - "fsevents": "2.1.2", - "html-webpack-plugin": "4.0.0-beta.5", + "css-loader": "1.0.0", + "dotenv": "6.0.0", + "dotenv-expand": "4.2.0", + "eslint": "5.12.0", + "eslint-config-react-app": "^3.0.8", + "eslint-loader": "2.1.1", + "eslint-plugin-flowtype": "2.50.1", + "eslint-plugin-import": "2.14.0", + "eslint-plugin-jsx-a11y": "6.1.2", + "eslint-plugin-react": "7.12.4", + "file-loader": "2.0.0", + "fs-extra": "7.0.1", + "fsevents": "1.2.4", + "html-webpack-plugin": "4.0.0-alpha.2", "identity-obj-proxy": "3.0.0", - "jest": "24.9.0", - "jest-environment-jsdom-fourteen": "0.1.0", - "jest-resolve": "24.9.0", - "jest-watch-typeahead": "0.4.2", - "mini-css-extract-plugin": "0.8.0", - "optimize-css-assets-webpack-plugin": "5.0.3", - "pnp-webpack-plugin": "1.5.0", + "jest": "23.6.0", + "jest-pnp-resolver": "1.0.2", + "jest-resolve": "23.6.0", + "jest-watch-typeahead": "^0.2.1", + "mini-css-extract-plugin": "0.5.0", + "optimize-css-assets-webpack-plugin": "5.0.1", + "pnp-webpack-plugin": "1.2.1", "postcss-flexbugs-fixes": "4.1.0", "postcss-loader": "3.0.0", - "postcss-normalize": "8.0.1", - "postcss-preset-env": "6.7.0", + "postcss-preset-env": "6.5.0", "postcss-safe-parser": "4.0.1", - "react-app-polyfill": "^1.0.5", - "react-dev-utils": "^10.0.0", - "resolve": "1.12.2", - "resolve-url-loader": "3.1.1", - "sass-loader": "8.0.0", - "semver": "6.3.0", - "style-loader": "1.0.0", - "terser-webpack-plugin": "2.2.1", - "ts-pnp": "1.1.5", - "url-loader": "2.3.0", - "webpack": "4.41.2", - "webpack-dev-server": "3.9.0", - "webpack-manifest-plugin": "2.2.0", - "workbox-webpack-plugin": "4.3.1" + "react-app-polyfill": "^0.2.2", + "react-dev-utils": "^8.0.0", + "resolve": "1.10.0", + "sass-loader": "7.1.0", + "style-loader": "0.23.1", + "terser-webpack-plugin": "1.2.2", + "url-loader": "1.1.2", + "webpack": "4.28.3", + "webpack-dev-server": "3.1.14", + "webpack-manifest-plugin": "2.0.4", + "workbox-webpack-plugin": "3.6.3" }, "dependencies": { "eslint-plugin-react": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz", - "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==", + "version": "7.12.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz", + "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==", "requires": { "array-includes": "^3.0.3", "doctrine": "^2.1.0", "has": "^1.0.3", - "jsx-ast-utils": "^2.2.1", - "object.entries": "^1.1.0", + "jsx-ast-utils": "^2.0.1", "object.fromentries": "^2.0.0", - "object.values": "^1.1.0", - "prop-types": "^15.7.2", - "resolve": "^1.12.0" + "prop-types": "^15.6.2", + "resolve": "^1.9.0" + } + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "terser-webpack-plugin": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz", + "integrity": "sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==", + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.16.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" } } } @@ -13116,10 +17308,89 @@ "react": "^16.1.0" } }, + "react-swipeable-views": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/react-swipeable-views/-/react-swipeable-views-0.13.9.tgz", + "integrity": "sha512-WXC2FKYvZ9QdJ31v9LjEJEl1bA7E4AcaloTkbW0uU0dYf5uvv4aOpiyxubvOkVl1a5L2UAHmKSif4TmJ9usrSg==", + "requires": { + "@babel/runtime": "7.0.0", + "prop-types": "^15.5.4", + "react-swipeable-views-core": "^0.13.7", + "react-swipeable-views-utils": "^0.13.9", + "warning": "^4.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + } + } + }, + "react-swipeable-views-core": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/react-swipeable-views-core/-/react-swipeable-views-core-0.13.7.tgz", + "integrity": "sha512-ekn9oDYfBt0oqJSGGwLEhKvn+QaqMGTy//9dURTLf+vp7W5j6GvmKryYdnwJCDITaPFI2hujXV4CH9krhvaE5w==", + "requires": { + "@babel/runtime": "7.0.0", + "warning": "^4.0.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + } + } + }, + "react-swipeable-views-utils": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.9.tgz", + "integrity": "sha512-QLGxRKrbJCbWz94vkWLzb1Daaa2Y/TZKmsNKQ6WSNrS+chrlfZ3z9tqZ7YUJlW6pRWp3QZdLSY3UE3cN0TXXmw==", + "requires": { + "@babel/runtime": "7.0.0", + "keycode": "^2.1.7", + "prop-types": "^15.6.0", + "react-event-listener": "^0.6.0", + "react-swipeable-views-core": "^0.13.7", + "shallow-equal": "^1.2.1" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", + "integrity": "sha512-7hGhzlcmg01CvH1EHdSPVXYX1aJ8KCEyz6I9xYIi/asDtzBPMyMhVibhM/K6g/5qnKBwjZtp10bNZIEFTRW1MA==", + "requires": { + "regenerator-runtime": "^0.12.0" + } + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==" + } + } + }, "react-transition-group": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", - "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.1.tgz", + "integrity": "sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==", "requires": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -13127,44 +17398,73 @@ "prop-types": "^15.6.2" } }, + "react-window": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz", + "integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==", + "requires": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + } + }, "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "requires": { - "load-json-file": "^4.0.0", + "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + } } }, "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + } } }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "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" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdirp": { @@ -13175,6 +17475,286 @@ "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "realpath-native": { @@ -13194,29 +17774,38 @@ } }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==" }, "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "requires": { "regenerate": "^1.4.0" } }, "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" }, "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "requires": { + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "requires": { - "private": "^0.1.6" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -13228,11 +17817,6 @@ "safe-regex": "^1.1.0" } }, - "regex-parser": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", - "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" - }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", @@ -13243,32 +17827,32 @@ } }, "regexpp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", - "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" }, "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "requires": { "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz", - "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "requires": { "jsesc": "~0.5.0" }, @@ -13302,11 +17886,6 @@ "utila": "^0.4.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -13331,14 +17910,6 @@ "dom-serializer": "0", "domelementtype": "1" } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } } } }, @@ -13352,10 +17923,18 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -13364,7 +17943,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -13374,24 +17953,15 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -13419,19 +17989,24 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "resolve": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.2.tgz", - "integrity": "sha512-cAVTI2VLHWYsGOirfeYVVQ7ZDejtQ9fp4YhYckWDEkFfqbVjaT11iM8k6xSAfGFMM+gDpZjMnFssPu8we+mqFw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "requires": { "path-parse": "^1.0.6" } @@ -13442,12 +18017,19 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "requires": { "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" }, "resolve-pathname": { "version": "3.0.0", @@ -13459,74 +18041,12 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, - "resolve-url-loader": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", - "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", - "requires": { - "adjust-sourcemap-loader": "2.0.0", - "camelcase": "5.3.1", - "compose-function": "3.0.3", - "convert-source-map": "1.7.0", - "es6-iterator": "2.0.3", - "loader-utils": "1.2.3", - "postcss": "7.0.21", - "rework": "1.0.1", - "rework-visit": "1.0.0", - "source-map": "0.6.1" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "onetime": "^5.1.0", + "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, @@ -13535,32 +18055,6 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" - } - } - }, - "rework-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", - "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" - }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -13589,17 +18083,14 @@ } }, "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "run-queue": { "version": "1.0.3", @@ -13610,17 +18101,17 @@ } }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "requires": { "tslib": "^1.9.0" } }, "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==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safe-regex": { "version": "1.1.0", @@ -13636,46 +18127,304 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", "requires": { - "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", "micromatch": "^3.1.4", "minimist": "^1.1.1", - "walker": "~1.0.5" + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } } }, - "sanitize.css": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-10.0.0.tgz", - "integrity": "sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg==" - }, "sass-loader": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.0.tgz", - "integrity": "sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", + "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.1.0", - "semver": "^6.3.0" + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.0" }, "dependencies": { "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", "requires": { + "for-own": "^1.0.0", "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + } + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" } }, "kind-of": { @@ -13683,12 +18432,26 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", "requires": { - "kind-of": "^6.0.2" + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } } } } @@ -13698,30 +18461,31 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "requires": { - "xmlchars": "^2.1.1" - } - }, "scheduler": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz", - "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" } }, "schema-utils": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", - "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "scroll-into-view-if-needed": { + "version": "2.2.27", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.27.tgz", + "integrity": "sha512-BKiRstRm4u1bZvw+Wu9TxXhyMZ9fskb/9fbuSGuRzwHhlbKlDetL4dBdYaPfQbEFTttQmpkNtFH7sQpk4rZf9w==", + "requires": { + "compute-scroll-into-view": "^1.0.16" } }, "select-hose": { @@ -13730,17 +18494,24 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "requires": { - "node-forge": "0.9.0" + "node-forge": "^0.10.0" + }, + "dependencies": { + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + } } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "send": { "version": "0.17.1", @@ -13781,13 +18552,18 @@ "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==" } } }, "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" }, "serve-index": { "version": "1.9.1", @@ -13822,10 +18598,10 @@ "statuses": ">= 1.4.0 < 2" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "setprototypeof": { "version": "1.1.0", @@ -13916,6 +18692,16 @@ } } }, + "shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -13930,19 +18716,90 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, + "side-channel": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", + "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", + "dev": true, + "requires": { + "es-abstract": "^1.18.0-next.0", + "object-inspect": "^1.8.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } + } + }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simple-swizzle": { "version": "0.2.2", @@ -13950,24 +18807,17 @@ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "requires": { "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } } }, "sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==" }, "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "slice-ansi": { "version": "2.1.0", @@ -13977,13 +18827,6 @@ "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - } } }, "snapdragon": { @@ -14024,11 +18867,6 @@ "requires": { "is-extendable": "^0.1.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -14098,12 +18936,27 @@ "requires": { "faye-websocket": "^0.10.0", "uuid": "^3.0.1" + }, + "dependencies": { + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } } }, "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", "requires": { "debug": "^3.2.5", "eventsource": "^1.0.7", @@ -14121,24 +18974,13 @@ "ms": "^2.1.1" } }, - "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" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "^1.0.0" - } - }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -14156,25 +18998,17 @@ "requires": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "^0.5.6" } }, "source-map-url": { @@ -14183,23 +19017,23 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -14211,15 +19045,30 @@ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "spdy-transport": { @@ -14235,15 +19084,18 @@ "wbuf": "^1.7.3" }, "dependencies": { - "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -14277,12 +19129,11 @@ } }, "ssri": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", - "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "requires": { - "figgy-pudding": "^3.5.1", - "minipass": "^3.1.1" + "figgy-pudding": "^3.5.1" } }, "stable": { @@ -14336,6 +19187,35 @@ "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "stream-each": { @@ -14357,6 +19237,35 @@ "readable-stream": "^2.3.6", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "stream-shift": { @@ -14364,10 +19273,10 @@ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + "string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c=" }, "string-length": { "version": "2.0.0", @@ -14394,49 +19303,123 @@ } }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^3.0.0" } } } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "string.prototype.matchall": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.3.tgz", + "integrity": "sha512-OBxYDA2ifZQ2e13cP82dWFMaCV9CGF8GzmN4fljBVw5O5wep0lu4gacm1OL6MjROoUnB8VbkWRThqkV2YFLNxw==", + "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "es-abstract": "^1.18.0-next.1", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.3" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + } } }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "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", - "function-bind": "^1.1.1" + "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "stringify-object": { @@ -14447,27 +19430,30 @@ "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + } } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } + "ansi-regex": "^2.0.0" } }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } }, "strip-comments": { "version": "1.0.2", @@ -14484,17 +19470,17 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "style-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", - "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.0.1" + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" } }, "styled-components": { @@ -14527,15 +19513,38 @@ "postcss-selector-parser": "^3.0.0" }, "dependencies": { + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { - "dot-prop": "^4.1.1", + "dot-prop": "^5.2.0", "indexes-of": "^1.0.1", "uniq": "^1.0.1" } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -14558,9 +19567,9 @@ } }, "svg-parser": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", - "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "svgo": { "version": "1.3.2", @@ -14580,8 +19589,24 @@ "stable": "^0.1.8", "unquote": "~1.1.1", "util.promisify": "~1.0.0" + }, + "dependencies": { + "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==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } } }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -14598,15 +19623,10 @@ "string-width": "^3.0.0" }, "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "string-width": { "version": "3.1.0", @@ -14617,6 +19637,14 @@ "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } } } }, @@ -14626,109 +19654,118 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "terser": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", - "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", "requires": { - "commander": "^2.20.0", + "commander": "^2.19.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map-support": "~0.5.10" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } } } }, "terser-webpack-plugin": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.2.1.tgz", - "integrity": "sha512-jwdauV5Al7zopR6OAYvIIRcxXCSvLjZjr7uZE8l2tIWb/ryrGN48sJftqGf5k9z09tWhajx53ldp0XPI080YnA==", - "requires": { - "cacache": "^13.0.1", - "find-cache-dir": "^3.0.0", - "jest-worker": "^24.9.0", - "schema-utils": "^2.5.0", - "serialize-javascript": "^2.1.0", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", - "terser": "^4.3.9", - "webpack-sources": "^1.4.3" + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" }, "dependencies": { - "find-cache-dir": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", - "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.0", - "pkg-dir": "^4.1.0" + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "randombytes": "^2.1.0" } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, - "make-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", - "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "requires": { - "semver": "^6.0.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "requires": { - "p-limit": "^2.2.0" + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" } }, - "path-exists": { + "y18n": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "requires": { - "find-up": "^4.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" } } }, "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" } }, "text-hex": { @@ -14758,6 +19795,35 @@ "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "thunky": { @@ -14784,9 +19850,9 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, "tiny-invariant": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", - "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" }, "tiny-warning": { "version": "1.0.3", @@ -14842,13 +19908,36 @@ "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + } + } } }, + "toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "topo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/topo/-/topo-2.0.2.tgz", + "integrity": "sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI=", + "requires": { + "hoek": "4.x.x" + } + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -14876,23 +19965,20 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, "ts-pnp": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz", - "integrity": "sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" - }, - "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", - "requires": { - "tslib": "^1.8.1" - } + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", + "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==" }, "tty-browserify": { "version": "0.0.0", @@ -14912,11 +19998,6 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -14925,11 +20006,6 @@ "prelude-ls": "~1.1.2" } }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -14945,30 +20021,14 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", - "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==" + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==" }, "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", - "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.5.tgz", + "integrity": "sha1-S1v/+Rhu/7qoiOTJ6UvZ/EyUkp0=" }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", @@ -14985,14 +20045,14 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", - "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" }, "unicode-property-aliases-ecmascript": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", - "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==" }, "union-value": { "version": "1.0.1", @@ -15031,6 +20091,15 @@ "imurmurhash": "^0.1.4" } }, + "universal-cookie": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-4.0.4.tgz", + "integrity": "sha512-lbRVHoOMtItjWbM7TwDLdl8wug7izB0tq3/YVKhT/ahB4VDvWMyvnADfnJI8y6fSvsjh51Ix7lTGC6Tn4rMPhw==", + "requires": { + "@types/cookie": "^0.3.3", + "cookie": "^0.4.0" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -15079,11 +20148,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" } } }, @@ -15127,13 +20191,13 @@ } }, "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" } }, "url-parse": { @@ -15150,18 +20214,23 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, + "use-cookie-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/use-cookie-state/-/use-cookie-state-1.0.0.tgz", + "integrity": "sha512-I76Rg8olmAqUQL3mWnHxfSWaXNhc7UEfjX2frRrFnaCWjoyTxNggL5rE5a4LY1bnhEFOCc2BT3q0ctG6tizz4g==" + }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "requires": { - "inherits": "2.0.1" + "inherits": "2.0.3" }, "dependencies": { "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, @@ -15179,13 +20248,6 @@ "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" - }, - "dependencies": { - "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==" - } } }, "utila": { @@ -15193,20 +20255,20 @@ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" }, + "utils-extend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/utils-extend/-/utils-extend-1.0.8.tgz", + "integrity": "sha1-zP17ZFQPjpDuIe7Fd2nQZRyril8=" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "validate-npm-package-license": { "version": "3.0.4", @@ -15248,21 +20310,11 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", - "requires": { - "browser-process-hrtime": "^0.1.2" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" + "browser-process-hrtime": "^1.0.0" } }, "walker": { @@ -15273,14 +20325,156 @@ "makeerror": "1.0.x" } }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + } + }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", "requires": { - "chokidar": "^2.0.2", + "chokidar": "^3.4.0", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "optional": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "optional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "optional": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" } }, "wbuf": { @@ -15297,308 +20491,427 @@ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, "webpack": { - "version": "4.41.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", - "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.3.tgz", + "integrity": "sha512-vLZN9k5I7Nr/XB1IDG9GbZB4yQd1sPuvufMFgJkx0b31fi2LD97KQIjwjxE7xytdruAYfu5S0FLBLjdxmwGJCg==", + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", + "eslint-scope": "^4.0.0", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.1", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==" + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==" }, - "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "ms": "2.0.0" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" } }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "requires": { - "figgy-pudding": "^3.5.1" + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, - "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" } } } }, "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", + "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", - "range-parser": "^1.2.1", + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", "webpack-log": "^2.0.0" } }, "webpack-dev-server": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.9.0.tgz", - "integrity": "sha512-E6uQ4kRrTX9URN9s/lIbqTAztwEPdvzVrcmHE8EQ9YnuT9J8Es5Wrd8n9BKg1a0oZ5EgEke/EQFgUsp18dSTBw==", + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz", + "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==", "requires": { "ansi-html": "0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.1.8", - "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", - "express": "^4.17.1", - "html-entities": "^1.2.1", - "http-proxy-middleware": "0.19.1", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.18.0", "import-local": "^2.0.0", - "internal-ip": "^4.3.0", + "internal-ip": "^3.0.1", "ip": "^1.1.5", - "is-absolute-url": "^3.0.3", - "killable": "^1.0.1", - "loglevel": "^1.6.4", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.25", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", - "semver": "^6.3.0", - "serve-index": "^1.9.1", + "selfsigned": "^1.9.1", + "semver": "^5.6.0", + "serve-index": "^1.7.2", "sockjs": "0.3.19", - "sockjs-client": "1.4.0", - "spdy": "^4.0.1", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", + "webpack-dev-middleware": "3.4.0", "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "12.0.5" + "yargs": "12.0.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "cliui": { + "camelcase": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, - "is-fullwidth-code-point": { + "decamelize": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "xregexp": "4.0.0" } }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } + "locate-path": "^3.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "requires": { - "ansi-regex": "^2.0.0" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" } }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "has-flag": "^3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } + "p-try": "^2.0.0" } }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "async-limiter": "~1.0.0" + "p-limit": "^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==" + }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", "requires": { "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "decamelize": "^2.0.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^3.0.0", @@ -15608,16 +20921,15 @@ "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "yargs-parser": "^10.1.0" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "camelcase": "^4.1.0" } } } @@ -15629,29 +20941,23 @@ "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } } }, "webpack-manifest-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", - "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.0.4.tgz", + "integrity": "sha512-nejhOHexXDBKQOj/5v5IZSfCeTO3x1Dt1RZEcGfBSul891X/eLIcIVH31gwxPDdsi2Z8LKKFGpM4w9+oTBOSCg==", "requires": { "fs-extra": "^7.0.0", "lodash": ">=3.5 <5", - "object.entries": "^1.1.0", "tapable": "^1.0.0" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } } }, "webpack-sources": { @@ -15671,19 +20977,19 @@ } }, "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "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.4.0 <0.4.11", + "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-encoding": { "version": "1.0.5", @@ -15740,18 +21046,6 @@ "stack-trace": "0.0.x", "triple-beam": "^1.3.0", "winston-transport": "^4.3.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, "winston-transport": { @@ -15761,6 +21055,35 @@ "requires": { "readable-stream": "^2.3.6", "triple-beam": "^1.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "word-wrap": { @@ -15768,50 +21091,54 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, "workbox-background-sync": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", - "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-3.6.3.tgz", + "integrity": "sha512-ypLo0B6dces4gSpaslmDg5wuoUWrHHVJfFWwl1udvSylLdXvnrfhFfriCS42SNEe5lsZtcNZF27W/SMzBlva7Q==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^3.6.3" } }, - "workbox-broadcast-update": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", - "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", + "workbox-broadcast-cache-update": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-broadcast-cache-update/-/workbox-broadcast-cache-update-3.6.3.tgz", + "integrity": "sha512-pJl4lbClQcvp0SyTiEw0zLSsVYE1RDlCPtpKnpMjxFtu8lCFTAEuVyzxp9w7GF4/b3P4h5nyQ+q7V9mIR7YzGg==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^3.6.3" } }, "workbox-build": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", - "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-3.6.3.tgz", + "integrity": "sha512-w0clZ/pVjL8VXy6GfthefxpEXs0T8uiRuopZSFVQ8ovfbH6c6kUpEh6DcYwm/Y6dyWPiCucdyAZotgjz+nRz8g==", "requires": { - "@babel/runtime": "^7.3.4", - "@hapi/joi": "^15.0.0", - "common-tags": "^1.8.0", + "babel-runtime": "^6.26.0", + "common-tags": "^1.4.0", "fs-extra": "^4.0.2", - "glob": "^7.1.3", + "glob": "^7.1.2", + "joi": "^11.1.1", "lodash.template": "^4.4.0", - "pretty-bytes": "^5.1.0", - "stringify-object": "^3.3.0", + "pretty-bytes": "^4.0.2", + "stringify-object": "^3.2.2", "strip-comments": "^1.0.2", - "workbox-background-sync": "^4.3.1", - "workbox-broadcast-update": "^4.3.1", - "workbox-cacheable-response": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-expiration": "^4.3.1", - "workbox-google-analytics": "^4.3.1", - "workbox-navigation-preload": "^4.3.1", - "workbox-precaching": "^4.3.1", - "workbox-range-requests": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1", - "workbox-streams": "^4.3.1", - "workbox-sw": "^4.3.1", - "workbox-window": "^4.3.1" + "workbox-background-sync": "^3.6.3", + "workbox-broadcast-cache-update": "^3.6.3", + "workbox-cache-expiration": "^3.6.3", + "workbox-cacheable-response": "^3.6.3", + "workbox-core": "^3.6.3", + "workbox-google-analytics": "^3.6.3", + "workbox-navigation-preload": "^3.6.3", + "workbox-precaching": "^3.6.3", + "workbox-range-requests": "^3.6.3", + "workbox-routing": "^3.6.3", + "workbox-strategies": "^3.6.3", + "workbox-streams": "^3.6.3", + "workbox-sw": "^3.6.3" }, "dependencies": { "fs-extra": { @@ -15826,107 +21153,99 @@ } } }, - "workbox-cacheable-response": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", - "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", + "workbox-cache-expiration": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-cache-expiration/-/workbox-cache-expiration-3.6.3.tgz", + "integrity": "sha512-+ECNph/6doYx89oopO/UolYdDmQtGUgo8KCgluwBF/RieyA1ZOFKfrSiNjztxOrGJoyBB7raTIOlEEwZ1LaHoA==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^3.6.3" } }, - "workbox-core": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", - "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" - }, - "workbox-expiration": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", - "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "workbox-cacheable-response": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-3.6.3.tgz", + "integrity": "sha512-QpmbGA9SLcA7fklBLm06C4zFg577Dt8u3QgLM0eMnnbaVv3rhm4vbmDpBkyTqvgK/Ly8MBDQzlXDtUCswQwqqg==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^3.6.3" } }, + "workbox-core": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-3.6.3.tgz", + "integrity": "sha512-cx9cx0nscPkIWs8Pt98HGrS9/aORuUcSkWjG25GqNWdvD/pSe7/5Oh3BKs0fC+rUshCiyLbxW54q0hA+GqZeSQ==" + }, "workbox-google-analytics": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", - "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-3.6.3.tgz", + "integrity": "sha512-RQBUo/6SXtIaQTRFj4RQZ9e1gAl7D8oS5S+Hi173Kk70/BgJjzPwXpC5A249Jv5YfkCOLMQCeF9A27BiD0b0ig==", "requires": { - "workbox-background-sync": "^4.3.1", - "workbox-core": "^4.3.1", - "workbox-routing": "^4.3.1", - "workbox-strategies": "^4.3.1" + "workbox-background-sync": "^3.6.3", + "workbox-core": "^3.6.3", + "workbox-routing": "^3.6.3", + "workbox-strategies": "^3.6.3" } }, "workbox-navigation-preload": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", - "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-3.6.3.tgz", + "integrity": "sha512-dd26xTX16DUu0i+MhqZK/jQXgfIitu0yATM4jhRXEmpMqQ4MxEeNvl2CgjDMOHBnCVMax+CFZQWwxMx/X/PqCw==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^3.6.3" } }, "workbox-precaching": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", - "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-3.6.3.tgz", + "integrity": "sha512-aBqT66BuMFviPTW6IpccZZHzpA8xzvZU2OM1AdhmSlYDXOJyb1+Z6blVD7z2Q8VNtV1UVwQIdImIX+hH3C3PIw==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^3.6.3" } }, "workbox-range-requests": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", - "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-3.6.3.tgz", + "integrity": "sha512-R+yLWQy7D9aRF9yJ3QzwYnGFnGDhMUij4jVBUVtkl67oaVoP1ymZ81AfCmfZro2kpPRI+vmNMfxxW531cqdx8A==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^3.6.3" } }, "workbox-routing": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", - "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-3.6.3.tgz", + "integrity": "sha512-bX20i95OKXXQovXhFOViOK63HYmXvsIwZXKWbSpVeKToxMrp0G/6LZXnhg82ijj/S5yhKNRf9LeGDzaqxzAwMQ==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^3.6.3" } }, "workbox-strategies": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", - "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-3.6.3.tgz", + "integrity": "sha512-Pg5eulqeKet2y8j73Yw6xTgLdElktcWExGkzDVCGqfV9JCvnGuEpz5eVsCIK70+k4oJcBCin9qEg3g3CwEIH3g==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^3.6.3" } }, "workbox-streams": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", - "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-3.6.3.tgz", + "integrity": "sha512-rqDuS4duj+3aZUYI1LsrD2t9hHOjwPqnUIfrXSOxSVjVn83W2MisDF2Bj+dFUZv4GalL9xqErcFW++9gH+Z27w==", "requires": { - "workbox-core": "^4.3.1" + "workbox-core": "^3.6.3" } }, "workbox-sw": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", - "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-3.6.3.tgz", + "integrity": "sha512-IQOUi+RLhvYCiv80RP23KBW/NTtIvzvjex28B8NW1jOm+iV4VIu3VXKXTA6er5/wjjuhmtB28qEAUqADLAyOSg==" }, "workbox-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-3.6.3.tgz", + "integrity": "sha512-RwmKjc7HFHUFHoOlKoZUq9349u0QN3F8W5tZZU0vc1qsBZDINWXRiIBCAKvo/Njgay5sWz7z4I2adnyTo97qIQ==", "requires": { - "@babel/runtime": "^7.0.0", + "babel-runtime": "^6.26.0", "json-stable-stringify": "^1.0.1", - "workbox-build": "^4.3.1" - } - }, - "workbox-window": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", - "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", - "requires": { - "workbox-core": "^4.3.1" + "workbox-build": "^3.6.3" } }, "worker-farm": { @@ -15937,42 +21256,31 @@ "errno": "~0.1.7" } }, - "worker-rpc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", - "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", - "requires": { - "microevent.ts": "~0.1.1" - } - }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -15988,17 +21296,17 @@ "integrity": "sha1-bxPsNRRTF+spLKX2UxORskQRFBE=" }, "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "requires": { "mkdirp": "^0.5.1" } }, "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -16018,10 +21326,10 @@ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" }, "xtend": { "version": "4.0.2", @@ -16029,69 +21337,52 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yaml": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", - "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", - "requires": { - "@babel/runtime": "^7.6.3" - } + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", + "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.1.0", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", + "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", - "string-width": "^3.0.0", + "string-width": "^2.0.0", "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" - }, - "dependencies": { - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - } + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } } } } diff --git a/package.json b/package.json index 6786c2893aa0962597f90ef982a379bfcae57109..810336403bf2e5ce2b913a3c1bfedd0540fbe88b 100644 --- a/package.json +++ b/package.json @@ -3,36 +3,72 @@ "version": "0.1.0", "private": true, "dependencies": { - "@material-ui/core": "^4.9.0", - "@material-ui/icons": "^4.5.1", - "@material-ui/lab": "^4.0.0-alpha.40", - "@material-ui/styles": "^4.9.0", - "axios": "^0.19.2", - "binary-extensions": "^2.0.0", + "@ckeditor/ckeditor5-build-classic": "^26.0.0", + "@ckeditor/ckeditor5-react": "^3.0.2", + "@fortawesome/fontawesome": "^1.1.8", + "@fortawesome/fontawesome-free-solid": "^5.0.13", + "@fortawesome/react-fontawesome": "^0.1.14", + "@material-ui/core": "^4.11.2", + "@material-ui/icons": "^4.11.2", + "@material-ui/lab": "^4.0.0-alpha.57", + "@material-ui/styles": "^4.11.2", + "@syncfusion/ej2-react-inputs": "^18.3.52", + "antd": "^4.13.1", + "axios": "^0.21.1", + "base64-img": "^1.0.4", + "binary-extensions": "^2.1.0", "build": "^0.1.4", + "cookie": "^0.4.1", + "fine-uploader": "^5.16.2", + "image-to-base64": "^2.1.1", + "install": "^0.13.0", "material-design-icons": "^3.0.1", - "react": "^16.12.0", - "react-dom": "^16.12.0", - "react-google-login": "^5.0.7", + "material-ui-popup-state": "^1.8.0", + "moment": "^2.29.1", + "npm": "^7.6.2", + "react": "^16.14.0", + "react-cookie": "^4.0.3", + "react-dom": "^16.14.0", + "react-dropdown": "^1.9.0", + "react-dropdown-select": "^4.7.1", + "react-easy-crop": "^2.1.0", + "react-fine-uploader": "^1.1.1", + "react-google-login": "^5.1.25", "react-grid-system": "^4.4.11", - "react-icons": "^3.8.0", + "react-icons": "^3.11.0", + "react-image-crop": "^8.6.6", + "react-input-mask": "^2.0.4", + "react-moment": "^1.0.0", "react-recaptcha": "^2.3.10", - "react-responsive-carousel": "^3.1.51", + "react-responsive-carousel": "^3.2.10", "react-router-dom": "^5.1.2", - "react-scripts": "^3.3.0", + "react-router-hash-link": "^2.3.1", + "react-scripts": "^2.1.8", "react-star-ratings": "^2.3.0", + "react-swipeable-views": "^0.13.9", + "react-window": "^1.8.6", "styled-components": "^4.4.1", - "typescript": "^3.7.5" + "typescript": "^3.9.7", + "use-cookie-state": "^1.0.0", + "uuid": "^8.3.2" }, "devDependencies": { - "eslint-config-prettier": "^6.10.0", + "eslint-config-prettier": "^6.15.0", "eslint-plugin-prettier": "^3.1.2", - "eslint-plugin-react": "^7.18.0", + "eslint-plugin-react": "^7.21.5", "eslint-plugin-react-hooks": "^1.6.1", "prettier": "1.18.2" }, + "watch": { + "build": { + "patterns": [ + "src" + ], + "extensions": "js,jsx" + } + }, "scripts": { - "start": "react-scripts start", + "start": "PORT=4000 react-scripts start watch", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" diff --git a/public/img/colecoes/boas1.jpg b/public/img/colecoes/boas1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89c06d3598dd34f2d21ce19d8ac6c8a426c6556b Binary files /dev/null and b/public/img/colecoes/boas1.jpg differ diff --git a/public/img/colecoes/boas10.jpg b/public/img/colecoes/boas10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d5f49123f47e3370ed66a56652b1c33cf7d15c1 Binary files /dev/null and b/public/img/colecoes/boas10.jpg differ diff --git a/public/img/colecoes/boas11.jpg b/public/img/colecoes/boas11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..add0e181dc7374c5b52cf0c7187585b3c301579f Binary files /dev/null and b/public/img/colecoes/boas11.jpg differ diff --git a/public/img/colecoes/boas12.jpg b/public/img/colecoes/boas12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..379fee28bc3b47adac3ab3e8f84d9eaadd50aa92 Binary files /dev/null and b/public/img/colecoes/boas12.jpg differ diff --git a/public/img/colecoes/boas13.jpg b/public/img/colecoes/boas13.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec60e3ac77eef53d1af47ccf6fcab272001fea9c Binary files /dev/null and b/public/img/colecoes/boas13.jpg differ diff --git a/public/img/colecoes/boas14.jpg b/public/img/colecoes/boas14.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f2feadea1575c5a22fbef1fcbf6c8450c06c132f Binary files /dev/null and b/public/img/colecoes/boas14.jpg differ diff --git a/public/img/colecoes/boas15.jpg b/public/img/colecoes/boas15.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5447d04e02a125be88e306759a84b79edbbd825e Binary files /dev/null and b/public/img/colecoes/boas15.jpg differ diff --git a/public/img/colecoes/boas16.jpg b/public/img/colecoes/boas16.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18df94dcbd89a54a8eb6d96b6e4a13b37db10c12 Binary files /dev/null and b/public/img/colecoes/boas16.jpg differ diff --git a/public/img/colecoes/boas17.jpg b/public/img/colecoes/boas17.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b0ae6cceee009eb64077264ca5b8e464575fc96 Binary files /dev/null and b/public/img/colecoes/boas17.jpg differ diff --git a/public/img/colecoes/boas18.jpg b/public/img/colecoes/boas18.jpg new file mode 100644 index 0000000000000000000000000000000000000000..35d6d721eafc0ad280753f0d2ac9f9373c4076e8 Binary files /dev/null and b/public/img/colecoes/boas18.jpg differ diff --git a/public/img/colecoes/boas19.jpg b/public/img/colecoes/boas19.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e8783f1e1382e72aeeb5fdbc794acab61510870 Binary files /dev/null and b/public/img/colecoes/boas19.jpg differ diff --git a/public/img/colecoes/boas2.jpg b/public/img/colecoes/boas2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..364ce18f3fa7e3927d3ad6168fc084277ce87617 Binary files /dev/null and b/public/img/colecoes/boas2.jpg differ diff --git a/public/img/colecoes/boas20.jpg b/public/img/colecoes/boas20.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69bf30ed53f4a86fe66730f1e727e10df5caf8dc Binary files /dev/null and b/public/img/colecoes/boas20.jpg differ diff --git a/public/img/colecoes/boas21.jpg b/public/img/colecoes/boas21.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff7155d9fa66e4c225e4802242d5181726c8ffdd Binary files /dev/null and b/public/img/colecoes/boas21.jpg differ diff --git a/public/img/colecoes/boas22.jpg b/public/img/colecoes/boas22.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97663c7967d3c811d28b73eb0e2d4115b1a64156 Binary files /dev/null and b/public/img/colecoes/boas22.jpg differ diff --git a/public/img/colecoes/boas23.jpg b/public/img/colecoes/boas23.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b20d36abfd6fe332eaa521de4a99a048eb317fba Binary files /dev/null and b/public/img/colecoes/boas23.jpg differ diff --git a/public/img/colecoes/boas24.jpg b/public/img/colecoes/boas24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d97f51fd06d7a8236c5c55ce676d2da6aa8b441b Binary files /dev/null and b/public/img/colecoes/boas24.jpg differ diff --git a/public/img/colecoes/boas25.jpg b/public/img/colecoes/boas25.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e32b78d0589fb0c19dc3afea6d7a1c826d543c41 Binary files /dev/null and b/public/img/colecoes/boas25.jpg differ diff --git a/public/img/colecoes/boas26.jpg b/public/img/colecoes/boas26.jpg new file mode 100644 index 0000000000000000000000000000000000000000..364cb547db9b080c99be41c11ed08a1ed6503b19 Binary files /dev/null and b/public/img/colecoes/boas26.jpg differ diff --git a/public/img/colecoes/boas27.jpg b/public/img/colecoes/boas27.jpg new file mode 100644 index 0000000000000000000000000000000000000000..831eecf6deac39d3ef638080844cd4cf360cdb83 Binary files /dev/null and b/public/img/colecoes/boas27.jpg differ diff --git a/public/img/colecoes/boas28.jpg b/public/img/colecoes/boas28.jpg new file mode 100644 index 0000000000000000000000000000000000000000..71cd647c7542a675bd9b524ac9558e62e0621bec Binary files /dev/null and b/public/img/colecoes/boas28.jpg differ diff --git a/public/img/colecoes/boas29.jpg b/public/img/colecoes/boas29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a02eb7819d559a84b7dd112a27b3426ba79e239b Binary files /dev/null and b/public/img/colecoes/boas29.jpg differ diff --git a/public/img/colecoes/boas3.jpg b/public/img/colecoes/boas3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d474704ea5d17c5e564e6712fa9cab9773c8bfb Binary files /dev/null and b/public/img/colecoes/boas3.jpg differ diff --git a/public/img/colecoes/boas30.jpg b/public/img/colecoes/boas30.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4a244a311018c315a7f51db2cd339117be1afb3 Binary files /dev/null and b/public/img/colecoes/boas30.jpg differ diff --git a/public/img/colecoes/boas4.jpg b/public/img/colecoes/boas4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94dee43db37bc68adb4054c6ff52b08da442ff77 Binary files /dev/null and b/public/img/colecoes/boas4.jpg differ diff --git a/public/img/colecoes/boas5.jpg b/public/img/colecoes/boas5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd677614d95233713ecd33938d2453f0c7ce1c1a Binary files /dev/null and b/public/img/colecoes/boas5.jpg differ diff --git a/public/img/colecoes/boas6.jpg b/public/img/colecoes/boas6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2a03d6d7560d0f0bab1e3eb88df16e3f53a12440 Binary files /dev/null and b/public/img/colecoes/boas6.jpg differ diff --git a/public/img/colecoes/boas7.jpg b/public/img/colecoes/boas7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93e7f88846b74df326ce0b41145f625df59d50b8 Binary files /dev/null and b/public/img/colecoes/boas7.jpg differ diff --git a/public/img/colecoes/boas8.jpg b/public/img/colecoes/boas8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9aeeea55f52049b8be2851c13a4d2053a4e1fd35 Binary files /dev/null and b/public/img/colecoes/boas8.jpg differ diff --git a/public/img/colecoes/boas9.jpg b/public/img/colecoes/boas9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a05f749f737eff3ce2bc748bd0b9fae54615ae95 Binary files /dev/null and b/public/img/colecoes/boas9.jpg differ diff --git a/public/img/colecoes/ecd.png b/public/img/colecoes/ecd.png new file mode 100644 index 0000000000000000000000000000000000000000..46b6ccc37527909668b77dbcb1cfcd2b9eedf7c1 Binary files /dev/null and b/public/img/colecoes/ecd.png differ diff --git a/public/img/colecoes/ecd1.jpg b/public/img/colecoes/ecd1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e103672c263637051bcb6930efef7b53e98668b9 Binary files /dev/null and b/public/img/colecoes/ecd1.jpg differ diff --git a/public/img/colecoes/ecd10.jpg b/public/img/colecoes/ecd10.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed0196897190588d7bb0e97fefeaeb3cc81cceeb Binary files /dev/null and b/public/img/colecoes/ecd10.jpg differ diff --git a/public/img/colecoes/ecd11.jpg b/public/img/colecoes/ecd11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e165deb12e3dad61f21cdface98b6b0096c0a8ab Binary files /dev/null and b/public/img/colecoes/ecd11.jpg differ diff --git a/public/img/colecoes/ecd12.jpg b/public/img/colecoes/ecd12.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4d7568e7cd7201666425f8bc057d7bcc0684554 Binary files /dev/null and b/public/img/colecoes/ecd12.jpg differ diff --git a/public/img/colecoes/ecd13.jpg b/public/img/colecoes/ecd13.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1e005c1360e9dc23de27d184332bccdf03acaa35 Binary files /dev/null and b/public/img/colecoes/ecd13.jpg differ diff --git a/public/img/colecoes/ecd14.jpg b/public/img/colecoes/ecd14.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61a6bd2259d39edcfd69e2df580a09c7dd865ef8 Binary files /dev/null and b/public/img/colecoes/ecd14.jpg differ diff --git a/public/img/colecoes/ecd15.jpg b/public/img/colecoes/ecd15.jpg new file mode 100644 index 0000000000000000000000000000000000000000..407e8b480d2cca92bab9598ab00f0687ee33ece2 Binary files /dev/null and b/public/img/colecoes/ecd15.jpg differ diff --git a/public/img/colecoes/ecd16.jpg b/public/img/colecoes/ecd16.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02a2bb8d2198b72cb35b4317972b52896207d46e Binary files /dev/null and b/public/img/colecoes/ecd16.jpg differ diff --git a/public/img/colecoes/ecd17.jpg b/public/img/colecoes/ecd17.jpg new file mode 100644 index 0000000000000000000000000000000000000000..295b23fa7f2eebfa1bc1e9c8801fe04e9618db99 Binary files /dev/null and b/public/img/colecoes/ecd17.jpg differ diff --git a/public/img/colecoes/ecd18.jpg b/public/img/colecoes/ecd18.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74f42fc6474d233eb86190c2dda5064b7b8a3325 Binary files /dev/null and b/public/img/colecoes/ecd18.jpg differ diff --git a/public/img/colecoes/ecd19.jpg b/public/img/colecoes/ecd19.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c937fea6045e070600bc856034eb6b54c9e8972a Binary files /dev/null and b/public/img/colecoes/ecd19.jpg differ diff --git a/public/img/colecoes/ecd2.jpg b/public/img/colecoes/ecd2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..359b5317651fcfbc2400fb9e3f4274d301072f52 Binary files /dev/null and b/public/img/colecoes/ecd2.jpg differ diff --git a/public/img/colecoes/ecd20.jpg b/public/img/colecoes/ecd20.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90b325c3c532adeaa53d3cb39a0ef818eb9904ad Binary files /dev/null and b/public/img/colecoes/ecd20.jpg differ diff --git a/public/img/colecoes/ecd21.jpg b/public/img/colecoes/ecd21.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7d047527a9962713b3042bfbee79dab6cacf7a39 Binary files /dev/null and b/public/img/colecoes/ecd21.jpg differ diff --git a/public/img/colecoes/ecd22.jpg b/public/img/colecoes/ecd22.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c5fc0e5352afb5dbf5503ffd86ec8905a0c2111 Binary files /dev/null and b/public/img/colecoes/ecd22.jpg differ diff --git a/public/img/colecoes/ecd23.jpg b/public/img/colecoes/ecd23.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94c4267fb301752c0c3fa614795f7b12de129d9a Binary files /dev/null and b/public/img/colecoes/ecd23.jpg differ diff --git a/public/img/colecoes/ecd24.jpg b/public/img/colecoes/ecd24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f4897d4714d217a43eb120642031bc506d3d08e Binary files /dev/null and b/public/img/colecoes/ecd24.jpg differ diff --git a/public/img/colecoes/ecd25.jpg b/public/img/colecoes/ecd25.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f35f757120890d8086fc646f91f7acf74918ded5 Binary files /dev/null and b/public/img/colecoes/ecd25.jpg differ diff --git a/public/img/colecoes/ecd26.jpg b/public/img/colecoes/ecd26.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a46919c67718c451f45e64f28018e78cc0f8f020 Binary files /dev/null and b/public/img/colecoes/ecd26.jpg differ diff --git a/public/img/colecoes/ecd3.jpg b/public/img/colecoes/ecd3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46efc2ce4b5f4390a03612edb99f15e80fc64246 Binary files /dev/null and b/public/img/colecoes/ecd3.jpg differ diff --git a/public/img/colecoes/ecd4.jpg b/public/img/colecoes/ecd4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a7d7de6a52ba297cefa683699cd2480738698621 Binary files /dev/null and b/public/img/colecoes/ecd4.jpg differ diff --git a/public/img/colecoes/ecd5.jpg b/public/img/colecoes/ecd5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a7c1623af658cce6fb3bd574228c08fa0746f8f8 Binary files /dev/null and b/public/img/colecoes/ecd5.jpg differ diff --git a/public/img/colecoes/ecd6.jpg b/public/img/colecoes/ecd6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66b1af33b7c95847d90359be516c31b4ac5b942d Binary files /dev/null and b/public/img/colecoes/ecd6.jpg differ diff --git a/public/img/colecoes/ecd7.jpg b/public/img/colecoes/ecd7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..02dd2ee2b346192c3e3302e8e0f2c5e3b77d385b Binary files /dev/null and b/public/img/colecoes/ecd7.jpg differ diff --git a/public/img/colecoes/ecd8.jpg b/public/img/colecoes/ecd8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28060b24ba7566b7a8858b2f20b4cb43ade92a96 Binary files /dev/null and b/public/img/colecoes/ecd8.jpg differ diff --git a/public/img/colecoes/ecd9.jpg b/public/img/colecoes/ecd9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3a80a711ae8bf0705e561c568f084cd4c7d8ced3 Binary files /dev/null and b/public/img/colecoes/ecd9.jpg differ diff --git a/public/img/colecoes/pnaic.png b/public/img/colecoes/pnaic.png new file mode 100644 index 0000000000000000000000000000000000000000..a3233c4a1a1392500f35b80efe8d76b432922c22 Binary files /dev/null and b/public/img/colecoes/pnaic.png differ diff --git a/public/img/colecoes/pnaic1.jpg b/public/img/colecoes/pnaic1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..534c2ebc287bdc49f3156ca86904517f27ed1028 Binary files /dev/null and b/public/img/colecoes/pnaic1.jpg differ diff --git a/public/img/colecoes/pnaic2.jpg b/public/img/colecoes/pnaic2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..99ac78f3ef192bfa09e2207f64a5739985c332a2 Binary files /dev/null and b/public/img/colecoes/pnaic2.jpg differ diff --git a/public/img/colecoes/pnaic3.jpg b/public/img/colecoes/pnaic3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ecedace1630b2720ef6599f9685dcadf80ae37ad Binary files /dev/null and b/public/img/colecoes/pnaic3.jpg differ diff --git a/public/img/colecoes/pnaic4.jpg b/public/img/colecoes/pnaic4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8759d8717b0587f28f00d19a50f49f2a1b14e168 Binary files /dev/null and b/public/img/colecoes/pnaic4.jpg differ diff --git a/public/img/colecoes/pnaic8.jpg b/public/img/colecoes/pnaic8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7646ff6c8cff5a0e47b4e04f8c9fe31a09f09b8e Binary files /dev/null and b/public/img/colecoes/pnaic8.jpg differ diff --git a/public/img/colecoes/pobreza.png b/public/img/colecoes/pobreza.png new file mode 100644 index 0000000000000000000000000000000000000000..cefc875c03f3257492826343916d3307ecd41025 Binary files /dev/null and b/public/img/colecoes/pobreza.png differ diff --git a/public/img/colecoes/pobreza0.jpg b/public/img/colecoes/pobreza0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..27a739e1ff4a52930bf924a46d1764644281f4a2 Binary files /dev/null and b/public/img/colecoes/pobreza0.jpg differ diff --git a/public/img/colecoes/pobreza1.jpg b/public/img/colecoes/pobreza1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..99564b346b0b053fd72c9ba88ddb9eef7a18dcc8 Binary files /dev/null and b/public/img/colecoes/pobreza1.jpg differ diff --git a/public/img/colecoes/pobreza2.jpg b/public/img/colecoes/pobreza2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..098ee5db46a6039782a9f4beacf8a059b8b62e51 Binary files /dev/null and b/public/img/colecoes/pobreza2.jpg differ diff --git a/public/img/colecoes/pobreza3.jpg b/public/img/colecoes/pobreza3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..36ba07beb21d78789e0b8dd43ff90f79f3a8cd48 Binary files /dev/null and b/public/img/colecoes/pobreza3.jpg differ diff --git a/public/img/colecoes/pobreza4.jpg b/public/img/colecoes/pobreza4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ca7805a149a5ac61ce947f101c9c6ed8d60e3f65 Binary files /dev/null and b/public/img/colecoes/pobreza4.jpg differ diff --git a/public/img/colecoes/senad.png b/public/img/colecoes/senad.png new file mode 100644 index 0000000000000000000000000000000000000000..a25098be457007baa3fc231b4b83fb0a597f4b9c Binary files /dev/null and b/public/img/colecoes/senad.png differ diff --git a/public/img/colecoes/senad1.jpg b/public/img/colecoes/senad1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..00a46f198de765ec3bb08b8cd5a7ed33359b4753 Binary files /dev/null and b/public/img/colecoes/senad1.jpg differ diff --git a/public/img/colecoes/senad2.jpg b/public/img/colecoes/senad2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5684158c51339172a6c26990ecd5b38229602f8 Binary files /dev/null and b/public/img/colecoes/senad2.jpg differ diff --git a/public/img/colecoes/senad3.jpg b/public/img/colecoes/senad3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..739d0ea9d80e99b92d3ef8e099464cac7f3cdbc1 Binary files /dev/null and b/public/img/colecoes/senad3.jpg differ diff --git a/public/img/colecoes/senad4.jpg b/public/img/colecoes/senad4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..04df2280d8809da38a511eb273b930553d070d8c Binary files /dev/null and b/public/img/colecoes/senad4.jpg differ diff --git a/public/img/ipen_capa.jpg b/public/img/ipen_capa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..453af7bc501316dbc4527694f123bc7e4a8536d9 Binary files /dev/null and b/public/img/ipen_capa.jpg differ diff --git a/public/img/logo_parceiros/ENEF_AEF.png b/public/img/logo_parceiros/ENEF_AEF.png new file mode 100644 index 0000000000000000000000000000000000000000..fddea853a3a12fbca00a872ca14e09406e3d5cc0 Binary files /dev/null and b/public/img/logo_parceiros/ENEF_AEF.png differ diff --git a/public/img/logo_parceiros/ic_bioe.png b/public/img/logo_parceiros/ic_bioe.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc47c707ab283e3965d1a38cc203455e441645d Binary files /dev/null and b/public/img/logo_parceiros/ic_bioe.png differ diff --git a/public/img/logo_parceiros/ic_default.png b/public/img/logo_parceiros/ic_default.png new file mode 100644 index 0000000000000000000000000000000000000000..3829583aa25b35d1c8eaf94ada77dd7013f8132b Binary files /dev/null and b/public/img/logo_parceiros/ic_default.png differ diff --git a/public/img/logo_parceiros/ic_diaadia.png b/public/img/logo_parceiros/ic_diaadia.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee86dee5a83c880699d529310cc2011e6bf838f Binary files /dev/null and b/public/img/logo_parceiros/ic_diaadia.png differ diff --git a/public/img/logo_parceiros/ic_dominiopublico.png b/public/img/logo_parceiros/ic_dominiopublico.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd2832af0396b94880172914e0a500ba20b6fc7 Binary files /dev/null and b/public/img/logo_parceiros/ic_dominiopublico.png differ diff --git a/public/img/logo_parceiros/ic_escoladigital.png b/public/img/logo_parceiros/ic_escoladigital.png new file mode 100644 index 0000000000000000000000000000000000000000..ce05b1f8d10ea8815b3931991db4d9197c9c5ed6 Binary files /dev/null and b/public/img/logo_parceiros/ic_escoladigital.png differ diff --git a/public/img/logo_parceiros/ic_nute.png b/public/img/logo_parceiros/ic_nute.png new file mode 100644 index 0000000000000000000000000000000000000000..40eb4474b28fbc62eb9756f704c63c5ad47bc597 Binary files /dev/null and b/public/img/logo_parceiros/ic_nute.png differ diff --git a/public/img/logo_parceiros/ic_peninsula.png b/public/img/logo_parceiros/ic_peninsula.png new file mode 100644 index 0000000000000000000000000000000000000000..b425b05142256d7857b2cbb82b324dbd146cbad2 Binary files /dev/null and b/public/img/logo_parceiros/ic_peninsula.png differ diff --git a/public/img/logo_parceiros/ic_phet.png b/public/img/logo_parceiros/ic_phet.png new file mode 100644 index 0000000000000000000000000000000000000000..5758157be9a5b4a451e8681e79654f775f55c703 Binary files /dev/null and b/public/img/logo_parceiros/ic_phet.png differ diff --git a/public/img/logo_parceiros/ic_portaldoprofessor.png b/public/img/logo_parceiros/ic_portaldoprofessor.png new file mode 100644 index 0000000000000000000000000000000000000000..df0eccf7c3bff1016f8033ddfa38430ba146005d Binary files /dev/null and b/public/img/logo_parceiros/ic_portaldoprofessor.png differ diff --git a/public/img/logo_parceiros/ic_tvescola.png b/public/img/logo_parceiros/ic_tvescola.png new file mode 100644 index 0000000000000000000000000000000000000000..e8488a8ff8f22c1ac419317e369176f12ef80fb2 Binary files /dev/null and b/public/img/logo_parceiros/ic_tvescola.png differ diff --git a/public/img/logo_parceiros/icones.ai b/public/img/logo_parceiros/icones.ai new file mode 100644 index 0000000000000000000000000000000000000000..d54d2505ea8b5adaf80471bffef6a0f6e3e205ad --- /dev/null +++ b/public/img/logo_parceiros/icones.ai @@ -0,0 +1,1042 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 22 0 R 37 0 R 60 0 R 74 0 R 89 0 R 107 0 R 125 0 R 141 0 R 157 0 R 173 0 R 189 0 R]/Order 190 0 R/RBGroups[]>>/OCGs[5 0 R 22 0 R 37 0 R 60 0 R 74 0 R 89 0 R 107 0 R 125 0 R 141 0 R 157 0 R 173 0 R 189 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 27416/Subtype/XML/Type/Metadata>>stream +<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c111 79.158366, 2015/09/25-01:12:00 "> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" + xmlns:stMfs="http://ns.adobe.com/xap/1.0/sType/ManifestItem#" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/" + xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/" + xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"> + <xmpMM:DocumentID>xmp.did:748fc865-cf1b-6d40-a0f1-1f75821450ff</xmpMM:DocumentID> + <xmpMM:InstanceID>uuid:4bb38d49-3b0c-4af7-9e9d-adca1199c051</xmpMM:InstanceID> + <xmpMM:OriginalDocumentID>xmp.did:748fc865-cf1b-6d40-a0f1-1f75821450ff</xmpMM:OriginalDocumentID> + <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> + <xmpMM:DerivedFrom rdf:parseType="Resource"/> + <xmpMM:History> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:748fc865-cf1b-6d40-a0f1-1f75821450ff</stEvt:instanceID> + <stEvt:when>2016-10-06T17:18:17-03:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CC 2015 (Windows)</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + </rdf:Seq> + </xmpMM:History> + <xmpMM:Manifest> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <stMfs:linkForm>EmbedByReference</stMfs:linkForm> + <stMfs:reference rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\google2-01.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </stMfs:reference> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stMfs:linkForm>EmbedByReference</stMfs:linkForm> + <stMfs:reference rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\banco_objetos.jpg</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </stMfs:reference> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stMfs:linkForm>EmbedByReference</stMfs:linkForm> + <stMfs:reference rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\dominio.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </stMfs:reference> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stMfs:linkForm>EmbedByReference</stMfs:linkForm> + <stMfs:reference rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\logo_1__2_.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </stMfs:reference> + </rdf:li> + </rdf:Seq> + </xmpMM:Manifest> + <xmpMM:Ingredients> + <rdf:Bag> + <rdf:li rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\google2-01.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\banco_objetos.jpg</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\dominio.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\logo_1__2_.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </rdf:li> + </rdf:Bag> + </xmpMM:Ingredients> + <dc:format>application/pdf</dc:format> + <xmp:CreatorTool>Adobe Illustrator CC 2015 (Windows)</xmp:CreatorTool> + <xmp:CreateDate>2016-10-06T17:18:17-03:00</xmp:CreateDate> + <xmp:MetadataDate>2016-10-13T19:27:22-03:00</xmp:MetadataDate> + <xmp:ModifyDate>2016-10-13T19:27:22-03:00</xmp:ModifyDate> + <xmp:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xmpGImg:width>256</xmpGImg:width> + <xmpGImg:height>256</xmpGImg:height> + <xmpGImg:format>JPEG</xmpGImg:format> + <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYqtkkSNC7mijqcVJY9qH5g+V7H+9uXY+CROfDxA8cujgkXAzdp4cf
M/YUiufzi0NGpBDPIPH01H65Fy0aSTr5+0OEcrPw/akl1+cmrl6WVrb8T09ZHr2/llywaQdXEn7R
H+GPzH/Hm4fzR87zCsdjYsP9WQfrmxOmh3lgO29UeUYfj/OVm/MTz+BX9HWNOvRv+q+D8vj7z+Pg
2DtbWfzIfj/OWL+a3meFx9dsrVV/a9NXJp9M3zx/LRPItg7ayj6o/L/pJM7b849JbiLi3mQ7c2WN
eNe9P3hOQOkLbD2gxfxAj4ftZBY/mH5Wvf7q5df9aJx4+APhlUsEg7DF2ngycj9hZFHIkiB0NVPQ
9Om3fKXYArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirTuqIzsaKoJY+w3xU
lhPmb8zNO071ILP9/crVT9pKEch+1GR1GZOPTk83T63tjHisDeX48nmV5rfmLzDcqksvryb8E4xJ
2BO4CfyZmiEYB5bLrc+pNX9yfaR+VerXVHuz6C+FEfx/lkHhlU9SByczT9hZJ7y2+X62Zab+Vfl6
3FbpPrTfOWPx/lkPjmPLUyPJ3WHsLDH6vV8x+lklnoOk2QpbQemB/lufH+Zj45SZk83Z49Jjh9I+
9GiCIdF/E5G2/hDfpp4YFpabeE9V/E4bXhCFvNE0y8jMdzD6iHqOTjsR+yR44RMjk1T08JcwxfUv
yp8v3A/0Nfqh+cknh/NJl8dVIc3VZuwsMvp9PzP6WOSeVfOXl1mm0qfmm1RxgFe3+7Gf+c5d4sJ8
3A/KarTbwNj/ADf033pxoX5oQSTC11aP6vL3epfsW6Rx06Uyuem6hzNL21GR4Z+k/P7gz6CeKeJZ
Ym5RtWhoR0NO+YpFO9BtfgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYql+ua3ZaRYyXV0
3EKDwWjHkwUsB8IaleOThAyNBp1GeOKJlJ415r8+ajrUjW8Z9Oz5HjH8LV+0AalFb7LZscWAR36v
G9odrzykxjtH+3yV/Kn5eX+rGO5uP3VoxBr8LVB4ns6t9lsGXOI7BGg7InmqUto/2eb1/SdC03S4
fSs4vTHf4mPcn9ot/NmvlMy5vY6fSwxCohH5ByHYq7FXYq7FXYq7FXYq7FUm13yppOsRFbmP95+z
JyfbcV2Vl/lyyGUx5OFqtBjzD1Df4/rYFLp/mPyVP9Ytm9fTR/eLSJOooN2Mj/bkzK4o5Pe6Mwz6
I2PVj+A/WeZeiaFrtlrNktzbNUbBxRtm4hiPiC/zZiTgYmi9Fp9RHLHiimWQb3Yq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FUn81eYYND0p7uTd2qkQ33cozL0Vv5e+WYsfEacXWaqOGBkXhHmLzDdat
dy3d03wAsUWg2XkzAfCq1pyzaY4CIoPC6rVT1OT3nb5/DvYffa4/rAQGio1SfGhPiMtp6nsnsMQA
nk+r+w9C9+/Knz3Y6zo9vpzvxvbSJIuFGNVjSNK1CKv2m8c1eowmJt384U9BzGa0Pe6haWcRluZP
TQdTRj3A7A+OVZc0YC5Fsx4ZTNRDFNS/MrToSVtV9bwarL4dmjzS5+3ccdo7/P8AU7jB2JOX1bfj
3sav/wAydVkRuH7oAfa+Bv1x5q8nbeWe0dvl+p2mLsXHHnv8/wBbGb38ztRUlWveRFfh9JR49/Ty
UDrMm97f5rlR7PwD+H7T+tLW/NPVlaqS9O/FP4x5kx0uo6z+wMjosP8AN+0oi2/OLXImHOXko7cY
x+qLL449SP4/si1T7Nwnp9p/WyTSfzwBKrdrQbVNfl/LDlw1OohzHF8g4WXsSB+k/j5vRNH88aJq
YAjl4yN0TjIele5Rf5cy8PaWOZrkfj+p0ufs3Lj3rb4frT8Go2zYOvbxVpgGWhFQcUEPONa8tX3l
u/OtaN/c1rcRfD9jkZX+KRnPRANhmZDIJjhLzmo0c9LPxcX09R9p533Mw8ra/FremC5TZ0PpyjfZ
wisw3Vf5u2Y+XHwmnc6LVDPDiH4KcZW5bsVdirsVdirsVdirsVdirsVdirsVdiqG1LULbT7Ka7uH
VIoULksadO335KMSTQa82WOOJlLkHg/nbzbPrWoSu7BbKFmEQ+EgqrOVbkFU/ZbNphxCI83hdfrJ
6rLwx3F7fM197zvV9U9djFEaxg7kd+o8MvAeo7F7I8Eccx6v7PNKsk9Gi9MuL63vYZ7IH6xE6tHx
UNurAjYgjqBlWbJCESZkAMo4zPYC3tkf5v3iaUiXpWC835EvGx+3UfCsdPs0zi9b2jKRrADId/8A
aPe7XS9i73P8faxVvMtxrN3z3lUfamoFH2dtuK/y0zndZgmBxZT6u7b9Dv8AFijAVFMoNI1m7iL2
FjLdU/kU06/zUp2OY+l0OTMfSDTHNqseP6pAJRe/l5+Zd+xrpEix/wApktx4eLKe2dXpezRiGw3/
AB5uKe1dP/O+/wDUgZPyn/MJBVtGkP8AqyQt+pzmb4cu5A7U05/i+9A3P5f+dbYEy6LdgDqViZx9
618MHAe5tjrsB5Tj80oudN1G1JW5tZYSOokRlpT5j2yJDkRyRlyIKGxZK9teXFu3KJuP0A/rB8cp
y4IzFSCXoXlL82r3TmWK8asG/wDKP5j+zGT1OY0YZcP0eod2zrtV2djy+R/Hm9n0Hzt5e1mNTbXs
Xqmv7rlvsT/MFrstc2WHWwnsfTLuLzGo7Py4uYNd6fVGZjgtOiupRhVWBBHscUEWw3UdJvtB1T9L
aXG0trK3+mwKASFZzJI9WLt0UCij5ZkxmJCi6bLglp8niYxcT9Q+0nqyjTNTtdQtkmgcEkD1E3DK
1ASpBAO1fDKJRILtcOaOSNhF5FtdirsVdirsVdirsVdirsVdirsVdiryP8z/ADe9zMdKs5FNsNpi
jfaDCNx9liDvXqMz9NircvI9udocR8OJ26/Ye95/F5V8x68y22m27BGIDTukvpivwmrIrfzA5kyy
xjzbuwNAP72Xw+w9yf2X/OPGutGGu7y2DEA0jlk2qB/NBlJ1o6PYeKEPr35HXGlWMt3JqNsiRqzU
kmILcVLUFYVqTxynJ2lGAs/j7W3AJZJCIDDbSD0ZPqunwm6vCePNF9TeoX4SnxfapTOf1GTJqpWb
EO7f7RuORep0+lhgjcqtC6hp2uRTcLq2nRz3lSQdgf2hmyw6GGOPFKgHFy9qcR4cf4+RZLAING03
nLTn36VPxe/H+bONnGWu1HDDl+z49zsDk8HHcjv+1n35efm55a9AWF5H9Sn7zcYooju77s0tem3T
rnb4uyxgjUfx9jyGqnLLLiL1e0vbO7j9S2mSZP5o2Vh1I/ZJ8MiQQ4VK+BVrIjgq6hlPUEVGKQUo
1Tyh5d1JGW4sYOTVq4ii5b17lT45ExBb8eryQ5E/MvNfN35HI6y3WiSBXHJvQkNAR8TUVYoevQDK
pYe53Ol7araf4+ZeN3ljeWUxhuoXhkHVXVlPQHowHjmOQ9FCYkLBtQxZpjpOuX+mXCzW0rIVr0Zh
1BH7JX+bMfNpxPcbHvYyiJCju+gPy/8AzIsdbiW2uXEd2K05FRXd2/akZjRVyzS6og8GTn+O95Xt
Hsw4/VD6f7PJnubN0q10R0ZHHJWBDAitQdsUEWKLE54bjy/ra3Mbf7i7tgsiEn4JJJORIA4IAETM
gHjjXV1RidPlsf3cvvJ+XJlkMqSxJLGao6hlI3qCKjpmOQ7WJsWF2KXYq7FXYq7FXYq7FXYq7FXY
qkPnLzDHomkSXFf3xp6ailT8ag0HJT0bLcOPiLg9oasYMZl1/aHhOnwTalqttbuzSSXMscZYkk/E
QvU16DNpI0HgMUTlyAHnIh9A+X9GtdL0y3t4o1V1jQSOFAJYIoJJAWteOamczIvo2mxDHjjEdAPu
Rt3cw2ttLcTMEjhRndmIAooJO5p4ZWTQtyYRMiAHhnm7zDrPnTX/AND6QJDZrL6TOnqFKCRoyxMb
SLTjIN6ZgSickt+T1Olww02Pjl9X7Ph3PQPJH5Y6VoVvHNdRpcX5AZ3cI4DEITxLRqwoy7ZlwxgO
n1vaU8pobR/HmgPzJk0eiWkNpAbk15yLGnIU9NhuN+maTtvtAxj4cTuf2Hvc3sbSWeOXL+0JFqH5
QXut6PFNFcejdfF+7kdlj+2BuBEzfZXM3sDTjTx4pD1H9rX2nr+OfCPpH7PN5br3kPzPoch+s2kh
UdJY45SvQftMi/zUzrYZoydcJAo7yh+ZnmDy9eRF55Li0VgZYZWkf4firRfURa/F3yOTBGQRKAL3
nyl+Zvl3zBAnGdbe6IAaGZokblRa0X1HNKvTNdkwSi0SgQy9WVlDKQVO4I3BrlDBvFXYqwjzz+We
meYLZpLeNLe+FODqEQHdAeREbt9lNsrnjt2Wi7RliO+8fx5vnTVNJvtMumtbyJopVpUMrL1Ab9oK
ejZikU9fiyxmLCDwNqN0rVbvTbpLi2kZHWtOJYdQR2K/zZTlxCY82MoiQovqLyb5ntde0qKeN1Mw
RRKgIJrwUtsGc9XzM02fjjvzDxGu0hwzI6J/mS4SXeYdPS+0m5hI+MRuYiOofgwUjY775OEqLTnx
DJExKR+Qtb+sQz6VMWNzYSPCC5/YhCR9zXr7ZZmh173G0cyLxy5x+4bMtyhz3Yq7FXYq7FXYq7FX
Yq7FXYq8W/NLW3vdYFrHLytrf7KK1ftpGx5AEjqNs2WmhQt4rt7VGeTgB2j+kBLPy8s/rHmuwJFV
ik5H6FZh2P8ALk85qBcTsjHxaiPkXvgoBTwzVPoDzf8AM3zBeXMsPlrSiWubxljmKciVSUyQtX02
JABI6rmNklxHhDuuztOIg5Z8h+wp55E8jWPl/T43ZA9/KqvPKwUsGZU5ANwRvtJXfLYQoOJrdbLL
L+iyW9uktbWW4kICxIzmu32QT3p4Y5cghEyPQOHigZyER1eUaJb3HmTzCJJ6tH/uw7kD90QOvP8A
kzitJCWrz2eX7Pj3PY6qcdLgoc/2/DveuRoqKFUBVHQDbO4AA2DxhJPNQvtMsL6P07u3jnXwkRX7
g/tA+GSEiOSgvLfPH5IaddW8t5olYbpFLC3+FY2ICgAJFCSdlP05mYtURsW2OXveM32l+YvLd+RI
k9pLG20qiWMHix6MQh6pmcJRmG4EFn/kf87tRsDFZayPrFrVVE3xPIPsLu0koFKAnpmNl0oO4a5Y
u57boXmbR9btUnsbiOTkATGHQuKgHcKzfzDMCeMxO7QYkJrkEOxV5v8Amx5Ai1XT21GyiH12GlVR
RV+TRp+yjMaKp75VkhbuOy9cccuGX0/2vnogg0IofDMV61rFLO/yr84z6LrcdvK/+iXBWNlYmg5y
Riu7Kv2Vyn6J8Q+Lr+0dKMuM94/UX0fbXEdxBHNGQUkUOpFDswqOmbSMrFvFyiYmiqEAih6HrhYv
HrzUm8s/mosLMy22qUfiDRa3F4RyIqg6J75nRjx4/d+pwtTDhlHIPKJ+96/FIskSSKaq6hlI8CK5
glzAbFrsUuxV2KuxV2KuxV2KuxVDajdraWclwxACU3PTdgPEeOGIsteWfDG3zfe3k15cvczU9SSn
KlabAL3J8M3MRQp80y5TORkeZZl+U0IbXi5H2KEfTHJmNqj6Xc9gRvNf45F69qd4tnp9xcsR+6id
wPEqpanUeGarNk4IGXcHu8OPjmI95YZ5L0E3uqXXmK+UtJLLILUOK0jZ0mQrzBpSppRsx9KLHGeu
7stfn4IjFHpz+0M8zMdQwX8xvMBigGnQNRn3kIO/Eh0ING/hnOdua3hj4Y6/tD0HYujs8Z/HIq/5
caSLawa7daSTU6j+RpF8B45Z2FpuGHEeZ/a19tajinwjkP2MzzfujdirsVSXzB5P0LXbd4r62Qs4
I9YJGZBUMKhmVt/iJyyGSUeTISIeHeefyY1LSZJbrSQ11Z/EwT4pJAPjbpHEq/ZUZn4tUDsW+OS2
G6N5m8xeWr4G2llheFvjt5GlVCVYVDIGT+ShzIljjMMzEF7r5D/ODTNahittSZLW/oqsSUjRmoim
nOVmNWY5rs2mMeXJx5Y6ekZita10V1KuAVPUHfFINPmL8y/LI0PzBIkScbeTj6YpQfDHGT0VR1bM
PJGi9r2dqfFx78/2liGQdgvhleKVJUNGRgykbbg17YJCwgh9KflR5j/S3lyOORwZrYLEQTVqRxRi
u7MerZbpZ2CO54/tbT+Hkscj+ss3zLdU8L/PsNb+ZdNvoyUkSGBQ67EUlmaoIp4eObHR/SQjLj48
Uh5H7nrHkW+a+8naPcsSzvaxhmJqSUXgSTU9eOYWYVMtWn/uwD02+WyeZW3OxV2KuxV2KuxV2Kux
Vhf5r3gi8sS2x63PGn+wljbwzJ0o9Vum7dyVpyO/9YeJ5snhGf8A5ROP0xIvc0/4hLmJquT0Ps+f
3h/HQsz8/wB6qW9taHpLMlfkwdfDOV7YzcMYx75D9L6X2RiuUpdwP6GR6OirpNkq/ZWCID6EGbTT
f3cf6o+51uoP7yX9Y/e1q96llptxcsaenG7L7lVLU6HwwanKMeMyPQH7l0+I5JiPeQ8TvruTUNUk
mff1pTxG3RnJA6Dxzz7NlOXISep/S95ixjHjAHQfoe4afai2tI4R0Sv4sT7+Oeh4cfBEB4HNPikS
iMta3Yq7FXYq7FWJ+dfy70bzLbOZU4XgU+nNVzQ0enwh0X7T1y7FmMGcZkPnfzl5H1XyzfOk61t+
R9KWqCo5MF+EO56JXfNniyiYciMgWT+Qvzh1HRylnqbevZCvE0VOP22/YiZjVmGVZtMJbhjPHb6A
0jWLDVrRbqyk9SJq70ZehK/tBT1U5rZRINFxyKedfnvpay6LDegfFBy5H/XkhUd/4Zj5hs7vsTLU
zHv/AGvA8xnqmV+QvIt35pviit6drHvJLQN9lkBHHmh6Pk4QtwNdrRgj5vW/LPlW38l+YIbaGf1h
eRqrfAVoZZFU9Wk/33mLOfhakD+dED5l0+bOdVgJIrhP3D4d70jNs6B4L/zkTOv6ZsoP2vq8Un0c
5xmx0Q2Lfh5M2/I67abyZbxE7QqQo+c0vt7ZRqx6nBx7ZJx7j99l6JmK3uxV2KuxV2KuxV2KuxV5
f+dNy4/RkCmin1/UHj/dEZnaMc3lvaSZAgO/i/3ry/M15RmP5XXHpeZoY/8AfrUH0Ryf1zH1I9Lu
uw51nA7/ANRZF+ZF4x1OCP8A32FYfQ8g8M8+7dyfvAPxzL7J2Jj/AHZP46M38rXqXWhWjg/3UUcb
fNY1r2HjnQ9n5RPDE9wA+wOh1+IwzSHeT95YV+YvmD15f0dEfgjNX2/aBdD1X+Oc/wBua3iPhjp+
0O97G0fCOM/jkWJaJF6usWMf89xEv3uBmk0kbyxH9Ife7nVSrFI/0T9z3jPSHz12KuxV2KuxV2Ku
xVB6rpVlqllJaXaepDKrKwqw+0pX9kqejZKMiDYSDT5o8/8A5a6h5YlMy/vbE/Zk+FegQHb1Hb7T
5tcOcTcmE7SXyv5w1jy7diexkov7cfFDy+FgN2V6U5nLMmMSG7KUQXq3mX8xtI80/l/qEdfTv09G
kXxt1uVP2uCL9lK5p9VgMYuR2ZEx1Efj9xeMZrXsn1D+WehppXle1AFHnRJm37vDHXu38uZmMUHi
O0c3HlPl+spJ5t1Gvm+zof7oxJ/wMze2ct2ln/wqPlX+6Luez8P+DS87/wByHoNtKDZRTMdjGrk/
7GudTiNxB8nmsgqRHm+ZPzh1kan5wnINVtQ1uPlHPL7L/Nm600ai34xQZx/zjxOfT1GLt+5/XOco
1o5OrqtRPz4fue1Zr3KdirsVdirsVdirsVdiryD84XJ1S1XsvqU+lIs2Gk5F5D2jPqj8f968+zLe
aTjyddC2806ZKTQfWEU/7M8Pf+bK8wuJc3s6fDqIH+kyr8wZfU1tSOhhBH0yPnmPbh/f/D9JfeOx
P7i/xyCV2HmDUrK1ktoJOMcoYMKKftAL3U+GYOHW5McTGJ2Puc7Lo4ZJCRG4S53aR2djVmJLH3O5
zFJJNlyQKFBN/KKcvMFl/kyxN90i5ndmC88fePvDhdomsMvcfuL2zPQXhHYq6uKuxV2KuxV2KuxV
RurWC6t2gnXnE9OS1I6EEbgg9RhBpXzr+Zv5XTaC7X9gvLTzTkKgcf7tB9uR2NWc9s2eDUcWx5uT
CdvOIv7wf59sGuP7o/jq7Ps4fvh8fuKNt2jEymQ0Tep38PbOfhEyNB6bLLhjb6u0zzBo9zoYnsJ/
Uhhgop4utOEYP7ag9CMy8944knoHg4xMp13l5ZfXn1rzGZj0Nzsfb1SfAeOefZsvHqL/AKX6Xt8W
PgwV/R/Qn/n78xrHRvLcenWz89QntxGUow4q8TpWpjZTRl8c9H7PwmUIk8qH6HjMkLyS95+989XV
xJcXEs8hq8rs7H3Y1PSnjm6Apm9i/wCceGpc6gvj6P6p8wtbyDqsn+MH8dHuea5yHYq7FXYq7FXY
q7FXYq8i/OOJl1K0cjZ/UofkkQzYaTkXkfaQeqHx/wB688zLeZXQyNHKki/aRgwPuDXEhlE0bZJf
6omopayAjnDbxwv81qT2HjnmvtHglHPdbH9cn3D2R10MulEQfVH9EYoTOeerdiqc+UJFTzDZ1NOU
saj6ZFzP7MlWePvH3hwe0ReGXuP3F7ZtnoLwjsVdirsVdirsVdirsVdiqncW8VxC0Mo5RtTkKkdD
XthBpXzV+ZnkOPy3qgktyPqs32F7jgkYPV3bq+T1Wo4oV1eg7GHFInu/awadqLTxyHZ+K533ftdl
2pmAx8Pf+xOvKFlcNeG4oViVacqbEhlNPuzE9pu0I48Xhg+qX3ESDgdl6YynxHkP2Mr1GURWUzk0
ojb/AOxJzhNDjM80QP5w+96DUS4YH3F5vcv6lxI9a8mY/ea569gjw44juAeMyG5E+allzB7R/wA4
8ofXv2/4w/qnzB1vIOomb1B8v1Pcs1zlOxV2KuxV2KuxV2KuxV5p+dFnI8Om3KAcIfX9U71+IxKv
bM3RnmHmfaPETGMu6/t4XlWZzyLsVV7WcxyAE/CdvxGaTtzs/wDMYiR9Ud/kD5PUey3bB0moAkfR
I18zHfmO5NAQQCOhzzGcDEkHmH3HFkE4iUdwRbsi2IzR5xBqtnMTQRzxsf8AYuDl+lnw5YnukPva
NTHixyHeD9z3kUOekvnrsVdirsVdirsVdirsVdirjir53/OjWxfeYfqsTckg6gGv24om7E+GYuU2
Xrux8PDjs9f1lg+seWtW08QPcQsFuOfpni/7FK9VHjm20cowx2fxu67XZvFyUPxszDS7FLO0jiAo
1By+fEA9h4Z5l2jrDnymR5Wa+Zek02EY4AJd5svRBYemD8ch4kd6MrDxzbezOkOTPxdI7/EGLh9q
ZuHHXU/qLBs9KeXdir3v/nH3TZY9Mub1qcJvT4UrX4HmU12/jmu1ktwHURH+EZD/AFfuev5guU7F
XYq7FXYq7FXYq7FWJ/mdYNdeVbl442kmi4emqjkfimjrsAT0GX6aVTdV2ziM9PKue33h4Xm0eAdi
rsSLSDRtHWVzWkbHfsfuGcL7Q9jkE5YDbr9p6B9U9kPaMSAwZTv0v/NiBvL9CNzjn0gLkYq4YdVI
I+jEGigiw9w8vammoabFOrVY8uW9f2mHifDPRdFnGXGD+ObwOswHHkITPMtxXYq7FXYq7FXYq7FX
Yqgda1S30vTZr24YLFFxqagfaYL3Kjq3jgJptw4zOQiHzNoVje+bvNiK4LG4r6r/ABELwhPGpIkp
X08w4jiL2eecdPi9363qf5jyaLM1tZwRRs9rz+ILGQPU9NuozUdr9qGMfDgefP7D0LrOydESfEn+
OYYa7qiFm2Cgk/RnKwiZEAdXoyaFsB8x6ibu+YA1SOqjw+Fm9z456f2BoPAwAn6pb/MB5TtHUeJk
8h+1Kc3zr3Yq+n/yY017PyRYytT/AEmPmKeBkkYdh/Nmp1Urm6zHH1Sl3n7iQzvMZudirsVdirsV
dirsVdiqjeWy3Ns8DAFXpUHpsQffwwg0WE4cQp8239jNY3clrNT1I6cqVp8Shh1A8c3MZWLfM8+I
45mJ5hD4Wp2KtqSpBGxGQyYxOJieRbcOaWOYnE0QUxtboOArH4v9r3zzztrsSWGRnAXD7uZ6B9h9
mfaeOpgMWQ1kG3v+kdZEkklE5zT27Nfy98xi0uDY3L0hk+wxOw4h2PVgBUnwzoOxNdwS4Jcj+0ui
7Y0XHHjjzH7HqANRXOweTdirsVdirsVdirsVdirx/wDO7zeEgXRbaTd6+uFPgYpV+y36xlGaXR6D
sbSb8Z/HMJF5CEXl/SpNQKg6jcU9EMAePB3Rv5HFUfsc1Gt7QGGND6vx5uzz4Tnnw/wBTmnlnkMk
rF3PVmJJ2FO+cfOZkbLtIwERQY55n1hbe3NvE3759moeikMOxB6jOm9neyjlyeJIekfeOE9zq+0t
YIR4RzP7WFMxZixNSTUnPRYxAFB5om2skhEadaSXl/b2sQrJPIka1rSrsFHQHxwE0GrNKoH3Prny
bpx03yppNk324bWIP/rFQzdh3PhmlyyuRLh4hUQnOVtjsVdirsVdirsVdirsVdirxz82NCe01VL+
KICC6rVkXZfTSNPioABUnbfNjpZ2KeN7f0vDMTA2l+igx3yj5e/TmsQWjlltyw9Zl2YLRm2JVh+z
3y3Lk4RbrOz9H4+QRPLq9C1D8ntIMBNlcTicD4RK6ca0PXjFXrTMSOrPV6LL7O469JN+df8AEsA1
7yZrOkOxlhaSFa/vUV2WgrvyKKOi5lwzRk89quzcuE7ix8f1JECytUbEYcmKOSJjIWC4uDPPFMSi
akEfbXgYBX2Pj/tnOE7Y9nzjJni3j3fM9A+rezntdHKBizmpcr/0o5mXvRscjxuHQlWHQg0Ph2zl
ATE2HvyBIPU/JvnGK+iFreOqXC9GYgA1Lt1ZiTQDOy7L7UGQcMz6v7fN5PtLs04zxR+n+zyZhm9d
I7FXYq7FXYq7FUq8x6/Z6Hpkl7dOAqUotVBNXVdgzL/N45GUqDfp8EssuEPm101HzDqb6hqJYB6c
h8XZOHw8+f8AIO+c/ru0xDlvL8eb3WHAMceEMkLEgL0UdFHQV9s5TJllM2S3RiByTHQ9CvNWulhh
Q8DXlJRuI2JG4Dfy5kaTRzzSoOPqtXHDGywX8z9Oi0/zRNbxV4LyArTtNIOwHhnq3Z+COPEIx/Gw
ePlmlkPEWI5nMXYqz38nvKzaz5ohnlST6tYlbgSqPgMkU0R4MxVh0bpmNqcnDFxNSbqL6cRFRFRd
lUAAewzUsQG8VdirsVdirsVdirsVdirsVS7X9Gt9Y0uaxnFUl413I+y6t2K/y+OThPhNuPqtPHNA
wPIvM/y3X9G+aJNPlNXJUA+NYnbtX+bxzN1G8beX7Hj4WoMDz/YXrua97Ba6K6lWFVIoR7HFBFvO
PPf5eRyiXUdPWj0aSVKk1Pxuxq7/AC7Y/mp4t+cXV6vsTFnBMdp/E/prm8rngkhlaOQUdSQRsdwa
ds2en1MM0bi8brdDk00+GY+79vcrW940ezbr/n7Zo+1OwIZvVDaX9nm9T2D7XZdMeDJ6ofAVz7ok
8ymMUoYckOcDqdLPBKpCi+s6LX4tVDixmx8f0gdzNfLHn6e0At7795F2fZafaPRUJ6kZtuz+2ZQ9
M9x/b3BwNd2QJ+qGx/Hm9G0/VLPUIvUtn5r32YdyP2gPDOrwaiGUXEvM5sEsZqQReXNLsVdiqB1P
WbDToy9zJxIFQKMa7E/sg+GY+fVQxC5FyMGmnlNRDxvzVrDa9fiaUfuY/wC6Tw5KobcBT1XOP13a
08u0dh+PJ7HQ6EYY+aWUGad2DJfLPk661WQSy/Bbd22NftDoGU9Vzbdn9lyzGztH+3zdVru0o4RQ
+r8eT1ew061sIFgt04Itdqk9ST3J8c7TDgjjjUeTyGbNLIbk+W/zRvBdecb5gfhSSVfunk9h45vt
OKiG6A2Yll7JWtLWa7u4bWBeU07rHGtQKs5CgVJA6nATTGcuEW+rvy90B9I8s2MU4pdNBEZB/KTE
gK7MwNCvXNPmnxSLhR33PVk2UsnYq7FXYq7FXYq7FXYq7FXYq7FWF+c9IW0vYPM0CVlspFkuN+qV
jQ9SR9gHouZOGdjh73Tdo6cRkM45xNn7B93kyjSdQh1HToLuI1WVEY9diyhqbgeOUSjRp2eDMMkB
IdQjMi3OIBFD0xVifmzyLZatG80Q4XVCQfiNTRj3dR1bMHLpjGXiYzUvv69W+Rhmh4eUXH7unR41
qmjXmmzGK4Tiw91PYHsT45s9F2pHKeGXpn3c/wBFcnh+1vZ/Jphxx9WPv2Hd5k8ygo5GQ1U0OZup
0mPNHhmLDqdF2hl00+PGaPw/SD3o6G+U7Pt7/wC0M4ntH2anDfHuP7O+T6f2P7bY8npzek9+57+6
PuTGzvri1lSe2fhIpqrUB3+TA5zMZTxS22kHuv3eaHfEsjtPzC1yFQsjerTvSNfDwTNlj7bzR57/
AC/U6/J2Pily2+f60U35m6oVoIqHx5J/1Ty49v5O77v1NQ7Dx9/3/rS298869cgqJvTRtivGM7Gv
fgPHMXL2vnn1r5fqcrF2Vhh0+/8AWkU08szl5G5MxqTQDc79s1spmRsuwjARFBVsdPur6YQ2yc3P
aoHYn9ojwyeHDLIaiN2GXNHGLkXofl38vIYCJtQ/eMK/u91/mHVH+WdToexIx3yb/jyLzWs7ZMto
bfjzDOERUAVRQDtnQgU6Em0FrepwaVpk19O3GKHjyahP2nCjoGPVvDJwjZpQLfHeoXb3l9cXT/an
keQ/N2LeA8c3kRQpzAoDCpL238jvJP7s63dwcXLUgl51qlIZVHFX+ncZr9Xl6BwZ5OOVDkHtgAAo
OgzAS7FXYq7FXYq7FXYq7FXYq7FXYq7FVO5t47i3lgkFY5VKON+jCh6Uwg0xnESBB6sGjW58p6ww
PxaVdSEnoOBkfr/uxzRI8yTWQebpAJaTJ/tcj95+J5BnNvcRXEEc0R5RyqHQ7ioYVHXMYindwkJA
EciqYGTsVQepaVZajD6N1HzX5sO4P7JHhlObBHIKk24s0ocnnfmD8pyay6a+/wDvun+qOryfPL9N
lnj2JsOh7S7Hx5vVD0y+J7u8vOtS0m+02cw3kfpyDtyVuwP7JPjm3hMSGzxefTzxGpBQhneI/Cdu
4zC13ZuPUxqQ3+P63Y9ldtZ9HMGB9PUbfpB70bFfRtQNsf8AP2zitd7N5cdmHqHwH3yfTey/bXBl
qOX0y+J7u6KKUhhVdxnO5MUoGiN3ssOeGSIlE2C0jq9wlum80hConSpY0G/TrlmLS5Mh9IZzmIiz
yZzoP5dXE6Rz3zemrBW9OgOxoeqv883el7Bkd5/j5F0Wq7aiLEPx9j0Ow02zsIhHbR8E8Kse5P7R
PjnT4cEMYqIp5vLnlkNyKKy5qWu6opZjRR3xV88fm/8AmIutTnS7F62SfbNPtVEUg+0isKMp75s9
Nh4dy5GOFPL1RnYKu5OwGZjOcxEWeT078rvy4k1K/hvr1P3UZWVEqOitGwaqyA9CdqZi6jNwig6m
er8eXDD6X0Na20dtbxwRiiRKqL16KAO9fDNWTbkxjQpVwMnYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
VC+soby2kt5hVHBHfuCOxHjhiaLDJjE4kFh4e+8qXlHHqaPK+7fCPT5N9qg9SRuMceZG0x5uo9Wl
l/tZ+z7zyDMLK9try3juLd+cUihlahGzAEbEA9DmOQQadvjyCYsclfAzdtirsVQeqaTY6lB6N2nN
O27DuD+yV/lyUZGPJpz6eGUVIPMfNH5WT28clzpZ9RUUsYtl2AX9p5PmczcWpvYvLa7sIxBlj3/H
mXn1xaz20rRTLwdSQwqDQg07V8MywbednAxNFu3vLm3Dei/DkCDsDsfmMhkwxnzDfptZkwm4Gvkn
HlHzJDoV5Jcm39WaVizycyv2mVjtxYdVzGOij0egj7VZ5REZ7ge7/iXo9h+bOiTAC6X6udqmsj+H
8seVy0sujmYu38Uvq2+f6k+g87+V5xWK95f88ph+tMqOGQ6OfHtPBLlL7D+pVuPN3l+3iMst1xRa
VPpyHqadlwDFItv53F3/AGF4x+Yf5k6rrqvp+lR8LI05PVDypwcbSRqwoynvmfg04juVPaemhvKX
2S/U87g8vzsayniPDY/qbMq3A1HtLjH0C/n/AMS9H8gflr+kJVnljpa7cmr1FUPQSBvsnMbNn4fe
6/BHNrZXk/u/h+ijyL3LS9MtdNsorS2XjFGqr1JrxULX4ix6LmtlIk2XpMOGOOIjHkEVkW12KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVp40kQo6hkYUZSKgg7dDigi+bGtR8ry28/17R3+ryK/qzQK
SiOASzALGu5Ow3OXRyXsXXZdEYnix7Hn+KdZebhFP9U1W3ltpB0ndPTiIBC/akbr1PyxOLqE49dR
4cgMT38h9rI4poZV5ROsi+KkEfhlRDsBIHkvwJdirsVQd/pGnX8ZS6t45ainJkVj37sD45KMyOTT
l08MgqQBYTrv5T2Vzzk05/RlNSEYqqV3PRIyepGZMNURzdHquwIy3gaP47gwHWPI3mDS2f1YGljW
v7yJJGWgr3KL/LmXDNGTz2o7LzYjuL91/qSBgVYqwow2IOxBGWuBKJHNrFi7FUVp2mX2oz+jaQvK
/cqrMBsTvxB8MjKQHNuw6eeQ1EW9L8p/laIh9Y1gI5PSIb0pyG6yR/I5h5dT/Nep7P7CEfVl3/B7
w9JjjjjQJGoRFFFVRQADboMwnpAANguxS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FU
Jf6TYX8TR3MKPyBHMqpYVBFQSDvvkoyI5NWXDGYqQYvc+XPMmnO82kXpljFOEFxLKw8D8MajxJy4
ZInmHWy0mbGbxyvykT+hSTz3rVjJJHrGj3LcaUls7aQxmor9qRx4jD4IPIrHtGcTWSEveI7faUVb
fmh5YmUF5TB7StEh/wCTmROnkHKx9oYZcpD5j9aIP5jeUQKnUIR85of+a8j4Eu5y4zieRCCu/wA2
vJluCfriSkdo5IG8f+LB4ZIaeZ6NggSxrVf+cgvL8AZLG2uJZRXizJG0ddx1WavWmWx0curMYiwL
zF+dHmPVw8UcccMLVACCVDQ8hvSVhWjZkw0sYpOKFepiMWqarLcGQqzl2qwIcjc18cyKDp9fodJI
EkxifLhHezew8r6/eyrHFYTqHrSRopAgoCdyFPhlUssR1eKxdn5pmhE/I/qZxoX5Rzlo5dTlUL8X
OONjXuBs8XyzFnqu53ml9nzsch+X7Q9A0ny1oulJxtLWNW7y8Iw569WVV/mzElklLm9Fg0ePEPSB
8gmmQcl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqctvbzCksSSA9Q6hv
14QWMog8wkl95F8rXacW063h94oYVPb/ACD4ZYM0h1cWWgwnlED3AfqSS8/J7ytPC6J6iM3Rh6Ip
Q+0WWDVSaT2bHpKY+P7Ekk/IfRiTxlanuyV/5M5Z+cKBosg5ZJ/6YtJ+QmjV+OVqd6Mn/VHH84WY
0mX/AFSf+mKa2H5KeUreLjIrysTy5MIWPQbVMQ22yEtXItkdIa3nM/5yeaf+XXlGy+zp8M3vNDC3
h/kDwyuWeZ6shpIdRxe/dkMVtbwikUSRgdkUL+rKiXIEAOQVMDJ2KuxV2KuxV2KuxV2KuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2
KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K
uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux
V2KuxV2KuxV2KuxV2Kv/2Q==</xmpGImg:image> + </rdf:li> + </rdf:Alt> + </xmp:Thumbnails> + <xmpTPg:NPages>1</xmpTPg:NPages> + <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency> + <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> + <xmpTPg:MaxPageSize rdf:parseType="Resource"> + <stDim:w>48.000000</stDim:w> + <stDim:h>48.000000</stDim:h> + <stDim:unit>Pixels</stDim:unit> + </xmpTPg:MaxPageSize> + <xmpTPg:PlateNames> + <rdf:Seq> + <rdf:li>Cyan</rdf:li> + <rdf:li>Magenta</rdf:li> + <rdf:li>Yellow</rdf:li> + <rdf:li>Black</rdf:li> + </rdf:Seq> + </xmpTPg:PlateNames> + <xmpTPg:SwatchGroups> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Default Swatch Group</xmpG:groupName> + <xmpG:groupType>0</xmpG:groupType> + </rdf:li> + </rdf:Seq> + </xmpTPg:SwatchGroups> + <illustrator:Type>Document</illustrator:Type> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?> +endstream endobj 3 0 obj <</Count 1/Kids[7 0 R]/Type/Pages>> endobj 7 0 obj <</ArtBox[0.0 0.0 48.0 48.0]/BleedBox[0.0 0.0 48.0 48.0]/Contents 191 0 R/Group 40 0 R/LastModified(D:20161013192721-02'00')/MediaBox[0.0 0.0 48.0 48.0]/Parent 3 0 R/PieceInfo<</Illustrator 192 0 R>>/Resources<</ExtGState<</GS0 193 0 R>>/ProcSet[/PDF/ImageC]/Properties<</MC0 189 0 R>>/XObject<</Im0 194 0 R/Im1 195 0 R>>>>/Thumb 196 0 R/TrimBox[0.0 0.0 48.0 48.0]/Type/Page>> endobj 191 0 obj <</Filter/FlateDecode/Length 1243>>stream +H‰lWIŽ7¼×+øæ0™L.WÃÁ|ð–|è±!ùÿ€#VõȺYÌ}!ëå·×ôòñµ¤Ÿ>¼¦£äÞF¯ˆþö‘¾}9^~ù½¤/ÿ%•Ô¦þûóø||}Oø#ý RmœW£QOúzŒ< ¦åJK,EÉu@Íýíxùõ¤ÿŸT?45ýKõMd²(qÉÜZK½dhXÊ«/ÞŽq–ÉX?Ž[]y–ŠõÕ¼–ªãÍÆŽ ÷ã¤ÄóqQdÁÜž¶´Û¨à¡´5m|‡{ý8¨«'!ôlY†Šû± ñ|œ„08Äû3M@o‡ä!dk*!€‘¬zÁíß&œî„‰Î’„ÍÜr®îgD7‘¡•™å¤¨R˺ðv卵þ]7ø”©AÛ5±áëuöÉꂺV$-”UÖâB]ü Þ®ŠôÍ)œø]ÞÔÌ}¢àjÍ,µ>×?½œ(ó´ØP²âäzº¬Ž"kÒÇ!CH@ÐÚJ!Øzé+$&·²7QžMJh/)xt‚…“3œ¥C$õ\à Ìo™W -é,RÀe$~®uÁ˺ÁàMòÞŽ;\Ö¨š Ú<,�³´-½]›=[P Ws¡zExxÄ4|@ÎøÚ~|œ«ì°¡ÔL[AÂì@:jˆ¶$çñè<‡ñnµwÕ +&Û(Å2aós±Œ¼¦DµÌL:B“®ê€þ]0'¬«š×A šªóñŽB5—¥XÛµ8ÿ‚=àCáä¶÷.˜Ê— ª&ã5‚ŠhÎxª©! +Ä´µèZmF੽’K£Ø@ÅÞukèŠx‡adY›{tÎna#7ewE”Ÿ$ððŸ›ÑåUGt¶@Ÿˆd³ ¯µà6tLg0a-Ofª].|ò96‡-ï`yç4J¹®g§Q¡:¨¶´“Ïu9{Ï]› +xY#÷,•7j2L”>N¤¬ñ¾ªë"XMtkW“6foWiaGZi± Ñتí"—˜FiÁíx<a³’ý|Øç#›ùÛUø´¡¶Œ¹Ýd] ®=�xwÕã‚Ús.dÈÏvŽ,;AæÔ·8Ö߃gÒHYéÏ ®’¡RY£H&ƒMW›KTl‹Á9ÇV7V¯1ÐZÌLÖ>¯FX¥É¹h¼ô&&Š–TÛõl†à˜Ñµ©’�vBŒpÀ /[NèÞë>íb9çQ9¢§/³ÛïVå3Q'ÒŽ€qy‰z®‘'DOAi;%(¥Ù=]@ï °z´’Ѧˆ4xÙ€|„:TÿêtFÃ+«ÌN\×àÀ"_…ÚCZï¾U3iƒO•èéÑìµéy@\4eCëhøiSQNˆ+©Xë’å >ãŒÆ¡Óí:«Ké׺§Äó¨±òŽöã0cŠ.œ¸G‰v÷3²DÚn׎#5iuz"Yïv(«fï¬1`@u¸�±Ewþµ{£i{-»{—Ù¿k8Xƒ:r¯ñÜÅ‚1‡w.LÕŽÛ©*«M»“_76¸x4ÜDZ›~ÛÂN»ƒi(îŠsò@ý#ü#áçøRùO€�êµjÖ +endstream endobj 40 0 obj <</CS/DeviceRGB/I false/K false/S/Transparency>> endobj 196 0 obj <</BitsPerComponent 8/ColorSpace 197 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 6/Length 54/Width 6>>stream +8;Xp,*=NntbilQcrP\BEq:Dh)?b\efqXp)5l`h#3lMpqi!97E),l~> +endstream endobj 197 0 obj [/Indexed/DeviceRGB 255 198 0 R] endobj 198 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 +VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< +PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 194 0 obj <</BitsPerComponent 8/ColorSpace/DeviceRGB/DecodeParms<</BitsPerComponent 4/Colors 3/Columns 630>>/Filter/FlateDecode/Height 201/Intent/RelativeColorimetric/Length 30600/Name/X/Subtype/Image/Type/XObject/Width 630>>stream +H‰ì×gsɆá_|Ò¯½ö®½É9GåÊ9€’@H€„È”³sÎÞýpºçíº‡¬ã$\OÕUOÍLÍ÷»^{k§>J‡ÌvP-…4}¢f¦ýã´åj4Ø?[Vƒ¢5Ÿz¦©ˆ:“Æ–ƒ`ÿ·Ö6¶Ô64P“«¾…T+š«ëíŠ:UL}³Ê®¨³WÖÙªèO]e-WQÃÖ&«¨ÉÕDÊeÕÖʪó¹S©¸]Ù`‚Ô“[&åÂÍò:E™â†ÉºëYµù\»ÍÔX¸%\U]¹ÉT+nTÉ.›UÊ.]ÏqT0 W®–W¸óù\.;grIqöÒrÆäâÓ²·ÉŸ†ó²[œS½õûY±š›ä7ÃÙ_O§¸ëYr'Í®‘_Ȇ«äçß…ä7ÃrœüJ.ÿDN)ŽéŽžºÄcNrGO^<ú÷cÖæÈϲ‹GN\8râ<ó_Å…ŽŸÿáø9æ?†ŸÈYòoÉ¿˜cg¸£gþ©úÇÑÓÜŠ•õÍÒ³¶¹ü l˜dde#³úŬ¬“tkù,‘å’*,³ªH¯&³V +X\*bA–Ê+‘Z¶’I$¹x1±EkÑYÚ,a!’H‡µÕ-E)m…p|)¤â_bKó1¾¡X*KêRóÑd0’d›Yd‚‘Å9m s\r.¼h2’-À¼™?h’ >2'3&³$6ò¢^Ö”ÁÇy|Q·Æã‹÷ŒµÉé°lÂÊš)¯ÞÐø3opy˜ ·0æž“N*F&f%fXã—Í:]§Ë/sŒ1Ǩß1êc†4ƒÌˆa†Vô3N®O˜&½ŽC\÷·‡›êäº ÄÃt‘~Og–›éе÷M*z'Û„ ¡‡kÕ´0Ýã²æ.—ÌÞi#¶®©c”4¶«ÚFHC+WÏ s-B¡™8»³¶ÙYcwÔÚl«‰m¨º‰«²éØs#3ÈTê*˜®¼a€”ÕkêúU}wj¹ÛBïÒs³Zq£Št“ë•Üû¿þ.9o?óþ¯Ïî÷Áðöý‡7ò®ˆ×Ÿèí{æUQoÞYzI^”E½z+{nxù¦€g/ +yúâÍ“ç¯-=ÎçÙ+æQaO_=T¼ž¼|`òø…ì¾¥G/î™=W<|~7׃çûÂ3ÙÞý§f÷¸]ÕÎ]ÃÙöþc³=nKµ¹÷hc÷ÑfŽ‡d}›[˵õ€Yͱ²y_¶¼¡[¿ÇdLÖî’´jiuß$µ¢YÞ#IÕbfW¶Þ‘%KB<µ-‹%·dÑE²iYØ…†u&×ÅÖȼ&5¬’¹ˆb6¼B*hYæ›f‚MšLÏqÞYÙ +âO·?Éù’“’‰™EÕÂÄ47®syI‚ŒM £aÄ×ÄÈð$çÔ9&¢Šñr‘ð 4ýÌhˆé3ŒÌ3½Ã† Óãœ#Ý×54K:uƒ¦}@hðsýÓÊôq-½BsÏ4±ws6C—WÖÔÉíݽ_rvÛ¿÷ìÔÞݶ?Ñ®°Uľ¥ÍƒÙØ.lÏd}‹ì°¶YĪÉÆŽ¥•|Ö·ÉrA™µ\[LzUµ²)[Ê#µœkC–ÌXX4¤×eK¹ÖH"•7$±äªÙâ +ÍYPD–™Hb9, ÅsÄ2Ì|,mŒ*æ"d‰Ì†MR$RøçM’>fds‹º2=«ð ¯?ÁvJåñÇen7鋹}1Û™˜{šïätT6á5D˜qÔàÒŒyÂ[wÈdt’Éš'êñ q +sŒÃ%f™ÁÑ\f`DèöËúœ\/çãB¦{hƤkpšt’ƒ—tôs횶¾)³^ÓÊôp-=n¡›kÖÙ»[פÐÉL4uqÒÈ´s †6âªo긱º2Z«©iv®Z®¶ Uœ³²I¨häʈC7T^Ï•i¾N¾jÝ +¶ìs9x÷Ë—¿²#‹ãž¥Ü&¦3Ÿ|õÜ) _1ó¦S/¦IÞz®m‘LAæ’r›Œ¹žË²TV]—™š)ÑjYRÍ*‰'³¤€*rK*Ò™#¬Æ4’È0áx&$™åˆ¦5KA•S5©Ö% „’„5Tf”TJê"§ÇtÚDÄ4AxI%Ù˜úã$'©1ÙäŒàž‰2RR#2£¤ãSaâ"ª:ʪÓz:o22ÁI1 ç¸Ê5GôªÎ’œ¤L1Õù‰žTŸLJê7$ä&U„Õ()é7L‘ö>ŽzÚJ1•õ¸ …µ¹{ÒÄÞ¥`U•éau íBiê[ÇHi%µ-#„·•çu˜©6Øœ¤JSisT6q‚ÒVž×AR¦ùæ¹DaQØÿ§°ì·(¬Ud¿“ÂZDV6}˜ +»`YXïá(ìXÁÂŽ”ta +Ö"²‡¯°5y +«Ý°(, +‹Â¢°(, +‹Â¢°(, +‹Â¢°(, +‹Â +(, +‹Â¢°(, +‹Â¢°(, +‹Â¢°_¨°…EaQX…EaQX¶ °(, +‹Â¢°¥RXÊ+ +[*PX…EašóŠÂ¢°(, +û¹òŠÂ¢°(, +‹Â¢°(, +‹Â¢°(, +‹Âb(, +‹Â¢°¥UØ1öpVä…EaQX…EaQX…EaQX…EaQØÒ¢°ù +kW…EaQX…EaQX…EaQX…EaQX…EaQX…EaQX…EaQX…EaQXÖª°¦¼¢°(, +‹Â¢°(, +‹Â–…EaQX…=´…-CaQX…EaQX…EaQX…EaQX…EaQXöë6ˆÂ¢°(, +‹Â–ha7QØC]XÜ°(, +‹Â¢°(, +‹Â¢°(l)@aQX…EaQX…EaQØ/ZX9¯(, +‹Â¨°”W…EaQX…Eaqâ°(, +‹Â¢°(, +ûÍs‰Â¢°(, +‹Â¢°(ì!¢°(, +‹Â¢°(, +‹Â¢°(, +‹Â¢°¥…EaQX…EaQX…Ea-óŠÂ¢°(, +{¡°–…-–W…EaQX…EaQX…EaQX…EaQØ藺¦¼¢°(, +‹Â¢°(, +‹Â¢°(, +‹Â¢°(, +‹Â~Ï…íGaQX…EaK²°"¯(, +‹Â¢°(, +‹Â¢°(ìa+¬Y…EaQX…Eaqâ°(, +‹Âþý:júÌã�ÎìlÇmÕz®Š Øé?ÐN÷˜ýmgº;ëzpŸ¢rÔ£¶×ŠœÚz`=Q$$ÜÈ ƒ„#„„#!B$$á]»³º³;⾓¯Æ.A¤”~™÷|'ùæyžoxx^χ¶š–v^„5 0xœÞr$ƒ–ë‚O +K +ûSÛC +K +K +»„…5›FLÚN6…‰væ¨ PÞðð®ó+,ÑXoA|Ægƒ,),),),),)ì¢Ö4d~ØÓÚÎŒfùúçÿmGþö¿ ü}'Ë7 &2JÝ&×¼°zx:ðRIn@©R·+:ÅͲ¦æ–&i‹°®‘+ò"ÛpùB4@J•ª§D¼êÌã˜3[a-1Iag%l—ºˆ}ußka»ñšˆ¾o%¬õæbÖŽWRØÅ&,Á+)ì¢Ö8(¡gPVP~³Š¶Þ‘¶ÑiA³a|øéÄXïHYö!}ƒSCJšaôñÜ„íךšeU^aqin>‹ž‘ÍÈÌÉÈʵ&3;oÒ¼l™K´/xPTÁæÔŠ¤r¥ªVêƒo(,dïí×££¸¹EÞÑE +;£°¸9¯r¥º¥]Ù$mklj54‹›…õ’jn-‡+¬âðKË«JÊÙHE·š'ÄýA¨AR'–Š¥mÒ¶Ž6¥š +ÏAX±T.‰ñÄÖ5),),)ì’Ö04ÒÁåÓ7»Ð·¤oùh!⼶љºv#eùZʲUÔk_wÞ[ è©«K…õ›œÓ\è[mù£;n•s¸†á‡³3Ù,k‘3+'?;·`ÎAw„§€UTZQÕ(‘¶ %í$¼öhû+«jÐRçä1em +t!…JXÜlïèfWóŠJÊY…¥ùÌ"L–`â)ˆXëÒ¼J.Þâ4•Ï,ÄBa©8<¨Û +=ÍÕ.Ò¥QXE—–+¨Ç ™–3Xe5Ÿ––vÉk}Ìܾ޽SR%ü¢,_“êà@{5ëÏŸW†¨‰•$%w02•™Y–d+Ò ×oÖ_½Æ9v¼Ì/�Íèk7¥88¤ýz¥ÜÍ[ÍC½Sg78ÝüôwÌÖàÈ謄5˜†ªkøØ!§¡»·5³Ò\âÊÖwvkôÆ¡i„ëÑØÚ—ù Þ¡1)ì¤Âv¨z‹K+‰éµœ‹æ|4z/1ZIåm«B…ªvaå½’üdÛþ‘Ô‰[À.),)ì’Ö–×%/¬apXÓÚžîòñ;*i›¶PÌ•éêºMyŸý±!&VSÉíÑüËhúÏ“Çž½˜âç¿ÿ~úlôš¡±A*“ÝJ,÷ñg¸|ŒÚ–òþj\iŽ[ÞŦ;o»ç¼-Ôݳ®± “3«¶©¹5,vHÔ#ˆ§¸R¨ô»÷R*1¾¶}íÚ`÷FIÛÐ$…˜–bÖ^Xn ¸´Â"Åë.W®^Sõh§Aö—+¬¥€-`ÙΘÝAˆXbEÆ-ÇL'%\æƒHÜÞ©Q¨´S«ÔÛÌð¬ø‹—8¼zàK +;aù¤°¤°‹GØá‡íE¥éÐj~kC'šæð«¼?üIQ•Ï|:<bÕsŒÈØ�ûüùØä{ÕÌÖݱ`LNgpŽŸÈýô÷©xʼŸ 27:ܾó|Lœ¦O§7¾¡°²üÚº”4Úµë7ãâ.ž +?sô؉ àÀÀ}î‡—§§·›«ûÙ³‘¯Ù¥1üüö…ùêhÄ™³ß}ùƤä{)¸ŸWð�ûݾ ÄË+«»5}¨X' +Ë**±zÁÓYùü¯x7‘ÂN¬a•ÝÚ +v €Ã<c¶‰ §gdcòï§Rï§Po''&ÝMLJ¾t÷¼bbÑ�ל܂|f!Ñq"¸X”´856·)&”±fa»Æ›ÇDû#G¾>!mëBRXRXRØŸµ°ò’òôÍ[çKX”–”VS?\_îíÛÇå=ÑÆÆ^ª:%¦ožWÜþïé³'ºuiY… uå:ʲUfjçéWÈÜäüån· ÐrÅ€ièÍ…ÕLÚ~}tt¬››‡————7<%Tµ¼5ÇÛÛw¾=wÞ*,êÙ={öúøø¡ vuuÇÜ =pâ›°KW°KÛíÞØ‹ËP™Ú!‹·|a¶h¢¼ÂÎÙ#ÏGGHa' +Ûe)c,N5ñ¾?ýcÇ¿9|ø«‡‡"þþ{pLJJ¾O¬–ãÊÕöí:tèÈ×G‡Ÿ>#02²'y±‚x[Ív¨ú&Ô°½MRyFVñÇ�©qºÂãú’'ãSRØ%)¬=¯¤°‹NØÒÅ&,ÍÉ%í½•9Ÿ|&N¸ö£No-WçÖ)*\âçéÈC#³lÏ^ªÃ +êš oÿ‹@Ø#®î»Ü<šše³1˜†êÄÇPº…œ +À¦};)™FÏÈ+`±9Üj._"miWvñjED¥i.3éYØQOŸ>SÁ®ÎÉ+¸{/åò•„ˆˆ³µ;vìòôò>>&%†í×Ù¢’²Þ~½-²xé×UÕðiéiTzTt,FÆ W~0 ÏUX{d—’°ˆJ£k”´¸ººyyzãœãííc9yº»y¸îvÃqhïÞýHPPèa¯&\Gc|º{—+Ennîh€ã°S§¯ßH¤Ñ3m×ÁɇÍá·+{l…E]}\A=þÐåVâÿ€@Œå"ÉjØRXRXRØ¥%,l¥,_Kû`M}lü“Ã;„u²Ô>{üO£TVî·'ÕÁ²r¾Ò[ +»s·›xöÂ"ÆÁa…²K"kíèêÖôéŒC#†ÁaC!zL»i#Â"؇±-Ÿ‹ŒÂ°†¡´ï×;U=²Vy}£„UXwÁËË'0p?ê&¢8µ"+¬kD/Û2o\XXøþ _?__0QZÁÖgV«3ŽÉãøÆ?°Ó4¶š;ga;Õý]š”T&ÙÛÛ÷Øñ“ñ¾¿{Ÿ’Ëd×8<‘@$Ô‰ùÂFæƒbbæ!,õó¸}ç>‡'ddæÞ¸uç\dLpÈž^îîž7$ä‹K—°Êhl[Ì¢½µ’%„E”jÝí;)ÁÁ¡A÷蘸ßfåu +a[Ç5P±eW&W“Â’Â’Âþ|…¥nØLwrFÇ<}´À¶Nt?O´}¨ºãVs=ûSkŽÁI‰–¨+í‚%R«°¬"ûmd”V7𲽃 /F�ÇæáQ¸Æ*,>v*°Z‘Mgd±9\|Ik «T©+«jhôŒØ¸‹Ø¨AFJ*µG«ëÓ§Œövª{[åQC›“Ï,DÍÅÈÈ6'+oyQ›¢-RXâ£ve·DÖÎáÕ–”±sXŒÌ"˜ +fa‰@ÔØ®TMŠì› Û×ÙU÷ê{ûˆ¦ÏУèîÕ«4zÛ¾ÊnmqY%±jÿg¿ÎcšLó8€»l6ûÇÆÌl¼fg'ëdœ¿&³ÙÌf’ì&3*åPä]VÔUnäðAE@9-Ж +½¸ïA)Ж´”¶”«(N²;ÉÎfÌŽî·¼ðòZÑ ˜—üÒ´oßçíï}ò|Þ/!,ž^ŠKDzÓ¸Î�âdžŒãzÓ$ܬmlcp¯Ä'zyy{{ûfe3Éõ²&Y.¿[*Wióª‡kZ1ÃÉ7oœ�ÐÁ!á½2ÍòÂö«Ú»zëÚ$åÕè +KÆáñQÄÌ44wt÷*m¥…¥…¥…ÝÂ:îÎûù¯Š?üx¬£“0n]lµ) û㜒+*®È³ìŽk/ìBUm…홶t1aQ#”2[Æ,uzc!‡w û'¦®Ä'ôÉÈ$[U[ÏåÍ;»BçexEŒY´z�I*±1ãâèl_„ìÒ~Ų«+,ÎÁ¯@üšúf¸¿N4FíŠlœ@á…È®\Xji+•ÖPVYc#,/ÀeÕ:#QpSÃÉø‰Q�Ú~_š“W€ÅMHL*ˆÉž±.]=2•ÖC•ƒÆö.)L$.›—_PUÓô W‰ãàuQajÈkÄ9Õõøç!f`©™ˆÊ»z¨ÈÒÂÒ®PØZØõ–í°‹µyËÃĤ§ÿþÞŠÚ3»àu¶æ¡ºöÞgŸ³~±Ù®„´ÀÄW–tvbjº§OV"ócA^FfNâµë‹xE"¯\VQÝ'WŽNL-më$âm׃^ÕEwé…›6Pk‡g]Eaq‚jP_ßÔZÈ)æñ_Þš ÕÙŸPXT}c+oæÙfa©ju†±>…æÆÔ´;Äc^Ùœ+ß$¨u#Î6¶Ü'™p«ëZH^ +^{åÚªÚ&ÄUë´¬`É„â ++¬sÈÒÂÒÂÒÂÚ¹°¬-ìM¿ÔŠÄH‹v]—rö‰ÑÄ?~a¶Ða·½;aP ’{àÊ…%jÜò¸»§Ë»Gl×E\¾ŸB¥ÁX\A0j®%%ž4-‘aqV×6€0ꞌkb, +±‹(¼'¿ÅÆ~'#kÈ0b4/cÿa]*HRaëÂÆø”ÆXf~qÔ²zÂÖ5¼š°D!Õªt¦ÊÚÆâ{B¢Ut!.¯²¶©uVXÜ 3íéq¤¢ºqÑ«ÐX£«¨¬ŠWü’%£Î@ÏÎeËTZXZØ7OØü7NXÖ¯·•þñOÓ*ÝE×ÅŠ³â¼üd‡…Ûv¾Â"ɪ‡vHòÜ=D´Š+ˆË*Iao$§89974·-Œ±¸ÎàATVÉ¥ìÕبKJE¹yìô;™.~q.8ìì¹ø«‰èDZ +:õ.²Â‚Wiÿ�:¡òŠ{Á‘¬fÊí´Ø¸‹Á!áÁhìlÈ”4B|›Ç*ôô<‚ç ƒy®„E)µ&õÐHyU-¹4‰×®GÇ\”«ô6ÂBC§ƒŒÔô,·éµë¡W°™¼æ0Y˜ +bf°dÁ!a7o¥’kÊ.äzyÍÍçÈTô°¯.l-,-ìš Ëz{÷Ý÷ (ŸÛmt]PÏf˜-‰Ã¶:p·8n|a!‹(Âzyy'&ݘ|4=26Q]×0/ìÍgg×úÆaéÕ<.š³˜Vùì¢è˜þþÇÝÝ=òpsswu=Ä`¸;v¼°IWH{î\h`àÉ>¹r™ûz‚×~¹ +“áGK…’ŒÌœ°ðHoo_tu軵17<<€´M +ëï�e�¨ý k„°umäð[·ÓþÖÖ)EŒ%…%VÁp¾–i#ìÀ ±[:€o©3ƒY9!¡~~Ç0'óKæäIœIëããy>öAŸº_IKKk§Â²ÞÞ*øìóMˆWj˜íé—ÿä“œm;–Gv]„}aåJ g.TâÍQoß°°Ëã'VakÛô‚°³éURAM¯r-)ÙÅÅ ¶ìÒG¼¼CBï|“p#9%%5CÉ°ç‚Caîý=ËÄØ×{e/¤W¼/âGFEã.<fsqv…&‘Ññ ×’®ßL¿›I¸O‹®Â#¢Ôº!ãèj"1WE¼at…ÂÖ7µ“YÝØ°ª¶Y3d¦ ++•ácb/½ ¬ÆÐÕóBzµÎ—u>ÆÅÕÍcnÉ||ýã.}5>áúí´j†õõõ‰è–*iaiaiaíSXÖ–íÜÝï=^"½>·Ë?¤W›&ÅŒ»Ø»–Av]„‘FóØJ„—Ò~•<lÀe)aš[©ÂèòÊ*¯BqyLììÒžžG°Q#ݼ•ÖÙÝ3 Ò"TNLMë†M%BÉÂœèz ý …×è6éuúÌY@†Æp#`"¿€ÓÙ-U¨Ñјy|ª_¡&æ"ìùÍЛšžÌ˜•›¯[±°•5³KÃ/ÝÍÈÞÿÕ._8¨](llÜeRX…Æ •iJ…eÔ™ÁùÁ!aîî˜×£^>ÙLv}3æf@®VéÌݽ¶Â†Ft÷Ò¾©ÂvÑÂnhaÙÛvïûø[îù¼êtC…Lfžüåæ2ÅbÉ¿¾ûΦa|,‰þâ蘽óÝ¥]ka…’“A§ýý†Mæ•;6ù¨±¹LCìƒáâç`™þv¡°'g„!d€mli'u&ÒktL`Å^íá~8éÆM½qtÜ2=2f1NÍ“¥Öêï Ä«*¬Vo’”WQ),â:Å@¿«€32þÈ8jÅ8È`FŸÒ>ź‹ŸËÊÉ;|Ø+#‹¹BaU:SyUÝüÒ$§<ÈÈÌÎ{‰°êa¨Ü&½þ=ˆ˜<›eå²åjƒræ|¹J/SÉTúÖ·´°´°´°CØ{r7m®¬^ŠWƒÁøÅÞî°ÝÁÑaÓÏ6ÙÏ“É´‰±øøÃOÏ…‡;9:íس(²k/ì©Óÿ€+Eb„½úvêä»ÐÐðE3,ƒáÌã—Âb B5ˆ-—üiìçq.éõË/¿âpù°Õhž k „š]=TDðzæÌY4†‚8u-³°Ggk}„m™6›‰I[©°:S¿R+”T÷X"_‰Oprr~©°Cs[7oî["½†„†»»{zxxzyyóe°U®–¶PZXZXZØ $ìŽ=¬Í[úÒÒ¼>[\ض¶¶½|ðÑï?úôŸ^¸x9=#ënföºWjúÝƦ–E¶X¦þz`¿ï{¿]¯«Tk_öÔJ…5[ÇBObl‰Pu>{rBbÒä£éå…ÅX›œxýÆ-WH8†#SOfrëÄZ +:õF4C6†ŠŒŠvss¯˜–¦ÖNÓ˜eÞÖõ¶¡¹ûZÂ"ÀvõÈÈÄÒ`œ\¾pP?º”°àµW¦ÁS—,"âüÌÌxúøøÕ4´©t#V[‰¢…¥…¥…Ýh²Þz§lÿÁ§ßÿçÙb–�«½£ãÃ}û~·woàÉ ‘¤ˆ=ö¥‡Ò¾¥zEom}'þ7ïÿýz j*=ã�îôCgÚé‡v¶ÝQ×êzÇÕnÛ™~Þý¶v•[.à $‚ ŠˆÊÍ+*ÈE®"á&„î$D!$!÷€ˆX§;ÕÝÎ궅þ“#‡cHbt‹sfžq˜ä=ïyÎûÆ÷wþEkAXµÖð~ÂÂÊnIy £8œ�g×’Òr´jGX\«Tiù¥äÁ›Ë-ðöößþ}'>±€uÁ„Õ>ÆPm'%߀øà”�5lÉëb‹ËÛ:%ï)¬Ú(lí$¯Íãò|}9nnŒúF‘B=jSX¥¾uæŽæ•à¥Ë‚ڻ׫²¦fy¥…¥…¥…]nÂæ¯^Ë[µö;~Ú¯Ta7mÞW>s/záì•öö[íyjjúÕ«Ÿ,ÖŸœn®]Ï[pa5z#Ž¾w ÿJûÈF)©é»wïuqq“ôÝǵv„Åå]bò¸Æ6 a±<˜Lvꌉ§ÿ\,ahMmÃLL«ä— d«ïÔMZáu1„UjÞWX•aP¡-¯¨.){½/€+ïëë×Ú!‘«Œ¶„•wî+C@yè+Ãd²JË«åªÑ7x¥…¥…¥…]nÂæýìW½ ×m¥×¹ÂFEÇ.a‰¶Áç[7oÙZøæ³/5a#ˆÔÆšEm?ƒ‘éð;Ž w4ø¸|Dí;öx²±©…<®‹ø¥îîLðŠ”j½al¾°åLXxWU]KöîуÁ¼ž”ŠaÖy%…ZâÂ*ÔÆ!…¶¾QH}·‰ˆŒÂ3†Šè ±),Êâm +{Š¿’(Sk +û€––ö}…áu!„å~ºZð·o_þëùÇ*ìóç/,柶mK[·‘·$……Q3vKúÝȧÃ:'$&™1b¥gd3Û–úüÂ….ή=Ò¾ÑñI[¼Â+Õd·ó+,¬L©+Dcx¨Óá‘hùnDcx‹°†G=’~’¼¥&¬\e)uâÞXmlÁ¬wEî6.-#G©£v„%ߦ—±2A]’‡C +½%¯ofXQ‡„|›¢…¥…¥…]‚Âæ¬X1RZ6m—×å+,Ñy||üªÍ›ŽlqâSq„õ9D +;XÇŸŒO<U€LPSÇ7'5*¯™Y9û÷`³=qÎ÷HzÇ&&Á«ãÂ&§¤9;»?yö^QP¾³GJ6€?Ž›Oaå*]¥à)왳ѻv¹¤gfÇ'5¶x5‹ÞjëIG ¬÷‚›™«Ö?²¶bpßÀpíÝ&&•ÄU¸üDh‹å±k—scsÁ¨ƒÂFž‰vÞår=9]¡³`)¢pëYaŠðS¡…¥…¥…]:Âr?YYëÆøÏËWSSï"lÌ2V¯7üvå§ùã—¹¿_Ï[<aŽíÛç¥3ÂÕ§ ÖeŠ&a+Iœ½ä1K|L½‘áé¹'¼««{JjÚÄÓg¯v„”m³'9¶‰s8�´á+»vbH>B½;Ú>u:iq^„%ª¦®ä €Ç?pà ¸w@g·%¬é*ýX´¿hÆ}\ÈÍ/ôññ[0a³sòöìÙwéò5™R;#,†åIÿ`M鉨‡KPágÀ+“ÉFŸ*ýøBgGXÙˆ¡ª¦ž\< V¦µCŠ�kSXÓÚ–öžâ™ ‰˜¯ßñZXZXZØ¥!ìšÏ¹¿øµ²¢òÖBØÈ3QËHX¼<üøãËoþúͶۣ7m)Z³8ÂbÅN„žrscôö?è‘öÝŠZÑ<ŸrH’¶¢.\¼Œ³¼â’Óá*s¾UX㣉a…ŠWTBø…ÅÍGÇ'QÆGO¨E|Ò-îÃùL•‚Só(¬nôqG·”j%Š:TZ£~t!×¢0Db�¹€¦*¯,ä—;½0Âæóø†çÎ_VêˆÉï?”ÃÊêڻťs_ŠpaTLƒÁb³=±}õ-r•ñ-Â*õ¢v1ueò¸¼–¶žAµLi„³ +ÝCùëTè0Ûý‡ÊFa»ÅÏÆ$¬Ï!ZXZX…%x¥…ýpÂr·Z°Óù§ï˜za·:9âÆçE·ÕAaÍ5œ’òÙ¦ {¿ø"ßñk—W…¥¶J"±Î ä€ôÌ쀀@$ ðêîÎŒŠŽ˜äÕŽ°Ð1¶IØJœ¸#¶¬±©¥SŒTHT{—óàŽs›°g£bç7ÃĪšº¹UU×66‹Ú»$]â^sõµ´v",–ヂLX¼=v5!©Kr÷^KY…€V÷.—Ëóó;Ln\IY•R3&Sêì‹oAaum9'ñ#AU +jëš…] XÔÞ#ê76· îܵÚ�ö—Ãñ§…¥…uXX:Ã~XaoøùÃŒ,GìrÍ‹D·nþzÇŽ¬ux",Jg{#‚Ù(¬·«°¤y܈È(d6˃ÅòpqvMLJQªµ¼Ú1V¥5jê,îBË&Ü‹Ë^—5å‰Â´.Å#õHçMX$ÓA9ì¶ÖX9ñÖA–ÆpyhhXèÉ'¬±KÜ_Rv›ìWTbêÇFKØ;°‹å:wþ¢——76…›•“§Ôšx%…ÚvP®Å�éÀ01›õ-›];+Srâäñ“TaûiaiaiaCØüÏÖñ>Yùê‡;`?a +ÅW_µþË?$lØT¸PÂ>žü‡}aq2£p†gdÞÈ>€•ÍöD:zôX³¨müÉ3ÌcÁ«…° ‰ÉTa‰;¬PÝHË4Ú·«YF“òæèôº± +Á¥ø«û÷{·utÏ—°(ýècakGöÍ\´íÈ»ÇÜÆðÃC€=ú@¦ü@ÂvKÞèÁFŸ&[Í{wåj¢÷A_l¶áÎôãø×7Š”šQ’W”Li@}CX·YaQ²Cmƒ03ûÖ;U[¬Lȉ0ÿÀîÞÁ™†–ö#–àu9 +›÷Ëß´‡Güï¿&>za§¦¦_¼øžÅbmܱ=p‹ß¼ ,¦ohB‡„§Haå•Õ8cqÞ¦¤¦GÇÄ9UYæÜŠhÃd²sr¹r¥b"Îå3‹Ú:‹ø¥˜³]¸ïêâF…¿y…Å8r³næšîhÎYDÔ2µT! v36îBBBz#š<2î5‹ÐÃ| «…‰ZãÕk‰‘QùE¸¯ÆðV Oy6+û2>„)AÁœÃâÞLøA„•Ü'3¬UîÑÆíªš‚Ââó.1˜llvm×NçËW;Åý$¯aõÒþ¡B~ ñR„gwscP…Tèî©._IˆŠ‰ËåòY™|?"ò,P&¶åïÄËë`§ø-,-,-ìb +‹�»jíh{Ç´cv¹Kô¸i›ÓÎíÛ‹JX”alÈfdÝ„t×’âã¯ÅÄž9qÒÇ×~yÌÀŠÐÊfy ·æÜâÊG4ðqt|ÒÌ«ua5zc“°s^ONÝ»w?¢¿¤Œ*,‘d‘°pøc@Tt\rJÚÍ[Ü[¹ù9”JÏÈÐÁÇBöìÙ‡608îÜE|q–í± +Tß©›Ga5ú1|¨Té¯^»Ž·Ç¬§edåPÃè35-3&ö<ò §ç“½ïÿì×{PSWpfÿØÙîììÔº+ *ZÄý£]ûÇζU# ˆŠVå¡E@PEm} ""ï‡<Ã#Þ/’„„„$„ÇPw;;mµu•ÙormPP‘Ã|î=÷Üù'÷æs»÷ TŒ¹ëççyº»ïmhš#aÙ\a½˜¢ðÅKQ.¯4‰Éi˜êÅ//ùøøíÚåF˜£þ¸„„E0Êk½Êîž>-¯Za`Š2Ÿn†Ã>Gu…åhåzÃOÖ¸ðÈ3Q¸Þ¸‰+sãn¡C‡}Õ+³ÓyÏž½X49€É@ùÚmDX",Ö€Â&-6ÎýקÿýŸÑ…$ìåË——[˜¸ÎZo5,Ò?8ÜÁáÚmÛngGX0up؉`ƒF³ßºu›ûž½À—Y^Õ-”¨†F ã/¶þº°²2… +î¨ivr¡(Të +‹sÑRZVxì“O>Ãw/¾º!©«›»›&ض·wÀLÐŽ`¨ÍŸm 8 ý1±šFÌêõ +K!+–*ðÁyxxmÞ¼‹ƒKÀd¨Y¹ív‡ºÛA³Ç|Î_ŒF7ÀÑöíónní˜a5Q´sºãâ“¢Î]8!9y64,„í÷>ˆ÷"L‹ƒ`Ùmm·ŠŒÊ/,å +{(]E2]^u…E„’þË_]ÇYêwª§"Ïé +K!ÛÑÕ“’žíé¹VÆŽ¦^·q+ãøbev8àåêd„eªî×7³g*¬.¯DX",ö…MøãŸk‚¦_À¾ÂæçÓMÌLÿf³îºÙŠ} ‹Ð‹ƒŽõôò:v<"âô•+Wsréíì.ªÞÔÔãlTX ²C¹ù°6…„œDO]^u+YjnaÝŽÿ"8äÐ!ß½{½ðE¯bu\w{zîóõ={'¾…Õ”+«ë0Oß#¨›¤ +Õd¼ÎZX +Y©\gË*jðvtìÔ³îîÚ‰/¯ýG†…E$$¥±\•–‘}ØÇ£–`—âõµ‹"T(QàŸ8GÇç–AvîÃz ëí}0èxpBrzs[§@,‡|”®àuJaái}kÿþƒ¸L”±f5O(ÓVl7zÊ€#£´:ê|´Àq°NŒ‹feðqãÈÇ÷è‰ÐðÛq‰ž¨ïN|2ôõóÏÈ.dóz;¸b",–k(aãŒÄ¹ùMX«ý½¿.¶¶Ywf…eª…¥•Ê•B‰T$‘ +Ž™|häáàð·C#mX_"¬Ùþ!L¾¦îD¦˜LX³ýƒ#òþ!6‡ÿ ©µ¢ª¶¢º¦Øåð„8â1ˆL¡Â”„bOУP OÁë««uV¦À…AÃoÚؘ³¢šYQƒ”WÕ54µrù"t@Ä2%$•);yB®�›Z^çBX ÉæŠnÅÆ{øÜËËÖ¯ÐpT PµQ^ßØ +=E½Êî9æHå¥Â"¼±¥#4µtjyÕ–ÃW‡r¶»GÉ披Ze5ôâ2zq9~—WÔ4âCãŠú¸BY'_Âæ‰9ÝÒféÈÀ+–K„5 °wŒ~øöáèöûïøÝÞYc³î¸åÊ4= K %íSBXlôS-ê£ýêLiëTÂj餀ž‚W*U}JtÆ)ÃÚ`·O9¨9ªÒ‰º3ÊÌ9V1:ËUè¤Ò‹ÈUêCR…XSPKi;§ÂRÈ"%{¾8Êpå-‚C(Hµ¶N_X®�£IQðb[ËëDa_-艀cä—³(XµQ“ÊC‹„âõ¶žK„Â&-Yšiùþ“GGG°¸Ø|dni¾jµïª÷ÓM–éAXµr%Š±"³°¸´ª¦^$–>çõ5 ;ýPhN]^U[Uúv²hxõtbæBXgµ2*ã`©°TtyLXT² ¦cÂwêØŠh´Ã+–K„5”°‰Z\á¹ïé“ÿ=[`Â>zôxÃÆ +?ðX½:ÙT5lŸRUPT’ž™q?ÁFVn~Dy}5,vN…Õ…Uoªaå÷¶sD,¶ ³»ƒÛ3ÆÙñÂJZÙüf÷—Åi%Âa‰°6á÷‹šÏDMßÖÂ6ÌoaúéçNN–kV»¬^“0÷Âöcd¨ª;[ìVÕÖãY",v¬°]iW·¬¹•SRVWÀÈÊ¡gçÒŠ™um8ôÜÙçÂJ°ÛÞ%*¯ªG7<™ÙèÙÔÊ¡%ÂDX&vÁ{Ïè·ü¬lˆ9caçy ûó“'ÞX¬ZõéÚµw–®H_<çÂÖ64Žö~v^ÜÝ„ë7na‰°ã„…¡í]B³2ó~N†&Ô=Cm—”7³º:º„ÜžŽ.˜(¨¬mÌÎ-Ðv£zâkiçY",–ka㌄ŌYÛÉá|øÑGV+WÎSaŸ>}±ÜÊòŸk×ÆêEغ†¦‰ÂÞOܼyk«£`˜K„¥ÂöÕ5¶ææeŒ½atõDèE%%ÌÊ"F9j[õ¥Ã«¶½ˆ aÕu.–K„Õ¯°IKÌR›(êêg!¬@(ÜôñÇ–VVóQX +Ù«W¯-3_ñ÷¬cÌÌ3%콤-[l“RÒ†Fˆ°DXí-lݺu²dŒ-o'†z…»ý5êÜN",–«oa—¦üÅTYß0aÂlÚ4…Å%dee›˜-]om}c™!…µµµ‹¾tepø!–K…QZùR^§“û9ù±wâ·mÛά¬çð%DX",VÿÂ*Þ.a[¦-,“Yfljbacsu¹…¡„MHJuvÞuéòWDX"ìa™•n•Y<Ù¹ôГ۷ӮݸG„%ÂaçK ÛÝ-Ø°qã›&ljúýé×°¥¥LSc‹õÖÅÅ•K„Õí-íܬ\zVN>ˆ¤ŸHÕ¤Ó|pká¬k×oººî¶ßápõú-",–«waÍ’ß3–×ÖÏBØAöî¢Ež^xðQ<B·×•1+^3²ròèEýªé\%¬±©±Õz›³æ–™DX"ì›!¬Y¡¬¾‰u:2*<"24,ÂûÀç€ò°_ÜÝÜ3S׳8 +šñº°ËÕÍÙyf_TRÉáKˆ°DX"¬>…M6YvÏÈHÄ(™©°”P &&&%5•ÕÎneµEb¡°çÕ#‰ûä +…²_¡˜YäråwßýwttZ×B »ÄÄØÊÆ&ØŠK„}s„íHÙ<ñ™¨‹[·ØÚÛ;:::9:îÜnGCBÃÂï%$çä€QJ[m¨š7%-óü…h//oœåìä‚ÓOEžcu +:yb",–«waÓGŸ…°RàìéÓgÚ]ƒÿL“×qž˜‡ÂbL"ìÛ*,Gƒl'_ŸêpÌ×ÏÿdxdjzNCs{ø鳨gýüü/_ù:!)%)%INMOLJ½s;øD¨‡‡§““aqké6 ¯lîx^‰°DX"ì\›ðλ-¾9¯ó=óWXL¦O©Kû¤r%†¥¨ýUFµgaç°²üÿ³_ï±M]wÀó×öÏÔMÝþÈB”×Æ›&mê„N…†4e”ŠŠ˜ +]WÐD„ ¼_k $BâgÇvìÄÎÓ±?âë÷ûÛyºu…I¥C[º¯}Iæø'q ¬7úɺ9÷Üs~çØ:Ÿû³û¬Î�Ââ˜l>ƒÕ‹vfïÞ?lÚ˜»eËÖ;v¾½³pçÎßoË/ «Ýüü‚¼¼m[·¼Q|ì#._¬3»µ&x¥„}Ñ…È+%ì‹!ì—ÓÅ…»ÿý¯'ÿIºúûÿˆTX¥ÑêlNC]=¯KÞãîóÇ4NÏáò"\ÞÈ>36¢Ùí9 »;0ÛÂFß5ÛûR.l0ÌU-Âhóªs]ƒ¨èHÉž={Á+~BÛQÛîÚ·ï½²s—Ei¯Þ®·x£‘”°!^)a)a)aS(lUú\ÎúŸ?yüÕ(%ìt…íövx$"ÐH>Žë™éÕ0Á&ã^-£IܼÁ+T¨4Lv=:Ü«¡ƒcÖ0saqMÚñmNÑl3„…Åîv¸}}!¯1 nê„ þ‹Ü¾|šnKX˜lîP‡¶)ÖêÄSA²ÍvÖhëÕšzu&|ª \˜u&TEt#Á aƒj²f‡ßdï“õüF Y_]Ëb°¢VT¬¸[qAò: a¡3ZÂû¨u;%,%lbai”°…ET¤¥=~øä<wõž±°MMÍ3¶?Ôîõ,6G·RÝÚ.m–´5ð…¨1…MI[G—\a0[]^jÏ +ë¶9Ü°°†‚Ð-á%*®Á+ 1Ù¼0[dÂ’ ÍduÈzT¢æ—L xx ¥®ž‡å7KÚ€Çêtº}$Í)–¼kwÁ;ŠÐ·Kå"1™ID`ÿ›ÄmD¢È‰°¤˜@P5IÚ¤\¾kdÕq#ÖÎzºv‘¤U*Wz³Óhs›ƒÔzS"¬ÁâÁ'at¨µ–N¹ªIÒÁå‹Øõ<6‡‡à4‚ÁÔ¯›[¥ + 8Ž#›¼°½CIXd +-á%<¡˜×(ˆZš[»ºZ…ƬÒÂY;%,%,%lRÂÎ˸•–6 ïþzv„ýú9Fâ?:ñ“ùó§',¶Ñß?@èPç-JEˆ^]"ÈÜÂ5Tâ76Eà8Õ¶Sa4©giéð^Érysá_ä‰Â“D6IaÑý\¡æò„5´ kŒÈ„œ%tV ‰€GíÒî^ÓzüƒÓ–¬UÕ„¾SÖÃklÂD<b·ÿ—ÕÓV-à a1‰ìT…ET¬*ÂXahøŒÑ_{ðK§1qviRc´„9; aV/¡·wuk *}š‹\iì4Byò…b8K"›Œ°°UEXZ;ºwpŠˆí þ˜™L6W$îè”jS©µQÂRÂRÂN*låw^Ò\¸4ÂbÌ/¿|üðá£ç_|ñðóÏÿh×ë ¯þæÕœ9Y«VMEX²nUõjQ¬á@’çÈ>~#“ÌÙ]Þ؃³8|ppÿ?öŒ"ºÁˆÓeç?.=íòúúCÉ‹q0©T®@UHâ2é2£WM¾ ¨T†i‹nøTôê¸c»=¥4ÈÎ]Ý* ›¼°¸‹OÞ,‰ñ³©.|ìgáqH¢Ñ[Hd§$¬ÁêÑèí-í2ìhÀ)¯ö¨ @vRa5§\©gsx ^!Ƈ -ªE¦Ô«BÈRÂRÂRÂ&öÎÓ…o¦\XøÙg;pàÀºŸ®]»nÝÊÕkV®y¦ñÊšµ™ÙÙiñþ~ðRVÎòìÕ«rV½ryA&-9a±{6‡«YÒFV¦Ó8x§',êÓ–vit‹É[Ûwl×-èI +Ëdq¢…½v½üõ×·vu+àubaCEî€Z£#k·™¯”¤VÖ£ö†’¥«Öh6·Ìh·CS-N‡'Œ°¸…ÎâÖÎII20;«ŽK¬@6Ia !^e +ä¡r¤3§™ò¯ã +‚šœ „Õ\í]*úØIr#Š’v¹˜6JXJØHX’×g&lUú\Ö/~ùÐM)²V¥R/^²xyÎòe+r~••» cӳ܌…›3…Gnæ¢ß-ÌÜ“‘ùNFæžÌ¬½K²?^˜…M¨MŸ\XT¯“%TÔ¤àà ö,„‰+,@´9ܨG¢çÅÑýщҼ¼|b4ÛÆ…åpù1WEeÕ† ›ZÛ¥þû yr÷DÍ-ô3~Ú#½É7“¶GE¤d·13dœÝíO,,ÚÕ„‘äpá¤G|¡8„©wRaÑ®39Eâ¶)‘/à{-ƒ£ÑÛt¦Ø¢zí”kB§>ƒÍ勺Õ&åd¿íÂ’¼RÂRÂ’Â?ôc_‡4µe,F3M?[¿>{åŠüeËsÐæe|¢v<æ"ÜÃ$!ìàðHRªº†>¦)ìÑcLJ +ÛPÇ,`ïTÝÛµëmÛÞ|oÿûýCH^ñH_-,æÊÍ}†Æè‰Ëkÿ°Åîæò…ÑÓ¥$ªªiZˆâL ,n9<~“ª°ö¿–ß,9~2°¶¯ÝJ =uoPQCg[¾ÄÂm^aæòR¶ÿLv}IÉ_îÜ¥cºhaÁ«L©ŸÉk^Ø^‡¬WIØ)a)a)ac;/ãöw¿¯<{n4u¼’Âz½}6n\”“³qvíØ\ßÌH,,Zz =còÃ<<&í\]C÷Ý}~xhøÁßã ëõ„ÍÑg ?yòT~~Á–-o4ŠÄÁ‘qaQF÷Ça›»ióÝêÚx¢zu¸}uõüÄç-æÅPˆèñ V[×®—Ÿ>sΊ'¬»¯ßâp#ÿI‰‰™FÌmGËÍO+7mÌíêV;<˜ÂÚ]þn%1éT¼I'];î)>Æâð'";AX´¨4&VwRïâ¥sÞÒSgvíÞÓ«³FgT kç44&˜.™Ÿ1ùxGWïX%K ûÎ+%ìl[•>µzÝ“Ç_Ž¦¬ŒÅPýs÷îÝ™K—æ-]F›Uaç,¸;gþÔbb> „Å¿=ª^:£..¯¡ãŽÍi� +8ÉËoVܸYQ~ãôƒÜÄïù‹Wúóý8¢€µ»¼1¹ÁÉVX¸+//¿èÈQ‡»Ç…mëèŠ~„Åi@ {ùʵá1…u{"IÚ°œÿX×ÕkŸ”½päȱ¢¢£d€œä/_û´â6ƒìóqlÎŽ;ÅAdcñjuxêy‚Ä9¸TÞ©¾xù꙳狋KÆÓ(>ZRqûnĆ“¾¶ù·ŸÜ¨põ Dkwù4:sâRŽœôVeÕ…KWO9{øp19ãᢣ%ÇO «×ˑΈz÷ /;wáÀûRkÍ&›7ZX4ö¨tÌ„¼’û‹›·*/\ºRzªlü+8\T|âä©è} +{ºìÍü¨Ukr…ó +p%m²Z:3Þzñy¿ç·0lp]‰¨ æÜÜÚ¥Ô’•l$¯”°”°ßfaiiLfž©-c:”¹dɯrrfIت9óoïåêÿ²_§OmÜgÀó¶ÓÉÔui‰íØÍøÊ? n§NÚc$Â&`îÓŒoƒÁÜØsâˆÓ€q1÷}‰C ]HHHBÂØÉ›¾¨S_ý¢ Š¢Ýe\¬ÎtRyža@ÖþŽÝçóûîÜ]±{_ÅÇŸ¼míÙW¶u[ÅΗD'¬Î°"’ÈÐaèúQUumvNþ7‘ÑÁ ÏÛÛååuÊß?ðô™sIÉ©å•Õ54ƒ(´hÃÊSJaµË+C£”ónÖ}Ë ¶¹µ _#x%„£¶áÁÉ“_'$&éOɼjtƪ«Ì½U\RÍýü==½ÜÜØÀÅre2X..L—ã>Äƃ‚BââÉCaœ=Nœð,*-SëŒéU¦lmk§åÕdk——u/',쌯¯?†Z_†“Éb0X_}é”–~‡î ¬³³KZÆ]¥f™,¬XªlyØN÷ˆ‰—•uÊÇÏ<)“¹¾w&¦öð8‰§~&'·€ü¬qóoÆÝb³O€!±Lm%,‘^±ì Ö€ª¬ª£!¡á˜Ó¹¹º¯íË`ºº¸0Øl¼iVSÿ ,ûDë£.…°àu”/¬kh&p$¿]9yx{×ÞdoŸÀÀ«×b+¹<^ÅáÁ\X|gïðø´]X»°va…-}ÿ7ýÑçm.lrrÊÞýû;:òvÚ^Ø2lá×ÛÆÓ3tCÆq¾q|â-ëÉäÔ4§ìÞ‡ªõ;@),xU©µZÚ6è{HsÁht…^wü8ãرãHj®,74|''g´ß/—–UR"‹nõ::{ô†'ddAgËÿ“€«ÎED¢Õû©4Zs€E!öNÎÌÁ}r“÷ò>…”·¼b-¬Zk*É—˜çBëFJug{`F"l ¬@Òk×c“’Ó`JQ '-ãNBbrTTöîãã†L'=ã.4D”+5V¼ÊÔMÍ´é·ÿ•š–é}Êw›mºÛ¸±-4ìô¥+דR3ïf#s•UpÉצgd‘…•+—úG7Ø;B\ø鳘…Ÿôf<ìÊÈÉ/ÎÊÎK¼zíFÜ™³XÎKµ¦¤ù“qꚢÏ_<æäéÄr¥°b™)½ÖÓ¦WâþãV›pw—x +Ȇ‡Ÿ½~#>.þö½û÷óŠh3,IØ)¡¢½»šênã’ìû¹nî {m¿–³óq§¯œ0|¯Ùð¬¯;z†€¬]X»°ï.lÙÏHزwÕýã?– ¯m‡,„åVW´{÷AGÇ<$GÛ +»kO™Ãvi}ã›Mýûþå«p/¯KíÁª*è„5®ŒŒñ){>Ï”§boÞBÓ#:~‡æå>î잙Ή%‚9ªñAKFæ]„ÇÔôL«le*¯ ð©—ôÀÑ’Wü)U¨êƒÆZœ,-‡b ¦¨¸tyeÕÌ+‘aÂyòD&†„„ž<#gØΞ~ÊbÍ`+88ŒØ#~"@a/=}ƒØ#–§PiÖ%ÜI3³b˜EÙ‡q*Àš‘•KË–ÂâÂöŽî x…€ÈhòX°Ã/ø³²ºvx§‰y¡D!Q,*µj±«wÀ +Ž „•-`Á¸Ãº™Ö;)¦¶šqXQiùàŸ?#š›Wˆ¤*™R+Q@L¥@$çψG&fZÚ[†s||ý¡s[{e†ÅÓsR}zÅýÇ).((Ô}ýþã]Š¹p™ËkìâLÌN +$“³R¡tqF¤¨[{UÞJ؉™yÄ]Ê[_P|Êǘ+$ôtÉt´³o,ë~APpž Þ=Ê7Ù\}Cü±)kdÿ…µâÕ.¬]Øÿž°øóË’ºzÆX54<¼mûv›¼w¥M…ålÝÖîíûêÅ‹M ^¿~óüù÷þâ‹ÝŸñ>xC#ì’Þ€èA×ú®^½ÄŠVÏbºÆ\¸ÔÑÝ‹¼ixò—ë+æÆÕgˆ™”Q”èiˆ]gV8¬,�¡°É)éh€žž^S‚9èf%¬p^VGŠQø$""*00ØJXØ9±”DL›0Ño±ÈN¹P,Õž`–Å%=Q*n½ôDitƾîz0Äà˜8¢*ªj@¡™W|¿£«—ŽW\˜“Wèë@hbãwöÂS˜VëðQrÕþ$6V¡†Èt‡¨¸ødRìúܹÈú¦‡2å’\¥Ãå…5/_D%j^Ž?ñáÚ54µšŸÆ©ox�˜p}|üºûGͼ66·Ñ½c¨Ô´Lwö bã8ÎeÜÉîêË—„Rõì¼rV¼ /ÀÖѨ%?tJañåÇÝÖçójƒÙîxL—._ŸžŸ.ðg哳òi¡?³s‹CBÃ>²ØN,Cc³VÈÚ…µû-,ÌrØþÐ…õâŸÏ„Õjuïoù„½¼ÿÓª]¶¶è½÷Ô;6wÀUÏž}ëðÁ‡ÿrä³ü?án³8Ή$•\eÏO¼ŒÆKðZRZ&_PAReʘC£tâøúú×ðêõÆUKaQÝ4ý?&æÚþØ8…J¯Y +‘+›Z¬ú6–ýMd4 1¬~k)ì’~¥½³‡<VRZîçHÄFÑÓ?HÌeAê¥Tÿ¤@'ÄÖ°b¯ç×Þ +lpdBµžaÁ뚎W´ñܼB‚x{ò¤g[{'Sjôð”\ÿ‘°°sb9¥ø0%5ƒxÄnnî ‰)SBÄU£‹–eÖ’Ú¡´º¦žXFyeõ•«7°x{åZ,¢®HºHjÛÚ»èx5½f)ÄL÷?êQGT“¨&X"Q&ao/ì䬬±ù!ÕÉíAJj:æÂR/\¼:8&0¥]©¹øíê¾IÉi ÛØüh„/”Ø…µkÖ\…`«£ËV1öõeo¶:8ptÿô�—4Ýæìow4þáO¯^®i¹9a»ºº?ܱã£#ãÐábª‹ŸÝ}îÔ7s¦ôŠ¶YUÍ[}öŽÞV¢àõðØ#p<4ô4ÔFº´äl5·>"uÂFŒÐ kë »F·l%¬B¥!_ˆ~x3.áoýråéw–V"SR$ê›BCÃÝMq&:ú‚€é”¶R +‹Á§¢ àPD_"2¬¬ì\auÁD0¾6'–ÂJe°à¬{9„˸<2òüð&âê»+W.õöS- +‹9ŒÄÑ¢ ˆ³ ÆUKd^)…EI•Z^C3nn Éh6†b¸0;{†æåšõ�»882YU]KùJ n'¥bv\Žkão%ÁV¡tñ[ßAØi¡bpt +{$ﺼ‚„/cÒžœ)|ÔRØugåȧ÷rŠ’SÒè_ÅåU×6Û…µ…°cva6Â"ƶºº¿ü×ÆØß=ú»#G|²™°»öp~±EÞܲé“�.ÌÈÌÜ»oßÏC¬Úµ‡,¬Z«omk§ìüQQ1hž..ÌòŠ*Þhªx%„˜œ¡K+ø<2ê<Êh!,8”äŒN˜›_qì°Z,ÕJX”Rý7ûuÔä™ÇÜ?ö˜Ù÷h[;‹nUª+rØÙiwgvfgvÇ])Š„U¤‹"ëxÑ**÷}„pV¹ ‚BBBî„H�©ý«×v»ãî^‰˜÷…ºçu~“AyÞ÷}ž'¯¿ÏómhbS ïìì"Cî˜"„ŸœîâpÉÊ`ð¤"y…‡Ÿ‘â’ex%‹Â%Íì6__?"¡0© ”Õz¿ƒr[°Ìbf©/ÁÜéè3b\¨T.aëê2lumùép*òTôÜÑ‚q(5-°J•ãó¼®TX”X>–œ–5ÇëüÚ9 +©¥J‘Wá°¼¦Ž"HH¸‘H¤Wwwä”Là8,ѼÀ«ÂÞÐ]QEñCL¬šÁðÈÊ-UƒWJayB|Ê‘g™¥wn%¦±&ö¼ˆYZßÜÁ´°´°´°F¼˜¿Ú¨¨«·VŒÅ}NEEmݱÃÕnwÍ›,«Ø ›Ü=¾ùü‹§°cçÎÝŽŽ±ÛÞ*ûi†ˆ2•šÜ~Ñ7rònE~d:{îüÌì¤Wðºayá2Â"$†œ!€Õ(ìˆD^FJ—袗.ÇCØ“aD€%‹Ë›Ù÷ÉÂ&§¤;;¿'‰+!¬f\ßÒÚF^fIiEpð ¯9a=¹¼~#Í…IäêÚú¦òÊ»-÷ÚÕ:½Zg˜ãuþ·Cbʇ •øû¼^‰ÿX¢Ð¼ZKXð:8,%ë€]ÊÈ̈ñ치Q™f¯æ«Ð"ÉvqøŬ +&«’ÃÈTÏxEʵmÝäƒ 1ôÌlH^ñ ^Gå:ð*U[EØay]£éé‹Ø¥P¬:"2šÃˆäËK”@¤¨kjÏ/(^*É&%§÷ðļ´°´°´°ÏüzíÚ¿ìýæ‹/Wí—‰eiié›·nýënûì-["ìíuë5µ–Ø©©é÷\\~ggçä蘲e[© …°b©Ý‰Ü¯®'ÜDÏ÷óèíãvçyµPX(z2<(ø„D¦4 +;a˜éŠÈ�Ý©<uÚí {NnþRÂâZö½v²°©é™È°<Á !,2¦\¥kl!ÌÌÊA{G€ÊÍ»½Àëj„EáB<H‹'NL¶…mi5¤±ÛŸ<<=½Ž'b/Á«…íë¤|tLì%¤NO¯<èäÈÕ‹x5/âp‰T¥Cá±LcvX¢^já…Å,?ÿcX»»#)%°¼ZKXЉW¨òŠ3^l›[ÀDÎ%x]VX) +Ȳۺ)ßjÜ3¿ (¿°Œ?¨ …}É…ç•v%„ fdY%Æâ&lvë†×ýŽ½Cêo·Y.,�¶;çnþtõÂòøü=o¿mçàðÖü&…‘ȨNÝ™³Ü܉‰Éú…ôj¡°x +«¬28øCdF‰\µXØž¾~rÌÁø —8½¸YÂfdå<èÞÜÚ4 aGeª;è·/ŽD£>w>ý6äDèÐð(†Y"¬±^àu\?4"%Ÿaˆy^¾òƒq憆†ÄA96a]aj]w/ßd‹ˆï" OONËÄ°y5[X¨º¸Œ¶‹Ã£°˜�Þ,ÄÇ^¼"’<çÕZÂÍòJÓc†¥¤f`Õ‡{÷ðDÆ�û¢�hG¯‚j9 ÿ_ZÛ{úd´°´°´°D17ÙTÚïy"•[Ž,î •ÊÞy÷Ý›7_ûÅ«Ì/úÉÏWY?^_¸îg¬M6vëS&F o³yó.GÇ»ì*Ì,""ÊÕÕ©¥ujfÖZÂ2Yå¾¾~Á!šdØ®î^2È ÀÛÛG$–L¦)…Óé›Zî‘ùÈÎÉGm¹÷\X±TAf¶"Cedæ`¼ZYXN/Ÿòü� ±@SíìæÎ¥WðºÂ>ìê!d–”8lokÛC…fb-„E5±ÛÈ/¾ˆ[‰)°ÕÓÓ+"âto¿hD:fäՊ–UP›p3 ßø¹óq"‰ÆÈëJ„íÀ§¬¦¾™rEññ×Ò2ò0€––ÖXEë_m9ìýï/¿²Ä2£hb±8)5--—šÖ·êJIëOKŸXâþÓ§ÿýöÛÿÄÆÅm·µÝáän»£Ì¬[]}ùQ84Œ4OØþ%…-b–¢¯†…Ejuz£°“Sï·?¤ÖÏ/ 22J*ÇSÂNN©4ãõ-dasòn£Ùâ†ÇÂ*)… <Œerù˜ÉZ‹j¹×NÞL2:úvÃÃÃqr\?óŒ×5¶ƒJØâ’2wwÆÉ°…zBªÔZ]X±ll@$®m ;%¬ò //XÏö.®X®]ÌëZ{ãf¶¨ °T(VBØNŽ€òÝÎ/(:êãÛÃ÷öKiaiaÿÂæÿ„E®ûé`F–å1–@ÖŠ,™ „ýúëíýÛÞ]»í¶99%¾¹½t~±+öníÕø÷ýÝÙ0ýx1¯ß),¦hDB),žéæƈŠŠž™ýŒàu9aY|àñÒ¥FK),®•ÊU”=üvQ‰/@_^X4êSQÑö»Žéô¸áZ1kêÉ3DóöÜùX‰BMŒ\#a»8\ +æJ+¼úÄ]¼‚‘k$,_(®"íùÜk–I-Ò³òÄŠq‘Dý=ëⲿ¾©c–°(ZSgc‰WŽÁð`·s¸-,-,-¬±˜ðº®³Ë*Èþ@ +káóû_ÙðŠƒ“ãì³·le-!,üªo2éhD™Ùyû÷»ê& “†i³„•‘y%8;sö„MNIŸšùÔ(ìÄÔã™`QùIMYy„M¸qS3>±”°Â¡ÊxXXTòþû~™¹“S³„°2åå2Ñíýýán@v-„…†dÙñ/·’R<<1‡v÷jt†ç¼®LXTk[¹Ï“…•«Æ¹¼Šo¤ªútô™‹—®ªÖLØ^þÙ¸ùSÍ?Ákxxo@<,Õ˜+lÿÊ„É(ß œ»öísnní\°\¤¾±•RX<=;É*haiaiaWñkoTîùýç3_d±˜˜Û·l휽vÙ-¬ÔDX€¨Ð74³)2«Hõ‡°“æ +¡=0 ðàA÷²òJÃôìsa 3.Ÿ$ì\+ ½ž°´°úéŽÎnò…˜<«¬200øƤÉéO!, +ð5³ÛÈË,-¯ + +:aa†]t¡^=®7 /-öâeð©œ~ו +Uhš)ú<¥°BÑ(~EÞ¥¬ì¼«]Wi-vT¡+B[’°å$aïÖÔvwgddåÖañ×Þ~QÕŠC‹©°"yu]#%²8¹5²;¬.ìáÃÞ×’ùƒJZXZXZXSd¹±úOþêÉg/²X‡Óãàè`ï`¿ÛÉñÂö·Êv€,¬aföA'9BÎ)€–u§ºvjfÖ,ay!¹¡fdå9rtÿ~Wáà0T],¬`p˜vpIÂĸ¸Kª±q²°¸P¡Ö’§=WÏÜÁüÇ'§ añC‡KÉq~Aq/O ÓO¯NXŒK•8}z¹|¡\¥]ŒìÿØ/× &¯4ŽwöÓîÌvvfYwÛî¨íV¨•à§ýº_º«Õ*w´õBÕZ[¨t¨õ¶³º^AQ" ×� !$BHÈ…\IÈ•$„›º3;c»³ºvuÿÉ©iLÞ¼„§:›ÌÞyó¾ç=çyÎ9óüÎ4¤4\'ÿvfÆ÷ZÚ;'&g( KƒW›Ë«Ò(ÙNØq›mcuQ.Jù•«³Íþ7¦à +M߀’«tF³#˜°r¥.|PöÓœýï®ß SêÄÀ.°½ýbÊ\Bõð›(VG‹ºú–Q£}¡„Å_‰LÛܺ ~ÂÖdff=~R¡öÇ'l{Œ°Ïa}{¥ï¾ÿº÷ðE†,ðzïþýôŒô„·Ö$1þ˜XµlE]d‹«Fo¬or±ô2ÚDIXïÌœÅîlë (æ(A‡KKËؽ{¯Ý b΋ûq›3Üè+úÅ…cãVÄ@ø®“'RÖ¯Üܼ¢¯ƒw®ÉW“ÕÎq¢ö6ð@Z.ˆ°à#Ž`("!‚µ‚,ˆÙÉæ†[¤Š$2‡gzA„E\YœÈ„ÝBX«Ã#”RÎ>áôðf»ÙîYaÑÆlsó¾}âO7üþA“Í ¬R3Fyº8_|1+kë˜Å¥'xš°Z“C¦Ò#æðD ;j°‰¤ŠHÛ£±©M:¢Ï…¢$,îk‡O5ó¬+×’“S~yH#lŒ°1ÂFPÕK?åfdÝ»ûÍ +Yàõþýçåå-_±<1‰±:‰qìõß×/ý!ÁpÂQV!”²ëµõªQí4ZÒ–tb²ØšÛXáõ‡á‚‚ÂääÔ²ò +ù¯DÀVGW7%2˜×ë†G”VÇ„Ãíqº'á[f«B¥¢Á+Þ~öyAá—Ef«“pòLßêá÷S~…¡ë›€¡1ÐÑ×~È‚ÂèÐêpJeè08r@¼·o�ä%„jE’áðAQ“«™µý" i añ +-µF3›Û —UÌZPæìù!V?fƒ(—¦ñfKS+K"SÌŽq»Ü¤',a«Zgâpù OžX0‡ +µoAXŸ?³wrz(—qŽ¨ z³SOlì|„EWT>Šo)³ðöd¨‡7Û©Ž"÷d3««[$UÊTcK$ÂúÿZÄÚ.NocÅÌã qèБ”äÔ'Ï)41ÂÆa›ÿïës²¿øq²^4È>òÿÊÊÊââ‰ñkÛB²£$¬wvN2$äïXl£ÉB¦Ôû˜È?hfÖuÂãKQg"U3<aQ�ý¢©™[î' O*Ñ–ÝÍcsyìnb# ¨xù…99ûµzS€°¸ÑÇ)Pà�4ERýظkrš´ yh±»†äJØÕ›ÍaÜhhYdÁDµÖé�ƒ+—קPë�P´„ìÐĤ=ÄÕúam²:ÅR9"Œ”;!ìaa dEb +ÐVê`sE¹Þd'œ5Û\Áòa×÷l5„’–6Š0@åÕjtê·±.á`ÄAÁD._8¢6ú9;¡79Ò¼O¾¿JÍX_èŸ1êÜÑÛ™³Å[¶¼LØQ£½G êMǵÅæ DbÙ¨Jçãl@ *„‰LÓÍ6·FÜÞØo;vìJMM+¾x>7FØac„¥QõK?ëNIûöö²õîÝoŠŠŠ–üz‰¯IŒ¬·V×,]Q agæ.¥‹$UÈèâôŒjõ@-ì¤Õî—cÂlµ«µú~ª( I'ùù÷í˱؜“S³á„5[(’4ŸD3JpÅ;rì/N£syg a!·wvD¥¥ ýã-òE1çp{ÅRÙˆJ£ÖÔ½J£–+ûÄ0>8D¢<>¬«¿¹nÝzØ[§gÚY——ÇÒÐôÖÑÅôJ|#*Õ:ѨnhDÕ'w²¹ˆŠþh¡™57>ø`[8a‰º{øóæŽ`ZY]ÀÙ€xxxdT¦Ô@C#j°’Ó#À;U'ÔFòô™s»²w›¬ßÛXãøDSsÄ# É7ìž`°_4,VKej ‘\'Ü^ak['¥_z}¾¤tëÖ»vÌA냬ÁÖÉáÑëßWØÀ͸iëàtuó9=}<˜Ít°y˜UòŠfèÓgÎãô¸yÓæöN¾\=#lŒ°1ÂÒ‹ùr\×ÆÍÿp8}}ø\s–XW»Ý±}ÇŽUñ«“«Ö&¥¬^}õw+ëÂò¢$,„{…JƒN_~Qm`'‚Ÿš×Nvï'Ÿš-öpÂB“Ós€©·O/a߶m»\1ê"¬ßÉÎö +„QÆLˆ9HÌ[ê/•Ulܸéry¥{jŽÖ`²ÒŸ@Ã…Œå 7¶¶®a׮ݔ„…ÕƱdÑ$¦D:Ç*oxwã€ø{‹+,mÃ|Ëú˜qòEî,L8{£¡%„°r•±µ½+Êt–k‰æDç›óÙïÉÈÈÂ~"e*sŒ°1ÂÆ;¯®ÿò75/ÇY[Ûÿó໇ϥ™%lu»=¥¥¥¿}íUàuMcucg|BÍÒåáx¥!,4=w[ Í[Rj'_Ñ6Öéö©-¨ÛHæΞ+Ù²åý!™2Œ°3&‹ãZuÍÓBYoëê}õ6--£è«Ãžé[ ¬}bÒáö*TZ¼}ƒDÎÉÙôø_ž™pÈ +„â«×˜˜ŸE}^.«HNNMIImeq6â÷‹eYég¾òóÃ?ª½Ñ¤"¬_öA©ºòZõ¢gA‘WNN^FzfzzfYsdô #lŒ°1ÂÒ¨æÕe5q¯H}ýàÛ>?föÑãßÌÌlqqÉ;zgÅÊo3ã×&%2Eo¼Y³l%^é ë™s¸<î³(€ó–@Ö`² åÓ“µô|ñÅ´´tñ<„°žˆ¥ò¯½ÙÔºˆUaCù33·$'§”]¹êò{XÖY——ÓÃ'ÍžÅÁô8°°hbr6œ°>ÙÝå•Ugη´u,b$è Û¹3;+këÆ ï ‚~ëׄqÜYŬ}XžüÚº¸È+•LÉLX•Îª6ØË®T—\¸ÔÚÞ¹XY#ÌvaaÜkfFVvöž>ш\mŽ6FØa ×–WÿäçoÄÛØœïîÝô£šYÖ;wþ.“ɳ?ÎŽ[·òõ• kÞNHbüqÍšýoÆ3ÁPÚdiá‰Fg¨¨¬Zt + }öyÁ'´„…¦foóø}Å%¥M-¬hb@JR4µ²ÊÊ+×ýy}߀Ø35BXÈ;s{`p('7¯ôR9!ãS–wÔÛªêš={÷ÁË äîÙ³Ïh¶9ÜSÁ„5['Nœb^¯C̋”ð° assèÆ,‡‡’°Ð¥²Êü‚BfMÝÓSÄp¾ä"ÎPZjúá#ÇΩ€…Æ,Bñð©ÓgÞ¢p–bÅ[Ú¯×ÖÃÃ_¸¬1ÚC «·ázêÌ…ÜܼòŠkˆáiVœÌüå² +�Ë•åKœÅéSh¬²ÿ²_fAM¥Y÷aªæ¥gìj«Ë ÜEìé©y˜ª©é™ª¶Y‘}GÖ°%²i«ì »Dö@ØAe±£laaM„¶ìªž—ž§žùß|1"‹íÌC7©S©ä»÷~gùnßù÷I· »MØmÂnYÌîÑ)üýÎï<}dOÄs?ÿ¿ôìV}är…@ °¶±Ñ?¬ôäqã3‡ÏÿÅÈ(øèqÁÁÃ¥:zï“®›$,lqéûÊÛ5QÑq5uõÐ6àCëA´£âÒ +7wO/Ÿõ +WÎ'%§Ç…¢(²›–añví]DZ]½‰;µ&þâÛþèñš„…)T‹âgý¶¶öð%*.«V绥ÆKÀŠ Ë+«#£cœ\ÐiW&ƒÕÔü`V¹@áõ5aa³Ïç{Ä}<^pb%!?LE’ö§¢¢RÄ©:—”»¸ºc’y60¼&aÇÕ›˜-•ZYÙÄÄ&znuÌ ¹ã NùÖÖ¶P¯L&›ëø¤W2*“¯&,lyU‡‡Wn^AÍÖKå› æ«w@ +@êÛ+×",lïàDRŠ€Ã±ÍÎͧÂØJâšã•ñ/…ÚØØ‘ãf³9¹ÂÒgƒÀë/ ìÈ6a· û›%,e:z…Ÿ~ž»cG’m°»ç‡ÿE¨÷¿ë«W?çäæ~ñåüô`ë1CƒÆgþjtÚî¤Aœþ‘r½Í°u“„þ^,¿¬¼]íîî‘–.@c¡p¹Q"ZMïVV|#1eµLCSJNICûõòö•Ê¦Ö!,¬jaIXXÄ`°œBî$%§ÝdBlR&ÈLMˈŠŠ âƒhÛ&&¥j1Þã’h4saAñÜÂòš„…Á×´\™~ó‹ÅñöæâtñuÙG:-\FWG„ê6-c}�‘–‡Ê…å¼®",NG¤“~þ¬l¢câsò„udŠØÐ#eµÓì\app<úrÊÊ«ÈãøÆVá—¯¢ ®n»zz'gçÖ$,ì´b¾íQàHg0/_¹š•“:¯>µµá®v„ƒÎŠp¦8P¤lɹ�‡!¡—‡Ç§¥“ +-¼ŽŒÏÀdÓsMÍm¶¶=¼“Sfì³ùÜ©©IT’ž‘é爯]ÔÆ-\Bå±þ>ÂÈ+îµtòø¡x»0ŠÄÄÄ#ñ¢’r¼¢$*M0ê¿Ä{ÕíZaaq† ó2åP)[³YLM÷;û†¦^· »MØßaGïíýH„ÕØ®=©;w%:: +E¢¹ÅÅÕóÄíÏoéÔ•Ïâ⋦{÷âããOèêë0:}ü¬ñ‘³ÆçN +=z,]ïp±®^Ƀ/Ûã½aaP²%¥ålŽ¥¯¯?pY^q?‘]ZZ‰šê‹Ë¢cãý‚ eÐùíìbãnT«e&îINI·wpâ°-}|ýÊùõ K «œ_limãúú;gB£YXX0èt&º"14RÆa1Ù¸ŠÖŠ&IÚ#i‰hÝ\¿�<…Æ»aåÊyÅܬ¥µÝÛ‡kfFsvvÅ„—•‡Mum=ÉQ“NN^Aü¤pø¥Ú,Û’ÒL6¿Õ/}£^ß!,Q²c²i ùÜ×ßXZ^ðññ »Œ)"7¿°²ªFËcu]}íÈUAfNDTÌ¥àP8…z‚GpÉ`aŠKHÄ,„�n¢ª¸Ü�éÄìû4¬Æ€àÁÄ,“Åf2YnîaaWJJ+ÖÄ¢*-«º•™Ê`¼!‰Ãt&"ŠJ%£“Àë¨lvMªm¶«§? €obbjoïÈåú£b)©7E%Dœ¾Iüuµ…E)i7¯] + +⻹]$IÁy®RÓx÷@mõ"+%M08:½&a‰ ŒL‹ûÆjï6{yùž71ÅàÙ°ð+( ÅÐRs§†ù¢A6*Ï¿"“òâx§Ó‚ÌüŽîþ§2 ^Ý„Õ‚ì6aë„]~)½ßZ´ÿ`ÑþJX]ýbhÆÏödýîÛ;lþù ¶P2§RýøZØnéóÓOÿ~±´$—Ë%’¡††F¿/ÿü§]ŸïÒ=x@ïè}CƒSFF_>mehräX¾®¾Z´êoR´jG¾ï€§cC d¥²ÉˆÈh€spt ‹ˆˆŽ‹O ÷bbã¯^‹ðåú£á£á ߢÿà›nÁÀ¢ 3ÛÎÞÀâP‹˜øÍiP¦‹K/•ëâUc*œàÒ÷ÝOžææÀ¬——DÌÛÛÁ`15=£®¾qF17<*£šci¨òôò¡"¡3+ªj×',10}qùU󃶘؄mff:åÈÝÁÑÉÙÅ2gWdA5pYðmÕ78¢œ_ÒÆë;„…Í(TÏU/G¤P£”TÏ šÂÑÉeÅ£‹‚¡<Rt宩ƒÉöôô\Æd3ááß"`R»ºú&HT +¯ë–ˆÙ)¹ +8ÎÎ+ÀVTV¿+'±ÌÙ“H{%ƒ‰£â‡—K§eÓʱ 9ðºa‡¥3£2ùø”²µ½;:&ÁÝÝÓÂœnaA§¦&{¢ÖëT›ÊÁBš~þ<QIe—xÐÉÙïÉwº¹y´wŠ×'lŸd¢hrpd·5?|{׈ÍÍÍqäLÔ–2u<êAŽÃ~»ò¬¬qZFÎcñv÷¯Æ믛°Ûv›°o"N‘eßKØZéê—êèeíÕ ßù™ÕÞ}_›žwòôŒŠ‹ËÉϯohèxÔ)—+Tªy-›˜˜ìèxÔÕõ¸¨¨('77&&&(ˆÇ±´üÛWß»÷]½“Ç>tÖØÀøŒ‰¡¡ïñq‡Ž +*þ`Õ9‡Ž93ØaûÖ',5TÎÍ??gÑÿMMiæj9©Q”Lu„¡ó˜›ÓÍLiA¼K5uwG¥²¥—¯êî6à6´P܉KÐ_“3rØÍvBgåJÕØøÄÀЈÆÆ'gfqyé%�ªÆñ2¤««;€ekç`©nÈvvO{Á² KŒÜÙ-î½s·ñ۫׬l2ØgNQ€ÁP§LedÁÀ¢‰Éyw7›™>•‘gÎ-¼®EØS¨ª}’ÑÖö®¬œ|/˜A§ +õÆ#c…¹tªæt33~òÖûâ^ 0 +ë—ŒÅ'$ßœ3¹xÑl…› ,ìØÄlãw-P‘ïªWBX-ŽŽ.()Ò§©Ç~p(DkKûãþáqÙÌœ†–8ëìî«®kŠ‹Ovs÷À¶ê·ëM©ñR¡ê‚S¯–•µ-’™-llnë~*™PHÆfZÚºyüPªhf4\½w¿îVãuMÂë•Èpu`dª³g ®¡%#3ëtÁÒ +u¦¸¿ÊÌiæL&Ë/€—’–Y×ð�I÷ M=÷Kµðú_öë5(ªóŽãø»¾èL;M;c¢r ÚÔéL;™É$Ž3¾NUX@±F/ML2ŽiccÕ4kÐÆhbƒUX. +ËmYAŠ€H/€,ì.{–]a½�Þ/Í›þÏyvg{‘«,üf¾³sxžg–7ûáa!ì,ÖárÞ¾{ñ³=Y?úéd+:›¶ o~ÔÉ—ç=gÞ–Wæ)—†‡ÿ:<,,lÞÏÂçÿ$|þK’~>'*r΂ÈWFωY8?6fñ¢Øß¾öËe¿zíí%K—,ù`ÑbšUÿM|«xU£rÃÇ«Xî¼È”·–%®^C__MÍ-A…¥zíN:Fó¬ÝÙ¾ª&3+çŸûRwîúìÓ;wü}E4û¤=v¾ú9èè¿Å®µõ9HF#×Y¬)Í9™Ww©¾Ï5À¯÷:F%,‹nrŠ±c]=vצïàÿ ý…HÛÚºú€¬\Xk7_W3ý +úc&óÅïëÏ”Ÿ-,.IWfÏÈTkJËÎT\k¸ÁYºm<îN:Oïb¶ŽJX³°Ð'éq¶ôzC§'²KO—kˆ]r³Oä•ž®¨¨¬&‹ÂIz%X9k¯Éb£8k¥ÛN‹]E3騄5uÚÎVÖ¨ +Š}òÊ„Í9‘GCå¶?Ñ”•_kÒѸj²Òo±ÌÝz®«Ý›×ç–ÕFΚºô\·³Ñó…ºkšÒ³E%g”ÙyGÒÒ¤ÏÍW¨ËÎVÕ5j tŒÎ´:ƒ¥EO¨™p$d[7Û:º(zÐÑz÷ü²št&þd]H×ZÈÍsÕ—+kê+«ùÎU××^j¢uRµ±…kК®7wÐèJÇ ,„åÂÒ—¼¥µ½ð¥Ù?~éDXÔä9+jóâŽED¹05:fïÂWwÇÄ~»x‹¬E‹·¿º(%&voLìþ蘃bŽD.T +oW{VõÃkDFTÌ; +D’7o~¯Moìu¸‚ ++ÍΨu tÞìæ,]f+¥Dª£P„U›@)Úu/ŽIX1‘Ô‘‘‰ô©ÎWמ8©ª8WÕ¤Õ‘yõ-¬P/‹¾î.›ÝÅp§÷ÊT³°²:…kùËy1BvýØÝG»œÕ&Æx•ÔÍòâ5˜°t@§çŠKJŠÔ2UÅh÷Ðá#4QþëàaRÕHªšn²ÚÅÆ$¬NLÏ×f¤{º(šOÛ…ˆT^Uþ@gK»Yë]s›WZ>n²´îiWÇñ˜º3Ñ¢0±Ê‚°v¶Ë#Û?Øe4•ßñó—óæF4SPÞ¼•PþÜà©<‡ó&éÃÌ ÏŠˆþê7¯¯OHJþ#}U¦gdú` +ËbnJ“©¤I–QØcw±ˆBZ§°>óë„k¶ÚX\°&JØÆæ6bTÊk~¡:3ûä±ãÊ£ÇÒÓ•YÄ놛WJÞ“²¯ÕÐiàº&IX1Q½j7³Û<AŠѬ*ddAXa}æ¸e2™w½³~ûoîys鞥ËfQo-Ûý»ßøörú†LZ½&>N±nÝŸŒ\çx„W“)ìÈ lPaš[eªò‹~ýMJÊ>²5í?é”23'íèñ¬œÜ:ƒ›¬ÂBXŠÂòÈövtZ÷¦H^»îqŠŠÄYÕÊø„+âÖ¬Yûeêþv£ÉîðÍ+„}Âj[Å%¥Ra)2—O}Êý $litz³8ÆBXa!¬Y×@¯ÝyõZC‘Z£ÌÌÎÌÊ™ì”Aʦ15e(³ +ŠÔ—¯^'ãüN¯vö Ë=uº<¿P-CÖgtìlUÉÒa§·°-ÂN±°”ÝÙOÎ:û§&GÐ\SÝSŸs ×á +Ä+„•Â^ojQ?°…E%ëÖ¿›zà CÂBXa_T½A³;§ ¤BØÙ-,«²ú"h±Æ7¬ÅJ)Ûà B‘˜˜¸ª©Eoຠ,„³°ŒWa!,„ñÂÒLz,=3C™_¨..)-RŸb±çܼÂteöß>Ý™”´zÕªdzÕ¶™ ,„…°ÂBXTØŽN[ÍÅúw7lÚºuÛç_ìý2õÀ>¡Ï÷¤ìرó£¶&¯Y›˜D¶._¾òзßqÖ^½È+„…°ÂBXaýD)±5uW¶}üI\œ"ne¼B‘˜Dу">!^hÓ¦÷²N¨ÈP:a!ìŒÖ‹W;Í‚°6„„eÈ6·vkNøêÐ_þº}ãÆ?oØ°ùý-îþLJ¿ý®¨¤ìÒ•&ÎÚÇx…° ¬›Wa!,„…°¡&¬7¯A…¥Œfº¤GX!C,a‹.´Ñ.³ÂBXa!,„…°£ÖÓM¡ág)¬ÂBØé#l„…°6$…n…ÕCXa!,„…°ÂBXa§EÂBXa!,„…°ÂBX¢Âºy…°ÂBXjÂŽàÂBXa!,„…°ÂBXa!,„…°vÆ +Ëx…°ÂBXrÂzx…°ÂBXa!,„…°ÂBXIÂBXa_tvF +‹ÂBØq{ÂBXa!,„…°ÂNÛ ,„…°ÂBXa!,„…°ÂŠ¼BØi„…°ÂBXa!,„…°ÂBX*AXa!,„…°“"¬À+„…°/JØ`¼BXaý ++ò +a!ìôÂBXa!,„…°ÂBXaCKXÆ+„…°/JØÑñ +a!,„…°Â†BÂBXa!,„…°ÂBXa!l¨a!ìÌÖ'¯ÂBXa!,„…°ÂBXa!,„«°„…°vl¦eAXa!,„…°ÂBXa!,„…°ÂBXa!,„…°¡„…°S,¬¯ÂBXaCGØñò +a!,„…°ÂBXa!,„…°vºa!,„…°ÂN °n^!,„…°ÂBX‹ÂBXa!,„…°¡„…°6D…õð +a!,„¦AXëOXß¼BXa!,„…°ÂBXa!,„…°ÂÎDa¥¼BXa!,„…°ÂBXa!,„…°ÂBØé„…°ÂÎva^!,„…°ÂBXa!lHa!,„…°ÂBXa!,„…°³UØï!ìx4ÕºälB½€ö�ùƒoõðñÏg2ƒ&Ó_þèì O1ÑéASš_:-Ý,S°¼1íbÉéänÊ2øi„žVi2@‡%óêSÒVC'K§÷ʨ<™¤ZÍÞÉ$½ÑjjjÒyÕØâ¶ƒÕ 5Jc’Š•ôj“žºÒ(I*v¹¡Ï#é%Yض²˜¤bÞ^ÑÕy{*Ú"íÂe1mÇÓfYLÒ꺬*1&©PåŦÊZwR¥«q'ñ´ª¨ö®ê:ËCê5ÖRå’zºÂ’¨Z/ÍCêewÿuç!õ’,·¤be¬:Va)ŸHj¾S>M-KBêiþHuÃ:Lj•»B¾l1ÑV·§žT•,¥ê%õTJjúÉŠtª¬å,§åGݹU=šu†JóôäÙ¡Õгèéÿ?}6ÑÉïmO¨§þz4λ{¸¡'>{@=ò¼>G÷>¹ÿÈ´ûð±´{¬Ô¿î>ºsè®ÿh÷¶¬{FvëÞCßÝu7x'PÔí’î³úeÝ’çôsàžww¥9ú}×ç»#×yÛ+‡»žÿ³/<m%A�Ç?ñµÜRè½7÷nƒÁ¦¸à†{ï½cCÊÕ|ˆÛõì[¿}~g@wR餟þšÑhX÷ŸÁ»O1>}Vïߢnïÿ@ºÈÖèÿÚ¬Vï7¾æ-§û+ÒÕùê¬Zû_µ5Ðü*¬rãƒ@©~ÏW¤jD¡vGå«}F¥Ÿ#zùJ5W&²¥[¾L‘ê"iP R ßIrðœë$²ídnH<ÛŽ ϶@,ȦšÑt3’¢ œÄB ª‚q"�b5àU±hõ†Ç©°Ê¾0æåxB ÜAÂ�Åk?( ÎÂÁ±ûòoØ< {ÜÄ%ç•AÎÁuXT +±8“vFÙAâÔ†™9'Wqp|‰ÄLà‚Šã9a°bzKèÎ-8 ñiÌ ØéÝ}KúwíÛ¯¥Ï×z’î8í±×GéôæÃnG5¨öcÕÇkuÍnèŒQEãTêâÊõ¶¸h•Æ*VÅTZ¡&£,./ÔàË•Äe‹ .)Ôy"ÍJRåKf* ‘aÄÓe©ˆ +$‰H²ÈHÂqN¢Š³b…À@Ë#h>�ˆäÑ!$çgý‘pö†åCB ¼AQià 0Ü~$E¹n$×ê5ð%Œ„Ówz”ÃâwÌáŽÛ96ˆÙ\QÔ+äš/zéÄ.ˆuî`Ù‘°•Ym„±z…Ár< +�óÀÉâç;>7„3qŒŸáñòéOgÀ«3{Ù 4'¬cP›•éš02”àäS舜Ò9d:;"Z»T3¨Ö&Õ`Α;T_¸<Pò]ì+°=ήü|Àº#clKlI½éô`æÓ=•ñÚÀœ<Îñ( ¥ÿèê!Ó*í”ã¡“BmC>JeT¨Œ¨2†A¦Ò3”â¤*K?¤ÔK:ÔQ…þHŽ¯Gr-8䓉;jþɾ„±'Q‹;*°+pHì*…†¶ö•[CŠ16÷ä"v‰ ÙºÀ6"¥ÖDH¨Õ›ÔÑ +µÁXƱubIÜÁâk•±°ºæVöçø–÷À,µÄ˜YÜ¥fwß#|;à5Ï·ývŽxƒm ÍbÓB›Ó3›¨¯Áµ^½'¦À;j¼oÁÚê c’X˜œÆ&¦W&^cχ–‘_^˜ZB~f=›Z|öû‰zÀ¬&ç‘ï‘ ÆwsÄsÆß�\wÁ +endstream endobj 195 0 obj <</BitsPerComponent 8/ColorSpace/DeviceRGB/DecodeParms<</BitsPerComponent 4/Colors 3/Columns 126>>/Filter/FlateDecode/Height 110/Intent/RelativeColorimetric/Length 10226/Name/X/Subtype/Image/Type/XObject/Width 126>>stream +H‰ìW‹WSGþO* ˆ²•ãúÀòy +ˆ«¬¶>VDDí]¥¢+¸€U«‡UK[«TP$7ï„ Ï„ÈÛ�H„„ä&¹¹¹a' ¹Ä ž£U£[¾3gÎܹÉß|óÍ7¿™™YÀ°€,`XÀþo¡GLRµ¶{RÕ,WÜõždÔm{HÛTF\YNð©$x уLò€Hž$âÒJ‚_yU@q[íµö¦@Ô¢˜�ÿVi´ÄÝSù4�HdzÅùÂd*gMÉ‹@°1Lt‹µÇñÊöÖ‹HXõ˜1¿oi«èh~.SÃFwOîc„ÅbšPÿ,xšQß´™ÂX^Eœå"9S½”m Ñ·r¸ê2O²Û…ù]]y¢Ú„gš'ø»éÜh"}}%´”0·Ë ÄP +=µ®þjc{ÿ˜ÒÝsý(€Y,° }2<–A¯ 3–Cζ…äM>§Q6²Y[š‹Ÿõó +±V+…áq½AeD¦“ÖdÒ›ÍÔ>¢CL2 Æu°T«ÔjŠÿŠº÷qj×Òh¾4Š7ò!‘6Pé‡<ÞÀø±ÃÜM€{ Òû‡v‘ÙV}ÎÚ…µñ9º…Wmg»K£6þi~L&T©®uuïihâ°Á‚z‰ñú£¾ÉÔô_Šÿ)Ø@ì<À©]ZEÀ½Ú‹LÚÄeg´ +JŸ=U«˜ßù¸0Š>V(®õõînlð¡@ˈ¤dVÍŽµþ/q�o9Ì©[M¦Î‹dÒF(¼M¥š4½×�ÀÀ0$Mi¬ú_A$íç=æ?¶¼çqÝ°©°¾€ÿäsˆìåй•Á«¾ñ¬_n0˜?ìÄÁújL&®\ôïG§®„ ìºæg“Sï{Ý?0&”%–ìdp“æRÁàjvaO÷ NëÞØ€Kàó}(äp•+…&÷†ô®€ æ+MÂ�2 ·_:5퉀7>þuþ*€0ú¦5ùÝ]«Yô Ú•6‘\£swP“Óð~“/ r\yHgÐ~+Þ¿Ÿ¿)´(ÊSŒsÙ¾drzM½lúS%ߌY#òÌj’ýRc½®ºU–—÷ÈŒ¾yÞb6Yô*‹z›èÇdæçõæn2*|€¶–¢m¥hG…¹Ÿ…0y¦°LË-ˆnæVHâ”°ÝA ¥2:'”¨ùÓË9kÅ#±Tî0ÞU!y¿ïßyåܾÛý¢á™y¬à©…ņÙ6¢Ãd"S'„Ôß0B'w·Ã×7ê.yÃy‹¬åâgº‹‹49žªs‹•g—(³½§òWk‹·Ê¿Fع¦Ö{æ¡:L#sù¸Kc>”rK,^ÇfÆ°8Àö‘·Ð‰ûP'‰¤1m´µíQY%ÿLú1=¦ðØÖË·rªä£*0õWò€™1å Òô«±ò°¾$¾ì§ËóÐ9± x–døõî_+LlnÙÒ” + +h<Ù,LÞ^dú«¯Eî‰ðŠÌ£Ô83o}]À{ô(J‘JýYŒH‡> ùTÎi…«".~T•xüfÚÖ¢£1…€yP¿|ãl…L2aÁ\&ŽYØ,iÖW¦mÃ…ËgÙÎ[ØÖ^ðP[2˜¾²%)„·%²:,šË +Šcmuk›hm€WÕá1µ‘QàÇCßlPmÒßÿíe€MdÁÌ8ÏxÌówŠaÕò±°jn�¡C>lLjš¯Šºf¯HiYY% ÝNxzt(GA±=æ,yÚ,ÖóRĦå¦. +|o.ßÓJµCá Öþà1~Ú§#ecÍæ(+ÃVnÃq €6ÓVìö~¼Æ¢&"êéÞ@iæ +ío)h'Œt‰ÜEØÖ,–Ɖ‰~mV[»ñãöíÏݽ€p«à!¢Où£¸“·ÇÙ©ž-Ñsu֗Ť;üñáqc'ÝP‘ª+øàY™½D“ãç}fçØøà‘•c6³pzItìL~ß¹ÓVƒ…í }·A_qófâ �ùõŠ(^Mqw ûxO[ò ÄšÉ@ÖrqaKö/© —_à<Úu r¿¸ *<¤½ºÞ*ì/ëÜ»X·&×ÓÎüt®gïµ6©ÇáÆ´³ú"ÛxÛ¾N«0ûŠiÿ{p?*²ó«õškáHÝu‹~Êe +Îæo Ÿ¯÷g2Êú>N»oÿª¡Á‘·ïÚ½ý¨Ãjœ•OÄ槤=;½Zu~‰ô_¾à äÚ¬[r̸º•ùùTIy¥œW¯uÁÃRýØ8(ðˆTÝݧhh®¢ôþt[q†ÿÅÁšøÝœÍI¸àqñÛLɱ@ÛÆ?;8îqìæÑÌUðûÍ£Bàü3.9Ջ䃽A•I×±¬ç#n`öµ�÷ŽcM-vÎA½²¤üà?~´1ü"ó¶G`û§ãsH™8»tøøŠ¶€p@-(¡iGйÕä—ÌЂ¡Î§!NŽÅ†¨¦&íâ_ÿh;•S—|ˆ–ètàÆáž?×i««Ã£{öù«ŠÂMݸ/¼,ÛÁÇÙNÉ€8³u`Jã&Ž_³v<Í!ÉÖSu{zqzì‹ÞSˆç6çÏrŽÄŽd®�Æ‹°: =(þ^èޒ؃=ßúÁëò¼ô„lzlfÞ©ç2´K~‚L©•C÷5§d‡&ιS ®y‡Ù^qBc[wMä#eö´sþ÷ñ!”FcV‡0»µÝ`Bß5…o‰ª¾AOÒì ø|HÞÔÄËGc³v_Ïzp§€RvYz…~;—PøMiá}©k¬‡f•ŠŠäüˆ“§¢/”ØÌõ‚ïÍò¿{ºHÔЧō£²½~OšË)0Ûp>‚âšÂ9›A©E^ÿåQŽär+†Þ"ªwà3»Û“PVÿ^‘yú^UIthÂE¡@<få°ìb°à´¬xÎŽC%ÉçN&€Ppig¦ø»UÀÞeç}J9jß#7¿¯êï赆ù)ßKï¼3/îÓ´vàNoÛ^‡íÌå¢øBؽ¨.:Brb•¾®ØŽË(.F×®Rf¶º•ªwOå›�sI(²§î€ö%é[RÍPߘٌ¹Ø&�*Ë®¥5Ƈùr#wtäÈÛºzZ‡h÷nŸ/çœH²ùÌ"èpRFÌÒ6ÎÃb6àÜkñAp‰g~„à€n>r +˜3pÎí™öT?Ðqù +ÜZ1t|±8cKõ_5ŠáÄWùWYþOt´ÛiuN÷é3?ŒãqÇQ$ ¨ƒ´8í2Œ¢‚ŠJ«•f‘}QhteÔ°4û.H@0ÙS•ª"s«*)*UQq¼ç:áñê¾[ß»ï»ßÅ°(™<BÚ‚â_SáËß«—Q’)/ïWÚ“]áOL36–.ñÙ_Z³}ïÐÝGˆJm_IL«ÛëÔ‘+AF\\æΑCÁ‚øˆƒÙ¥wë•ãSüöÓÆ«¿ìy²ã¸®§¿å\„økYÅ×!SkÝ7]ú é¬vYÊŸíï”[J*Do¾šÎÓ¿"k¥ +«ä#:Ú]jÂbœ,È’ìØ&rójØ8Y׈#ÈÌ×á(’@v¬ñ+ÍùâbiÔ‘[!Û’8øŸØšóµB™Agfó?Gü0“Nè¢T·]ŠßJA-˜©³ŒÚ§èHâµq2Ù}ëâC˜ß¨Ki>V×øµÒþåÄ{ì$Õ¬xZÚ¡b/`bžj5îÚ)rón8av^C`ò|Àܽžš6ª`ÒlB¤â®Œð'g¾%€’£±Ô ñt^ûËAÿu Úo ‹¬ÚàC'y%¯£î«ëÕw~%ªÙüÀ¾²æAÏÛE÷ºú>*€1Œ N7Ižþ ebcVZ'Gd‡B=•ƒˆ™§×šaKžŸ)êæk«ñ¾*¶Œ4êÍMÕ7¯„þ3•£NáDî§Vùãn›“ùÙó`ÆáÑקÃ!:óEl©ï�š‹¶_ÖéDYœ×Ù¿µ*CXÜ“3MRò9´àöR1Áxù’â”Þ„wû¦QópvzÕ†M§¦:º§�ÏX_fšâV _48¯1¥Ô¿®íN9ûþ1¯„ËYÂ;uiþaOã„Z&oø×½œ2ŸÖÿëÏ7x¼ Ý„©®ìEÜMX›œ'{7ÿÝÄ$3°‹¾//{61Á-p®iÕûî‘ì‚l‡pmÎ5—›37’Ÿø>Ü8[ºÂg"f´¡\|;Ä'‰&šÿ{'DÉ}õ¼ÓH‘›Ûm³ä?€¯xZý|‹ðJ;çÍ—@¼Ù]™s’@-œRËø‘T¶í=”!•™ÿÕÛ)½Ÿ¤ð‚Zq§VË x¦ëâñVec³Ó·Û«8†åá~È#¾8aÖÓ¦y¯«xÐ}4—bþ8šöá Çqëªp cÃpñ|B«Õv9nFá¬ØóŸR›Ž#ȼŒÒR›sTÌïÑÉc»ÓÖ$ÜíÒ~. 󶼾&Û)ä‹ö¿l‚þÎ)BU‰IvíȹOðØÞ”ð=‰|ô¬·ræÅÙë&yMpb¨{ì~Jå¿kþù-0§ºà•VÍ¥,›«#Ðõ¼ðÞÃ'yKó‹7{(ÒÏbÚI—á†ú¥m;q3»û#°ûC1üBK‹ƒäíÏЙÞje/ÃõÊþóûZÎ^2sYˆ4C +R ¿Øü»;a˜˜�àͤ·È%}ñ!÷‚=ãÙàŸÞ™rãrÁH¿« dmOZ–3Ôο)ðe{½Mí5ü�ègÄ¡ì_ö¤üõÆ+AÌ?þO¶nõÔ²¢"ºieŠltW'‡+uy!þ*i'`$ÛŸ�·CÇ + o•\‡Âÿ´9ŒÞËŠbϤáûoBµµ3CùW?~¥ÓiÙÏ郘ßPzêý+yC2Cø4Û{‰7ÿô6-7Nq¾Žþ~>ÿˆ nCDní°ëZ¼°V>ª˜‘ñÔø¶´$¹·Ç©sÁQuêöÁëi¸áDFèß!÷ƒ’4F.2§Â‡%6gpø›Î¦ œìT܉/ûÕ7ÍŽ¼YC¶%æD—ô·bÖY›«^ß›]FåZG»Ö‹/uÚ<E¿K91BØq{pÆÕúf—Ь8qU&g0§©z¨Ì~6òÖ¡&MÒ&}ÿ�ß(¬½Ð”ô#™ð‘‹àbîÚÊüvÌCz7ŠÚ/ý;‹ÝöÄGæ¼(~ ¥ÿ:íYQVõB°[D÷³|yI]‰÷FUñ N<ôó^R9lt`WRHuýGvum:]^@S]Õ�ø+Ÿ–fØXh*¹0uÝ—‘‘ì'¡Ÿ@$•$Œ˜o¬5ñÀ=ü”fk9\|á -Õø°-;üOíHÉK.WŽOÁíàx†§ah¤ñÀ1;Ȭ„¯d~õßcW¼øßw-ôgÜêä{o5º/†:i:=Õ·ÛyžÊyyÚ£Òrg§¹(”Ÿ¥0ƒu MWÿÙN"Ÿ¶ +ë¹Ä“ýŠËI—ó¤ì¯GѲ3–y‚mw[Ì(÷Ôp\~!Zä6£m*Yö…—ó‰0X0ínUtòwÿ=ª˜>_Áé̲þáy£ø)VÜÿ†ÍðÔ)-/ÞècÖ ½bcÚ´ò;Tû…Czª1F-2g{šþ²9fl®`wb~‚”™…ǽٲçœÿõâ[µ:ãgðö«6ø°…%M2Ðj)J+:¬3ž@j¯ó·K>ó€¾\þûÒnt÷ÌÅO±8i+Í0lü— +‹ãº»˜xI¶1æ;Dx’ÿ:ÖWeŠYj¤Ä$äÑ觾Dœª mÑšPßT6ø!Û’²~+é{Ç>©Éº¦êM;èj¬ú³î˜½9Eòÿ J˜þ“¹£÷ߤ=nMˆ‘·P’}²ßÃuçòj?‚mr§Ú%Ì‚V]”¶äùÙœYqÚðÞ|{»1r±‘¦šè¥hm²mJwÚwj‡môhΖúÞÈ÷ì´O=Aÿ‡È¬+k5ê-ô»@õÏÜ}Y+ ~Ó¡S&ŸÝ3ÃÝ$¯§z½).´Œs·Ü':–[X秗9rž…|IqÐk© +AÈ0uï,T5§¯™¶hgÁ«$Ãÿ'’j�ùÈŦ«Ë°ž +¶tù…3wšÁ¡ì¦œ{8Ã<ä8î•—R1öæ=”]«Þ�ÄB1¼€^Uÿðy“÷Gí-¡ƒo1_[õ?cïØ,î‚K´%–ö¼!9oTk˜5”Ï3eV:Û©QRäÛP7`ÐCTøD)K@6§I?âCu¸B½*M2¤ž„±ßÊ>þ.s€ùÁBàrÁĨp‘sÔ^s©äÄ'…Þo®éFLÈsÏŸ’‡Q¿'PÓÚÁ¼ŽŠMÉ6%|Éò·pd÷S*À O»Ý‘ÛÒÌÊ´!µÖöŒ°¡ŸnϪ¤j¬ÁGe¦k#™<æ[´:ÂF‹1³žz±‹IzʶšgCl œë§ŒÅ¹µ'}’Ù´ìwnwzAÖ‹jO¶’o=eÕé™×’tSìrR�ק2ÇG”1Á·)?±ôQºŸÏnQª¾Ð'H¬<§ÀwàÿMiIáè((fhHM‰?PØ.2g¸aÝO Í0Zv–î›È„´—Wsƺ9°š;ÿðÛþb˜†n >êaç|n±Âõ;ªÆë™û®·¥3/ZtH~�6ú?ÞËÄ«‰,ãÿ +‚ £¶N÷8=:Új‚ .ˆ¶Úî ˆí6 +HXˆ¨´Èf(YØdhTDPQ6}•-{*a^åÕò*©„D`î©Sç¥êUêÕW·¾û»e!ÀóÁq¹L!¸_yÆùºÆá¹oÏ'TƒªÆDY[ ó<¶ä6Ô‹•JüÛŒ°²C…¼’`>5&c÷ª4“ÞwaU̘zÊ:f½–œ˜ªº”nu½ðWÀ=m‘oëBüOÛ*]N~j§.ĺ_K6ÃT‘?¹ª Ö¦ÚÏAÇ’¨oºÓÙ»•ƒƒß¬áÈoiGLžÏt{þ¶Ê +Pd±OOE¨¥@K§÷ôAiæ!}y‹êføðr® ¥ +:–H‰vÖŽS`»:<ÈüÒýÞƒ]CðV ÃoRA="•�äÖýy0òLêZðœ}ï–÷÷Ïf…BH){X!É9۱̼Æ>‘:›‰håÍH“!ô?e¹§Xy’:ÈzJ_…îµfj½;¥k¨n»¼ÿÍoËU <Þ=iÜ&ÖÎ÷š{2/¹@‘t¤WšãA%’¨àÊ»gÍ!)Ùí ¶ÊõôΣò¤· CÜsuo•eø:9„à:™Oxð|Yž§=µ„Õ=ømŸ�uUcÍgÿƒñ WC6_,´u† _lëtÁ.* ÈóÑ¥à‰ð%dæ,(>ãFx;©6îWö„Ï;M(éíû†%ElÏ£gMYIOcÀ�M†Ó©®1vÚjàOÐê“ÅÀ‘i6Ù WXô*ê,¦ÄªžÔû¼sc“7VØÌõû€í“Âr+|ìD/»¶èѱ}‘é<G}ÞáBbyÿ€©’•=DÂÓ<I7S`o] L*OG-ÅeçPèΞöÒ{çiF†T"’UýÐÉë ‰”77zU=5”èï0lE¹å@ MâÁãðx’$‰nv—“ž ÍÓRFt²¹òwä%~ºý3šä(OŠPå6ÿU3½£ÖqVßÖÌzJ÷B°›©r?”/´u Ø�óÙÛ!¢ÄË_'ÉÀíþ+Ã\Ïk©lÜM÷jçç{'¦X܆ù,<¾“|b,ÌBÄ„&µðæú +5¦˜FÜðuSX L`½ük}Óó_=JlAΧnøíœ]T2ÊÍ·çÊßèäá,xaíïÛBt‘†Ú¯OÀzCªÄhi¼ä1õçoS½ZD®™¡6‡ày|̵VuéíèY}—0Ý#pÜ-(.ßê|X}ì¦ÓÞö@ÃóÛ®•{ÛO†˜S0ÉYXxj;Â3ˆø¤ò?Å>h7QQc,vQ^ÒÀR²óÐoÁ’Ÿ™èÒžá0šÃö#¬°ÖRSî>+ž× L"ý›P²/¯‚{8Ð7âöŸê»º”²J°_³¸±×[×dÐœ_›œ=0)žÛ¢q±ª†ÄH&X +xèW`ÃϪ¼±Ýd8ðC0‡YÈËæàIÃÌ©ËüZ§X瀘jï¬vÿçÉuN¯ÎeD �I^qño¸ø/ȽT¶|ºüýé´È¨òžšÁ)‡ÈÀÚ·2¥rnTf‹„úfDp=ÕV³íÉàvr—“x‰rŽuPú`ŸZ6¥¥¤îMM¥÷K�~\¥¨xñtËnðO·¸vñ +;[ú8'Sx»¦8 ¤á$ÿèدðs ÔÖ›#®1ÑM&èhzTv÷ió$±çÑß‚æ”5?;<éäH˜¥ˆT›I˜ø&‰_õ¼ÑÕgFõáñ31©¬9:ÖÖg{OH‡†U˜êù½ûCAK˜y²àKÀŠ ~h»J°%òÓÕ=.õc«IJšƒ©9Ÿòyá9BjLzŽf¼:÷~fÜŽ‰Ps’$iç!^×ZQõH?}«K9¬„‰þ”Wl?�1¾%.TMôNýéJ#b ÿù;}C‘œ§Å§ª_RuWÿüHN„X¡\•Ã×6ƘáBë³Êb7‹ òÚðá+�{iÆÕØ—©ÒHPg½Pk�£=ýq ŽñŽåö{¦:ºÔ’¯òâËâK„$qŸi¾´:d×E 6*8´w*çÁ8 ðÙ”L>]g‰Í-ÃÑz-óç9gÞhŽúÌ"Äs ÛG/W6ñÕ*ŒU1Ö"k’5±ž•OTñ†VÓ‹‰'µ÷Ä1«DË ¶Ê:¾ÏÇ!œµ{¢ÞÅñ]×ýJ_|³¤ÆGÕà n8h’HªÔF}¢Oêä.£žCg>xLiÖaµt.IxFóï)(…µµÂùÀÈ«7ÊöJÉÑ2$Ò,òÝùÿÇ9Pì4긿^;¿åFÿ¤h_ Í3”ÚÔO¤±µäz¤]m‰\5…X 4œsÂ,”ïéóp]Ç6üƘ’d`¨ÖÇwøuNa1Ò–—’¸µÄJ(�æ˜ /Ý}ž0sý°{¿¤¾ ¡Í_D661‘’Ù̲m@üSiW>D}² ™üf’øuªá6“|cFtÔš�*…òKŽ°|ë |åîÃyÉÒÔâÐ…ZÐ5lI’¤AÙí¹'vDÇ—ÔªæºËÓeÝhßÄZ[uª�Ï’Ÿ{,=¸ƒ€|2ùa¦…YÈ„çÔâ}2RÁÊöò\눸»·Æë½tƒsãE/QÊ.qø":Õ!€…-úË×á‚S°^ÍžßèfU[Ïhj\€fÍíÅs‚'©VÈû®¸pMYÉâ!«ò`¾… ˆl%b‹^®¨NP+¤únjR3Å*ëx˜Sú³žðŽcÑ€ì"Ê؉ÁBÉÃýÁñ3úžó‘{¼ãDâY.̤¸þú=–<›ahs£H©§ÆärAO[Õ‹•Å…,¦$à9dÝ*½ùËx˜ñ¼Ððqñ—)^ßW+eð¬`£ºÕA驘lkjçZºÎ±jÛÆÑ d‰7C•—¦¹ª¾vþ¬ôqŠ¦IÒž¶Ty`5…u³O “¼èE<Úؼ¬ú"¡k—Ë3¿tîYeSOt¸´ñ6dßM¿ã:jA¶-sŠoü]Ù«V)Ñ{Pž5XK€bJôþjDÙz‡7»m‡.Ù |EÛ»$y+Öß�&g¼ôÝ£¥3ÙIq©7rèÈí–‘±YkirÜzßÝØKÌÇJ•Jk¦VwˆD‰ŸÛþQ$d*o?ä¦Å&í‹°AYü¸58êè·iýx£o¦Z¥êæþ×Áµé·Žú[AÙñ„çÐÊKï9aÏáü’¬ê³.1:öŽ¾¼ŸÊxöþÿœð0z§D‹óp=W<èì˜fê@åV7Ôw¸$ÛZÀOo)/ëdÚÕwÑ?Njè‚îbbV)þŠV‹†u„•<§u2\‹0Çšê¼Nvx®œ6G*;YkÂÌ¥é®Xï[ê[ËO}vÆù:ÌmOÚð¹hõ8ûeCÏм©k(ÀS¥·¶áæ'nS“LO@ž}b¨íÞ“x»œ&ÿãúÛ>NÌücç@¸5$jªÒɲªúëÕ˜\ë¯kÐO•Ôyï§Þ[>Ã~‹5©ŽÔtÈðV²</Õxõ?*L•q«„’Z“Þ´à0Û=œ¢Ò+êæ\RãcX,ñª©1òꥦë4µrðCmQ¸{Zà^–V«»</#0ŧŽL~¨ ÈFIâ/Šš ‹Z2Ð@é[žZ6©l-§œ¼fAB#ƒÛÁÇ%/ýûUâÕÔ•‡ÿZ àxëR§S<Ó3Óñ83Ök- 8*X(„SgÔÊéÔºT‘°e±ìȲEÉB¾$„°²¿¬ç†„LjÔezò{Þyy¹÷¾û¾û»ßïûÝ„5‹è©Ô +mÑ-¢‹È;TOg¾ÊŸS¨½Èäk fÌöáºPc_‰g*V�‡â¦ï +Š.h(³§Ý5òƒÉõÇñ¹µùŸ«îú£Í0<úʈW*¿Ãk�L:óX³�a?Ò:²Ìålî«YÑ+,žX¸Ÿ\îjÝ‘vñ‹ìίO™—�–Ìâ7Q*''A’uªÝÈ/´1óû‹Â.Vݶ?ÅAyvëâ+nð²Bå÷ÞC§µ¥C¸OŒÏ1–.¬š³Òe‚V,¦ØÄ(ÒŠQf†U³1Û؉pÑ¥ïX-NýÖëk& +³Ó€†—&¬cŠ\x…E²¥×D Z±“>µÁøÖGáŲ2†É<ÒùKÛ“} Ê,hUTEåþ{°H! ¥–M…4”fÇñÑ8i2¸I€ŠHIÆŽ{¦nœ‰WJ�³ÀH½m¨a¼Z“®;¥5»î·6<Ъ`ݸƒæ¥»ô¡QAe÷];Òð$Q¾õ¤nÍSâ�2éöà ì¨Ænù·É>¼È×´~O+ü,¹<u¹e8G ˆÜV›SŠ;#¾ÿ{g‰¶W^~(ñÓ¡ú¡½Xð³ —±í†EÂ[1=Æø øjÖð®´Ÿ;›[ÇÛ:_&œ94²·¥™:7·É!ÖhÓ+Mü–ÙŠ¨‡…Qûˆ•Ž¯•ÿ]¤šÈêtRÞ±å{Úuhß‹tkÑ ½À7V|av¬èU/72B/o<%ÖèˆL˜d/qæ5�é»ÆåýíYGLfqñáhêTœ»\sÇÊ?b;Qæ?¬6·{x2}—-ÿêPÒmsAˆ¶¬Ñn{þŽ.ë}}ÕióØcÐëq]’Åla¶$Í°Tš¸í9Üe½Á»¤ySJu,ƒyŽÁªÕ›qÚèÌ+gÜŠ†Ö§ˆò“‘ÌÚNò£èª;?D +0{]ÔÆAŽì§#k·þQŒÍ½¼råÀ´¹WŒ²ŽéˆÔŸ=ÿàîSö¨lÙ[Dmú—b™Ý‰l¶ÒhôTþ á`@ £”Œ½à¤Ñ?l|ä(>ëú^ƒÉ/<?–ñæî»Zòm´¿£¸¬mø—™ßjuA+0úEžÞ>7-Ëû® x¤}}sêëü+íôŽiÉVÐå]°æ¥ñ,ÖnÖlÞÀ^¢¯ŽÒëZžLBÛÙÜ„–}D…@ü\_|õáNöŸ–îÿN•¾Sso‡üFˆ0aÿhJ¤‚I…!•ë¾{Z‰|Q…»IH>–‰®•W}ûÁ›¥±tü¨ðM‘÷kÁ•.%²9©¼ÞrùßÃÑ�6‰2+9ÍdìjyŒx»ó\kï5’ÂWÒKó ŸŸïý>M=!òô"×u‘YË\Ç#Únó# ™fŸHÁ…”? +"“ÉÂI/³³Å�‘ŸÂæ|ÛÛÓ霾ú•„üÈ—@º2ы݉|$þך?…´¯ª*¼ (“Å¢.Ì‹µZxCÂm0›-‚þiìuü¥#ˆ¶œ‰Æþ#µx~u�‘Š”ö©/pñÆÑ·(Kéæ|Ig,ÝW|“ÀÃ"¦`büÏOŸ8qî´AM”Pj[X×óÄ.èÿ\*t°»·˜M–îöÁ;_•^:š–=üíO¡9•!åu"˜*’Á ‹7ë·!fÔšÿðzO<}Ö+—'ìIiÑ@G?üÏAˆÿ¿wvØõß%ø‘D쿺 PªPj;82ɼž†süガ‘Ñx|Û¡ÌÊÙ•»‹ñAu„Àb�‰h·²R2‡;,ÝF…êëAc0a‡G?ik8.”ÜøáÍX ô¿‹z}‘p"ª›±§µypO²îK· ±¬¨'Ræà°ÒoofnK®qzR8Bé6ò¼’«ùú¯Ó‘%3ßôòöµµ¸UžunÝΑ:qbÒd·ŽŠ·‚I…ê +›‹åóËÀpþÒán÷Hn4pä²ÛÃCûÛ[ݳ¦}4(Î=ciÌá¥ÿ{…Ù�Ä ÑenÏáVj£X¼ ƒ,.ÚŽÀ)xêcƒÎl®Oÿ“Å(<âüíÊï¤6ÈÏÕk‹Ý(šs«¾yÛ�¨h½P”ÔͺHcÔ +E"¥zc¸óN�G‰&•^§±Ô’¬Åΰ[²ÒL$•ðÇç5:o~Þ¶‡\oÀö'³8§ººÒ8}s‹–M˜p§èžÈ8‘J;sRñqq¸ã—?ÄV[îV‚N3è¹ýÃÀzmrO{Pè %Ã| ?¡Í-áÍO²ŸsEK +µÞL&“¶ÀN©=ÃZ``Ȥ3È¥ª^º�ŸO½_z-2/åx¦½,:‚‰;™ùY2î]2 q8r,›•Ó7$ÕBoñ«·ŒfS2ãö(Áõ„¿–5¤T·áÚØMŒV¯p¸Šß?5>0 JαÞÉÆÞÆŸiei?&”ª§'}šn#ÜÖ?Å$ÅÄDdŸ¼T�dÇŸL +!’±£côÙyÈô‹“ûo ¸—!ý |¹dT°§TOØ]‚Í®<t·üÄÏ^-½Ts!ïËSÙ ê!¦:ÉJuFìɬgrN_Ìû¦ðàÍÒ?ü·zw ¡d„Ï[’IuÛbÖ4�A bU]Ó³XÞP +½ûÓI©¨{¿¿·¨öƒ‚Àês«>Ê©´5 éûó«ÿÝNK¡ÒRŸ2qœÁÎ)ɤ7Z,>º%€JH”êáysz®ubêñø$Y Wpß5) zF¡ÖMo{™>øàƒ>øàƒ>øðæð?�˜> +endstream endobj 189 0 obj <</Intent 199 0 R/Name(Layer 1)/Type/OCG/Usage 200 0 R>> endobj 199 0 obj [/View/Design] endobj 200 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 193 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 192 0 obj <</LastModified(D:20161013192721-02'00')/Private 201 0 R>> endobj 201 0 obj <</AIMetaData 202 0 R/AIPrivateData1 203 0 R/AIPrivateData2 204 0 R/ContainerVersion 11/CreatorVersion 19/NumBlock 2/RoundtripStreamType 1/RoundtripVersion 17>> endobj 202 0 obj <</Length 1437>>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 17.0 +%%AI8_CreatorVersion: 19.2.0 +%%For: (Quintas) () +%%Title: (icones.ai) +%%CreationDate: 10/13/2016 7:27 PM +%%Canvassize: 16383 +%%BoundingBox: 25 25 75 75 +%%HiResBoundingBox: 25.9999999999973 25.9999999935353 74.0000000000036 74.0000000000009 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%%DocumentFiles:C:\Users\Quintas\Desktop\google2-01.png +%%+C:\Users\Quintas\Desktop\banco_objetos.jpg +%%+C:\Users\Quintas\Desktop\dominio.png +%%+C:\Users\Quintas\Desktop\logo_1__2_.png +%AI5_FileFormat 13.0 +%AI12_BuildNumber: 111 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Registration]) +%AI3_Cropmarks: 26 26 74 74 +%AI3_TemplateBox: 49.5 50.5 49.5 50.5 +%AI3_TileBox: -256 -346 356 446 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI17_Begin_Content_if_version_gt:17 1 +%AI9_OpenToView: -663 289 1 1103 725 18 0 0 182 216 0 0 0 1 1 0 1 1 0 1 +%AI17_Alternate_Content +%AI9_OpenToView: -663 289 1 1103 725 18 0 0 182 216 0 0 0 1 1 0 1 1 0 1 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 203 0 obj <</Length 12101>>stream +%%BoundingBox: 25 25 75 75 +%%HiResBoundingBox: 25.9999999999973 25.9999999935353 74.0000000000036 74.0000000000009 +%AI7_Thumbnail: 128 128 8 +%%BeginData: 11916 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDD8FF +%A8AFFD0484608460FD0684A9A8FD6AFFA9AF84846060353C1336133C131A +%133C1336133C3560608484AFA8FD60FFA8AF8460353C13131319133B133C +%35605984608460846060353C1335133C133C3584A8FD5CFFA8843C3C133C +%133C353C3C6084AFAFFFAFFD07FFAFFFAFFFAFAF603C353C356060AFFD57 +%FFA9AF353C133C133C35606084A8FD15FFAFAF6060353C136084AFFD53FF +%A984353C133C1360608BA8FD1BFFAFAF8460353C6084AFFD50FF84601335 +%133C358484FD21FFA884353C356084FD4DFFAF5A3C353C356084FD27FFA8 +%60353C60FD4AFFA884353B133C3560A8FD29FFAF84353C35A8FD47FFA860 +%353C133C3B8BAFFD2CFFAF603C35AFFD45FF8460133B133C60AFA8FD2FFF +%843C3584A8FD42FF843C133C133C53A9FD12FFCFCFCACFC9CAC9CFC9CFCA +%FFCFFD13FFAF60358BFD41FF603C133C13352F537DFD0DFFCACFC9C9A0C2 +%C1C198C1BAC198C199C199C2C2C9C9CFFD10FFA8601384A8FD3EFF603C13 +%3C133653534C77A2FD0BFFC9C8FD04C1BAC1BBBB99BB9999939A939993BB +%99C2C1C9CAFD0FFFAF603584AFFD3CFF8435133C133528534C4D4C777EFD +%07FFC9C299C198C198C198BB93996F936F946F946F946F936F946F9999C1 +%A0CACAFD0DFFA8601384FD3BFFAF60133C353653774D534D774D777EFFFF +%FFCFCFC2C1BAC1C1C1BAC1BB99939A939A6F9A939A6F9A939A6F9A939A6F +%9A939999C8C9FD0DFFAF8B3CAFFD39FFA860133C1335534D4C534C4D4C53 +%4C537DFFC9C299C198C198C1BAC198996F946F946F936F946F946F946F94 +%6F946F946F946F9393C1C2CACFFD0BFFA8843CAFFD38FF60133C19365377 +%4D534C774D534C534D77A0C1C1C199BCBBC1BAC1999A6F9A949A6F9A9394 +%6F946F946F9493946F9A93946F9A939493BBC1C9CFFD0BFFAF603CFD36FF +%CB84133B13354C4D4C534C4D4C534C4D4C76999993996F9398C198C2A1CA +%A8CAA8FFA8FFA8CAA8CAA1A19A9A6F946F936F946F946F946F946F9993C2 +%A0FD0BFFA88460AFFD34FFAF3B3C133C53774D534D534C774D534CA099BB +%939A709A99C1C1C8CAFD0FFFA8CA9B9A6F94939A6F9A939A6F9A939493C1 +%C2FD0CFF8B60FD33FFAF353C13352F4D4C534D7753774C534C9999996F94 +%6F77709F98C1A0FD13FFA8A16F946F946F946F946F946F946F99C2CFFD0A +%FFAF6060FD32FF603C133C355377A8A8A9A8CBA8A97D9A999A6F9A70534C +%A0C1C1757777A9FD13FFCA9A9493946F9A93946F9A93946FBBC2CFFD0AFF +%A86084FD30FF843C133B137EA2FD07FFCAC293936F9B77774D7698C19953 +%284D4D7EA2FD13FF9A9A6F946F946F946F946F946F999FCFFD0AFF8460A8 +%FD2EFFAF60133C1360A9FD07FFCFC3939494C3CAFFA9A899C199764D774D +%534D787EFD13FFA19A6F9A939A6F9A939A6F9A9399C2FD0BFF608BFD2EFF +%84133C133C84FD07FFCAC3939370CACBFFFFFFC9C198C277534C534C4D4C +%5353A8FD12FFA19A6F946F946F946F946F946F99A7FD0AFF8435AFFD2DFF +%3C3C133C60FD08FFCA93949ACAFD04FFCAC2BAC2CAFFA27E4D534D534C53 +%53A2A8FD11FFA89A6F9A93946F9A93946F9A93C2CAFD09FFA96060FD2CFF +%843C133B1384FD07FFCA939376CAFD04FFCFC998C1C9FFFFFFA8A877774C +%4D4C4D4C777DFD11FFA19A6F946F946F946F946F9493C3CAFD09FF7D5A84 +%FD2AFFAF60353C133C84FD07FFA0949AFD06FFCFC1C1C1FD07FFA87E4D53 +%4D534C7777A8FD10FFA19A939A6F9A939A6F9A939499CFFD09FFA9598BFD +%2AFF84133C133B13AFFD06FFA19A9ACAFD06FFC2C198C9FD08FFA8A85353 +%4C4D4C534D7EA8FD0FFF9A946F946F946F946F946F939AFD09FFA85335FD +%2AFF603C133C353CAFFD05FFCA9A94CAFD06FFCAC1BAC2CAFD0BFF7D774D +%534C534D777EFD0FFF9A9A93946F9A93946F9A6F9AA1FD09FF7D5384FD28 +%FF843C133B133C3BFD05FFCAC36FA2FD07FFC998C1C2FD0DFF7E7E4C4D4C +%534C4D53A8A9FD0CFFA26F946F946F946F946F946F9AA8FD08FFA2285AA8 +%FD27FF8B353C133C3560FD05FFCF9AA1FD08FFC1C1C1CFFD0EFFCBA85353 +%4D534D5353A2A8FD0BFFCAA1939A6F9A939A6F9A939493C9FD08FFA2532F +%AFFD27FF353C133C133C60FD05FFA09AA8FD07FFC9C198C8CFFD10FFA97D +%774C4D4C534C777EFD0BFFA19A6F946F946F946F946F939ACFFD07FFA84C +%2F5AFD26FFA83C133C353C138BFD04FFCAC2A1FD07FFCAC2BAC1C9FD13FF +%A27E4D534C534C777DFD0BFF9A9A93946F9A93946F9A6F9AA1FD07FFA877 +%2984FD25FFA884133B133C133C60FD04FFC9A0FD07FFCAC998C19FCFFD14 +%FFA8A253534C534C4D53A8FD09FFA16F946F946F946F946F946FA0A8FD06 +%FFA84D4D59FD26FF353C133C353C35AFFFFFFFCFC1CAFD07FFCAC1C1C1C9 +%FD18FFA27E4D534D534DA2A8FD07FFCA9B939A6F9A939A6F9A939493CAFD +%06FFA8774C59AFFD24FFA83C133C133C133C84FFFFFFC9C2C9FD07FFC2C0 +%98C1C9FD19FFA87E4D4D4C534C77A2FD07FF9A946F946F946F946F9A9BA0 +%A0FD06FFA84D4D53A8FD24FFAF133C353C133C358BFFFFFFC8C1CFFD06FF +%C9C1BAC1C1FD1BFFCBA853534C534D777EFD06FFC46F9A93946F9A93A1A8 +%FFC9C8CAFD05FFA8774C5384FD24FF603B133C133B133C60FFFFCF9FC1A7 +%FD05FFCAC298C198C1CAFD1BFFA8A8534D4C534C5377A9FD04FFA1946F94 +%6F946F9AA8FFFFCA9FC9FD05FFA84C4D4C84FD24FF60133C353C133C3584 +%FFFFCAC2BACFFD05FFCAFD04C1C2FD1FFF7D534D534D7777A8FD04FF949A +%939A6F9AA1FFFFFFC9C1C9FD05FF7E534D5335FD24FF353B133C133C133C +%60FFFFCAC1C0C3FD04FFCFC1C198C1BAC8FD20FF53534C4D4C534D7EA8FF +%CA9A6F946F939ACBFFFFFFC9BAC8CAFFFFFFA87E4C4D4C59A8FD22FFAF3C +%133C133C353C1360AFFFC9C1BAC9CFFFFFFFC2C1C0C1BAC1C8FD21FF7D77 +%4D534C534D7EA8FF9A946F9A6FA1FD04FFC2C1C2FD04FFA953534D532FAF +%FD22FFAF133C133B133C133B35FFFFC998C19FCAFFFFC9C198C198C198C9 +%FD22FF7D534C4D4C534C53779A6F946F93A1FFFFFFCAC298C2CAFFFFFF7E +%534C534C5984FD22FFA83C353C133C353C133CAFFFC2C1C0C1C2FFCAC2BA +%C1C1C1BAC1C9FD23FFA8774D774D534D77709A6F9A94CBFFFFFFCFC1C1C1 +%CFFFFFA87E4C774D532FAFFD22FFA8133C133C133C133C13AFCFC898C1BA +%C19FC1BAC198C1BAC198CAFD24FFA2774C534C534C946F946F9ACAFFFFFF +%C2C198C2CAFFA8A24C4D4C534C5384FD22FF843C133C353C133C353C84FF +%C2C1BAC1C1C1BAC1C1C1BAC1BAC1C9FD25FFA8774C534D776F9A939476FF +%FFFFCAC8BAC1C1CFFFA84D534D534C5353AFFD22FFA8133B133C133B133C +%1360A8C898C198C198C198C198C198C199CAFD26FFA2774C534C946F946F +%7053A8A8C999C198C1A17E4C4D4C534C4D4C5384FD22FF843C133C353C13 +%3C353C3CAFC2C1BAC1C1C1BAC1C1C1BAC1BAC1CAFD27FFA8784D776F9A93 +%9A4C774D779AC1C1C199774D534D774D534D5353AFFD22FFAF133B133C13 +%3C133C133C60C8BAC198C1BAC198C1BAC198C1C1CAFD28FF7E7770946F94 +%704D4C5370C198C1BA994C534C534C534C4D4C5984FD22FF843C133C133C +%353C133C1360A0C1C0C1BAC1C1C1BAC1C1C1BAC1C9FD29FF7E9B6F946F76 +%4D534D9AC0C1BAC199774D534D534C774D532FAFFD22FFAF133C133B133C +%133B133C137C98C198C198C198C198C198C198C9FD29FFCA76946F704C53 +%4C7698C198C1989A4C4D4C534C4D4C534C3584FD22FFAF3C133C133C353C +%133C353C35A0C0C1BAC1C1C1BAC1C1C1BAC1C9FD29FFA89A939A70774D77 +%99C1C1C1C0C176534D774D534D774D5335FD24FF133C133C133C133C133C +%133C58C1BAC198C1BAC198C1BAC198C9FD29FFA16F946F704C5376C198C1 +%BAC199774D534C534C534C534C35A8FD23FF60133C353C133C353C133C13 +%3C7BC1C0C1BAC1C1C1BAC1C1C1C2FD29FF9B946F9A77534CA0C0C1BAC1C0 +%9A4D534D534C774D534C535AFD24FF603B133C133B133C133B133C133599 +%C198C198C198C198C198C2CAFD27FFA89A6F949BA84D7698C198C198C14C +%4D4C534C4D4C534C4D4C84FD24FFAF353C353C133C353C133C353C13839F +%C1BAC1C1C1BAFD04C1FD28FFCA949494FFFFA299C1C1C1BAC199774D774D +%534D774D534D5384FD24FFA83C133C133C133C133C133C133C357C98C198 +%C1BAC198C1BAC1C9FD27FF9A946F9BCBFFA0C198C1BAC198764D4D4C534C +%534C534C4D28AFFD25FF353C133C353C133C353C133C353C35A0C0C1BAC1 +%C1C1BAC1C1C9CFFD25FFCA9A6F9AA8FFC9C1C0C1BAC1C09A4C534D534C53 +%4D534C774D59AFFD24FFA860133B133C133B133C133B133C131A349FBAC1 +%98C198C198C19FCAFD24FFA8A16F9376FFCAC298C198C198C1704D4C534C +%4D4C534C4D4C4D53FD26FF843C133C353C133C353C133C353C133C59C1BA +%C1C1C1BAC1C1C1C9FD25FF9A9493CACFC8BAC1C1C1BAC199774D774D534D +%774D534D774D7EFD26FFAF133B133C133C133C133C133C133C133C589FBA +%C1BAC198C1BAC1CAFD23FF9B946F9BA8C9BAC198C1BAC199774D534C534C +%534C534C534C5359FD26FFAF60353C133C353C133C353C133C353C133C58 +%9FBAC1C1C1BAC1C0C8FD22FFCA9A6F9AA1C9BAC1C1C1BAC1BB764D534D53 +%4C774D534C774D5353AFFD27FF843C133B133C133B133C133B133C133B13 +%3C589FBAC198C198C198C9CFFD1FFFA8A16F9476C39FC198C198C1989A4C +%4D4C534C4D4C534C4D4C53287EA8FD28FF3C3C133C353C133C133C133C35 +%3C133C133C58C1C0C1BAFD04C1CFFD1FFFCA9A9493C2C1C1BAC1C1C1BAC2 +%77534D774D534D774D534D774D537EFD29FF60133B133C1360848B603C13 +%3C133C133C133C349FBAC198C1BAC19FCFFD1EFF9A946F9998C1BAC198C1 +%BAC1A1774C534C534C534C534C534C5353A8FD29FF843C133C1360AFFFFF +%FFAF843B3C133C133C133C35A0C1C1BAC1C0C1C2FD1DFFA1946FBBC1C1BA +%C1C1C1BAC1C9FF77534D534C774D534C534D53287EFD2BFF353C133C60FD +%06FFAF60601335133C133C357C98C198C198C1A0CFFD1AFFA29A939998C1 +%98C198C198C1A0FFA8774C534C4D4C534C4D4C534C5384FD2CFF353C35AF +%FD09FF84353C353C133C355F9FC1C1C1BAC1C1C9CFFD17FFCAC299C1C0C1 +%C1C1BAC1C1C8CAFFFFFF77534D534D774D534D774D7EA8FD2DFF85133C84 +%FD09FFCFA8583B133C133C13357BC1BAC198C1BAC2CAFD15FFCAC298C1BA +%C198C1BAC198C8CAFFFFFFA8774C534C534C534C534C4D53AFFD2DFFAF60 +%3584FD0BFFCA7C5F353C133C133B58A0C1C1BAC1C1C2C9FD13FFCAC8BBC1 +%BAC1C1C1BAC1C1C9CAFD04FFA953534C774D534C774D532884FD2FFF843C +%35FD0CFFC97B59133C133C1335347C98C198C198C19FC9CAFD0DFFCACFC2 +%C198C198C198C198C19FC9CAFD05FF7D534C4D4C534C4D4C53287EA8FD30 +%FF603CA8FD0CFFCFC27C353C353C133C355F9FC1C1C1BAC1C1C2C9FD09FF +%CFFFC9C8C1C1BAC1C1C1BAC1C1C1C2FD08FFA24D534D774D534D774D7EA8 +%FD31FFAF3584FD0EFFC2A0343C133C133C1335589F98C198C1BAC199C8C2 +%FD05C9A0C2C1C198C1BAC198C1BAC198C2C9FD09FF534D4C534C534C534C +%7784FD33FFAF3CAFFD0EFFC9A0583C133C133C133C357C9FC1BAC1C0C1BA +%C1C1C1BAC1C1C1BAC1C0C1BAC1C1C1BAC1C1C9CAFD09FFA8774C534D534C +%774D5359FD34FFA96060FD0FFFC9A07B3B133B133C133C13597BC198C198 +%C198C198C198C198C198C198C198C198C19FCACAFD09FFA87E4C4D4C534C +%4D4C5353A9FD35FFA86060FD10FFCAA083353C353C133C353C59A09FC1BA +%C1C1C1BAC1C1C1BAC1C1C1BAC1C1C8C9FD0CFFA953534D774D534D5359AF +%FD37FF846084FD11FFA783353C133C133C133C137C7BC198C1BAC198C1BA +%C198C1BAC19FC9CFFD0CFFA853534C534C534C5353AFFD39FF846084FD11 +%FFCFAE5F60353C133C353C135F58A099C1C0C1BAC1C1C198C2C9CFFD0EFF +%77534C774D534C535984AFFD3AFF606084FD13FF8460353B133C133C133C +%3559759F99C198BB99C3A8FD0FFF77534C4D4C534C2F3584A8FD3CFF8460 +%84FD14FFAF603C353C133C353C133C35847DA19ACAFD10FF77774D534D53 +%53591360AFFD3EFF846084FD14FFAF8460133B133C133C133C1335355A84 +%AFA8FD0BFFCBA9774D4C534C532F363584A8FD40FF846084FD15FFAF8B3C +%3C133C353C133C133C133C3C6060AFAFFD08FFA8FD04532F5A353C358BFD +%43FF846060FD16FFAF603C133C1335133C133B133C133C133C3560608460 +%8460602F351336133513193584A8FD44FFAF8B608BAFFD15FFAFAF606035 +%3C133C133C353C133C353C133C353C353C353C133C353C133C60AFFD48FF +%AF5984A8FD17FFA8843B3C1313133C133C133C133C133C133C133C133C13 +%3C133C84FD4CFF848460AFFD18FF84843C3C133C353C133C353C133C353C +%133C353C356084FD4EFF84845984A8FD18FFAF8460353C133B133C133B13 +%3C133513133584A8FD51FFAF608484AFFD18FF7E7E3536133C353C133C13 +%3C356084FD56FF84605A6084AFFD11FFCBA2A277774C532F35133C131313 +%3C3584A8FD58FFA8AF6060356084A9A8FFFFFFCBFFFFFFA8FFA8A87EA277 +%774C534D534C77533C133C3C6084FD5EFFA88435603535355A597E597E77 +%7753774C4D284D4C4D285328532835356060AFAFFD62FFAF8B6060355A35 +%5A2F2F2F532F532F532F2F2F5A595A598484FD6AFFA8AF84AF8484606059 +%6059605984608484AFA8AFFD75FFAFFFAFFDFCFFFDFCFFFDFCFFFDFCFFFD +%FCFFFDFCFFFDFCFFFDFCFFFDDDFFFF +%%EndData + +endstream endobj 204 0 obj <</Length 47758>>stream +%AI12_CompressedDataxœÜ}g{Â8³èýü>Oþ$$t°éBÇô@€@ +Õ”PL0l9îo¿’ÜeÏÝsv÷ÍXž‘F£iš‘îÍ–;=¡F¤ÛïÁL7ÿ¹¿ÏîÈážÚÅLègSiµ:ÐûüÉÖ´›ð°ƒÒ¥HŸmÙ!wô‚ÚÄLxÔãcžð}ÛËa±Ùi»Éf‡?¶û ~^Œ© I{†;¼žîÁCóâ~¯ÃC¦pÌ65j¨ÍpóǦÿ[„ü?ü1C6“Åf–¡þŠ™|Aø_þŸM’–5ðD…Â~ñþ ø×x0áHö…€sÔø°&7ûÆŽ“4¥VÔŽŽ™²7¦ÚpžM]rµ¢þ4eVÃñRü±X‘t,û|¥Å>Yê|æHz¹§¶Ÿ3ŠšHŸÃ=Û;èTm;nÆTŸý{ŠöülušO¨õb³ ôᮨÕÇû}_Ÿm›.û°ß`B×ý ÷£ùM—p_?sX¬&χõˆsã8úÝßG$y¥-�Yàgô{¸_ZƒŸZä~fP±I³üŠþµ}4ÉÙ1`Œ/;yGm×ÃݼíÁÿÂðû°M®·+ÀBh²QOÐÄÀþ׌5qû‚!“Û™üàC bLþ± ÿŒ™ž³²„Hïö-†cþ²š‡¹{Ý,ö s¨(C‰5!Wà ±" qá/Û¢=ÜÍÈ=`_juØ£eá±�jW‡“ã€x¸Ÿ¤Ú�\›=èu1íÿÁ,ÇþlÃÃl»h¿¾%7mªƒ†ä…�ÿG¢�/Žc€óÁÒÁ#LO">“,>®w¸ð—C˜^íÉÝšCzuùÍ¤Ï +r"ÁDX ŽaÈG ÀZõÝ"Æ2Ü/ìßÂ>S„ùƒˆí‰0‹Ç£>,ê‹ý…!<Á>#¿°Ô³¾Ãà'Î×ÏÖD«óÔZp$`èYj F2N.X"`]²O…/è�qز¤a8ðkcVõ®ßgæY¤ßXÀÃÂŽ:lK›)uó#Ý;äHpÀÔSH“ñk´RMíÝp`€ï| ²·v€9r +D…‰y^f~Íoþ WÔ–~gÚØX 7à =àV€'C0N$lHîßÀ³±u}åþßPŸ�ïmYP/PYÿ4ˆAU]lŽ@ ߆»ýŸÔn 'LPÑò/RbkIîÇs9Lö׳¡6†û9ÐyäfBóT`¾ +t†³ÆüfdäÙájµ˜í†ÛùblÊìôÜÔ¦¨]á9Iü=‚ošY¸Lw›ú†Ï1V¶!ìÌ;ÿblü[J˜ÀÃÿIX8Âä'À *‹P³MëÏ!`øêbdˆ[¯GÔjA¯yèâ_`Ù,Æ+²õ7½' IµÖuN‰FÒG<ØŸO¢Ò?NÛt±™�8ÃbO +k“Zo¡ùmj͇[QˆkÙ@‘ªi,·Û€.c”"ꣳøá2c©}1=ªï�6»ÞC“¦°ñ‚¿ {í&Û!¨–%Ýù†¦&AµÂgÀ²ò¡ÿ ½Ša&Ñ¿×ï”yÍäýßÀ×¹ù·²¡þÜ o¦Ë†Ú˜xØnò>פɚ¤‘*äÛx9ÖnäOøZv4½‰iÂülGcð²m�Üäí,èÅhÅ�U�ÒÚì$ ™!½‹ °g¿£–¤©>Ò$0—p-GJÔäe( }*Ž6 DÆ´ÉO§Èó"§¶ò!,«úŽm ;˜[Œ¡‹0ÜýmŠŠRÀmS€±'lý°§ˆ¼æ ]8I3_í¥>Jóæ?˜ÇðaXq<‚…‚pŒžh$ä…"A`Òñ0ü#˜Ø¹ˆÏç‡æqÈû©ˆbx4„E`ñaô‹/Àñp(Ƃ༧FÖÂLïÃoeðéÇ„GM¦5ÕL_˜irž6!ÁÿOààÉ©éÑtó“M44(0!°6¸]K†àù£ QÎô^öBÑ8ÛÀï˜�™fŒW´AÁ‰;‰ó4'–ðáó›údÂÌ%D#̤"I•(ŠS”‡¤N/í#+ïzCö"xgŒM4&„æ À;ù¿È1ò½™‡Ä±,û�¿«ý—X˜µëíJf˜©ÎЗóuqÓûþ‚–Y8ˆÇ2‚Eü°:Ð +GC_0èžc @¿`>ü‘P �k)À|Ñ`4âó‡xJ¨/#åU„3sÎøPâq"A„¿HŒëëƒÆpœY’lctíÑÉ#BˆšïÿgA*jŒÁÿ2BŸùž¦¼ª�¨d’ Ã49SWâó±"!¨ÿÃý€ÉUÃÀvšZå†{À]÷}/÷äAøU´¶Ðïµê35!U?šlWÐÀ ŒÁÝbtØ“4Z4 qz·þ·‚¹Q»ñ|±šìÈ Û +hÖ ÿþÙÿ½%ÙǶ‡ Ýÿc¸£EšTÜöáêÀ7†h•† %Øvlohé×ÿñ¤æi„J+j¼$'†ÈÄ5uý+8Z -ÜÈ Ï´Èý3Š›_“).' +®Mc¤X¦7´2ŒÌôÿwF8](Äþ0.`ÛÃÃqŽCÿâïeÑ=„¶Ô¡`çÔÿŽuÓ‚žæ¿«?ÿ»–2=ýó_Àßÿ$9½ZŒÿ÷ˆqàŒxü, Eƒx8ä7y›äp¥1ü?“ýÜÐü³-ÿR<öDpô¯øWá°î0çäb67$rø¦ÿŠâ~0á@8„aÁ`0àÓè_ÆÖò¿ex˜‡™F<ŒEáˆîðþ64¼¿ÿ-Ãã[ªãQ{`‰TÉéžÙî74¼ã—þ5F’¦-ê°“([éj‚õ‹CÙx.øLò‘õ<åS•q†¸ù¿b` +%Ü£ì .q¤”34Ìã—þ7ô¥Æ~7ÜÐÛ!€86&¥/ü[8Cg”‹ÍžÜ†cƒqqóÿ!#ÜP5¸9òêQú¿b”¶;ýcDšOíúß6Vý¢Ý ƒ+4þ×èo}õôßëŸK%ý¿¢KÔv¿X/þíÏü«:\þE?Öä~8î‡WèLôâÎÜMØ#C+RÔý +ýA¶éR&Ž¨ánbC©dÂMÂêÕm:Û‘ü¸t„! ú�¾-·ÆTÀìm¹Õ.ḩ±#ir÷ij“íQ¾Øp´X-öœöçì2˜‚žÞ‘C&gEÉV’YO‰N³½f·E‘þ|9ô9t jòû&Ê+—¸-\WØ\ŽÚ&k2“Ç!0Áí‰×Íb&Œ›D6œsé& À|zy“\µ©&ƒ—éHƒ¢p`豓ÿ(ßðkøs=Fä†ñQ#'‹ÃÚ$äÀM¿Í‰Ò MlŽ5¹cæso:ˆqÆT#鹩9¤Bae“ûŠ“¼R?ì·‡½ÞKÏzÇý«7³ÌnP[˜‚èRä˜�ðöN�Ê0ÑpµàT\˜S¾“íÂ#gjzKíåﮇ4Ç)þ7°íp"Ò§é’)}ØSü9·èMË 5^R€&3&¥RÞ6jÚ·`6èÅú°Šˆäe± �-&&Z@ô|õ…ï“,|ÕvÚ£X€îI�ŠD{{FQ‹”ncAð‰O‹x3eW‹©M™¸• £(YÖ3ôÛâØ%ÏžòVE˜®OmŠâÐœ_µu–\Ä’1¨Õ0K6"ÖRnH¬(jÇ%È1Rm‹â2ÛáX¶PÚ«6nò¤F¢\£eF`_ȇ4šÄ“©3.Igý¾p(¬5º«ÛTÔß@0Vë/j+épã*Õ|xPuúà8óíumð½&ä"É‹˜JÏ`Ïæø‘2“7o‡+AF}¦H€Ùj½µò…£VDuÊ`XÔ@[±@^-"À+Nof+ýÖˆ4òæêüƒš3{P…œ¨¹À?jTGÍD¼£Åg¨˜wlLѦÈÜ[¦KÄaµât[ˆžª),™³Õ"WÅá¼^‚†RŽ+wµ¶U +ðT×’Öâm¸ïQ+HóiÊ«þáf¿0=9¤b¢†@q` ’D¶ÞQ¦p�ÁÃè;.ý6_ŒçC‹Rn?Jšæ×#rrÔ”×’¶0ŸØ4´ C•Û5rl +VˆÄ~=ž³#;5‡}¸`eCåTlת¦Ìp¼„ +~31e•µ)ßô•&MLõXš½wä~(CgÞ„…G]µ3&( D‰rSÁïT¦†ÒX¸wà ²–ÁWK›ñê0!M﵆Ú2�¥Ž2sfòó/eòŠ[Õ†ce[BÜèm±™PÒrʈšH9DJ˜ÉÖa4¥V°X‚ø³Ø…gG.mm’:“‡Úþ}ÌGtò$Óß‚[%0—˜Am m"Ó'†ŽLpïqöÁ©È‚ç¾è翱÷h“È4Ù˜ÆqŽ=ñE\Î8ê4:Ã? ·¨" ©Tç5µyÐy-̽æ;éµÈ‘cä-n¢ß’Ìyè$TEÑ©÷Æ ;é5\…»t^óñ–:%‡“;l7BŸMx%CÎ^;ñ°QL àZRŸä\1¶¢h‘¾ÑvÒêÛýßÐS¢yE† +ÍÚpÍiA½g +Vq2|E臦-Ù5SmÞνÁä‰ûÐ9°÷`ZVÆß`ýÔ=ÿŽ&}Q1‚d»öQ±¥ü¡8 +#n £rþ¯-µÛC_\P÷¸Š5¸åâ…Ôänsò˜JòÆúùc +fþeÚ‘30Ùü+˜(h$~g‡Â0î?Pý½i4\‰<Ìärñ) g©IÂÀË$ò;ÃÍ‚ž +ˆ}'M¯•Ô£*d+ˆ-ä°…£6R›ÚŠQ÷ù”Ì! +û$n,k¢"AÂÑ Î ‰úü¦ˆëƒ~#ê \ú†œeQh·´™µÈ1µÑõõd/‹Í"àç Ãb;CHk¸çˆ™4XCí=žF—rèl†â!óS8ŒóóŽò¨ÈN¸E–xjÀR¦É=¤Ý„²_ð�a{¡öMfZÕÆé?çæÃ+ì“z¨‘g´Ø¯‡P”…°™þŠÛogë¥hrBM§&¥J°PTÚ£ÓzŽÚã +Ý‘‚?Ð$Úø•’’r;Ù^€Ð˜ZHD ©r„‘Þ¯<$à‚ƒ£�¾Ç¾ Ú3òÒv²WãýÚNŒƒg’ô…W”&}»Ý±í´¦4b;ÀM0îSœbÐPœåŽª6“$‰*óh…<KÏ +¬$c-÷ÔV¿‡LÓ¿F?™ÆnÕ!=|K4£Š=Ë)¥ÞJŸP0J\×�'ow4Û¨ÚƒÑh…Å„¤³Ò.Ž¼%Z#6Q&j‰â_FiF`›øštbŽÇ¾Úyà’ÔiÔ2°òöpOMk@°)oŽàáo¿ù›ï&`þÂã¶å-§À|œS»ÿâBÌ*Ͷìv«&c Ä363²¸:$‘“7£aŸ‡¦Ûð‘Òãíjü·†|b7´&[ƒF{`aðÛyê£ü¦Ám ƒm¨5�¤ÆÈ UkÊaØŒæKÑõ…lÏnÑb1òX{x‚×/¨ªÐ‡!n™ ÒPÕzÆ;j«×fîb3¥ôÚíDeÞºxadx4ÜÑZS*µ8t•Ž¤õ^<.½ÆbÕcÀTõÄ@k‘ +Ôo,î‰ÒÊšnöžÉJG"2¶»)u‘·£Ëï?+Í †û¹Òèh2Z@ËVkÒiφœ E)9*ÆG»(ª ^Úè@[ác„á¨,ù@Cz>œ;R‹Z°¹‡®ÿôO ‡"<Y³°’6økë‘ü˜^Ðlwä� \¥¦3%_A©!«26Ë”2{p:M +ÔÆ +·þÐΟDì+µ¤¶c-‰ƒZÐZÓZL–hA¶ˆÝþœ/ö$¿På7É@éX2»ÉŽ6 wP³éa3Öb0¦„â™LGÙ —†› Ÿv$l5Óõ@Æk±Yf£›…Œ©”φðh(äöy²Ûdoowb£Riv@#è‰ÜtåF\ o¼þ{©AXQKj?'%Qh”^™Ò\{“Ê6vPU6‘«¹cN’ô°:¤÷\¶_Ë!IoÎPºd*ì†h^š†› ›ï¦™áƼ…Ž–„§ôÁ·P6äÑ[R\¸)ßhŽŒyÍ6q>Ù†"®¦ÅT¡ÉKj¯-QÒ ¤V¢ 4¯�fÄÁ„‚´T¬ˆ£¼"Jãʲáݦ4¼+o[gS Zª‰’fmAˆ†…íy¦ “¨çeNh5e$—µËCÕúÄb&É8µ`k=r10 Ò‹i¬O0i;Š1’Œ…(§™^¨MIŒìjÅ%Òšb½)nfZZQYǃ¦—‹-pJ7ZR¶Û‘ðüh’Ú ;þjMa¨MˆÞpǹÁ‹‡%‘ejO–TGy`sêÏâbBÊÙæ¨Ýf(·Àj¨‘»è± žÒm"°z³lûëgº 0©h1Bz4rDÅ?ÛÚ®†¤mSǾçsÉD@ðjL1ך�æÁD:mØ>غµ¢\ÈcÕïtUðw´ú̯D=F™A‰ÿ§Ú¶½[¬a½|§Y½¿ñÒ\F/î Z`k.ÜÍ-¦öHZ<¤˜&6k¢¹½Ð?çäÆD3»ÚÃøŽ4|LCþÌž‚›#ødgJìÙ#àR`SÓȵ1�Ÿ Ô¸<s!Aä2dü«ÐwÓž‚ Ƥi”óдþ ÓÇ[f¿&ÌÓð¬Ò!Ü_Ï¡€¢�†Á¶ô<€ÞQSý‚66KxúžG{qL@w‹ŽŸÂÍP?bÐj +š/iG+¸>´w`ØBî¯Îr”§ciASˆ¤e[ßÒâÛTÞ@R·ç‡õh3\¬Œ0;ZD9@sæXœÊ‚ß›TvUÞ;²ç|>%wUåm”¸Q¼cÒ{W”()îò ¯½†¢‰€×Dè¼ï”V©ÏÄnø÷4•¾v"I¥/ŸDQøê镽u +=á«'³Fm¨ñ|GIE¢4‰ +_Ö KÀ^eêhŠfïJQ:ŽZ`V®¦ÞH½h"¯0ÑÎ:™fŽô¯êU_Ìènöª¾Ú<»·‚݃+®¸…mt´‹nÄžaÜ™öqÿé‘L¸õ\$‘‰§4^Q&r·å�ŒT±©¬ƒ¹I*„ÔL¸7€Q5÷Þè‹:‘Ea±1A™ôxG†{æÒV,›•’�iTlM)îEV™lØKx¿,`r±…-¢wt¼*…ן '%p/3lXB·ì°?<3[¼yÞË¥ èÉbº0š’Áaþ[¾úNÒF„¿Dvqž1ž³Ã-SB¼ 5ãô'¤üiñÊJx ¸Ú )# ²¼7Êu., .OÜTG´$Ù&ø ¸ÃH1íä61Ñ”x3αN·²¥R$˜#áÌ¢§dýáÃ{²>ß]eÿCÝIí +ëyl¶1— ³ËfÍ.†Úz-æCw±Ôk!Q$cÕOk-µ;ŒÃDÞW‹ÜãÀ†Ñ¹ŸÜÌ…YRßG*îÚÒ)ºâó4©Çªyǵ*ï3³âK5ìâ)1Îy<Öٮ꤆sÄ},Ü+ìs?_™@ÏíJ¯©*.µösg"tw rË[æge}hrS¬<R„f G§áÎËÇgºõtÔ±ŠÛžRñ%ñ•ŠÑžµ3çº?¶Âd +Ð zÀ¹é×[8³JÞcÓÌ|Ÿ‡{¸„"ƒ‡Ü¯þ¦âIëtšÎ~Ͼ)ðéá7Wš”ÌwäÇ’n¹ï6L'Þ‡“@ý±9ÇùqðÅ–úñô½ÿÁ™yv œ©¬õ•È’G¢S¾›?ŽÇÃ%ü´pæ§Õ9ƒÇ¼ÃðnaÄßåIfuŸ´ºwÎÏCºÚzø…°§Ësx±_è±ó•JoÆÖµó©öè ¯?Ÿá°—žúÓ»q w.c8rœ+Ó@¹°•¿ù±Il‘õÁ$ãµ'›ÛEfVáÆšC·zŸÊ–âwoyW44Ï•>Bw‰p–úvÆ;“˜ot÷…à&6÷`H‰ãNËGè-ô²¤Jd–ö›eÐΤŠá_wµœw ÌÎÞ¢ Áß +jÐ`£ÛR�}q&ˆ8û)þ–¯0í³®ü€æëúJ€ƒß1g"‘wùrÉÙèí)þ8ùyþF³É÷À«g‚Ð*Sæ»ð%t·=5a+2€~š3¹>"7PÉ@¨ú§Û¹gnêüæ‡C«%½¾D÷ï¯éz6ÓÈM[‹ßÔïW^:– tÛ}† ½Ð¤—ïãÎN&𞮹Ÿ·~vñò>N×÷3";uà€†‰A8ÜœPÂHëw]I׫Ž +‘³O*u8Z3K�²À~ëyq&;Ã_fH‰Pd˜zlïoÓíòþp<8qE”à&ã}gæ@µÀ +ªgag¾7¹Ÿùñd#>S~ÄñAœÈq¸œ*ú-Ÿ/)qÅ“ËMÃ>É9}@t‚£“ª\-¤ûeñMܹ}¶iÅ“ÆâížÏnùŽ3=‘R$thFIÂö°µgç¡æ2ï¬z_Á:èRHØ´òȨ)°ºÖ`pwöìlž§Ãã×f:Üó½Éç¡Q\u$Àoy·kUš–è’¬dšt»6qa“ˆæ2ÕîR©¿¨©¨]¡ž‚Å“÷a¾B vÌ>ûao¬‰\°çs& +x¶½040®ñ”Èç‚áLÈ]ï ÙãÁ‹Âšó¶ŽÌÏ~²Î¬6*Ýž¿[�ŒŠ“°Í»¨gñछӹ¼öõ 9«sVtÚsSk1úKÍ‘˜ï¼9‰0T¾Ú~"5{z‡ò~æoé×û1-m÷n¶?V‘Ÿ•;Ž¤› ¡UÆ♥m» âÜ&õ½¦c(&Ð-"Ñc£CÞöôû&hÙSÈж}x:H¶ŽDÎÇ=ò{|Ìà‡ÕGº5(gÙ§Ñô /f= É äAõ!ƒ÷ýtëÐOQc(ÓÀ/ëÔn{`¦L¼P½Ýx²žÝ„ÕáVÞ¤°Šm&¬‚OÒ̧r÷) +>½'ÀoÔø7|–Ao@4â¦CöÍŠm–åÞüŸìÑóû:‡Ä@Û ]² >ýä˜&lã-‹†ï l%„Ьsr¢îóo”—“Û¦O°w +èBÃŒ„ݲgZÌo,44.„¾.§ßi9Öjœ¥€ÇŒæ#)z½¼¯ÇA«×$øó‘Sá·}§8BÆ_DD`HÚ³>sP¾Óq!él)Ïï©“!› Ï\àèºÊ¶ÿHp¤’P„i'|e˜±D}Ü µÑ™4æ’}*ù +yÍ +{hðFÏ\Kà—cz¡½˜á"bp6V¤+bѨY +D“¼Ä"äaH»#ZÌ€?¬ƒõ=Á¬aʤSË‚dÚb(-veÂ×à:³*ÂõÃÎ lp*¹u™QýœˆÓøÙ^bÖã,{3¢iaÌ iˆÝªsŸÐà@˜±Z?¥6¡#ÝîT6DÊJ¶0õ‰õG4½ÚsV%µnŒ0;<Paä(á,�·Ø3¹eêíîu–]|÷Sùñò÷Ñm"#¸o¨»;b[Äù†ÜèI=ÔÕÜÌmO26a£dÿ”žÄÃîR«-šš½\¥ò›)Ó'ÓÍM®žj}ïFи]¥Ö¸¹±glÕ»%ê½µ�Gµ³Í]mo&äò¹E®%žÍr¤#_L.d@•Q6¬uö©‹¼;±eüWè�GW5e̶#�ïðš›òÖšŸiØ1h@[>Ø»Äy1๠êBçŀ癃<£ºáàÇZâ!/&²òìŠì<¼Þ/Y³é½œA®@*Ôÿ:ÇùÛœÇUüÌU2!+À`e^RŽÌËý×™ÊX¹€‡H%vU÷'BO®ô +”ƒŽ$;éM1ÜYUÛéúk°=X¦ +=Qó9’&B!¿ +™Uhö|€FpŽ»JÖs…å= ÖÙK†?Æà“k_ØÞŽ¢QçcàY +·ªâÃĬ°)¤[«”¼>ûÅÇÍdÝ—z5GYw¶í ½–à€¯·¼ËÎ?Í1Ðã~Ÿc/°J̲æŽJcàJú ß™¥ïÉ,<ày‹MÖ+NUYâI‡2D<ÿéá¡„‰ï/Ç‘ßàòôÝG׆¿\ïG$<®–3/TÃgﮟٮº÷é—çVºä܃·?Kfê/£VÝzVºNîd¨¹å)Ã~mÔ� Ï™Dj·›¿bµ·$Âðˆ%ÐÌbÓh¶$^ßfŠ™À!ƒá®WÚ,™‡ïtô±âæ´¿žEšñÖò®Ôî¶\$vW�ˆ®7à�¹& ®šÑ·›çp¬þT|ô½I½½8bsgk´aô±»HV…:Šî\yç°œvÌ7æ|‚iʯd 4cËØJ? •ˆb6z+Ù/Ä)µ—±¨'po‘šfô"„Âî`Tä³2¢"¸/f ̹eìÇÙÊ +5‰áó3”öncŸ®tñ 3—O•çIn²Žº8´Ýw>‰å²Å;F9¹)sÂØhÛÛS0FH–Tņ7³ò4q�´µA¶@Ãà|~|åûß÷ û3sê7ómãUØœç> ƒC–{@Œh ê Y~äí-¤– ’ßÈÅgUxu ¨ð[mÛ’ês¦i8îÏ“ùïú¨,–G({¦öü؉}¦¶è…oÆ>`ñûïRñäëC®´^|d‚wOúÅј¥›m'×Í}á+œYâ“Ø€aÌ“7Wú¨: ÒDM€¬Ž·”ºi?XZDÿî¡››’eV‹+W¶ÙmÈä¤�2/f÷KÀÑÛÇ©¥5WÀ�jµIçŽÐT¬ïà|mû™ïTDzßó¨«`šgæоJ@§0l{Ü’gV3Vú(ÄY¼ÊEqÝÚÏt[X_jÀÖs¥‰\·èPœ¤]Ð Ð<~QŸZ:Žðóø±.kòH~Û—(î{ž=.ò.ª‡1ÄÓ ñUXïVØî‡6G¼tGÝR›3æM2ô^È>g;Iƒ°{;ó0©›`¦S¿"³‘…y�…ßà“hÿDa<`¡VB¡'â·ÏªAÁ@f'òûÎœ›¶Tvqk þÔÓ›D‰Rb$47÷êÔxM½xºËWR™Ø,gû·¥vîèJèT:ü5yÎM£o¾Gîd$þì¬m`|wÓÔ¼î€D“²oE¡¯ŸB÷A·’%«$žB~%.‰.Óùv:m"{²Ÿ›¾ÐPI3RƒíoñŽÈ¦¿fD65k-Ox)õ.ÓÊMÒŽŸT§]ñÜ^Ô —ïnS±7r–Šlw}ÊT@“÷Ùh¾�/5æFÇÊØR(ñª¶v&Â…"Ô7¿½Ç.?[~ 5ó4ñ¿�ùyHu¦íƒx"T>ä<͉;{þYŠ,wð§º%6Yvë†_·¿i܊Ȭ>”Luå“ߎÜd@L‘bý+~ÓtÎ5"òq»åþpd÷7³®'‚ÇLórÔÙ²‡¨GÜ„^àØpmonÚÞ›®EK±D +÷„¹’ÚÝ}ïsSjçQàÛ(У3;Üz'²Ó¤_XFœ-†0ß2¦ayÿY`¾àrž+$îI`wDCLävÜéÑ<ÜGÂVš¼AôJ‹÷ÿ†ŽÄÁ)øˆü6‘ßa³G‚»Ç7`,~Òu<ãÞxr™Š'¶wâEÉYGàÓÄ+"$F»z¡Äk Ÿº+/Pdà +hP+ÔÕoÂ×VTR·Du“7�µÛcW —5nÕ0ÝFšJOm*h�õ+56`Ta³XÍ麵ý`6´d%ÜÏÎÚàãöØ,çö&ù’Ä`–wwÁ\ª¸ýå»(hè…n*tS+´ýșΧr¯,"PC_™U8eAž»!‚;aÇŠŽfÌ=ïø±Šcµ¢Ë¬VÛÌÏqšH•ò#,nÛ÷,Èó ½’pOãnö`é&UÝç\õß g@-|·%ú¡yÈoC_ÀÓ1ïˆ|¤Y”[ ¿Åf¹ÓÓõÃðîB‚‰¤`Ô€üÎ{ЄC4†Æã[ÞY·: ¿ÝZí5°+€šð(¡hxìo©øŠ°‹ t9´–ú„kù7ûœ‚q&è^T”PtÂQ=Ù^ì]èÁ<{w±8kërˆþÊ3´J…ßgùt¤@ïáFº›°•Ý,þº¦ÉØÃŒºi£Nü®‘y‰$trLJEç!mg" ÄoïeXF …=NäN.ˆ)GÎ+zƒßcFœ£¿x´ŒñA¤f€Ù[‡öDŸCÈ3F”€^B ðЛ)ñZºåJ¹™964ˆGóãÃm?q{n¡©’1ÐO2XN&¡ÎëW'Nf‹ÙùÇäº`·©ø‹ÿ;W©Äoù}gùkÐN#†ùÔã×+°HÃ/NÌçú¡ß[5<ݦ›«à›D$ßS´ýý6W)û÷ße¶JÒ•KhôÂíþfšfŸr³`è6î:|.B‰_G¸IŽ_"NŒY¦äe/¦8ñÄÊ4šõ9ΧTø6‡’@O¾²áÖ„ŠCS}kùvÑØd2nÇ|CG#³rãíÂ{ï}æfŸâL“çïÑ|æ0ƒÃŠœ'÷ÆÕ ÉO8†®gfdêu¿Ùµ¥7£ÍË9 ÈoßiEQÞ†nصß@Ãî=q/á)Ëioéök¸-/ºLýTÁà×o’0'¤ôà è¬-F§±øóVHEôÊXãíœcáÇ]ÝJ&q• ¼‡ Zµ¼¤F}n‚XÓ/l¬Ì8]¯á¾ë¬)á“ôéåè +òãqøFý@×›ÿ¹'òQj‘ÿ~Ÿ¿Ùãî*´„^ë?¬°©ŸªÀ ûþ‘ÊCö`¦f·/›ҋ9ìò0ö°j„pµ¥—ww#³LàÍï±ÀâÛ5K·s´#ô[&Ÿ€mÞW—"ä¡8žàºÅ–O¹¯E÷NÄn< äþ´VƒáÉÎSw®´Ê¾ÉÌ�Ì÷òyGØ*™œ›FÏE‰H ‰ ‡x±€>j0?j烂˜” îAc¢8A‘n.˜Ò‹¢ðò¤ýØDŸ‰å‡ƒWz“47ˆíËÅg®lžbB9àýïÇR½ØÅÞ_G`4$ÁÚŽ€áX¹QÆ`€Úv€áSçÅî¾e-£}g¾æŒ‚ÕçtµÔ¦óãD€z}ØZ¢¯ùKtö=iз"Œé{¾Óíùx{ù7|¹œ4·.‡.‘×D¶†µÃj¿Ø®È´¬êðQ¡¦ :"éR´ŸßL¸*dýŠãý9[l`a%÷ðæ?(Rü“rJŸ3„ÉÎÈ‹y5·39ßûá'_ þóó^øOèÁ£?ÙÞg€IQXïšOCè$ø§>çS347ÛýÅ'³Ûk…Q³3±Œ›íϽ¨Ù5_€gƒ©Çì<ÄZfWí=gvc5æ}êÚþ 9k Ð>h±`nHÖ &â�F]÷Pˆ1”ð+öI˜þ²Û%žFi×ö¹œªDéD¤óT/ÐÉï>{X®GtÛÄSúiŒ“cƒyëä«3ÑýòaåF3‹A¯o`.Öq—uÞQí @c 3»]Ò|Èj‡Zº×c›…£Ü×R VʻLjØW=GE-w¼[^c“‡nŽÇ +£ìd<uU3ýÌ|b'£JïvÜó¾/Ãò&p +vŸÃ€Ç_œ‰‚ùAˆÇKG +¾Cw0bX °b±pé÷Ý—=Wü3-ÂàÀËÎ^àÖs€×ð ìo]„õë˜ZR¬qðÅ¿Ü©aì¾~÷¯*X³£Psèö)b¥#o8t×U†[DïÓKe¬ñÛÚj¡¶JXw‡ÇbYšŸV˜ +Ë#Æ,WÁº³D§Qe¬î'F´3/Šc½%¶ðœæûú¢ÖT.V¸£ªªXåj ¦Fá×ÝçØW†Xí+“Ø+ùöÍÜ[Á›êhjc–‹µaµÊ*ÐV+X_£¼+Ü*Þ}uFM±k¬|̼ŠX¿ÝígU¬aï´e°¢u#šZ³}GÇœ´2ÖFø;ð>¯º”°ÒÖDWÁ„.¡Ýš!Êà t»Åž±Þ³°¥¹öÕ•°bÄ×!`…s#Úû妖UÃ:Ä +®AGkK[I[¸«„ÎÍþΕdwÝ6ÙâI>ž>¬ùÏ%!ÁÚ‹cÕ°‡XGX‹$Å-Ù0”iòáV?zC¬¡»ðrB|«aÍa5ÇWT +@Cß–~c©ŸÝs!–cm=ZýªX+dË©`ýpc¾ýaå$´x¸•"ùüѳ۱v¬›™*ÖÖüe0RŠÔZࣀu*Û¸2‘«þûW"Rƺ-ߪbíô·{„ Qn{KVrÊXk‰|ÿûåëKëW}YR +%4DüÓ N"F°/zåVÆúü³]×£¿"Ö~ɽAX‘¾9îî¾å4«`í¾bùź¬ˆ5òì¾5§¾Üy€5ö+`Eñ'(¡ýpŸîÈo—-{¯:t ¬>kÂV”ŽµŠ ±4Äê:Ò<ýŸß¼Üoà Ýäáiw¤ò¨‡'ë>é”Õ”¿Ášéâ%©PtíèׄbõX!VB•ÜÜp³{Vçcñ6Ä`Mâ·L.º¶çÂê·Ä²)VËn7Aw"ÆäÃÝ¥IŠcã²Y.ƒ?±‹5öâ‘Qø–"mFß‘Ã~Hnr‹¯ßTLÖ@xÚ}Á×µ§s`ÞTŸÂuãHçT€yxpfY‹ü!ò§¡ÞçzN/#ò§›ùí;·<•„¥Ø§ê럣9P:~[eOEDÝ¥}½±êëUç&éS:ªOUŸ4õÛñ¨¨Ò R|(Æ_iæéÔú•½þê\<þ°OñÛ˜üé¨ÜÚðDShÐÉ99ûSáéÛýÈkVú™‹=ÉžJˆ6¸ÿ[T_ÿÙ7¶Eէˎ/ó¢ú Y/‰Ä·ZЉ—Ç êÓ²/xW}:ÞŒZU ¢=˜JŸµ×òéÚˆT}Zö%oq ¢¥Í>‹=¦òz°ˆåŸÜ¨c¶GÙSgû…N²O³ž¸ì)@Óiµs‡%É™ÊJO“½T]ü4àj²N¡ßòâ̺YlbýÈ +6ôà~…ü7Öy#úA çÍ··@Ï8kv—£]àÿ´áü0»rÍ,üóÄ^Ô‚^C¢ÓYc„ ‹pØÌpBtwë³>5ܬrÀïÅ +#qç·"?“q†€ó&ZUÞZdcžæû9CŒ5óNÿwñ4²9w›‡þ["ºÅXqßìEkèîîu»úØbÄnO+PI?¸*VŒ˜>·T±4P‹Ž•‡èNÄX-‹kä9Óa<<Ü Xé»9Ùä±úCKˆœøµ¬ùáV¬ö®*V@á'Ÿ*VÈеˆ]‹o¬Ý/õ±Þt@jH#×B+t-æÊXãf*VdªU«êp‘¢Š)mɼ’Q?úÄÎôÖ²½ÉÚ@Sû÷a½Ñmºûýο×eí¸`Š¤ipÎr+:2`àŸi§(\$¬àm ÔÅÝÄaÇÊ™‡VŠ“Лp·Ë%üIlm“6€ +Ò5±µÇ·<H‚‘ˆ-?¨‰há#„Ø0QûÅ +›˜5|ÏþqÕ(2®9BwÀàž¶LIÄ ÀŒwNæîù?M™ãÁ†¾ê|ûDS»A9Éuúµ¾>@‹õààÄx¬pÑ°ñ�ã¶2Š©•ƒ÷÷èäÌ7±ƒ Ô§e´¤Ú'Ɔ>X×\>k+ áY4Þ÷uÈTd„?¢:üÃöqÝ_P\@>H«ÙÀÑÝ9lÝ¢&¢`Šâ4Þñ#t¨ŽÚįÚsÈÍÀ4RJŒªE/1(ñhh¸#óCèA3Âónôœes6>õWTkF¨,¦Þ%+H€^¾L/Z>“^R)d—I!€ôè;/_ÿ¹3’ÿ,íÄ4äzÌd§‰ÈøÀ"eò}çy +«tÇ•w1Xò1qZÅåÙu›er\oy¢¨£âàºòåÉÏÈ)ƒó';íš•Vt6U:“sÙð<°,pÄóy€¦«¤•¦ì¤!Aoñ]Ô ^Ê„ÍÀþ�:øžS–3]×Z¬E´Q%£Ör˜*m¼sÊùÄqÏÐ(z¤Lf\ 1hÒè86†„êêC2í”8¼}?hÎæîzÅ]ðχ“ߨàBªRö�bÒ–¯hÏ*ûL©ý>f0B(9;íZý…ï–¨o`4û‚bÇ…6ÌŠÙì_½G֙ƴ8§eRÐVzh4*‚舵—ZÕHÐ6%eánÐØ8{MM¥8É +„,@šeÆLS6ª&©Ô>VS€}¡ïÉëbní“eíYo²ÝÑêg0ÝR·õøé34‡Q‹l%khhy’9ÜÜCÙf±½ +õÅÁ*iµ¹#Åïâž«íäœH4ƒïD¢õwW#šTºN´˜ÝáÝ‘w»O(Ê#Nb9Oñ›j2-ó>7°¾ÑŠW^žûäíõ–gæý×bÔæ8ÝV P¯TO"ÐQwº(:x!4¯©Õ FACCÙh,ê‹#=Aû7F½@õžèÈ8‘ZgôMO�È\w§ŠaÌûC‰_oMÉdvG…ðxS�éû¢GQ|*AÆÏkSä؈œ|ÀD4þ‰~•HÓ˜nqæˆ1¯Y½Owºqâàko`áqœÖÔ¥SDâù¸�¤õLÂQýØz8Ò72æU³ôJp[ñÍè™p·ê4æöxþ‹.|¨¸î0fóEÏýW£—òJ?Šr¢—ÚbWåvÝ(.v¿%ºôJ{Y¾ØݸãX”B00ïí¥A‡²,Ë°€´G†}ŽuYjÜ«Xµ¦#5ðŠõâÁ!Ë&öRÓõšµ!I¼|jjù¸„¸€V,0ïï’!±]>R´g‰Öe¸ÇÜU"ŒLéÒF/:( +œÛluB…H$$! ©™: 3[îÌ`$þ¨ofWdf¶Òº1@¾Ø˽vwdz‘±l”U£?ù¶ê³…½XAD“ªÆ³g×$šî"®)ÄSÙaèmE®Ï’YªÕ£ƒš¢ ùz<SˆmÊ‘òS¦¾™¨#Õ|ªmÌÌ…û]V”"øMÎÇN¡Á+<”Q¶‡T¥oÉ·2ÏVï-„æJQZÐ1µ%xŠ„†‹Ç臌_¥s'O[ `|Eêiúe’§�R[ŠJPJÐ¥û +b6¯ó4]¨M²Ë¨nrÚç€u.›ÔÍ¢lZíí 0'Ë¢,Ù3ÕÏ‘ï ¡ù<'îªRó‡t j˜Ñ¦¹¦t£—ö#éF/"7ê"ó"h“úÕ¦&ëâjšyï¯K7Qð@»št{•I·ó(Ð>Iº©J0yWn� +’n8M¾tcÌA]@WØÅE€4v”\¿äU\AÒISò³Eœ&ÞT¶]Ø<2.×xDGQuø›ÂVîY]pKÝ<â-6å]Ü,Xñum1itg‚ê˜ å°ù³BB…(VØ8K<nanàäÉr¦ÎʱÕ/â´�égUÈ (%À @*ž÷‰ÝáršT7‹5íu94ݸ—<?MK?‚:åúüæ6°‚${ÒêúqxÛTÍ90]ÏúSRŽŠœfD?¾ä€Kƒâ©ýü=Óú—͇æb@2ëÿ<µ†�bý«©5èbëBQUŽÌÞIúñóWk=*+G™‹+×ýã]gøÛɉ†jF³¼„ÔÕñ÷a¢²Æ´ˆ©©bˆ×Ò»ê"<iãëüýt#X#üðnhâˆh†»¾ +fÓ£j+¥Á)Çî²€¤¯1¶0 FÝ2ÈÊ‹L®¦²7r<dš*ëQïôInœ/ó>9hd©¦¤ÆI;¦¾ƒ€¨©˜§Ê2#úŠ©½šÁí½Êoy¬T¯LD‹C«m,H'´oÄ`@©{ÒÝ£\,U¶0Ô'[Hó:OJ‹\"XÛ(:ì$°ù>zfvo^úfWç;ov§ýß°ˆ/R9Ÿv-Jð¿F9Ÿv-ŸLØœ_Χ]ËÇ·——ói×òÝHKÏ/çӮ廑•.ž]Χ]ËÐ\§œO»–ïFVºxv9Ÿv-\7W)çÓ®åc¤ÀÊùŽÛ‰kùXÇãòr>íìã}Ï3Ëùd Ð2®³ÉÁLBÛ9–|ê•HÈi«5#ÝRî“vr°…ÜAº-BžßzR@J¼!™“Ûƺ¤Rs€?rÈ-I*Y@JTnø3S”KܾUÈc{ÙT¤¡êÙ¹W©fy‰ý‡1fxtŸ>B!ü +»“º4 ¯Ù'¯|cålÂëºtÖvýž¡â=ŽiùDe¾ÍË3¹Ïˆv]{Qª•¡Õün6 6nΟ™_"“]÷ÝIAye2ç—('\ê•Ýœ_¢äFÁ²»K#[°PΫåœ@õü¹—Â3´Š£’×.Ó÷y¶²´„~¼é3òýê±»A1$nD•Å§9ÇGS:ò«çiò9PFë^‡·5ÅHí@›j€ÐK#ÓÀ@ MhD,°ŒleðúëÕÊq€-&cèSëѸƓ‚vB³b0E½¦ð §8O©)i×ßÜIb\ê5r·r)`¼Ôñ¸Oó;µ>¥„ˆ4›2¢7:™÷§¤%L +Ò¨§‚Imxw²šE«óhz.J¤¤5 é•èèvLØ^…Ðt’ùO¦¬bçB¢é®žD4½Ó4;ƧŒðå;™÷®[šGUÔ.ß1jæB}ÃG‹õ—½Ješ^Ýs`†ŒåN'¾oþ¨.r6W½x5pV”ùƒJ¹¼?¨ +COP( ›YQï(aºO-ÙW¬èÏt3ꨩJXl§'ôHªêä)ùžêÑ+×UÝÓ‘ 0$Ý/‰h”ÄhÁ¼¼*½rûS<dõZ#%Ò«1´N ”n,HV–¥²‹ëû¢÷ª:þ$;„¾ºvÒÚÿ))}¹fŒT§Ä‚dF¸$V°y¯Ã2¿åÙœÐ-iŸ|FûÄ!µJáNŠÞhû®D*ýZ\nI£7žãèͺ¬½Qà4•èMù’è lðŠå:Ñ¿%ý|QÑ›òU’“�Ûê¹èò»ñz8ƒÑ´<µêá.ŽÞÀ:¸€nØÎmôªƒnþc°@J×Þ)‰*7üáY|il²½Ç¤†tE¯4V×¾aÌð'_wÚ×åˆmE5ü#*¾0æÕ�¥c¨˜UþQQÒ`p1ÛŃ,aV +œÃ¨É×{õX”ŒKQ¢²z‰Ÿz2„á!¡]©Éqf‰Ÿ~B nŠ"¤Í%Ŭ7ª¢9Õó“ç6ä²ÌhÀÏ·.45ŸzežØ¿1I~nežân,§»neÞ¥œf°2Ï@Ç5*óІäqqÞÉ°š•y²ÜA}@çåæÞ•.žY¥®Ô'Á¿ÔW«Ì“æœ\'b´2ïÆÈ™)—WæÉæ†+λvež Wœwá¾,¨»Bá?Ôw'í.1hÔÂœÚUR/aÓ¡¤þö™l~U‚K7½´lØìqÎÅy¥òëR“:{œ ¡Zîè:e|z„’w}Òùªh• 8´j�íôkë¯ã(¿ÚúëÒõo®ÇŽ¶Ÿ}Þ¥[PuÉn¯, ¡]+º»ãù¦:¤yà +¦zö*G#(î+¸¸Î2â…. #Iÿz§ódµÏ;6jøó pÙÒV6ÆÚv×qÈ–À»Ý¢ã[X0bx ÕdÚy'«€êßÞ\Hvx;R,Ü.’}»R‘ìçï5Šd!”«Éºµ«ÉB@—ÉB(GE²j]ë—‘½)+Ë_B þº)Lüzt+¬Çwa0c©½åÉÕZ÷å)ÎÍõ‹ò[@ÏÁ¿¨(ï˜hÿHQžßóEy¼èÔìÖÅEy’$T—wzQž‹‘Ù&‚ÕWêFãi§ßgr.d+§—ø©ûM²anT6} 4CçŒiærQuíò&K´î±Ý(ý TKg䄸;nßSE]Œh= ÓtE—ñ¤?UÏð1œî*,cxžK%3…tƒh¢>/¬:Ã~înrÈQKê›h'ù”woÍíd¸‹®€Ïõò»Tºj—³Ï8›Íx+ðÚ…Ö–SN÷«£È-¢’…iÀÅÍê—ÙE^b 1¿Ê‹ýœãzM·a Î÷q3¥V�÷®u…ÞÄ+K¸”•Ýµ3êÅ~ð&ò¡Öv±_Áa•_ðsÒ<VyÙ¼›¿ðQV‡v+òµÊîp*VgüqV캻û >Õ‹ýºZpkb?ªÝVÅ +Ð<TÉùDØÔ*l|yWÇšþ(XoŽî)´lü}5¬/GÖ-‹}bÙ=¦ÄÊM |V ´»A·cÛLS6S )X©Ü +&+¹‚Õ: .%Ní5xÏss”œßx äܺÓËÐyõ¢�‹æ^¿ºe¤O +'×kftw½ž’a,ö¤åÝ:óz½# Ù°šå1›³I¥‰i<Ï&gඉé©}Þ%7ëÉ@ Ê[6gí§æ\´‚F(šnéÜ® Û'ÖÈš´©Ñ'¥€ó™ë¦@ê\Æ$Ë«åÖÍû”º(6n¯Tاd‰ó¦úõ +û”âc7èº÷«öIÇVõ‰öÖ®Uا”UÂï{*˪s +û”ªú Ñ®\Øwv¸û´Â>%_NÆÐ×(ìãT¸ªOW+ìSÚç‘›+ö)y×H]·°Ou÷º…}JU}Œ·vÕÂ>%“‡‰Ù\µ°Oi†UãçöÉÓ³aUßνQgöÉ·|ÙÐеû”æðF~póå…}Â¥(^³°O Ô Wïy½Â>›Å×(ìSªê»ÑtÅ“ˆf´°ÏÑ..ìSªê«µ+ö)UõÅ://ìS X¹JaŸRUŸRÅÊ……}Jvµº‹{vaŸ�@ØGˆvµÂ>¥YRÉ°O©ªOß÷T¥ˆáúÕü‹ +ûdC::Áÿ¤Â>iŸô|Äå"Y©¨°wûS:éÌ) 7ª¤w§áŠ°_yöƒÎºÅO‰-O19Þâgè®Ý[üŒ’jï]ŸÄzç‘*·×µ6ä‡�i\owtgïé}BËÓÀ~FëMUîê'ø&•{ªe}R6%ÍôŒû#¦…ªË”ÄË´Ìeò[¢[yb“†- 6;ùò?e¢Éïÿ;?ƒ½üOL´³³õ/ÿ3å(_|ù"šîýkúÔî5ž}Ñ墌.ûÿŒ—J©\þ'¦Ën9ýò?¨=õïÿ÷W÷ò?ÃgÛm+—Wy&_ñ{™¾9;ͱb´¸éæ?úù¶rqúÿ <‰üõÉ~yMŸfz£ÁìnTÓwA]ÓPVzo8‰Z«ØQ9-D¬=Õ;rÉ'%©)$\B*Â1XÒTÜY¥)#l] M;olèÐXù7gªé\HrJª€f(÷ÙXª€f$‰\;§IÁëbžu§$©tq¡/‚"ÖÊ¢Ó õÓî¼Ò=œÌ’Wömça€ßn®w¼!€¦Zír#÷4RðúkD°‰cKòËOÄm¤¦ØÙT3+}cw{þ°.ðÂÃø¬ëÆÈu>¶zé<RhUí‚ŒS.wÏ6œõn6”÷7gbžTB¡ž> +]¼OŒ®Æ»Â1 ]Ÿeh]@Òõ¨‘ºãŠ^Å)%Na1ŠÑt®´îý»9«Þóä{ÿ†Ö¸úï:%M(-Aëê?ƒëQçÞ?ƒ¦ú¥÷þ ¾§ÊÕ§.#å{ÿDœv + S=nS]zõŸrÀóÔ{ÿ¤Âæ$hòj_{ÿ´ÒyVû¾H2"Ó>/6~Dœ ]«Ú÷óWæ{Ëö=Vûâ·§Ý/¯„õŽµ+Í(ž+dt!@Fœ,ˆFÐåþªÉKtUk©ôJà-‚š™§WßÇl®£õ³)VLËr Ç÷Ó©ŽÂvÒÊ´oU3ó´B*80Rõ˜ëI©;”bäGB4£g¸ChF–§F¬SJ´òf¾'cužPK¥"Äú;íB*±ãa¬Rô¬B*±L“ +G?¢2²s,F´ìîJ©|ÈXFY8ª+'ÖÝvµw|n˜[~ÖÝvÏ<UK1ª¡]é2Ì2BìFº@Ы½$D94ënR;4ênõON‚ݺÂe˜l¸ÎD5Œ*e¦p6!¬½+>µsK<›ñ–ßrwd¹•K:[í'jàO…SgøþIL|ÖÄmŽQD0",8jMRøœlŠ±J*óè»N·!ŽlI¯¦‹e?ºJ•y7Lm”zIàî0ˆáªX1s¨U!†î,á¦ýKââJëÆ>µ +·~u¬…»Þ«V€†¹š®4òÌÔ®¦³kÔÈ5‚ê•y´5ü°gwûeE—v[òc¥R#g×¼†o¨X…‰Æ¹¦V^xxÎ Ô*óúX–tÝÈïÿ{¹ë©`%¥žr¬M%¬L:bãJG•ÈX>ÿJH§ÖŸºøOlIèÁñäUjwÔ.Jšú³˜ØÀKhçŒQû<+¡¹Òã§n@žÁï÷((Ó¬†Åk>K¤†, kÐ.ÝNÊ”y£}Û“v}ÕQ0EþˆEsBâ–zŸ²ê‰s7ü©½†ê«è3ó×-›£8ð ‰[2R ªÞ@Â¥©ZzyÆËãŒ&n©òÁP§“j˜«”rÀÎËB€§ä€1ÑAÕn)§Þ§£Ý¨j%5rÀN\7”Fá,Û£<Ü£ÃL@W©èÊ_'6ÍÌMÉÀ¾£ÎÅuÚ±0>ÁßÈ^`דb£ê#+›+„¥¿ó²ÃwΊ§~èr<-ýï1¾Q;9ÉXI¢ÑÓuoøãÛ•is‘W#gèœA×ÙH*ŠÂN-ºÙï*]×ô¤‡Ä™1d¥=Xû§a0 +{§ž—$ ¿~2–‘<@|IÝ»ú£¡“,$u‰zöœúË`&Uƪ©¢"9Ëùžš{*êuvZǽ1Õ%ÝR/¦O{¹* êÒr¥ÚR…[d[x'Ô%ê_�&ÅF ´ i_m¬c7¨HBS¹ úŒaÊö=/$šn5ÑIDÓÙ=‘hºwBŸ0ÌjàShGU̪ïé ²úæÜ’D5Ë]-öÌ’DI'4êySý¼’D£õˆŠqhã%‰*|pT¨dužP’¨çsç£T«ÓJÖ#'ÀœT’h”¤ríybI¢"—(Ô#êxÒz%‰§xÒg•$¦˜îKñ²B)§ýc—j2´NñØ —Þh˜qÅË +Ñh®tQ©Æe…’m¢î²ÂcOú¹¬ÐhØîÂË +Å¡¡ð²B^ý³—PFIÒ°«QwœjuÆ…‡ÆOµºèÂC¾ìOñ¶CYfÊùjÇ_oÔ˱O»ðPmp¶+ä@• &hèjeüÂCíÀ›+œj….<¼J½ç¥e¢åyÙ…‡2k^vÛápÛâÀª·ÞœXPvfN¤Bê¼UÇÞv(˜gU:„]'ÖyÒ…‡Ú·Þ¹’ÂÈ…‡ÚªŸkðÂC#õžW¸ð#rÅÎCŸ{á¡öm‡jvÚÉž^w¥b|ñm‡:{Æ/<¼”Ó^xhìžÂ‹+òµo;XÀ ót Ô“¾àÂC™$WÝô:õÂCí<ºå»"N¿ðP»:†ÛŠPŽÁ^x¨¥À +í²ÅÔ<¾íPunD[=†.<£9¾íP+f£™â-¿ððüò¸«Õ›"íyµ’ÛO’ZžxOá¹J¡È7ŽYàÌÏÙú>ãÂC5(^ÂÓ/<Ô¾íð†9 +ìòuý›ë\xxByÜÕÖãÑm‡Fdš¡Ï7ÕOºðPû¶CѾçE€t–‘!×È…‡Æï)¼èÂCŠâq…Ç…1g^x¨íCEÕϽðPÛíVJ‰žsá¡â¨ùÛ5\ÜÓ.<Ô6~nþc¸:XûÂCÃÇM]vá¡P©T,©žá¡6¥<›³.<T†Â…¯/Éè’\xx'ꈣê]x¨]ª/ÛŠ8ÿÂCí0/l.½ðPVÆ&sÆdjíüµ½{ñÜ\tᡶw/^ž]x(#šÑ„ËS/<4à{^ãÂCCe¥—_x¨}Û!Bsš·2 0W¸ðPY(p{4ˆÓ®qá¡öŽK´Ë/<ä;¦Ï<˲QºðP{gBìFOèåEºìm‡Æò:]¨Q¤‹Âv'žìâUÐ=-]Q½‘Ü¥ž‰~Sß•äûK£Šu”®bÈ"„¼O[ñu§Œ)Çâ²ÉÔÚÀC ´Á¼u2ÄSõYâ°VéÝÎGÏÍ@Í”ÍÎgæ}_†™&°ªËl©%J̶1{ÇÛ€7/‰ÕWZ6¯›{m·f~3Xqöœ¾û=dBæÏáÄ> R–Èã!ÿP«ÿ6ƒ¿ËîG8è Œ#5âÝSñìÌÁj!0È4—¯ÉI«z›·ÉçàoÇFN-oi{ ÷sÛnV–±U—SdÒ¶ùí‡ïw©MèÙüöœ´Zü¶Bè~úQ*Ùó»�õIÆÐü¢RÓÄk»Õ1{œß)³oöÛqÆýÖFd*Œ˜ŽËX!ôÐÜíQÛŽŽ¼•è»ïÐ ¡ƒ£_—Øv>yÝo5zËàýxwô'oà‹Þ)‹I½ëc¯Ú¦Ç/[¸TØ2™l;2oX¼w¤SÕ²½EÀ€÷»ßbÖëÜ6´’»N¯°lv^âÁ˜ÁíÕ»ÕÄ<åe®\Õ|pmÏ0!®¶A’æ4Ñnßcr~kPRk~+[F`p¬¨xC3ÚSt(qJÄH„\ ßÑý¢Ù¯Bó=ôœÜ¦¼ûx9å¥'DônÙÈ¿¥ü߀r›DaÕyÿLCæ#l:¿\æŠQî\†ame÷;õX5ïиÒkªJ§+oo}g¾ó^„ŸÀ€+,%v1±¸D°»C®æÝÛ`rCÏ{ÒÞ ÇÊHho·¡˜3 Kx¾†¨ÈžÒ|}r¡¯@}ìÀ׬‡{ðy_-à1gÎu lÅR wYç}ÔOf4»øYt?äÆPqŠTcþ[üà;Lò¼âÛìLŒ=+d~aeóCüÛ«mÄzv‰Ìþ]ýˆ-)j^t~ø�Ghž¨%^L6á//bࣙÒ÷ÅÅ4[Â1V’¹™,ƒÝO8lâ…•Sk|œ,Aʽàì/¯({ñfüÒÜ «ž‘¦²øìî�ô Ú"ÚøìÉÔ#Dó·Ï›™•gæH7ÆÓj®R2·¶ä7²Bh_êârK!㳉ø™ •àASÝþR}âAf‚û†…,|õ"³të`Yä{“Ç…lìû:|§²‹¡Ç¼Ýo?Çdí€hè¹d˜ç—7777¾ÜKjÅ7/·�Þ�ðѼ®î gáàRüäç?�ùÇu|í¹™¯ý1šýžW¨ô +ö0POÄs0wÁõ¨ç?È--ùñò7Šy—?An4=ööQÌn‰`¾Uë>ïŠÚÁúÆ:Y¹ÂÀÆîÎ2Cþ°ÁB6¼—~y¬þ{Òõüé¾Ùà'œÿäCí�¶im€?zôB:ÝlαD¾Ö‰°Zv¿bä(‚\êñ[âñÑ·ô”4:¼g”:kd€Áç̳† 'yÙ£Kš“akìòòo™ßŽœ3Ä9!ºM‚µrî0lÔÁƒ'˜8FD-ÍIö«|WLüZÖUùé +줕׬ü=f–øð¶lGËkÒù…üíd†ôú¤áS/bP€òè'ø%¼C¢•^£i‰èlpèý²³L¹Q<Ìvš«Ã +g²Ž3†ôô5ö!;0ƒO¿SŸr€ ¼õ*ÈY'#b¹UõÅŠóDÖ »hó}Ñ#èßdV·B*eË„;Åì`™ž�_u›a—b!f‡TC PgÈkÌð¬ÎV$΀L ²â|…AH Q½¹rœÂ� :»`÷[giø«þÉ甕¹gžP‰"k³ykç4±Á·™íϽ¨Ù9ö¤àŸŒÙå#ž™¯öøsÌìê|—Ìn¯µiv¾Ü>À§-³;íOÀ?³«ö^4Ûw;—ÙeX¡ÅØ;ìL¬‘l<9¡~fï³Î¿¼q‰Ä^*?䗩ͯwêX›ÝtûñÇ–+}„Ê@ +ÚnSñ$ááMˆ_.Ð…ì ïüžrIÝÃX³âa¾ÿ¦¨â®Kô]Å»t}¯¦Û¹€%7}¡›œF›¿¬9lr¿ÉívO½;dcørãzò<Ô/¹éÃö.æÏæF`èã>\7úcæ¼Ù€ÜQ„¼w›ÌQìyµ \‚n~ÿÉ/ŒÎm2õFê‹ÈƒƒSQFµQß·c‹±³¢sÜw¤?çýœ§9Øe§O›‘áU©îOïÌ9!Kõ¿Ó¯}G^溲¢³Pq"ÑÉžòAô‚%ìÏDü‘Ð]¬ÚLÅòä"³´Ù^òÅÆOý¦½é\i½ ‰Ü +Ï0{kpQr Ñš{¸<ž@1½>sº•Ð§y2öÂ8>‰Ãƒù¤¡sqh££×º»1Û«ÆGÆГ‰ÁaúóÝò•©ë]ÜìúÝV¡LBg»¸wP’³»Í.{ +H^GÆevGÜßfûbDíæ徎ÁöIØ-‹$`Œø5ms–ý‰,È/O{‡Lu*O%¢¿o›óƒP}nxÙŸ/l®'çDvšQr0d·˜×´:™h‹cFåAœ<Óª£ælhV°u,¹“–Ñ5Ð\,å ˆx$:OÕ짫u„üŒÌŽ9K>àx°ÙYä>iÀ�tÌ +ì–±^lÀA4š–˜h}]ÎirCî³E®•ä†2¥�Z6ãÁ|À»ë>§][,•¿<¹¤3XN»¨˜5×#ö_ébh𜚶·ùÝר\¾-ÈLyw{KfðìkÑ»`Bâ>f WÆØu|Ö¤£ ‹±qç¢yÑ9_¤á<ÈpØCwtÞ¹èÍÓíÎÛî‘Œî–`üæyø·Ø¬4ùáÐêÉ÷&·sD}Ñ<ÜS_Yh6ø€Ç‹—$£6ŠÚb¶Åï'@çLAöûÓ˜A?³±€•ñ›/çñÄ߀€ÿÂSåeó¬¬e¡jT1h.3) U7’’ßB·!‰ƒ²íDvÕ‰47JpdÙœoM^Õ€º\Þ ‚²+Ú“ y¢¡Ñ•P3}™ª9Áa‡!²† oQÈëÂÙ“Ê4=êËñœ>jTs¢–Ag™–¹åöÔ”SƌРǹ’ã,ûjÔ¢@™„RàO<ÇÝ3ú»÷q Q +U ˆZÕ”wŸ¬¤‹ÁWP?øŠ±*ËÝMBØ?£o4D´: ˆß“}Z™ì…&ljâ÷ÔÌÜH±o³ÙÌÒºùÌyÂVZ¦mµUí³¾9Ru7â¢%ãä>aÀ@Øl-\ZÂ?¸‘é åÝwd¥B8ÿcÅ’ƒ–M®PxZãÿ=iºO²¬ÑNU¹§s:“–p°™*j4šK–¸1žãv£ëìÌ”ip0Üñ8e¹È”dšÑ™>a‘Àih¹ÈS(Ygp{¯+ÎY“f¿¢7]¹¦ŸÍΞ-ev®„ÙÕŸ”áW«Ù5ÿù‚!¿g¸íòc0e¶¦¸%“‡Mýfw9Ú½v°ß#¸^ ^ÉäAD»nDãZ{gøô’=‚ÝÙs=éó"JCg=iC¶æNç\´5‚ÿäÈíyŒâi +æö•¨”7,.G-b|Äi—zÿdäVß¿câi`iÙŠgÆÓ6ÛÑNÞ‘¿BDoaÁ—Qrd˜ÌûÓ}«-»0Ø*(løtDg|zcSFÞ‡û3[ÜJî³óð©¹Â—¿N6w0¸~ûh?´`ÎCŒMZ=Õî�hBɦã3Ý~ýù6dá¡ODß>=º˜`9Uå¹›ÿ¨²}šè/W"½þXçè€â$hóÓ—W;üõÈ*òÿ©ÙçÛvö¶‰þ™ÙGS²þÑÙç/Øøgg_”výOÎ>'þáÙçlèxöÑÔC}óÏξ²¾¹æì³Vÿ>é¼áŠýTò³ø:˜:.º¤D4»Daá[ñk˨e"i ¾jPîdÚÒüm¤ôœOü„3šÇb\H·Æ+o‚n…j-Û„®¢Ÿï~C‡cp/‡q5~EÖéCÏWýf~ê®yö•QkÂuGhâ»â0òC"ä0ü¥F‹ÀHš l;&o›è[}öu&ŒX NÚðÂ÷ƒÌ`G?Ãit°¿-o0ÿ/ÈgNŽ<(8jtñ¹‘#õæ"Þ�<LZB°A_|Ä¥3òûqÝ”\Ä©õÇÕë3ìç-|ЕÞe“ÌÍ»™òæ™Üþ]¦ûÁ/Ϲmdi~âÃÛ@Vx$å¡8¢Ì«™¡f€þxàÖºó*zÇØ#1Ž|G‡”_D‡û¸yÀÑ!àˆ�»³PŒnbˆ£[â˶>Åt8|Ôy:Ènár tP%‚?õb³±D&ër%Ž=E‚…ÁjOË1äDHâeš]{…'BñËsûóÊè–T™9Ûáåp}É2ƒï€‹‰0®×Ô˜ÁÊG9˜žûf/Ê¥CÌ‘*�hÁ`.Yº èªÁ²9geÀÔâ‚Ó@'X) CÌ™g „9|›WÒg + ÑN°ëFÃo‰.½—°–Œ7™˜Íi0lbÞäÖ¹ö"—+‚šMÌžÆ`È�ˆyóLaccnâ9î„[ˆ#P61{ªÂwBNM7eS*u +“±å†ƒáSS`ÏÓù›ÉRÙNbO¥¼©D ^ +hªA=±b®5â¯×ÛHÛÙĈv†ïl÷ëˆÓì†8Mc\v%)ÈršQÚØÕ8M‡UÅœf8í¼µoW•‚RNÓ†!â´S×-ËivÓΈ§}Ê8McíÛ (i³5÷ùÂðÑßR�™’>Gˆ9ÞTíÜ#Ð쇒 <©2%}ÎÚwáM(ÁDJZ.Äç*iä‘‘?$4L‹.§qõÏîr´·Szp¥hvÕí.äbÂ~¾²èኰ«¡#·sŸŠ K¯Aý–”áCËúÖƒUÀºA¦~1óÞGu¤n®2«ªbk®Š|Vцj0aõ=,â,:dŠßºÐnØb?Ø_ÛUöM/ïÐ|Š+—ßÕ/lb³Å¸1‡ð�ÏÇâ܃D#<óY“Õ÷ŒðˆˆjULx «œBObÔ…”5¾a +ʾÅØ„[ - áëüVõ²uk…:™Ü –ýz/®œî£,€FÖ ›¸XÏ°Qr<¤„qëUj…îƒ_›E8ø3_߸@2�Gƒ©Aµxìl=q·„f Éâ\fÝ#©Šx$¿íÓì<DÔ3«È]D亣ù…QšüØ î˜�²éU‚wqÏùŠ‰â3¯O±lúõáq‡+Ût;½yƒ<õe>0fð±}üÎ×v¶ýB¥ªx’GU?iC É<Àk5™rlxn—ù4¼í <HõªDçÙdzþ" +¯�†Š—Ð'v~G³ Z7lÈmùêÒ3±¢�xÚÆ|Z²Olw–Cß�ÿ ++$¹g³�_†*Ä�Fþä+QäÂv=wÎ;Œ?Äfë+Ï~Žâ-…÷öÀ%æ{”Ž8f3åþËÊEAÏÓæSþ³ìd>‰z¾ŸùÑo\…¨¸;¡Þº¸ÊMïé6¼¤+ïÜý +ÁòbCŒêXÜ? ¢K¦ô:ÿIfÄa» +A™ÜAåZÐ+‚2™÷ʵ W,e…b-èA™Ðr-è… ÔÿMÜü'‚|¦ˆüñ6+rWß-f‹ ,žÇ›ÿxÓ%ÝL(bG’mò¯}ŽÖäfoŠ™¼éV¶TŠs䘚&›ÞæùÙÍ +V”ˆO5‘D™úõÜ4ZXïšOÃÜë&äIvñ U“BCÅ™XÆ™J)×|1‡¹ ³ókÁZ¨œÙÕ|0z«x„•HDõBë^Ü= ¨ð››8¥iŒÈòN<Ò®ís9U‰Ò‰H1þæ!¨^ “ß}ö°\趉§ôÓ˜UužXûåÃÊ&<™;èõ ÌÅ:䞎‰0QNø)µÚ‘7“÷S¨L;5}m?£¤}T«-/ÔæKÁEù,oH¤ÙD¬,RurÃ.¥÷¥Û×/N\¨fÑR_ô±5Ão@¨Ý"!låŽüº³2‹‡g]ß ˆˆ¾ÆœÌYÖ§æ/Z§Ì×/šdÁàKÝ+pÎø•"î§ÛÄSˆÏ‰peïùC(*âC(\¯8o{U<⳧©hA +Ü–Ò\„æÙή¶ê-ÂƳø„·‡?1áY|ÂFaƒ'<ó¦Ø3ÆQQU}ð+ŸE¾ïyà/N¦Õh‹ÃØß‹›_-´% ó°g]„²Ðï[Úáãb}õ±G_ô>pΪ à΂·ÖZÂxk› >{(ÆÓ¦íQ=6AÌ–²3Ž¤h“ßÀ� ½×ÉÃÃxÓpïw¾>îB‰×Às:ü5±±gmôZf–»‚¶Læ³&Kþ˜—øü‹â´}ßø{_®Wbä0,ïbîÜêÕÇ~:||3‰Ñyû°Ï~òÍ `~²g]ôRdσ"ß¾þªÊâëšdˆf`ŸóÇ\øÄÇ\<N~ø‘U!ŒfðfÎ8\„Õ¹Âù"üùù"þûC‰×W_^fÅ?ø^¬ðød?冼÷åçˆæè¬ÓòÕ³í/"·º§›íOk~äN!“0Ž.‰bM†ý6ÄXPR)=3ëA~t°Ï GÅ¾ê” ÑŒ}µk�é*fò˜§xt8»=ke43g+Ú¹%Þ Ø¼/œöMÃ!wqÛx`lOÌæ¡9“ÅÃ}™¹ PHt2/:jÿI0^'o—:ã¤ÁcÎàM6d0ByÔc|6…Cç™Ñ1h2ò6±Oü +¢–‘³Hœ�»e; ¼8ƾaÄy¢äÅ‚£JR±¼ÇêÚf1Ö(IÔqÁùb&ˆ± +On„@°ÂIf¬K07#S‘tâÔËŠSÖx"áºaœªBS¨&ó8Z)‡‘©Ä"æèôRѾ¼Mz—ãõ§t6o³é[~“±s´Ké£í’ìóƒk‘—Ápf-ɼ°_å³E»~Ù†êím"Yà6T)‡lC•¾%þ_{ïýUõ½ÞŸyž{ÿ¤‡Ó=$ôл @ $”`¯ €QD,€ˆ¤PC)¡„ÞKè½Bz›pßµÏÌ™3sfBB¢ŸïlÆqrfÍ.k¯õ®²÷Ù§£eS;s‰ëÊÍ}ê4¨W¨YGtCËXn‚ùL:mÙŒ�€‡³Þ”fÉ8q’]#±a׌¹&2ßÞ ‹÷â~å–žšXöOºQ]电<Ëx´höf€µÌ&±å]ËôJ+[×27 ¸ŒWŽ5<Ÿ´¾g¤ü‰µ&æÔŽi<d’8ÜͶÄìfBØ#ßr3ÁXb¶òçð¡q=ËZfÛ°‰qÖµL¨§¿…m4㳶x-³N®|oór¬é–µ°Ý¨¡…‘l)Ú[šÜ’VfÊ®ãù4¶Þ€ò‚uX%"Z ™²4£QÓÊv¢™·z¾P!åEmv»ß:šWv \å÷L4â+$›{ÚêhÚ¨âzî]AcŸ +j³»D+VG€MÓ¦ê(ïŒ4m毃i^’aí‡o!嘑çì�iZYÑjʬÀ½Ãýùuðåàf@M7<›¦‚»å5žM®Û©[˜W[Í{èêÅŠ-{¹è:Ž¼é|¥$€¤•5®æ/�@¾’Öܯ T@Ü›û•–*·î7Q)±HZs®² @å–´æBe:aHZsñùj×YjÝ=¬‰QǤ6²èÕ á9�ä¶7e1C(Ç;ÑÌÛH¿ÈŒ!å4SÖŒåqyü˜Y÷âFšD‰µÝdv”5mÙ¦OtÇ~m[¼ÑaBQÑ=:‡EŽî:–¥†„™-š¸Žtê-‹ÂÈi¬šÓy¹ñ@ožÎkFÒ~èmRu§óºr~èmRu§ó²fÐ[…§ó’!t@ožÎëΪ—÷4Ý<·v²ª¬²Óyi4èÂÓy ¦ù? ·IÕÎkî5ªXZ¸¢§ó²Ñ8 · +Oçud¿a¾ï³ŸÃ�ŒÖƒÅSs9¹±›‘}'¸HèX@dI =ežnÜðßf"í?!عS'zûoƒãB\K,íê¼éZI c©™^MÙÚwóèAñ!F¶/ºi‹&¿Åz-;tõ,ç×®ey@…Øv@nîÅS×}Ñß•0h£6²ìñ0@´Më&îNwsBÓþ|ˆ`暧±.oÚ€6œ™>ô3Å<ÿ¶±9BÊŽ uçÚ×èáSø³‹AB)Õ±µÝ‡ðÉxÉ<•{àÌ|b†Ò¹)´æ9¬CìHëz'.×Ç¥¾QñS&0yXû¨Ñѱ‘ïG£y‡ñÃ?zWu/hA–ñ‡LW#à7dÔ¾‘#"–~J®ä°æ¡“âãGÄGÇÅFNzßÑ‚]Ô=¢—pG‡ñ›aøMKGCôŒr|Õˆ-¸ãÍÛÇÅÅÐW};ttxoBܤx‡Ñ΀èÉÑÃc¢ýâa}û–ã^„ĉaµkqŽPzô.u˜Þq!ªv)î‹œ£'ÞB8N‘]dA]tp!¢¨jº¬jœÆñª*Ì Ñ5IäEU%ãuW]âyU‘TNÖ4AÂNDYp_F«‘ÔŒÁ\4ú>ýÕŸÆâÚ»žstwy“sŒ¬/ûÔ®¥Š!º.QCº*`"dêAæyYãí4’€Vy´¦Ê2A8ž“UÔdtB”BxEtYuN—EƒEUYä%É!(!‚$é’‚ñʺª8ÂÐŽDm󸦉ª¤1"N’9^Ñy×Y-à†)K²Ê)V,¡a^’y¢@§8‘ç•ç9£ +ÈñšHu Y Ññ— S5I1ˆdI8IçEÝ¡ a^0ÕNáê¿€607¼è·!Wÿ9Ô! +‚¨Ùûëº ò˜~Ie÷\ãÐà®Eã̱s#Œ†Ð=o²¨k~¦ÈFáb‚,¨`'˜aiHU1Óš›—²Â‰²ânÈÓ_’LÞ=%Š.SCšâ0Ç,éªJµ°IÅ%AtÛÎ9—l¨Ð^“‘Ú±M€!b$`J\qØ&ÑFa“OC*¦I§vlåé®"bº‡[(uQÔSÜ#ëd :"˜²+tDò0Nâ•“PG˜[‡xNÓMÔ óŠ¢‰ +šƒ5É"VMô çª*šå†œÆS‚ ´!‘DÓ‚" &†,¡N¨¦šÓŒk�§zÇÿÍnÚ(Rɘ¤È¼ÎF"k!‚ (PbUëeƒˆhdÿT"Rж€ ”Tô€ ¨Ÿ“ÑŠCÖC ªœ&2 ,Hxü˜WuU—ˆ8Èóà††Yfó "÷¸Î‰K‡Â±j%MŸ [ +æFÂÔ2©˜U‡Â‡ˆº$haJž(8AÒÐY ¦€B&é$i¢¬q2k‡Çä QÒ-T,ѯ R’*’L£sÔ®(I¯“Lc¼ ÐôR‘5˜ˆº ñTTóàz ]gÚ&CFx‰Óu½¾iTd5êBTpFêø±Ñ +ÄRxL¸,9$=DÖ!o2tD•Ý5hŠÎó2±•”M#¡Œº¤AE9ÉE¤*& +%;$ŒN&(rp’$"jU2`‡Ä…"X€âc2ØpxMÆœœ¦R;¢¹% àµkÈ’€˜CÔBDÂ׊ªãQ4ž„F”� ªCTC¨]jE‘Èc�†4Ř mlvD9DÅa6tQ‘IÙ¡«èFÄ«d zàE”ó…_“FB9Eh5(ÐÿtNÁ¬0ÆÁ~ÉÔ0ƒ)É:Y‡2hÄoš1ЦœÊ«‚ªÁñ.�ðdš2L•KTå[ +\1Ré5FŒÞÉUá] )<Pˆ`†&Và�’T^�Y5P$Â$㔉ƒ(ƒÂÕ™]Ô! €~ÉÔ5h©ìnG }ƒz(D¢…h4[!1ØÀŸEW¡CÐS¢€ðàO|¯C@�¸¦ñÀ¢€\�rEf¬5fº[ŠYƒ; }Qh¨ÐaŽ xÓ‰‚°@“QÔ³ +k©â'$ì€4hÔŒçTWC� Nq¢áɼ¢P5F[£Ð<™øh qÚ,Â1tV“‹Q ›B…‡5àØ9HkGAg$ý€Ðë„o4ø¬ç‰wTدB1e +Ò/ƒQŠN“¦ +0>¬�€d`ºBÒgAFÏ1Íœd4¤Âµ`’9`HvÞ¡1y„ªL*")€bŽdŠSÒ�/ „°Ñ*ñ$^0Fd^ $%Á’aFÈRí�x6¯:©q‚fx4 0Oº*“»5Saõ4†¤˜pˆO¬s@Ý%²ñpÞ µ<}¯ËЕL=p}ñch+œ\‚¦¼P Z‚ÇéA0#è?s%¢�2�75�=,?ù:2Ø,’\êð©@�àDÀbT‘é�Œ<à(Ì‹Ñ +áƒÎ3˜àÈŸ"xb˜MàæŠL&fÀ!Á¥ÅÜÂ9‡Ã¡‰@Y• �TÌ�¶€´@Jèˆ;èÔAc¨(Éà"O˜ÂCÔ$†L0s +p|0;�ÆAŒzÇÌ@é`2Zå¡–ïBlŠ ú�‰p’Q‰p„$èšC"€Ó�c£Á\ +D Ó4¡&MkH+!ph�×À[FA=Ç�´²a€H¹áŒ#8™~"¨$8£AâÊP7Á7ŒPb=ÁsE‡a”xgàˆae²§p# ‚ÕÉô“¥ãÐ`È]ÁÄ0K"éº9ÁUÒ!(h:À•<žÔ’У¹ +Ãt‰\`ÔÙÕ@n̆Aþ(a>¡Là>Ø'’âÂÉBxôá9£!ø€kTCŽ).OU'ýá Óuè)O¨®ŒdÃv‚Uà)Þ t˜°¶@"ß„´[&Œ9#“Â\à¹í˜nÖr•!ú0è ñ܆S¥“d )€hš1¨2qˆi3ôT@g6ÃEÑ&Þ?Q�q`˜¡O02‰‚ þ�°šÄ|3h*j€‰2SÇ:§’°Á†@¦ /¦á ¬C€–¢R˜¤`ê¨]ø\Ä8 „$°™WˆIðµ0) +cHÖÝç‰äYqd»uÄ·äÌKq[ ;€˜ƒ£8„j÷‚鋨34cÐŒ–üIª $Z*L,à“Ï@„úK<swñ`öÀXL’‚ˆ“‚“¹Ä ³áɈrÈ-‚}*¨®#´yà:³$`8'.9þ”IUW3äâ'øGAC†™„™fàÕ¦ÙÀXLÒL¢sE¡á +C 1w +yäÕi`,||Ö0í†`ΨZôƒù¾ÐN&„W46_bè)¤@& � '÷`a¸äp7a§aÁH‰ìL�`#Ö]Í€eì¡.€5h0z‘\f˜…µ#b*�*¸�L%ä„öÃo¸`ÀÌ“&A©!~Ÿ@_h°ªãyS)ý!‘ƒ¬Ž†gö™ÐÈ%Õ@UÂ4ÑHKnBßÈíÓ¹×0:Ò#²%Er!Ð4ažÑù€ +pÝÕ\ž¬@z ‘<™øI´k(‘aƒE&KHžK‘a›à‘a™i¤Ùœ+^sáÔ(<)~aBq ŽH^7Äí‘w�Ö»A¡‘å‡C ‰Ìw¥óar$C°©ŒN%` ŽdÉOáÈ]I¥1eIiþÀ$L>Ϻÿ@Ð’;¯’ÃF *!T‚<n9ú…nQ‚Gt!6y«hŠüp;4àÆNÇbRHoÒ0‘µ£°/E,ƒ)s�¾1—‚T ˜I¥ô™ 0ü ‰²&å‰ûÐÌ°jØT¸MpýŠ´`Œù¹N2l*‚|ˆ +�sM ¾$³P4ÅH9@urì)÷"3°š€ Ì%e:DŠ›‰�> †éçɆ Co`Ä8 +PHXð)SçÀg·‡�Ì…ìC+¡f2Ѩ”Á ¼äIbͤ;"9,"£Ð(¨Ô(dƒ×B€o�Ô£– +Äe€RvwP‡ D¢Ç˜MFP$܇(@žˆûˆÒ%VƒBFÞM!˜#Bpd@¥e… ¶àª6@!®é†ððWxŠêx2ªA[àæ¬À•Bð#“7«‚«»èé‡J¹øÊý€{Pp…Q@QàÆK2§º£r!l—(ž7F-€ <=ñŠ +…lÁx`!<Ð="Ï($ +e²«:óû4ŠrÁ8€Û ’µd}•áC’Â:¢#˜\ò$Œj ب³¯0Ü'Á’Èò$$ƒ ï™d['+&Q*C%ü‚D˜ ‘Ë cÞ)KÊ|L)ì%j%,UÈ'ƒ©È(˜�WîͬÑ,3E¹&#òÈÓ Éu±N!„ƒG¿RɹeÁ#úM-ÃäÁøë0%ÂNú/a6–â=‚ò¸TH…ÿI†7¯ÓÄÂ…ðˆ¢»žåÜÐ39˜:H:<8‘ÒŒ,¤¸Èà5„…"{•ò àœ«‰ ¾¬;;H&}ÕÜD”¯‘)'*Òá!ÔY^ÁÕhyS:8áÉ@ …<ƒqF÷N§¸ÏÔVrF�6¡·D…i„Î2#ÊÑ�H*КÀ±†8Òf + &ਔ1…á¢pŒì‰N�dH¼ªÈÂ_™ì¥Héb"‚s"PÌJAÏÀ= ¿ó-±T¹êÐ,J{0…N^7àž2ä9ÁeØ@*áA²†r%4ž¤C$k ÃÍ%_I ˆƒQPX¡R¢M1RHpä)-°S x9 À-æiä±´1ÔÖl‡¤˜¦„ò_å÷(•#Bg4Uvu—å☄ӌ°†l/åË]C†3þÉFÃhEf" ¯Stµ£Pnf+Ša† Q.…'wŠzB†>pYf$ñƒ—§‘€ê—áúH”ýY|¬Ð„â/–û1fˆ¾°LPY<”D-Prî@{ðžŽ@ŠÄòø¢Ë“Èél„¹¶I&,AAÁ9&Uu<ÓÏNæ\ÕP²A§l8кH^ü_²³ŠA¦ñ”“#]¤ä©H#�Üëä +‰Uj.S’ÓhˆÜdüEé\ç°\¡†XŽ£@f®Åü +œ=ÐRv!PpÌ‚0"ÐÈ$i$†@ÖÅÖ”¦‡bCaeÃk‘(Ñ�:‰rx”†ºÃM`©úÏÖà›ð$„Fcú KFq¥F†Ò•û%Çœ…€(J'¹$%o˜j¤˜é”ƃ¯ª³D¢sx¡ÌÛÓÏOepåØÃÙDq³Þ%¶TC!5B( +¹±”õ&Í w ì!œeÞ?OŽG™:¨)õñfI§”´-CJ¡äÔªl*ó½ÈrÐÒ –§Ÿb”²è2Âù’)tJoÂMbæ]¥š„IÔ7™tœÖ( Ϭ²DIpÔ-Sþ™Ü5Bw¸¸¨]dQüHª½ÕÍ8²À2è37€Äè+z,«,6…Ð#Î#›ï R@*ˆìoZáÃP’ÛP^„ZP’Y—W«ÁIÈ2¯€”ó"E"GXfÑ'RæŠUª“÷©Ò1!%sKøÉ�÷àJY_•a!ˆP œc‹±ê.RÒ sÉ hµV$™^(€©ãÒZ|.•—Xú–M ¼@ˆùx¦ÃXCP›hÁpY&V…V˜y•É&PCxŒ0ÖH&×…¬y@tcùL +¥b*h®‰P""*³cÌÅ£uJøê$à*³¥H–õ%çR%¥aXˆ?g)¦ÁÔbž)}“M‰6x5À-Õ°V”DÁ¯$²$ät3»Ž C¨ øÀ&€G0#Ä‘¬ |V•Â¸xºÎ\L(~Bž¦Fc +V HÔhÔb+q`¯JÓHž¼J+l1–gžP2¾Q–—(ž'O«Š‘ÊpÌp*äÄÄ`(dEcºîJt"܈µUâU–›ÔXÈ-ò,LW)lgpSH¹0§Ï¬ [ZÁ‘ƒsh@"@qå½ (.%R("aÁ‹DëÃ�1UeÕÂ6Sòƒ2T)”SÝR(´|èøÔ¸íZým—píUÐ 9 ´S!„üR(™N9mÊ‚ÃÑ¡õd‰"l *tº ±$åìÁÙAè€OÔ?yÙlaQf›ÌeCÚî`na`WÙ2bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'ÂÿîNÞ:ÁX<¤l…ܱ½Ä;ò™i}H`k‚Ìë€\À9eç Àç-Û è´ÎºrsöHî%p¶¬Læ‹pSPì—#Øeü ‚ýÌüàpTÀC+|/4ŒŒnÑ¢OÔˆøÈØÑ1QÍûÇFÓ³úÆOŠŽí`_GD¿ÕwL䄨-:GÆŽŒ‰šÔ#r|”ë +[ºWÒɶ;š÷‰ŠŒqx7Ô¢EXTl|Ô¤Á®Zv‰}'2&z¤ÿX~Ö'nJìH|Ñï}êçú9¨‘¸I±Q“úDŽŒž2¹E¡¢?7š+×S¾r?ww˜[&CU®±Bå},ñ¥Ž‰1îÝèÉQ•a¼P¡.¹�±ëo#îÓ{JäÈI‘±ñÏ©:ÔÐ F¯Ò?ÑÀè‘ñc*ÔGάÒÔXX˜ÿ?î=zL|eXÈUæÇîIniƒ^‘“"ÇOðµ÷5žÓxzÅDŽ CÁëwŒŽ‰b-8øÚµ†p!íƒh9™Ù.G3ûåf"œ×¶¼¤Ã £ôìy%ˆè%¾éð</…N» ‘ØŽJ9ȼ†°0‡2Y°øÇÕ®Õ0¬ÅСý'GMš<thï)ѱñ‘ø5y\|Ü„¡CcâFÇ ã‡ †…LˆÝˆ”ªß%vDÌ”‘Q4ˆø±ñ[÷OÝ¿ôþaíZŸ¸Ñ!v¤› ~QšòìGnƲïnÁè9*îÀ/Æ#`p±ïˆÈf›–r&°sF+]4=ðgZôuÍ™ïåf0!Š‘YsIøx&¼&Jµ×h1¶\S22n|tlt\çÃò«ŠL†€hýg�î2\9D•œÆ6¶Ð"ÄŽ´J†ø&±+p)â‚Œ"È#Ÿ‚£U0ÁpqÉ}t«ô"ehd—¯`ýü¯óŽ¶RÈA¿!è7ý†²ü^ +äÿ~`0ˆ“e¶jζnÒÎ* +µ%Jͱ+<ìH;ÐT]V\›9^¦ƒJ¡¯ægë¦ÿÍœ*Ûº¨²T] +¾<_×lÈ¥Jli>ˆ™AÌb¦_ÌCÄ€úñ¿€”/äëOôÜxÃë´Ë€vÓ&IòS9‘¶) +ù𧲖D‰mI ý‚q›jZêÞ8O™/¯ãCE™&+*ÐŽ(Oa‹<¥êE³èv¢?Dݤ›…mþÆ_Å5œ:£4=ïêO Äó…óÉÍÛç07íÕí´ê¥rU ô´ªk†ÿaÄ/G~F5ŽöQ‘%N3sj¾—›Ñ%!‚@«£t›¥æ4Zb¤Û0i©FñNÕÈôFƒr¥j†GÆŽˆ7|lT|Üä±*’°±ý¶üi›æí£?ü=YjÛk×¢gÃÈŽ:ÕoØ^n¤tn*uÜdr‹~¼4¨ñ¤ázÔ›-†*ƒ¹‰µ¯µÕrtw¡U»É&¼&vÛjŠ4alødqd›ˆ¡á!}FÅ7éX?²Mx·vcß–5iÕ1|äx½5š¡+ýCû h«4™Ü²É¸NC'†‡†u8®Y¨6|Âè&í´U›´k0*´ÛÀèaBøëá±tx<'†6®.¾Þªsæ\ç7ës£Zôo%†ŠÍ:6ïÞ5¶-?2œë<¬ëÐ&Œ„ŪߤUô”ôǘÃ_Ö²c‡øÉhKS;¾Û¦WèØúmzvìÞe×¼~ØN-bNl×kD×\îÒõ6åš·i¡Òo•ŽîØ®UdhhÇ:áãÆ×SúwVXÍh†U®ÄGtŒè0¼_7µ}L»‘]k×¢cH|Ƕ£bLúãÍdKxóaßjß»o[MÚ#¤aǺýÇ‹Ä%¾Ý¤ÎbËNC÷ê@‡×Ë4š q4KÇu +‹–Zöí_B=ð·÷›Ã'kqœ<|ÌÛíZj1"´{HW!¼á¨.Ûk_·wó1Q_Ô“ˆvã½FLssDê0||»Î†·«¯·7 œíSgRÇz£èæcâê6&D‡÷3+¾† UÞèÙ¹cxŒP‡žˆÝ_Ô£Õà°1ò[où|K"@ÖÎ9ÌèÙ ÃðæCê…öì6¹[h1ãp£Âú·âº6«µz½™Í7åG‡ó\–*ÃFŽí†·a–qµ4~ÍÍëÞCµ¦ƒë)ñ ùnÒ”&£:áõµlÞ½_ý¡|Óã;q£ÆÔ oS§IçaÔ>Õ¸w\§É1 ‡…öÝ)ÜS¥6ixÏÐè·‡¿Þihá±Jü„ˆˆðní{ð4šoŽ¸nÃêÖí44bxc†76jl£6ЂþMH"z{u•nró¶:.j\XGNÕ¾½ÙVk‹é šï04¬»µ[c&«i»V‡v i0š“ÛtnÙžSÇj%µí0â5¥©g¾¤6ü°¨¼õ¸Ž u¥Q‡fMGI®JŽ¬ëhhË”Võô~ñ#=êì=ç•zcêù¿¬«¼”f¿ùm¿ê›)s4¾J\MÍ~k¡Ë•o¿RL+¿TÓÜø¶ÿ’E šå œ£©¬Tžiå’ƒêœåå4SæhªE*2šJÈA1íyrPís£Ô¬T‹Tx4/&UÉ´2äàåÌR³"PÕrðb£©°T9ÓüËÁË›jtÑÊ7šª‘ƒJ0"rP=sc“ƒPÏuÕ«D*Ë´rÊA5ÎMÝŸV£®zeå J˜ö|9¨î¹©û/ðÓjÔU¯„TÓÊ”ƒ—27uÿ~Zºê/&UÌ´@rðR禂)ŪŸ›uÕ+,Õ17~äàå«guÊA¹FSÃ)ÕòËAµÍ·ÔBW“”45œR-—TïܘrP“Fºêå ‚£©á”êóäà%Ì ÉAûiU*/2šN©–!/qnªdɱRL«*9xa¦ÕôÒ·_9xÙêY½rPžÑTTŽi5½ôí+5‚ÐÕ&åMåä +˜VÓKß9¨9#]rP±Ñ¼°TÓjzéÛƒöÓªX^`4/"UÊ´š^ú¦fªykÚóGSurÜ¢X ¦·(·(V¯·(¾€·(Öˆ”K‚[_ÆÜ·(·(¾·(VÇÜ·(·(V‰·(VÓjzé;¸E1¸E±2rÜ¢XµsSÓKßå’ƒ-¤‰ÞTÕ‹˜ØnÇí;¥^hÓ½¤‰RÜ'mj'F„vá;a¤cP÷^ŽðÈøH÷I¶“*v¬¥æ0O¢|ŸNÂÿGÖ®¥˜‡]:zVlj—œW«tr¥â>ñRqÌ&†èºÏ?ªè²ñ³1µk ¬ñã~Ê>`,xÄOðĶÿƱ>Õq:¶ê£¼ÿƒ'ù4Ô=¢—pGGC|ê>ŒÖÈa`87 „Xw ¸²<ì>ß<§iôøczæ =íL7O ò¹ÜLä5DUVuN§æª¢Ó³69^yÝë” zl™Æž4UžS‚FÇÅ·B3Ž¯à™ÎÞ?¬È±Î:ºÌó*/ñ2=ö…xöœší~ð<çzx=ýÓ8z)=ú‘=B×z =ï“rM” ãõDU¡§ "³—î'γƒôèL=ÞzAeW¯Sõ˜¥”zš°DÏd§çB;zD$=‡DRyž”G¢§g‡Éª p¼Èk¢"…žœGO•¥ç[Ó“Øé‰ðt°*=úc§ ‡H +ÆÅK¢JÊ CC¾D=.F„æf„mDôl$]TUázb©ÃÖ_Q¡cßy•<žgO‰õµ Œ=1NˆTz– jv¢öÈgz,†ÆdzŽ¥/‘(ÐÃK%z& .šlï®Â6jôÆFdã_„"Û4Øúk›JÛ°maåt¦#n§Õ»„Ùµ1§-„ΑT1I¦¾ÙˆèÄN6~Ž“é±{äÍÉvzž´†òv +bh#ò'†6"�LÏòQdŽN¿tغËK†h(º¤êô|)ßAûøa´/ y§Bˆ¬xN´Ñh²ÂøöÔFàO�mDþÐFd›�[om“ø\yñÃâò¼gúxùÖŽæ=ââa¯ã&DÔ´êw? °£;%z¸³¨Ñ£ÛÊçׇŸ3%>@‡žëØó\=NfG¯ÂWÈÍï7i|dÌ‹yù/Øo¾’¿·øù<=;œž™¬ÒãÏÊåó¿`£¢ÙdrÅ€Fåb€˜Á. ô@Ë€P¨|DÀž7«Ä kŽRµ¢„Îq +ýƒ—uÎ.X¥[¦‡ÚU$zð´§ÒÃÃÊwè0Ÿ«Äo«æ„|ß, ¹Ÿo…³@Ê0M¢Àëô€gÕmàñžËˆÐm<‘¹aXé±™‚b!ƒ 'ªÇ™Û£§rËôÔg™FOîv{‡øGE§Ö»z*4G°¶P�Ó4?ì鯢ñxN4e’ÁË‘9ÞmÊ ~2†_0ƇLÓéiðn§L¡|óšäðô™:É˦c'ò˜àðž)$y}¯éŠñ,\/Fò +=ÙÙJFÏŽ4úãvËT"Ùl+™@£s»vøGOàã-=– Y)TEP¼†.ÀÞ=²’I§Z) .“\sf%9„dÖQ4‹+IO®¦Ç4[e„Dmº’eHëQlÍæÓ‚68hƒƒ68hƒ_® æ Ccãb¯z„ЃJUE–xMt™r=@eŠÔYãUžev ‚ÂñσKÏgVz«ô„wz~‚çÑ ”ô¡gŽ*ž\DÚö~nÏfãµþ¡ Ög~)”X`ë(²•HíD~ˆ,UƒHcQ´¹rùkîß±6|ŠipænÆj*\¤àªM…Vm„ªZµñûNεúͳÏÃuÏ!åçÙp [ò¿¸^¢Ýó%ƒˆDôÿED¯æçRËœþÿ4†›Ù3Ïâ-åÌhå˜7׶,œ+µk¤¿j×jõNôˆ¨>Ú;õ¨]ksÑEEuJ0)œl®¡+’ ¢ÄñŠ&sô(3A¯¨·éœ®Òyñ;YWD8ù¸âx“.)ÒŽ§Acª¼jú©Q½ñ®9D—aáŒezZ¨¯_Ÿšöµp(š¦Ô®5¨KgÁ,ÁR³åØÏÏv~êy]ýÛëÛ'W=_[ð+ã…+¬”ܸŸýõïzá'ö®åfoÿãê¢wÌ{`t‹ÍxáþÄE|U®Ñ-kûìÓÿÇóB'eÝ0ÏW_¿êõø`ý!^nΦžº÷jÏ +½ðŸq%ýt)®Ã6cP~_«çìè¦ÿ¿^ßÞ=öF‡¡M{koã2_˜ÊDѧÿ›âª{tåZ¹f°ŒÑYÅÒ.œÝÓÉræ*ãeêzëÓÿ ·íX}íÂѼ’—^Ÿ>îä½Èè|ÄÒG8+2:µ +TÐOŸžO¶×@.Éð¡ÈTxtv±ôÎjúéÓsŒÅNæ#ºei_ ÑYÅò{ÎóZm£ÚûLœ_2À©Ù[þÉÊU,!Ö? ÃW £3íZÙ“‚ …Z_L¼yežƒ®X§ŸŸ1k^Õ£ó1p˜£òüª¬âwt¿÷ôU4«šÂYîÑ=ê—1࿯¼?·›}ñQºªF‘ÿÄ?HÚ…³*ìÜ°—7:ôÐ.–F±çqtV±4Fa»pþçFçcæ¬qÄbŠ}Ìýù*VÀ©vT±ŠßŒÿÏ—Ø:ølŸ÷�£{1‹�óç—ìØ?÷@i}•wt‹šûKW½?$®†Ñ2Ó¾Ö<€Ñ÷3º@biá¬j{WNO¬œS\Öèìbi«pVõèì^´½çv/:uà +Î.–FñÎò.sÒürf~žvÒ¢BÑ0(¼ì;¢²²FgK£”!œU½~ÐgWù£W<àÐÊF¨Î*Ê<ܸ˜eQý¾~ùâdYC4:ô¿ŒH8«4k4wÜÁ2Æ…á—¥nf“üs;ßW ±4 +¦Õþ¼Üiñé+~X¡~boŠ¶zþYë0!´À™Ô·Ê›ñ–`ù×”úõ;ÄŽ¤U¯Úµu®mÞEê^ýëhïxÀKª")Š"˪hîy)ç¤ý-@Þàð®Sc³¿ká®j"£ ‰‚,È +Ýn*蜢ªœ¤ª"Ûo¨‰t»«*™'^TŽ—uUàEU’éŠ÷†Cvªk«¡qªƒ¶…ÊŠ¦lÛ³ÆIÿíý†Á})Á})Á})Á†ÿ]*^G°{²¹™în’ÁdQR8¶«œãY—8pÍk¢d\Ñt]`7 (ºJ[=lÎ…hV”çh§¹ð{ä\òˆÌŽªë’¦Êªª8d)DÔèd‰çu‘c·„‹´ó]Щƒhg#Š`Dt‹”DÖIVd;ÈÑ5fÏxüƒÙ]×8:Bèø ÝSŒË’"ª²¨ ²(ó¶Ñ]†Ó¨ZXl0Ë·Y *McP :l·Q·ôkª¦ˆ¼¤Kº¦Iv"j^á$Ž‰ÎëŠ"Pð*§êšÂËF[>ÝõCá=Î0Ö‘"ÑéJ¯q„æêH’8Ž×$Y7nƒãà(0ˆ' +UE'ïÁè.ñMÓá/@üA˜K> W¼¦Ò +öJ"ØÉøKe `¢½!=DÑè^>SeÐ~‘GÇé¦|º·ÝN!CæŒMÕyLž ³¾Dݾ®ñ$¬B~éâÁ<Ýuþ„žÀK¤˚)|ž¼‡±ãØÍ— Uà‘ÑÜ@,DðGO%ðtGˆ!`Êáf¢ªˆš.û!2&S!‰¢ÌÁ9ì4îÙ„8qqY‘4<W Üðý(8…:éžOÁ*7n™¶À†Òm:´Ä*6:ÍK“y¸¾œê™Su‘nîä+tU1pØl£s³`…7×üQ_è„æ‘W8À“½-%z¥s¨I¤£H,4I02DCöK@rÃó2GbÏŽ1ˆè¾Jº3c’tàÅ¡BHžw=A½à)‡÷3AÏ•CpŒT—î; Ó0f%ÈÄøÞ‰©Sô•S1g2ÝL+H~!œR“é8MÓt¿Ló¯p‚¢jÀ IVíD Ð{:÷GÓeBSÙ?áµV‚Lb¶¨ùÔñŸª¨®Þ؈�ŽtϯŒ±È¢ÃÖ_`1×d +è8löQPoÀ@Ì¿ + !AìDŒHSìð˜#;‘BV6CbÇjŠ½¿þ(¼‡Mé؈htX€ ¨L+ýÉ–¢s’ÀÁ=r÷X¨òì{GE„ë„ UrØíKAœ‘B€(ð(8ÚV +ѲE0":’R.«tÐÞ.p(€ 3–TF–‡ø£û§�oáäˆOwD»:ãC¤„¨äÏèÀ¾èîŒ/´ &NÕt “i… fY„)D%§y„ ]¶Ú—‚z£Á§¡à£ªÛ‰¡„`P˜aÞO[@|„„H"ì¥F–¬S94ÌAçD¿&I¢áÂ"ìC„¢Nˆ¯@&DwolDþª2)§$;ìýÕCdQÄܢ˘LÀ²mؾ~ÅÆ—ÈŸØØš²M%(€#˜H6‚WýR�ËÉ—ÕYNïؓ%‚ˆ¨¦)~ņ€ƒàšš’%É.5¦é-‚¤ +v©±QrÚ‚½™K¢vÀOMVtÞKOàŒÙíö<o'… s�\˜\¨¿A”Ę5“à—Ò ’p +ÔÒÕo"·s ÷H§SÒ\½±1HÈ€ÚÂO4„ˆ>dU0ý\ºoÒÄú+Å™‡± ?ÞFaœ >‰;˜V ¡(‚Á½£9¢ÛÕO[ +Ì +ÜZIÕUÝOýPxÛè7‘Á@à >yÀ®Þ؈0P_L–DgX…¦ªÌ{R$Ï\ÌÀȬ»ðÐ! +tdôàKæÏÂûÐD0dŸàƒ°×£rt‰«ã©d“Ø5ùTð€t\br¡ú‰²"Ü—½2{³¾.ÃóÝÃza'¦z +Q�ˆª ±€á…€x¡úqjV4JƒêìˆY\óMsšIPvÔ»=Û+*³ˆLwtƒdQȦðh:ñF«*;bDðE`4 Ñ<Mð<± +‹iÐâ +D%úøÇËšÌa¨@«“Öè"u&¦@lžN]cÍ�_ÐoTkÀ0a€N' š2j1 ,á*TݤŽA«$(È}†cÍ“t0:8A£cÃ%HÖáA?‹1 +N‚¾™1–uÊ+#ð4ôq šÐØùªaú0E³"rÆj�7øf<¼j×hj$QçDg`cÌ~`"Df¡pܶúžóŠª»(&ìÆ£Ø)¨X>B¢™ÁìDŒqYOD$ª*ùiKg‹ì¤4'¹]> =`±¨_ +:WŽî‘T`$Wo|ˆ `†€¨1‡¤¸z" 1Nk:³Í'‰ +”[€Éa âçHD`EE(ô’nÂ?ÌŠãùr[IU„ÛÆÓI30xˆ’xB˜k‘:ÄSŠ)†H +öB,t]“TÃú#"é…M4™´JÇGÓ 0<ÝU88ˆË:£@Ø�® +¼B¾°‚xÏÛB³ÅÙœOÞDŒ3ªQöA`JfohÉ–U +Laüô×…÷°©7¾DþÒZþˆ¼³F¶þÚ2O¶aûËráz_3x¨Û‰"‘¢3NLï§-‘rÃl™Ž<•\š‹� #ÌÑL¯&ðìŒ!ƒˆ¬‡KPÅz'‚Ž…ÄJìì@ÆLóK+) +‹<èH(È8¯RˆT¤Â6±ü�ƒ1‰"BòãæƉ”Ç#û§BsäU¢ô³Ù8äHŠ¬±–ÁY8ð i½Š(xøõP}ŒA6à1ŽF7ñ!úàíÔ“i~ªäºˆðˆ:±O4Â:ø©pÞi,»¡C?ã!ÔÏW¹Êê´¯æC%“B9ü-*ˆ¹`×[ +n[ÇQ8O¬f _òYªž2Ñn�Cà¡SªZ‡Açp!$Q"É|JóýÀt(4BŒýhlqU¤‘OEYˆÉœ:|\‚£ñ:"3Ç‹–ð@Ítü/L§ÀÐëç¬ÅB¥®‰‘°‡Ñ€S,ª3}a]E["Yv:(¬ÀB‘1ÅðO¬§¾ÀbâŠí``ΓÑ'_ÃðO4xÒ)ˆ¡a¨0bùCä&q2*Ïh0?иfº„EI¢ô‹qGƒ�“®èYÅðþˆ¡Œ*wëŸ=òóÙó¼åo®ìTnõ¼BÇ,—³ƒËÙÁåìàrvp9û…–³+uÖ‚¨ˆpTUZoUh€á¶í*üL•¢u^h-4Ç›8E¸š–ã*S³®Ýÿþ™ +üO)x¨B°K°K°K°K°ü¯—¼Â¢Û™Ùg=>xïÁò“ç§lÙÓûÏMV%p¬oð×ú: ëI ŽäDGRbÄ„×ÿZòǺ–«z¯Ù»ñŸÅi'=xˆßÞxü4;¿°¦‡òß(`xÚõ;«Ï§Ï8r|ðÆíҚĺë×3'ø¾[_tÅýû¶nÂzáÏ„>I[?;ttͅ˯ÝÉÌ-¨éÁýKiiéÕ‡™?¦¿ï@ø†-Ö%¸x˜”heõëÉIú¦ÍÝ·ï±/5>íðÇÇŽÏ8sfú‰“_=þþ´ »÷Ù¼£KÂfí¯¤××{&¢Ñú„Ð ›GïÙ7ÿ±‹wýÜü°8KKs‹Šß¸;~ó?-7oi””dr»î†Äú’šnÚÐb[ÊÈC]º¸ûÁƒôììÛ¹¹÷óòfeå•”ä— ’œÂ¢§ù…róïçäÞÎι’úàÁ÷'ÏFnÿGÞ´©ñ¦ õ““$&ê7Ú²k×å› .q:kš5Sn?ÉN¸xuPò6’O\Ї¦›7vܵÓàö™§™•æO‘Óyüñãgξ™šÚfû6Lh„„ë7¯½pùú“¬ÿSü’›Ÿpáʈíÿ¼¾n½‰Õu“[íØ6þHÚŠkWOefB˜«¼ÝÜââ½,¸p~ÈþÔ’&$Nùû—ç2óþO˜�`˘í{Ä䳘œØb{ +$üèãÇ + +�AÕÚ¨ÀõÜܤ۷ÞØ¿òß,!qø®½»/Ý(ævkª@©äæÍÚ}¸iRr]·œ7ؘÜa×Îo/]¼—Ÿ_òrŽù}ZT´ãÞ=ÈÈæ\RÒÇ{^zô¤ºçý%—ü¢â”ôë¶ìx-Ñã +¶Ý¹mö¹³Wr²k¶o€5à[ÏÝ»lH[¿qÇõ[¹E5Û¥ª*…Å%óo™¼É„—Æ›7FNÛuÿþK–ó@ݸõtÆÙ3bÊf}æyGOÞ{šSÓªly”•ûþî“Ü!O"¿eÓÒËéªÏ+Z²‹‹w=¸ßvǶÆÉÉãþÞw'ë¿ÊügiÚÍ{¶ît$ºÂ|D£Â«¦O_[R\q¿¥¤¨4ïqiæMçËÎ;'J®í+9›\||uñ‘ÅGWŸXSr1Åy3ÍyïŒ3ãriÖ½ÒÂœg/4³‰wŽÙ²1tã–Ó3ŠKþ{>ç?é7»mL1¦þšuí¦ÿ:|À¼O"—\<yã™+¦kQÊŠësaŽóÎÉ¢ÓI…û¾-Hšÿ[ßÜ…-rfÖÏþ*½¾|%çËWŸ~^çñ'¯e|T/ããúOfˆÙ‹:æÿñvᶩEG–—\Ýã|zǧrŸö’QXøCzººmk×”í€ý“š+{ÒovÚ´ÕL³€í?ø)ªÏ×ãºÎŽí>÷‡Ï×Ý»õCÈg‰3ãJáeÉû©Kîܜ鎷ÁçëãCΗn™Ö·í¡Þíô +Å÷o{|p+|u3^É\Ð)ÿ÷¡…»æ”Ü:RZ\ðÌ6¿>0¯äo¸}[IÙÒiûöÍ—¯ÿWάüÂΦ´'%¼¶v]¯¸ÅÑÝçÄt Îã=®ÇÜo?ZsçúÃR§ÏÀ¥…¹%×æý5²;»‘‹ÛÓ_·³§9RïÊ8îPŸv»:vÚÙ¾ËövÝRÚD¤´éî~Ñçé¾ÚÖõŸNA|u¢ž9§UÞïoŸß%*u–˜|6ûl׸b§sç½»íwîh¹yKNáÀÛ)(.™òŒ;s˜ØpÕ_`»Áðq]fáƒûóó‘?:˜ž—ëEgÖ½¢3r—¿™3£±Ú-áxÏþÂqÿ½'Þhñwxgâ0ñŽÀŸ·²—qѸn¾›ñw‡Î§Þj};¾YöÏoŸN@[hЧç>‚M]*-ÝÿðaÏÝÿ|pôXÁ¿sÐÛÏž§”K6øcmÄ”%czÌ1Xízuñ¼0tQâ/»ï߸_pzsþšÑ9³š€Ï×{úyÝÜé¯üŒ_Ëíížb²×ÊäÖn&[™ß†]·^d“o¶¼ó¡ž·flqú®gná/£€ùû>è¼ëïEgÏý‹3<ÉW®“'Ã’¯[ßñ㥣{Îõâyß)˜:pÚÉÙ£²çk$Øï6<ý– +è~:µŽÁù¬©uΙ¨G˜À²Õàª7·ÍÏÆtXfÁõÕVãçm#vwîtz˜ötAXáž…¥y¾'þYÁß(`þî÷•[V]¸üï„ûCwïKM5—*ZÏþÍÀö7ÔX%Nè6cÑÑ—ÞZïö¤Æ0”;t_ ªçg5¸÷íèëüuo×¾Ç'ÏäÞ¸w÷>^¹7ogž½ð õÐuγ$müû»Žü»Çíá}L7…Ÿ’[ð™ñ[Ûˆ½ÝÂoŹ+‡—Ü:äæãSy3º±ñÎm5eKʵ›5ÀÙ2âŽØ‡ÌUî§?FöûšqØ›óìOÀþ{=>_=⇽~#®ÙÑÁp°eS›žú·‡œÈÏnÏ°ÔYlµ†&sJÅé,|üäQÚ±ôe+¾óùžÁ£¶µïe1¸&æ{.²÷a]ÎE*ç„ÝRŠxÁŸ·c¶oç§ËéñG\~ò´†xì§;KgŸ8e®Áªö·h\7olé:Ûôm>éõÑö±ÝnÆ7°ìê@H²¹Må¡oýÔmä¹É +>gzݼõãYwŸÙ¬žOÓ>þIá“ÌŒ#'®þ¾ö`ô”m¡½<èÔÚ”y7±¯¶‡v;Ò¿ÍÃém¬2ÜN{ýfœ8þñ‘cùEÿ–£#×]¸R'ÑòMLh7ý—ѽæÆt›ýÁE?Xýˬ «n]1oó’©ëgO\1uЗûLJ]-‘ÑlC¬XÓnðŒSÞé2mÕˆ!SëCàÏ üöÞœ“©M·³BÅYTœ{ëÎÍÄÍûÞŒö±®VëÐ&â@Ïö>oU˜¶¢´ø9Ëå·rs;íØñ×å«/¦ª.À™A©{Ý˦ â¯kâß[¾î§¿o_}è#¡ž’Œw¾Œ�¼�iSÚõØÞÔOƒ?™ÒŠ0kæ€øôÀûOóFŒ¡#‹?[wñÄõ¼ì|»Ëç7æ}æEYÙ—Yµ«÷[nØñø¢æDX´§K‡ë„¼=?v|Zñºc3â¥Íx\õ¬¬HAgf?i¸î`{½¤Äɉ_½p·¤Äé›(Å÷Òï,ˆÞߣ=Æ»£SÿŸÏºwô̹#W7ýžºäÓ?¶OèÃpæÕ¤1}Æwýjœ 8.Úþ;Ý)”@|¶ÿi\>8ö€ÏÖÖ´ßj¸úÝÁWëî{ºv¸'KxÆ\ý@äO?zbZÚ±ÂjX5+9ñ £~’'å®lÞ|é¡K¬6?¾}ûÇOS{wÅHÿé3ìÊò?¹¶�R2NíÉø²1ÜÈôOÔ{êã˜3mÔÒ Ë÷>¼óÄ~>³Ù_ëu²À%%OÏ_:öþ4/æ·¶_·›º»sÇÛŸu*8³Ý¯)7ë<u÷aפ-)WkÌÏÁìO=zܳxœ8íô)¿¾3?çþºSûöJiÛ}ßÐ1÷÷ì/)(ðŒ®¤°`ÍHŠXç4Î9¼fWbÚô±?Oì5χÿz~뻓f?ͳâ¿óc^ôâžÓYð0ãäg³RÚõd¬ŽðØYÓÛgp”Ú=üþü!…7üÄü\XTüÍ?‡c÷ì¯)±?xïu‹Q£MNgz&fŸŸìOÙ?°_JÛûGNȾ|Í›ÆY|b xž;£NAòäÒœG¸˜—[¶ëì÷Ÿ®}oð·0Ìeiæ,}¿òÔÁËÄÿ +&²�ûÇ?ür[ûÞ†oµEa†Á=Ô·]Æoï8³ªí=|¹Û¯ +Î^¬Pª¤;ñÒ,û»†ìß÷¸°Ðì›IYtÿúÑèQ°§iq"2¯4ÎÇ×òWÊîÈûV/¹¸ÍêFædåØ~ú‡©ë¦ôÿÆÇ;ÅŒüþÍV€¿‘ê/ù×Qr®Ý<ÿ):cH~ŠÕÕw3ÁÅÉ·Ú<MùÑççÖÏ™²?œ½öÝiÙ/{÷àÁ[÷,»ì(c°àÂù›ö•æ][úݶö=Œ™üäô¹RoàLÑÁ%¹³‘À¯)-ð]“u:OfÙ}nÁ{«}˜Û}îç#LþmOvfnù»]ZâÌ8zbß›cÝðá%ùîÈwgû.W§t(~äÿ4{†^Îåßli=å®ÛwËßz•”1ûR=lONh¶yãŽ{÷| œ³äñ¾”½†¦¾i/uº|³”Ü9‘·$œþë’kû‰+†YW¸oó‰™ãØ{ž'íÉÎÓÇþrhç™>Vl@þÁü[›¶ïì:ÈÊpwzÇL EìêØùá²IÎÂ|SkÖ“ºõä°ÑßOK;š÷«O²¥î³ +|Äî]g23}ºœ9ûÉ»»zy¸ÿ°×Ø]†µ¨pËG,3öJþêH–”õuNLz£<~ðt˪ý3Æýâ•ë2ÓñóWÉé§o{çrñ¡ÖÉÏg{<Wn3‚½Ì)ˆ81²{NÚ†gÞ½2?ßL¿ûÆ–s—_x’YY†–»¬¼˜nJ»±üyð�â;¯>Jù3uàÀôe¿;mhŒÏÛŒ8?£Nñ…ž¶›¤&%Î+çnÿ¾`뻃¾õÁŸ/Æ,Û¾îPf†Ÿm$ö)xz!ýïCí Ÿbñùwuìrë»÷Š3ý<ˆUA §ZØkÂKOž«�ï*Q +‹K>>vÌ ò®÷)ÇŽfy-Ü”d=¼ôÑÛÇÞû,ïŽ/ +Qq¬g¤‚ó~êìÌ.ó©.ÞµåfåŸH½8gâŠñݼ’ÿñý,þ|ÝõKþZô.pkÏ/üÑ›ÕÞŸóë‘{ê{Œ÷i£—¾5t¶xÕËIÝŸËxR?!Á\þ00gÆÙ3>X‘½g噉C¥yž«kñŧÖÛ)'9£NQê"Ÿ„Ésùf´UTX¼s]Ú§‘?ÀÚZ³sðü·ÿuèéãÃí÷‰ƒÌÏ0={‡Œñd2[»3ÿžT÷];ÝXøaIΟџ¿ûhÍ؈Ùí§ý²ûZ9ž,Sé²ùæ-ë–H¼êmHšá¼WäRR˜ñMŸË‹–ä{€fÏYwVG“Ìùò•¼…jɵÔgÞ̱7Èot–8/Ÿ¹õÛœïXh.¸ÀøNìõõ²I—NÝ,. +ìee™µQÆÖÖî0¶uw»«srd·‚[þ`·lf2Zì3þû¯ööKP…¥¨ÄùÕÑÞ·lPµ$ý’•óEW<ž×!ëRº½x8ŧÖçÎãrØ2+¦À™y«lÛj~öÛ%\‡xïO9õÙˆaolÄœ/Ç,û;ñHI‰oƬùÖÆmG¼‘⽌峤›Ú#üQâbŸþï+æmFCÃΛ¸}ouoOxZXØp5.¯†vëmÚ°ôrú3�æ&}üdÑ�Ó´¾;³îü5ʵafækEÿÌ1—?ÌÑYß}¾²Ï‘ñ'Bª;×ÂÃ1ÜN“ÿ“û.X9óÃ;Oœ,‰çSö•ëû‡ÇZ–tMž{Ð~{hÄí©ÝícA®!²×m¶>ÅÇÕ»b’þ4Ë™4o¢I09ogÎÃüßúå%L±K)®ŸMÎýêucSAîBµøBŠ_~Zâ÷¢ßëäöo91#æWÂÁýGôð®sùy…¾³VRrâã)m-Ic‹…ý»ûÃ>Áý‹n±·þÓôDc~#â—l¼tÍ·7UZ/]µ"¼‘=h¸1yqº'ƒQxaWΖ…[?¶vÕõ¡¸“xÏ¡}¯ä-íâ||ÝNVÆ•gr’æg„]p;—L[×ãk«ÛóþE‰?ï~ú8Û§žË¿þA™‹ci€B[¶=} +º¼õ +v/²77ÿÝU†r y{áâsçËÍÅ)³ÓŽ»î³ð¿nrâìsgÍþ¤.͙٠y’ýçÅ·åά›ÃœI¼ +þn]‰¨Âòè^fÂÏÿLà•ð™ØkÞ_$\¿x×:S÷÷ØÞ¡ŸOö�Ÿ/ý¸ÜYì +NÖD!á š:úIäFÍczÎyâT µ|A½Ñ{R½Í«k +>>yÂHÚ”çn› +‘Î_9è™Oæ6ûAÞ¯lùÀšuwÏ�Ò½Ú-‡·c-ÆøœÇö^ø2úgë0üÿO‡/Ù³ñxNV¾ñ[@ýŽÎ|²FOνåÚYê,n’zf\¶6ŠÉEø`VÞö—µOó«ë®Ÿ’ÒÒ:îí4^œOJŒ9’öˆ¥ÜOïæ3š÷]ËÒüLgŠŠR¿ÏÓ„ œÿòÕܯêÓv;uŸR†‡S¶˜á[˜Ýï¯ö Ë9ÄuŸ»rÁ–ÛWÀìeeSÇ’=ØÖûêÊ¿JÜyWgæmŒ%ï[½øÒk‹‡we‹®åƒöóWÞ̬®»02ó-†Õ+{0`ßžôì,ôªäÞùÜ#(8Ç•\Ùc² äÖQĪ®M’Ó]Ûiœýä·Ë`æs _‚{73Àg89Ö'ã#æÌ›òûáÎäìì6Øš=Ø;tÌãã§ÍŸ—\Þ•;_ÈÛ¬øèJ³ZLÙï¶ pÞ¨¶Ã´_Î=ª®ÅÙ+™æò“Oö íŽmi´”Próhî·ÉgÖ+Ü>í™áŒå=.HžxÉuïP¥×ìF¥Ey8V…•g=ÉIüe÷¤Þó°?¾Ûì÷ßønÝoï6ÄêÉÿhzÑÓ,óçE©ßåÎjHðÞoÌ +ï\8sü¯¬×zMç–{p1¥’%íÖ=‹œ[³ ¯mHZó&<f¤¹_‡0Þ¾’÷}Ûâs›œ¯n|/ǽ=Õò€£ïÛ”Á«²{âƒ?öpÀNŒËˆ¶Àêq]fó🖺’Ûõ5³;:¼±nƒç‡ùO•Jt»pûÆn´Â‚¢¤_wOèɶr1´ØGLYràáÃàjyÊöôæ6›o™øÙ©“¹ÅŤ›_ÕÛ ƒ½yË�>2Æ&ÕW˜WùJþ¯½ýr¬<öÔïg¿¿õr8Kœ¶yB]Ê3t5¾ËWÚô6³»ŒÈºtÅüaÉÍÃyK:¢R¸õX+xgÒ.>ò'Ÿ‹=&ý°û¾Ÿ¬f•” ®ø9íÁ?Ýwï‚‘-¹´#Ç +)¤{Þ=óW¿Hn|+{FÊ_ŒŸC\R}>Ò“g˜ÔùËmz™ÙƒmCcïßx`4 /:òì‘›óÃs»yùþì Ë}÷Îu™Õsâ;ïV×úT²Éyïì;õ6$|ô°äüf7Ÿ_Éñpþ7ȼâ¾á•‚ucýú“æE¿_ +£¬ï>”>sW\Trê@ú‡C¿wíçéô)8oftž8môÒ„¥»àå?º¿vŒçßsö‹1˼ØîÞÎo¾u»9ïÆköÀ4¸ñÇŽ_ÜÎî8p1Ü&ù.Ì¡\ÙúqeðÓ‡±ö‹/¦æ¯NºüÑ[‹!«_txwS›ž†ÀoiÓãÎS NÂóü㽩Og6rKΫ[&ra»¹/º‹ë3Þ{LZ’rûÎt©<eóÅkþ޳ߦÅö”[§7à `îu#]`΂ñ'Ã@l)ãʳçeʘAëKŠKR·žüèïç‡Ç‚ᆅ]Ýî À¾›±³vÅuÎqß½òdÚkŒ|õ;Ú¶#ïÝÞùqçÝ +¬ïT¨ì¾zË%ðÞÙ7ì$4ؘüÓÎßhóÌt+™7Ýøûü•ƒ«©Ÿå,ùy…[ÿ<ð{ó>ˆoÂb(÷ȼÄzühj}-ï}ÖðÇ·¢Œçö$¯Îþ´÷Áƒjêê©{lÒî{ÎRŸõ?^ú¶½UÈþdŽ•óK:Õ–zk‹>×ýâ¶ØïWöâ-ûÞ£ÔÑñÆ®§ä6½?îô±!ϱݾJ‰‰ ~º}à+q3Lñá¶å5+ü³ŸÓªÍŸ¿ý4ÛÚxkAÓ¤¿¾_:êÉOZÌ”sŸ+pûtY vù”òÖ2üþüñÉ3{‡Œ1ngø-tX|ç/NÎ4ñÖ'M¬w&žx§åäî_Ø]ó½ÝÌßN>¬®£ò‹K<|öÊ!XùŸØëy'ç*9î>{qûK—?OŸg5p>ñs¶Ésùè'e€¿ýŠñùfÒ#i¨_>>¶ËWàá”îÓvÆvÉú¢Žé$d}éØ4¶—ÅŸñºÃà|ë+Ó3ªkû:ûçf°žìUê%®ýãè',WàAWNÞ2_Õ§í|h½Š3%yùç,IiKæ5)là—Ý>6p㻡cï|ÚØ„J¼2§Õ?8Ö2V™o¹tͽ¬ +ìv«hy7õy¯«—ciÙ‡€?&þ¹{~¨ùòU× h3êîœñ¬þdÙ>§Ýç÷ùÊ/ Jö•kFO&²mƒñŸ¯š“Oò“ÞzWwßlî’–KŠã»z˜l弑ˆÛmögiGŠ«q³Ù’“g½Ó•þ¬-{ \5ëÚ¬fn÷Òêç¼b^Ì_ù†Ï^Ê*ñÞŸkèºÓyo×¾úCàwtp#aÓµw¾Œ^–0¦_ö——Kó¥Ë“ÿcäW’ǵ±ÐWø‡˜7÷ô¿ UUÙ}óŽ¯?iM[оAâš™?E?šQ/ÇÍm[VáÕ¼ÅíJn±óç¹|äÞ”Ÿ²$¿àìÜïÛºgð¨ü%ν?ÿúàóFÞròêõC>ïû5\uù––?Œþî·óÕ»£û~^¾kqÄ<O2ÉDKö’}VÖýºú»>O§×q{’äqMĬ´ÍÉé +ùE‰ò89~=LëŸù÷îêõ¦áÆ_øni)éÜÎþe@Ž¹|Àú ùOÓwbÄt‹Ì[òœnkÛùƒŸÜ¨ÞMŹEÅüÚD_Àñúì…BíÖ,Ù¾ ƒ±ÞmúÆÖ¼eþª7O®?׫,§£î÷‡>ŒreÅ_Æf]f_½Qš÷¸pˇ¹_Õ³x’„3gßS¾è÷.%–»xIû8æãóÇ›öT÷Fz'lpÁp|¦ Éüz®žvŽdf,=˜c ýÜfÅg¼·c~l… Éï·…™OSi› AÍ™™Jr³ŠÒ~ÎÇç¸\W÷2¦Öÿ3ê¸n3ýFOæ\Dõûúƒmû^˜¥å/©÷ï×Iôò$·Wéëê»L@ԊϯÍjjÉÛXëWóÿŒ4Wl«¤<üomÜfØÖ]=ß|tðHñ•Ýy5¯Ìëäñ)ÞïùY�¶{\AQß®H«^ój”»Y9MsÉüžÒlþi lë%³üÓ³ùlït¥k‰jFÝâãÂp;b—!ü奼{Òâ>`§Oô8=c^þ…ýyßµt/–½bêãé¯Oï?Å\àôÔtùà§;O_Ò „³OŸ ”=ôóÇ.ÿäÜÑ+¥àþWò·u>L¯n<×uô!0>8‹Š¯¯MÞÙu ݃Ù?òþú¥ù¿õ1–̬¯Œ©õÜžd™lï2kTŸ¹‹SÒ^ÚixÛ¯Ý,#{àÇÏgdõ×\1õªËÉw¿!i3ê$Ç—æ> +ÄF³øõíËsŸ+¹7oŠyÖžB{ž~7&gY¿Ü™¯YÖ˜6ãµ&v{§ÇÔ€<·øóCßþ&5ýelá6 +‚µAûöڳͷlj±=åõÉ~9OÇ÷%ó;^«$Ækn³¢KJ‹ò5Z¡`Êoq–”\ý}±—ow·ˆ'sCi)Á’%`y¿]5uñsq†d¾Û챋ïåTcÒÀ^¾>|š=h¸1yúÙÓ9,|~RX˜tëÖ Ô}Ü–M~@))¡ÛŸ·}Ó1“ò™–21¿iÑá_Í37ü:6>Ånì.½Y²Ò¯ìè<`[ÛˆÔîaŸ‡X“&çó—p>¾šôËî¸s=ž¤ÏY1î fÓ±‹•‰ +Lôk `sêõœk2W_¿6tjÃ<EÜòºæ‡ßÈœ^׶¸Wiçŧ֕:½ epÞoñkŠ²sN|úÕövt¬Êƒ÷Zü+KL½´kÉÝS Þ²jÿÄ^ó|ølϼ=üÛ|O…z eá‰ÓÚ�^æ?Wl»W¨¤´ôjNΗÓåÍÉÞœ§—´nù‚%#î|ÕÐêËÑð¿kA®N`ØyVñìÂ䛉›þî6àÌ05ã£ú9_º}Ú/=œÏÿ¹GÉÕ½}ÊŸ&¹÷á[àÝ7{°jω—,ðF¹ÃíOÙ¼q嵫ϼù`~.,)9öàNdÊšIk½œÏ¤„Æ F/ÿôø\-˽!ÇŇy|Ñ?sKsڑįçùÌ&á>fæ©3Çb¢¯Žã²¦ÖÉõ¨sØ͉ù+”Ü>jêÚ†ßöLèùõ8× T³¼eÞÅü¿Öì?u«º–ÿÊ.ÕŠ‹éÄ@vçB©{ÈËØŸ>HÿyëâÎk—xûÿÄÿ6ý¸zQß{3µié +ÖŒpÞ=YZRèS•WÊ‘=(¼}éö¸‡¼îÊN{¯Åç~U¿`}Œ3ó–Y³Ä¹jaŠ'3Câí›=ÓcΊ]Ç5úÊÃܼ˜C‡ê$Ó³üßC½1¡´øþ¹´Í3G/ÿ¬QŸ>¡n³õ«>[wÌ-üî”Ú+y?v,:´ŒÝHå, €0e±½ ‹vì¯x+kZ]·Óè/ÇnûÜ™ýÀZUÖ“œ%S×Û@Þ+zzcô¢;O²µûrʪsél/ñÞôlWO³¢<¼±á£ï—¼ÝbíÏžÄ2{½žøWÕþXÔ×Ût#ðܦù+>ù½šA)Ê->·©`]´OZÀZsÞ¢ÖÅÇV•ægútøÆ¥{_ÅþfwÝÍ׈þóv¸üâ,«¢‚nÇ8ôú†¤W¯;=w„ß¼Çy©‹Ž/é9bå4~ï…‰kÆ,ÿôÈ×z†‘Ø7Ó›³^Ï[ZøÏì’›iΧwˆ]Eytàž³„np+),-ÌEÍΧ·Kn,Ü5;oq;¶+Ïá‚/ÏfZVáìFtOâÃKÖ³]Pã,=°í”a^ÇÙÜH¼¢»ÏY·ýXÖK?âÃo¹ü8sxjj·]ñ4®”í‚QŶ<Y9dÁQak¿–´Îµj±vÙœŸF|²}0fÖÍ[Ò¡ !¦p猢ý‹‹Ž,GP”ú}á¶iEAŒYLêñ”¬ÛhÙÏ_#Û¿ØX³›ì§y?•lwÝÍ×ê„çü‹JµéÚº‰ ÓNžtz£±_þ°ï|p>{Ë'{~èûÛ ÿòY窟¸¶çó—-~ãÆWM}!ÚyùfûùÁ+žxanÓŸ²s¹}o4ËÅ“7Þ¸0¦«u§·çõÖÐkŽ¼¤SÊYŠJœsOá7oÚv§¼{IÚò3‹Îo¾½|È/?Ö¯°'|š%¬ôû¬„o»?žñš%Ûóªyj±tçX „uà7.ï_œ¾³4ŸîõÜ¥g?L]È°Fœ?{sjÍç·�úÞM;Òñï‡=* Ñû-À¢£¿_XþÖ¤U_ÿ=yfóßó›v¹:«™aIfÃ2±ÅºÎNŸ¿É_9¸øÜFóþ”gÀvZn91ÇLx˜eÒ>gÚãj»’åZfVÔ¾Ô·öíKÏÊ*§mµ¼ÎÌ›OÒ–¯ÝòM¿u&ò›©6öø¿Ä?#W~ñë÷ƒŒ„›7ÚxÁ‘K;¾nžÿçpÃ{ynÏá´g¦Ž²Ü`Yã:ì›é;ž¶Û ª¤{ð0*uÿ¸ƒ3…?Öâå!†É¼uîò¡™{“•ä?}³mnü°jö¢†›#f›b°"Ï—¯>ùôõœµ“‹Ïo!/¨ÔÏ)—öÖï\ôíGkL7_c#f÷»hJÊÞ×_^*ø…Ë»÷Ç80%ípNqqî¥õÝšœ¹9G¡’=6mðÍ6»å¿õ_?½óË”CóZ=üªáÓY²g4Èø´Iz´t6nГÔmμ§öyÔ“ŒO¾ŽŽj±ÄJã˜ßöù²¨]{WŸõstÆ¿³¤Ý8îà¡Ž½——çWò%X¬•ÀMJº}kpê¾f›7z–`¼Ónõ’lüý‡=k“—-Z×wØÑOff]º¨!{?2÷n<úæýÕÖ$ðØn0¦ózÅ-nòÛŸõÓ¯V1wª¹@òãzïð‘;Þ§l=+G²ÅüÌ¿•—ûó•Ë÷íão'›ñª“” ¬\9àû%sØvïîœg™7JqqÉ…ã×¾¿Ú< +ØòFäÂÎü$-ú½îúõRþ…Η§{ð(nÿ¡‘{=çXú”²™o–"§óJvö÷—.¶Ý±=ðj#½êoHÒ·mí¹ûŸq‡Ó@ÿÏýû7órý.’•ìO9ùÅèeã#æŒé9gHäÂ.ïý¨Ï_Ñä·5¯±'xÚ·oïêºûæ%”›YÙ9ÚkÇßG32 +KJ!µXn½þßÉ˃üwÚµÓ…ÿ~¶wº.Öa³�2 •¾-*{äðg§Nοpþ›‹¾>svÌêæ®h1oEóŸV×_³îµµëëÏg¯ØCi§ïÿ‹Õ+ÙEOŸ ÝšòËÅôŒ‚²N×/þ <ÈÏ_’~iÈ~ËjcR`Eðl>ô»5Â÷zݤ„¹'Ogä•7;÷//ÅNgÊ[ï:wèÐ…'™~%ß,Ïå)KßÊÍM¼usâÑ#ÂÖÍ~‘Çwk„ïŒø!´oïúKW‹þƒO¬+»\}òtÊÁ´…çÏÿváRNÅ·šû£ŒÂ‚C¦>%¥lñÏm+«½vúRFíI=]m·ÛüÊúKW&¥î²e[ò÷róJlØnCˆÆ(¹ÅÅkn\ó@*,,Þ“ðl{öÙÿéq“bL¾rݾŽü¿W€¢¥_‰Ù`Äž}¤_¹’™U¶Xç} +TiÏýûïï9ØârQÌ Ÿ~PˆØþúú„¥ç/ÞÍ~©fj¼dä,<~:öÀ¡~»wÏ<tìÄ%åpÂ}¬”y…gÒ®$,Û5ÿƒÕ£F-î1éeáʺë×û… Áûö.8~®W9çô¯<É/Xzú<ðGß´yÀ¦íóþI»òðIV~a^AQQQ±yÔ¡QLlÁu8ä…Ey¹÷ŸÝ{aõ¢m_ŒYöî oãz¸’�EGõ™Û;v±û±n$ÿu“£˜ìÔýœ¼2zõ§—¤Þº»øü.!éõ¿ÖµÿymÜï[o=¸aß™GÓO¿vþøµ‹'®#ä<wôê‰ý—v'MþuÏÏ3“¿Œþ™m›å³o\×ÙÑt†gŸñßvê$&4YŸ¸ðì¹½·ï¾ÌCËÿ+Âý8/ÿdÆã¥g/pkëÿµ®ùÒÕú¼¦ÿÖë³_†¾³ì혆¿ýíÈ~óuB¤}WH#æDõùúí7æñmω?„}¾Lþî÷æ«Ö-=sþÈÃG÷sóþmÏ¿þ–R–1È,,Ü}ýöÂ#§âöîkÏÞá»ö6Y¾&äçÕü’?ÄïW«ê‚•ÚüÆ.-ú=>eOܶ=ìH]|èä®k·æåSà\ÓÃù¯ Ä̬Ów¥^¿³åÒµ¯&^¸‚w|Þ}õôÍ'Y¹ÿ…GèK°K°K°K°K°TU©_¿CìÈðÈøÈÚµu®]«~hy®ô‰œ5©v¸4¬yè¤øðèñÑq±‘“Þw´ k\ˆ$«ª¦ò¯q +¯«Žæ}¢"c _:ðGÏIÑ££cq±ïˆÈ˜¨FŽ¦ôÖôV»–îhØÈ1h`íZýµàKÑÞÓ½ˆÈ÷£&5k†õ{EŽŽê7)2:†º;zrä;QŽÈØظøÈø¨ øÊ1zRÔäø¸IQŽÉcâÞ¥+ô#ó~ÏŽµkýÿ¹:Ž +endstream endobj 5 0 obj <</Intent 15 0 R/Name(Layer 1)/Type/OCG/Usage 16 0 R>> endobj 22 0 obj <</Intent 30 0 R/Name(Layer 1)/Type/OCG/Usage 31 0 R>> endobj 37 0 obj <</Intent 53 0 R/Name(Layer 1)/Type/OCG/Usage 54 0 R>> endobj 60 0 obj <</Intent 67 0 R/Name(Layer 1)/Type/OCG/Usage 68 0 R>> endobj 74 0 obj <</Intent 82 0 R/Name(Layer 1)/Type/OCG/Usage 83 0 R>> endobj 89 0 obj <</Intent 100 0 R/Name(Layer 1)/Type/OCG/Usage 101 0 R>> endobj 107 0 obj <</Intent 118 0 R/Name(Layer 1)/Type/OCG/Usage 119 0 R>> endobj 125 0 obj <</Intent 134 0 R/Name(Layer 1)/Type/OCG/Usage 135 0 R>> endobj 141 0 obj <</Intent 150 0 R/Name(Layer 1)/Type/OCG/Usage 151 0 R>> endobj 157 0 obj <</Intent 166 0 R/Name(Layer 1)/Type/OCG/Usage 167 0 R>> endobj 173 0 obj <</Intent 182 0 R/Name(Layer 1)/Type/OCG/Usage 183 0 R>> endobj 182 0 obj [/View/Design] endobj 183 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 166 0 obj [/View/Design] endobj 167 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 150 0 obj [/View/Design] endobj 151 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 134 0 obj [/View/Design] endobj 135 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 118 0 obj [/View/Design] endobj 119 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 100 0 obj [/View/Design] endobj 101 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 82 0 obj [/View/Design] endobj 83 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 67 0 obj [/View/Design] endobj 68 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 53 0 obj [/View/Design] endobj 54 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 30 0 obj [/View/Design] endobj 31 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 15 0 obj [/View/Design] endobj 16 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 190 0 obj [189 0 R] endobj 205 0 obj <</CreationDate(D:20161006171817-03'00')/Creator(Adobe Illustrator CC 2015 \(Windows\))/ModDate(D:20161013192722-03'00')>> endobj xref +0 206 +0000000004 65535 f +0000000016 00000 n +0000000312 00000 n +0000027806 00000 n +0000000006 00000 f +0000133736 00000 n +0000000008 00000 f +0000027857 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000017 00000 f +0000135705 00000 n +0000135736 00000 n +0000000018 00000 f +0000000019 00000 f +0000000020 00000 f +0000000021 00000 f +0000000023 00000 f +0000133806 00000 n +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000032 00000 f +0000135589 00000 n +0000135620 00000 n +0000000033 00000 f +0000000034 00000 f +0000000035 00000 f +0000000036 00000 f +0000000038 00000 f +0000133877 00000 n +0000000039 00000 f +0000000041 00000 f +0000029564 00000 n +0000000042 00000 f +0000000043 00000 f +0000000044 00000 f +0000000045 00000 f +0000000046 00000 f +0000000047 00000 f +0000000048 00000 f +0000000049 00000 f +0000000050 00000 f +0000000051 00000 f +0000000052 00000 f +0000000055 00000 f +0000135473 00000 n +0000135504 00000 n +0000000056 00000 f +0000000057 00000 f +0000000058 00000 f +0000000059 00000 f +0000000061 00000 f +0000133948 00000 n +0000000062 00000 f +0000000063 00000 f +0000000064 00000 f +0000000065 00000 f +0000000066 00000 f +0000000069 00000 f +0000135357 00000 n +0000135388 00000 n +0000000070 00000 f +0000000071 00000 f +0000000072 00000 f +0000000073 00000 f +0000000075 00000 f +0000134019 00000 n +0000000076 00000 f +0000000077 00000 f +0000000078 00000 f +0000000079 00000 f +0000000080 00000 f +0000000081 00000 f +0000000084 00000 f +0000135241 00000 n +0000135272 00000 n +0000000085 00000 f +0000000086 00000 f +0000000087 00000 f +0000000088 00000 f +0000000090 00000 f +0000134090 00000 n +0000000091 00000 f +0000000092 00000 f +0000000093 00000 f +0000000094 00000 f +0000000095 00000 f +0000000096 00000 f +0000000097 00000 f +0000000098 00000 f +0000000099 00000 f +0000000102 00000 f +0000135123 00000 n +0000135155 00000 n +0000000103 00000 f +0000000104 00000 f +0000000105 00000 f +0000000106 00000 f +0000000108 00000 f +0000134163 00000 n +0000000109 00000 f +0000000110 00000 f +0000000111 00000 f +0000000112 00000 f +0000000113 00000 f +0000000114 00000 f +0000000115 00000 f +0000000116 00000 f +0000000117 00000 f +0000000120 00000 f +0000135005 00000 n +0000135037 00000 n +0000000121 00000 f +0000000122 00000 f +0000000123 00000 f +0000000124 00000 f +0000000126 00000 f +0000134237 00000 n +0000000127 00000 f +0000000128 00000 f +0000000129 00000 f +0000000130 00000 f +0000000131 00000 f +0000000132 00000 f +0000000133 00000 f +0000000136 00000 f +0000134887 00000 n +0000134919 00000 n +0000000137 00000 f +0000000138 00000 f +0000000139 00000 f +0000000140 00000 f +0000000142 00000 f +0000134311 00000 n +0000000143 00000 f +0000000144 00000 f +0000000145 00000 f +0000000146 00000 f +0000000147 00000 f +0000000148 00000 f +0000000149 00000 f +0000000152 00000 f +0000134769 00000 n +0000134801 00000 n +0000000153 00000 f +0000000154 00000 f +0000000155 00000 f +0000000156 00000 f +0000000158 00000 f +0000134385 00000 n +0000000159 00000 f +0000000160 00000 f +0000000161 00000 f +0000000162 00000 f +0000000163 00000 f +0000000164 00000 f +0000000165 00000 f +0000000168 00000 f +0000134651 00000 n +0000134683 00000 n +0000000169 00000 f +0000000170 00000 f +0000000171 00000 f +0000000172 00000 f +0000000000 00000 f +0000134459 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000134533 00000 n +0000134565 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000071719 00000 n +0000135821 00000 n +0000028249 00000 n +0000072025 00000 n +0000071911 00000 n +0000030389 00000 n +0000061241 00000 n +0000029629 00000 n +0000029824 00000 n +0000029874 00000 n +0000071793 00000 n +0000071825 00000 n +0000072101 00000 n +0000072279 00000 n +0000073769 00000 n +0000085924 00000 n +0000135848 00000 n +trailer +<</Size 206/Root 1 0 R/Info 205 0 R/ID[<BF7041612CDA1248B542725B4EEBD5CC><FF417A6C0FF3E24A8349DD3D60C319D6>]>> +startxref +135988 +%%EOF diff --git a/public/img/logo_parceiros/logo_bioe.png b/public/img/logo_parceiros/logo_bioe.png new file mode 100644 index 0000000000000000000000000000000000000000..2b050782ab8ad609b68262c8220ba7ce550f846c Binary files /dev/null and b/public/img/logo_parceiros/logo_bioe.png differ diff --git a/public/img/logo_parceiros/logo_dominiopublico.png b/public/img/logo_parceiros/logo_dominiopublico.png new file mode 100644 index 0000000000000000000000000000000000000000..16c0737187890f5e9da4cdd8556a1b286faa3216 Binary files /dev/null and b/public/img/logo_parceiros/logo_dominiopublico.png differ diff --git a/public/img/logo_parceiros/logo_escoladigital.png b/public/img/logo_parceiros/logo_escoladigital.png new file mode 100644 index 0000000000000000000000000000000000000000..c1ed98e0fc0d8ba0bef95c6727297fe7427db2c9 Binary files /dev/null and b/public/img/logo_parceiros/logo_escoladigital.png differ diff --git a/public/img/logo_parceiros/logo_portaldoprofessor.png b/public/img/logo_parceiros/logo_portaldoprofessor.png new file mode 100644 index 0000000000000000000000000000000000000000..deb2ce6448dc5b36a04d05bd0e6ebd296379263a Binary files /dev/null and b/public/img/logo_parceiros/logo_portaldoprofessor.png differ diff --git a/public/img/logo_parceiros/logo_tvescola.png b/public/img/logo_parceiros/logo_tvescola.png new file mode 100644 index 0000000000000000000000000000000000000000..9067cbc112ec0b710ac2726f15ce59a62921ff60 Binary files /dev/null and b/public/img/logo_parceiros/logo_tvescola.png differ diff --git a/public/index.html b/public/index.html index 2e5c176d60246ce9ed6113d86e2f173f94db9d2a..a3e4855ea2b3e65055ba0906ea82a58f7f94a7bd 100755 --- a/public/index.html +++ b/public/index.html @@ -1,30 +1,3 @@ -<!-- Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre -Departamento de Informatica - Universidade Federal do Parana -This file is part of Plataforma Integrada MEC. -Plataforma Integrada MEC is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Plataforma Integrada MEC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>. --> - -<!DOCTYPE html> -<html lang="pt-br"> - <head> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Portal MEC</title> - </head> - <body > - <noscript>You need to enable JavaScript to run this app.</noscript> - <div id="root"/> - </body> -</html> +<!-- Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre Departamento de Informatica - Universidade Federal do Parana This file is part of Plataforma Integrada MEC. Plataforma Integrada MEC is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Plataforma Integrada MEC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see http://www.gnu.org/licenses/. --> <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="utf-8" /> <meta http-equiv='cache-control' content='no-cache'/> <meta http-equiv='expires' content='0'/> <meta http-equiv='pragma' content='no-cache'/> <!-- google sign-in --> <meta name="google-signin-client_id" content="288460085642-k4veg4fo8kddvjer8b055n9da5qtgha7.apps.googleusercontent.com"> <script src="https://apis.google.com/js/platform.js" async defer></script> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Portal MEC</title> </head> <body > <noscript>You need to enable JavaScript to run this app.</noscript> <div id="root"/> </body> </html> \ No newline at end of file diff --git a/src/Admin/Components/Components/AlertDialog.js b/src/Admin/Components/Components/AlertDialog.js new file mode 100644 index 0000000000000000000000000000000000000000..14861d979b42a3a78cdeeb07ed501e4615dc4e43 --- /dev/null +++ b/src/Admin/Components/Components/AlertDialog.js @@ -0,0 +1,56 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React from 'react'; +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; + +const AlertDialog = ( props ) => { + return ( + <div> + <Dialog + open={props.open} + onClose={props.HandleClose} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + > + <DialogTitle id="alert-dialog-title"> + Deseja deletar o dado de id: {props.deleteItem.id} + </DialogTitle> + <DialogContent> + <DialogContentText id="alert-dialog-description"> + Se você deletar essa dado, todas as informações desse dado serão deletas para sempre + </DialogContentText> + </DialogContent> + <DialogActions> + <Button onClick={props.HandleClose} color="primary"> + Não deletar + </Button> + <Button onClick={props.OnDelete} color="secondary" autoFocus> + Deletar + </Button> + </DialogActions> + </Dialog> + </div> + ); +} + +export default AlertDialog; \ No newline at end of file diff --git a/src/Admin/Components/Components/AppBar.js b/src/Admin/Components/Components/AppBar.js new file mode 100644 index 0000000000000000000000000000000000000000..b596c35f59484e8754b79c68d787feced4011913 --- /dev/null +++ b/src/Admin/Components/Components/AppBar.js @@ -0,0 +1,73 @@ +import React from 'react'; +import PropTypes from "prop-types"; +import Typography from "@material-ui/core/Typography"; +import Box from "@material-ui/core/Box"; +import AppBar from "@material-ui/core/AppBar"; +import { Tab, Tabs } from "@material-ui/core"; +import { Link } from 'react-router-dom' +import { TabsItens } from '../../Pages/AdminLabelTabs/LabelTabs' + +function TabPanel(props) { + const { children, value, index, ...other } = props; + + return ( + <div + role="tabpanel" + hidden={value !== index} + id={`nav-tabpanel-${index}`} + aria-labelledby={`nav-tab-${index}`} + {...other} + > + {value === index && ( + <Box p={3}> + <Typography>{children}</Typography> + </Box> + )} + </div> + ); +} + +TabPanel.propTypes = { + children: PropTypes.node, + index: PropTypes.any.isRequired, + value: PropTypes.any.isRequired, +}; + +function a11yProps(index) { + return { + id: `nav-tab-${index}`, + "aria-controls": `nav-tabpanel-${index}`, + }; +} +export default function AppBarAdmin() { + const [value, setValue] = React.useState(0); + + const handleChange = (event, newValue) => { + setValue(newValue); + }; + + return ( + <AppBar position="sticky" color="default"> + <Tabs + variant="scrollable" + scrollButtons="on" + value={value} + onChange={handleChange} + aria-label="nav tabs example" + > + { + TabsItens.map((label, index) => ( + <Tab + key={label.href} + label={label.label} + to={label.href} + icon={label.icon} + component={Link} + {...a11yProps(index)} + /> + )) + } + </Tabs> + </AppBar> + ) +} \ No newline at end of file diff --git a/src/Admin/Components/Components/DataCard.js b/src/Admin/Components/Components/DataCard.js new file mode 100644 index 0000000000000000000000000000000000000000..9f5c565d6374808b1a0abc830cdfaba9e805881a --- /dev/null +++ b/src/Admin/Components/Components/DataCard.js @@ -0,0 +1,140 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState } from "react"; +// Maerial ui components +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import ButtonGroup from "@material-ui/core/ButtonGroup"; +import { useStyles } from "../Styles/DataCard"; +// Icons +import EditRoundedIcon from "@material-ui/icons/EditRounded"; +import ArrowBackIosIcon from "@material-ui/icons/ArrowBackIos"; + +const DataCard = (params) => { + console.log(params) + return( + <div> + {params.data} + </div> + ) + // const classes = useStyles(); + // const [edit, setEdit] = useState(false); + + // const buttonArr = [ + // { + // label: "Listar", + // icon: <ListRoundedIcon />, + // }, + // edit + // ? { + // label: "Voltar", + // icon: <ArrowBackIosIcon />, + // } + // : { + // label: "Editar", + // icon: <EditRoundedIcon />, + // }, + // ]; + + // //Change state of the var edit + // const EditHandler = () => { + // setEdit(!edit); + // }; + + // // it stores an function that will be called when a button is clicked + // const functionArr = [props.viewData, EditHandler]; + + // return ( + // edit ? + // <Card className={classes.root} variant="outlined"> + // <CardContent> + // <div className={classes.displayRow}> + // <Typography + // className={classes.title} + // color="inherit" + // gutterBottom + // > + // {props.data[1].prop} + // </Typography> + // <ButtonGroup + // color="primary" + // aria-label="outlined primary button group" + // > + // {buttonArr.map((button, index) => ( + // <Button onClick={functionArr[index]}> + // <div className={classes.displayRow}> + // {button.icon} + // {button.label} + // </div> + // </Button> + // ))} + // </ButtonGroup> + // </div> + + // {/* Display the edit area */} + // {props.component} + + // </CardContent> + // </Card> + // : + // <Card className={classes.root} variant="outlined"> + // <CardContent> + // <div className={classes.displayRow}> + // <Typography + // className={classes.title} + // color="inherit" + // gutterBottom + // > + // {props.data[1].prop} + // </Typography> + // <ButtonGroup + // color="primary" + // aria-label="outlined primary button group" + // > + // {buttonArr.map((button, index) => ( + // <Button onClick={functionArr[index]}> + // <div className={classes.displayRow}> + // {button.icon} + // {button.label} + // </div> + // </Button> + // ))} + // </ButtonGroup> + // </div> + // {props.data.map((info , index) => ( + // <div className={classes.displayColumn} key={index}> + // <Typography color="initial" className={classes.subTitle}> + // {info.subTitle} + // </Typography> + // <Typography color='textSecondary'> + // { + // info.prop === null ? 'Sem dados' : info.prop + // } + // </Typography> + // </div> + // ))} + // </CardContent> + // </Card> + // ); +} + +export default DataCard; diff --git a/src/Admin/Components/Components/DataCards/ActivityCard.js b/src/Admin/Components/Components/DataCards/ActivityCard.js new file mode 100644 index 0000000000000000000000000000000000000000..915df2f99fdb31c17741d362555721f14a3753f9 --- /dev/null +++ b/src/Admin/Components/Components/DataCards/ActivityCard.js @@ -0,0 +1,142 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +import moment from 'moment'; +// Maerial ui components +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import { useStyles } from "../../Styles/DataCard"; +import Grid from "@material-ui/core/Grid"; +//imports from local files +import { GetAData } from "../../../Filters"; +import { getRequest } from '../../../../Components/HelperFunctions/getAxiosConfig'; +import { Link } from 'react-router-dom' +import LoadingSpinner from '../../../../Components/LoadingSpinner'; + +const ActivityCard = () => { + const classes = useStyles(); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [item, setItem] = useState({}); //Necessary to consult the API, data + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + //getting data from server + useEffect(() => { + const urlParams = new URLSearchParams(window.location.search); + const query = urlParams.get("activity"); + getRequest(GetAData("activities", query), + (data, header) => { + setItem(data); + setIsLoaded(true); + setError(false); + }, + (error) => { + setIsLoaded(true); + setError(true); + } + ) + }, []); + + if (error) { + return <div>Houve um erro</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + console.log(item) + const DATA = [ + { + subTitle: "ID", + prop: item.id, + }, + { + subTitle: "DONO(A)", + prop: item.owner === null ? '' : item.owner.name + }, + { + subTitle: "Trackable type", + prop: item["trackable_type"], + }, + { + subTitle: "Atividade", + prop: item.activity, + }, + { + subTitle: "Privacidade", + prop: item.privacy, + }, + { + subTitle: "Criado em", + prop: DisplayDate(item["created_at"]), + }, + { + subTitle: "Recipient type", + prop: item["recipient_type"], + }, + + ]; + + return ( + <Card> + <CardContent> + <Grid container xs={12} justify="space-between" alignItems="center" alignContent="center"> + <Grid item> + <Typography className={classes.title} color="inherit" gutterBottom> + {item.id} + </Typography> + </Grid> + <Grid item> + <Link style={{ textDecoration: 'none' }} to={`/admin/activities`}> + <Button + startIcon={<ListRoundedIcon />} + color="primary" + variant="outlined" + > + Listar + </Button> + </Link> + </Grid> + </Grid> + <div style={{ height: "1em" }} /> + {DATA.map((info, index) => ( + <div className={classes.displayColumn} key={index}> + <Typography color="initial" className={classes.subTitle}> + {info.subTitle} + </Typography> + <Typography color="textSecondary"> + {info.prop === null ? "Sem dados" : info.prop} + </Typography> + </div> + ))} + </CardContent> + </Card> + ); + } +}; + +export default ActivityCard; diff --git a/src/Admin/Components/Components/DataCards/CollectionCard.js b/src/Admin/Components/Components/DataCards/CollectionCard.js new file mode 100644 index 0000000000000000000000000000000000000000..a4ef28da2b30bdff799545b79d7936b5415e19ca --- /dev/null +++ b/src/Admin/Components/Components/DataCards/CollectionCard.js @@ -0,0 +1,219 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +import moment from 'moment'; +// Maerial ui components +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import { useStyles } from "../../Styles/DataCard"; +import Grid from '@material-ui/core/Grid'; +// Icons +import EditRoundedIcon from "@material-ui/icons/EditRounded"; +import DeleteRoundedIcon from "@material-ui/icons/DeleteRounded"; +//imports from local files +import { GetAData, DeleteFilter } from "../../../Filters"; +import { Link, useHistory } from 'react-router-dom' +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import SnackBar from '../../../../Components/SnackbarComponent'; +import { getRequest, deleteRequest } from '../../../../Components/HelperFunctions/getAxiosConfig'; + +const CollectionCard = () => { + let history = useHistory() + const classes = useStyles(); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("collection"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [item, setItem] = useState({}); //Necessary to consult the API, data + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + + //Called when user want to delete one institution + async function DeleteHandler() { + deleteRequest( + DeleteFilter("collections", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + else { + HandleSnack( + "A Coleção foi deletada com sucesso", + true, + "success", + "#228B22" + ); + history.goBack() + } + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + } + ); + } + + useEffect(() => { + getRequest( + GetAData("collections", id), + (data, header) => { + setItem(data); + setIsLoaded(true); + setError(false); + }, + (error) => { + setIsLoaded(true); + setError(true); + } + ) + }, []); + + if (error) { + return <div>Houve um erro</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + const DATA = [ + { + subTitle: "ID", + prop: item.id, + }, + { + subTitle: "Nome", + prop: item.name, + }, + { + subTitle: "Descrição", + prop: item.description, + }, + { + subTitle: "Endereço", + prop: item.owner ? item.owner.name : null, + }, + { + subTitle: "Score", + prop: item.score, + }, + { + subTitle: "Privacidade", + prop: item.privacy, + }, + { + subTitle: "Criação", + prop: DisplayDate(item.created_at), + }, + { + subTitle: "Atualização", + prop: DisplayDate(item.updated_at), + }, + ]; + + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid xs={12} justify="space-between" alignItems="center" container> + <Grid item> + <Typography className={classes.title} color="inherit" gutterBottom> + {item.name} + </Typography> + </Grid> + <Grid item> + <Link style={{ textDecoration: 'none' }} to={`/admin/Collections`}> + <Button + startIcon={<ListRoundedIcon />} + color="primary" + variant="outlined" + > + Listar + </Button> + </Link> + + <Link style={{ textDecoration: 'none' }} to={`/admin/EditCollection?collection=${item.id}`}> + <Button + startIcon={<EditRoundedIcon />} + color="primary" + variant="outlined" + > + Editar + </Button> + </Link> + + <Button + startIcon={<DeleteRoundedIcon />} + color="secondary" + variant="outlined" + onClick={DeleteHandler} + > + Deletar + </Button> + </Grid> + </Grid> + <div style={{ height: "1em" }} /> + {DATA.map((info, index) => ( + <div className={classes.displayColumn} key={index}> + <Typography color="initial" className={classes.subTitle}> + {info.subTitle} + </Typography> + <Typography color="textSecondary"> + {info.prop === null ? "Sem dados" : info.prop} + </Typography> + </div> + ))} + </CardContent> + </Card> + ); + } +}; + +export default CollectionCard; diff --git a/src/Admin/Components/Components/DataCards/CommunityQuestionCard.js b/src/Admin/Components/Components/DataCards/CommunityQuestionCard.js new file mode 100644 index 0000000000000000000000000000000000000000..b8ae952c3dabc4ff4c7fd73ceb45a6d3123972b1 --- /dev/null +++ b/src/Admin/Components/Components/DataCards/CommunityQuestionCard.js @@ -0,0 +1,163 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from "react"; +import moment from 'moment'; +// Maerial ui components +import Card from "@material-ui/core/Card"; +import Grid from "@material-ui/core/Grid"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import { useStyles } from "../../Styles/DataCard"; +// Icons +import EmailRoundedIcon from '@material-ui/icons/EmailRounded'; +//imports from local files +import { GetAData } from "../../../Filters"; +import { Store } from '../../../../Store'; +import { Link } from 'react-router-dom' +import Unauthorized from "../Unauthorized"; +import { getRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import LoadingSpinner from '../../../../Components/LoadingSpinner'; + +const CommunityQuestions = () => { + const { state } = useContext(Store); + const classes = useStyles(); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [item, setItem] = useState({});//Necessary to consult the API, data + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + useEffect(() => { + const urlParams = new URLSearchParams(window.location.search); + const query = urlParams.get("question"); + getRequest( + GetAData("contacts", query), + (data, header) => { + setItem(data); + setIsLoaded(true); + setError(false); + }, + (error) => { + setIsLoaded(true); + setError(true); + } + ) + }, []); + + if (error) { + return <div>Houve um erro</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else if (CheckUserPermission()) { + const DATA = [ + { + subTitle: "ID", + prop: item.id, + }, + { + subTitle: "Nome", + prop: item.name, + }, + { + subTitle: "Email", + prop: + item.email ? + <Link to={`/admin/sendEmail/?email=${item.email}`} style={{ textDecoration: 'none' }}> + <Button + variant='text' + color='primary' + startIcon={<EmailRoundedIcon />} + > + {item.email} + </Button> + </Link> : null + }, + { + subTitle: "Mensagem", + prop: item.message, + }, + { + subTitle: "Criado em", + prop: DisplayDate(item.created_at), + }, + ]; + + return ( + <Card> + <CardContent> + <Grid direction="row" justify="space-between" alignContent="center" alignItems="center" container> + <Grid item> + <Typography className={classes.title} color="inherit" gutterBottom> + {item.name} + </Typography> + </Grid> + <Grid> + <Link style={{ textDecoration: 'none' }} to={`/admin/CommunityQuestions`}> + <Button + startIcon={<ListRoundedIcon />} + color="primary" + variant="outlined" + > + Listar + </Button> + </Link> + </Grid> + </Grid> + <div style={{ height: "1em" }} /> + {DATA.map((info, index) => ( + <div className={classes.displayColumn} key={index}> + <Typography color="initial" className={classes.subTitle}> + {info.subTitle} + </Typography> + <Typography color="textSecondary"> + {info.prop === null ? "Sem dados" : info.prop} + </Typography> + </div> + ))} + </CardContent> + </Card> + ); + } else return <Unauthorized /> +}; + +export default CommunityQuestions; diff --git a/src/Admin/Components/Components/DataCards/ComplaintsCard.js b/src/Admin/Components/Components/DataCards/ComplaintsCard.js new file mode 100644 index 0000000000000000000000000000000000000000..4c3fc1337f6c2a18d26e20b9191f46bfe003ed1a --- /dev/null +++ b/src/Admin/Components/Components/DataCards/ComplaintsCard.js @@ -0,0 +1,866 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +import moment from 'moment'; +// Maerial ui components +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import Paper from "@material-ui/core/Paper"; +import Grid from "@material-ui/core/Grid"; +import Divider from "@material-ui/core/Divider"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import GetAppRoundedIcon from "@material-ui/icons/GetAppRounded"; +import LaunchRoundedIcon from "@material-ui/icons/LaunchRounded"; +import RemoveRoundedIcon from "@material-ui/icons/RemoveRounded"; +import RestoreRoundedIcon from "@material-ui/icons/RestoreRounded"; +import { useStyles } from "../../Styles/DataCard"; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import VisibilityIcon from "@material-ui/icons/Visibility"; +import CircularProgress from '@material-ui/core/CircularProgress'; +//imports from local files +import { GetAData, MethodsToComplain } from "../../../Filters"; +import { Link } from "react-router-dom"; +import { CardActions } from "@material-ui/core"; +import { apiDomain } from '../../../../env'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import SnackBar from '../../../../Components/SnackbarComponent'; +import { getRequest, postRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +//styles + +const PORTAL_MEC = "https://plataformaintegrada.mec.gov.br/"; + +const CollectionCard = () => { + const classes = useStyles(); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("id"); + + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [item, setItem] = useState({}); //Necessary to consult the API, data + const [complainedObject, setComplainedObject] = useState(null);//stores the data from complained object + const [contentModal, setContentModal] = useState(""); + const [titleModal, setTitleModal] = useState(""); + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const [loadingObject, setLoadingObject] = useState(false); + const [open, setOpen] = React.useState(false); + const [scroll, setScroll] = React.useState('paper'); + + const handleClose = () => { + setOpen(false); + }; + + const descriptionElementRef = React.useRef(null); + React.useEffect(() => { + if (open) { + const { current: descriptionElement } = descriptionElementRef; + if (descriptionElement !== null) { + descriptionElement.focus(); + } + } + }, [open]); + + const convertToLink = (type, id) => { + switch (type) { + case "LearningObject": + return `recurso?id=${id}/`; + case "User": + return `usuario-publico/${id}/`; + default: + return ""; + } + }; + + const handleClickOpen = (scrollType) => async () => { + setLoadingObject(true); + setOpen(true); + setScroll(scrollType); + + if (!complainedObject) { + getRequest( + GetAData("learning_objects", item.complainable_id), + (data, header) => { + HandleContentModal(data); + setComplainedObject(data) + setLoadingObject(false); + }, + (error) => { + HandleContentModal(); + setLoadingObject(false); + } + ) + } else { + HandleContentModal(complainedObject); + setLoadingObject(false); + } + }; + + const ComplaintStatus = (status, type) => { + switch (status) { + case "accepted": + return ( + <Paper + className={classes.marginTop} + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#FA8072", + fontWeight: "500", + color: "#FFFAFA", + }} + > + { + type === "User" ? "BLOQUEADO" : "REMOVIDO" + } + </Paper> + ); + case "complained": + return ( + <Paper + className={classes.marginTop} + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#FF8C00", + fontWeight: "500", + color: "#FFFAFA", + }} + > + PENDENTE + </Paper> + ); + case "rejected": + return ( + <Paper + className={classes.marginTop} + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#228B22", + fontWeight: "500", + color: "#FFFAFA", + }} + > + AVALIADO + </Paper> + ); + default: + return "NOTHING"; + } + }; + + const reloadData = () => { + setIsLoaded(false) + getRequest( + GetAData("complaints", id), + (data, header) => { + setItem(data) + setIsLoaded(true); + setError(false); + }, + (error) => { + setError(true); + } + ) + } + + const HandleComplainUser = (option) => { + const body = { + "option": option ? option : null, + "complaints": [ + { + "id": item.id, + "state": option ? "accept" : "reject" + } + + ] + } + postRequest( + `/complaints/${item.complainable_id}/treat_related`, + body, + (data) => { + if (data.errors) + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + else { + HandleSnack('Alteração feito com sucesso!', true, 'success', '#228B22') + reloadData() + } + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + } + ) + } + + const Actions = (status, type) => { + switch (status) { + case "complained": + return ( + type === "User" ? + <Grid container spacing={2}> + <Grid item xs={12} spacing={2}> + <Button + style={{ + width: "100%", + color: "#FFFAFA", + backgroundColor: "#FFA07A", + fontWeight: "500", + }} + variant="contained" + onClick={() => { + HandleComplainUser() + }} + > + Recusar + </Button> + </Grid> + <Grid item xs={12}> + <Button + style={{ + width: "100%", + color: "#FFFAFA", + backgroundColor: "#FA8072", + fontWeight: "500", + }} + variant="contained" + onClick={() => { + HandleComplainUser("blocked") + }} + > + Bloqueio semanal + </Button> + </Grid> + <Grid item xs={12}> + <Button + style={{ + width: "100%", + color: "#FFFAFA", + backgroundColor: "red", + fontWeight: "500", + }} + variant="contained" + onClick={() => { + HandleComplainUser("banished") + }} + > + Bloqueio permanente + </Button> + </Grid> + </Grid> + : + <> + <Grid + container + className={classes.marginTop} + direction="row" + justify="space-between" + alignItems="center" + > + <Grid item> + <Typography + color="initial" + className={classes.subTitle} + variant="h6" + > + Remover o recurso e notificar o autor + </Typography> + </Grid> + <Grid item> + <Button + style={{ + color: "#FFFAFA", + backgroundColor: "#FA8072", + fontWeight: "500", + }} + variant="contained" + onClick={() => HandleComplainObj("accept")} + startIcon={ + <RemoveRoundedIcon style={{ fill: "#FFFAFA" }} /> + } + > + Remover + </Button> + </Grid> + </Grid> + + <Divider className={classes.marginTop} /> + + <Grid + container + className={classes.marginTop} + direction="row" + justify="space-between" + alignItems="center" + > + <Grid item> + <Typography + color="initial" + className={classes.subTitle} + variant="h6" + > + Reativar o recurso na plataforma + </Typography> + </Grid> + <Grid item> + <Button + style={{ + color: "#FFFAFA", + backgroundColor: "#228B22", + fontWeight: "500", + }} + variant="contained" + onClick={() => HandleComplainObj("reject")} + startIcon={ + <RestoreRoundedIcon style={{ fill: "#FFFAFA" }} /> + } + > + Ativar + </Button> + </Grid> + </Grid> + </> + ); + default: + return "Essa denúncia já foi avaliado!"; + } + } + + const DisplayButtonsArea = (type) => { + switch (type) { + case "User": + return ( + <CardActions> + <Link to={`/admin/user?id=${item.complainable_id}`}> + <Button + variant="contained" + color="primary" + startIcon={<VisibilityIcon />} + > + Visualizar usuário + </Button> + </Link> + <Button + style={{ + fontWeight: "500", + backgroundColor: "#FA8072" + }} + variant="contained" + startIcon={<LaunchRoundedIcon style={{ fill: "#FFFAFA" }} />} + > + <a + style={{ textDecoration: "none", color: "#FFFAFA" }} + target="_blank" + rel="noreferrer" + href={ + PORTAL_MEC + + convertToLink( + item.complainable_type, + item.complainable_id + ) + } + > + MEC RED + </a> + </Button> + </CardActions> + ) + default: + return ( + <CardActions> + <Button + variant="contained" + color="primary" + startIcon={<GetAppRoundedIcon />} + onClick={handleClickOpen('paper')} + > + Veja o recurso + </Button> + <Button + style={{ + fontWeight: "500", + backgroundColor: "#FA8072" + }} + variant="contained" + startIcon={<LaunchRoundedIcon style={{ fill: "#FFFAFA" }} />} + > + <a + style={{ textDecoration: "none", color: "#FFFAFA" }} + target="_blank" + rel="noreferrer" + href={ + PORTAL_MEC + + convertToLink( + item.complainable_type, + item.complainable_id + ) + } + > + MEC RED + </a> + </Button> + </CardActions> + ) + } + } + + const HandleContentModal = (data) => { + const ok = data ? true : false; + + if (ok) { + const importantData = [ + { + subTitle: "ID", + prop: data.id, + }, + { + subTitle: "Nome", + prop: data.name, + }, + { + subTitle: "Descrição", + prop: data.description, + }, + { + subTitle: "Dono(a)", + prop: data.publisher.name, + }, + { + subTitle: "Autor(a)", + prop: data.author, + }, + { + subTitle: "Score", + prop: data.score, + }, + { + subTitle: "Status", + prop: data.state, + }, + { + subTitle: "Criado em", + prop: data.created_ats + }, + { + subTitle: "Atualizado em", + prop: DisplayDate(data.updated_at) + }, + { + subTitle: "Criado em", + prop: DisplayDate(data.created_at) + }, + { + subTitle: "Visualizações", + prop: data.views_count, + }, + { + subTitle: "Likes", + prop: data.likes_count, + }, + { + subTitle: "Avaliação média", + prop: data.review_average, + }, + { + subTitle: "Likes", + prop: data.likes_count, + }, + { + subTitle: "Linguagem", + prop: ( + <div + style={{ + display: "flex", + flexDirection: "row", + flexWrap: "wrap", + justifyContent: "Space-between", + }} + > + {data.language.map((lan, index) => ( + <Paper + elevation={3} + key={index} + style={{ + borderRadius: 18, + padding: "0.8em", + marginBottom: "1em", + marginRight: "1em", + backgroundColor: "#D3D3D3", + fontSize: 14, + }} + > + {lan.name} + </Paper> + ))} + </div> + ), + }, + { + subTitle: "Tipo de recurso", + prop: data.object_type, + }, + ] + + setContentModal( + <Grid container> + <Grid item justify="flex-start" alignItems="center" alignContent="center"> + {data.thumbnail ? ( + <Grid item style={{ marginTop: "1em", marginBottom: "1em", alignSelf: "center" }}> + <a target="_blank" rel="noreferrer" href={apiDomain + data.thumbnail}> + {" "} + <img src={apiDomain + data.thumbnail} alt="" />{" "} + </a> + </Grid> + ) : null} + {importantData.map((info, index) => ( + <Grid item className={classes.displayColumn} key={index}> + <Typography color="textPrimary"> + {info.subTitle} + </Typography> + <Typography color="textSecondary"> + {info.prop === null ? "Sem dados" : info.prop} + </Typography> + </Grid> + ))} + </Grid> + </Grid> + ) + setTitleModal(data.name) + + } else { + setTitleModal("IndisponÃvel"); + setContentModal("Não foi possÃvel encontrar!") + } + } + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData).format("LLL").toString(); + } + + const HandleComplainObj = async (method) => { + postRequest( + MethodsToComplain("complaints", id, method), + {}, + (data) => { + if (data.errors) + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + else { + HandleSnack('Alteração feito com sucesso', true, 'success', '#228B22') + reloadData() + } + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + } + ) + } + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + useEffect(() => { + getRequest( + GetAData("complaints", id), + (data, header) => { + setItem(data) + setIsLoaded(true); + setError(false); + }, + (error) => { + setError(true); + } + ) + }, []); + + if (error) { + return <div>Houve um erro</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + const DATA = [ + { + subTitle: "ID", + prop: item.id, + }, + { + subTitle: "State", + prop: item.state, + }, + { + subTitle: "Descrição", + prop: item.description, + }, + { + subTitle: "Status", + prop: item.complaint_reason.status, + }, + { + subTitle: "Motivo", + prop: item.complaint_reason.reason, + }, + { + subTitle: "Criado", + prop: DisplayDate(item.created_at), + }, + { + subTitle: "User", + prop: item.user_id, + }, + ]; + + return ( + <Grid + container + spacing={3} + sm={12} + xs={12} + > + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <Grid + item + md={6} + xs={12} + > + <Card> + <CardContent> + <Grid container justify="space-between"> + <Grid item> + <Typography + className={classes.title} + color="inherit" + gutterBottom + > + Denuncia: + </Typography> + <Typography + className={classes.title} + color="inherit" + gutterBottom + > + { + + item.complainable_type === "User" ? `Usuário #${item.complainable_id}` : `Recurso #${item.complainable_id}` + } + </Typography> + </Grid> + <Grid item> + <Link + style={{ textDecoration: "none" }} + to={`/admin/complaints`} + > + <Button + startIcon={<ListRoundedIcon />} + color="primary" + variant="outlined" + > + Listar + </Button> + </Link> + </Grid> + </Grid> + <div style={{ height: "1em" }} /> + {DATA.map((info, index) => ( + <div className={classes.displayColumn} key={index}> + <Typography color="initial" className={classes.subTitle}> + {info.subTitle} + </Typography> + <Typography color="textSecondary"> + {info.prop === null ? "Sem dados" : info.prop} + </Typography> + </div> + ))} + </CardContent> + { + DisplayButtonsArea(item.complainable_type) + } + </Card> + </Grid> + + <Grid + item + md={6} + xs={12} + > + <Grid item> + <Card> + <CardContent> + <Typography variant="h5" component="h2"> + Denúncia #{item.id} + </Typography> + + {ComplaintStatus(item.state, item.complainable_type)} + + <Grid container className={classes.marginTop}> + <Grid item> + <Typography + color="textSecondary" + className={classes.subTitle} + variant="h6" + > + Descrição + </Typography> + <Typography color="initial">{item.description}</Typography> + </Grid> + </Grid> + + <Grid + container + direction="row" + justify="space-between" + alignItems="center" + className={classes.marginTop} + > + <Grid item> + <Typography + color="textSecondary" + className={classes.subTitle} + > + Data + </Typography> + <Typography color="initial"> + {DisplayDate(item.created_at)} + </Typography> + </Grid> + + <Grid item> + <Typography + color="textSecondary" + className={classes.subTitle} + > + Denunciante + </Typography> + <Typography color="initial">{item.user_id}</Typography> + </Grid> + </Grid> + + <Divider className={classes.marginTop} /> + + <Grid container className={classes.marginTop}> + <Grid item> + <Typography + color="textSecondary" + className={classes.subTitle} + variant="h6" + > + Motivo + </Typography> + <Typography color="initial"> + {item.complaint_reason.reason} + </Typography> + </Grid> + </Grid> + + <Grid container className={classes.marginTop}> + <Grid item> + <Typography + color="textSecondary" + className={classes.subTitle} + variant="h6" + > + Status + </Typography> + <Typography color="initial"> + {item.complaint_reason.status} + </Typography> + </Grid> + </Grid> + </CardContent> + </Card> + </Grid> + + <Grid item className={classes.marginTop}> + <Card> + <CardContent> + <Typography variant="h5" component="h2"> + Ações + </Typography> + { + Actions(item.state, item.complainable_type) + } + </CardContent> + </Card> + </Grid> + </Grid> + + <Dialog + open={open} + onClose={handleClose} + scroll={scroll} + aria-labelledby="scroll-dialog-title" + aria-describedby="scroll-dialog-description" + > + <DialogTitle id="scroll-dialog-title"> + { + loadingObject ? <CircularProgress size={24} /> : titleModal + } + </DialogTitle> + <DialogContent dividers={scroll === 'paper'}> + <DialogContentText + id="scroll-dialog-description" + ref={descriptionElementRef} + tabIndex={-1} + > + { + loadingObject ? <CircularProgress size={24} /> : contentModal + } + </DialogContentText> + </DialogContent> + <DialogActions> + <Button onClick={handleClose} color="primary"> + Fechar + </Button> + </DialogActions> + </Dialog> + </Grid> + ); + } +}; + +export default CollectionCard; diff --git a/src/Admin/Components/Components/DataCards/EducationalObjectsCard.js b/src/Admin/Components/Components/DataCards/EducationalObjectsCard.js new file mode 100644 index 0000000000000000000000000000000000000000..08a8f3255e1015758e98373e8c2d7e25c70cd05e --- /dev/null +++ b/src/Admin/Components/Components/DataCards/EducationalObjectsCard.js @@ -0,0 +1,323 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +import moment from "moment"; +// Maerial ui components +import Card from "@material-ui/core/Card"; +import Paper from "@material-ui/core/Paper"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import VisibilityIcon from "@material-ui/icons/Visibility"; +import EditRoundedIcon from "@material-ui/icons/EditRounded"; +import { useStyles } from "../../Styles/DataCard"; +import DeleteRoundedIcon from "@material-ui/icons/DeleteRounded"; +//imports from local files +import { GetAData, DeleteFilter } from "../../../Filters"; +import { Link, useHistory } from "react-router-dom"; +import { apiUrl, apiDomain } from "../../../../env"; +import { Grid } from "@material-ui/core"; +import LoadingSpinner from "../../../../Components/LoadingSpinner"; +import { + getRequest, + deleteRequest, +} from "../../../../Components/HelperFunctions/getAxiosConfig"; +import SnackBar from "../../../../Components/SnackbarComponent"; + +const CommunityQuestions = () => { + const classes = useStyles(); + let history = useHistory(); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("learnObj"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [item, setItem] = useState({}); //Necessary to consult the API, data + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + async function DeleteHandler() { + deleteRequest( + DeleteFilter("learning_objects", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + else { + HandleSnack( + "O objeto educacional foi deletada com sucesso", + true, + "success", + "#228B22" + ); + history.goBack(); + } + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + } + ); + } + + useEffect(() => { + getRequest( + GetAData("learning_objects", id), + (data, header) => { + setItem(data); + setIsLoaded(true); + setError(false); + }, + (error) => { + setIsLoaded(true); + setError(true); + } + ); + }, []); + + if (error) { + return <div>Houve um erro</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." />; + } else { + console.log(item); + const DATA = [ + { + subTitle: "ID", + prop: item.id, + }, + { + subTitle: "Nome", + prop: item.name, + }, + { + subTitle: "Descrição", + prop: item.description, + }, + { + subTitle: "Dono(a)", + prop: item.publisher.name, + }, + { + subTitle: "Autor(a)", + prop: item.author, + }, + { + subTitle: "Score", + prop: item.score, + }, + { + subTitle: "Status", + prop: item.state, + }, + { + subTitle: "Criado em", + prop: DisplayDate(item.created_at), + }, + { + subTitle: "Atualizado em", + prop: DisplayDate(item.updated_at), + }, + { + subTitle: "Visualizações", + prop: item.views_count, + }, + { + subTitle: "Likes", + prop: item.likes_count, + }, + { + subTitle: "Avaliação média", + prop: item.review_average, + }, + { + subTitle: "Likes", + prop: item.likes_count, + }, + { + subTitle: "Linguagem", + prop: ( + <div + style={{ + display: "flex", + flexDirection: "row", + flexWrap: "wrap", + justifyContent: "Space-between", + }} + > + {item.language.map((lan, index) => ( + <Paper + elevation={3} + key={index} + style={{ + borderRadius: 18, + padding: "0.8em", + marginBottom: "1em", + marginRight: "1em", + backgroundColor: "#D3D3D3", + fontSize: 14, + }} + > + {lan.name} + </Paper> + ))} + </div> + ), + }, + { + subTitle: "Tipo de recurso", + prop: item.object_type, + }, + ]; + + return ( + <Card variant="outlined"> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + <CardContent> + <Grid + container + xs={12} + display="row" + justify="space-between" + alignItems="center" + alignContent="space-between" + > + <Grid item> + <Typography + className={classes.title} + color="inherit" + gutterBottom + > + {item.name} + </Typography> + </Grid> + <Grid item> + <Link + style={{ textDecoration: "none" }} + to={`/admin/learningObjects`} + > + <Button + startIcon={<ListRoundedIcon />} + color="primary" + variant="outlined" + > + Listar + </Button> + </Link> + <Button + startIcon={<VisibilityIcon />} + color="primary" + variant="outlined" + > + <a + style={{ textDecoration: "none" }} + rel="noreferrer" + target="_blank" + href={ + apiUrl + + "/learning_objects/" + + id + + "/download" + } + > + Ver recurso + </a> + </Button> + <Link + style={{ textDecoration: "none" }} + to={`/admin/learningObjectEdit?learnObj=${item.id}`} + > + <Button + startIcon={<EditRoundedIcon />} + color="primary" + variant="outlined" + > + Editar + </Button> + </Link> + <Button + startIcon={<DeleteRoundedIcon />} + color="secondary" + variant="outlined" + onClick={DeleteHandler} + > + Deletar + </Button> + </Grid> + </Grid> + <div style={{ height: "1em" }} /> + {item.thumbnail ? ( + <div style={{ marginTop: "1em", marginBottom: "1em" }}> + <a target="_blank" rel="noreferrer" href={apiDomain + item.thumbnail}> + {" "} + <img src={apiDomain + item.thumbnail} alt="" />{" "} + </a> + </div> + ) : null} + + {DATA.map((info, index) => ( + <div className={classes.displayColumn} key={index}> + <Typography color="initial" className={classes.subTitle}> + {info.subTitle} + </Typography> + <Typography color="textSecondary"> + {info.prop === null ? "Sem dados" : info.prop} + </Typography> + </div> + ))} + </CardContent> + </Card> + ); + } +}; + +export default CommunityQuestions; diff --git a/src/Admin/Components/Components/DataCards/InstitutionsCard.js b/src/Admin/Components/Components/DataCards/InstitutionsCard.js new file mode 100644 index 0000000000000000000000000000000000000000..b4981b7bb93715a8bbfa0bc94f8d85e628df3416 --- /dev/null +++ b/src/Admin/Components/Components/DataCards/InstitutionsCard.js @@ -0,0 +1,218 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +import moment from 'moment' +// Maerial ui components +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import { useStyles } from "../../Styles/DataCard"; +import Grid from '@material-ui/core/Grid'; +// Icons +import EditRoundedIcon from "@material-ui/icons/EditRounded"; +import DeleteRoundedIcon from "@material-ui/icons/DeleteRounded"; +//imports from local files +import { GetAData, DeleteFilter } from "../../../Filters"; +import { getRequest, deleteRequest } from '../../../../Components/HelperFunctions/getAxiosConfig'; +import { Link, useHistory } from 'react-router-dom'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import SnackBar from '../../../../Components/SnackbarComponent'; + +const InstitutionCard = () => { + const classes = useStyles(); + let history = useHistory(); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("institution"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + + const [item, setItem] = useState({}); //Necessary to consult the API, data + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + async function DeleteHandler() { + deleteRequest( + DeleteFilter("institutions", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + else { + HandleSnack( + "A instituição foi deletada com sucesso", + true, + "success", + "#228B22" + ); + history.goBack() + } + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + } + ); + } + + useEffect(() => { + getRequest( + GetAData('institutions', id), + (data, header) => { + setIsLoaded(true); + setItem(data); + }, + (error) => { + setIsLoaded(true); + setError(error); + } + ) + }, []); + + if (error) { + return <div>Houve um erro</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + const DATA = [ + { + subTitle: "ID", + prop: item.id, + }, + { + subTitle: "Nome", + prop: item.name, + }, + { + subTitle: "Descrição", + prop: item.description, + }, + { + subTitle: "Endereço", + prop: item.address, + }, + { + subTitle: "Cidade", + prop: item.city, + }, + { + subTitle: "PaÃs", + prop: item.country, + }, + { + subTitle: "Criação", + prop: DisplayDate(item.created_at), + }, + { + subTitle: "Atualizado", + prop: DisplayDate(item.updated_at), + }, + ]; + + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container xs={12} justify="space-between" alignItems="center" alignContent="center"> + <Grid item> + <Typography className={classes.title} color="inherit" gutterBottom> + {item.name} + </Typography> + </Grid> + <Grid item> + <Link style={{ textDecoration: 'none' }} to={`/admin/intitutions`}> + <Button + startIcon={<ListRoundedIcon />} + color="primary" + variant="outlined" + > + Listar + </Button> + </Link> + + <Link style={{ textDecoration: 'none' }} to={`/admin/institutionEdit?institution=${item.id}`}> + <Button + startIcon={<EditRoundedIcon />} + color="primary" + variant="outlined" + > + Editar + </Button> + </Link> + + <Button + startIcon={<DeleteRoundedIcon />} + color="secondary" + variant="outlined" + onClick={DeleteHandler} + > + Deletar + </Button> + </Grid> + </Grid> + <div style={{ height: "1em" }} /> + {DATA.map((info, index) => ( + <div className={classes.displayColumn} key={index}> + <Typography color="initial" className={classes.subTitle}> + {info.subTitle} + </Typography> + <Typography color="textSecondary"> + {info.prop === null ? "Sem dados" : info.prop} + </Typography> + </div> + ))} + </CardContent> + </Card> + ); + } +}; + +export default InstitutionCard; diff --git a/src/Admin/Components/Components/DataCards/NoteVarCard.js b/src/Admin/Components/Components/DataCards/NoteVarCard.js new file mode 100644 index 0000000000000000000000000000000000000000..7c7b4356f9f174607e330987ee15081724b080e8 --- /dev/null +++ b/src/Admin/Components/Components/DataCards/NoteVarCard.js @@ -0,0 +1,148 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +import moment from 'moment'; +// Maerial ui components +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import Grid from "@material-ui/core/Grid"; +import { useStyles } from "../../Styles/DataCard"; +// Icons +import EditRoundedIcon from "@material-ui/icons/EditRounded"; +//imports from local files +import { GetAData } from "../../../Filters"; +import { getRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import { Link } from 'react-router-dom'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; + +const NoteCard = () => { + const classes = useStyles(); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("id"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [item, setItem] = useState({}); //Necessary to consult the API, data + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + + useEffect(() => { + getRequest( + GetAData('scores', id), + (data, header) => { + setIsLoaded(true); + setItem(data); + }, + (error) => { + setIsLoaded(true); + setError(true); + } + ) + }, []); + + if (error) { + return <div>Houve um erro</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + const DATA = [ + { + subTitle: "ID", + prop: item.id, + }, + { + subTitle: "Nome", + prop: item.name, + }, + { + subTitle: "Código", + prop: item.code, + }, + { + subTitle: "Peso", + prop: item.weight, + }, + { + subTitle: "Criação", + prop: DisplayDate(item.created_at), + }, + { + subTitle: "Atualizado", + prop: DisplayDate(item.updated_at), + }, + ] + + return ( + <Card> + <CardContent> + <Grid container xs={12} justify="space-between" alignContent="center" alignItems="center"> + <Grid item> + <Typography className={classes.title} color="inherit" gutterBottom> + {item.name} + </Typography> + </Grid> + <Grid item> + <Link style={{ textDecoration: 'none' }} to={`/admin/noteVars`}> + <Button + startIcon={<ListRoundedIcon />} + color="primary" + variant="outlined" + > + Listar + </Button> + </Link> + + <Link style={{ textDecoration: 'none' }} to={`/admin/noteVarEdit?id=${item.id}`}> + <Button + startIcon={<EditRoundedIcon />} + color="primary" + variant="outlined" + > + Editar + </Button> + </Link> + </Grid> + </Grid> + <div style={{height: "1em"}}/> + {DATA.map((info, index) => ( + <div className={classes.displayColumn} key={index}> + <Typography color="initial" className={classes.subTitle}> + {info.subTitle} + </Typography> + <Typography color="textSecondary"> + {info.prop === null ? "Sem dados" : info.prop} + </Typography> + </div> + ))} + </CardContent> + </Card> + ); + } +}; + +export default NoteCard; diff --git a/src/Admin/Components/Components/DataCards/RatingCard.js b/src/Admin/Components/Components/DataCards/RatingCard.js new file mode 100644 index 0000000000000000000000000000000000000000..b5f69a53c800dce0324ec0afb274a97ce315fc8e --- /dev/null +++ b/src/Admin/Components/Components/DataCards/RatingCard.js @@ -0,0 +1,206 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +import moment from 'moment'; +// Maerial ui components +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import Grid from "@material-ui/core/Grid"; +import { useStyles } from "../../Styles/DataCard"; +// Icons +import EditRoundedIcon from "@material-ui/icons/EditRounded"; +import DeleteRoundedIcon from "@material-ui/icons/DeleteRounded"; +//imports from local files +import { GetAData, DeleteFilter } from "../../../Filters"; +import { getRequest, deleteRequest } from '../../../../Components/HelperFunctions/getAxiosConfig'; +import { Link, useHistory } from 'react-router-dom'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import SnackBar from '../../../../Components/SnackbarComponent'; + +const RatingCard = () => { + const classes = useStyles(); + let history = useHistory(); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("rating"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [item, setItem] = useState({}); //Necessary to consult the API, data + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + async function DeleteHandler() { + deleteRequest( + DeleteFilter("ratings", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + else { + HandleSnack( + "O rating foi deletada com sucesso", + true, + "success", + "#228B22" + ); + history.goBack() + } + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + } + ); + } + + + useEffect(() => { + getRequest( + GetAData('ratings', id), + (data, header) => { + setIsLoaded(true); + setItem(data); + }, + (error) => { + setIsLoaded(true); + setError(true); + } + ) + }, []); + + if (error) { + return <div>Houve um erro</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + const DATA = [ + { + subTitle: "ID", + prop: item.id, + }, + { + subTitle: "Nome", + prop: item.name, + }, + { + subTitle: "Descrição", + prop: item.description, + }, + { + subTitle: "Criado em", + prop: DisplayDate(item.created_at), + }, + { + subTitle: "Atualizado em", + prop: DisplayDate(item.updated_at), + }, + ]; + + return ( + <Card variant="outlined"> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container xs={12} justify="space-between" alignItems="center" alignContent="center"> + <Grid item> + <Typography className={classes.title} color="inherit" gutterBottom> + {item.name} + </Typography> + </Grid> + <Grid item> + <Link style={{ textDecoration: 'none' }} to={`/admin/Ratings`}> + <Button + startIcon={<ListRoundedIcon />} + color="primary" + variant="outlined" + > + Listar + </Button> + </Link> + + <Link style={{ textDecoration: 'none' }} to={`/admin/EditRating?rating=${item.id}`}> + <Button + startIcon={<EditRoundedIcon />} + color="primary" + variant="outlined" + > + Editar + </Button> + </Link> + + <Button + startIcon={<DeleteRoundedIcon />} + color="secondary" + variant="outlined" + onClick={DeleteHandler} + > + Deletar + </Button> + </Grid> + </Grid> + <div style={{ height: "1em" }} /> + {DATA.map((info, index) => ( + <div className={classes.displayColumn} key={index}> + <Typography color="initial" className={classes.subTitle}> + {info.subTitle} + </Typography> + <Typography color="textSecondary"> + {info.prop === null ? "Sem dados" : info.prop} + </Typography> + </div> + ))} + </CardContent> + </Card> + ); + } +}; + +export default RatingCard; diff --git a/src/Admin/Components/Components/DataCards/UserCard.js b/src/Admin/Components/Components/DataCards/UserCard.js new file mode 100644 index 0000000000000000000000000000000000000000..a34f96b390a075eed4c3aed1a28b3baacc968734 --- /dev/null +++ b/src/Admin/Components/Components/DataCards/UserCard.js @@ -0,0 +1,668 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +import moment from 'moment'; +// Maerial ui components +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import Button from "@material-ui/core/Button"; +import Paper from "@material-ui/core/Paper"; +import Grid from "@material-ui/core/Grid"; +import RemoveCircleOutlineRoundedIcon from '@material-ui/icons/RemoveCircleOutlineRounded'; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import Chip from '@material-ui/core/Chip'; +import { useStyles } from "../../Styles/DataCard"; +import EmailRoundedIcon from '@material-ui/icons/EmailRounded'; +import EditRoundedIcon from '@material-ui/icons/EditRounded'; +import DeleteRoundedIcon from '@material-ui/icons/DeleteRounded'; +import CheckRoundedIcon from "@material-ui/icons/CheckRounded"; +import CloseRoundedIcon from "@material-ui/icons/CloseRounded"; +//imports from local files +import { GetAData } from "../../../Filters"; +import { apiDomain } from '../../../../env'; +import noAvatar from "../../../../img/default_profile.png"; +import { Link, useHistory } from "react-router-dom"; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import SnackBar from '../../../../Components/SnackbarComponent'; +import { getRequest, postRequest, deleteRequest, putRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +//styles +import styled from 'styled-components'; + +const CollectionCard = () => { + let history = useHistory() + const classes = useStyles(); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("id"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [item, setItem] = useState({}); + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const stateTeacherRequest = (status) => { + switch (status) { + case "accepted": + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#228B22", + fontWeight: "500", + color: "#FFFAFA", + }} + > + ACEITO + </Paper> + ); + case "requested": + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#FF8C00", + fontWeight: "500", + color: "#FFFAFA", + }} + > + PENDENTE + </Paper> + ); + case "rejected": + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#FA8072", + fontWeight: "500", + color: "#FFFAFA", + }} + > + Rejeitado + </Paper> + ); + default: + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#797D7F ", + fontWeight: "500", + color: "#FFFAFA", + }} + > + Não requisitado solicitação de professor + </Paper> + ) + } + }; + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData).format("LLL").toString(); + } + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const reloadData = () => { + setIsLoaded(false) + getRequest( + GetAData("users", id), + (data, header) => { + setItem(data) + setIsLoaded(true); + setError(false); + }, + (error) => { + setError(true); + } + ) + } + + const handleAprove = (userId, userName) => { + const url = `/users/${userId}/add_teacher` + const body = { + "approves": true + } + postRequest( + url, + body, + (data) => { + if (data.errors) + HandleSnack("Erro!", true, "warning", "#FA8072"); + else { + HandleSnack(`${userName} aceito como professor!`, true, "success", "#228B22"); + reloadData() + } + }, + (error) => { + HandleSnack("Erro!", true, "warning", "#FA8072"); + } + ) + } + + const handleReject = (userId, userName) => { + const url = `/users/${userId}/add_teacher` + const body = { + "approves": false + } + postRequest( + url, + body, + (data) => { + if (data.errors) + HandleSnack("Erro!", true, "warning", "#FA8072"); + else { + HandleSnack(`${userName} rejeitado como professor!`, true, "success", "#228B22"); + reloadData() + } + }, + (error) => { + HandleSnack("Erro!", true, "warning", "#FA8072"); + } + ) + } + + const deleteUser = (userId) => { + deleteRequest( + `/users/${userId}`, + (data) => { + if (data.errors) + HandleSnack("Erro!", true, "warning", "#FA8072") + else { + HandleSnack(`${item.name} deletado com sucesso!`, true, "success", "#228B22"); + history.goBack() + } + }, + (error) => { + HandleSnack("Erro!", true, "warning", "#FA8072") + } + ) + } + + const isBlocked = (state) => { + if (state === "blocked" || state === "banished") + return <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "red", + fontWeight: "500", + color: "#FFFAFA", + }} + > + Bloqueado + </Paper> + } + + const actionsForBlockedUser = (state) => { + if (state === "blocked" || state === "banished") { + return ( + <Button + style={{ width: "100%", marginBottom: "0.5em" }} + variant="contained" + color="secondary" + startIcon={<RemoveCircleOutlineRoundedIcon />} + onClick={() => ReactiveUser()} + > + Desbloquear + </Button> + ) + } + return <Typography color="textSecondary"> + Usuário não bloqueado + </Typography> + } + + const actionsForStateTeacherRequest = (state) => { + if (state === "requested") { + return ( + <Grid container direction="row" spacing={1}> + <Grid item> + <Button + variant="contained" + color="secondary" + style={{ width: "100%" }} + disabled={ + item.submitter_request === "requested" ? false : true + } + startIcon={ + <CloseRoundedIcon style={{ fill: "#FFFAFA" }} /> + } + onClick={() => { handleReject(item.id, item.name) }} + > + Recusar + </Button> + </Grid> + <Grid item> + <Button + variant="contained" + color="primary" + style={{ width: "100%" }} + disabled={ + item.submitter_request === "requested" ? false : true + } + startIcon={ + <CheckRoundedIcon style={{ fill: "#FFFAFA" }} /> + } + onClick={() => { handleAprove(item.id, item.name) }} + > + Aceitar + </Button> + </Grid> + </Grid> + ) + } + return <Typography color="textSecondary"> + Usuário não requisitou conta de professor + </Typography> + } + + const ReactiveUser = () => { + putRequest( + `/users/${id}/reactivate_user`, + {}, + (data) => { + if (data.errors) + HandleSnack('Erro ao tentar reativar usuário!', true, 'warning', '#FA8072') + else { + HandleSnack('Usuário foi reativado com sucesso!', true, 'success', '#228B22') + reloadData() + } + }, + (error) => { + HandleSnack('Erro ao tentar reativar usuário!', true, 'warning', '#FA8072') + } + ) + } + + useEffect(() => { + getRequest( + GetAData("users", id), + (data, header) => { + setItem(data) + setIsLoaded(true); + setError(false); + }, + (error) => { + setError(true); + } + ) + }, []); + + if (error) { + return <div>Houve um erro</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + return ( + <Grid + container + spacing={3} + > + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <Grid + item + md={6} + xs={12} + > + <Card> + <CardContent> + <Grid container justify="space-between"> + <Grid item xs={12}> + <Typography + className={classes.title} + color="inherit" + gutterBottom + > + Identificação do usuário + </Typography> + </Grid> + <Grid container xs={12}> + <Grid item> + <Link + style={{ textDecoration: "none" }} + to={`/admin/usersList`} + > + <Button + startIcon={<ListRoundedIcon />} + color="primary" + variant="outlined" + > + Listar + </Button> + </Link> + </Grid> + <Grid item> + <Button + startIcon={<DeleteRoundedIcon />} + color="secondary" + variant="outlined" + onClick={() => { deleteUser(item.id) }} + > + Deletar + </Button> + </Grid> + <Grid item> + <Link to={`/admin/EditUser?id=${item.id}`} style={{ textDecoration: "none" }}> + <Button + startIcon={<EditRoundedIcon />} + color="primary" + variant="outlined" + > + Editar + </Button> + </Link> + </Grid> + </Grid> + </Grid> + <SizedBox /> + <Grid container direction="row" justify="flex-start" alignItems="center" spacing={3}> + <Grid item justify="center" alignItems="center"> + <AvatarDiv> + <img src={item.avatar ? apiDomain + item.avatar : noAvatar} alt='user avatar' + style={{ height: "100%", width: "100%", borderRadius: "50%" }} /> + </AvatarDiv> + </Grid> + <Grid item> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Nome + </Typography> + <Typography color="textSecondary"> + {item.name === null ? "Sem dados" : item.name} + </Typography> + </div> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Email + </Typography> + { + item.email ? + <Link to={`/admin/sendEmail?email=${item.email}`} style={{ textDecoration: 'none' }}> + <Button + variant='text' + color='primary' + startIcon={<EmailRoundedIcon />} + > + {item.email} + </Button> + </Link> : null + } + </div> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Cpf + </Typography> + <Typography color="textSecondary"> + {item.cpf === null ? "Sem dados" : item.cpf} + </Typography> + </div> + </Grid> + </Grid> + <Grid> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Escola + </Typography> + <Typography color="textSecondary"> + {item.school ? item.school.name : "Sem dados"} + </Typography> + </div> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Telefone da escola + </Typography> + <Typography color="textSecondary"> + {item.school ? item.school.phone : "Sem dados"} + </Typography> + </div> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + UF + </Typography> + <Typography color="textSecondary"> + {item.school ? item.school.uf : "Sem dados"} + </Typography> + </div> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + MunÃcipo + </Typography> + <Typography color="textSecondary"> + {item.school ? item.school.city : "Sem dados"} + </Typography> + </div> + </Grid> + </CardContent> + </Card> + </Grid> + + <Grid + item + md={6} + xs={12} + > + <Grid item> + <Card> + <CardContent> + <Typography variant="h5" component="h2"> + Informações do perfil + </Typography> + + {stateTeacherRequest(item.submitter_request)} + <SizedBox /> + {isBlocked(item.state)} + + <SizedBox /> + + <Grid container justify="flex-start"> + <Grid item> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Descrição + </Typography> + <Typography color="textSecondary"> + {item.description} + </Typography> + </div> + </Grid> + + <Grid container direction="row" justify="space-between" spacing={1} alignItems="center"> + <Grid item> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Criado em + </Typography> + <Typography color="textSecondary"> + {DisplayDate(item.created_at)} + </Typography> + </div> + </Grid> + + <Grid item> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Atualizado em + </Typography> + <Typography color="textSecondary"> + {DisplayDate(item.updated_at)} + </Typography> + </div> + </Grid> + </Grid> + + <Grid item> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Permissões + </Typography> + <Grid container direction="row"> + { + item.roles.map((tag, index) => { + return ( + <ChipDiv key={index}> + <Chip label={tag.name} /> + </ChipDiv> + ) + }) + } + </Grid> + </div> + </Grid> + + <Grid container direction="row" spacing={1} justify="space-between" alignItems="center"> + <Grid item> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Nota + </Typography> + <Typography color="textSecondary"> + {item.score} + </Typography> + </div> + </Grid> + + <Grid item> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Seguidores + </Typography> + <Typography color="textSecondary"> + {item.follows_count} + </Typography> + </div> + </Grid> + + <Grid item> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Likes + </Typography> + <Typography color="textSecondary"> + {item.likes_count} + </Typography> + </div> + </Grid> + + <Grid item> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Objetos educacionais + </Typography> + <Typography color="textSecondary"> + {item.learning_objects_count} + </Typography> + </div> + </Grid> + + <Grid item> + <div className={classes.displayColumn}> + <Typography color="initial" className={classes.subTitle}> + Coleções + </Typography> + <Typography color="textSecondary"> + {item.collections_count} + </Typography> + </div> + </Grid> + </Grid> + <StyledDivider> + </StyledDivider> + <Grid container direction="column"> + <Grid item> + <Typography variant="h5" component="h2"> + Ações para solicitação de professor + </Typography> + </Grid> + <SizedBox /> + {actionsForStateTeacherRequest(item.submitter_request)} + </Grid> + <StyledDivider> + </StyledDivider> + <Grid container direction="column"> + <Grid item> + <Typography variant="h5" component="h2"> + Ações para usuário bloqueado + </Typography> + </Grid> + <SizedBox /> + {actionsForBlockedUser(item.state)} + </Grid> + </Grid> + </CardContent> + </Card> + </Grid> + </Grid> + </Grid> + ); + } +}; + +export default CollectionCard; + +const AvatarDiv = styled.div` + border-radius : 100%; + height : 126px; + width : 126px; + border : 2px solid #d4d4d4; +` +const ChipDiv = styled.div` + margin-right : 0.5em; + margin-bottom : 0.5em; +` +const SizedBox = styled.div` + height : 1em; +` +const StyledDivider = styled.div` + width : 100%; + border-radius : 100%; + margin-top : 0.6em; + margin-bottom : 0.6em; + border : 0.5px solid #d4d4d4; +` \ No newline at end of file diff --git a/src/Admin/Components/Components/Inputs/CreateInstitution.js b/src/Admin/Components/Components/Inputs/CreateInstitution.js new file mode 100644 index 0000000000000000000000000000000000000000..b4f001f083f15aa192319a899cbad7dcac96421a --- /dev/null +++ b/src/Admin/Components/Components/Inputs/CreateInstitution.js @@ -0,0 +1,282 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useContext } from 'react'; +//imports material ui componets +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardAction from '@material-ui/core/CardActions'; +import { Typography, TextField, Button, Grid } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import ListRoundedIcon from '@material-ui/icons/ListRounded'; +//imports local files +import SnackBar from '../../../../Components/SnackbarComponent'; +import { Store } from '../../../../Store'; +import { postRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import Unauthorized from '../Unauthorized'; +//router +import { Link } from 'react-router-dom'; + +const CreateInstitution = (props) => { + const { state } = useContext(Store); + + const [name, setName] = useState('Nova Instituição'); + const [description, setDescription] = useState(''); + const [adress, setAdress] = useState(''); + const [city, setCity] = useState(''); + const [country, setCountry] = useState(''); + + const [isLoading, setIsLoading] = useState(false) + + // Handle error in name + const [errorInName, setErrorInName] = useState({ + error: false, + message: '', + }) + + // Handle error in Country + const [errorInCountry, setErrorInCountry] = useState({ + error: false, + message: '', + }) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const NameHandler = (e) => { + setName(e.target.value) + if (errorInName.error) { + setErrorInName({ + error: false, + message: '' + }) + } + } + const DescriptionHandler = (e) => { + setDescription(e.target.value) + } + const AdressHandler = (e) => { + setAdress(e.target.value) + } + const CityHandler = (e) => { + setCity(e.target.value) + } + const CountryHandler = (e) => { + if (errorInCountry.error) { + setErrorInCountry({ + error: false, + message: '' + }) + } + setCountry(e.target.value) + } + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + + //Handle submit + async function onSubmit() { + setIsLoading(true) + const api = '/institutions' + const body = { + "institution": { + 'name': name, + 'description': description, + 'address': adress, + 'city': city, + 'country': country, + } + } + postRequest( + api, + body, + (data) => { + if (data.id) + HandleSnack('A instituição foi criada com sucesso', true, 'success', '#228B22') + else { + if (data.errors) { + HandleSnack(`${data.errors[0]}`, true, 'warning', '#FA8072') + } + else { + if (data.name) { + let nameError = ""; + data.name.map((msg) => ( + nameError = nameError + msg + " e " + )) + setErrorInName({ + error: true, + message: nameError + }) + } + HandleSnack('Você precisa preencher algumas informações obrigatórias', true, 'warning', '#FFC125') + } + } + setIsLoading(false) + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + + // Fields + const fields = [ + { + label: 'Nome', + value: name, + required: true, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event) + }, + { + label: 'Descrição', + value: description, + required: false, + + onChange: (event) => DescriptionHandler(event) + }, + { + label: 'Endereço', + value: adress, + required: false, + + onChange: (event) => AdressHandler(event) + }, + { + label: 'Cidade', + value: city, + required: false, + onChange: (event) => CityHandler(event) + }, + { + label: 'PaÃs', + value: country, + required: false, + error: errorInCountry.error, + errorMessage: errorInCountry.message, + onChange: (event) => CountryHandler(event) + } + ] + + if (CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container direction='row' justify='space-between' alignContent="center" alignItems="center" xs={12}> + <Grid item> + <Typography variant='h4'> + {name} + </Typography> + </Grid> + <Grid item> + <Link style={{ textDecoration: 'none' }} to={'/admin/intitutions'}> + <Button + onClick={props.BackToList} + startIcon={<ListRoundedIcon />} + variant='outlined' + color='primary' + > + Listar + </Button> + </Link> + </Grid> + </Grid> + + <div style={{ height: '1em' }}></div> + + <form style={{ display: 'flex', flexDirection: 'column' }}> + {fields.map((field, index) => ( + <TextField + key={index} + required={field.required} + error={field.error} + helperText={field.error ? field.errorMessage : ''} + style={{ width: '250px', marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type="search" + multiline={true} + /> + ))} + </form> + </CardContent> + <CardAction> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <AddRoundedIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Adicionar' + } + </Button> + </CardAction> + </Card> + ); + } else return <Unauthorized /> +} + +export default CreateInstitution; \ No newline at end of file diff --git a/src/Admin/Components/Components/Inputs/CreateLanguage.js b/src/Admin/Components/Components/Inputs/CreateLanguage.js new file mode 100644 index 0000000000000000000000000000000000000000..c9a6590184ea0695d365aa6a58e3119c5dfa4051 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/CreateLanguage.js @@ -0,0 +1,257 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useContext } from 'react'; +//imports material ui componets +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardAction from '@material-ui/core/CardActions'; +import { Typography, TextField, Button, Grid } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import ListRoundedIcon from '@material-ui/icons/ListRounded'; +//imports local files +import SnackBar from '../../../../Components/SnackbarComponent'; +import { Store } from '../../../../Store'; +import { postRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +//router +import { Link } from 'react-router-dom'; +import Unauthorized from '../Unauthorized'; + +const CreateLanguage = (props) => { + const { state } = useContext(Store); + + const [name, setName] = useState('Nova linguagem'); + const [code, setCode] = useState(''); + + const [isLoading, setIsLoading] = useState(false) + + // Handle error in name + const [errorInName, setErrorInName] = useState({ + error: false, + message: '', + }) + + // Handle error in Country + const [errorInCode, setErrorInCode] = useState({ + error: false, + message: '', + }) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const NameHandler = (e) => { + setName(e.target.value) + if (errorInName.error) { + setErrorInName({ + error: false, + message: '' + }) + } + } + + const CodeHandler = (e) => { + if (errorInCode.error) { + setErrorInCode({ + error: false, + message: '' + }) + } + setCode(e.target.value) + } + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + //Handle submit + async function onSubmit() { + setIsLoading(true) + const api = '/languages' + const body = { + "language": { + 'name': name, + 'code': code, + } + } + postRequest( + api, + body, + (data) => { + if (data.id) + HandleSnack('A linguagem foi criada com sucesso', true, 'success', '#228B22') + else { + if (data.errors) { + HandleSnack(`${data.errors[0]}`, true, 'warning', '#FA8072') + } + else { + if (data.name) { + let nameError = ""; + data.name.map((msg) => ( + nameError = nameError + msg + " e " + )) + setErrorInName({ + error: true, + message: nameError + }) + } + if (data.code) { + let codeError = ""; + data.code.map((msg) => ( + codeError = codeError + msg + " e " + )) + setErrorInCode({ + error: true, + message: codeError + }) + } + HandleSnack('Você precisa preencher algumas informações obrigatórias', true, 'warning', '#FFC125') + } + } + setIsLoading(false) + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + + // Fields + const fields = [ + { + label: 'Nome', + value: name, + required: true, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event) + }, + { + label: 'Código', + value: code, + required: true, + error: errorInCode.error, + errorMessage: errorInCode.message, + onChange: (event) => CodeHandler(event) + } + ] + + if (CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container direction='row' justify='space-between' alignItems="center" alignContent="center" xs={12}> + <Grid item> + <Typography variant='h4'> + {name} + </Typography> + </Grid> + <Grid item> + <Link to={'/admin/languages'} style={{ textDecoration: 'none' }}> + <Button + onClick={props.BackToList} + startIcon={<ListRoundedIcon />} + variant='outlined' + color='primary' + > + Listar + </Button> + </Link> + </Grid> + </Grid> + + <div style={{ height: '1em' }}></div> + + <form style={{ display: 'flex', flexDirection: 'column' }}> + {fields.map((field, index) => ( + <TextField + key={index} + required={field.required} + error={field.error} + helperText={field.error ? field.errorMessage : ''} + style={{ width: '250px', marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type="search" + multiline={true} + /> + ))} + </form> + </CardContent> + <CardAction> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <AddRoundedIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Adicionar' + } + </Button> + </CardAction> + </Card> + ) + } else return <Unauthorized /> +} + +export default CreateLanguage; \ No newline at end of file diff --git a/src/Admin/Components/Components/Inputs/CreateQuestion.js b/src/Admin/Components/Components/Inputs/CreateQuestion.js new file mode 100644 index 0000000000000000000000000000000000000000..89fd3f856e7b8cee4760048d3913723a9c24c129 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/CreateQuestion.js @@ -0,0 +1,265 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useContext } from 'react'; +//imports material ui componets +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardAction from '@material-ui/core/CardActions'; +import { Typography, TextField, Button, Grid } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import MenuItem from "@material-ui/core/MenuItem"; +import ListRoundedIcon from '@material-ui/icons/ListRounded'; +//imports local files +import { Store } from '../../../../Store'; +import { postRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import Unauthorized from '../Unauthorized'; +import SnackBar from '../../../../Components/SnackbarComponent'; +//router +import { Link } from 'react-router-dom'; + +const CreateQuestion = (props) => { + const { state } = useContext(Store); + + const [status, setStatus] = useState(''); + const [description, setDescription] = useState(''); + + const [isLoading, setIsLoading] = useState(false) + + // Handle error in Country + const [errorInDescription, setErrorInDescription] = useState({ + error: false, + message: '', + }) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const DescriptionHandler = (e) => { + if (errorInDescription.error) { + setErrorInDescription({ + error: false, + message: '' + }) + } + setDescription(e.target.value) + } + + // verify if the given text is empty + const isEmpty = (text) => { + return text.length === 0 ? true : false; + } + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + + //Handle submit + async function onSubmit() { + if (!isEmpty(description)) { + setIsLoading(true) + const api = '/questions' + const body = { + "question": { + 'status': status, + 'description': description, + } + } + postRequest( + api, + body, + (data) => { + if(data.errors) + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + else + HandleSnack('A pergunta foi criada com sucesso', true, 'success', '#228B22') + setIsLoading(false) + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + else + { + setErrorInDescription( + { + error : true, + message : "Você precisa preencher este campo!" + } + ) + } + } + + //handle change of staus + + const handleChange = (e) => { + const value = e.target.value; + setStatus(value); + console.log(status) + }; + + // Fields + const fields = [ + { + label: 'Descrição', + value: description, + required: true, + error: errorInDescription.error, + errorMessage: errorInDescription.message, + onChange: (event) => DescriptionHandler(event) + } + ] + + const STATUS_OPTIONS = [ + { + value: "active", + label: "Ativo", + }, + { + value: "inactive", + label: "Inativo", + }, + ]; + + if (CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container direction='row' justify='space-between' alignContent="center" alignItems="center" xs={12}> + <Grid item> + <Typography variant='h4'> + Nova question + </Typography> + </Grid> + <Grid item> + <Link to={'/admin/Questions'} style={{ textDecoration: 'none' }}> + <Button + onClick={props.BackToList} + startIcon={<ListRoundedIcon />} + variant='outlined' + color='primary' + > + Listar + </Button> + </Link> + </Grid> + </Grid> + + <div style={{ height: '1em' }}></div> + + <form style={{ display: 'flex', flexDirection: 'column' }}> + <> + <TextField + select + label="Status" + value={status ? status : ""} + style={{ width: '250px', marginBottom: '1em' }} + onChange={handleChange} + > + {STATUS_OPTIONS.map((option, index) => ( + <MenuItem + key={option.value} + value={option.value} + style={option.value === status ? { color: 'blue' } : { color: 'black' }} + > + { + option.label + } + </MenuItem> + ))} + </TextField> + {fields.map((field, index) => ( + <TextField + key={index} + required={field.required} + error={field.error} + helperText={field.error ? field.errorMessage : ''} + style={{ width: '250px', marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type="search" + multiline={true} + /> + ))} + </> + </form> + </CardContent> + <CardAction> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <AddRoundedIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Adicionar' + } + </Button> + </CardAction> + </Card> + ); + } else return <Unauthorized /> +} + +export default CreateQuestion; \ No newline at end of file diff --git a/src/Admin/Components/Components/Inputs/CreateRating.js b/src/Admin/Components/Components/Inputs/CreateRating.js new file mode 100644 index 0000000000000000000000000000000000000000..3a8907f9faed11a37027e592577703cfc8a88d59 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/CreateRating.js @@ -0,0 +1,254 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useContext } from 'react'; +//imports material ui componets +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardAction from '@material-ui/core/CardActions'; +import { Typography, TextField, Button, Grid } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import ListRoundedIcon from '@material-ui/icons/ListRounded'; +//imports local files +import { Store } from '../../../../Store'; +import SnackBar from '../../../../Components/SnackbarComponent'; +//imports services +import { postRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +//router +import {Link} from 'react-router-dom'; +import Unauthorized from '../Unauthorized'; + +const CreateRating = (props) => { + const { state } = useContext(Store); + + const [name, setName] = useState('Novo rating'); + const [description, setDescription] = useState(''); + + const [isLoading, setIsLoading] = useState(false) + + // Handle error in name + const [errorInName, setErrorInName] = useState({ + error: false, + message: '', + }) + + // Handle error in Country + const [errorInDescription, setErrorInDescription] = useState({ + error: false, + message: '', + }) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const NameHandler = (e) => { + setName(e.target.value) + if (errorInName.error) { + setErrorInName({ + error: false, + message: '' + }) + } + } + + const DescriptionHandler = (e) => { + if (errorInDescription.error) { + setErrorInDescription({ + error: false, + message: '' + }) + } + setDescription(e.target.value) + } + + // verify if the given text is empty + const isEmpty = (text) => { + return text.length === 0 ? true : false; + } + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + //Handle submit + async function onSubmit() { + setIsLoading(true) + if (!isEmpty(name) && !isEmpty(description)) { + const api = '/ratings' + const body = { + "rating": { + 'name': name, + 'description': description, + } + } + postRequest( + api, + body, + (data) => { + if(data.errors) + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + else + HandleSnack('O rating foi criada com sucesso', true, 'success', '#228B22') + setIsLoading(false) + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } else { + HandleSnack('Você precisa preencher algumas informações obrigatórias', true, 'warning', '#FFC125') + if (isEmpty(name)) { + setErrorInName({ + error: true, + message: 'Esse campo está vazio' + }) + } + if (isEmpty(description)) { + setErrorInDescription({ + error: true, + message: 'Esse campo está vazio' + }) + } + setIsLoading(false) + } + } + + // Fields + const fields = [ + { + label: 'Nome', + value: name, + required: true, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event) + }, + { + label: 'Descrição', + value: description, + required: true, + error: errorInDescription.error, + errorMessage: errorInDescription.message, + onChange: (event) => DescriptionHandler(event) + } + ] + + if(CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container direction='row' justify='space-between' alignItems="center" alignContent="center" xs={12}> + <Grid item> + <Typography variant='h4'> + {name} + </Typography> + </Grid> + <Grid item> + <Link to={'/admin/Ratings'} style={{textDecoration: 'none'}}> + <Button + onClick={props.BackToList} + startIcon={<ListRoundedIcon />} + variant='outlined' + color='primary' + > + Listar + </Button> + </Link> + </Grid> + </Grid> + + <div style={{ height: '1em' }}></div> + + <form style={{ display: 'flex', flexDirection: 'column' }}> + {fields.map((field, index) => ( + <TextField + key={index} + required={field.required} + error={field.error} + helperText={field.error ? field.errorMessage : ''} + style={{ width: '250px', marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type="search" + multiline={true} + /> + ))} + </form> + </CardContent> + <CardAction> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <AddRoundedIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Adicionar' + } + </Button> + </CardAction> + </Card> + ); + } else return <Unauthorized/> +} + +export default CreateRating; \ No newline at end of file diff --git a/src/Admin/Components/Components/Inputs/CreateRole.js b/src/Admin/Components/Components/Inputs/CreateRole.js new file mode 100644 index 0000000000000000000000000000000000000000..94afb02479f83a1f9830f659c77d478247a62c26 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/CreateRole.js @@ -0,0 +1,248 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useContext } from 'react'; +//imports material ui componets +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardAction from '@material-ui/core/CardActions'; +import { Typography, TextField, Button, Grid } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import ListRoundedIcon from '@material-ui/icons/ListRounded'; +//imports local files +import SnackBar from '../../../../Components/SnackbarComponent'; +import { Store } from '../../../../Store'; +import { postRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +//router +import { Link } from 'react-router-dom'; +import Unauthorized from '../Unauthorized'; + +const CreateRole = (props) => { + const { state } = useContext(Store); + + const [name, setName] = useState('Nova role'); + const [desc, setDesc] = useState(''); + + const [isLoading, setIsLoading] = useState(false) + + // Handle error in name + const [errorInName, setErrorInName] = useState({ + error: false, + message: '', + }) + + // Handle error in Country + const [errorInDesc, setErrorInDesc] = useState({ + error: false, + message: '', + }) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const NameHandler = (e) => { + setName(e.target.value) + if (errorInName.error) { + setErrorInName({ + error: false, + message: '' + }) + } + } + + const DescHandler = (e) => { + if (errorInDesc.error) { + setErrorInDesc({ + error: false, + message: '' + }) + } + setDesc(e.target.value) + } + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + + //Handle submit + async function onSubmit() { + setIsLoading(true) + const api = '/roles' + const body = { + "role": { + 'name': name, + 'description': desc, + } + } + postRequest( + api, + body, + (data) => { + if (data.id) + HandleSnack('A role foi criada com sucesso!', true, 'success', '#228B22') + else { + if (data.errors) { + HandleSnack(`${data.errors[0]}`, true, 'warning', '#FA8072') + } + else { + if (data.name) { + let errorName = ""; + data.name.map((err) => ( + errorName = errorName + err + " e " + )) + setErrorInName({ + error: true, + message: errorName + }) + } + HandleSnack('Você precisa preencher algumas informações obrigatórias', true, 'warning', '#FFC125') + } + } + setIsLoading(false) + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + + // Fields + const fields = [ + { + label: 'Nome', + value: name, + required: true, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event) + }, + { + label: 'Descrição', + value: desc, + required: true, + error: errorInDesc.error, + errorMessage: errorInDesc.message, + onChange: (event) => DescHandler(event) + } + ] + + if (CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container direction='row' justify='space-between' alignItems="center" alignContent="center" xs={12}> + <Grid item> + <Typography variant='h4'> + {name} + </Typography> + </Grid> + <Grid item> + <Link to={'/admin/permissions'} style={{ textDecoration: 'none' }}> + <Button + onClick={props.BackToList} + startIcon={<ListRoundedIcon />} + variant='outlined' + color='primary' + > + Listar + </Button> + </Link> + </Grid> + </Grid> + + <div style={{ height: '1em' }}></div> + + <form style={{ display: 'flex', flexDirection: 'column' }}> + {fields.map((field, index) => ( + <TextField + key={index} + required={field.required} + error={field.error} + helperText={field.error ? field.errorMessage : ''} + style={{ width: '250px', marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type="search" + multiline={true} + /> + ))} + </form> + </CardContent> + <CardAction> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <AddRoundedIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Adicionar' + } + </Button> + </CardAction> + </Card> + ) + } else return <Unauthorized /> +} + +export default CreateRole; \ No newline at end of file diff --git a/src/Admin/Components/Components/Inputs/EditCollection.js b/src/Admin/Components/Components/Inputs/EditCollection.js new file mode 100644 index 0000000000000000000000000000000000000000..13aabcf16dac0ebc5f77ca965b60cfa6b5508395 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/EditCollection.js @@ -0,0 +1,292 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from 'react'; +//imports material ui components +import { Typography, TextField, Button, Grid } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardAction from '@material-ui/core/CardActions'; +import ListRoundedIcon from '@material-ui/icons/ListRounded'; +import SaveIcon from '@material-ui/icons/Save'; +import MenuItem from "@material-ui/core/MenuItem"; +//imports local files +import SnackBar from '../../../../Components/SnackbarComponent'; +import Unauthorized from '../Unauthorized'; +import { getRequest, putRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import { Store } from '../../../../Store'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import { EditFilter, GetAData } from '../../../Filters'; +//routers +import { Link } from 'react-router-dom'; +import ClassicEditor from "@ckeditor/ckeditor5-build-classic" +import { CKEditor } from '@ckeditor/ckeditor5-react'; + +const EditCollection = () => { + const { state } = useContext(Store); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("collection"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + + const [isLoading, setIsLoading] = useState(false); + const [name, setName] = useState('') + const [privacy, setPrivacy] = useState('') + const [description, setDescription] = useState(''); + + const [errorInName, setErrorInName] = useState({ + error: false, + message: '' + }) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const NameHandler = (e) => { + if (errorInName.error) { + setErrorInName({ + error: false, + message: '' + }) + } + setName(e.target.value) + } + + // Fields + const fields = [ + { + label: 'ID', + value: id, + default: true, + type: 'text' + }, + { + label: 'Nome', + value: name, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event), + default: false, + type: 'text', + }, + ] + + const privacyOptions = [ + { + value: "private", + label: "Privado", + }, + { + value: "public", + label: "Público", + }, + ]; + + //handle change of privacy + const handleChange = (e) => { + const value = e.target.value; + setPrivacy(value); + console.log(privacy) + }; + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + const onSubmit = async () => { + setIsLoading(true) + const api = EditFilter('collections', id) + let body = { + "collection": { + "name": name, + "privacy": privacy, + "description": description + } + } + putRequest( + api, + body, + (data) => { + if (data.errors) { + HandleSnack(`${data.errors[0]}`, true, 'warning', '#FA8072') + } + else { + HandleSnack('A Coleção foi alterada com sucesso', true, 'success', '#228B22') + } + setIsLoading(false) + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + + useEffect(() => { + getRequest( + GetAData("collections", id), + (data, header) => { + setIsLoaded(true); + setError(false); + setName(data.name) + setPrivacy(data.privacy) + setDescription(data.description) + }, + (error) => { + setIsLoaded(true); + setError(true); + } + ) + }, []); + + if (error) { + return <div> Houve um erro... </div> + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else if (CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container direction='row' justify='space-between' xs={12} alignItems="center"> + <Grid item> + <Typography variant='h4'> + {name} + </Typography> + </Grid> + <Grid item> + <Link style={{ textDecoration: 'none' }} to={'/admin/Collections'}> + <Button + startIcon={<ListRoundedIcon />} + variant='outlined' + color='primary' + > + Listar + </Button> + </Link> + </Grid> + </Grid> + + <div style={{ height: '1em' }}></div> + + <form style={{ display: 'flex', flexDirection: 'column' }}> + {fields.map((field, index) => ( + <TextField + key={index} + required={field.required} + disabled={field.default} + error={field.error} + helperText={field.error ? field.errorMessage : ''} + style={{ marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type="search" + multiline={true} + /> + ))} + <TextField + select + label="Privacidade" + value={privacy ? privacy : ""} + style={{ marginBottom: '1em' }} + onChange={handleChange} + > + {privacyOptions.map((option, index) => ( + <MenuItem + key={option.value} + value={option.value} + style={option.value === privacy ? { color: 'blue' } : { color: 'black' }} + > + { + option.value + } + </MenuItem> + ))} + </TextField> + <CKEditor + editor={ClassicEditor} + data={description} + onBlur={(event, editor) => { + const data = editor.getData(); + setDescription(data) + }} + /> + </form> + </CardContent> + + <CardAction> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <SaveIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Salvar' + } + </Button> + </CardAction> + </Card> + ) + } else return <Unauthorized /> +} + +export default EditCollection; \ No newline at end of file diff --git a/src/Admin/Components/Components/Inputs/EditEducationalObect.js b/src/Admin/Components/Components/Inputs/EditEducationalObect.js new file mode 100644 index 0000000000000000000000000000000000000000..5996383029e0fc08a2b770c8fe7aa32a6b6f2b9e --- /dev/null +++ b/src/Admin/Components/Components/Inputs/EditEducationalObect.js @@ -0,0 +1,633 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from "react"; +import PropTypes from "prop-types"; +import SwipeableViews from "react-swipeable-views"; +import moment from "moment"; +//imports material ui components +import { Typography, TextField, Button, Grid } from "@material-ui/core"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardAction from "@material-ui/core/CardActions"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import Chip from "@material-ui/core/Chip"; +import MenuItem from "@material-ui/core/MenuItem"; +import { useTheme, makeStyles } from "@material-ui/core/styles"; +import Tabs from "@material-ui/core/Tabs"; +import Tab from "@material-ui/core/Tab"; +import Box from "@material-ui/core/Box"; +import SaveIcon from "@material-ui/icons/Save"; +//imports local files +import SnackBar from "../../../../Components/SnackbarComponent"; +import { Store } from "../../../../Store"; +import Unauthorized from "../Unauthorized"; +import LoadingSpinner from "../../../../Components/LoadingSpinner"; +import { + fetchAllRequest, + putRequest, +} from "../../../../Components/HelperFunctions/getAxiosConfig"; +import { EditFilter } from "../../../Filters"; +//routers +import { Link } from "react-router-dom"; +import ClassicEditor from "@ckeditor/ckeditor5-build-classic" +import { CKEditor } from '@ckeditor/ckeditor5-react'; + +const useStyles = makeStyles((theme) => ({ + root: { + width: "100%", + maxWidth: 250, + backgroundColor: theme.palette.background.paper, + position: "relative", + overflow: "auto", + maxHeight: 300, + }, +})); + +let text; + +const EditEducationalObject = () => { + const { state } = useContext(Store); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("learnObj"); + + const theme = useTheme(); + const classes = useStyles(); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [isLoading, setIsLoading] = useState(false); //is loading to submit + + const [value, setValue] = React.useState(0); + + //mutables + const [name, setName] = useState(); + const [owner, setOwner] = useState(); + const [author, setAuthor] = useState(); + const [objectType, setObjectType] = useState({}); + const [description, setDescription] = useState(""); + const [languagesID, setLanguagesID] = useState([]); + const [listOfLanguages, setListOfLanguages] = useState([]); + const [listOfObjectTypes, setListOfObjectTypes] = useState([]); + + // Imutables + const [CREATE_AT, setCreateAt] = useState(""); + const [UPDATE_AT, setUpdateAt] = useState(""); + const [VIEWS_COUNT, setViewsCount] = useState(""); + const [LIKES_COUNT, setLikesCount] = useState(""); + const [REVIEW_AVERAGE, setReviewAverage] = useState(""); + const [SCORE, setScore] = useState(""); + + const [errorInName, setErrorInName] = useState({ + error: false, + message: "", + }); + + const [errorInOwner, setErrorInOwner] = useState({ + error: false, + message: "", + }); + + const [errorInAuthor, setErrorInAuthor] = useState({ + error: false, + message: "", + }); + + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + const NameHandler = (e) => { + if (errorInName.error) { + setErrorInName({ + error: false, + message: "", + }); + } + setName(e.target.value); + }; + + const OwnerHandler = (e) => { + if (errorInOwner.error) { + setErrorInOwner({ + error: false, + message: "", + }); + } + setOwner(e.target.value); + }; + + const AuthorHandler = (e) => { + if (errorInAuthor.error) { + setErrorInAuthor({ + error: false, + message: "", + }); + } + setAuthor(e.target.value); + }; + + function TabPanel(props) { + const { children, value, index, ...other } = props; + + return ( + <div + role="tabpanel" + hidden={value !== index} + id={`full-width-tabpanel-${index}`} + aria-labelledby={`full-width-tab-${index}`} + {...other} + > + {value === index && <Box style={{ marginTop: "2em" }}>{children}</Box>} + </div> + ); + } + + TabPanel.propTypes = { + children: PropTypes.node, + index: PropTypes.any.isRequired, + value: PropTypes.any.isRequired, + }; + + function a11yProps(index) { + return { + id: `full-width-tab-${index}`, + "aria-controls": `full-width-tabpanel-${index}`, + }; + } + + const handleChangeLan = (id, value) => { + const currLanguagesId = [...languagesID]; + currLanguagesId.push({ + id: id, + name: value, + }); + setListOfLanguages((chips) => chips.filter((chip) => chip.id !== id)); + setLanguagesID(currLanguagesId); + }; + + const handleDeleteLan = (chipToDelete) => () => { + const currLanguageList = [...listOfLanguages]; + currLanguageList.push({ + id: chipToDelete.id, + name: chipToDelete.name, + }); + setListOfLanguages(currLanguageList); + setLanguagesID((chips) => + chips.filter((chip) => chip.id !== chipToDelete.id) + ); + }; + + const handleChangeObj = (id, value) => { + let currListOfObjs = [...listOfObjectTypes]; + currListOfObjs.push({ + id: objectType.id, + name: objectType.name, + }); + currListOfObjs = currListOfObjs.filter((chip) => chip.id !== id); + setListOfObjectTypes(currListOfObjs); + setObjectType({ + id: id, + name: value, + }); + }; + + const handleChangeTab = (event, newValue) => { + setValue(newValue); + }; + + const handleChangeIndex = (index) => { + setValue(index); + }; + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + const SaveData = (data) => { + setName(data.name); + setOwner(data.publisher.name); + setAuthor(data.author); + setReviewAverage(data.review_average); + setLikesCount(data.likes_count); + setViewsCount(data.views_count); + setScore(data.score); + setCreateAt(DisplayDate(data.created_at)); + setUpdateAt(DisplayDate(data.updated_at)); + setDescription(data.description); + }; + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + //handle submit + const onSubmit = async () => { + setIsLoading(true); + const api = EditFilter("learning_objects", id); + const body = { + "learning_object": { + "author": author, + "name": name, + "description": text, + "object_type_id": [objectType.id], + "language_ids": languagesID, + }, + }; + console.log(text) + putRequest( + api, + body, + (data, header) => { + if (data.id) { + HandleSnack( + "O objeto educacional foi alterada com sucesso", + true, + "success", + "#228B22" + ); + } else { + if (data.errors) { + HandleSnack(`${data.errors[0]}`, true, 'warning', '#FA8072') + } + if (data.author) { + let authorError = ""; + data.author.map((msg) => (authorError = authorError + msg + " e ")); + setErrorInAuthor({ + error: true, + message: authorError, + }); + } + if (data.language) { + let languageErr = ""; + data.language.map( + (msg) => (languageErr = languageErr + msg + " e ") + ); + HandleSnack("LÃngua" + languageErr, true, "warning", "#FFC125"); + } + } + setIsLoading(false); + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + setIsLoading(false); + } + ); + }; + + // Fields + const fields = [ + { + label: "ID", + value: id, + default: true, + type: "text", + }, + { + label: "Nome", + value: name, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event), + default: false, + required: true, + type: "text", + }, + { + label: "Dono(a)", + value: owner, + error: errorInOwner.error, + errorMessage: errorInOwner.message, + onChange: (event) => OwnerHandler(event), + default: false, + required: true, + type: "text", + }, + { + label: "Autor(a)", + value: author, + error: errorInAuthor.error, + errorMessage: errorInAuthor.message, + onChange: (event) => AuthorHandler(event), + default: false, + required: true, + type: "text", + }, + ]; + + const Imutables = [ + { + label: "Score", + value: SCORE, + default: true, + type: "text", + }, + { + label: "Criado em", + value: CREATE_AT, + default: true, + type: "text", + }, + { + label: "Atualizado em", + value: UPDATE_AT, + default: true, + type: "text", + }, + { + label: "View count", + value: VIEWS_COUNT, + default: true, + type: "text", + }, + { + label: "Likes count", + value: LIKES_COUNT, + default: true, + type: "text", + }, + { + label: "Review average", + value: REVIEW_AVERAGE, + default: true, + type: "text", + }, + ]; + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === "admin" || roles[i].name === "editor") + canUserEdit = true; + } else { + canUserEdit = false; + } + + return canUserEdit; + }; + + useEffect(() => { + const urls = [ + `/learning_objects/${id}`, + "/languages", + "/object_types", + ]; + fetchAllRequest( + urls, + (data) => { + const auxiliarLanguages = [...data[1]]; + const auxiliarLanguagesId = []; + const objectLanguagesId = []; + data[0].language.map((lan) => objectLanguagesId.push(lan.id)); + data[1].map((lan) => auxiliarLanguagesId.push(lan.id)); + for (let i = 0; i < objectLanguagesId.length; i++) { + const lan = objectLanguagesId[i]; + const index = auxiliarLanguagesId.indexOf(lan); + auxiliarLanguages.splice(index, 1); + auxiliarLanguagesId.splice(index, 1); + } + const auxiliarObjects = [...data[2]]; + const auxiliarObjectsName = []; + const objectTypeName = data[0].object_type; + data[2].map((obj) => auxiliarObjectsName.push(obj.name)); + const index = auxiliarObjectsName.indexOf(objectTypeName); + setObjectType({ + id: auxiliarObjects[index].id, + name: auxiliarObjects[index].name, + }); + auxiliarObjects.splice(index, 1); + auxiliarObjectsName.splice(index, 1); + + SaveData(data[0]); + setLanguagesID(data[0].language); + setListOfLanguages(auxiliarLanguages); + setListOfObjectTypes(auxiliarObjects); + setIsLoaded(true); + }, + (error) => { + console.log(error); + setError(true); + } + ); + }, []); + + if (error) { + return <div> Houve um erro... </div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." />; + } else if (CheckUserPermission()) { + return ( + <Card variant="outlined"> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + <CardContent> + <Grid + container + direction="row" + justify="space-between" + xs={12} + alignContent="center" + alignItems="center" + > + <Grid item> + <Typography variant="h4">{name}</Typography> + </Grid> + <Grid item> + <Link + style={{ textDecoration: "none" }} + to={"/admin/learningObjects"} + > + <Button + startIcon={<ListRoundedIcon />} + variant="outlined" + color="primary" + > + Listar + </Button> + </Link> + </Grid> + </Grid> + + <Tabs + value={value} + onChange={handleChangeTab} + indicatorColor="primary" + textColor="primary" + variant="fullWidth" + aria-label="full width tabs example" + > + <Tab label="Resumo" {...a11yProps(0)} /> + <Tab label="Descrição" {...a11yProps(1)} /> + <Tab label="Imutáveis" {...a11yProps(2)} /> + </Tabs> + + <SwipeableViews + axis={theme.direction === "rtl" ? "x-reverse" : "x"} + index={value} + onChangeIndex={handleChangeIndex} + > + <TabPanel value={value} index={0} dir={theme.direction}> + <form style={{ display: "flex", flexDirection: "column" }}> + {fields.map((field, index) => ( + <TextField + key={index} + required={field.required} + disabled={field.default} + error={field.error} + helperText={field.error ? field.errorMessage : ""} + style={{ width: "250px", marginBottom: "1em" }} + label={field.label} + defaultValue={field.value} + onBlur={field.onChange} + type="search" + multiline + /> + ))} + {languagesID.map((data) => { + return ( + <li + key={data.id} + style={{ listStyleType: "none", marginBottom: "0.5em" }} + > + <Chip + label={data.name} + onDelete={ + data === "React" ? undefined : handleDeleteLan(data) + } + className={classes.chip} + /> + </li> + ); + })} + <TextField + id="standard-select-currency" + select + label="LÃnguas" + style={{ width: "250px", marginBottom: "1em" }} + > + {listOfLanguages.map((option) => ( + <MenuItem + key={option.id} + value={option.name} + onClick={() => { + handleChangeLan(option.id, option.name); + }} + > + {option.name} + </MenuItem> + ))} + </TextField> + + <li style={{ listStyleType: "none", marginBottom: "0.5em" }}> + <Chip label={objectType.name} className={classes.chip} /> + </li> + <TextField + id="standard-select-currency" + select + label="Object type" + style={{ width: "250px", marginBottom: "1em" }} + > + {listOfObjectTypes.map((option) => ( + <MenuItem + key={option.id} + value={option.name} + onClick={() => { + handleChangeObj(option.id, option.name); + }} + > + {option.name} + </MenuItem> + ))} + </TextField> + </form> + </TabPanel> + + <TabPanel value={value} index={1} dir={theme.direction}> + <CKEditor + editor={ClassicEditor} + data={description} + onBlur={(event, editor) => { + const data = editor.getData(); + setDescription(data) + }} + /> + </TabPanel> + + <TabPanel value={value} index={2} dir={theme.direction}> + <form style={{ display: "flex", flexDirection: "column" }}> + {Imutables.map((field, index) => ( + <TextField + key={index} + disabled={field.default} + style={{ width: "250px", marginBottom: "1em" }} + label={field.label} + defaultValue={field.value} + /> + ))} + </form> + </TabPanel> + </SwipeableViews> + </CardContent> + + <CardAction> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <SaveIcon />} + > + {isLoading ? <CircularProgress size={24} /> : "Salvar"} + </Button> + </CardAction> + </Card> + ); + } else return <Unauthorized />; +}; + +export default EditEducationalObject; diff --git a/src/Admin/Components/Components/Inputs/EditLanguage.js b/src/Admin/Components/Components/Inputs/EditLanguage.js new file mode 100644 index 0000000000000000000000000000000000000000..44df71ceed76a2846983700ced3f66f60143e7e4 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/EditLanguage.js @@ -0,0 +1,316 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from 'react'; +//imports material ui components +import { Typography, TextField, Button, Grid, ButtonGroup } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardAction from '@material-ui/core/CardActions'; +import ListRoundedIcon from '@material-ui/icons/ListRounded'; +import SaveIcon from '@material-ui/icons/Save'; +//imports local files +import SnackBar from '../../../../Components/SnackbarComponent'; +import { Store } from '../../../../Store'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +//imports services +import { getRequest, putRequest, deleteRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import { EditFilter, GetAData, DeleteFilter } from '../../../Filters'; +import DeleteRoundedIcon from "@material-ui/icons/DeleteRounded"; +//routers +import { Link, useHistory } from 'react-router-dom'; +import Unauthorized from '../Unauthorized'; + +const EditLanguage = () => { + const { state } = useContext(Store); + let history = useHistory() + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("language"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + + const [isLoading, setIsLoading] = useState(false); + const [name, setName] = useState() + const [code, setCode] = useState() + + const [errorInName, setErrorInName] = useState({ + error: false, + message: '' + }) + + const [errorInCode, setErrorInCode] = useState({ + error: false, + message: '' + }) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + async function DeleteHandler() { + deleteRequest( + DeleteFilter("languages", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + else { + HandleSnack( + "A lÃngua foi deletada com sucesso", + true, + "success", + "#228B22" + ); + history.push("/admin/languages") + } + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + } + ); + } + + const NameHandler = (e) => { + if (errorInName.error) { + setErrorInName({ + error: false, + message: '' + }) + } + setName(e.target.value) + } + + const CodeHandler = (e) => { + if (errorInCode.error) { + setErrorInCode({ + error: false, + message: '' + }) + } + setCode(e.target.value) + } + + // Fields + const fields = [ + { + label: 'ID', + value: id, + default: true, + type: 'text' + }, + { + label: 'Nome', + value: name, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event), + default: false, + type: 'text', + }, + { + label: 'Código', + value: code, + error: errorInCode.error, + errorMessage: errorInCode.message, + onChange: (event) => CodeHandler(event), + default: false, + type: 'text' + }, + ] + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + + const onSubmit = async () => { + setIsLoading(true) + const api = EditFilter('languages', id) + const body = { + "language": { + 'name': name, + 'code': code, + } + } + putRequest( + api, + body, + (data) => { + if (data.id) + HandleSnack('A linguagem foi alterada com sucesso!', true, 'success', '#228B22') + else { + if (data.errors) { + HandleSnack(`${data.errors[0]}`, true, 'warning', '#FA8072') + } + if (data.name) { + let errorName = ""; + data.name.map((err) => ( + errorName = errorName + err + " e " + )) + setErrorInName({ + error: true, + message: errorName + }) + } + if (data.code) { + let errorcode = ""; + data.code.map((err) => ( + errorcode = errorcode + err + " e " + )) + setErrorInCode({ + error: true, + message: errorcode + }) + } + } + setIsLoading(false) + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + + useEffect(() => { + getRequest( + GetAData("languages", id), + (data, header) => { + setIsLoaded(true); + setName(data.name) + setCode(data.code) + }, + (error) => { + setIsLoaded(true); + setError(error); + } + ) + }, []); + + if (error) { + return <div> Houve um erro... </div> + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else if (CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container direction='row' justify='space-between' alignContent="center" alignItems="center"> + <Typography variant='h4'> + {name} + </Typography> + <ButtonGroup> + <Link style={{ textDecoration: 'none' }} to={'/admin/languages'}> + <Button + startIcon={<ListRoundedIcon />} + variant='outlined' + color='primary' + > + Listar + </Button> + </Link> + <Button + startIcon={<DeleteRoundedIcon />} + color="secondary" + variant="outlined" + onClick={DeleteHandler} + > + Deletar + </Button> + </ButtonGroup> + </Grid> + + <div style={{ height: '1em' }}></div> + + <form style={{ display: 'flex', flexDirection: 'column' }}> + {fields.map((field, index) => ( + <TextField + key={index} + required={field.required} + disabled={field.default} + error={field.error} + helperText={field.error ? field.errorMessage : ''} + style={{ width: '250px', marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type="search" + multiline={true} + /> + ))} + </form> + </CardContent> + <CardAction> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <SaveIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Salvar' + } + </Button> + </CardAction> + </Card> + ) + } else return <Unauthorized /> +} + +export default EditLanguage; \ No newline at end of file diff --git a/src/Admin/Components/Components/Inputs/EditRating.js b/src/Admin/Components/Components/Inputs/EditRating.js new file mode 100644 index 0000000000000000000000000000000000000000..1b8e0e6fd7c2c054f389dd7f62316778c4aebfa1 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/EditRating.js @@ -0,0 +1,289 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from 'react'; +//imports material ui components +import { Typography, TextField, Button, Grid } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardAction from '@material-ui/core/CardActions'; +import ListRoundedIcon from '@material-ui/icons/ListRounded'; +import SaveIcon from '@material-ui/icons/Save'; +//imports local files +import SnackBar from '../../../../Components/SnackbarComponent'; +import { Store } from '../../../../Store'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +//imports services +import { getRequest, putRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import { EditFilter, GetAData } from '../../../Filters'; +//routers +import { Link } from 'react-router-dom'; +import Unauthorized from '../Unauthorized'; + +const EditRating = () => { + const { state } = useContext(Store); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("rating"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + + const [isLoading, setIsLoading] = useState(false); + const [name, setName] = useState() + const [description, setDescription] = useState() + + const [errorInName, setErrorInName] = useState({ + error: false, + message: '' + }) + + const [errorInDescription, setErrorInDescription] = useState({ + error: false, + message: '' + }) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const NameHandler = (e) => { + if (errorInName.error) { + setErrorInName({ + error: false, + message: '' + }) + } + setName(e.target.value) + } + + const DescriptionHandler = (e) => { + if (errorInDescription.error) { + setErrorInDescription({ + error: false, + message: '' + }) + } + setDescription(e.target.value) + } + + + //Verify if the string is empty + const isEmpty = (text) => { + return text.length === 0 ? true : false; + } + + // Fields + const fields = [ + { + label: 'ID', + value: id, + default: true, + type: 'text' + }, + { + label: 'Nome', + value: name, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event), + default: false, + required: true, + type: 'text', + }, + { + label: 'Descrição', + value: description, + error: errorInDescription.error, + errorMessage: errorInDescription.message, + onChange: (event) => DescriptionHandler(event), + default: false, + required: true, + type: 'text' + }, + ] + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + + const onSubmit = async () => { + setIsLoading(true) + if (!isEmpty(name) && !isEmpty(description)) { + const api = EditFilter('ratings', id) + const body = { + "rating": { + 'name': name, + 'description': description, + } + } + putRequest( + api, + body, + (data, header) => { + if (data.errors) + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + else + HandleSnack('O rating foi alterada com sucesso', true, 'success', '#228B22') + setIsLoading(false) + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + else { + HandleSnack('Você precisa preencher algumas informações obrigatórias', true, 'warning', '#FFC125') + if (isEmpty(name)) { + setErrorInName({ + error: true, + message: 'Este campo precisa ser preenchido' + }) + } + if (isEmpty(description)) { + setErrorInDescription({ + error: true, + message: 'Este campo precisa ser preenchido' + }) + } + setIsLoading(false) + } + } + + useEffect(() => { + getRequest( + GetAData("ratings", id), + (data, header) => { + setIsLoaded(true); + setName(data.name) + setDescription(data.description) + }, + (error) => { + setIsLoaded(true); + setError(true); + } + ) + }, []); + + if (error) { + return <div> Houve um erro... </div> + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else if (CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container direction='row' justify='space-between' alignContent="center" alignItems="center" xs={12}> + <Grid item> + <Typography variant='h4'> + {name} + </Typography> + </Grid> + <Grid item> + <Link style={{ textDecoration: 'none' }} to={'/admin/Ratings'}> + <Button + startIcon={<ListRoundedIcon />} + variant='outlined' + color='primary' + > + Listar + </Button> + </Link> + </Grid> + </Grid> + + <div style={{ height: '1em' }}></div> + + <form style={{ display: 'flex', flexDirection: 'column' }}> + {fields.map((field, index) => ( + <TextField + key={index} + required={field.required} + disabled={field.default} + error={field.error} + helperText={field.error ? field.errorMessage : ''} + style={{ width: '250px', marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type="search" + multiline={true} + /> + ))} + </form> + </CardContent> + <CardAction> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <SaveIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Salvar' + } + </Button> + </CardAction> + </Card> + ) + } else return <Unauthorized /> +} + +export default EditRating; \ No newline at end of file diff --git a/src/Admin/Components/Components/Inputs/EditRoles.js b/src/Admin/Components/Components/Inputs/EditRoles.js new file mode 100644 index 0000000000000000000000000000000000000000..4b3aa488a8d6f8d2334d29a55680b49ed8020787 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/EditRoles.js @@ -0,0 +1,310 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from 'react'; +//imports material ui components +import { Typography, TextField, Button, Grid } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardAction from '@material-ui/core/CardActions'; +import ListRoundedIcon from '@material-ui/icons/ListRounded'; +import SaveIcon from '@material-ui/icons/Save'; +import ButtonGroup from "@material-ui/core/ButtonGroup"; +import DeleteRoundedIcon from "@material-ui/icons/DeleteRounded"; +//imports local files +import SnackBar from '../../../../Components/SnackbarComponent'; +import { Store } from '../../../../Store'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +//imports services +import { getRequest, putRequest, deleteRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import { EditFilter, GetAData, DeleteFilter } from '../../../Filters'; +//routers +import { Link, useHistory } from 'react-router-dom'; +import Unauthorized from '../Unauthorized'; + +const EditLanguage = () => { + const { state } = useContext(Store); + let history = useHistory() + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("role"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + + const [isLoading, setIsLoading] = useState(false); + const [name, setName] = useState() + const [desc, setDesc] = useState() + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + const [errorInName, setErrorInName] = useState({ + error: false, + message: '' + }) + + const [errorInDesc, setErrorInDesc] = useState({ + error: false, + message: '' + }) + + const NameHandler = (e) => { + if (errorInName.error) { + setErrorInName({ + error: false, + message: '' + }) + } + setName(e.target.value) + } + + const DescHandler = (e) => { + if (errorInDesc.error) { + setErrorInDesc({ + error: false, + message: '' + }) + } + setDesc(e.target.value) + } + + // Fields + const fields = [ + { + label: 'ID', + value: id, + default: true, + type: 'text' + }, + { + label: 'Nome', + value: name, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event), + default: false, + type: 'text', + }, + { + label: 'Descrição', + value: desc, + error: errorInDesc.error, + errorMessage: errorInDesc.message, + onChange: (event) => DescHandler(event), + default: false, + type: 'text' + }, + ] + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + + const onSubmit = async () => { + setIsLoading(true) + const api = EditFilter('roles', id) + const body = { + "role": { + 'name': name, + 'description': desc, + } + } + putRequest( + api, + body, + (data) => { + if (data.id) + HandleSnack('A role foi alterada com sucesso', true, 'success', '#228B22') + else { + if (data.errors) { + HandleSnack(`${data.errors[0]}`, true, 'warning', '#FA8072') + } + else { + HandleSnack('Você precisa preencher algumas informações obrigatórias', true, 'warning', '#FFC125') + if (data.name) { + let errorName = ""; + data.name.map((err) => ( + errorName = errorName + err + " e " + )) + setErrorInName({ + error: true, + message: errorName + }) + } + } + } + setIsLoading(false) + }, + (error) => { + console.log(error) + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + + async function DeleteHandler() { + deleteRequest( + DeleteFilter("roles", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + else { + HandleSnack( + "A permissão foi deletada com sucesso", + true, + "success", + "#228B22" + ); + history.goBack() + } + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + } + ); + } + + useEffect(() => { + getRequest( + GetAData("roles", id), + (data, header) => { + setIsLoaded(true); + setName(data.name) + setDesc(data.description) + }, + (error) => { + setIsLoaded(true); + setError(error); + } + ) + }, []); + + if (error) { + return <div> Houve um erro... </div> + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else if (CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container direction='row' justify='space-between' alignContent="center" alignItems="center"> + <Typography variant='h4'> + {name} + </Typography> + <ButtonGroup> + <Link style={{ textDecoration: 'none' }} to={'/admin/permissions'}> + <Button + startIcon={<ListRoundedIcon />} + variant='outlined' + color='primary' + > + Listar + </Button> + </Link> + <Button + startIcon={<DeleteRoundedIcon />} + color="secondary" + variant="outlined" + onClick={DeleteHandler} + > + Deletar + </Button> + </ButtonGroup> + </Grid> + + <div style={{ height: '1em' }}></div> + + <form style={{ display: 'flex', flexDirection: 'column' }}> + {fields.map((field, index) => ( + <TextField + key={index} + required={field.required} + disabled={field.default} + error={field.error} + helperText={field.error ? field.errorMessage : ''} + style={{ width: '250px', marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type="search" + multiline={true} + /> + ))} + </form> + </CardContent> + <CardAction> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <SaveIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Salvar' + } + </Button> + </CardAction> + </Card> + ) + } else return <Unauthorized /> +} + +export default EditLanguage; \ No newline at end of file diff --git a/src/Admin/Components/Components/Inputs/EditUser.js b/src/Admin/Components/Components/Inputs/EditUser.js new file mode 100644 index 0000000000000000000000000000000000000000..fe9a61c8931170c9685afa20e5a1ac118d569511 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/EditUser.js @@ -0,0 +1,627 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from 'react'; +//imports material ui components +import { Typography, TextField, Button, Grid } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardAction from '@material-ui/core/CardActions'; +import ListRoundedIcon from '@material-ui/icons/ListRounded'; +import Chip from '@material-ui/core/Chip'; +import { makeStyles } from '@material-ui/core/styles'; +import SaveIcon from '@material-ui/icons/Save'; +import DeleteRoundedIcon from '@material-ui/icons/DeleteRounded'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import Switch from '@material-ui/core/Switch'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import MenuItem from '@material-ui/core/MenuItem'; +//imports local files +import SnackBar from '../../../../Components/SnackbarComponent'; +import { Store } from '../../../../Store'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +//imports services +import { getRequest, putRequest, deleteRequest, postRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import { EditFilter, GetAData } from '../../../Filters'; +//routers +import { Link, useHistory } from 'react-router-dom'; +import Unauthorized from '../Unauthorized'; + +const useStyles = makeStyles((theme) => ({ + root: { + display: 'flex', + justifyContent: 'center', + flexWrap: 'wrap', + listStyle: 'none', + padding: theme.spacing(0.5), + margin: 0, + }, + chip: { + margin: theme.spacing(0.5), + }, +})); + +const EditUser = () => { + const classes = useStyles(); + let history = useHistory(); + const { state } = useContext(Store) + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("id"); + + const [error, setError] = useState(id !== "-1" ? null : false); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(id === "-1" ? true : false); //Necessary to consult the API, wait until complete + + const [switchState, setSwitchState] = useState(id !== "-1" ? false : false) + const [isLoading, setIsLoading] = useState(false); + const [name, setName] = useState(id !== "-1" ? "" : "Novo usuário") + const [email, setEmail] = useState("") + const [description, setDescription] = useState("") + const [pass, setPass] = useState("") + const [confirmPass, setConfirmPass] = useState("") + const [rolesList, setRolesList] = useState([ + { + id: 1, + value: "teacher" + }, + { + id: 2, + value: "student" + }, + { + id: 3, + value: "admin" + }, + { + id: 4, + value: "curator" + }, + { + id: 5, + value: "moderator" + }, + { + id: 6, + value: "supervisor" + }, + { + id: 7, + value: "editor" + }, + { + id: 9, + value: "partner" + }, + { + id: 10, + value: "publisher" + }, + { + id: 11, + value: "submitter" + }, + ]) + const [userRoles, setUserRoles] = useState([]) + + + const [errorInName, setErrorInName] = useState({ + error: false, + message: '' + }) + const [errorInEmail, setErrorInEmail] = useState({ + error: false, + message: '' + }) + const [errorInDesc, setErrorInDesc] = useState({ + error: false, + message: '' + }) + const [errorInPass, setErrorInPass] = useState({ + error: false, + message: '' + }) + const [errorInConfirmPass, setErrorInConfirmPass] = useState({ + error: false, + message: '' + }) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const NameHandler = (e) => { + if (errorInName.error) { + setErrorInName({ + error: false, + message: '' + }) + } + setName(e.target.value) + } + + const EmailHandler = (e) => { + if (errorInEmail.error) { + setErrorInEmail({ + error: false, + message: '' + }) + } + setEmail(e.target.value) + } + + const DescHandler = (e) => { + if (errorInDesc.error) { + setErrorInDesc({ + error: false, + message: '' + }) + } + setDescription(e.target.value) + } + + const PassHandler = (e) => { + if (errorInPass.error) { + setErrorInPass({ + error: false, + message: '' + }) + } + setPass(e.target.value) + } + + const ConfirmPassHandler = (e) => { + if (errorInConfirmPass.error) { + setErrorInConfirmPass({ + error: false, + message: '' + }) + } + setConfirmPass(e.target.value) + } + + // Fields + const fields = [ + { + label: 'ID', + value: id, + default: true, + type: 'text' + }, + { + label: 'Nome', + value: name, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event), + default: false, + type: 'text', + }, + { + label: 'Email', + value: email, + error: errorInEmail.error, + errorMessage: errorInEmail.message, + onChange: (event) => EmailHandler(event), + default: false, + type: 'text' + }, + { + label: 'Descrição', + value: description, + error: errorInDesc.error, + errorMessage: errorInDesc.message, + onChange: (event) => DescHandler(event), + default: false, + type: 'text' + }, + { + label: 'Senha', + value: pass, + error: errorInPass.error, + errorMessage: errorInPass.message, + onChange: (event) => PassHandler(event), + default: id !== "-1" ? true : false, + type: 'text' + }, + { + label: 'Confirmar senha', + value: confirmPass, + error: errorInConfirmPass.error, + errorMessage: errorInConfirmPass.message, + onChange: (event) => ConfirmPassHandler(event), + default: id !== "-1" ? true : false, + type: 'text' + }, + ] + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + const handleDelete = (chipToDelete) => () => { + const currRolesList = [...rolesList]; + currRolesList.push({ + id: chipToDelete.id, + value: chipToDelete.name + }) + setRolesList(currRolesList) + setUserRoles((chips) => chips.filter((chip) => chip.id !== chipToDelete.id)); + }; + + const deleteUser = (userId) => { + deleteRequest( + `/users/${userId}`, + (data) => { + if (data.errors) + HandleSnack("Erro!", true, "warning", "#FA8072"); + else { + HandleSnack(`${name} deletado com sucesso!`, true, "success", "#228B22"); + history.push("/admin/usersList") + } + }, + (error) => { + HandleSnack("Erro!", true, "warning", "#FA8072"); + } + ) + } + + const onSubmit = async () => { + setIsLoading(true) + let userRolesID = []; + const api = EditFilter('users', id) + userRoles.map((role) => ( + userRolesID.push(role.id) + )) + const body = { + "user": { + "name": name, + "email": email, + "description": description, + "role_ids": userRolesID, + "terms_of_service": switchState + } + } + putRequest( + api, + body, + (data) => { + setIsLoading(false) + if (data.id) + HandleSnack(`O usuário: ${name} foi atualizado`, true, 'success', '#228B22') + else { + if (data.errors) { + HandleSnack(`${data.errors[0]}`, true, 'warning', '#FA8072') + } + if (data.email) { + let emailError = ""; + data.email.map((msg) => ( + emailError = emailError + msg + " e " + )) + setErrorInEmail({ + error: true, + message: emailError + }) + } + if (data.terms_of_service) { + let termsError = "termos de serviço "; + data.terms_of_service.map((msg) => ( + termsError = termsError + msg + " e " + )) + HandleSnack(termsError, true, 'warning', '#FFC125') + } + } + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + + const onCreate = () => { + setIsLoading(true) + let userRolesID = []; + const api = "/users" + userRoles.map((role) => ( + userRolesID.push(role.id) + )) + const body = { + "user": { + "name": name, + "email": email, + "description": description, + "role_ids": userRolesID, + "password": pass, + "password_confirmation": confirmPass, + "terms_of_service": switchState + } + } + postRequest( + api, + body, + (data) => { + setIsLoading(false) + if (data.id) { + HandleSnack(`O usuário: ${name} foi criado`, true, 'success', '#228B22') + history.push("/admin/usersList") + } + else { + if (data.errors) { + HandleSnack(`${data.errors[0]}`, true, 'warning', '#FA8072') + } + if (data.password) { + let passError = ""; + data.password.map((msg) => ( + passError = passError + msg + " e " + )) + setErrorInPass({ + error: true, + message: passError + }) + } + if (data.email) { + let emailError = ""; + data.email.map((msg) => ( + emailError = emailError + msg + " e " + )) + setErrorInEmail({ + error: true, + message: emailError + }) + } + if (data.terms_of_service) { + let termsError = ""; + data.terms_of_service.map((msg) => ( + termsError = termsError + msg + " e " + )) + HandleSnack(termsError, true, 'warning', '#FFC125') + } + if (data.password_confirmation) { + let confirmError = ""; + data.password_confirmation.map((msg) => ( + confirmError = confirmError + msg + " e " + )) + setErrorInConfirmPass({ + error: true, + message: confirmError + }) + } + } + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + + const handleChange = (id, value) => { + const currUserRoles = [...userRoles]; + currUserRoles.push( + { + id: id, + name: value, + } + ) + setRolesList((chips) => chips.filter((chip) => chip.id !== id)); + setUserRoles(currUserRoles); + }; + + useEffect(() => { + if (id !== "-1") { + getRequest( + GetAData("users", id), + (data, header) => { + const currRolesList = [...rolesList]; + const auxiliarRolesId = [ + 1, 2, 3, 4, 5, 6, 7, 9, 10, 11 + ] + for (let i = 0; i < data.roles.length; i++) { + const rol = data.roles[i]; + const index = auxiliarRolesId.indexOf(rol.id); + currRolesList.splice(index, 1); + auxiliarRolesId.splice(index, 1); + } + setRolesList(currRolesList); + setName(data.name) + setEmail(data.email) + setDescription(data.description) + setUserRoles(data.roles) + setSwitchState(data.terms_accepted_at ? true : false) + setIsLoaded(true); + }, + (error) => { + setIsLoaded(true); + setError(error); + } + ) + } + }, []); + + if (error) { + return <div> Houve um erro... </div> + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else if (CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container direction='row' justify='space-between' alignItems="center"> + <Grid item> + <Typography variant='h4'> + {name} + </Typography> + </Grid> + <Grid item> + <Grid container direction="row"> + <Grid item> + <Link style={{ textDecoration: 'none' }} to={'/admin/usersList'}> + <Button + startIcon={<ListRoundedIcon />} + variant='outlined' + color='primary' + > + Listar + </Button> + </Link> + </Grid> + { + id !== "-1" ? + <Grid item> + <Button + startIcon={<DeleteRoundedIcon />} + color="secondary" + variant="outlined" + onClick={() => { deleteUser(id) }} + > + Deletar + </Button> + </Grid> : null + } + </Grid> + </Grid> + </Grid> + <div style={{ height: '1em' }}></div> + <form style={{ display: 'flex', flexDirection: 'column' }}> + {fields.map((field, index) => ( + field.value !== "-1" ? + <TextField + key={index} + required={field.required} + disabled={field.default} + error={field.error} + helperText={field.error ? field.errorMessage : ''} + style={{ width: '250px', marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type="search" + multiline={true} + /> : null + ))} + {userRoles.map((data) => { + return ( + <li key={data.id} style={{ listStyleType: "none" }}> + <Chip + label={data.name} + onDelete={data === 'React' ? undefined : handleDelete(data)} + className={classes.chip} + /> + </li> + ); + })} + <TextField + id="standard-select-currency" + select + label="Permissões" + style={{ width: '250px', marginBottom: '1em' }} + > + {rolesList.map((option) => ( + <MenuItem key={option.id} value={option.value} onClick={() => { handleChange(option.id, option.value) }}> + {option.value} + </MenuItem> + ))} + </TextField> + <FormControlLabel + control={ + <Switch + checked={switchState} + onChange={() => { setSwitchState(!switchState) }} + name="checkedB" + color="primary" + /> + } + label="Concorda com os termos de serviço?" + /> + </form> + </CardContent> + <CardAction> + { + id !== "-1" ? + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <SaveIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Salvar' + } + </Button> + : + <Button + onClick={() => { + onCreate(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <AddRoundedIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Criar' + } + </Button> + } + </CardAction> + </Card> + ) + } else return <Unauthorized /> +} + +export default EditUser; diff --git a/src/Admin/Components/Components/Inputs/EmailInputs.js b/src/Admin/Components/Components/Inputs/EmailInputs.js new file mode 100644 index 0000000000000000000000000000000000000000..f75e8b482316ff43cea4ddff066ef9896ef81798 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/EmailInputs.js @@ -0,0 +1,503 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState } from "react"; +//material ui components +import TextField from "@material-ui/core/TextField"; +import MenuItem from "@material-ui/core/MenuItem"; +import FormGroup from "@material-ui/core/FormGroup"; +import FormControlLabel from "@material-ui/core/FormControlLabel"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import Checkbox from "@material-ui/core/Checkbox"; +import SendRoundedIcon from "@material-ui/icons/SendRounded"; +import Button from "@material-ui/core/Button"; +import { makeStyles } from '@material-ui/core/styles'; +import Chip from '@material-ui/core/Chip'; +//imports from local files +import SnackBar from "../../../../Components/SnackbarComponent"; +import { postRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import ClassicEditor from "@ckeditor/ckeditor5-build-classic" +import { CKEditor } from '@ckeditor/ckeditor5-react'; + +const useStyles = makeStyles((theme) => ({ + root: { + display: 'flex', + justifyContent: 'center', + flexWrap: 'wrap', + listStyle: 'none', + padding: theme.spacing(0.5), + margin: 0, + }, + chip: { + margin: theme.spacing(0.5), + }, +})); + +const EmailInputs = (props) => { + const classes = useStyles(); + const [option, setOption] = useState(props.email ? "Emails" : "All"); //labels of the text field 'to' + const [isToEmails, setIsToEmails] = useState(props.email ? true : false) + const [isToAll, setIsToAll] = useState(props.email ? false : true) + const [isToRoles, setIsToRoles] = useState(false) + + // Capture th text insert by the user in the fields + const [emails, setEmails] = useState(props.email ? props.email : ""); + const [emailsAdress, setEmailsAdress] = useState([]); + const [subject, setSubject] = useState(""); + const [message, setMessage] = useState(""); + + const [isSending, setIsSending] = useState(false); + + //Handle snack bar + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + //Controls the state of error in the textfields + const [errorInEmails, setErrorInEmail] = useState({ + error: false, + arroba: false, + message: "", + }); + const [errorInSubject, setErrorInSubject] = useState({ + error: false, + message: "", + }); + + const options = [ + { + value: "All", + label: "Todos os usuários", + }, + { + value: "Roles", + label: "Roles/Permissões especÃficas", + }, + { + value: "Emails", + label: "1 ou mais emails", + }, + ]; + + //Roles of permissions + const [roles, setRoles] = useState([ + { + label: "Editor", + value: 7, + isChecked: false, + }, + { + label: "Admin", + value: 3, + isChecked: false, + }, + { + label: "Curador", + value: 4, + isChecked: false, + }, + { + label: "Professor", + value: 1, + isChecked: false, + }, + { + label: "Submetedor", + value: 8, + isChecked: false, + }, + { + label: "Aluno", + value: 2, + isChecked: false, + }, + { + label: "Moderador", + value: 5, + isChecked: false, + }, + { + label: "Parceiro", + value: 9, + isChecked: false, + }, + { + label: "Supervisor", + value: 6, + isChecked: false, + }, + { + label: "Publicador", + value: 10, + isChecked: false, + }, + ]); + + const handleChange = (e) => { + const value = e.target.value; + if (value === 'All') { + setIsToAll(true) + setIsToEmails(false) + setIsToRoles(false) + } + if (value === 'Emails') { + setIsToEmails(true) + setIsToRoles(false) + setIsToAll(false) + } + if (value === 'Roles') { + setIsToRoles(true) + setIsToAll(false) + setIsToEmails(false) + } + setOption(value) + }; + + const handleChangeCheckBox = (i) => { + const currState = [...roles]; + currState[i].isChecked = !currState[i].isChecked; + setRoles(currState); + }; + + const EmailsHandler = (e) => { + if (errorInEmails.error) + setErrorInEmail({ + error: false, + message: "", + }); + setEmails(e.target.value) + }; + + const SubjectHandler = (e) => { + if (errorInSubject.error) { + setErrorInSubject({ + error: false, + message: "", + }); + } + setSubject(e.target.value); + }; + + const OnKeyPressHandler = (key) => { + if (key === 13) { + if (!itsEmpty(emails)) { + if (emails.includes("@")) { + const arr = [...emailsAdress]; + arr.push(emails); + setEmails(""); + setEmailsAdress(arr); + } else { + setErrorInEmail({ + error: true, + message: "Esse email não contém o caractere @", + arroba: false, + }); + } + } else { + setErrorInEmail({ + error: true, + message: "Esse campo precisa ser preenchido", + arroba: false, + }); + } + } + }; + + //Delete emails adress from the list to be sent a message + const HandleDelete = (i) => { + const copyEmail = [...emailsAdress]; + copyEmail.splice(i, 1); + setEmailsAdress(copyEmail); + }; + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + const CleanFields = () => { + setMessage(""); + setSubject(""); + setEmailsAdress([]); + }; + + const itsEmpty = (obj) => { + return obj.length === 0 + } + + const submitRequest = async () => { + setIsSending(true); + + const rolesArr = []; + const api = `/email`; + const body = { + "email": { + "all_users": isToAll, + "subject": subject, + "body": message, + "emails": isToEmails ? emailsAdress : [], + "roles": isToRoles ? rolesArr : [], + }, + }; + + for (let index = 0; index < roles.length; index++) { + const role = roles[index] + if (role.isChecked) + rolesArr.push(role.value) + } + + if (isToRoles && !itsEmpty(rolesArr) && !itsEmpty(subject) && !itsEmpty(body)) + postRequest( + api, + body, + (data, header) => { + HandleSnack( + "O email foi enviado com sucesso", + true, + "success", + "#228B22" + ); + setIsSending(false); + CleanFields(); + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + setIsSending(false); + CleanFields(); + } + ) + else if (isToEmails && !itsEmpty(emailsAdress) && !itsEmpty(subject) && !itsEmpty(body)) + postRequest( + api, + body, + (data, header) => { + HandleSnack( + "O email foi enviado com sucesso", + true, + "success", + "#228B22" + ); + setIsSending(false); + CleanFields(); + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + setIsSending(false); + CleanFields(); + } + ) + else if (isToAll && !itsEmpty(emailsAdress) && !itsEmpty(subject) && !itsEmpty(body)) + postRequest( + api, + body, + (data, header) => { + HandleSnack( + "O email foi enviado com sucesso", + true, + "success", + "#228B22" + ); + setIsSending(false); + CleanFields(); + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + setIsSending(false); + CleanFields(); + } + ) + else { + HandleSnack( + "Você precisa preencher todos os campos!", + true, + "warning", + "#FFC125" + ); + setIsSending(false); + } + }; + + return ( + <div + style={{ + width: "100%", + display: "flex", + flexDirection: "column", + justifyContent: "space-around", + }} + > + <form + style={{ + flex: 1, + display: "flex", + flexDirection: "column", + }} + > + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + + <TextField + id="outlined-input" + label="De *" + defaultValue="integrada.contato@mec.gov.br" + variant="outlined" + disabled={true} + /> + <div style={{ height: "1em" }} /> + + <TextField + select + label="Para *" + value={option ? option : ""} + onChange={handleChange} + helperText="Por favor, selecione uma das opções" + > + {options.map((option, index) => ( + <MenuItem + key={option.value} + value={option.value} + > + {option.label} + </MenuItem> + ))} + </TextField> + <div style={{ height: "1em" }} /> + { + isToRoles && + <FormGroup style={{ marginBottom: "1em" }}> + {roles.map((role, index) => ( + <FormControlLabel + key={index} + control={ + <Checkbox + checked={role.isChecked} + onChange={() => handleChangeCheckBox(index)} + name={role.label} + color="primary" + /> + } + label={role.label} + /> + ))} + </FormGroup> + } + { + isToEmails && + <> + <div + style={{ + display: "flex", + flexDirection: "row", + flexWrap: "wrap", + justifyContent: "Space-between", + marginBottom: "1em" + }} + > + {emailsAdress.map((email, index) => ( + <li key={index} style={{ listStyleType: "none", marginBottom: "0.5em" }}> + <Chip + label={email} + onDelete={() => HandleDelete(index)} + classes={classes.chip} + /> + </li> + ))} + </div> + <TextField + id="outlined-input" + label="Emails" + rows={1} + error={errorInEmails.error} + helperText={errorInEmails.message} + value={emails} + onKeyPress={(key) => OnKeyPressHandler(key.which)} + onChange={EmailsHandler} + // onBlur={ShowEmails} + placeholder="Digite um email por vez e pressione Enter" + variant="outlined" + style={{ marginBottom: "1em" }} + /> + </> + } + <TextField + id="outlined-input" + label="Assunto" + value={subject} + error={errorInSubject.error} + helperText={errorInSubject.message} + placeholder="Digite o assunto do email" + onChange={SubjectHandler} + variant="outlined" + /> + </form > + + <div style={{ height: "1em" }} /> + + <div style={{ flex: 1 }}> + <CKEditor + editor={ClassicEditor} + data={message} + onBlur={(event, editor) => { + const data = editor.getData(); + setMessage(data) + }} + /> + </div> + + <div style={{ fontSize: 14 }}> + * Se você deseja enviar foto da sua máquina, é preciso <a href="mailto:name@email.com">Clicar aqui</a> + </div> + + <div style={{ marginTop: 18 }}> + <Button + onClick={() => { + submitRequest(); + }} + variant="contained" + disabled={isSending} + color="primary" + startIcon={<SendRoundedIcon />} + > + {isSending ? <CircularProgress size={24} /> : "Enviar"} + </Button> + </div> + </div > + ); +}; + +export default EmailInputs; diff --git a/src/Admin/Components/Components/Inputs/IntitutionsInputs.js b/src/Admin/Components/Components/Inputs/IntitutionsInputs.js new file mode 100644 index 0000000000000000000000000000000000000000..148f006fd401c3e485beb476954f6a324f7d25d3 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/IntitutionsInputs.js @@ -0,0 +1,321 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from 'react'; +//imports material ui components +import { TextField, Button } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import SaveIcon from '@material-ui/icons/Save'; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import Grid from "@material-ui/core/Grid"; +//imports local files +import Unauthorized from '../Unauthorized'; +import SnackBar from '../../../../Components/SnackbarComponent'; +import { Store } from '../../../../Store'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +//imports services +import { putRequest, getRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import { EditFilter, GetAData } from '../../../Filters'; +//Routers +import { Link } from 'react-router-dom'; + +const EditInstitution = () => { + const { state } = useContext(Store); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("institution"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + + const [name, setName] = useState(); + const [description, setDescription] = useState(); + const [adress, setAdress] = useState(); + const [city, setCity] = useState(); + const [country, setCountry] = useState(); + + //Used to display circle progress indicator when user click to save + const [isLoading, setIsLoading] = useState(false); + + const [errorInName, setErrorInName] = useState({ + error: false, + message: '', + }) + + const [errorInCountry, setErrorInCountry] = useState({ + error: false, + message: '', + }) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const NameHandler = (e) => { + if (errorInName.error) { + setErrorInName({ + error: false, + message: '' + }) + } + setName(e.target.value) + } + const DescriptionHandler = (e) => { + setDescription(e.target.value) + } + const AdressHandler = (e) => { + setAdress(e.target.value) + } + const CityHandler = (e) => { + setCity(e.target.value) + } + const CountryHandler = (e) => { + if (errorInCountry.error) { + setErrorInCountry({ + error: false, + message: '' + }) + } + setCountry(e.target.value) + } + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + //Handle submit + async function onSubmit() { + setIsLoading(true) + const api = EditFilter('institutions', id) + const body = { + "institution": { + 'name': name, + 'description': description, + 'address': adress, + 'city': city, + 'country': country, + } + } + putRequest( + api, + body, + (data) => { + if (data.id) + HandleSnack('A instituição foi criada com sucesso!', true, 'success', '#228B22') + else { + if (data.errors) { + HandleSnack(`${data.errors[0]}`, true, 'warning', '#FA8072') + } + else { + HandleSnack('Você precisa preencher algumas informações obrigatórias', true, 'warning', '#FFC125') + if (data.name) { + let errorName = ""; + data.name.map((err) => ( + errorName = errorName + err + " e " + )) + setErrorInName({ + error: true, + message: errorName + }) + } + } + } + setIsLoading(false) + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + + // Fields + const fields = [ + { + label: 'Nome', + value: name, + required: true, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event) + }, + { + label: 'Descrição', + value: description, + required: false, + + onChange: (event) => DescriptionHandler(event) + }, + { + label: 'Endereço', + value: adress, + required: false, + + onChange: (event) => AdressHandler(event) + }, + { + label: 'Cidade', + value: city, + required: false, + onChange: (event) => CityHandler(event) + }, + { + label: 'PaÃs', + value: country, + required: true, + error: errorInCountry.error, + errorMessage: errorInCountry.message, + onChange: (event) => CountryHandler(event) + } + ] + + useEffect(() => { + + getRequest( + GetAData("institutions", id), + (data, header) => { + setIsLoaded(true); + setName(data.name) + setDescription(data.description) + setAdress(data.adress) + setCity(data.city) + setCountry(data.country) + }, + (error) => { + setIsLoaded(true); + setError(error); + } + ) + }, []); + + if (error) { + return <div> Erro... </div> + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else if (CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + <Grid container xs={12} justify="space-between" alignItems="center" alignContent="center"> + <Grid item> + <Typography + variant='h4' + color="inherit" + gutterBottom + > + {name} + </Typography> + </Grid> + + <Grid item> + <Link style={{ textDecoration: 'none' }} to={`/admin/intitutions`}> + <Button + startIcon={<ListRoundedIcon />} + color="primary" + variant="outlined" + > + Listar + </Button> + </Link> + </Grid> + </Grid> + + <div> + <div> + <form style={{ display: 'flex', flexDirection: 'column' }}> + {fields.map((field, index) => ( + <TextField + key={index} + required={field.required} + error={field.error} + helperText={field.error ? field.errorMessage : ''} + style={{ width: '250px', marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type="search" + multiline={true} + /> + ))} + </form> + </div> + <div> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <SaveIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Salvar' + } + </Button> + </div> + </div> + + </CardContent> + </Card> + ); + } else { + return <Unauthorized /> + } +} + +export default EditInstitution; \ No newline at end of file diff --git a/src/Admin/Components/Components/Inputs/NoteVarInputs.js b/src/Admin/Components/Components/Inputs/NoteVarInputs.js new file mode 100644 index 0000000000000000000000000000000000000000..3c1542ec851b700c0b53755592659fd2a7f9cd21 --- /dev/null +++ b/src/Admin/Components/Components/Inputs/NoteVarInputs.js @@ -0,0 +1,322 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from 'react'; +//imports material ui components +import { TextField, Button } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import SaveIcon from '@material-ui/icons/Save'; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import ListRoundedIcon from "@material-ui/icons/ListRounded"; +import Grid from '@material-ui/core/Grid'; +//imports local files +import SnackBar from '../../../../Components/SnackbarComponent'; +import { Store } from '../../../../Store'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +//imports services +import { getRequest, putRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import { EditFilter, GetAData } from '../../../Filters'; +//Routers +import { Link } from 'react-router-dom'; +import Unauthorized from '../Unauthorized'; + +const NoteVarInputs = () => { + const { state } = useContext(Store); + const urlParams = new URLSearchParams(window.location.search); + const id = urlParams.get("id"); + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + + const [isLoading, setIsLoading] = useState(false); + const [name, setName] = useState() + const [code, setCode] = useState() + const [weight, setWeight] = useState() + + const [errorInName, setErrorInName] = useState({ + error: false, + message: '' + }) + + const [errorInCode, setErrorInCode] = useState({ + error: false, + message: '' + }) + + const [errorInWeight, setErrorInWeight] = useState({ + error: false, + message: '' + }) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const NameHandler = (e) => { + if (errorInName.error) { + setErrorInName({ + error: false, + message: '' + }) + } + setName(e.target.value) + } + + const CodeHandler = (e) => { + if (errorInCode.error) { + setErrorInCode({ + error: false, + message: '' + }) + } + setCode(e.target.value) + } + + const WeightHandler = (e) => { + if (errorInWeight.error) { + setErrorInWeight({ + error: false, + message: '' + }) + } + setWeight(e.target.value) + } + + // Fields + const fields = [ + { + label: 'ID', + value: id, + default: true, + type: 'text' + }, + { + label: 'Código', + value: code, + error: errorInCode.error, + errorMessage: errorInCode.message, + onChange: (event) => CodeHandler(event), + default: true, + type: 'text' + }, + { + label: 'Nome', + value: name, + error: errorInName.error, + errorMessage: errorInName.message, + onChange: (event) => NameHandler(event), + default: false, + type: 'text', + }, + { + label: 'Peso', + value: weight, + error: errorInWeight.error, + errorMessage: errorInWeight.message, + onChange: (event) => WeightHandler(event), + default: false, + type: 'number', + } + ] + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const onSubmit = async () => { + setIsLoading(true) + const api = EditFilter('scores', id) + const body = { + "score": { + 'name': name, + 'code': code, + 'weight': weight + } + } + putRequest( + api, + body, + (data) => { + if (data.id) + HandleSnack('A variável de nota foi atualizada com sucesso!', true, 'success', '#228B22') + else { + if (data.errors) { + HandleSnack(`${data.errors[0]}`, true, 'warning', '#FA8072') + } + else { + HandleSnack('Você precisa preencher algumas informações obrigatórias', true, 'warning', '#FFC125') + if (data.name) { + let errorName = ""; + data.name.map((err) => ( + errorName = errorName + err + " e " + )) + setErrorInName({ + error: true, + message: errorName + }) + } + if (data.weight) { + let weightError = ""; + data.weight.map((err) => ( + weightError = weightError + err + " e " + )) + setErrorInWeight({ + error: true, + message: weightError + }) + } + } + } + setIsLoading(false) + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + setIsLoading(false) + } + ) + } + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } + + + useEffect(() => { + getRequest( + GetAData("scores", id), + (data, header) => { + setIsLoaded(true); + setName(data.name) + setCode(data.code) + setWeight(data.weight) + }, + (error) => { + setIsLoaded(true); + setError(true); + } + ) + }, []); + + if (error) { + return <div>Houve um erro...</div> + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else if (CheckUserPermission()) { + return ( + <Card> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <CardContent> + + <Grid container xs={12} justify="space-between" alignItems="center" alignContent="center"> + <Grid> + <Typography + variant='h4' + color="inherit" + gutterBottom + > + {name} + </Typography> + </Grid> + + <Grid> + <Link style={{ textDecoration: 'none' }} to={`/admin/noteVars`}> + <Button + startIcon={<ListRoundedIcon />} + color="primary" + variant="outlined" + > + Listar + </Button> + </Link> + </Grid> + </Grid> + + <form style={{ display: 'flex', flexDirection: 'column' }}> + {fields.map((field, index) => ( + <TextField + key={index} + error={field.error} + disabled={field.default} + helperText={field.error ? field.errorMessage : ''} + style={{ width: '250px', marginBottom: '1em' }} + label={field.label} + value={field.value} + onChange={field.onChange} + type={field.type} + multiline={true} + /> + ))} + </form> + + <div> + <Button + onClick={() => { + onSubmit(); + }} + variant="contained" + color="primary" + disabled={isLoading} + startIcon={isLoading ? null : <SaveIcon />} + > + { + isLoading ? <CircularProgress size={24} /> : 'Salvar' + } + </Button> + </div> + + </CardContent> + </Card> + ) + } else return <Unauthorized /> +} + +export default NoteVarInputs; \ No newline at end of file diff --git a/src/Admin/Components/Components/MobileComponents/MobilePageHeader.js b/src/Admin/Components/Components/MobileComponents/MobilePageHeader.js new file mode 100644 index 0000000000000000000000000000000000000000..f3520c9f12319310eba1544dd60d551aa001a29e --- /dev/null +++ b/src/Admin/Components/Components/MobileComponents/MobilePageHeader.js @@ -0,0 +1,61 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import Paper from "@material-ui/core/Paper" +import Grid from "@material-ui/core/Grid" +import Button from "@material-ui/core/Button" +import Typography from "@material-ui/core/Typography" +import CircularProgress from "@material-ui/core/CircularProgress" + +const MobilePageHeader = (props) => { + return ( + <Paper style={{ padding: "1em" }}> + <Grid container spacing={3} direction="row" alignItems="center"> + <Grid item xs={12}> + <Typography variant="h4">{props.title}</Typography> + </Grid> + <Grid + item + xs={12} + > + <Grid container justify="flex-start" spacing={3}> + {props.actions.map((act, index) => { + return ( + <Grid item key={act.name}> + <Button + variant="contained" + color="secondary" + disabled={act.isLoading} + onClick={act.func} + startIcon={act.icon} + > + {act.isLoading ? <CircularProgress size={24} /> : act.name} + </Button> + </Grid> + ) + })} + </Grid> + </Grid> + </Grid> + {props.children} + </Paper> + ) +} + +export default MobilePageHeader; \ No newline at end of file diff --git a/src/Admin/Components/Components/MobileComponents/SimpleList.js b/src/Admin/Components/Components/MobileComponents/SimpleList.js new file mode 100644 index 0000000000000000000000000000000000000000..f7afb24bc6b5a48f775d7561b71ceb57fe65b392 --- /dev/null +++ b/src/Admin/Components/Components/MobileComponents/SimpleList.js @@ -0,0 +1,123 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + + +import React from "react"; +import { makeStyles } from "@material-ui/core/styles"; +import clsx from "clsx"; +import Card from "@material-ui/core/Card"; +import CardHeader from "@material-ui/core/CardHeader"; +import CardContent from "@material-ui/core/CardContent"; +import Collapse from "@material-ui/core/Collapse"; +import Avatar from "@material-ui/core/Avatar"; +import IconButton from "@material-ui/core/IconButton"; +import Typography from "@material-ui/core/Typography"; +import VisibilityIcon from "@material-ui/icons/Visibility"; +import ExpandMoreIcon from "@material-ui/icons/ExpandMore"; +import { Link } from "react-router-dom"; + +const useStyles = makeStyles((theme) => ({ + expand: { + transform: "rotate(0deg)", + marginLeft: "auto", + transition: theme.transitions.create("transform", { + duration: theme.transitions.duration.shortest, + }), + }, + expandOpen: { + transform: "rotate(180deg)", + }, + displayColumn: { + display: "flex", + flexDirection: "column", + marginBottom: "1em", + }, + subTitle: { + fontSize: 14, + fontWeight: "500", + }, +})); + +export default function MobileList(props) { + const classes = useStyles(); + const [expanded, setExpanded] = React.useState(false); + + const handleExpandClick = () => { + setExpanded(!expanded); + }; + + return ( + <Card className={classes.root}> + <CardHeader + avatar={ + <Avatar + aria-label="avatar" + style={ + props.backColor + ? { backgroundColor: props.backColor } + : { backgroundColor: "grey" } + } + > + {props.avatar} + </Avatar> + } + title={props.title} + subheader={props.subtitle} + action={ + <> + { + props.href ? + <Link to={props.href}> + <IconButton + onClick={props.reset} + > + <VisibilityIcon style={{ fill: "#00bcd4" }} /> + </IconButton> + </Link> : null + } + + <IconButton + className={clsx(classes.expand, { + [classes.expandOpen]: expanded, + })} + onClick={handleExpandClick} + aria-expanded={expanded} + aria-label="show more" + > + <ExpandMoreIcon /> + </IconButton> + </> + } + /> + <Collapse in={expanded} timeout="auto" unmountOnExit> + <CardContent> + {props.data.map((info, index) => ( + <div className={classes.displayColumn} key={index}> + <Typography color="initial" className={classes.subTitle}> + {info.title} + </Typography> + <Typography color="textSecondary"> + {info.subtitle} + </Typography> + </div> + ))} + </CardContent> + </Collapse> + </Card> + ); +} diff --git a/src/Admin/Components/Components/PageHeader.js b/src/Admin/Components/Components/PageHeader.js new file mode 100644 index 0000000000000000000000000000000000000000..beef3c04f372e78dec96dbe82d252e787555e7e9 --- /dev/null +++ b/src/Admin/Components/Components/PageHeader.js @@ -0,0 +1,61 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import Paper from "@material-ui/core/Paper" +import Grid from "@material-ui/core/Grid" +import Button from "@material-ui/core/Button" +import Typography from "@material-ui/core/Typography" +import CircularProgress from "@material-ui/core/CircularProgress" + +const PageHeader = (props) => { + return ( + <Paper style={{ padding: "1em" }}> + <Grid container spacing={3} direction="row" alignItems="center"> + <Grid item xs={6}> + <Typography variant="h4">{props.title}</Typography> + </Grid> + <Grid + item + xs={6} + > + <Grid container justify="flex-end" spacing={3}> + {props.actions.map((act, index) => { + return ( + <Grid item key={act.name}> + <Button + variant="contained" + color="secondary" + disabled={act.isLoading} + onClick={act.func} + startIcon={act.icon} + > + {act.isLoading ? <CircularProgress size={24} /> : act.name} + </Button> + </Grid> + ) + })} + </Grid> + </Grid> + </Grid> + {props.children} + </Paper> + ) +} + +export default PageHeader; \ No newline at end of file diff --git a/src/Admin/Components/Components/Table.js b/src/Admin/Components/Components/Table.js new file mode 100644 index 0000000000000000000000000000000000000000..ddb7a377b4fea041f52c881835700312b7f8e6c8 --- /dev/null +++ b/src/Admin/Components/Components/Table.js @@ -0,0 +1,64 @@ +import React from 'react'; +// material ui componets +import Table from '@material-ui/core/Table'; +import { withStyles, makeStyles } from '@material-ui/core/styles'; +import TableCell from '@material-ui/core/TableCell'; +import TableContainer from '@material-ui/core/TableContainer'; +import TableHead from '@material-ui/core/TableHead'; +import TableRow from '@material-ui/core/TableRow'; +import Paper from '@material-ui/core/Paper'; +import FilterListRoundedIcon from '@material-ui/icons/FilterListRounded'; +import { IconButton } from '@material-ui/core'; + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const useStyles = makeStyles({ + table: { + minWidth: 700, + width: "100%" + }, +}); + + +const TableData = (props) => { + const classes = useStyles(); + return ( + <TableContainer component={Paper}> + <Table className={classes.table} aria-label="customized table"> + <TableHead> + <TableRow> + { + props.top.map((top, index) => ( + top === "ID" ? + <StyledTableCell key={index}> + <div style={{ display: 'flex', flexDirection: 'row', alignItems: 'center' }}> + {top} + { + props.onIconPressed && + <IconButton onClick={props.onIconPressed} color='primary'> + <FilterListRoundedIcon style={{ color: 'white' }} /> + </IconButton> + } + </div> + </StyledTableCell> + : + <StyledTableCell align="right" key={index}>{top}</StyledTableCell> + )) + } + </TableRow> + </TableHead> + {props.children} + </Table> + </TableContainer> + ); +} + +export default TableData; \ No newline at end of file diff --git a/src/Admin/Components/Components/Unauthorized.js b/src/Admin/Components/Components/Unauthorized.js new file mode 100644 index 0000000000000000000000000000000000000000..decfa6b5aa2504d3aedb0199faa97c66b84025d0 --- /dev/null +++ b/src/Admin/Components/Components/Unauthorized.js @@ -0,0 +1,41 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react'; +import SnackBar from '../../../Components/SnackbarComponent'; +import { Link } from 'react-router-dom'; +const Unauthorized = () => { + + const [openSnack, setOpenSnack] = useState(true); + + return ( + <div style={{ textAlign: 'center' }}> + <SnackBar + severity='warning' + text='Você não tem as permissões necessárias' + snackbarOpen={openSnack} + handleClose={() => setOpenSnack(false)} + /> + <Link to='/'> + Redirecionar para home + </Link> + </div> + ); +} + +export default Unauthorized; \ No newline at end of file diff --git a/src/Admin/Components/Components/Welcome.js b/src/Admin/Components/Components/Welcome.js new file mode 100644 index 0000000000000000000000000000000000000000..47e4f942e27534ce052b96183368b931c9fb77b1 --- /dev/null +++ b/src/Admin/Components/Components/Welcome.js @@ -0,0 +1,38 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import {Styles} from '../Styles/WelcomeStyle'; + +// This file is a component that says welcome to the user + +const Welcome = () => { + const classes = Styles(); + return( + <div style={classes.welcomeContainer}> + <p style={classes.welcomeTitle}> + Seja bem vindo ao portal do administrador + </p> + <p> + Qualquer indicação ou reclamação enviar ao email portalmec_tec@inf.ufpr.br . + </p> + </div> + ); +} + +export default Welcome; \ No newline at end of file diff --git a/src/Admin/Components/Styles/DataCard.js b/src/Admin/Components/Styles/DataCard.js new file mode 100644 index 0000000000000000000000000000000000000000..17083da50639dd57f55aaedbfd45f1f9a825735c --- /dev/null +++ b/src/Admin/Components/Styles/DataCard.js @@ -0,0 +1,56 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import { makeStyles } from "@material-ui/core/styles"; + +const useStyles = makeStyles({ + table: { + minWidth: 700, + }, + root: { + minWidth: 900, + boxShadow: "2px 2px 1px #A9A9A9", + }, + title: { + fontSize: 28, + fontWeight: "500", + }, + subTitle: { + fontSize: 14, + fontWeight: "500", + }, + pos: { + marginBottom: 12, + }, + displayRow: { + display: "flex", + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + }, + displayColumn: { + display: "flex", + flexDirection: "column", + marginBottom: "1em", + }, + marginTop : { + marginTop : '1em', + } +}); + +export { useStyles }; \ No newline at end of file diff --git a/src/Admin/Components/Styles/WelcomeStyle.js b/src/Admin/Components/Styles/WelcomeStyle.js new file mode 100644 index 0000000000000000000000000000000000000000..11364da864132b3ad83519ac3eaff9704ac81b7d --- /dev/null +++ b/src/Admin/Components/Styles/WelcomeStyle.js @@ -0,0 +1,33 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +const Styles = () => ({ + welcomeContainer : { + padding : '1em 1em', + borderRadius : '22px', + backgroundColor : 'white', + boxShadow : '2px 2px 1px #A9A9A9' + }, + welcomeTitle : { + fontWeight : 'bold', + fontSize : '20px', + } +}); + +export { Styles }; + diff --git a/src/Admin/Filters.js b/src/Admin/Filters.js new file mode 100644 index 0000000000000000000000000000000000000000..a36451c639ff53392fc48d64abdd84499899d3dc --- /dev/null +++ b/src/Admin/Filters.js @@ -0,0 +1,54 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +export function Url(type, filter, page , sort) { + const api = `/${type}?filter={${filter}}&page=${page}&range=[0,9]&results_per_page=10&sort=["id","${sort}"]` + return (api) +} + +export function GetOneOfAllUrl(type , filter){ + const api = `/${type}?filter={${filter}}` + return (api) +} + +export function MethodsToComplain(type , id, meth){ + const api = `/${type}/${id}/${meth}`; + return (api) +} + +export function GetAll(type){ + const api = `/${type}` + return (api) +} + + +export function GetAData(type , id){ + const api = `/${type}/${id}` + return (api) +} + + +export function EditFilter(type , id){ + const api = `/${type}/${id}` + return (api) +} + +export function DeleteFilter(type , id){ + const api = `/${type}/${id}` + return (api) +} \ No newline at end of file diff --git a/src/Admin/Pages/AdminLabelTabs/LabelTabs.js b/src/Admin/Pages/AdminLabelTabs/LabelTabs.js new file mode 100644 index 0000000000000000000000000000000000000000..54b2a0fdf2dfd40bbef4f5d36ee15c9d6b95f486 --- /dev/null +++ b/src/Admin/Pages/AdminLabelTabs/LabelTabs.js @@ -0,0 +1,127 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +//This file has the labels of the left menu navigation from admin page + +import React from "react"; +import HomeIcon from "@material-ui/icons/Home"; +import PeopleRoundedIcon from "@material-ui/icons/PeopleRounded"; +import ContactSupportRoundedIcon from "@material-ui/icons/ContactSupportRounded"; +import LanguageRoundedIcon from "@material-ui/icons/LanguageRounded"; +import AccountBalanceRoundedIcon from "@material-ui/icons/AccountBalanceRounded"; +import MenuBookRoundedIcon from "@material-ui/icons/MenuBookRounded"; +import StarRoundedIcon from "@material-ui/icons/StarRounded"; +import AccountCircleRoundedIcon from "@material-ui/icons/AccountCircleRounded"; +import TrendingUpRoundedIcon from "@material-ui/icons/TrendingUpRounded"; +import HelpRoundedIcon from "@material-ui/icons/HelpRounded"; +import CheckRoundedIcon from "@material-ui/icons/CheckRounded"; +import PersonRoundedIcon from "@material-ui/icons/PersonRounded"; +import BlockRoundedIcon from "@material-ui/icons/BlockRounded"; +import AnnouncementRoundedIcon from "@material-ui/icons/AnnouncementRounded"; +import EmailRoundedIcon from "@material-ui/icons/EmailRounded"; +import AllOutIcon from "@material-ui/icons/AllOut"; + +const orange = "#ff7f00"; +const pink = "#e81f4f"; +const purple = "#673ab7"; +const blue = "#00bcd4"; + +const TabsItens = [ + { + label: "Home", + href: '/admin/home', + icon: <HomeIcon style={{ fill: orange }} />, + }, + { + label: 'Coleções', + href: '/admin/Collections', + icon: <PeopleRoundedIcon style={{ fill: pink }} /> + }, + { + label: "Atividades", + href: '/admin/activities', + icon: <AllOutIcon style={{ fill: purple }} />, + }, + { + label: "Dúvidas da comunidade", + href: '/admin/CommunityQuestions', + icon: <ContactSupportRoundedIcon style={{ fill: blue }} />, + }, + { + label: "Instituições", + href: '/admin/intitutions', + icon: <AccountBalanceRoundedIcon style={{ fill: orange }} />, + }, + { + label: "Linguagens", + href: '/admin/languages', + icon: <LanguageRoundedIcon style={{ fill: pink }} />, + }, + { + label: "Objetos educacionais", + href: "/admin/learningObjects", + icon: <MenuBookRoundedIcon style={{ fill: purple }} />, + }, + { + label: "Rating", + href: '/admin/Ratings', + icon: <StarRoundedIcon style={{ fill: blue }} />, + }, + { + label: "Permissões do usuário", + href: "/admin/permissions", + icon: <AccountCircleRoundedIcon style={{ fill: orange }} />, + }, + { + label: "Variáveis de nota", + href: '/admin/noteVars', + icon: <TrendingUpRoundedIcon style={{ fill: pink }} />, + }, + { + label: "Perguntas curadoria", + href: "/admin/Questions", + icon: <HelpRoundedIcon style={{ fill: purple }} />, + }, + { + label: "Aprovação de professores", + href: "/admin/users/teacher_requests", + icon: <CheckRoundedIcon style={{ fill: blue }} />, + }, + { + label: "Usuários", + href: "/admin/usersList", + icon: <PersonRoundedIcon style={{ fill: orange }} />, + }, + { + label: "Usuários bloqueados", + href: "/admin/BlockedUsers", + icon: <BlockRoundedIcon style={{ fill: pink }} />, + }, + { + label: "Denúncias", + href: "/admin/complaints", + icon: <AnnouncementRoundedIcon style={{ fill: purple }} />, + }, + { + label: "Enviar email", + href: '/admin/sendEmail', + icon: <EmailRoundedIcon style={{ fill: blue }} />, + }, +]; + +export { TabsItens }; diff --git a/src/Admin/Pages/Pages/SubPages/Activity.js b/src/Admin/Pages/Pages/SubPages/Activity.js new file mode 100644 index 0000000000000000000000000000000000000000..c87c1b25fd2b7ce07aac8c36adf11909a794cd9a --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/Activity.js @@ -0,0 +1,435 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect, useState } from "react" +import moment from 'moment' +//imports from local files +import TableData from "../../../Components/Components/Table" +import SnackBar from "../../../../Components/SnackbarComponent" +import { Url } from "../../../Filters" +import { getRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import LoadingSpinner from '../../../../Components/LoadingSpinner' +import MobilePageHeader from '../../../Components/Components/MobileComponents/MobilePageHeader' +import PageHeader from '../../../Components/Components/PageHeader' +//imports from material ui +import { withStyles } from "@material-ui/core/styles" +import TableBody from "@material-ui/core/TableBody" +import TableCell from "@material-ui/core/TableCell" +import MenuItem from "@material-ui/core/MenuItem" +import TableRow from "@material-ui/core/TableRow" +import TextField from "@material-ui/core/TextField" +import IconButton from "@material-ui/core/IconButton" +import { Button, Paper } from "@material-ui/core" +import CircularProgress from "@material-ui/core/CircularProgress" +import AddRoundedIcon from "@material-ui/icons/AddRounded" +import UpdateRoundedIcon from "@material-ui/icons/UpdateRounded" +import FilterListRoundedIcon from "@material-ui/icons/FilterListRounded" +import VisibilityIcon from "@material-ui/icons/Visibility" +import AllOutIcon from "@material-ui/icons/AllOut" +//routers +import { Link } from 'react-router-dom' +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import styled from "styled-components" + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + "&:nth-of-type(odd)": { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const Activity = () => { + const ADD_ONE_LENGHT = [""]; + const TOP_LABELS = [ + "CRIADO EM", + "DONO(A)", + "ATIVIDADE", + "PRIVACIDADE", + "VISUALIZAR", + ]; //Labels from Table + const WINDOW_WIDTH = window.innerWidth + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false); //controlls the state of loadind more data + const [showFilter, setShowFilter] = useState(false); + const [option, setOption] = useState(); //labels of the text field 'to' + const [currPage, setCurrPage] = useState(0) + + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + const options = [ + { + name: "private", + value: "Privado", + }, + { + name: "public", + value: "Público", + }, + ]; + + //handle snack info + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + const handleChange = (e) => { + setOption(e.target.value); + }; + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const buildUrl = (privacyOpt) => { + if (privacyOpt) + return Url("activities", `"privacy" : "${privacyOpt}"`, currPage, "DESC") + + return Url("activities", "", currPage, "DESC") + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + buildUrl(option), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, option]) + + useEffect(() => { + setOption() + setCurrPage(0) + }, [showFilter]) + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + + if (WINDOW_WIDTH <= 820) { + return <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + + <MobilePageHeader + title="Atividades" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + } + ]} + > + {showFilter ? ( + <> + <div style={{ height: "1em" }}></div> + + <div style={{ alignSelf: "flex-end" }}> + <TextField + select + label="Filtro" + value={option ? option : ""} + onChange={handleChange} + helperText="Por favor, selecione uma das opções" + > + {options.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </div> + </> + ) : null} + </MobilePageHeader> + + <div style={{ height: "2em" }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton + key={new Date().toISOString() + row.created_at} + > + <Button + key={new Date().toISOString() + row.created_at} + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.id} + subtitle={row.privacy} + backColor={"#673ab7"} + avatar={<AllOutIcon />} + href={`/admin/activity?activity=${row.id}`} + reset={() => { + + }} + data={ + [ + { + title: "Dono(a)", + subtitle: row.owner ? row.owner.name : "Sem dados" + + }, + { + title: "Criado em", + subtitle: DisplayDate(row.created_at) + }, + { + title: "Atividade", + subtitle: row.activity + } + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </> + } + else { + return <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + <PageHeader + title="Atividades" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + } + ]} + > + {showFilter ? ( + <> + <div style={{ height: "1em" }}></div> + + <div style={{ alignSelf: "flex-end" }}> + <TextField + select + label="Filtro" + value={option ? option : ""} + onChange={handleChange} + helperText="Por favor, selecione uma das opções" + > + {options.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </div> + </> + ) : null} + </PageHeader> + + <div style={{ height: "2em" }}></div> + + <TableData top={TOP_LABELS}> + <TableBody> + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledTableRow key={new Date().toISOString() + row.created_at} style={{ padding: "1em" }}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledTableCell> + </StyledTableRow> + ) : ( + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row"> + {DisplayDate(row.created_at)} + </StyledTableCell> + <StyledTableCell align="right"> + { + row.owner ? row.owner.name : "" + } + </StyledTableCell> + <StyledTableCell align="right"> + {row.activity} + </StyledTableCell> + <StyledTableCell align="right">{row.privacy}</StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/activity?activity=${row.id}`}> + <IconButton> + <VisibilityIcon style={{ fill: "#00bcd4" }} /> + </IconButton> + </Link> + </StyledTableCell> + </StyledTableRow> + ) + )} + </TableBody> + </TableData> + </> + } + } +}; + + +export default Activity; + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` + diff --git a/src/Admin/Pages/Pages/SubPages/AproveTeacher.js b/src/Admin/Pages/Pages/SubPages/AproveTeacher.js new file mode 100644 index 0000000000000000000000000000000000000000..b8f7203ab10a3c0dfbb9ee471b47b77acd2ffe35 --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/AproveTeacher.js @@ -0,0 +1,770 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect, useState } from "react"; +import moment from "moment"; +import styled from "styled-components"; +//imports from local files +import TableData from "../../../Components/Components/Table"; +import SnackBar from "../../../../Components/SnackbarComponent"; +import { Url } from "../../../Filters"; +import LoadingSpinner from "../../../../Components/LoadingSpinner"; +import { + getRequest, + postRequest, +} from "../../../../Components/HelperFunctions/getAxiosConfig"; +import MobileList from "../../../Components/Components/MobileComponents/SimpleList"; +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader"; +import PageHeader from "../../../Components/Components/PageHeader"; +import { apiDomain } from '../../../../env'; +import noAvatar from "../../../../img/default_profile.png" +//imports from material ui +import { withStyles } from "@material-ui/core/styles"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import MenuItem from "@material-ui/core/MenuItem"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import IconButton from "@material-ui/core/IconButton"; +import { Button, Paper, Grid } from "@material-ui/core"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import AddRoundedIcon from "@material-ui/icons/AddRounded"; +import UpdateRoundedIcon from "@material-ui/icons/UpdateRounded"; +import FilterListRoundedIcon from "@material-ui/icons/FilterListRounded"; +import VisibilityIcon from "@material-ui/icons/Visibility"; +import CheckRoundedIcon from "@material-ui/icons/CheckRounded"; +import CloseRoundedIcon from "@material-ui/icons/CloseRounded"; +import EmailRoundedIcon from '@material-ui/icons/EmailRounded'; +//routers +import { Link } from "react-router-dom"; + + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + "&:nth-of-type(odd)": { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const AproveTeacher = () => { + const WINDOW_WIDTH = window.innerWidth + const ADD_ONE_LENGHT = [""]; + const TOP_LABELS = [ + "ESTADO DO PEDIDO", + "ID", + "NOME", + "EMAIL", + "PEDIDO EM(MM/DD/YYYY)", + "VISUALIZAR", + "AÇÕES", + ]; //Labels from Table + + const [invertList, setInvertList] = useState(false) + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false); //controlls the state of loadind more data + const [currPage, setCurrPage] = useState(0) + const [showFilter, setShowFilter] = useState(false); + + const [option, setOption] = useState("requested"); + const [name, setName] = useState(""); + const [nameValue, setNameValue] = useState("") + const [email, setEmail] = useState(""); + const [emailValue, setEmailValue] = useState("") + + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + const StateOptions = [ + { name: "requested", value: "Pendente" }, + { name: "accepted", value: "Aceito" }, + { name: "rejected", value: "Rejeitado" }, + ]; + + //handle snack info + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + const handleChange = (e, type) => { + const value = e.target.value; + setOption(value); + }; + + const NameHandler = (e) => { + setNameValue(e.target.value) + }; + + const EmailHandler = (e) => { + setEmailValue(e.target.value) + }; + + const removeItemFromList = (itemId) => { + let index = -1; + for (let i = 0; i < items.length; i++) { + const element = items[i]; + if (element.id === itemId) { + index = i + break + } + } + if (index !== -1) { + const cpyItems = [...items] + cpyItems.splice(index, 1) + setItems(cpyItems) + } + } + + const ComplaintStatus = (status) => { + switch (status) { + case "accepted": + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#228B22", + fontWeight: "500", + color: "#FFFAFA", + }} + > + ACEITO + </Paper> + ); + case "requested": + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#FF8C00", + fontWeight: "500", + color: "#FFFAFA", + }} + > + PENDENTE + </Paper> + ); + case "rejected": + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#FA8072", + fontWeight: "500", + color: "#FFFAFA", + }} + > + Rejeitado + </Paper> + ); + default: + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#797D7F ", + fontWeight: "500", + color: "#FFFAFA", + }} + > + Não requisitado + </Paper> + ); + } + }; + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const handleAprove = (userId, userName) => { + const url = `/users/${userId}/add_teacher`; + const body = { + approves: true, + }; + postRequest( + url, + body, + (data) => { + if (data.errors) HandleSnack("Erro!", true, "warning", "#FA8072"); + else { + HandleSnack( + `${userName} aceito como professor!`, + true, + "success", + "#228B22" + ); + setCurrPage(0) + removeItemFromList(userId) + } + }, + (error) => { + HandleSnack("Erro!", true, "warning", "#FA8072"); + } + ); + }; + + const handleReject = (userId, userName) => { + const url = `/users/${userId}/add_teacher`; + const body = { + approves: false, + }; + postRequest( + url, + body, + (data) => { + if (data.errors) HandleSnack("Erro!", true, "warning", "#FA8072"); + else { + HandleSnack( + `${userName} rejeitado como professor!`, + true, + "success", + "#228B22" + ); + setCurrPage(0) + removeItemFromList(userId) + } + }, + (error) => { + HandleSnack("Erro!", true, "warning", "#FA8072"); + } + ); + }; + + const cleanArrayAndInvert = () => { + setInvertList(!invertList) + setCurrPage(0) + setItems([]) + } + + const buildUrl = (email, submitter_request, name, direction) => { + if (email && submitter_request && name) + return Url("users", `"submitter_request" : "${submitter_request}", "email" : "${email}", "name" : "${name}"`, currPage, direction) + + else if (email && name) + return Url("users", `"email" : "${email}", "name" : "${name}"`, currPage, direction) + else if (email && submitter_request) + return Url("users", `"email" : "${email}", "submitter_request" : "${submitter_request}"`, currPage, direction) + else if (name && submitter_request) + return Url("users", `"name" : "${name}", "submitter_request" : "${submitter_request}"`, currPage, direction) + + else if (email) + return Url("users", `"email" : "${email}"`, currPage, direction) + else if (submitter_request) + return Url("users", `"submitter_request" : "${submitter_request}"`, currPage, direction) + else if (name) + return Url("users", `"name" : ${name}`, currPage, direction) + else + return Url("users", "", currPage, direction) + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + buildUrl(email, option, name, invertList ? "ASC" : "DESC"), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, option, email, name, invertList]) + + useEffect(() => { + setOption("requested") + setName("") + setNameValue("") + setEmail("") + setEmailValue("") + }, [showFilter]) + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." />; + } else { + if (WINDOW_WIDTH <= 1130) { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + <MobilePageHeader + title="Aprovação de professores" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + }, + { + name: "Inverter lista", + isLoading: false, + func: () => { + cleanArrayAndInvert() + }, + } + ]} + > + {showFilter ? ( + <> + <div style={{ height: "1em" }}></div> + {showFilter ? ( + <Grid + container + direction="row" + justify="space-between" + alignItems="center" + alignContent="flex-end" + spacing={3} + xs={12} + > + <Grid item> + <TextField + select + label="Estado" + value={option ? option : ""} + onChange={handleChange} + helperText="Por favor, selecione uma das opções" + > + {StateOptions.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </Grid> + <Grid item> + <TextField + label="Nome" + onChange={NameHandler} + value={nameValue} + onBlur={(event) => { setName(event.target.value) }} + helperText="Retire o foco do campo de texto ao terminar de digitar" + /> + </Grid> + <Grid item> + <TextField + label="Email" + onChange={EmailHandler} + value={emailValue} + onBlur={(event) => { setEmail(event.target.value) }} + helperText="Retire o foco do campo de texto ao terminar de digitar" + /> + </Grid> + </Grid> + ) : null} + </> + ) : null} + </MobilePageHeader> + + <div style={{ height: "2em" }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton> + <Button + key={new Date().toISOString() + row.created_at} + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.name} + subtitle={row.id} + backColor={"#00bcd4"} + avatar={ + <img + src={row.avatar ? apiDomain + row.avatar : noAvatar} + alt="user avatar" + style={{ + height: "100%", + width: "100%", + borderRadius: "50%", + }} + /> + } + href={`/admin/user?id=${row.id}`} + reset={() => { + + }} + data={[ + { + title: "Email", + subtitle: row.email ? + <Link to={`/admin/sendEmail?email=${row.email}`} style={{ textDecoration: 'none' }}> + <Button + variant='text' + color='primary' + startIcon={<EmailRoundedIcon />} + > + {row.email} + </Button> + </Link> : null + + }, + { + title: "Pedido em", + subtitle: DisplayDate(row.created_at), + }, + { + title: "Situação do pedido", + subtitle: ComplaintStatus(row.submitter_request), + }, + { + title: "Ações rápidas", + subtitle: <> + <Button + variant="contained" + color="secondary" + style={{ width: "100%" }} + disabled={ + row.submitter_request === "requested" ? false : true + } + startIcon={ + <CloseRoundedIcon style={{ fill: "#FFFAFA" }} /> + } + onClick={() => { + handleReject(row.id, row.name); + }} + > + Recusar + </Button> + <div style={{ height: "0.5em" }} /> + <Button + variant="contained" + color="primary" + style={{ width: "100%" }} + disabled={ + row.submitter_request === "requested" ? false : true + } + startIcon={ + <CheckRoundedIcon style={{ fill: "#FFFAFA" }} /> + } + onClick={() => { + handleAprove(row.id, row.name); + }} + > + Aceitar + </Button> + </> + } + ]} + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </> + ); + } else { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + + <PageHeader + title="Aprovação de professores" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + } + ]} + > + {showFilter ? ( + <> + <div style={{ height: "1em" }}></div> + {showFilter ? ( + <Grid + container + direction="row" + justify="space-between" + alignItems="center" + alignContent="flex-end" + spacing={3} + xs={12} + > + <Grid item> + <TextField + select + label="Estado" + value={option ? option : ""} + onChange={handleChange} + helperText="Por favor, selecione uma das opções" + > + {StateOptions.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </Grid> + <Grid item> + <TextField + label="Nome" + onChange={NameHandler} + value={nameValue} + onBlur={(event) => { setName(event.target.value) }} + helperText="Retire o foco do campo de texto ao terminar de digitar" + /> + </Grid> + <Grid item> + <TextField + label="Email" + onChange={EmailHandler} + value={emailValue} + onBlur={(event) => { setEmail(event.target.value) }} + helperText="Retire o foco do campo de texto ao terminar de digitar" + /> + </Grid> + </Grid> + ) : null} + </> + ) : null} + </PageHeader> + + <div style={{ height: "2em" }}></div> + + <Grid xs={12} container> + <TableData + top={TOP_LABELS} + onIconPressed={cleanArrayAndInvert} + > + <TableBody> + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledTableRow key={new Date().toISOString() + row.created_at}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledTableCell> + </StyledTableRow> + ) : ( + <StyledTableRow + key={new Date().toISOString() + index} + style={{ flex: 1, width: "100%" }} + > + <StyledTableCell component="th" scope="row"> + {ComplaintStatus(row.submitter_request)} + </StyledTableCell> + <StyledTableCell align="right">{row.id}</StyledTableCell> + <StyledTableCell align="right"> + {row.name} + </StyledTableCell> + <StyledTableCell align="right"> + {row.email} + </StyledTableCell> + <StyledTableCell align="right"> + {DisplayDate(row.created_at)} + </StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/user?id=${row.id}`}> + <IconButton> + <VisibilityIcon style={{ fill: "#00bcd4" }} /> + </IconButton> + </Link> + </StyledTableCell> + <StyledTableCell align="right"> + <Button + variant="contained" + color="secondary" + style={{ width: "100%" }} + disabled={ + row.submitter_request === "requested" ? false : true + } + startIcon={ + <CloseRoundedIcon style={{ fill: "#FFFAFA" }} /> + } + onClick={() => { + handleReject(row.id, row.name); + }} + > + Recusar + </Button> + <div style={{ height: "0.5em" }} /> + <Button + variant="contained" + color="primary" + style={{ width: "100%" }} + disabled={ + row.submitter_request === "requested" ? false : true + } + startIcon={ + <CheckRoundedIcon style={{ fill: "#FFFAFA" }} /> + } + onClick={() => { + handleAprove(row.id, row.name); + }} + > + Aceitar + </Button> + </StyledTableCell> + </StyledTableRow> + ) + )} + </TableBody> + </TableData> + </Grid> + </> + ); + } + } +}; +export default AproveTeacher; + +const StyledDivButton = styled(Paper)` + width: 100%; + display: flex; + justify-content: center; + align-items: center; +`; diff --git a/src/Admin/Pages/Pages/SubPages/BlockedUsers.js b/src/Admin/Pages/Pages/SubPages/BlockedUsers.js new file mode 100644 index 0000000000000000000000000000000000000000..84a4419b44d2cbb0a7c3d485b9c0b840fabd2014 --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/BlockedUsers.js @@ -0,0 +1,524 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, { useEffect, useState } from 'react'; +import moment from "moment"; +import styled from "styled-components" +//Material ui componets +import { withStyles } from '@material-ui/core/styles'; +import TableBody from '@material-ui/core/TableBody'; +import Grid from "@material-ui/core/Grid"; +import Paper from "@material-ui/core/Paper"; +import MenuItem from "@material-ui/core/MenuItem"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import TableCell from '@material-ui/core/TableCell'; +import RemoveCircleOutlineRoundedIcon from '@material-ui/icons/RemoveCircleOutlineRounded'; +import VisibilityIcon from '@material-ui/icons/Visibility'; +import { Button } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import UpdateRoundedIcon from '@material-ui/icons/UpdateRounded' +import EmailRoundedIcon from '@material-ui/icons/EmailRounded'; +//Local files +import TableData from '../../../Components/Components/Table'; +import SnackBar from '../../../../Components/SnackbarComponent'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import { apiDomain } from '../../../../env'; +import noAvatar from "../../../../img/default_profile.png"; +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import PageHeader from "../../../Components/Components/PageHeader" +//Services +import { getRequest, putRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import { Url } from '../../../Filters'; +//routers +import { Link } from 'react-router-dom'; + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const BlockedUsers = () => { + const ADD_ONE_LENGHT = ['']; + const WINDOW_WIDTH = window.innerWidth + + const [invertList, setInvertList] = useState(false) + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false) + const [stateOpt, setStateOpt] = useState(1) + const [currPage, setCurrPage] = useState(0) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + const StateOptions = [ + { + name: 1, + value: "Semanal" + }, + { + name: 2, + value: "Permanente" + } + ]; + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const handleChange = (event) => { + const type = event.target.value + setStateOpt(type) + } + + const BlockStatus = (status) => { + switch (status) { + case "blocked": + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#FF8C00", + fontWeight: "500", + color: "#FFFAFA", + }} + > + SEMANAL + </Paper> + ); + case "banished": + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "red", + fontWeight: "500", + color: "#FFFAFA", + }} + > + PERMANENTE + </Paper> + ); + default: + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#797D7F", + fontWeight: "500", + color: "#FFFAFA", + }} + > + Não avaliado + </Paper> + ); + } + }; + + const ReactiveUser = (userId, index) => { + putRequest( + `/users/${userId}/reactivate_user`, + {}, + (data) => { + if (data.errors) + HandleSnack('Erro!', true, 'warning', '#FA8072') + else { + HandleSnack('Usuário foi reativado com sucesso!', true, 'success', '#228B22') + removeItemFromList(index) + setCurrPage(0) + } + }, + (error) => { + HandleSnack('Erro!', true, 'warning', '#FA8072') + } + ) + } + + const removeItemFromList = (index) => { + const copyList = [...items] + copyList.splice(index, 1) + setItems(copyList) + } + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const cleanArrayAndInvert = () => { + setInvertList(!invertList) + setCurrPage(0) + setItems([]) + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + Url('users', `"state" : ${stateOpt}`, currPage, invertList ? "ASC" : 'DESC'), + + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, stateOpt, invertList]) + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + + //Words in the top part of the table + const topTable = ['ID', 'ESTADO', 'NAME', 'EMAIL', 'BLOQUEADO EM', 'AÇÕES']; + if (WINDOW_WIDTH <= 899) { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <MobilePageHeader + title="Lista de usuários bloqueados" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Inverter lista", + isLoading: false, + func: () => { + cleanArrayAndInvert() + }, + }, + ]} + > + <Grid item> + <TextField + select + label="Estado de bloqueio" + onChange={handleChange} + helperText="Por favor, selecione uma das opções" + > + {StateOptions.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </Grid> + </MobilePageHeader> + + <div style={{ height: '2em' }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton> + <Button + key={new Date().toISOString() + row.created_at} + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.name} + subtitle={row.id} + backColor={"#e81f4f"} + avatar={ + <img + src={row.avatar ? apiDomain + row.avatar : noAvatar} + alt="user avatar" + style={{ + height: "100%", + width: "100%", + borderRadius: "50%", + }} + /> + } + href={`/admin/user?id=${row.id}`} + reset={() => { + }} + data={ + [ + { + title: "Email", + subtitle: row.email ? + <Link to={`/admin/sendEmail?email=${row.email}`} style={{ textDecoration: 'none' }}> + <Button + variant='text' + color='primary' + startIcon={<EmailRoundedIcon />} + > + {row.email} + </Button> + </Link> : null + + }, + { + title: "Estado", + subtitle: BlockStatus(row.state) + }, + { + title: "Ações rápidas", + subtitle: <Button + style={{ width: "100%", marginBottom: "0.5em" }} + variant="contained" + color="secondary" + startIcon={<RemoveCircleOutlineRoundedIcon />} + onClick={() => ReactiveUser(row.id, index)} + > + Desbloquear + </Button> + } + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </div> + ) + } + else { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <PageHeader + title="Lista de usuários bloqueados" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + ]} + > + <Grid item> + <TextField + select + label="Estado de bloqueio" + onChange={handleChange} + helperText="Por favor, selecione uma das opções" + > + {StateOptions.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </Grid> + </PageHeader> + + <div style={{ height: '2em' }}></div> + + <TableData + top={topTable} + onIconPressed={cleanArrayAndInvert} + > + <TableBody> + {items.map((row, index) => ( + index === items.length - 1 ? + <StyledTableRow key={new Date().toISOString() + row.created_at}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color='primary' + variant='text' + disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + { + isLoadingMoreItems ? <CircularProgress size={24} /> : 'Carregar mais itens' + } + </Button> + </StyledTableCell> + </StyledTableRow> + + : + + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row">{row.id}</StyledTableCell> + <StyledTableCell align="right"> + {BlockStatus(row.state)} + </StyledTableCell> + <StyledTableCell align="right">{row.name}</StyledTableCell> + <StyledTableCell align="right"> + { + row.email ? + <Link to={`/admin/sendEmail?email=${row.email}`} style={{ textDecoration: 'none' }}> + <Button + variant='text' + color='primary' + startIcon={<EmailRoundedIcon />} + > + {row.email} + </Button> + </Link> : null + } + </StyledTableCell> + <StyledTableCell align="right"> + {DisplayDate(row.suspended_at)} + </StyledTableCell> + <StyledTableCell align="right"> + <Button + style={{ width: "100%", marginBottom: "0.5em" }} + variant="contained" + color="secondary" + startIcon={<RemoveCircleOutlineRoundedIcon />} + onClick={() => ReactiveUser(row.id, index)} + > + Desbloquear + </Button> + <Link to={`/admin/user?id=${row.id}`}> + <Button + style={{ width: "100%" }} + variant="contained" + color="primary" + startIcon={<VisibilityIcon />} + > + Visualizar + </Button> + </Link> + </StyledTableCell> + </StyledTableRow> + ))} + </TableBody> + </TableData> + </div> + ) + } + } +} + + +export default BlockedUsers; + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` \ No newline at end of file diff --git a/src/Admin/Pages/Pages/SubPages/Collections.js b/src/Admin/Pages/Pages/SubPages/Collections.js new file mode 100644 index 0000000000000000000000000000000000000000..dd15cbaefc69bf3b14657d8c13393f05b9c0edf0 --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/Collections.js @@ -0,0 +1,610 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect, useState } from "react"; +import moment from "moment"; +//imports from local files +import TableData from "../../../Components/Components/Table"; +import SnackBar from "../../../../Components/SnackbarComponent"; +import { Url, DeleteFilter } from "../../../Filters"; +import AlertDialog from "../../../Components/Components/AlertDialog"; +import LoadingSpinner from "../../../../Components/LoadingSpinner"; +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import PageHeader from "../../../Components/Components/PageHeader" +//imports from material ui +import { withStyles } from "@material-ui/core/styles"; +import TableBody from "@material-ui/core/TableBody"; +import PeopleRoundedIcon from "@material-ui/icons/PeopleRounded"; +import TableCell from "@material-ui/core/TableCell"; +import MenuItem from "@material-ui/core/MenuItem"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import IconButton from "@material-ui/core/IconButton"; +import { Button, Paper, Grid } from "@material-ui/core"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import AddRoundedIcon from "@material-ui/icons/AddRounded"; +import UpdateRoundedIcon from "@material-ui/icons/UpdateRounded"; +import FilterListRoundedIcon from "@material-ui/icons/FilterListRounded"; +import VisibilityIcon from "@material-ui/icons/Visibility"; +import DeleteIcon from "@material-ui/icons/Delete"; +import { + deleteRequest, + getRequest, +} from "../../../../Components/HelperFunctions/getAxiosConfig"; +//routers +import { Link } from "react-router-dom"; +import styled from 'styled-components' + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + "&:nth-of-type(odd)": { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const Collections = () => { + const ADD_ONE_LENGHT = [""]; + const TOP_LABELS = [ + "NOME", + "DESCRIÇÃO", + "DONO(A)", + "CRIAÇÃO", + "ATUALIZAÇÃO", + "PRIVACIDADE", + "VISUALIZAR", + "DELETAR", + ]; //Labels from Table + + const WINDOW_WIDTH = window.innerWidth; + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false); //controlls the state of loadind more data + + const [showFilter, setShowFilter] = useState(false); + const [valueOfSearch, setValueOfSearch] = useState("") + const [search, setSearch] = useState(""); + const [currPage, setCurrPage] = useState(0) + + const [openAlertDialog, setOpenAlertDialog] = useState(false); + const [deleteItem, setDeleteItem] = useState({}); //Delete Item + const [isLoadingToDelete, setIsLoadingToDelete] = useState(null); + const [option, setOption] = useState(); //labels of the text field 'to' + + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + const privacyOptions = [ + { name: "private", value: "Privado" }, + { name: "public", value: "Público" } + ]; + + + //handle snack info + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + //Defines which row must show the circular progress + const HandleStateCircularProgress = (i) => { + setIsLoadingToDelete(i); + }; + + //Called when user want to delete one institution + async function DeleteHandler() { + const id = deleteItem.id; + HandleStateAlertDialog(null); + deleteRequest( + DeleteFilter("collections", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + else { + HandleSnack( + "A Coleção foi deletada com sucesso", + true, + "success", + "#228B22" + ); + setCurrPage(0) + HandleStateCircularProgress(null); + removeItemFromList(id); + } + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + HandleStateCircularProgress(null); + } + ); + } + + //Controlls the state of the Alert Dialog + const HandleStateAlertDialog = (i) => { + const obj = { ...items[i] }; + setDeleteItem(obj); + setOpenAlertDialog(!openAlertDialog); + }; + + // handle change of privacy + const handleChange = (e) => { + setOption(e.target.value); + }; + + const HandleSearch = (e) => { + setValueOfSearch(e.target.value) + } + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const buildUrl = (privacyOpt, name) => { + if (privacyOpt && name) + return Url("collections", `"privacy" : "${privacyOpt}", "name" : "${name}"`, currPage, "DESC") + else if (privacyOpt) + return Url("collections", `"privacy" : "${privacyOpt}"`, currPage, "DESC") + else if (name) + return Url("collections", `"name" : "${name}"`, currPage, "DESC") + else + return Url("collections", "", currPage, "DESC") + } + + const removeItemFromList = (itemId) => { + let index = -1; + for (let i = 0; i < items.length; i++) { + const element = items[i]; + if (element.id === itemId) { + index = i + break + } + } + if (index !== -1) { + const cpyItems = [...items] + cpyItems.splice(index, 1) + setItems(cpyItems) + } + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + buildUrl(option, search), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, search, option]) + + useEffect(() => { + setCurrPage(0) + setOption() + setSearch("") + setValueOfSearch("") + }, [showFilter]) + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." />; + } else { + if (WINDOW_WIDTH <= 1024) { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + <MobilePageHeader + title="Coleções" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + } + ]} + > + {showFilter ? ( + <> + <div style={{ height: "1em" }}></div> + + <Grid + container + alignItems="center" + alignContent="center" + xs={12} + direction="row" + justify="space-between" + > + <Grid item> + <TextField + select + label="Filtro" + value={option} + onChange={handleChange} + helperText="Por favor, selecione uma das opções" + > + {privacyOptions.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </Grid> + + <Grid item> + <TextField + label="Pesquisa" + value={valueOfSearch} + helperText="Ao digitar, tire o foco do campo de texto" + onChange={(event) => HandleSearch(event)} + onBlur={(event) => setSearch(event.target.value)} + ></TextField> + </Grid> + </Grid> + </> + ) : null} + </MobilePageHeader> + + <div style={{ height: "2em" }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton + key={new Date().toISOString() + row.created_at} + > + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.name} + subtitle={row.privacy} + backColor={"#e81f4f"} + avatar={<PeopleRoundedIcon />} + href={`/admin/Collection?collection=${row.id}`} + reset={() => { + + }} + data={ + [ + { + title: "ID", + subtitle: row.id + + }, + { + title: "Dono(a)", + subtitle: row.owner ? row.owner.name : "Sem dados" + + }, + { + title: "Criado em", + subtitle: DisplayDate(row.created_at) + }, + { + title: "Atualizado em", + subtitle: DisplayDate(row.updated_at) + }, + { + title: "Deletar", + subtitle: + <Button + variant="contained" + color="secondary" + onClick={() => { + HandleStateAlertDialog(index); + HandleStateCircularProgress(index); + }} + startIcon={<DeleteIcon />} + > + Deletar + </Button> + } + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </> + ); + } + else { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + + <PageHeader + title="Coleções" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + } + ]} + > + {showFilter ? ( + <> + <div style={{ height: "1em" }}></div> + + <Grid + container + alignItems="center" + alignContent="center" + xs={12} + direction="row" + justify="space-between" + > + <Grid item> + <TextField + select + label="Filtro" + value={option} + onChange={handleChange} + helperText="Por favor, selecione uma das opções" + > + {privacyOptions.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </Grid> + + <Grid item> + <TextField + label="Pesquisa" + value={valueOfSearch} + helperText="Ao digitar, tire o foco do campo de texto" + onChange={(event) => HandleSearch(event)} + onBlur={(event) => setSearch(event.target.value)} + ></TextField> + </Grid> + </Grid> + </> + ) : null} + </PageHeader> + + <div style={{ height: "2em" }}></div> + + <TableData top={TOP_LABELS}> + <TableBody> + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledTableRow key={new Date().toISOString() + row.created_at}> + <StyledTableCell> + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledTableCell> + </StyledTableRow> + ) : ( + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row"> + {row.name} + </StyledTableCell> + <StyledTableCell align="right"> + <div + dangerouslySetInnerHTML={{ __html: row.description }} + ></div> + </StyledTableCell> + <StyledTableCell align="right"> + {row.owner ? row.owner.name : "Sem dados"} + </StyledTableCell> + <StyledTableCell align="right"> + {DisplayDate(row.created_at)} + </StyledTableCell> + <StyledTableCell align="right"> + {DisplayDate(row.updated_at)} + </StyledTableCell> + <StyledTableCell align="right">{row.privacy}</StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/Collection?collection=${row.id}`}> + <IconButton> + <VisibilityIcon style={{ fill: "#00bcd4" }} /> + </IconButton> + </Link> + </StyledTableCell> + <StyledTableCell align="right"> + {isLoadingToDelete === index ? ( + <CircularProgress size={24} color="primary" /> + ) : ( + <IconButton + onClick={() => { + HandleStateAlertDialog(index); + HandleStateCircularProgress(index); + }} + > + <DeleteIcon style={{ fill: "#FF0000" }} /> + </IconButton> + )} + </StyledTableCell> + </StyledTableRow> + ) + )} + </TableBody> + </TableData> + + {/* This alert will be displayed if the user click to delete an institution */} + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + </> + ); + } + } +}; +export default Collections; + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` + diff --git a/src/Admin/Pages/Pages/SubPages/CommunityQuestions.js b/src/Admin/Pages/Pages/SubPages/CommunityQuestions.js new file mode 100644 index 0000000000000000000000000000000000000000..4c93b941127ab8009536a7ada106ca0791ffec23 --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/CommunityQuestions.js @@ -0,0 +1,533 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect, useState } from "react"; +import moment from 'moment'; +//imports from local files +import TableData from "../../../Components/Components/Table"; +import SnackBar from "../../../../Components/SnackbarComponent"; +import { Url } from "../../../Filters"; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import { getRequest } from '../../../../Components/HelperFunctions/getAxiosConfig'; +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import PageHeader from "../../../Components/Components/PageHeader" +//imports from material ui +import { withStyles } from "@material-ui/core/styles"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import IconButton from "@material-ui/core/IconButton"; +import { Button, Paper, Grid } from "@material-ui/core"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import AddRoundedIcon from "@material-ui/icons/AddRounded"; +import UpdateRoundedIcon from "@material-ui/icons/UpdateRounded"; +import FilterListRoundedIcon from "@material-ui/icons/FilterListRounded"; +import VisibilityIcon from "@material-ui/icons/Visibility"; +import EmailRoundedIcon from '@material-ui/icons/EmailRounded'; +import ContactSupportRoundedIcon from "@material-ui/icons/ContactSupportRounded"; +//routers +import { Link } from 'react-router-dom'; +import styled from "styled-components" + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + "&:nth-of-type(odd)": { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const CommunityQuestion = () => { + + const ADD_ONE_LENGHT = [""]; + const TOP_LABELS = [ + "ID", + "DATA DE CONTATO", + "NOME", + "EMAIL", + "MENSAGEM", + "VISUALIZAR" + ]; //Labels from Table + const WINDOW_WIDTH = window.innerWidth + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false); //controlls the state of loadind more data + const [currPage, setCurrPage] = useState(0) + + //Works with the filter + const [invertList, setInvertList] = useState(false) + const [showFilter, setShowFilter] = useState(false) + const [valueOfMessageField, setValueOfMessageField] = useState("") + const [message, setMessage] = useState(""); + const [valueOfEmailField, setValueOfEmailField] = useState("") + const [email, setEmail] = useState(""); + const [valueOfNameField, setValueOfNameField] = useState("") + const [name, setName] = useState(""); + + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + //handle with the message filter + const valueOfMessageHandler = (e) => { + setValueOfMessageField(e.target.value) + } + + //handle with the email filter + const valueOfEmailHandler = (e) => { + setValueOfEmailField(e.target.value) + } + + //handle with the name filter + const valueOfNameHandler = (e) => { + setValueOfNameField(e.target.value) + } + + //handle snack info + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const cleanArrayAndInvert = () => { + setInvertList(!invertList) + setCurrPage(0) + setItems([]) + } + + const buildUrl = (message, email, name, direction) => { + if (message && email && name) + return Url("contacts", `"message" : "${message}", "email" : "${email}", "name" : "${name}"`, currPage, direction) + + else if (message && name) + return Url("contacts", `"message" : "${message}", "name" : "${name}"`, currPage, direction) + else if (message && email) + return Url("contacts", `"message" : "${message}", "email" : "${email}"`, currPage, direction) + else if (name && email) + return Url("contacts", `"name" : "${name}", "email" : "${email}"`, currPage, direction) + + else if (message) + return Url("contacts", `"message" : "${message}"`, currPage, direction) + else if (email) + return Url("contacts", `"email" : "${email}"`, currPage, direction) + else if (name) + return Url("contacts", `"name" : "${name}"`, currPage, direction) + else + return Url("contacts", "", currPage, direction) + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + buildUrl(message, email, name, invertList ? "ASC" : "DESC"), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, message, email, name, invertList]) + + useEffect(() => { + setCurrPage(0) + setName("") + setValueOfNameField("") + setEmail("") + setValueOfEmailField("") + setMessage("") + setValueOfMessageField("") + }, [showFilter]) + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + if (WINDOW_WIDTH <= 1200) { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + <MobilePageHeader + title="Dúvidas da comunidade" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + }, + { + name: "Inverter lista de dados", + isLoading: false, + func: () => { + cleanArrayAndInvert() + }, + } + ]} + > + {showFilter ? ( + <Grid + container + direction="row" + justify="space-between" + alignItems="center" + alignContent="flex-end" + spacing={3} + xs={12} + > + <Grid item> + <TextField + label="Email" + value={valueOfEmailField} + onChange={valueOfEmailHandler} + onBlur={(e) => { setEmail(e.target.value) }} + helperText="Por favor, ao digitar o email que você quer filtar, retire o foco do campo de texto" + > + </TextField> + </Grid> + <Grid item> + <TextField + label="Mensagem" + value={valueOfMessageField} + onChange={valueOfMessageHandler} + onBlur={(e) => { setMessage(e.target.value) }} + helperText="Por favor, ao digitar a mensagem que você quer filtar, retire o foco do campo de texto" + > + </TextField> + </Grid> + <Grid item> + <TextField + label="Nome" + value={valueOfNameField} + onChange={valueOfNameHandler} + onBlur={(e) => { setName(e.target.value) }} + helperText="Por favor, ao digitar o nome que você quer filtar, retire o foco do campo de texto" + > + </TextField> + </Grid> + </Grid> + ) : null} + </MobilePageHeader> + + <div style={{ height: "2em" }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton + key="Load more" + > + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={index} + title={row.name} + subtitle={row.id} + backColor={"#00bcd4"} + avatar={<ContactSupportRoundedIcon />} + href={`/admin/CommunityQuestion?question=${row.id}`} + reset={() => { + }} + data={ + [ + { + title: "Email", + subtitle: + row.email ? + <Link to={`/admin/sendEmail?email=${row.email}`} style={{ textDecoration: 'none' }}> + <Button + variant='text' + color='primary' + startIcon={<EmailRoundedIcon />} + > + {row.email} + </Button> + </Link> : null + + }, + { + title: "Mensagem", + subtitle: row.message + + }, + { + title: "Criado em", + subtitle: DisplayDate(row.created_at) + }, + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </> + ) + } + else { + return <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + + <PageHeader + title="Dúvidas da comunidade" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + } + ]} + > + {showFilter ? ( + <Grid + container + direction="row" + justify="space-between" + alignItems="center" + alignContent="flex-end" + spacing={3} + xs={12} + > + <Grid item> + <TextField + label="Email" + value={valueOfEmailField} + onChange={valueOfEmailHandler} + onBlur={(e) => { setEmail(e.target.value) }} + helperText="Por favor, ao digitar o email que você quer filtar, retire o foco do campo de texto" + > + </TextField> + </Grid> + <Grid item> + <TextField + label="Mensagem" + value={valueOfMessageField} + onChange={valueOfMessageHandler} + onBlur={(e) => { setMessage(e.target.value) }} + helperText="Por favor, ao digitar a mensagem que você quer filtar, retire o foco do campo de texto" + > + </TextField> + </Grid> + <Grid item> + <TextField + label="Nome" + value={valueOfNameField} + onChange={valueOfNameHandler} + onBlur={(e) => { setName(e.target.value) }} + helperText="Por favor, ao digitar o nome que você quer filtar, retire o foco do campo de texto" + > + </TextField> + </Grid> + </Grid> + ) : null} + </PageHeader> + + <div style={{ height: "2em" }}></div> + + <TableData top={TOP_LABELS} onIconPressed={cleanArrayAndInvert}> + <TableBody> + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledTableRow key={row.created_at} style={{ padding: "1em" }}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color="primary" + variant="text" + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledTableCell> + </StyledTableRow> + ) : ( + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row"> + {row.id} + </StyledTableCell> + <StyledTableCell align="right"> + {DisplayDate(row.created_at)} + </StyledTableCell> + <StyledTableCell align="right"> + {row.name} + </StyledTableCell> + <StyledTableCell align="right"> + { + row.email ? + <Link to={`/admin/sendEmail?email=${row.email}`} style={{ textDecoration: 'none' }}> + <Button + variant='text' + color='primary' + startIcon={<EmailRoundedIcon />} + > + {row.email} + </Button> + </Link> : null + } + </StyledTableCell> + <StyledTableCell align="right"> + {row.message} + </StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/CommunityQuestion?question=${row.id}`}> + <IconButton> + <VisibilityIcon style={{ fill: "#00bcd4" }} /> + </IconButton> + </Link> + </StyledTableCell> + </StyledTableRow> + ) + )} + </TableBody> + </TableData> + </> + } + } +} +export default CommunityQuestion; + + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` + diff --git a/src/Admin/Pages/Pages/SubPages/Complaints.js b/src/Admin/Pages/Pages/SubPages/Complaints.js new file mode 100644 index 0000000000000000000000000000000000000000..d03514dc91f170cd84c4807e42c5f4d643de036e --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/Complaints.js @@ -0,0 +1,652 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect, useState } from "react"; +import moment from "moment"; +//imports from local files +import TableData from "../../../Components/Components/Table"; +import SnackBar from "../../../../Components/SnackbarComponent"; +import { Url } from "../../../Filters"; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import { getRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import PageHeader from "../../../Components/Components/PageHeader" +//imports from material ui +import { withStyles } from "@material-ui/core/styles"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import MenuItem from "@material-ui/core/MenuItem"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import IconButton from "@material-ui/core/IconButton"; +import { Button, Paper, Grid } from "@material-ui/core"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import AddRoundedIcon from "@material-ui/icons/AddRounded"; +import UpdateRoundedIcon from "@material-ui/icons/UpdateRounded"; +import FilterListRoundedIcon from "@material-ui/icons/FilterListRounded"; +import VisibilityIcon from "@material-ui/icons/Visibility"; +import LaunchRoundedIcon from "@material-ui/icons/LaunchRounded"; +//routers +import { Link } from "react-router-dom"; +import styled from "styled-components" +import AnnouncementRoundedIcon from "@material-ui/icons/AnnouncementRounded"; + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + "&:nth-of-type(odd)": { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const Complaints = () => { + const WINDOW_WIDTH = window.innerWidth + const ADD_ONE_LENGHT = [""]; + const PORTAL_MEC = "https://plataformaintegrada.mec.gov.br/"; + const TOP_LABELS = [ + "ESTADO DO RECURSO", + "ID", + "DESCRIÇÃO", + "ID OBJETO", + "TIPO", + "DATA(MM/DD/YYYY)", + "VISUALIZAR", + "VISITAR", + ]; //Labels from Table + + const [invertList, setInvertList] = useState(false) + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false); //controlls the state of loadind more data + const [showFilter, setShowFilter] = useState(false); + + const [stateOption, setStateOption] = useState(0); + const [complainOption, setComplainOption] = useState(""); + const [description, setDescription] = useState(""); + const [valueOfDescField, setValueOfDescField] = useState("") + const [currPage, setCurrPage] = useState(0) + + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + const stateOptions = [ + { name: 0, value: "Pendente" }, + { name: 1, value: "Ativo" }, + { name: 2, value: "Removido" }, + ]; + + const ComplaintReasons = [ + { name: 1, value: "Viola direitos autorais" }, + { name: 2, value: "Conteúdo ofensivo/abusivo" }, + { name: 3, value: "Conta falsa" }, + { name: 4, value: "Spam" }, + { name: 5, value: "Descrição diverge do conteúdo" }, + ]; + + //handle snack info + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + const handleChangeState = (e, type) => { + const value = e.target.value; + setStateOption(value); + }; + + const handleChangeComplain = (e, type) => { + const value = e.target.value; + setComplainOption(value); + }; + + const DescriptionHandler = (e) => { + setValueOfDescField(e.target.value) + } + + const convertToLink = (type, id) => { + switch (type) { + case "LearningObject": + return `recurso?id=${id}/`; + case "User": + return `usuario-publico/${id}/`; + default: + return ""; + } + }; + + const ComplaintStatus = (status, type) => { + switch (status) { + case "accepted": + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#FA8072", + fontWeight: "500", + color: "#FFFAFA", + }} + > + { + type === "User" ? "BLOQUEADO" : "REMOVIDO" + } + </Paper> + ); + case "complained": + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#FF8C00", + fontWeight: "500", + color: "#FFFAFA", + }} + > + PENDENTE + </Paper> + ); + case "rejected": + return ( + <Paper + style={{ + textAlign: "center", + padding: "0.5em", + backgroundColor: "#228B22", + fontWeight: "500", + color: "#FFFAFA", + }} + > + REJEITADO + </Paper> + ); + default: + return "NOTHING"; + } + }; + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const cleanArrayAndInvert = () => { + setInvertList(!invertList) + setCurrPage(0) + setItems([]) + } + + const buildUrl = (complainOpt, state, description, direction) => { + if (complainOpt && (state >= 0 && state <= 2) && description) + return Url("complaints", `"state" : ${state}, "complaint_reason_id" : ${complainOpt}, "description" : "${description}"`, currPage, direction) + + else if (complainOpt && description) + return Url("complaints", `"complaint_reason_id" : ${complainOpt}, "description" : "${description}"`, currPage, direction) + else if (complainOpt && (state >= 0 && state <= 2)) + return Url("complaints", `"complaint_reason_id" : ${complainOpt}, "state" : ${state}`, currPage, direction) + else if (description && (state >= 0 && state <= 2)) + return Url("complaints", `"description" : "${description}", "state" : ${state}`, currPage, direction) + + else if (complainOpt) + return Url("complaints", `"complaint_reason_id" : ${complainOpt}`, currPage, direction) + else if (state >= 0 && state <= 2) + return Url("complaints", `"state" : ${state}`, currPage, direction) + else if (description) + return Url("complaints", `"description" : ${description}`, currPage, direction) + else + return Url("complaints", "", currPage, direction) + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + buildUrl(complainOption, stateOption, description, invertList ? "ASC" : "DESC"), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, complainOption, stateOption, description, invertList]) + + useEffect(() => { + setComplainOption() + setDescription("") + setValueOfDescField("") + setStateOption(0) + setCurrPage(0) + }, [showFilter]) + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + if (WINDOW_WIDTH <= 994) { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + <MobilePageHeader + title="Denúncias" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + }, + { + name: "Inverter lista", + isLoading: false, + func: () => { + cleanArrayAndInvert() + }, + } + ]} + > + {showFilter ? ( + <Grid + container + direction="row" + justify="space-between" + alignItems="center" + alignContent="flex-end" + spacing={3} + xs={12} + > + <Grid item> + <TextField + select + label="Motivo" + value={complainOption} + onChange={handleChangeComplain} + helperText="Por favor, selecione uma das opções" + > + {ComplaintReasons.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </Grid> + <Grid item> + <TextField + select + label="Estado" + value={stateOption} + onChange={handleChangeState} + helperText="Por favor, selecione uma das opções" + > + {stateOptions.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </Grid> + <Grid item> + <TextField label="Descrição" helperText="Ao digitar a descrição, retire o foco do campo de texto" onChange={DescriptionHandler} value={valueOfDescField} onBlur={e => setDescription(e.target.value)} /> + </Grid> + </Grid> + ) : null} + </MobilePageHeader> + + <div style={{ height: "2em" }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton + key={new Date().toISOString() + row.created_at} + > + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.complainable_type} + subtitle={row.id} + backColor={"#673ab7"} + avatar={<AnnouncementRoundedIcon />} + href={`/admin/complaint?id=${row.id}`} + reset={() => { + + }} + data={ + [ + { + title: "ID do objeto", + subtitle: row.complainable_id + + }, + { + title: "Criado em", + subtitle: DisplayDate(row.created_at) + }, + { + title: "Descrição", + subtitle: row.description + }, + { + title: "Estado", + subtitle: ComplaintStatus(row.state, row.complainable_type) + } + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </> + ); + } + else { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + + <PageHeader + title="Denúncias" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + } + ]} + > + {showFilter ? ( + <Grid + container + direction="row" + justify="space-between" + alignItems="center" + alignContent="flex-end" + spacing={3} + xs={12} + > + <Grid item> + <TextField + select + label="Motivo" + value={complainOption} + onChange={handleChangeComplain} + helperText="Por favor, selecione uma das opções" + > + {ComplaintReasons.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </Grid> + <Grid item> + <TextField + select + label="Estado" + value={stateOption} + onChange={handleChangeState} + helperText="Por favor, selecione uma das opções" + > + {stateOptions.map((option, index) => ( + <MenuItem + key={option.value} + value={option.name} + name={option.value} + > + {option.value} + </MenuItem> + ))} + </TextField> + </Grid> + <Grid item> + <TextField label="Descrição" helperText="Ao digitar a descrição, retire o foco do campo de texto" onChange={DescriptionHandler} value={valueOfDescField} onBlur={e => setDescription(e.target.value)} /> + </Grid> + </Grid> + ) : null} + </PageHeader> + + <div style={{ height: "2em" }}></div> + + <Grid xs={12} container> + <TableData + top={TOP_LABELS} + onIconPressed={cleanArrayAndInvert} + > + <TableBody> + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledTableRow key={new Date().toISOString() + row.created_at}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledTableCell> + </StyledTableRow> + ) : ( + <StyledTableRow + key={new Date().toISOString() + index} + style={{ flex: 1, width: "100%" }} + > + <StyledTableCell component="th" scope="row"> + {ComplaintStatus(row.state, row.complainable_type)} + </StyledTableCell> + <StyledTableCell align="right">{row.id}</StyledTableCell> + <StyledTableCell align="right"> + {row.description} + </StyledTableCell> + <StyledTableCell align="right"> + {row.complainable_id} + </StyledTableCell> + <StyledTableCell align="right"> + {row.complainable_type} + </StyledTableCell> + <StyledTableCell align="right"> + {DisplayDate(row.created_at)} + </StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/complaint?id=${row.id}`}> + <IconButton + onClick={() => { + }} + > + <VisibilityIcon style={{ fill: "#00bcd4" }} /> + </IconButton> + </Link> + </StyledTableCell> + <StyledTableCell align="right"> + <Button + variant="text" + secondary={true} + startIcon={ + <LaunchRoundedIcon style={{ fill: "#FA8072" }} /> + } + > + <a + style={{ + textDecoration: "none", + color: "#FA8072", + }} + target="_blank" + rel="noreferrer" + href={ + PORTAL_MEC + + convertToLink( + row.complainable_type, + row.complainable_id + ) + } + > + MEC RED + </a> + </Button> + </StyledTableCell> + </StyledTableRow> + ) + )} + </TableBody> + </TableData> + </Grid> + </> + ); + } + } +}; +export default Complaints; + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` + diff --git a/src/Admin/Pages/Pages/SubPages/EducationalObjects.js b/src/Admin/Pages/Pages/SubPages/EducationalObjects.js new file mode 100644 index 0000000000000000000000000000000000000000..69d0dfc326b54a0f970a6e98e905dddff7f0f41f --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/EducationalObjects.js @@ -0,0 +1,605 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +import moment from 'moment'; +// Imports from local file +import TableData from "../../../Components/Components/Table"; +import SnackBar from "../../../../Components/SnackbarComponent"; +import AlertDialog from "../../../Components/Components/AlertDialog"; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import PageHeader from "../../../Components/Components/PageHeader" +// Imports about icon +import FilterListRoundedIcon from "@material-ui/icons/FilterListRounded"; +import AddRoundedIcon from "@material-ui/icons/AddRounded"; +import UpdateRoundedIcon from "@material-ui/icons/UpdateRounded"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import IconButton from "@material-ui/core/IconButton"; +import VisibilityIcon from "@material-ui/icons/Visibility"; +import DeleteIcon from "@material-ui/icons/Delete"; +// Import from material-ui +import { withStyles } from "@material-ui/core/styles"; +import Paper from "@material-ui/core/Paper"; +import Button from "@material-ui/core/Button"; +import Grid from "@material-ui/core/Grid"; +import { CircularProgress } from "@material-ui/core"; +import TextField from "@material-ui/core/TextField"; +// services +import { getRequest, deleteRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +//Filters +import { Url, DeleteFilter } from "../../../Filters"; +//router +import { Link } from 'react-router-dom'; +import styled from 'styled-components' +import MenuBookRoundedIcon from "@material-ui/icons/MenuBookRounded"; + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + "&:nth-of-type(odd)": { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const EducationalObjects = () => { + const WINDOW_WIDTH = window.innerWidth + const ADD_ONE_LENGHT = [""]; + + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + const [currPage, setCurrPage] = useState(0) + const [deleteItem, setDeleteItem] = useState({}); //Delete Item + const [isLoadingToDelete, setIsLoadingToDelete] = useState(null); + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false); + const [showFilter, setShowFilter] = useState(false) + const [openAlertDialog, setOpenAlertDialog] = useState(false); + + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + + const [search, setSeacrh] = useState(""); + const [valueSearch, setValueSearch] = useState("") + const [author, setAuthor] = useState(""); + const [valueAuthor, setValueAuthor] = useState("") + const [description, setDescription] = useState(""); + const [valueDescription, setValueDescription] = useState("") + + const AuthorHandler = (event) => { + setValueAuthor(event.target.value) + }; + + const DescHandler = (event) => { + setValueDescription(event.target.value) + }; + + const StandartHandler = (event) => { + setValueSearch(event.target.value) + }; + + //Controlls the state of the Alert Dialog + const HandleStateAlertDialog = (i) => { + const obj = { ...items[i] }; + setDeleteItem(obj); + setOpenAlertDialog(!openAlertDialog); + }; + + //Controlls the state and the informations of the snack + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + //Defines which row must show the circular progress + const HandleStateCircularProgress = (i) => { + setIsLoadingToDelete(i); + }; + + //Called when user want to delete one institution + async function DeleteHandler() { + const id = deleteItem.id; + HandleStateAlertDialog(null); + deleteRequest( + DeleteFilter("learning_objects", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + else { + HandleSnack( + "O objeto educacional foi deletada com sucesso", + true, + "success", + "#228B22" + ); + setCurrPage(0) + HandleStateCircularProgress(null); + removeItemFromList(id) + } + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + HandleStateCircularProgress(null); + } + ) + } + + const removeItemFromList = (itemId) => { + let index = -1; + for (let i = 0; i < items.length; i++) { + const element = items[i]; + if (element.id === itemId) { + index = i + break + } + } + if (index !== -1) { + const cpyItems = [...items] + cpyItems.splice(index, 1) + setItems(cpyItems) + } + } + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const buildUrl = (author, description, name) => { + if (author && description && name) + return Url("learning_objects", `"author" : "${author}", "description" : "${description}", "name" : "${name}"`, currPage, "DESC") + + else if (author && name) + return Url("learning_objects", `"author" : "${author}", "name" : "${name}"`, currPage, "DESC") + else if (author && description) + return Url("learning_objects", `"author" : "${author}", "description" : "${description}"`, currPage, "DESC") + else if (name && description) + return Url("learning_objects", `"name" : "${name}", "description" : "${description}"`, currPage, "DESC") + + else if (author) + return Url("learning_objects", `"author" : "${author}"`, currPage, "DESC") + else if (description) + return Url("learning_objects", `"description" : "${description}"`, currPage, "DESC") + else if (name) + return Url("learning_objects", `"name" : "${name}"`, currPage, "DESC") + else + return Url("learning_objects", "", currPage, "DESC") + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + buildUrl(author, description, search), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, search, description, author]) + + useEffect(() => { + setCurrPage(0) + setSeacrh("") + setValueSearch("") + setDescription("") + setValueDescription("") + setAuthor("") + setValueAuthor("") + }, [showFilter]) + + if (error) { + return <div>Error: {error.message}</div>; + } + else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + //Words that defines that column + const TOP_TABLE = [ + "CRIADO EM", + "NOME", + "DESCRIÇÃO", + "AUTOR", + "SCORE", + "VISUALIZAR", + "DELETAR", + ]; + + //Field of the Filter + const TextFieldOfTheFilter = [ + { + label: "Pesquisar", + value: valueSearch, + onChange: (event) => StandartHandler(event), + onBlur: (event) => setSeacrh(event.target.value), + helperText: "Ao terminar de digitar no campo, retire o foco do campo de texto" + }, + { + label: "Autor", + value: valueAuthor, + onChange: (event) => AuthorHandler(event), + onBlur: (event) => setAuthor(event.target.value), + helperText: "Ao terminar de digitar no campo, retire o foco do campo de texto" + }, + { + label: "Descrição", + value: valueDescription, + onChange: (event) => DescHandler(event), + onBlur: (event) => setDescription(event.target.value), + helperText: "Ao terminar de digitar no campo, retire o foco do campo de texto" + }, + ]; + + if (WINDOW_WIDTH <= 1058) { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + {/************** Start of the header **************/} + <MobilePageHeader + title="Objetos educacionais" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + } + ]} + > + { + showFilter && + <Grid item xs={12}> + <Grid container justify="space-between" spacing={3}> + {TextFieldOfTheFilter.map((field, index) => ( + <Grid item key={field.label}> + <TextField + id={index} + label={field.label} + type="search" + onChange={field.onChange} + onBlur={field.onBlur} + value={field.value} + helperText={field.helperText} + /> + </Grid> + ))} + </Grid> + </Grid> + } + </MobilePageHeader> + {/************** End of the header **************/} + + <div style={{ height: "2em" }}></div> + + {/************** Start of display data in table **************/} + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton> + <Button + key={new Date().toISOString() + row.created_at} + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.name} + subtitle={row.id} + backColor={"#673ab7"} + avatar={<MenuBookRoundedIcon />} + href={`/admin/learningObject?learnObj=${row.id}`} + reset={() => { + + }} + data={ + [ + { + title: "Criado em", + subtitle: DisplayDate(row.created_at) + }, + { + title: "Descrição", + subtitle: row.description + }, + { + title: "Autor(a)", + subtitle: row.author + }, + { + title: "Score", + subtitle: row.score + }, + { + title: "Deletar", + subtitle: + <Button + variant="contained" + color="secondary" + onClick={() => { + HandleStateAlertDialog(index); + HandleStateCircularProgress(index); + }} + startIcon={<DeleteIcon />} + > + Deletar + </Button> + } + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + {/************** End of display data in table **************/} + </div> + ) + } + else { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + {/************** Start of the header **************/} + <PageHeader + title="Objetos educacionais" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + } + ]} + > + { + showFilter && + <Grid item xs={12}> + <Grid container justify="space-between" spacing={3}> + {TextFieldOfTheFilter.map((field, index) => ( + <Grid item key={field.label}> + <TextField + id={index} + label={field.label} + type="search" + onChange={field.onChange} + onBlur={field.onBlur} + value={field.value} + helperText={field.helperText} + /> + </Grid> + ))} + </Grid> + </Grid> + } + </PageHeader> + {/************** End of the header **************/} + + <div style={{ height: "2em" }}></div> + + {/************** Start of display data in table **************/} + <TableData top={TOP_TABLE}> + <TableBody> + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledTableRow key={new Date().toISOString() + row.created_at}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color="primary" + variant="text" + startIcon={<AddRoundedIcon />} + disabled={ + isLoadingMoreItems + } + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledTableCell> + </StyledTableRow> + ) : ( + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row"> + {DisplayDate(row.created_at)} + </StyledTableCell> + <StyledTableCell align="right"> + {row.name} + </StyledTableCell> + <StyledTableCell align="right"> + {row.description} + </StyledTableCell> + <StyledTableCell align="right"> + {row.author} + </StyledTableCell> + <StyledTableCell align="right"> + {row.score} + </StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/learningObject?learnObj=${row.id}`}> + <IconButton> + <VisibilityIcon style={{ fill: "#00bcd4" }} /> + </IconButton> + </Link> + </StyledTableCell> + <StyledTableCell align="right"> + {isLoadingToDelete === index ? ( + <CircularProgress size={24} color="primary" /> + ) : ( + <IconButton + onClick={() => { + HandleStateAlertDialog(index); + HandleStateCircularProgress(index); + }} + > + <DeleteIcon style={{ fill: "#FF0000" }} /> + </IconButton> + )} + </StyledTableCell> + </StyledTableRow> + ) + )} + </TableBody> + </TableData> + {/************** End of display data in table **************/} + + {/* This alert will be displayed if the user click to delete an institution */} + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + </div> + ) + } + } +}; + +export default EducationalObjects; + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` + diff --git a/src/Admin/Pages/Pages/SubPages/Inframe.js b/src/Admin/Pages/Pages/SubPages/Inframe.js new file mode 100644 index 0000000000000000000000000000000000000000..f2979dbbda1405d86d73cd8bd1a51da35167a685 --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/Inframe.js @@ -0,0 +1,39 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import Welcome from '../../../Components/Components/Welcome'; + +const IframeComponent = () => { + return ( + <div> + <Welcome /> + <div style={{ height: '1em' }}></div> + <iframe + title="Métricas portal MEC" + src='https://metabase.c3sl.ufpr.br/public/dashboard/8ada315d-b8df-4b18-b7fb-d06b0ac64623' + height='800px' + width='100%' + // allowTransparency={true} + frameBorder={0} + > + </iframe> + </div> + ) +} +export default IframeComponent; diff --git a/src/Admin/Pages/Pages/SubPages/Institutions.js b/src/Admin/Pages/Pages/SubPages/Institutions.js new file mode 100644 index 0000000000000000000000000000000000000000..7f713b9e4f42d42c906092fc0c3e1baccbdb1080 --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/Institutions.js @@ -0,0 +1,615 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +// Imports from local files +import TableData from "../../../Components/Components/Table"; +import SnackBar from "../../../../Components/SnackbarComponent"; +import AlertDialog from "../../../Components/Components/AlertDialog"; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import PageHeader from "../../../Components/Components/PageHeader" +// Imports about icon +import FilterListRoundedIcon from "@material-ui/icons/FilterListRounded"; +import AddRoundedIcon from "@material-ui/icons/AddRounded"; +import UpdateRoundedIcon from "@material-ui/icons/UpdateRounded"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import IconButton from "@material-ui/core/IconButton"; +import VisibilityIcon from "@material-ui/icons/Visibility"; +import DeleteIcon from "@material-ui/icons/Delete"; +// Import from material-ui +import { withStyles } from "@material-ui/core/styles"; +import Paper from "@material-ui/core/Paper"; +import Button from "@material-ui/core/Button"; +import Grid from "@material-ui/core/Grid"; +import { CircularProgress } from "@material-ui/core"; +import TextField from "@material-ui/core/TextField"; +// services +import { getRequest, deleteRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +//Filters +import { Url, DeleteFilter } from "../../../Filters"; +//router +import { Link, useHistory } from 'react-router-dom'; +import styled from "styled-components" +import AccountBalanceRoundedIcon from "@material-ui/icons/AccountBalanceRounded"; + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + "&:nth-of-type(odd)": { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const Institutions = () => { + const WINDOW_WIDTH = window.innerWidth + const ADD_ONE_LENGHT = [""]; + + const router = useHistory() + + const [invertList, setInvertList] = useState(false) + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + const [showFilter, setShowFilter] = useState(false) + const [currPage, setCurrPage] = useState(0) + const [deleteItem, setDeleteItem] = useState({}); //Delete Item + const [isLoadingToDelete, setIsLoadingToDelete] = useState(null); + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false); + + const [openAlertDialog, setOpenAlertDialog] = useState(false); + + const [snackInfo, setSnackInfo] = useState({ + message: "", + icon: "", + open: false, + color: "", + }); + + const [search, setSeacrh] = useState(""); + const [valueOfSearch, setValueOfSearch] = useState("") + const [city, setCity] = useState(""); + const [valueOfCity, setValueOfCity] = useState("") + const [country, setCountry] = useState(""); + const [valueOfCountry, setValueOfCountry] = useState("") + const [description, setDescription] = useState(""); + const [valueOfDescription, setValueOfDescription] = useState("") + + const OnChangeSearchHandler = (e) => { + setValueOfSearch(e.target.value); + }; + + const onChangeCityHandler = (e) => { + setValueOfCity(e.target.value); + }; + + const onChangeCountryHandler = (e) => { + setValueOfCountry(e.target.value); + }; + + const onChangeDescriptionHandler = (e) => { + setValueOfDescription(e.target.value); + }; + // **************** About the PopOverMenu **************** + + //Controlls the state of the Alert Dialog + const HandleStateAlertDialog = (i) => { + const obj = { ...items[i] }; + setDeleteItem(obj); + setOpenAlertDialog(!openAlertDialog); + }; + + //Controlls the state and the informations of the snack + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color, + }); + }; + + //Defines which row must show the circular progress + const HandleStateCircularProgress = (i) => { + setIsLoadingToDelete(i); + }; + + //Called when user want to delete one institution + async function DeleteHandler() { + const id = deleteItem.id; + HandleStateAlertDialog(null); + deleteRequest( + DeleteFilter("institutions", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro!", true, "warning", "#FA8072"); + else { + HandleSnack( + "A instituição foi deletada com sucesso", + true, + "success", + "#228B22" + ); + setCurrPage(0) + removeItemFromList(id); + HandleStateCircularProgress(null); + } + }, + (error) => { + HandleSnack("Ocorreu algum erro!", true, "warning", "#FA8072"); + HandleStateCircularProgress(null); + } + ) + } + + const removeItemFromList = (itemId) => { + let index = -1; + for (let i = 0; i < items.length; i++) { + const element = items[i]; + if (element.id === itemId) { + index = i + break + } + } + if (index !== -1) { + const cpyItems = [...items] + cpyItems.splice(index, 1) + setItems(cpyItems) + } + } + + const cleanArrayAndInvert = () => { + setInvertList(!invertList) + setCurrPage(0) + setItems([]) + } + + const buildUrl = () => { + return Url("institutions", `"name" : "${search}", "description" : "${description}", "city" : "${city}", "country" : "${country}"`, currPage, invertList ? "ASC" : "DESC") + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + buildUrl(), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, description, country, search, city, invertList]) + + useEffect(() => { + setSeacrh("") + setDescription("") + setCountry("") + setCity("") + setValueOfDescription("") + setValueOfSearch("") + setValueOfCountry("") + setValueOfCity("") + setCurrPage(0) + }, [showFilter]) + + if (error) { + return <div>Error: {error.message}</div>; + } + else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + //Words that defines that column + const topTable = [ + "ID", + "NOME", + "DESCRIÇÃO", + "CIDADE", + "PAÃS", + "VISUALIZAR", + "DELETAR", + ]; + + //Field of the Filter + const TextFieldOfTheFilter = [ + { + label: "Pesquisar", + value: valueOfSearch, + helperText: "Ao digitar, retire o foco do campo", + onChange: (event) => OnChangeSearchHandler(event), + onBlur: (event) => setSeacrh(event.target.value) + }, + { + label: "Cidade", + value: valueOfCity, + helperText: "Ao digitar, retire o foco do campo", + onChange: (event) => onChangeCityHandler(event), + onBlur: (event) => setCity(event.target.value) + }, + { + label: "PaÃs", + value: valueOfCountry, + helperText: "Ao digitar, retire o foco do campo", + onChange: (event) => onChangeCountryHandler(event), + onBlur: (event) => setCountry(event.target.value) + + }, + { + label: "Descrição", + value: valueOfDescription, + helperText: "Ao digitar, retire o foco do campo", + onChange: (event) => onChangeDescriptionHandler(event), + onBlur: (event) => setDescription(event.target.value) + }, + ]; + + if (WINDOW_WIDTH <= 977) { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + {/************** Start of the header **************/} + <MobilePageHeader + title="Instituições" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/InstitutionCreate') + }, + icon: <AddRoundedIcon /> + } + ]} + > + { + showFilter && + <Grid item xs={12}> + <Grid container justify="space-between" spacing={3}> + {TextFieldOfTheFilter.map((field, index) => ( + <Grid item key={field.label}> + <TextField + id={index} + label={field.label} + value={field.value} + helperText={field.helperText} + onChange={field.onChange} + onBlur={field.onBlur} + /> + </Grid> + ))} + </Grid> + </Grid> + } + </MobilePageHeader> + {/************** End of the header **************/} + + <div style={{ height: "2em" }}></div> + + {/************** Start of display data in table **************/} + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton + key={new Date().toISOString() + row.created_at} + > + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.name} + subtitle={row.id} + backColor={"#ff7f00"} + avatar={<AccountBalanceRoundedIcon />} + href={`/admin/institution?institution=${row.id}`} + reset={() => { + + }} + data={ + [ + { + title: "Descrição", + subtitle: row.description ? row.description : "Sem dado" + + }, + { + title: "Cidade", + subtitle: row.city ? row.city : "Sem dado" + + }, + { + title: "PaÃs", + subtitle: row.country ? row.country : "Sem dado" + }, + { + title: "Deletar", + subtitle: + <Button + variant="contained" + color="secondary" + onClick={() => { + HandleStateAlertDialog(index); + HandleStateCircularProgress(index); + }} + startIcon={<DeleteIcon />} + > + Deletar + </Button> + } + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + {/************** End of display data in table **************/} + + {/* This alert will be displayed if the user click to delete an institution */} + </div> + ) + } + else { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => + setSnackInfo({ + message: "", + icon: "", + open: false, + color: "", + }) + } + /> + {/************** Start of the header **************/} + <PageHeader + title="Instituições" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/InstitutionCreate') + }, + icon: <AddRoundedIcon /> + } + ]} + > + { + showFilter && + <Grid item xs={12}> + <Grid container justify="space-between" spacing={3}> + {TextFieldOfTheFilter.map((field, index) => ( + <Grid item key={field.label}> + <TextField + id={index} + label={field.label} + value={field.value} + helperText={field.helperText} + onChange={field.onChange} + onBlur={field.onBlur} + /> + </Grid> + ))} + </Grid> + </Grid> + } + </PageHeader> + {/************** End of the header **************/} + + <div style={{ height: "2em" }}></div> + + {/************** Start of display data in table **************/} + <TableData top={topTable} onIconPressed={cleanArrayAndInvert}> + <TableBody> + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledTableRow key={new Date().toISOString() + row.created_at}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color="primary" + variant="text" + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledTableCell> + </StyledTableRow> + ) : ( + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row"> + {row.id} + </StyledTableCell> + <StyledTableCell align="right">{row.name}</StyledTableCell> + <StyledTableCell align="right"> + {row.description} + </StyledTableCell> + <StyledTableCell align="right">{row.city}</StyledTableCell> + <StyledTableCell align="right"> + {row.country} + </StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/institution?institution=${row.id}`}> + <IconButton> + <VisibilityIcon style={{ fill: "#00bcd4" }} /> + </IconButton> + </Link> + </StyledTableCell> + <StyledTableCell align="right"> + {isLoadingToDelete === index ? ( + <CircularProgress size={24} color="primary" /> + ) : ( + <IconButton + onClick={() => { + HandleStateAlertDialog(index); + HandleStateCircularProgress(index); + }} + > + <DeleteIcon style={{ fill: "#FF0000" }} /> + </IconButton> + )} + </StyledTableCell> + </StyledTableRow> + ) + )} + </TableBody> + </TableData> + {/************** End of display data in table **************/} + + {/* This alert will be displayed if the user click to delete an institution */} + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + </div> + ) + } + } +}; + +export default Institutions; + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` + diff --git a/src/Admin/Pages/Pages/SubPages/Languages.js b/src/Admin/Pages/Pages/SubPages/Languages.js new file mode 100644 index 0000000000000000000000000000000000000000..c38ac1e1015d1ad352f23e597ee85240c4e28a2c --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/Languages.js @@ -0,0 +1,437 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect, useState } from 'react' +//imports from local files +import TableData from '../../../Components/Components/Table'; +import SnackBar from '../../../../Components/SnackbarComponent'; +import AlertDialog from "../../../Components/Components/AlertDialog"; +import { Url } from '../../../Filters'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import { DeleteFilter } from '../../../Filters'; +import { getRequest, deleteRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import PageHeader from "../../../Components/Components/PageHeader" +//imports from material ui +import { withStyles } from '@material-ui/core/styles'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableRow from '@material-ui/core/TableRow'; +import IconButton from '@material-ui/core/IconButton'; +import { Button, Paper } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import UpdateRoundedIcon from '@material-ui/icons/UpdateRounded'; +import EditRoundedIcon from '@material-ui/icons/EditRounded'; +import DeleteRoundedIcon from '@material-ui/icons/DeleteRounded'; +//router +import { Link, useHistory } from 'react-router-dom'; +import styled from "styled-components" +import LanguageRoundedIcon from "@material-ui/icons/LanguageRounded"; + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const Languages = () => { + const ADD_ONE_LENGHT = [""]; + const TOP_LABELS = ['ID', 'NOME', 'CODE', 'EDITAR', 'DELETAR'] //Labels from Table + const WINDOW_WIDTH = window.innerWidth + const router = useHistory() + + const [invertList, setInvertList] = useState(false) + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false) //controlls the state of loadind more data + const [openAlertDialog, setOpenAlertDialog] = useState(false); //controlls the state od alert dialog + const [currPage, setCurrPage] = useState(0) + + const [deleteItem, setDeleteItem] = useState({}); //Delete Item + const [isLoadingToDelete, setIsLoadingToDelete] = useState(null); + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + //handle snack info + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + //handle Delete + async function DeleteHandler() { + const id = deleteItem.id; + HandleStateAlertDialog(null); + deleteRequest( + DeleteFilter("languages", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + else { + HandleSnack( + "A lÃngua foi deletada com sucesso", + true, + "success", + "#228B22" + ); + setCurrPage(0) + HandleStateCircularProgress(null); + removeItemFromList(id) + } + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + HandleStateCircularProgress(null); + } + ) + } + + const HandleStateCircularProgress = (i) => { + setIsLoadingToDelete(i); + }; + + const HandleStateAlertDialog = (i) => { + const obj = { ...items[i] }; + setDeleteItem(obj); + setOpenAlertDialog(!openAlertDialog); + }; + + const removeItemFromList = (itemId) => { + let index = -1; + for (let i = 0; i < items.length; i++) { + const element = items[i]; + if (element.id === itemId) { + index = i + break + } + } + if (index !== -1) { + const cpyItems = [...items] + cpyItems.splice(index, 1) + setItems(cpyItems) + } + } + + const cleanArrayAndInvert = () => { + setInvertList(!invertList) + setCurrPage(0) + setItems([]) + } + + //getting data from server + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + + getRequest( + Url("languages", "", currPage, invertList ? "ASC" : "DESC"), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, invertList]) + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + if (WINDOW_WIDTH <= 800) { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + <MobilePageHeader + title="Linguagens" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/languageCreate') + }, + icon: <AddRoundedIcon /> + } + ]} + > + </MobilePageHeader> + + <div style={{ height: '2em' }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton key={new Date().toISOString() + row.created_at}> + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.name} + subtitle={row.id} + backColor={"#e81f4f"} + avatar={<LanguageRoundedIcon />} + href={`/admin/languageEdit?language=${row.id}`} + reset={() => { + + }} + data={ + [ + { + title: "Code", + subtitle: row.code + }, + { + title: "Deletar", + subtitle: + <Button + variant="contained" + color="secondary" + onClick={() => { + HandleStateAlertDialog(index); + HandleStateCircularProgress(index); + }} + startIcon={<DeleteRoundedIcon />} + > + Deletar + </Button> + } + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </> + ); + } + else { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + + <PageHeader + title="Linguagens" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/languageCreate') + }, + icon: <AddRoundedIcon /> + } + ]} + > + </PageHeader> + + <div style={{ height: '2em' }}></div> + + <TableData + top={TOP_LABELS} + onIconPressed={cleanArrayAndInvert} + > + <TableBody> + {items.map((row, index) => ( + index === items.length - 1 ? + <StyledTableRow key={new Date().toISOString() + row.created_at}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color='primary' + variant='text' + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + { + isLoadingMoreItems ? <CircularProgress size={24} /> : 'Carregar mais itens' + } + </Button> + </StyledTableCell> + </StyledTableRow> + + : + + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row">{row.id}</StyledTableCell> + <StyledTableCell align="right">{row.name}</StyledTableCell> + <StyledTableCell align="right">{row.code}</StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/languageEdit?language=${row.id}`}> + <IconButton> + <EditRoundedIcon style={{ fill: '#00bcd4' }} /> + </IconButton> + </Link> + </StyledTableCell> + <StyledTableCell align="right"> + {isLoadingToDelete === index ? ( + <CircularProgress size={24} color="primary" /> + ) : ( + <IconButton + onClick={() => { + HandleStateAlertDialog(index); + HandleStateCircularProgress(index); + }} + > + <DeleteRoundedIcon style={{ fill: "#FF0000" }} /> + </IconButton> + )} + </StyledTableCell> + </StyledTableRow> + ))} + </TableBody> + </TableData> + + {/* This alert will be displayed if the user click to delete an institution */} + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + </> + ); + } + } +} +export default Languages; + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` + diff --git a/src/Admin/Pages/Pages/SubPages/NoteVariables.js b/src/Admin/Pages/Pages/SubPages/NoteVariables.js new file mode 100644 index 0000000000000000000000000000000000000000..1ad35f99a8c2a8c5a7e8340acfbd1d9551ec5473 --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/NoteVariables.js @@ -0,0 +1,344 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, { useEffect, useState } from 'react'; +//Material ui componets +import { withStyles } from '@material-ui/core/styles'; +import TableBody from '@material-ui/core/TableBody'; +import Paper from "@material-ui/core/Paper"; +import TableCell from '@material-ui/core/TableCell'; +import TableRow from '@material-ui/core/TableRow'; +import CheckRoundedIcon from "@material-ui/icons/CheckRounded"; +import BlockRoundedIcon from "@material-ui/icons/BlockRounded"; +import IconButton from '@material-ui/core/IconButton'; +import VisibilityIcon from '@material-ui/icons/Visibility'; +import { Button, Typography } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import UpdateRoundedIcon from '@material-ui/icons/UpdateRounded' +//Local files +import TableData from '../../../Components/Components/Table'; +import SnackBar from '../../../../Components/SnackbarComponent'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import PageHeader from "../../../Components/Components/PageHeader" + +//Services +import { getRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import { Url } from '../../../Filters'; +//routers +import { Link } from 'react-router-dom'; +import styled from "styled-components" +import TrendingUpRoundedIcon from "@material-ui/icons/TrendingUpRounded"; + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const NoteVariables = () => { + const WINDOW_WIDTH = window.innerWidth + const ADD_ONE_LENGHT = [""]; + + const [invertList, setInvertList] = useState(false) + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [currPage, setCurrPage] = useState(0) + const [items, setItems] = useState([]); //Necessary to consult the API, data + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false) + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const cleanArrayAndInvert = () => { + setInvertList(!invertList) + setCurrPage(0) + setItems([]) + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + Url("scores", "", currPage, invertList ? "ASC" : "DESC"), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, invertList]) + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + + //Words in the top part of the table + const topTable = ['ID', 'NOME', 'CÓDIGO', 'PESO', 'ATIVO', 'SCORE TYPE', 'VISUALIZAR']; + + if (WINDOW_WIDTH <= 1000) { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <MobilePageHeader + title="Variáveis de nota" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Inverter lista", + isLoading: false, + func: () => { + cleanArrayAndInvert() + }, + }, + ]} + > + </MobilePageHeader> + + <div style={{ height: '2em' }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton key={new Date().toISOString() + row.created_at}> + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.name} + subtitle={row.id} + backColor={"#e81f4f"} + avatar={<TrendingUpRoundedIcon />} + href={`/admin/noteVar?id=${row.id}`} + reset={() => { + }} + data={ + [ + { + title: "Código", + subtitle: row.code + + }, + { + title: "Score Type", + subtitle: row.score_type + + }, + { + title: "Ativo", + subtitle: row.active ? <CheckRoundedIcon style={{ fill: '#3CB371' }} /> : <BlockRoundedIcon style={{ fill: '#FA8072' }} /> + }, + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </div> + ) + } + else { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <PageHeader + title="Variáveis de nota" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + ]} + > + </PageHeader> + + <div style={{ height: '2em' }}></div> + + <TableData + top={topTable} + onIconPressed={cleanArrayAndInvert} + > + <TableBody> + {items.map((row, index) => ( + index === items.length - 1 ? + <StyledTableRow key={new Date().toISOString() + row.created_at}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color='primary' + variant='text' + disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + { + isLoadingMoreItems ? <CircularProgress /> : 'Carregar mais itens' + } + </Button> + </StyledTableCell> + </StyledTableRow> + + : + + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row">{row.id}</StyledTableCell> + <StyledTableCell align="right">{row.name}</StyledTableCell> + <StyledTableCell align="right">{row.code}</StyledTableCell> + <StyledTableCell align="right">{row.weight}</StyledTableCell> + <StyledTableCell align="right"> + { + row.active ? <CheckRoundedIcon style={{ fill: '#3CB371' }} /> : <BlockRoundedIcon style={{ fill: '#FA8072' }} /> + } + </StyledTableCell> + <StyledTableCell align="right"> + { + row['score_type'].map((item) => ( + <Typography key={item} style={{ fontSize: 14 }}> + {item} + </Typography> + )) + } + </StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/noteVar?id=${row.id}`}> + <IconButton> + <VisibilityIcon style={{ fill: '#00bcd4' }} /> + </IconButton> + </Link> + </StyledTableCell> + </StyledTableRow> + ))} + </TableBody> + </TableData> + </div> + ) + } + } +} + + +export default NoteVariables; + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` diff --git a/src/Admin/Pages/Pages/SubPages/Permissions.js b/src/Admin/Pages/Pages/SubPages/Permissions.js new file mode 100644 index 0000000000000000000000000000000000000000..787ac0de2893aeaa4107d7c57d3ef43935fe78dd --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/Permissions.js @@ -0,0 +1,449 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect, useState } from 'react' +//imports from local files +import TableData from '../../../Components/Components/Table'; +import SnackBar from '../../../../Components/SnackbarComponent'; +import AlertDialog from "../../../Components/Components/AlertDialog"; +import { Url } from '../../../Filters'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import { DeleteFilter } from '../../../Filters'; +import { getRequest, deleteRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import PageHeader from "../../../Components/Components/PageHeader" +//imports from material ui +import { withStyles } from '@material-ui/core/styles'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableRow from '@material-ui/core/TableRow'; +import { Button, Paper } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import UpdateRoundedIcon from '@material-ui/icons/UpdateRounded'; +import EditRoundedIcon from '@material-ui/icons/EditRounded'; +import DeleteRoundedIcon from '@material-ui/icons/DeleteRounded'; +//router +import { Link, useHistory } from 'react-router-dom'; +import styled from "styled-components" +import AccountCircleRoundedIcon from "@material-ui/icons/AccountCircleRounded" + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const UserPermissions = () => { + const ADD_ONE_LENGHT = [""]; + const TOP_LABELS = ['ID', 'NOME', 'DESCRIÇÃO', 'AÇÕES'] //Labels from Table + const WINDOW_WIDTH = window.innerWidth + + const router = useHistory() + + const [invertList, setInvertList] = useState(false) + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + const [currPage, setCurrPage] = useState(0) + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false) //controlls the state of loadind more data + const [openAlertDialog, setOpenAlertDialog] = useState(false); //controlls the state od alert dialog + + const [deleteItem, setDeleteItem] = useState({}); //Delete Item + const [isLoadingToDelete, setIsLoadingToDelete] = useState(null); + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + //handle snack info + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + //handle Delete + async function DeleteHandler() { + const id = deleteItem.id; + HandleStateAlertDialog(null); + deleteRequest( + DeleteFilter("roles", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + else { + HandleSnack( + "A lÃngua foi deletada com sucesso", + true, + "success", + "#228B22" + ); + setCurrPage(0) + HandleStateCircularProgress(null); + removeItemFromList(id) + } + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + HandleStateCircularProgress(null); + } + ) + } + + const removeItemFromList = (itemId) => { + let index = -1; + for (let i = 0; i < items.length; i++) { + const element = items[i]; + if (element.id === itemId) { + index = i + break + } + } + if (index !== -1) { + const cpyItems = [...items] + cpyItems.splice(index, 1) + setItems(cpyItems) + } + } + + const HandleStateCircularProgress = (i) => { + setIsLoadingToDelete(i); + }; + + const HandleStateAlertDialog = (i) => { + const obj = { ...items[i] }; + setDeleteItem(obj); + setOpenAlertDialog(!openAlertDialog); + }; + + const cleanArrayAndInvert = () => { + setInvertList(!invertList) + setCurrPage(0) + setItems([]) + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + Url("roles", "", currPage, invertList ? "ASC" : "DESC"), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, invertList]) + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + if (WINDOW_WIDTH <= 800) { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + <MobilePageHeader + title="Lista de permissões de usuário" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/CreateRole') + }, + icon: <AddRoundedIcon /> + }, + { + name: "Inverter lista", + isLoading: false, + func: () => { + cleanArrayAndInvert() + }, + } + ]} + > + </MobilePageHeader> + + <div style={{ height: '2em' }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton key={new Date().toISOString() + row.created_at}> + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.name} + subtitle={row.id} + backColor={"#ff7f00"} + avatar={<AccountCircleRoundedIcon />} + href={`/admin/EditPermissions?role=${row.id}`} + reset={() => { + }} + data={ + [ + { + title: "Descrição", + subtitle: row.description + + }, + { + title: "Ações", + subtitle: <Button + variant="contained" + color="secondary" + onClick={() => { + HandleStateAlertDialog(index) + HandleStateCircularProgress(index) + }} + startIcon={<DeleteRoundedIcon />} + > + Deletar + </Button> + }, + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </> + ); + } + else { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + + <PageHeader + title="Lista de permissões de usuário" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/CreateRole') + }, + icon: <AddRoundedIcon /> + } + ]} + > + </PageHeader> + + <div style={{ height: '2em' }}></div> + + <TableData + top={TOP_LABELS} + onIconPressed={cleanArrayAndInvert} + > + <TableBody> + {items.map((row, index) => ( + index === items.length - 1 ? + <StyledTableRow key={new Date().toISOString() + row.created_at}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color='primary' + variant='text' + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + { + isLoadingMoreItems ? <CircularProgress size={24} /> : 'Carregar mais itens' + } + </Button> + </StyledTableCell> + </StyledTableRow> + + : + + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row">{row.id}</StyledTableCell> + <StyledTableCell align="right">{row.name}</StyledTableCell> + <StyledTableCell align="right">{row.description}</StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/EditPermissions?role=${row.id}`}> + <Button + style={{ width: "100%", marginBottom: "0.5em" }} + variant="contained" + color="primary" + startIcon={<EditRoundedIcon />} + > + Editar + </Button> + </Link> + + {isLoadingToDelete === index ? ( + <CircularProgress size={24} color="primary" /> + ) : ( + <Button + style={{ width: "100%" }} + variant="contained" + color="secondary" + onClick={() => { + HandleStateAlertDialog(index) + HandleStateCircularProgress(index) + }} + startIcon={<DeleteRoundedIcon />} + > + Deletar + </Button> + )} + + </StyledTableCell> + </StyledTableRow> + ))} + </TableBody> + </TableData> + + {/* This alert will be displayed if the user click to delete an institution */} + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + </> + ); + } + } +} +export default UserPermissions; + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` + diff --git a/src/Admin/Pages/Pages/SubPages/Questions.js b/src/Admin/Pages/Pages/SubPages/Questions.js new file mode 100644 index 0000000000000000000000000000000000000000..ca32e0cd11a506134b40c2801dde53209d615cb2 --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/Questions.js @@ -0,0 +1,435 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect, useState } from 'react' +import moment from 'moment'; +//imports from local files +import TableData from '../../../Components/Components/Table'; +import SnackBar from '../../../../Components/SnackbarComponent'; +import { Url, EditFilter } from '../../../Filters'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import { getRequest, putRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import PageHeader from "../../../Components/Components/PageHeader" +//imports from material ui +import { withStyles } from '@material-ui/core/styles'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableRow from '@material-ui/core/TableRow'; +import { Button, Paper } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import UpdateRoundedIcon from '@material-ui/icons/UpdateRounded'; +import Switch from '@material-ui/core/Switch'; +//router +import { useHistory } from 'react-router-dom'; +import styled from "styled-components" +import HelpRoundedIcon from "@material-ui/icons/HelpRounded"; + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const Questions = () => { + + const ADD_ONE_LENGHT = [""]; + const WINDOW_WIDTH = window.innerWidth + const TOP_LABELS = ['ID', 'CRIAÇÃO EM', 'DESCRIÇÃO', 'STATUS', 'ATUALIZAÇÃO EM'] //Labels from Table + const router = useHistory() + + const [invertList, setInvertList] = useState(false) + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + const [currPage, setCurrPage] = useState(0) + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false) //controlls the state of loadind more data + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + //handle snack info + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const changeStateItem = (index, currState) => { + const copyItems = [...items] + copyItems[index].status = currState + setItems(copyItems) + } + + const handleChange = async (index, status) => { + const id = items[index].id; + const description = items[index].description; + if (status === 'active') { + const body = { + "question": { + "description": description, + "status": "inactive" + } + } + putRequest( + EditFilter('questions', id), + body, + (data) => { + if (data.errors) + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + else { + HandleSnack('Question modificada com sucesso', true, 'success', '#228B22') + changeStateItem(index, "inactive") + setCurrPage(0) + } + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + } + ) + } else { + const body = { + "question": { + "description": description, + "status": "active" + } + } + putRequest( + EditFilter('questions', id), + body, + (data) => { + if (data.errors) + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + else { + setCurrPage(0) + HandleSnack('Question modificada com sucesso', true, 'success', '#228B22') + changeStateItem(index, "active") + } + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + } + ) + } + } + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const cleanArrayAndInvert = () => { + setInvertList(!invertList) + setCurrPage(0) + setItems([]) + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + Url("questions", "", currPage, invertList ? "ASC" : "DESC"), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, invertList]) + + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + if (WINDOW_WIDTH <= 800) { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + + <MobilePageHeader + title="Perguntas da curadoria" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/CreateQuestion') + }, + icon: <AddRoundedIcon /> + }, + { + name: "Inverter lista", + isLoading: false, + func: () => { + cleanArrayAndInvert() + }, + }, + ]} + > + </MobilePageHeader> + + <div style={{ height: '2em' }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton + key={new Date().toISOString() + row.created_at} + > + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.id} + subtitle={DisplayDate(row.created_at)} + backColor={"#673ab7"} + avatar={<HelpRoundedIcon />} + reset={() => { + }} + data={ + [ + { + title: "Descrição", + subtitle: row.description + }, + { + title: "Status", + subtitle: + row.status === 'active' ? + <Switch + checked={true} + onChange={() => handleChange(index, row.status)} + name="checkedB" + color="primary" + /> + : + + <Switch + checked={false} + onChange={() => handleChange(index, row.status)} + name="checkedB" + color="primary" + /> + }, + { + title: "Atualizado em", + subtitle: DisplayDate(row.updated_at) + } + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </> + ); + } + else { + return ( + <> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + + <PageHeader + title="Perguntas da curadoria" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/CreateQuestion') + }, + icon: <AddRoundedIcon /> + } + ]} + > + </PageHeader> + + <div style={{ height: '2em' }}></div> + + <TableData + top={TOP_LABELS} + onIconPressed={cleanArrayAndInvert} + > + <TableBody> + {items.map((row, index) => ( + index === items.length - 1 ? + <StyledTableRow key={new Date().toISOString() + row.created_at}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color='primary' + variant='text' + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + { + isLoadingMoreItems ? <CircularProgress size={24} /> : 'Carregar mais itens' + } + </Button> + </StyledTableCell> + </StyledTableRow> + + : + + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row">{row.id}</StyledTableCell> + <StyledTableCell align="right">{DisplayDate(row.created_at)}</StyledTableCell> + <StyledTableCell align="right">{row.description}</StyledTableCell> + <StyledTableCell align="right"> + { + row.status === 'active' ? + <Switch + checked={true} + onChange={() => handleChange(index, row.status)} + name="checkedB" + color="primary" + /> + : + + <Switch + checked={false} + onChange={() => handleChange(index, row.status)} + name="checkedB" + color="primary" + /> + } + </StyledTableCell> + <StyledTableCell align="right">{DisplayDate(row.updated_at)}</StyledTableCell> + </StyledTableRow> + ))} + </TableBody> + </TableData> + </> + ); + } + } +} +export default Questions; + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` + diff --git a/src/Admin/Pages/Pages/SubPages/Rating.js b/src/Admin/Pages/Pages/SubPages/Rating.js new file mode 100644 index 0000000000000000000000000000000000000000..22d57d409dfe56f9b649f36c9ad4b67d10cd923c --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/Rating.js @@ -0,0 +1,438 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect, useState } from 'react'; +//Material ui componets +import { withStyles } from '@material-ui/core/styles'; +import TableBody from '@material-ui/core/TableBody'; +import Paper from "@material-ui/core/Paper"; +import TableCell from '@material-ui/core/TableCell'; +import TableRow from '@material-ui/core/TableRow'; +import IconButton from '@material-ui/core/IconButton'; +import VisibilityIcon from '@material-ui/icons/Visibility'; +import { Button } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import UpdateRoundedIcon from '@material-ui/icons/UpdateRounded'; +import DeleteRoundedIcon from '@material-ui/icons/DeleteRounded'; +//Local files' +import TableData from '../../../Components/Components/Table'; +import SnackBar from '../../../../Components/SnackbarComponent'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import PageHeader from "../../../Components/Components/PageHeader" +//Services +import AlertDialog from "../../../Components/Components/AlertDialog"; +import { Url } from '../../../Filters'; +import { DeleteFilter } from '../../../Filters'; +import { getRequest, deleteRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +//routers +import { Link, useHistory } from 'react-router-dom'; +import StarRoundedIcon from "@material-ui/icons/StarRounded"; +import styled from "styled-components" + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const Ratings = () => { + const WINDOW_WIDTH = window.innerWidth + const ADD_ONE_LENGHT = [""]; + + const router = useHistory() + + const [invertList, setInvertList] = useState(false) + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false) + const [currPage, setCurrPage] = useState(0) + const [openAlertDialog, setOpenAlertDialog] = useState(false); //controlls the state od alert dialog + const [deleteItem, setDeleteItem] = useState({}); //Delete Item + const [isLoadingToDelete, setIsLoadingToDelete] = useState(null); + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + //handle Delete + async function DeleteHandler() { + const id = deleteItem.id; + HandleStateAlertDialog(null); + deleteRequest( + DeleteFilter("ratings", id), + (data) => { + if (data.errors) + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + else { + HandleSnack( + "O rating foi deletada com sucesso", + true, + "success", + "#228B22" + ); + setCurrPage(0) + HandleStateCircularProgress(null); + removeItemFromList(id) + } + }, + (error) => { + HandleSnack("Ocorreu algum erro", true, "warning", "#FA8072"); + HandleStateCircularProgress(null); + } + ) + } + + const removeItemFromList = (itemId) => { + let index = -1; + for (let i = 0; i < items.length; i++) { + const element = items[i]; + if (element.id === itemId) { + index = i + break + } + } + if (index !== -1) { + const cpyItems = [...items] + cpyItems.splice(index, 1) + setItems(cpyItems) + } + } + + const HandleStateCircularProgress = (i) => { + setIsLoadingToDelete(i); + }; + + const HandleStateAlertDialog = (i) => { + const obj = { ...items[i] }; + setDeleteItem(obj); + setOpenAlertDialog(!openAlertDialog); + }; + + const cleanArrayAndInvert = () => { + setInvertList(!invertList) + setCurrPage(0) + setItems([]) + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + Url("ratings", "", currPage, invertList ? "ASC" : "DESC"), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoadingMoreItems(false) + setIsLoaded(true) + setError(true) + } + ) + }, [currPage, invertList]) + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + + //Words in the top part of the table + const topTable = ['ID', 'NOME', 'DESCRIÇÃO', 'VISUALIZAR', 'DELETAR']; + if (WINDOW_WIDTH <= 800) { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + <MobilePageHeader + title="Lista de ratings" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/CreateRating') + }, + icon: <AddRoundedIcon /> + } + ]} + > + </MobilePageHeader> + + <div style={{ height: '2em' }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton key={new Date().toISOString() + row.created_at}> + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.name} + subtitle={row.id} + backColor={"#00bcd4"} + avatar={<StarRoundedIcon />} + href={`/admin/Rating?rating=${row.id}`} + reset={() => { + + }} + data={ + [ + { + title: "Descrição", + subtitle: row.description + }, + { + title: "Deletar", + subtitle: + <Button + variant="contained" + color="secondary" + onClick={() => { + HandleStateAlertDialog(index); + HandleStateCircularProgress(index); + }} + startIcon={<DeleteRoundedIcon />} + > + Deletar + </Button> + } + ] + } + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </div> + ) + } + else { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <PageHeader + title="Lista de ratings" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/CreateRating') + }, + icon: <AddRoundedIcon /> + } + ]} + > + </PageHeader> + + <div style={{ height: '2em' }}></div> + + <TableData + top={topTable} + onIconPressed={cleanArrayAndInvert} + > + <TableBody> + {items.map((row, index) => ( + index === items.length - 1 ? + <StyledTableRow key={new Date().toISOString() + row.created_at}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color='primary' + variant='text' + disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + { + isLoadingMoreItems ? <CircularProgress size={24} /> : 'Carregar mais itens' + } + </Button> + </StyledTableCell> + </StyledTableRow> + + : + + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row">{row.id}</StyledTableCell> + <StyledTableCell align="right">{row.name}</StyledTableCell> + <StyledTableCell align="right">{row.description}</StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/Rating?rating=${row.id}`}> + <IconButton> + <VisibilityIcon style={{ fill: '#00bcd4' }} /> + </IconButton> + </Link> + </StyledTableCell> + <StyledTableCell align="right"> + {isLoadingToDelete === index ? ( + <CircularProgress size={24} color="primary" /> + ) : ( + <IconButton + onClick={() => { + HandleStateAlertDialog(index); + HandleStateCircularProgress(index); + }} + > + <DeleteRoundedIcon style={{ fill: "#FF0000" }} /> + </IconButton> + )} + </StyledTableCell> + </StyledTableRow> + ))} + </TableBody> + </TableData> + + {/* This alert will be displayed if the user click to delete an institution */} + <AlertDialog + open={openAlertDialog} + OnDelete={DeleteHandler} + deleteItem={deleteItem} + HandleClose={() => { + setOpenAlertDialog(false); + HandleStateCircularProgress(null); + }} + /> + </div> + ) + } + } +} + + +export default Ratings; + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` + diff --git a/src/Admin/Pages/Pages/SubPages/SendEmail.js b/src/Admin/Pages/Pages/SubPages/SendEmail.js new file mode 100644 index 0000000000000000000000000000000000000000..aff09bc843ce63f5238516695dd3887398987756 --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/SendEmail.js @@ -0,0 +1,79 @@ + +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + + +import React from 'react'; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { makeStyles } from "@material-ui/core/styles"; +import { Typography } from '@material-ui/core'; +import EmailInputs from '../../../Components/Components/Inputs/EmailInputs'; + +const useStyles = makeStyles({ + root: { + minWidth: 900, + boxShadow: "2px 2px 1px #A9A9A9", + }, + title: { + fontSize: 28, + fontWeight: "500", + }, + subTitle: { + fontSize: 14, + fontWeight: "500", + }, + pos: { + marginBottom: 12, + }, + displayRow: { + display: "flex", + flexDirection: "row", + justifyContent: 'space-around', + alignItems: "center", + }, + displayColumn: { + display: "flex", + flexDirection: "column", + marginBottom: "1em", + }, +}); + + +const SendEmail = ({ match }) => { + const classes = useStyles(); + const urlParams = new URLSearchParams(window.location.search); + const email = urlParams.get("email"); + + return ( + <Card> + <CardContent> + <Typography + className={classes.title} + color="inherit" + gutterBottom + > + Enviar email + </Typography> + <EmailInputs email={email} /> + </CardContent> + </Card> + ); +} + +export default SendEmail; \ No newline at end of file diff --git a/src/Admin/Pages/Pages/SubPages/Users.js b/src/Admin/Pages/Pages/SubPages/Users.js new file mode 100644 index 0000000000000000000000000000000000000000..cb31af1e213e65b7c8d13be01fb48c68a75dd190 --- /dev/null +++ b/src/Admin/Pages/Pages/SubPages/Users.js @@ -0,0 +1,575 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, { useEffect, useState } from 'react'; +//Material ui componets +import { withStyles } from '@material-ui/core/styles'; +import TableBody from '@material-ui/core/TableBody'; +import Grid from "@material-ui/core/Grid"; +import Paper from "@material-ui/core/Paper"; +import TableCell from '@material-ui/core/TableCell'; +import TableRow from '@material-ui/core/TableRow'; +import IconButton from '@material-ui/core/IconButton'; +import VisibilityIcon from '@material-ui/icons/Visibility'; +import { Button, Chip } from '@material-ui/core'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import AddRoundedIcon from '@material-ui/icons/AddRounded'; +import TextField from '@material-ui/core/TextField'; +import UpdateRoundedIcon from '@material-ui/icons/UpdateRounded' +import FilterListRoundedIcon from "@material-ui/icons/FilterListRounded"; +//Local files +import TableData from '../../../Components/Components/Table'; +import SnackBar from '../../../../Components/SnackbarComponent'; +import LoadingSpinner from '../../../../Components/LoadingSpinner'; +import MobileList from "../../../Components/Components/MobileComponents/SimpleList" +import MobilePageHeader from "../../../Components/Components/MobileComponents/MobilePageHeader" +import PageHeader from "../../../Components/Components/PageHeader" +//Services +import { getRequest, putRequest } from '../../../../Components/HelperFunctions/getAxiosConfig' +import { Url } from '../../../Filters'; +//routers +import { Link, useHistory } from 'react-router-dom'; +import moment from 'moment'; +import styled from 'styled-components' +import EmailRoundedIcon from '@material-ui/icons/EmailRounded'; +import { apiDomain } from '../../../../env'; +import noAvatar from "../../../../img/default_profile.png"; + +const StyledTableCell = withStyles((theme) => ({ + head: { + backgroundColor: theme.palette.common.black, + color: theme.palette.common.white, + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles((theme) => ({ + root: { + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.action.hover, + }, + }, +}))(TableRow); + +const Users = () => { + const ADD_ONE_LENGHT = ['']; + const WINDOW_WIDTH = window.innerWidth + + const router = useHistory() + + const [invertList, setInvertList] = useState(false) + const [error, setError] = useState(null); //Necessary to consult the API, catch errors + const [isLoaded, setIsLoaded] = useState(false); //Necessary to consult the API, wait until complete + const [items, setItems] = useState([]); //Necessary to consult the API, data + const [isLoadingMoreItems, setIsLoadingMoreItems] = useState(false) + const [showFilter, setShowFilter] = useState(false) + const [currPage, setCurrPage] = useState(0) + + const [name, setName] = useState(""); + const [nameValue, setNameValue] = useState("") + const [email, setEmail] = useState(""); + const [emailValue, setEmailValue] = useState("") + + const [snackInfo, setSnackInfo] = useState({ + message: '', + icon: '', + open: false, + color: '', + }) + + // Handle snack infos + const HandleSnack = (message, state, icon, color) => { + setSnackInfo({ + message: message, + icon: icon, + open: state, + color: color + }) + } + + const NameHandler = (event) => { + setNameValue(event.target.value) + } + + const EmailHandler = (event) => { + setEmailValue(event.target.value) + } + + const DisplayDate = (date) => { + const convertedData = moment.utc(date); + return moment(convertedData) + .format("LLL") + .toString(); + }; + + const isUserPublisher = (userRoles) => { + for (let index = 0; index < userRoles.length; index++) { + if (userRoles[index].id === 10) + return true; + } + return false; + } + + const pushPublisherRole = (userId) => { + let index = -1; + for (let i = 0; i < items.length; i++) { + const element = items[i]; + if (element.id === userId) { + index = i + break + } + } + if (index !== -1) { + const cpyItems = [...items] + cpyItems[index].roles.push({ + id: 10, + name: "publisher" + }) + setItems(cpyItems) + } + } + + const turnUserPublisher = (userRoles, userId) => { + let roles_ids = []; + userRoles.map((role) => ( + roles_ids.push(role.id) + )) + roles_ids.push(10); + const body = { + "user": { + "role_ids": roles_ids + } + } + putRequest( + `/users/${userId}`, + body, + (data) => { + if (data.errors) { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + } + else { + HandleSnack(`O usuário ${userId}, agora é publicador`, true, 'success', '#228B22') + pushPublisherRole(userId) + setCurrPage(0) + } + }, + (error) => { + HandleSnack('Ocorreu algum erro', true, 'warning', '#FA8072') + } + ) + } + + const cleanArrayAndInvert = () => { + setInvertList(!invertList) + setCurrPage(0) + setItems([]) + } + + const buildUrl = (email, name, direction) => { + if (email && name) + return Url("users", `"email" : "${email}", "name" : "${name}"`, currPage, direction) + if (email) + return Url("users", `"email" : "${email}"`, currPage, direction) + if (name) + return Url("users", `"name" : "${name}"`, currPage, direction) + else + return Url("users", "", currPage, direction) + } + + useEffect(() => { + if (currPage === 0) + setIsLoaded(false) + else + setIsLoadingMoreItems(true) + getRequest( + buildUrl(email, name, invertList ? "ASC" : "DESC"), + (data, header) => { + const arrData = [...data] + if (arrData.length === 0) { + HandleSnack('Não há mais dados para serem carregados', true, 'warning', '#FFC125') + } else { + const arrItems = [...items] + if (currPage === 0) { + setItems(arrData.concat(ADD_ONE_LENGHT)) + } + else { + arrItems.pop(); //Deleting the last position, that was used to display the button of load more items + const arrResult = arrItems.concat(arrData) + setItems(arrResult.concat(ADD_ONE_LENGHT)) + } + } + setIsLoaded(true) + setIsLoadingMoreItems(false) + }, + (error) => { + HandleSnack('Erro ao carregar os dados', true, 'warning', '#FA8072') + setIsLoaded(true) + setError(true) + setIsLoadingMoreItems(false) + } + ) + }, [currPage, email, name, invertList]) + + useEffect(() => { + setNameValue("") + setName("") + setEmailValue("") + setEmail("") + }, [showFilter]) + + if (error) { + return <div>Error: {error.message}</div>; + } else if (!isLoaded) { + return <LoadingSpinner text="Carregando..." /> + } else { + + //Words in the top part of the table + const topTable = ['ID', 'NOME', 'EMAIL', 'CRIADO EM', 'SCORE', 'PERMISSÃO', 'AÇÃO', "VISUALIZAR"]; + if (WINDOW_WIDTH <= 1150) { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <MobilePageHeader + title="Lista de usuários" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/EditUser?id=-1') + }, + icon: <AddRoundedIcon /> + }, + { + name: "Inverter lista", + isLoading: false, + func: () => { + cleanArrayAndInvert() + }, + } + ]} + > + { + showFilter ? ( + <Grid container direction="row" justify="space-between" alignItems="center"> + <Grid item> + <TextField + label="Name" + value={nameValue} + onChange={(e) => { NameHandler(e) }} + onBlur={(e) => { setEmail(e.target.value) }} + helperText="Ao digitar, retire o foco do campo" + /> + </Grid> + <Grid item> + <TextField + label="Email" + value={emailValue} + onChange={(e) => { EmailHandler(e) }} + onBlur={(e) => { setEmail(e.target.value) }} + helperText="Ao digitar, retire o foco do campo" + /> + </Grid> + </Grid> + ) : null + } + </MobilePageHeader> + + <div style={{ height: '2em' }}></div> + + {items.map((row, index) => + index === items.length - 1 ? ( + <StyledDivButton key={new Date().toISOString() + row.created_at}> + <Button + color="primary" + variant="text" + // disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + disabled={isLoadingMoreItems} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + {isLoadingMoreItems ? ( + <CircularProgress size={24} /> + ) : ( + "Carregar mais itens" + )} + </Button> + </StyledDivButton> + ) : ( + <> + <MobileList + key={new Date().toISOString() + row.created_at} + title={row.name} + subtitle={row.id} + backColor={"#00bcd4"} + avatar={ + <img + src={row.avatar ? apiDomain + row.avatar : noAvatar} + alt="user avatar" + style={{ + height: "100%", + width: "100%", + borderRadius: "50%", + }} + /> + } + href={`/admin/user?id=${row.id}`} + reset={() => { + }} + data={[ + { + title: "Email", + subtitle: row.email ? + <Link to={`/admin/sendEmail?email=${row.email}`} style={{ textDecoration: 'none' }}> + <Button + variant='text' + color='primary' + startIcon={<EmailRoundedIcon />} + > + {row.email} + </Button> + </Link> : null + }, + { + title: "Criado em", + subtitle: DisplayDate(row.created_at) + }, + { + title: "Score", + subtitle: row.score + }, + { + title: "Permissão", + subtitle: row.roles.map((chip) => ( + <ChipDiv> + <Chip label={chip.name} key={chip.id} /> + </ChipDiv> + )) + }, + { + title: "Score", + subtitle: row.score + }, + { + title: "Ações rápidas", + subtitle: <Button + variant="contained" + color="primary" + disabled={isUserPublisher(row.roles)} + onClick={() => { turnUserPublisher(row.roles, row.id) }} + > + Tornar publicador + </Button> + } + + ]} + /> + <div style={{ height: "0.5em" }} /> + </> + ) + )} + </div> + ) + } + else { + return ( + <div> + <SnackBar + severity={snackInfo.icon} + text={snackInfo.message} + snackbarOpen={snackInfo.open} + color={snackInfo.color} + handleClose={() => setSnackInfo({ + message: '', + icon: '', + open: false, + color: '' + })} + /> + <PageHeader + title="Lista de usuários" + actions={[ + { + name: "Atualizar", + isLoading: false, + func: () => { + setCurrPage(0) + }, + icon: <UpdateRoundedIcon /> + }, + { + name: "Filtrar", + isLoading: false, + func: () => { + setShowFilter(!showFilter); + }, + icon: <FilterListRoundedIcon /> + }, + { + name: "Novo", + isLoading: false, + func: () => { + router.push('/admin/EditUser?id=-1') + }, + icon: <AddRoundedIcon /> + } + ]} + > + { + showFilter ? ( + <Grid container direction="row" justify="space-between" alignItems="center"> + <Grid item> + <TextField + label="Name" + value={nameValue} + onChange={(e) => { NameHandler(e) }} + onBlur={(e) => { setEmail(e.target.value) }} + helperText="Ao digitar, retire o foco do campo" + /> + </Grid> + <Grid item> + <TextField + label="Email" + value={emailValue} + onChange={(e) => { EmailHandler(e) }} + onBlur={(e) => { setEmail(e.target.value) }} + helperText="Ao digitar, retire o foco do campo" + /> + </Grid> + </Grid> + ) : null + } + </PageHeader> + + <div style={{ height: '2em' }}></div> + + <TableData + top={topTable} + onIconPressed={cleanArrayAndInvert} + > + <TableBody> + {items.map((row, index) => ( + index === items.length - 1 ? + <StyledTableRow key={new Date().toISOString() + row.created_at}> + {/* Button to load more data */} + <StyledTableCell> + <Button + color='primary' + variant='text' + disabled={isLoadingMoreItems} + startIcon={<AddRoundedIcon />} + onClick={() => { + setCurrPage(currPage + 1) + }} + > + { + isLoadingMoreItems ? <CircularProgress size={24} /> : 'Carregar mais itens' + } + </Button> + </StyledTableCell> + </StyledTableRow> + + : + + <StyledTableRow key={new Date().toISOString() + index}> + <StyledTableCell component="th" scope="row">{row.id}</StyledTableCell> + <StyledTableCell align="right">{row.name}</StyledTableCell> + <StyledTableCell align="right">{row.email ? row.email : ""}</StyledTableCell> + <StyledTableCell align="right"> + {DisplayDate(row.created_at)} + </StyledTableCell> + <StyledTableCell align="right">{row.score}</StyledTableCell> + <StyledTableCell align="right"> + { + row.roles.map((chip) => ( + <ChipDiv> + <Chip label={chip.name} key={chip.id} /> + </ChipDiv> + )) + } + </StyledTableCell> + <StyledTableCell align="right"> + <Button + variant="contained" + color="primary" + disabled={isUserPublisher(row.roles)} + onClick={() => { turnUserPublisher(row.roles, row.id) }} + > + Tornar publicador + </Button> + </StyledTableCell> + <StyledTableCell align="right"> + <Link to={`/admin/user?id=${row.id}`}> + <IconButton> + <VisibilityIcon style={{ fill: '#00bcd4' }} /> + </IconButton> + </Link> + </StyledTableCell> + </StyledTableRow> + ))} + </TableBody> + </TableData> + </div> + ) + } + } +} + +export default Users; + +const ChipDiv = styled.div` + margin-top : 0.5em; +` + +const StyledDivButton = styled(Paper)` + width : 100%; + display : flex; + justify-content : center; + align-items : center; +` + diff --git a/src/Admin/Services.js b/src/Admin/Services.js new file mode 100644 index 0000000000000000000000000000000000000000..bce02eb72a414c7f04cbbdb8e0acbec383ca2fd6 --- /dev/null +++ b/src/Admin/Services.js @@ -0,0 +1,241 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import axios from 'axios'; + +export function Delete(api) { + return new Promise(resolve => { + axios({ + method: 'delete', + url: api, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json; charset=utf-8', + 'access-token': sessionStorage.getItem('@portalmec/accessToken'), + 'client': sessionStorage.getItem('@portalmec/clientToken'), + 'uid': sessionStorage.getItem('@portalmec/uid'), + 'If-None-Match': null + }, + }).then(response => { + if (response.status === 200) { + resolve(true); + } else { + resolve(false); + } + SaveNewHeaders(response) + }).catch(err =>{ + resolve(false) + }) + }) +} + +export function SendEmail(api, body) { + return new Promise(resolve => { + axios({ + method: 'post', + url: api, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json; charset=utf-8', + 'access-token': sessionStorage.getItem('@portalmec/accessToken'), + 'client': sessionStorage.getItem('@portalmec/clientToken'), + 'uid': sessionStorage.getItem('@portalmec/uid'), + 'If-None-Match': null + }, + data: JSON.stringify(body) + }).then(response => { + console.log(response) + if (response.status === 200) { + resolve(true); + } else { + resolve(false); + } + SaveNewHeaders(response) + }).catch(err =>{ + resolve(false) + }) + }) +} + +export function Edit(api, body) { + return new Promise(resolve => { + axios({ + method: 'put', + url: api, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json; charset=utf-8', + 'access-token': sessionStorage.getItem('@portalmec/accessToken'), + 'client': sessionStorage.getItem('@portalmec/clientToken'), + 'uid': sessionStorage.getItem('@portalmec/uid'), + 'If-None-Match': null + }, + data: JSON.stringify(body) + }).then(response => { + console.log(response) + if (response.status === 200) { + resolve(true) + } else { + resolve(false) + } + SaveNewHeaders(response) + }).catch(err =>{ + resolve(false) + }) + }) +} + +export function Create(api, body) { + return new Promise(resolve => { + axios({ + method: 'post', + url: api, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json; charset=utf-8', + 'access-token': sessionStorage.getItem('@portalmec/accessToken'), + 'client': sessionStorage.getItem('@portalmec/clientToken'), + 'uid': sessionStorage.getItem('@portalmec/uid'), + 'If-None-Match': null + }, + data: JSON.stringify(body) + }).then(response => { + if (response.status === 201) { + resolve(true) + } else { + resolve(false) + } + SaveNewHeaders(response) + }).catch(err =>{ + resolve(false) + }) + }) +} + +export function HandleComplain(api) { + return new Promise(resolve => { + axios({ + method: 'post', + url: api, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json; charset=utf-8', + 'access-token': sessionStorage.getItem('@portalmec/accessToken'), + 'client': sessionStorage.getItem('@portalmec/clientToken'), + 'uid': sessionStorage.getItem('@portalmec/uid'), + 'If-None-Match': null + }, + }).then(response => { + if (response.status === 200) { + resolve(true) + } else { + resolve(false) + } + SaveNewHeaders(response) + }).catch(err =>{ + resolve(false) + }) + }) +} + +export function GetFullList(api, headers) { + + return new Promise(resolve => { + axios({ + method: 'get', + url: api, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json; charset=utf-8', + 'access-token': sessionStorage.getItem('@portalmec/accessToken'), + 'client': sessionStorage.getItem('@portalmec/clientToken'), + 'uid': sessionStorage.getItem('@portalmec/uid'), + 'If-None-Match': null + }, + }).then((res) => { + console.log(res) + if (res.status === 200) { + resolve({ + state: true, + data: res.data + }) + } else { + resolve({ + state: false, + data: {} + }) + } + SaveNewHeaders(res) + }).catch((err) => { + resolve({ + state: false, + data: {} + }) + }) + }, []); +} + +export function GetSpecificData(api, headers) { + return new Promise(resolve => { + axios({ + method: 'get', + url: api, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json; charset=utf-8', + 'access-token': sessionStorage.getItem('@portalmec/accessToken'), + 'client': sessionStorage.getItem('@portalmec/clientToken'), + 'uid': sessionStorage.getItem('@portalmec/uid'), + 'If-None-Match': null + }, + }).then((res) => { + console.log(res) + if (res.status === 200) { + resolve({ + state: true, + data: res.data + }) + } else { + resolve({ + state: false, + data: {} + }) + } + SaveNewHeaders(res) + }).catch((err) => { + resolve({ + state: false, + data: {} + }) + }) + }, []); +} + +const SaveNewHeaders = (response) => { + if ( + (response.headers['access-token'] === undefined || response.headers['access-token'] === null) && + (response.headers.client === undefined || response.headers.client === null) + ) { + + } else { + sessionStorage.setItem('@portalmec/accessToken', response.headers['access-token']) + sessionStorage.setItem('@portalmec/clientToken', response.headers.client) + console.log('saved') + } +} + diff --git a/src/App.js b/src/App.js index 96fcaca9a3e0c03ec95e1414350360d6a649f3ea..c97423244a92cc6662c82335e42e3dd8794d1c49 100644 --- a/src/App.js +++ b/src/App.js @@ -16,76 +16,450 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, { useContext, useEffect } from 'react'; -import Home from './Pages/Home'; -import Search from './Pages/Search' -import Header from './Components/Header' -import EcFooter from './Components/EcFooter'; -import GNUAGPLfooter from './Components/AGPLFooter'; -import UserPage from './Pages/UserPage'; -import UserTerms from './Pages/UserTerms'; - -import Teste from './Pages/Teste'; - -import ResourcePage from './Pages/ResourcePage'; -import {BrowserRouter, Switch, Route} from 'react-router-dom'; +import React, { useContext, useEffect, useState } from "react"; import { Store } from './Store' -import TermsPage from './Pages/TermsPage.js' -import PublicationPermissionsPage from './Pages/PublicationPermissionsPage.js' +import Unauthorized from './Admin/Components/Components/Unauthorized' +import Home from "./Pages/HomeFunction"; +import Search from "./Pages/Search"; +import Header from "./Components/Header"; +import EcFooter from "./Components/EcFooter"; +import GNUAGPLfooter from "./Components/AGPLFooter"; +import UserPage from "./Pages/UserPage"; +import UserTerms from "./Pages/UserTerms"; +import Contact from "./Pages/Contact"; +import Teste from "./Pages/Teste"; +import AboutPage from "./Pages/AboutPage"; +import HelpCenter from "./Pages/HelpCenter"; +import TabResoursePub from "./Pages/TabsHelp/TabResoursePub"; +import TabResourseFind from "./Pages/TabsHelp/TabResourseFind"; +import TabNetPart from "./Pages/TabsHelp/TabNetPart"; +import TabManageAc from "./Pages/TabsHelp/TabManageAc"; +import PasswordRecoveryPage from "./Pages/PasswordRecoveryPage.js"; +import PageProfessor from "./Pages/PageProfessor.js"; +import ResourcePage from "./Pages/ResourcePage"; +import { BrowserRouter, Switch, Route } from "react-router-dom"; +import TermsPage from "./Pages/TermsPage.js"; +import PublicationPermissionsPage from "./Pages/PublicationPermissionsPage.js"; +import TabPlataformaMEC from "./Pages/TabsHelp/TabPlataformaMEC"; +import ItemStore from "./Pages/ItemStore.js"; +import EditProfilePage from "./Pages/EditProfilePage.js"; +import PublicUserPage from "./Pages/PublicUserPage.js"; +import UploadPage from "./Pages/UploadPage.js"; +import EditLearningObjectPage from "./Pages/EditLearningObjectPage.js"; +import SiteMap from "./Pages/SiteMap"; +import Accessibility from "./Pages/Accessibility"; +import CollectionPage from "./Pages/CollectionPage.js"; +import FormationMaterialPage from "./Pages/FormationMaterialPage.js"; +import FormationMaterialIframe from "./Pages/FormationMaterialIframe.js"; +import MaterialPage from "./Pages/MaterialPage"; +import Maintence from './Components/maintenance' +import NoteVariables from "./Admin/Pages/Pages/SubPages/NoteVariables"; +import Institution from "./Admin/Pages/Pages/SubPages/Institutions"; +import SendEmail from "./Admin/Pages/Pages/SubPages/SendEmail"; +import Inframe from "./Admin/Pages/Pages/SubPages/Inframe"; +import Languages from "./Admin/Pages/Pages/SubPages/Languages"; +import Activity from "./Admin/Pages/Pages/SubPages/Activity"; +import InstitutionCard from "./Admin/Components/Components/DataCards/InstitutionsCard"; +import InstitutionsInput from "./Admin/Components/Components/Inputs/IntitutionsInputs"; +import CreateInstitution from "./Admin/Components/Components/Inputs/CreateInstitution"; +import NoteVarCard from "./Admin/Components/Components/DataCards/NoteVarCard"; +import NoteVarInputs from "./Admin/Components/Components/Inputs/NoteVarInputs"; +import EditLanguage from "./Admin/Components/Components/Inputs/EditLanguage"; +import CreateLanguage from "./Admin/Components/Components/Inputs/CreateLanguage"; +import ActivityCard from "./Admin/Components/Components/DataCards/ActivityCard"; +import CommunityQuestions from "./Admin/Pages/Pages/SubPages/CommunityQuestions"; +import CommunityCard from "./Admin/Components/Components/DataCards/CommunityQuestionCard"; +import Collections from "./Admin/Pages/Pages/SubPages/Collections"; +import CollectionCard from "./Admin/Components/Components/DataCards/CollectionCard"; +import EditCollection from "./Admin/Components/Components/Inputs/EditCollection"; +import Ratings from "./Admin/Pages/Pages/SubPages/Rating"; +import RatingCard from "./Admin/Components/Components/DataCards/RatingCard"; +import EditRating from "./Admin/Components/Components/Inputs/EditRating"; +import CreateRating from "./Admin/Components/Components/Inputs/CreateRating"; +import Questions from "./Admin/Pages/Pages/SubPages/Questions"; +import CreateQuestions from "./Admin/Components/Components/Inputs/CreateQuestion"; +import EducationalObject from "./Admin/Pages/Pages/SubPages/EducationalObjects"; +import EducationalObjectCard from "./Admin/Components/Components/DataCards/EducationalObjectsCard"; +import EducationalObjectEdit from "./Admin/Components/Components/Inputs/EditEducationalObect"; +import Complaints from "./Admin/Pages/Pages/SubPages/Complaints"; +import ComplaintCard from "./Admin/Components/Components/DataCards/ComplaintsCard"; +import AproveTeacher from "./Admin/Pages/Pages/SubPages/AproveTeacher"; +import UserCard from "./Admin/Components/Components/DataCards/UserCard"; +import EditUser from "./Admin/Components/Components/Inputs/EditUser"; +import UserList from "./Admin/Pages/Pages/SubPages/Users"; +import UserPermissions from "./Admin/Pages/Pages/SubPages/Permissions"; +import EditRole from "./Admin/Components/Components/Inputs/EditRoles"; +import CreateRole from "./Admin/Components/Components/Inputs/CreateRole"; +import BlockedUser from "./Admin/Pages/Pages/SubPages/BlockedUsers"; +import AppBarAdmin from './Admin/Components/Components/AppBar' +import Maintenance from "./Components/maintenance"; -export default function App(){ +export default function App() { // eslint-disable-next-line - const { state, dispatch } = useContext(Store) - useEffect(()=>{ - dispatch({ - type: 'WINDOW_SIZE', - innerWindow: { - width: window.innerWidth, - height: window.innerHeight - } - }) - },[]) + const { state, dispatch } = useContext(Store); + const [hideFooter, setHideFooter] = useState(false); + + const CheckUserPermission = () => { + let canUserEdit = false; + + if (state.userIsLoggedIn) { + const roles = [...state.currentUser.roles]; + for (let i = 0; i < roles.length; i++) + if (roles[i].name === 'admin' || roles[i].name === 'editor') + canUserEdit = true; + } + else { + canUserEdit = false; + } + + return canUserEdit; + } - useEffect(()=>{ + useEffect(() => { + setHideFooter(String(window.location.href).includes("iframe-colecao")); + }, [window.location.href]); + + useEffect(() => { + dispatch({ + type: "WINDOW_SIZE", + innerWindow: { + width: window.innerWidth, + height: window.innerHeight, + }, + }); + }, []); + + useEffect(() => { const setWindowSize = () => { dispatch({ - type: 'WINDOW_SIZE', + type: "WINDOW_SIZE", innerWindow: { width: window.innerWidth, - height: window.innerHeight - } - }) - } + height: window.innerHeight, + }, + }); + }; - window.addEventListener('resize',setWindowSize) + window.addEventListener("resize", setWindowSize); - return () => window.removeEventListener('resize',setWindowSize) - },[window.innerWidth,window.innerHeight]) + return () => window.removeEventListener("resize", setWindowSize); + }, [window.innerWidth, window.innerHeight]); - return( - <BrowserRouter> + return ( + <BrowserRouter basename="/react"> + <Maintenance /> <Header /> - <div style={{backgroundImage: "linear-gradient(to right,#ff7f00,#e81f4f,#673ab7,#00bcd4)", height:"5px"}}></div> + <div + style={{ + backgroundImage: + "linear-gradient(to right,#ff7f00,#e81f4f,#673ab7,#00bcd4)", + height: "5px", + }} + ></div> + <link + href="https://fonts.googleapis.com/css?family=Kalam|Pompiere|Roboto&display=swap" + rel="stylesheet" + /> <Switch> - <Route path="/" exact={true} component={Home}/> + <Route path="/" exact={true} component={Home} /> <Route path="/busca" component={Search} /> - <Route path="/perfil-atualizacoes" component={UserPage} /> - <Route path="/recurso" component={ResourcePage}/> - - <Route path="/termos-publicar-recurso" component={TermsPage}/> - <Route path="/permission" component={PublicationPermissionsPage}/> + <Route path="/perfil" component={UserPage} /> + <Route path="/editarperfil" component={EditProfilePage} /> + <Route path="/recurso/:recursoId" component={ResourcePage} /> + <Route path="/termos-publicar-recurso" component={TermsPage} /> + <Route path="/permission" component={PublicationPermissionsPage} /> {/*<Route path="termos-de-uso#publicacoes-de-usuario" component={}*/} - - - <Route path="/termos" component={UserTerms}/> - <Route path="/teste" component={Teste}/> - - + <Route path="/ajuda" component={HelpCenter} /> + <Route path="/contato" component={Contact} /> + <Route path="/termos" component={UserTerms} /> + <Route path="/teste" component={Teste} /> + <Route path="/sobre" component={AboutPage} /> + <Route path="/mapa-site" component={SiteMap} /> + <Route path="/acessibilidade" component={Accessibility} /> + <Route path="/publicando-recurso" component={TabResoursePub} /> + <Route path="/encontrando-recurso" component={TabResourseFind} /> + <Route path="/participando-da-rede" component={TabNetPart} /> + <Route path="/gerenciando-conta" component={TabManageAc} /> + <Route path="/plataforma-mec" component={TabPlataformaMEC} /> + <Route path="/recuperar-senha" component={PasswordRecoveryPage} /> + <Route path="/usuario-publico/:userId" component={PublicUserPage} /> + <Route + path="/editar-recurso/:recursoId" + component={EditLearningObjectPage} + /> + <Route path="/professor" component={PageProfessor} /> + <Route path="/upload" component={UploadPage} /> + <Route path="/loja" component={ItemStore} /> + <Route path="/colecao-do-usuario/:id" component={CollectionPage} /> + <Route path="/colecao" component={FormationMaterialPage} /> + <Route path="/topico" component={FormationMaterialPage} /> + <Route path="/iframe-colecao" component={FormationMaterialIframe} /> + <Route path="/material-formacao" component={MaterialPage} /> + <div style={{ backgroundColor: " #D3D3D3" }}> + <AppBarAdmin /> + <div style={{ padding: "2em" }}> + <Route path="/admin/home" exact={true} render={() => { + if (CheckUserPermission()) + return <Inframe /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/intitutions" render={() => { + if (CheckUserPermission()) + return <Institution /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/institution" render={() => { + if (CheckUserPermission()) + return <InstitutionCard /> + else + return <Unauthorized /> + }} /> + <Route + path="/admin/institutionEdit" + render={() => { + if (CheckUserPermission()) + return <InstitutionsInput /> + else + return <Unauthorized /> + }} + /> + <Route + path="/admin/InstitutionCreate" + render={() => { + if (CheckUserPermission()) + return <CreateInstitution /> + else + return <Unauthorized /> + }} + /> + <Route path="/admin/noteVars" render={() => { + if (CheckUserPermission()) + return <NoteVariables /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/noteVar" render={() => { + if (CheckUserPermission()) + return <NoteVarCard /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/noteVarEdit" render={() => { + if (CheckUserPermission()) + return <NoteVarInputs /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/languages" render={() => { + if (CheckUserPermission()) + return <Languages /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/languageEdit" render={() => { + if (CheckUserPermission()) + return <EditLanguage /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/languageCreate" render={() => { + if (CheckUserPermission()) + return <CreateLanguage /> + else + return <Unauthorized /> + }} /> + <Route + path="/admin/CommunityQuestions" + render={() => { + if (CheckUserPermission()) + return <CommunityQuestions /> + else + return <Unauthorized /> + }} + /> + <Route + path="/admin/CommunityQuestion" + render={() => { + if (CheckUserPermission()) + return <CommunityCard /> + else + return <Unauthorized /> + }} + /> + <Route path="/admin/Collections" render={() => { + if (CheckUserPermission()) + return <Collections /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/Collection" render={() => { + if (CheckUserPermission()) + return <CollectionCard /> + else + return <Unauthorized /> + }} /> + <Route + path="/admin/EditCollection" + render={() => { + if (CheckUserPermission()) + return <EditCollection /> + else + return <Unauthorized /> + }} + /> + <Route path="/admin/Ratings" render={() => { + if (CheckUserPermission()) + return <Ratings /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/Rating" render={() => { + if (CheckUserPermission()) + return <RatingCard /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/EditRating" render={() => { + if (CheckUserPermission()) + return <EditRating /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/CreateRating" render={() => { + if (CheckUserPermission()) + return <CreateRating /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/Questions" render={() => { + if (CheckUserPermission()) + return <Questions /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/CreateQuestion" render={() => { + if (CheckUserPermission()) + return <CreateQuestions /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/activities" render={() => { + if (CheckUserPermission()) + return <Activity /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/activity" render={() => { + if (CheckUserPermission()) + return <ActivityCard /> + else + return <Unauthorized /> + }} /> + <Route + path="/admin/learningObjects" + render={() => { + if (CheckUserPermission()) + return <EducationalObject /> + else + return <Unauthorized /> + }} /> + <Route + path="/admin/learningObject" + render={() => { + if (CheckUserPermission()) + return <EducationalObjectCard /> + else + return <Unauthorized /> + }} /> + <Route + path="/admin/learningObjectEdit" + render={() => { + if (CheckUserPermission()) + return <EducationalObjectEdit /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/complaints" render={() => { + if (CheckUserPermission()) + return <Complaints /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/complaint" render={() => { + if (CheckUserPermission()) + return <ComplaintCard /> + else + return <Unauthorized /> + }} /> + <Route + path="/admin/users/teacher_requests" + render={() => { + if (CheckUserPermission()) + return <AproveTeacher /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/usersList" render={() => { + if (CheckUserPermission()) + return <UserList /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/user" render={() => { + if (CheckUserPermission()) + return <UserCard /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/EditUser" render={() => { + if (CheckUserPermission()) + return <EditUser /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/permissions" render={() => { + if (CheckUserPermission()) + return <UserPermissions /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/EditPermissions" render={() => { + if (CheckUserPermission()) + return <EditRole /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/CreateRole" render={() => { + if (CheckUserPermission()) + return <CreateRole /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/BlockedUsers" render={() => { + if (CheckUserPermission()) + return <BlockedUser /> + else + return <Unauthorized /> + }} /> + <Route path="/admin/sendEmail" render={() => { + if (CheckUserPermission()) + return <SendEmail /> + else + return <Unauthorized /> + }} /> + </div> + </div> </Switch> - <EcFooter/> - <GNUAGPLfooter/> + {!hideFooter && ( + <div> + <EcFooter /> + <GNUAGPLfooter /> + </div> + )} </BrowserRouter> - ) + ); } diff --git a/src/Components/AboutCarousel.css b/src/Components/AboutCarousel.css new file mode 100644 index 0000000000000000000000000000000000000000..92e69e00e308af1fb61fc38c3de4789c8b19dffa --- /dev/null +++ b/src/Components/AboutCarousel.css @@ -0,0 +1,6 @@ +#You-Can-Caroussel > .carousel-root > .carousel-slider > button{ + display:none; +} +.dot{ + border: 1px solid black; +} \ No newline at end of file diff --git a/src/Components/AboutCarousel.js b/src/Components/AboutCarousel.js new file mode 100644 index 0000000000000000000000000000000000000000..fc36515228cd3b234058e7e712d5630900be159e --- /dev/null +++ b/src/Components/AboutCarousel.js @@ -0,0 +1,131 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + + +import React from 'react'; +import "react-responsive-carousel/lib/styles/carousel.min.css"; +import { Carousel } from 'react-responsive-carousel'; +import styled from 'styled-components'; +import "./AboutCarousel.css" + +import Img1 from '../img/carousel/Icone_Grande (1).png' +import Img2 from '../img/carousel/Icone_Grande (2).png' +import Img3 from '../img/carousel/Icone_Grande (3).png' +import Img4 from '../img/carousel/Icone_Grande (4).png' +import Img5 from '../img/carousel/Icone_Grande (5).png' + +const CarouselAbout = styled(Carousel)` + + .carousel.carousel-slider .control-arrow { + font-size: 18px !important; + bottom: 40% !important; + } + + .carousel .thumb{ + border-radius: 50%; + width:62px; + filter: grayscale(1); + } + + .carousel .thumb.selected, .carousel .thumb:hover { + border: 2px solid #a4a4a4 !important; + filter:grayscale(0); + } + + + div { + color: #666 !important; + text-align: center !important; + + img { + height: 52px; + width: 52px !important; + display: block; + margin: auto; + + } + span { + font-size: 26px; + font-weight: 400; + margin-bottom: 10px; + } + p { + font-size: 15px; + line-height: 1.42857143; + text-align: center; + display: block; + margin: auto; + // padding-inline: 235px + } + } +` + + + +function AboutCarousel(props) { + + return ( + <div id={"You-Can-Caroussel"}> + <CarouselAbout showThumbs= {true} + showStatus= {false} + showIndicators = {false} + interval={8000} + transitionTime={1000} + autoPlay + infiniteLoop + + > + <div> + <img src={Img1} alt="Slide 1"/> + <span>Buscar e Baixar Recursos</span> + <p>São mais de 20 mil recursos educacionais à sua disposição. São recursos de portais parceiros do MEC e de professores que, como você, atuam na Educação Básica!</p> + </div> + <div> + <img src={Img2} alt="Slide 2"/> + <span>Guardar Recursos em Coleções</span> + <p>Guarde e organize em coleções aqueles recursos que você considera ser interessantes para elaborar a sua aula. Aproveite e indique aos colegas pelas redes sociais ou e-mail.</p> + </div> + <div> + <img src={Img3} alt="Slide 3"/> + + <span>Compartilhar suas Experiências</span> + <p>Você pode relatar suas experiências sobre o uso de recursos no seu cotidiano escolar. Aproveite esse espaço para sugerir e conhecer novos usos para um mesmo recurso.</p> + + </div> + <div> + <img src={Img4} alt="Slide 4"/> + + <span>Publicar o seu Recurso</span> + <p>Colabore e ajude a fortalecer a plataforma publicando um recurso educacional desenvolvido por você ou pelo coletivo da escola do qual faz parte. Compartilhe seu conhecimento e dê visibilidade ao seu recurso, torne-o público enriquecendo o conhecimento partilhado!</p> + + + </div> + <div> + <img src={Img5} alt="Slide 5"/> + + <span>Encontrar Materiais de Formação</span> + <p>A plataforma disponibiliza um conjunto de materiais de formação desenvolvidos pelo Ministério da Educação com diversidade de temas e recursos educacionais.</p> + + + </div> + </CarouselAbout> + </div> + ); +} + +export default AboutCarousel; diff --git a/src/Components/AboutCarouselPartner.css b/src/Components/AboutCarouselPartner.css new file mode 100644 index 0000000000000000000000000000000000000000..4ccfbadb16760548c55fdca453e17662174f706a --- /dev/null +++ b/src/Components/AboutCarouselPartner.css @@ -0,0 +1,6 @@ +#Partner-Caroussel > .carousel-root > .carousel-slider > button{ + display:none; +} +.dot{ + border: 1px solid black; +} \ No newline at end of file diff --git a/src/Components/AboutCarouselPartner.js b/src/Components/AboutCarouselPartner.js new file mode 100644 index 0000000000000000000000000000000000000000..eb9c9c2939dedce5bf90673951b2ffe29e6d431d --- /dev/null +++ b/src/Components/AboutCarouselPartner.js @@ -0,0 +1,142 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + + +import React from 'react'; +import "react-responsive-carousel/lib/styles/carousel.min.css"; +import { Carousel } from 'react-responsive-carousel'; +import './AboutCarouselPartner.css' + + +import LogoPortalDoProfessor from "../img/logo_parceiros/logo_portaldoprofessor.png"; +import LogoBioe from "../img/logo_parceiros/logo_bioe.png"; +import LogoDominioPublico from "../img/logo_parceiros/logo_dominiopublico.png"; +import LogoTvEscola from "../img/logo_parceiros/logo_tvescola.png"; +import Safer from "../img/logo_parceiros/safer.png"; +import FundacaoLemann from "../img/logo_parceiros/fundacao-lemann.png"; +import InstitutoCrescer from "../img/logo_parceiros/instituto-crescer.png"; +import RedeEscola from "../img/logo_parceiros/redeescola.png"; +import Educagital from "../img/logo_parceiros/educagital.png"; +import EnefAef from "../img/logo_parceiros/ENEF_AEF.png"; +import Impa from "../img/logo_parceiros/impa.png"; +import Futura from "../img/logo_parceiros/futura.png"; +import Impulsiona from "../img/logo_parceiros/impulsiona.png"; +import InstPeninsula from "../img/logo_parceiros/inst-peninsula.png"; +import Telefonica from "../img/logo_parceiros/telefonica.png"; + +function AboutCarouselPartner(props) { + + + const itens = [ + <a href="http://portaldoprofessor.mec.gov.br/index.html" rel="noreferrer" target="_blank"> + <img src={LogoPortalDoProfessor} alt="LogoPortalDoProfessor"/> + </a>, + <a href="http://objetoseducacionais2.mec.gov.br/" rel="noreferrer" target="_blank"> + <img src={LogoBioe} alt="LogoBioe" /> + </a>, + <a href="http://www.dominiopublico.gov.br/pesquisa/PesquisaObraForm.jsp" rel="noreferrer" target="_blank"> + <img src={LogoDominioPublico} alt="LogoDominioPublico" /> + </a>, + <a href="https://tvescola.org.br/" rel="noreferrer" target="_blank"> + <img src={LogoTvEscola} alt="LogoTvEscola" /> + </a>, + <a href="http://www.fundacaolemann.org.br/" rel="noreferrer" target="_blank"> + <img style={{align: "middle"}} src={FundacaoLemann} alt="FundacaoLemann" /> + </a>, + <a href="http://new.safernet.org.br/" rel="noreferrer" target="_blank"> + <img src={Safer} alt="Safer" /> + </a>, + <a href="http://institutocrescer.org.br/" rel="noreferrer" target="_blank"> + <img src={InstitutoCrescer} alt="InstitutoCrescer" /> + </a>, + <a href="http://escoladigital.org.br/" rel="noreferrer" target="_blank"> + <img src={RedeEscola} alt="RedeEscola" /> + </a>, + <a href="http://educadigital.org.br" rel="noreferrer" target="_blank"> + <img src={Educagital} alt="Educagital" /> + </a>, + <a href="http://www.aefbrasil.org.br" rel="noreferrer" target="_blank"> + <img style={{filter: "grayscale(1)"}} src={EnefAef} alt="EnefAef" /> + </a>, + <a href="https://impa.br/" rel="noreferrer" target="_blank"> + <img src={Impa} alt="Impa" /> + </a>, + <a href="http://futura.org.br/" rel="noreferrer" target="_blank"> + <img src={Futura} alt="Futura" /> + </a>, + <a href="http://impulsiona.org.br/" rel="noreferrer" target="_blank"> + <img src={Impulsiona} alt="Impulsiona" /> + </a>, + <a href="http://www.institutopeninsula.org.br/" rel="noreferrer" target="_blank"> + <img src={InstPeninsula} alt="InstPeninsula" /> + </a>, + <a href="http://fundacaotelefonica.org.br/" rel="noreferrer" target="_blank"> + <img src={Telefonica} alt="Telefonica" /> + </a> + ] + const partnerPerPage = (()=> { + var pageWidth = window.innerWidth + if (pageWidth >= 1200){ + return 3 + } + else{ + return 1 + } + }) + var rows = [] + var partner_per_page = partnerPerPage() + for(let i = 0; i < 15/partner_per_page; i++){ + rows.push(itens.slice(i*partner_per_page, partner_per_page*(i+1))) + } + + return ( + <div id="Partner-Caroussel"> + <Carousel showThumbs= {false} + showStatus= {false} + showIndicators = {true} + interval={4500} + transitionTime={1000} + autoPlay + infiniteLoop + + > + { + rows.map((row, index) => ( + <div key={(index+1)} style={{display:'inline-flex', paddingTop:100}}> + { + row.map((partner, index2) => ( + <div + key={index + (index2*10)} + style={{marginLeft:10, display: 'flex', maxWidth:300}} + > + { + partner + } + </div> + )) + } + </div> + )) + } + </Carousel> + </div> + + ); +} + +export default AboutCarouselPartner; diff --git a/src/Components/AboutResource.js b/src/Components/AboutResource.js deleted file mode 100644 index 87a0949e185d9dbdaa6f1661f4e6af9de358b7dc..0000000000000000000000000000000000000000 --- a/src/Components/AboutResource.js +++ /dev/null @@ -1,264 +0,0 @@ -/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre -Departamento de Informatica - Universidade Federal do Parana - -This file is part of Plataforma Integrada MEC. - -Plataforma Integrada MEC is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Plataforma Integrada MEC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ - -import React from 'react'; -import axios from 'axios'; -import {apiUrl} from '../env'; -import {Col,Row} from 'react-grid-system'; -import Paper from '@material-ui/core/Paper'; -import Typography from '@material-ui/core/Typography'; -import CardContent from '@material-ui/core/CardContent'; -import Collapse from '@material-ui/core/Collapse'; -import CardMedia from '@material-ui/core/CardMedia'; -import CardActions from '@material-ui/core/CardActions'; -import Coment from './Coment'; -import Rating from '@material-ui/lab/Rating'; -import Tag from './Tags'; -import { Hidden } from '@material-ui/core'; -import Button from '@material-ui/core/Button'; -import IconButton from '@material-ui/core/IconButton'; -import Menu from '@material-ui/core/Menu'; -import ListItemIcon from '@material-ui/core/ListItemIcon'; -import MenuItem from '@material-ui/core/MenuItem'; -import MoreVertIcon from '@material-ui/icons/MoreVert'; -/*imagens e icones*/ -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import ShareIcon from '@material-ui/icons/Share'; -import ReportIcon from '@material-ui/icons/Error'; -import AddIcon from '@material-ui/icons/CreateNewFolder'; -import FavoriteIcon from '@material-ui/icons/Favorite'; -import GetAppIcon from '@material-ui/icons/GetApp'; -import StarBorderIcon from '@material-ui/icons/StarBorder'; -import RateReviewIcon from '@material-ui/icons/RateReview'; -import VisibilityIcon from '@material-ui/icons/Visibility'; -import SdCardIcon from '@material-ui/icons/SdCard'; -import TranslateIcon from '@material-ui/icons/Translate'; -import InsertDriveFileIcon from '@material-ui/icons/InsertDriveFile'; -import DateRangeIcon from '@material-ui/icons/DateRange'; -import UpdateIcon from '@material-ui/icons/Update'; -import AssignmentOutlinedIcon from '@material-ui/icons/AssignmentOutlined'; -import OpenIcon from '@material-ui/icons/CallMade'; -import { TextField, FormControl } from '@material-ui/core'; - -import noAvatar from "../img/default_profile.png"; -import styled from 'styled-components' - - - -const TypographyStyled = styled(Typography)` - padding: 5px; -` - -const CardActionsStyled = styled(CardActions)` - padding:0px 0px 10px 0px; - align-items: center; -` - -const PaperStyled = styled(Paper)` - margin: 2em 0em 2em 0em; - padding: 2em 2em 0em 2em; - @media only screen and (min-width :500px ) { - margin: 2em 10% 2em 10%; - } -` -const elevateStyle = 3; - -const Overlay = styled.div` - display: inline; - background: linear-gradient(transparent,transparent,#fff),transparent; - bottom: 0; - cursor: pointer; - left: 0; - opacity: .8; - filter: alpha(opacity=80); - position: absolute; - right: 0; - top: 0; - height: inherit; - -` -async function getResource(id){ - let res = await axios.get(`${apiUrl}/learning_objects/${id}`); - let data = res.data; - return(data); -} - -export default function AboutResource() { - - var display = getResource(19133); - console.log(display); - const [anchorEl, setAnchorEl] = React.useState(null); - - function handleClick(event) { - setAnchorEl(event.currentTarget); - } - - function handleClose() { - setAnchorEl(null); - } - return ( - <div style={{backgroundColor: "#f4f4f4", padding: "2em 0em 2em 0em"}}> - <PaperStyled elevation={elevateStyle}> - <CardMedia image={noAvatar}/> - <CardContent style={{padding: "0em"}}> - <Typography variant="h5" color="textSecondary" component="h3"> - {display.name} - </Typography> - <CardActionsStyled > - <IconButton style={{padding: "0px"}}aria-label="Favoritar"> - <FavoriteIcon /> - </IconButton> - <Rating - name="customized-empty" - value={2} - precision={0.5} - emptyIcon={<StarBorderIcon fontSize="inherit" />} - /> - <Hidden smDown> - <IconButton aria-label="Relatar"> - <RateReviewIcon/> - </IconButton> - RELATAR - </Hidden> - </CardActionsStyled> - <CardContent style={{padding: "0em"}}> - <TypographyStyled component="p" color="textSecondary"> - Tipo de Recurso: - </TypographyStyled> - <TypographyStyled component="p" color="textSecondary"> - Componentes Curriculares: - </TypographyStyled> - <TypographyStyled component="p" color="textSecondary"> - Outras Temáticas: - </TypographyStyled> - <TypographyStyled component="p" color="textSecondary"> - Etapas de Ensino: - </TypographyStyled> - </CardContent> - <Row > - <Col md={4} sm={12}><VisibilityIcon style={{verticalAlign: "middle"}}/>Visualizações:</Col> - <Col md={5} sm={12}><GetAppIcon style={{verticalAlign: "middle"}}/>Baixados/Acessados:</Col> - </Row> - <CardActions disableSpacing style={{fontSize: "0.7rem", borderRadius: "2px", justifyContent: "space-between", paddingTop: "2em"}}> - <Hidden smDown> - <Button aria-label="Reportar" size="small"> - <ReportIcon /> REPORTAR ABUSO OU ERRO </Button> - <Button aria-label="Compartilhar"> - <ShareIcon /> COMPARTILHAR </Button> - </Hidden> - <Button aria-label="Guardar"> - <AddIcon /> GUARDAR </Button> - <Button variant="contained" color="secondary"> - <OpenIcon/> Abrir Recurso </Button> - <Hidden mdUp> - <Button aria-controls="simple-menu" aria-haspopup="true" onClick={handleClick}> - <MoreVertIcon/> - </Button> - <Menu - id="simple-menu" - anchorEl={anchorEl} - keepMounted - open={Boolean(anchorEl)} - onClose={handleClose} - > - <MenuItem onClick={handleClose}> - <ListItemIcon> - <ShareIcon /> - </ListItemIcon> - Compartilhar</MenuItem> - <MenuItem onClick={handleClose}> - <ListItemIcon> - <ReportIcon /> - </ListItemIcon> - Reportar</MenuItem> - </Menu> - </Hidden> - </CardActions> - </CardContent> - </PaperStyled> - <PaperStyled elevation={elevateStyle}> - <Row style={{padding: "15px"}}> - <Col md={8} sm={12}> - <Typography variant="h5" color="textSecondary" component="h3"> - Sobre o Recurso - </Typography> - <Typography component="p" color="textSecondary"> - Paper can be used to build surface or other elements for your application. - </Typography> - <div style={{paddingTop: "4em"}}> - <Typography variant="h5" color="textSecondary" component="h3"> - Informações Adicionais</Typography> - <Tag name="teste"/> - <Typography component="p" color="textSecondary"> - <SdCardIcon/>Tamanho: - </Typography> - <Typography component="p" color="textSecondary"> - <TranslateIcon/>Idioma: - </Typography> - <Typography component="p" color="textSecondary"> - <InsertDriveFileIcon/>Formato: - </Typography> - <Typography component="p" color="textSecondary"> - <DateRangeIcon/>Data de Envio: - </Typography> - <Typography component="p" color="textSecondary"> - <UpdateIcon/>Modificado em: - </Typography> - <Typography component="p" color="textSecondary"> - <AssignmentOutlinedIcon/>Tipo de Licença: - </Typography> - </div> - </Col> - <Col md={4} sm={12}> - <div style={{borderLeft:"1px solid #e5e5e5"}}> - <Typography> - Enviado por: - </Typography><br/> - <img style={{padding: "2em" }} alt="Avatar" src={noAvatar} height="100em"/> - </div> - </Col> - </Row> - - - </PaperStyled> - <PaperStyled elevation={elevateStyle}> - <CardContent> - Conte sua experiência com o Recurso - <Rating - name="customized-color" - value={0} - precision={0.5} - /> - <Row> - <Col md={10} sm={12}> - <TextField fullWidth="true" multiline="true" required="true" placeholder="Escreva aqui sua experiência com o recurso *"/> - </Col> - <Col> - <Button variant="contained" color="primary">submit </Button> - </Col> - </Row> - - </CardContent> - <CardContent> - <Typography variant="h5" component="p" color="textSecondary">Relatos sobre o uso do Recurso</Typography> - <Coment author="jorginho" coment="muito bom gostei mto bom msm"/> - </CardContent> - </PaperStyled> - </div> - ); -} diff --git a/src/Components/AcessibilityBar.js b/src/Components/AcessibilityBar.js deleted file mode 100644 index 7546ea2f92646dc4ee8da27a1f5550d8fc702a2a..0000000000000000000000000000000000000000 --- a/src/Components/AcessibilityBar.js +++ /dev/null @@ -1,60 +0,0 @@ -/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre -Departamento de Informatica - Universidade Federal do Parana - -This file is part of Plataforma Integrada MEC. - -Plataforma Integrada MEC is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Plataforma Integrada MEC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ - -import React, {Component} from 'react'; -import {Row, Col, Container} from 'react-grid-system'; -import Bt from './Button.js' - -const acessibilityBar ={ - width: '100%', - color: 'gray', - fontFamily: '"Roboto", Sans-Serif', - whiteSpace: 'nowrap', - fontSize: '0.7vw', - textAlign: 'right' - -} - -class AcessibilityBar extends Component{ - renderBt(name, link=undefined){ - return <Bt name={name} link={link}/> - } - render(){ - return( - <Container fluid={true}> - <Row style={acessibilityBar}> - <Col md={6} xs={6} lg={6} style={{textAlign: 'left'}}> - {this.renderBt("Ir para conteúdo 1", "texto1")} - {this.renderBt("Ir para menu 2", "texto2")} - {this.renderBt("Ir para menu 3", "texto3")} - {this.renderBt("Ir para rodapé 4", "texto4")} - </Col> - <Col md={6} xs={6} lg={6} style={{textAlign: 'right'}}> - Tamanho do Texto: {this.renderBt("A+")} - {this.renderBt("A-")} - {this.renderBt("A")} - {this.renderBt("Contraste")} - {this.renderBt("Acessibilidade")} - {this.renderBt("Mapa do Site")} - </Col> - </Row> - </Container> - ); - } -} -export default AcessibilityBar; diff --git a/src/Components/AchievementDescriptionCard.js b/src/Components/AchievementDescriptionCard.js new file mode 100644 index 0000000000000000000000000000000000000000..ad01fc46506825aef6570d3c342bdac2d088d8f2 --- /dev/null +++ b/src/Components/AchievementDescriptionCard.js @@ -0,0 +1,39 @@ +import React from 'react' +import styled from 'styled-components' +import Paper from '@material-ui/core/Paper'; +import { Grid } from '@material-ui/core' +import RequirementDialog from './RequirementsDialog.js'; + +export default function AchievementDescriptionCard(props) { + return ( + <Paper elevation={3}> + <Grid container direction="row" justify="space-around" alignItems="center"> + <Grid item xs={3}> + <AchievementImg src={props.src}/> + </Grid> + <Grid item xs={7}> + <AchievementTitle>{props.title}</AchievementTitle> + <AchievementDescription>{props.description}</AchievementDescription> + <RequirementDialog + title={props.title} + description={props.description} + requirements={props.requirements} + /> + </Grid> + </Grid> + </Paper> + ); +} + +const AchievementImg = styled.img` + border-radius: 100px; + width: 100px; + height: 100px; + margin: 30px; +` + +const AchievementTitle = styled.h2` +` + +const AchievementDescription = styled.p` +` diff --git a/src/Components/Activities/Definitions.js b/src/Components/Activities/Definitions.js new file mode 100644 index 0000000000000000000000000000000000000000..9b2e14344517041fcd61b7ac6a1f16b6c1bb4d6b --- /dev/null +++ b/src/Components/Activities/Definitions.js @@ -0,0 +1,87 @@ +export const ObjectColor = { + 'Recurso' : 'recurso-color', + 'Coleção' : 'colecao-color', + 'Curadoria' : 'curadoria-color' +} + +export const Tag = { + 'Collection' : 'Coleção', + 'LearningObject' : 'Recurso', + 'User' : 'Usuário', + 'CuratorAssignment' : 'Curadoria' +} + +export const GetActivityProperties = (activity) => { + const properties = Possible_Activities[activity] + return properties +} + +export const Possible_Activities = { + 'collection_item.destroy': { + icon: 'create', + text: ' apagou uma coleção ' + }, + 'collection_item.create': { + icon: 'create', + text: ' guardou o recurso ', + text2: 'na coleção' + }, + 'collection_item.update': { + icon: 'speaker_notes', + text: ' editou um recurso a sua coleção ' + }, + 'collection.update': { + icon: 'speaker_notes', + text: ' editou a coleção ' + }, + 'collection.create': { + icon: 'create', + text: ' criou a coleção ' + }, + 'complaint.create': { + icon: 'report', + text: ` criou uma denúncia sobre ` //text: ` criou uma denúncia sobre ${DINAMYC_SUBJECT[myActivity.recipient_type]} ` + }, + 'collection.destroy': { + icon: 'delete', + text: ' excluiu ' + }, + 'learning_object.destroy': { + icon: 'delete', + text: ' apagou o recurso ' + }, + 'learning_object.publish': { + icon: 'speaker_notes', + text: ' publicou o recurso educacional ' + }, + 'like.destroy': { + icon: 'create', + text: ' favoritou' + }, + 'like.create': { + icon: 'favorite', + text: ' curtiu ' + }, + 'review.create':{ + icon: 'star', + text: ' avaliou ' + }, + 'download.create': { + icon: 'get_app', + text: 'baixou' + }, + 'curator_assignment.create': { + icon: 'create', + text: 'você foi atribuido para avaliar o recurso' + }, + 'submission.accepted':{ + icon: 'cloud_upload', + text: 'o seu recurso', + text2: 'foi revisado e já está disponivel na Plataforma' + }, + 'submission.rejected':{ + icon: 'thumb_down', + text: 'o seu recurso', + text2: 'foi revisado e removido da Plataforma por não está de acordo com os termos' + } +}; diff --git a/src/Components/Activities/getRecipientHref.js b/src/Components/Activities/getRecipientHref.js new file mode 100644 index 0000000000000000000000000000000000000000..0239307756716ee989bd0be908bb425a94af1a26 --- /dev/null +++ b/src/Components/Activities/getRecipientHref.js @@ -0,0 +1,5 @@ +export function getRecipientHref (notification) { + if (notification.trackable_type === 'CuratorAssignment') { + return `/recurso/${notification.recipient.id}` + } +} diff --git a/src/Components/ActivityListItem.js b/src/Components/ActivityListItem.js new file mode 100644 index 0000000000000000000000000000000000000000..0d249401c851757d490eff07d316748ddad437c0 --- /dev/null +++ b/src/Components/ActivityListItem.js @@ -0,0 +1,221 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect } from 'react' +import styled from 'styled-components' +import ListItem from '@material-ui/core/ListItem'; +import ListItemAvatar from '@material-ui/core/ListItemAvatar'; +import ListItemText from '@material-ui/core/ListItemText'; +import Avatar from '@material-ui/core/Avatar'; +import noAvatar from "../img/default_profile.png"; +import { GetActivityProperties, Tag, ObjectColor } from './Activities/Definitions.js' +//icons +import FavoriteIcon from '@material-ui/icons/Favorite'; +import CreateIcon from '@material-ui/icons/Create'; +import GetAppIcon from '@material-ui/icons/GetApp'; +import StarIcon from '@material-ui/icons/Star'; +import SpeakerNotesIcon from '@material-ui/icons/SpeakerNotes'; +import ReportIcon from '@material-ui/icons/Report'; +import CloudUploadIcon from '@material-ui/icons/CloudUpload'; +import ThumbDownIcon from '@material-ui/icons/ThumbDown'; +import DeleteIcon from '@material-ui/icons/Delete'; +import { Link } from 'react-router-dom' + +const GetObjectColor = (tag) => { + return ObjectColor[tag] +} + +const getNotificationIcon = (iconType) => { + switch (iconType) { + case 'create': + return <CreateIcon className="icon" />; + case 'favorite': + return <FavoriteIcon className="icon" />; + case 'get_app': + return <GetAppIcon className="icon" />; + case 'star': + return <StarIcon className="icon" />; + case 'report': + return <ReportIcon className="icon" />; + case 'cloud_upload': + return <CloudUploadIcon className="icon" />; + case 'delete': + return <DeleteIcon className="icon" />; + case 'thumb_down': + return <ThumbDownIcon className="icon" />; + default: + return <SpeakerNotesIcon className="icon" />; + } +} + +const getTimeDifference = (timestamp) => { + //returns time difference between now and the moment the notification was created + var moment = require('moment') + + const now = moment() + const then = moment(timestamp, moment.ISO_8601) + + let duration = moment.duration(now.diff(then)) + // {/*console.log('duration: ', duration)*/} + let timeDiff; + if (duration._data.years > 0) { + timeDiff = duration._data.years + (duration._data.years > 1 ? ' anos' : ' ano') + } + else if (duration._data.months > 0) { + timeDiff = duration._data.months + (duration._data.months > 1 ? ' meses' : ' mês') + } + else if (duration._data.days > 0) { + timeDiff = duration._data.days + (duration._data.days > 1 ? ' dias' : ' dia') + } + else if (duration._data.hours > 0) { + timeDiff = duration._data.hours + (duration._data.hours > 1 ? ' horas' : ' hora') + } + else if (duration._data.minutes > 0) { + timeDiff = duration._data.minutes + (duration._data.minutes > 1 ? ' minutos' : ' minuto') + } + + return timeDiff; +} + +export default function ActivityListItem(props) { + const [activity, setActivity] = React.useState({ + tag: '', + icon: '', + text: '', + text2: '', + }) + + useEffect(() => { + const newTag = Tag[(props.actionType === 'CuratorAssignment' ? props.actionType : props.objectType)] + const { icon, text, text2 } = GetActivityProperties(props.activity) + // {/*console.log('icon, text, text2: ', icon, text, text2)*/} + + setActivity({ + ...activity, + tag: newTag, + icon: icon, + text: text, + text2: text2 + }) + }, []) + + return ( + <StyledListItem onMenuBar={props.onMenuBar}> + { + !props.onMenuBar && + <> + + <ListItemAvatar> + <Avatar alt='user avatar' src={props.avatar ? props.avatar : noAvatar} /> + </ListItemAvatar> + {getNotificationIcon(activity.icon)} + + </> + } + <ListItemText + primary={ + <div> + <span className={`tag-object ${GetObjectColor(activity.tag)}`}> + {activity.tag} + </span> + <span className="time-ago-span"> · há {getTimeDifference(props.createdAt)}</span> + </div> + } + secondary={ + <div> + + <span> + <Link to={{ + pathname: props.ownerHref, + state: '0', + }} className="owner-name-a" >{props.ownerName}</Link> {activity.text} <Link to={props.recipientHref} className="recipient-name-a">{props.recipientName}</Link> {activity.text2} + </span> + </div> + } + /> + </StyledListItem> + ) + +} + +const StyledListItem = styled(ListItem)` + padding : ${props => props.onMenuBar ? "8px 16px !important" : "20px 60px !important"}; + border-bottom : 1px solid #eee; + display : flex; + justify-content : flex-start; + align-items : center; + min-heigth : 40px; + + a { + text-decoration : none !important; + } + + .time-ago-span { + font-size : 12px; + font-family : 'Lato', medium; + color : #787380; + } + + .owner-name-a { + color : #00bcd4; + } + + .recipient-name-a { + cursor : pointer; + color : #337ab7; + } + + .icon { + padding-right : 10px; + color : #666; + } + + .tag-object { + font-family: Roboto; + font-style: normal; + font-weight: 700; + font-size: 12px; + line-height: normal; + text-align: center; + letter-spacing: .06em; + text-transform: uppercase; + color: #fff; + height: -webkit-fit-content; + height: -moz-fit-content; + height: fit-content; + width: -webkit-fit-content; + width: -moz-fit-content; + width: fit-content; + border-radius: 10px; + padding: 2px 4px; + } + + .recurso-color { + background-color : orange; + } + + .colecao-color { + background-color : blue; + } + + .curadoria-color { + background-color : red; + } + + +` diff --git a/src/Components/UserCard.js b/src/Components/Alert.js similarity index 82% rename from src/Components/UserCard.js rename to src/Components/Alert.js index c8cb4a80e14ae5f66c4f7f4a0466a424679d2da9..747b819931a0cf64cd14804dd23203bd3932be5c 100644 --- a/src/Components/UserCard.js +++ b/src/Components/Alert.js @@ -16,3 +16,9 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React from 'react' +import MuiAlert from '@material-ui/lab/Alert'; + +export default function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} diff --git a/src/Components/AreasSubPages.js b/src/Components/AreasSubPages.js index bbd12897bf3de1689c3f32f1ae4b7048e81defb6..b8d429a946ea7f27d93034d0baddef361cfc3582 100644 --- a/src/Components/AreasSubPages.js +++ b/src/Components/AreasSubPages.js @@ -16,229 +16,331 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; -import axios from 'axios'; -import {apiUrl} from '../env'; -import './carousel.css'; -import {Col,Row, Container, Hidden, Visible} from 'react-grid-system'; -import ResourceCard from './ResourceCard'; -import MaterialCard from './MaterialCard'; -import CollectionCard from './CollectionCard'; +import React, { Component } from "react"; +import "./carousel.css"; +import { Col, Row, Container, Hidden, Visible } from "react-grid-system"; +import MaterialCard from "./MaterialCard"; import "react-responsive-carousel/lib/styles/carousel.min.css"; -import { Carousel } from 'react-responsive-carousel'; +import { Carousel } from "react-responsive-carousel"; import recursos from "../img/ilustra_recursos_digitais.png"; import materiais from "../img/ilustra_materiais.png"; import colecoes from "../img/ilustra_colecoes.png"; -const areaStyle={ - paddingTop: "5px", - fontSize: "16px", - textAlign:"left", - backgroundColor: "inherit", - width: "700px", - padding: "20px", - minHeight: "150px" -} +import ResourceCardFunction from "./ResourceCardFunction.js"; +import CollectionCardFunction from "./CollectionCardFunction.js"; +import colecoes_obj from './FormationMaterialsResources/formationMaterials'; +import ExpandedMaterial from './ExpandedMaterials'; +import {getRequest} from './HelperFunctions/getAxiosConfig.js' + +const materials = colecoes_obj(); -class ReqResources extends Component{ - constructor(props){ +class ReqResources extends Component { + constructor(props) { super(props); this.state = { resources: [], }; } - componentDidMount(){ - axios.get(`${apiUrl}/learning_objects?limit=12&sort=["published_at", "desc"]`) - .then(res=> { - this.setState({resources: res.data}); - console.log(res.data); - }); + + componentDidMount() { + const url = `/learning_objects?limit=12&sort=["published_at", "desc"]` + getRequest(url, (data) => {this.setState({ resources: data })}, (error) => {console.log(error)}) } - render(){ - var row1 = this.state.resources.slice(0, 4); - var row2 = this.state.resources.slice(4, 8); - var row3 = this.state.resources.slice(8, 13); - return( + + resourcesPerPage() { + var pageWidth = window.innerWidth + if (pageWidth >= 1200) { + return 3 + } + else { + if (pageWidth > 766) { + return 2 + } + else { + return 1 + } + } + } + + render() { + var rows = [] + var resources_per_page = this.resourcesPerPage() + for (let i = 0; i < 12 / resources_per_page; i++) { + rows.push(this.state.resources.slice(i * resources_per_page, resources_per_page * (i + 1))) + } + return ( + <Carousel showThumbs={false} infiniteLoop={true} showStatus={false}> - <Row style={{paddingBottom: "5px"}}> - {row1.map(card => <Col md={3} sm={6} key={card.id}> - <ResourceCard name={card.name} - rating={card.score} - type={card.object_type} - description={card.description} - thumbnail={card.thumbnail} - author={card.author} - avatar={card.publisher.avatar} - /></Col>)} - </Row> - <Row> - {row2.map(card => <Col md={3} sm={6} key={card.id}> - <ResourceCard name={card.name} - rating={card.score} - type={card.object_type} - description={card.description} - thumbnail={card.thumbnail} - author={card.author} - avatar={card.publisher.avatar} - /></Col>)} - </Row> - <Row> - {row3.map(card => <Col md={3} sm={6} key={card.id}> - <ResourceCard name={card.name} - rating={card.score} - type={card.object_type} - description={card.description} - thumbnail={card.thumbnail} - author={card.author} - avatar={card.publisher.avatar} - /></Col>)} - </Row> - </Carousel> - ) + { + rows.map((row, index) => ( + <Row style={{ paddingBottom: "5px", margin: '0 auto', width: "80%", justifyContent: "center" }} key={(index + 1)}> + {row.map((card) => ( + <div style={{ marginLeft: 10, display: 'flex' }} key={card.id * (index + 1)}> + <ResourceCardFunction + avatar={card.publisher.avatar} + id={card.id} + thumbnail={card.thumbnail} + type={card.object_type ? card.object_type : "Outros"} + title={card.name} + published={card.state === "published" ? true : false} + likeCount={card.likes_count} + liked={card.liked} + rating={card.review_average} + author={card.publisher.name} + tags={card.tags} + href={"/recurso/" + card.id} + downloadableLink={card.default_attachment_location} + /> + </div> + ))} + </Row> + ))} + </Carousel> + ); } } -class ReqCollections extends Component{ - constructor(props){ +class ReqCollections extends Component { + constructor(props) { super(props); - this.state ={ + this.state = { collections: [], }; } - componentDidMount(){ - axios.get(`${apiUrl}/collections?limit=12&sort=["updated_at", "desc"]`) - .then(res=>{this.setState({collections: res.data}); - console.log(res.data); - }); + componentDidMount() { + const url = `/collections?limit=12&sort=["updated_at", "desc"]` + + getRequest(url, (data) => {this.setState({ collections: data })}, (error) => {console.log(error)}) } - render(){ - var row1 = this.state.collections.slice(0, 4); - var row2 = this.state.collections.slice(4, 8); - var row3 = this.state.collections.slice(8, 13); - return( + collectionsPerPage() { + var pageWidth = window.innerWidth + if (pageWidth >= 1200) { + return 3 + } + else { + if (pageWidth > 766) { + return 2 + } + else { + return 1 + } + } + } + + render() { + var rows = [] + var collections_per_page = this.collectionsPerPage() + for (let i = 0; i < 12 / collections_per_page; i++) { + rows.push(this.state.collections.slice(i * collections_per_page, collections_per_page * (i + 1))) + } + return ( <Carousel showThumbs={false} infiniteLoop={true} showStatus={false}> - <Row style={{paddingBottom: "5px"}}> - {row1.map(card => <Col md={3} sm={6} key={card.id}> - <CollectionCard name={card.name} - rating={card.score} - author={card.owner.name} - description={card.description} - thumbnail={card.items_thumbnails} - avatar={card.owner.avatar}/></Col>)} - </Row> - <Row> - {row2.map(card => <Col md={3} sm={6} key={card.id}> - <CollectionCard name={card.name} - rating={card.score} - author={card.owner.name} - description={card.description} - thumbnail={card.items_thumbnails} - avatar={card.owner.avatar}/></Col>)} - </Row> - <Row> - {row3.map(card => <Col md={3} sm={6} key={card.id}> - <CollectionCard name={card.name} - rating={card.score} - author={card.owner.name} - description={card.description} - thumbnail={card.items_thumbnails} - avatar={card.owner.avatar}/></Col>)} - </Row> - </Carousel> - ) + { + rows.map((row, index) => ( + <Row style={{ paddingBottom: "5px", margin: '0 auto', width: "80%", justifyContent: "center" }} key={(index + 1)}> + {row.map((card) => ( + <div style={{ marginLeft: 10, display: 'flex' }} key={card.id * (index + 1)}> + <CollectionCardFunction + name={card.name} + tags={card.tags} + rating={card.score} + id={card.id} + author={card.owner.name} + description={card.description} + thumbnails={card.items_thumbnails} + avatar={card.owner.avatar} + likeCount={card.likes_count} + followed={card.followed} + liked={card.liked} + collections={card.collection_items} + authorID={card.owner.id} + /> + </div> + ))} + </Row> + ))} + </Carousel> + ); } } -class SubPages extends Component{ - areaRender(){ - switch(this.props.banner){ - case "Recursos": - return( - <React.Fragment> - <div style={{backgroundColor: "#ff7f00"}}> - <Container style={areaStyle}> - <img src={recursos} alt="aba recursos" height="100" style={{float: "left"}}/> - <p>Nesta área, você tem acesso a Recursos Educacionais Digitais, isto é, - a vÃdeos, animações e a outros recursos destinados à educação. São Recursos - de portais parceiros do MEC e de professores que, como você, atuam na - Educação Básica!</p> - </Container> +class SubPages extends Component { + constructor(props) { + super(props); + this.state = { + currMaterial: { + open: false, + material: {} + }, + }; + } + + areaRender() { + switch (this.props.banner) { + case "Recursos": + return ( + <React.Fragment> + <div style={{ backgroundColor: "#ff7f00", position: "relative" }}> + <div style={{ textAlign: "justify", color: "#fff", minHeight: 195, paddingLeft: 10, paddingRight: 10, paddingTop: 20, paddingBottom: 20 }}> + <img + src={recursos} + alt="aba recursos" + height="155" + style={{ float: "left", marginRight: 20, marginBottom: 20, marginLeft: window.innerWidth >= 825 ? "25%" : "0px" }} + /> + <p style={{ textAlign: "justify", color: "#fff", marginRight: window.innerWidth >= 825 ? "25%" : "0px" }}> + Nesta área, você tem acesso a Recursos Educacionais + Digitais, isto é, a vÃdeos, animações e a outros recursos + destinados à educação. São Recursos de portais parceiros + do MEC e de professores que, como você, atuam na Educação + Básica! + </p> + </div> </div> - <Container style={{padding:"20px"}}> - <p style={{paddingBottom:"5px", borderBottom: "1px solid #ff7f00", color: "#ff7f00"}}> - Recursos mais recentes </p> + <Container style={{ padding: "20px" }}> + <p + style={{ + paddingBottom: "5px", + borderBottom: "1px solid #ff7f00", + color: "#ff7f00", + }} + > + Recursos mais recentes{" "} + </p> <Hidden sm xs> - <ReqResources/> + <ReqResources /> </Hidden> <Visible sm xs> - <ReqResources/> + <ReqResources /> </Visible> </Container> </React.Fragment> - ); - case "Materiais": - return ( - <React.Fragment> - <div style={{backgroundColor: "#e81f4f"}}> - <Container style={areaStyle}> - <img src={materiais} alt="aba materiais" height="100" style={{float: "left"}}/> - <p>Nesta área, você acessa livremente materiais completos de formação, - como cursos já oferecidos pelo MEC e seus parceiros. São conteúdos - elaborados por equipes multidisciplinares e de autoria de pesquisadores - e educadores renomados nas áreas.</p> - </Container> + ); + case "Materiais": + + const HandleExpandMaterial = (id) => { + if (id !== this.state.currMaterial.material.id) + this.setState({ + currMaterial: { + open: true, + material: { ...materials[id] } + } + }) + else + this.setState({ + currMaterial: { + open: false, + material: {} + } + }) + } + + + return ( + <React.Fragment> + <div style={{ backgroundColor: "#e81f4f", position: "relative" }}> + <div style={{ textAlign: "justify", color: "#fff", minHeight: 195, paddingLeft: 10, paddingRight: 10, paddingTop: 20, paddingBottom: 20 }}> + <img + src={materiais} + alt="aba recursos" + height="155" + style={{ float: "left", marginRight: 20, marginBottom: 20, marginLeft: window.innerWidth >= 825 ? "25%" : "0px" }} + /> + <p style={{ textAlign: "justify", color: "#fff", marginRight: window.innerWidth >= 825 ? "25%" : "0px" }}> + Nesta área, você acessa livremente materiais completos de + formação, como cursos já oferecidos pelo MEC e seus + parceiros. São conteúdos elaborados por equipes + multidisciplinares e de autoria de pesquisadores e + educadores renomados nas áreas. + </p> </div> - <Container style={{padding:"20px"}}> - <p style={{paddingBottom:"5px", borderBottom: "1px solid #e81f4f", color: "#e81f4f"}}> - Materiais mais recentes </p> - - <Carousel style={{padding: "20px"}}showThumbs={false} infiniteLoop={true} showStatus={false}> - <Row> - <Col md={3}> - <MaterialCard name="oioi" /> - </Col> - <Col md={3}> - <MaterialCard name="oioi" /> - </Col> - <Col md={3}> - <MaterialCard name="oioi" /> - </Col> - <Col md={3}> - <MaterialCard name="oioi" /> - </Col> - </Row> - </Carousel> - </Container> - </React.Fragment> - ); - case "Colecoes": - return ( - <React.Fragment> - <div style={{backgroundColor: "#673ab7"}}> - <Container style={areaStyle}> - <img src={colecoes} alt="aba coleções" height="100" style={{float: "left"}}/> - <p>Nesta área, você tem acesso à s coleções criadas e organizadas - pelos usuários da plataforma. É mais uma possibilidade de buscar - recursos educacionais para sua aula!</p> - </Container> </div> - <Container style={{padding:"20px"}}> - <p style={{paddingBottom:"5px", borderBottom: "1px solid #673ab7", color: "#673ab7"}}> - Coleções mais recentes </p> - <ReqCollections/> + <Container style={{ padding: "20px" }}> + <p + style={{ + paddingBottom: "5px", + borderBottom: "1px solid #e81f4f", + color: "#e81f4f", + }} + > + Materiais mais recentes{" "} + </p> + + <Carousel + style={{ padding: "20px" }} + showThumbs={false} + infiniteLoop={true} + showStatus={false} + > + <Row> + { + materials.map((material, index) => { + return ( + <Col md={3} key={index}> + <MaterialCard + name={material.name} + thumb={material.img} + score={material.score} + modules={material.topics} + handleExpand={HandleExpandMaterial} + id={index} + /> + </Col> + ) + }) + } + </Row> + </Carousel> + { + this.state.currMaterial.open ? + <ExpandedMaterial material={this.state.currMaterial.material} /> + : + null + } </Container> - </React.Fragment> - ); - default: - return null + </React.Fragment > + ); + case "Colecoes": + return ( + <React.Fragment> + <div style={{ backgroundColor: "#673ab7", position: "relative" }}> + <div style={{ textAlign: "justify", color: "#fff", minHeight: 195, paddingLeft: 10, paddingRight: 10, paddingTop: 20, paddingBottom: 20 }}> + <img + src={colecoes} + alt="aba recursos" + height="155" + style={{ float: "left", marginRight: 20, marginBottom: 20, marginLeft: window.innerWidth >= 825 ? "25%" : "0px" }} + /> + <p style={{ textAlign: "justify", color: "#fff", marginRight: window.innerWidth >= 825 ? "25%" : "0px" }}> + Nesta área, você tem acesso à s coleções criadas e + organizadas pelos usuários da plataforma. É mais uma + possibilidade de buscar recursos educacionais para sua + aula! + </p> + </div> + </div> + <Container style={{ padding: "20px" }}> + <p + style={{ + paddingBottom: "5px", + borderBottom: "1px solid #673ab7", + color: "#673ab7", + }} + > + Coleções mais recentes{" "} + </p> + <ReqCollections /> + </Container> + </React.Fragment> + ); + default: + return null; } } - render(){ - return( - <div> - {this.areaRender()} - </div> - ); -} + render() { + return <div>{this.areaRender()}</div>; + } } + + export default SubPages; diff --git a/src/Components/AreasSubPagesFunction.js b/src/Components/AreasSubPagesFunction.js new file mode 100644 index 0000000000000000000000000000000000000000..f08832691ff2fc7d21160c18b362a4d7cfd6344d --- /dev/null +++ b/src/Components/AreasSubPagesFunction.js @@ -0,0 +1,554 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +import "./carousel.css"; +import { Col, Row, Container, Hidden, Visible } from "react-grid-system"; +import styled from 'styled-components' +import MaterialCard from "./MaterialCard"; +import "react-responsive-carousel/lib/styles/carousel.min.css"; +import { Carousel } from "react-responsive-carousel"; +import recursos from "../img/ilustra_recursos_digitais.png"; +import materiais from "../img/ilustra_materiais.png"; +import colecoes from "../img/ilustra_colecoes.png"; +import ResourceCardFunction from "./ResourceCardFunction.js"; +import CollectionCardFunction from "./CollectionCardFunction.js"; +import colecoes_obj from './FormationMaterialsResources/formationMaterials'; +import ExpandedMaterial from './ExpandedMaterials'; +import Dropdown from "react-dropdown"; +import { getRequest } from './HelperFunctions/getAxiosConfig.js' +import Grid from '@material-ui/core/Grid'; +import { Link } from 'react-router-dom' +import { CircularProgress } from "@material-ui/core"; +import ColecaoVazia from '../img/Pagina_vazia_colecao.png' +import RecursoVazio from '../img/Pagina_vazia_Sem_publicar.png' + +function objectsPerPage() { + var pageWidth = window.innerWidth + if (pageWidth >= 1200) { + return 3 + } + else { + if (pageWidth > 766) { + return 2 + } + else { + return 1 + } + } +} + +function ReqResources(props) { + const [rows, setRows] = useState([]) + const [isLoading, setIsLoading] = useState(false) + + function onSuccessfulGet(data) { + var aux = [] + var resources_per_page = objectsPerPage() + for (let i = 0; i < 12 / resources_per_page; i++) { + aux.push(data.slice(i * resources_per_page, resources_per_page * (i + 1))) + } + setRows(aux) + setIsLoading(false) + } + + useEffect(() => { + setIsLoading(true) + const url = `/search?page=0&results_per_page=12&order=${props.order}&query=*&search_class=LearningObject` + + getRequest(url, (data) => onSuccessfulGet(data), (error) => { console.log(error) }) + }, [props.order]) + + return ( + isLoading ? + <Grid container justify="center" alignItems="center" style={{ margin: "2em" }} > + <Grid item> + <CircularProgress size={24} color="#ff7f00" /> + </Grid> + </Grid> + : + <Carousel showThumbs={false} infiniteLoop={true} showStatus={false}> + { + rows.length >= 1 ? + rows.map((row, index) => ( + <Row style={{ paddingBottom: "5px", margin: '0 auto', width: "80%", justifyContent: "center", minHeight: "50px" }} key={(index + 1)}> + {row.map((card) => ( + <div style={{ marginLeft: 10, display: 'flex' }} key={card.id * (index + 1)}> + <ResourceCardFunction + avatar={card.publisher.avatar} + id={card.id} + thumbnail={card.thumbnail} + type={card.object_type ? card.object_type : "Outros"} + title={card.name} + published={card.state === "published" ? true : false} + likeCount={card.likes_count} + liked={card.liked} + rating={card.review_average} + author={card.publisher.name} + tags={card.tags} + href={"/recurso/" + card.id} + downloadableLink={card.default_attachment_location} + /> + </div> + ))} + </Row> + )) + : + <Grid container justify="center" alignItems="center"> + <Grid item> + <img src={RecursoVazio} alt="Não há recursos" /> + </Grid> + </Grid> + } + </Carousel> + + ) +} + +function ReqCollections(props) { + const [rows, setRows] = useState([]) + const [isLoading, setIsLoading] = useState(false) + + function onSuccessfulGet(data) { + var aux = [] + var collections_per_page = objectsPerPage() + for (let i = 0; i < 12 / collections_per_page; i++) { + aux.push(data.slice(i * collections_per_page, collections_per_page * (i + 1))) + } + setIsLoading(false) + setRows(aux) + } + + useEffect(() => { + setIsLoading(true) + const url = `/search?page=0&results_per_page=12&order=${props.order}&query=*&search_class=Collection` + + getRequest(url, (data) => onSuccessfulGet(data), (error) => { console.log(error) }) + }, [props.order]) + + return ( + isLoading ? + <Grid container justify="center" alignItems="center" style={{ marginTop: "2em" }}> + <Grid item> + <CircularProgress size={24} color="#673ab7" /> + </Grid> + </Grid> + : + rows.length >= 1 ? + <Carousel showThumbs={false} infiniteLoop={true} showStatus={false}> + { + rows.map((row, index) => ( + <Row style={{ paddingBottom: "5px", margin: '0 auto', width: "80%", justifyContent: "center", minHeight: "50px" }} key={(index + 1)}> + {row.map((card) => ( + <div style={{ marginLeft: 10, display: 'flex' }} key={card.id * (index + 1)}> + <CollectionCardFunction + name={card.name} + tags={card.tags} + rating={card.score} + id={card.id} + author={card.owner ? card.owner.name : ""} + description={card.description} + thumbnails={card.items_thumbnails} + avatar={card.owner ? card.owner.avatar : ""} + likeCount={card.likes_count} + followed={card.followed} + liked={card.liked} + collections={card.collection_items} + authorID={card.owner ? card.owner.id : ""} + /> + </div> + ))} + </Row> + ))} + </Carousel> + : + <Grid container justify="center" alignItems="center"> + <Grid item> + <img src={ColecaoVazia} alt="Não há coleções" /> + </Grid> + </Grid> + ) +} + +function TabRecurso() { + const text = "Nesta área, você tem acesso a Recursos Educacionais Digitais, isto é, a vÃdeos, animações e a outros recursos destinados à educação. São Recursos de portais parceiros do MEC e de professores que, como você, atuam na Educação Básica!" + const [currOrder, setCurrOrder] = useState("Mais Relevante"); + const [currValue, setCurrValue] = useState("score"); + const [ordenar] = useState([ + { label: "Mais Estrelas", value: "review_average" }, + { label: "Mais Relevante", value: "score" }, + { label: "Mais Baixados", value: "downloads" }, + { label: "Mais Favoritados", value: "likes" }, + { label: "Mais Recentes", value: "publicationdesc" }, + { label: "Ordem Alfabética", value: "title" }, + ]); + + return ( + <React.Fragment> + <div style={{ backgroundColor: "#ff7f00", position: "relative" }}> + <StyledTab container> + <Grid item md={3} xs={12}> + <img + src={recursos} + alt="aba recursos" + style={{ float: "left", marginRight: 20, marginBottom: 20, marginLeft: window.innerWidth >= 825 ? "25%" : "0px" }} + /> + </Grid> + { + window.innerWidth <= 501 && + <h4> + Recursos Educacionais Digitais + </h4> + } + <Grid item md={6} xs={12}> + <p> + {text} + </p> + </Grid> + { + window.innerWidth <= 501 && + <div style={{ display: "flex", justifyContent: "center" }}> + <Link to={`/busca?query=*&search_class=LearningObject`} className="button-ver">VER RECURSOS</Link> + </div> + } + </StyledTab> + </div> + { + window.innerWidth > 501 && + <Container style={{ padding: "20px" }}> + <Grid + container + direction="row" + justify="space-between" + alignItems="center" + style={{ + paddingBottom: "5px", + borderBottom: "1px solid #ff7f00", + color: "#ff7f00", + }} + > + <Grid item> + <p + style={{ margin: 0, padding: 0 }} + > + { + `Recursos ${currOrder}` + } + </p> + </Grid> + + <Grid item> + <Grid container direction="row" alignItems="center" spacing={1}> + <Grid item> + <p style={{ margin: 0, padding: 0 }}> + Ordenar por: + </p> + </Grid> + <Grid item> + <Dropdown options={ordenar} value={currOrder} onChange={(e) => { + setCurrOrder(e.label) + setCurrValue(e.value) + }} + placeholder="Selecione uma opção" + /> + </Grid> + </Grid> + </Grid> + </Grid> + <Hidden sm xs> + <ReqResources order={currValue} /> + </Hidden> + <Visible sm xs> + <ReqResources order={currValue} /> + </Visible> + </Container> + } + </React.Fragment> + ) +} + +function TabColecoes() { + const text = "Nesta área, você tem acesso à s coleções criadas e organizadas pelos usuários da plataforma. É mais uma possibilidade de buscar recursos educacionais para sua aula!" + const [currOrder, setCurrOrder] = useState("Mais Relevante"); + const [currValue, setCurrValue] = useState("score"); + const [ordenar] = useState([ + { label: "Mais Estrelas", value: "review_average" }, + { label: "Mais Relevante", value: "score" }, + { label: "Mais Baixados", value: "downloads" }, + { label: "Mais Favoritados", value: "likes" }, + { label: "Mais Recentes", value: "publicationdesc" }, + { label: "Ordem Alfabética", value: "title" }, + ]); + + return ( + <React.Fragment> + <div style={{ backgroundColor: "#673ab7", position: "relative" }}> + <StyledTab container> + <Grid item md={3} xs={12}> + <img + src={colecoes} + alt="aba recursos" + style={{ float: "left", marginRight: 20, marginBottom: 20, marginLeft: window.innerWidth >= 825 ? "25%" : "0px" }} + /> + </Grid> + { + window.innerWidth <= 501 && + <h4> + Coleções dos Usuários + </h4> + } + <Grid item md={6} xs={12}> + <p> + {text} + </p> + </Grid> + { + window.innerWidth <= 501 && + <div style={{ display: "flex", justifyContent: "center" }}> + <Link to={`/busca?query=*&search_class=Collection`} className="button-ver">VER COLEÇÕES</Link> + </div> + } + </StyledTab> + </div> + { + window.innerWidth > 501 && + <Container style={{ padding: "20px" }}> + <Grid + container + direction="row" + justify="space-between" + alignItems="center" + style={{ + paddingBottom: "5px", + borderBottom: "1px solid #673ab7", + color: "#673ab7", + }} + > + <Grid item> + <p + style={{ margin: 0, padding: 0 }} + > + { + `Coleções ${currOrder}` + } + </p> + </Grid> + + <Grid item> + <Grid container direction="row" alignItems="center" spacing={1}> + <Grid item> + <p style={{ margin: 0, padding: 0 }}> + Ordenar por: + </p> + </Grid> + <Grid item> + <Dropdown options={ordenar} value={currOrder} onChange={(e) => { + setCurrOrder(e.label) + setCurrValue(e.value) + }} + placeholder="Selecione uma opção" + /> + </Grid> + </Grid> + </Grid> + </Grid> + <ReqCollections order={currValue} /> + </Container> + } + </React.Fragment> + ) +} + +function TabMateriais() { + const text = "Nesta área, você acessa livremente materiais completos de formação, como cursos já oferecidos pelo MEC e seus parceiros. São conteúdos elaborados por equipes multidisciplinares e de autoria de pesquisadores e educadores renomados nas áreas." + + const materials = colecoes_obj() + + const [currMaterial, setCurrMaterial] = useState({ + open: false, + material: {} + }) + + const handleExpandMaterial = (id) => { + if (id !== currMaterial.material.id) + setCurrMaterial({ + open: true, + material: { ...materials[id] } + }) + else { + setCurrMaterial({ + open: false, + material: {} + }) + } + } + + return ( + <React.Fragment> + <div style={{ backgroundColor: "#e81f4f", position: "relative" }}> + <StyledTab container> + <Grid item md={3} xs={12}> + <img + src={materiais} + alt="aba recursos" + style={{ float: "left", marginRight: 20, marginBottom: 20, marginLeft: window.innerWidth >= 825 ? "25%" : "0px" }} + /> + </Grid> + { + window.innerWidth <= 501 && + <h4> + Materiais de formação + </h4> + } + <Grid item md={6} xs={12}> + <p> + {text} + </p> + </Grid> + { + window.innerWidth <= 501 && + <div style={{ display: "flex", justifyContent: "center" }}> + <Link to={`/material-formacao`} className="button-ver">VER MATERIAIS</Link> + </div> + } + </StyledTab> + </div> + { + window.innerWidth > 501 && + <Container style={{ padding: "20px" }}> + <p + style={{ + paddingBottom: "5px", + borderBottom: "1px solid #e81f4f", + color: "#e81f4f", + }} + > + Materiais mais recentes{" "} + </p> + <Carousel + style={{ padding: "20px" }} + showThumbs={false} + infiniteLoop={true} + showStatus={false} + > + <Row> + { + materials.map((material, index) => { + return ( + <Col md={3} key={index}> + <MaterialCard + name={material.name} + thumb={material.img} + score={material.score} + modules={material.topics} + handleExpand={handleExpandMaterial} + id={index} + /> + </Col> + ) + }) + } + </Row> + </Carousel> + { + currMaterial.open ? + <ExpandedMaterial material={currMaterial.material} /> + : + null + } + </Container> + } + </React.Fragment > + ) +} + +export default function AreasSubPages(props) { + + const areaRender = () => { + switch (props.banner) { + case "Recursos": + return <TabRecurso /> + case "Materiais": + return <TabMateriais /> + case "Colecoes": + return <TabColecoes /> + default: + return null + } + } + + return ( + <React.Fragment> + { + window.innerWidth <= 501 ? ( + <React.Fragment> + <TabRecurso /> + <TabMateriais /> + <TabColecoes /> + </React.Fragment> + ) : ( + areaRender() + ) + } + </React.Fragment> + ) +} + +const StyledTab = styled(Grid)` + display : flex; + justify-content : center; + @media screen and (min-width : 502px) { + text-align : justify; + } + @media screen and (max-width : 502px) { + text-align : center; + } + color : #fff; + min-height : 190px; + padding : 20px 10px 20px 10px; + + img { + float : left; + max-height : 155px; + } + + .MuiGrid-grid-xs-12 { + display : flex; + justify-content : center; + } + + h4 { + font-size : 18px; + margin : 10px !important; + } + + p { + line-height : 1.42857143; + } + + .button-ver { + font-size: 14px; + padding: 5px 10px; + border: solid 2px #fff; + border-radius: 7px; + color: #fff; + cursor: pointer; + text-decoration: none; + } + +` diff --git a/src/Components/Button.js b/src/Components/Button.js deleted file mode 100644 index afe4acadacfa68b9e44d0c98b042352108c9305d..0000000000000000000000000000000000000000 --- a/src/Components/Button.js +++ /dev/null @@ -1,75 +0,0 @@ -/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre -Departamento de Informatica - Universidade Federal do Parana - -This file is part of Plataforma Integrada MEC. - -Plataforma Integrada MEC is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Plataforma Integrada MEC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ - -import React, {Component} from 'react'; - -class Bt extends Component{ - constructor(props){ - super(props); - - this.state ={ - color: "white", - hover: "#F0F0F0", - iddle: "white" - }; - } - componentWillMount(){ - if (this.props.backhover){ - this.setState({hover: this.props.backhover}) - } - if (this.props.iddle){ - this.setState({color:this.props.background, - iddle: this.props.background}) - } - } - onHover(){ - this.setState({color: this.state.hover}) - } - onIddle(){ - this.setState({color: this.state.iddle}) - } - onClick(){ - if(this.props.link === undefined){ - } - if(this.props.method !== undefined ){ - console.log(this.props.parameter) - this.props.method(this.props.parameter) - } - else { - alert(`goto ${this.props.link}`) - } - } - - render(){ - const acessibilityBt = { - borderStyle: 'none', - padding: '10px', - textAlign: 'center', - display: 'inline-block', - backgroundColor: this.state.color, - color: "#ababab" - }; - return( - <span id={this.props.name +"-Button"} style={acessibilityBt} onMouseEnter={this.onHover.bind(this)} onMouseOut={this.onIddle.bind(this)} onClick={this.onClick.bind(this)}> - {this.props.name} - </span> - ); - } -} - -export default Bt; diff --git a/src/Components/ButtonAvaliarRecurso.js b/src/Components/ButtonAvaliarRecurso.js new file mode 100644 index 0000000000000000000000000000000000000000..8b307048182a36bd0cafa1063a86b45ad64105b8 --- /dev/null +++ b/src/Components/ButtonAvaliarRecurso.js @@ -0,0 +1,26 @@ +import React from 'react' +import { Button } from '@material-ui/core'; +import styled from 'styled-components' +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; + +export default function ButtonAvaliarRecurso (props) { + + return ( + <StyledButton onClick={props.callback}> + <ExpandMoreIcon/> AVALIAR RECURSO + </StyledButton> + ) +} + +const StyledButton = styled(Button)` + &:hover { + background-color : #ed6f00 !important; + } + background-color : #ff7f00 !important; + color : #fff !important; + font-weight : 600 !important; + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + .MuiSvgIcon-root { + vertical-align : middle !important; + } +` diff --git a/src/Components/ButtonGuardarColecao.js b/src/Components/ButtonGuardarColecao.js new file mode 100644 index 0000000000000000000000000000000000000000..564c07183b23510edf5ba1170651a63fff879122 --- /dev/null +++ b/src/Components/ButtonGuardarColecao.js @@ -0,0 +1,83 @@ +import React, { useState, useContext } from 'react' +import { Store } from '../Store.js' +import Button from '@material-ui/core/Button'; +import styled from 'styled-components' +import CreateNewFolderIcon from '@material-ui/icons/CreateNewFolder'; +import GuardarModal from './GuardarModal' +import SignUpModal from './SignUpModal' +import LoginModal from './LoginModal.js' +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; + +export default function ButtonGuardarColecao(props) { + const { state } = useContext(Store) + const [saveToCol, toggleSave] = useState(false) + const handleGuardar = () => { + if (!state.currentUser.id) { + handleLogin() + } + else { + toggleSave(true); + } + } + + const handleSignUp = () => { + setSignUp(!signUpOpen) + } + + const handleLogin = () => { + setLogin(!loginOpen) + } + + function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; + } + + function toggleLoginSnackbar(reason) { + if (reason === 'clickaway') { + return; + } + handleSuccessfulLogin(false); + } + + const [signUpOpen, setSignUp] = useState(false) + const [loginOpen, setLogin] = useState(false) + const [successfulLoginOpen, handleSuccessfulLogin] = useState(false) + + return ( + <> + <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} + /> + <LoginModal open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp} + openSnackbar={() => { handleSuccessfulLogin(true) }} + /> + <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleLoginSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + > + <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert> + </Snackbar> + <GuardarModal open={saveToCol} handleClose={() => { toggleSave(false) }} + thumb={props.thumb} title={props.title} recursoId={props.learningObjectId} + /> + <StyledButton onClick={handleGuardar}> + <CreateNewFolderIcon /> GUARDAR + </StyledButton> + </> + ) +} + +const StyledButton = styled(Button)` + color : #666 !important; + background-color : transparent !important; + font-size : 14px important; + font-weight : 500 !important; + + .MuiSvgIcon-root { + font-size : 24px; + color : inherit; + } + + &:hover { + color: rgb(107, 35, 142) !important; + } +` diff --git a/src/Components/Card.js b/src/Components/Card.js deleted file mode 100644 index e721b5504a51eb1a24130c0028bba39da9ee6555..0000000000000000000000000000000000000000 --- a/src/Components/Card.js +++ /dev/null @@ -1,105 +0,0 @@ -/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre -Departamento de Informatica - Universidade Federal do Parana - -This file is part of Plataforma Integrada MEC. - -Plataforma Integrada MEC is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Plataforma Integrada MEC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ - -import React, {Component} from 'react'; -import {Container} from 'react-grid-system'; -import Card from '@material-ui/core/Card'; -import CardContent from '@material-ui/core/CardContent'; -import CardActions from '@material-ui/core/CardActions'; -import IconButton from '@material-ui/core/IconButton'; -import Typography from '@material-ui/core/Typography'; -import FavoriteIcon from '@material-ui/icons/Favorite'; -import StarRatings from 'react-star-ratings'; -import animacao from "../img/laranja/ANIMACAO_SIMULACAO.jpg"; -import apresentacao from "../img/laranja/APRESENTACAO.jpg"; -import aplicativo from "../img/laranja/APP.jpg"; -import audio from "../img/laranja/AUDIO.jpg"; -import vazio from "../img/laranja/EMPTY.jpg"; -import imagem from "../img/laranja/IMAGEM.jpg"; -import grafico from "../img/laranja/INFOGRAFICO.jpg"; -import jogo from "../img/laranja/JOGO.jpg"; -import livro from "../img/laranja/LIVRO_DIGITAL.jpg"; -import mapa from "../img/laranja/MAPA.jpg"; -import outros from "../img/laranja/OUTROS.jpg"; -import software from "../img/laranja/SOFTWARE.jpg"; -import texto from "../img/laranja/TEXTO.jpg"; -import video from "../img/laranja/VIDEO.jpg"; - -import AddIcon from '@material-ui/icons/CreateNewFolder'; -import Options from './CardOptions' -import Video from '@material-ui/icons/OndemandVideo'; - -var types = [{label: "Animação", thumb: animacao}, {label: "Apresentação", thumb: apresentacao}, -{label: "Aplicativo" , thumb: aplicativo}, {label: "Ãudio", thumb: audio}, {label: "Vazio", thumb: vazio}, {label: "Imagem", thumb: imagem}, {label: "Gráfico", thumb: grafico}, {label: "Jogo", thumb: jogo}, {label: "Livro", thumb: livro}, {label: "Mapa", thumb: mapa}, {label: "Outros", thumb: outros}, {label: "Software", thumb:software}, {label: "Texto", thumb:texto}, {label: "VÃdeo", thumb:video}] -class ResourceCard extends Component{ - constructor(props){ - super(props); - this.state = { - hover: false, - thumbnail: null, - isVideo: false, - }; - }; - decide(){ - var aux = this.props.thumbnail; - if (!aux) { - aux = types.find(function(element){ return element.label === (this.props.type)}); - } - this.setState({thumbnail: aux.thumb}); - console.log(this.state.thumbnail); - (this.props.type === "VÃdeo")? this.setState({isvideo:true}) : this.setState({isvideo:false}); -}; - render(){ - {this.decide()} - return ( - <Card> - <img src={this.state.thumbnail} alt="thumbnail do recurso"/> - <CardContent style={{height: "60%", textAlign: "left", paddingBottom: "0px"}}> - <Typography variant="body2" color="textSecondary" component="p" style={{height:"45px", overflow: "hidden", fontSize: "0.8em"}}> - {this.props.name} - </Typography> - </CardContent> - <Container style={{textAlign: "left"}}> - <StarRatings - rating={this.props.rating*100} - starRatedColor="ff7f00" - starDimension="20px" - starSpacing="2px" - starHoverColor="red" - /> - </Container> - <CardActions style={{justifyContent: "space-between"}}> - { this.state.isVideo - ? <Video style={{color:"#ff7f00"}} /> - : <br/>} - <IconButton aria-label="Favoritar" size="small"> - <FavoriteIcon /> - </IconButton> - </CardActions> - <CardActions style={{borderTop:"1px solid #e5e5e5", justifyContent: "space-between"}}> - - <IconButton aria-label="Guardar" size="small"> - <AddIcon /> - </IconButton> - <Options/> - </CardActions> - </Card> - );} -} - -export default ResourceCard; diff --git a/src/Components/CardOptions.js b/src/Components/CardOptions.js index ac458a6a467c84d600c892e1e4c8f795f2038ed3..4c10b4239ef6950f63020e83d6f3631c81fb3e96 100644 --- a/src/Components/CardOptions.js +++ b/src/Components/CardOptions.js @@ -27,6 +27,7 @@ import DownloadIcon from '@material-ui/icons/CloudDownload'; import ShareIcon from '@material-ui/icons/Share'; import AddIcon from '@material-ui/icons/CreateNewFolder'; import ReportIcon from '@material-ui/icons/Error'; + export default function SimpleMenu() { const [anchorEl, setAnchorEl] = React.useState(null); @@ -40,8 +41,8 @@ export default function SimpleMenu() { return ( <div style={{fontSize: "12px"}}> - <Button aria-controls="simple-menu" aria-haspopup="true" onClick={handleClick}> - OPÇÕES <MoreVertIcon/> + <Button aria-controls="simple-menu" aria-haspopup="true" onClick={handleClick} style={{color : "#666"}}> + OPÇÕES <MoreVertIcon style={{color : "inherit"}}/> </Button> <Menu id="simple-menu" @@ -51,30 +52,25 @@ export default function SimpleMenu() { onClose={handleClose} > <MenuItem onClick={handleClose}> - <ListItemIcon> - <OpenIcon /> - </ListItemIcon> - Abrir</MenuItem> + <ListItemIcon><OpenIcon /></ListItemIcon>Abrir + </MenuItem> + <MenuItem onClick={handleClose}> - <ListItemIcon> - <DownloadIcon /> - </ListItemIcon> - Baixar</MenuItem> + <ListItemIcon><DownloadIcon /></ListItemIcon>Baixar + </MenuItem> + <MenuItem onClick={handleClose}> - <ListItemIcon> - <ShareIcon /> - </ListItemIcon> - Compartilhar</MenuItem> + <ListItemIcon><ShareIcon /></ListItemIcon>Compartilhar + </MenuItem> + <MenuItem onClick={handleClose}> - <ListItemIcon> - <AddIcon /> - </ListItemIcon> - Guardar</MenuItem> + <ListItemIcon><AddIcon /></ListItemIcon>Guardar + </MenuItem> + <MenuItem onClick={handleClose}> - <ListItemIcon> - <ReportIcon /> - </ListItemIcon> - Reportar</MenuItem> + <ListItemIcon><ReportIcon /></ListItemIcon>Reportar + </MenuItem> + </Menu> </div> ); diff --git a/src/Components/Carousel.js b/src/Components/Carousel.js index 27c394f4ce6a8deb60f90fdc37cd594560659c7a..ba3602311c2fa2b3607a89c7e196d01c828ffe4b 100644 --- a/src/Components/Carousel.js +++ b/src/Components/Carousel.js @@ -18,13 +18,10 @@ along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/> import React, { Component } from 'react'; -import ReactDOM from 'react-dom'; import "react-responsive-carousel/lib/styles/carousel.min.css"; import { Carousel } from 'react-responsive-carousel'; import styled from 'styled-components'; import Grid from '@material-ui/core/Grid'; -import ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos'; -import ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos'; @@ -426,7 +423,13 @@ const CarouselStyled = styled(Carousel)` display: inline-block; border-top: 8px solid transparent; border-bottom: 8px solid transparent; - content: ''; + content: ' '; + } + .carousel .control-arrow { + background: transparent !important; + } + .m4d-icons { + size: 50px } @@ -518,7 +521,7 @@ class TermsCarousel extends Component { <p>Como repositório, a Plataforma hospeda somente Recursos Educacionais Abertos (REA). Todo conteúdo inserido por usuários deve ser aberto.</p> </div> <div className="content"> - <img className="twoArrow" src={Arrow_double}/> + <img alt="" className="twoArrow" src={Arrow_double}/> <p>Como referatório, a Plataforma aponta links para parceiros, e<br/> esses recursos podem ser abertos ou fechados.</p> </div> </Grid> @@ -648,7 +651,7 @@ class TermsCarousel extends Component { </Grid> </Grid> <div class="rodape col-md-12"> - <p>Dúvidas? Leia a Ãntegra dos <span ng-click="hide()">Termos de Uso</span> ou fale conosco por meio do <span ui-sref="contato">formulário de contato</span>.</p> + <p>Dúvidas? Leia a Ãntegra dos <span ng-click="hide()">Termos de Uso</span> ou fale conosco por meio do <a style={{color: "#fff"}} href="contato">formulário de contato</a>.</p> </div> </div> </div> diff --git a/src/Components/Checkbox.js b/src/Components/Checkbox.js index 9e497b4cc68267ba337fb8d3c89b72fbcf22ecf5..3e0be625c424542d75bd13680417450a409f410d 100644 --- a/src/Components/Checkbox.js +++ b/src/Components/Checkbox.js @@ -25,10 +25,9 @@ const StyledFormControlLabel = styled(FormControlLabel)` .label { font-size : 12px !important; } -` - -const StyledCheckbox = styled(Checkbox)` - color : #00bcd4 !important; + .MuiCheckbox-colorSecondary.Mui-checked { + color : #00bcd4 !important; + } ` export default function LabeledCheckbox(props) { @@ -36,8 +35,7 @@ export default function LabeledCheckbox(props) { return ( <StyledFormControlLabel control={ - <StyledCheckbox - disabled = {props.disabledCheckbox} + <Checkbox value = {props.checked} onChange = {props.handleChange} /> diff --git a/src/Components/CloseModalButton.js b/src/Components/CloseModalButton.js new file mode 100644 index 0000000000000000000000000000000000000000..00e8b3c34553c1ced9ba1b6e397fd5f404ef571d --- /dev/null +++ b/src/Components/CloseModalButton.js @@ -0,0 +1,22 @@ +import React from 'react'; +import { Button } from '@material-ui/core'; +import styled from 'styled-components' +import CloseIcon from '@material-ui/icons/Close'; + +export default function CloseModalButton (props) { + return ( + <StyledCloseModalButton onClick={props.handleClose}> + <CloseIcon/> + </StyledCloseModalButton> + ) +} + +const StyledCloseModalButton = styled(Button)` + display : inline-block; + position : relative; + float : right !important; + margin-right : 4px !important; + background : transparent !important; + min-width: 0 !important; + width : 40px; +` diff --git a/src/Components/ColCardOwnerOptions.js b/src/Components/ColCardOwnerOptions.js new file mode 100644 index 0000000000000000000000000000000000000000..a075780622f76c453592afb7d07b84de6ccd3df3 --- /dev/null +++ b/src/Components/ColCardOwnerOptions.js @@ -0,0 +1,101 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react'; +import Button from '@material-ui/core/Button'; +import Menu from '@material-ui/core/Menu'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import MenuItem from '@material-ui/core/MenuItem'; +import OpenIcon from '@material-ui/icons/OpenInNew'; +import CreateIcon from '@material-ui/icons/Create'; +import DeleteForeverIcon from '@material-ui/icons/DeleteForever'; +import {Link} from 'react-router-dom' +import MoreVertIcon from '@material-ui/icons/MoreVert'; +import styled from 'styled-components' +import ModalExcluirColecao from './ModalExcluirColecao.js' +import ModalEditarColecao from './ModalEditarColecao.js' + +export default function ColCardOwnerOptions (props) { + const [anchorEl, setAnchorEl] = React.useState(null); + + function handleClick(event) { + setAnchorEl(event.currentTarget); + } + + function handleClose() { + setAnchorEl(null); + } + + const [modalExcluirOpen, toggleModalExcluir] = useState(false) + + const [modalEditarOpen, toggleModalEditar] = useState(false) + + + return ( + <> + <ModalExcluirColecao id={props.id} + open={modalExcluirOpen} handleClose={() => {toggleModalExcluir(false)}} removeColl={props.removeColl} + /> + <ModalEditarColecao id={props.id} + open={modalEditarOpen} handleClose={() => {toggleModalEditar(false)}} + changeColName={props.changeColName} changeColPrivacy={props.changeColPrivacy} + /> + + <div style={{fontSize: "12px"}}> + <Button aria-controls="simple-menu" aria-haspopup="true" onClick={handleClick} style={{color : "#666"}}> + OPÇÕES <MoreVertIcon style={{color : "inherit"}}/> + </Button> + <Menu + id="simple-menu" + anchorEl={anchorEl} + keepMounted + open={Boolean(anchorEl)} + onClose={handleClose} + > + <StyledMenuItem> + <Link to={"/colecao-do-usuario/" + props.id}> + <ListItemIcon><OpenIcon /></ListItemIcon>Abrir + </Link> + </StyledMenuItem> + + <StyledMenuItem onClick={() => {toggleModalEditar(true)}}> + <ListItemIcon><CreateIcon /></ListItemIcon>Editar + </StyledMenuItem> + + <StyledMenuItem onClick={() => {toggleModalExcluir(true)}} > + <ListItemIcon><DeleteForeverIcon /></ListItemIcon>Excluir + </StyledMenuItem> + + + </Menu> + </div> + </> + ) +} + +export const StyledMenuItem = styled(MenuItem)` + color : #666 !important; + + .MuiSvgIcon-root { + vertical-align : middle !important; + } + a { + text-decoration : none !important; + color : #666 !important; + } +` diff --git a/src/Components/ColCardPublicOptions.js b/src/Components/ColCardPublicOptions.js new file mode 100644 index 0000000000000000000000000000000000000000..6e374d7a159e18c51bc06a44038c0aa859c796d6 --- /dev/null +++ b/src/Components/ColCardPublicOptions.js @@ -0,0 +1,136 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState } from 'react'; +import Button from '@material-ui/core/Button'; +import Menu from '@material-ui/core/Menu'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import MenuItem from '@material-ui/core/MenuItem'; +import OpenIcon from '@material-ui/icons/OpenInNew'; +import { Link } from 'react-router-dom' +import MoreVertIcon from '@material-ui/icons/MoreVert'; +import styled from 'styled-components' +import ErrorIcon from '@material-ui/icons/Error'; +import ReportModal from './ReportModal.js' +import ReportProblemIcon from '@material-ui/icons/ReportProblem'; +import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser'; +import { deleteRequest } from '../Components/HelperFunctions/getAxiosConfig' + +export default function ColCardPublicOptions(props) { + const [anchorEl, setAnchorEl] = React.useState(null); + + function handleClick(event) { + setAnchorEl(event.currentTarget); + } + + function handleClose() { + setAnchorEl(null); + } + + const [reportModalOpen, toggleReportModal] = useState(false) + const handleReportModal = (value) => { toggleReportModal(value) } + + const handleUnfollow = () => { + if (props.currentUserId) + deleteRequest(`/collections/${props.id}/follow`, (data) => { console.log(data) }, (error) => { console.log(error) }) + else + props.handleLogin() + } + + return ( + <> + <ReportModal + open={reportModalOpen} + handleClose={() => handleReportModal(false)} + form="colecao" + complainableId={props.id} + complainableType={"Collection"} + /> + <div style={{ fontSize: "12px" }}> + <Button + aria-controls="simple-menu" + aria-haspopup="true" + onClick={handleClick} + style={{ color: "#666" }} + > + <MoreVertIcon style={{ color: "inherit" }} /> + </Button> + <Menu + id="simple-menu" + anchorEl={anchorEl} + keepMounted + open={Boolean(anchorEl)} + onClose={handleClose} + > + <StyledMenuItem> + <Link to={"/colecao-do-usuario/" + props.id}> + <ListItemIcon> + <OpenIcon /> + </ListItemIcon> + Abrir + </Link> + </StyledMenuItem> + + <StyledMenuItem + onClick={() => + window.open("/colecao-do-usuario/" + props.id, "_blank") + } + > + <ListItemIcon> + <OpenInBrowserIcon /> + </ListItemIcon> + Abrir em nova guia + </StyledMenuItem> + + <StyledMenuItem onClick={handleUnfollow}> + <ListItemIcon> + <ErrorIcon /> + </ListItemIcon> + Deixar de Seguir + </StyledMenuItem> + + <StyledMenuItem + onClick={() => { + if (props.currentUserId) + handleReportModal(true); + else + props.handleLogin() + }} + > + <ListItemIcon> + <ReportProblemIcon /> + </ListItemIcon> + Reportar + </StyledMenuItem> + </Menu> + </div> + </> + ); +} + +export const StyledMenuItem = styled(MenuItem)` + color: #666 !important; + + .MuiSvgIcon-root { + vertical-align: middle !important; + } + a { + text-decoration: none !important; + color: #666 !important; + } +`; diff --git a/src/Components/ColaborarModal.js b/src/Components/ColaborarModal.js index 29d6dc499501ed400765614c4c1d7d310b5f761c..f12fa1100e9976ec96e3155a4a0b5be45e485058 100644 --- a/src/Components/ColaborarModal.js +++ b/src/Components/ColaborarModal.js @@ -1,15 +1,15 @@ -import React, {useContext} from 'react'; +import React, {useState} from 'react'; import Modal from '@material-ui/core/Modal'; import Fade from '@material-ui/core/Fade'; import styled from 'styled-components' import { Button } from '@material-ui/core'; import Backdrop from '@material-ui/core/Backdrop'; -import { Store } from '../Store.js'; import CloseIcon from '@material-ui/icons/Close'; import LabeledCheckbox from "../Components/Checkbox.js" +import {Link} from 'react-router-dom' const StyledDivContainer = styled.div` - background-color : rgb(255,255,255);; + background-color : rgb(255,255,255); border-radius : 4px; border-shadow : #000; color : rgb(102,102,102); @@ -25,7 +25,7 @@ const StyledDivHeader = styled.div` text-align : center; display : flex; justify-content : space-between; - padding : 10px 58px 0 58px; + padding : 10px 26px 0 26px; color : #666; font-size : 40px; font-weight : 400; @@ -34,7 +34,7 @@ const StyledDivHeader = styled.div` ` const StyledDivDialogContent = styled.div` - padding : 20px 30px; + padding : 20px 0; ` const StyledButtonsDiv = styled.div` @@ -45,6 +45,7 @@ const StyledButtonsDiv = styled.div` const StyledButton = styled(Button)` background-color : #00acc1 !important; + width : 45% ` const StyledH2 = styled.h2` @@ -76,15 +77,16 @@ const Styledspan = styled.span` ` export default function ColaborarModal (props) { - const {state, dispatch} = useContext(Store) + // const {state, dispatch} = useContext(Store) + const [checkbox, controlCheckbox] = useState(false) + const handleCheckbox = () => controlCheckbox(!checkbox) return ( <StyledModal aria-labelledby="transition-modal-title" aria-describedby="transition-modal-description" open={props.open} - animation={true} - centered={true} + centered="true" onClose={props.handleClose} closeAfterTransition BackdropComponent={Backdrop} @@ -95,6 +97,7 @@ export default function ColaborarModal (props) { <Fade in={props.open}> <StyledDivContainer> <StyledDivHeader> + <span style={{width:"32px"}}/> <StyledH2> Você é professor(a), da educação básica, e gostaria de colaborar com a Plataforma? </StyledH2> @@ -111,22 +114,29 @@ export default function ColaborarModal (props) { }} > <div style={{maxWidth:"350px", marginRight:"0", marginLeft:"auto", color:"#666"}}> - <p style={{textAlign:"start", fontSize:"15px", margin:"0 0 10"}}> + <p style={{textAlign:"justify", fontSize:"15px", margin:"0 0 10"}}> Ao ser identificado como professor(a), você poderá <span style={{color:"#00bcd4"}}> publicar e compartilhar recursos educacionais digitais </span> na plataforma com toda a comunidade escolar do paÃs. </p> <StyledButtonsDiv> - <StyledButton> - <span style={{color:"#fff"}}>SIM</span> - </StyledButton> + + <Link to={{ + pathname : "/termos-publicar-recurso", + state : true + }}> + <StyledButton> + <span style={{color:"#fff"}}>SIM</span> + </StyledButton> + </Link> + <StyledButton> <span style={{color:"#fff"}}>NÃO</span> </StyledButton> </StyledButtonsDiv> </div> <div style={{display:"flex", alignItems:"flex-start"}}> - <LabeledCheckbox label={<Styledspan>Não perguntar novamente</Styledspan>} /> + <LabeledCheckbox label={<Styledspan>Não perguntar novamente!</Styledspan>} checked={checkbox} handleChange={handleCheckbox}/> </div> </StyledDivContentInformation> </StyledDivDialogContent> diff --git a/src/Components/CollectionAuthor.js b/src/Components/CollectionAuthor.js new file mode 100644 index 0000000000000000000000000000000000000000..c81f227aadb22527f80b95f72cd226920a63379f --- /dev/null +++ b/src/Components/CollectionAuthor.js @@ -0,0 +1,72 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import { Grid } from '@material-ui/core'; +import styled from 'styled-components'; +import { Link } from 'react-router-dom'; +import CircularProgress from '@material-ui/core/CircularProgress'; + + +export default function CollectionAuthor(props) { + return ( + <Grid container + direction="column" + justify="center" + alignItems="center"> + {props.imgsrc ? + <UserLink + to={`/usuario-publico/${props.author_id}`} + > + <UserAvatar src={props.imgsrc}/> + </UserLink> + : + <CircularProgress color="secondary"/> + } + <InfoText>Coleção organizada por:</InfoText> + {props.name ? + <UserLink to={`/usuario-publico/${props.author_id}`} > + <UserName>{props.name}</UserName> + </UserLink> + : + <CircularProgress /> + } + </Grid> + ); +} + +const UserAvatar = styled.img` + border-radius: 75px; + width: 75px; + height: auto; +` +const InfoText = styled.p` + margin-bottom: 0; + padding-bottom: 0; + color: #666; +` +const UserName = styled.h2` + margin-top: 10px; + color: #673ab7; +` +const UserLink = styled(Link)` + text-decoration: none; + &:focus, &:hover, &:visited, &:link, &:active { + text-decoration: none; + } +` diff --git a/src/Components/CollectionCard.js b/src/Components/CollectionCard.js index b6006301eb54fcacc73708254a8ebcaf33c8e928..a252100acd4083d796247c109c3f99da46ddb7e2 100644 --- a/src/Components/CollectionCard.js +++ b/src/Components/CollectionCard.js @@ -26,7 +26,6 @@ import CardActions from '@material-ui/core/CardActions'; import IconButton from '@material-ui/core/IconButton'; import FolderIcon from '@material-ui/icons/Folder'; import FavoriteIcon from '@material-ui/icons/Favorite'; -import StarRatings from 'react-star-ratings'; import noAvatar from "../img/default_profile.png"; import Rating from '@material-ui/lab/Rating'; import StarBorderIcon from '@material-ui/icons/StarBorder'; diff --git a/src/Components/CollectionCardFunction.js b/src/Components/CollectionCardFunction.js new file mode 100644 index 0000000000000000000000000000000000000000..6f7322e7261536655d78098ad28b3639e87af2a5 --- /dev/null +++ b/src/Components/CollectionCardFunction.js @@ -0,0 +1,471 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useContext, useEffect } from 'react'; +import { Store } from '../Store.js' +import { apiDomain } from '../env'; +import noAvatar from "../img/default_profile.png"; +import Button from '@material-ui/core/Button'; +import styled from 'styled-components' +import Slide from '@material-ui/core/Slide'; +import Grid from '@material-ui/core/Grid'; +import { StyledCard, CardDiv, CardReaDiv, Footer, LikeCounter, ButtonNoWidth, EnviadoPor, TagContainer, HeaderContainer, AvatarDiv } from './ResourceCardFunction.js' +import Rating from '@material-ui/lab/Rating'; +import StarBorderIcon from '@material-ui/icons/StarBorder'; +import FolderIcon from '@material-ui/icons/Folder'; +import FavoriteIcon from '@material-ui/icons/Favorite'; +import AddIcon from '@material-ui/icons/Add'; +import CheckIcon from '@material-ui/icons/Check'; +import LockIcon from '@material-ui/icons/Lock'; +import ColCardOwnerOptions from './ColCardOwnerOptions.js' +import ColCardPublicOptions from './ColCardPublicOptions' +import { Link } from 'react-router-dom'; +import { putRequest } from '../Components/HelperFunctions/getAxiosConfig' +import SignUpModal from './SignUpModal' +import LoginModal from './LoginModal.js' +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; + +export default function CollectionCardFunction(props) { + const { state } = useContext(Store) + + // eslint-disable-next-line + const [userAvatar] = useState(props.avatar ? (`${apiDomain}` + props.avatar) : noAvatar) + const [userFollowingCol, toggleUserFollowingCol] = useState(props.followed ? props.followed : false) + const handleToggleUserFollowingCol = () => { toggleUserFollowingCol(!userFollowingCol) } + + const [name, setName] = useState(props.name) + const changeColName = (newName) => { setName(newName) } + + const [privacy, setPrivacy] = useState(props.privacy) + const changeColPrivacy = (newPrivacy) => { setPrivacy(newPrivacy) } + + const [likesCount, setLikesCount] = useState(props.likeCount) + const [liked, toggleLiked] = useState(props.liked) + + const [signUpOpen, setSignUp] = useState(false) + const [loginOpen, setLogin] = useState(false) + const [successfulLoginOpen, handleSuccessfulLogin] = useState(false) + + + function handleSuccessLike(data) { + toggleLiked(!liked) + setLikesCount(data.count) + } + const handleLike = () => { + if (state.currentUser.id) + putRequest(`/collections/${props.id}/like`, {}, handleSuccessLike, (error) => { console.log(error) }) + else + handleLogin() + } + + const [followingHover, handleFollowingHover] = useState(false) + const toggleFollowingHover = (value) => { handleFollowingHover(value) } + + const [slideIn, setSlide] = useState(false) + const controlSlide = () => { setSlide(!slideIn) } + + function handleSuccessFollow(data) { + handleToggleUserFollowingCol() + } + const handleFollow = () => { + if (state.currentUser.id) + putRequest(`/collections/${props.id}/follow`, {}, handleSuccessFollow, (error) => { console.log(error) }) + else + handleLogin() + } + + const RenderFollowButton = () => { + return ( + <FollowButton onClick={handleFollow}> + <AddIcon /><span>SEGUIR</span> + </FollowButton> + ) + } + + useEffect(() => { + if (!state.currentUser.id) { + toggleLiked(false); + toggleUserFollowingCol(false); + } + }, [state.currentUser.id]) + + const RenderFollowingButton = () => { + return ( + <FollowingButton onMouseOver={() => toggleFollowingHover(true)} + onMouseLeave={() => toggleFollowingHover(false)} onClick={handleFollow}> + { + followingHover ? + ( + [ + <span>DEIXAR DE SEGUIR</span> + ] + ) + : + ( + [ + <React.Fragment> + <CheckIcon /><span>SEGUINDO</span> + </React.Fragment> + ] + ) + } + </FollowingButton> + ) + } + + const SlideAnimationContent = () => { + return ( + <SlideContentDiv> + <HeaderContainer container="row" justify="flex-start" alignItems="center"> + <AvatarDiv item xs={2}> + <img className="img" src={userAvatar} alt="user avatar" /> + </AvatarDiv> + <EnviadoPor item xs={10}> + Enviado por: + <br /> + <p>{props.author}</p> + </EnviadoPor> + </HeaderContainer> + { + props.tags ? + <TagContainer container direction="row"> + { + props.tags.map((tag) => + <Grid item key={tag.id}> + <span >{tag.name}</span> + </Grid> + ) + } + </TagContainer> : + null + } + </SlideContentDiv> + ) + } + + const handleSignUp = () => { + setSignUp(!signUpOpen) + } + + const handleLogin = () => { + setLogin(!loginOpen) + } + + function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; + } + + function toggleLoginSnackbar(reason) { + if (reason === 'clickaway') { + return; + } + handleSuccessfulLogin(false); + } + + return ( + <> + <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} + /> + <LoginModal open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp} + openSnackbar={() => { handleSuccessfulLogin(true) }} + /> + <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleLoginSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + > + <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert> + </Snackbar> + <StyledCard> + <CardDiv> + <CardReaDiv> + <Header onMouseEnter={controlSlide} onMouseLeave={controlSlide}> + <Slide direction="left" in={slideIn} timeout={1000}> + <div className={`slideContentLinkAfterActive${slideIn}`} style={{ width: '100%', height: "100%" }}> + <Link to={"/colecao-do-usuario/" + props.id} className="text" style={{ textDecoration: "none" }} > + {SlideAnimationContent()} + </Link> + </div> + </Slide> + <div className={`slideContentLinkBeforeActive${slideIn}`} style={{ width: '100%', height: '100%' }}> + <UserInfo> + {/* I(Luis) dont know why, but if i use styled components, sometimes the avatar will be deconfigured */} + <img src={userAvatar} alt="user avatar" style={{ + height: "70px", width: "70px", borderRadius: "50%", + zIndex: 1, border: "2px solid white", + boxShadow: "0 1px 3px rgba(0,0,0,.45)" + + }} /> + <UserAndTitle> + <span>{props.author}</span> + <span className={"col-name"}>{name}</span> + </UserAndTitle> + </UserInfo> + <StyledGrid container direction="row"> + { + props.thumbnails.map((thumb) => + <Grid item xs={props.thumbnails <= 4 && props.thumbnails > 0 ? 12 / props.thumbnails.length : 6}> + <div style={{ backgroundImage: `url(${`${apiDomain}` + thumb})`, height: "100%", width: "100%", backgroundSize: "cover", backgroundPosition: "center" }} /> + </Grid> + ) + } + </StyledGrid> + </div> + </Header> + + <Description> {/*renders rating, number of learning objects and likes count*/} + { + props.authorID !== state.currentUser.id && + <Rating + name="customized-empty" + value={props.rating} + readOnly + style={{ color: "#666" }} + emptyIcon={<StarBorderIcon fontSize="inherit" />} + /> + } + + <Footer> + <Type> + <FolderIcon /> + <span style={{ fontWeight: "bold" }}>{props.collections ? props.collections.length : 0} </span> + <span>{props.collections ? props.collections.length !== 1 ? "Recursos" : "Recurso" : 0}</span> + </Type> + <LikeCounter> + <span>{likesCount}</span> + <ButtonNoWidth onClick={handleLike}> + <FavoriteIcon style={{ color: liked ? "red" : "#666" }} /> + </ButtonNoWidth> + </LikeCounter> + </Footer> + </Description> + + </CardReaDiv> + + { + props.authorID === state.currentUser.id ? + ( + <CardReaFooter style={{ justifyContent: "space-between" }}> {/*renders following/unfollow and follow button*/} + <Grid container> + <Grid item xs={6} style={{ display: "flex", justifyContent: "center" }}> + { + privacy === 'private' && + <LockIcon style={{ color: "#666" }} /> + } + </Grid> + <Grid item xs={6} style={{ display: "flex", justifyContent: "flex-end" }}> + <ColCardOwnerOptions + id={props.id} + changeColName={changeColName} + changeColPrivacy={changeColPrivacy} + removeColl={props.removeColl} + /> + </Grid> + </Grid> + </CardReaFooter> + ) + : + ( + <CardReaFooter> {/*renders following/unfollow and follow button*/} + { + userFollowingCol ? + ( + [ + RenderFollowingButton() + ] + ) + : + ( + [ + RenderFollowButton() + ] + ) + } + <ColCardPublicOptions + id={props.id} + handleLogin={handleLogin} + currentUserId={state.currentUser.id} + /> + </CardReaFooter> + ) + } + + </CardDiv> + </StyledCard> + </> + ) +} + + + +const SlideContentDiv = styled.div` + background-color : #7e57c2; + padding : 10px; + width : 100%; + height : 100%; +` + +const UserAndTitle = styled.div` + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + width: 100%; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 30px 10px 10px 10px; + margin-top: -25px; + background-color: rgba(0,0,0,.5); + color: #fff; + + .col-name { + padding-top: 5px; + font-size: 17px; + font-weight: 500; + text-overflow: ellipsis; + overflow: hidden; + text-align: center; + width: 100%; + } +` + +const UserInfo = styled.div` + position : absolute; + display : flex; + flex-direction : column; + width : 100%; + height : 100%; + justify-content : flex-end; + align-items : center; + +` + +const CardReaFooter = styled.div` + height : 60px; + display : flex; + justify-content : center; + align-items : center; + border-top : 1px solid #e5e5e5; + + .MuiSvgIcon-root { + font-family: 'Material Icons'; + color : inherit; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + } +` + +const Type = styled.div` + line-height : 1; + font-size : .85em; + + .MuiSvgIcon-root { + font-size : 21px; + color : #673ab7; + vertical-align : middle; + padding-right : .4em; + } +` + +const StyledGrid = styled(Grid)` + .MuiGrid-item { + height : 136px; + width 130px; + background : #f9f9f9; + border : 1px solid #f4f4f4; + border-color : #f4f4f4; + } +` + +const Header = styled.div` + display : flex; + height : 230px; + position : relative; + overflow : hidden; +` + +const Description = styled.div` + display : flex; + height : 60px + background-color : #fff; + flex-direction : column; + justify-content: space-between; + padding : 15px; +` +const FollowButton = styled(Button)` + border : 2px solid #503096 !important; + border-radius : 5px !important; + margin : 10px !important; + color :#503096 !important; + min-width : 150px !important; + min-height : 36px !important; + text-align : center !important; + vertical-align : middle !important; + background : transparent !important; + text-transform : uppercase !important; + font-family : inherit !important; + overflow : hidden !important; + font-weight : normal !important; + text-decoration : none !important; + letter-spacing: .01em !important; + white-space : nowrap !important; + font-weight: 500; + + &:hover { + background-color : rgba(158,158,158,0.2) !important; + + } + +` +const FollowingButton = styled(Button)` + border : 2px solid #503096 !important; + border-radius : 5px !important; + margin : 10px !important; + color :#fff !important; + min-width : 150px !important; + min-height : 36px !important; + text-align : center !important; + vertical-align : middle !important; + background-color : #503096 !important; + text-transform : uppercase !important; + font-family : inherit !important; + overflow : hidden !important; + font-weight : normal !important; + text-decoration : none !important; + letter-spacing: .01em !important; + white-space : nowrap !important; + font-weight: 500; + + &:hover { + background-color : rgba(158,158,158,0.2) !important; + color : #503096 !important; + box-shadow : none !important; + } + +` diff --git a/src/Components/CollectionCommentSection.js b/src/Components/CollectionCommentSection.js new file mode 100644 index 0000000000000000000000000000000000000000..ccc7f079dae76494734addd6116bdaf6a331ae5d --- /dev/null +++ b/src/Components/CollectionCommentSection.js @@ -0,0 +1,166 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useRef, useState, useEffect } from 'react'; +import { Grid } from '@material-ui/core'; +import Card from '@material-ui/core/Card'; +import Button from '@material-ui/core/Button'; +import EditIcon from '@material-ui/icons/Edit'; +import styled from 'styled-components'; +import CommentForm from './ResourcePageComponents/CommentForm.js'; +import Comment from './Comment.js'; +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; +import Comentario from '../img/comentarios.png'; +import {getRequest} from '../Components/HelperFunctions/getAxiosConfig' + +export default function CollectionCommentSection(props) { + const [post_snack_open, setPostSnackOpen] = useState(false); + const [delete_snack_open, setDeleteSnackOpen] = useState(false); + const [render_state, setRenderState] = useState(false); + const [reviews, setReviews] = useState([]); + const comment_ref = useRef(null); + + const forceUpdate = () => { setRenderState(!render_state); } + + const handlePostSnackbar = () => { + setPostSnackOpen(!post_snack_open); + } + + const handleDeleteSnackbar = () => { + setDeleteSnackOpen(!delete_snack_open); + } + + const handleScrollToCommentForm = () => { + window.scrollTo(0, comment_ref.current.offsetTop); + } + + function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; + } + + const NoCommentsMessage = () => { + const NoCommentsContainer=styled.div` + text-align: center; + margin-left: 9vw; + margin-right: 9vw; + ` + const BlueTitle=styled.h2` + color: #673ab7; + ` + const Secondary=styled.h3` + font-weight: 100; + ` + const ButtonText=styled.span` + font-weight: 900; + ` + const Image=styled.img` + ` + return ( + <NoCommentsContainer> + <Image src={Comentario} style={{width:"100%", maxWidth:234}}/> + <BlueTitle>Compartilhe sua opinião com a rede!</BlueTitle> + <Secondary>Gostou desta coleção? Comente e compartilhe com a rede sua opinião. Interagindo com a rede, você contribui para que mais coleções como esta sejam criadas.</Secondary> + <Button + variant="contained" + color="primary" + startIcon={<EditIcon />} + onClick={handleScrollToCommentForm} + > + <ButtonText>Relatar experiência</ButtonText> + </Button> + </NoCommentsContainer> + ); + } + const CollectionComments = () => { + return ( + <div> + <Title>{reviews.length} {reviews.length === 1 ? "Relato" : "Relatos"} sobre a Coleção</Title> + {reviews.map(r => { + return ( + <Comment + rerenderCallback={forceUpdate} + objectID={props.id} + reviewID={r.id} + reviewRatings={r.review_ratings} + authorID={r.user.id} + rating={r.rating_average} + authorName={r.user.name} + authorAvatar={r.user.avatar} + description={r.description} + createdAt={r.created_at} + handleSnackbar={handleDeleteSnackbar} + recurso={false} + /> + );})} + </div> + ); + } + + useEffect(() => { + getRequest(`/collections/${props.id}/reviews`, (data) => {setReviews(data)}, (error) => {console.log(error)}) + }, [render_state]); + + return ( + <CommentAreaContainer container xs={12} direction="row" justify="center" alignItems="center"> + <Grid item xs={12} ref={comment_ref}> + <CommentAreaCard> + <Title>Conte sua experiência com a coleção</Title> + <CommentForm colecao recursoId={props.id} + handleSnackbar={handlePostSnackbar} + rerenderCallback={forceUpdate} + /> + {reviews.length ? CollectionComments() : NoCommentsMessage()} + </CommentAreaCard> + </Grid> + <Snackbar + open={post_snack_open} + autoHideDuration={6000} + onClose={handlePostSnackbar} + anchorOrigin={{vertical: 'top', horizontal: 'right'}} + > + <Alert onClose={handlePostSnackbar} severity="info"> + Seu comentário foi publicado com sucesso! + </Alert> + </Snackbar> + <Snackbar + open={delete_snack_open} + autoHideDuration={6000} + onClose={handleDeleteSnackbar} + anchorOrigin={{vertical: 'top', horizontal: 'right'}} + > + <Alert onClose={handleDeleteSnackbar} severity="info"> + Comentário deletado com sucesso. + </Alert> + </Snackbar> + </CommentAreaContainer> + ); +} + + +const CommentAreaContainer=styled(Grid)` + margin-left: 10%; + margin-right: 10%; +` +const CommentAreaCard=styled(Card)` + padding: 45px; +` +const Title=styled.h1` + font-weight: 100; + color: #666; +` diff --git a/src/Components/CollectionDescription.js b/src/Components/CollectionDescription.js new file mode 100644 index 0000000000000000000000000000000000000000..aa35cb0df4909fa3205678aa145bc1e02f2802ad --- /dev/null +++ b/src/Components/CollectionDescription.js @@ -0,0 +1,92 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import { Grid } from '@material-ui/core'; +import styled from 'styled-components'; +import CollectionReview from './CollectionReview.js'; +import { apiUrl, apiDomain } from '../env'; + +export default function CollectionDescription(props) { + // eslint-disable-next-line + const [download_url, setDownloadUrl] = useState(''); + + useEffect(() => { + const body = { + "package": { + "object": [{"type": "Collection", "id": props.collection_id}] + }}; + axios + .post(apiUrl+'/package', body) + .catch(err => { + if (err.response && err.response.status === 302) { + setDownloadUrl(apiDomain+'/'+err.response.data.url); + } + });}, [props.collection_id]); + + return ( + <Grid container direction="column" justify="center" alignItems="center" spacing={5}> + <Grid + item + justify="center" + alignItems="center" + > + <Title>{props.title}</Title> + </Grid> + <Grid + item + direction="row" + justify="center" + alignItems="center" + > + <Grid item> + <CollectionReview + scrollToComment={props.scrollToComments} + id={props.collection_id}/> + </Grid> + {/* <Grid item container sm={8} + direction="column" justify="center" alignItems="flex-end" + > + <Grid item style={{marginBottom: 10}}> + <DownloadAnchor href={download_url} > + <DownloadButton + variant="outlined" + color="primary" + startIcon={<GetAppIcon fontSize="large"/>} + size="large" + > + <ButtonText>Baixar Coleção</ButtonText> + </DownloadButton> + </DownloadAnchor> + </Grid> + <Grid item> + <FollowCollectionButton user_id={state.currentUser.id} collection_id={props.collection_id}/> + </Grid> + </Grid> */} + </Grid> + + </Grid> + ); +} + +const Title=styled.h1` + font-size: 2.5em; + color: rgb(102, 102, 102); + text-align: center +` \ No newline at end of file diff --git a/src/Components/CollectionDowloadButton.js b/src/Components/CollectionDowloadButton.js new file mode 100644 index 0000000000000000000000000000000000000000..d7820da26c20262c585c60eff2723a2d5bc78b52 --- /dev/null +++ b/src/Components/CollectionDowloadButton.js @@ -0,0 +1,69 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import GetAppIcon from '@material-ui/icons/GetApp'; +import Button from '@material-ui/core/Button'; +import styled from 'styled-components'; +import { apiUrl, apiDomain } from '../env'; +import { getRequest } from './HelperFunctions/getAxiosConfig' + + +const DowloadButton = (props) => { + const [download_url, setDownloadUrl] = useState(''); + + useEffect(() => { + const body = { + "package": { + "object": [{ "type": "Collection", "id": props.id }] + } + }; + axios + .post(apiUrl + '/package', body) + .catch(err => { + if (err.response && err.response.status === 302) { + setDownloadUrl(apiDomain + '/' + err.response.data.url); + } + }); + }, [props.id]); + + const handleDowloadCollection = () => { + // there is no error controller here because the router + ///:type/:id/download is always returning error + getRequest( + `/collections/${props.id}/download`, + (data, header) => { + }, + (error) => { + } + ) + } + + return ( + <> + <DownloadAnchor href={download_url} > + <DownloadButton + variant="outlined" + color="primary" + startIcon={<GetAppIcon fontSize="large" />} + size="small" + > + <ButtonText onClick={handleDowloadCollection}>Baixar Coleção</ButtonText> + </DownloadButton> + </DownloadAnchor> + </> + ) +} + +const ButtonText = styled.span` + font-weight: bolder; + font-size: 1.2em; +` +const DownloadButton = styled(Button)` + padding-left: 10; + padding-right: 10; + width: 250px; +` +const DownloadAnchor = styled.a` + text-decoration: none !important; +` + +export default DowloadButton; diff --git a/src/Components/CollectionReview.js b/src/Components/CollectionReview.js new file mode 100644 index 0000000000000000000000000000000000000000..c9dc801016a770dd65acd4378c9db395b6c4d945 --- /dev/null +++ b/src/Components/CollectionReview.js @@ -0,0 +1,124 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useContext, useState, useEffect } from 'react'; +import { Grid } from '@material-ui/core'; +import Rating from '@material-ui/lab/Rating'; +import IconButton from '@material-ui/core/IconButton'; +import StarBorderIcon from '@material-ui/icons/StarBorder'; +import FavoriteIcon from '@material-ui/icons/Favorite'; +import InfoIcon from '@material-ui/icons/Info'; +import { Store } from '../Store.js' +import ReportModal from './ReportModal.js'; +import SignUpModal from './SignUpModal.js'; +import LoginModal from './LoginModal.js'; +import { putRequest, getRequest } from './HelperFunctions/getAxiosConfig.js' + +export default function CollectionReview(props) { + const [likes, setLikes] = useState(0); + const [liked, setLiked] = useState(false); + const [stars, setStars] = useState(0); + const [reportOpen, setReportOpen] = useState(false); + const [sign_up_open, setSignUpOpen] = useState(false); + const [log_in_open, setLoginOpen] = useState(false); + const { state } = useContext(Store); + + function handleSuccessfulGet(data) { + setLikes(Number(data.likes_count)); + setLiked(data.liked); + } + + useEffect(() => { + const url = `/collections/${props.id}` + + getRequest(url, handleSuccessfulGet, (error) => { console.log(error) }) + + }, [props.id, state.currentUser.id]); + + const handleClickReport = () => { + setReportOpen(true); + } + + function handleSuccess(data) { + setLiked(!liked) + setLikes(data.count) + } + + const handleLikeClick = () => { + if (state.currentUser.id) { + const url = `/collections/${props.id}/like` + putRequest(url, {}, handleSuccess, (error) => { console.log(error) }) + } else + setSignUpOpen(true); + } + + const handleSetStars = (value) => { + setStars(value); + props.scrollToComment(); + } + + const handleCloseModal = () => { + setReportOpen(false); + } + + return ( + <Grid container direction="column"> + <Grid sm={12} container direction="row" alignItems="center"> + <Grid item> + <Rating + name="customized-empty" + value={stars} + onChange={(e, value) => handleSetStars(value)} + precision={0.5} + style={{ color: "#666" }} + emptyIcon={<StarBorderIcon fontSize="inherit" />} + /> + </Grid> + <Grid item justify="center" alignItems="center"> + <IconButton aria-label="like" onClick={handleLikeClick}> + {likes}<FavoriteIcon style={{ fill: liked ? "red" : null }} /> + </IconButton> + </Grid> + </Grid> + <Grid item sm={12}> + <IconButton + aria-label="report" + style={{ fontSize: 'small' }} + onClick={handleClickReport}> + <InfoIcon />Reportar erro ou abuso + </IconButton> + <ReportModal + open={reportOpen} + handleClose={handleCloseModal} + form="colecao" + complainableId={props.id} + complainableType="Collection" + /> + </Grid> + <SignUpModal + open={sign_up_open} + handleClose={() => setSignUpOpen(false)} + openLogin={() => setLoginOpen(true)} + /> + <LoginModal + open={log_in_open} + handleClose={() => setLoginOpen(false)} + /> + </Grid> + ); +} diff --git a/src/Components/Coment.js b/src/Components/Coment.js deleted file mode 100644 index f76cbf7fc21d321d7ce4155f57d4580f00190c75..0000000000000000000000000000000000000000 --- a/src/Components/Coment.js +++ /dev/null @@ -1,27 +0,0 @@ -import React, {Component} from 'react'; -import CardContent from '@material-ui/core/CardContent'; -import Typography from '@material-ui/core/Typography'; -import StarRatings from 'react-star-ratings'; - - -class Coment extends Component { - constructor(props) { - super(props); - - } -render(){ - return( - <CardContent> - <StarRatings - rating={2} - starRatedColor="ff7f00" - starDimension="20px" - starSpacing="2px" - /> - <Typography component="p" varitant="srOnly" style={{color: "orange"}}> {this.props.author}:{this.props.coment}</Typography> - </CardContent> - ); -} - -} -export default Coment; diff --git a/src/Components/Comment.js b/src/Components/Comment.js new file mode 100644 index 0000000000000000000000000000000000000000..09b66d5ad2f83e4ad3f10994de899960ca4f1b49 --- /dev/null +++ b/src/Components/Comment.js @@ -0,0 +1,310 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, useContext} from 'react' +import {Store} from '../Store.js' +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; +import { Button } from '@material-ui/core'; +import {Link} from 'react-router-dom' +import {apiDomain} from '../env'; +import noAvatar from "../img/default_profile.png"; +import Rating from '@material-ui/lab/Rating'; +import StarBorderIcon from '@material-ui/icons/StarBorder'; +import EditIcon from '@material-ui/icons/Edit'; +import TextField from "@material-ui/core/TextField"; +import Menu from '@material-ui/core/Menu'; +import MenuItem from '@material-ui/core/MenuItem'; +import ModalExcluir from './ModalExcluirComentario.js' +import {putRequest, deleteRequest} from './HelperFunctions/getAxiosConfig' + +export default function Comment (props) { + + /* + Required props: + rerenderCallback = callback function to trigger re-render on parent component + reviewRatings = required to update comment even though the user cannot update their rating score... + objectID = collection/learning object id + reviewID = self-explanatory I hope + authorID = author id; links to public user page + authorAvatar = either a string denoting the author's avatar file location or null + rating = star rating + name = title (?) + authorName = author username + description = the user comment itself + createdAt + recurso : boolean; determines whether to display orange or purple font + */ + var moment = require('moment') + + const {state} = useContext(Store) + const [displayedComment, setDisplayedComment] = useState(props.description) + const [editando, setEditando] = useState(false) + const [anchorEl, setAnchorEl] = React.useState(null); + const handleClick = (event) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + const [modalOpen, toggleModal] = useState(false) + + const [comment, setComment] = useState({ + error : false, + value : props.description + }) + const handleChange = (e) => { + const userInput = e.target.value + const flag = (userInput.length === 0 ? true : false); + setComment({...comment, error : flag, value : userInput}) + } + + function handleOnSuccessfulComment (data) { + setDisplayedComment(comment.value) + setEditando(false) + props.handleSnackbar(2) + } + + const updateComment = () => { + const finalComment = comment + if (!finalComment.error) { + + let payload = { + "review" : { + "name":null, + "description":finalComment.value, + "pros":null, + "cons":null, + "review_ratings_attributes" : props.reviewRatings + } + } + putRequest(`/learning_objects/${props.objectID}/reviews/`, payload, handleOnSuccessfulComment, (error) => {console.log(error)}) + + } + } + + function handleSuccessDeleteComment (data) { + props.rerenderCallback() + props.handleSnackbar(3) + } + + const deleteComment = () => { + + deleteRequest(`/learning_objects/${props.objectID}/reviews/${props.reviewID}`, handleSuccessDeleteComment, (error) => {console.log(error)}) + + toggleModal(false) + + } + + return ( + <React.Fragment> + <ModalExcluir + open={modalOpen} handleClose={() => {toggleModal(false)}} + handleConfirm={deleteComment} + /> + <Grid container style={{paddingLeft : "20px"}}> + + <Grid item xs={1}> + { + props.authorID && + <AvatarDiv> + <Link to={'/usuario-publico/' + props.authorID}> + <img src={props.authorAvatar ? apiDomain + props.authorAvatar : noAvatar} alt="author avatar"/> + </Link> + </AvatarDiv> + } + </Grid> + + <Grid item xs={10}> + <Comentario> + <div className="star-rating-container"> + <Rating + name="read-only" + value={props.rating} + readOnly + size="small" + style={{color:"#666"}} + emptyIcon={<StarBorderIcon fontSize="inherit" style={{color : "#a5a5a5"}} />} + /> + </div> + + { + props.name && + <strong>{props.name}</strong> + } + + + <div> + { + editando ? + ( + <React.Fragment> + <div style={{marginTop : "5%", padding : "2px"}}> + <StyledTextField + colecao={!props.recurso} + id = "input-comentario" + label = {"Editar Comentário"} + margin = "normal" + value = {comment.value} + multiline={true} + rows="5" + onChange = {(e) => {handleChange(e)}} + style={{width:"100%"}} + /> + </div> + <div style={{float : "right"}}> + <StyledButton + style={props.recurso ? {backgroundColor : "#ff7f00"} : {backgroundColor : "#673ab7"}} + onClick={() => {setEditando(false)}} + > + Fechar + </StyledButton> + <StyledButton + style={props.recurso ? {backgroundColor : "#ff7f00"} : {backgroundColor : "#673ab7"}} + onClick={() => updateComment()} + > + Salvar + </StyledButton> + </div> + </React.Fragment> + ) + : + ( + <React.Fragment> + <p> + { + props.authorID && + <Link + to={'/usuario-publico/' + props.authorID} + style={{ + fontWeight : "bolder", + color : props.recurso ? "#ff7f00" : "#673ab7" + }} + > + {props.authorName} + </Link> + } + : {displayedComment} + </p> + { + props.authorID !== state.currentUser.id && + <span className="date"> + {moment(props.createdAt).format("DD/MM/YYYY")} + </span> + } + </React.Fragment> + ) + } + </div> + + </Comentario> + </Grid> + + { + props.authorID === state.currentUser.id && + <Grid item xs={1}> + <StyledDiv> + <Button onClick={handleClick}><EditIcon/></Button> + <Menu + id="simple-menu" + anchorEl={anchorEl} + keepMounted + open={Boolean(anchorEl)} + onClose={handleClose} + > + <MenuItem onClick={() => {setEditando(true); handleClose()}}>Editar</MenuItem> + <MenuItem onClick={() => {toggleModal(true);handleClose()}}>Excluir</MenuItem> + </Menu> + </StyledDiv> + </Grid> + } + </Grid> + </React.Fragment> + ) +} + +const StyledTextField = styled(TextField)` + label.Mui-focused { + color : ${props => props.colecao ? "rgb(103,58,183)" : "rgb(255,127,0)"}; + } + + .MuiInput-underline::after { + border-bottom: ${props => props.colecao ? "2px solid rgb(103,58,183)" : "2px solid rgb(255,127,0)"}; + } + +` + +const StyledDiv = styled.div` + text-align : center; + .MuiButton-root { + @media screen and (max-width: 990px) { + padding-right : 35px !important; + } + } +` +const StyledButton = styled(Button)` + color : rgba(255,255,255,0.87) !important; + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + margin : 6px 8px !important; + font-weight : 600 !important; +` + +const Comentario = styled.div` + @media screen and (max-width: 990px) { + padding-left : 55px !important; + } + font-size : 14px; + + .star-rating-container { + width : 100px; + } + + p { + margin : 0 0 10px; + padding-left : 2px + } + + a { + text-decoration : none !important; + } + + .date { + color : #ababab; + font-size : 12px; + font-weight : lighter; + padding-left : 3px; + } +` + +const AvatarDiv = styled.div` + text-align : center; + float : left; + position : relative; + width : 65px; + height : 65px; + a { + text-decoration : none !important; + } + + img { + width : 100% !important; + height : 100% !important; + border-radius : 100% + vertical-align : middle; + } +` diff --git a/src/Components/ContactButtons/FollowButton.js b/src/Components/ContactButtons/FollowButton.js new file mode 100644 index 0000000000000000000000000000000000000000..245eecbccd12abba7a88c5d76643d9302328c0d9 --- /dev/null +++ b/src/Components/ContactButtons/FollowButton.js @@ -0,0 +1,211 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useContext, useState} from 'react' +import {Store} from '../../Store' +import PersonAddIcon from '@material-ui/icons/PersonAdd'; +import styled from 'styled-components' +import Button from '@material-ui/core/Button'; +import {putRequest} from '../HelperFunctions/getAxiosConfig' +import LoginModal from './../LoginModal.js' +import Snackbar from '@material-ui/core/Snackbar'; +import SignUpModal from './../SignUpModal' +import MuiAlert from '@material-ui/lab/Alert'; + +function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} + +export default function FollowButton (props) { + + const {state} = useContext(Store) + const [loginOpen, setLogin] = useState(false) + const [successfulLoginOpen, handleSuccessfulLogin] = useState(false) + const [signUpOpen, setSignUp] = useState(false) + + const handleSignUp = () => { + setSignUp(!signUpOpen) + } + + const handleLogin = () => { + setLogin(!loginOpen) + } + + const toggleSnackbar = (event, reason) => { + if (reason === 'clickaway') { + return; + } + + handleSuccessfulLogin(false); + } + + function handleSuccess (data) { + props.toggleFollowed() + } + + const handleFollow = (followerID) => { + if (followerID !== undefined) { + const url = `/users/${followerID}/follow/` + putRequest(url, {}, handleSuccess, (error) => {console.log(error)}) + } + } + + return ( + <React.Fragment> + <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + > + <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert> + </Snackbar> + {/*-------------------------------MODALS---------------------------------------*/} + <LoginModal open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp} + openSnackbar={() => { handleSuccessfulLogin(true) }} + /> + <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} /> + {/*----------------------------------------------------------------------------*/} + { + state.currentUser.id !== '' ? ( + <StyledButton onClick={() => handleFollow(props.followerID)}> + <PersonAddIcon style={{fontSize : "24px", + display : "inline-block", + verticalAlign : "middle", + color : "#00bcd4"}}/> + SEGUIR + </StyledButton> + ) + : + ( + <StyledButton onClick={() => handleLogin(true)}> + <PersonAddIcon style={{fontSize : "24px", + display : "inline-block", + verticalAlign : "middle", + color : "#00bcd4"}}/> + SEGUIR + </StyledButton> + ) + } + </React.Fragment> + ) +} + +export function NoIcon (props) { + const {state} = useContext(Store) + const [loginOpen, setLogin] = useState(false) + const [successfulLoginOpen, handleSuccessfulLogin] = useState(false) + const [signUpOpen, setSignUp] = useState(false) + + const handleSignUp = () => { + setSignUp(!signUpOpen) + } + + const handleLogin = () => { + setLogin(!loginOpen) + } + + const toggleSnackbar = (event, reason) => { + if (reason === 'clickaway') { + return; + } + + handleSuccessfulLogin(false); + } + + const handleFollow = (followerID) => { + if (followerID !== undefined) { + const url = `/users/${followerID}/follow/` + putRequest(url, {}, (data) => {props.toggleFollowed()}, (error) => {console.log(error)}) + } + } + + return ( + <React.Fragment> + <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + > + <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert> + </Snackbar> + {/*-------------------------------MODALS---------------------------------------*/} + <LoginModal open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp} + openSnackbar={() => { handleSuccessfulLogin(true) }} + /> + <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} /> + {/*----------------------------------------------------------------------------*/} + { + state.currentUser.id !== '' ? ( + <NoIconButton onClick={() => handleFollow(props.followableID)}>seguir</NoIconButton> + ) + : + ( + <NoIconButton onClick={() => handleLogin(true)}>seguir</NoIconButton> + ) + } + </React.Fragment> + ) +} + +const NoIconButton = styled(Button)` + .MuiButton-label { + color : #00bcd4 !important; + } + background-color : #fff !important; + border : solid 1px rgba(0,188,212,.85) !important; + font-size : 14px !important; + border-radius : 3px !important; + height : 36px !important; + min-width : 88px !important; + vertical-align : middle !important; + text-color : #00bcd4 !important; + align-items : center !important; + text-align : center !important; + padding : 0 6px !important; + margin : 6px 8px !important; +` + +const StyledButton = styled(Button)` + background-color : #fff !important; + border : 1px solid #00bcd4 !important; + color : #00bcd4 !important; + font-size : 14px !important; + display : inline-block !important; + position : relative !important; + cursor : pointer !important; + height : 36px !important; + min-width : 88px !important; + line-height : 36px !important; + vertical-align : middle !important; + -webkit-box-align : center !important; + -webkit-align-items : center !important; + -ms-grid-row-align : center !important; + align-items : center !important; + text-align : center !important; + border-radius : 3px !important; + -webkit-user-select : none !important; + -moz-user-select : none !important; + -ms-user-select : none !important; + user-select : none !important; + padding : 0 6px !important; + margin : 6px 8px !important; + white-space : nowrap !important; + text-transform : uppercase !important; + font-weight : 500 !important; + font-style : inherit !important; + font-variant : inherit !important; + font-family : inherit !important; + text-decoration : none !important; + overflow : hidden !important; +` diff --git a/src/Components/ContactButtons/FollowersCountButton.js b/src/Components/ContactButtons/FollowersCountButton.js new file mode 100644 index 0000000000000000000000000000000000000000..43dfbfb8ea0b7c21f92b0f778a8b3b05b0e87eea --- /dev/null +++ b/src/Components/ContactButtons/FollowersCountButton.js @@ -0,0 +1,37 @@ +import React from 'react' +import styled from 'styled-components' +import Button from '@material-ui/core/Button'; + +export default function FollowersCountButton (props) { + + const FollowerButtonSpan = () => { + const followCount = props.followCount + let retVal = followCount + (followCount !== 1 ? " seguidores" : " seguidor") + return retVal + } + + return ( + <FollowersButton> + {FollowerButtonSpan()} + </FollowersButton> + ) +} + + +const FollowersButton = styled(Button)` + right : 0 !important; + text-transform : none !important; + color : #666 !important; + font-size : 13px !important; + font-weight : 400 !important; + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + margin: 6px 8px !important; + padding : 0 6px !important; + min-width : 88px !important; + min-height : 36px !important; + vertical-align : middle !important; + text-align : center !important; + border : 0 !important; + border-radius : 3px !important; + background-color : rgb(250,250,250) !important; +` diff --git a/src/Components/ContactButtons/FollowingButton.js b/src/Components/ContactButtons/FollowingButton.js new file mode 100644 index 0000000000000000000000000000000000000000..424e8f63a12cb10a40ae64112431b2152bb0c668 --- /dev/null +++ b/src/Components/ContactButtons/FollowingButton.js @@ -0,0 +1,195 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react' +import styled from 'styled-components' +import Button from '@material-ui/core/Button'; +import FollowingIcon from '../../img/how_to_reg-24px.png' +import ModalConfirmarUnfollow from '../ModalConfirmarUnfollow.js' +import {putRequest} from '../HelperFunctions/getAxiosConfig' + +export default function FollowingButton (props) { + + const [modalOpen, toggleModal] = useState(false) + const [unfollowID, setUnfollowID] = useState(-1) + + const [followingHover, handleFollowingHover] = useState(false) + const toggleFollowingHover = (value) => {handleFollowingHover(value)} + + const handleUnfollowPartOne = (followedID) => { + setUnfollowID(followedID) + toggleModal(true) + } + + + function handleSuccess (data) { + props.toggleFollowed() + toggleModal(false) + } + const handleUnfollowPartTwo = () => { + const url = `/users/${unfollowID}/follow/` + + putRequest(url, {}, handleSuccess, (error) => {console.log(error)}) + } + + return ( + <React.Fragment> + <ModalConfirmarUnfollow open={modalOpen} + handleClose={() => {toggleModal(false)}} + handleConfirm = {handleUnfollowPartTwo} + /> + <StyledButton + onMouseOver={() => toggleFollowingHover(true)} + onMouseLeave={() => toggleFollowingHover(false)} + onClick={() => handleUnfollowPartOne(props.followedID)} + > + { + followingHover? + ( + [ + <span>DEIXAR DE SEGUIR</span> + ] + ) + : ( + [ + <> + <img src={FollowingIcon} alt='Ãcone seguindo'/><span>Seguindo</span> + </> + ] + ) + } + </StyledButton> + </React.Fragment> + ) +} + +export function NoIconFollowing (props) { + const [modalOpen, toggleModal] = useState(false) + const [unfollowID, setUnfollowID] = useState(-1) + + const [followingHover, handleFollowingHover] = useState(false) + const toggleFollowingHover = (value) => {handleFollowingHover(value)} + + const handleUnfollowPartOne = (followedID) => { + setUnfollowID(followedID) + toggleModal(true) + } + + + function handleSuccess (data) { + props.toggleFollowed() + toggleModal(false) + } + const handleUnfollowPartTwo = () => { + const url = `/users/${unfollowID}/follow/` + + putRequest(url, {}, handleSuccess, (error) => {console.log(error)}) + } + + return ( + <React.Fragment> + <ModalConfirmarUnfollow open={modalOpen} + handleClose={() => {toggleModal(false)}} + handleConfirm = {handleUnfollowPartTwo} + /> + <NoIconButton + onMouseOver={() => toggleFollowingHover(true)} + onMouseLeave={() => toggleFollowingHover(false)} + onClick={() => handleUnfollowPartOne(props.followedID)} + > + { + followingHover? + ( + [ + <span>DEIXAR DE SEGUIR</span> + ] + ) + : ( + [ + <span>SEGUINDO</span> + ] + ) + } + </NoIconButton> + </React.Fragment> + ) +} + + +export const StyledButton = styled(Button)` + background-color : #00bcd4 !important; + color : #fff !important; + display : inline-block !important; + position : relative !important; + cursor : pointer !important; + min-height : 36px !important; + min-width : 88px !important; + line-height : 36px !important; + vertical-align : middle !important; + -webkit-box-align : center !important; + -webkit-align-items : center !important; + -ms-grid-row-align : center !important; + align-items : center !important; + text-align : center !important; + border-radius : 3px !important; + -webkit-user-select : none !important; + -moz-user-select : none !important; + -ms-user-select : none !important; + user-select : none !important; + border : 0 !important; + padding : 0 6px !important; + margin : 6px 8px !important; + white-space : nowrap !important; + text-transform : uppercase !important; + font-weight : 500 !important; + font-size : 14px !important; + font-style : inherit !important; + font-variant : inherit !important; + font-family : inherit !important; + text-decoration : none !important; + overflow : hidden !important; + &:hover { + background-color : #fff !important; + color : #00bcd4 !important; + border : 1px solid #00bcd4 !important; + } + img { + height : 24px; + display : inline-block; + vertical-align : middle; + color : #fff !important; + } +` + +const NoIconButton = styled(Button)` + .MuiButton-label { + color : #00bcd4 !important; + } + background-color : #fff !important; + border : solid 1px rgba(0,188,212,.85) !important; + font-size : 14px !important; + border-radius : 3px !important; + height : 36px !important; + min-width : 88px !important; + vertical-align : middle !important; + text-color : #00bcd4 !important; + align-items : center !important; + text-align : center !important; + padding : 0 6px !important; + margin : 6px 8px !important; +` diff --git a/src/Components/ContactCard.js b/src/Components/ContactCard.js new file mode 100644 index 0000000000000000000000000000000000000000..bacf2c87feb01ee0f5a236eda286391518314d6c --- /dev/null +++ b/src/Components/ContactCard.js @@ -0,0 +1,185 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState } from 'react'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import noAvatar from "../img/default_profile.png"; +import CardMedia from '@material-ui/core/CardMedia'; +import styled from 'styled-components' +import Options from './ContactCardOptions.js' +import FollowButton from './ContactButtons/FollowButton.js' +import FollowingButton from './ContactButtons/FollowingButton.js' +import FollowersCountButton from './ContactButtons/FollowersCountButton.js' +import { Link } from 'react-router-dom'; + +export default function ImgMediaCard(props) { + + const [followedBoolean, setFollowedBoolean] = useState(props.followed) + const toggleFollowed = () => { setFollowedBoolean(!followedBoolean) } + return ( + <StyledCard> + <CardDiv> + <CardAreaDiv> + {/*Top part of contat card (background image, number of followers and avatar)*/} + <Header> + <StyledCardMedia image={props.cover}> + <div style={{ display: "flex", backgroundColor: "inherit", float: "right" }}> + <Link to={props.href} style={{textDecoration : "none"}}> + <FollowersCountButton followCount={props.follow_count} /> + </Link> + <Link to={props.href}> + <AvatarDiv> + <img src={props.avatar ? props.avatar : noAvatar} alt='user avatar' + style={{ height: "100%", width: "100%", borderRadius: "50%" }} /> + </AvatarDiv> + </Link> + </div> + </StyledCardMedia> + </Header> + + {/*Rest of the card content. Button to be rendered depends on whether the contact is followed by the user*/} + <CardContent> + <UserInfo> + <Link to={props.href}> + <p className="p1"> + {props.name} + </p> + </Link> + + <Link to={props.href}> + <span style={{ fontSize: "14px", fontWeight: "normal" }}> + <b>{props.numCollections}</b> {props.numCollections !== 1 ? "Coleções" : "Coleção"} | <b>{props.numLearningObjects}</b> {props.numLearningObjects !== 1 ? "Recursos" : "Recurso"} + </span> + </Link> + + <div style={{ display: "flex", justifyContent: "center" }}> + { + followedBoolean ? + ( + <React.Fragment> + <FollowingButton + followedID={props.followerID ? props.followerID : props.followedID} + toggleFollowed={toggleFollowed} /> + + <Options + followableID={props.followerID ? props.followerID : props.followedID} + followed={followedBoolean} + toggleFollowed={toggleFollowed} /> + </React.Fragment> + ) + : + ( + <React.Fragment> + <FollowButton + followerID={props.followedID ? props.followedID : props.followerID} + toggleFollowed={toggleFollowed} /> + + <Options + followableID={props.followedID ? props.followedID : props.followerID} + followed={followedBoolean} + toggleFollowed={toggleFollowed} /> + </React.Fragment> + ) + } + + </div> + </UserInfo> + </CardContent> + </CardAreaDiv> + </CardDiv> + </StyledCard> + ); +} + +/*Controls top part of Card*/ +const Header = styled.div` + display : flex; + height : 152px; + position : relative; +` + +/* Had to create these classes so I could avoid using card action Area -------*/ +export const CardAreaDiv = styled.div` + display : flex; + flex-direction : column; + height : 360px; + width : 272.5px; + margin : 0 auto; +` +export const CardDiv = styled.div` + background-color : #fff; + text-align : start; + font-family : 'Roboto', sans serif; + color : #666; +` +/*----------------------------------------------------------------------------*/ + + + +/*Override Material UI styling -----------------------------------------------*/ +const StyledCardMedia = styled(CardMedia)` + height : 100%; + width : 100%; + background-size : cover; + background-position : center; + +` +const StyledCard = styled(Card)` + width : 272.5px; + max-height : 380px; + margin-top : 10px; + margin-bottom : 10px; + max-width : 345px; + border-radius : 0; + box-shadow : 0 0 5px 0 rgba(0,0,0,.25) !important; +` +/*----------------------------------------------------------------------------*/ + + +const UserInfo = styled.div` + text-align : center; + margin-top : 50px; + color : #666; + + a { + text-decoration : none !important; + color : #666; + } + + .p1 { + font-size : 17px; + margin : 0 0 10px; + overflow : hidden; + text-overflow : ellipsis; + white-space : nowrap; + } +` + +/*Rounded div to be used with avatar pic*/ +const AvatarDiv = styled.div` + border-radius : 100%; + left : 50%; + position : absolute; + -webkit-transform : translateX(-50%); + transform : translateX(-50%); + top : 65px; + height : 126px; + width : 126px; + border : 2px solid #fff; +` diff --git a/src/Components/ContactCardOptions.js b/src/Components/ContactCardOptions.js new file mode 100644 index 0000000000000000000000000000000000000000..2cf3555c6ac3cae3da3cb7590ae2d149653391e4 --- /dev/null +++ b/src/Components/ContactCardOptions.js @@ -0,0 +1,202 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useContext, useState} from 'react'; +import {Store} from '../Store' +import styled from 'styled-components' +import Button from '@material-ui/core/Button'; +import Menu from '@material-ui/core/Menu'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import MenuItem from '@material-ui/core/MenuItem'; +import MoreVertIcon from '@material-ui/icons/MoreVert'; +import OpenIcon from '@material-ui/icons/OpenInNew'; +import ReportIcon from '@material-ui/icons/Error'; +import PersonAddIcon from '@material-ui/icons/PersonAdd'; +import { putRequest } from './HelperFunctions/getAxiosConfig' +import ReportModal from './ReportModal.js' +import {Link} from 'react-router-dom' +import LoginModal from './LoginModal.js' +import Snackbar from '@material-ui/core/Snackbar'; +import SignUpModal from './SignUpModal' +import MuiAlert from '@material-ui/lab/Alert'; + +function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} + +export default function SimpleMenu(props) { + const {state} = useContext(Store) + const [anchorEl, setAnchorEl] = React.useState(null); + const [loginOpen, setLogin] = useState(false) + const [successfulLoginOpen, handleSuccessfulLogin] = useState(false) + const [signUpOpen, setSignUp] = useState(false) + + const handleSignUp = () => { + setSignUp(!signUpOpen) + } + + const handleLogin = () => { + setLogin(!loginOpen) + } + + const toggleSnackbar = (event, reason) => { + if (reason === 'clickaway') { + return; + } + + handleSuccessfulLogin(false); + } + + function handleClick(event) { + setAnchorEl(event.currentTarget); + } + + function handleClose() { + setAnchorEl(null); + } + + const handleFollow = (followerID) => { + + putRequest(`/users/${followerID}/follow`, {}, (data) => { + console.log(data); + props.toggleFollowed() + }, (error) => { console.log(error) }) + + handleClose(); + } + + const [reportModal, toggleReportModal] = useState(false) + const handleModal = (value) => { + toggleReportModal(value) + } + + return ( + <React.Fragment> + <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + > + <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert> + </Snackbar> + {/*-------------------------------MODALS---------------------------------------*/} + <LoginModal open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp} + openSnackbar={() => { handleSuccessfulLogin(true) }} + /> + <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} /> + {/*----------------------------------------------------------------------------*/} + <> + { + reportModal && + <ReportModal open={reportModal} handleClose={() => handleModal(false)} + form="user" complainableId={props.followableID} + complainableType={"User"} + {...props}/> + } + <div style={{fontSize: "12px", display : "flex", flexDirection : "column", justifyContent : "center"}}> + <ButtonNoWidth aria-controls="simple-menu" aria-haspopup="true" onClick={handleClick} style={{color : "#666"}}> + <MoreVertIcon style={{color : "#666"}}/> + </ButtonNoWidth> + <Menu + id="simple-menu" + anchorEl={anchorEl} + keepMounted + open={Boolean(anchorEl)} + onClose={handleClose} + > + <StyledMenuItem onClick={handleClose}> + <Link to={"/usuario-publico/" + props.followableID}> + <ListItemIcon><OpenIcon /></ListItemIcon>Abrir + </Link> + </StyledMenuItem> + + { + props.followed ? + ( + <StyledMenuItem onClick={() => {handleFollow(props.followableID)}}> + <ListItemIcon><ReportIcon /></ListItemIcon>Deixar de Seguir + </StyledMenuItem> + ) + : + ( + state.currentUser.id !== '' ? ( + <StyledMenuItem onClick={() => {handleFollow(props.followableID)}}> + <ListItemIcon><PersonAddIcon /></ListItemIcon>Seguir + </StyledMenuItem> + ) + : + ( + <StyledMenuItem onClick={() => {handleLogin(props.followableID)}}> + <ListItemIcon><PersonAddIcon /></ListItemIcon>Seguir + </StyledMenuItem> + ) + ) + } + + { + state.currentUser.id !== '' ? ( + <StyledMenuItem onClick={() => {handleModal(true); handleClose()}}> + <ListItemIcon><ReportIcon /></ListItemIcon>Reportar + </StyledMenuItem> + ) + : + ( + <StyledMenuItem onClick={() => {handleLogin(true)}}> + <ListItemIcon><ReportIcon /></ListItemIcon>Reportar + </StyledMenuItem> + ) + } + </Menu> + </div> + </> + </React.Fragment> + ); +} + +const ButtonNoWidth = styled(Button)` + width : 24px !important; + min-width : 24px !important; + max-height : 24px !important; + padding : 0 !important; + background-color : #fff !important; + color : #a5a5a5 !important; + border : 0 !important; + + .MuiButton-root { + width : 24px !important; + min-width : 12px !important; + } + + .MuiSvgIcon-root { + padding-right : 0 !important; + vertical-align : middle; + } + + .MuiButton-label { + padding-left : 4px !important; + } + ` + +const StyledMenuItem = styled(MenuItem)` + color : #666 !important; + .MuiSvgIcon-root { + vertical-align : middle !important; + } + a { + text-decoration : none !important; + color : #666 !important; + } +` diff --git a/src/Components/ContactForm.js b/src/Components/ContactForm.js new file mode 100644 index 0000000000000000000000000000000000000000..3eb206b99c272fd8fcf179c1808f778ecbcd3152 --- /dev/null +++ b/src/Components/ContactForm.js @@ -0,0 +1,296 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, useContext} from 'react' +import {Store} from '../Store.js' +import styled from 'styled-components'; +import FormInput from "../Components/FormInput.js" +import {postRequest} from './HelperFunctions/getAxiosConfig' +import LoginModal from './LoginModal.js' +import Snackbar from '@material-ui/core/Snackbar'; +import SignUpModal from './SignUpModal' +import MuiAlert from '@material-ui/lab/Alert'; + +function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} + +const Button = styled.button` + + background-color: #00acc1; + color:#fff; + font-family: Roboto,sans-serif; + font-size: 14px; + font-weight: 500; + height: 36px; + border-radius: 3px; + padding-left: 16px; + padding-right: 16px; + box-shadow: 0 2px 5px 0 rgba(0,0,0,.26); + outline: none; + position: relative; + cursor: pointer; + min-height: 36px; + min-width: 88px; + line-height: 36px; + vertical-align: middle; + align-items: center; + text-align: center; + border-radius: 3px; + box-sizing: border-box; + user-select: none; + border: 0; + padding: 0 6px; + padding-right: 6px; + padding-left: 6px; + margin: 6px 8px; + + white-space: nowrap; + text-transform: uppercase; + font-weight: 500; + font-size: 14px; + font-style: inherit; + font-variant: inherit; + font-family: inherit; + text-decoration: none; + overflow: hidden; + transition: box-shadow .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1); + + +` + + + + function validateNome (nome) { + let flag = false + if(nome.length === 0) { + flag = true + } + + return flag + } + + + function validateMensagem (mensagem) { + let flag = false + if(mensagem.length === 0) { + flag = true + } + + return flag + } + + function validateEmail (email) { + let flag = false + if (email.split("").filter(x => x === "@").length !== 1 || email.length < 7) { + flag = true + } + return flag + } + + function Formulario (props){ + const {state} = useContext(Store) + const [loginOpen, setLogin] = useState(false) + const [successfulLoginOpen, handleSuccessfulLogin] = useState(false) + const [signUpOpen, setSignUp] = useState(false) + + const [nome, handleNome] = useState( + { + dict : { + key:false, + value:"" + } + }) + const [email, handleEmail] = useState( + { + dict : { + key:false, + value:"" + } + }) + const [mensagem, handleMensagem] = useState( + { + dict : { + key: false, + value:"" + } + }) + + + const preencheNome = (e) => { + const aux2 = e.target.value + const flag = validateNome(aux2) + handleNome({...nome, dict : { + key : flag, + value : e.target.value + }}) + console.log(nome) + } + + const preencheEmail = (e) => { + const aux = e.target.value + const flag = validateEmail(aux) + handleEmail({...email, dict : { + key : flag, + value : e.target.value + }}) + console.log(email) + } + + const preencheMensagem = (e) => { + const msg = e.target.value + console.log(msg) + let flag = validateMensagem(msg) + handleMensagem({...mensagem, dict : { + key : flag, + value : msg + }}) + console.log(mensagem) + } + + const limpaTudo = () => { + + handleNome({ + dict : { + key: false, + value:"" + }} + ); + + handleEmail({ + dict : { + key: false, + value:"" + }} + ) + + handleMensagem({ + dict : { + key: false, + value:"" + }} + ) + + } + + const handleSignUp = () => { + setSignUp(!signUpOpen) + } + + const handleLogin = () => { + setLogin(!loginOpen) + } + + const toggleSnackbar = (event, reason) => { + if (reason === 'clickaway') { + return; + } + + handleSuccessfulLogin(false); + } + + const onSubmit = (e) => { + //on submit we should prevent the page from refreshing + e.preventDefault(); //though this is arguable + console.log(!(nome.dict.key && email.dict.key && mensagem.dict.key )) + // Se não houver erro em nunhum dos campos E nenhum dos campos for vazio: a página faz o contato com o backend e os campos ficam em branco no formulário + if (!(nome.dict.key || email.dict.key || mensagem.dict.key )) { + let payload = { + contact : { + name: nome.dict.value, + email: email.dict.value, + message: mensagem.dict.value + } + } + postRequest(`/contacts`, payload, (data) => {limpaTudo()}, (error) => {console.log(error)}) + } + } + + + + + return( + <React.Fragment> + <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + > + <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert> + </Snackbar> + {/*-------------------------------MODALS---------------------------------------*/} + <LoginModal open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp} + openSnackbar={() => { handleSuccessfulLogin(true) }} + /> + <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} /> + {/*----------------------------------------------------------------------------*/} + + + <form onSubmit={e => onSubmit(e)}> + <FormInput + inputType={"text"} + name={"nome"} + value={nome.dict.value} + placeholder={"Nome *"} + error = {nome.dict.key} + help = {nome.dict.key ? "insira seu nome para o contato " : ""} + handleChange={e => preencheNome(e)} + /> + <br/> + <FormInput + inputType={"text"} + name={"email"} + value={email.dict.value} + placeholder={"E-mail *"} + error = {email.dict.key} + help = {email.dict.key ? "Formato de e-mail incorreto ou vazio, tente : usuario@provedor.com" : ""} + handleChange={e => preencheEmail(e)} + /> + <br/> + <br/> + <FormInput + inputType={"text"} + name={"mensagem"} + value={mensagem.dict.value} + placeholder={"Mensagem *"} + multi = {true} + rows = "5" + rowsMax = "6" + error = {mensagem.dict.key} + help = {mensagem.dict.key ? "Faltou escrever sua mensagem de sugestão, crÃtica ou dúvida." : "Escreva sua mensagem no campo acima."} + handleChange={e => preencheMensagem(e)} + /> + <br/> + <br/> + <div style={{display: "flex", justifyContent: "center"}}> + { + state.currentUser.id !== '' ? ( + <Button onClick={e => onSubmit(e)} >ENVIAR MENSAGEM</Button> + ) + : + ( + <Button onClick={e => {e.preventDefault(); handleLogin(true);}} >ENVIAR MENSAGEM</Button> + ) + } + </div> + </form> + </React.Fragment> + + + ); +} + +export default Formulario; diff --git a/src/Components/CriarColecaoForm.js b/src/Components/CriarColecaoForm.js new file mode 100644 index 0000000000000000000000000000000000000000..ea8c05070f21519b8594a13c03897d69481b2556 --- /dev/null +++ b/src/Components/CriarColecaoForm.js @@ -0,0 +1,200 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useContext} from 'react' +import {Store} from '../Store.js' +import { Button } from '@material-ui/core'; +import styled from 'styled-components' +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import FormControl from '@material-ui/core/FormControl'; +import TextField from '@material-ui/core/TextField'; +import {postRequest} from './HelperFunctions/getAxiosConfig' + +export default function CriarColecaoForm (props) { + const {state} = useContext(Store) + + const [value, setValue] = React.useState(-1); + + /*values are set according to backend complaint id*/ + const [options] = React.useState([ + {value : "pública", text :'Pública (Sua coleção estará disponÃvel para todos)'}, + {value : "privada", text : 'Privada (Somente você poderá visualizar esta coleção)'} + ]) + + const handleChange = (event) => { + setValue(event.target.value); + }; + + const [colName, setColName] = React.useState({ + key : false, + value : "", + }) + + const handleColName = (e) => { + const userInput = e.target.value + + const flag = userInput.length === 0 ? true : false + + setColName({...colName, + key : flag, + value : userInput + }) + } + + function handleSuccess (data) { + props.finalize(data.id) + } + const formSubmit = (e) => { + e.preventDefault() + + // {/*if user didn't select either one, default to privada*/} + const finalRadioValue = value === 'pública' ? 'public' : 'private' + const finalColName = colName + + if(!(finalColName.key)) { + let payload = { + "collection" : { + "name" : finalColName.value, + "owner_id" : state.currentUser.id, + "owner_type" : "User", + "privacy" : finalRadioValue + } + } + postRequest( `/collections/`, payload, handleSuccess, (error) =>{console.log(error)}) + + } + } + + return ( + <form onSubmit={(e) => {formSubmit(e)}} style={{textAlign : "left"}}> + + <StyledTextField + id = {"col-name"} + label={"Nome da coleção"} + type = {"text"} + value = {colName.value} + onChange = {e => handleColName(e)} + error = {colName.key} + + helperText = {colName.key ? <span>O nome é importante para identificar a sua coleção na plataforma.<br/>Ex: Matemática Ensino Médio </span> : ""} + required = {true} + style={{width:"100%"}} + /> + + <span style={{fontSize : "12px", color : "#b3b3b3"}}>Esta coleção é:</span> + + <StyledFormControl component="fieldset"> + <RadioGroup value={value} onChange={handleChange}> + { + options.map(option => + <FormControlLabel key={option.value} value={option.value} control={<Radio color="#673ab7"/>} label={option.text} /> + ) + } + </RadioGroup> + </StyledFormControl> + + <ButtonsDiv> + <ButtonCancelar onClick={props.handleClose}>CANCELAR</ButtonCancelar> + <ButtonEnviar type="submit">CRIAR COLEÇÃO</ButtonEnviar> + </ButtonsDiv> + </form> + ); +} + +export const ButtonsDiv = styled.div` + display : flex; + flex-direction : row; + justify-content : center; + align-items : center; +` + +export const ButtonCancelar = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + height : 36px !important; + padding-left : 16px !important; + padding-right : 16px !important; + font-weight : 500 !important; + border-radius : 3px !important; + color :#666 !important; + background-color: transparent; + min-width : 88px !important; + height : 36px !important; +` + +export const ButtonEnviar = styled(Button)` + background-color : #673ab7 !important; + color : #fff !important; + font-size: 14px !important; + font-weight: 500 !important; + height: 36px !important; + border-radius: 3px !important; + padding-left: 16px !important; + padding-right: 16px !important; + box-shadow: 0 2px 5px 0 rgba(0,0,0,.26) !important; + outline : none !important; + min-width : 88px !important; + vertical-align : middle !important; + margin : 6px 8px !important; + text-decoration : none !important; + + .MuiButton-label { + padding-right : 16px; + padding-left : 16px; + } +` +export const StyledTextField = styled(TextField)` + margin : 18px 0 !important; + + .MuiFormHelperText-root { + text-align : right; + } + + label.Mui-focused { + color : #673ab7; + } + + label.Mui-focused.Mui-error { + color : red; + } + + .MuiInput-underline::after { + border-bottom: 2px solid #673ab7; + } +` + +export const StyledFormControl = styled(FormControl)` + display : block !important; + + .MuiFormControlLabel-root { + color : #666; + } + .MuiIconButton-label { + color : #666; + } + .PrivateRadioButtonIcon-checked { + color : orange; + } + + .MuiTypography-body1 { + font-size : 14px; + } +` diff --git a/src/Components/CriarColecaoModal.js b/src/Components/CriarColecaoModal.js new file mode 100644 index 0000000000000000000000000000000000000000..73e7384fc040f415e947113c26b9ff56544f3d7f --- /dev/null +++ b/src/Components/CriarColecaoModal.js @@ -0,0 +1,133 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import CriarColecaoForm from './CriarColecaoForm.js' +import CloseIcon from '@material-ui/icons/Close'; + +function CloseModalButton (props) { + return ( + <StyledCloseModalButton onClick={props.handleClose}> + <CloseIcon/> + </StyledCloseModalButton> + ) +} + +export default function CriarColecaoModal (props) { + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <Container> + <Header> + <span style={{width:"32px"}}/> + <h2>Criar Coleção</h2> + <CloseModalButton handleClose={props.handleClose}/> + </Header> + <Content style={{paddingTop : "0"}}> + <CriarColecaoForm handleClose={props.handleClose} finalize={props.handleClose}/> + </Content> + </Container> + </Fade> + </StyledModal> + ) +} + +const Content = styled.div` + padding : 20px 30px; + overflow-y: visible; + +` + +const Header = styled.div` + display : flex; + flex-direction : row; + padding : 10px 26px 0 26px; + align-items : center; + justify-content : space-between; + height : 64px; + + h2 { + font-size : 26px; + font-weight : lighter; + color : #666 + } +` + +const StyledCloseModalButton = styled(Button)` + display : inline-block; + position : relative; + float : right !important; + margin-right : -8px !important; + background : transparent !important; + min-width: 0 !important; + width : 40px; +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const Container = styled.div` + box-sizing : border-box; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); + background-color : white; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + padding : 10px; + border-radius : 4px; + + @media screen and (min-width : 96px) { + width : 500px; + } + + @media screen and (max-width : 699px) { + width : 100%; + height : 100%; + } +` diff --git a/src/Components/Cropper.js b/src/Components/Cropper.js new file mode 100644 index 0000000000000000000000000000000000000000..ccccc4c2e57ca23d7b7de6500c630cf052a0a847 --- /dev/null +++ b/src/Components/Cropper.js @@ -0,0 +1,140 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { PureComponent } from 'react'; +import ReactCrop from 'react-image-crop'; +import 'react-image-crop/dist/ReactCrop.css'; + + +export default class Cropper extends PureComponent { + state = { + src: this.props.src, + crop:this.props.crop + }; + + + // If you setState the crop in here you should return false. + onImageLoaded = image => { + this.imageRef = image; + }; + + onCropComplete = crop => { + this.makeClientCrop(crop); + }; + + onCropChange = (crop, percentCrop) => { + // You could also use percentCrop: + // this.setState({ crop: percentCrop }); + this.setState({ crop }); + }; + + async makeClientCrop(crop) { + if (this.imageRef && crop.width && crop.height) { + // eslint-disable-next-line + const croppedImageUrl = await this.getCroppedImg( + this.imageRef, + crop, + 'newFile.jpeg' + ); + + + } + } + + + + getCroppedImg(image, crop, fileName) { + const canvas = document.createElement('canvas'); + const scaleX = image.naturalWidth / image.width; + const scaleY = image.naturalHeight / image.height; + canvas.width = crop.width; + canvas.height = crop.height; + const ctx = canvas.getContext('2d'); + + ctx.drawImage( + image, + crop.x * scaleX, + crop.y * scaleY, + crop.width * scaleX, + crop.height * scaleY, + 0, + 0, + crop.width, + crop.height + ); + const reader = new FileReader(); + canvas.toBlob(blob => { + reader.readAsDataURL(blob) + reader.onloadend = () => { + // {/*this.dataURLtoFile(reader.result, 'cropped.jpg')*/} + this.props.update(reader.result) + } + }) + + } + + render() { + // eslint-disable-next-line + const { crop, croppedImageUrl, src } = this.state; + + return ( + <> + {src && ( + <ReactCrop + src={src} + crop={crop} + circularCrop={this.props.circularCrop} + onImageLoaded={this.onImageLoaded} + onComplete={this.onCropComplete} + onChange={this.onCropChange} + style={{maxHeight : "300px", maxWidth : "100%"}} + /> + )} + {/*croppedImageUrl && ( + <img alt="Crop" style={{ maxWidth: '100%', maxHeight : "100%"}} src={croppedImageUrl} /> + )*/} + </> + ); + } +} + + + + +/*License for this component: +MIT License + +Copyright (c) 2020 ricardo.ch + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.*/ diff --git a/src/Components/Dropdown.js b/src/Components/Dropdown.js index 60624e7f2d2c8cb5e5a55f80a00cacbcc48a67bc..cc064489e05b8550c0b787fc7b15a13fa156a758 100644 --- a/src/Components/Dropdown.js +++ b/src/Components/Dropdown.js @@ -1,59 +1,62 @@ -/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre -Departamento de Informatica - Universidade Federal do Parana - -This file is part of Plataforma Integrada MEC. - -Plataforma Integrada MEC is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Plataforma Integrada MEC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ - -import React, { useState, useRef, useEffect, useContext } from 'react' -import { Link } from 'react-router-dom' -import { Button, Grow, Paper, Popper, MenuItem, MenuList } from '@material-ui/core'; -import { withStyles } from '@material-ui/styles'; -import styled from 'styled-components' +// /*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +// Departamento de Informatica - Universidade Federal do Parana + +// This file is part of Plataforma Integrada MEC. + +// Plataforma Integrada MEC is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Plataforma Integrada MEC is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. + +// You should have received a copy of the GNU Affero General Public License +// along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import Popper from '@material-ui/core/Popper'; +import Button from '@material-ui/core/Button'; +import Fade from '@material-ui/core/Fade'; +import Paper from '@material-ui/core/Paper'; +import { MenuItem, MenuList } from '@material-ui/core/' import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; import { Store } from '../Store'; +import { HashLink as Link } from 'react-router-hash-link'; -const styles = theme => ({ - root: { - display: 'flex', - - }, - paper: { - marginRight: '2px', +const useStyles = makeStyles((theme) => ({ + typography: { + padding: theme.spacing(2), }, -}); +})); + +export default function PositionedPopper(props) { + const [anchorEl, setAnchorEl] = React.useState(null); + const [open, setOpen] = React.useState(false); + const [placement, setPlacement] = React.useState(); + const classes = useStyles(); + const { state, dispatch } = React.useContext(Store) + const innerDropdown = React.useRef(null) + + const handleClick = (newPlacement) => (event) => { + if (state.searchOpen) + dispatch({ + type: 'HANDLE_SEARCH_BAR', + opened: false + }) + setAnchorEl(event.currentTarget); + setOpen((prev) => placement !== newPlacement || !prev); + setPlacement(newPlacement); + }; -const DropdownStyled = styled.div` - *{ - margin: 0 !important; - text-decoration: none; - } - Button{ - text-transform: capitalize; + const handleItemClicked = () => { + setOpen(false) } -` - - -function Dropdown(props) { - const [open, setOpen] = useState(false); - - const innerDropdown = useRef(null) - - const { state , dispatch } = useContext(Store) - - useEffect(()=>{ + useEffect(() => { const handleClickOutside = (event) => { innerDropdown.current && !innerDropdown.current.contains(event.target) && setOpen(false) } @@ -62,50 +65,34 @@ function Dropdown(props) { return () => document.removeEventListener('mousedown', handleClickOutside) - },[]) - - - const handleToggle = () => { - setOpen(true) - if(state.searchOpen) - dispatch({ - type: 'HANDLE_SEARCH_BAR', - opened: false - }) - } + }, []) return ( - <DropdownStyled ref={innerDropdown}> + <div className={classes.root}> + <Popper open={open} anchorEl={anchorEl} placement="bottom" transition ref={innerDropdown}> + {({ TransitionProps }) => ( + <Fade {...TransitionProps} timeout={350}> + <Paper> + <MenuList> + { + props.items.map((item) => + <Link onClick={handleItemClicked} style={{ textDecoration: "none", color: "black" }} key={`${item.name}_${new Date().toString()}`} to={item.href} ><MenuItem>{item.name}</MenuItem></Link> + ) + } + </MenuList> + </Paper> + </Fade> + )} + </Popper> <Button + style={{ textTransform: "none", fontSize: "14px" }} aria-controls="menu-list-grow" aria-haspopup="true" - onClick={handleToggle} + onClick={handleClick('bottom')} > {props.name} - <ExpandMoreIcon/> + <ExpandMoreIcon /> </Button> - { open && - <Popper open={open} keepMounted transition disablePortal> - {({ TransitionProps, placement }) => ( - <Grow - {...TransitionProps} - style={{ transformOrigin: placement === 'bottom' ? 'center top' : 'center bottom' }} - > - <Paper id="menu-list-grow"> - <MenuList> - { - props.items.map((item)=> - <Link key={item.name} to={item.href} ><MenuItem>{item.name}</MenuItem></Link> - ) - } - </MenuList> - </Paper> - </Grow> - )} - </Popper> - } - </DropdownStyled> + </div> ); -} - -export default withStyles(styles)(Dropdown) +} \ No newline at end of file diff --git a/src/Components/EcFooter.js b/src/Components/EcFooter.js index 29d075706fac3c7dd8716f149083e0297439ced1..eca582f2730cc230d7554d97acbda3afcfac95f5 100644 --- a/src/Components/EcFooter.js +++ b/src/Components/EcFooter.js @@ -16,56 +16,65 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; -import {Row, Col, Container} from 'react-grid-system'; +import React, { Component } from 'react'; +import { Row, Col, Container } from 'react-grid-system'; import eduConectada from '../img/educa-conectada.png'; +import styled from 'styled-components'; +import { HashLink as Link } from 'react-router-hash-link'; -const blueFooter={ - backgroundColor: "#00bcd4", - color: "white", - display: "block", - paddingTop: "2em", - paddingBottom: "2em", - verticalAlign: "bottom" -} -const listStyle={ +const BlueFooter = styled.div` + background-color : #00bcd4; + color : white; + display : block; + padding-top : 2em; + @media screen and (min-width : 502px) { + padding-bottom : 2em; + } +` + + +const listStyle = { listStyleType: "none", fontSize: "80%", padding: "0", lineHeight: "1.6", } +const WhiteLink = styled(Link)` + text-decoration: none; + color: white; +` -class EcFooter extends Component{ - render(){ - return( - <div style={blueFooter}> +class EcFooter extends Component { + render() { + return ( + <BlueFooter> <Container> - <Row> - <Col md={4} sm={5} xs={5}> - <h4>Sobre</h4> - <ul style={listStyle}> - <li> <a href="#sobre">Sobre a Plataforma</a> </li> - <li> <a href="#parceiros">Portais Parceiros</a> </li> - <li> <a href="#termos-de-uso">Termos de Uso</a> </li> - <li> <a href="#contato">Contato</a> </li> - </ul> - </Col> - <Col md={4} sm={5} xs={5}> - <h4>Ajuda</h4> - <ul style={listStyle}> - <li> <a href="#ajuda">Central de Ajuda</a> </li> - <li> <a href="#publicar">Publicando Recursos</a> </li> - <li> <a href="#busca">Encontrando Recursos</a> </li> - <li> <a href="#rede">Participando da Rede</a> </li> - <li> <a href="#conta">Gerenciando a Conta</a> </li> - </ul> - </Col> - <Col md={4} sm={12} xs={12}> - <img src={eduConectada} height="50%" alt="logo educação conectada"/> - </Col> - </Row> + <Row> + <Col md={4} sm={6} xs={6} style={window.innerWidth < 502 && { textAlign: "center" }}> + <h4>Sobre</h4> + <ul style={listStyle}> + <li> <WhiteLink to="/sobre">Sobre a Plataforma</WhiteLink> </li> + <li> <WhiteLink to="/sobre#portaisparceiros">Portais Parceiros</WhiteLink> </li> + <li> <WhiteLink to="/termos">Termos de Uso</WhiteLink> </li> + <li> <WhiteLink to="/contato">Contato</WhiteLink> </li> + </ul> + </Col> + <Col md={4} sm={6} xs={6} style={window.innerWidth < 502 && { textAlign: "center" }}> + <h4>Ajuda</h4> + <ul style={listStyle}> + <li> <WhiteLink to="/ajuda">Central de Ajuda</WhiteLink> </li> + <li> <WhiteLink to="/publicando-recurso">Publicando Recursos</WhiteLink> </li> + <li> <WhiteLink to="/encontrando-recurso">Encontrando Recursos</WhiteLink> </li> + <li> <WhiteLink to="/participando-da-rede">Participando da Rede</WhiteLink> </li> + <li> <WhiteLink to="/gerenciando-conta">Gerenciando a Conta</WhiteLink> </li> + </ul> + </Col> + <Col md={4} sm={12} xs={12} style={window.innerWidth < 502 && { textAlign: "center" }}> + <img src={eduConectada} height="50%" alt="logo educação conectada" /> + </Col> + </Row> </Container> - </div> + </BlueFooter> ) } } diff --git a/src/Components/EditarColecaoForm.js b/src/Components/EditarColecaoForm.js new file mode 100644 index 0000000000000000000000000000000000000000..f0ea1fdc47f91ce1c68b2a70d2684ad0443707ee --- /dev/null +++ b/src/Components/EditarColecaoForm.js @@ -0,0 +1,222 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, useContext, useEffect} from 'react' +import {Store} from '../Store.js' +import { Button } from '@material-ui/core'; +import styled from 'styled-components' +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import FormControl from '@material-ui/core/FormControl'; +import TextField from '@material-ui/core/TextField'; +import {getRequest, putRequest} from './HelperFunctions/getAxiosConfig' + +export default function EditarColecaoForm (props) { + const {state} = useContext(Store) + + function handleSuccessfulGet (data) { + setColName({key : false, value : data.name}) + setValue( data.privacy === 'public' ? 'pública' : 'privada') + handleColDescription(data.description) + } + + useEffect(() => { + getRequest(`/collections/${props.id}`, handleSuccessfulGet, (error) => {console.log(error)}) + }, []) + + const [value, setValue] = useState(-1); + + /*values are set according to backend complaint id*/ + const options = [ + {value : "pública", text :'Pública (Sua coleção estará disponÃvel para todos)'}, + {value : "privada", text : 'Privada (Somente você poderá visualizar esta coleção)'} + ] + + const handleChange = (event) => { + setValue(event.target.value); + }; + + const [colName, setColName] = useState({ + key : false, + value : "", + }) + + const handleColName = (e) => { + const userInput = e.target.value + + const flag = userInput.length === 0 ? true : false + + setColName({...colName, + key : flag, + value : userInput + }) + } + + function handleSuccessfulSubmit (data) { + props.finalize(data.name, data.privacy) + } + const formSubmit = (e) => { + e.preventDefault() + + // {/*if user didn't select either one, default to privada*/} + const finalRadioValue = value === 'pública' ? 'public' : 'private' + const finalColName = colName + + if(!(finalColName.key)) { + let payload = { + "collection" : { + "name" : finalColName.value, + "owner_id" : state.currentUser.id, + "owner_type" : "User", + "privacy" : finalRadioValue + } + } + + putRequest(`/collections/${props.id}/`, payload, handleSuccessfulSubmit, (error) =>{console.log(error)}) + } + } + + const [colDescription, handleColDescription] = useState("") + const setColDescription = (e) => {handleColDescription(e.target.value)} + + return ( + <form onSubmit={(e) => {formSubmit(e)}} style={{textAlign : "left"}}> + + <StyledTextField + id = {"col-name"} + label={"Nome"} + type = {"text"} + value = {colName.value} + onChange = {e => handleColName(e)} + error = {colName.key} + required = {true} + style={{width:"100%"}} + /> + + <StyledTextField + id = {"col-description"} + label={"Descrição"} + type = {"text"} + value = {colDescription} + multiline + rows={5} + onChange = {e => setColDescription(e)} + style={{width:"100%"}} + /> + + <span style={{fontSize : "12px", color : "#b3b3b3"}}>Esta coleção é:</span> + <StyledFormControl component="fieldset"> + <RadioGroup value={value} onChange={handleChange}> + { + options.map(option => + <FormControlLabel key={option.value} value={option.value} control={<Radio color="#673ab7"/>} label={option.text} /> + ) + } + </RadioGroup> + </StyledFormControl> + + + <ButtonsDiv> + <ButtonCancelar onClick={props.handleClose}>CANCELAR</ButtonCancelar> + <ButtonEnviar type="submit">SALVAR</ButtonEnviar> + </ButtonsDiv> + </form> + ); +} + +export const ButtonsDiv = styled.div` + display : flex; + flex-direction : row; + justify-content : center; + align-items : center; +` + +export const ButtonCancelar = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + height : 36px !important; + padding-left : 16px !important; + padding-right : 16px !important; + font-weight : 500 !important; + border-radius : 3px !important; + color :#666 !important; + background-color: transparent; + min-width : 88px !important; + height : 36px !important; +` + +export const ButtonEnviar = styled(Button)` + background-color : #673ab7 !important; + color : #fff !important; + font-size: 14px !important; + font-weight: 500 !important; + height: 36px !important; + border-radius: 3px !important; + padding-left: 16px !important; + padding-right: 16px !important; + box-shadow: 0 2px 5px 0 rgba(0,0,0,.26) !important; + outline : none !important; + min-width : 88px !important; + vertical-align : middle !important; + margin : 6px 8px !important; + text-decoration : none !important; + + .MuiButton-label { + padding-right : 16px; + padding-left : 16px; + } +` +export const StyledTextField = styled(TextField)` + margin : 18px 0 !important; + + .MuiFormHelperText-root { + text-align : right; + } + + label.Mui-focused { + color : #673ab7; + } + + label.Mui-focused.Mui-error { + color : red; + } + + .MuiInput-underline::after { + border-bottom: 2px solid #673ab7; + } +` + +export const StyledFormControl = styled(FormControl)` + display : block !important; + + .MuiFormControlLabel-root { + color : #666; + } + .MuiIconButton-label { + color : #666; + } + .PrivateRadioButtonIcon-checked { + color : orange; + } + + .MuiTypography-body1 { + font-size : 14px; + } +` diff --git a/src/Components/ExpandedMaterials.js b/src/Components/ExpandedMaterials.js new file mode 100644 index 0000000000000000000000000000000000000000..603ec4ed4f8053d3c72d8ed36527fec9cb221bc9 --- /dev/null +++ b/src/Components/ExpandedMaterials.js @@ -0,0 +1,129 @@ +import React from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import styled from 'styled-components'; +import Chip from '@material-ui/core/Chip'; +import Grid from '@material-ui/core/Grid'; +import Button from '@material-ui/core/Button'; +import TopicCard from './TopicCard'; +import Paper from '@material-ui/core/Paper'; +import Library from '@material-ui/icons/LibraryBooks'; +import { Link } from 'react-router-dom'; + +const useStyles = makeStyles((theme) => ({ + root: { + display: 'flex', + flexWrap: 'wrap', + '& > *': { + margin: theme.spacing(0.5), + }, + }, +})); + +const ExpandedMaterial = (props) => { + const material = { ...props.material }; + const classes = useStyles(); + + return ( + <Paper elevation={3} style={{ backgroundColor: "#444444", padding: "20px" }}> + <Grid container direction="row" spacing={2}> + <Grid item direction="column" xs={12} md={4}> + <Grid item> + <Title variant="body2"> + { + material.name + } + </Title> + </Grid> + <SizedHeightBox /> + <Grid item> + <ChipsDiv className={classes.root}> + { + material.tags.map((tag, index) => { + return ( + <Chip color="default" label={tag.name} key={index} style={{ padding: "0.5px" }} /> + ) + }) + } + </ChipsDiv> + </Grid> + <SizedHeightBox2 /> + <Grid item direction="column" style={{ color: '#E5E7E9', fontWeight: "500" }}> + <DevelopedByDiv> + { + `Desenvolvido por: ${material.developed}` + } + </DevelopedByDiv> + <SizedHeightBox3 /> + <StyledLink to={`/colecao?colecao=${material.id}`}> + <Button variant="contained" color="secondary"> + Ver todos + </Button> + </StyledLink> + </Grid> + </Grid> + <Grid item direction="column" xs={12} md={8}> + <Grid container direction="row"> + <Library style={{ color: "White" }} /> + <SizedWidthBox /> + <Title> + {material.topics.length} módulos + </Title> + </Grid> + <SizedHeightBox /> + <Grid container direction="row" justify="center" alignItems="center" spacing={3}> + <Grid item md={4}> + <TopicCard + topic={material.topics[0]} + colecao_id={material.id} + /> + </Grid> + <Grid item md={4}> + <TopicCard + topic={material.topics[1]} + colecao_id={material.id} + /> + </Grid> + <Grid item md={4}> + <TopicCard + topic={material.topics[2]} + colecao_id={material.id} + /> + </Grid> + </Grid> + </Grid> + </Grid> + </Paper> + ); +} + +const Title = styled.h3` + color: White; + font-weight: 500; + padding : 0; + margin : 0; +` +const DevelopedByDiv = styled.div` +` + +const ChipsDiv = styled.div` + margin-left : -5px; +` +const SizedHeightBox = styled.div` + height : 3em; +` +const SizedHeightBox2 = styled.div` + height : 2em; +` +const SizedHeightBox3 = styled.div` + height : 0.5em; +` +const SizedWidthBox = styled.div` + width : 5px; +` +const StyledLink = styled(Link)` + text-decoration: none !important; + color: inherit !important; +` + + +export default ExpandedMaterial; \ No newline at end of file diff --git a/src/Components/ExpansionPanels.js b/src/Components/ExpansionPanels.js index 415e8a0e0fdb9f77f8078a02051552a12fffba78..017816eb2c4160545b7b9597c206a28eec9b3b1d 100644 --- a/src/Components/ExpansionPanels.js +++ b/src/Components/ExpansionPanels.js @@ -17,18 +17,14 @@ You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; +import React from 'react'; import ExpansionPanel from '@material-ui/core/ExpansionPanel'; import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'; import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'; import Typography from '@material-ui/core/Typography'; -import { Link } from 'react-router-dom' import Grid from '@material-ui/core/Grid'; -import AddIcon from '@material-ui/icons/Add'; -import RemoveIcon from '@material-ui/icons/Remove'; import styled from 'styled-components'; -import { makeStyles } from '@material-ui/styles'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; @@ -80,7 +76,7 @@ export default function SimpleExpansionPanel() { <div > <ExpansionPanelTeste> <ExpansionPanelSummaryColorido - expandIcon=<ExpandMoreIcon/> + expandIcon={<ExpandMoreIcon/>} aria-controls="panel1a-content" id="panel1a-header" > @@ -186,7 +182,7 @@ export default function SimpleExpansionPanel() { <h6 style={{fontSize:"18px",marginBlock: "10px"}}>3.2 É vedado ao usuário:</h6> <ul> <li> - <p>Transmitir, exibir, enviar, ou de qualquer outra forma, disponibilizar conteúdo que contenha material pornográfico e/ou atividades ilegais relativas a menores de 18 anos (consoante o <AColorido href="http://www.planalto.gov.br/ccivil_03/leis/L8069.htm" target="_blank">Estatuto da Criança e do Adolescente</AColorido>), que invada a privacidade de terceiros, que tenha cunho comercial, viole os <AColorido href="http://www.onu.org.br/img/2014/09/DUDH.pdf" target="_blank">Direitos Humanos</AColorido> ou seja ilegal, ofensivo, ameaçador, que incite a violência, seja vulgar, preconceituoso ou racista (como descrito nos artigos 138-140 do Código Penal Brasileiro), ou de qualquer forma seja contrário à s cláusulas destes Termos de Uso;</p> + <p>Transmitir, exibir, enviar, ou de qualquer outra forma, disponibilizar conteúdo que contenha material pornográfico e/ou atividades ilegais relativas a menores de 18 anos (consoante o <AColorido href="http://www.planalto.gov.br/ccivil_03/leis/L8069.htm" target="_blank">Estatuto da Criança e do Adolescente</AColorido>), que invada a privacidade de terceiros, que tenha cunho comercial, viole os <AColorido href="https://www.ohchr.org/EN/UDHR/Pages/Language.aspx?LangID=por" target="_blank">Direitos Humanos</AColorido> ou seja ilegal, ofensivo, ameaçador, que incite a violência, seja vulgar, preconceituoso ou racista (como descrito nos artigos 138-140 do Código Penal Brasileiro), ou de qualquer forma seja contrário à s cláusulas destes Termos de Uso;</p> </li> <li> <p>Assumir a identidade de outra pessoa, fÃsica ou jurÃdica; forjar cabeçalhos, ou de qualquer outra forma manipular identificadores, a fim de disfarçar a origem de qualquer material contido na plataforma, com sentido de desmoralizar, desprestigiar ou se fazer passar pela <strong>Plataforma Integrada de RED do MEC</strong>;</p> @@ -458,7 +454,7 @@ export default function SimpleExpansionPanel() { <Grid item xs={12} md={4}> <div style={{color:"#00BCD4",fontSize:"18px"}}> <p>BASICAMENTE,</p> - <p>O usuário poderá reportar,
utilizando a funcionalidade “Reportar†ou pelo formulário de “Contatoâ€, qualquer tipo de conteúdo publicado na Plataforma MEC RED que viole os direitos dos usuários, de terceiros ou a legislação aplicável.</p> + <p>O usuário poderá reportar,utilizando a funcionalidade “Reportar†ou pelo formulário de “Contatoâ€, qualquer tipo de conteúdo publicado na Plataforma MEC RED que viole os direitos dos usuários, de terceiros ou a legislação aplicável.</p> </div> </Grid> </Grid> diff --git a/src/Components/Firulas.js b/src/Components/Firulas.js new file mode 100644 index 0000000000000000000000000000000000000000..6a368a11cf553166280ec8d85dd9ede03562e781 --- /dev/null +++ b/src/Components/Firulas.js @@ -0,0 +1,45 @@ +import React, {useState} from 'react' +import styled from 'styled-components' +import Rating from '@material-ui/lab/Rating'; +import StarBorderIcon from '@material-ui/icons/StarBorder'; +import {LikeCounter, ButtonNoWidth} from '../Components/ResourceCardFunction.js' +import FavoriteIcon from '@material-ui/icons/Favorite'; +import {putRequest} from './HelperFunctions/getAxiosConfig' + +export default function Firulas (props) { + const [liked, setLiked] = useState(props.liked) + + function handleSuccess (data) { + setLiked(!liked) + } + const handleLike = () => { + putRequest(`/learning_objects/${props.recursoId}/like/`, {}, handleSuccess, (error) => {console.log(error)}) + } + + return ( + <ConteinerFirulas> + <Rating + name="customized-empty" + value={props.rating*10} + precision={0.5} + readOnly + style={{color:"#666", marginRight : "20px"}} + emptyIcon={<StarBorderIcon fontSize="inherit" />} + /> + <LikeCounter style={{marginLeft : "-3px", display : "flex", alignItems : "center"}}> + <span>{props.likesCount}</span> + + <ButtonNoWidth onClick={handleLike}> + <FavoriteIcon style={{color : liked ? "red" : "#666" }}/> + </ButtonNoWidth> + + </LikeCounter> + </ConteinerFirulas> + ) +} + +const ConteinerFirulas = styled.div` + margin-bottom : 30px; + display : inline-flex; + padding-bottom : 10px; +` diff --git a/src/Components/FloatingDownloadButton.js b/src/Components/FloatingDownloadButton.js new file mode 100644 index 0000000000000000000000000000000000000000..96537210b046c1d0fc841ec4016e16c52e12c3c1 --- /dev/null +++ b/src/Components/FloatingDownloadButton.js @@ -0,0 +1,70 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState } from 'react'; +import styled from 'styled-components'; +import GetAppIcon from '@material-ui/icons/GetApp'; +import Fab from '@material-ui/core/Fab'; +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; + +function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} + +export default function FloatingDownloadButton (props) { + const [snackbar, setSnackbar] = useState(false); + + const handleClickDownload = () => { + if (props.empty_selection) + setSnackbar(true); + } + + const handleClose = () => { + setSnackbar(false); + } + + return ( + <div> + <DownloadAnchor href={props.url} alt="Baixar recursos selecionados"> + <FloatingDownload + color="primary" + aria-label="download" + onClick={handleClickDownload} + > + <GetAppIcon /> + </FloatingDownload> + </DownloadAnchor> + <Snackbar open={snackbar} autoHideDuration={6000} onClose={handleClose}> + <Alert onClose={handleClose} severity="alert"> + Selecione recursos para poder baixar + </Alert> + </Snackbar> + </div> + ); +} + +const DownloadAnchor=styled.a` + text-decoration: none !important; +` + +const FloatingDownload=styled(Fab)` + position: fixed !important; + right: 15px !important; + bottom: 25px !important; +` diff --git a/src/Components/FollowCollectionButton.js b/src/Components/FollowCollectionButton.js new file mode 100644 index 0000000000000000000000000000000000000000..974a56fd3492cf7440b46679794fb061ea237e7a --- /dev/null +++ b/src/Components/FollowCollectionButton.js @@ -0,0 +1,257 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from 'react'; +import Button from '@material-ui/core/Button'; +import CheckIcon from '@material-ui/icons/Check'; +import AddIcon from '@material-ui/icons/Add'; +import styled from 'styled-components'; +import SignUpModal from './SignUpModal.js'; +import LoginModal from './LoginModal'; +import SnackBarComponent from './SnackbarComponent'; +import { getRequest, putRequest } from './HelperFunctions/getAxiosConfig' +import { Store } from '../Store' + +export default function FollowCollectionButton(props) { + const { state } = useContext(Store) + const [icon, setIcon] = useState(<AddIcon fontSize="large" />); + const [button_text, setButtonText] = useState("Seguir Coleção"); + const [variant, setVariant] = useState("outlined"); + const [sign_up_open, setSignUpOpen] = useState(false); + const [open_login, setOpenLogin] = useState(false); + const [snackInfo, setSnackInfo] = useState({ + open: false, + text: '', + severity: '', + color: '' + }); + const [following, setFollowing] = useState(false); //user following collection + + function handleSuccessGet(data) { + if (!data.errors) + data.map((e) => { + if (e["followable"]["id"] === Number(props.collection_id)) { + setVariant("contained"); + setButtonText("Seguindo"); + setIcon(<CheckIcon fontSize="large" />) + setFollowing(true); + } + return undefined + }) + else { + const info = { + open: true, + text: 'Falha ao verificar se o usuário segue a coleção!', + severity: 'error', + color: 'red' + } + + handleSnackInfo(info) + } + } + useEffect(() => { + if (state.currentUser.id) { + const url = `/users/${props.user_id}/following/Collection` + getRequest( + url, + handleSuccessGet, + (error) => { + const info = { + open: true, + text: 'Falha ao verificar se o usuário segue a coleção!', + severity: 'error', + color: 'red' + } + handleSnackInfo(info) + }) + } + else { + setIcon(<AddIcon fontSize="large" />) + setButtonText("Seguir Coleção") + setVariant("outlined") + setFollowing(false) + } + }, [state.currentUser.id]); + + //handleMouse{Enter, Leave} only do anything when user follows given collection: + const handleMouseEnter = () => { + if (following) { + setVariant("outlined"); + setButtonText("Deixar de seguir"); + setIcon(null); + } + } + + const handleMouseLeave = () => { + if (following) { + setVariant("contained"); + setButtonText("Seguindo"); + setIcon(<CheckIcon fontSize="large" />); + } + } + + function handleOpenSnackSignIn() { + const info = { + open: true, + text: 'Você foi logado com sucesso!', + severity: 'success', + color: '', + } + + handleSnackInfo(info) + } + + function handleCloseSnack() { + setSnackInfo({ + open: false, + text: '', + severity: '', + color: '', + }) + } + + function handleSnackInfo(info) { + setSnackInfo({ + ...info + }) + } + + function handleOpenLogin() { + setOpenLogin(true) + } + + function handleOpenSignUp() { + setSignUpOpen(true) + } + + function handleSuccessfulFollow(data) { + if (data.errors) { + setVariant("contained"); + handleFailFollow() + } + else { + const info = { + open: true, + text: 'Sucesso ao seguir a coleção!', + severity: 'success', + color: 'green' + } + handleSnackInfo(info) + setVariant("contained"); + setButtonText("Seguindo"); + setIcon(<CheckIcon fontSize="large" />) + setFollowing(true); + } + } + + function handleFailFollow(err) { + const info = { + open: true, + text: 'Falha ao seguir coleção', + severity: 'fail', + color: 'red', + } + handleSnackInfo(info) + } + + function handleSuccessfulUnfollow(data) { + if (data.errors) + handleFailUnfollow() + else { + const info = { + open: true, + text: 'Sucesso ao deixar de seguir a coleção!', + severity: 'success', + color: 'green' + } + handleSnackInfo(info) + setVariant("outlined"); + setButtonText("Seguir Coleção"); + setIcon(<AddIcon fontSize="large" />); + setFollowing(false); + } + } + + function handleFailUnfollow(err) { + const info = { + open: true, + text: 'Falha ao deixar de seguir coleção', + severity: 'error', + color: 'red', + } + handleSnackInfo(info) + } + + const handleClick = () => { + const url = `/collections/${props.collection_id}/follow` + + if (!props.user_id) + setSignUpOpen(true); + else if (!following) { + putRequest(url, {}, handleSuccessfulFollow, handleFailFollow) + } else { + putRequest(url, {}, handleSuccessfulUnfollow, handleFailUnfollow) + } + }; + + if (!props.user_is_owner) + return ( + <div> + <SnackBarComponent + snackbarOpen={snackInfo.open} + handleClose={handleCloseSnack} + severity={snackInfo.severity} + text={snackInfo.text} + color={snackInfo.color} + /> + <FollowButton + variant={variant} + color="primary" + startIcon={icon} + size="small" + onMouseEnter={handleMouseEnter} + onMouseLeave={handleMouseLeave} + onClick={handleClick} + > + <ButtonText>{button_text}</ButtonText> + </FollowButton> + <SignUpModal + open={sign_up_open} + handleClose={() => setSignUpOpen(false)} + openLogin={handleOpenLogin} + /> + <LoginModal + openSnackbar={handleOpenSnackSignIn} + open={open_login} + handleClose={() => setOpenLogin(false)} + openSignUp={handleOpenSignUp} + /> + </div> + ); + else return (<div></div>); +} + +const ButtonText = styled.span` + font-weight: bolder; + font-size: 1.2em; +` +const FollowButton = styled(Button)` + padding-left: 10; + padding-right: 10; + width: 250px; +` diff --git a/src/Components/FormInput.js b/src/Components/FormInput.js index 2a5a600c3df0615fc212f9de9870c4e2bed65bf9..813877ed5261daf1e1723771ab71b77b07d0696d 100644 --- a/src/Components/FormInput.js +++ b/src/Components/FormInput.js @@ -16,16 +16,10 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React from 'react'; -import {makeStyles} from '@material-ui/styles'; -import styled from 'styled-components' -import TextField from '@material-ui/core/TextField'; - -const FormContainerStyled = styled.form` - display: flex; - flex-wrap : wrap; - padding : 2px; -` +import React from "react"; +import { makeStyles } from "@material-ui/styles"; +import styled from "styled-components"; +import TextField from "@material-ui/core/TextField"; const StyledTextField = styled(TextField)` max-width: 100%; @@ -34,32 +28,41 @@ const StyledTextField = styled(TextField)` color : inherit; width : 100% !important; full-width : 100% !important; + + label.Mui-focused { + color : #00bcd4; + } + + label.Mui-focused.Mui-error { + color : red; + } + + .MuiInput-underline::after { + border-bottom: 2px solid #00bcd4; + } ` const useStyles = makeStyles(theme => ({ container: { - display: 'flex', - flexWrap: 'wrap', - padding: '2px', + display: "flex", + flexWrap: "wrap", + padding: "2px" }, textField: { - - maxWidth: '100%', - fontSize : '15px', - fontWeight : 'lighter', - color : 'inherit', - width : '100%', - }, + maxWidth: "100%", + fontSize: "15px", + fontWeight: "lighter", + color: "inherit", + width: "100%" + } })); export default function FormInput(props) { const classes = useStyles(); return ( - <FormContainerStyled noValidate autoComplete="off"> <StyledTextField - id="standard-basic" label={props.placeholder} margin="normal" id = {props.name} @@ -67,10 +70,15 @@ export default function FormInput(props) { type = {props.inputType} value = {props.value} onChange = {props.handleChange} + rows = {props.rows} + error = {props.error} + rowsMax = {props.rowsMax} InputProps={{className: classes.input}} + required = {props.required} + helperText ={props.help} style={{width:"100%"}} + mask={props.mask} + multiline={props.multi} /> - - </FormContainerStyled> ); } diff --git a/src/Components/FormationMaterialDescription.js b/src/Components/FormationMaterialDescription.js new file mode 100644 index 0000000000000000000000000000000000000000..5771aef3448785bc86fc45db7f65a3a10e353bdc --- /dev/null +++ b/src/Components/FormationMaterialDescription.js @@ -0,0 +1,205 @@ +import React from 'react'; +import styled from 'styled-components' + +import Grid from '@material-ui/core/Grid'; + +import Card from '@material-ui/core/Card'; + +import MoveToInboxIcon from '@material-ui/icons/MoveToInbox'; +import LibraryBooksIcon from '@material-ui/icons/LibraryBooks'; +import TranslateIcon from '@material-ui/icons/Translate'; + +export default function FormationMaterialDescription(props) { + /* props + * + * colecao: boolean + * colecao_obj: object + * topico_obj: object + * + */ + const colecao = props.colecao; + const colecao_obj = props.colecao_obj; + const topico_obj = props.topico_obj; + + return ( + <WrappingCard> + <Grid container + direction="row" + justify="flex-start" + alignItems="center" + > + <Grid item xs={12} md={8}> + <TextContainer> + <Title> + {colecao ? + "Sobre o Material" + : "Resumo do " + props.colecao_obj.topic_name.slice(0, -1) + } + </Title> + <Description> + {colecao ? + colecao_obj.description + : topico_obj.description + } + </Description> + {colecao ? + <SubTitle>Histórico do Curso</SubTitle> + : <Strong>Autoria (autores):</Strong> + } + <Description> + {colecao ? + colecao_obj.historic + : topico_obj.author + } + </Description> + </TextContainer> + </Grid> + <Grid item xs={12} md={3}> + <IconList> + <IconItem> + <LibraryBooksIcon /> + <Strong>Tipo de recurso: </Strong> + Material de Formação + <br /> + </IconItem> + + <IconItem> + <MoveToInboxIcon /> + <Strong>Ano de publicação: </Strong> + {colecao ? + colecao_obj.created_at.split('-')[0] + : topico_obj.created_at.split('-')[0] + } + <br /> + </IconItem> + + {[0, 1, 2].map(i => { + const content = colecao ? + (colecao_obj.language[i] ? + colecao_obj.language[i].name + : '') + : (topico_obj.language[i] ? + topico_obj.language[i].name + : '') + return ( + <IconItem> + <TranslateIcon /> + <Strong>Idioma: </Strong> + {content} + <br /> + </IconItem> + ); + })} + + <IconItem> + <Strong>{colecao ? "Criado" : "Enviado"} por:</Strong> + <br /> + <StyledAnchor href={colecao_obj.developedurl}> + { + colecao_obj.id === 3 ? <LongUserIcon src={require("../img/logo_parceiros/ic_peninsula.png")} /> + : <div> + <UserIcon src={require("../img/logo_parceiros/ic_nute.png")} /> + <Red> + {colecao_obj.developed} + </Red> + </div> + } + </StyledAnchor> + </IconItem> + </IconList> + </Grid> + </Grid> + </WrappingCard> + ); +} + +const Title = styled.h1` + font-weight: 100; + color: rgb(102, 102, 102); +` +const SubTitle = styled.h3` + font-weight: 900; + padding-top: 10px; + color: rgb(102, 102, 102); +` +const UserIcon = styled.img` + width: 50px; + height: 50px; + border-radius: 100px; + margin: 10px 5px 10px 10px; +` +const LongUserIcon = styled.img` + width: 90px; + margin: 10px; +` +const Description = styled.p` + color: #666; +` +const TextContainer = styled.div` + margin: 15px; + height: 100%; + @media screen and (max-width: 768px) { + border-bottom: solid 1px #e5e5e5; + padding : 0 0 10px 0 + } + @media screen and (max-width: 990px) { + border-bottom: solid 1px #e5e5e5; + padding : 0 0 10px 0 + } + @media screen and (min-width: 992px) { + border-right: solid 1px #e5e5e5; + padding : 0 15px 0 0 + + } + @media screen and (min-width: 1200px) { + border-right: solid 1px #e5e5e5; + padding : 0 15px 0 0 + } +` + +const WrappingCard = styled(Card)` + border-radius: 0; + margin-right : auto; + margin-left : auto; + margin-bottom: 30px; + + @media screen and (max-width: 768px) { + width : 100% !important; + } + @media screen and (min-width: 992px) { + width : 770px; + } + @media screen and (min-width: 1200px) { + width : 970px !important; + } +` +const IconList = styled.div` + margin: 15px; +` +const IconItem = styled.span` + width: 100%; + display: inline-block; + margin-bottom: 15px; + font-size : 14px; + + .MuiSvgIcon-root { + vertical-align : middle + color: #666; + } + + img { + vertical-align: middle + } + +` +const Strong = styled.span` + font-weight: bold; + color: #666; +` +const Red = styled.span` + color: #e81f4f; +` +const StyledAnchor = styled.a` + text-decoration: none !important; + color: inherit !important; +` diff --git a/src/Components/FormationMaterialHeader.js b/src/Components/FormationMaterialHeader.js new file mode 100644 index 0000000000000000000000000000000000000000..0c49772337828e81ec2ccfb9b045d3cb4f7ef2b9 --- /dev/null +++ b/src/Components/FormationMaterialHeader.js @@ -0,0 +1,151 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; +import Card from '@material-ui/core/Card'; +import Button from '@material-ui/core/Button'; +import Chip from '@material-ui/core/Chip'; +import { makeStyles } from '@material-ui/core/styles'; + +const useStyles = makeStyles((theme) => ({ + root: { + display: 'flex', + flexWrap: 'wrap', + '& > *': { + margin: theme.spacing(0.5), + }, + }, +})); + + +export default function FormationMaterialHeader(props) { + const colecao = props.colecao; + const colecao_obj = props.colecao_obj; + const topico_obj = props.topico_obj; + + const classes = useStyles(); + + const get_title = () => { + return colecao ? + colecao_obj.name + : (topico_obj.pre_title + topico_obj.title); + } + + const get_subtitle = () => { + return colecao ? + colecao_obj.topics.length + ' ' + colecao_obj.topic_name + : colecao_obj.name; + } + + const getThumb = () => { + return colecao ? + require(`../../public/${colecao_obj.img}`) + : require(`../../public/${topico_obj.img}`) + } + + return ( + <WrappingCard> + <Grid container + direction="row" + justify="flex-start" + alignItems="stretch" + > + <Grid item xs={12} lg={5}> + <Img src={getThumb()} /> + </Grid> + <Grid item xs={12} lg={7} + direction="column" + justify="flex-start" + alignItems="stretch" + style={{ padding: "8px 10px" }} + > + <Grid item> + <Title>{get_title()}</Title> + </Grid> + <Grid item> + <SubTitle> + {colecao ? + get_subtitle() + : <StyledLink to={'/colecao?id=' + colecao_obj.id}>{get_subtitle()}</StyledLink>} + </SubTitle> + </Grid> + <Grid item> + <ChipsDiv className={classes.root}> + {colecao_obj.tags.map((t, index) => { + return (<Chip color="default" label={t.name} key={index} style={{ padding: "0.5px" }} />); + })} + </ChipsDiv> + </Grid> + <Grid item> + {colecao ? + <Button + variant="contained" + color="secondary" + style={{ marginLeft: '15px' }} + onClick={props.handleClick} + > + {props.colecao ? "Ver todos os módulos" : "Iniciar leitura"} + </Button> + : + <StyledLink to={'/iframe-colecao?colecao=' + colecao_obj.id + '&topico=' + topico_obj.id}> + <Button + variant="contained" + color="secondary" + style={{ marginLeft: '15px', marginTop: '10px' }} + onClick={props.handleClick} + > + {props.colecao ? "Ver todos os módulos" : "Iniciar leitura"} + </Button> + </StyledLink> + } + </Grid> + </Grid> + </Grid> + </WrappingCard> + ); +} + +const ChipsDiv = styled.div` + margin-bottom: 10px; + width: 100%; + margin-left: 10px; +` +const Img = styled.img` + width: 100%; + height: 100%; + display: block; /* remove extra space below image */ + background-color: #e5e5e5; +` +const Title = styled.h2` + font-weight: 100; + margin: 15px; + color: rgb(102, 102, 102); +` +const SubTitle = styled.h4` + font-weight: 50; + margin: 15px;; + margin-top: 0; + color: rgb(102, 102, 102); +` +export const WrappingCard = styled(Card)` + border-radius: 0; + margin-right : auto; + margin-left : auto; + margin-bottom: 30px; + margin-top: 30px; + + @media screen and (max-width: 768px) { + width : 100% !important; + } + @media screen and (min-width: 992px) { + width : 770px; + } + @media screen and (min-width: 1200px) { + width : 970px !important; + } +` + +const StyledLink = styled(Link)` + text-decoration: none !important; + color: #e81f4f !important; +` diff --git a/src/Components/FormationMaterialsResources/formationMaterials.js b/src/Components/FormationMaterialsResources/formationMaterials.js new file mode 100644 index 0000000000000000000000000000000000000000..7d26d169a48e18f4bc4083b6ef75df96ad7683b2 --- /dev/null +++ b/src/Components/FormationMaterialsResources/formationMaterials.js @@ -0,0 +1,1774 @@ +export default function colecoes_obj() { + var colecoes = []; + + //Curso de Especialização Educação Pobreza e Desigualdade Social// + + var tagnames = ["Desigualdade", "Desigualdade Social", 'Pobreza', 'Educação', 'Coleção', 'EPDS', 'Espaços Escolares', 'CurrÃculo'] + var _tags = []; + for (let i = 0; i < tagnames.length; i++) { + _tags.push({ + name: tagnames[i] + }); + }; + + var topicos = []; + topicos.push({ + id: 0, + pre_title: 'Módulo Introdutório', + title: '', + author: 'Miguel Arroyo', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://sgmd.nute.ufsc.br/content/secadi-formacao-continuada-pbf/intro/index.html', + img: 'img/colecoes/pobreza0.jpg', + tags: _tags, + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Introdutório†do curso “Educação, Pobreza e Desigualdade Social†é explicitada a relação entre a pobreza, + as desigualdades sociais e a educação. São explicitados caminhos para a reflexão e ações problematizadoras sobre as + temáticas apresentadas no contexto da educação, a fim de expor a situação de exclusão social. + O módulo ainda propõe uma discussão que, de um lado, possibilita entender a pobreza para repensar os currÃculos e as práticas educacionais e, de outro, permita cultivar a + sensibilidade para ouvir e incorporar, no exercÃcio docente, as questões que ecoam nas vivências da pobreza. O material foi elaborado para + este curso de Especialização, na modalidade de ensino a distância, tendo em vista seu papel na formação continuada de educadores e agentes + educacionais. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 1, + pre_title: 'Módulo I: ', + title: 'Pobreza e cidadania', + author: 'Walquiria Leão Rego e Alessandro Pinzani', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/mod-1/index.html', + url: 'https://sgmd.nute.ufsc.br/content/secadi-formacao-continuada-pbf/mod-1/index.html', + img: 'img/colecoes/pobreza1.jpg', + tags: _tags, + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O módulo “Pobreza e Cidadania†do curso “Educação, Pobreza e Desigualdade Social†pretende não só analisar as relações + entre pobreza e cidadania, mas também oferecer uma imagem da pobreza mais complexa e multifacetada do que aquela que normalmente as + pessoas de outras classes tendem a formar. Ademais, apresentam-se algumas considerações teóricas sobre a relação entre dinheiro, + processos de autonomia e de capacitação moral, bem como sobre a questão da opressão de gênero. Ao longo do texto também é proposta a + desconstrução de alguns dos preconceitos mais comuns sobre as pessoas em condição de pobreza e suas vidas. O material foi elaborado para + este curso de Especialização, na modalidade de ensino a distância, tendo em vista seu papel na formação continuada de educadores e agentes + educacionais. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 2, + pre_title: 'Módulo II: ', + title: 'Pobreza, Direitos Humanos, Justiça e Educação', + author: 'Erasto Fortes Mendonça', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/mod-2/index.html', + url: 'https://sgmd.nute.ufsc.br/content/secadi-formacao-continuada-pbf/mod-2/index.html', + img: 'img/colecoes/pobreza2.jpg', + tags: _tags, + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Pobreza, Direitos Humanos, Justiça e Educação†do curso “Educação, Pobreza e Desigualdade Social†tem-se o objetivo de entender o papel estratégico da relação entre educação e direitos humanos no enfrentamento e na superação da pobreza e na construção de um sociedade justa, igualitária e fraterna. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista seu papel na formação continuada de educadores e agentes educacionais. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 3, + pre_title: 'Módulo III: ', + title: 'Escola: Espaços e tempo de reprodução e resistências da pobreza', + author: 'Lúcia Helena Alvarez Leite', + // url: 'http://especializacao-pobreza.mec.gov.br/modulos/mod-3/index.html', + url: 'https://sgmd.nute.ufsc.br/content/secadi-formacao-continuada-pbf/mod-3/index.html', + img: 'img/colecoes/pobreza3.jpg', + tags: _tags, + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Escola: Espaços e tempo de reprodução e resistências da pobreza†do curso “Educação, Pobreza e Desigualdade Social†pretende-se discutir as relações entre cultura escolar e desigualdade social, buscando analisar as representações sociais sobre as infâncias, adolescência, juventudes e vivências de pobreza no brasil, e o papel do Bolsa FamÃlia na garantia do direito ao acesso e à permanência na escola pública. Ainda é proposta a discussão do papel da escola no processo de reprodução das desigualdades sociais e a luta dos movimentos sociais pelo direito à educação e a uma escola para as camadas populares. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista seu papel na formação continuada de educadores e agentes educacionais. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 4, + pre_title: 'Módulo IV: ', + title: 'Pobreza e CurrÃculo: uma complexa articulação', + author: 'Miguel Gonzalez Arroyo', + // url: 'http://especializacao-pobreza.mec.gov.br/modulos/mod-4/index.html', + url: 'https://sgmd.nute.ufsc.br/content/secadi-formacao-continuada-pbf/mod-4/index.html', + img: 'img/colecoes/pobreza4.jpg', + tags: _tags, + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Pobreza e CurrÃculo: uma complexa articulação†do curso “Educação, Pobreza e Desigualdade Social†busca-se resgatar a concepção de currÃculo, explicitando o seu reflexo nas práticas pedagógicas docentes. Neste núcleo o currÃculo é retratado como fator que exprime a ideologia, as relações de poder e a cultura de cada unidade escolar. Cabe ao docente, por exemplo, reproduzir as desigualdades e injustiças sociais ou contribuir para a construção de uma sociedade efetivamente democrática. Existem três tipos de currÃculos: um formal, um real e um oculto. Essa compreensão inicial é fundamental para a discussão neste módulo sobre currÃculo e pobreza. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista seu papel na formação continuada de educadores e agentes educacionais. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + + var colecao = { + id: 0, + name: 'Educação, Pobreza e Desigualdade Social', + tags: _tags, + developed: 'Nute UFSC', + developedurl: 'http://lantec.ufsc.br', + topic_name: 'Módulos', + topics: topicos, + score: 100, + img: 'img/colecoes/pobreza.png', + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: 'A relação entre educação, escola, polÃticas educacionais, formação docente, currÃculos, teorias pedagógicas e o primeiro direito do ser humano a um digno e justo viver tem estado, em certa medida, ausente no pensamento educacional e nas suas polÃticas, bem como na formação de profissionais da educação básica e de outros(as) profissionais que estabelecem relações com a educação em contextos empobrecidos. O material busca abrir caminhos reflexivos para a contextualização, reflexão e problematização da situação de pobreza e desigualdade social, além de propor a atividade de repensar os currÃculos e práticas educacionais para incluir tal tema e cultivar a sensibilidade para ouvir e incorporar, no exercÃcio docente, as questões que ecoam nas vivências da pobreza.', + historic: `O curso foi criado numa parceria entre a Secretaria de Educação Continuada, Alfabetização, Diversidade e Inclusão do Ministério da Educação – SECADI/MEC e a Universidade Federal de Santa Catarina com objetivo de propiciar a coordenadores, gestores, agentes educacionais e professores de todo o Brasil a reflexão sobre a realidade que envolve a pobreza e a desigualdade social e as possibilidades postas pela educação para que essa realidade seja problematizada e transformada. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3, + }; + + colecoes.push(colecao); + + //Educação na Cultura Digital// + + tagnames = ['Educação', 'Cultura', "Digital", 'Coleção', 'ECD', 'Espaços Escolares'] + _tags = []; + for (let i = 0; i < tagnames.length; i++) { + _tags.push({ + name: tagnames[i] + }); + }; + + topicos = []; + topicos.push({ + id: 0, + pre_title: '', + title: 'Formação de Educadores na Cultura Digital', + author: 'Edla Maria Faust Ramos - (UFSC), Lia Cristina Barata Cavellucci e Célia Reichert Engelmann', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/formadores/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/formadores/cenario.html', + img: 'img/colecoes/ecd1.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No Módulo “Formação de Educadores na Cultura Digital†do curso “Educação na Cultura Digitalâ€, tem-se como propósito geral de estudos contextualizar e problematizar os processos de formação de docentes e aportar elementos que contribuam para a construção de novas propostas de intervenção para a formação continuada de professores(as) com foco na integração das Tecnologias de Informação e Comunicação nas escolas e seus diversos usos. + +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 1, + pre_title: '', + title: 'Gestão para Integração das TDIC ao CurrÃculo', + author: 'Maria Elizabeth Bianconcini Trindade Morato Pinto de Almeida, Maria Elisabete Brisola Brito Prado, Lia Cristina Barata Cavellucci e Odete Sidericoudes', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/gestao/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/gestao/menu-topicos.html', + img: 'img/colecoes/ecd2.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Gestão para a Integração das TDIC ao CurrÃculo†do curso “Educação na Cultura Digital†procura-se focalizar temas relacionados à prática da gestão escolar, considerando alguns aspectos deste contexto e tendo como fio condutor o tempo tal como o vivenciamos hoje. Em seguida, analisam-se as repercussões da cultura digital nas práticas de gestão escolar e, por fim, busca-se o desafio de o exercitar o olhar para o futuro. O objetivo é criar um espaço de problematização, discussão e de busca de respostas, e esboçar caminhos para a gestão escolar situada na cultura digital, sempre tendo como meta principal a qualidade da formação dos alunos oferecida pela escola. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 2, + pre_title: '', + title: 'Tecnologias Assistivas', + author: 'Liliana Maria Passerino (FACED/UFRGS) e PatrÃcia Maria Vargas de Lima (Sec. Mun. de Educação de Florianópolis)', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/tecnologias-assistivas-2/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/tecnologias-assistivas-2/pagina-16.html', + img: 'img/colecoes/ecd3.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No Módulo de “Tecnologias Assistivas†do curso “Educação na Cultura Digital†propõe-se que vocês desafiem-se, permitam-se, encantem-se e reencantem-se com a temática e com o universo chamado inclusão. O núcleo ainda tem como norte apresentar recursos de acessibilidade que facilitarão a navegação na hipermÃdia e analisar as possibilidades de uso, adaptação e criação de artefatos, estratégias e serviços em Tecnologia Assistiva sob a perspectiva da Educação Inclusiva. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 3, + pre_title: '', + title: 'A Prática Docente na Educação Infantil e TDIC', + author: 'PatrÃcia de Moraes Lima e Ivana Martins da Rosa', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/educacao-infantil/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/educacao-infantil/pagina.html', + img: 'img/colecoes/ecd4.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No Módulo “A Prática Docente na Educação InfantIl e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é proposto um novo percurso de aprendizagem que busca estabelecer conexões entre os seus conhecimentos prévios e os aqui propostos, no intuito de integrar o uso das TDIC à s práticas pedagógicas na Educação Infantil. Ainda são propostas discussões sobre experiências pedagógicas e análises dos Núcleos de Ação Pedagógica (NAPs), entre outras problematizações do âmbito da Educação Infantil. Busca-se, com este núcleo, contribuir para a construção de conhecimentos e reflexões sobre o saber/fazer nas práticas pedagógicas no contexto abordado. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 4, + pre_title: '', + title: 'Educação FÃsica e TDIC', + author: 'Giovani De Lorenzi Pires (UFSC), Juliano Silveira (UFSC), Rodrigo Ferrari (UFSC), Lyana Thédiga de Miranda (UFSC), Gilson Cruz Junior (UFSC) e André Quaranta (UFSC)', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/educacao-fisica/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/educacao-fisica/menu-topicos.html', + img: 'img/colecoes/ecd5.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Educação FÃsica e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†apresentam-se as especificidades da Educação FÃsica escolar e suas relações com as Tecnologias Digitais de Informação e Comunicação (TDIC). Busca-se um caminho interdisciplinar com os demais componentes curriculares, dialogando teoricamente com a ideia de mÃdia-educação, referindo-se tanto à metodologia e à crÃtica como ao contexto produtivo-expressivo (FANTIN, 2006). Portanto, este material foi pensado como um meio pelo qual podem-se explorar essas necessidades e questões. Ler, refletir, produzir e intervir em sala de aula serão alguns dos caminhos sugeridos nesta empreitada. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 5, + pre_title: '', + title: 'Aprendizagem de Artes Visuais e TDIC', + author: 'Maria Cristina da Rosa Fonseca da Silva, PatrÃcia Maria Macedo Alves e Jaymini Pravinchandra Shah', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/artes/folha-de-rosto.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/artes/pagina.html', + img: 'img/colecoes/ecd6.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No Módulo “Aprendizagem de Artes Visuais e TDIC†do curso “Educação na Cultura Digital†propõe-se apresentar alguns aspectos relevantes ao mundo artÃstico que têm se transformado com o desenvolvimento tecnológico no mundo das Artes Visuais e suas perspectivas, de modo que você possa rever suas práticas pedagógicas através de novos conhecimentos e proporcione aos(à s) seus(suas) alunos(as) novos saberes artÃsticos, por meio de um diálogo entre distintos gêneros artÃsticos e sua transformação ao longo dos séculos. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 6, + pre_title: '', + title: 'Aprendizagem de LÃngua Estrangeira e TDIC', + author: 'Celso Henrique Soufen Tumolo, FabÃola Teixeira Ferreira, Juliana Cristina Faggion Bergmann e Nadia Karina Ruhmke Ramos', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/lingua-estrangeira/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/lingua-estrangeira/pagina-9.html', + img: 'img/colecoes/ecd7.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Ensino-Aprendizagem de LÃnguas Estrangeiras e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é priorizado o emprego das tecnologias em sua área especÃfica de trabalho na escola e também reflete-se sobre as possibilidades oferecidas pela tecnologia para auxiliá-lo(a) a criar práticas pedagógica e soluções para as questões que surgem em sala de aula, além de oferecer subsÃdios para o desenvolvimento de atividades de ensino e aprendizagem. O objetivo principal é demonstrar como a tecnologia pode ser uma grande aliada na resolução dos desafios pedagógicos que se apresentam no contexto escolar. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 7, + pre_title: '', + title: 'Aprendizagem de Matemática no Ensino Fundamental e TDIC', + author: 'Marcus Vinicius de Azevedo Basso (UFRGS), Crediné Silva de Menezes (UFRGS), Márcia Rodrigues Notare Meneghetti (UFRGS), Fabiana Fattore Serres (Colégio de Aplicação/UFRGS) e Elisa Friedrich Martins (EMEF Dep. MarcÃrio Goulart Loureiro/POA-RS)', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/matematica-ef/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/matematica-ef/apresentacao.html', + img: 'img/colecoes/ecd8.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo de “Aprendizagem Matemática no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†pretende-se ajudá-lo(a) a compreender como a incorporação do computador e da internet nas práticas pedagógicas podem apoiar o trabalho de docentes e discentes em aprender a matemática de uma maneira aprofundada, com menos esforço “braçal†e com mais satisfação. Acredita-se que a utilização de ferramentas digitais e algumas formas diferenciadas de trabalhar possam modificar e melhor qualificar as aprendizagens. Espera-se que todos e todas tenham a oportunidade de experimentar, dialogar, debater, refletir e, por fim, construir conhecimento sobre uma nova forma de ensinar e aprender Matemática. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 8, + pre_title: '', + title: 'Aprendizagem de LÃngua Portuguesa no Ensino Fundamental e TDIC', + author: 'Jacqueline Peixoto Barbosa (PUCSP), Eduardo de Moura Almeida (Co-autor pesquisador), Nayara Moreira Santos (Co-autor pesquisador) e Amanda Lacerda de Lacerda (Co-autor escola)', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/portugues-ef2/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/portugues-ef2/apresentacao.html', + img: 'img/colecoes/ecd9.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Aprendizagem de LÃngua Portuguesa no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é possÃvel explorar os conhecimentos da esfera digital no uso da linguagem a partir de quatro perspectivas: a tecnológica, a cientÃfica, a literária e a jornalÃstica. A organização deste núcleo é feita a partir da escolha de diferentes gêneros multimodais, articulada com a vivência e/ou análise de práticas, processos e ações tÃpicos da Web 2.0, e do domÃnio básico do manuseio de editores de imagem, áudio e vÃdeo, e de ferramentas de editoração eletrônica. Pretende-se que, com a formação desenvolvida, você seja capaz de usar e identificar os textos multimodais e multissemióticos presentes no dia a dia e que possa, também, incorporar tal aprendizado à sua prática docente. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 9, + pre_title: '', + title: 'Aprendizagem de História no Ensino Fundamental e TDIC', + author: 'Carla Ferretti Santiago (PUC Minas), Eucidio Pimenta Arruda (UFMG) e Fernanda Dinardo do Nascimento (Escola Municipal Adelina Gonçalves Campos - Betim/MG)', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/historia-ef/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/historia-ef/apresentacao.html', + img: 'img/colecoes/ecd10.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Aprendizagem de História no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†o que propõe-se é a problematização dos diferentes significados e usos dos materiais e ambientes digitais por meio da reflexão de suas implicações para o ensino e aprendizagem de história. Considera-se importante revelar as mudanças e permanências que as tecnologias de comunicação e informação digitais possibilitam na compreensão e incorporação de categorias fundamentais do campo do saber histórico escolar, como: tempo/temporalidades, memória/registros, entre outros. Em sÃntese, a proposta parte dos materiais, recursos e meios digitais para, então, refletir as suas implicações na compreensão de conceitos fundantes do conhecimento histórico. Defende-se que uma postura crÃtica e ativa diante dos meios digitais pode contribuir para que docentes e alunos(as) (re)afirmem seu protagonismo no mundo contemporâneo marcado pela cultura digital. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 10, + pre_title: '', + title: 'Aprendizagem de Geografia no Ensino Fundamental e TDIC', + author: 'Rosa Elisabete Militz Wypyczynski Martins e Roberto Souza Ribeiro', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/geografia-ef/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/geografia-ef/apresentacao.html', + img: 'img/colecoes/ecd11.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Aprendizagem de Geografia no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†tem-se como objetivo refletir sobre práticas de ensino e aprendizagem de Geografia com o uso das TDIC. É desenvolvida a problematização de conceitos geográficos e as utilizações no TDIC no âmbito da aprendizagem, articulando e analisando a realidade em que vivemos na intenção de favorecer o ensino-aprendizagem. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 11, + pre_title: '', + title: 'Aprendizagem de Ciências no Ensino Fundamental e TDIC', + author: 'Marina Bazzo de EspÃndola, Gabriela de Leon Nóbrega Reses, PatrÃcia Barbosa Pereira e Ivan Tavares Scotelari de Souza', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/ciencias-ef/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/ciencias-ef/menu-topicos.html', + img: 'img/colecoes/ecd12.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Aprendizagem de Ciências no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†tem-se como objetivos proporcionar a compreensão do como as TDIC podem ser inseridas no processo de ensino e aprendizagem de conhecimentos cientÃficos, estimular o(a) cursista a ter uma postura ativa e investigadora no decorrer dos estudos e, também, contribuir, por meio de fundamentação teórica e atividades práticas, para a ampliação de conhecimentos do(a) professor sobre essas tecnologias. Almeja-se que, ao final dos estudos do núcleo, você possa propor iniciativas de integração de TDIC na educação em Ciências Naturais, a partir das suas necessidades de ensino e das necessidades especÃficas desta área de conhecimento. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 12, + pre_title: '', + title: 'Aprendizagem de Matemática no Ensino Médio e TDIC', + author: 'Marcus Vinicius de Azevedo Basso (UFRGS), Crediné Silva de Menezes (UFRGS), Márcia Rodrigues Notare Meneghetti (UFRGS), Fabiana Fattore Serres (Colégio de Aplicação/UFRGS) e Elisa Friedrich Martins (EMEF Dep. MarcÃrio Goulart Loureiro/POA-RS)', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/matematica-em/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/matematica-em/menu-topicos.html', + img: 'img/colecoes/ecd13.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Aprendizagem de Matemática no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†propõe-se uma imersão na cultura digital pelos caminhos da Matemática. A intenção é ajudá-lo(a) a compreender como a incorporação do computador e da internet em nossas práticas pedagógicas podem apoiar o trabalho dos(as) professores(as) e propiciar aos(as) alunos(as) o aprendizado de Matemática de uma maneira mais profunda, com menos esforço “braçal†e mais satisfação. Acredita-se que a utilização de ferramentas digitais e algumas formas diferenciadas de trabalhar Matemática possam modificar e qualificar as aprendizagens, e espera-se que todos tenham a oportunidade de experimentar, dialogar, debater, refletir e, por fim, construir conhecimentos sobre uma nova forma de ensinar e aprender Matemática. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 13, + pre_title: '', + title: 'Aprendizagem de LÃngua Portuguesa no Ensino Médio e TDIC', + author: 'Roxane Rojo (IEL-UNICAMP), Saulo da Silva Oliveira (ETEC Parque da Juventude, Centro Paula Sousa/SEE-SP), Jezreel Gabriel Lopes (IEL-UNICAMP, mestrado), João Reynaldo Pires Jr. (IEL-UNICAMP, mestrado) e Kátia Sayuri Fujisawa (IEL-UNICAMP, mestrado)', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/portugues-em2/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/portugues-em2/menu-topicos.html', + img: 'img/colecoes/ecd14.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Aprendizagem de LÃngua Portuguesa no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†são explorados os conhecimentos da esfera digital no uso da linguagem a partir de quatro perspectivas: a tecnológica, a cientÃfica, a literária e a jornalÃstica. Pretende-se que, com a formação desenvolvida, você seja capaz de usar e identificar os textos multimodais e multissemióticos presentes no dia a dia e que também possa incorporar tal aprendizado à sua prática docente. Vale ressaltar que, em muitos momentos, você será convidado(a) a refletir, por meio de questionamentos, acerca de diversos assuntos relacionados com o conteúdo. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 14, + pre_title: '', + title: 'Aprendizagem de QuÃmica no Ensino Médio e TDIC', + author: 'Edson Luiz Lindner - (CA/UFRGS), Victor João da Rocha Maia Santos e Gabriela da Fontoura Rodrigues Selmi', + //url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/quimica-em/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/quimica-em/pagina-15.html', + img: 'img/colecoes/ecd15.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Aprendizagem de QuÃmica no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†são organizados três momentos, que contemplam: a) a construção de olhares e reflexões sobre o papel das TDIC no processo de ensino-aprendizagem em QuÃmica; b) a utilização de vÃdeos na experimentação quÃmica; e c) a inserção e utilização de sistemas interativos, com destaque nos ambientes de autoria, como possibilidade de construir e representar o conhecimento quÃmico. A dinâmica de estudo irá ocorrer tanto por meio de atividades de estudos teóricos quanto de desenvolvimento de atividades práticas. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 15, + pre_title: '', + title: 'Aprendizagem de FÃsica no Ensino Médio e TDIC', + author: 'Henrique César da Silva, Patrick de Souza Girelli, Rafaela Rejane Samagaia e Fernando da Silva Calsavara', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/fisica-em/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/fisica-em/pagina.html', + img: 'img/colecoes/ecd16.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Aprendizagem de FÃsica no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†serão apresentados e sugeridos modos de utilização de alguns conceitos e tecnologias digitais da informação e comunicação (TDIC) como forma de subsidiar a constituição de propostas didáticas no âmbito do ensino de FÃsica. Para isso, nesse caso, a temática "Nanociência & Nanotecnologias" (N&N) foi escolhida como eixo deste núcleo. Assim, em um primeiro momento, a ideia é que se possa navegar e aprofundar melhor o entendimento dessa temática e sua relação com as TDIC. Em seguida, será importante lançar um olhar para a nossa realidade, com o intuito de perceber as potencialidades didáticas fomentadas pelas TDIC que emergem como possibilidades para o contexto em foco. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 16, + pre_title: '', + title: 'Aprendizagem de Biologia no Ensino Médio e TDIC', + author: 'Simão Pedro Pinto Marinho e Alessandra Marinho', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/biologia-em2/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/biologia-em2/menu-topicos.html', + img: 'img/colecoes/ecd17.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Aprendizagem de Biologia no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†você será convidado(a) a refletir sobre a interface TDIC e Ensino de Biologia, (re)pensando sobre sua prática pedagógica e entrando em contato com novos recursos e ferramentas que apresentam as mais diversas potencialidades no contexto escolar. Serão explorados o uso das tecnologias digitais na sala de aula, a execução das atividades com ações de reflexão, levantamento de questões, elaboração de planos, organização, registro e socialização das narrativas sobre as atividades desenvolvidas a partir da integração das TDIC ao currÃculo de Biologia. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 17, + pre_title: '', + title: 'Aprendizagem de Sociologia no Ensino Médio e TDIC', + author: 'Alexandro Dantas Trindade(Departamento de Ciência PolÃtica e Sociologia - UFPR/PR), Luciana Paula da Silva de Oliveira (Colégio Estadual Professor Algacyr Munhoz Maeder / Curitiba-PR) e Neli Gomes da Rocha (Programa de Pós-Graduação em Sociologia - UFPR/PR)', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/sociologia-em/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/sociologia-em/menu-topicos.html', + img: 'img/colecoes/ecd18.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O módulo “Aprendizagem de Sociologia no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é pensado como um meio de explorar questões sociológicas, bem como as relações sociais construÃdas temporal e historicamente que as contextualizam. Ademais, o núcleo ainda propõe reflexões sociológicas acerca do papel das tecnologias de informação e comunicação como base das relações sociais atuais, além de desenvolver atividades que proporcionem a reflexão crÃtica e a autonomia na criação e elaboração de conteúdos. Ler, refletir, produzir e intervir em sala de aula serão alguns dos caminhos sugeridos nessa empreitada. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 18, + pre_title: '', + title: 'Aprendizagem de História no Ensino Médio e TDIC', + author: 'José Alves de Freitas Neto e José Antônio Ferreira da Silva Junior', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/historia-em/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/historia-em/pagina_2.html', + img: 'img/colecoes/ecd19.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo de “Aprendizagem de História no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é proposta uma reflexão acerca dos conceitos tempo, memória e narrativa no âmbito do ensino de história. São discutidas questões gerais de história e sua relação com a cultura digital, bem como seus usos e possibilidades como fator favorecedor do ensino, a partir da interação e da aprendizagem colaborativa. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 19, + pre_title: '', + title: 'Aprendizagem de Geografia no Ensino Médio e TDIC', + author: 'Cláudio Benito Oliveira Ferraz (UNESP - Pres.Prudente)', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/geografia-em/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/geografia-em/pagina-54.html', + img: 'img/colecoes/ecd20.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Aprendizagem de Geografia no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é apresentada a proposta de estimulá-lo(a) a criar novos pensamentos espaciais, articular e dominar conceitos e outros sentidos da linguagem geográfica, de maneira a entendê-la não como algo já estabelecido por especialistas, mas como um campo do pensamento que agencia as linguagens artÃsticas. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 20, + pre_title: '', + title: 'Aprendizagem de Filosofia e TDIC', + author: 'Sérgio Paulino Abranches, Junot Cornélio Matos, Willamis AprÃgio de Araújo, Eugênio Pacelle da Costa Cavalcante, Guilherme Jordão Macêdo Dias, Karla Epiphania Lins de Gois e Luis Lucas Dantas da Silva e Nilton Guimarães da Silva', + //url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/filosofia/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/filosofia/menu-topicos.html', + img: 'img/colecoes/ecd21.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Aprendizagem de Filosofia e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†a Filosofia é apresentada como fator que não pode furtar-se a pensar a cultura digital e suas implicações. Em especial para o caso de professores de Filosofia: como trabalhar essa discussão contemporânea na sala de aula? Qual a sua relevância? Através da abordagem de alguns conceitos-chave, como identidade, juventude, cidadania e democracia, este material trata de oferecer algumas possibilidades de discussão em torno dessas questões. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 21, + pre_title: '', + title: 'Linguagens do Nosso Tempo', + author: 'Maria Lucia Santaella Braga e Alexandre Santaella Braga', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/linguagens/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/linguagens/pagina-22.html', + img: 'img/colecoes/ecd22.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Linguagens do Nosso Tempo†do curso “Educação na Cultura Digital†tem-se o objetivo de refletir sobre práticas de ensino e aprendizagem de Linguagens do Nosso Tempo com o uso das TDIC. O núcleo apresenta os conceitos caracterizadores das linguagens atuais, a hipermÃdia e a transmÃdia com a finalidade de evidenciar que novas linguagens não se esgotam em si mesmas. Levantar e problematizar as implicações que a hipermÃdia, como a complexa linguagem que é própria das redes digitais e discutir os desafios que essas formas de aprendizagem estão trazendo para a educação, especialmente para aquela que ainda continua nostálgica e exclusivamente presa ao mundo do texto impresso. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 22, + pre_title: '', + title: 'Tecnologias Digitais no Letramento EstatÃstico', + author: 'Ruy César Pietropaolo (UNIBAN), Nielce Meneguello Lobo da Costa (UNIBAN) e Rosangela de Souza Jorge Ando ', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/letramento-estatistico/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/letramento-estatistico/menu-topicos.html', + img: 'img/colecoes/ecd23.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O módulo “Tecnologias Digitais no Letramento EstatÃstico†do curso “Educação na Cultura Digital†propõe atividades e experiências visando favorecer a construção de competências referentes ao letramento estatÃstico, o qual inclui: o domÃnio de conhecimentos básicos que permitam o desenvolvimento de competências estatÃsticas; o exercÃcio do pensamento crÃtico acerca das informações de uma pesquisa para a tomada de decisões; e a utilização das tecnologias digitais para a coleta e a organização dos dados de uma pesquisa, visando a compreensão e intervenção na realidade da escola, bem como a obtenção de medidas e comunicação dos resultados. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 23, + pre_title: '', + title: 'Jogos Digitais e Aprendizagem', + author: 'Isa Beatriz da Cruz Neves, PatrÃcia Rocha Rodrigues, Isa de Jesus Coutinho e Andersen Caribé de Oliveira', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/jogos/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/jogos/cenario.html', + img: 'img/colecoes/ecd24.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No módulo “Jogos Digitais e Aprendizagem†do curso “Educação na Cultura Digital†os jogos são vistos como formas de diversão interativa que proporcionam aprendizagem. Os jogos digitais podem simular ações como correr, dançar, jogar basquete, tênis, futebol, etc. Em geral, eles apresentam conflitos e competições que exigem cumprimento de regras, raciocÃnio lógico e uma boa dose de estratégia. Esses desafios contribuem para o desenvolvimento da visão periférica, concentração em diferentes atividades e desenvolvimento de habilidades para resolução de problemas. O objetivo do núcleo é pensar os jogos digitais em articulação com o ensino, bem como refletir sobre seus limites e possibilidades. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 24, + pre_title: '', + title: 'Ética na Cultura Digital', + author: 'Sérgio Paulino Abranches, Junot Cornélio Matos, Karla Epiphania Lins de Gois, Luis Lucas Dantas da Silva, Nilton Guimarães da Silva, Willamis AprÃgio de Araújo, Eugênio Pacelle da Costa Cavalcante e Guilherme Jordão Macêdo Dias', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/etica/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/etica/menu-topicos.html', + img: 'img/colecoes/ecd25.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O módulo “Ética na Cultura Digital†do curso “Educação na Cultura Digital†parte da seguinte constatação: dentre uma série de questões contemporâneas relevantes envolvendo a cultura digital, discutidas em outros núcleos deste curso, inclui-se também um questionamento sobre ética. Este núcleo, então, discute algumas dessas questões, sem pretender esgotá-las. É proposta a reflexão sobre a relação entre Ética e Cultura Digital, discutindo os valores subjacentes ao uso das TDIC nas relações sociais e na educação e buscando analisar, de maneira vertical e interdisciplinar, as implicações éticas das diferentes possibilidades tecnológicas para a vida do ser humano. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 25, + pre_title: '', + title: 'A Prática Docente no Ensino Fundamental e TDIC', + author: 'Darli Collares (UFRGS) e Nina Rosa Ventimiglia Xavier (Educação Básica)', + // url: 'http://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/fundamental/apresentacao.html', + url: 'https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/fundamental/pagina-2.html', + img: 'img/colecoes/ecd26.jpg', + score: 100, + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O módulo “A Prática Docente no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†busca refletir sobre questões inerentes à s especificidades da docência nos Anos Iniciais e, também, sobre as possibilidades e implicações do uso de TDIC nessa fase de escolarização, aprofundar os conhecimentos sobre o processo de aprendizagem e propor um novo olhar sobre as práticas pedagógicas baseando-se em Piaget. +O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + + colecao = { + id: 1, + name: 'Educação na Cultura Digital', + tags: _tags, + developed: 'Nute UFSC', + developedurl: 'http://lantec.ufsc.br', + topic_name: 'Módulos', + topics: topicos, + score: 100, + img: 'img/colecoes/ecd.png', + duration: 50, + created_at: '2015-06-13T00:31:24.484Z', + updated_at: '2015-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O material oferece subsÃdios para uma formação apoiada nos diversos âmbitos das Tecnologias Digitais de Informação e Comunicação (TDIC) em currÃculos escolares, além de explorar, demonstrar e analisar as possibilidades criativas e elementos que contribuam para a construção de novas dinâmicas para a formação de professores(as) com foco na integração das Tecnologias de Informação e Comunicação nas escolas e seus diversos usos.`, + historic: `O curso foi criado numa parceria entre Ministério da Educação e Universidade Federal de Santa Catarina, tendo como público alvo professores, coordenadores, gestores pedagógicos e outros membros da equipe gestora que fossem responsáveis pelo processo de formação da escola, além de multiplicadores dos Núcleos de Tecnologia Educacional (NTE) e Núcleos de Tecnologia Municipal (NTM). O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3, + }; + + colecoes.push(colecao); + + //PNAIC// + + // tagnames = ['Alfabetização', 'Educação', 'Coleção', 'PNAIC', "Alfabetização na Idade Certa"] + // _tags = []; + // for (let i = 0; i < tagnames.length; i++) { + // _tags.push({ + // name: tagnames[i] + // }); + // }; + + // topicos = []; + // topicos.push({ + // id: 0, + // pre_title: '', + // title: `CurrÃculo na perspectiva da inclusão e da diversidade: as Diretrizes Curriculares Nacionais da Educação Básica e o Ciclo de Alfabetização`, + // author: 'Secretaria de Educação Básica.', + // url: 'http://sgmd.nute.ufsc.br/content/pnaic-sgmd/caderno-1/home.html', + // img: 'img/colecoes/pnaic1.jpg', + // tags: _tags, + // score: 100, + // duration: 50, + // created_at: '2016-06-13T00:31:24.484Z', + // updated_at: '2016-06-16T12:41:22.885Z', + // language: { + // id: 1, + // name: 'Português', + // code: 'pt' + // }, + // license: null, + // description: `No Caderno 01 de Pedagogia e Diretrizes Curriculares do Pacto Nacional pela Alfabetização na Idade Certa (PNAIC-2015) são apresentados os modelos de organização escolar em seus âmbitos legal e social, evidenciando as práticas escolares e a relação que desempenham na organização do currÃculo, na análise do cotidiano escolar, na problematização de dinâmicas docentes, na inclusão e diversidade, além de ser aberta uma discussão sobre currÃculo, avaliação, educação do campo, educação inclusiva e diversidade linguÃstica como tópicos de relevância. O material foi desenvolvido para a formação continuada de professores, pedagogos e alfabetizadores de todo Brasil.`, + // likes_count: 3 + // }); + // topicos.push({ + // id: 1, + // pre_title: '', + // title: 'A criança no Ciclo de Alfabetização', + // author: 'Secretaria de Educação Básica.', + // url: 'http://sgmd.nute.ufsc.br/content/pnaic-sgmd/caderno-2/home.html', + // img: 'img/colecoes/pnaic2.jpg', + // tags: _tags, + // score: 100, + // duration: 50, + // created_at: '2016-06-13T00:31:24.484Z', + // updated_at: '2016-06-16T12:41:22.885Z', + // language: { + // id: 1, + // name: 'Português', + // code: 'pt' + // }, + // license: null, + // description: `O Caderno 02 do Ciclo de Alfabetização do Pacto Nacional pela Alfabetização na Idade Certa (PNAIC-2015) mostra a indispensabilidade de práticas que garantam os direitos das crianças, tais como a infância, trazendo à tona a importância do lúdico para uma melhor aprendizagem. Aponta, também, a necessidade de afeto nas salas de aula, a relação criança, escrita e infância, a educação inclusiva e a educação do campo junto com suas individualidades como temática para reflexão. O texto apresenta relatos com base nas experiências de professores envolvidos com as temáticas anteriormente descritas. O material foi desenvolvido para a formação continuada de professores e alfabetizadores de todo Brasil.`, + // likes_count: 3 + // }); + // topicos.push({ + // id: 2, + // pre_title: '', + // title: 'Interdisciplinaridade no ciclo de alfabetização', + // author: 'Secretaria de Educação Básica.', + // url: 'http://sgmd.nute.ufsc.br/content/pnaic-sgmd/caderno-3/home.html', + // img: 'img/colecoes/pnaic3.jpg', + // tags: _tags, + // score: 100, + // duration: 50, + // created_at: '2016-06-13T00:31:24.484Z', + // updated_at: '2016-06-16T12:41:22.885Z', + // language: { + // id: 1, + // name: 'Português', + // code: 'pt' + // }, + // license: null, + // description: `No Caderno 03 de Ciclo de Alfabetização do Pacto Nacional pela Alfabetização na Idade Certa (PNAIC-2015) é iniciada uma discussão sobre interdisciplinaridade e a dificuldade docente de incorporar essa perspectiva a sua prática pedagógica. É apresentada a interdisciplinaridade como possibilidade de o favorecer o processo de alfabetizar e novas perspectivas para uma melhor organização de projetos, sequências didáticas e aulas interdisciplinares, a importância do conhecimento não fracionado, isto é, de valorizar os conteúdos integradamente e também da leitura como prática que pode unir conteúdos no meio escolar. Incorporar a interdisciplinaridade à s práticas pedagógicas significa pensar o currÃculo da escola. O material foi desenvolvido para a formação continuada de professores e alfabetizadores de todo Brasil.`, + // likes_count: 3 + // }); + // topicos.push({ + // id: 3, + // pre_title: '', + // title: 'A organização do trabalho escolar e os recursos didáticos na alfabetização', + // author: 'Secretaria de Educação Básica.', + // url: 'http://sgmd.nute.ufsc.br/content/pnaic-sgmd/caderno-4/home.html', + // img: 'img/colecoes/pnaic4.jpg', + // tags: _tags, + // score: 100, + // duration: 50, + // created_at: '2016-06-13T00:31:24.484Z', + // updated_at: '2016-06-16T12:41:22.885Z', + // language: { + // id: 1, + // name: 'Português', + // code: 'pt' + // }, + // license: null, + // description: `No Caderno 04 de Organização do Trabalho Escolar do Pacto Nacional pela Alfabetização na Idade Certa (PNAIC-2015) são tematizados quais fundamentos são considerados essenciais no processo educativo e em especial na alfabetização. Tais fundamentos são necessários para se pensar a organização da prática pedagógica, as atividades que norteiam as práticas docentes, que sujeitos queremos formar, quais recursos são possÃveis de se utilizar e como utilizá-los. Também é apresentada a relevância que existe no uso de novas tecnologias em atividades de alfabetização, o uso de dinâmicas e jogos confeccionados pelas crianças em sala de aula e o uso de obras literárias como auxiliares no processo de alfabetização. O material foi desenvolvido para a formação continuada de professores e alfabetizadores de todo Brasil.`, + // likes_count: 3 + // }); + // topicos.push({ + // id: 4, + // pre_title: '', + // title: 'Ciências da Natureza no Ciclo de Alfabetização', + // author: 'Secretaria de Educação Básica.', + // url: 'http://sgmd.nute.ufsc.br/content/pnaic-sgmd/caderno-8/home.html', + // img: 'img/colecoes/pnaic8.jpg', + // tags: _tags, + // score: 100, + // duration: 50, + // created_at: '2016-06-13T00:31:24.484Z', + // updated_at: '2016-06-16T12:41:22.885Z', + // language: { + // id: 1, + // name: 'Português', + // code: 'pt' + // }, + // license: null, + // description: `No Caderno 08 de Ciências da Natureza do Pacto Nacional pela Alfabetização na Idade Certa (PNAIC-2015) são apresentadas discussões sobre as relações das ciências da natureza com a alfabetização. A alfabetização cientÃfica é apresentada como um direito de aprendizagem das crianças. É focalizada a relação entre a ciência, tecnologia e sociedade. Também são mostradas novas possibilidades e sugestões de métodos para ensino de ciências, como a importância do “fazer Ciência†e de se aprender ciência nos diversos espaços de educação, da experimentação e do despertar da curiosidade dos alunos. Ainda é dado destaque ao uso de livros didáticos e paradidáticos na sala de aula, apontando o lúdico e uma relação contextualizada com o cotidiano das crianças como temáticas fundamentais para se aprender Ciências. O material foi desenvolvido para a formação continuada de professores e alfabetizadores de todo Brasil.`, + // likes_count: 3 + // }); + + // colecao = { + // id: 2, + // name: 'Pacto Nacional pela Alfabetização na Idade Certa', + // tags: _tags, + // developed: 'MEC', + // topic_name: 'Cadernos', + // topics: topicos, + // score: 100, + // img: 'img/colecoes/pnaic.png', + // duration: 50, + // created_at: '2016-06-13T00:31:24.484Z', + // updated_at: '2016-06-16T12:41:22.885Z', + // language: { + // id: 1, + // name: 'Português', + // code: 'pt' + // }, + // license: null, + // description: `Pacto Nacional pela Alfabetização na Idade Certa é um compromisso formal assumido pelos governos federal, do Distrito Federal, dos estados e municÃpios de assegurar que todas as crianças estejam alfabetizadas até os oito anos de idade, ao final do 3º ano do ensino fundamental.`, + // likes_count: 3, + // }; + + // colecoes.push(colecao); + + //SENAD// + + tagnames = ['Drogas', 'Prevenção', 'Conselheiros', 'SENAD', "Contextos"] + _tags = []; + for (let i = 0; i < tagnames.length; i++) { + _tags.push({ + name: tagnames[i] + }); + }; + + topicos = []; + topicos.push({ + id: 0, + pre_title: 'Iniciando a Trilha', + title: '', + author: 'Nute UFSC', + // url: 'http://conselheiros6.nute.ufsc.br/ebook/iniciando-a-trilha.html', + url: 'https://sgmd.nute.ufsc.br/content/sgmd-resources-conselheiros/ebook/iniciando-a-trilha.html', + img: 'img/colecoes/senad1.jpg', + tags: _tags, + score: 100, + duration: 50, + created_at: '2014-06-13T00:31:24.484Z', + updated_at: '2014-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O módulo “Iniciando a trilha†do curso “Prevenção dos Problemas Relacionados ao Uso de Drogas†tem como objetivo contextualizar a história do consumo de drogas, com o intuito de problematizar o tema. Busca introduzir material do curso, que almeja desconstruir visões reducionistas, trabalhando a partir de três dimensões: sujeito, contexto, e drogas. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de conselheiros e agentes comunitários envolvidos na prevenção do uso de drogas no paÃs. O curso foi concluÃdo em 2014, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 1, + pre_title: 'Módulo 1: ', + title: 'Sujeitos, contextos e drogas', + author: 'Nute UFSC', + // url: 'http://conselheiros6.nute.ufsc.br/ebook/modulo-1.html', + url: 'https://sgmd.nute.ufsc.br/content/sgmd-resources-conselheiros/ebook/modulo-1.html', + img: 'img/colecoes/senad2.jpg', + tags: _tags, + score: 100, + duration: 50, + created_at: '2014-06-13T00:31:24.484Z', + updated_at: '2014-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O módulo “Sujeitos, contextos e drogas†do curso “Prevenção dos Problemas Relacionados ao Uso de Drogas†expõe o contexto histórico, social e cultural de usuários de drogas, bem como seus padrões e tendências, buscando mostrar ao leitor os diferentes cenários existentes neste âmbito. São levantadas questões acerca dos sujeitos usuários, as substâncias individualmente e seus respectivos efeitos. O módulo ainda apresenta pesquisas e entrevistas com professores de diversas áreas do conhecimento relacionadas ao estudo de substâncias psicoativas e seus dependentes. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de conselheiros e agentes comunitários envolvidos na prevenção do uso de drogas no paÃs. O curso foi concluÃdo em 2014, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 2, + pre_title: 'Módulo 2: ', + title: 'Redes para promoção, prevenção, redução de danos e tratamento', + author: 'Nute UFSC', + // url: 'http://conselheiros6.nute.ufsc.br/ebook/modulo-2.html', + url: 'https://sgmd.nute.ufsc.br/content/sgmd-resources-conselheiros/ebook/modulo-2.html', + img: 'img/colecoes/senad3.jpg', + tags: _tags, + score: 100, + duration: 50, + created_at: '2014-06-13T00:31:24.484Z', + updated_at: '2014-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O módulo “Redes para promoção, prevenção, redução de danos e tratamento†do curso “Prevenção dos Problemas Relacionados ao Uso de Drogas†apresenta o histórico recente da bioética, os conceitos e riscos de vulnerabilidade, fatores de proteção e prevenção do uso de drogas, além de entrevistas com profissionais que atuam no campo de programas preventivos,visam trazer à tona a importância de informar a população acerca da dependência e de desenvolver polÃticas multidisciplinares e intersetoriais. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de conselheiros e agentes comunitários envolvidos na prevenção do uso de drogas no paÃs. O curso foi concluÃdo em 2014, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + topicos.push({ + id: 3, + pre_title: 'Módulo 3: ', + title: 'PolÃticas Públicas e Legislação sobre Drogas', + author: 'Nute UFSC', + // url: 'http://conselheiros6.nute.ufsc.br/ebook/modulo-3.html', + url: 'https://sgmd.nute.ufsc.br/content/sgmd-resources-conselheiros/ebook/modulo-3.html', + img: 'img/colecoes/senad4.jpg', + tags: _tags, + score: 100, + duration: 50, + created_at: '2014-06-13T00:31:24.484Z', + updated_at: '2014-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O módulo “PolÃticas Públicas e Legislação sobre Drogas†do curso “Prevenção dos Problemas Relacionados ao Uso de Drogas†evidencia a relevância das medidas intersetoriais tomadas publicamente e o compromisso de cada um para o melhor cumprimento destas. Ainda é apresentada a relação entre os conselhos e movimentos sociais na atuação com fatores protetores e a importância das polÃticas de saúde mental e psicossociais presentes no SUS. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de conselheiros e agentes comunitários envolvidos na prevenção do uso de drogas no paÃs. O curso foi concluÃdo em 2014, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3 + }); + + colecao = { + id: 2, + name: 'Prevenção dos Problemas Relacionados ao Uso de Drogas', + tags: _tags, + developed: 'Nute UFSC', + developedurl: 'http://lantec.ufsc.br', + topic_name: 'Módulos', + topics: topicos, + score: 100, + img: 'img/colecoes/senad.png', + duration: 50, + created_at: '2014-06-13T00:31:24.484Z', + updated_at: '2014-06-16T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Visa propiciar aos leitores a compreensão da conjuntura social dos usuários e dependentes de substâncias psicoativas, bem como problematizar as dimensões trabalhadas: sujeito, contexto e drogas. Tem como objetivo possibilitar uma formação crÃtica, que respeite a multiplicidade dos conhecimentos neste campo e que consolide o compromisso com práticas comprometidas com a transformação da realidade social. O material ainda traz pesquisas, entrevistas com profissionais da área e projetos de intervenção elaborados pelos próprios cursistas.`, + historic: `A 6ª edição do Curso de Prevenção dos Problemas Relacionados ao Uso de Drogas – Capacitação para Conselheiros e Lideranças Comunitárias foi promovido pela Secretaria Nacional de PolÃticas Sobre Drogas do Ministério da Justiça – SENAD/MJ em parceria com Universidade Federal de Santa Catarina. Foram oferecidas 40 mil vagas para conselheiros e lideranças comunitárias de todo o Brasil que receberam capacitação para atuar na prevenção de crack, álcool e outras drogas. O curso foi concluÃdo em 2014, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.`, + likes_count: 3, + }; + + colecoes.push(colecao); + + + + // ------------------------------------------------------------------------ + //Banco de Práticas Inspiradoras// + + tagnames = ['Práticas', 'Casos', 'Competências gerais', 'Base Nacional Comum Curricular', 'BNCC'] + _tags = []; + for (let i = 0; i < tagnames.length; i++) { + _tags.push({ + name: tagnames[i] + }); + }; + + topicos = []; + topicos.push({ + id: 0, + pre_title: 'Caso 1: Cara de Brasil (Competência 1)', + title: '', + author: 'Beatriz Souza Duarte e Bruna Lúcia Frigo', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso01.html', + img: 'img/colecoes/boas1.jpg', + tags: ['Educação por projetos', 'Relações étnico-raciais', 'Cultura afro', 'Cultura indÃgena', 'Identidade'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O projeto “Brasil, cara de quê?â€, das professoras Beatriz Duarte e Bruna Frigo, da Escola Municipal de Educação Infantil Parque das Nações I, em São Paulo, ajudou alunos da educação infantil a identificarem as principais etnias que formam a população brasileira – negra, indÃgena e europeia. Por meio das memórias da infância de seus pais, histórias de migração e miscigenação e de vivências lúdicas com representantes de cada cultura, as crianças conscientizaram-se a respeito de quem são e de onde vêm seus costumes. Os resultados mais relevantes foram a desconstrução de estereótipos e preconceitos e a autoaceitação dos alunos da etnia a qual pertencem. Os assuntos abordados no projeto foram inspirados no tema do projeto polÃtico-pedagógico da escola de 2016: as relações étnico-raciais.`, + likes_count: 3 + }); + + topicos.push({ + id: 1, + pre_title: 'Caso 2: Educação aplicada à vida no sertão (Competência 2)', + title: '', + author: 'José Hélio Pereira', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso02.html', + img: 'img/colecoes/boas2.jpg', + tags: ['Educação por projetos', 'Investigação', 'Meio ambiente', 'Ãgua', 'Decantação', 'Resolução de problemas'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `"Uma solução alternativa para o tratamento simplificado da água†é o nome do projeto do professor José Helio Pereira, desenvolvido na escola Casimira Leite Montenegro, em Desterro (PB), em 2017. Com clima semiárido, a região enfrentou problemas de abastecimento de água, o que deixou a população preocupada. Visando melhorar as condições da água barrenta fornecida por caminhões-pipa à comunidade, o professor do 4º ano propôs a seus alunos que pesquisassem formas de filtrar a água. Após leituras e investigações cientÃficas, os alunos descobriram uma grande aliada encontrada na zona em que vivem: a acácia branca (Moringa oleÃfera) e comprovaram, na prática, a efetividade do processo de decantação estimulado pela semente da planta, que separa o barro da água. `, + likes_count: 3 + }); + topicos.push({ + id: 2, + pre_title: 'Caso 3: Pertencer para preservar (Competência 3)', + title: '', + author: 'Laçanã Costa Simões', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso03.html', + img: 'img/colecoes/boas3.jpg', + tags: ['Educação por projetos', 'Artes', 'Patrimônio', 'Preservação', 'Pertencimento', 'Diálogo', 'Cooperação'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Na Escola Municipal Governador Roberto Santos, em Salvador, a professora de artes Iaçanã Simões desenvolveu, em 2017, o projeto “Seja bem-vindo e volte sempre! Um olhar para a conservação do patrimônio público escolar através da arteâ€. As duas mensagens contidas no tÃtulo do projeto foram desenhadas, inicialmente, nas portas das turmas do ensino fundamental. A ideia da intervenção era conservar o patrimônio escolar e educar sobre a preservação do espaço público em geral, pois a professora observou que os estudantes não degradavam os ambientes nos quais tinham realizado algum projeto artÃstico. Além das mensagens, as portas ganharam ilustrações escolhidas por cada turma. Os alunos gostaram tanto da atividade que pintaram, também, outros ambientes da escola.`, + likes_count: 3 + }); + /*topicos.push({ + id: 3, + pre_title: 'Caso 4: Encantamento musical (Competência 4)', + title: '', + author: 'Diogo Silas de Ajala Lobo', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso04.html', + img: 'img/colecoes/boas4.jpg', + tags: ['Educação por projetos', 'Musicalização', 'Instrumentos', 'Sons', 'Cantigas', 'Brincar'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O professor de artes Diogo Lobo, do Centro de Educação Infantil do Parque dos Poderes, em Campo Grande, implementou o projeto “Musicalização na educação infantil: cantando e encantando†em 2016. Com ele, mais de 400 crianças do berçário e da educação infantil puderam contar com a música para desenvolver diversas competências e habilidades pedagógicas, uma vez que o projeto foi além do uso das canções apenas como passatempo. Ao escutar melodias e manipular instrumentos, as crianças melhoraram a coordenação motora, a fala, a criatividade e a sociabilidade, além de ampliarem seu repertório cultural e desenvolverem apreço pela música.`, + likes_count: 3 + });*/ + topicos.push({ + id: 4, + pre_title: 'Caso 5: Curiosidade cientÃfica (Competência 5) ', + title: '', + author: 'Maria Cristina Fachin Liberalesso', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso05.html', + img: 'img/colecoes/boas5.jpg', + tags: ['Educação por projetos', 'Investigação', 'Pesquisa na internet', 'RaciocÃnio lógico', 'Insetos'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Na cidade de Pinhal Grande (RS), fica a Escola Municipal de Educação Fundamental São Thomaz de Aquino, que, em 2016, teve um de seus banheiros infestado por insetos. A visita inesperada dos animais e a curiosidade dos alunos em saber que bichos eram aqueles, se eram venenosos, e, principalmente, porque havia tantos deles ali, levou a professora do 4º ano, Maria Cristina Fachin, a explorar a pesquisa cientÃfica com seus alunos. Ela recolheu uma amostra do inseto e incitou os estudantes a procurarem informações em fontes confiáveis, dando origem ao projeto “Pequeno Cientistaâ€. Com isso, as crianças puderam aprender noções de metodologia de pesquisa e testaram hipóteses práticas para entender o que causou a infestação no banheiro da escola.`, + likes_count: 3 + }); + topicos.push({ + id: 5, + pre_title: 'Caso 6: O Haiti é aqui (Competência 1)', + title: '', + author: 'Diana Aparecida Feuser Ribeiro', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso06.html', + img: 'img/colecoes/boas6.jpg', + tags: ['Educação por projetos', 'Berçário', 'Adaptação', 'Diversidade de saberes', 'Intercâmbio de culturas', 'Identidade'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Em 2017, havia um bebê haitiano na turma do berçário 1 do Centro de Educação Infantil Castelo Branco, em Joinville (SC), e a pedagoga responsável, Diana Ribeiro, preocupou-se com a inclusão da famÃlia nas atividades escolares, o que é crucial para essa faixa-etária. Como os pais do bebê se comunicavam mal em português, a professora decidiu aprender expressões na lÃngua nativa deles. Uma dessas expressões, “Sali, koman ouye?†(Olá, como vai?), nomeou o projeto de integração entre as culturas haitiana e brasileira. Ao ensinar os costumes locais, o trabalho beneficiou não somente a famÃlia estrangeira, mas também as famÃlias brasileiras procedentes de outros estados. O incentivo a essa descoberta cultural se materializou na decoração e em outras atividades, e trouxe para o berçário um pouco do lar de cada bebê.`, + likes_count: 3 + }); + topicos.push({ + id: 6, + pre_title: 'Caso 7: Mensagens para um mundo sustentável (Competência 7)', + title: '', + author: 'Martamiria Delmiro dos Santos', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso07.html', + img: 'img/colecoes/boas7.jpg', + tags: ['Educação por projetos', 'Consciência socioambiental', 'Consumo responsável', 'Mineralogia', 'Coleta seletiva'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Trabalhar a sustentabilidade com foco na mineralogia foi o diferencial do projeto da Escola Municipal Dr. Luiz Gonzaga Maranhão, em Jaboatão dos Guararapes (PE), que recebeu o nome “Educação ambiental: uso consciente dos recursos mineraisâ€. Estimulada pelo tema do projeto polÃtico-pedagógico da escola em 2016, a professora Martamiria dos Santos, do 3º ano, decidiu mostrar aos alunos de onde vêm os materiais usados para construir objetos cotidianos, como cadeiras, paredes, portas, etc. Os alunos entenderam como as matérias-primas minerais são formadas na natureza, o valor comercial que possuem e a importância de usá-las de forma consciente, o que os estimulou a praticar a reciclagem e a preservação ambiental.`, + likes_count: 3 + }); + topicos.push({ + id: 7, + pre_title: 'Caso 8: A Ãfrica me representa (Competência 8)', + title: '', + author: ' Márcia Theodorico Mezzomo', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso08.html', + img: 'img/colecoes/boas8.jpg', + tags: ['Educação por projetos', 'Relações étnico-raciais', 'Cultura afro', 'Preconceito', 'Identidade', 'Representatividade', 'Diálogo'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No entorno da Creche Morro da Queimada, em Florianópolis, há forte presença da cultura afro-brasileira. Na turma de educação infantil, por exemplo, metade dos alunos são negros, e isso fez com que a professora Marcia Mezzomo decidisse estimular a representatividade dessas crianças desde cedo. Para tanto, em consonância com a lei federal 10.639/03, sobre ensino da história da cultura afro-brasileira, ela trouxe para o imaginário infantil figuras como heróis, prÃncipes e princesas africanos, e pode explorar a diversidade cultural e as relações étnico-culturais a partir do tema “Do rei do fogo ao rei do samba: rainha e rei da Ãfrica eu souâ€. A população local, como familiares e representantes de grupos artÃsticos, contribuiu para mostrar à s crianças as influências mais marcantes da cultura africana na cultura nacional.`, + likes_count: 3 + }); + topicos.push({ + id: 8, + pre_title: 'Caso 9: AntÃdoto contra o preconceito (Competência 9)', + title: '', + author: 'Lorena Bárbara Santos Costa', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso09.html', + img: 'img/colecoes/boas9.jpg', + tags: ['Educação por projetos', 'Relações étnico-raciais', 'Cultura afro', 'Samba', 'Identidade', 'Representatividade', 'Bullying', 'Preconceito', 'Empatia', 'Respeito', 'Diversidade'], score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `A cultura afro-brasileira tem grande expressividade em Salvador, onde as salas de aulas costumam ser compostas, principalmente, por alunos negros, como no 5º ano da Escola Municipal Deputado Gersino Coelho. Ao perceber que seus alunos tinham dificuldade em aceitar-se como negros, e que tratavam uns ao outros de forma preconceituosa, a professora Lorena Costa usou a temática “Vem sambar e aprender: o samba como instrumento de resistência e representação da cultura afro-brasileira†para abordar a descendência africana no paÃs. O resgate do samba da Bahia, ao longo das atividades, foi todo permeado por aspectos da história e da cultura afro, como a trajetória de resistência das comunidades quilombolas. Como resultado, a familiarização com essa cultura despertou a empatia, o respeito e o diálogo entre os alunos.`, + likes_count: 3 + }); + topicos.push({ + id: 9, + pre_title: 'Caso 10: Um olhar de esperança (Competência 10)', + title: '', + author: 'João Paulo Vicente da Silva', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso10.html', + img: 'img/colecoes/boas10.jpg', + tags: ['Educação por projetos; Inclusão; Esporte; Adaptação curricular; Empatia'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Em 2017, o aluno cadeirante Renner LuÃs entrou no 5o ano do Centro Infantil Estrela do Mar, em Extremoz (RN), e ninguém imaginava que alcançaria o 3º lugar estadual, e 5º nacional, em campeonatos paralÃmpicos de bocha. As conquistas do garoto foram possÃveis graças ao empenho do professor de educação fÃsica João Paulo da Silva, que pesquisou maneiras de incluÃ-lo na disciplina e em outras atividades escolares, criando o projeto “Contribuições da educação fÃsica na inclusão das pessoas com paralisia cerebral no ensino regularâ€. A participação de Renner nas aulas e campeonatos ajudaram a melhorar a sociabilidade dos colegas com ele, além de ter contribuÃdo positivamente para sua autoestima.`, + likes_count: 3 + }); + topicos.push({ + id: 10, + pre_title: 'Caso 11: Fábulas favorecem alfabetização de crianças (Competência 4)', + title: '', + author: 'Erika Silva do Carmo', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso11.html', + img: 'img/colecoes/boas11.jpg', + tags: ['Educação por projetos', 'Narração de histórias', 'Fábulas', 'Alfabetização', 'Cooperação'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Desde 2016 existe o projeto “Minha escola lê e multiplica saberes: viajando no mundo das fábulas†na Escola Estadual Coronel Cruz, em Itacoatiara (AM). Idealizado pela professora do 1º ano Erika do Carmo o projeto começou com fábulas clássicas, como a da galinha dos ovos de ouros, evoluiu para lendas da região amazônica, como a do boto-cor-de-rosa, até trabalhar a autoria própria das crianças. As principais atividades que estimularam os pequenos foram: assistir animações, ler fábulas e reinterpretá-las com desenhos, oralmente e textualmente, além de acompanhar narrativas com teatro de fantoches. O uso das diferentes linguagens melhorou o processo de alfabetização da turma, explorando tópicos como vocabulário e separação de sÃlabas.`, + likes_count: 3 + }); + topicos.push({ + id: 11, + pre_title: 'Caso 12: Horta conecta famÃlias à escola (Competência 2)', + title: '', + author: 'Cleide Maria de Souza', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso12.html', + img: 'img/colecoes/boas12.jpg', + tags: ["Educação por projetos", "Oralidade", "Ciências", "Controle biológico", "Horta", "Consciência socioambiental", "Cooperação", "Participação dos pais"], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `A participação familiar foi crucial para o desenvolvimento do projeto “Horta Vertical: Ajudantes da Natureza†na Centro de Ensino Fundamental Cerâmicas Reunidas Dom Bosco, em BrasÃlia (DF). Comandada pela professora Cleide de Souza, a educação infantil pode entender como a natureza trabalha de forma harmônica e a importância de cada ser vivo para manter a estabilidade ambiental. A relação entre insetos e plantas foi focalizada e, com a ajuda das famÃlias, hortaliças foram plantadas verticalmente em um muro ao lado da sala de aula. A partir de observação contÃnua da horta da escola, além de visita a uma horta orgânica de uma das mães da turma, as crianças aprenderam que os insetos são verdadeiros “ajudantes da naturezaâ€, como elas mesmas definiram.`, + likes_count: 3 + }); + topicos.push({ + id: 12, + pre_title: 'Caso 13: Meu espelho negro (Competência 8)', + title: '', + author: 'Cristiane Santos de Melo', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso13.html', + img: 'img/colecoes/boas13.jpg', + tags: ["Educação por projetos", "Identidade", "Representatividade", "Mulher negra", "Empoderamento feminino", "Cabelo crespo", "Ganhadeiras de Itapuã"], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Em 2015, a professora Cristiane de Melo, do Centro Municipal de Educação Infantil Dr. Djalma Ramos, em Lauro de Freitas (BA), valorizou as raÃzes africanas com o empoderamento do público feminino. O âmbito social, especialmente a mÃdia, poucas vezes apresenta mulheres negras como referencial de beleza, e as crianças da turma não consideravam bonita uma mulher sem pele clara e cabelos lisos. Ao convidar a cantora negra Mariene de Castro como personalidade de referência, esse cenário mudou. Foi aà que surgiu o projeto “Mariene: A flor que desabrochou nossa genteâ€. Por meio de sambas da cantora em parceria com um grupo de ganhadeiras, as meninas vivenciaram a representatividade e aprenderam a valorizar seus traços, como o cabelo crespo. O projeto também ajudou a elevar a autoestima de mães e funcionárias da escola.`, + likes_count: 3 + }); + topicos.push({ + id: 13, + pre_title: 'Caso 14: VestÃgios do tempo (Competência 1)', + title: '', + author: 'Lilian Mara Bonette Bianchini', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso14.html', + img: 'img/colecoes/boas14.jpg', + tags: ["Educação por projetos", "Estudo do meio", "Arqueologia", "Cultura indÃgena", "Caminho de Peabiru", "VestÃgios lÃticos"], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Na cidade de Engenheiro Beltrão (PR) há vestÃgios do Caminho de Peabiru, rota aberta por civilizações pré-coloniais que percorriam territórios entre os Oceanos PacÃfico e Atlântico. A professora de história Lilian Bianchini, da Escola Municipal de Ensino Fundamental Maria Aparecida Medeiros, criou o projeto “Viajando pelos caminhos da nossa história†para mostrar aos alunos do ensino fundamental as marcas dos povos indÃgenas, habitantes do território nacional muito antes da chegada dos europeus. A turma ganhou uma “mala de exploraçãoâ€, onde guardavam o caderno com o registro de suas descobertas a respeito da história e cultura desses povos. A visita a museus da região dedicados ao tema, além da realização de um percurso da rota histórica, deram insumos práticos para a pesquisa dos alunos.`, + likes_count: 3 + }); + + + topicos.push({ + id: 14, + pre_title: 'Caso 15: Além da imaginação (Competência 7) ', + title: '', + author: 'Francisca Deusineide dos Santos Nasário', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso15.html', + img: 'img/colecoes/boas15.jpg', + tags: ['Educação por projetos', 'Pesquisa de campo', 'Lenda urbana','Tradição oral', 'Conto', 'Leitura', 'Reescrita', 'Rosa dos ventos'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `No projeto “A escola onde eu estudo e uma lenda tenebrosaâ€, da professora Francisca Nasário, os curiosos alunos do 4º ano investigaram se era verdadeira a lenda de que a escola teria sido construÃda no terreno de um antigo cemitério. Após entrevistas com antigos moradores, a turma relacionou as histórias da construção da escola à s da formação de Pau dos Ferros (RN), e elaborou de uma linha do tempo. Para apresentar o gênero terror e suspense, a professora pediu aos alunos que produzissem as próprias lendas sobre a escola, inspiradas no que leram ou ouviram, aprendendo com a escrita noções de gênero, ortografia e paragrafação. Os contos reescritos foram lidos em sala de aula e integraram a exposição do Dia do Folclore da Escola Estadual Ubiratan Pereira Galvão.`, + likes_count: 3 + }); + + topicos.push({ + id: 15, + pre_title: 'Caso 16: Redescoberta indÃgena (Competência 3)', + title: '', + author: 'Flávia Roberta Alves Costa', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso16.html', + img: 'img/colecoes/boas16.jpg', + tags: ['Educação por projetos', 'Arte indÃgena', 'Cultura indÃgena', 'Identidade', 'Representatividade'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O projeto “Inspirações indÃgenas†foi criado pela professora de artes Flávia Costa para quebrar estereótipos sobre o que é ser indÃgena nos dias de hoje. Em 2017, a Escola Municipal Divino EspÃrito Santo, no Recife, recebeu a visita de quatro Ãndios fulni-ôs, que conversaram com os alunos. Como os estudantes ficaram interessados na pintura corporal dos Ãndios, Flávia explicou conceitos de produções artÃsticas originais, criações inspiradas nelas e cópias, depois, relacionou a pintura corporal com a body art. Os alunos pintaram o próprio corpo com as palavras força, fé, luta, cultura e resistência. A professora também levou fotos das expressões artÃsticas de quatro etnias presentes em Pernambuco e deu uma oficina de tramas, reciclando sobras de papéis.`, + likes_count: 3 + }); + + topicos.push({ + id: 16, + pre_title: 'Caso 17: Além das fronteiras (Competência 1)', + title: '', + author: 'PatrÃcia dos Santos Lima', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso17.html', + img: 'img/colecoes/boas17.jpg', + tags: ['Educação por projetos', 'Pesquisa na internet', 'Oralidade', 'Cultura', 'Gamificação'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Criado pela professora de inglês PatrÃcia Lima da Escola Estadual de Ensino Fundamental e Médio Marcelo Candia Subsede I, de Porto Velho (RO), o projeto “Viagem inglesa†pede ao ensino médico que “explore†um paÃs de lÃngua inglesa. Cada turma escolhe um paÃs anglófono e tem de buscar informações históricas, geográficas, econômicas e culturais para apresentar aquela realidade numa feira multicultural aberta à comunidade. Os grupos ficam responsáveis por apresentações de dança, teatro, descrições de pratos tÃpicos, entre outras, com parte dessas vivências faladas em inglês. Em paralelo, a professora faz um trabalho de tutoria, ajudando, por exemplo, a apurar os critérios de pesquisa na web para encontrar informações de fontes confiáveis.`, + likes_count: 3 + }); + + topicos.push({ + id: 17, + pre_title: 'Caso 18: Relaxar e dialogar para aprender (Competência 8)', + title: '', + author: 'Carolina Corado da Silva Oliveira', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso18.html', + img: 'img/colecoes/boas18.jpg', + tags: ['Educação por projetos', 'Ansiedade','Relaxamento', 'Diálogo','Protagonismo', 'Autonomia', 'Paulo Freire'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O projeto “Aprender a relaxar e relaxar para aprender: metodologias ativas de ensino em biologia†desenvolvido pela professora Carolina Oliveira com os 1º e 3º anos do Instituto Federal do Rio Grande do Norte, propunha que os alunos se conhecessem melhor, reconhecessem estados de ansiedade para poder cuidar da própriab saúde fÃsica e emocional. Carolina aproximou-se de técnicas comuns à meditação e ao mindfulness para priorizar estratégias de diálogo e facilitar os quatro módulos criados para o ensino de biologia: os alunos conheceram conceitos de metodologia, discutiram bioquÃmica e nutrição ao andarem pelo jardim, responderam perguntas sobre os grupos alimentares e debateram metabolismo em um jogo, e trabalharam citologia ao vivenciarem experiências em sala, comparando as reações de infusão do chá em água quente e em água fria.`, + likes_count: 3 + }); + + topicos.push({ + id: 18, + pre_title: 'Caso 19: Os cordéis da minha terra (Competência 1)', + title: '', + author: 'José Souza dos Santos', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso19.html', + img: 'img/colecoes/boas19.jpg', + tags: ['Educação por projetos', 'Cultura nordestina', 'Folclore', 'Produção artÃstica', 'Cordel', 'Lampião'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O professor de português José dos Santos pediu aos alunos do 8º ano da Escola Municipal de Paripiranga (BA) que se inspirassem na tradição oral de familiares mais velhos, muitos analfabetos, para ir à s ruas colher narrativas fantásticas. Após gravar ou anotar as histórias, os textos passariam da prosa ao verso, mais especificamente, ao cordel. Surgia o projeto “Cordelize a vida! Valorize a sua cultura!â€. Os 24 cordéis escritos pelos alunos foram apresentados à comunidade escolar em uma “tarde de autógrafosâ€, e os entrevistados que deram origem a eles ganharam um livreto correspondente à história que contaram. Além disso, foram produzidos 40 audiolivros para distribuir gratuitamente os cordéis aos estudantes com deficiência visual.`, + likes_count: 3 + }); + + topicos.push({ + id: 19, + pre_title: 'Caso 20: Experimentação robótica (Competência 2)', + title: '', + author: 'Diogo Tiago dos Santos', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso20.html', + img: 'img/colecoes/boas20.jpg', + tags: ['Educação por projetos', 'Tecnologia', 'Robótica', 'Soluções de problemas', 'Autonomia'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O projeto “A criação do grupo de fÃsica e robótica da Escola Estadual Ana Linsâ€, em São Miguel dos Campos (AL), começou com um kit de robótica encontrado no almoxarifado da escola em 2015. Desde então, o professor de fÃsica Diogo dos Santos coordena fundamentos da robótica no contraturno escolar para criar soluções que podem ser úteis à sociedade, como o reaproveitamento da água do ar condicionado para irrigação, uma lixeira “inteligente†que ajuda a separar materiais para reciclagem e um dispositivo para pacientes acamados pedirem ajuda com mais facilidade. Além disso, Diogo pediu que os alunos produzissem artigos cientÃficos para apresentar à comunidade acadêmica o protótipo desenvolvido, trabalhando não apenas fÃsica, como também leitura e escrita.`, + likes_count: 3 + }); + //------------------------------------------------------- + topicos.push({ + id: 20, + pre_title: 'Caso 21: Vivências como fundamento da aprendizagem (Competência 7)', + title: '', + author: 'Maria do Socorro Braga Reis', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso21.html', + img: 'img/colecoes/boas21.jpg', + tags: ['Educação por projetos', 'Crônica', 'Etnografia', 'Vivências', 'Fotografia', 'Reescrita', 'Autoestima'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `A professora de português Maria Reis elaborou o projeto “Histórias qu’eu vi-vi: crônicas etnográficas†para os jovens desenvolver habilidades mais apuradas de escrita, retratando atividades e hábitos cotidianos da comunidade paraense de Bragança. Maria apresentou o gênero crônica, explicou o conceito de etnografia e mostrou vÃdeos que abordavam o fazer etnográfico. Os alunos foram a campo, registraram suas descobertas com fotos e montaram na escola um mural com as imagens. Depois, levaram-no para uma praça perto da escola, onde expuseram as fotos à comunidade. Para a escrita da crônica, cada estudante produziu um texto sobre a prática desenvolvida. As 20 crônicas etnográficas produzidas pelo 2º ano do ensino médio da Escola Estadual Yolanda Chaves foram reunidas em um aplicativo e no site do governo do Estado.`, + likes_count: 3 + }); + + topicos.push({ + id: 21, + pre_title: 'Caso 22: A força da tradição pesqueira está com eles (Competência 6)', + title: '', + author: 'Josiane Mendes Bezerra', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso22.html', + img: 'img/colecoes/boas22.jpg', + tags: ['Educação por projetos', 'Pesca artesanal', 'Educação profissionalizante', 'Turismo', 'Alunos multiplicadores', 'Patrimônio cultural', 'Respeito', 'Empatia', 'Cultura caiçara'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O projeto “Fazendo e acontecendo: pesca artesanal da tainha†foi estruturado pela professora Josiane Bezerra para mobilizar da população sobre o resgate histórico-cultural dessa pesca. Os 150 alunos do ensino médio integrado da Escola de Educação Básica Maria Rita Flor, voltado à educação profissionalizante, assistiram a uma aula com pescadores. DaÃ, buscaram estudos cientÃficos para aprofundar os conhecimentos, criando 12 pôsteres técnico-cientÃficos com enfoques que variaram da história da pesca e do ciclo da tainha a receitas de pratos tÃpicos da região. Baseados em um documentário sobre os pescadores de Bombinhas (SC), os jovens fizeram uma encenação, que mobilizou os professores de geografia, história, matemática e música. Além disso, atuaram como “guias de turismo†ao explicar a pesca artesanal e apresentar a cultura dos pescadores a comunidades locais e visitantes.`, + likes_count: 3 + }); + + topicos.push({ + id: 22, + pre_title: 'Caso 23: Protagonismo na tela do cinema (Competência 5)', + title: '', + author: 'Jayse Antonio da Silva Ferreira', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso23.html', + img: 'img/colecoes/boas23.jpg', + tags: ['Educação por projetos', 'Cinema', 'Protagonismo', 'Autonomia', 'Participação dos pais', 'Preconceito', 'Inclusão'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Criado pelo professor de arte Jayse Ferreira, o projeto “Vamos enCURTAr essa história?†nasceu com a proposta de os alunos produzirem curtas-metragens a partir dos próprios referenciais. Os dois primeiros curtas eram releituras de outras obras, mas para o terceiro o professor sugeriu um trabalho autoral: os alunos teriam que escrever histórias referentes à escola e a um tema social. Para tal, pediu ajuda de egressos da escola em oficinas de dinâmica corporal e de um escritor da cidade para aulas de roteiro. O argumento do suspense “Entre dois ladosâ€, de 17 minutos, surgiu do depoimento de um morador que perdeu a perna após um acidente em que dirigia alcoolizado. Os curtas dos alunos da Escola de Referência em Ensino Médio Frei Orlando foram exibidos na praça central de Itambé (PE).`, + likes_count: 3 + }); + + topicos.push({ + id: 23, + pre_title: 'Caso 24: O celular como ferramenta pedagógica (Competência 5)', + title: '', + author: 'Erizaldo Cavalcanti Borges Pimentel', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso24.html', + img: 'img/colecoes/boas24.jpg', + tags: ['Educação por projetos', 'Cinema', 'Celulares', 'Cultura digital', 'Pensamento crÃtico', 'Cooperação', 'Responsabilidade'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Contrariando a norma, que proibia o uso do celular em horário de aula, o professor Erizaldo Pimentel criou o projeto “Cine com ciência: luz, câmera... Educação!â€. Nele, alunos 6º ao 9º ano do Centro de Ensino Fundamental 01 do Cruzeiro, na região administrativa de BrasÃlia (DF), têm que produzir vÃdeos com seus smartphones. O professor ensina conceitos da linguagem cinematográfica, e detalha as etapas de pré-produção, em que os alunos devem elaborar a narrativa e o roteiro técnico, estimulando os estudantes à leitura, também analisa cenas de filmes e discute enquadramento e posicionamento de câmera. Os temas estão relacionados ao mundo dos estudantes, com forte traço social e desestimulando a violência. Em três anos de projeto, são cerca de 50 curtas finalizados.`, + likes_count: 3 + }); + + topicos.push({ + id: 24, + pre_title: 'Caso 25: Aplicativo para a saúde do jovem (Competência 2)', + title: '', + author: 'Elmara Pereira de Souza', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso25.html', + img: 'img/colecoes/boas25.jpg', + tags: ['Educação por projetos', 'Programação', 'Jogo digital', 'Alimentação', 'Atividade fÃsica', 'Investigação', 'Autonomia'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Na “Incubadora de projetos: a experiência de construção do jogo digital Choices sobre a importância da alimentação saudável e da prática de atividade fÃsica na adolescênciaâ€, a professora Elmara Souza, do Centro Juvenil de Ciência e Cultura de Vitória da Conquista, exercitou a curiosidade de estudantes interessados em programação para criar um game que ajudasse os jovens a refletir sobre a saúde. O jogo digital tornou-se a história de um adolescente que pode voltar no tempo para fazer escolhas cotidianas mais saudáveis. Os jovens contaram com o apoio de um aluno de ciências da computação e de uma nutricionista para registrar parâmetros de colesterol e triglicérides no sangue. Premiado em um edital da Fundação de Amparo à Pesquisa do Estado da Bahia, o projeto rendeu um artigo, escrito pelos jovens com a ajuda da professora, para um congresso da Sociedade Brasileira para o Progresso da Ciência.`, + likes_count: 3 + }); + + topicos.push({ + id: 25, + pre_title: 'Caso 26: Tabuleiro de respeito (Competência 9)', + title: '', + author: 'Raquel de Oliveira Campos', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso26.html', + img: 'img/colecoes/boas26.jpg', + tags: ['Educação por projetos', 'Gamificação', 'Biomas', 'Cooperação', 'Diálogo', 'Responsabilidade', 'Autoestima'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O projeto “Tabuleiro humano: uma viagem de descobertas pelos biomas brasileiros em defesa da vidaâ€, desenvolvido no Colégio Estadual Pedro Ãlvares Cabral de São João de Meriti (RJ), foi criado pela professora de biologia Raquel Campos, com sua turma do 1º ano do ensino médio. Os alunos construÃram um tabuleiro de seis metros quadrados com o mapa brasileiro dividido nos seis biomas do paÃs: Pampa, Mata Atlântica, Caatinga, Cerrado, Pantanal e Amazônia. Em sala, seis grupos pesquisaram os biomas e aspectos culturais, históricos e linguÃsticos dessas áreas. Em casa, os jovens elaboraram perguntas lidas no jogo, em formato de quiz. No dia da competição, os estudantes venceram com facilidade a turma adversária, que não havia se engajado no trabalho pedagógico. Além disso, a dinâmica do jogo favoreceu o exercÃcio da cooperação e o diálogo na turma.`, + likes_count: 3 + }); + + topicos.push({ + id: 26, + pre_title: 'Caso 27: Matemática para todos (Competência 4)', + title: '', + author: 'AdalgÃsio Gonçalves Soares', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso27.html', + img: 'img/colecoes/boas27.jpg', + tags: ['Educação por projetos', 'Curta-metragem', 'Malba Tahan', 'Resolução de problemas', 'Cultura digital', 'Cooperação', 'Responsabilidade'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `O projeto “Festival de curtas, uma viagem à s mil e uma noites de Malba Tahan†apresentou contos do escritor aos alunos dos 8 e 9º anos da Escola Estadual Presidente Costa e Silva. Os estudantes se dividiram em grupos, resolveram coletivamente um desafio matemático presente na obra escolhida e, a partir daÃ, pensarem em uma narrativa para um filme. Além de apoiar as soluções dos problemas, o professor de matemática AdalgÃsio Soares alinhou as histórias ao conteúdo da disciplina, usando os contos para explicar equações do primeiro grau, operações com números racionais, entre outros. O professor trabalhou também o estudo do gênero textual e habilidades de leitura e escrita. Os moradores de Minas Novas (MG) ajudaram a viabilizar o festival de curtas-metragens, que exibiu 20 filmes em praça pública.`, + likes_count: 3 + }); + + topicos.push({ + id: 27, + pre_title: 'Caso 28: O segredo dos seus olhos (Competência 10)', + title: '', + author: 'Elisangela Marina de Freitas e Silva', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso28.html', + img: 'img/colecoes/boas28.jpg', + tags: ['Educação por projetos', 'Pré-história', 'Arqueologia', 'Acessibilidade', 'Inclusão', 'Braile',' Desenho universal para a aprendizagem'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `A professora substituta de história Elisangela Silva encarou um desafio na Escola Básica Municipal Intendente Aricomedes da Silva, em Florianópolis: um aluno do 6º ano era cego. Visando sua inclusão, a professora recorreu à expertise das docentes Rosângela Kittel e Ruth dos Santos para trabalhar os conteúdos sobre pré-história, dando origem ao projeto “História nas pontas dos dedos: a acessibilidade ao conteúdo de pré-históriaâ€. A partir de elementos táteis, como materiais em braile e confecção de objetos em relevo, o aluno conseguiu vivenciar a aprendizagem plenamente. Para além de adaptar os conteúdos somente a ele, as docentes programaram atividades que permitissem que qualquer estudante pudesse agir com autonomia, democratizando, assim, o acesso ao conhecimento. `, + likes_count: 3 + }); + + topicos.push({ + id: 28, + pre_title: 'Caso 29: Esta escola lhes pertence (Competência 3)', + title: '', + author: 'Paulo Augusto Nedel', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso29.html', + img: 'img/colecoes/boas29.jpg', + tags: ['Educação por projetos', 'Cultura artÃstica', 'Pintura', 'Autonomia', 'Pertencimento', 'Patrimônio escolar'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Idealizado pelo professor Paulo Nedel, o “Ateliê do GV†foi implantado em 2015 na Escola Municipal Presidente Getúlio Vargas, em Viamão (RS). O ateliê funciona no contraturno e os alunos do 5º ao 9º ano podem reproduzir pinturas de diferentes artistas sob a orientação de Paulo, que explica o processo de reprodução da imagem, como a mistura de cores e a maneira de pintar. O tempo de finalização varia de acordo com a complexidade do quadro e os estudantes, em geral, fazem duas assinaturas nos trabalhos, a dos autores originais e as deles. Em 2016, com a escola reformada e repintada, foi o momento de distribuir os quadros dos alunos pelas paredes. Os “corredores artÃsticos†fortaleceram o respeito pelo espaço escolar e os laços com a comunidade. No inÃcio de 2018, o ateliê contava com 110 reproduções.`, + likes_count: 3 + }); + + topicos.push({ + id: 29, + pre_title: 'Caso 30: O autocuidado como necessidade (Competência 8)', + title: '', + author: 'Alessandra Aparecida Neves', + //url: 'http://especializacao-pobreza.mec.gov.br/modulos/intro/index.html', + url: 'https://chapa2-ced-com-br.umbler.net/casos/caso30.html', + img: 'img/colecoes/boas30.jpg', + tags: ['Educação por projetos', 'Leitura', 'Interpretação de texto', 'Literatura', 'Miniconto', 'Pesquisa na internet', 'Saúde emocional', 'Psicologia', 'Teoria da recepção'], + score: 100, + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: `Tendo como mote “o desafio da baleia azulâ€, a professora de português Alessandra Neves, em Dourados (MS), elaborou o projeto “Sem tristezas constantes, sem cortes, sem mortes precoces, entender para compreender-seâ€, envolvendo leitura, compreensão, interpretação e produção textual. Trabalhou com a música “Bring me to lifeâ€, com as obras “Amor de Perdição†e “Romeu e Julieta†e o filme “Inocênciaâ€. Então solicitou aos alunos pesquisas sobre depressão e suicÃdio. Para apresentá-las, a sala virou um “café-viagemâ€: cada grupo tinha um “anfitrião†que compartilhava os conhecimentos com os colegas. As atividades resultaram em microcontos sobre a temática. O projeto terminou com um papo com uma psicóloga, que orientou os jovens sobre os riscos das interações pela internet e os deixou à vontade para expor os próprios sentimentos.`, + likes_count: 3 + }); + //------------------------------------------------------- + + colecao = { + id: 3, + name: 'Banco de Práticas Inspiradoras', + tags: _tags, + developed: 'Instituto PenÃnsula', + developedurl: 'http://www.institutopeninsula.org.br', + topic_name: 'Casos', + topics: topicos, + score: 100, + img: 'img/ipen_capa.jpg', + duration: 50, + created_at: '2018-03-26T00:31:24.484Z', + updated_at: '2018-03-26T12:41:22.885Z', + language: { + id: 1, + name: 'Português', + code: 'pt' + }, + license: null, + description: 'É um acervo de práticas inspiradoras realizadas por professores da rede pública de ensino e que estão vinculadas à s dez competências gerais da Base Nacional Comum Curricular (BNCC). O objetivo é promover uma reflexão mais ampla sobre o papel dos professores, inspirar os docentes a desenvolverem práticas inovadoras e ajudá-los na implementação da Base em suas realidades, bem como valorizar o trabalho destes e tantos outros professores extraordinários pelo Brasil. As práticas, relatadas em formato de artigo e vÃdeo, foram desenvolvidas por professores de todo o Brasil, finalistas do Prêmio Professores do Brasil 2017. Conheça mais sobre o projeto aqui: https://www.youtube.com/watch?v=ceJywQbZSM8', + historic: `O Banco de Práticas inspiradoras é uma iniciativa realizada pelo Instituto PenÃnsula e Ministério da Educação. `, + likes_count: 3, + }; + + colecoes.push(colecao); + // ------------------------------------------------------------------ + + // var epd = Object.assign({}, colecoes[0]); + // epd.id = 3; + // + // colecoes.push(epd); + + ///// + + //console.log(colecoes); + //console.dir(colecoes, { depth: null }); + //console.log(JSON.stringify(colecoes, null, 4)); + + return colecoes; +} diff --git a/src/Components/FormationMaterialsResources/formationMaterials.json b/src/Components/FormationMaterialsResources/formationMaterials.json new file mode 100644 index 0000000000000000000000000000000000000000..977441590578b4d4b3cf58b031f26479f91fc87a --- /dev/null +++ b/src/Components/FormationMaterialsResources/formationMaterials.json @@ -0,0 +1,1898 @@ +[ + { + "id": 0, + "name": "Educação, Pobreza e Desigualdade Social", + "tags": [ + { + "name": "Desigualdade" + }, + { + "name": "Desigualdade Social" + }, + { + "name": "Pobreza" + }, + { + "name": "Educação" + }, + { + "name": "Coleção" + }, + { + "name": "EPDS" + }, + { + "name": "Espaços Escolares" + }, + { + "name": "CurrÃculo" + } + ], + "developed": "Nute UFSC", + "developedurl": "http://lantec.ufsc.br", + "topic_name": "Módulos", + "topics": [ + { + "id": 0, + "pre_title": "Módulo Introdutório", + "title": "", + "author": "Miguel Arroyo", + "url": "https://sgmd.nute.ufsc.br/content/secadi-formacao-continuada-pbf/intro/index.html", + "img": "img/colecoes/pobreza0.jpg", + "tags": [ + { + "name": "Desigualdade" + }, + { + "name": "Desigualdade Social" + }, + { + "name": "Pobreza" + }, + { + "name": "Educação" + }, + { + "name": "Coleção" + }, + { + "name": "EPDS" + }, + { + "name": "Espaços Escolares" + }, + { + "name": "CurrÃculo" + } + ], + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Introdutório†do curso “Educação, Pobreza e Desigualdade Social†é explicitada a relação entre a pobreza,\n as desigualdades sociais e a educação. São explicitados caminhos para a reflexão e ações problematizadoras sobre as\n temáticas apresentadas no contexto da educação, a fim de expor a situação de exclusão social.\n O módulo ainda propõe uma discussão que, de um lado, possibilita entender a pobreza para repensar os currÃculos e as práticas educacionais e, de outro, permita cultivar a\n sensibilidade para ouvir e incorporar, no exercÃcio docente, as questões que ecoam nas vivências da pobreza. O material foi elaborado para\n este curso de Especialização, na modalidade de ensino a distância, tendo em vista seu papel na formação continuada de educadores e agentes\n educacionais. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 1, + "pre_title": "Módulo I: ", + "title": "Pobreza e cidadania", + "author": "Walquiria Leão Rego e Alessandro Pinzani", + "url": "https://sgmd.nute.ufsc.br/content/secadi-formacao-continuada-pbf/mod-1/index.html", + "img": "img/colecoes/pobreza1.jpg", + "tags": [ + { + "name": "Desigualdade" + }, + { + "name": "Desigualdade Social" + }, + { + "name": "Pobreza" + }, + { + "name": "Educação" + }, + { + "name": "Coleção" + }, + { + "name": "EPDS" + }, + { + "name": "Espaços Escolares" + }, + { + "name": "CurrÃculo" + } + ], + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O módulo “Pobreza e Cidadania†do curso “Educação, Pobreza e Desigualdade Social†pretende não só analisar as relações\n entre pobreza e cidadania, mas também oferecer uma imagem da pobreza mais complexa e multifacetada do que aquela que normalmente as\n pessoas de outras classes tendem a formar. Ademais, apresentam-se algumas considerações teóricas sobre a relação entre dinheiro,\n processos de autonomia e de capacitação moral, bem como sobre a questão da opressão de gênero. Ao longo do texto também é proposta a\n desconstrução de alguns dos preconceitos mais comuns sobre as pessoas em condição de pobreza e suas vidas. O material foi elaborado para\n este curso de Especialização, na modalidade de ensino a distância, tendo em vista seu papel na formação continuada de educadores e agentes\n educacionais. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 2, + "pre_title": "Módulo II: ", + "title": "Pobreza, Direitos Humanos, Justiça e Educação", + "author": "Erasto Fortes Mendonça", + "url": "https://sgmd.nute.ufsc.br/content/secadi-formacao-continuada-pbf/mod-2/index.html", + "img": "img/colecoes/pobreza2.jpg", + "tags": [ + { + "name": "Desigualdade" + }, + { + "name": "Desigualdade Social" + }, + { + "name": "Pobreza" + }, + { + "name": "Educação" + }, + { + "name": "Coleção" + }, + { + "name": "EPDS" + }, + { + "name": "Espaços Escolares" + }, + { + "name": "CurrÃculo" + } + ], + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Pobreza, Direitos Humanos, Justiça e Educação†do curso “Educação, Pobreza e Desigualdade Social†tem-se o objetivo de entender o papel estratégico da relação entre educação e direitos humanos no enfrentamento e na superação da pobreza e na construção de um sociedade justa, igualitária e fraterna. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista seu papel na formação continuada de educadores e agentes educacionais. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 3, + "pre_title": "Módulo III: ", + "title": "Escola: Espaços e tempo de reprodução e resistências da pobreza", + "author": "Lúcia Helena Alvarez Leite", + "url": "https://sgmd.nute.ufsc.br/content/secadi-formacao-continuada-pbf/mod-3/index.html", + "img": "img/colecoes/pobreza3.jpg", + "tags": [ + { + "name": "Desigualdade" + }, + { + "name": "Desigualdade Social" + }, + { + "name": "Pobreza" + }, + { + "name": "Educação" + }, + { + "name": "Coleção" + }, + { + "name": "EPDS" + }, + { + "name": "Espaços Escolares" + }, + { + "name": "CurrÃculo" + } + ], + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Escola: Espaços e tempo de reprodução e resistências da pobreza†do curso “Educação, Pobreza e Desigualdade Social†pretende-se discutir as relações entre cultura escolar e desigualdade social, buscando analisar as representações sociais sobre as infâncias, adolescência, juventudes e vivências de pobreza no brasil, e o papel do Bolsa FamÃlia na garantia do direito ao acesso e à permanência na escola pública. Ainda é proposta a discussão do papel da escola no processo de reprodução das desigualdades sociais e a luta dos movimentos sociais pelo direito à educação e a uma escola para as camadas populares. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista seu papel na formação continuada de educadores e agentes educacionais. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 4, + "pre_title": "Módulo IV: ", + "title": "Pobreza e CurrÃculo: uma complexa articulação", + "author": "Miguel Gonzalez Arroyo", + "url": "https://sgmd.nute.ufsc.br/content/secadi-formacao-continuada-pbf/mod-4/index.html", + "img": "img/colecoes/pobreza4.jpg", + "tags": [ + { + "name": "Desigualdade" + }, + { + "name": "Desigualdade Social" + }, + { + "name": "Pobreza" + }, + { + "name": "Educação" + }, + { + "name": "Coleção" + }, + { + "name": "EPDS" + }, + { + "name": "Espaços Escolares" + }, + { + "name": "CurrÃculo" + } + ], + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Pobreza e CurrÃculo: uma complexa articulação†do curso “Educação, Pobreza e Desigualdade Social†busca-se resgatar a concepção de currÃculo, explicitando o seu reflexo nas práticas pedagógicas docentes. Neste núcleo o currÃculo é retratado como fator que exprime a ideologia, as relações de poder e a cultura de cada unidade escolar. Cabe ao docente, por exemplo, reproduzir as desigualdades e injustiças sociais ou contribuir para a construção de uma sociedade efetivamente democrática. Existem três tipos de currÃculos: um formal, um real e um oculto. Essa compreensão inicial é fundamental para a discussão neste módulo sobre currÃculo e pobreza. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista seu papel na formação continuada de educadores e agentes educacionais. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + } + ], + "score": 100, + "img": "img/colecoes/pobreza.png", + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "A relação entre educação, escola, polÃticas educacionais, formação docente, currÃculos, teorias pedagógicas e o primeiro direito do ser humano a um digno e justo viver tem estado, em certa medida, ausente no pensamento educacional e nas suas polÃticas, bem como na formação de profissionais da educação básica e de outros(as) profissionais que estabelecem relações com a educação em contextos empobrecidos. O material busca abrir caminhos reflexivos para a contextualização, reflexão e problematização da situação de pobreza e desigualdade social, além de propor a atividade de repensar os currÃculos e práticas educacionais para incluir tal tema e cultivar a sensibilidade para ouvir e incorporar, no exercÃcio docente, as questões que ecoam nas vivências da pobreza.", + "historic": "O curso foi criado numa parceria entre a Secretaria de Educação Continuada, Alfabetização, Diversidade e Inclusão do Ministério da Educação – SECADI/MEC e a Universidade Federal de Santa Catarina com objetivo de propiciar a coordenadores, gestores, agentes educacionais e professores de todo o Brasil a reflexão sobre a realidade que envolve a pobreza e a desigualdade social e as possibilidades postas pela educação para que essa realidade seja problematizada e transformada. O curso foi concluÃdo em 2016, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 1, + "name": "Educação na Cultura Digital", + "tags": [ + { + "name": "Educação" + }, + { + "name": "Cultura" + }, + { + "name": "Digital" + }, + { + "name": "Coleção" + }, + { + "name": "ECD" + }, + { + "name": "Espaços Escolares" + } + ], + "developed": "Nute UFSC", + "developedurl": "http://lantec.ufsc.br", + "topic_name": "Módulos", + "topics": [ + { + "id": 0, + "pre_title": "", + "title": "Formação de Educadores na Cultura Digital", + "author": "Edla Maria Faust Ramos - (UFSC), Lia Cristina Barata Cavellucci e Célia Reichert Engelmann", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/formadores/cenario.html", + "img": "img/colecoes/ecd1.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No Módulo “Formação de Educadores na Cultura Digital†do curso “Educação na Cultura Digitalâ€, tem-se como propósito geral de estudos contextualizar e problematizar os processos de formação de docentes e aportar elementos que contribuam para a construção de novas propostas de intervenção para a formação continuada de professores(as) com foco na integração das Tecnologias de Informação e Comunicação nas escolas e seus diversos usos.\n\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 1, + "pre_title": "", + "title": "Gestão para Integração das TDIC ao CurrÃculo", + "author": "Maria Elizabeth Bianconcini Trindade Morato Pinto de Almeida, Maria Elisabete Brisola Brito Prado, Lia Cristina Barata Cavellucci e Odete Sidericoudes", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/gestao/menu-topicos.html", + "img": "img/colecoes/ecd2.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Gestão para a Integração das TDIC ao CurrÃculo†do curso “Educação na Cultura Digital†procura-se focalizar temas relacionados à prática da gestão escolar, considerando alguns aspectos deste contexto e tendo como fio condutor o tempo tal como o vivenciamos hoje. Em seguida, analisam-se as repercussões da cultura digital nas práticas de gestão escolar e, por fim, busca-se o desafio de o exercitar o olhar para o futuro. O objetivo é criar um espaço de problematização, discussão e de busca de respostas, e esboçar caminhos para a gestão escolar situada na cultura digital, sempre tendo como meta principal a qualidade da formação dos alunos oferecida pela escola.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 2, + "pre_title": "", + "title": "Tecnologias Assistivas", + "author": "Liliana Maria Passerino (FACED/UFRGS) e PatrÃcia Maria Vargas de Lima (Sec. Mun. de Educação de Florianópolis)", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/tecnologias-assistivas-2/pagina-16.html", + "img": "img/colecoes/ecd3.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No Módulo de “Tecnologias Assistivas†do curso “Educação na Cultura Digital†propõe-se que vocês desafiem-se, permitam-se, encantem-se e reencantem-se com a temática e com o universo chamado inclusão. O núcleo ainda tem como norte apresentar recursos de acessibilidade que facilitarão a navegação na hipermÃdia e analisar as possibilidades de uso, adaptação e criação de artefatos, estratégias e serviços em Tecnologia Assistiva sob a perspectiva da Educação Inclusiva.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 3, + "pre_title": "", + "title": "A Prática Docente na Educação Infantil e TDIC", + "author": "PatrÃcia de Moraes Lima e Ivana Martins da Rosa", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/educacao-infantil/pagina.html", + "img": "img/colecoes/ecd4.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No Módulo “A Prática Docente na Educação InfantIl e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é proposto um novo percurso de aprendizagem que busca estabelecer conexões entre os seus conhecimentos prévios e os aqui propostos, no intuito de integrar o uso das TDIC à s práticas pedagógicas na Educação Infantil. Ainda são propostas discussões sobre experiências pedagógicas e análises dos Núcleos de Ação Pedagógica (NAPs), entre outras problematizações do âmbito da Educação Infantil. Busca-se, com este núcleo, contribuir para a construção de conhecimentos e reflexões sobre o saber/fazer nas práticas pedagógicas no contexto abordado.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 4, + "pre_title": "", + "title": "Educação FÃsica e TDIC", + "author": "Giovani De Lorenzi Pires (UFSC), Juliano Silveira (UFSC), Rodrigo Ferrari (UFSC), Lyana Thédiga de Miranda (UFSC), Gilson Cruz Junior (UFSC) e André Quaranta (UFSC)", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/educacao-fisica/menu-topicos.html", + "img": "img/colecoes/ecd5.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Educação FÃsica e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†apresentam-se as especificidades da Educação FÃsica escolar e suas relações com as Tecnologias Digitais de Informação e Comunicação (TDIC). Busca-se um caminho interdisciplinar com os demais componentes curriculares, dialogando teoricamente com a ideia de mÃdia-educação, referindo-se tanto à metodologia e à crÃtica como ao contexto produtivo-expressivo (FANTIN, 2006). Portanto, este material foi pensado como um meio pelo qual podem-se explorar essas necessidades e questões. Ler, refletir, produzir e intervir em sala de aula serão alguns dos caminhos sugeridos nesta empreitada.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 5, + "pre_title": "", + "title": "Aprendizagem de Artes Visuais e TDIC", + "author": "Maria Cristina da Rosa Fonseca da Silva, PatrÃcia Maria Macedo Alves e Jaymini Pravinchandra Shah", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/artes/pagina.html", + "img": "img/colecoes/ecd6.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No Módulo “Aprendizagem de Artes Visuais e TDIC†do curso “Educação na Cultura Digital†propõe-se apresentar alguns aspectos relevantes ao mundo artÃstico que têm se transformado com o desenvolvimento tecnológico no mundo das Artes Visuais e suas perspectivas, de modo que você possa rever suas práticas pedagógicas através de novos conhecimentos e proporcione aos(à s) seus(suas) alunos(as) novos saberes artÃsticos, por meio de um diálogo entre distintos gêneros artÃsticos e sua transformação ao longo dos séculos.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 6, + "pre_title": "", + "title": "Aprendizagem de LÃngua Estrangeira e TDIC", + "author": "Celso Henrique Soufen Tumolo, FabÃola Teixeira Ferreira, Juliana Cristina Faggion Bergmann e Nadia Karina Ruhmke Ramos", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/lingua-estrangeira/pagina-9.html", + "img": "img/colecoes/ecd7.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Ensino-Aprendizagem de LÃnguas Estrangeiras e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é priorizado o emprego das tecnologias em sua área especÃfica de trabalho na escola e também reflete-se sobre as possibilidades oferecidas pela tecnologia para auxiliá-lo(a) a criar práticas pedagógica e soluções para as questões que surgem em sala de aula, além de oferecer subsÃdios para o desenvolvimento de atividades de ensino e aprendizagem. O objetivo principal é demonstrar como a tecnologia pode ser uma grande aliada na resolução dos desafios pedagógicos que se apresentam no contexto escolar.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 7, + "pre_title": "", + "title": "Aprendizagem de Matemática no Ensino Fundamental e TDIC", + "author": "Marcus Vinicius de Azevedo Basso (UFRGS), Crediné Silva de Menezes (UFRGS), Márcia Rodrigues Notare Meneghetti (UFRGS), Fabiana Fattore Serres (Colégio de Aplicação/UFRGS) e Elisa Friedrich Martins (EMEF Dep. MarcÃrio Goulart Loureiro/POA-RS)", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/matematica-ef/apresentacao.html", + "img": "img/colecoes/ecd8.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo de “Aprendizagem Matemática no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†pretende-se ajudá-lo(a) a compreender como a incorporação do computador e da internet nas práticas pedagógicas podem apoiar o trabalho de docentes e discentes em aprender a matemática de uma maneira aprofundada, com menos esforço “braçal†e com mais satisfação. Acredita-se que a utilização de ferramentas digitais e algumas formas diferenciadas de trabalhar possam modificar e melhor qualificar as aprendizagens. Espera-se que todos e todas tenham a oportunidade de experimentar, dialogar, debater, refletir e, por fim, construir conhecimento sobre uma nova forma de ensinar e aprender Matemática.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 8, + "pre_title": "", + "title": "Aprendizagem de LÃngua Portuguesa no Ensino Fundamental e TDIC", + "author": "Jacqueline Peixoto Barbosa (PUCSP), Eduardo de Moura Almeida (Co-autor pesquisador), Nayara Moreira Santos (Co-autor pesquisador) e Amanda Lacerda de Lacerda (Co-autor escola)", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/portugues-ef2/apresentacao.html", + "img": "img/colecoes/ecd9.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Aprendizagem de LÃngua Portuguesa no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é possÃvel explorar os conhecimentos da esfera digital no uso da linguagem a partir de quatro perspectivas: a tecnológica, a cientÃfica, a literária e a jornalÃstica. A organização deste núcleo é feita a partir da escolha de diferentes gêneros multimodais, articulada com a vivência e/ou análise de práticas, processos e ações tÃpicos da Web 2.0, e do domÃnio básico do manuseio de editores de imagem, áudio e vÃdeo, e de ferramentas de editoração eletrônica. Pretende-se que, com a formação desenvolvida, você seja capaz de usar e identificar os textos multimodais e multissemióticos presentes no dia a dia e que possa, também, incorporar tal aprendizado à sua prática docente.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 9, + "pre_title": "", + "title": "Aprendizagem de História no Ensino Fundamental e TDIC", + "author": "Carla Ferretti Santiago (PUC Minas), Eucidio Pimenta Arruda (UFMG) e Fernanda Dinardo do Nascimento (Escola Municipal Adelina Gonçalves Campos - Betim/MG)", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/historia-ef/apresentacao.html", + "img": "img/colecoes/ecd10.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Aprendizagem de História no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†o que propõe-se é a problematização dos diferentes significados e usos dos materiais e ambientes digitais por meio da reflexão de suas implicações para o ensino e aprendizagem de história. Considera-se importante revelar as mudanças e permanências que as tecnologias de comunicação e informação digitais possibilitam na compreensão e incorporação de categorias fundamentais do campo do saber histórico escolar, como: tempo/temporalidades, memória/registros, entre outros. Em sÃntese, a proposta parte dos materiais, recursos e meios digitais para, então, refletir as suas implicações na compreensão de conceitos fundantes do conhecimento histórico. Defende-se que uma postura crÃtica e ativa diante dos meios digitais pode contribuir para que docentes e alunos(as) (re)afirmem seu protagonismo no mundo contemporâneo marcado pela cultura digital.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 10, + "pre_title": "", + "title": "Aprendizagem de Geografia no Ensino Fundamental e TDIC", + "author": "Rosa Elisabete Militz Wypyczynski Martins e Roberto Souza Ribeiro", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/geografia-ef/apresentacao.html", + "img": "img/colecoes/ecd11.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Aprendizagem de Geografia no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†tem-se como objetivo refletir sobre práticas de ensino e aprendizagem de Geografia com o uso das TDIC. É desenvolvida a problematização de conceitos geográficos e as utilizações no TDIC no âmbito da aprendizagem, articulando e analisando a realidade em que vivemos na intenção de favorecer o ensino-aprendizagem.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 11, + "pre_title": "", + "title": "Aprendizagem de Ciências no Ensino Fundamental e TDIC", + "author": "Marina Bazzo de EspÃndola, Gabriela de Leon Nóbrega Reses, PatrÃcia Barbosa Pereira e Ivan Tavares Scotelari de Souza", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/ciencias-ef/menu-topicos.html", + "img": "img/colecoes/ecd12.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Aprendizagem de Ciências no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†tem-se como objetivos proporcionar a compreensão do como as TDIC podem ser inseridas no processo de ensino e aprendizagem de conhecimentos cientÃficos, estimular o(a) cursista a ter uma postura ativa e investigadora no decorrer dos estudos e, também, contribuir, por meio de fundamentação teórica e atividades práticas, para a ampliação de conhecimentos do(a) professor sobre essas tecnologias. Almeja-se que, ao final dos estudos do núcleo, você possa propor iniciativas de integração de TDIC na educação em Ciências Naturais, a partir das suas necessidades de ensino e das necessidades especÃficas desta área de conhecimento.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 12, + "pre_title": "", + "title": "Aprendizagem de Matemática no Ensino Médio e TDIC", + "author": "Marcus Vinicius de Azevedo Basso (UFRGS), Crediné Silva de Menezes (UFRGS), Márcia Rodrigues Notare Meneghetti (UFRGS), Fabiana Fattore Serres (Colégio de Aplicação/UFRGS) e Elisa Friedrich Martins (EMEF Dep. MarcÃrio Goulart Loureiro/POA-RS)", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/matematica-em/menu-topicos.html", + "img": "img/colecoes/ecd13.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Aprendizagem de Matemática no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†propõe-se uma imersão na cultura digital pelos caminhos da Matemática. A intenção é ajudá-lo(a) a compreender como a incorporação do computador e da internet em nossas práticas pedagógicas podem apoiar o trabalho dos(as) professores(as) e propiciar aos(as) alunos(as) o aprendizado de Matemática de uma maneira mais profunda, com menos esforço “braçal†e mais satisfação. Acredita-se que a utilização de ferramentas digitais e algumas formas diferenciadas de trabalhar Matemática possam modificar e qualificar as aprendizagens, e espera-se que todos tenham a oportunidade de experimentar, dialogar, debater, refletir e, por fim, construir conhecimentos sobre uma nova forma de ensinar e aprender Matemática.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 13, + "pre_title": "", + "title": "Aprendizagem de LÃngua Portuguesa no Ensino Médio e TDIC", + "author": "Roxane Rojo (IEL-UNICAMP), Saulo da Silva Oliveira (ETEC Parque da Juventude, Centro Paula Sousa/SEE-SP), Jezreel Gabriel Lopes (IEL-UNICAMP, mestrado), João Reynaldo Pires Jr. (IEL-UNICAMP, mestrado) e Kátia Sayuri Fujisawa (IEL-UNICAMP, mestrado)", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/portugues-em2/menu-topicos.html", + "img": "img/colecoes/ecd14.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Aprendizagem de LÃngua Portuguesa no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†são explorados os conhecimentos da esfera digital no uso da linguagem a partir de quatro perspectivas: a tecnológica, a cientÃfica, a literária e a jornalÃstica. Pretende-se que, com a formação desenvolvida, você seja capaz de usar e identificar os textos multimodais e multissemióticos presentes no dia a dia e que também possa incorporar tal aprendizado à sua prática docente. Vale ressaltar que, em muitos momentos, você será convidado(a) a refletir, por meio de questionamentos, acerca de diversos assuntos relacionados com o conteúdo.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 14, + "pre_title": "", + "title": "Aprendizagem de QuÃmica no Ensino Médio e TDIC", + "author": "Edson Luiz Lindner - (CA/UFRGS), Victor João da Rocha Maia Santos e Gabriela da Fontoura Rodrigues Selmi", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/quimica-em/pagina-15.html", + "img": "img/colecoes/ecd15.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Aprendizagem de QuÃmica no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†são organizados três momentos, que contemplam: a) a construção de olhares e reflexões sobre o papel das TDIC no processo de ensino-aprendizagem em QuÃmica; b) a utilização de vÃdeos na experimentação quÃmica; e c) a inserção e utilização de sistemas interativos, com destaque nos ambientes de autoria, como possibilidade de construir e representar o conhecimento quÃmico. A dinâmica de estudo irá ocorrer tanto por meio de atividades de estudos teóricos quanto de desenvolvimento de atividades práticas.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 15, + "pre_title": "", + "title": "Aprendizagem de FÃsica no Ensino Médio e TDIC", + "author": "Henrique César da Silva, Patrick de Souza Girelli, Rafaela Rejane Samagaia e Fernando da Silva Calsavara", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/fisica-em/pagina.html", + "img": "img/colecoes/ecd16.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Aprendizagem de FÃsica no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†serão apresentados e sugeridos modos de utilização de alguns conceitos e tecnologias digitais da informação e comunicação (TDIC) como forma de subsidiar a constituição de propostas didáticas no âmbito do ensino de FÃsica. Para isso, nesse caso, a temática \"Nanociência & Nanotecnologias\" (N&N) foi escolhida como eixo deste núcleo. Assim, em um primeiro momento, a ideia é que se possa navegar e aprofundar melhor o entendimento dessa temática e sua relação com as TDIC. Em seguida, será importante lançar um olhar para a nossa realidade, com o intuito de perceber as potencialidades didáticas fomentadas pelas TDIC que emergem como possibilidades para o contexto em foco.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 16, + "pre_title": "", + "title": "Aprendizagem de Biologia no Ensino Médio e TDIC", + "author": "Simão Pedro Pinto Marinho e Alessandra Marinho", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/biologia-em2/menu-topicos.html", + "img": "img/colecoes/ecd17.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Aprendizagem de Biologia no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†você será convidado(a) a refletir sobre a interface TDIC e Ensino de Biologia, (re)pensando sobre sua prática pedagógica e entrando em contato com novos recursos e ferramentas que apresentam as mais diversas potencialidades no contexto escolar. Serão explorados o uso das tecnologias digitais na sala de aula, a execução das atividades com ações de reflexão, levantamento de questões, elaboração de planos, organização, registro e socialização das narrativas sobre as atividades desenvolvidas a partir da integração das TDIC ao currÃculo de Biologia.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 17, + "pre_title": "", + "title": "Aprendizagem de Sociologia no Ensino Médio e TDIC", + "author": "Alexandro Dantas Trindade(Departamento de Ciência PolÃtica e Sociologia - UFPR/PR), Luciana Paula da Silva de Oliveira (Colégio Estadual Professor Algacyr Munhoz Maeder / Curitiba-PR) e Neli Gomes da Rocha (Programa de Pós-Graduação em Sociologia - UFPR/PR)", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/sociologia-em/menu-topicos.html", + "img": "img/colecoes/ecd18.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O módulo “Aprendizagem de Sociologia no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é pensado como um meio de explorar questões sociológicas, bem como as relações sociais construÃdas temporal e historicamente que as contextualizam. Ademais, o núcleo ainda propõe reflexões sociológicas acerca do papel das tecnologias de informação e comunicação como base das relações sociais atuais, além de desenvolver atividades que proporcionem a reflexão crÃtica e a autonomia na criação e elaboração de conteúdos. Ler, refletir, produzir e intervir em sala de aula serão alguns dos caminhos sugeridos nessa empreitada.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 18, + "pre_title": "", + "title": "Aprendizagem de História no Ensino Médio e TDIC", + "author": "José Alves de Freitas Neto e José Antônio Ferreira da Silva Junior", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/historia-em/pagina_2.html", + "img": "img/colecoes/ecd19.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo de “Aprendizagem de História no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é proposta uma reflexão acerca dos conceitos tempo, memória e narrativa no âmbito do ensino de história. São discutidas questões gerais de história e sua relação com a cultura digital, bem como seus usos e possibilidades como fator favorecedor do ensino, a partir da interação e da aprendizagem colaborativa.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 19, + "pre_title": "", + "title": "Aprendizagem de Geografia no Ensino Médio e TDIC", + "author": "Cláudio Benito Oliveira Ferraz (UNESP - Pres.Prudente)", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/geografia-em/pagina-54.html", + "img": "img/colecoes/ecd20.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Aprendizagem de Geografia no Ensino Médio e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†é apresentada a proposta de estimulá-lo(a) a criar novos pensamentos espaciais, articular e dominar conceitos e outros sentidos da linguagem geográfica, de maneira a entendê-la não como algo já estabelecido por especialistas, mas como um campo do pensamento que agencia as linguagens artÃsticas.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 20, + "pre_title": "", + "title": "Aprendizagem de Filosofia e TDIC", + "author": "Sérgio Paulino Abranches, Junot Cornélio Matos, Willamis AprÃgio de Araújo, Eugênio Pacelle da Costa Cavalcante, Guilherme Jordão Macêdo Dias, Karla Epiphania Lins de Gois e Luis Lucas Dantas da Silva e Nilton Guimarães da Silva", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/filosofia/menu-topicos.html", + "img": "img/colecoes/ecd21.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Aprendizagem de Filosofia e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†a Filosofia é apresentada como fator que não pode furtar-se a pensar a cultura digital e suas implicações. Em especial para o caso de professores de Filosofia: como trabalhar essa discussão contemporânea na sala de aula? Qual a sua relevância? Através da abordagem de alguns conceitos-chave, como identidade, juventude, cidadania e democracia, este material trata de oferecer algumas possibilidades de discussão em torno dessas questões.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 21, + "pre_title": "", + "title": "Linguagens do Nosso Tempo", + "author": "Maria Lucia Santaella Braga e Alexandre Santaella Braga", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/linguagens/pagina-22.html", + "img": "img/colecoes/ecd22.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Linguagens do Nosso Tempo†do curso “Educação na Cultura Digital†tem-se o objetivo de refletir sobre práticas de ensino e aprendizagem de Linguagens do Nosso Tempo com o uso das TDIC. O núcleo apresenta os conceitos caracterizadores das linguagens atuais, a hipermÃdia e a transmÃdia com a finalidade de evidenciar que novas linguagens não se esgotam em si mesmas. Levantar e problematizar as implicações que a hipermÃdia, como a complexa linguagem que é própria das redes digitais e discutir os desafios que essas formas de aprendizagem estão trazendo para a educação, especialmente para aquela que ainda continua nostálgica e exclusivamente presa ao mundo do texto impresso.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 22, + "pre_title": "", + "title": "Tecnologias Digitais no Letramento EstatÃstico", + "author": "Ruy César Pietropaolo (UNIBAN), Nielce Meneguello Lobo da Costa (UNIBAN) e Rosangela de Souza Jorge Ando ", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/letramento-estatistico/menu-topicos.html", + "img": "img/colecoes/ecd23.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O módulo “Tecnologias Digitais no Letramento EstatÃstico†do curso “Educação na Cultura Digital†propõe atividades e experiências visando favorecer a construção de competências referentes ao letramento estatÃstico, o qual inclui: o domÃnio de conhecimentos básicos que permitam o desenvolvimento de competências estatÃsticas; o exercÃcio do pensamento crÃtico acerca das informações de uma pesquisa para a tomada de decisões; e a utilização das tecnologias digitais para a coleta e a organização dos dados de uma pesquisa, visando a compreensão e intervenção na realidade da escola, bem como a obtenção de medidas e comunicação dos resultados.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 23, + "pre_title": "", + "title": "Jogos Digitais e Aprendizagem", + "author": "Isa Beatriz da Cruz Neves, PatrÃcia Rocha Rodrigues, Isa de Jesus Coutinho e Andersen Caribé de Oliveira", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/jogos/cenario.html", + "img": "img/colecoes/ecd24.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No módulo “Jogos Digitais e Aprendizagem†do curso “Educação na Cultura Digital†os jogos são vistos como formas de diversão interativa que proporcionam aprendizagem. Os jogos digitais podem simular ações como correr, dançar, jogar basquete, tênis, futebol, etc. Em geral, eles apresentam conflitos e competições que exigem cumprimento de regras, raciocÃnio lógico e uma boa dose de estratégia. Esses desafios contribuem para o desenvolvimento da visão periférica, concentração em diferentes atividades e desenvolvimento de habilidades para resolução de problemas. O objetivo do núcleo é pensar os jogos digitais em articulação com o ensino, bem como refletir sobre seus limites e possibilidades.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 24, + "pre_title": "", + "title": "Ética na Cultura Digital", + "author": "Sérgio Paulino Abranches, Junot Cornélio Matos, Karla Epiphania Lins de Gois, Luis Lucas Dantas da Silva, Nilton Guimarães da Silva, Willamis AprÃgio de Araújo, Eugênio Pacelle da Costa Cavalcante e Guilherme Jordão Macêdo Dias", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/etica/menu-topicos.html", + "img": "img/colecoes/ecd25.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O módulo “Ética na Cultura Digital†do curso “Educação na Cultura Digital†parte da seguinte constatação: dentre uma série de questões contemporâneas relevantes envolvendo a cultura digital, discutidas em outros núcleos deste curso, inclui-se também um questionamento sobre ética. Este núcleo, então, discute algumas dessas questões, sem pretender esgotá-las. É proposta a reflexão sobre a relação entre Ética e Cultura Digital, discutindo os valores subjacentes ao uso das TDIC nas relações sociais e na educação e buscando analisar, de maneira vertical e interdisciplinar, as implicações éticas das diferentes possibilidades tecnológicas para a vida do ser humano.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 25, + "pre_title": "", + "title": "A Prática Docente no Ensino Fundamental e TDIC", + "author": "Darli Collares (UFRGS) e Nina Rosa Ventimiglia Xavier (Educação Básica)", + "url": "https://sgmd.nute.ufsc.br/content/especializacao-cultura-digital/fundamental/pagina-2.html", + "img": "img/colecoes/ecd26.jpg", + "score": 100, + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O módulo “A Prática Docente no Ensino Fundamental e Tecnologias Digitais de Informação e Comunicação (TDIC)†do curso “Educação na Cultura Digital†busca refletir sobre questões inerentes à s especificidades da docência nos Anos Iniciais e, também, sobre as possibilidades e implicações do uso de TDIC nessa fase de escolarização, aprofundar os conhecimentos sobre o processo de aprendizagem e propor um novo olhar sobre as práticas pedagógicas baseando-se em Piaget.\nO material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de educadores. O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + } + ], + "score": 100, + "img": "img/colecoes/ecd.png", + "duration": 50, + "created_at": "2015-06-13T00:31:24.484Z", + "updated_at": "2015-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O material oferece subsÃdios para uma formação apoiada nos diversos âmbitos das Tecnologias Digitais de Informação e Comunicação (TDIC) em currÃculos escolares, além de explorar, demonstrar e analisar as possibilidades criativas e elementos que contribuam para a construção de novas dinâmicas para a formação de professores(as) com foco na integração das Tecnologias de Informação e Comunicação nas escolas e seus diversos usos.", + "historic": "O curso foi criado numa parceria entre Ministério da Educação e Universidade Federal de Santa Catarina, tendo como público alvo professores, coordenadores, gestores pedagógicos e outros membros da equipe gestora que fossem responsáveis pelo processo de formação da escola, além de multiplicadores dos Núcleos de Tecnologia Educacional (NTE) e Núcleos de Tecnologia Municipal (NTM). O curso foi concluÃdo em 2015, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 2, + "name": "Prevenção dos Problemas Relacionados ao Uso de Drogas", + "tags": [ + { + "name": "Drogas" + }, + { + "name": "Prevenção" + }, + { + "name": "Conselheiros" + }, + { + "name": "SENAD" + }, + { + "name": "Contextos" + } + ], + "developed": "Nute UFSC", + "developedurl": "http://lantec.ufsc.br", + "topic_name": "Módulos", + "topics": [ + { + "id": 0, + "pre_title": "Iniciando a Trilha", + "title": "", + "author": "Nute UFSC", + "url": "https://sgmd.nute.ufsc.br/content/sgmd-resources-conselheiros/ebook/iniciando-a-trilha.html", + "img": "img/colecoes/senad1.jpg", + "tags": [ + { + "name": "Drogas" + }, + { + "name": "Prevenção" + }, + { + "name": "Conselheiros" + }, + { + "name": "SENAD" + }, + { + "name": "Contextos" + } + ], + "score": 100, + "duration": 50, + "created_at": "2014-06-13T00:31:24.484Z", + "updated_at": "2014-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O módulo “Iniciando a trilha†do curso “Prevenção dos Problemas Relacionados ao Uso de Drogas†tem como objetivo contextualizar a história do consumo de drogas, com o intuito de problematizar o tema. Busca introduzir material do curso, que almeja desconstruir visões reducionistas, trabalhando a partir de três dimensões: sujeito, contexto, e drogas. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de conselheiros e agentes comunitários envolvidos na prevenção do uso de drogas no paÃs. O curso foi concluÃdo em 2014, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 1, + "pre_title": "Módulo 1: ", + "title": "Sujeitos, contextos e drogas", + "author": "Nute UFSC", + "url": "https://sgmd.nute.ufsc.br/content/sgmd-resources-conselheiros/ebook/modulo-1.html", + "img": "img/colecoes/senad2.jpg", + "tags": [ + { + "name": "Drogas" + }, + { + "name": "Prevenção" + }, + { + "name": "Conselheiros" + }, + { + "name": "SENAD" + }, + { + "name": "Contextos" + } + ], + "score": 100, + "duration": 50, + "created_at": "2014-06-13T00:31:24.484Z", + "updated_at": "2014-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O módulo “Sujeitos, contextos e drogas†do curso “Prevenção dos Problemas Relacionados ao Uso de Drogas†expõe o contexto histórico, social e cultural de usuários de drogas, bem como seus padrões e tendências, buscando mostrar ao leitor os diferentes cenários existentes neste âmbito. São levantadas questões acerca dos sujeitos usuários, as substâncias individualmente e seus respectivos efeitos. O módulo ainda apresenta pesquisas e entrevistas com professores de diversas áreas do conhecimento relacionadas ao estudo de substâncias psicoativas e seus dependentes. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de conselheiros e agentes comunitários envolvidos na prevenção do uso de drogas no paÃs. O curso foi concluÃdo em 2014, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 2, + "pre_title": "Módulo 2: ", + "title": "Redes para promoção, prevenção, redução de danos e tratamento", + "author": "Nute UFSC", + "url": "https://sgmd.nute.ufsc.br/content/sgmd-resources-conselheiros/ebook/modulo-2.html", + "img": "img/colecoes/senad3.jpg", + "tags": [ + { + "name": "Drogas" + }, + { + "name": "Prevenção" + }, + { + "name": "Conselheiros" + }, + { + "name": "SENAD" + }, + { + "name": "Contextos" + } + ], + "score": 100, + "duration": 50, + "created_at": "2014-06-13T00:31:24.484Z", + "updated_at": "2014-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O módulo “Redes para promoção, prevenção, redução de danos e tratamento†do curso “Prevenção dos Problemas Relacionados ao Uso de Drogas†apresenta o histórico recente da bioética, os conceitos e riscos de vulnerabilidade, fatores de proteção e prevenção do uso de drogas, além de entrevistas com profissionais que atuam no campo de programas preventivos,visam trazer à tona a importância de informar a população acerca da dependência e de desenvolver polÃticas multidisciplinares e intersetoriais. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de conselheiros e agentes comunitários envolvidos na prevenção do uso de drogas no paÃs. O curso foi concluÃdo em 2014, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 3, + "pre_title": "Módulo 3: ", + "title": "PolÃticas Públicas e Legislação sobre Drogas", + "author": "Nute UFSC", + "url": "https://sgmd.nute.ufsc.br/content/sgmd-resources-conselheiros/ebook/modulo-3.html", + "img": "img/colecoes/senad4.jpg", + "tags": [ + { + "name": "Drogas" + }, + { + "name": "Prevenção" + }, + { + "name": "Conselheiros" + }, + { + "name": "SENAD" + }, + { + "name": "Contextos" + } + ], + "score": 100, + "duration": 50, + "created_at": "2014-06-13T00:31:24.484Z", + "updated_at": "2014-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O módulo “PolÃticas Públicas e Legislação sobre Drogas†do curso “Prevenção dos Problemas Relacionados ao Uso de Drogas†evidencia a relevância das medidas intersetoriais tomadas publicamente e o compromisso de cada um para o melhor cumprimento destas. Ainda é apresentada a relação entre os conselhos e movimentos sociais na atuação com fatores protetores e a importância das polÃticas de saúde mental e psicossociais presentes no SUS. O material foi elaborado para este curso de Especialização, na modalidade de ensino a distância, tendo em vista o seu papel na formação continuada de conselheiros e agentes comunitários envolvidos na prevenção do uso de drogas no paÃs. O curso foi concluÃdo em 2014, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + } + ], + "score": 100, + "img": "img/colecoes/senad.png", + "duration": 50, + "created_at": "2014-06-13T00:31:24.484Z", + "updated_at": "2014-06-16T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Visa propiciar aos leitores a compreensão da conjuntura social dos usuários e dependentes de substâncias psicoativas, bem como problematizar as dimensões trabalhadas: sujeito, contexto e drogas. Tem como objetivo possibilitar uma formação crÃtica, que respeite a multiplicidade dos conhecimentos neste campo e que consolide o compromisso com práticas comprometidas com a transformação da realidade social. O material ainda traz pesquisas, entrevistas com profissionais da área e projetos de intervenção elaborados pelos próprios cursistas.", + "historic": "A 6ª edição do Curso de Prevenção dos Problemas Relacionados ao Uso de Drogas – Capacitação para Conselheiros e Lideranças Comunitárias foi promovido pela Secretaria Nacional de PolÃticas Sobre Drogas do Ministério da Justiça – SENAD/MJ em parceria com Universidade Federal de Santa Catarina. Foram oferecidas 40 mil vagas para conselheiros e lideranças comunitárias de todo o Brasil que receberam capacitação para atuar na prevenção de crack, álcool e outras drogas. O curso foi concluÃdo em 2014, e agora o material está disponÃvel para leitura a todos que tiverem interesse na temática.", + "likes_count": 3 + }, + { + "id": 3, + "name": "Banco de Práticas Inspiradoras", + "tags": [ + { + "name": "Práticas" + }, + { + "name": "Casos" + }, + { + "name": "Competências gerais" + }, + { + "name": "Base Nacional Comum Curricular" + }, + { + "name": "BNCC" + } + ], + "developed": "Instituto PenÃnsula", + "developedurl": "http://www.institutopeninsula.org.br", + "topic_name": "Casos", + "topics": [ + { + "id": 0, + "pre_title": "Caso 1: Cara de Brasil (Competência 1)", + "title": "", + "author": "Beatriz Souza Duarte e Bruna Lúcia Frigo", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso01.html", + "img": "img/colecoes/boas1.jpg", + "tags": [ + "Educação por projetos", + "Relações étnico-raciais", + "Cultura afro", + "Cultura indÃgena", + "Identidade" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O projeto “Brasil, cara de quê?â€, das professoras Beatriz Duarte e Bruna Frigo, da Escola Municipal de Educação Infantil Parque das Nações I, em São Paulo, ajudou alunos da educação infantil a identificarem as principais etnias que formam a população brasileira – negra, indÃgena e europeia. Por meio das memórias da infância de seus pais, histórias de migração e miscigenação e de vivências lúdicas com representantes de cada cultura, as crianças conscientizaram-se a respeito de quem são e de onde vêm seus costumes. Os resultados mais relevantes foram a desconstrução de estereótipos e preconceitos e a autoaceitação dos alunos da etnia a qual pertencem. Os assuntos abordados no projeto foram inspirados no tema do projeto polÃtico-pedagógico da escola de 2016: as relações étnico-raciais.", + "likes_count": 3 + }, + { + "id": 1, + "pre_title": "Caso 2: Educação aplicada à vida no sertão (Competência 2)", + "title": "", + "author": "José Hélio Pereira", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso02.html", + "img": "img/colecoes/boas2.jpg", + "tags": [ + "Educação por projetos", + "Investigação", + "Meio ambiente", + "Ãgua", + "Decantação", + "Resolução de problemas" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "\"Uma solução alternativa para o tratamento simplificado da água†é o nome do projeto do professor José Helio Pereira, desenvolvido na escola Casimira Leite Montenegro, em Desterro (PB), em 2017. Com clima semiárido, a região enfrentou problemas de abastecimento de água, o que deixou a população preocupada. Visando melhorar as condições da água barrenta fornecida por caminhões-pipa à comunidade, o professor do 4º ano propôs a seus alunos que pesquisassem formas de filtrar a água. Após leituras e investigações cientÃficas, os alunos descobriram uma grande aliada encontrada na zona em que vivem: a acácia branca (Moringa oleÃfera) e comprovaram, na prática, a efetividade do processo de decantação estimulado pela semente da planta, que separa o barro da água. ", + "likes_count": 3 + }, + { + "id": 2, + "pre_title": "Caso 3: Pertencer para preservar (Competência 3)", + "title": "", + "author": "Laçanã Costa Simões", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso03.html", + "img": "img/colecoes/boas3.jpg", + "tags": [ + "Educação por projetos", + "Artes", + "Patrimônio", + "Preservação", + "Pertencimento", + "Diálogo", + "Cooperação" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Na Escola Municipal Governador Roberto Santos, em Salvador, a professora de artes Iaçanã Simões desenvolveu, em 2017, o projeto “Seja bem-vindo e volte sempre! Um olhar para a conservação do patrimônio público escolar através da arteâ€. As duas mensagens contidas no tÃtulo do projeto foram desenhadas, inicialmente, nas portas das turmas do ensino fundamental. A ideia da intervenção era conservar o patrimônio escolar e educar sobre a preservação do espaço público em geral, pois a professora observou que os estudantes não degradavam os ambientes nos quais tinham realizado algum projeto artÃstico. Além das mensagens, as portas ganharam ilustrações escolhidas por cada turma. Os alunos gostaram tanto da atividade que pintaram, também, outros ambientes da escola.", + "likes_count": 3 + }, + { + "id": 4, + "pre_title": "Caso 5: Curiosidade cientÃfica (Competência 5) ", + "title": "", + "author": "Maria Cristina Fachin Liberalesso", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso05.html", + "img": "img/colecoes/boas5.jpg", + "tags": [ + "Educação por projetos", + "Investigação", + "Pesquisa na internet", + "RaciocÃnio lógico", + "Insetos" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Na cidade de Pinhal Grande (RS), fica a Escola Municipal de Educação Fundamental São Thomaz de Aquino, que, em 2016, teve um de seus banheiros infestado por insetos. A visita inesperada dos animais e a curiosidade dos alunos em saber que bichos eram aqueles, se eram venenosos, e, principalmente, porque havia tantos deles ali, levou a professora do 4º ano, Maria Cristina Fachin, a explorar a pesquisa cientÃfica com seus alunos. Ela recolheu uma amostra do inseto e incitou os estudantes a procurarem informações em fontes confiáveis, dando origem ao projeto “Pequeno Cientistaâ€. Com isso, as crianças puderam aprender noções de metodologia de pesquisa e testaram hipóteses práticas para entender o que causou a infestação no banheiro da escola.", + "likes_count": 3 + }, + { + "id": 5, + "pre_title": "Caso 6: O Haiti é aqui (Competência 1)", + "title": "", + "author": "Diana Aparecida Feuser Ribeiro", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso06.html", + "img": "img/colecoes/boas6.jpg", + "tags": [ + "Educação por projetos", + "Berçário", + "Adaptação", + "Diversidade de saberes", + "Intercâmbio de culturas", + "Identidade" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Em 2017, havia um bebê haitiano na turma do berçário 1 do Centro de Educação Infantil Castelo Branco, em Joinville (SC), e a pedagoga responsável, Diana Ribeiro, preocupou-se com a inclusão da famÃlia nas atividades escolares, o que é crucial para essa faixa-etária. Como os pais do bebê se comunicavam mal em português, a professora decidiu aprender expressões na lÃngua nativa deles. Uma dessas expressões, “Sali, koman ouye?†(Olá, como vai?), nomeou o projeto de integração entre as culturas haitiana e brasileira. Ao ensinar os costumes locais, o trabalho beneficiou não somente a famÃlia estrangeira, mas também as famÃlias brasileiras procedentes de outros estados. O incentivo a essa descoberta cultural se materializou na decoração e em outras atividades, e trouxe para o berçário um pouco do lar de cada bebê.", + "likes_count": 3 + }, + { + "id": 6, + "pre_title": "Caso 7: Mensagens para um mundo sustentável (Competência 7)", + "title": "", + "author": "Martamiria Delmiro dos Santos", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso07.html", + "img": "img/colecoes/boas7.jpg", + "tags": [ + "Educação por projetos", + "Consciência socioambiental", + "Consumo responsável", + "Mineralogia", + "Coleta seletiva" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Trabalhar a sustentabilidade com foco na mineralogia foi o diferencial do projeto da Escola Municipal Dr. Luiz Gonzaga Maranhão, em Jaboatão dos Guararapes (PE), que recebeu o nome “Educação ambiental: uso consciente dos recursos mineraisâ€. Estimulada pelo tema do projeto polÃtico-pedagógico da escola em 2016, a professora Martamiria dos Santos, do 3º ano, decidiu mostrar aos alunos de onde vêm os materiais usados para construir objetos cotidianos, como cadeiras, paredes, portas, etc. Os alunos entenderam como as matérias-primas minerais são formadas na natureza, o valor comercial que possuem e a importância de usá-las de forma consciente, o que os estimulou a praticar a reciclagem e a preservação ambiental.", + "likes_count": 3 + }, + { + "id": 7, + "pre_title": "Caso 8: A Ãfrica me representa (Competência 8)", + "title": "", + "author": " Márcia Theodorico Mezzomo", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso08.html", + "img": "img/colecoes/boas8.jpg", + "tags": [ + "Educação por projetos", + "Relações étnico-raciais", + "Cultura afro", + "Preconceito", + "Identidade", + "Representatividade", + "Diálogo" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No entorno da Creche Morro da Queimada, em Florianópolis, há forte presença da cultura afro-brasileira. Na turma de educação infantil, por exemplo, metade dos alunos são negros, e isso fez com que a professora Marcia Mezzomo decidisse estimular a representatividade dessas crianças desde cedo. Para tanto, em consonância com a lei federal 10.639/03, sobre ensino da história da cultura afro-brasileira, ela trouxe para o imaginário infantil figuras como heróis, prÃncipes e princesas africanos, e pode explorar a diversidade cultural e as relações étnico-culturais a partir do tema “Do rei do fogo ao rei do samba: rainha e rei da Ãfrica eu souâ€. A população local, como familiares e representantes de grupos artÃsticos, contribuiu para mostrar à s crianças as influências mais marcantes da cultura africana na cultura nacional.", + "likes_count": 3 + }, + { + "id": 8, + "pre_title": "Caso 9: AntÃdoto contra o preconceito (Competência 9)", + "title": "", + "author": "Lorena Bárbara Santos Costa", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso09.html", + "img": "img/colecoes/boas9.jpg", + "tags": [ + "Educação por projetos", + "Relações étnico-raciais", + "Cultura afro", + "Samba", + "Identidade", + "Representatividade", + "Bullying", + "Preconceito", + "Empatia", + "Respeito", + "Diversidade" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "A cultura afro-brasileira tem grande expressividade em Salvador, onde as salas de aulas costumam ser compostas, principalmente, por alunos negros, como no 5º ano da Escola Municipal Deputado Gersino Coelho. Ao perceber que seus alunos tinham dificuldade em aceitar-se como negros, e que tratavam uns ao outros de forma preconceituosa, a professora Lorena Costa usou a temática “Vem sambar e aprender: o samba como instrumento de resistência e representação da cultura afro-brasileira†para abordar a descendência africana no paÃs. O resgate do samba da Bahia, ao longo das atividades, foi todo permeado por aspectos da história e da cultura afro, como a trajetória de resistência das comunidades quilombolas. Como resultado, a familiarização com essa cultura despertou a empatia, o respeito e o diálogo entre os alunos.", + "likes_count": 3 + }, + { + "id": 9, + "pre_title": "Caso 10: Um olhar de esperança (Competência 10)", + "title": "", + "author": "João Paulo Vicente da Silva", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso10.html", + "img": "img/colecoes/boas10.jpg", + "tags": [ + "Educação por projetos; Inclusão; Esporte; Adaptação curricular; Empatia" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Em 2017, o aluno cadeirante Renner LuÃs entrou no 5o ano do Centro Infantil Estrela do Mar, em Extremoz (RN), e ninguém imaginava que alcançaria o 3º lugar estadual, e 5º nacional, em campeonatos paralÃmpicos de bocha. As conquistas do garoto foram possÃveis graças ao empenho do professor de educação fÃsica João Paulo da Silva, que pesquisou maneiras de incluÃ-lo na disciplina e em outras atividades escolares, criando o projeto “Contribuições da educação fÃsica na inclusão das pessoas com paralisia cerebral no ensino regularâ€. A participação de Renner nas aulas e campeonatos ajudaram a melhorar a sociabilidade dos colegas com ele, além de ter contribuÃdo positivamente para sua autoestima.", + "likes_count": 3 + }, + { + "id": 10, + "pre_title": "Caso 11: Fábulas favorecem alfabetização de crianças (Competência 4)", + "title": "", + "author": "Erika Silva do Carmo", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso11.html", + "img": "img/colecoes/boas11.jpg", + "tags": [ + "Educação por projetos", + "Narração de histórias", + "Fábulas", + "Alfabetização", + "Cooperação" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Desde 2016 existe o projeto “Minha escola lê e multiplica saberes: viajando no mundo das fábulas†na Escola Estadual Coronel Cruz, em Itacoatiara (AM). Idealizado pela professora do 1º ano Erika do Carmo o projeto começou com fábulas clássicas, como a da galinha dos ovos de ouros, evoluiu para lendas da região amazônica, como a do boto-cor-de-rosa, até trabalhar a autoria própria das crianças. As principais atividades que estimularam os pequenos foram: assistir animações, ler fábulas e reinterpretá-las com desenhos, oralmente e textualmente, além de acompanhar narrativas com teatro de fantoches. O uso das diferentes linguagens melhorou o processo de alfabetização da turma, explorando tópicos como vocabulário e separação de sÃlabas.", + "likes_count": 3 + }, + { + "id": 11, + "pre_title": "Caso 12: Horta conecta famÃlias à escola (Competência 2)", + "title": "", + "author": "Cleide Maria de Souza", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso12.html", + "img": "img/colecoes/boas12.jpg", + "tags": [ + "Educação por projetos", + "Oralidade", + "Ciências", + "Controle biológico", + "Horta", + "Consciência socioambiental", + "Cooperação", + "Participação dos pais" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "A participação familiar foi crucial para o desenvolvimento do projeto “Horta Vertical: Ajudantes da Natureza†na Centro de Ensino Fundamental Cerâmicas Reunidas Dom Bosco, em BrasÃlia (DF). Comandada pela professora Cleide de Souza, a educação infantil pode entender como a natureza trabalha de forma harmônica e a importância de cada ser vivo para manter a estabilidade ambiental. A relação entre insetos e plantas foi focalizada e, com a ajuda das famÃlias, hortaliças foram plantadas verticalmente em um muro ao lado da sala de aula. A partir de observação contÃnua da horta da escola, além de visita a uma horta orgânica de uma das mães da turma, as crianças aprenderam que os insetos são verdadeiros “ajudantes da naturezaâ€, como elas mesmas definiram.", + "likes_count": 3 + }, + { + "id": 12, + "pre_title": "Caso 13: Meu espelho negro (Competência 8)", + "title": "", + "author": "Cristiane Santos de Melo", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso13.html", + "img": "img/colecoes/boas13.jpg", + "tags": [ + "Educação por projetos", + "Identidade", + "Representatividade", + "Mulher negra", + "Empoderamento feminino", + "Cabelo crespo", + "Ganhadeiras de Itapuã" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Em 2015, a professora Cristiane de Melo, do Centro Municipal de Educação Infantil Dr. Djalma Ramos, em Lauro de Freitas (BA), valorizou as raÃzes africanas com o empoderamento do público feminino. O âmbito social, especialmente a mÃdia, poucas vezes apresenta mulheres negras como referencial de beleza, e as crianças da turma não consideravam bonita uma mulher sem pele clara e cabelos lisos. Ao convidar a cantora negra Mariene de Castro como personalidade de referência, esse cenário mudou. Foi aà que surgiu o projeto “Mariene: A flor que desabrochou nossa genteâ€. Por meio de sambas da cantora em parceria com um grupo de ganhadeiras, as meninas vivenciaram a representatividade e aprenderam a valorizar seus traços, como o cabelo crespo. O projeto também ajudou a elevar a autoestima de mães e funcionárias da escola.", + "likes_count": 3 + }, + { + "id": 13, + "pre_title": "Caso 14: VestÃgios do tempo (Competência 1)", + "title": "", + "author": "Lilian Mara Bonette Bianchini", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso14.html", + "img": "img/colecoes/boas14.jpg", + "tags": [ + "Educação por projetos", + "Estudo do meio", + "Arqueologia", + "Cultura indÃgena", + "Caminho de Peabiru", + "VestÃgios lÃticos" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Na cidade de Engenheiro Beltrão (PR) há vestÃgios do Caminho de Peabiru, rota aberta por civilizações pré-coloniais que percorriam territórios entre os Oceanos PacÃfico e Atlântico. A professora de história Lilian Bianchini, da Escola Municipal de Ensino Fundamental Maria Aparecida Medeiros, criou o projeto “Viajando pelos caminhos da nossa história†para mostrar aos alunos do ensino fundamental as marcas dos povos indÃgenas, habitantes do território nacional muito antes da chegada dos europeus. A turma ganhou uma “mala de exploraçãoâ€, onde guardavam o caderno com o registro de suas descobertas a respeito da história e cultura desses povos. A visita a museus da região dedicados ao tema, além da realização de um percurso da rota histórica, deram insumos práticos para a pesquisa dos alunos.", + "likes_count": 3 + }, + { + "id": 14, + "pre_title": "Caso 15: Além da imaginação (Competência 7) ", + "title": "", + "author": "Francisca Deusineide dos Santos Nasário", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso15.html", + "img": "img/colecoes/boas15.jpg", + "tags": [ + "Educação por projetos", + "Pesquisa de campo", + "Lenda urbana", + "Tradição oral", + "Conto", + "Leitura", + "Reescrita", + "Rosa dos ventos" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "No projeto “A escola onde eu estudo e uma lenda tenebrosaâ€, da professora Francisca Nasário, os curiosos alunos do 4º ano investigaram se era verdadeira a lenda de que a escola teria sido construÃda no terreno de um antigo cemitério. Após entrevistas com antigos moradores, a turma relacionou as histórias da construção da escola à s da formação de Pau dos Ferros (RN), e elaborou de uma linha do tempo. Para apresentar o gênero terror e suspense, a professora pediu aos alunos que produzissem as próprias lendas sobre a escola, inspiradas no que leram ou ouviram, aprendendo com a escrita noções de gênero, ortografia e paragrafação. Os contos reescritos foram lidos em sala de aula e integraram a exposição do Dia do Folclore da Escola Estadual Ubiratan Pereira Galvão.", + "likes_count": 3 + }, + { + "id": 15, + "pre_title": "Caso 16: Redescoberta indÃgena (Competência 3)", + "title": "", + "author": "Flávia Roberta Alves Costa", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso16.html", + "img": "img/colecoes/boas16.jpg", + "tags": [ + "Educação por projetos", + "Arte indÃgena", + "Cultura indÃgena", + "Identidade", + "Representatividade" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O projeto “Inspirações indÃgenas†foi criado pela professora de artes Flávia Costa para quebrar estereótipos sobre o que é ser indÃgena nos dias de hoje. Em 2017, a Escola Municipal Divino EspÃrito Santo, no Recife, recebeu a visita de quatro Ãndios fulni-ôs, que conversaram com os alunos. Como os estudantes ficaram interessados na pintura corporal dos Ãndios, Flávia explicou conceitos de produções artÃsticas originais, criações inspiradas nelas e cópias, depois, relacionou a pintura corporal com a body art. Os alunos pintaram o próprio corpo com as palavras força, fé, luta, cultura e resistência. A professora também levou fotos das expressões artÃsticas de quatro etnias presentes em Pernambuco e deu uma oficina de tramas, reciclando sobras de papéis.", + "likes_count": 3 + }, + { + "id": 16, + "pre_title": "Caso 17: Além das fronteiras (Competência 1)", + "title": "", + "author": "PatrÃcia dos Santos Lima", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso17.html", + "img": "img/colecoes/boas17.jpg", + "tags": [ + "Educação por projetos", + "Pesquisa na internet", + "Oralidade", + "Cultura", + "Gamificação" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Criado pela professora de inglês PatrÃcia Lima da Escola Estadual de Ensino Fundamental e Médio Marcelo Candia Subsede I, de Porto Velho (RO), o projeto “Viagem inglesa†pede ao ensino médico que “explore†um paÃs de lÃngua inglesa. Cada turma escolhe um paÃs anglófono e tem de buscar informações históricas, geográficas, econômicas e culturais para apresentar aquela realidade numa feira multicultural aberta à comunidade. Os grupos ficam responsáveis por apresentações de dança, teatro, descrições de pratos tÃpicos, entre outras, com parte dessas vivências faladas em inglês. Em paralelo, a professora faz um trabalho de tutoria, ajudando, por exemplo, a apurar os critérios de pesquisa na web para encontrar informações de fontes confiáveis.", + "likes_count": 3 + }, + { + "id": 17, + "pre_title": "Caso 18: Relaxar e dialogar para aprender (Competência 8)", + "title": "", + "author": "Carolina Corado da Silva Oliveira", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso18.html", + "img": "img/colecoes/boas18.jpg", + "tags": [ + "Educação por projetos", + "Ansiedade", + "Relaxamento", + "Diálogo", + "Protagonismo", + "Autonomia", + "Paulo Freire" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O projeto “Aprender a relaxar e relaxar para aprender: metodologias ativas de ensino em biologia†desenvolvido pela professora Carolina Oliveira com os 1º e 3º anos do Instituto Federal do Rio Grande do Norte, propunha que os alunos se conhecessem melhor, reconhecessem estados de ansiedade para poder cuidar da própriab saúde fÃsica e emocional. Carolina aproximou-se de técnicas comuns à meditação e ao mindfulness para priorizar estratégias de diálogo e facilitar os quatro módulos criados para o ensino de biologia: os alunos conheceram conceitos de metodologia, discutiram bioquÃmica e nutrição ao andarem pelo jardim, responderam perguntas sobre os grupos alimentares e debateram metabolismo em um jogo, e trabalharam citologia ao vivenciarem experiências em sala, comparando as reações de infusão do chá em água quente e em água fria.", + "likes_count": 3 + }, + { + "id": 18, + "pre_title": "Caso 19: Os cordéis da minha terra (Competência 1)", + "title": "", + "author": "José Souza dos Santos", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso19.html", + "img": "img/colecoes/boas19.jpg", + "tags": [ + "Educação por projetos", + "Cultura nordestina", + "Folclore", + "Produção artÃstica", + "Cordel", + "Lampião" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O professor de português José dos Santos pediu aos alunos do 8º ano da Escola Municipal de Paripiranga (BA) que se inspirassem na tradição oral de familiares mais velhos, muitos analfabetos, para ir à s ruas colher narrativas fantásticas. Após gravar ou anotar as histórias, os textos passariam da prosa ao verso, mais especificamente, ao cordel. Surgia o projeto “Cordelize a vida! Valorize a sua cultura!â€. Os 24 cordéis escritos pelos alunos foram apresentados à comunidade escolar em uma “tarde de autógrafosâ€, e os entrevistados que deram origem a eles ganharam um livreto correspondente à história que contaram. Além disso, foram produzidos 40 audiolivros para distribuir gratuitamente os cordéis aos estudantes com deficiência visual.", + "likes_count": 3 + }, + { + "id": 19, + "pre_title": "Caso 20: Experimentação robótica (Competência 2)", + "title": "", + "author": "Diogo Tiago dos Santos", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso20.html", + "img": "img/colecoes/boas20.jpg", + "tags": [ + "Educação por projetos", + "Tecnologia", + "Robótica", + "Soluções de problemas", + "Autonomia" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O projeto “A criação do grupo de fÃsica e robótica da Escola Estadual Ana Linsâ€, em São Miguel dos Campos (AL), começou com um kit de robótica encontrado no almoxarifado da escola em 2015. Desde então, o professor de fÃsica Diogo dos Santos coordena fundamentos da robótica no contraturno escolar para criar soluções que podem ser úteis à sociedade, como o reaproveitamento da água do ar condicionado para irrigação, uma lixeira “inteligente†que ajuda a separar materiais para reciclagem e um dispositivo para pacientes acamados pedirem ajuda com mais facilidade. Além disso, Diogo pediu que os alunos produzissem artigos cientÃficos para apresentar à comunidade acadêmica o protótipo desenvolvido, trabalhando não apenas fÃsica, como também leitura e escrita.", + "likes_count": 3 + }, + { + "id": 20, + "pre_title": "Caso 21: Vivências como fundamento da aprendizagem (Competência 7)", + "title": "", + "author": "Maria do Socorro Braga Reis", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso21.html", + "img": "img/colecoes/boas21.jpg", + "tags": [ + "Educação por projetos", + "Crônica", + "Etnografia", + "Vivências", + "Fotografia", + "Reescrita", + "Autoestima" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "A professora de português Maria Reis elaborou o projeto “Histórias qu’eu vi-vi: crônicas etnográficas†para os jovens desenvolver habilidades mais apuradas de escrita, retratando atividades e hábitos cotidianos da comunidade paraense de Bragança. Maria apresentou o gênero crônica, explicou o conceito de etnografia e mostrou vÃdeos que abordavam o fazer etnográfico. Os alunos foram a campo, registraram suas descobertas com fotos e montaram na escola um mural com as imagens. Depois, levaram-no para uma praça perto da escola, onde expuseram as fotos à comunidade. Para a escrita da crônica, cada estudante produziu um texto sobre a prática desenvolvida. As 20 crônicas etnográficas produzidas pelo 2º ano do ensino médio da Escola Estadual Yolanda Chaves foram reunidas em um aplicativo e no site do governo do Estado.", + "likes_count": 3 + }, + { + "id": 21, + "pre_title": "Caso 22: A força da tradição pesqueira está com eles (Competência 6)", + "title": "", + "author": "Josiane Mendes Bezerra", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso22.html", + "img": "img/colecoes/boas22.jpg", + "tags": [ + "Educação por projetos", + "Pesca artesanal", + "Educação profissionalizante", + "Turismo", + "Alunos multiplicadores", + "Patrimônio cultural", + "Respeito", + "Empatia", + "Cultura caiçara" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O projeto “Fazendo e acontecendo: pesca artesanal da tainha†foi estruturado pela professora Josiane Bezerra para mobilizar da população sobre o resgate histórico-cultural dessa pesca. Os 150 alunos do ensino médio integrado da Escola de Educação Básica Maria Rita Flor, voltado à educação profissionalizante, assistiram a uma aula com pescadores. DaÃ, buscaram estudos cientÃficos para aprofundar os conhecimentos, criando 12 pôsteres técnico-cientÃficos com enfoques que variaram da história da pesca e do ciclo da tainha a receitas de pratos tÃpicos da região. Baseados em um documentário sobre os pescadores de Bombinhas (SC), os jovens fizeram uma encenação, que mobilizou os professores de geografia, história, matemática e música. Além disso, atuaram como “guias de turismo†ao explicar a pesca artesanal e apresentar a cultura dos pescadores a comunidades locais e visitantes.", + "likes_count": 3 + }, + { + "id": 22, + "pre_title": "Caso 23: Protagonismo na tela do cinema (Competência 5)", + "title": "", + "author": "Jayse Antonio da Silva Ferreira", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso23.html", + "img": "img/colecoes/boas23.jpg", + "tags": [ + "Educação por projetos", + "Cinema", + "Protagonismo", + "Autonomia", + "Participação dos pais", + "Preconceito", + "Inclusão" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Criado pelo professor de arte Jayse Ferreira, o projeto “Vamos enCURTAr essa história?†nasceu com a proposta de os alunos produzirem curtas-metragens a partir dos próprios referenciais. Os dois primeiros curtas eram releituras de outras obras, mas para o terceiro o professor sugeriu um trabalho autoral: os alunos teriam que escrever histórias referentes à escola e a um tema social. Para tal, pediu ajuda de egressos da escola em oficinas de dinâmica corporal e de um escritor da cidade para aulas de roteiro. O argumento do suspense “Entre dois ladosâ€, de 17 minutos, surgiu do depoimento de um morador que perdeu a perna após um acidente em que dirigia alcoolizado. Os curtas dos alunos da Escola de Referência em Ensino Médio Frei Orlando foram exibidos na praça central de Itambé (PE).", + "likes_count": 3 + }, + { + "id": 23, + "pre_title": "Caso 24: O celular como ferramenta pedagógica (Competência 5)", + "title": "", + "author": "Erizaldo Cavalcanti Borges Pimentel", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso24.html", + "img": "img/colecoes/boas24.jpg", + "tags": [ + "Educação por projetos", + "Cinema", + "Celulares", + "Cultura digital", + "Pensamento crÃtico", + "Cooperação", + "Responsabilidade" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Contrariando a norma, que proibia o uso do celular em horário de aula, o professor Erizaldo Pimentel criou o projeto “Cine com ciência: luz, câmera... Educação!â€. Nele, alunos 6º ao 9º ano do Centro de Ensino Fundamental 01 do Cruzeiro, na região administrativa de BrasÃlia (DF), têm que produzir vÃdeos com seus smartphones. O professor ensina conceitos da linguagem cinematográfica, e detalha as etapas de pré-produção, em que os alunos devem elaborar a narrativa e o roteiro técnico, estimulando os estudantes à leitura, também analisa cenas de filmes e discute enquadramento e posicionamento de câmera. Os temas estão relacionados ao mundo dos estudantes, com forte traço social e desestimulando a violência. Em três anos de projeto, são cerca de 50 curtas finalizados.", + "likes_count": 3 + }, + { + "id": 24, + "pre_title": "Caso 25: Aplicativo para a saúde do jovem (Competência 2)", + "title": "", + "author": "Elmara Pereira de Souza", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso25.html", + "img": "img/colecoes/boas25.jpg", + "tags": [ + "Educação por projetos", + "Programação", + "Jogo digital", + "Alimentação", + "Atividade fÃsica", + "Investigação", + "Autonomia" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Na “Incubadora de projetos: a experiência de construção do jogo digital Choices sobre a importância da alimentação saudável e da prática de atividade fÃsica na adolescênciaâ€, a professora Elmara Souza, do Centro Juvenil de Ciência e Cultura de Vitória da Conquista, exercitou a curiosidade de estudantes interessados em programação para criar um game que ajudasse os jovens a refletir sobre a saúde. O jogo digital tornou-se a história de um adolescente que pode voltar no tempo para fazer escolhas cotidianas mais saudáveis. Os jovens contaram com o apoio de um aluno de ciências da computação e de uma nutricionista para registrar parâmetros de colesterol e triglicérides no sangue. Premiado em um edital da Fundação de Amparo à Pesquisa do Estado da Bahia, o projeto rendeu um artigo, escrito pelos jovens com a ajuda da professora, para um congresso da Sociedade Brasileira para o Progresso da Ciência.", + "likes_count": 3 + }, + { + "id": 25, + "pre_title": "Caso 26: Tabuleiro de respeito (Competência 9)", + "title": "", + "author": "Raquel de Oliveira Campos", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso26.html", + "img": "img/colecoes/boas26.jpg", + "tags": [ + "Educação por projetos", + "Gamificação", + "Biomas", + "Cooperação", + "Diálogo", + "Responsabilidade", + "Autoestima" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O projeto “Tabuleiro humano: uma viagem de descobertas pelos biomas brasileiros em defesa da vidaâ€, desenvolvido no Colégio Estadual Pedro Ãlvares Cabral de São João de Meriti (RJ), foi criado pela professora de biologia Raquel Campos, com sua turma do 1º ano do ensino médio. Os alunos construÃram um tabuleiro de seis metros quadrados com o mapa brasileiro dividido nos seis biomas do paÃs: Pampa, Mata Atlântica, Caatinga, Cerrado, Pantanal e Amazônia. Em sala, seis grupos pesquisaram os biomas e aspectos culturais, históricos e linguÃsticos dessas áreas. Em casa, os jovens elaboraram perguntas lidas no jogo, em formato de quiz. No dia da competição, os estudantes venceram com facilidade a turma adversária, que não havia se engajado no trabalho pedagógico. Além disso, a dinâmica do jogo favoreceu o exercÃcio da cooperação e o diálogo na turma.", + "likes_count": 3 + }, + { + "id": 26, + "pre_title": "Caso 27: Matemática para todos (Competência 4)", + "title": "", + "author": "AdalgÃsio Gonçalves Soares", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso27.html", + "img": "img/colecoes/boas27.jpg", + "tags": [ + "Educação por projetos", + "Curta-metragem", + "Malba Tahan", + "Resolução de problemas", + "Cultura digital", + "Cooperação", + "Responsabilidade" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "O projeto “Festival de curtas, uma viagem à s mil e uma noites de Malba Tahan†apresentou contos do escritor aos alunos dos 8 e 9º anos da Escola Estadual Presidente Costa e Silva. Os estudantes se dividiram em grupos, resolveram coletivamente um desafio matemático presente na obra escolhida e, a partir daÃ, pensarem em uma narrativa para um filme. Além de apoiar as soluções dos problemas, o professor de matemática AdalgÃsio Soares alinhou as histórias ao conteúdo da disciplina, usando os contos para explicar equações do primeiro grau, operações com números racionais, entre outros. O professor trabalhou também o estudo do gênero textual e habilidades de leitura e escrita. Os moradores de Minas Novas (MG) ajudaram a viabilizar o festival de curtas-metragens, que exibiu 20 filmes em praça pública.", + "likes_count": 3 + }, + { + "id": 27, + "pre_title": "Caso 28: O segredo dos seus olhos (Competência 10)", + "title": "", + "author": "Elisangela Marina de Freitas e Silva", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso28.html", + "img": "img/colecoes/boas28.jpg", + "tags": [ + "Educação por projetos", + "Pré-história", + "Arqueologia", + "Acessibilidade", + "Inclusão", + "Braile", + " Desenho universal para a aprendizagem" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "A professora substituta de história Elisangela Silva encarou um desafio na Escola Básica Municipal Intendente Aricomedes da Silva, em Florianópolis: um aluno do 6º ano era cego. Visando sua inclusão, a professora recorreu à expertise das docentes Rosângela Kittel e Ruth dos Santos para trabalhar os conteúdos sobre pré-história, dando origem ao projeto “História nas pontas dos dedos: a acessibilidade ao conteúdo de pré-históriaâ€. A partir de elementos táteis, como materiais em braile e confecção de objetos em relevo, o aluno conseguiu vivenciar a aprendizagem plenamente. Para além de adaptar os conteúdos somente a ele, as docentes programaram atividades que permitissem que qualquer estudante pudesse agir com autonomia, democratizando, assim, o acesso ao conhecimento. ", + "likes_count": 3 + }, + { + "id": 28, + "pre_title": "Caso 29: Esta escola lhes pertence (Competência 3)", + "title": "", + "author": "Paulo Augusto Nedel", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso29.html", + "img": "img/colecoes/boas29.jpg", + "tags": [ + "Educação por projetos", + "Cultura artÃstica", + "Pintura", + "Autonomia", + "Pertencimento", + "Patrimônio escolar" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Idealizado pelo professor Paulo Nedel, o “Ateliê do GV†foi implantado em 2015 na Escola Municipal Presidente Getúlio Vargas, em Viamão (RS). O ateliê funciona no contraturno e os alunos do 5º ao 9º ano podem reproduzir pinturas de diferentes artistas sob a orientação de Paulo, que explica o processo de reprodução da imagem, como a mistura de cores e a maneira de pintar. O tempo de finalização varia de acordo com a complexidade do quadro e os estudantes, em geral, fazem duas assinaturas nos trabalhos, a dos autores originais e as deles. Em 2016, com a escola reformada e repintada, foi o momento de distribuir os quadros dos alunos pelas paredes. Os “corredores artÃsticos†fortaleceram o respeito pelo espaço escolar e os laços com a comunidade. No inÃcio de 2018, o ateliê contava com 110 reproduções.", + "likes_count": 3 + }, + { + "id": 29, + "pre_title": "Caso 30: O autocuidado como necessidade (Competência 8)", + "title": "", + "author": "Alessandra Aparecida Neves", + "url": "https://chapa2-ced-com-br.umbler.net/casos/caso30.html", + "img": "img/colecoes/boas30.jpg", + "tags": [ + "Educação por projetos", + "Leitura", + "Interpretação de texto", + "Literatura", + "Miniconto", + "Pesquisa na internet", + "Saúde emocional", + "Psicologia", + "Teoria da recepção" + ], + "score": 100, + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "Tendo como mote “o desafio da baleia azulâ€, a professora de português Alessandra Neves, em Dourados (MS), elaborou o projeto “Sem tristezas constantes, sem cortes, sem mortes precoces, entender para compreender-seâ€, envolvendo leitura, compreensão, interpretação e produção textual. Trabalhou com a música “Bring me to lifeâ€, com as obras “Amor de Perdição†e “Romeu e Julieta†e o filme “Inocênciaâ€. Então solicitou aos alunos pesquisas sobre depressão e suicÃdio. Para apresentá-las, a sala virou um “café-viagemâ€: cada grupo tinha um “anfitrião†que compartilhava os conhecimentos com os colegas. As atividades resultaram em microcontos sobre a temática. O projeto terminou com um papo com uma psicóloga, que orientou os jovens sobre os riscos das interações pela internet e os deixou à vontade para expor os próprios sentimentos.", + "likes_count": 3 + } + ], + "score": 100, + "img": "img/ipen_capa.jpg", + "duration": 50, + "created_at": "2018-03-26T00:31:24.484Z", + "updated_at": "2018-03-26T12:41:22.885Z", + "language": { + "id": 1, + "name": "Português", + "code": "pt" + }, + "license": null, + "description": "É um acervo de práticas inspiradoras realizadas por professores da rede pública de ensino e que estão vinculadas à s dez competências gerais da Base Nacional Comum Curricular (BNCC). O objetivo é promover uma reflexão mais ampla sobre o papel dos professores, inspirar os docentes a desenvolverem práticas inovadoras e ajudá-los na implementação da Base em suas realidades, bem como valorizar o trabalho destes e tantos outros professores extraordinários pelo Brasil. As práticas, relatadas em formato de artigo e vÃdeo, foram desenvolvidas por professores de todo o Brasil, finalistas do Prêmio Professores do Brasil 2017. Conheça mais sobre o projeto aqui: https://www.youtube.com/watch?v=ceJywQbZSM8", + "historic": "O Banco de Práticas inspiradoras é uma iniciativa realizada pelo Instituto PenÃnsula e Ministério da Educação. ", + "likes_count": 3 + } +] diff --git a/src/Components/Funcionalities.js b/src/Components/Funcionalities.js index dad67072cb92267aa889952d835943f9e22b1310..d183d855f2cc9e31146c26ec08ea8c4e0e7bfc9e 100644 --- a/src/Components/Funcionalities.js +++ b/src/Components/Funcionalities.js @@ -45,7 +45,7 @@ const caption={ class Funcionalities extends Component{ render(){ return( - <Container style={{textAlign: "center"}}> + <Container style={{textAlign: "center", paddingBottom : "20px", color : "#666"}}> <h2>Aqui na Plataforma você pode:</h2> <Row style={imgRow}> <Col sm={4} md={4}> diff --git a/src/Components/GreyButton.js b/src/Components/GreyButton.js new file mode 100644 index 0000000000000000000000000000000000000000..a2d687d5e50382fb1a39ec7bcf6bd5d3d314b47d --- /dev/null +++ b/src/Components/GreyButton.js @@ -0,0 +1,56 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import { Button } from '@material-ui/core'; +import styled from 'styled-components' + +export default function GreyButton (props) { + return ( + <StyledButton onClick={props.callback}> + {props.text} + </StyledButton> + ) +} + +const StyledButton = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + max-height : 36px !important; + + background-color : transparent !important; + color : #666 !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; + + .button-text { + cursor : pointer; + line-height : 36px; + text-align : center; + color : currentColor; + white-space : nowrap; + text-transform : uppercase; + font-weight : 600 !important; + font-size : 14px; + font-style : inherit; + font-variant : inherit; + padding : 6px 16px !important; + } +` diff --git a/src/Components/GuardarModal.js b/src/Components/GuardarModal.js new file mode 100644 index 0000000000000000000000000000000000000000..2526d20c997cfd6b9433d4b414a282e6968ab384 --- /dev/null +++ b/src/Components/GuardarModal.js @@ -0,0 +1,416 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useContext, useState } from 'react'; +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import { Store } from '../Store.js' +import { apiDomain } from '../env'; +import CloseIcon from '@material-ui/icons/Close'; +import PublicIcon from '@material-ui/icons/Public'; +import LockIcon from '@material-ui/icons/Lock'; +import LoadingSpinner from './LoadingSpinner.js' +import CriarColecaoForm from './CriarColecaoForm.js' +import SnackbarComponent from './SnackbarComponent' +import { getRequest, postRequest } from './HelperFunctions/getAxiosConfig' + +function CloseModalButton(props) { + return ( + <StyledCloseModalButton onClick={props.handleClose}> + <CloseIcon /> + </StyledCloseModalButton> + ) +} + +export default function ReportModal(props) { + const { state } = useContext(Store) + const [collsArr, setcolls] = useState([]) + const [loading, toggleLoading] = useState(true) + const [creatingCol, setCreating] = useState(false) + const [snackbarOpen, setSnackOpen] = useState({ + open: false, + severity: "", + text: "", + color: "" + }) + + + function handleSuccessGetCols(data) { + setcolls(data) + toggleLoading(false) + } + + function handleError(error) { + toggleLoading(false) + setSnackOpen({ + open: true, + severity: "error", + text: "Error ao guardar o recurso", + color: "red", + }) + } + + const getCols = () => { + if (collsArr.length === 0) { + const id = state.currentUser.id + + const url = `/users/${id}/collections/` + + getRequest(url, handleSuccessGetCols, handleError) + } + } + + + function handleSuccessPostToCol(data) { + setSnackOpen({ + open: true, + severity: "info", + text: "O Recurso foi guardado na coleção!", + color: "" + }) + setCreating(false) + props.handleClose() + } + + const postToCol = (colId) => { + const url = `/collections/${colId}/items` + const payload = { + "collection": { + "items": [{ "id": props.recursoId, "type": "LearningObject" }] + } + } + postRequest(url, payload, handleSuccessPostToCol, handleError) + + } + + return ( + <React.Fragment> + <SnackbarComponent + snackbarOpen={snackbarOpen.open} + severity={snackbarOpen.severity} + handleClose={() => { + setSnackOpen({ + open: false, + severity: "", + text: "", + color: "" + }) + }} + text={snackbarOpen.text} + color={snackbarOpen.color} + /> + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + onRendered={() => { getCols() }} + > + <Fade in={props.open}> + <Container> + <Header> + <span style={{ width: "32px" }} /> + <h2>Guardar recurso</h2> + <CloseModalButton handleClose={props.handleClose} /> + </Header> + <Content style={{ paddingTop: "0" }}> + <ResourceInfo> + <img src={apiDomain + props.thumb} alt="thumbnail recurso" /> + <div className="text"> + <h3>{props.title}</h3> + </div> + </ResourceInfo> + { + loading ? + ( + <LoadingSpinner text="Carregando coleções" /> + ) + : + ( + <ChooseColContainer> + { + creatingCol ? + ( + <CriarColecaoForm + handleClose={() => setCreating(false)} + finalize={postToCol} + /> + ) + : + ( + collsArr.length === 0 ? + ( + <> + <div classname="no-cols"> + <h2>Você não possui coleções ainda.</h2> + </div> + </> + ) + : + ( + <> + <ChooseCol> + <h2>Escolha uma Coleção: </h2> + <div className="cols-list"> + { + collsArr.map(collection => + <div className="row" key={collection.id}> + <div style={{ display: "flex", flexDirection: "row", justifyContent: "space-between", alignItems: "center" }}> + { + collection.privacy === "public" ? + <PublicIcon className="icon" /> + : <LockIcon className="icon" /> + } + <h5>{collection.name}</h5> + </div> + <GuardarBotao onClick={() => { postToCol(collection.id) }}>GUARDAR</GuardarBotao> + </div> + ) + } + </div> + </ChooseCol> + <div style={{ display: "flex", justifyContent: "center" }}> + <CriarColButton onClick={() => { setCreating(true) }}>CRIAR COLEÇÃO</CriarColButton> + </div> + </> + ) + + ) + } + </ChooseColContainer> + ) + } + </Content> + </Container> + </Fade> + </StyledModal> + </React.Fragment> + ) +} + +const GuardarBotao = styled(Button)` + &:hover { + background-color : #503096 !important; + } + max-height : 36px !important; + background-color : #673ab7 !important; + color : #fff !important; + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + padding-left : 32px !important; + padding-right : 32px !important; +` + +const ChooseCol = styled.div` + display : flex; + flex-direction : column; + h2 { + margin-top : 20px; + margin-bottom : 10px; + font-size : 24px; + font-weight : 500; + } + + .icon { + vertical-align : middle !important; + font-weight : normal !important; + font-style : normal !important; + font-size : 24px !important; + line-height : 1 !important; + letter-spacing : normal !important; + text-transform : none !important; + display : inline-block !important; + white-space : nowrap !important; + word-wrap : normal !important; + direction : ltr !important; + padding-right : 2px; + } + + .cols-list { + overflow-x : hidden; + overflow-y : auto; + + .row { + display : flex; + flex-direction : row; + padding : 10px; + border-radius : 5px; + max-height : 60px; + align-items : center; + align-content : center; + max-width : 100%; + justify-content : space-between; + + h5 { + padding : 0 20px; + margin : 0; + font-size : 14px; + font-weight : 600; + } + } + } +` + +const CriarColButton = styled(Button)` + width : 200px !important; + margin-top : 16px !important; + background-color : #673ab7 !important; + margin-left : auto !important; + margin-right : auto !important; + color : #fff !important; + font-weight : 600 !important; + box-shadow : !important; + padding-left : 0 2px 5px 0 rgba(0,0,0,.26) 16px !important; + padding-right : 16px !important; +` + +const ChooseColContainer = styled.div` + display : flex; + flex-direction : column; + color : #666; + + .no-cols { + align-self : center; + margin-top : 20px; + margin-bottom : 30px; + font-size : 24px; + font-weight : 500; + } +` + +const ResourceInfo = styled.div` + margin-top : 0; + background-color : #f4f4f4; + overflow : hidden; + border-radius : 5px; + display : flex; + flex-direction : row; + align-items : center; + align-content : center; + max-wdith : 100%; + justify-content : space-between; + + .text { + max-height : 100%; + max-width : 66.66%; + display : flex; + flex-direction : column; + text-align : center; + + h3 { + font-size : 20px; + font-weight : 500; + padding : 10px; + } + } + + img { + object-fit : cover; + height : 115px; + max-width : 165px; + background-color : #e5e5e5; + float : left; + padding : 0; + + @media screen and (min-width : 600px) { + margin-right : 20px; + margin-bottom : 0; + } + @media screen and (max-width : 768px) { + width : 100%; + } + } + +` + +const Content = styled.div` + padding : 20px 30px; + overflow-y : scroll; + +` + +const Header = styled.div` + display : flex; + flex-direction : row; + padding : 10px 26px 0 26px; + align-items : center; + justify-content : space-between; + height : 64px; + + h2 { + font-size : 26px; + font-weight : lighter; + color : #666 + } +` + +const StyledCloseModalButton = styled(Button)` + display : inline-block; + position : relative; + float : right !important; + margin-right : -8px !important; + background : transparent !important; + min-width: 0 !important; + width : 40px; +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const Container = styled.div` + box-sizing : border-box; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); + background-color : white; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + padding : 10px; + border-radius : 4px; + + @media screen and (min-width : 700px) { + max-width : 600px; + max-height : 600px; + } + + @media screen and (max-width : 699px) { + width : 100%; + height : 100%; + } +` diff --git a/src/Components/Header.js b/src/Components/Header.js index 623b91e17f4f2d69f68badcef2e427b4aaeec4d8..57cc42f248418e141996fa0023bb6793938441a2 100644 --- a/src/Components/Header.js +++ b/src/Components/Header.js @@ -16,32 +16,95 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, { useContext, useState } from 'react' - -import AcessibilityBar from './AcessibilityBar' +import React, { useContext, useState, useEffect } from 'react' import MenuBar from './MenuBar' import SearchBar from './SearchBar' import SignUpModal from './SignUpModal' -import LoginModal from './LoginModal' +import LoginModal from './LoginModal.js' import { Store } from '../Store'; import ColaborarModal from './ColaborarModal.js' - +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; +import { useLocation, useHistory } from 'react-router-dom' +import MenuBarMobile from './MenuBarMobile.js' +import { getRequest, validateGoogleLoginToken } from './HelperFunctions/getAxiosConfig' //const StyledButton = styled(Button)` // background : #ffa54c !important; // boxShadow :none; //` +function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} -export default function Header(props){ + +export default function Header(props) { const { state, dispatch } = useContext(Store) const [signUpOpen, setSignUp] = useState(false) const [loginOpen, setLogin] = useState(false) + const [successfulLoginOpen, handleSuccessfulLogin] = useState(false) + const [modalColaborar, setModalColaborar] = useState(false) + + function handleSuccessValidateToken(data) { + dispatch({ + type: "USER_LOGGED_IN", + userLoggedIn: !state.userIsLoggedIn, + login: data.data + } + ) + } + + useEffect(() => { + if (sessionStorage.getItem('@portalmec/auth_headers')) { + const url = `/auth/validate_token/` + getRequest(url, handleSuccessValidateToken, (error) => { console.log(error) }) + } + }, []) + + let loc = useLocation() + let history = useHistory() + useEffect(() => { + const url = `/auth/validate_token/` + + let query = new URLSearchParams(loc.search) + + if (query.get("auth_token")) { + let config = { + headers: { + "access-token": query.get("auth_token"), + "client": query.get("client_id"), + "uid": query.get("uid"), + "expiry": query.get("expiry"), + "token-type": 'Bearer' + } + } + validateGoogleLoginToken(url, config, handleSuccessValidateToken, (error) => { console.log(error) }) + history.push("/") + } + }, [loc]) + + useEffect(() => { + if (state.currentUser.askTeacherQuestion === true) { + dispatch({ + type: "TOGGLE_MODAL_COLABORAR_PLATAFORMA", + modalColaborarPlataformaOpen: true + }); + } + }, [state.currentUser.askTeacherQuestion]) + + const toggleSnackbar = (event, reason) => { + if (reason === 'clickaway') { + return; + } + + handleSuccessfulLogin(false); + } const handleSignUp = () => { - setSignUp(!signUpOpen) + setSignUp(!signUpOpen) } const handleLogin = () => { - setLogin(!loginOpen) + setLogin(!loginOpen) } const handleClickSearch = (open) => { @@ -51,17 +114,42 @@ export default function Header(props){ }) } - return( - <> - <AcessibilityBar/> - <MenuBar openSearchBar={handleClickSearch} openSignUp = {handleSignUp} openLogin = {handleLogin}/> - { state.searchOpen && - <SearchBar/> - } - <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin}/> - <LoginModal open={loginOpen} handleClose={handleLogin} openSignUp={handleSignUp}/> - {/*<ColaborarModal open={state.modalColaborarPlataformaOpen} handleClose={handleKyloren} />*/} - - </> + let windowWidth = window.innerWidth + + return ( + <React.Fragment> + <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + > + <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert> + </Snackbar> + { + windowWidth > 990 ? + ( + <React.Fragment> + <MenuBar openSearchBar={handleClickSearch} openSignUp={handleSignUp} openLogin={handleLogin} /> + { + state.searchOpen && + <SearchBar /> + } + </React.Fragment> + + ) + : + ( + <React.Fragment> + <MenuBarMobile openSearchBar={handleClickSearch} openSignUp={handleSignUp} openLogin={handleLogin} /> + { + state.searchOpen && + <SearchBar /> + } + </React.Fragment> + ) + } + <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} /> + <LoginModal open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp} + openSnackbar={() => { handleSuccessfulLogin(true) }} /> + <ColaborarModal open={modalColaborar} handleClose={() => { setModalColaborar(!modalColaborar) }} /> + </React.Fragment> ) } diff --git a/src/Components/HelpCenter/Cards/CardEncontrando.js b/src/Components/HelpCenter/Cards/CardEncontrando.js new file mode 100644 index 0000000000000000000000000000000000000000..173f179d24445dcc8aebdab0ef5ab7bfb59d3eda --- /dev/null +++ b/src/Components/HelpCenter/Cards/CardEncontrando.js @@ -0,0 +1,155 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import styled from "styled-components"; +import EncontrandoRecurso from "../../../img/ajuda/Encontrando_recursos.png"; + +import { Link } from "react-router-dom"; + +export default function CardEncontrando(props) { + return ( + <CardAjuda> + <div className="card"> + <img src={EncontrandoRecurso} alt="" /> + <h3>Encontrando Recursos</h3> + <hr /> + <Link + to={{ + pathname: "encontrando-recurso", + state: { value: "0" } + }} + > + Como fazer uma busca? + </Link> + <br /> + <Link + to={{ + pathname: "encontrando-recurso", + state: { value: "1" } + }} + > + Como filtrar os resultados? + </Link> + <br /> + <Link + to={{ + pathname: "encontrando-recurso", + state: { value: "2" } + }} + > + Como os recursos são ranqueados? + </Link> + <br /> + </div> + <div className="card-rodape"> + <Link + to={{ + pathname: "encontrando-recurso", + state: { value: "0" } + }} + > + VER MAIS + </Link> + </div> + </CardAjuda> + ); +} + +const CardAjuda = styled.div` + + height: 360px; + margin-bottom: 20px; + width: 100% + + .card { + height: 280px; + padding: 40px 15px; + text-align: center; + font-size: 14px; + background-color:#fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-top:30px + h3 { + font-size: 23px; + font-weight: 400; + color: #666; + margin-top: 20px; + margin-bottom: 10px; + line-height: 1.1; + } + + hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; + color: #a5a5a5; + } + + a { + font-size: 15px; + color: #666; + text-decoration: none; + text-align: center; + :hover { + color: #000; + } + + } + + img { + height: 62px ; + width: 62px ; + } + + } + + .card-rodape { + box-sizing: border-box; + + a { + border-radius: 0; + width: 100%; + font-size: 13px; + font-weight: 700; + color: #fff; + transition: .2s ease; + border: none; + height: 40px; + line-height: 40px; + background-color: #00bcd4; + touch-action: manipulation; + cursor: pointer; + text-decoration: none; + display: inline-block; + margin-bottom: 0; + text-align: center; + white-space: nowrap; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + user-select: none; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + + } + } + +} + +`; diff --git a/src/Components/HelpCenter/Cards/CardGerenciando.js b/src/Components/HelpCenter/Cards/CardGerenciando.js new file mode 100644 index 0000000000000000000000000000000000000000..d3e1daa3299815d50e1c948ce1810d172d49c9ae --- /dev/null +++ b/src/Components/HelpCenter/Cards/CardGerenciando.js @@ -0,0 +1,174 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import styled from "styled-components"; +import GerenciandoConta from "../../../img/ajuda/Gerenciando_a_conta.png"; + +import { Link } from "react-router-dom"; + +export default function CardGerenciando(props) { + return ( + <CardAjuda> + <div className="card"> + <img src={GerenciandoConta} alt="" /> + <h3>Gerenciando Conta</h3> + <hr /> + <Link + to={{ + pathname: "gerenciando-conta", + state: { value: "0" } + }} + > + Por que me cadastrar? + </Link> + <br /> + <Link + to={{ + pathname: "gerenciando-conta", + state: { value: "1" } + }} + > + Como fazer meu cadastro? + </Link> + <br /> + <Link + to={{ + pathname: "gerenciando-conta", + state: { value: "2" } + }} + > + Como alterar minha senha? + </Link> + <br /> + <Link + to={{ + pathname: "gerenciando-conta", + state: { value: "3" } + }} + > + Como acessar a conta? + </Link> + <br /> + <Link + to={{ + pathname: "gerenciando-conta", + state: { value: "4" } + }} + > + Esqueci minha senha. O que fazer? + </Link> + <br /> + </div> + <div className="card-rodape"> + <Link + to={{ + pathname: "gerenciando-conta", + state: { value: "0" } + }} + > + VER MAIS + </Link> + </div> + </CardAjuda> + ); +} + +const CardAjuda = styled.div` + + height: 360px; + margin-bottom: 20px; + width: 100% + + .card { + height: 280px; + padding: 40px 15px; + text-align: center; + font-size: 14px; + background-color:#fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-top:30px + + h3 { + font-size: 23px; + font-weight: 400; + color: #666; + margin-top: 20px; + margin-bottom: 10px; + line-height: 1.1; + } + + hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; + color: #a5a5a5; + } + + a { + font-size: 15px; + color: #666; + text-decoration: none; + text-align: center; + :hover { + color: #000; + } + + } + + img { + height: 62px ; + width: 62px ; + } + + } + + .card-rodape { + box-sizing: border-box; + + a { + border-radius: 0; + width: 100%; + font-size: 13px; + font-weight: 700; + color: #fff; + transition: .2s ease; + border: none; + height: 40px; + line-height: 40px; + background-color: #00bcd4; + touch-action: manipulation; + cursor: pointer; + text-decoration: none; + display: inline-block; + margin-bottom: 0; + text-align: center; + white-space: nowrap; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + user-select: none; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + + } + } + +} + +`; diff --git a/src/Components/HelpCenter/Cards/CardParticipando.js b/src/Components/HelpCenter/Cards/CardParticipando.js new file mode 100644 index 0000000000000000000000000000000000000000..5091e9908cf3a52399f0ce08907601f24b93618a --- /dev/null +++ b/src/Components/HelpCenter/Cards/CardParticipando.js @@ -0,0 +1,149 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import styled from "styled-components"; +import ParticipandoRede from "../../../img/ajuda/Participando_da_rede.png"; + +import { Link } from "react-router-dom"; + +export default function CardParticipando(props) { + return ( + <CardAjuda> + <div className="card"> + <img src={ParticipandoRede} alt="" /> + <h3>Participando da Rede</h3> + <hr /> + <Link + to={{ + pathname: "participando-da-rede", + state: { value: "0" } + }} + > + Comentanto os recursos + </Link> + <br /> + <Link + to={{ + pathname: "participando-da-rede", + state: { value: "1" } + }} + > + Como relatar uma experiência ou avaliar um recurso? + </Link> + <br /> + </div> + <div className="card-rodape"> + <Link + to={{ + pathname: "participando-da-rede", + state: { value: "0" } + }} + > + VER MAIS + </Link> + </div> + </CardAjuda> + ); +} + +const CardAjuda = styled.div` + + height: 360px; + margin-bottom: 20px; + width: 100% + + + .card { + height: 280px; + padding: 40px 15px; + text-align: center; + font-size: 14px; + background-color:#fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-top:30px + + + h3 { + font-size: 23px; + font-weight: 400; + color: #666; + margin-top: 20px; + margin-bottom: 10px; + line-height: 1.1; + } + + hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; + color: #a5a5a5; + } + + a { + font-size: 15px; + color: #666; + text-decoration: none; + text-align: center; + :hover { + color: #000; + } + + } + + img { + height: 62px ; + width: 62px ; + } + + } + + .card-rodape { + box-sizing: border-box; + + a { + border-radius: 0; + width: 100%; + font-size: 13px; + font-weight: 700; + color: #fff; + transition: .2s ease; + border: none; + height: 40px; + line-height: 40px; + background-color: #00bcd4; + touch-action: manipulation; + cursor: pointer; + text-decoration: none; + display: inline-block; + margin-bottom: 0; + text-align: center; + white-space: nowrap; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + user-select: none; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + + } + } + +} + +`; diff --git a/src/Components/HelpCenter/Cards/CardPublicando.js b/src/Components/HelpCenter/Cards/CardPublicando.js new file mode 100644 index 0000000000000000000000000000000000000000..c5fb0a3ff925d87a602f30ff467daf95182bc8b9 --- /dev/null +++ b/src/Components/HelpCenter/Cards/CardPublicando.js @@ -0,0 +1,154 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import styled from "styled-components"; +import PublicandoRecursos from "../../../img/ajuda/Publicando_recursos.png"; +import { Link } from "react-router-dom"; + +export default function CardPublicando(props) { + return ( + <CardAjuda> + <div className="card"> + <img src={PublicandoRecursos} alt="" /> + <h3>Publicando Recursos</h3> + <hr /> + <Link + to={{ + pathname: "publicando-recurso", + state: { value: "0" } + }} + > + Por que enviar um recurso? + </Link> + <br /> + <Link + to={{ + pathname: "publicando-recurso", + state: { value: "1" } + }} + > + Como publicar um recurso? + </Link> + <br /> + <Link + to={{ + pathname: "publicando-recurso", + state: { value: "2" } + }} + > + Quais tipos de recurso e formatos a plataforma aceita? + </Link> + <br /> + </div> + <div className="card-rodape"> + <Link + to={{ + pathname: "publicando-recurso", + state: { value: "0" } + }} + > + VER MAIS + </Link> + </div> + </CardAjuda> + ); +} + +const CardAjuda = styled.div` + +height: 360px; +margin-bottom: 20px; +width: 100% + +.card { + height: 280px; + padding: 40px 15px; + text-align: center; + font-size: 14px; + background-color:#fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-top:30px + h3 { + font-size: 23px; + font-weight: 400; + color: #666; + margin-top: 20px; + margin-bottom: 10px; + line-height: 1.1; + } + + hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; + color: #a5a5a5; + } + + a { + font-size: 15px; + color: #666; + text-decoration: none; + text-align: center; + :hover { + color: #000; + } + + } + + img { + height: 62px ; + width: 62px ; + } + +} + +.card-rodape { + box-sizing: border-box; + + a { + border-radius: 0; + width: 100%; + font-size: 13px; + font-weight: 700; + color: #fff; + transition: .2s ease; + border: none; + height: 40px; + line-height: 40px; + background-color: #00bcd4; + touch-action: manipulation; + cursor: pointer; + text-decoration: none; + display: inline-block; + margin-bottom: 0; + text-align: center; + white-space: nowrap; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + user-select: none; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + + } +} + +} + +`; diff --git a/src/Components/HelpCenter/TabsManageAc/Forget.js b/src/Components/HelpCenter/TabsManageAc/Forget.js new file mode 100644 index 0000000000000000000000000000000000000000..c3c247a3a93834ae0bef65bf6e27d393e35b4063 --- /dev/null +++ b/src/Components/HelpCenter/TabsManageAc/Forget.js @@ -0,0 +1,101 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + +import LoginImg from '../../../img/ajuda/login_img.jpg' +import RecuperarSenhaImg from '../../../img/ajuda/recuperarsenha_img.jpg' + + + + +export default function Forget(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p>Para redefinir a senha da sua conta, siga essas instruções:</p> + + <ol> + <li> + Acesse a <a href="/" target="_blank">Página Inicial</a> e clique em + “Entrar†no canto superior direito da página. + </li> + <li>Clique em “Esqueceu a senha? Clique Aqui!â€.</li> + <img className="primeira" src={LoginImg} alt="primeira imagem"/> + <li>Preencha com o seu endereço de e-mail e clique em “Buscarâ€.</li> + <img className="segunda" src={RecuperarSenhaImg} alt="segunda imagem"/> + <li>Você receberá um e-mail no endereço informado, contendo as instruções para redefinir sua senha.</li> + </ol> + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + a { + color: #00bcd4; + text-decoration: none; + :hover { + text-decoration: underline; + } + } + + ol { + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + .primeira { + + height: 300px; + margin-right: 40px; + vertical-align: middle; + } + .segunda { + height: 150px; + margin-right: 40px; + vertical-align: middle; + + } + } + li { + font-size: 14px; + } + + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsManageAc/HowToAccess.js b/src/Components/HelpCenter/TabsManageAc/HowToAccess.js new file mode 100644 index 0000000000000000000000000000000000000000..aa06035616a818f7c2f82a0395ab93caaab5ea85 --- /dev/null +++ b/src/Components/HelpCenter/TabsManageAc/HowToAccess.js @@ -0,0 +1,84 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + + + + +export default function HowtoAccess(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p>Para acessar a sua conta:</p> + <ol> + <li>Acesse a <a href="/" target="_blank">Página Inicial</a>.</li> + + <li>Clique em “Entrar†no canto superior direito.</li> + + <li>Preencha os campos solicitados.</li> + + <li>Clique em “Entrarâ€.</li> + </ol> + + + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + a { + color: #00bcd4; + text-decoration: none; + :hover { + text-decoration: underline; + } + } + + ol { + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsManageAc/HowToChange.js b/src/Components/HelpCenter/TabsManageAc/HowToChange.js new file mode 100644 index 0000000000000000000000000000000000000000..1b119e9909b898331d788c1098d0abe58d0d7fb1 --- /dev/null +++ b/src/Components/HelpCenter/TabsManageAc/HowToChange.js @@ -0,0 +1,85 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + + + + +export default function HowToDo(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p> Para alterar sua senha você precisa estar conectado na Plataforma e então, seguir esses passos: </p> + <ol> + <li>Na <a href="/" target="_blank">Página Inicial</a>, clique no menu “Minha área†localizado no canto superior direito da página.</li> + + <li>Clique na opção “Configurações†que aparecerá no submenu.</li> + + <li>Clique no link “Gerenciar contaâ€, no menu lateral, localizado no canto superior esquerdo</li> + + <li>Na opção “Alterar senhaâ€, preencha os campos com sua senha atual e depois com a nova senha que deseja.</li> + <li>Clique na opção "Alterar senha" logo abaixo.</li> + </ol> + + <p>Pronto! No próximo acesso, você já pode usar sua nova senha!</p> + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + a { + color: #00bcd4; + text-decoration: none; + :hover { + text-decoration: underline; + } + } + + ol { + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsManageAc/HowToDo.js b/src/Components/HelpCenter/TabsManageAc/HowToDo.js new file mode 100644 index 0000000000000000000000000000000000000000..f2df2d292e40e39c2367a1939c956a8313cecc21 --- /dev/null +++ b/src/Components/HelpCenter/TabsManageAc/HowToDo.js @@ -0,0 +1,85 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + + + + +export default function HowTodo(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p> Para fazer o cadastro é rapidinho: </p> + <ol> + <li>Acesse a <a href="/" target="_blank">Página Inicial</a> da Plataforma.</li> + + <li>Clique em “Cadastre-se†no canto superior direito da página.</li> + + <li> Preencha os campos solicitados.</li> + + <li>Clique em “Cadastrarâ€.</li> + </ol> + + <p>Pronto! Você será conectado automaticamente.</p> + <p>Nas próximas vezes que acessar a Plataforma, clique em “Entrar†e faça o login com seus dados de cadastro.</p> + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + a { + color: #00bcd4; + text-decoration: none; + :hover { + text-decoration: underline; + } + } + + ol { + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsManageAc/Why.js b/src/Components/HelpCenter/TabsManageAc/Why.js new file mode 100644 index 0000000000000000000000000000000000000000..09c243b07d805edb7d9d1efe93b56b92492eb479 --- /dev/null +++ b/src/Components/HelpCenter/TabsManageAc/Why.js @@ -0,0 +1,70 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + + + + + +export default function Why(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p> + Quais vantagens eu terei após criar um perfil na Plataforma? + </p> + <p> + Ao se cadastrar, você terá mais opções de interação na plataforma, como + criar suas próprias coleções de recursos, seguir usuários e coleções de + outros usuários. Além disso, poderá contribuir com a rede de usuários + fazendo relatos de experiências sobre o uso dos recursos, avaliando com + estrelas, favoritando e reportando violações de recursos (quando necessário). + </p> + + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + + + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsNetPart/How.js b/src/Components/HelpCenter/TabsNetPart/How.js new file mode 100644 index 0000000000000000000000000000000000000000..221667e30390c391aa1dab7f9c3264eddcadfe9c --- /dev/null +++ b/src/Components/HelpCenter/TabsNetPart/How.js @@ -0,0 +1,82 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + + + + + +export default function How(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p> + Ao abrir um recurso, você pode avaliá-lo e descrever como foi sua experiência: + </p> + <ol> + <li>Abra o recurso desejado.</li> + <li>No fim da página haverá uma área de Relatos de Experiência.</li> + <li>Preencha as informações no quadro “Conte sua experiênciaâ€.</li> + <li>Clique em “Enviarâ€.</li> + + </ol> + <p> + Obs: as estrelinhas indicam se o recurso foi útil para você. Então quanto + mais estrelinhas, melhor será a avaliação do recurso. + </p> + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + + + ol { + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsNetPart/What.js b/src/Components/HelpCenter/TabsNetPart/What.js new file mode 100644 index 0000000000000000000000000000000000000000..8171c7e4253436ddb50edb6a2c337981e51d4393 --- /dev/null +++ b/src/Components/HelpCenter/TabsNetPart/What.js @@ -0,0 +1,83 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + + + + + +export default function What(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p> + Aqui na Plataforma, incentivamos os usuários a comentarem os recursos + contando como foi sua experiência de uso. Veja sugestões de pontos a serem abordados no seu comentário: + </p> + <ul> + <li> + Relatar como utilizou o recurso durante a aula, para que outros + professores possam se basear e adaptar para o seu próprio objetivo pedagógico. + </li> + <li>Relatar a recepção dos alunos em relação ao recurso.</li> + <li>Apontar os pontos a serem melhorados no recurso para que o autor tenha a oportunidade de ajustar.</li> + <li>Apontar os pontos positivos do recurso para que o autor ganhe o devido reconhecimento e prestÃgio!</li> + + </ul> + + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + + + ul { + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsPlataformaMEC/How.js b/src/Components/HelpCenter/TabsPlataformaMEC/How.js new file mode 100644 index 0000000000000000000000000000000000000000..9834d9398962afcdd63315b747f1bb2f5880c2b7 --- /dev/null +++ b/src/Components/HelpCenter/TabsPlataformaMEC/How.js @@ -0,0 +1,82 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import styled from "styled-components"; + +export default function How(props) { + return ( + <Card> + <link + href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" + rel="stylesheet" + /> + <div style={{ marginBottom: "9px" }}> + <span>{props.title}</span> + </div> + <div style={{ width: "640px", height: "360px" }}> + <iframe + title="Video Página Ajuda" + width="640" + height="360" + src="https://www.youtube.com/embed/CRW5h2pHugM" + frameborder="0" + allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" + allowfullscreen + ></iframe> + </div> + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + a { + color: #00bcd4; + text-decoration: none; + :hover { + text-decoration: underline; + } + } + + ul { + padding-left: 0 !important; + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + list-style-type: none; + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } +`; diff --git a/src/Components/HelpCenter/TabsPlataformaMEC/Software.js b/src/Components/HelpCenter/TabsPlataformaMEC/Software.js new file mode 100644 index 0000000000000000000000000000000000000000..9da4c8bddb9a5659b3755d965572926698d3aea7 --- /dev/null +++ b/src/Components/HelpCenter/TabsPlataformaMEC/Software.js @@ -0,0 +1,171 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import styled from "styled-components"; + +const softwares = [ + { + recursos: "Google Chrome", + texto: "Navegador web.", + link: "https://ninite.com/chrome/" + }, + { + recursos: "Java", + texto: + "Necessário para a execução de sites que utilizem sua linguagem de programação java.", + link: + "http://javadl.oracle.com/webapps/download/AutoDL?BundleId=225355_090f390dda5b47b9b721c7dfaa008135NINITE: https://ninite.com/java8/" + }, + { + recursos: "Adobe Flash Player", + texto: + "plugin que reproduz multimÃdia na internet de forma mais eficiente.", + link: + "https://get.adobe.com/br/flashplayer/download/?installer=FP_27_for_Opera_and_Chromium_-_PPAPI&os=Windows%207&browser_type=KHTML&browser_dist=Chrome&dualoffer=false&mdualoffer=true&stype=6703&d=McAfee_Security_Scan_Plus&d=McAfee_Safe_Connect" + }, + { + recursos: "Adobe Air", + texto: + "Plugin para execução de códigos para aplicações nativas e jogos para computadores desktop com Windows e Mac OS bem como dispositivos iOS e Android.", + link: "https://ninite.com/air/" + }, + { + recursos: "Net Framework", + texto: + "O .NET Framework é um ambiente de execução de tempo de execução que gerencia os aplicativos destinados ao .NET Framework.", + link: "https://ninite.com/.net4.7/" + }, + { + recursos: "Acrobat Reader DC", + texto: "Abrir documento no formato PDF", + link: "https://ninite.com/foxit/" + }, + { + recursos: "Video LAN", + texto: "REPRODUTOR DE VÃDEO.", + link: "http://download.winzip.com/gl/nkln/winzip21_downwz.exe" + }, + { + recursos: "Winzip", + texto: "WinZip: abrir arquivos compactados.", + link: "http://download.winzip.com/gl/nkln/winzip21_downwz.exe" + }, + { + recursos: "K-Lite Codec", + texto: + "Software que ajuda na reprodução de arquivos multimÃdia no computador.", + link: "https://ninite.com/libreoffice/" + }, + { + recursos: "Libre Office", + texto: + "Software gratuito para visualização e edição de documentos, planilhas e apresentações.", + link: "https://ninite.com/libreoffice/" + }, + { + recursos: "Swiff Player", + texto: "reprodutor de mÃdia do formato swf", + link: "https://www.w3schools.com/html/" + } +]; + +export default function Software(props) { + return ( + <Card> + <link + href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" + rel="stylesheet" + /> + <div style={{ marginBottom: "9px" }}> + <span>{props.title}</span> + </div> + <p> + Todo e qualquer recurso digital precisa de um programa ou aplicativo + para ser visualizado. Por exemplo, grande parte dos recursos são + arquivos compactados que servem para ocupar menos espaço de + armazenamento, recebendo a extensão .zip ou .rar, para utilizá-lo, você + precisa ter instalado um descompactador de arquivos, como o{" "} + <a href="http://download.winzip.com/gl/nkln/winzip21_downwz.exe"> + Winzip + </a>{" "} + ou <a href="https://ninite.com/winrar/">Winrar</a>. + </p> + <p> + Alguns destes programas são bem comuns, e provavelmente, você já deve + ter instalado em seu computador, como processador de texto para formato + .docx, o Microsoft Word (para Sistema Operacional Windows) ou + LibreOffice (nas distribuições Linux). Porém, existem outros programas + que não são tão comuns assim, mas que são fáceis de instalar em seu + computador. A seguir, vamos apresentar umas informações que podem guiar + a utilização dos recursos em suas aulas. + </p> + <p> + Você precisa ficar atento as siglas que terminação do recurso que dizem + de qual formato ele é. DaÃ, qual programa pode ser utilizado para abrir + o Recursos Educacionais Digitais em seu computador? Fizemos uma lista de + softwares que você poderá precisar de acordo com o tipo de recurso: + </p> + <ul> + {softwares.map(item => ( + <li> + <a href={item.link}>{item.recursos}</a> - {item.texto} <br /> + <br />{" "} + </li> + ))} + </ul> + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + a { + color: #00bcd4; + text-decoration: none; + :hover { + text-decoration: underline; + } + } + + ul { + padding-left: 0 !important; + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + list-style-type: none; + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } +`; diff --git a/src/Components/HelpCenter/TabsPlataformaMEC/Types.js b/src/Components/HelpCenter/TabsPlataformaMEC/Types.js new file mode 100644 index 0000000000000000000000000000000000000000..1d30662b8f79b6741a0708cd906fb57c38d3547e --- /dev/null +++ b/src/Components/HelpCenter/TabsPlataformaMEC/Types.js @@ -0,0 +1,86 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import styled from "styled-components"; + +const tipos = [ + { recursos: "- áudios;" }, + { recursos: "- imagens;" }, + { recursos: "- mapas;" }, + { recursos: "- softwares educacionais" }, + { recursos: "- textos;" }, + { recursos: "- vÃdeos" } +]; + +export default function Types(props) { + return ( + <Card> + <link + href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" + rel="stylesheet" + /> + <div style={{ marginBottom: "9px" }}> + <span>{props.title}</span> + </div> + <p> + A plataforma integra os Recursos Educacionais Digitais dos principais + portais abertos. Conheça alguns deles: + </p> + <ul> + {tipos.map(item => ( + <li>{item.recursos}</li> + ))} + </ul> + <p> + E ainda, nesta plataforma são organizados pelos diferentes componentes + curriculares (matemática, artes, etc.) e etapas de ensino (Ensino Médio, + Fundamental, Anos Iniciais, etc.) onde podem ser aplicados. + </p> + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + ul { + padding-left: 0 !important; + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + list-style-type: none; + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } +`; diff --git a/src/Components/HelpCenter/TabsPlataformaMEC/Understand.js b/src/Components/HelpCenter/TabsPlataformaMEC/Understand.js new file mode 100644 index 0000000000000000000000000000000000000000..4696bce01ce19794d4adf4f827f263e65f2bc488 --- /dev/null +++ b/src/Components/HelpCenter/TabsPlataformaMEC/Understand.js @@ -0,0 +1,76 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import styled from "styled-components"; + +export default function Understand(props) { + return ( + <Card> + <link + href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" + rel="stylesheet" + /> + <div style={{ marginBottom: "9px" }}> + <span>{props.title}</span> + </div> + <p> + <strong>Ãrea de Recursos Educacionais Digitais</strong> + <br /> + Recursos que, no mÃnimo, têm uma licença de uso mais flexÃvel. Uma + licença que permite que o recurso possa ser utilizado, alterado e + manipulado sem restrições. Adicionalmente, um recurso aberto pode + utilizar um formato aberto, um formato de arquivo que permite a fácil + edição por terceiros. Nenhum controle (como cadastro e senha) deve + existir para acesso a recursos abertos. + </p> + <p> + <strong>Ãrea de Materiais de Formação</strong> + <br /> + Nesta área, você acessa livremente materiais completos de formação, como + cursos já oferecidos pelo MEC e seus parceiros. São conteúdos elaborados + por equipes multidisciplinares e de autoria de pesquisadores e + educadores renomados nas áreas. + </p> + <p> + <strong>Ãrea de Coleções de Usuários</strong> + <br /> + Nesta área, você tem acesso à s coleções criadas e organizadas pelos + usuários da plataforma. É mais uma possibilidade de buscar recursos + educacionais para sua aula! + </p> + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } +`; diff --git a/src/Components/HelpCenter/TabsPlataformaMEC/What.js b/src/Components/HelpCenter/TabsPlataformaMEC/What.js new file mode 100644 index 0000000000000000000000000000000000000000..8bab746bc3418efd516b158125a50a366cabfa0d --- /dev/null +++ b/src/Components/HelpCenter/TabsPlataformaMEC/What.js @@ -0,0 +1,117 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import styled from "styled-components"; + +export default function What(props) { + return ( + <Card> + <link + href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" + rel="stylesheet" + /> + <div style={{ marginBottom: "9px" }}> + <span>{props.title}</span> + </div> + <p> + Bem-vindo(a) à Plataforma MEC, uma iniciativa do Ministério da Educação! + </p> + <p> + A Plataforma MEC é parte do processo de implementação do Compromisso 6 + do 3º Plano de Ação da Parceria Governo Aberto (OGP-Brasil), que tem por + objetivo “incorporar na polÃtica educacional o potencial da cultura + digital, de modo a fomentar a autonomia para uso, reuso e adaptação de + recursos educacionais digitais, valorizando a pluralidade e a + diversidade da educação brasileiraâ€. O documento completo pode ser + consultado{" "} + <a href="http://www.governoaberto.cgu.gov.br/noticias/2017/3o-plano-de-acao-nacional-na-parceria-para-governo-aberto"> + aqui + </a> + . + </p> + <p> + <strong>Abertos</strong> + <br /> + Recursos que, no mÃnimo, têm uma licença de uso mais flexÃvel. Uma + licença que permite que o recurso possa ser utilizado, alterado e + manipulado sem restrições. Adicionalmente, um recurso aberto pode + utilizar um formato aberto, um formato de arquivo que permite a fácil + edição por terceiros. Nenhum controle (como cadastro e senha) deve + existir para acesso a recursos abertos. + </p> + <p> + <strong>Grátis</strong> + <br /> + Recursos para os quais os usuários não têm que fazer qualquer desembolso + monetário, mas que exibem certas restrições: usualmente não podem ser + baixados ou alterados. E, muitas vezes, como os recursos fechados, é + necessário cadastro ou troca de informações pessoais para seu uso. + </p> + <p> + <strong>Fechados</strong> + <br /> + Recursos que criam restrições ao seu acesso, uso ou reuso. Como exemplo, + podemos mencionar recursos que só são acessÃveis mediante cadastro, que + são pagos, ou que têm licenças restritivas (como “todos os direitos + reservadosâ€, o sÃmbolo ©). + </p> + + <p> + O Plano Nacional de Educação (2014-2024) enfatiza, nas metas 5 e 7, a + importância dos recursos educacionais abertos para fomentar a qualidade + da educação básica. + </p> + <p> + A Resolução CNE/CES nº 1, de 11 de março de 2016, também enfatiza a + importância dos recursos educacionais abertos para as instituições de + educação superior e para as atividades de educação a distância, + promovendo “a criação, disponibilização, uso e gestão de tecnologias e + recursos educacionais abertos, por meio de licenças livres, que + facilitem o uso, a revisão, a tradução, a adaptação, a recombinação, a + distribuição e o compartilhamento gratuito pelo cidadão, resguardados os + direitos autorais pertinentes.†+ </p> + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + a { + color: #00bcd4; + text-decoration: none; + :hover { + text-decoration: underline; + } + } + + p { + margin: 0 0 10px; + font-size: 15px; + } +`; diff --git a/src/Components/HelpCenter/TabsPlataformaMEC/Which.js b/src/Components/HelpCenter/TabsPlataformaMEC/Which.js new file mode 100644 index 0000000000000000000000000000000000000000..b1fe77ed63697519fb011663dbcce423708ef1c7 --- /dev/null +++ b/src/Components/HelpCenter/TabsPlataformaMEC/Which.js @@ -0,0 +1,79 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from "react"; +import styled from "styled-components"; + +const parcas = [ + { parceiro: "- Portal do Profesor" }, + { parceiro: "- DomÃnio Público;" }, + { parceiro: "- Banco internacional de objetos educacionais;" }, + { parceiro: "- TV Escola;" } +]; + +export default function Which(props) { + return ( + <Card> + <link + href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" + rel="stylesheet" + /> + <div style={{ marginBottom: "9px" }}> + <span>{props.title}</span> + </div> + <p> + A plataforma integra os Recursos Educacionais Digitais dos principais + portais abertos. Conheça alguns deles: + </p> + <ul> + {parcas.map(item => ( + <li>{item.parceiro}</li> + ))} + </ul> + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + ul { + padding-left: 0 !important; + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + list-style-type: none; + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } +`; diff --git a/src/Components/HelpCenter/TabsResourseFind/HowToDo.js b/src/Components/HelpCenter/TabsResourseFind/HowToDo.js new file mode 100644 index 0000000000000000000000000000000000000000..65934c1c01e640c5ad316674b38a6787708722f2 --- /dev/null +++ b/src/Components/HelpCenter/TabsResourseFind/HowToDo.js @@ -0,0 +1,94 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + +import Busca from '../../../img/ajuda/busca_img.jpg' + + + + +export default function HowToDo(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p> + Siga os passos a seguir: + </p> + <ol> + <li>Acesse a <a href="/" target="_blank">Página Inicial</a>.</li> + + <li> + Digite o que você procura na caixa de busca localizada no centro da + página. Por exemplo: “vÃdeo aquecimento global†ou “aritméticaâ€. + </li> + + </ol> + <img src={Busca} alt="Busca imagem"/> + <p> + No resultado serão apresentados os cartões de recursos relacionados à sua busca. + </p> + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + img { + height: auto; + width: 100%; + } + a { + color: #00bcd4; + text-decoration: none; + :hover { + text-decoration: underline; + } + } + ol { + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsResourseFind/HowToFilter.js b/src/Components/HelpCenter/TabsResourseFind/HowToFilter.js new file mode 100644 index 0000000000000000000000000000000000000000..928d3dc99e598dd2fbc1204e162fc2e00f78e681 --- /dev/null +++ b/src/Components/HelpCenter/TabsResourseFind/HowToFilter.js @@ -0,0 +1,73 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + +import Filtros from '../../../img/ajuda/filtros_img.jpg' + + + + +export default function HowToFilter(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p> + Após efetuar sua busca, você pode filtrar os resultados de acordo com o + que procura, com a opção “Filtros†localizada no lado esquerdo da página. + </p> + + <img src={Filtros} alt="Busca imagem"/> + <p> + Você pode filtrar pelos componentes curriculares, tipos de recurso, etapas de ensino e palavra-chave. + </p> + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + img { + height: 200px; + margin-right: 40px; + vertical-align: middle; + } + + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsResourseFind/HowToRank.js b/src/Components/HelpCenter/TabsResourseFind/HowToRank.js new file mode 100644 index 0000000000000000000000000000000000000000..cb2a04b6a64b73d1721edaf51aed65214c6c2801 --- /dev/null +++ b/src/Components/HelpCenter/TabsResourseFind/HowToRank.js @@ -0,0 +1,65 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + + + + + +export default function HowToRank(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p> + O ranqueamento dos recursos está relacionado com as avaliações, estrelas, + comentários, curtidas e até mesmo com as informações sobre o seu recurso. + Ou seja, quanto mais interações positivas um recurso tiver, mais significativo + ele será para a plataforma e seus usuários. Isso quer dizer que os recursos + melhores ranqueados ganham mais destaque nos resultados de busca! + </p> + + + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsResoursePub/How.js b/src/Components/HelpCenter/TabsResoursePub/How.js new file mode 100644 index 0000000000000000000000000000000000000000..a84cd304098a103d6906a6ea2e5ed2f8481ae989 --- /dev/null +++ b/src/Components/HelpCenter/TabsResoursePub/How.js @@ -0,0 +1,98 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + + + + +export default function How(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p> + Você possui um material pedagógico interessante e gostaria de compartilhar + com outros professores? Aproveite o espaço da Plataforma MEC para publicar + esse Recurso! Para isso, siga os passos a seguir: + </p> + <ol> + <li>Acesse a <a href="/" target="_blank">Página Inicial</a> da Plataforma.</li> + + <li>Clique no botão “Publicar Recurso†localizado no topo da página.</li> + + <li> + No quadro pontilhado em azul (enviar recurso), no canto esquerdo da + página, você pode escolher o arquivo do seu computador, arrastá-lo ao + quadro ou até mesmo enviar o link de um recurso no botão “enviar link†+ logo abaixo. + </li> + + <li>Em seguida, preencha as informações sobre o recurso no formulário ao lado.</li> + </ol> + + <p> + Dica: para que outros usuários encontre o seu recurso é muito importante + que você preencha o formulário com a maior quantidade de detalhes possÃvel! + </p> + <li>No final do formulário é só clicar no botão “Salvar e Avançar†para prosseguir ao próximo passo.</li> + <li>Ao concluir todas as etapas, você receberá uma mensagem de confirmação do envio do seu Recurso!</li> + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + a { + color: #00bcd4; + text-decoration: none; + :hover { + text-decoration: underline; + } + } + + ol { + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsResoursePub/Which.js b/src/Components/HelpCenter/TabsResoursePub/Which.js new file mode 100644 index 0000000000000000000000000000000000000000..49a5e1f1e525cfdb04afe4fc6263bf9e57433185 --- /dev/null +++ b/src/Components/HelpCenter/TabsResoursePub/Which.js @@ -0,0 +1,91 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + + + + +export default function Which(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p> + Veja abaixo a lista dos Tipos de Recursos e alguns exemplos de Formatos de + Arquivos que são aceitos para publicação na Plataforma MEC: + </p> + <ul> + <li>Imagem - JPG, GIF e PNG</li> + <li>Mapa - JPG, GIF e PNG</li> + <li>Animação/Simulador - SWF</li> + <li>Texto - PDF, TXT, DOC e DOCX (Word)</li> + <li>Ãudio - MP3 e WAV</li> + <li>VÃdeo - WMV</li> + <li>Apresentação - PPT e PPTX (PowerPoint)</li> + <li>Infográfico - JPG, GIF e PNG</li> + <li>Software Educacional - EXE</li> + <li>Outros - ZIP e RAR (Compactadores) XLS e XLSX (Excel)</li> + + </ul> + + + + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + a { + color: #00bcd4; + text-decoration: none; + :hover { + text-decoration: underline; + } + } + + ul { + margin-top: 0; + margin-bottom: 10px; + line-height: 1.42857143; + } + + li { + font-size: 14px; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelpCenter/TabsResoursePub/Why.js b/src/Components/HelpCenter/TabsResoursePub/Why.js new file mode 100644 index 0000000000000000000000000000000000000000..ca1a16b9ece1538ed7640c181c5873d7f1e54668 --- /dev/null +++ b/src/Components/HelpCenter/TabsResoursePub/Why.js @@ -0,0 +1,76 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; + + + + +export default function Why(props) { + return( + <Card> + <link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet"/> + <div style={{marginBottom: "9px"}}> + <span>{props.title}</span> + </div> + <p> + Ao enviar um recurso você estará ajudando a fortalecer a distribuição + de recursos educacionais digitais para o ensino básico brasileiro e + contribuindo na valorização da pluralidade e da diversidade da educação + brasileira. + </p> + + <p> + A Plataforma MEC é um meio seguro e um site de referência para a + publicação e disseminação de Recursos Educacionais Digitais. Aproveite + esse espaço para compartilhar com professores de todo o Brasil recursos + criados por você ou aquele recurso de outro autor que você usou em aula + e seus alunos gostaram! + </p> + <p> + A partir do momento que seu recurso estiver publicado na Plataforma, os + usuários poderão interagir com seu recurso e você receberá as + notificações dos comentários, avaliações e curtidas. Cada uma dessas + interações contam para que seu recurso ganhe uma posição de destaque + na Plataforma. + </p> + <p>Participe dessa rede de colaboração de fomento da qualidade da educação básica!</p> + </Card> + ); +} + +const Card = styled.div` + margin-bottom: 5px; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + color: #666; + span { + font-size: 14px; + font-weight: bold; + } + + p { + margin: 0 0 10px; + font-size: 15px; + } + + + +` \ No newline at end of file diff --git a/src/Components/HelperFunctions/FormValidationFunction.js b/src/Components/HelperFunctions/FormValidationFunction.js new file mode 100644 index 0000000000000000000000000000000000000000..27520b23d8ffac7e4f9e5a8585108c09cb9f77c5 --- /dev/null +++ b/src/Components/HelperFunctions/FormValidationFunction.js @@ -0,0 +1,44 @@ + +//fieldName : form field name +//userInput : user input for a given field +//confirmation : optional password confirmation argument +export default function ValidateUserInput (fieldName, userInput, confirmation) { + let flag = false + + switch(fieldName) { + case('username'): + if (userInput.length < 1) { + flag = true + } + break; + case('email'): + if(userInput.length < 7 || !(userInput.match(/^([\w.%+-]+)@([\w-]+\.)+([\w]{2,})$/i))) { + flag = true + } + break; + case('password'): + if (userInput.length < 8) { + flag = true + } + break; + case('confirmation'): + if (userInput !== confirmation) { + flag = true + } + break; + case('message'): + if(userInput.length === 0) { + flag = true + } + break; + case('aboutMe'): + if(userInput.length > 160) { + flag = true + } + break; + default: + break; + } + + return flag +} diff --git a/src/Components/HelperFunctions/checkAccessLevel.js b/src/Components/HelperFunctions/checkAccessLevel.js new file mode 100644 index 0000000000000000000000000000000000000000..5cc5ea4b77468376236fcb72af66df18f4ebb80c --- /dev/null +++ b/src/Components/HelperFunctions/checkAccessLevel.js @@ -0,0 +1,14 @@ +import React, {useContext} from 'react' +import {Store} from '../../Store.js' + +export function checkAccessLevel (levelToCheck) { + const {state} = useContext(Store) + + if (state.currentUser.id != '') { + return(checkUserRole(levelToCheck)) + } + + const checkUserRole = (userRole) => { + return(state.currentUser.roles.filter((role) => role.name === userRole).length > 0) + } +} diff --git a/src/Components/HelperFunctions/getAxiosConfig.js b/src/Components/HelperFunctions/getAxiosConfig.js new file mode 100644 index 0000000000000000000000000000000000000000..6d1608bc91648d8b83374f9c4949a9ada3401cdd --- /dev/null +++ b/src/Components/HelperFunctions/getAxiosConfig.js @@ -0,0 +1,334 @@ +import {apiUrl} from '../../env.js' + +export function getAxiosConfigFromJSON () { + let config = { + headers : JSON.parse(sessionStorage.getItem('@portalmec/auth_headers')) + } + return config +} + +export function updateHeaders (newHeaders) { + + sessionStorage.setItem('@portalmec/accessToken', newHeaders['access-token']) + + let auth_headers = JSON.parse(sessionStorage.getItem('@portalmec/auth_headers')) + /*const auth_headers = { + client: newHeaders.get('client'), + "access-token": newHeaders.get('access-token'), + uid: newHeaders.get('uid'), + expiry: newHeaders.get('expiry'), + "token-type": "Bearer" + } + + sessionStorage.setItem('@portalmec/auth_headers', JSON.stringify(auth_headers))*/ + if (auth_headers) { + auth_headers['access-token'] = newHeaders['access-token'] + } + else { + auth_headers = { + client: newHeaders.client, + "access-token": newHeaders['access-token'], + uid: newHeaders.uid, + expiry: newHeaders.expiry, + "token-type": "Bearer" + } + } + sessionStorage.setItem('@portalmec/auth_headers', JSON.stringify(auth_headers)) +} + +function fetchHeaders () { + let auth_headers = JSON.parse(sessionStorage.getItem('@portalmec/auth_headers')) + + var myHeaders = undefined + if (auth_headers) { + myHeaders = new Headers(auth_headers) + myHeaders.set('Cache-Control', 'no-cache, no-store, must-revalidate'); + myHeaders.set('Pragma', 'no-cache'); + myHeaders.set('Expires', '0'); + return myHeaders + } + else { + myHeaders = new Headers() + myHeaders.set('Cache-Control', 'no-cache, no-store, must-revalidate'); + myHeaders.set('Pragma', 'no-cache'); + myHeaders.set('Expires', '0'); + return myHeaders + } +} + +function checkPreviousTokens (new_token) { + + let prev_tokens = JSON.parse(sessionStorage.getItem('@portalmec/tokens')) + + if (prev_tokens) { + if (!prev_tokens.hasOwnProperty(new_token)) { + prev_tokens[new_token] = 1 + sessionStorage.setItem('@portalmec/tokens', JSON.stringify(prev_tokens)) + return true + } + else { + return false + } + } + else { + let tokens = {} + tokens[new_token] = 1 + sessionStorage.setItem('@portalmec/tokens', JSON.stringify(tokens)) + return true + } + +} + +function updateAccessToken (newAccessToken) { + + if (checkPreviousTokens(newAccessToken)) { + + sessionStorage.setItem('@portalmec/accessToken', newAccessToken) + + let auth_headers = JSON.parse(sessionStorage.getItem('@portalmec/auth_headers')) + + if (auth_headers) { + auth_headers['access-token'] = newAccessToken + } + + sessionStorage.setItem('@portalmec/auth_headers', JSON.stringify(auth_headers)) + } +} + +export async function getRequest (url, onSuccess, onError) { + let response = await fetch((`${apiUrl}${url}`), { + headers : fetchHeaders() + }) + if (response.ok) { + if (response.headers.has('access-token')) { + updateAccessToken(response.headers.get('access-token')) + } + let json = await response.json() + onSuccess(json, response.headers) + } + else { + onError(response.error) + } + // .then(response => { + // if (response.headers.has('access-token')) { + // updateAccessToken(response.headers.get('access-token')) + // } + // let json = await response.json() + // + // onSuccess(json) + // + // return response.json().catch(err => { + // return {}; + // }) + // }) + // .then(data => { + // onSuccess(data) + // }) + // .catch(error => { + // onError(error) + // }) +} + +export const deleteRequest = (url, onSuccess, onError) => { + fetch((`${apiUrl}${url}`), { + method : 'DELETE', + headers : fetchHeaders() + }) + .then(response => { + if (response.headers.has('access-token')) { + updateAccessToken(response.headers.get('access-token')) + } + return response.json().catch(err => { + return {}; + }) + }) + .then(data => { + onSuccess(data) + }) + .catch(error => { + onError(error) + }) +} + +export const putRequest = (url, payload, onSuccess, onError) => { + let newHeaders = fetchHeaders() + if (!(payload instanceof FormData)) { + newHeaders.append('Content-Type', 'application/json') + } + + fetch((`${apiUrl}${url}`), { + method : 'PUT', + headers : newHeaders, + body: payload instanceof FormData ? payload : JSON.stringify(payload) + }) + .then(response => { + if (response.headers.has('access-token')) { + updateAccessToken(response.headers.get('access-token')) + } + return response.json().catch(err => { + return {}; + }) + }) + .then(data => { + onSuccess(data) + }) + .catch(error => { + onError(error) + }) +} + +export const postRequest = (url, payload, onSuccess, onError) => { + let newHeaders = fetchHeaders() + if (payload instanceof FormData) { + newHeaders.append('Content-Type', 'multipart/form-data') + } + else { + newHeaders.append('Content-Type', 'application/json') + } + + fetch((`${apiUrl}${url}`), { + method : 'POST', + headers : newHeaders, + body: payload instanceof FormData ? payload : JSON.stringify(payload) + }) + .then(response => { + if (response.headers.has('access-token')) { + updateAccessToken(response.headers.get('access-token')) + } + return response.json().catch(err => { + return {}; + }) + }) + .then(data => { + onSuccess(data) + }) + .catch(error => { + onError(error) + }) +} + +export async function fetchAllRequest (urls, onSuccess, onError) { + let responses = await Promise.all( urls.map( url => fetch(`${apiUrl}${url}`, { + headers : fetchHeaders() + }))) + + var data = [] + var headers = [] + + for (let res of responses) { + if (res.headers.has('access-token') && res.status !== 304) { + updateAccessToken(res.headers.get('access-token')) + } + let json = await res.json().catch(err => { + return {}; + }) + data.push(json) + headers.push(res.headers) + } + + onSuccess(data, headers) + + // await Promise.all( urls.map( url => fetch(`${apiUrl}${url}`, { + // headers : fetchHeaders() + // }))).then( (responses) => { + // for(let res of responses) { + // if (res.headers.has('access-token') && res.status !== 304) { + // updateAccessToken(res.headers.get('access-token')) + // } + // } + // return Promise.all(responses.map( (response) => response.json().catch(err => { + // return {}; + // }))) + // }).then( (data) => { + // onSuccess(data) + // }).catch((error) => { + // onError(error) + // }) +} + +export const validateGoogleLoginToken = (url, config, onSuccess, onError) => { + const newHeaders = new Headers(config.headers) + + + fetch((`${apiUrl}${url}`), { + method : 'GET', + headers : newHeaders + }) + .then(response => { + const auth_headers = { + client: response.headers.get('client'), + "access-token": response.headers.get('access-token'), + uid: response.headers.get('uid'), + expiry: response.headers.get('expiry'), + "token-type": "Bearer" + } + + sessionStorage.setItem('@portalmec/auth_headers', JSON.stringify(auth_headers)) + + return response.json().catch(err => { + return {}; + }) + }) + .then(data => { + console.log(data) + onSuccess(data) + }) + .catch(error => { + onError(error) + }) +} + +export async function authentication (url, payload, onSuccess, onError) { + let formData = new FormData() + for (const [key, value] of Object.entries(payload)) { + formData.append(`${key}`,value); + } + + let response = await fetch((`${apiUrl}${url}`), { + method : 'POST', + body: formData + }) + if (response.ok) { + const auth_headers = { + client: response.headers.get('client'), + "access-token": response.headers.get('access-token'), + uid: response.headers.get('uid'), + expiry: response.headers.get('expiry'), + "token-type": "Bearer" + } + + sessionStorage.setItem('@portalmec/auth_headers', JSON.stringify(auth_headers)) + + let json = await response.json().catch(err => { + return {}; + }) + + onSuccess(json) + } + else { + onError(response.error) + } + // .then(response => { + // const auth_headers = { + // client: response.headers.get('client'), + // "access-token": response.headers.get('access-token'), + // uid: response.headers.get('uid'), + // expiry: response.headers.get('expiry'), + // "token-type": "Bearer" + // } + // + // sessionStorage.setItem('@portalmec/auth_headers', JSON.stringify(auth_headers)) + // + // return response.json().catch(err => { + // return {}; + // }) + // }) + // .then(data => { + // console.log(data) + // onSuccess(data) + // }) + // .catch(error => { + // onError(error) + // }) + +} diff --git a/src/Components/HelperFunctions/getDefaultThumbnail.js b/src/Components/HelperFunctions/getDefaultThumbnail.js new file mode 100644 index 0000000000000000000000000000000000000000..cb92a38fcb6f7bc2d947021ae24d2658518c67eb --- /dev/null +++ b/src/Components/HelperFunctions/getDefaultThumbnail.js @@ -0,0 +1,48 @@ +import Animacao from '../../img/laranja/ANIMACAO_SIMULACAO.jpg' +import AplicativoMovel from '../../img/laranja/APP.jpg' +import Apresentacao from '../../img/laranja/APRESENTACAO.jpg' +import Audio from '../../img/laranja/AUDIO.jpg' +import Empty from '../../img/laranja/EMPTY.jpg' +import Imagem from '../../img/laranja/IMAGEM.jpg' +import Infografico from '../../img/laranja/INFOGRAFICO.jpg' +import Jogo from '../../img/laranja/JOGO.jpg' +import LivroDigital from '../../img/laranja/LIVRO_DIGITAL.jpg' +import Mapa from '../../img/laranja/MAPA.jpg' +import Outros from '../../img/laranja/OUTROS.jpg' +import SoftwareEducacional from '../../img/laranja/SOFTWARE.jpg' +import Texto from '../../img/laranja/TEXTO.jpg' +import Video from '../../img/laranja/VIDEO.jpg' + +export const getDefaultThumbnail = (objType) => { + switch (objType.toLowerCase()) { + case "imagem": + return Imagem; + case "mapa": + return Mapa; + case "software educacional" : + return SoftwareEducacional; + case "aplicativo móvel": + return AplicativoMovel; + case "apresentação": + return Apresentacao; + case "áudio": + return Audio; + case "infográfico": + return Infografico; + case "jogo": + return Jogo; + case "livro digital" : + return LivroDigital; + case "texto": + return Texto; + case "vÃdeo": + return Video; + case "animação": + return Animacao; + case null: + return Empty; + default: + return Outros; + + } +} diff --git a/src/Components/HomeScreenSearchBar.js b/src/Components/HomeScreenSearchBar.js new file mode 100644 index 0000000000000000000000000000000000000000..ef12b7cc21d761f9ac73d634d1a4e24fe180bd0d --- /dev/null +++ b/src/Components/HomeScreenSearchBar.js @@ -0,0 +1,235 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from 'react' +import { Redirect } from 'react-router-dom' +import Grid from '@material-ui/core/Grid'; +import styled from 'styled-components' +import Menu from '@material-ui/core/Menu'; +import { Store } from '../Store'; +import { List, ListItem, ListItemIcon, ListItemText, MenuItem, Button, TextField } from '@material-ui/core' +import ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown'; +import SearchIcon from '@material-ui/icons/Search'; +/*import {Link} from 'react-router-dom'*/ + +export default function HomeScreenSearchBar(props) { + const [query, setQuery] = useState("") + const [searchClass, setSearchClass] = useState('LearningObject') + + const { state, dispatch } = useContext(Store) + + const [goSearch, setGoSearch] = useState(false) + + useEffect(() => { + if (window.location.pathname.includes('busca')) { + const urlParams = new URLSearchParams(window.location.search) + const urlQuery = urlParams.get('query') + const urlSearchClass = urlParams.get('search_class') + if (searchClass !== urlSearchClass || query !== urlQuery) { + setQuery(urlQuery) + setSearchClass(urlSearchClass) + } + } + }, []) + + useEffect(() => setGoSearch(false), [goSearch]) + + const handleChange = (event) => { + setQuery(event.target.value) + } + + const handleKeyDown = (event) => { + if (event.key === 'Enter' || event.type === 'click') { + dispatch({ + type: 'SAVE_SEARCH', + newSearch: { + query: query !== '' ? query : '*', + class: searchClass + } + }) + setGoSearch(true) + } + } + + const options = [ + { text: "Recursos", value: "LearningObject", color: "#ff7f00" }, + { text: "Coleções", value: "Collection", color: "#673ab7" }, + { text: "Usuários", value: "User", color: "#00bcd4" }, + ] + const [anchorEl, setAnchorEl] = React.useState(null); + const [selectedIndex, setSelectedIndex] = React.useState(0); + + const handleClickListItem = (event) => { + setAnchorEl(event.currentTarget); + }; + + const handleMenuItemClick = (event, index, value) => { + console.log(value) + setSelectedIndex(index); + setSearchClass(value) + setAnchorEl(null); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const WIDTH = window.innerWidth; + + return ( + + <StyledGrid container> + {goSearch && <Redirect to={`/busca?query=${state.search.query}&search_class=${state.search.class}`} />} + <Grid item md={7} xs={12} className="first white"> + <StyledTextField + id="standard-search" + placeholder="O que está buscando?" + type="search" + margin="normal" + value={query} + onChange={handleChange} + onKeyPress={handleKeyDown} + fullwidth + /> + </Grid> + <Grid item md={3} xs={12} className="second white"> + <List component="nav" aria-label="Recurso"> + <ListItem + button + aria-haspopup="true" + aria-controls="lock-menu" + aria-label="Recurso" + onClick={handleClickListItem} + > + <ListItemText + style={{ color: options[selectedIndex].color }} + primary={options[selectedIndex].text} + /> + <ListItemIcon> + <ArrowDropDownIcon /> + </ListItemIcon> + </ListItem> + </List> + <Menu + id="simple-menu" + anchorEl={anchorEl} + keepMounted + open={Boolean(anchorEl)} + onClose={handleClose} + > + {options.map((option, index) => ( + <MenuItem + key={option.value} + selected={index === selectedIndex} + onClick={(event) => handleMenuItemClick(event, index, option.value)} + style={{ color: option.color }} + > + {option.text} + </MenuItem> + ))} + </Menu> + </Grid> + <Grid item md={2} xs={12}> + <div style={{ height: "100%" }}> + <Button onClick={handleKeyDown} className="custom-button" style={{ backgroundColor: options[selectedIndex].color, color: "#fff" }}> + { + WIDTH < 503 && + <span>Buscar</span> + } + <SearchIcon fontSize="large" /> + </Button> + </div> + </Grid> + </StyledGrid> + ) +} + +const StyledTextField = styled(TextField)` + max-width: 100%; + font-size : 15px; + font-weight : lighter; + color : inherit; + width : 90% !important; + margin-right : 10px !important; + margin-left : 10px !important; + .MuiInput-underline::after { + border-bottom : none !important; + } +` + +const StyledGrid = styled(Grid)` + padding-top : 20px; + + .MuiGrid-item { + @media screen and (max-width : 502px) { + border-radius : 5px; + margin-bottom : 10px !important; + } + } + + .first { + @media screen and (max-width : 502px) { + margin-top : 10px; + } + @media screen and (min-width : 502px) { + border-top-left-radius : 5px; + border-bottom-left-radius : 5px; + } + } + + .white { + background-color : #fff; + } + + .MuiList-root { + @media screen and (min-width : 502px) { + border-left: 1px solid #ccc !important; + } + + } + .MuiPaper-root { + width : 100% !important; + } + .MuiPopover-paper { + max-width : none !important; + } + + .custom-button { + height: 100% !important; + width: 100% !important; + margin: 0 !important; + text-transform : none !important; + align-items : center !important; + + @media screen and (max-width : 502px) { + padding-top : 10px; + border-radius : 5px; + } + + @media screen and (min-width : 502px) { + border-radius : 0 !important; + border-top-right-radius : 5px !important; + border-bottom-right-radius : 5px !important; + } + + .MuiSvgIcon-root { + vertical-align : middle !important; + } + + } +` diff --git a/src/Components/IframeOverlay.js b/src/Components/IframeOverlay.js new file mode 100644 index 0000000000000000000000000000000000000000..2166e7165679798271a7d09d9718cedf752b288c --- /dev/null +++ b/src/Components/IframeOverlay.js @@ -0,0 +1,41 @@ +import React, { useState } from 'react'; +import styled from 'styled-components'; +import ExpandButton from './IframeOverlay/ExpandButton.js'; +import Drawer from '@material-ui/core/Drawer'; +import DrawerContent from './IframeOverlay/DrawerContent.js'; + +export default function IframeOverlay(props) { + const [expanded, setExpanded] = useState(false); + + const handleClickButton = () => { + setExpanded(!expanded); + } + + const closeDrawer = () => { + setExpanded(false); + } + + return ( + <div> + <WrapperDiv> + <ExpandButton + onClick={handleClickButton} + expanded={expanded} + /> + </WrapperDiv> + <StyledDrawer anchor="right" open={expanded} onClose={closeDrawer}> + <DrawerContent tag={props.tag}/> + </StyledDrawer> + </div> + ); +} + +const WrapperDiv=styled.div` + position: absolute; + right: 0; + top: 200px; + z-index: 2; +` +const StyledDrawer=styled(Drawer)` + overflow-y: scroll; +` diff --git a/src/Components/IframeOverlay/DrawerContent.js b/src/Components/IframeOverlay/DrawerContent.js new file mode 100644 index 0000000000000000000000000000000000000000..72c1d659fd030cb72a7bb7a5ad38f2ef026ba341 --- /dev/null +++ b/src/Components/IframeOverlay/DrawerContent.js @@ -0,0 +1,81 @@ +import React, { useState, useEffect } from 'react'; +import styled from 'styled-components'; +import Grid from '@material-ui/core/Grid'; +import SearchInput from './SearchInput.js'; +import ResourceCard from './ResourceCard.js'; +import SmallFooter from './SmallFooter.js'; +import CircularProgress from '@material-ui/core/CircularProgress'; +import {getRequest} from '../HelperFunctions/getAxiosConfig' + +export default function DrawerContent(props) { + const [resources, setResources] = useState([]); + // eslint-disable-next-line + const [isLoading, setIsLoading] = useState(false); + + function handleSuccess(data) { + setResources(data) + } + const search = (query) => { + const url = `/search? + page=0&results_per_page=5&query=${query}&search_class=LearningObject` + + getRequest(url, handleSuccess, (error) => {console.log(error)}) + } + + useEffect(() => { + search(props.tag); + }, [props.tag]); + + useEffect(() => { + console.log(resources); + }, [resources]); + + return( + <Wrapper container + direction="row" + justify="center" + alignItems="flex-start" + > + <Grid item xs={11}> + <SearchInput stdin={props.tag} search={search}/> + </Grid> + <Grid item xs={11}> + <Description> + Recursos Relacionados na Plataforma MEC: + </Description> + </Grid> + + { + isLoading ? <CircularProgress style={{color : 'white'}}/> + : + resources.map((r, index) => { + return( + <Grid item xs={11} key={index}> + <ResourceCard + id={r.id} + name={r.name} + likes={r.likes_count} + thumb={r.thumbnail} + /> + </Grid> + );} + )} + <Grid item xs={12}> + <SmallFooter /> + </Grid> + </Wrapper> + ); +} + +const Wrapper=styled(Grid)` + min-width: 400px; + max-width: 400px; + background-color: #666; + height: 100%; + overflow-x: scroll !important; +` +const Description=styled.p` + color: white; + margin-left: 20px !important; + margin-right: 20px !important; +` diff --git a/src/Components/IframeOverlay/ExpandButton.js b/src/Components/IframeOverlay/ExpandButton.js new file mode 100644 index 0000000000000000000000000000000000000000..6749e1d99d9cc98e997761ff3e55aa5f055dcec5 --- /dev/null +++ b/src/Components/IframeOverlay/ExpandButton.js @@ -0,0 +1,23 @@ +import React from 'react'; +import AddIcon from '@material-ui/icons/Add'; +import RemoveIcon from '@material-ui/icons/Remove'; +import IconButton from '@material-ui/core/IconButton'; +import styled from 'styled-components'; + +export default function ExpandButton(props) { + return ( + <IconWrapper> + <IconButton + onClick={props.onClick} + style={{color: 'white'}} + > + { props.expanded ? <RemoveIcon /> : <AddIcon /> } + </IconButton> + </IconWrapper> + ); +} + +const IconWrapper=styled.div` + background-color: #5dbcd2; + border-radius: 15px 0px 0px 15px; +` diff --git a/src/Components/IframeOverlay/ResourceCard.js b/src/Components/IframeOverlay/ResourceCard.js new file mode 100644 index 0000000000000000000000000000000000000000..365ea9a3d6574cd63503c060bf94d08308be7748 --- /dev/null +++ b/src/Components/IframeOverlay/ResourceCard.js @@ -0,0 +1,53 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; +import styled from 'styled-components'; +import Paper from '@material-ui/core/Paper'; +import Grid from '@material-ui/core/Grid'; +import WhiteAreaOfCard from './WhiteAreaOfCard.js'; + +export default function ResourceCard(props) { + + const getThumb = () => { + return props.thumb ? + `https://api.portalmec.c3sl.ufpr.br${props.thumb}` + : require('../../img/laranja/IMAGEM.jpg'); + + } + + return( + <Anchor + to={'/recurso/'+props.id} + > + <CardPaper elevation={3}> + <Grid container + direction="row" + justify="flex-start" + alignItems="center" + > + <Grid item> + <Img src={getThumb()} /> + </Grid> + <Grid item> + <WhiteAreaOfCard name={props.name} likes={props.likes} /> + </Grid> + </Grid> + </CardPaper> + </Anchor> + ); +} + +const CardPaper=styled(Paper)` + width: 312px; + height: 100px; + margin-bottom: 15px; + margin-left: 20px; + margin-right: 20px; +` +const Img=styled.img` + height: 100px; + width: 150px; +` +const Anchor=styled(Link)` + text-decoration: none !important; + color: inherit !important; +` diff --git a/src/Components/IframeOverlay/SearchInput.js b/src/Components/IframeOverlay/SearchInput.js new file mode 100644 index 0000000000000000000000000000000000000000..3fd246cb70a501f5d0c091df2e133ce8c2ac3f80 --- /dev/null +++ b/src/Components/IframeOverlay/SearchInput.js @@ -0,0 +1,74 @@ +import React, { useState } from 'react'; +import styled from 'styled-components'; +import SearchIcon from '@material-ui/icons/Search'; +import IconButton from '@material-ui/core/IconButton'; +import OutlinedInput from '@material-ui/core/OutlinedInput'; +import InputAdornment from '@material-ui/core/InputAdornment'; +import FormControl from '@material-ui/core/FormControl'; +import Divider from '@material-ui/core/Divider'; +import CloseRoundedIcon from '@material-ui/icons/CloseRounded'; + +export default function SearchInput(props) { + const [text, setText] = useState(props.stdin); + + const handleChange = (event) => { + setText(event.target.value); + } + + const handleClickSearch = () => { + props.search(text); + } + + const handleCleanInput = () => { + setText(""); + } + + const handleKeyUp = (event) => { + if (event.key === "Enter") + handleClickSearch() + } + + return ( + <Wrapper> + <FormControl variant="outlined" style={{ width: '100%' }}> + <OutlinedInput + type="text" + value={text} + placeholder="O quê você está buscando?" + onChange={handleChange} + onKeyUp={handleKeyUp} + endAdornment={ + <> + <InputAdornment position="end"> + <IconButton + onClick={handleCleanInput} + edge="end" + > + <CloseRoundedIcon /> + </IconButton> + </InputAdornment> + <SizedWidhtBox /> + <Divider orientation="vertical" flexItem /> + <InputAdornment position="end"> + <IconButton + onClick={handleClickSearch} + edge="end" + > + <SearchIcon style={{ fill: "#00bcd4" }} /> + </IconButton> + </InputAdornment> + </> + } + /> + </FormControl> + </Wrapper> + ); +} +const Wrapper = styled.div` + background-color: white; + border-radius: 5px; + margin: 20px; +` +const SizedWidhtBox = styled.div` + margin-right : 22px; +` diff --git a/src/Components/IframeOverlay/SmallFooter.js b/src/Components/IframeOverlay/SmallFooter.js new file mode 100644 index 0000000000000000000000000000000000000000..95350b07de94f7287391c608dd00c2cd9f4753bf --- /dev/null +++ b/src/Components/IframeOverlay/SmallFooter.js @@ -0,0 +1,56 @@ +import React from 'react'; +import styled from 'styled-components'; +import ImgInfo from '../../img/acesso-a-informacao.png'; + +export default function SmallFooter(props) { + return( + <Wrapper> + <SecondaryWrapper> + <ImgDiv> + <a + alt="Governo Federal" + href="http://www.brasil.gov.br/" + rel="noreferrer" + target="_blank" + > + <Img src={ImgInfo} /> + </a> + </ImgDiv> + <TextDiv> + 2017 + <br /> + C3SL-UFPR | FNDE | NUTE-UFSC | MEC. + <br /> + Todos os direitos reservados. + </TextDiv> + </SecondaryWrapper> + </Wrapper> + ); +} + +const Wrapper=styled.div` + width: 100%; + background-color: #444; + color: white; + padding-top: 30px; + padding-bottom: 30px; +` +const ImgDiv=styled.div` + border-right: 2px solid #666; + padding: 5px; + display: inline-block; +` +const Img=styled.img` + width: 100px; +` +const TextDiv=styled.div` + padding-left: 5px; + display: inline-block; + line-height: 12px; + font-size: 0.7em; + text-align: center; +` +const SecondaryWrapper=styled.div` + margin-left: 25px; + margin-right: 20px; +` diff --git a/src/Components/IframeOverlay/WhiteAreaOfCard.js b/src/Components/IframeOverlay/WhiteAreaOfCard.js new file mode 100644 index 0000000000000000000000000000000000000000..0f4604bb451bd9f0a7d69b57ce341ad18395106b --- /dev/null +++ b/src/Components/IframeOverlay/WhiteAreaOfCard.js @@ -0,0 +1,57 @@ +import React from 'react'; +import styled from 'styled-components'; +import Grid from '@material-ui/core/Grid'; +import OndemandVideoIcon from '@material-ui/icons/OndemandVideo'; +import FavoriteIcon from '@material-ui/icons/Favorite'; + +export default function WhiteAreaOfCard(props) { + return( + <Grid container + style={{height: '90px', width: '150px'}} + direction="column" + justify="space-between" + alignItems="flex-start" + > + <Grid item> + <Title> + {props.name} + </Title> + </Grid> + <Grid item> + <IconsDiv> + <OndemandVideoIcon /> + <RightFavoriteIcon /> + </IconsDiv> + </Grid> + </Grid> + ); +} + +const Title=styled.span` + margin-left: 5px; + font-size: 14px; + position: relative; + top: 0; + margin-top: 0; + pading-top: 0; + color: #666; + overflow: hidden; + text-overflow: ellipsis; + + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; +` +const IconsDiv=styled.div` + margin-left: 5px; + margin-right: 5px; + color: #666 !important; + width: 150px; + position: relative; + top: 0; +` +const RightFavoriteIcon=styled(FavoriteIcon)` + position: absolute; + right: 0; +` diff --git a/src/Components/IllegalContentModal.js b/src/Components/IllegalContentModal.js index f623587ac501efc859c5edc5b87d42b6c714ac34..976bb5d8728791502ced2db51534bf6b4cc5b703 100644 --- a/src/Components/IllegalContentModal.js +++ b/src/Components/IllegalContentModal.js @@ -5,8 +5,6 @@ import styled from 'styled-components' import { Button } from '@material-ui/core'; import Backdrop from '@material-ui/core/Backdrop'; import { Store } from '../Store.js'; -import axios from 'axios' -import {apiUrl} from '../env'; const StyledModal = styled(Modal)` margin : 0 !important; @@ -81,27 +79,15 @@ const StyledDivContainer = styled.div` ` export default function IllegalContentModal (props) { - const {state, dispatch} = useContext(Store) - - // const func = () => { - // let name = '' - // axios.get(`${apiUrl}/users/:id`,{ - // - // } - // ).then ( (response) => { - // name = response.name - // }, (error) => { - // console.log(':(') - // }) - // } + const {state} = useContext(Store) return ( <StyledModal aria-labelledby="transition-modal-title" aria-describedby="transition-modal-description" open={props.open} - animation={true} - centered={true} + + centered="true" onClose={props.handleClose} closeAfterTransition BackdropComponent={Backdrop} @@ -112,7 +98,7 @@ export default function IllegalContentModal (props) { <Fade in={props.open}> <StyledDivContainer > <StyledDivContent> - <StyledH2>{state.loginInfo.username}!</StyledH2> + <StyledH2>{state.currentUser.name}!</StyledH2> <div> <StyledParagraph>Seu recurso não está de acordo com os termos</StyledParagraph> </div> diff --git a/src/Components/ItemCard.js b/src/Components/ItemCard.js new file mode 100644 index 0000000000000000000000000000000000000000..dea4bd2a34c970cc9cc26bb45d0baab857b90c17 --- /dev/null +++ b/src/Components/ItemCard.js @@ -0,0 +1,55 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React from 'react'; +import styled from 'styled-components'; +import Grid from '@material-ui/core/Grid'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import ItemCardAction from './ItemCardAction.js'; + +const ItemImage = styled.img` + border-radius: 150; + max-width: 100%; +` + +const ItemName = styled.h3` + font-size: 0.8em; + font-weight: lighter; + color: #666666; +` + +const ItemDescription = styled.p` + font-size: 0.5em; + color: #666666; +` + + +export default function ItemCard (props) { + return ( + <Grid item xs={9} sm={2}> + <Card style={{textAlign: 'center'}}> + <CardContent> + <ItemImage src={props.src}/> + <ItemName>{props.name}</ItemName> + <ItemDescription>{props.description}</ItemDescription> + <ItemCardAction operation={props.action}/> + </CardContent> + </Card> + </Grid> + ) +} diff --git a/src/Components/ItemCardAction.js b/src/Components/ItemCardAction.js new file mode 100644 index 0000000000000000000000000000000000000000..ed1cc7dde66752bb622375c25b65172ab3d42e92 --- /dev/null +++ b/src/Components/ItemCardAction.js @@ -0,0 +1,176 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, {useState} from 'react'; +import styled from 'styled-components'; +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; +import Button from '@material-ui/core/Button'; +import gem from '../img/gamification/gem.svg'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; +import axios from 'axios' +import {apiUrl} from '../env'; + +function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} + +const actionStyle = (operation) => { + var stl = { + fontSize: '0.5em', + paddingTop: '1em', + marginBottom: 0, + fontWeight: 'bold', + cursor: 'pointer' + } + stl.color = operation !== 'buy' ? '#02a5c3' : '#666666'; + return stl; +} + +const GemImg = styled.img` + height: 23px; + position: relative; + top: 8px; + padding-right: 5px; +` + +const GemSpan = styled.span` + color: red; +` + +export default function ItemCardAction (props) { + const [success, setSuccess] = useState(false); + const [failure, setFailure] = useState(false); + const [message, setMessage] = useState(""); + const [info, setInfo] = useState(false); + // eslint-disable-next-line + const [item_id, setItemID] = useState(0); + const [last_operation, setLastOperation] = useState(); + const [open_dialog, setOpenDialog] = useState(false); + + + const revertLastOperation = () => { + manageItemAndShowSnackbar(last_operation === 'equip' ? 'unequip' : 'equip', + setInfo, + nonPurchaseMessage, + 'Erro'); + } + + const nonPurchaseMessage = <span>Item {last_operation === 'equip' ? 'retirado' : 'equipado'}. <div onClick={revertLastOperation}>Desfazer</div></span>; + + + const handleClose = (snackbar) => { + if (snackbar === 'success') + setSuccess(false); + else if (snackbar === 'info') + setInfo(false); + else + setFailure(false); + } + + const manageItemAndShowSnackbar = (operation, setSnackbar, successMessage, failureMessage) => { + axios.patch(apiUrl + '/users/' + operation + '_item?id=' + item_id).then( + response => { + if (response.status === 200) { + setSnackbar(true); + setMessage(successMessage); + } else { + setFailure(true); + setMessage(failureMessage); + } + } + ); + setLastOperation(operation === 'purchase' ? last_operation : (operation === 'equip' ? 'unequip' : 'equip')); + } + + const handleClickBuyItem = () => { + setOpenDialog(false); + manageItemAndShowSnackbar('purchase', setSuccess, <span>Item comprado.</span>, + <span>Compra falhou. Tente novamente</span>); + } + + const handleDialogClose = () => { + setOpenDialog(false); + } + + const handleClick = () => { + // this will become an axios get + if (props.operation === 'unequip') + manageItemAndShowSnackbar('unequip', setInfo, nonPurchaseMessage, 'Erro'); + else if (props.operation === 'equip') + manageItemAndShowSnackbar('equip', setInfo, nonPurchaseMessage, 'Erro'); + else if (props.operation === 'buy') { + setOpenDialog(true); + } + } + + return ( + <div> + <Snackbar open={info} autoHideDuration={6000} onClose={() => handleClose('info')}> + <Alert onClose={handleClose} severity="info"> + {message} + </Alert> + </Snackbar> + <Snackbar open={success} autoHideDuration={6000} onClose={() => handleClose('success')}> + <Alert onClose={handleClose} severity="success"> + {message} + </Alert> + </Snackbar> + <Snackbar open={failure} autoHideDuration={6000} onClose={() => handleClose('failure')}> + <Alert onClose={handleClose} severity="error"> + {message} + </Alert> + </Snackbar> + <span style={actionStyle(props.operation)} onClick={handleClick}> + {props.operation === 'buy' ? <GemImg src={gem}/> : <span/>} + {props.operation === 'buy' ? "COMPRAR" : + props.operation === 'equip' ? "USAR" : "TIRAR"} + </span> + <Dialog + open={open_dialog} + onClose={handleClose} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + > + <DialogTitle id="alert-dialog-title">{"Deseja realmente comprar este item?"}</DialogTitle> + <DialogContent> + <DialogContentText id="alert-dialog-description"> + <strong>Esta compra não envolve nenhum dinheiro real.</strong> + + <br/><br/>O item que você deseja comprar, <strong>NOME DO ITEM</strong>, custa + <GemImg src={gem}/><GemSpan>PREÇO</GemSpan> gemas. Você possui + <GemImg src={gem}/><GemSpan><strong>GEMAS</strong></GemSpan> gemas. + + <br/><br/>Comprar este item lhe deixará com <GemImg src={gem}/><GemSpan><strong>TANTAS</strong></GemSpan> gemas. + </DialogContentText> + </DialogContent> + <DialogActions> + <Button onClick={handleDialogClose} color="primary"> + Cancelar + </Button> + <Button onClick={handleClickBuyItem} color="primary" autoFocus> + Comprar + </Button> + </DialogActions> + </Dialog> + </div> + ) +} diff --git a/src/Components/ItemCarousel.js b/src/Components/ItemCarousel.js new file mode 100644 index 0000000000000000000000000000000000000000..a790b4f18c67fd3ad2fc2726334d3140b07f69ad --- /dev/null +++ b/src/Components/ItemCarousel.js @@ -0,0 +1,67 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, {useState} from 'react'; +import Grid from '@material-ui/core/Grid'; +import ItemCard from './ItemCard.js'; +import ArrowBackIcon from '@material-ui/icons/ArrowBack'; +import ArrowForwardIcon from '@material-ui/icons/ArrowForward'; +import IconButton from '@material-ui/core/IconButton'; + +//url/user_items/index?q={"item_type": umdaqueles, "op": "none", "unlock_rule": "purchase"} +export default function ItemCarousel (props) { + const [left, setLeft] = useState(0); + const [right, setRight] = useState(5); + + const goLeft = () => { + setRight(right === 0 ? props.items.length-1 : right-1); + setLeft(left === 0 ? props.items.length-1 : left-1); + } + + const goRight = () => { + setRight(right === props.items.length-1 ? 0 : right+1); + setLeft(left === props.items.length-1 ? 0 : left+1); + } + + return ( + <Grid + item container + direction="row" + justify="center" + alignItems="center" + xs={12} + spacing={3} + > + <IconButton onClick={goLeft}> + <ArrowBackIcon/> + </IconButton> + {(left > right ? + props.items.slice(left, props.items.length).concat(props.items.slice(0, right)) + : props.items.slice(left, right) + ).map((i) => { + return <ItemCard + src={i.src} + action={i.action} + name={i.name} + description={i.description}/> + })} + <IconButton onClick={goRight}> + <ArrowForwardIcon/> + </IconButton> + </Grid> + ) +} diff --git a/src/Components/LevelDescriptionCard.js b/src/Components/LevelDescriptionCard.js new file mode 100644 index 0000000000000000000000000000000000000000..7c55a81f33b75bcdb375ee02c1919df2ab4a3b24 --- /dev/null +++ b/src/Components/LevelDescriptionCard.js @@ -0,0 +1,67 @@ +import React from 'react'; + +import styled from 'styled-components' +import ShinyProgressBar from './ShinyProgressBar.js' +import { Grid } from '@material-ui/core' + +export default function LevelDescriptionCard(props) { + + return ( + <LevelDescDiv> + <Grid container direction="row" justify="space-between" alignItems="center"> + <Grid item xs={6} md={4}> + <CurrentLevelNumber> + NÃvel {props.level} + </CurrentLevelNumber> + <CurrentLevelXP> + XP {props.xp} + </CurrentLevelXP> + </Grid> + <Grid item xs={6} md={4} alignContent='flex-end'> + <CurrentCoins> + {props.coins} COINS + </CurrentCoins> + <NextLevelXP> + {props.xp_to_next_lvl} XP PARA O NÃVEL {props.level+1} + </NextLevelXP> + </Grid> + <ShinyProgressBar percentage={props.bar_size} /> + </Grid> + </LevelDescDiv> + ); +} + +const NextLevelXP = styled.p` + text-align: right; + font-size: large; + font-weight: 500; + color: #575757; + margin-right: 30px; +` + +const CurrentCoins = styled.p` + text-align: right; + font-size: x-large; + font-weight: 500; + color: #575757; + margin-right: 30px; +` + +const CurrentLevelNumber = styled.h1` + font-weight: 500; + font-size: 40px; + color: #646464; + margin-left: 30px; +` + +const CurrentLevelXP = styled.h2` + font-size: x-large; + font-weight: 500; + color: #00A5B9; + margin-left: 30px; +` + +const LevelDescDiv = styled.div` + margin: 20px; + padding: 20px; +` diff --git a/src/Components/LoadingSpinner.js b/src/Components/LoadingSpinner.js new file mode 100644 index 0000000000000000000000000000000000000000..68c447c4c3be4aee028bf6b4997ceefa956fd197 --- /dev/null +++ b/src/Components/LoadingSpinner.js @@ -0,0 +1,11 @@ +import React from 'react'; +import LoadingGif from '../img/loading_busca.gif' + + const LoadingSpinner = (props) => ( + <div style={{display:"flex", flexDirection:"column", alignItems:"center", justifyContent:"center"}}> + <img alt="" src={LoadingGif} /> + <span style={{textTransform:"uppercase"}}>{props.text}</span> + </div> + ); + + export default LoadingSpinner; diff --git a/src/Components/LoginContainer.js b/src/Components/LoginContainer.js deleted file mode 100644 index c148704c53c34f48bec95f21d711922e16c79820..0000000000000000000000000000000000000000 --- a/src/Components/LoginContainer.js +++ /dev/null @@ -1,273 +0,0 @@ -/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre -Departamento de Informatica - Universidade Federal do Parana - -This file is part of Plataforma Integrada MEC. - -Plataforma Integrada MEC is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Plataforma Integrada MEC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from "react"; -import GoogleLogin from 'react-google-login' -import { Button } from '@material-ui/core'; -//import FacebookLogin from 'react-facebook-login'; -import CloseIcon from '@material-ui/icons/Close'; -import styled from 'styled-components' -import {device} from './device.js' -import LabeledCheckbox from './Checkbox.js' -import FormInput from "./FormInput.js" - -//arrumar isso -const responseGoogle = (response) => { - console.log(response); -} - -class LoginContainer extends Component { - constructor (props) { - super(props); - - this.state = { - email : "", - senha : "", - checkboxChecked : true - }; - this.handleChecked = this.handleChecked.bind(this) - } - - switchModal = (e) => { - e.preventDefault() - this.props.handleClose() - this.props.openSignUp() - } - - handleChange = e => { - this.setState({[e.target.name]: e.target.value}) - } - - onSubmit = (e) => { - e.preventDefault(); - - this.props.handleLoginInfo(this.state); - - this.setState({ - email: "", - senha: "" - }) - } - - handleChecked = (e) => { - this.setState({ - checkboxChecked : !this.state.checkboxChecked - }) - } - - render () { - return ( - <ContainerStyled > - <DialogHeaderStyled> - <H2Styled> Entrar - <StyledCloseModalButton onClick={this.props.handleClose}> - <CloseIcon/> - </StyledCloseModalButton> - </H2Styled> - </DialogHeaderStyled> - - <div style={{paddingTop: "20px"}}> - <div style={{marginTop:"0"}}> - <StyledGoogleLoginButton - clientId="658977310896-knrl3gka66fldh83dao2rhgbblmd4un9.apps.googleusercontent.com" - - onSuccess={responseGoogle} - onFailure={responseGoogle} - cookiePolicy={'single_host_origin'} - > - <span style={{textTransform:"none", fontSize:"13px"}}>Usando o Google</span> - </StyledGoogleLoginButton> - </div> - </div> - - <H3Styled> - <RightSideStrikedH3/> - <span style={{verticalAlign:"middle"}}>ou</span> - <LeftSideStrikedH3/> - </H3Styled> - - <form ref="form" onSubmit={this.onSubmit}> - <FormInput - inputType={"text"} - name={"email"} - value={this.state.email} - placeholder={"E-mail *"} - handleChange={e => this.handleChange(e)} - /> - <br/> - <FormInput - inputType={"password"} - name={"senha"} - value={this.state.senha} - placeholder={"Senha *"} - handleChange={e => this.handleChange(e)} - /> - <br/> - - <RememberRecover> - <LabeledCheckbox label={<StyledSpan>Lembrar-me</StyledSpan>} onchange={this.handleChecked}/> - <span style={{paddingTop:"15px"}}>Esqueceu a senha?<a href="recuperar-senha" style={{textAlign: "right", color:"#4cd0e1"}}>Clique aqui!</a></span> - </RememberRecover> - - <ConfirmContainerStyled> - <StyledLoginButton onClick={e => this.onSubmit(e)} variant="contained"> - <span style={{borderRadius:"3px", boxSizing:"border-box", fontFamily:"Roboto, sans serif", fontWeight:"500", color:"#fff"}}>ENTRAR</span> - </StyledLoginButton> - </ConfirmContainerStyled> - </form> - - <DialogFooterStyled> - <span style={{textAlign:"center", fontSize: "14px", color:"rgb(102, 102, 102)"}}>Ainda não tem cadastro? <StyledAnchor href="" onClick={e => this.switchModal(e)}>CADASTRE-SE</StyledAnchor></span> - </DialogFooterStyled> - </ContainerStyled> - ) - } -} - -export default LoginContainer - -const ContainerStyled = styled.div` - box-sizing : border-box; - background-color : white; - max-width : none; - align : center; - padding-left : 25px; - padding-right:25px; - padding-bottom:10px; - border-radius: 4px; - @media ${device.mobileM} { - width : 100%; - height : 100%; - } -` - -const DialogHeaderStyled = styled.div` - text-align : center; - display : inline-flex; - justify-content : space-between; - padding : 10px 26px 0 26px; - height : 64px; -` - -const DialogFooterStyled = styled.div` - box-sizing : border-box; - font-family : 'Roboto', sans serif; - margin : 20px -20px; - padding-top : 20px; - border-top : 1px #e5e5e5 solid; - justify-content : center; - text-align : center; - line-height : 1.42857143 -` - -const H2Styled = styled.h2` - align-self : center; - color : #666; - font-size : 26px; - font-weight : 100; - font-family: 'Roboto', sans serif, 'Helvetica Neue', Helvetica, Arial, sans-serif !important; - justify-content: space-between; - padding: 10px 26px 0 26px; - text-align: center; - letter-spacing: .005em; -` - -const RightSideStrikedH3 = styled.div` - display : inline-block; - border-bottom: 1px dotted #666; - vertical-align : middle; - font-weight : 500; - margin-right : 5px; - width : 45%; -` - -const LeftSideStrikedH3 = styled.div` - display : inline-block; - border-bottom: 1px dotted #666; - vertical-align : middle; - font-weight : 500; - margin-left : 5px; - width : 45%; -` -const StyledGoogleLoginButton = styled(GoogleLogin)` - background-color: fff; - border : 1px solid rgb(66, 133, 244); - box-shadow: 0 0 0 1px #4285f4 !important; - :hover { - background-color: #f4f4f4 !important; - } -` - -const H3Styled = styled.h3` - overflow : hidden; - text-align : center; - font-size : 14px; - color : #666; - margin : 10px 0; -` - -const StyledAnchor = styled.a` - color : #00bcd4; - text-decoration : none; -` -const StyledCloseModalButton = styled(Button)` - display : inline-block; - position : relative; - float : right !important; - margin-right : -8px; - background : transparent; - min-width: 0 !important; - width : 40px; -` -const ConfirmContainerStyled = styled.div` - display : flex; - margin-top : 10px; - align-items : center; - justify-content : center; - box-sizing : border-box; -` -const StyledLoginButton = styled(Button)` - background-color: #00bcd4 !important; - box-shadow : none !important; - outline: none !important; - border : 0 !important; - overflow : hidden !important; - width : 35% !important; - display : inline-block !important; - font-family : 'Roboto', sans serif !important; - font-size: 14px !important; - height : 36px !important; - align-items : center !important; - border-radius: 3px !important; - align-self : 50% !important; - :hover { - background-color : #00acc1 !important; - } -` - -const RememberRecover = styled.div` - display : flex; - justify-content : space-between; - font-size: 12px; - font-weight : 400; - margin-bottom: 16px; -` -const StyledSpan = styled.span` - font-size: 12px; - font-weight: 400; - padding-top: 2px; -` diff --git a/src/Components/LoginContainerFunction.js b/src/Components/LoginContainerFunction.js new file mode 100644 index 0000000000000000000000000000000000000000..0e79abf17cab7bbac7e4ca221e4baa119b0ea6e1 --- /dev/null +++ b/src/Components/LoginContainerFunction.js @@ -0,0 +1,369 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, {useState} from "react"; +import GoogleLogin from 'react-google-login' +import { Button } from '@material-ui/core'; +//import FacebookLogin from 'react-facebook-login'; +import CloseIcon from '@material-ui/icons/Close'; +import styled from 'styled-components' +import {device} from './device.js' +import LabeledCheckbox from './Checkbox.js' +import FormInput from "./FormInput.js" +import GoogleLogo from "../img/logo_google.svg" +import ValidateUserInput from './HelperFunctions/FormValidationFunction.js' +import {Link} from 'react-router-dom' +import {apiUrl} from '../env.js' + +async function handleGoogleAttempt () { + console.log("handleGoogleAttempt") + let request_url = ( + `${apiUrl}/omniauth/google_oauth2?auth_origin_url=` + window.location.href + '&omniauth_window_type=sameWindow&resource_class=User' + ) + window.location.replace(request_url) +} + +export default function LoginContainer (props) { + const [formEmail, setEmail] = useState( + { + key : false, + value : localStorage.getItem("@portalmec/uid") || "", + } + ) + + const [formSenha, setSenha] = useState( + { + key : false, + value : localStorage.getItem("@portalmec/senha") ||"" + } + ) + + const [checkboxControl, setCheckbox] = useState(false) + + const switchModal = (e) => { + e.preventDefault() + props.handleClose() + props.openSignUp() + } + + const handleChange = (e, type) => { + const userInput = e.target.value + const flag = ValidateUserInput(type, userInput) + + if(type === 'email') { + setEmail({...formEmail, + key : flag, + value : userInput + }) + // {/*console.log(formEmail)*/} + } + else if(type === 'password') { + setSenha({...formSenha, + key : flag, + value : userInput + }) + // {/*console.log(formSenha)*/} + } + } + + const limpaCamposForm = () => { + setEmail({...formEmail, + key : false, + value : '' + }); + + setSenha({...formSenha, + key : false, + value : '' + }) + } + + const onSubmit = (e) => { + e.preventDefault() + const login = {email : formEmail.value, senha : formSenha.value, checkboxChecked : checkboxControl} + + if (!(formEmail.key || formSenha.key)) { + props.handleLoginInfo(login) + limpaCamposForm() + } + + } + + return ( + <div> + <ContainerStyled > + <DialogHeaderStyled> + <span style={{width:"32px"}}/> + <H2Styled> Entrar + </H2Styled> + <StyledCloseModalButton onClick={props.handleClose}> + <CloseIcon/> + </StyledCloseModalButton> + </DialogHeaderStyled> + + <DialogContentDiv> + <SocialConnectDiv> + <GoogleLoginButton onClick={handleGoogleAttempt}> + <img src={GoogleLogo} alt="google-logo" className="google-logo"/> + <span>Usando o Google</span> + </GoogleLoginButton> + </SocialConnectDiv> + + <H3Div> + <H3Styled> + <RightSideStrikedH3/> + <span style={{verticalAlign:"middle"}}>ou</span> + <LeftSideStrikedH3/> + </H3Styled> + </H3Div> + + <form onSubmit={e => onSubmit(e)}> + <FormInput + inputType={"text"} + name={"email"} + value={formEmail.value} + placeholder={"E-mail"} + handleChange={e => handleChange(e, 'email')} + required={true} + error = {formEmail.key} + help = {formEmail.key ? ( formEmail.value.length === 0 ? "Faltou preencher seu e-mail." : <span>Insira um endereço de e-mail válido.<br/>Por exemplo: seunome@gmail.com, seunome@hotmail.com</span>) : ""} + /> + <br/> + <FormInput + inputType={"password"} + name={"senha"} + value={formSenha.value} + placeholder={"Senha"} + handleChange={e => handleChange(e, 'password')} + required={true} + error = {formSenha.key} + help = {formSenha.key ? (formSenha.value.length === 0 ? "Faltou digitar sua senha." : "A senha precisa ter no mÃnimo 8 caracteres.") : ""} + /> + <br/> + + <RememberRecover> + <LabeledCheckbox label={<StyledLabel><StyledSpan>Lembrar-me</StyledSpan></StyledLabel>} handleChange={() => setCheckbox(!checkboxControl)}/> + <UserForgotTheirPasswordSpan>Esqueceu a senha? <Link to={"/recuperar-senha"} style={{textAlign: "right", color:"#4cd0e1"}} onClick={props.handleClose}>Clique aqui!</Link></UserForgotTheirPasswordSpan> + </RememberRecover> + + <ConfirmContainerStyled> + <StyledLoginButton type="submit" variant="contained"> + <span style={{borderRadius:"3px", boxSizing:"border-box", fontFamily:"Roboto, sans serif", fontWeight:"500", color:"#fff"}}>ENTRAR</span> + </StyledLoginButton> + </ConfirmContainerStyled> + </form> + + <DialogFooterStyled> + <span style={{textAlign:"center", fontSize: "14px", color:"rgb(102, 102, 102)"}}>Ainda não tem cadastro? <StyledAnchor href="" onClick={e => switchModal(e)}>CADASTRE-SE</StyledAnchor></span> + </DialogFooterStyled> + </DialogContentDiv> + </ContainerStyled> + </div> + ) +} + + + const ContainerStyled = styled.div` + box-sizing : border-box; + background-color : white; + max-width : none; + display : flex; + flex-direction : column; + min-width : 440px; + + align : center; + padding : 10px; + border-radius: 4px; + line-height : 20px; + font-size : 14px; + @media ${device.mobileM} { + width : 100%; + min-width : unset; + height : 100%; + min-width : unset !important; + + } + ` + + export const DialogHeaderStyled = styled.div` + text-align : center; + display : flex; + flex-direction : row; + justify-content : space-between; + padding : 10px 26px 0 26px; + height : 64px; + ` + const H2Styled = styled.h2` + align-self : center; + color : #666; + font-size : 26px; + font-weight : 100; + font-family: 'Roboto', sans serif, 'Helvetica Neue', Helvetica, Arial, sans-serif !important; + justify-content: space-between; + text-align: center; + letter-spacing: .005em; + ` + + export const StyledCloseModalButton = styled(Button)` + display : inline-block; + position : relative; + float : right !important; + margin-right : -8px !important; + background : transparent !important; + min-width: 0 !important; + width : 40px; + ` + export const DialogContentDiv = styled.div` + padding : 20px 30px; + overflow : visible !important; + ` + + export const SocialConnectDiv = styled.div` + margin-top : 0; + display : flex; + flex-direction : row; + ` + export const StyledGoogleLoginButton = styled(GoogleLogin)` + background-color : #fff !important; + color : #666 !important; + border : 1px solid rgb(66, 133, 244); + box-shadow: 0 0 0 1px #4285f4 !important; + :hover { + background-color: #f4f4f4 !important; + } + ` + + const DialogFooterStyled = styled.div` + box-sizing : border-box; + font-family : 'Roboto', sans serif; + margin : 20px -20px; + padding-top : 20px; + border-top : 1px #e5e5e5 solid; + justify-content : center; + text-align : center; + line-height : 1.42857143 + ` + + +export const RightSideStrikedH3 = styled.div` + display : inline-block; + border-bottom: 1px dotted #666; + vertical-align : middle; + font-weight : 500; + margin-right : 5px; + width : 44%; + ` + + export const LeftSideStrikedH3 = styled.div` + display : inline-block; + border-bottom: 1px dotted #666; + vertical-align : middle; + font-weight : 500; + margin-left : 5px; + width : 44%; + ` + + export const H3Div = styled.div` + margin-top : 0; + margin-bottom : 10px; + ` + + const H3Styled = styled.h3` + overflow : hidden; + text-align : center; + font-size : 14px; + color : #666; + margin : 10px 0; + ` + + const StyledAnchor = styled.a` + color : #00bcd4; + text-decoration : none; + ` + const ConfirmContainerStyled = styled.div` + display : flex; + margin-top : 10px; + align-items : center; + justify-content : center; + ` + const StyledLoginButton = styled(Button)` + background-color : #00bcd4 !important; + box-shadow : none !important; + outline: none !important; + border : 0 !important; + overflow : hidden !important; + width : 35% !important; + display : inline-block !important; + font-family : 'Roboto', sans serif !important; + font-size: 14px !important; + height : 36px !important; + align-items : center !important; + border-radius: 3px !important; + align-self : 50% !important; + :hover { + background-color : #00acc1 !important; + } + ` + + + const RememberRecover = styled.div` + display : flex; + justify-content : space-between; + font-size: 12px; + font-weight : 400; + ` + + const StyledLabel = styled.div` + box-sizing : border-box; + position : relative; + vertical-align : middle !important; + color : #666; + ` + + const UserForgotTheirPasswordSpan = styled.span` + margin-top : 1em; + font-size : 12px; + font-weight : 400; + text-align : right; + color : #666; + ` + + const StyledSpan = styled.span` + font-size : 12px; + font-weight : 400; + padding-top : 2px; + ` +export const GoogleLoginButton = styled(Button)` + background-color : #fff; + box-shadow : 0 0 0 1px #4285f4 !important; + color : #666 !important; + font-weight : bolder !important; + font-size : 12px !important; + text-transform: none !important; + width: 40%; + + ${'' /* .MuiButton-root { + min-width : 88px; + } */} + + .google-logo { + max-height : 18px ; + padding-right : 5px; + + } + +` diff --git a/src/Components/LoginModal.js b/src/Components/LoginModal.js index 1652dc66f76984373b739f1a4ea692a3ef389ca7..9ebce1910883371a5c81adb9f36c7166247adea5 100644 --- a/src/Components/LoginModal.js +++ b/src/Components/LoginModal.js @@ -16,16 +16,16 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {useContext} from 'react'; -import { Button } from '@material-ui/core'; +import React, {useContext, useState} from 'react'; import Modal from '@material-ui/core/Modal'; import Backdrop from '@material-ui/core/Backdrop'; -import Fade from '@material-ui/core/Fade'; +import Zoom from '@material-ui/core/Fade'; import styled from 'styled-components' -import LoginContainer from './LoginContainer' +import LoginContainer from './LoginContainerFunction.js' import {Store} from '../Store.js' -import axios from 'axios' -import {apiUrl} from '../env'; +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; +import {authentication} from './HelperFunctions/getAxiosConfig' const StyledLogin = styled(Modal)` margin : 0 !important; @@ -38,43 +38,59 @@ const StyledLogin = styled(Modal)` border-radius : 4px; ` +export function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} export default function LoginModal (props){ - const {state, dispatch} = useContext(Store) + const {state, dispatch} = useContext(Store) + + const [snackbarOpened, handleSnackbar] = useState(false) + + const handleCloseSnackbar = (event, reason) => { + if (reason === 'clickaway') { + return; + } + handleSnackbar(false); + } + + function handleSuccess (data) { + dispatch ({ + type: "USER_LOGGED_IN", + userLoggedIn: !state.userIsLoggedIn, + login: data.data + } + ) + props.handleClose(); + props.openSnackbar(); + } + function handleError (error) { + handleSnackbar(true) + } const handleLoginInfo = (login) => { - axios.post(`${apiUrl}/auth/sign_in`, - { + const url = `/auth/sign_in` + const payload = { email : login.email, password : login.senha } - ).then( (response) => { - dispatch ({ - type: "USER_LOGGED_IN", - userLoggedIn: !state.userIsLoggedIn, - login: { - username : login.username, - email : login.email, - accessToken : response.headers['access-token'], - client : response.headers.client - } - } - ) - props.handleClose(); - }, (error) => { - console.log(':()') - } - ) + + authentication(url, payload, handleSuccess, handleError) } return ( + <> + <Snackbar open={snackbarOpened} autoHideDuration={1000} onClose={handleCloseSnackbar} + anchorOrigin = {{ vertical:'top', horizontal:'right' }} + > + <Alert severity="error">Ocorreu um erro ao se conectar!</Alert> + </Snackbar> <StyledLogin aria-labelledby="transition-modal-title" aria-describedby="transition-modal-description" open={props.open} - animation={true} - centered={true} + centered="true" onClose={props.handleClose} closeAfterTransition BackdropComponent={Backdrop} @@ -82,12 +98,14 @@ export default function LoginModal (props){ timeout: 500, }} > - <Fade in={props.open}> + <Zoom in={props.open} style={{ transitionDelay :"0.2ms"}}> <LoginContainer handleClose={props.handleClose} - openSignUp={props.openSignUp} - handleLoginInfo={handleLoginInfo} + openSignUp={props.openSignUp} + handleLoginInfo={handleLoginInfo} /> - </Fade> + </Zoom> </StyledLogin> + + </> ) } diff --git a/src/Components/MaterialCard.js b/src/Components/MaterialCard.js index c5353a918fd0f5aafdf7b2e532c82cfa93cb4b85..8f18cd3c03c35954a3a5d7b9f491a4c81dcd97b0 100644 --- a/src/Components/MaterialCard.js +++ b/src/Components/MaterialCard.js @@ -16,40 +16,98 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; +import React from 'react'; import Card from '@material-ui/core/Card'; import CardContent from '@material-ui/core/CardContent'; import CardActions from '@material-ui/core/CardActions'; import Typography from '@material-ui/core/Typography'; -import livro from "../img/laranja/LIVRO_DIGITAL.jpg"; import Library from '@material-ui/icons/LibraryBooks'; +import Rating from '@material-ui/lab/Rating'; +import StarBorderIcon from '@material-ui/icons/StarBorder'; +import Grid from '@material-ui/core/Grid'; +import styled from 'styled-components'; +import Button from '@material-ui/core/Button'; +import ExpandMoreRoundedIcon from '@material-ui/icons/ExpandMoreRounded'; +import {Link} from 'react-router-dom'; +export default function MaterialCard(props) { -class MaterialCard extends Component { - constructor(props) { - super(props); - this.state={ - thumbnail: livro, - }; - } - render(){ - return ( - <Card> - <img src={this.state.thumbnail} alt="thumbnail do recurso"/> - <CardContent style={{height: "60%", textAlign: "left", paddingBottom: "0px"}}> - <Typography variant="body2" color="textSecondary" component="p" style={{overflow: "hidden", fontSize: "0.8em"}}> - {this.props.name} - </Typography> - </CardContent> - <CardActions style={{justifyContent: "space-between"}}> - <Library style={{color:"#e81f4f"}} /> - </CardActions> - <CardActions style={{borderTop:"1px solid #e5e5e5", justifyContent: "space-between"}}> - <Typography>Expandir??</Typography> - </CardActions> - </Card> - );} - } - - -export default MaterialCard; + const thumb = require(`../../public/${props.thumb}`) + + const HandleButtonPressed = () => { + props.handleExpand(props.id); + } + + const width = window.innerWidth; + + return ( + <Card> + <img src={thumb} alt="thumbnail do recurso" /> + <CardContent style={{ height: "60px", textAlign: "left", paddingBottom: "0px", width: "100%" }}> + <Title> + {props.name} + </Title> + </CardContent> + <CardActions> + <Grid container direction="column" justify="flex-start" alignItems="flex-start" style={{ marginLeft: "5px" }}> + <Grid item> + <Rating + name="customized-empty" + value={props.score} + precision={0.5} + style={{ color: "#666" }} + emptyIcon={<StarBorderIcon fontSize="inherit" />} + readOnly + /> + </Grid> + <Grid container direction="row" alignItems="center"> + <Library style={{ color: "#e81f4f" }} /> + <SizedBox /> + <Typography variant="body2" color="textSecondary" component="p" style={{ overflow: "hidden", fontSize: "0.8em" }}> + {props.modules.length} módulos + </Typography> + </Grid> + </Grid> + </CardActions> + <CardActions style={{ borderTop: "1px solid #e5e5e5", justifyContent: "center" }}> + { + width <= 767 ? + <Link style={{textDecoration : "none"}} to={`/colecao?colecao=${props.id}`}> + <Button + color="secondary" + endIcon={<ExpandMoreRoundedIcon />} + > + + Ver módulos + </Button> + </Link> + : + <Button + color="secondary" + endIcon={<ExpandMoreRoundedIcon />} + onClick={HandleButtonPressed} + > + + Ver módulos + </Button> + } + </CardActions> + </Card > + ) +} + +const SizedBox = styled.div` + width : 5px; +` +const Title = styled(Typography)` + font-weight: 500; + color: rgb(102, 102, 102); + font-size: 0.9em; + margin-left: 10px; + margin-right: 10px; + + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +` \ No newline at end of file diff --git a/src/Components/MenuBar.js b/src/Components/MenuBar.js index d2ba1f46a599c406a4ea94dac5e0b4cf6895f499..7cf1153b7bdf834d4694b1d7367df27fbc9319ca 100644 --- a/src/Components/MenuBar.js +++ b/src/Components/MenuBar.js @@ -16,7 +16,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {useContext} from 'react'; +import React, { useContext } from 'react'; import { Link } from 'react-router-dom' import { Container } from 'react-grid-system' import logo from '../img/logo_small.svg' @@ -29,7 +29,7 @@ import styled from 'styled-components' import { Store } from '../Store'; import CloudUploadIcon from '@material-ui/icons/CloudUpload'; import Notifications from "./Notifications.js" -import CustomizedMenus from './MenuList' +import MenuList from './MenuList' const ContainerStyled = styled(Container)` *{ text-decoration: none } @@ -37,12 +37,13 @@ const ContainerStyled = styled(Container)` align-items: center; border-top: 1px rgba(0,0,0,.1) solid; padding: 5px; - *{ - margin-left: 10px; - } + padding-top : 10px; + ` -const ButtonStyled = styled(Button)` +export const ButtonStyled = styled(Button)` text-transform: capitalize !important; + margin : 0 8px !important; + font-weight : normal !important; ` const ButtonPublicarRecurso = styled(Button)` @@ -51,9 +52,14 @@ const ButtonPublicarRecurso = styled(Button)` border : 1px transparent solid; background-color : #ff7f00 !important; align-content : center; + font-weight : 500 !important; text-transform: capitalize !important; font-stretch : expanded; max-width: 200 !important; + .MuiSvgIcon-root { + vertical-align : middle !important; + margin-right : 5px !important; + } ` const IconSearchStyled = styled(IconSearch)` @@ -74,98 +80,125 @@ const Right = styled.span` margin-right : 10px; ` -const Left = styled.span ` +const Left = styled.span` width: 100%; display: inline-flex; align-items: center; ` -const ButtonPubRecursoStyled = styled(Button)` +export const ButtonPubRecursoStyled = styled(Button)` + font-weight : 500 !important; border : 1.5px #666 solid !important; color: #666; box-shadow: none; + margin : 0 8px !important; + font-weight : normal !important; ` -export default function MenuBar(props){ +export default function MenuBar(props) { + + const { state } = useContext(Store) + + const buildMyAreaTabs = () => { + const minhaArea = [ + { name: "Perfil e Atividades", href: "/perfil", value: '0' }, + { name: "Recursos Publicados", href: "/perfil", value: '1' }, + { name: "Favoritos", href: "/perfil", value: '2' }, + { name: "Coleções", href: "/perfil", value: '3' }, + { name: "Rede", href: "/perfil", value: '4' }, + { name: "Configurações", href: "/editarperfil", value: '5' }, + ] + + if (state.currentUser.roles) { + let canUserAdmin = false; + let index = 0; + const userRoles = [...state.currentUser.roles] + + while (!canUserAdmin && index < userRoles.length) { + if (userRoles[index].id === 3 || userRoles[index].id === 7) + canUserAdmin = true + index++ + } + + if (canUserAdmin) + minhaArea.push({ + name: "Administrador", + href: "/admin/home", + value: '6', + }) + } - const { state, dispatch } = useContext(Store) + return minhaArea; + } const menuSobre = [ - { name: "Sobre a Plataforma", href: "" }, - { name: "Portais Parceiros", href: "" }, - { name: "Termos de Uso", href: "" }, - { name: "Contato", href: "" } + { name: "Sobre a Plataforma", href: "/sobre" }, + { name: "Portais Parceiros", href: "/sobre#portaisparceiros" }, + { name: "Termos de Uso", href: "/termos" }, + { name: "Contato", href: "/contato" } ] const menuAjuda = [ - { name: "Central de Ajuda", href: ""}, - { name: "Publicando Recursos", href: ""}, - { name: "Encontrando Recursos", href: ""}, - { name: "Participando da Rede", href: ""}, - { name: "Gerenciando a Conta", href: ""} + { name: "Central de Ajuda", href: "/ajuda" }, + { name: "Publicando Recursos", href: "/publicando-recurso" }, + { name: "Encontrando Recursos", href: "/encontrando-recurso" }, + { name: "Participando da Rede", href: "/participando-da-rede" }, + { name: "Gerenciando a Conta", href: "/gerenciando-conta" } ] - const minhaArea = [ - { name: "Perfil e Atividades", href: "/perfil/atualizacoes"}, - { name: "Recursos Publicados", href: "/perfil/recursos-publicados"}, - { name: "Favoritos", href: "/perfil/favoritos"}, - { name: "Coleções", href: "/perfil/colecoes"}, - { name: "Rede", href: "/perfil/rede"}, - { name: "Configurações", href: "/perfil/cofiguracoes/editarperfil"}, - { name: "Sair", href:"/"} - ] + const minhaArea = buildMyAreaTabs() - return( + return ( <ContainerStyled fluid={true} > <Left> <Link to="/"> <ImageStyled src={logo} alt="Plataforma Integrada" /> </Link> - <Dropdown name="Sobre" items={menuSobre}/> - <Dropdown name="Ajuda" items={menuAjuda}/> + <Dropdown name="Sobre" items={menuSobre} /> + <Dropdown name="Ajuda" items={menuAjuda} /> <a href="http://educacaoconectada.mec.gov.br/" rel="noopener noreferrer" target="_blank" > - <ButtonStyled >Educação Conectada</ButtonStyled> - </a> - <ButtonStyled onClick={props.openSearchBar} ><IconSearchStyled />Buscar</ButtonStyled> - </Left> - <Right> + <ButtonStyled >Educação Conectada</ButtonStyled> + </a> + {/*<Link to="/loja"> + <ButtonStyled>Lojinha</ButtonStyled> + </Link>*/} + <ButtonStyled onClick={props.openSearchBar} ><IconSearchStyled />Buscar</ButtonStyled> + + </Left> + <Right> { - state.userIsLoggedIn + state.userIsLoggedIn ? ( - [ - <> - <div style={{boxSizing:"border-box"}}> - <Link to="/termos-publicar-recurso"> - <ButtonPublicarRecurso> - <CloudUploadIcon style={{color:"white", marginLeft : "0"}}/> - <span style={{color : "#fff", textAlign: "center", alignSelf : "center", fontWeight:"100"}} > - PUBLICAR RECURSO + <> + <div style={{ boxSizing: "border-box" }}> + <Link to="/termos-publicar-recurso"> + <ButtonPublicarRecurso> + <CloudUploadIcon style={{ color: "white", marginLeft: "0" }} /> + <span style={{ color: "#fff", textAlign: "center", alignSelf: "center", fontWeight: "500" }} > + PUBLICAR RECURSO </span> - </ButtonPublicarRecurso> - </Link> - </div> + </ButtonPublicarRecurso> + </Link> + </div> - <div> - <Notifications/> - </div> + <div> + <Notifications /> + </div> - <CustomizedMenus items={minhaArea}/> + <MenuList items={minhaArea} /> - </> - ] + </> ) : ( - [ - <React.Fragment> - <ButtonPubRecursoStyled onClick={props.openLogin}>PUBLICAR RECURSO?</ButtonPubRecursoStyled> - <ButtonStyled onClick={props.openLogin}><ExitToAppIcon style={{color:"#00bcd4"}}/>Entrar</ButtonStyled> - <ButtonStyled onClick={props.openSignUp}>Cadastre-se</ButtonStyled> - </React.Fragment> - ] + <React.Fragment> + <ButtonPubRecursoStyled onClick={props.openLogin}>PUBLICAR RECURSO?</ButtonPubRecursoStyled> + <ButtonStyled onClick={props.openLogin}><ExitToAppIcon style={{ color: "#00bcd4" }} />Entrar</ButtonStyled> + <ButtonStyled onClick={props.openSignUp}>Cadastre-<span style={{textTransform: 'lowercase'}}>se</span></ButtonStyled> + </React.Fragment> ) } - </Right> + </Right> </ContainerStyled> ); } diff --git a/src/Components/MenuBarMobile.js b/src/Components/MenuBarMobile.js new file mode 100644 index 0000000000000000000000000000000000000000..0e263606db82b52e09b2d108727784bf0aadab05 --- /dev/null +++ b/src/Components/MenuBarMobile.js @@ -0,0 +1,93 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import MenuIcon from '@material-ui/icons/Menu'; +import styled from 'styled-components' +import { Button } from '@material-ui/core' +import logo from '../img/logo_small.svg' +import { Link } from 'react-router-dom' +import MobileDrawerMenu from './MobileDrawerMenu'; +import IconSearch from '@material-ui/icons/Search' + + +export default function MenuBarMobile(props) { + + const [drawerOpen, setDrawerStatus] = React.useState(false); + + + const toggleDrawer = (open) => (event) => { + if (event.type === 'keydown' && (event.key === 'Tab' || event.key === 'Shift')) { + return; + } + setDrawerStatus(open); + }; + + return ( + <> + <MobileDrawerMenu anchor={'left'} open={drawerOpen} + onClose={toggleDrawer(false)} + openSignUp={props.openSignUp} openLogin={props.openLogin} + /> + <OuterDiv> + <Button style={{ color: "#00bcd4" }} onClick={toggleDrawer(true)}> + <MenuIcon className="icon" /> + </Button> + <DrawerButtonDiv> + <Link to={"/"}> + <img src={logo} alt="logo" style={{ border: "0", verticalAlign: "middle" }} /> + </Link> + </DrawerButtonDiv> + <Button style={{ color: "#00bcd4", position: "absolute", right: 0}} onClick={props.openSearchBar}> + <IconSearchStyled/> + </Button> + </OuterDiv> + </> + ) +} + +const OuterDiv = styled.div` + height : 48px; + width : 100%; + ${'' /* position : relative; */} + display : flex; + direction : row; + align-items : center; + + img { + height : 38px; + overflow : hidden; + } +` +const DrawerButtonDiv = styled.div` + height : 38px; + width : 45.55px; + position:absolute; + left:0; + right:0; + margin-left:auto; + margin-right:auto; +` + +const IconSearchStyled = styled(IconSearch)` + color: #16b8dd; + height : 38px; + width : 45.55px; + margin-left:auto; + margin-right:auto; +` \ No newline at end of file diff --git a/src/Components/MenuList.js b/src/Components/MenuList.js index 5652912f35b10d55da9dc1ba178d80394267e8ae..65ab3c6b76925816bb26b17ce48e8793192667a2 100644 --- a/src/Components/MenuList.js +++ b/src/Components/MenuList.js @@ -20,29 +20,21 @@ import React, {useContext} from 'react'; import Button from '@material-ui/core/Button'; import Menu from '@material-ui/core/Menu'; import MenuItem from '@material-ui/core/MenuItem'; -import AccountCircleRoundedIcon from '@material-ui/icons/AccountCircleRounded'; import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown'; import { Link } from 'react-router-dom' import ExitToAppIcon from '@material-ui/icons/ExitToApp'; import { Store } from '../Store'; -import { Redirect } from "react-router-dom"; import Profile from '../img/default_profile0.png' import styled from 'styled-components' +import {apiDomain} from '../env.js' +import {deleteRequest} from './HelperFunctions/getAxiosConfig' -const iconStyles = { - fontSize : "xxx-large", - color: "white", - backgroundColor: "gray", - borderRadius : "50%", - overflow : "hidden", - border : "2px solid #fff", -} const OverrideButton = styled(Button)` text-transform : none !important; ` -export default function CustomizedMenus(props) { +export default function MenuList(props) { const [anchorEl, setAnchorEl] = React.useState(null); const { state, dispatch } = useContext(Store) @@ -54,18 +46,15 @@ export default function CustomizedMenus(props) { setAnchorEl(null); }; - const handleLogout = () => { + function handleSuccessSignOut (data) { dispatch( { type: 'USER_LOGGED_OUT', userLoggedOut: !state.userIsLoggedIn, - login: { - username : '', - email : '', - accessToken : '', - client : '' - } - } - ) + }) + } + const handleLogout = () => { + const url = `/auth/sign_out` + deleteRequest(url, handleSuccessSignOut, (error) => {console.log(error)}) } return ( @@ -74,10 +63,20 @@ export default function CustomizedMenus(props) { <OverrideButton aria-controls="customized-menu" aria-haspopup="true" - onMouseEnter={handleClick} - + onMouseOver={handleClick} > - <img src={Profile} alt={''} style={{maxWidth:"50px", maxHeight:"50px", borderRadius:"25px"}}/> + <div style={{borderRadius: "50%", border: "2px solid #fff", background: "#fff", overflow: "hidden", maxWidth : "50px", maxHeight : "50px"}}> + { + state.currentUser.avatar === '' || state.currentUser.avatar === null || state.currentUser.avatar === undefined ? + ( + + <img src={Profile} alt={'user avatar'} style={{width:"100%", height:"100%", verticalAlign : "middle", marginLeft : "0"}}/> + ): + ( + <img src={apiDomain + state.currentUser.avatar} alt={'user avatar'} style={{width:"100%", height:"100%", verticalAlign : "middle", marginLeft : "0"}}/> + ) + } + </div> <span style={{fontFamily:"inherit", fontWeight:"400", color:"#666"}}>Minha Ãrea </span> <KeyboardArrowDownIcon/> </OverrideButton> @@ -98,104 +97,45 @@ export default function CustomizedMenus(props) { { props.items.map((item)=> - <Link key={item.name} to={item.href} style={{textDecoration:"none"}} ><MenuItem style= {{fontSize:"14px", padding:"5px 20px", color:"#666"}}>{item.name}</MenuItem></Link> - ) + <Link to={{ + pathname : item.href, + state : item.value + }} style={{textDecoration:"none"}} key={item.value}><MenuItem style= {{fontSize:"14px", padding:"5px 20px", color:"#666"}} key={item.value}>{item.name}</MenuItem></Link> + ) } - <Button onClick={handleLogout} style={{layout:"row", layoutAlign:"space-between-center"}}> <MenuItem>Sair<ExitToAppIcon style={{align:"right"}}/></MenuItem></Button> - - + <StyledButtonSair onClick={handleLogout}> <StyledMenuItem disableGutters={true}>Sair<StyledExitToAppIcon/></StyledMenuItem></StyledButtonSair> </Menu> </div> ); } -//import React from 'react'; -//import Button from '@material-ui/core/Button'; -//import ClickAwayListener from '@material-ui/core/ClickAwayListener'; -//import Grow from '@material-ui/core/Grow'; -//import Paper from '@material-ui/core/Paper'; -//import Popper from '@material-ui/core/Popper'; -//import MenuItem from '@material-ui/core/MenuItem'; -//import MenuList from '@material-ui/core/MenuList'; -//import { makeStyles } from '@material-ui/styles'; -//import AccountCircleRoundedIcon from '@material-ui/icons/AccountCircleRounded'; -//import styled from 'styled-components' -//import {BrowserRouter, Switch, Route} from 'react-router-dom'; -// -//const iconStyles = { -// fontSize : "xxx-large", -// color: "white", -// backgroundColor: "gray", -// borderRadius : "50%", -// overflow : "hidden", -// border : "2px solid #fff", -//} -// -//export default function MenuListComposition(props) { -// const [open, setOpen] = React.useState(false); -// const anchorRef = React.useRef(null); -// -// const handleToggle = () => { -// setOpen(prevOpen => !prevOpen); -// }; -// -// const handleClose = event => { -// if (anchorRef.current && anchorRef.current.contains(event.target)) { -// return; -// } -// -// setOpen(false); -// }; -// -// function handleListKeyDown(event) { -// if (event.key === 'Tab') { -// event.preventDefault(); -// setOpen(false); -// } -// } -// -// // return focus to the button when we transitioned from !open -> open -//// const prevOpen = React.useRef(open); -//// React.useEffect(() => { -//// if (prevOpen.current === true && open === false) { -//// anchorRef.current.focus(); -//// } -//// -//// prevOpen.current = open; -//// }, [open]); -// -// return ( -// <div style={{minWidth:"212px"}}> -// <div> -// <Button -// ref={anchorRef} -// aria-controls={open ? 'menu-list-grow' : undefined} -// aria-haspopup="true" -// onMouseOver={handleToggle}> -// <AccountCircleRoundedIcon style={iconStyles}/> -// Minha Ãrea -// </Button> -// <Popper open={open} anchorEl={anchorRef.current} role={undefined} transition disablePortal> -// {({ TransitionProps, placement }) => ( -// <Grow -// {...TransitionProps} -// style={{ transformOrigin: placement = 'bottom'}} -// > -// <Paper> -// <ClickAwayListener onClickAway={handleClose}> -// { -// props.items.map((item)=> -// <Route path={item.href} ><MenuItem>{item.name}</MenuItem></Route> -// ) -// } -// </ClickAwayListener> -// </Paper> -// </Grow> -// )} -// </Popper> -// </div> -// </div> -// -// ); -//} -// +const StyledButtonSair = styled(Button)` + height : 31px; + width : 177px; + layout : row; + + .listItem { + width : 100% !important; + display : flex !important; + justify-content: space-between !important; + font-size : 14px !important; + color : #a5a5a5 !important; + padding : 5px 20px !important; + } +` + +const StyledExitToAppIcon = styled(ExitToAppIcon) ` + fontSize : 24px; + color : rgb(162,165,165); + align : right; + display : flex; + justify-content : flex-end; +` +const StyledMenuItem = styled(MenuItem)` + display : flex !important; + justify-content: space-between !important; + width : 100% !important; + font-size : 14px !important; + color : #a5a5a5 !important; + padding : 5px 20px !important; +` diff --git a/src/Components/MobileDrawerMenu.js b/src/Components/MobileDrawerMenu.js new file mode 100644 index 0000000000000000000000000000000000000000..654ee7b9154f7fd34b15c8b36ee0c163e301f45f --- /dev/null +++ b/src/Components/MobileDrawerMenu.js @@ -0,0 +1,285 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useContext } from 'react' +import { Store } from '../Store'; +import Drawer from '@material-ui/core/Drawer'; +import styled from 'styled-components' +import { Link } from 'react-router-dom' +import HomeIcon from '@material-ui/icons/Home'; +import InfoIcon from '@material-ui/icons/Info'; +import MailOutlineIcon from '@material-ui/icons/MailOutline'; +import HelpOutlineIcon from '@material-ui/icons/HelpOutline'; +import AssignmentIcon from '@material-ui/icons/Assignment'; +import { ButtonStyled } from './MenuBar' +import ExitToAppIcon from '@material-ui/icons/ExitToApp' +import { Button } from '@material-ui/core'; +import DefaultAvatar from '../img/default_profile0.png' +import SettingsIcon from '@material-ui/icons/Settings'; +import { apiDomain } from '../env.js' +import { deleteRequest } from './HelperFunctions/getAxiosConfig' + +export default function MobileDrawerMenu(props) { + const { state, dispatch } = useContext(Store) + + const buildMyAreaTabs = () => { + const minhaArea = [ + { name: "Perfil e Atividades", href: "/perfil", value: '0' }, + { name: "Recursos Publicados", href: "/perfil", value: '1' }, + { name: "Favoritos", href: "/perfil", value: '2' }, + { name: "Coleções", href: "/perfil", value: '3' }, + { name: "Rede", href: "/perfil", value: '4' }, + { name: "Configurações", href: "/editarperfil", value: '5' }, + ] + + if (state.currentUser.roles) { + let canUserAdmin = false; + let index = 0; + const userRoles = [...state.currentUser.roles] + + while (!canUserAdmin && index < userRoles.length) { + if (userRoles[index].id === 3 || userRoles[index].id === 7) + canUserAdmin = true + index++ + } + + if (canUserAdmin) + minhaArea.push({ + name: "Administrador", + href: "/admin/home", + value: '6', + }) + } + + return minhaArea; + } + + const menuSobre = [ + { name: "Página Inicial", href: "/", icon: <HomeIcon /> }, + { name: "Sobre a Plataforma", href: "/sobre", icon: <InfoIcon /> }, + { name: "Contato", href: "/contato", icon: <MailOutlineIcon /> }, + { name: "Central de Ajuda", href: "/ajuda", icon: <HelpOutlineIcon /> }, + { name: "Termos de Uso", href: "/termos", icon: <AssignmentIcon /> }, + //{ name: "Busca", href: `/busca?query=${state.search.query}&search_class=${state.search.class}`, icon: <SearchIcon /> } + ] + + // {/*used in dynamic css selection*/} + const [selectedIndex, setSelectedIndex] = React.useState(-1); + const handleMenuItemClick = (event, index) => { + setSelectedIndex(index); + }; + + const getUserAvatar = () => { + if (state.currentUser.avatar === '' || state.currentUser.avatar == null) { + return DefaultAvatar + } + else { + return apiDomain + state.currentUser.avatar + } + } + + // {/*main user actions array */} + const minhaArea = buildMyAreaTabs() + + function handleSuccessSignOut(data) { + dispatch({ + type: 'USER_LOGGED_OUT', + userLoggedOut: !state.userIsLoggedIn, + }) + } + const handleLogout = () => { + const url = `/auth/sign_out` + deleteRequest(url, handleSuccessSignOut, (error) => { console.log(error) }) + } + + return ( + <StyledDrawer anchor={props.anchor} open={props.open} onClose={props.onClose}> + <MenuBody> + {/*Renders menuSobre array options*/} + { + menuSobre.map((item, index) => + <Link to={item.href} className={`menu-buttons ${selectedIndex === index ? 'selected' : ''}`} onClick={(event) => handleMenuItemClick(event, index)}> + {item.icon} + {item.name} + </Link> + ) + } + </MenuBody> + + + <div style={{ borderTop: "1px solid #e5e5e5", borderBottom: "1px solid #e5e5e5", marginTop: "10px", paddingTop: "10px", marginBottom: "10px" }}> + { + /*If user is logged in, render user actions menu; else render log in/sign in buttons*/ + state.userIsLoggedIn ? + ( + <div style={{ display: "flex", flexDirection: "column", color: "#666", paddingBottom: "10px" }}> + <MyArea> + <div className="user-avatar"> + <img alt="user-avatar" + src={getUserAvatar()} + /> + </div> + <span className="text">Minha área</span> + </MyArea> + + { + minhaArea.map((item, index) => + <Link to={{ + pathname: item.href, + state: item.value + }} + className={`menu-buttons ${selectedIndex === (index + menuSobre.length) ? 'selected' : ''}`} + onClick={(event) => handleMenuItemClick(event, index + menuSobre.length)} + > + {item.icon} + {item.name} + </Link> + ) + } + + </div> + ) + : + ( + <React.Fragment> + <div style={{ display: "flex", justifyContent: "center", marginTop: "10px" }}> + <ButtonPublicarRecurso onClick={props.openLogin}> + PUBLICAR RECURSO? + </ButtonPublicarRecurso> + </div> + + <div style={{ display: "flex", flexDirection: "row", margin: "10px 0", justifyContent: "center" }}> + <div style={{ borderRight: "1px solid #e5e5e5" }}> + <ButtonStyled onClick={props.openLogin}> + <ExitToAppIcon style={{ color: "#00bcd4" }} />Entrar + </ButtonStyled> + </div> + + <div> + <ButtonStyled onClick={props.openSignUp}> + Cadastre-<span style={{textTransform: 'lowercase'}}>se</span> + </ButtonStyled> + </div> + </div> + </React.Fragment> + ) + } + </div> + { + /*Renders settings and log off buttons */ + state.userIsLoggedIn && + <React.Fragment> + <Link to={"/editarperfil"} className={`menu-buttons`}> + <SettingsIcon /> Configurações + </Link> + + <Link to={"/"} className={`menu-buttons`} onClick={handleLogout}> + <ExitToAppIcon /> Sair + </Link> + </React.Fragment> + } + </StyledDrawer> + ) +} + +const MyArea = styled.div` + margin : 0 16px; + display : flex; + flex-direction : row; + + .text { + font-size : 16px; + color : #666; + align-self : center; + } + + .user-avatar { + margin-right : 10px; + align-self : center; + border-radius : 50%; + border : 1px solid #fff; + max-width : 50px; + max-height : 50px; + overflow : hidden; + + img { + width : 100%; + height : 100%; + vertical-align : middle; + } + } +` + +const ButtonPublicarRecurso = styled(Button)` + font-weight : 500 !important; + border : 1.5px #666 solid !important; + color: #666; + box-shadow: none; + margin : 0 8px !important; + padding : 6px 25px !important; + +` + +const StyledDrawer = styled(Drawer)` + .MuiPaper-root { + width : 65% !important; + } + + .menu-buttons { + padding : 10px 16px; + font-size : 14px; + font-weight : 500; + cursor : pointer; + outline : 0; + color : #666 !important; + text-decoration : none !important; + background-color : transparent; + font-family : 'Roboto', sans serif; + + .MuiSvgIcon-root { + color : #a5a5a5 !important; + margin-right : 20px; + vertical-align : middle !important; + font-weight : normal !important; + font-style : normal !important; + font-size : 24px !important; + line-height : 1 !important; + letter-spacing : normal !important; + text-transform : none !important; + display : inline-block !important; + white-space : nowrap !important; + word-wrap : normal !important; + direction : ltr !important; + } + } + + .selected { + color : #fff !important; + background-color : #00bcd4; + .MuiSvgIcon-root { + color : #fff !important; + } + } +` + +const MenuBody = styled.div` + margin-top : 20px; + display : flex; + flex-direction : column; + color : #666; +` diff --git a/src/Components/Modal.js b/src/Components/Modal.js index 38d84f11a216daf7c8964e81546ed760e8669d2d..dd2de1bc9e16debc20d88233ae5f907200dd79c2 100644 --- a/src/Components/Modal.js +++ b/src/Components/Modal.js @@ -23,32 +23,13 @@ import Modal from '@material-ui/core/Modal'; import TermsCarousel from './Carousel'; import Backdrop from '@material-ui/core/Backdrop'; -import Grid from '@material-ui/core/Grid'; import Fade from '@material-ui/core/Fade'; import VisibilityOutlinedIcon from '@material-ui/icons/VisibilityOutlined'; -import ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos'; -import ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos'; -import styled from 'styled-components' + /*Importação de imagens para o componente*/ -import Handshake from "../img/termos/handshake.svg" -import Pessoa from "../img/termos/Pessoa.svg" -import Email from "../img/termos/Email.svg" -import Seguranca from "../img/termos/Seguranca.svg" -import Aberto from "../img/termos/Aberto.png"; -import Fechado from "../img/termos/Fechado.png"; -import Arrow_down from "../img/termos/Arrow_down.svg"; -import Arrow_double from "../img/termos/Arrow_double.svg"; -import Arrow_O from "../img/termos/Arrow_O que é a plataforma.png"; -import Arrow_O_1 from "../img/termos/Arrow_O que é a plataforma-1.png"; -import Like from "../img/termos/Like.svg"; -import Unlike from "../img/termos/Unlike.svg"; -import Line from "../img/termos/Line.svg"; -import Entenda from "../img/termos/Entenda.svg"; -import V from "../img/termos/V.svg"; -import OrthogonalLineUp from "../img/termos/OrthogonalLineUp.png" -import OrthogonalLineDown from "../img/termos/OrthogonalLineDown.png" + diff --git a/src/Components/ModalAbout.js b/src/Components/ModalAbout.js new file mode 100644 index 0000000000000000000000000000000000000000..84998e7cbe28194b29663cc6fc47a78ba8cfeec3 --- /dev/null +++ b/src/Components/ModalAbout.js @@ -0,0 +1,203 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import { makeStyles } from '@material-ui/styles'; +import Modal from '@material-ui/core/Modal'; + +import Formulario from "./ContactForm"; + +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; + +import styled from 'styled-components' + + +/*Importação de imagens para o componente*/ + + + + +const useStyles = makeStyles(theme => ({ + modal: { + display: "flex", + alignItems: "center", + justifyContent: "center" + }, + paper: { + border: '2px solid #000', + boxShadow: " 0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)" + }, + carousel: { + width: "750px", + height:"370px", + + } +})); + +const Button = styled.button` + +background-color: #00bcd4; +color: #fff; +font-family: Roboto,sans-serif; +font-size: 14px; +font-weight: 700; +height: 36px; +border-radius: 3px; +padding-left: 16px; +padding-right: 16px; +box-shadow: 0 2px 5px 0 rgba(0,0,0,.26); +display: inline-block; +position: relative; +cursor: pointer; +min-height: 36px; +min-width: 88px; +line-height: 36px; +vertical-align: middle; +-webkit-box-align: center; +outline: none; +text-align: center; +border: 0; +padding: 0 16px !important; +hite-space: nowrap; +text-decoration: none; + +` + +const Formulário = styled.div ` + background-color: #fff; + padding: 40px; + + border-radius: 4px; + + + color: #666 !important; + + h2 { + font-size: 26px; + font-weight: lighter; + margin-top: 20px; + margin-bottom: 10px; + } + + form .inputBlock { + margin-block: 22px; + + } + + form .inputBlock label { + font-size: 14px; + font-weight: bold; + display: block; + + } + + form .inputBlock input { + width: 100%; + height: 32px; + font-size: 14px; + border: 0; + border-bottom: 1px solid #eee; + + } + + form .inputBlock.Message input { + height: 131px; + } + + form buttom[type=submit] { + width: 100%; + border: 0; + margin-top: 30px; + background: #7d40e7 + border-radius: 2px; + padding: 15px 20px; + font-size: 16px; + font-weight: bold; + color: #fff; + cursor: pointer; + transition: background 0.5s; + + } + + form buttom[type=submit]:hover { + background: #6931ac + } + + + h2 { + font-size: 24px; + font-weight: lighter; + margin-bottom: 50px; + margin-top: 20px; + text-align: center; + + } +` + + + + +export default function TransitionsModal() { + const classes = useStyles(); + const [open, setOpen] = React.useState(false); + + const handleOpen = () => { + setOpen(true); + }; + + const handleClose = () => { + setOpen(false); + }; + + return ( + + + <div style={{display:"flex", justifyContent: "center"}}> + <link href="https://fonts.googleapis.com/css?family=Kalam|Pompiere|Roboto&display=swap" rel="stylesheet"/> + + <Button type="button" onClick={handleOpen}> + SUGERIR OUTRO SITE + </Button> + <Modal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + className={classes.modal} + open={open} + onClose={handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={open}> + + <div> + <Formulário> + <h2>Sugerir site de Recursos Educacionais Digitais</h2> + <Formulario/> + </Formulário> + + </div> + + </Fade> + </Modal> + </div> + ); +} diff --git a/src/Components/ModalAlterarAvatar/ComponentAlterarAvatar.js b/src/Components/ModalAlterarAvatar/ComponentAlterarAvatar.js new file mode 100644 index 0000000000000000000000000000000000000000..294bcdb0630ca4f6dceaaec40f1665973dc97e85 --- /dev/null +++ b/src/Components/ModalAlterarAvatar/ComponentAlterarAvatar.js @@ -0,0 +1,292 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useContext, useState} from 'react'; +import { Button } from '@material-ui/core'; +import styled from 'styled-components' +import {Store} from '../../Store.js' +import {apiDomain} from '../../env'; +import CloseIcon from '@material-ui/icons/Close'; +import Profile from '../../img/default_profile0.png' +import Cropper from '../Cropper.js' +import {putRequest} from '../HelperFunctions/getAxiosConfig' + +function ChooseImage (props) { + return ( + <div style={{marginTop:"0"}}> + <DivAlterarFoto> + <DivFlowHolder> + <AvatarCircleDiv> + <img src={props.avatar} + alt="user avatar" style={{height:"inherit", width:"inherit", objectFit:"cover"}} + /> + <input accept="image/*" id="avatar-file" + type="file" + onChange={(e) => props.handleFile(e.target.files)} + style={{display : "none"}} + /> + <label for="avatar-file" style={{width:"inherit"}}> + <ChangeAvatarDiv > + <span>Alterar</span> + </ChangeAvatarDiv> + </label> + </AvatarCircleDiv> + </DivFlowHolder> + </DivAlterarFoto> + { + props.tempImg && + <img alt="" src={props.tempImg}/> + } + <ButtonsDiv> + <ButtonCancelar onClick={props.handleClose}> + <span>Cancelar</span> + </ButtonCancelar> + <ButtonConfirmar> + <span>Salvar Alterações</span> + </ButtonConfirmar> + </ButtonsDiv> + </div> + ) +} + + +export default function ComponentAlterarAvatar (props) { + const {state, dispatch} = useContext(Store) + const [uploadingImage, setUploading] = useState(false) + + const handleFile = (selectorFiles) => { + const objectURL = URL.createObjectURL(selectorFiles[0]) + console.log(objectURL) + setTempImg(objectURL) + setUploading(true) + } + + const [tempImgURL, setTempImg] = useState(null) + + const [newAvatar, setNewAvatar] = useState('') + const updateAvatar = (avatar) => {setNewAvatar(avatar)} + + const [crop] = useState({ + unit: "%" , + width : 30, + aspect: 1 + }); + + function handleSuccess(data) { + const target = state.currentUser + const source = {avatar : data.avatar} + dispatch({ + type : 'USER_CHANGED_COVER', + currUser : Object.assign(target, source) + }) + props.handleClose() + } + + const completeSelection = () => { + const url = `/users/${props.id}` + + //newAvatar is a base64 encoded image file + let fdAvatar = new FormData() + fdAvatar.set('user[avatar]', newAvatar) + + putRequest(url, fdAvatar, handleSuccess, (error) => {console.log(error)}) + } + + return ( + <ModalDiv> + <HeaderDiv> + <span style={{width:"32px"}}/> + <StyledH2>{uploadingImage ? 'Alterar foto do perfil' : 'Editar Foto'}</StyledH2> + <StyledCloseModalButton onClick={props.handleClose}> + <CloseIcon style={{color : "#666"}}/> + </StyledCloseModalButton> + </HeaderDiv> + <DialogDiv> + { + uploadingImage ? + ( + [ + <> + <EditarDiv> + <TextoEditarDiv> + Clique nos Ãcones e arraste para selecionar a parte que você quer da foto + </TextoEditarDiv> + <div style={{maxWidth : "500px", maxHeight : "300px"}}> + <Cropper src={tempImgURL} crop={crop} circularCrop={true} update={updateAvatar}/> + </div> + </EditarDiv> + <FooterButtonsDiv> + <ButtonCancelar>ESCOLHER OUTRA</ButtonCancelar> + <div> + <ButtonCancelar onClick={props.handleClose}>CANCELAR</ButtonCancelar> + <ButtonConfirmar onClick={() => {completeSelection()}}>SELECIONAR FOTO</ButtonConfirmar> + </div> + </FooterButtonsDiv> + </> + ] + ) + : + ( + [ + <> + <ChooseImage + avatar={props.userAvatar === '' || props.userAvatar == null ? Profile : `${apiDomain}` + props.userAvatar} + handleFile={handleFile} + handleClose={props.handleClose} + tempImg={tempImgURL} + /> + </> + ] + ) + } + </DialogDiv> + </ModalDiv> + ) + +} + +const FooterButtonsDiv = styled.div` + padding : 0 30px 20px; + display : flex; + flex-direction : row; + align-content : center; + justify-content : space-between; + Button { + margin-top : 20px; + } +` + +const TextoEditarDiv = styled.div` + margin-bottom : 15px; + align-self : center; + text-align : center; + font-size : 15px; +` + +const EditarDiv = styled.div` + position : relative; + background-color : #f4f4f4; + padding : 20px 30px 40px; +` + +const ChangeAvatarDiv = styled.div` + color : rgba(255,255,255,.7); + background-color:rgba(0,0,0,.5); + position: absolute; + bottom: 0; + width: inherit; + text-align: center; + font-size: 18px; + padding-bottom: 5px; + font-weight: 400; + height: 30%; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; +` + +const ModalDiv = styled.div` + background-color : #fff; + border-radius : 4px; + min-width : 560px; + color : #666; + display: flex; + flex-direction : column; + @media screen and (max-width: 959px) { + height : 100%; + width : 100%; + } +` +const ButtonConfirmar = styled(Button)` + background-color : #00bcd4 !important; + color : #fff !important; + border-radius : 3px !important; +` + +const ButtonCancelar = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + background-color : #fff !important; + color : #666 !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; +` + +const ButtonsDiv = styled.div` +display : flex; +justify-content:flex-end; +` + +const AvatarCircleDiv = styled.div` +margin-bottom : 0; +border-radius : 50%; +height : 150px; +width : 150px; +position : relative; +overflow: hidden; +` + +const DivFlowHolder =styled.div` +align-self : auto; +` + +const DivAlterarFoto = styled.div` +display : flex; +margin-bottom : 30px; +flex-direction : row; +align-items : center; +justify-content :center; +` + +const DialogDiv = styled.div` +padding : 20px 30px; +overflow : visible !important; +` + +const HeaderDiv = styled.div` +display : flex; +flex-direction : row; +align-items : center; +align-content : center; +justify-content : space-between; +max-width : 100%; +` +const StyledH2 = styled.h2` +font-size : 26px; +font-weight : normal; +margin-top : 20px; +margin-bottom : 10px; +font-family: inherit; +line-height: 1.1; +color: inherit; +` +const StyledCloseModalButton = styled(Button)` +display : inline-block; +position : relative; +float : right !important; +background : transparent !important; +min-width: 0 !important; +width : 40px; +border-radius : 50%; +padding : 8px; +height : 40px; +margin : 0 6px; +` diff --git a/src/Components/ModalAlterarAvatar/ModalAlterarAvatar.js b/src/Components/ModalAlterarAvatar/ModalAlterarAvatar.js new file mode 100644 index 0000000000000000000000000000000000000000..735832040ab11c6b79e7f969bb554e42a514ebfe --- /dev/null +++ b/src/Components/ModalAlterarAvatar/ModalAlterarAvatar.js @@ -0,0 +1,62 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import ComponentAlterarAvatar from './ComponentAlterarAvatar.js' + +const StyledModal = styled(Modal)` + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; +` + +export default function ModarAlterarAvatar (props){ + + return ( + + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open} style={{ transitionDelay :"0.4ms"}}> + + <ComponentAlterarAvatar + userAvatar={props.userAvatar} + handleClose={props.handleClose} + id={props.id} + /> + </Fade> + </StyledModal> + + ) +} diff --git a/src/Components/ModalAlterarCover/ComponentAlterarCover.js b/src/Components/ModalAlterarCover/ComponentAlterarCover.js new file mode 100644 index 0000000000000000000000000000000000000000..a4059ecfa2e5c180382a354f92728e19217198ee --- /dev/null +++ b/src/Components/ModalAlterarCover/ComponentAlterarCover.js @@ -0,0 +1,178 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useContext, useState} from 'react'; +import { Button } from '@material-ui/core'; +import styled from 'styled-components' +import {Store} from '../../Store.js' +import CloseIcon from '@material-ui/icons/Close'; +import Cropper from '../Cropper.js' +import {putRequest} from '../HelperFunctions/getAxiosConfig' + +export default function ComponentAlterarCover (props) { + const {state, dispatch} = useContext(Store) + + // eslint-disable-next-line + const [tempImgURL, setTempImg] = useState(props.cover) + const [newCover, setNewCover] = useState('') + const updateCover = (cover) => {setNewCover(cover)} + const [crop] = useState({ + unit: "%" , + width : 100, + aspect: 16 / 9 + }); + + function handleSuccess (data) { + const target = state.currentUser + const source = {cover : data.cover} + dispatch({ + type : 'USER_CHANGED_COVER', + currUser : Object.assign(target, source) + }) + props.handleClose() + } + + const completeSelection = () => { + const url = `/users/${props.id}` + + //newCover is a base64 encoded image file. + let fdCover = new FormData() + fdCover.set('user[cover]', newCover) + + putRequest(url, fdCover, handleSuccess, (error) => {console.log(error)}) + } + + return ( + <ModalDiv> + <HeaderDiv> + <span style={{width:"32px"}}/> + <StyledH2>Editar Capa do Perfil</StyledH2> + <StyledCloseModalButton onClick={props.handleClose}> + <CloseIcon style={{color : "#666"}}/> + </StyledCloseModalButton> + </HeaderDiv> + <DialogDiv> + <EditarDiv> + <TextoEditarDiv> + Clique nos Ãcones e arraste para selecionar a parte que você quer da foto + </TextoEditarDiv> + <div style={{maxWidth : "500px", maxHeight : "300px"}}> + <Cropper src={tempImgURL} crop={crop} update={updateCover}/> + </div> + </EditarDiv> + <FooterButtonsDiv> + <ButtonCancelar>ESCOLHER OUTRA</ButtonCancelar> + <div> + <ButtonCancelar onClick={props.handleClose}>CANCELAR</ButtonCancelar> + <ButtonConfirmar onClick={() => {completeSelection()}}>SELECIONAR FOTO</ButtonConfirmar> + </div> + </FooterButtonsDiv> + </DialogDiv> + </ModalDiv> + ) + +} + +const ButtonCancelar = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + background-color : #fff !important; + color : #666 !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; +` +const ButtonConfirmar = styled(Button)` + background-color : #00bcd4 !important; + color : #fff !important; + border-radius : 3px !important; +` + +const FooterButtonsDiv = styled.div` + padding : 0 30px 20px; + display : flex; + flex-direction : row; + align-content : center; + justify-content : space-between; + Button { + margin-top : 20px; + } +` + + +const TextoEditarDiv = styled.div` + margin-bottom : 15px; + align-self : center; + text-align : center; + font-size : 15px; +` + +const EditarDiv = styled.div` + position : relative; + background-color : #f4f4f4; + padding : 20px 30px 40px; +` + +const ModalDiv = styled.div` +background-color : #fff; +border-radius : 4px; +min-width : 560px; +color : #666; +display: flex; +flex-direction : column; +@media screen and (max-width: 959px) { + height : 100%; + width : 100%; +} +` + +const DialogDiv = styled.div` +padding : 20px 30px; +overflow : visible !important; +` + +const HeaderDiv = styled.div` +display : flex; +flex-direction : row; +align-items : center; +align-content : center; +justify-content : space-between; +max-width : 100%; +` +const StyledH2 = styled.h2` +font-size : 26px; +font-weight : normal; +margin-top : 20px; +margin-bottom : 10px; +font-family: inherit; +line-height: 1.1; +color: inherit; +` +const StyledCloseModalButton = styled(Button)` +display : inline-block; +position : relative; +float : right !important; +background : transparent !important; +min-width: 0 !important; +width : 40px; +border-radius : 50%; +padding : 8px; +height : 40px; +margin : 0 6px; +` diff --git a/src/Components/ModalAlterarCover/ModalAlterarCover.js b/src/Components/ModalAlterarCover/ModalAlterarCover.js new file mode 100644 index 0000000000000000000000000000000000000000..7e971f5806c6cee5239b1b480cc166c5b31b05a3 --- /dev/null +++ b/src/Components/ModalAlterarCover/ModalAlterarCover.js @@ -0,0 +1,62 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import ComponentAlterarCover from './ComponentAlterarCover.js' + +const StyledModal = styled(Modal)` + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; +` + +export default function ModarAlterarCover (props){ + + return ( + + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open} style={{ transitionDelay :"0.4ms"}}> + + <ComponentAlterarCover + cover={props.cover} + handleClose={props.handleClose} + id={props.id} + /> + </Fade> + </StyledModal> + + ) +} diff --git a/src/Components/ModalAvaliarRecurso.js b/src/Components/ModalAvaliarRecurso.js new file mode 100644 index 0000000000000000000000000000000000000000..7795876d0203a82bac0c05ddbb531773b505c39e --- /dev/null +++ b/src/Components/ModalAvaliarRecurso.js @@ -0,0 +1,349 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react'; +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import Radio from '@material-ui/core/Radio'; +import FormControl from '@material-ui/core/FormControl'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import CloseModalButton from './CloseModalButton' +import Snackbar from '@material-ui/core/Snackbar'; +import TextField from '@material-ui/core/TextField'; +import { withStyles } from '@material-ui/core/styles'; +import { getRequest } from './HelperFunctions/getAxiosConfig' +import LoadingSpinner from '../Components/LoadingSpinner' + +const StyledRadio = withStyles({ + root: { + color: '#666', + '&$checked': { + color: '#ff7f00', + }, + }, + checked: {}, +})((props) => <Radio color="default" {...props} />); + +export default function ModalAvaliarRecurso(props) { + + const [options, setOptions] = useState([]) + + const [avaliacao, setAvaliacao] = useState([null, null, null, null]) + + const handleRadios = (event, id) => { + let newValue = avaliacao + newValue[id - 1] = (event.target.value === "Sim" ? true : false) + setAvaliacao(newValue) + + if (avaliacao.indexOf(null) === -1) { + toggleDisableButton(false) + } + } + + const [justificativa, setJustificativa] = useState("") + const handleChangeJustificativa = (e) => { + setJustificativa(e.target.value) + } + + const [snackbarCancelar, toggleSnackbarCancelar] = useState(false) + const handleSnackbarCancelar = (value) => toggleSnackbarCancelar(value) + + const handleCancel = () => { + handleSnackbarCancelar(true) + + props.handleClose() + } + + const [buttonDisabled, toggleDisableButton] = useState(true) + + const handleAvaliar = () => { + let criteria = options + avaliacao.map((criterium, index) => + criteria[index]['accepted'] = !criterium + ) + props.confirm(criteria, justificativa, avaliacao.filter((item) => item === true).length > 0 ? false : true) + returnToDefault() + } + + const returnToDefault = () => { + setAvaliacao([null, null, null, null]) + setJustificativa('') + toggleDisableButton(true) + } + + useEffect(() => { + getRequest( + "/questions", + (data, header) => { + const cpyOption = [] + const cpyAvaliacao = [] + for (let index = 0; index < data.length; index++) { + const option = data[index]; + cpyOption.push({ + text: option.description, + id: option.id + }) + cpyAvaliacao.push(null) + } + setOptions(cpyOption) + setAvaliacao(cpyAvaliacao) + }, + (error) => { + + } + ) + }, []) + + return ( + <> + <Snackbar open={snackbarCancelar} autoHideDuration={1000} onClose={toggleSnackbarCancelar} + anchorOrigin={{ vertical: 'top', horizontal: 'right' }} + message="Você cancelou a avaliação deste recurso." + /> + { + options ? + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + + <Fade in={props.open}> + <Container> + <Header> + <h2>Você está avaliando o recurso + <span style={{ fontWeight: "bolder" }}> {props.title}</span> + </h2> + <CloseModalButton handleClose={props.handleClose} /> + </Header> + + <Content> + <Grid container> + <Grid item xs={12}> + <p>Esse recurso está em conformidade com os critérios? Marque as opções e justifique aquela(s) que não estiverem em conformidade.</p> + </Grid> + + <FormControl component="fieldset" style={{ display: "BlockRuby" }} fullWidth={true}> + { + options.map((option) => + <Grid item xs={12} key={option.id} style={{ paddingTop: "10px" }}> + <Grid container> + <Grid item xs={10}> + <div style={{ height: "100%", display: "flex", alignItems: "center" }}> + <p>{option.text}</p> + </div> + </Grid> + <Grid item xs={2}> + <RadioGroup row onChange={(e) => { handleRadios(e, option.id) }}> + <FormControlLabel value={"Sim"} control={<StyledRadio />} label="Não" /> + <FormControlLabel value={"Não"} control={<StyledRadio />} label="Sim" /> + </RadioGroup> + </Grid> + </Grid> + </Grid> + ) + } + </FormControl> + + <Grid item xs={12}> + <FormControl style={{ width: "100%", height: "100px" }}> + <StyledTextField + id={"title-form"} + label={"Justificativa (opcional)"} + type={"text"} + value={justificativa} + onChange={e => { handleChangeJustificativa(e) }} + multiline + fullWidth + /> + </FormControl> + </Grid> + + <Grid item xs={12}> + <ButtonsDiv> + <ButtonEnviarAvaliar disabled={buttonDisabled} onClick={() => { handleAvaliar() }}>ENVIAR AVALIAÇÂO</ButtonEnviarAvaliar> + <GreyButton onClick={() => { handleCancel() }}>CANCELAR</GreyButton> + </ButtonsDiv> + </Grid> + </Grid> + </Content> + + </Container> + </Fade> + </StyledModal> + : + <LoadingSpinner /> + } + </> + ) +} + +const Content = styled.div` + padding : 10px 75px 0 75px; + overflow : visible; + max-width : 100%; + color : #666; + font-size : 16px; + + .main-content-text { + font-size : 15px; + line-height : 22px; + text-align : justify; + } + + p { + text-align : start; + margin : 0 0 10px; + } +` + +const Header = styled.div` + display : flex; + flex-direction : row; + padding : 20px 75px 0 75px; + align-items : center; + justify-content : space-between; + color : #666; + + @media screen and (min-width : 990px) { + height : 64px; + } + @media screen and (max-width : 989px) { + max-height : none; + } + + h2 { + font-size : 26px; + font-weight : lighter; + + } +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const Container = styled.div` + box-sizing : border-box; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); + background-color : #fff; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + border-radius : 4px; + max-width : 100%; + + @media screen and (max-width : 699px) { + overflow : scroll; + width : 100%; + height : 100%; + } + + p { + margin : 0 0 10px; + } +` +const StyledTextField = styled(TextField)` + font-size : 14px; + width : 100% !important; + full-width : 100% !important; + + .MuiFormControl-root { + margin : 18px 0 !important; + } + + label.Mui-focused { + color : #ff7f00; + } + + label.Mui-focused.Mui-error { + color : red; + } + + .MuiInput-underline::after { + border-bottom: 2px solid #ff7f00; + } +` + +const ButtonsDiv = styled.div` + display : flex; + max-width : 100%; + text-align : start; + align-items : center; + padding : 0 0 20px 0; + + @media screen and (min-width : 990px) { + flex-direction : row; + } + @media screen and (max-width : 989px) { + flex-direction : column; + } +` +const GreyButton = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + max-height : 36px !important; + + background-color : transparent !important; + color : #666 !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; + font-weight : 600 !important; + + +` + +const ButtonEnviarAvaliar = styled(Button)` + color : ${(props) => props.disabled ? "rgba(0,0,0,0.38)" : "rgba(255,255,255,0.87) !important"}; + box-shadow : ${(props) => props.disabled ? "none !important" : "0 2px 5px 0 rgba(0,0,0,.26) !important"}; + font-weight : 600 !important; + background-color : ${(props) => props.disabled ? "#e9e9e9 !important" : "#ff7f00 !important"}; + margin-left : 8px !important; + margin-right : 8px !important; + + .MuiButton-label { + padding-left : 32px !important; + padding-right : 32px !important; + } +` diff --git a/src/Components/ModalConfirmarCuradoria.js b/src/Components/ModalConfirmarCuradoria.js new file mode 100644 index 0000000000000000000000000000000000000000..046106be576a7eea000031277db1c74a2f74df55 --- /dev/null +++ b/src/Components/ModalConfirmarCuradoria.js @@ -0,0 +1,243 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import CloseModalButton from './CloseModalButton' +import { postRequest } from './HelperFunctions/getAxiosConfig' + +export default function ModalConfirmarCuradoriaOpen(props) { + + const handleCancel = () => { + props.handleClose() + props.cancel() + } + + const transformReportCriteria = (criteria) => { + let newArr = [] + criteria.map((criterium) => + newArr.push({ "question_id": criterium.id, "accepted": criterium.accepted }) + ) + return newArr + } + + function handleSuccess(data) { + props.finalizeCuratorshipFlow() + } + const handleConfirmation = () => { + const url = `/submissions/${props.recursoId}/answer` + + let payload = { + "submission": { + "justification": props.justificativa, + "answers": transformReportCriteria(props.reportCriteria) + } + } + postRequest( + url, + payload, + handleSuccess, + (error) => { + props.handleErrorAprove() + } + ) + } + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <Container recusado={!props.aceito}> + <Header> + <span style={{ width: "32px" }} /> + <h2>Recurso a ser {props.aceito ? 'aprovado' : 'recusado'}</h2> + <CloseModalButton handleClose={props.handleClose} /> + </Header> + <Content> + { + props.aceito ? + ( + <p>Este recurso será publicado na plataforma. Você confirma essa avaliação? + </p> + ) + : + ( + <> + <p>Agradecemos a sua contribuição. Você avaliou que o recurso não está em conformidade com o(s) seguinte(s) critério(s): + </p> + { + props.reportCriteria.filter((criterium) => criterium.accepted === false).map((criterium) => + <p key={criterium.id} className="reason-offensive">{criterium.text}</p> + ) + } + <p>Você confirma essa avaliação? Ao confirmar, o recurso não será publicado na plataforma.</p> + </> + ) + } + <ButtonsDiv> + { + props.aceito ? + ( + <ButtonEnviarAvaliar onClick={() => { handleConfirmation() }}>SIM, CONFIRMAR</ButtonEnviarAvaliar> + ) + : + ( + <ButtonEnviarAvaliar onClick={() => { handleConfirmation() }}>SIM, CONFIRMAR</ButtonEnviarAvaliar> + ) + } + <GreyButton onClick={handleCancel}>NÃO, ALTERAR AVALIAÇÃO</GreyButton> + </ButtonsDiv> + </Content> + </Container> + </Fade> + </StyledModal> + ) +} + + +const Content = styled.div` + padding : 30px; + overflow : visible; + max-width : 100%; + color : #666; + font-size : 16px; + text-align : start; + .reason-offensive { + font-weight : 700; + } + + p { + margin : 0 0 10px; + } +` + +const Header = styled.div` + display : flex; + flex-direction : row; + align-items : center; + max-height : none; + justify-content : space-between; + color : #666; + + h2 { + font-size : 30px; + margin-top : 20px; + margin-bottom : 10px; + font-weight : lighter; + } +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const Container = styled.div` + box-sizing : border-box; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); + background-color : #fff; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + position : relative; + border-radius : 4px; + max-width : 100%; + max-height : ${props => props.recusado ? 'none' : '370px'}; + + @media screen and (max-width : 699px) { + overflow : ${props => props.recusado ? 'scroll' : 'visible'}; + width : 100%; + height : 100%; + } + + p { + margin : 0 0 10px; + } +` +const ButtonsDiv = styled.div` + display : flex; + max-width : 100%; + text-align : center; + align-items : center; + justify-content : center; + padding-top : 20px; + + @media screen and (min-width : 990px) { + flex-direction : row; + } + @media screen and (max-width : 989px) { + flex-direction : column; + } +` +const GreyButton = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + max-height : 36px !important; + + background-color : transparent !important; + color : #666 !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; + font-weight : 600 !important; + .MuiButton-label { + padding-left : 16px !important; + padding-right : 16px !important; + } + @media screen and (max-width : 989px) { + margin-top : 10px !important; + } +` + +const ButtonEnviarAvaliar = styled(Button)` + color : rgba(255,255,255,0.87) !important; + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + font-weight : 600 !important; + background-color : #ff7f00 !important; + margin-left : 8px !important; + margin-right : 8px !important; + + .MuiButton-label { + padding-left : 16px !important; + padding-right : 16px !important; + } +` diff --git a/src/Components/ModalConfirmarUnfollow.js b/src/Components/ModalConfirmarUnfollow.js new file mode 100644 index 0000000000000000000000000000000000000000..7d349e085ec89cac173286a5406a810cc08d04dd --- /dev/null +++ b/src/Components/ModalConfirmarUnfollow.js @@ -0,0 +1,117 @@ +import React from 'react'; +import Modal from '@material-ui/core/Modal'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import { Button } from '@material-ui/core'; +import Backdrop from '@material-ui/core/Backdrop'; +import CloseModalButton from './CloseModalButton' + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const HeaderDiv = styled.div` + display : flex; + flex-direction : row; + align-items : center; + text-align : center; + margin : 20px 30px; + + h3 { + font-size : 24px; + margin-top : 20px; + margin-bottpm : 10px + font-weight : normal; + color : #666 + } +` +const ContentContainer = styled.div` + box-sizing : border-box; + background-color : white; + max-width : none; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + padding : 10px; + border-radius : 4px; + color : #666; + + @media screen and (max-width : 899px) { + width : 100%; + max-height : 600px; + } +` +const ButtonCancelar = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + background-color : #fff !important; + color : #666 !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; +` + +const ButtonConfirmar = styled(Button)` + background-color : #00bcd4 !important; + color : #fff !important; + border-radius : 3px !important; +` + +export default function ModalConfirmarUnfollow (props) { + const text = { + header : "Tem certeza que deseja deixar de seguir este usuário?", + explanation : "Este usuário deixará de fazer parte da sua rede." + } + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <ContentContainer> + <HeaderDiv> + <span style={{width:"32px"}}/> + <h3> + {text.header} + </h3> + <CloseModalButton handleClose={props.handleClose}/> + </HeaderDiv> + <div style={{display : "flex", flexDirection : "column", padding : "20px 30px"}}> + <div style={{marginTop : "0", textAlign : "center", marginBottom : "20px"}}> + <span style={{fontSize : "14px", color : "#666"}}>{text.explanation}</span> + </div> + <div style={{display : "flex", flexDirection : "row", justifyContent: "space-evenly"}}> + <ButtonCancelar onClick={props.handleClose}>CANCELAR</ButtonCancelar> + <ButtonConfirmar onClick={props.handleConfirm}>DEIXAR DE SEGUIR </ButtonConfirmar> + </div> + </div> + </ContentContainer> + </Fade> + + </StyledModal> + ) + +} diff --git a/src/Components/ModalEditarColecao.js b/src/Components/ModalEditarColecao.js new file mode 100644 index 0000000000000000000000000000000000000000..bd8511f2d867bd1bd45198e086c11dd788ad0f99 --- /dev/null +++ b/src/Components/ModalEditarColecao.js @@ -0,0 +1,119 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import CloseModalButton from './CloseModalButton' +import EditarColecaoForm from './EditarColecaoForm.js' +export default function ModalEditarColecao (props) { + + function finalize (newName, newPrivacy) { + props.changeColName(newName) + props.changeColPrivacy(newPrivacy) + props.handleClose() + } + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <Container> + <Header> + <span style={{width:"32px"}}/> + <h2>Editar Coleção</h2> + <CloseModalButton handleClose={props.handleClose} id={props.id}/> + </Header> + <Content style={{paddingTop : "0"}}> + <EditarColecaoForm id={props.id} handleClose={props.handleClose} finalize={finalize}/> + </Content> + </Container> + </Fade> + </StyledModal> + ) +} + +const Content = styled.div` + padding : 20px 30px; + overflow-y: visible; + +` + +const Header = styled.div` + display : flex; + flex-direction : row; + padding : 10px 26px 0 26px; + align-items : center; + justify-content : space-between; + height : 64px; + + h2 { + font-size : 26px; + font-weight : lighter; + color : #666 + } +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const Container = styled.div` + box-sizing : border-box; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); + background-color : white; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + padding : 10px; + border-radius : 4px; + + @media screen and (min-width : 96px) { + width : 500px; + } + + @media screen and (max-width : 699px) { + width : 100%; + height : 100%; + } +` diff --git a/src/Components/ModalExcluirColecao.js b/src/Components/ModalExcluirColecao.js new file mode 100644 index 0000000000000000000000000000000000000000..f23b819d88584a3ee2fab19dd94bf3935c90b782 --- /dev/null +++ b/src/Components/ModalExcluirColecao.js @@ -0,0 +1,150 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import GreyButton from './GreyButton.js' +import PurpleButton from './PurpleButton.js' +import SnackbarComponent from './SnackbarComponent' +import {deleteRequest} from './HelperFunctions/getAxiosConfig' + +export default function ModalExcluirColecao (props) { + const [snackbarOpen, toggleSnackbar] = useState(false) + + function handleDeleteSuccess (data) { + toggleSnackbar(true) + props.removeColl(props.id) + props.handleClose() + } + const handleDelete = () => { + const url = `/collections/${props.id}` + + deleteRequest(url, handleDeleteSuccess, (error) => {console.log(error)}) + } + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <> + <SnackbarComponent snackbarOpen={snackbarOpen} severity={"info"} handleClose={() => {toggleSnackbar(false)}} text={"Coleção excluÃda com sucesso"}/> + <Container> + <Header> + <h2>Tem certeza que deseja excluir esta Coleção?</h2> + </Header> + + <Content> + <p>A exclusão de uma coleção é permanente. Não é possÃvel desfazer.</p> + <ButtonsDiv> + <GreyButton + callback={props.handleClose} + text={"CANCELAR"} + /> + <PurpleButton + callback={handleDelete} + text={"EXCLUIR"} + /> + </ButtonsDiv> + </Content> + </Container> + </> + </Fade> + </StyledModal> + ) +} + +const ButtonsDiv = styled.div` + display : flex; + align-items : center; + align-content : center; + justify-content : space-evenly; + padding-top : 20px; + +` + +const Content = styled.div` + padding : 10px 30px 20px; + overflow : visible; + display : flex; + flex-direction : column; + + p { + margin : 0 0 10px; + } +` + +const Header = styled.div` + display : flex; + flex-direction : row; + align-items : center; + text-align : center; + margin : 20px 30px; + + h2 { + font-size : 26px; + font-weight : lighter; + color : #666 + } +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const Container = styled.div` + box-sizing : border-box; + background-color : white; + max-width : none; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + padding : 10px; + border-radius : 4px; + color : #666; + + @media screen and (max-width : 899px) { + width : 100%; + max-height : 600px; + } +` diff --git a/src/Components/ModalExcluirComentario.js b/src/Components/ModalExcluirComentario.js new file mode 100644 index 0000000000000000000000000000000000000000..1345ee369a1471558274f42c3d6574c92122dfdb --- /dev/null +++ b/src/Components/ModalExcluirComentario.js @@ -0,0 +1,101 @@ +import React from 'react'; +import Modal from '@material-ui/core/Modal'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import { Button } from '@material-ui/core'; +import Backdrop from '@material-ui/core/Backdrop'; + +const StyledModal = styled(Modal)` + margin : 0 !important; + margin-left : 0 !important; + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + border-radius : 4px; + max-width : none; + max-height : none; + min-width: 150px; + min-height: 150px !important; +` + +const HeaderDiv = styled.div` + width : 100%; + max-width : 100%; + display : flex; + align-items : center; + align-content : center; +` +const ContentContainer = styled.div` + box-sizing : border-box; + background-color : white; + max-width : none; + min-wdith : 240px; + align : center; + border-radius : 4px; + font-family : 'Roboto', sans serif; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)!important; +` +const ButtonCancelar = styled(Button)` + background-color : rgba(158,158,158,0.2) !important; + color : #666 !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; + margin : 0 8px !important; + font-weight : 600 !important; +` + +const ButtonConfirmar = styled(Button)` + background-color : #ff7f00 !important; + color : #fff !important; + border-radius : 3px !important; + margin : 0 8px !important; + font-weight : 600 !important; +` + +export default function ModalExcluir (props) { + const text = { + header : "Tem certeza que deseja excluir este comentário?", + explanation : "A exclusão de um comentário é permanente. Não é possÃvel desfazer." + } + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <ContentContainer> + <HeaderDiv> + <h3 style={{fontSize : "24px", margin : "20px 15px 10px", fontWeight : "normal"}}> + {text.header} + </h3> + </HeaderDiv> + <div style={{display : "flex", flexDirection : "column", padding : "20px 30px"}}> + <div style={{marginTop : "0", textAlign : "center", marginBottom : "20px"}}> + <span style={{fontSize : "14px", color : "#666"}}>{text.explanation}</span> + </div> + <div style={{display : "flex", flexDirection : "row", justifyContent: "center"}}> + <ButtonCancelar onClick={props.handleClose}>CANCELAR</ButtonCancelar> + <ButtonConfirmar onClick={props.handleConfirm}> EXCLUIR </ButtonConfirmar> + </div> + </div> + </ContentContainer> + </Fade> + + </StyledModal> + ) + +} + diff --git a/src/Components/ModalLearningObjectPublished.js b/src/Components/ModalLearningObjectPublished.js new file mode 100644 index 0000000000000000000000000000000000000000..566460be99d3b1880e179745f8777fb7a9f94a56 --- /dev/null +++ b/src/Components/ModalLearningObjectPublished.js @@ -0,0 +1,224 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; +import Facebook from '../img/facebook.svg' +import Twitter from '../img/twitter.svg' +import LinkIcon from '../img/link_icon.svg' +import CloseModalButton from './CloseModalButton.js' + +export default function ModalLearningObjectPublished (props) { + // const refContainer = useRef(props.link); + + // function copyToClipboard(e) { + // let copyText = document.getElementById('p-text') + // console.log(copyText) + // }; + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <Container> + <Header> + <span style={{width:"32px"}}/> + <h2>O seu recurso foi para a curadoria!</h2> + <CloseModalButton handleClose={props.handleClose}/> + </Header> + + <Content > + <Grid container> + <Grid item xs={4} style={{paddingRight : "15px", paddingLeft : "15px"}}> + <div className="backgroundImg"/> + </Grid> + <Grid item xs={8} style={{paddingRight : "15px", paddingLeft : "15px", paddingTop : "20px"}}> + <div className="main-content-text"> + <p>Seu recurso estará disponÃvel na plataforma após a avaliação da curadoria. Você receberá notificações sempre que alguém favoritar, compartilhar e relatar experiência com o Recurso.</p> + </div> + </Grid> + </Grid> + </Content> + <ShareContainer> + <p>Gostaria de convidar o seus amigos para conhecer o recurso?</p> + <p>Compartilhe nas redes sociais:</p> + <div className="logos-shared"> + <a + href={"https://www.facebook.com/sharer/sharer.php?u=https://plataformaintegrada.mec.gov.br/recurso/" + props.draftID} + rel="noreferrer" + target="_blank"> + <ShareButton> + <img src={Facebook} alt="facebook-logo"/> + </ShareButton> + </a> + + <a + href={"https://www.twitter.com/intent/tweet?url=https://plataformaintegrada.mec.gov.br/recurso/" + props.draftID} + rel="noreferrer" + target="_blank"> + <ShareButton> + <img src={Twitter} alt="twitter-logo"/> + </ShareButton> + </a> + + <ShareButton > + <img src={LinkIcon} alt="link-icon"/> + </ShareButton> + </div> + </ShareContainer> + </Container> + </Fade> + </StyledModal> + ) +} + +const ShareButton = styled(Button)` + text-align :center; + margin : 0 !important; + + .MuiButton-label { + display : flex !important; + flex-direction : column !important; + justify-content : center !important; + font-weight : 700 !important; + } + + img { + height : 50px; + width : 50px; + padding-top : 10px; + vertical-align : middle; + } + + p { + margin : 0 0 10px; + } +` + +const ShareContainer = styled.div` + padding-top : 20px; + background-color : #f1f1f1; + width : 100%; + height : 215px; + font-size : 18px; + line-height : 30px; + text-align : center; + max-width : 600px; + color : #666; + border-radius : 4px; + + .logos-shared { + font-size : 18px; + line-height : 30px; + text-align : center; + display : flex; + flex-direction : row; + justify-content : center; + } +` + +const Content = styled.div` + padding : 20px 30px; + overflow : visible; + max-width : 600px; + color : #666; + + .backgroundImg { + background-image : url(https://plataformaintegrada.mec.gov.br/img/Publicar.png); + width : 145px; + height : 125px; + background-repeat : no-repeat; + background-size : contain; + margin : 0; + } + + .main-content-text { + font-size : 15px; + line-height : 22px; + text-align : justify; + } +` + +const Header = styled.div` + display : flex; + flex-direction : row; + padding : 10px 26px 0 26px; + align-items : center; + justify-content : space-between; + height : 64px; + + h2 { + font-size : 26px; + font-weight : lighter; + color : #666 + } +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const Container = styled.div` + box-sizing : border-box; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); + background-color : #fff; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + border-radius : 4px; + + @media screen and (min-width : 700px) { + max-width : 600px; + } + + @media screen and (max-width : 699px) { + width : 100%; + height : 100%; + } + + p { + margin : 0 0 10px; + } +` diff --git a/src/Components/ModalVideoApresentacao.js b/src/Components/ModalVideoApresentacao.js new file mode 100644 index 0000000000000000000000000000000000000000..286cdf69dd9c4bf42c8e94c9a84a8010d0f4091e --- /dev/null +++ b/src/Components/ModalVideoApresentacao.js @@ -0,0 +1,78 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components'; + +export default function ModalVideoApresentacao (props) { + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <VideoContainer> + <iframe + title="Video Apresentação" + src="https://www.youtube.com/embed/gejBqyfJr9A" width="560" height="315" + frameBorder="0" allowFullScreen className="video" + /> + </VideoContainer> + </Fade> + </StyledModal> + ) +} + +const VideoContainer = styled.div` + position : relative; + width : 70%; + height : 70%; + + .video { + width : 100%; + height : 100%; + position : absolute; + top : 0; + left : 0; + } +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` diff --git a/src/Components/Notifications.js b/src/Components/Notifications.js index 069b9770f95df55164bd7773cbba3fb4521eb3df..c8fbe2ae21be7c1b7897c603034785e9e345e2b9 100644 --- a/src/Components/Notifications.js +++ b/src/Components/Notifications.js @@ -15,14 +15,21 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {useContext} from 'react'; +import React, { useState, useEffect } from 'react'; import NotificationsIcon from '@material-ui/icons/Notifications'; import { Button } from '@material-ui/core'; import Badge from '@material-ui/core/Badge'; import styled from 'styled-components' -import Dropdown from './Dropdown'; +import Menu from '@material-ui/core/Menu'; +import { apiDomain } from '../env.js' +import ActivityListItem from './ActivityListItem.js' +import { getRequest, postRequest } from './HelperFunctions/getAxiosConfig.js' +import { withStyles } from '@material-ui/core/styles'; +import { Link } from 'react-router-dom' +import { getRecipientHref } from './Activities/getRecipientHref.js' +import SnackBar from '../Components/SnackbarComponent' -const StyledBadge = styled(Badge) ` +const StyledBadge = styled(Badge)` .MuiBadge-dot-45{ height : 9px ; width : 9px ; @@ -41,19 +48,218 @@ const StyledNotificationButton = styled(Button)` height : 56px !important; width : 56px !important; border-radius : 50% !important; - &&:hover { - color : #00bcd4; + &:hover { + color : #00bcd4 !important; } ` -export default function Notification (props) { +const StyledMenu = withStyles({ + paper: { + border: '1px solid #d3d4d5', + }, +})((props) => ( + <Menu + elevation={0} + getContentAnchorEl={null} + anchorOrigin={{ + horizontal: 'center', + vertical: "bottom", + }} + transformOrigin={{ + vertical: 'top', + horizontal: 'center', + }} + {...props} + /> +)); + +export default function Notification(props) { + const [anchorEl, setAnchorEl] = React.useState(null); + const [notifications, setNotifications] = useState([]); + const [snack, setSnack] = useState({ + open: false, + text: "", + severity: "", + color: "" + }); + // eslint-disable-next-line + const [notificatonsLength, setLength] = useState(0); + + function handleAxiosSuccess(data) { + if (data.errors) + setSnack({ + open: true, + text: "Erro ao buscar suas notificações", + severity: "error", + color: "red" + }) + else { + setNotifications(data) + setLength(data.length) + } + } + + function handleAxiosError(error) { + setSnack({ + open: true, + text: "Erro ao buscar suas notificações", + severity: "error", + color: "red" + }) + } + + + useEffect(() => { + getRequest('/feed?offset=0&limit=30', handleAxiosSuccess, handleAxiosError) + }, []) + + + function handleClick(event) { + console.log('event.currentTarget: ', event.currentTarget) + setAnchorEl(event.currentTarget); + } + + function handleClose() { + setAnchorEl(null); + } + + function handleClickNotification() { + const payload = { + "activities": { + "ids": [] + } + } + + for (let index = 0; index < notifications.length; index++) { + const notification = notifications[index]; + payload.activities.ids.push(notification.id) + } + + postRequest( + '/activities/view', + payload, + (data) => { + if (data.errors) + setSnack({ + open: true, + text: "Erro ao marcar as notificações como lidas!", + severity: "error", + color: "red" + }) + else { + setSnack({ + open: true, + text: "Todas as notificações foram marcadas como lidas!", + severity: "success", + color: "green" + }) + setNotifications([]) + } + }, + (error) => { + setSnack({ + open: true, + text: "Erro ao marcar as notificações como lidas!", + severity: "error", + color: "red" + }) + }, + ) + + + } return ( - <StyledNotificationButton> - <StyledBadge badgeContent="1" color="secondary" variant="dot" overlap="circle" classname="badge"> - <StyledNotificationsIcon/> - </StyledBadge> - </StyledNotificationButton> + <React.Fragment> + <SnackBar + snackbarOpen={snack.open} + handleClose={() => { + setSnack({ + open: false, + text: "", + severity: "", + color: "" + }) + }} + severity={snack.severity} + color={snack.color} + text={snack.text} + /> + <StyledNotificationButton onClick={handleClick}> + <StyledBadge badgeContent={1} color="secondary" variant="dot" overlap="circle" className="badge"> + <StyledNotificationsIcon /> + </StyledBadge> + </StyledNotificationButton> + <StyledMenu + id="simple-menu" + anchorEl={anchorEl} + keepMounted + open={Boolean(anchorEl)} + onClose={handleClose} + > + <ContainerDiv> + <div className="cabecalho"> + <span style={{ fontSize: "15px" }}>NOTIFICAÇÕES •</span> + <span className="cabecalho-marcar" onClick={handleClickNotification}>Marcar todas como lidas</span> + </div> + { + notifications.map((notification) => + (notification.viewed === false) && + <ActivityListItem + onMenuBar={true} + avatar={notification.owner.avatar ? apiDomain + notification.owner.avatar : null} + activity={notification.activity} + actionType={notification.trackable_type} + objectType={notification.recipient_type} + createdAt={notification.created_at} + ownerName={notification.owner.name} + ownerHref={'/perfil'} + recipientName={notification.recipient.name} + recipientHref={getRecipientHref(notification)} + /> + ) + } + <div style={{ padding: "0 15px", borderTop: "1px solid #dadada" }}> + <Link to="/perfil"> + <NoPadButton> + MOSTRAR TODAS + </NoPadButton> + </Link> + </div> + </ContainerDiv> + </StyledMenu> + </React.Fragment> ) } + +const NoPadButton = styled(Button)` + padding : 6px 0 !important; +` + +const ContainerDiv = styled.div` + margin-top : 10px; + right : 5%; + width : 360px; + max-height : 400px; + box-shadow : 8px 8px 8px 8px + rgba(0,0,0,.1); + overflow-y : scroll; + padding : 5px 5px 5px 5px; + min-width : 160px; + background-color : #f1f1f1; + + .cabecalho { + border-bottom : 1px solid #dadada; + padding : 10px 15px; + + .cabecalho-marcar { + font-family: Lato,bold; + font-size: 12px; + -webkit-text-decoration-line: underline; + text-decoration-line: underline; + float: right; + cursor: pointer;s + } + } +` diff --git a/src/Components/NotificationsInner.js b/src/Components/NotificationsInner.js new file mode 100644 index 0000000000000000000000000000000000000000..4630287968d81ff709a2fb3d4dd46e88ab70d38e --- /dev/null +++ b/src/Components/NotificationsInner.js @@ -0,0 +1,70 @@ +import React, {useState, useContext, useEffect} from 'react' +import styled from 'styled-components' +import {apiDomain} from '../env.js' +import ActivityListItem from './ActivityListItem.js' +import {getRequest} from './HelperFunctions/getAxiosConfig' + +export default function NotificationInner (props) { + const [notifications, setNotifications] = useState([]); + const [notificatonsLength, setLength] = useState(0); + + function handleSuccess (data) { + setNotifications(data) + setLength(data.length) + } + useEffect(() => { + const url = `/feed?offset=0&limit=30` + + getRequest(url, handleSuccess, (error) => {console.log('error while running getNotifications')}) + }, []) + + return ( + <ContainerDiv> + <div className="cabecalho"> + <span style={{fontSize : "15px"}}>NOTIFICAÇÕES •</span> + <span className="cabecalho-marcar">Marcar todas como lidas</span> + </div> + { + notifications.map( (notification) => + <ActivityListItem + onMenuBar={true} + avatar = {notification.owner.avatar ? apiDomain + notification.owner.avatar : null} + activity = {notification.activity} + actionType = {notification.trackable_type} + objectType = {notification.recipient_type} + createdAt = {notification.created_at} + ownerName = {notification.owner.name} + ownerHref = {'/usuario-publico/' + notification.owner.id} + recipientName = {notification.recipient.name} + /> + ) + } + </ContainerDiv> + + ) +} + +const ContainerDiv = styled.div` + margin-top : 10px; + right : 5%; + width : 360px; + max-height : 400px; + position : absolute; + box-shadow : 8px 8px 8px 8px + rgba(0,0,0,.1); + overflow-y : scroll; + padding : 5px 5px 5px 5px; + min-width : 160px; + + .cabecalho { + border-bottom : 1px solid #666; + + .cabecalho-marcar { + font-family: Lato,bold; + font-size: 12px; + -webkit-text-decoration-line: underline; + text-decoration-line: underline; + float: right; + } + } +` diff --git a/src/Components/PageProfessorComponents/ModalConfirmarProfessor.js b/src/Components/PageProfessorComponents/ModalConfirmarProfessor.js new file mode 100644 index 0000000000000000000000000000000000000000..f8bceee1e9452edcd3562d71f954d923a21d7d91 --- /dev/null +++ b/src/Components/PageProfessorComponents/ModalConfirmarProfessor.js @@ -0,0 +1,153 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import CloseIcon from '@material-ui/icons/Close'; + +const StyledModal = styled(Modal)` + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; +` + +export default function ModalConfirmarProfessor (props){ + return ( + + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open} style={{ transitionDelay :"0.4ms"}}> + <> + <ConfirmarProfessorComponent> + <HeaderDiv> + <span style={{width:"32px"}}/> + <h2>Confirme os Dados</h2> + <Button style={{marginRight:"-8px", color:"000"}} onClick={props.handleClose}> + <CloseIcon style={{color:"#666", cursor:"pointer", verticalAlign:"middle"}}/> + </Button> + </HeaderDiv> + + <DialogContentDiv> + <ContainerCentralized> + <p><strong>MunicÃpio - UF:</strong> {props.info.school_uf.name} - {props.info.school_city} </p> + <p><strong>Escola:</strong> {props.info.school_name}</p> + <p><strong>Telefone da Escola:</strong> {props.info.school_phone}</p> + <p><strong>Seu CPF:</strong> {props.info.teacher_cpf}</p> + <ButtonsDiv> + <ConfirmButton onClick ={props.confirmar}>CONFIRMAR</ConfirmButton> + <CancelButton onClick = {props.cancelar}>CANCELAR</CancelButton> + </ButtonsDiv> + </ContainerCentralized> + </DialogContentDiv> + </ConfirmarProfessorComponent> + </> + </Fade> + </StyledModal> + + ) +} + +const CancelButton = styled(Button)` + width : 140px !important; + color :#666 !important; + font-family : Roboto,sans-serif !important; + font-size : 14px !important; + font-weight : 500 !important; + height : 36px !important; + border-radius : 3px !important; + padding-left : 16px !important; + padding-right : 16px !important; + outline : none !important; + margin : 6px 8px !important; + display : inline-block !important; +` + +const ConfirmButton = styled(Button)` + width : 140px !important; + background-color : #00bcd4 !important; + color : #fff !important; + font-family : Roboto,sans-serif !important; + font-size : 14px !important; + font-weight : 500 !important; + height : 36px !important; + border-radius : 3px !important; + padding-left : 32px !important; + padding-right : 32px !important; + outline : none !important; + margin : 6px 8px !important; + display : inline-block !important; +` + +const ButtonsDiv = styled.div` + margin-top : 10px; + display : flex; + justify-content : center; +` + + +const ContainerCentralized = styled.div` + margin-top : 0; + padding-left : 20px; + padding-right : 30px; + + p { + font-size : 15px; + margin : 0 0 10px; + } +` + +const DialogContentDiv = styled.div` + padding : 20px 30px; + overflow : visible !important; +` + +const HeaderDiv = styled.div` + text-align : center; + display : flex; + justify-content : space-between; + padding : 10px 26px 0 26px; + + h2 { + font-size : 26px; + font-weight : lighter; + } +` + +const ConfirmarProfessorComponent = styled.div` + min-width : 600px; + border-radius : 4px; + background-color : #fff; + color : #666; +` diff --git a/src/Components/PageProfessorComponents/PartOne.js b/src/Components/PageProfessorComponents/PartOne.js new file mode 100644 index 0000000000000000000000000000000000000000..ad8fcf9a72464421bb2a467cd1c4b32aa9244db0 --- /dev/null +++ b/src/Components/PageProfessorComponents/PartOne.js @@ -0,0 +1,290 @@ +import React, {useState, useEffect} from 'react' +import styled from 'styled-components' +import Stepper from '../Stepper.js' +import FormControl from '@material-ui/core/FormControl'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; +import InputLabel from '@material-ui/core/InputLabel'; +import {Button} from '@material-ui/core' +import {RightSideStrikedH3, LeftSideStrikedH3} from '../LoginContainerFunction.js' +import Divider from '@material-ui/core/Divider'; +import {ButtonCancelar} from './PartTwo.js' +import axios from 'axios' +import FormInput from '../FormInput.js' + +export function sortDict (dict) { + const newDict = dict.sort((a, b) => (a.name) > (b.name) ? 1 : -1) + return newDict + +} + +const extractUFInfo = (ufs, name) => { + var id = '' + var abbreviation = '' + for (const obj of ufs) { + if (obj.name === name) { + id = obj.id + abbreviation = obj.abbreviation + } + } + return {id : id, abbreviation : abbreviation} +} + +export default function PartOne (props) { + //stores initial get response (list of states, sorted alphabetically) + const [ufList, setStates] = useState([]) + const handleSetStates = (states) => {setStates(states)} + + //stores list of cities sorted alphabetically + const [municipioList, setMunicipioList] = useState([]) + const handleSetMunicipioList = (municipios) => setMunicipioList(municipios) + + //stores a single user selected state + const [uf, setUF] = useState( + { + algumFoiEscolhido : false, + name : '', + abbreviation : '' + } + ) + + //stores a single user selected city + const [municipio, setMunicipio] = useState( + { + algumFoiEscolhido : false, + name : '' + } + ) + + const [codigoINEP, setCodigoINEP] = useState( + { + codigoInvalido : false, + value : '' + } + ) + + const handleCodigoINEP = (event) => { + const code = event.target.value + + setCodigoINEP({...codigoINEP, + codigoInvalido : false, + value : code + }) + } + + const validateINEP = () => { + const code = codigoINEP.value + + axios.get(('https://www.simcaq.c3sl.ufpr.br/api/v1/portal_mec_inep?filter=school_cod:' + code) + ).then( (response) => { + handleSubmit() + }, (error) => { + setCodigoINEP({...codigoINEP, + codigoInvalido : true, + value : '' + }) + } + ) + } + + const handleSubmit = () => { + props.handleBuscar(uf.abbreviation, uf.name, municipio.name, codigoINEP.value) + } + + //on render component, call simcaq api and update ufList + useEffect ( () => { + axios.get(('https://simcaq.c3sl.ufpr.br/api/v1/state') + ).then( (response) => { + console.log(sortDict(response.data.result)) + handleSetStates(sortDict(response.data.result)) + }, + (error) => console.log('erro acessando api do simcaq (estados)')) + }, []) + + const handleChooseUF = (event) => { + const ufName = event.target.value + const {id, abbreviation} = extractUFInfo(ufList, ufName) + console.log(id, abbreviation) + + setUF({...uf, + algumFoiEscolhido : true, + name : ufName, + abbreviation : abbreviation + } + ) + + axios.get(('https://simcaq.c3sl.ufpr.br/api/v1/city?filter=state:' + id) + ).then( (response) => { + handleSetMunicipioList(sortDict(response.data.result)) + }, (error) => console.log('erro acessando api do simcaq (cidades)') + ) + } + + const handleChooseCity = (event) => { + const cityName = event.target.value + console.log(cityName) + setMunicipio({...municipio, + algumFoiEscolhido : true, + name : cityName + } + ) + } + + return ( + <> + {/*/////////////////////////////PRIMEIRA PARTE/////////////////////////////*/} + <Content> + <h4>Vamos localizar o seu cadastro:</h4> + <Stepper items={props.stepper}/> + <form style={{textAlign:"start"}}> + <p>Localize pelo menos uma escola em que você tenha atuado até maio de 2017:</p> + <FormControl required style={{width:"100%"}}> + <InputLabel>Procure sua UF</InputLabel> + <Select + labelId="demo-simple-select-label" + id="demo-simple-select" + value={uf.name} + onChange={handleChooseUF} + > + { + ufList.map( (ufs)=> + <MenuItem key={ufs.name} value={ufs.name}>{ufs.name}</MenuItem> + ) + } + </Select> + </FormControl> + <FormControl required style={{width:"100%"}}> + <InputLabel>Busque o seu municÃpio</InputLabel> + <Select + labelId="demo-simple-select-label" + id="demo-simple-select" + value={municipio.name} + onChange={handleChooseCity} + > + { + municipioList.map( (cidades)=> + <MenuItem key={cidades.name} value={cidades.name}>{cidades.name}</MenuItem> + ) + } + </Select> + </FormControl> + <div style={{display:"flex", justifyContent:"center",paddingTop:"10px", paddingBottom:"10px"}}> + <ButtonConfirmar + onClick={ ( (uf.algumFoiEscolhido && municipio.algumFoiEscolhido) ? handleSubmit : '')} + > + BUSCAR</ButtonConfirmar> + </div> + </form> + </Content> + + <div style={{display:"flex", justifyContent:"center", alignItems:"center"}}> + <LeftSideStrikedH3/><StrikeSpan>ou</StrikeSpan><RightSideStrikedH3/> + </div> + + {/*/////////////////////////////SEGUNDA PARTE/////////////////////////////*/} + <Content> + <form> + <p>Localize pelo código INEP da escola:</p> + <FormControl required style={{width:"100%"}}> + <FormInput + inputType={'text'} + name={'Código INEP'} + value={codigoINEP.value} + handleChange = {handleCodigoINEP} + placeholder={'Código INEP'} + required={true} + error={codigoINEP.codigoInvalido} + help={codigoINEP.codigoInvalido ? <span style={{color:'red'}}>código INEP inválido</span> : ''} + > + </FormInput> + </FormControl> + <div style={{display:"flex", justifyContent:"center",paddingTop:"10px", paddingBottom:"10px"}}> + <ButtonConfirmar + onClick={validateINEP} + > + BUSCAR</ButtonConfirmar> + </div> + </form> + </Content> + <Divider/> + <ButtonsArea> + <ButtonCancelar onClick={props.handleCancelar}>CANCELAR VERIFICAÇÃO</ButtonCancelar> + </ButtonsArea> + </> + ) +} + +export const ButtonsArea = styled.div` + display : flex; + justify-content : center; + padding-top : 10px; + padding-bottom : 10px; +` + +const StrikeSpan = styled.span` + vertical-align : middle; + font-family : Roboto; + font-style : normal; + font-weight : 500; + line-height : 22px; + font-size : 15px; + letter-spacing : .01em; +` + +export const Content = styled.div` + margin-top : 16px; + margin-bottom : 16px; + margin-right : 10%; + margin-left : 10%; + + h4 { + text-align : center; + magin-bottom : 20px; + font-family: Roboto; + font-style : normal; + font-weight : 300; + line-height : 36px; + font-size : 26px; + margin-top : 20px; + } + + p { + font-family : Roboto; + font-style : normal; + font-weight : 400; + line-height : 21px; + font-size : 15px; + } +` +export const ButtonConfirmar = styled(Button)` + background-color : #00bcd4 !important; + color : #fff !important; + font-family : 'Roboto',sans-serif !important; + font-size : 14px !important; + font-weight : bolder !important; + padding-left : 16px !important; + padding-right : 16px !important; + outline : none !important; + margin : 6px 8px !important; + white-space : nowrap !important; + text-transform : uppercase !important; + font-weight : bold !important; + font-size : 14px !important; + font-style : inherit !important; + font-variant : inherit !important; + font-family : inherit !important; + text-decoration : none !important; + overflow : hidden !important; + display : inline-block !important; + position : relative !important; + cursor : pointer !important; + min-height : 36px !important; + min-width : 88px !important; + line-height : 36px !important; + vertical-align : middle !important; + align-items : center !important; + text-align : center !important; + border-radius : 3px !important; + box-sizing : border-box !important; + border : 0 !important; +` diff --git a/src/Components/PageProfessorComponents/PartThree.js b/src/Components/PageProfessorComponents/PartThree.js new file mode 100644 index 0000000000000000000000000000000000000000..4dc30604264bb51d3b51704b5be14fcd9c2d25dc --- /dev/null +++ b/src/Components/PageProfessorComponents/PartThree.js @@ -0,0 +1,107 @@ +import React, {useState} from 'react' +import {Content} from './PartOne.js' +import {ButtonCancelar, ButtonGrey} from './PartTwo.js' +import FormControl from '@material-ui/core/FormControl'; +import Stepper from '../Stepper.js' +import FormInput from '../FormInput.js' +import styled from 'styled-components' +import {Button} from '@material-ui/core' + +export default function PartThree (props) { + const [phoneNumber, setPhoneNumber] = useState( + { + flagInvalid : false, + number : '' + } + ) + const handleChangePhoneNumber = (event) => { + const input = event.target.value.replace(/\D/,'') + setPhoneNumber({...phoneNumber, + flagInvalid : (input.length < 10 ? true : false), + number : (input.length > 10 ? phoneNumber.number : input), + }) + } + + const [cpf, setCpf] = useState( { + flagInvalid : false, + number : '' + }) + const handleChangeCpf = (event) => { + const input = event.target.value.replace(/\D/,'') + setCpf({...cpf, + flagInvalid : (input.length < 11 ? true : false), + number : (input.length > 11 ? cpf.number : input), + }) + } + + const handleSubmit = () => { + const submit_phone = phoneNumber.number + const submit_cpf = cpf.number + + props.handleSubmit(submit_phone, submit_cpf) + } + + return ( + <> + {console.log(props)} + <Content> + <h4>Vamos localizar o seu cadastro:</h4> + <Stepper items={props.stepper}/> + <form style={{textAlign:"start"}}> + <FormControl required style={{width:"100%"}}> + <p>Inserir o telefone da escola:</p> + <FormInput + inputType={'text'} + pattern="[0-9]" + name={'DDD e Número'} + placeholder={'Exemplo: 4112345678'} + value={phoneNumber.number} + handleChange={handleChangePhoneNumber} + error={phoneNumber.flagInvalid} + > + </FormInput> + </FormControl> + <FormControl required style={{width:"100%"}}> + <p>Inserir o seu CPF</p> + <FormInput + inputType={'text'} + name={'11 dÃgitos'} + placeholder={'11 dÃgitos'} + value={cpf.number} + handleChange={handleChangeCpf} + mask={'999.999.999-99'} + error={cpf.flagInvalid} + > + </FormInput> + </FormControl> + <div style={{display:"flex", justifyContent:"space-evenly",paddingTop:"10px", paddingBottom:"10px"}}> + <div style={{display:"flex", justifyContent:"center"}}> + <ButtonConfirmar onClick={( (cpf.flagInvalid || phoneNumber.flagInvalid) ? () => {console.log('cpf.flagInvalid: ', cpf.flagInvalid, 'phoneNumber.flagInvalid: ', phoneNumber.flagInvalid)} : handleSubmit)}>BUSCAR</ButtonConfirmar> + </div> + <div style={{display:"flex", justifyContent:"center"}}> + <ButtonGrey onClick={() => props.goBack(false, true, false)}>VOLTAR</ButtonGrey> + <ButtonCancelar onClick={props.handleCancelar}>CANCELAR</ButtonCancelar> + </div> + </div> + </form> + </Content> + </> + ) +} + +const ButtonConfirmar = styled(Button)` + background-color : #00bcd4 !important; + color : #fff !important; + box-shadow : none !important; + font-family : 'Roboto',sans-serif !important; + font-size : 14px !important; + font-weight : bold !important; + height : 36px !important; + border-radius : 3px !important; + padding-left : 16px !important; + padding-right : 16px !important; + vertical-align : middle !important; + text-align : center !important; + align-items : center !important; + +` diff --git a/src/Components/PageProfessorComponents/PartTwo.js b/src/Components/PageProfessorComponents/PartTwo.js new file mode 100644 index 0000000000000000000000000000000000000000..a4e68d4a6de2ad449ab9cfd9e999b321cd546379 --- /dev/null +++ b/src/Components/PageProfessorComponents/PartTwo.js @@ -0,0 +1,101 @@ +import React, {useState, useEffect} from 'react' +import {Content, ButtonsArea} from './PartOne.js' +import Divider from '@material-ui/core/Divider'; +import Stepper from '../Stepper.js' +import CustomizedTables from '../Table.js' +import styled from 'styled-components' +import {Button} from '@material-ui/core' +import axios from 'axios' +import {simcaqAPIurl} from '../../env' +import {sortDict} from './PartOne.js' + +export default function PartTwo (props) { + const [schoolList, setSchoolList] = useState([]) + + useEffect ( () => { + const code = (props.info.inep_code || '') + const uf = (props.info.school_uf.abbreviation || '') + const municipio = (props.info.school_city || '') + //console.log(code, uf, municipio) + + //if user searched by inep code + if (code !== '') { + axios.get((`${simcaqAPIurl}/portal_mec_inep?filter=school_cod:` + code) + ).then ((response) => { + setSchoolList(sortDict(response.data.result)) + }, (error) => console.log('erro ao dar get na escola por inep code') + )} + else if (uf !== '' && municipio !== '') { + axios.get((`${simcaqAPIurl}/school?search=state_name:"` + uf + '",city_name:"' + municipio + '"&filter=year:2017') + ).then((response)=> { + //console.log(response.data.result) + setSchoolList(sortDict(response.data.result)) + }, (error) => console.log('erro ao dar get na escola por uf e municipio', code, uf, municipio) + )} + }, []) + + const onClickTable = (city_name, id, name, state_name) => { + props.handleBuscar(city_name, id, name, state_name) + } + + return ( + <> + {console.log(props)} + <Content> + <h4>Vamos localizar o seu cadastro:</h4> + <Stepper items={props.stepper}/> + </Content> + <Content> + <InputContainer> + <p>Selecione a sua escola:</p> + + <CustomizedTables + columns={['Codigo INEP', 'Escola', 'UF', 'Cidade']} + rows={schoolList} onClickTable={onClickTable} + /> + + </InputContainer> + </Content> + <Divider/> + <ButtonsArea> + <ButtonGrey onClick={() => props.goBack(true, false, false)}>VOLTAR</ButtonGrey> + <ButtonCancelar onClick={props.handleCancelar}>CANCELAR VERIFICAÇÃO</ButtonCancelar> + </ButtonsArea> + </> + ) +} + +export const ButtonCancelar = styled(Button)` + color: #666 !important; + font-family: 'Roboto',sans-serif !important; + font-size: 14px !important; + font-weight: bold !important; + height: 36px !important; + border-radius: 3px !important; + padding-left: 16px !important; + padding-right: 16px !important; +` + +export const ButtonGrey = styled(Button)` + background-color : #fff !important; + border : 1.5px #666 solid !important; + color : #666 !important; + box-shadow : none !important; + font-family : 'Roboto',sans-serif !important; + font-size : 14px !important; + font-weight : bold !important; + height : 36px !important; + border-radius : 3px !important; + padding-left : 16px !important; + padding-right : 16px !important; + vertical-align : middle !important; + text-align : center !important; + align-items : center !important; + +` + +const InputContainer = styled.div` + max-width : 970px; + display : block; + flex : auto; +` diff --git a/src/Components/PageProfessorComponents/SuccessfulRequest.js b/src/Components/PageProfessorComponents/SuccessfulRequest.js new file mode 100644 index 0000000000000000000000000000000000000000..b6d479e6b9cf54d684da5aaacc794a6e1f10614c --- /dev/null +++ b/src/Components/PageProfessorComponents/SuccessfulRequest.js @@ -0,0 +1,60 @@ +import React from 'react' +import styled from 'styled-components' +import {ButtonConfirmar} from './PartOne.js' +import Comentarios from '../../img/comentarios.png' + +export default function SuccessfulRequest (props) { + const h4Text = 'Obrigado por fazer parte dessa rede!' + const pText = 'Em breve você poderá publicar os seus próprios reursos educacionais digitais. O MEC analisará as suas informações junto a escola e você será avisada(o) aqui na plataforma e em seu email: ' + + const redirect = () => { + props.history.push('/') + } + + return ( + <div style={{maxWidth:"575px", padding : "0 36px"}}> + <div style={{display : "flex", flexDirection : "column"}}> + <StyledH4>{h4Text}</StyledH4> + <TextDiv> + <p>{pText} <b>{props.email}</b>.</p> + </TextDiv> + <div style={{display : 'flex', flexDirection : 'row', justifyContent : "center"}}> + <ButtonConfirmar onClick={redirect}>VOLTAR À PAGINA INICIAL</ButtonConfirmar> + </div> + <ImageDiv/> + </div> + </div> + ) +} + +const ImageDiv = styled.div` + height : 500px; + background-image : url(${Comentarios}); + background-repeat : no-repeat; + background-position : center center; +` + +const TextDiv = styled.div` + display : flex; + flex-direction : row; + + p { + text-align : justify; + font-family: Roboto; + font-style : normal; + font-weight : 400; + line-height : 21px; + font-size : 15px; + margin : 0 0 10px; + } +` + +const StyledH4 = styled.h4` + font-family : Roboto; + font-style : normal; + font-weight : 300; + line-height : 36px; + font-size : 26px; + margin-top : 20px; + margin-bottom : 20px; +` diff --git a/src/Components/PasswordRecoveryComponents/Default.js b/src/Components/PasswordRecoveryComponents/Default.js new file mode 100644 index 0000000000000000000000000000000000000000..ddbb4f43a3128596508fa1696a5fe4aa59820015 --- /dev/null +++ b/src/Components/PasswordRecoveryComponents/Default.js @@ -0,0 +1,25 @@ +import React from 'react' +import {CompletarCadastroButton} from '../TabPanels/UserPageTabs/PanelSolicitarContaProfessor.js' +import FormInput from "../FormInput.js" + +export default function Default (props) { + return ( + <div style={{overflow:"hidden", display:"inline-block"}}> + <h2 style={{fontSize:"32px", fontWeight:"200", marginBottom:"20px"}}>Vamos encontrar a sua conta</h2> + <form onSubmit={(e) => props.onSubmit(e)}> + <FormInput + inputType={"text"} + name={"email"} + value={props.value} + placeholder={"E-mail"} + handleChange={e => props.handleChange(e)} + required={true} + error = {props.error} + /> + <div style={{display:"flex", justifyContent:"center"}}> + <CompletarCadastroButton type="submit" >BUSCAR</CompletarCadastroButton> + </div> + </form> + </div> + ) +} diff --git a/src/Components/PasswordRecoveryComponents/Error.js b/src/Components/PasswordRecoveryComponents/Error.js new file mode 100644 index 0000000000000000000000000000000000000000..38ea3937b4b3713e2ac3b363f8d582ff6d21c0f4 --- /dev/null +++ b/src/Components/PasswordRecoveryComponents/Error.js @@ -0,0 +1,27 @@ +import React from 'react' +import {CompletarCadastroButton} from '../TabPanels/UserPageTabs/PanelSolicitarContaProfessor.js' +import FormInput from "../FormInput.js" + +export default function Error (props) { + return ( + <div style={{overflow:"hidden", display:"inline-block"}}> + <h2 style={{fontSize:"32px", fontWeight:"200", marginBottom:"20px"}}>Ops! Não encontramos essa conta</h2> + <p>{props.value}</p> + <p>Verifique se o e-mail foi digitado corretamente ou se você utilizou algum outro e-mail.</p> + <form onSubmit={(e) => props.onSubmit(e)}> + <FormInput + inputType={"text"} + name={"email"} + value={props.value} + placeholder={"E-mail"} + handleChange={e => props.handleChange(e)} + required={true} + error = {props.error} + /> + <div style={{display:"flex", justifyContent:"center"}}> + <CompletarCadastroButton type="submit" >BUSCAR</CompletarCadastroButton> + </div> + </form> + </div> + ) +} diff --git a/src/Components/PasswordRecoveryComponents/Success.js b/src/Components/PasswordRecoveryComponents/Success.js new file mode 100644 index 0000000000000000000000000000000000000000..34feb617ef2094f169acb826e40ea73cd16d4e8a --- /dev/null +++ b/src/Components/PasswordRecoveryComponents/Success.js @@ -0,0 +1,12 @@ +import React from 'react' + +export default function Default (props) { + return ( + <div style={{overflow:"hidden", display:"inline-block", fontSize:"14px", textAlign:"start"}}> + <h2 style={{fontSize:"32px", fontWeight:"200", marginBottom:"20px"}}>Feito! Confira seu e-mail</h2> + <p> Enviamos um link para <span style={{color:"#00bcd4"}}>{String(props.email)}</span> que permite alterar sua senha. </p> + <p style={{marginBottom:"30px"}}> Caso não chegue em sua caixa de entrada, dê uma olhada em outras pastas, como lixo eletrônico ou spam. </p> + <p> Não é o seu e-mail? <span style={{color:"#00bcd4", cursor:"pointer"}} onClick={() => {props.changeSwitch('default')}}> Tente Novamente.</span></p> + </div> + ) +} diff --git a/src/Components/PublicationPermissionsContent.js b/src/Components/PublicationPermissionsContent.js index c40d49d7e16a0f6235b198be07fccb60ec6133e4..1159d667ac2d542368d96b490db2cc10441f3156 100644 --- a/src/Components/PublicationPermissionsContent.js +++ b/src/Components/PublicationPermissionsContent.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, {useState, useEffect} from 'react'; import Typography from '@material-ui/core/Typography'; import CardContent from '@material-ui/core/CardContent'; import styled from 'styled-components' @@ -6,19 +6,41 @@ import RadioGroup from '@material-ui/core/RadioGroup'; import FormControlLabel from '@material-ui/core/FormControlLabel'; import Radio from '@material-ui/core/Radio'; import FormControl from '@material-ui/core/FormControl'; - +import Grid from '@material-ui/core/Grid'; +import { withStyles } from '@material-ui/core/styles'; +import {getRequest} from './HelperFunctions/getAxiosConfig' const StyledFormControl = styled(FormControl)` display: "block ruby"; - margin-top : 0 !importantcd ; + margin-top : 0 !important ; ` -const StyledDivEvaluateQuestion = styled.div` - display :flex; - justify-content : space-between; -` +const BlueRadio = withStyles({ + root: { + color: '#666', + '&$checked': { + color: '#00bcd4', + }, + }, + checked: {}, +})((props) => <Radio color="default" {...props} />); export default function PublicationPermissionsContent (props) { + + const [questionsArr, setQuestionsArr] = useState([]) + const handleSetQuestionsArr = (newArr) => {setQuestionsArr(newArr)} + + function handleSuccess (data) { + handleSetQuestionsArr(data) + } + + useEffect(() => { + const url = `/questions/` + + getRequest(url, handleSuccess, (error) => {console.log(error)}) + + }, []) + return ( <CardContent style={{textAlign: "start", marginBottom: "10px", lineHeight:"21px", color:"rgb(102, 102, 102)", padding:"65px"}}> <Typography variant="h4" style={{textAlign:"center", color:"rgb(102, 102, 102)", fontSize:"26px"}}> É necessário que você declare a permissão de publicação do seu Recurso:</Typography> @@ -31,41 +53,72 @@ export default function PublicationPermissionsContent (props) { <p>Ao prosseguir você concede a permissão de publicação do seu recurso ao nosso portal e se compromete a não infringir as polÃticas de conteúdos, estando então, a partir desse momento passÃvel de responsabilização pelo conteúdo a ser integrado a nossa rede. Para tanto atente-se as pontuações abaixo e verifique se o seu recurso está de acordo, antecipadamente, com as nossas condições. É recomendável a leitura das polÃticas de conteúdo estabelecidas - (<a href="termos-de-uso#publicacoes-de-usuario"><strong>PolÃticas de Conteúdo</strong></a>) + (<a href="/termos" style={{color:"initial"}}><strong>PolÃticas de Conteúdo</strong></a>) </p> <Typography variant="h5" style={{fontWeight:"300", color:"rgb(102, 102, 102)", fontSize:"22px"}}> Para que o recurso seja publicado na plataforma é preciso que ele esteja de acordo com as diretrizes abaixo, a presença de quaisquer dos itens a seguir inviabiliza a publicação do recurso em nossa rede. </Typography> <p><strong>No seu recurso está presente algum destes itens abaixo?</strong></p> + <StyledFormControl component="fieldset" style={{display:"BlockRuby"}} margin='dense' fullWidth={true}> - <StyledDivEvaluateQuestion> - <p> - O recurso apresenta conteúdo de cunho polÃtico-partidário? (Ex: o conteúdo expressa qualquer forma de manifestação que se caracterize como propaganda polÃtica)? - </p> - <RadioGroup row name="radio1" onChange={props.handleRadios}> - <FormControlLabel value="Sim" control={<Radio color="primary"/>} label="Sim"/> <FormControlLabel value="Não" control={<Radio color="primary"/>} label="Não"/> - </RadioGroup> - </StyledDivEvaluateQuestion> - <StyledDivEvaluateQuestion> - <p> - O recurso apresenta conteúdo ofensivo? (Ex: material pornográfico e/ou que invada a privacidade de terceiros, viole os Direitos Humanos ou seja ilegal, ofensivo, e que incite a violência)? - </p> - <RadioGroup row name="radio2" onChange={props.handleRadios}> - <FormControlLabel value="Sim" control={<Radio color="primary"/>} label="Sim"/> <FormControlLabel value="Não" control={<Radio color="primary"/>} label="Não"/> - </RadioGroup> - </StyledDivEvaluateQuestion> - <StyledDivEvaluateQuestion> - <p> - O recurso apresenta algum tipo de propaganda ou marca? (Ex: o conteúdo tem cunho comercial)? - </p> - <RadioGroup row name="radio3" onChange={props.handleRadios}> - <FormControlLabel value="Sim" control={<Radio color="primary"/>} label="Sim"/> <FormControlLabel value="Não" control={<Radio color="primary"/>} label="Não"/> - </RadioGroup> - </StyledDivEvaluateQuestion> + <Grid container> + { + questionsArr.map((question, index) => + + (question.status === 'active' && question.id !== 4) && + <React.Fragment key={question.id}> + <Grid item xs={10}> + <p>{question.description}</p> + </Grid> + <Grid item xs={2}> + <RadioGroup row name={"radio" + (index + 1)} onChange={props.handleRadios}> + <FormControlLabel value="Sim" control={<BlueRadio/>} label="Sim"/> <FormControlLabel value="Não" control={<BlueRadio/>} label="Não"/> + </RadioGroup> + </Grid> + </React.Fragment> + + ) + } + </Grid> </StyledFormControl> </div> </CardContent> ) } + +// {/* +// <Grid item xs={10}> +// <p> +// O recurso apresenta conteúdo de cunho polÃtico-partidário? (Ex: o conteúdo expressa qualquer forma de manifestação que se caracterize como propaganda polÃtica)? +// </p> +// </Grid> +// <Grid item xs={2}> +// <RadioGroup row name="radio1" onChange={props.handleRadios}> +// <FormControlLabel value="Sim" control={<BlueRadio/>} label="Sim"/> <FormControlLabel value="Não" control={<BlueRadio/>} label="Não"/> +// </RadioGroup> +// </Grid> + +// <Grid item xs={10}> +// <p> +// O recurso apresenta conteúdo ofensivo? (Ex: material pornográfico e/ou que invada a privacidade de terceiros, viole os Direitos Humanos ou seja ilegal, ofensivo, e que incite a violência)? +// </p> +// </Grid> +// <Grid item xs={2}> +// <RadioGroup row name="radio2" onChange={props.handleRadios}> +// <FormControlLabel value="Sim" control={<BlueRadio/>} label="Sim"/> <FormControlLabel value="Não" control={<BlueRadio/>} label="Não"/> +// </RadioGroup> +// </Grid> +// <Grid item xs={10}> +// <p> +// O recurso apresenta algum tipo de propaganda ou marca? (Ex: o conteúdo tem cunho comercial)? +// </p> +// </Grid> +// <Grid item xs={2}> +// <RadioGroup row name="radio3" onChange={props.handleRadios}> +// <FormControlLabel value="Sim" control={<BlueRadio/>} label="Sim"/> <FormControlLabel value="Não" control={<BlueRadio/>} label="Não"/> +// </RadioGroup> +// </Grid> +// </Grid> +// */} diff --git a/src/Components/PurpleButton.js b/src/Components/PurpleButton.js new file mode 100644 index 0000000000000000000000000000000000000000..1b57b823d14aedd9bb2604fa0de6b9a4ea73da72 --- /dev/null +++ b/src/Components/PurpleButton.js @@ -0,0 +1,52 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import { Button } from '@material-ui/core'; +import styled from 'styled-components' + +export default function PurpleButton (props) { + return ( + <StyledButton onClick={props.callback}> + {props.text} + </StyledButton> + ) +} + +const StyledButton = styled(Button)` + max-height : 36px !important; + background-color : #673ab7 !important; + color : #fff !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; + + .button-text { + cursor : pointer; + line-height : 36px; + text-align : center; + color : currentColor; + white-space : nowrap; + text-transform : uppercase; + font-weight : 600 !important; + font-size : 14px; + font-style : inherit; + font-variant : inherit; + padding : 6px 16px !important; + } +` diff --git a/src/Components/RedirectModal.js b/src/Components/RedirectModal.js new file mode 100644 index 0000000000000000000000000000000000000000..f826b54ea543053125444fa4ab79d008d67c762f --- /dev/null +++ b/src/Components/RedirectModal.js @@ -0,0 +1,171 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import styled from 'styled-components' +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import CloseIcon from '@material-ui/icons/Close'; + +function CloseModalButton (props) { + return ( + <StyledCloseModalButton onClick={props.handleClose}> + <CloseIcon/> + </StyledCloseModalButton> + ) +} + +const StyledCloseModalButton = styled(Button)` + display : inline-block; + position : absolute !important; + right : 8px; + top : 8px; + float : right !important; + margin-right : -8px !important; + background : transparent !important; + min-width: 0 !important; + + width : 40px; +` + + +export default function RedirectModal (props) { + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <Container> + <CloseModalButton handleClose={props.handleClose}/> + <Header> + <span style={{width:"32px"}}/> + <h2>Você será redirecionado para outro site</h2> + </Header> + <Content> + <span style={{fontWeight : "600"}}>Uma nova aba ou janela irá abrir, deseja continuar?</span> + <div style={{paddingTop : "20px", paddingBottom : "10px"}}> + Lembre-se de que você pode reportar caso considere o conteúdo abusivo/ofensivo ou caso a página não corresponda a descrição apresentada. + </div> + <section style={{display : "flex", flexDirection : "row", justifyContent : "center"}}> + <ButtonGrey onClick={props.handleClose}>CANCELAR</ButtonGrey> + <a href={props.link} target="_blank" rel="noreferrer noopener" style={{textDecoration : "none !important"}}><ButtonOrange>CONTINUAR</ButtonOrange></a> + </section> + </Content> + </Container> + </Fade> + </StyledModal> + ) +} + +const ButtonOrange = styled(Button)` + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + background-color : #ff7f00 !important; + color : #fff !important; + text-decoration : none !important; + text-transform : uppercase !important; + outline : none !important; + text-align : center !important; + max-height : 36px; + margin-top : 5px !important; + font-size : 14px !important; + font-weight : 600 !important; +` + + +const ButtonGrey = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + margin-top : 5px !important; + margin-right : 15px !important; + background-color : transparent !important; + color : #666 !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; + font-size : 14px !important; + font-weight : 600 !important; + +` + +const Content = styled.div` + color : #666; + padding : 20px 30px; + overflow : visible; + text-align : center; + font-size : 14px; +` +const Header = styled.div` + display : flex; + flex-direction : row; + align-items : center; + justify-content : space-between; + h2 { + font-size : 26px; + font-weight : lighter; + color : #666 + padding : 10px 20px 0 20px; + + } +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` +const Container = styled.div` + box-sizing : border-box; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px gba(0,0,0,.12); + background-color : white; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + padding : 10px; + border-radius : 4px; + @media screen and (min-width : 700px) { + max-width : 395px; + height : 326px; + } + @media screen and (max-width : 699px) { + width : 100%; + height : 100%; + } +` diff --git a/src/Components/ReportButton.js b/src/Components/ReportButton.js new file mode 100644 index 0000000000000000000000000000000000000000..654780a75533a8deac35c1cf08121d8634915f3b --- /dev/null +++ b/src/Components/ReportButton.js @@ -0,0 +1,95 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, useContext} from 'react' +import styled from 'styled-components' +import Menu from '@material-ui/core/Menu'; +import MenuItem from '@material-ui/core/MenuItem'; +import ReportIcon from '@material-ui/icons/Error'; +import Button from '@material-ui/core/Button'; +import MoreVertIcon from '@material-ui/icons/MoreVert'; +import ReportModal from './ReportModal.js' +import {Store} from '../Store.js' + +export default function ReportButton (props) { + const {state} = useContext(Store) + + /*Menu control variables-----------------------------*/ + const [anchorEl, setAnchorEl] = React.useState(null); + const handleClick = (event) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + /*---------------------------------------------------*/ + + + /*modal variables------------------------------------*/ + const [reportModal, toggleReportModal] = useState(false) + // eslint-disable-next-line + const [loginModal, toggleLoginModal] = useState(false) + + const handleModal = () => { + if (state.currentUser.id) { + toggleReportModal(!reportModal) + } + else { + toggleLoginModal(true) + } + } + /*---------------------------------------------------*/ + + return ( + <> + { + reportModal && + <ReportModal open={reportModal} handleClose={() => handleModal()} + form="user" complainableId={props.complainableId} + complainableType={props.complainableType} + {...props}/> + } + {/* + loginModal && + <LoginModal open={loginModal} handleClose={() => {toggleLoginModal(false)}}/> + */} + <Button onClick={handleClick}> + <MoreVertIcon style={{color : "#666"}}/> + </Button> + <StyledMenu + id="simple-menu" + anchorEl={anchorEl} + keepMounted + open={Boolean(anchorEl)} + onClose={handleClose} + style={{borderRadius : "0"}} + > + <MenuItem onClick={() => {handleModal()}} style={{color : "#666"}}> + <ReportIcon/> + <span style={{paddingLeft : "3px"}}>Reportar</span> + </MenuItem> + </StyledMenu> + </> + ) +} + +const StyledMenu = styled(Menu)` + .MuiPaper-rounded { + border-radius : 0 !important; + } +` diff --git a/src/Components/ReportColecaoForm.js b/src/Components/ReportColecaoForm.js new file mode 100644 index 0000000000000000000000000000000000000000..37c4a77336c79e8f58496143cbe8840725d7c4da --- /dev/null +++ b/src/Components/ReportColecaoForm.js @@ -0,0 +1,151 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React from 'react'; +import { Button } from '@material-ui/core'; +import styled from 'styled-components' +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import TextField from '@material-ui/core/TextField'; +import {StyledFormControl, ButtonsDiv, ButtonCancelar} from './ReportUserForm.js' +import { withStyles } from '@material-ui/core/styles'; + +const StyledRadio = withStyles({ + root: { + color: '#666', + '&$checked': { + color: '#673ab7', + }, + }, + checked: {}, +})((props) => <Radio color="default" {...props} />); + +export default function ReportColecaoForm (props) { + const [value, setValue] = React.useState(-1); + + const handleChange = (event) => { + setValue(event.target.value); + }; + + /*values are set according to backend complaint id*/ + const [options] = React.useState([ + {value : "1", text : 'A Coleção viola os direitos autorais.'}, + {value : "2", text : 'A Coleção contém conteúdo ofensivo/abusivo.'}, + {value : "5", text : 'A descrição da Coleção não corresponde ao seu conteúdo.'} + ]) + + const [moreInfo, setMoreInfo] = React.useState({ + key : false, + value : "", + }) + + const handleChangeMoreInfo = (e) => { + const userInput = e.target.value + + const flag = userInput.length > 150 ? true : false + + setMoreInfo({...moreInfo, + key : flag, + value : userInput + }) + } + + const handleSubmit = (e) => { + e.preventDefault() + const finalRadioValue = value + const finalMoreInfo = moreInfo + + if( finalRadioValue !== -1 && !(finalMoreInfo.key)) { + props.handleSubmit(finalRadioValue, finalMoreInfo.value) + } + else { + console.log('oops') + } + } + + return ( + <form onSubmit={(e) => handleSubmit(e)} style={{textAlign : "left"}}> + <StyledFormControl component="fieldset"> + <RadioGroup value={value} onChange={handleChange}> + { + options.map(option => + <FormControlLabel value={option.value} control={<StyledRadio/>} label={option.text} /> + ) + } + </RadioGroup> + </StyledFormControl> + + <StyledTextField + id = {"report-text-field"} + label={"Escreva mais sobre o problema"} + value = {moreInfo.value} + onChange = {e => handleChangeMoreInfo(e)} + helperText = {moreInfo.value.length + '/150'} + multiline={true} + rowsMax = {"5"} + error = {moreInfo.key} + required = {false} + style={{width : "100%"}} + /> + + <ButtonsDiv> + <ButtonCancelar onClick={props.handleClose}>CANCELAR</ButtonCancelar> + <ButtonEnviar type="submit">ENVIAR</ButtonEnviar> + </ButtonsDiv> + </form> + ) +} + +const StyledTextField = styled(TextField)` + .MuiFormHelperText-root { + text-align : left; + } + + label.Mui-focused { + color : #673ab7; + } + + label.Mui-focused.Mui-error { + color : red; + } + + .MuiInput-underline::after { + border-bottom: 2px solid #673ab7; + } +` +const ButtonEnviar = styled(Button)` + background-color : #673ab7 !important; + color : #fff !important; + font-size: 14px !important; + font-weight: 500 !important; + height: 36px !important; + border-radius: 3px !important; + padding-left: 16px !important; + padding-right: 16px !important; + box-shadow: 0 2px 5px 0 rgba(0,0,0,.26) !important; + outline : none !important; + min-width : 88px !important; + vertical-align : middle !important; + margin : 6px 8px !important; + text-decoration : none !important; + + .MuiButton-label { + padding-right : 16px; + padding-left : 16px; + } +` diff --git a/src/Components/ReportCollectionForm.js b/src/Components/ReportCollectionForm.js new file mode 100644 index 0000000000000000000000000000000000000000..34fd87b2417016fa80fc43bce90300242a764901 --- /dev/null +++ b/src/Components/ReportCollectionForm.js @@ -0,0 +1,103 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React from 'react'; +import { Button } from '@material-ui/core'; +import styled from 'styled-components' +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import FormControl from '@material-ui/core/FormControl'; +import TextField from '@material-ui/core/TextField'; +import {StyledFormControl, StyledTextField, ButtonsDiv, ButtonCancelar, ButtonEnviar} from './ReportUserForm.js' + +export default function ReportRecursoForm (props) { + const [value, setValue] = React.useState(-1); + + const handleChange = (event) => { + setValue(event.target.value); + }; + + /*values are set according to backend complaint id*/ + const [options] = React.useState([ + {value : "1", text : 'A Coleção viola os direitos autorais.'}, + {value : "2", text : 'A Coleção contém conteúdo ofensivo/abusivo.'}, + {value : "5", text : 'A descrição da Coleção não corresponde ao seu conteúdo.'} + ]) + + const [moreInfo, setMoreInfo] = React.useState({ + key : false, + value : "", + }) + + const handleChangeMoreInfo = (e) => { + const userInput = e.target.value + + const flag = userInput.length > 150 ? true : false + + setMoreInfo({...moreInfo, + key : flag, + value : userInput + }) + } + + const handleSubmit = (e) => { + e.preventDefault() + const finalRadioValue = value + const finalMoreInfo = moreInfo + + if( finalRadioValue != -1 && !(finalMoreInfo.key)) { + props.handleSubmit(finalRadioValue, finalMoreInfo.value) + } + else { + console.log('oops') + } + } + + return ( + <form onSubmit={(e) => handleSubmit(e)} style={{textAlign : "left"}}> + <StyledFormControl component="fieldset"> + <RadioGroup value={value} onChange={handleChange}> + { + options.map(option => + <FormControlLabel value={option.value} control={<Radio color="orange"/>} label={option.text} /> + ) + } + </RadioGroup> + </StyledFormControl> + + <StyledTextField + id = {"report-text-field"} + label={"Escreva mais sobre o problema"} + value = {moreInfo.value} + onChange = {e => handleChangeMoreInfo(e)} + helperText = {moreInfo.value.length + '/150'} + multiline={true} + rowsMax = {"5"} + error = {moreInfo.key} + required = {false} + helperText ={moreInfo.value.length + '/150'} + style={{width : "100%"}} + /> + + <ButtonsDiv> + <ButtonCancelar onClick={props.handleClose}>CANCELAR</ButtonCancelar> + <ButtonEnviar type="submit">ENVIAR</ButtonEnviar> + </ButtonsDiv> + </form> + ) +} diff --git a/src/Components/ReportModal.js b/src/Components/ReportModal.js new file mode 100644 index 0000000000000000000000000000000000000000..079ca75fd3dd6454d6e26263767ac33d3ad3b556 --- /dev/null +++ b/src/Components/ReportModal.js @@ -0,0 +1,181 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useContext, useState} from 'react'; +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import {Store} from '../Store.js' +import CloseIcon from '@material-ui/icons/Close'; +import ReportUserForm from './ReportUserForm.js' +import ReportRecursoForm from './ReportRecursoForm.js' +import ReportColecaoForm from './ReportColecaoForm.js' +import {postRequest} from './HelperFunctions/getAxiosConfig' +import SnackbarComponent from './SnackbarComponent.js' + +function CloseModalButton (props) { + return ( + <StyledCloseModalButton onClick={props.handleClose}> + <CloseIcon/> + </StyledCloseModalButton> + ) +} + +export default function ReportModal (props) { + const {state} = useContext(Store) + const [snackbarOpen, handleSnackbar] = useState(false) + + const handleSubmit = (complaint_reason_id, description) => { + const url = `/complaints/` + const payload = { + "complaint" : { + "user_id" : state.currentUser.id, + "description" : description, + "complainable_id" : props.complainableId, + "complainable_type" : props.complainableType, + "complaint_reason_id" : complaint_reason_id + } + } + + postRequest(url, payload, (data) => { + console.log(data) + props.handleClose(); + handleSnackbar(true); + }, (error) => {console.log(error)}) + + } + + const renderForm = (formType) => { + switch (formType) { + case 'colecao': + return ( + <ReportColecaoForm handleClose={props.handleClose} handleSubmit={handleSubmit}/> + ) + case 'recurso': + return ( + <ReportRecursoForm handleClose={props.handleClose} handleSubmit={handleSubmit}/> + ) + default: + return ( + <ReportUserForm handleClose={props.handleClose} handleSubmit={handleSubmit}/> + ) + } + } + + return ( + <React.Fragment> + <SnackbarComponent snackbarOpen={snackbarOpen} severity={"success"} handleClose={() => {handleSnackbar(false)}} text={"Sua reclamação foi recebida."} + /> + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <ReportContainer> + <Header> + <span style={{width:"32px"}}/> + <h2>O que está acontecendo?</h2> + <CloseModalButton handleClose={props.handleClose}/> + </Header> + + <Content> + { + renderForm(props.form) + } + </Content> + </ReportContainer> + </Fade> + </StyledModal> + </React.Fragment> + ) +} + + +const Content = styled.div` + padding : 20px 30px; + overflow : visible; + max-width : 470px; +` + +const Header = styled.div` + display : flex; + flex-direction : row; + padding : 10px 26px 0 26px; + align-items : center; + justify-content : space-between; + height : 64px; + + h2 { + font-size : 26px; + font-weight : lighter; + color : #666 + } +` + +const StyledCloseModalButton = styled(Button)` + display : inline-block; + position : relative; + float : right !important; + margin-right : -8px !important; + background : transparent !important; + min-width: 0 !important; + width : 40px; +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const ReportContainer = styled.div` + box-sizing : border-box; + background-color : white; + max-width : none; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + padding : 10px; + border-radius : 4px; + + @media screen and (max-width : 899px) { + width : 100%; + height : 100%; + } +` diff --git a/src/Components/ReportRecursoForm.js b/src/Components/ReportRecursoForm.js new file mode 100644 index 0000000000000000000000000000000000000000..a1c7312713319d9b4320cf4bc844d3c160c5ed79 --- /dev/null +++ b/src/Components/ReportRecursoForm.js @@ -0,0 +1,109 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React from 'react'; +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import {StyledFormControl, StyledTextField, ButtonsDiv, ButtonCancelar, ButtonEnviar} from './ReportUserForm.js' +import { withStyles } from '@material-ui/core/styles'; + +const StyledRadio = withStyles({ + root: { + color: '#666', + '&$checked': { + color: '#ff7f00', + }, + }, + checked: {}, +})((props) => <Radio color="default" {...props} />); + +export default function ReportRecursoForm (props) { + const [value, setValue] = React.useState(-1); + + const handleChange = (event) => { + setValue(event.target.value); + }; + + /*values are set according to backend complaint id*/ + const [options] = React.useState([ + {value : "1", text : 'O Recurso viola os direitos autorais.'}, + {value : "2", text : 'O Recurso contém conteúdo ofensivo/abusivo.'}, + {value : "5", text : 'A descrição do Recurso não corresponde ao seu conteúdo.'} + ]) + + const [moreInfo, setMoreInfo] = React.useState({ + key : false, + value : "", + }) + + const handleChangeMoreInfo = (e) => { + const userInput = e.target.value + + const flag = userInput.length > 150 ? true : false + + setMoreInfo({...moreInfo, + key : flag, + value : userInput + }) + } + + const handleSubmit = (e) => { + e.preventDefault() + const finalRadioValue = value + const finalMoreInfo = moreInfo + + if( finalRadioValue !== -1 && !(finalMoreInfo.key)) { + props.handleSubmit(finalRadioValue, finalMoreInfo.value) + } + else { + console.log('oops') + } + } + + return ( + <form onSubmit={(e) => handleSubmit(e)} style={{textAlign : "left"}}> + <StyledFormControl component="fieldset"> + <RadioGroup value={value} onChange={handleChange}> + { + options.map(option => + <FormControlLabel value={option.value} control={<StyledRadio/>} label={option.text} /> + ) + } + </RadioGroup> + </StyledFormControl> + + <StyledTextField + id = {"report-text-field"} + label={"Escreva mais sobre o problema"} + value = {moreInfo.value} + onChange = {e => handleChangeMoreInfo(e)} + helperText = {moreInfo.value.length + '/150'} + multiline={true} + rowsMax = {"5"} + error = {moreInfo.key} + required = {false} + style={{width : "100%"}} + /> + + <ButtonsDiv> + <ButtonCancelar onClick={props.handleClose}>CANCELAR</ButtonCancelar> + <ButtonEnviar type="submit">ENVIAR</ButtonEnviar> + </ButtonsDiv> + </form> + ) +} diff --git a/src/Components/ReportUserForm.js b/src/Components/ReportUserForm.js new file mode 100644 index 0000000000000000000000000000000000000000..370865722d5a85cb2b458f326b891dbfe962a3e8 --- /dev/null +++ b/src/Components/ReportUserForm.js @@ -0,0 +1,186 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, {useState} from 'react'; +import { Button } from '@material-ui/core'; +import styled from 'styled-components' +import Radio from '@material-ui/core/Radio'; +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import FormControl from '@material-ui/core/FormControl'; +import TextField from '@material-ui/core/TextField'; +import { withStyles } from '@material-ui/core/styles'; + +const StyledRadio = withStyles({ + root: { + '&$checked': { + color: '#ff7f00 !important', + }, + }, + checked: {}, +})((props) => <Radio color="default" {...props} />); + +export default function ReportForm (props) { + const [value, setValue] = useState(-1); + + const handleChange = (event) => { + setValue(event.target.value); + }; + + /*values are set according to backend complaint id*/ + const [options] = React.useState([ + {value : "6", text :'Esta pessoa está fingindo ser eu ou alguém que eu conheço.'}, + {value : "4", text : 'Essa pessoa envia spam.'}, + {value : "3", text : 'Essa é uma conta falsa.'}, + {value : "1", text : ' A publicação dessa pessoa viola os diretos autorais.'}, + {value : "2", text : 'As publicações dessa pessoa contém conteúdo ofensivo/abusivo.'} + ]) + + const [moreInfo, setMoreInfo] = React.useState({ + key : false, + value : "", + }) + + const handleChangeMoreInfo = (e) => { + const userInput = e.target.value + + const flag = userInput.length > 150 ? true : false + + setMoreInfo({...moreInfo, + key : flag, + value : userInput + }) + } + + const formSubmit = (e) => { + e.preventDefault() + const finalRadioValue = value + const finalMoreInfo = moreInfo + + if( finalRadioValue !== -1 && !(finalMoreInfo.key)) { + props.handleSubmit(finalRadioValue, finalMoreInfo.value) + } + } + + return ( + <form onSubmit={(e) => {formSubmit(e)}}> + <StyledFormControl component="fieldset"> + <RadioGroup value={value} onChange={handleChange}> + { + options.map(option => + <FormControlLabel value={option.value} control={<StyledRadio/>} label={option.text} /> + ) + } + </RadioGroup> + </StyledFormControl> + + <StyledTextField + id = {"Escreva mais sobre o problema"} + label={"Escreva mais sobre o problema"} + type = {"text"} + value = {moreInfo.value} + onChange = {e => handleChangeMoreInfo(e)} + helperText = {moreInfo.value.length + '/150'} + multiline={true} + rowsMax = {"5"} + error = {moreInfo.key} + required = {false} + style={{width:"100%"}} + /> + + <ButtonsDiv> + <ButtonCancelar onClick={props.handleClose}>CANCELAR</ButtonCancelar> + <ButtonEnviar type="submit">ENVIAR</ButtonEnviar> + </ButtonsDiv> + </form> + ); +} + +export const ButtonsDiv = styled.div` + display : flex; + flex-direction : row; + justify-content : flex-end; + align-items : center; +` + +export const ButtonCancelar = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + height : 36px !important; + padding-left : 16px !important; + padding-right : 16px !important; + font-weight : 500 !important; + border-radius : 3px !important; + color :#666 !important; + background-color: transparent; + min-width : 88px !important; + height : 36px !important; +` + +export const ButtonEnviar = styled(Button)` + background-color : #ff7f00 !important; + color : #fff !important; + font-size: 14px !important; + font-weight: 500 !important; + height: 36px !important; + border-radius: 3px !important; + padding-left: 16px !important; + padding-right: 16px !important; + box-shadow: 0 2px 5px 0 rgba(0,0,0,.26) !important; + outline : none !important; + min-width : 88px !important; + vertical-align : middle !important; + margin : 6px 8px !important; + text-decoration : none !important; + + .MuiButton-label { + padding-right : 16px; + padding-left : 16px; + } +` +export const StyledTextField = styled(TextField)` + .MuiFormHelperText-root { + text-align : left; + } + + label.Mui-focused { + color : orange; + } + + label.Mui-focused.Mui-error { + color : red; + } + + .MuiInput-underline::after { + border-bottom: 2px solid orange; + } +` + +export const StyledFormControl = styled(FormControl)` + .MuiFormControlLabel-root { + color : #666; + } + + .PrivateRadioButtonIcon-checked { + color : orange; + } + + .MuiTypography-body1 { + font-size : 14px; + } +` diff --git a/src/Components/RequirementsDialog.js b/src/Components/RequirementsDialog.js new file mode 100644 index 0000000000000000000000000000000000000000..49aeb47335556faa0d6fa700973c0541a217819b --- /dev/null +++ b/src/Components/RequirementsDialog.js @@ -0,0 +1,61 @@ +import React from 'react'; +import Button from '@material-ui/core/Button'; +import Dialog from '@material-ui/core/Dialog'; +import DialogActions from '@material-ui/core/DialogActions'; +import DialogContent from '@material-ui/core/DialogContent'; +import DialogContentText from '@material-ui/core/DialogContentText'; +import DialogTitle from '@material-ui/core/DialogTitle'; + +export default function MaxWidthDialog(props) { + const [open, setOpen] = React.useState(false); + const fullWidth = true; + const maxWidth = 'sm'; + + const handleClickOpen = () => { + setOpen(true); + }; + + const handleClose = () => { + setOpen(false); + }; + + return ( + <React.Fragment> + <Button variant="outlined" color="primary" onClick={handleClickOpen}> + Mais + </Button> + <Dialog + fullWidth={fullWidth} + maxWidth={maxWidth} + open={open} + onClose={handleClose} + aria-labelledby="max-width-dialog-title" + > + <DialogTitle id="max-width-dialog-title">{props.title}</DialogTitle> + <DialogContent> + <DialogContentText> + {props.description} + <h4>Requisitos</h4> + <dl> + {props.requirements.map( + (r) => { + return( + <div> + <dt>{r.name}</dt> + <dd>{r.description}</dd> + </div> + ); + })} + </dl> + </DialogContentText> + </DialogContent> + <DialogActions> + <Button onClick={handleClose} color="primary"> + Fechar + </Button> + </DialogActions> + </Dialog> + </React.Fragment> + ); +} + diff --git a/src/Components/ResourceCard.css b/src/Components/ResourceCard.css new file mode 100644 index 0000000000000000000000000000000000000000..c7b97b5cb76d3373765410177a1cfd4749a31fef --- /dev/null +++ b/src/Components/ResourceCard.css @@ -0,0 +1,22 @@ +/* transform: translateX(-1284.61px); visibility: hidden; */ +/* .slideContentLinkAfterActivefalse{ + transform: translateX(-1285.55px); + position: relative; +}*/ +.slideContentLinkAfterActivetrue{ + position: absolute; + transform: none; + /* transition: transform 1000ms cubic-bezier(0,0,0.2,1) 0ms; */ + +} + +.slideContentLinkBeforeActivefalse{ + position: absolute; + transform: none; + transition: transform 500ms cubic-bezier(0,0,0.2,1) 0ms; + +} +.slideContentLinkBeforeActivetrue{ + transform: translateX(-1285.55px); + position: relative; +} \ No newline at end of file diff --git a/src/Components/ResourceCard.js b/src/Components/ResourceCard.js index 481cb111f53f90be585a02fd70806784f05c1e30..2e76e5fc66116d288e3be56b7af41c85ef77878e 100644 --- a/src/Components/ResourceCard.js +++ b/src/Components/ResourceCard.js @@ -16,15 +16,16 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; -import './CardsAnimation.css'; -import {Container} from 'react-grid-system'; -import Card from '@material-ui/core/Card'; -import CardContent from '@material-ui/core/CardContent'; -import CardActions from '@material-ui/core/CardActions'; -import IconButton from '@material-ui/core/IconButton'; -import Typography from '@material-ui/core/Typography'; -import FavoriteIcon from '@material-ui/icons/Favorite'; +import React, { Component } from "react"; +import "./CardsAnimation.css"; +import { Container } from "react-grid-system"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import CardActions from "@material-ui/core/CardActions"; +import IconButton from "@material-ui/core/IconButton"; +import Typography from "@material-ui/core/Typography"; +import FavoriteIcon from "@material-ui/icons/Favorite"; +import styled from 'styled-components'; import animacao from "../img/laranja/ANIMACAO_SIMULACAO.jpg"; import apresentacao from "../img/laranja/APRESENTACAO.jpg"; import aplicativo from "../img/laranja/APP.jpg"; @@ -39,23 +40,39 @@ import outros from "../img/laranja/OUTROS.jpg"; import software from "../img/laranja/SOFTWARE.jpg"; import texto from "../img/laranja/TEXTO.jpg"; import video from "../img/laranja/VIDEO.jpg"; -import Rating from '@material-ui/lab/Rating'; -import StarBorderIcon from '@material-ui/icons/StarBorder'; -import {apiDomain} from '../env'; -import AddIcon from '@material-ui/icons/CreateNewFolder'; -import Options from './CardOptions' -import Video from '@material-ui/icons/OndemandVideo'; +import Rating from "@material-ui/lab/Rating"; +import StarBorderIcon from "@material-ui/icons/StarBorder"; +import { apiDomain } from "../env"; +import AddIcon from "@material-ui/icons/CreateNewFolder"; +import Options from "./CardOptions"; +import Video from "@material-ui/icons/OndemandVideo"; import noAvatar from "../img/default_profile.png"; -const types = [{label: "Animação", thumb: animacao}, {label: "Apresentação", thumb: apresentacao}, -{label: "Aplicativo" , thumb: aplicativo}, {label: "Ãudio", thumb: audio}, {label: "Vazio", thumb: vazio}, {label: "Imagem", thumb: imagem}, {label: "Gráfico", thumb: grafico}, {label: "Jogo", thumb: jogo}, {label: "Livro", thumb: livro}, {label:"Livro digital", thumb: livro}, {label: "Mapa", thumb: mapa}, {label: "Outros", thumb: outros}, {label: "Software Educacional", thumb:software}, {label: "Software", thumb:software}, {label: "Texto", thumb:texto}, {label: "VÃdeo", thumb:video}] -const slideStyle={ +const types = [ + { label: "Animação", thumb: animacao }, + { label: "Apresentação", thumb: apresentacao }, + { label: "Aplicativo", thumb: aplicativo }, + { label: "Ãudio", thumb: audio }, + { label: "Vazio", thumb: vazio }, + { label: "Imagem", thumb: imagem }, + { label: "Gráfico", thumb: grafico }, + { label: "Jogo", thumb: jogo }, + { label: "Livro", thumb: livro }, + { label: "Livro digital", thumb: livro }, + { label: "Mapa", thumb: mapa }, + { label: "Outros", thumb: outros }, + { label: "Software Educacional", thumb: software }, + { label: "Software", thumb: software }, + { label: "Texto", thumb: texto }, + { label: "VÃdeo", thumb: video } +]; +const slideStyle = { height: "50px", width: "50px", backgroundColor: "white", - borderRadius: "50%", + borderRadius: "50%" }; -const publisherStyle={ +const publisherStyle = { color: "white", paddinLeft: "30px", fontSize: "15px", @@ -64,79 +81,126 @@ const publisherStyle={ class ResourceCard extends Component { constructor(props) { super(props); - this.state={ + this.state = { thumbnail: null, userStyle: "animatiOff", - userAvatar: null, + userAvatar: null }; - } - renderType(type){ - if (!this.state.thumbnail && !this.props.thumbnail ) { - var aux = types.find(function(element){ return element.label === type}); - this.setState({thumbnail: aux.thumb}); - } - if (!this.state.thumbnail && this.props.thumbnail ) { - this.setState({thumbnail: apiDomain + this.props.thumbnail}); + renderType(type) { + if (!this.state.thumbnail) { + if (!this.props.thumbnail) { + const aux = types.find(function (element) { return element.label === type }); + this.setState({ thumbnail: aux.thumb }); + } + else { + this.setState({ thumbnail: `${apiDomain}` + this.props.thumbnail }); + } } + // {/*if (!this.state.thumbnail && !this.props.thumbnail ) { + // var aux = types.find(function(element){ return element.label === type}); + // this.setState({thumbnail: aux.thumb}); + // } + // if (!this.state.thumbnail && this.props.thumbnail ) { + // this.setState({thumbnail: apiDomain + this.props.thumbnail}); + // }*/} } - onHover(){ - this.setState({userStyle: "animatiOn"}); + onHover() { + this.setState({ userStyle: "animatiOn" }); } - onIddle(){ - this.setState({userStyle: "animatiOff"}) + onIddle() { + this.setState({ userStyle: "animatiOff" }); } - defAvatar(){ - if (!this.state.userAvatar && (!this.props.avatar.length)){ - this.setState({userAvatar: noAvatar}); + defAvatar() { + if (!this.state.userAvatar && !this.props.avatar.length) { + this.setState({ userAvatar: noAvatar }); } - if (!this.state.userAvatar && (this.props.avatar) ) { - this.setState({userAvatar:apiDomain+this.props.avatar}); + if (!this.state.userAvatar && this.props.avatar) { + this.setState({ userAvatar: apiDomain + this.props.avatar }); } } - render(){ - this.renderType(this.props.type); - this.defAvatar(); - return ( - <Card onMouseOver={this.onHover.bind(this)} onMouseOut={this.onIddle.bind(this)} > - <Container style={{padding:"0px", height:"175px", backgroundColor: "#ff7f00"}}> - <div className={this.state.userStyle}> - <img style={slideStyle} src={this.state.userAvatar} alt="Avatar"/> - <Typography style={publisherStyle}>Enviado por: <br/>{this.props.author}</Typography> - </div> - <img src={this.state.thumbnail} style={{height:"100%"}} alt="thumbnail do recurso"/> - </Container> - <CardContent style={{height: "60%", textAlign: "left", paddingBottom: "0px"}}> - <Typography variant="body2" color="textSecondary" component="p" style={{height:"45px", overflow: "hidden", fontSize: "0.8em"}}> - {this.props.name} - </Typography> - </CardContent> - <Container style={{textAlign: "left"}}> - - <Rating - name="customized-empty" - value={this.props.rating*10} - precision={0.5} - emptyIcon={<StarBorderIcon fontSize="inherit" />} - /> - </Container> - <CardActions style={{justifyContent: "space-between", padding: "0px"}}> - { this.props.type ==="VÃdeo" - ? <Video style={{color:"#ff7f00"}} /> - : <br/>} - <IconButton aria-label="Favoritar" size="small"> - <FavoriteIcon /> - </IconButton> - </CardActions> - <CardActions style={{borderTop:"1px solid #e5e5e5", justifyContent: "space-between"}}> + render() { + this.renderType(this.props.type); + this.defAvatar(); + return ( + <Card + onMouseOver={this.onHover.bind(this)} + onMouseOut={this.onIddle.bind(this)} + > + <Container + style={{ + padding: "0px", + height: "175px", + backgroundColor: "#ff7f00" + }} + > + <div className={this.state.userStyle}> + <img style={slideStyle} src={this.state.userAvatar} alt="Avatar" /> + <StyledPublisher style={publisherStyle}> + Enviado por: <br /> + {this.props.author} + </StyledPublisher> + </div> + <img + src={this.state.thumbnail} + style={{ height: "100%" }} + alt="thumbnail do recurso" + /> + </Container> + <CardContent + style={{ height: "60%", textAlign: "left", paddingBottom: "0px" }} + > + <Typography + variant="body2" + color="textSecondary" + component="p" + style={{ height: "45px", overflow: "hidden", fontSize: "0.8em" }} + > + {this.props.name} + </Typography> + </CardContent> + <Container style={{ textAlign: "left" }}> + <Rating + name="customized-empty" + value={this.props.rating * 10} + precision={0.5} + readOnly + emptyIcon={<StarBorderIcon fontSize="inherit" />} + /> + </Container> + <CardActions + style={{ justifyContent: "space-between", padding: "0px" }} + > + {this.props.type === "VÃdeo" ? ( + <Video style={{ color: "#ff7f00" }} /> + ) : ( + <br /> + )} + <IconButton aria-label="Favoritar" size="small"> + <FavoriteIcon /> + </IconButton> + </CardActions> + <CardActions + style={{ + borderTop: "1px solid #e5e5e5", + justifyContent: "space-between" + }} + > + <IconButton aria-label="Guardar" size="small"> + <AddIcon /> + </IconButton> + <Options /> + </CardActions> + </Card> + ); + } +} - <IconButton aria-label="Guardar" size="small"> - <AddIcon /> - </IconButton> - <Options/> - </CardActions> - </Card> - );} - } +const StyledPublisher = styled(Typography)` + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +` - export default ResourceCard; +export default ResourceCard; diff --git a/src/Components/ResourceCardFunction.js b/src/Components/ResourceCardFunction.js new file mode 100644 index 0000000000000000000000000000000000000000..d688ca3e6e154871fc8633416529f651e531e530 --- /dev/null +++ b/src/Components/ResourceCardFunction.js @@ -0,0 +1,374 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react'; +import Card from '@material-ui/core/Card'; +import { apiDomain } from '../env'; +import ResourceCardOptions from './ResourceCardOptions' +import noAvatar from "../img/default_profile.png"; +import Button from '@material-ui/core/Button'; +import styled from 'styled-components' +import Rating from '@material-ui/lab/Rating'; +import StarBorderIcon from '@material-ui/icons/StarBorder'; +import FavoriteIcon from '@material-ui/icons/Favorite'; +import ButtonGuardarColecao from './ButtonGuardarColecao.js' +import Slide from '@material-ui/core/Slide'; +import Grid from '@material-ui/core/Grid'; +import { Link } from 'react-router-dom'; +import { getDefaultThumbnail } from './HelperFunctions/getDefaultThumbnail' +import GetIconByName from './UploadPageComponents/GetIconByName' +import "./ResourceCard.css"; +import { putRequest } from './HelperFunctions/getAxiosConfig' + +export default function ResourceCardFunction(props) { + const [thumbnail, setThumbnail] = useState(null) + // eslint-disable-next-line + const [label, setLabel] = useState(props.type) + const [userAvatar, setUserAvatar] = useState(noAvatar) + const [slideIn, setSlide] = useState(false) + const controlSlide = () => { setSlide(!slideIn) } + const [liked, toggleLiked] = useState(props.liked) + const [likesCount, setLikesCount] = useState(props.likeCount) + + useEffect(() => { + //decide which thumbnail to use + if (props.thumbnail) { + setThumbnail(`${apiDomain}` + props.thumbnail) + } + else { + setThumbnail(getDefaultThumbnail(label)) + } + + if (props.avatar) { + setUserAvatar(`${apiDomain}` + props.avatar) + } + else { + setUserAvatar(require('../img/logo_parceiros/ic_default.png')) + } + + }, []) + + function handleSuccessLike(data) { + toggleLiked(!liked) + setLikesCount(data.count) + } + + const handleLike = () => { + const url = `/learning_objects/${props.id}/like/` + + putRequest(url, {}, handleSuccessLike, (error) => { console.log(error) }) + } + + const SlideAnimationContent = () => { + return ( + <SlideContentDiv> + <div style={{ padding: 7 }}> + <HeaderContainer container="row" justify="flex-start" alignItems="center" >{/*marginBottom:10px*/} + <AvatarDiv item xs={2}> + <img className="img" src={userAvatar} alt="user avatar" /> + </AvatarDiv> + <EnviadoPor item xs={10}> + Enviado por: + <p>{props.author}</p> + </EnviadoPor> + </HeaderContainer> + { + props.tags ? + <TagContainer container direction="row"> + { + props.tags.map((tag) => + <Grid item key={tag.id}> + <span >{tag.name}</span> + </Grid> + ) + } + </TagContainer> : + null + } + </div> + </SlideContentDiv> + ) + } + + return ( + <StyledCard> + <CardDiv> + <CardReaDiv> + <Header onMouseEnter={controlSlide} onMouseLeave={controlSlide}> + { + <Slide direction="left" in={slideIn} timeout={1000}> + <div className={`slideContentLinkAfterActive${slideIn}`}> + <Link to={props.href} className="text" > + {SlideAnimationContent()} + </Link> + </div> + </Slide > + } + <div className={`slideContentLinkBeforeActive${slideIn}`} style={{ height: '100%' }}> + <img className="img-cover" src={thumbnail} alt="learning object thumbnail" style={{ width: "272.5px" }} /> + </div> + </Header> + <Description> + <Link to={props.href} className="text" style={{ height: '45px' }}> {/*add link to learningObject*/} + <Title> + {props.title} + </Title> + </Link> + <Rating + name="customized-empty" + value={props.rating} + readOnly + style={{ color: "#666" }} + emptyIcon={<StarBorderIcon fontSize="inherit" />} + /> + <Footer> + <Type> + {GetIconByName(label)} + <span>{label}</span> + </Type> + <LikeCounter> + <span>{likesCount}</span> + <ButtonNoWidth onClick={handleLike}> + <FavoriteIcon style={{ color: liked ? "red" : "#666" }} /> + </ButtonNoWidth> + </LikeCounter> + </Footer> + </Description> + </CardReaDiv> + <CardReaFooter> + <div style={{ display: "flex", height: "100%" }}> + <ButtonGuardarColecao thumb={props.thumbnail} title={props.title} learningObjectId={props.id} + /> + </div> + <ResourceCardOptions + learningObjectId={props.id} + downloadableLink={props.downloadableLink} + thumb={props.thumbnail} + title={props.title} + /> + </CardReaFooter> + </CardDiv> + </StyledCard> + ) +} +/*---------- USED IN SLIDE DIV ONLY -----------*/ +export const HeaderContainer = styled(Grid)` + +` + +export const TagContainer = styled(Grid)` + margin-top: 0.5em; + height : 120px ; + overflow-y : hidden; + ${'' /* border : 2px solid red; */} + span { + word-wrap: break-word; + background-color : #fff; + display : flex; + justify-content : center; + align-items : center; + height : 22px; + tet-align : center; + margin: 3px; + -webkit-box-direction: normal; + overflow : hidden; + padding : 1px 8px; + border-radius : 10px; + color : #666; + font-size : 11px; + } +` + +export const EnviadoPor = styled(Grid)` + display : inline-block; + padding-left : 10px; + overflow : hidden; + color : #fff; + padding-right : 1em; + + p { + margin : 0; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; + } +` +export const AvatarDiv = styled(Grid)` + vertical-align : middle; + border : 0; + width : 40px; + height : 40px; + img { + max-height: 100%; + max-width: 100%; + border : 0; + vertical-align : middle; + border-radius : 50%; + } +` + +const SlideContentDiv = styled.div` + background-color : #ff9226; + ${'' /* padding : 10px; */} + width : 272.5px; + height : 189px; +` +/*--------------------------------------------*/ + +const CardReaFooter = styled.div` + height : 60px; + display : flex; + justify-content : space-between; + border-top : 1px solid #e5e5e5; + border-bottom : 1px solid #e5e5e5; + align-items : center; + padding : 0 15px 0 15px; +` + +export const ButtonNoWidth = styled(Button)` + max-width : 24px !important; + width : 24px !important; + min-width : 24px !important; + max-height : 24px !important; + padding : 0 !important; + background-color : #fff !important; + color : #a5a5a5 !important; + border : 0 !important; + + .MuiButton-root { + width : 24px !important; + min-width : 12px !important; + } + + .MuiSvgIcon-root { + padding-right : 0 !important; + } + + .MuiButton-label { + padding-left : 4px !important; + } +` + +export const LikeCounter = styled.div` + font-size : 14px; + + .btn-like { + padding : 0 !important; + background-color : #fff !important; + border : 0 !important; + min-width : min-content; + } + + .MuiSvgIcon-root { + font-size : 21px; + vertical-align : middle; + padding-right : .4em; + } +` + +const Type = styled.div` + line-height : 1; + + .icon { + height : 27px; + width : 27px; + padding-right : .4em; + vertical-align : middle + align-self : center; + + .st1 { + fill : #ff7f00; + } + } +` + +export const Footer = styled.div` + display : flex; + flex-direction : row; + justify-content : space-between; + margin-top : 5px; +` + +const Description = styled.div` + display : flex; + flex : 1; + background-color : #fff; + flex-direction : column; + justify-content: space-between; + padding : 15px; + + a { + text-decoration : none !important; + color : inherit; + } +` +const Title = styled.span` + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + color : #666; +` + +export const Header = styled.div` + display : flex; + flex : 2; + position : relative; + overflow : hidden; + + a { + text-decoration : none !important; + } +` + +export const CardReaDiv = styled.div` + display : flex; + flex-direction : column; + height : 320px; + ${'' /* width : 272.5px; */} + margin : 0 auto; + + .img-cover { + background-color : #e5e5e5; + height : 100%; + object-fit : cover; + overflow : hidden; + display : block; + background-position : center; + background-size : cover; + ${'' /* width : 100%; */} + } +` + +export const CardDiv = styled.div` + background-color : #fff; + text-align : start; + font-family : 'Roboto', sans serif; + color : #666; +` + +export const StyledCard = styled(Card)` + width : 272.5px; + max-height : 380px; + margin-top : 10px; + margin-bottom : 10px; + ${'' /* max-width : 345px; */} + border-radius : 0; + box-shadow : 0 0 5px 0 rgba(0,0,0,.25); +` diff --git a/src/Components/ResourceCardOptions.js b/src/Components/ResourceCardOptions.js new file mode 100644 index 0000000000000000000000000000000000000000..5d2821f3d9a39cc92af23d5ff1fa7c71de868777 --- /dev/null +++ b/src/Components/ResourceCardOptions.js @@ -0,0 +1,252 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useContext, useState } from 'react'; +import { Store } from '../Store.js' +import styled from 'styled-components' +import Button from '@material-ui/core/Button'; +import Menu from '@material-ui/core/Menu'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import MenuItem from '@material-ui/core/MenuItem'; +import MoreVertIcon from '@material-ui/icons/MoreVert'; +import OpenIcon from '@material-ui/icons/OpenInNew'; +import ReportIcon from '@material-ui/icons/Error'; +import ReportModal from './ReportModal.js' +import { Link } from 'react-router-dom' +import DownloadIcon from '@material-ui/icons/CloudDownload'; +import ShareIcon from '@material-ui/icons/Share'; +import AddIcon from '@material-ui/icons/CreateNewFolder'; +import GuardarModal from './GuardarModal' +import ShareModal from './ShareModal' +import SnackbarComponent from './SnackbarComponent' +import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser'; +import Tooltip from '@material-ui/core/Tooltip'; +import SignUpModal from './SignUpModal' +import LoginModal from './LoginModal.js' +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; +import { getRequest } from './HelperFunctions/getAxiosConfig' + +export default function ResourceCardOptions(props) { + const { state } = useContext(Store) + const [anchorEl, setAnchorEl] = React.useState(null); + + function handleClick(event) { + setAnchorEl(event.currentTarget); + } + + function handleClose() { + setAnchorEl(null); + } + + const [reportModal, toggleReportModal] = useState(false) + const handleModalReportar = (value) => { + toggleReportModal(value) + // {/*if (state.currentUser.id) { + // toggleReportModal(!reportModal) + // } + // else { + // toggleLoginModal(true) + // }*/} + } + + const [saveToCol, toggleSave] = useState(false) + const handleGuardar = () => { + if (!state.currentUser.id) { + handleLogin(); + } + else { + toggleSave(true); + } + handleClose() + } + + const enableDownload = () => { + const url = props.downloadableLink + window.open(url, '_blank'); + getRequest( + `/learning_objects/${props.learningObjectId}/download`, + (data, header) => { + }, + (error) => { + } + ) + toggleSnackbar(true) + } + + const [shareOpen, toggleShare] = useState(false) + + const handleShare = () => { + if (!state.currentUser.id) { + handleLogin() + } + else { + toggleShare(true); + } + handleClose() + } + const getShareablePageLink = () => { + return (window.origin + "/recurso/" + props.learningObjectId) + } + + const handleSignUp = () => { + setSignUp(!signUpOpen) + } + + const handleLogin = () => { + setLogin(!loginOpen) + } + + const handleReport = () => { + if (!state.currentUser.id) { + handleLogin() + } + else { + handleModalReportar(true); + } + handleClose(); + } + + function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; + } + + function toggleLoginSnackbar(reason) { + if (reason === 'clickaway') { + return; + } + handleSuccessfulLogin(false); + } + + const [snackbarOpen, toggleSnackbar] = useState(false) + const [signUpOpen, setSignUp] = useState(false) + const [loginOpen, setLogin] = useState(false) + const [successfulLoginOpen, handleSuccessfulLogin] = useState(false) + + return ( + <> + + <React.Fragment> + <ReportModal open={reportModal} handleClose={() => handleModalReportar(false)} + form="recurso" complainableId={props.learningObjectId} + complainableType={"LearningObject"} + {...props} + /> + <GuardarModal open={saveToCol} handleClose={() => { toggleSave(false) }} + thumb={props.thumb} title={props.title} recursoId={props.learningObjectId} + /> + <ShareModal open={shareOpen} handleClose={() => { toggleShare(false) }} + thumb={props.thumb} title={props.title} link={getShareablePageLink()} + /> + <SnackbarComponent snackbarOpen={snackbarOpen} severity={"info"} handleClose={() => { toggleSnackbar(false) }} text={"Baixando o Recurso... Lembre-se de relatar sua experiência após o uso do Recurso!"} + /> + <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} + /> + <LoginModal open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp} + openSnackbar={() => { handleSuccessfulLogin(true) }} + /> + <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleLoginSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + > + <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert> + </Snackbar> + <div style={{ fontSize: "12px", display: "flex", flexDirection: "column", justifyContent: "center" }}> + <ButtonNoWidth aria-controls="simple-menu" aria-haspopup="true" onClick={handleClick} style={{ color: "#666" }}> + <MoreVertIcon style={{ color: "#666" }} /> + </ButtonNoWidth> + <Menu + id="simple-menu" + anchorEl={anchorEl} + keepMounted + open={Boolean(anchorEl)} + onClose={handleClose} + > + <Tooltip title="Não preserva filtro" arrow> + <StyledMenuItem onClick={handleClose}> + <Link to={"/recurso/" + props.learningObjectId}> + <ListItemIcon><OpenIcon /></ListItemIcon>Abrir + </Link> + </StyledMenuItem> + </Tooltip> + + <Tooltip title="Preserva filtro" arrow> + <StyledMenuItem onClick={() => window.open("/recurso/" + props.learningObjectId, "_blank")}> + <ListItemIcon><OpenInBrowserIcon /></ListItemIcon> Abrir em nova guia + </StyledMenuItem> + </Tooltip> + + { + props.downloadableLink && + <StyledMenuItem onClick={() => { enableDownload(); handleClose() }}> + <ListItemIcon><DownloadIcon /></ListItemIcon>Baixar + </StyledMenuItem> + } + + <StyledMenuItem onClick={handleShare}> + <ListItemIcon><ShareIcon /></ListItemIcon>Compartilhar + </StyledMenuItem> + + <StyledMenuItem onClick={handleGuardar}> + <ListItemIcon><AddIcon /></ListItemIcon>Guardar + </StyledMenuItem> + + <StyledMenuItem onClick={() => { handleReport() }}> + <ListItemIcon><ReportIcon /></ListItemIcon>Reportar + </StyledMenuItem> + + </Menu> + </div> + </React.Fragment> + </> + ); +} + +const ButtonNoWidth = styled(Button)` + width : 24px !important; + min-width : 24px !important; + max-height : 24px !important; + padding : 0 !important; + background-color : #fff !important; + color : #a5a5a5 !important; + border : 0 !important; + + .MuiButton-root { + width : 24px !important; + min-width : 12px !important; + } + + .MuiSvgIcon-root { + padding-right : 0 !important; + vertical-align : middle; + } + + .MuiButton-label { + padding-left : 4px !important; + } + ` + +const StyledMenuItem = styled(MenuItem)` + color : #666 !important; + .MuiSvgIcon-root { + vertical-align : middle !important; + } + a { + text-decoration : none !important; + color : #666 !important; + } +` diff --git a/src/Components/ResourceList.js b/src/Components/ResourceList.js new file mode 100644 index 0000000000000000000000000000000000000000..4f2572f4fae05fe6ee995918d48a4584af4b0264 --- /dev/null +++ b/src/Components/ResourceList.js @@ -0,0 +1,188 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react'; +import { Grid } from '@material-ui/core'; +import styled from 'styled-components'; +import axios from 'axios'; +import Button from '@material-ui/core/Button'; +import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank'; +import CheckBoxIcon from '@material-ui/icons/CheckBox'; +import GetAppIcon from '@material-ui/icons/GetApp'; +import ResourceCardFunction from './ResourceCardFunction.js'; +import FloatingDownloadButton from './FloatingDownloadButton.js'; +import Snackbar from '@material-ui/core/Snackbar'; +import MuiAlert from '@material-ui/lab/Alert'; +import { apiUrl } from '../env.js'; + +function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} + + +export default function ResourceList(props) { + + const [selected, setSelected] = useState(Array.apply( + null, { length: props.resources.length }).map(i => false)); + const [selectable, setSelectable] = useState(false); + const [download_url, setDownloadUrl] = useState(''); + const [snackbar_open, setSnackbarOpen] = useState(false); + + const updateSelected = (index) => { + let new_selected = selected.slice(); + new_selected[index] = !new_selected[index]; + setSelected(new_selected); + } + + const checkBoxIcon = (s) => { + if (s) + return <CheckBoxIcon />; + else + return <CheckBoxOutlineBlankIcon />; + } + + const handleDownloadSelection = () => { + // const selected_resources = props.resources.filter(resource => selected[props.resources.indexOf(resource)]); + setSnackbarOpen(true); + } + + useEffect(() => { + if (selectable) { + var resources = [] + let i = 0; + while (i < props.resources.length) { + if (selected[i]) + resources.push({ "type": "LearningObject", "id": props.resources[i].id }); + i++; + } + var body = { + "package": { + "object": resources + } + }; + if (resources.length) + axios + .post(apiUrl + '/package', body) + .catch(err => { + if (err.response && err.response.status === 302) { + setDownloadUrl(apiUrl.slice().replace('/v1', '') + '/' + err.response.data.url); + } + }); + } + }, [selected, selectable]); + return ( + <ResourceListContainer> + <Grid container direction="row" justify="space-around" alignItems="center"> + <Grid item> + <Title> + {props.resources.length ? + props.resources.length + " recurso" + (props.resources.length === 1 ? "" : "s") + : "Carregando coleção"} + </Title> + </Grid> + <Grid item> + <Button color="primary" onClick={() => setSelectable(!selectable)}> + <PanelButtonText> + {selectable ? "Desativar" : "Ativar"} seleção + </PanelButtonText> + </Button> + </Grid> + <Grid item> + <UnstyledAnchor href={download_url}> + <Button + color="primary" + variant="outlined" + startIcon={<GetAppIcon fontSize="large" />} + onClick={handleDownloadSelection} + > + <PanelButtonText>baixar seleção</PanelButtonText> + </Button> + </UnstyledAnchor> + </Grid> + </Grid> + <Grid container direction="row" justify="center" alignItems="center"> + {props.resources.map((card) => { + return ( + <ResourceGrid item key={card.title}> + <ResourceCardFunction + avatar={card.avatar} + id={card.id} + thumbnail={card.thumbnail} + type={card.type ? card.type : "Outros"} + title={card.title} + published={card.state === "published" ? true : false} + likeCount={card.likeCount} + liked={card.liked} + rating={card.rating} + author={card.publisher} + tags={card.tags} + href={"/recurso/" + card.id} + downloadableLink={card.downloadableLink} + /> + {selectable ? + (<SelectButton + variant="outline" + color="primary" + startIcon={checkBoxIcon(selected[props.resources.indexOf(card)])} + onClick={() => updateSelected(props.resources.indexOf(card))} + > + Selecionar + </SelectButton>) + : + <span></span>} + + </ResourceGrid> + ); + })} + </Grid> + <Snackbar + open={snackbar_open} + autoHideDuration={6000} + onClose={() => setSnackbarOpen(false)} + anchorOrigin={{ vertical: 'top', horizontal: 'right' }} + > + <Alert onClose={() => setSnackbarOpen(false)} severity="info"> + Os recursos serão baixados + </Alert> + </Snackbar> + <FloatingDownloadButton url={download_url} empty={selected.indexOf(true) === -1} /> + </ResourceListContainer> + ); +} + +const ResourceListContainer = styled.div` + margin-left: 20; + margin-right: 20; +` +const Title = styled.p` + color: rgb(102, 102, 102); + font-size: 2em; + font-weigth: 300; +` +const SelectButton = styled(Button)` + width: 100%; +` +const PanelButtonText = styled.span` + font-weight: 900; +` +const ResourceGrid = styled(Grid)` + padding-right: 7px; +` +const UnstyledAnchor = styled.a` + text-decoration: none !important; +` diff --git a/src/Components/ResourcePageComponents/CommentForm.js b/src/Components/ResourcePageComponents/CommentForm.js new file mode 100644 index 0000000000000000000000000000000000000000..0b1c38ba693b98b03c689f18035a6f81478d9cd9 --- /dev/null +++ b/src/Components/ResourcePageComponents/CommentForm.js @@ -0,0 +1,197 @@ +import React, {useState} from 'react' +import styled from 'styled-components' +import Rating from '@material-ui/lab/Rating'; +import StarIcon from '@material-ui/icons/Star'; +import TextField from "@material-ui/core/TextField"; +import { Button } from '@material-ui/core'; +import EditIcon from '@material-ui/icons/Edit'; +import Grid from '@material-ui/core/Grid'; +import {postRequest} from '../HelperFunctions/getAxiosConfig' + +export default function CommentForm (props) { + const [rating, setRating] = useState({ + error : true, + value : 0 + }) + const [comment, setComment] = useState({ + error : false, + value : '' + }) + + const handleChange = (e) => { + const userInput = e.target.value + const flag = (userInput.length === 0 ? true : false); + setComment({...comment, error : flag, value : userInput}) + } + + const [attemptedSubmit, setAttempt] = useState(false) + + function handleSuccess (data) { + props.handleSnackbar(1) + props.rerenderCallback() + } + const handleSubmit = (e) => { + e.preventDefault() + const finalRating = rating + const finalComment = comment + + if (!(finalRating.error || finalComment.error)) { + let type = props.recurso ? 'learning_objects' : 'collections' + const url = `/${type}/${props.recursoId}/reviews` + + let payload = { + "review" : { + "description" : finalComment.value, + "review_ratings_attributes" : [ + { + "rating_id" : 1, + "value" : finalRating.value + } + ] + } + } + + postRequest(url, payload, handleSuccess, (error) => {console.log(error)}) + } + else { + setAttempt(true) + } + } + + return ( + <StyledForm onSubmit={handleSubmit}> + <label htmlFor="avaliacao-estrelas" className="start-label"> + {props.recurso ? "Este recurso foi útil?*" : "Esta coleção foi útil?*"} + </label> + <div className="stars-container"> + <Rating + name="avaliacao-estrelas" + value={rating.value} + precision={0.5} + style={{color:"#ff9226"}} + onChange = {(e, newValue) => {setRating({...rating, error : newValue === null ? true : false, value : newValue})}} + emptyIcon={<StarIcon fontSize="inherit" style={{color : "#666"}} />} + getLabelText={(value) => {return(value + ' Estrela' + (value !== 1 ? 's' : ''))}} + /> + </div> + <div className="star-alert" style={attemptedSubmit ? {visibility : "visible"} : {visibility : "hidden" }}>{props.recurso ? "Avalie se o recurso foi útil." : "Avalie se esta coleção foi útil."}</div> + + <Grid container> + <Grid item xs={12} md={9}> + <StyledTextField + colecao={!props.recurso} + value={comment.value} + multiline + rows="5" + error={comment.error} + label={props.recurso ? "Escreva aqui a sua experiência com este Recurso" : "Escreva aqui a sua experiência com esta Coleção"} + onChange={e => handleChange(e)} + required={true} + help = {comment.error ? (props.recurso ? "Escreva aqui a sua experiência com este Recurso" : "Escreva aqui a sua experiência com esta Coleção") : ''} + /> + </Grid> + <Grid item xs={12} md={3}> + <div style={{height : "100%", display : "flex", flexDirection : "column", justifyContent : "flex-end"}}> + { + props.recurso ? + ( + <OrangeButton type="submit">Publicar</OrangeButton> + ) + : + ( + <PurpleButton type="submit"><EditIcon/>Enviar</PurpleButton> + ) + } + </div> + </Grid> + + <div className="campos-obrigatorios">* Campos obrigatórios.</div> + </Grid > + </StyledForm> + ) +} + +const PurpleButton = styled(Button)` + background-color : #673ab7 !important; + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + font-weight : 600 !important; + color : #fff !important; + .icon { + vertical-align : middle !important; + font-weight : normal !important; + font-style : normal !important; + font-size : 24px !important; + line-height : 1 !important; + letter-spacing : normal !important; + text-transform : none !important; + display : inline-block !important; + white-space : nowrap !important; + word-wrap : normal !important; + direction : ltr !important; + padding-right : 2px; + } +` + +const OrangeButton = styled(Button)` + color : rgba(255,255,255,0.87) !important; + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + font-weight : 600 !important; + background-color : #ff7f00 !important; +` + +const StyledTextField = styled(TextField)` + .MuiInputBase-root { + margin-bottom : 5px; + } + + label.Mui-focused { + color : ${props => props.colecao ? "#673ab7" : "rgb(255,127,0)"} + } + + .MuiInput-underline::after { + border-bottom: ${props => props.colecao ? "2px solid #673ab7" : "2px solid rgb(255,127,0)" }; + } + + label.Mui-focused.Mui-error { + color : red; + } + + width: 95%; +` + +const StyledForm = styled.form` + display : flex; + flex-direction : column; + text-align : start; + + .start-label { + font-size : 14px; + max-width : 100%; + display : inline-block; + margin-bottom : 0; + color : #a5a5a5; + font-weight : 400; + } + + .stars-container { + padding-top : 10px; + padding-bottom : 5px; + display : flex; + flex-direction : row; + align-self : flex-start; + margin-bottom : 5px; + color : #a5a5a5; + } + + .star-alert { + color : #666; + text-align : start; + } + + .campos-obrigatorios { + padding-top : 18px; + font-weight : 400; + font-size : 12px; + color :#a5a5a5; + } +` diff --git a/src/Components/ResourcePageComponents/CommentsArea.js b/src/Components/ResourcePageComponents/CommentsArea.js new file mode 100644 index 0000000000000000000000000000000000000000..946ce4d4fc3e276b95e673a742b58a973f6fe065 --- /dev/null +++ b/src/Components/ResourcePageComponents/CommentsArea.js @@ -0,0 +1,258 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, useContext, useEffect} from 'react' +import {Store} from '../../Store.js' +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; +import { Button } from '@material-ui/core'; +import ExitToAppIcon from '@material-ui/icons/ExitToApp'; +import Comentarios from '../../img/comentarios.png' +import {apiDomain} from '../../env'; +import CommentForm from './CommentForm.js' +import Comment from '../Comment.js' +import {getRequest} from '../HelperFunctions/getAxiosConfig' +import LoginModal from './../LoginModal.js' +import Snackbar from '@material-ui/core/Snackbar'; +import SignUpModal from './../SignUpModal' +import MuiAlert from '@material-ui/lab/Alert'; + +function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} + +export default function CommentsArea (props) { + const {state} = useContext(Store) + const [comentarios, setComentarios] = useState([]) + const [gambiarra, setState] = useState(0) + const forceUpdate = () => {setState(gambiarra + 1)} + const [loginOpen, setLogin] = useState(false) + const [successfulLoginOpen, handleSuccessfulLogin] = useState(false) + const [signUpOpen, setSignUp] = useState(false) + + const handleSignUp = () => { + setSignUp(!signUpOpen) + } + + const handleLogin = () => { + setLogin(!loginOpen) + } + + const toggleSnackbar = (event, reason) => { + if (reason === 'clickaway') { + return; + } + + handleSuccessfulLogin(false); + } + + function handleSuccess (data) { + setComentarios(data.sort((a, b) => a.updated_at > b.updated_at ? -1 : 1)) + } + + useEffect( () => { + const url = `/learning_objects/${props.recursoId}/reviews` + + getRequest(url, handleSuccess, (error) => {console.log(error)}) + }, [gambiarra]) + + return ( + <React.Fragment> + <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + > + <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert> + </Snackbar> + {/*-------------------------------MODALS---------------------------------------*/} + <LoginModal open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp} + openSnackbar={() => { handleSuccessfulLogin(true) }} + /> + <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} /> + {/*----------------------------------------------------------------------------*/} + <Grid container spacing={2} style={{padding : "10px"}}> + { + (state.currentUser.id !== '') ? + ( + <Grid item xs={12} > + <GrayContainer> + <h3>Conte sua experiência com o Recurso</h3> + <Grid container style={{paddingTop : "20px"}}> + <Grid item xs={2} style={{paddingLeft : "15px", paddingRight : "15px"}}> + <img src={apiDomain + state.currentUser.avatar} className="minha-imagem" alt="user avatar"/> + </Grid> + <Grid item xs={10}> + <CommentForm + recursoId={props.recursoId} + handleSnackbar={props.handleSnackbar} + rerenderCallback={forceUpdate} + recurso={props.recurso} + /> + </Grid> + </Grid> + </GrayContainer> + </Grid> + ) + : + ( + <Grid item xs={12}> + <LogInToComment> + <span className="span-laranja">Você precisa entrar para comentar</span> + <Button onClick={() => handleLogin(true)} style={{textTransform : "uppercase", color : "#666", fontWeight : "700"}}> + <ExitToAppIcon/>ENTRAR + </Button> + </LogInToComment> + </Grid> + ) + } + { + comentarios.length !== 0 ? + ( + <ComentariosBox> + <h3>{comentarios.length} {comentarios.length !== 1 ? 'Relatos' : 'Relato'} sobre o uso do Recurso</h3> + { + comentarios.map( comentario => + <div className="comentario-template" key={comentario.id}> + <Comment + authorID={comentario.user ? comentario.user.id : null} + authorAvatar={comentario.user ? comentario.user.avatar : null} + authorName={comentario.user ? comentario.user.name : null} + name={comentario.name} + rating={comentario.rating_average} + reviewRatings = {comentario.review_ratings} + description={comentario.description} + createdAt={comentario.created_at} + recurso={true} + reviewID={comentario.id} + objectID={props.recursoId} + rerenderCallback={forceUpdate} + handleSnackbar={props.handleSnackbar} + /> + </div> + ) + } + </ComentariosBox> + ) + : + ( + <Grid item xs={12}> + <LogInToComment> + <img alt="" src={Comentarios} /> + <span className="span-laranja">Compartilhe sua experiência com a Rede!</span> + <AoRelatar> + Ao relatar sua experiência de uso do Recurso você estará auxiliando professores de todo paÃs. + </AoRelatar> + </LogInToComment> + </Grid> + ) + } + </Grid> + </React.Fragment> + ) +} + + +const ComentariosBox = styled.div` + display : flex; + flex-direction : column; + padding : 20px; + width : 100%; + + h3 { + font-family: 'Roboto Light','Roboto Regular',Roboto; + font-weight: 300; + font-style: normal; + color:#666; + font-size: 1.857em; + margin: 15px 2%; + text-align : flex-start; + } + + .comentario-template { + padding : 20px 0; + border-bottom : 1px solid #f4f4f4; + } +` +const AoRelatar = styled.div` + width : 70%; + font-size : 20px; + font-weight : 300; + text-align : center; + padding-bottom : 20px; +` + +const LogInToComment = styled.div` + display : flex; + flex-direction : column; + text-align : center; + padding : 20px; + align-items : center; + + .span-laranja { + font-size : 24px; + font-weight : 700; + padding-bottom : 5px; + color : #ff7f00; + } + + img { + object-fit : contain !important; + background-color : transparent !important; + } +` + +const GrayContainer = styled.div` + background-color : #fafafa; + font-weight : 400; + display : flex; + flex-direction : column; + justify-content : space-between; +<<<<<<< HEAD + font-size : 14px; + padding-bottom : 20px; + @media screen and (min-width : 990px) { + padding-right : 15px; + padding-left : 15px; + } +======= + padding-right : 15px; + padding-left : 15px; + padding-bottom : 20px; +>>>>>>> fead909286087ce07b01b25f6d8f46f74dc494c8 + + h3 { + font-family : 'Roboto Light','Roboto Regular',Roboto; + font-weight: 300; + font-style: normal; + color: #666; + font-size: 1.857em; + margin-bottom : 10px; + margin-left : 2%; + margin-top : 2%; + } + + .minha-imagem { + height: 60px; + width: 60px; + border-radius: 50%; + margin-left: 2%; + margin-top: 5%; + } + img { + vertical-align :middle; + } +` diff --git a/src/Components/ResourcePageComponents/Footer.js b/src/Components/ResourcePageComponents/Footer.js new file mode 100644 index 0000000000000000000000000000000000000000..98e7fcd119baab3a54029a86ada0860dc0526dd8 --- /dev/null +++ b/src/Components/ResourcePageComponents/Footer.js @@ -0,0 +1,381 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useContext } from 'react' +import { Store } from '../../Store.js' +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; +import { Button } from '@material-ui/core'; +import ErrorIcon from '@material-ui/icons/Error'; +import ShareIcon from '@material-ui/icons/Share'; +import FolderIcon from '@material-ui/icons/Folder'; +import GetAppIcon from '@material-ui/icons/GetApp'; +import CallMadeIcon from '@material-ui/icons/CallMade'; +import ReportModal from '../ReportModal.js' +import ShareModal from '../ShareModal.js' +import GuardarModal from '../GuardarModal.js' +import RedirectModal from '../RedirectModal' +import MoreVertIcon from '@material-ui/icons/MoreVert'; +import Menu from '@material-ui/core/Menu'; +import MenuItem from '@material-ui/core/MenuItem'; +import LoginModal from './../LoginModal.js' +import Snackbar from '@material-ui/core/Snackbar'; +import SignUpModal from './../SignUpModal' +import MuiAlert from '@material-ui/lab/Alert'; +import { getRequest } from '../HelperFunctions/getAxiosConfig' + +function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} + +function ReportButton(props) { + return ( + !props.complained ? + ( + <ButtonGrey onClick={props.userLoggedIn ? props.toggleReport : props.openLogin}> + <span className="button-text"> + <ErrorIcon className="icon" /> Reportar abuso ou erro + </span> + </ButtonGrey> + ) + : + ( + <ButtonGrey> + <span className="button-text-report"> + <ErrorIcon className="icon" /> Você já reportou este recurso + </span> + </ButtonGrey> + ) + ) +} + +function DownloadButton(props) { + return ( + props.downloadableLink ? + ( + <ButtonOrange onClick={props.enableDownload}> + <span className="text"> + <GetAppIcon className="icon" /> Baixar Recurso + </span> + </ButtonOrange> + ) + : + props.link ? + ( + <ButtonOrange onClick={props.toggleRedirect}> + <span className="text"> + <CallMadeIcon className="icon" /> Abrir Recurso + </span> + </ButtonOrange> + ) + : + ( + <React.Fragment /> + ) + ) +} + +export default function Footer(props) { + const { state } = useContext(Store) + let windowWidth = window.innerWidth + const [reportOpen, toggleReport] = useState(false) + const [shareOpen, toggleShare] = useState(false) + const [saveToCol, toggleSave] = useState(false) + const [redirectOpen, toggleRedirect] = useState(false) + const [loginOpen, setLogin] = useState(false) + const [successfulLoginOpen, handleSuccessfulLogin] = useState(false) + const [signUpOpen, setSignUp] = useState(false) + const [anchorEl, setAnchorEl] = React.useState(null); + + const enableDownload = () => { + props.handleSnackbar(0) + const url = props.downloadableLink + window.open(url, '_blank'); + + // there is no error controller here because the router + ///:type/:id/download is always returning error + getRequest( + `/learning_objects/${props.recursoId}/download`, + (data, header) => { + }, + (error) => { + } + ) + } + + const handleSignUp = () => { + setSignUp(!signUpOpen) + } + + const handleLogin = () => { + setLogin(!loginOpen) + } + + const toggleSnackbar = (event, reason) => { + if (reason === 'clickaway') { + return; + } + + handleSuccessfulLogin(false); + } + + function handleClick(event) { + setAnchorEl(event.currentTarget); + } + + function handleClose() { + setAnchorEl(null); + } + + return ( + <React.Fragment> + <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + > + <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert> + </Snackbar> + {/*-------------------------------MODALS---------------------------------------*/} + <ReportModal open={reportOpen} handleClose={() => { toggleReport(false) }} + form="recurso" + complainableId={props.recursoId} + complainableType={"LearningObject"} + /> + <ShareModal open={shareOpen} handleClose={() => { toggleShare(false) }} + thumb={props.thumb} title={props.title} link={props.currPageLink} + /> + + <GuardarModal open={saveToCol} handleClose={() => { toggleSave(false) }} + thumb={props.thumb} title={props.title} recursoId={props.recursoId} + /> + <RedirectModal open={redirectOpen} handleClose={() => { toggleRedirect(false) }} + link={props.link} + /> + <LoginModal open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp} + openSnackbar={() => { handleSuccessfulLogin(true) }} + /> + <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} /> + {/*----------------------------------------------------------------------------*/} + + {/*-----------------------------BUTTONS----------------------------------------*/} + <OpcoesDiv> + <StyledGrid container> + { + windowWidth > 990 ? + ( + <React.Fragment> + {/*Botao Reportar*/} + <Grid item xs={3}> + <ReportButton + userLoggedIn={state.currentUser.id === '' ? false : true} + toggleReport={() => { toggleReport(true) }} + openLogin={handleLogin} + complained={props.complained} + /> + </Grid> + + {/*Botao Compartilhar*/} + <Grid item xs={3}> + <ButtonGrey onClick={state.currentUser.id === '' ? () => handleLogin(true) : () => toggleShare(true)}> + <span className="button-text"> + <ShareIcon className="icon" /> Compartilhar + </span> + </ButtonGrey> + </Grid> + + {/*Botao Guardar*/} + <Grid item xs={3}> + <ButtonGrey onClick={state.currentUser.id === '' ? () => handleLogin(true) : () => toggleSave(true)}> + <span className="button-text"> + <FolderIcon className="icon" />Guardar + </span> + </ButtonGrey> + </Grid> + + <Grid item xs={3} style={{ justifyContent: "right !important" }}> + <DownloadButton + downloadableLink={props.downloadableLink} + link={props.link} + enableDownload={enableDownload} + toggleRedirect={() => { toggleRedirect(true) }} + /> + </Grid> + </React.Fragment> + ) + : + ( + <React.Fragment> + {/*Botao Guardar*/} + <Grid item xs={4}> + <ButtonGrey onClick={state.currentUser.id === '' ? () => handleLogin(true) : () => toggleSave(true)}> + <span className="button-text"> + <FolderIcon className="icon" />Guardar + </span> + </ButtonGrey> + </Grid> + + <Grid item xs={7}> + <DownloadButton + downloadableLink={props.downloadableLink} + link={props.link} + enableDownload={enableDownload} + toggleRedirect={() => { toggleRedirect(true) }} + /> + </Grid> + + <Grid item xs={1}> + <Button aria-haspopup="true" onClick={handleClick} style={{ color: "#666" }}> + <MoreVertIcon /> + </Button> + <Menu + id="simple-menu" + anchorEl={anchorEl} + keepMounted + open={Boolean(anchorEl)} + onClose={handleClose} + > + <MenuItem> + <ReportButton + userLoggedIn={state.currentUser.id === '' ? false : true} + toggleReport={() => { toggleReport(true) }} + openLogin={handleLogin} + complained={props.complained} + /> + </MenuItem> + <MenuItem> + <ButtonGrey onClick={state.currentUser.id === '' ? () => handleLogin(true) : () => toggleShare(true)}> + <span className="button-text"> + <ShareIcon className="icon" /> Compartilhar + </span> + </ButtonGrey> + </MenuItem> + </Menu> + </Grid> + </React.Fragment> + ) + } + + + </StyledGrid> + </OpcoesDiv> + </React.Fragment> + ) +} + +const OpcoesDiv = styled.div` + display : flex; + align-items : center; + height : 65px; + background-color : #fafafa; +` + +const StyledGrid = styled(Grid)` + @media screen and (min-width: 990px) { + padding-left : 15px !important; + } + + .MuiGrid-item { + padding-right : 15px; + padding-left : 15px; + display : flex; + justify-content : center; + } +` + +const ButtonGrey = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + background-color : transparent !important; + color : #666 !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; + + .icon { + vertical-align : middle !important; + font-weight : normal !important; + font-style : normal !important; + font-size : 24px !important; + line-height : 1 !important; + letter-spacing : normal !important; + text-transform : none !important; + display : inline-block !important; + white-space : nowrap !important; + word-wrap : normal !important; + direction : ltr !important; + padding-right : 2px; + color : inherit !important; + } + + .button-text { + cursor : pointer; + line-height : 36px; + text-align : center; + color : currentColor; + white-space : nowrap; + text-transform : uppercase; + font-weight : 600; + font-size : 14px; + font-style : inherit; + font-variant : inherit; + } + .button-text-report { + cursor : pointer; + line-height : 36px; + text-align : center; + color : red !important; + white-space : nowrap; + text-transform : uppercase; + font-weight : 600; + font-size : 14px; + font-style : inherit; + font-variant : inherit; + } +` + +const ButtonOrange = styled(Button)` + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + background-color : #ff7f00 !important; + color : #fff !important; + text-decoration : none !important; + text-transform : uppercase !important; + outline : none !important; + text-align : center !important; + max-height : 36px; + margin-top : 5px !important; + + .icon { + vertical-align : middle !important; + font-weight : normal !important; + font-style : normal !important; + font-size : 24px !important; + line-height : 1 !important; + letter-spacing : normal !important; + text-transform : none !important; + display : inline-block !important; + white-space : nowrap !important; + word-wrap : normal !important; + direction : ltr !important; + padding-right : 2px; + } + + .text { + font-size : 14px; + font-weight : 600; + } +` diff --git a/src/Components/ResourcePageComponents/Sobre.js b/src/Components/ResourcePageComponents/Sobre.js new file mode 100644 index 0000000000000000000000000000000000000000..2de37ad9f73eb7abd78231d078a02c91e6ba350d --- /dev/null +++ b/src/Components/ResourcePageComponents/Sobre.js @@ -0,0 +1,454 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useContext, useState, useEffect} from 'react' +import {Store} from '../../Store' +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; +import {Link} from 'react-router-dom' +import {NoIcon} from '../ContactButtons/FollowButton.js' +import {NoIconFollowing} from '../ContactButtons/FollowingButton.js' +import Collapse from '@material-ui/core/Collapse'; +import SdCardIcon from '@material-ui/icons/SdCard'; +import TranslateIcon from '@material-ui/icons/Translate'; +import InsertDriveFileIcon from '@material-ui/icons/InsertDriveFile'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import ExpandLessIcon from '@material-ui/icons/ExpandLess'; +import DateRangeIcon from '@material-ui/icons/DateRange'; +import UpdateIcon from '@material-ui/icons/Update'; +import AssignmentIcon from '@material-ui/icons/Assignment'; +import License from '../../img/cc_license.png' +import ContactCardOptions from '../ContactCardOptions.js' +import LoginModal from './../LoginModal.js' +import Snackbar from '@material-ui/core/Snackbar'; +import SignUpModal from './../SignUpModal' +import MuiAlert from '@material-ui/lab/Alert'; + +function Alert(props) { + return <MuiAlert elevation={6} variant="filled" {...props} />; +} + +function AdditionalInfoItem (props) { + return ( + <span className="meta-objeto"> + {props.icon} + <span>{props.label}</span> + {props.value} + </span> + ) +} + +export default function Sobre (props) { + const {state} = useContext(Store) + + const [collapsed, setCollapsed] = useState(false) + const toggleCollapsed = () => {setCollapsed(!collapsed)}; + const [loginOpen, setLogin] = useState(false) + const [successfulLoginOpen, handleSuccessfulLogin] = useState(false) + const [signUpOpen, setSignUp] = useState(false) + + const handleSignUp = () => { + setSignUp(!signUpOpen) + } + + const handleLogin = () => { + setLogin(!loginOpen) + } + + const toggleSnackbar = (event, reason) => { + if (reason === 'clickaway') { + return; + } + + handleSuccessfulLogin(false); + } + + var moment = require('moment') + + const [additionalInfo, setAdditionalInfo] = useState() + + useEffect(() => { + let aux = [] + + if (props.attachments && props.attachments[0]){ + aux.push(<AdditionalInfoItem + icon={<SdCardIcon/>} + label={'Tamanho: '} + value={(props.attachments[0].size / 1000000).toFixed(2) + ' Mb'} + key={props.attachments[0].id} + />) + } + + if(props.language){ + props.language.map( (lang) => + aux.push(<AdditionalInfoItem + icon={<TranslateIcon/>} + label={'Idioma: '} + value={lang.name} + key={lang.id} + /> + )) + } + + if (props.mimeType){ + aux.push(<AdditionalInfoItem + icon={<InsertDriveFileIcon/>} + label={'Formato: '} + value={props.mimeType} + key={props.mimeType} + />) + } + if (props.createdAt) { + aux.push(<AdditionalInfoItem + icon={<DateRangeIcon/>} + label={'Data de Envio: '} + value={moment(props.createdAt).format("DD/MM/YYYY")} + key={"dateCreatedAt"} + />) + } + if (props.updatedAt) { + aux.push(<AdditionalInfoItem + icon={<UpdateIcon/>} + label={'Modificado em: '} + value={moment(props.createdAt).format("DD/MM/YYYY")} + key={"dateUpdatedAt"} + />) + } + if (props.license) { + aux.push(<AdditionalInfoItem + icon={<AssignmentIcon/>} + label={'Tipo de licença: '} + value={ + <div className="license-link"> + <a href={props.license.url}> + <img src={License} alt="license"/> + </a> + <p> + {props.license.name} + </p> + </div> + } + key={props.license.id} + />) + } + else { + aux.push(<AdditionalInfoItem + icon={<AssignmentIcon/>} + label={'Tipo de licença: '} + value={ + <div className="license-link"> + <p> + Informação não disponÃvel. + </p> + </div> + } + key={"no-license"}/>) + } + setAdditionalInfo(aux) + }, []) + + let windowWidth = window.innerWidth + + const [followed, setFollowed] = useState(props.followed) + const toggleFollowed = () => {setFollowed(!followed)} + + return ( + <React.Fragment> + <Snackbar open={successfulLoginOpen} autoHideDuration={1000} onClose={toggleSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'center' }} + > + <Alert severity="success" style={{ backgroundColor: "#00acc1" }}>Você está conectado(a)!</Alert> + </Snackbar> + {/*-------------------------------MODALS---------------------------------------*/} + <LoginModal open={loginOpen} handleClose={() => setLogin(false)} openSignUp={handleSignUp} + openSnackbar={() => { handleSuccessfulLogin(true) }} + /> + <SignUpModal open={signUpOpen} handleClose={handleSignUp} openLogin={handleLogin} /> + {/*----------------------------------------------------------------------------*/} + <Grid container style={{paddingRight : "15px", paddingLeft : "15px"}}> + + <Grid item xs={windowWidth > 990 ? 9 : 12} style={{paddingRight : "15px"}}> + <Collapse in={collapsed} collapsedHeight={338}> + <SobreDiv> + <div className="titulo"> + Sobre o Recurso + </div> + + <div className="sobre-conteudo"> + <div className="tags-container"> + { + props.tags && + props.tags.map( (tag) => + <span key={tag.name}>{tag.name}</span> + ) + } + </div> + <div className="conteudo"> + <p className="descricao-objeto">{props.description}</p> + { + props.author && + <p className="autoria"> + <b>Autoria: </b>{props.author} + </p> + } + </div> + </div> + + <div className="titulo"> + Informações Adicionais + </div> + + {additionalInfo} + + </SobreDiv> + </Collapse> + </Grid> + + <Grid item xs={windowWidth > 990 ? 3 : 12}> + <MetasObjeto> + <div className="enviado-por"> + Enviado por: + </div> + + + <div className="foto-autor"> + <Link to={"/usuario-publico/" + props.id}> + <img src={props.avatar} alt="user avatar"/> + </Link> + </div> + + <div className="nome-autor"> + <Link to={"/usuario-publico/" + props.id} style={{textDecoration : "none"}}> + <span className="span-st">{props.publisher}</span> + </Link> + </div> + + <div style={{paddingTop : "0.75em", display : "flex", justifyContent : "center"}}> + { + (props.id !== state.currentUser.id) && + followed ? ( + <> + <NoIconFollowing followedID={props.id} toggleFollowed={toggleFollowed}/> + <ContactCardOptions followed={followed} followableID={props.id} toggleFollowed={toggleFollowed}/> + </> + ) + : + ( + <> + <NoIcon followableID={props.id} toggleFollowed={toggleFollowed}/> + <ContactCardOptions followed={followed} followableID={props.id} toggleFollowed={toggleFollowed}/> + </> + ) + } + </div> + </MetasObjeto> + </Grid> + + <Grid item xs={12} style={{paddingTop : "15px"}}> + <CollapseControl onClick={() => {toggleCollapsed()}}> + { + collapsed ? + ( + <React.Fragment> + <span>VER MENOS</span> + <ExpandLessIcon/> + </React.Fragment> + ) + : + ( + <React.Fragment> + <span>VER MAIS</span> + <ExpandMoreIcon/> + </React.Fragment> + ) + } + </CollapseControl> + </Grid> + </Grid> + </React.Fragment> + ) +} + +const CollapseControl = styled.div` + display : flex; + justify-content : center; + align-content : center; + align-items : center; + height : 50px; + border-top : 1px solid #e5e5e5; + color : #666; + font-weight : 700; + cursor : pointer; + + .MuiSvgIcon-root { + vertical-align : middle + } + + span { + text-transform : uppercase; + font-size : 14px; + } +` + +const SobreDiv = styled.div` + padding-left : 3% !important; + padding-top : 3% !important; + .titulo { + margin-top : 2% !important; + margin : 0; + margin-bottom : 10px; + font-family : 'Roboto Light','Roboto Regular',Roboto; + font-weight : 300; + font-style : normal; + color : #666; + font-size : 1.857em; + } + + .sobre-conteudo { + .tags-container { + padding : 0; + width : 100%; + flex-direction : row; + align-items : center; + font-size : .8em; + + span { + text-transform : capitalize; + display : inline-flex; + border-radius : 15px; + background-color : #e5e5e5; + margin-right : 3px; + padding : 3px 7px; + line-height : 18px; + margin-bottom : 3px; + color : #666; + font-size : .8em + } + } + + .conteudo { + font-size : 14px; + .descricao-objeto { + text-align: justify; + margin-bottom: 20px; + margin-top: 20px; + } + .autoria { + margin-bottom : 30px; + } + + p { + margin : 0 0 10px; + } + } + } + + .meta-objeto { + width: 100%; + display: inline-block; + margin-bottom: 15px; + font-size : 14px; + + .MuiSvgIcon-root { + vertical-align : middle + } + + span { + margin-left : 2%; + font-weight : 700; + } + + .license-link { + text-align : center; + display : inline-grid; + + a { + text-decoration : none !important; + color : initial; + + img { + vertical-align : middle; + width : auto !important; + height : auto !important; + float : inherit !important; + } + } + + p { + margin : 0 0 10px; + } + } + } +` + +const MetasObjeto = styled.div` + margin : 20px 0; + -webkit-box-orient : vertical; + -webkit-box-direction : normal; + -ms-flex-direction : column; + flex-direction : column; + -webkit-box-pack : start; + -ms-flex-pack : start; + justify-content : flex-start; + padding : 20px; + text-align : center; + + @media screen and (min-width : 990px) { + border-left : 1px solid #e5e5e5; + } + + .span-st { + position : relative; + font-size : 14px; + color: #666; + } + + .enviado-por { + font-size : 14px; + color :#666; + font-weight : 500; + margin-bottom : 5px; + margin-top : 20px; + text-align : center; + } + + .foto-autor { + display : -webkit-box; + display : -ms-flexbox; + display : flex; + -webkit-box-pack : center; + -ms-flex-pack : center; + justify-content : center; + -webkit-box-align : center; + -ms-flex-align : center; + align-items : center; + padding-top : 10px; + + img { + width : 60px; + height : 60px; + border-radius : 50%; + vertical-align : middle; + } + } + + .nome-autor { + text-align : center; + font-weight : 500; + } +` diff --git a/src/Components/ResourcePageComponents/TextoObjeto.js b/src/Components/ResourcePageComponents/TextoObjeto.js new file mode 100644 index 0000000000000000000000000000000000000000..1554cc9ebd70387fd72cb155f749232133f1b5c0 --- /dev/null +++ b/src/Components/ResourcePageComponents/TextoObjeto.js @@ -0,0 +1,268 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useEffect, useState, useContext} from 'react' +import {Store} from '../../Store.js' +import styled from 'styled-components' +import Firulas from '../Firulas.js' +import Grid from '@material-ui/core/Grid'; +import VisibilityIcon from '@material-ui/icons/Visibility'; +import GetAppIcon from '@material-ui/icons/GetApp'; +import EditIcon from '@material-ui/icons/Edit'; +import DeleteForeverIcon from '@material-ui/icons/DeleteForever'; +import Button from '@material-ui/core/Button'; +import {Link, Redirect} from 'react-router-dom' +import Alert from '../Alert.js'; +import Snackbar from '@material-ui/core/Snackbar'; +import {deleteRequest} from '../HelperFunctions/getAxiosConfig' + +export default function TextoObjeto (props) { + const {state} = useContext(Store) + + const [outrasTematicas, setOutrasTem] = useState('') + const [componentesCurriculares, setCompCurr] = useState('') + const [eduStages, setEduStages] = useState('') + + const extractComponentesCurriculares = (subjects) => { + if (subjects) { + let outrasTem = [] + let compCurr = [] + + subjects.map((subject) => { + if (!subject.theme) { + compCurr.push(subject.name) + } + else { + outrasTem.push(subject.name) + } + return undefined + }) + setOutrasTem(outrasTem.join(' - ')) + setCompCurr(compCurr.join(' - ')) + } + else { + setOutrasTem("Dado não identificado") + setCompCurr("Dado não identificado") + } + } + + const extractEduStages = (stages) => { + return(stages ? stages.map((stage) => {return (stage.name)}).join(' - ') : undefined) + } + + useEffect(() => { + extractComponentesCurriculares(props.subjects) + setEduStages(extractEduStages(props.educationalStages)) + }, []) + + const infos = [ + {label : 'Tipo de Recurso: ', text : (props.objType ? props.objType : "Dado não identificado")}, + {label : 'Componentes Curriculares: ', text : componentesCurriculares}, + {label : 'Outras Temáticas: ', text : outrasTematicas}, + {label : 'Etapas de Ensino: ', text : eduStages} + ] + + const [snackbarOpen, toggleSnackbar] = useState(false) + const [publisherDeletedObject, toggleDeleted] = useState(false) + function handleSuccess (data) { + toggleSnackbar(true) + toggleDeleted(true) + } + const handleDelete = () => { + const url = `/learning_objects/${props.recursoId}` + deleteRequest(url, handleSuccess, (error) => {console.log(error)}) + } + + const checkAccessLevel = (levelToCheck) => { + if (state.currentUser.id !== '') { + return(checkUserRole(levelToCheck)) + } + else { + return(false) + } + } + + const checkUserRole = (userRole) => { + return(state.currentUser.roles.filter((role) => role.name === userRole).length > 0) + } + + return ( + <TextoObjetoDiv> + { publisherDeletedObject && + <Redirect to="/"/> + } + <Snackbar open={snackbarOpen} autoHideDuration={1000} onClose={() => {toggleSnackbar(false)}} + anchorOrigin = {{ vertical:'top', horizontal:'right' }} + > + <Alert severity="info" style={{backgroundColor:"#00acc1"}}> + Recurso excluido com sucesso! + </Alert> + </Snackbar> + <Grid container style={{paddingLeft : "15px"}}> + <Grid item xs={11}> + <h3>{props.name}</h3> + { + props.stateRecurso !== "submitted" && + <Firulas + rating={props.rating} + likesCount={props.likesCount} + liked={props.likedBool} + recursoId={props.recursoId} + /> + } + + { + infos.map( (info) => + <span className={"info-recurso"} key={info.label}> + <span className={"info-cabecalho-recurso"}>{info.label}</span> + <span className={"dado-recurso"}>{info.text}</span> + </span> + ) + } + + <span className={"views-downloads"}> + <span className={"info-cabecalho-recurso"}> + <VisibilityIcon className={"icon"}/>Visualizações: + </span> + <span className={"dado-recurso"} style={{paddingRight : "50px"}}>{props.viewCount}</span> + + <span className={"info-cabecalho-recurso"}> + <GetAppIcon className={"icon"}/>Baixados/Acessados: + </span> + <span className={"dado-recurso"}>{props.downloadCount}</span> + </span> + + { + props.attachments[0] && (props.attachments[0].mime_type==="/audio/mpeg" || + props.attachments[0].format === "audio") && + <div className="recurso-container-audio"> + <audio controls className="audio audio-objeto"> + <source src={props.audioUrl} type="audio/mp3"/> + </audio> + </div> + } + + {/*|| checkUserRole('publisher')*/} + { + props.stateRecurso === "submitted" && + <div className="alert-warning"> + Esse recurso ainda não foi publicado por estar esperando análise da curadoria + </div> + } + + {/*|| checkUserRole('publisher')*/} + { + props.stateRecurso === "draft" && + <div className="alert-warning"> + Esse recurso ainda é um rascunho, termine de editar para publicá-lo + </div> + } + </Grid> + <Grid item xs={1}> + {/*|| checkUserRole('publisher')*/} + {props.id === state.currentUser.id && + <React.Fragment> + { + (checkAccessLevel('publisher') || props.stateRecurso === "draft") && + <Link to={"/editar-recurso/" + props.recursoId}> + <Button style={{color : "#666"}}><EditIcon/></Button> + </Link> + } + <Button style={{color : "#666"}} onClick={() => {handleDelete()}}><DeleteForeverIcon/></Button> + </React.Fragment> + } + + </Grid> + </Grid> + </TextoObjetoDiv> + ) +} + +const TextoObjetoDiv = styled.div` + padding : 20px 20px 0 20px; + display : flex; + flex-direction : column; + justify-content : flex-start; + flex-wrap : no-wrap; + align-content : center; + align-items : flex-start; + + h3 { + font-size : 26px; + font-weight : 400; + margin : 0; + padding-bottom : 15px; + } + + .info-recurso { + display : inline-block; + width : 100%; + font-size : 15px; + font-weight : lighter; + margin-bottom : 12px; + } + + .info-cabecalho-recurso { + font-size : 15px; + } + + .dado-recurso { + font-size : 15px; + font-weight : 600; + } + + .views-downloads { + font-size : 15px; + font-weight : lighter; + margin-bottom : 12px; + } + + .icon { + color : #666; + vertical-align : middle; + margin-right : 2px; + } + + .alert-warning { + color : #8a6d3b; + background-color : #fcf8e3; + border-color : #faebcc; + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; + font-size : 14px; + } + + .recurso-container-audio { + width : 100%; + margin-top : 20px; + + .audio-objeto { + height : 32px; + width : 100%; + margin : 10px 0 8px 0; + background-color : #e5e5e5; + } + + .audio { + display : inline-block; + vertical-align : baseline; + } + } +` diff --git a/src/Components/ResourcePageComponents/VideoPlayer.js b/src/Components/ResourcePageComponents/VideoPlayer.js new file mode 100644 index 0000000000000000000000000000000000000000..940917df9190d882df8c4d5f77798cbe04b4bb93 --- /dev/null +++ b/src/Components/ResourcePageComponents/VideoPlayer.js @@ -0,0 +1,91 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import styled from 'styled-components' + +function GetEmbeddedLink (link) { + var embed = undefined + var link_id = undefined + if (link.indexOf("youtube") !== -1) { //plain youtebe.com/ link + if(link.indexOf("embed/") !== -1) { //if it's already an embedded link, return it + return link + } + link = link.split("&")[0] //else remove features and other queries + link_id = link.split("v=")[1] //get video id + embed = "https://www.youtube.com/embed/" + link_id; //create embedded link + } + else if (link.indexOf("youtu.be") !== -1) { //if it's a youtu.be link + link = link.split("&")[0].split("?")[0] //remove queries and features if existent + link_id = link.split(".be/")[1] //get video id + embed = "https://www.youtube.com/embed/" + link_id; //create embedded link + } + else if (link.indexOf("vimeo") !== -1) { //if the 13th character = o (vimeo videos) + link_id = link.split("?")[0].split("/") + console.log(link_id) //key # = from 19th character on + embed = "https://player.vimeo.com/video/" + link_id.pop(); //Add vimeo link before key # + } + return embed +} + + +export default function VideoPlayer (props) { + + return ( + <> + { + props.urlVerified ? + ( + <VideoContainer> + <iframe + title="Video Player" + src={GetEmbeddedLink(props.link)} + frameBorder="0" allowFullScreen className="video" + /> + </VideoContainer> + ) + : + ( + <VideoContainer> + <video controls className="video"> + <source src={props.videoUrl} type="video/webm"/> + <source src={props.videoUrl} type="video/mp4"/> + <p>Seu navegador não permite a exibição deste vÃdeo. É necessário baixar o vÃdeo para poder visualizá-lo.</p> + </video> + </VideoContainer> + + ) + } + </> + ) +} + +const VideoContainer = styled.div` + position : relative; + width : 100%; + height : 0; + padding-bottom : 56.25%; + + .video { + width : 100%; + height : 100%; + position : absolute; + top : 0; + left : 0; + } +` diff --git a/src/Components/SearchBar.js b/src/Components/SearchBar.js index a38c6b27dbd8ed78018e1844853fbc32a1ceb0af..1c36964e90f24460d54fd70e0386839ac9754335 100644 --- a/src/Components/SearchBar.js +++ b/src/Components/SearchBar.js @@ -21,22 +21,23 @@ import { Redirect } from 'react-router-dom' import IconSearch from '@material-ui/icons/Search' -import { RadioGroup, Radio, FormControl, Select, MenuItem, Button, FormControlLabel, TextField } from '@material-ui/core' +import { RadioGroup, Radio, FormControl, Select, MenuItem, Button, FormControlLabel, TextField, Link } from '@material-ui/core' import styled from 'styled-components' - import { Store } from '../Store'; +import { v4 as uuidv4 } from 'uuid' +import Grid from "@material-ui/core/Grid" const dividerStyled = { - background: '#e0e0e0', + background: '#e0e0e0', width: '1px', content: "", display: 'block', top: '0', bottom: '0', right: '0', - minHeight: '70px', - margin: '0 30px' + minHeight: '70px', + margin: '0 20px' } const DividerVertical = () => <em style={dividerStyled}></em> @@ -48,16 +49,18 @@ const IconSearchStyled = styled(IconSearch)` color: #16b8dd; ` -const TextFieldStyled = styled(TextField) ` +const TextFieldStyled = styled(TextField)` flex-grow: 2; margin: 0 2vw !important; ` -const RadioGroupStyled = styled(RadioGroup) ` +/* +const RadioGroupStyled = styled(RadioGroup)` display: flex; flex-direction: row; flex-grow: 1; ` +*/ const FormControlLabelStyled = styled(FormControlLabel)` *{ @@ -81,106 +84,140 @@ const SelectStyled = styled(Select)` ` const MenuItemStyled = styled(MenuItem)` text-transform: uppercase; - color: #ff8a17 !important; fontWeight: bolder; ` -const Bar = styled.div ` +/*const Bar = styled.div` display: flex; align-items: center; justify-content: space-between; border-top: 1px rgba(0,0,0,.1) solid; ` -const Flex = styled.span ` +const Flex = styled.span` display: flex; align-items: center; color: #787380; -` +`*/ -export default function SearchBar() { - const [ query, setQuery ] = useState('') - const [ searchClass, setSearchClass ] = useState('LearningObject') +export default function SearchBar(props) { + const [query, setQuery] = useState('') + const [searchClass, setSearchClass] = useState('LearningObject') const { state, dispatch } = useContext(Store) - const [ goSearch, setGoSearch ] = useState(false) + const [goSearch, setGoSearch] = useState(false) - useEffect(()=>{ - if(window.location.pathname.includes('busca')){ - const urlParams = new URLSearchParams(window.location.search) - const urlQuery = urlParams.get('query') - const urlSearchClass = urlParams.get('search_class') - if( searchClass !== urlSearchClass || query !== urlQuery){ - setQuery(urlQuery) - setSearchClass(urlSearchClass) - } + useEffect(() => { + if (window.location.pathname.includes('busca')) { + const urlParams = new URLSearchParams(window.location.search) + const urlQuery = urlParams.get('query') + const urlSearchClass = urlParams.get('search_class') + if (searchClass !== urlSearchClass || query !== urlQuery) { + setQuery(urlQuery) + setSearchClass(urlSearchClass) } - },[]) + } + }, []) - useEffect(()=>setGoSearch(false),[goSearch]) + useEffect(() => setGoSearch(false), [goSearch]) - const handleChange = ( event ) => { + const handleChange = (event) => { setQuery(event.target.value) } - + const handleKeyDown = (event) => { - if(event.key === 'Enter' || event.type === 'click'){ + if (event.key === 'Enter' || event.type === 'click') { dispatch({ type: 'SAVE_SEARCH', newSearch: { - query: query!==''?query:'*', + query: query !== '' ? query : '*', class: searchClass } }) setGoSearch(true) - } + } } + const linkTarget = { + pathname: `/busca?query=${state.search.query}&search_class=${state.search.class}`, + key: uuidv4(), // we could use Math.random, but that's not guaranteed unique. + state: { + applied: true + } + }; + return ( - <Bar> - {goSearch && <Redirect to={`/busca?query=${state.search.query}&search_class=${state.search.class}`} />} - <TextFieldStyled - id="standard-search" - label="O que você está buscando" - type="search" - margin="normal" - value={query} - onChange={handleChange} - onKeyPress={handleKeyDown} - /> - <Flex> - <ButtonStyled onClick={handleKeyDown} ><IconSearchStyled /></ButtonStyled> - <Flex style={{"justifyContent": 'middle', 'flexDirection':'column'}}> - <div>Pressione "Enter"</div> - <div>ou click na lupa</div> - </Flex> - <DividerVertical /> - { state.windowSize.width >=900? - <RadioGroupStyled row={true} - aria-label="Tipo" - name="types" value={searchClass} - onChange={ - (event)=> setSearchClass(event.target.value) - } - > - <FormControlLabelStyled value="LearningObject" control={<RadioStyled />} label="Recursos"/> - <FormControlLabelStyled value="Collection" control={<RadioStyled />} label="Coleções"/> - <FormControlLabelStyled value="User" control={<RadioStyled />} label="Usuários" /> - </RadioGroupStyled> - : - <FormControl> - <SelectStyled - value={searchClass} - onChange={(event)=> setSearchClass(event.target.value)} + <Grid container> + <Grid container item xs={12} sm={6} md={6} lg={6} xl={6}> + {goSearch && <Redirect to={`/busca?query=${state.search.query}&search_class=${state.search.class}`} />} + <TextFieldStyled + id="standard-search" + label="O que você está buscando" + type="search" + margin="normal" + value={query} + onChange={handleChange} + onKeyPress={handleKeyDown} + /> + </Grid> + <Grid container item justify="center" alignItems="center" xs={12} sm={6} md={6} lg={6} xl={6}> + {state.windowSize.width >= 960 ? + <React.Fragment> + <Grid container item justify="center" alignItems="center" xs={12} sm={1} md={1} lg={1} xl={1}> + <Link + to={linkTarget} > - <MenuItemStyled value="LearningObject" aria-label="Recursos">Recursos</MenuItemStyled> - <MenuItemStyled value="Collection" aria-label="Coleções">Coleções</MenuItemStyled> - <MenuItemStyled value="User" aria-label="Usuários">Usuários</MenuItemStyled> - </SelectStyled> - </FormControl> - } - </Flex> - </Bar> + <ButtonStyled onClick={handleKeyDown} ><IconSearchStyled /></ButtonStyled> + </Link> + </Grid> + <Grid container item justify="center" alignItems="center" xs={12} sm={3} md={3} lg={3} xl={3}> + <span>Pressione "Enter" ou click na lupa</span> + </Grid> + <Grid container item justify="center" alignItems="center" xs={12} sm={1} md={1} lg={1} xl={1}> + <DividerVertical /> + </Grid> + <Grid container item justify="center" alignItems="center" xs={12} sm={7} md={7} lg={7} xl={7}> + <RadioGroup row={true} + aria-label="Tipo" + name="types" value={searchClass} + onChange={ + (event) => setSearchClass(event.target.value) + } + justify="center" alignItems="center" + > + <FormControlLabelStyled value="LearningObject" control={<RadioStyled />} label="Recursos" /> + <FormControlLabelStyled value="Collection" control={<RadioStyled />} label="Coleções" /> + <FormControlLabelStyled value="User" control={<RadioStyled />} label="Usuários" /> + </RadioGroup> + </Grid> + </React.Fragment> + : + <React.Fragment> + <Grid container item justify="center" alignItems="center" xs={5} sm={5} md={5} lg={5} xl={5}> + <FormControl> + <SelectStyled + value={searchClass} + onChange={(event) => setSearchClass(event.target.value)} + > + <MenuItemStyled style={{color : "#ff7f00"}} value="LearningObject" aria-label="Recursos">Recursos</MenuItemStyled> + <MenuItemStyled style={{color : "#673ab7"}} value="Collection" aria-label="Coleções">Coleções</MenuItemStyled> + <MenuItemStyled style={{color : "#00bcd4"}} value="User" aria-label="Usuários">Usuários</MenuItemStyled> + </SelectStyled> + </FormControl> + </Grid> + <Grid container item justify="center" alignItems="center" xs={2} sm={2} md={2} lg={2} xl={2}> + <DividerVertical /> + </Grid> + <Grid container item justify="center" alignItems="center" xs={5} sm={5} md={5} lg={5} xl={5}> + <Link + to={linkTarget} + > + <ButtonStyled onClick={handleKeyDown} ><IconSearchStyled /></ButtonStyled> + </Link> + </Grid> + </React.Fragment> + } + </Grid> + </Grid> ) -} - +} \ No newline at end of file diff --git a/src/Components/SearchExpansionPanel/ExpansionPanel.css b/src/Components/SearchExpansionPanel/ExpansionPanel.css new file mode 100644 index 0000000000000000000000000000000000000000..f97d0f5758cf640c3153e4667c95627fea39a888 --- /dev/null +++ b/src/Components/SearchExpansionPanel/ExpansionPanel.css @@ -0,0 +1,14 @@ +.MuiAccordionActions-root{ + display: block !important; +} +.MuiListItemIcon-root{ + min-width: 30px !important; +} + +.MuiListItem-secondaryAction { + padding-right: 0px !important; +} + +.MuiListItem-gutters { + padding-left: 10px !important; +} \ No newline at end of file diff --git a/src/Components/SearchExpansionPanel/SearchEPCompCurriculum.js b/src/Components/SearchExpansionPanel/SearchEPCompCurriculum.js new file mode 100644 index 0000000000000000000000000000000000000000..180eaeef90d4ec92d3c6fa367cb0eb22489d3ef9 --- /dev/null +++ b/src/Components/SearchExpansionPanel/SearchEPCompCurriculum.js @@ -0,0 +1,104 @@ +import React from "react"; +import { makeStyles } from "@material-ui/core/styles"; +import List from "@material-ui/core/List"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemIcon from "@material-ui/core/ListItemIcon"; +import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; +import ListItemText from "@material-ui/core/ListItemText"; +import Checkbox from "@material-ui/core/Checkbox"; +import IconButton from "@material-ui/core/IconButton"; + +const useStyles = makeStyles(theme => ({ + root: { + width: "100%", + maxWidth: 360, + backgroundColor: theme.palette.background.paper, + color: "#666" + } +})); + +export default function SearchEPCompCurriculum(props) { + const classes = useStyles(); + const [checked, setChecked] = React.useState([0]); + + const handleToggle = value => () => { + const currentIndex = checked.indexOf(value); + const newChecked = [...checked]; + + if (currentIndex === -1) { + newChecked.push(value); + } else { + newChecked.splice(currentIndex, 1); + } + + let filterString = ""; + + setChecked(newChecked); + for(let i = 0; i < newChecked.length; i++){ + if(newChecked[i] !== 0){ + filterString = filterString + `&subjects[]=${newChecked[i]}` + console.log(filterString) + } + } + props.onChange("LearningObject", filterString) + }; + const filtrosComponente = [ + { exemplo: "Arte", value: "3" }, + { exemplo: "Biologia", value: "5" }, + { exemplo: "Ciências da Natureza", value: "6" }, + { exemplo: "Direitos Humanos", value: "20" }, + { exemplo: "Educação Ambiental", value: "21" }, + { exemplo: "Educação do Campo", value: "22" }, + { exemplo: "Educação Especial", value: "23" }, + { exemplo: "Educação FÃsica", value: "7" }, + { exemplo: "Educação IndÃgena", value: "24" }, + { exemplo: "Educação Quilombola", value: "25" }, + { exemplo: "Educação Sexual", value: "26" }, + { exemplo: "Ensino Religioso", value: "16" }, + { exemplo: "Filosofia", value: "8" }, + { exemplo: "FÃsica", value: "9" }, + { exemplo: "Geografia", value: "10" }, + { exemplo: "História", value: "11" }, + { exemplo: "Informática", value: "18" }, + { exemplo: "LÃngua Espanhola", value: "1" }, + { exemplo: "LÃngua Inglesa", value: "2" }, + { exemplo: "LÃngua Portuguesa", value: "4" }, + { exemplo: "Matemática", value: "12" }, + { exemplo: "Outras LÃnguas", value: "15" }, + { exemplo: "Outros", value: "17" }, + { exemplo: "QuÃmica", value: "13" }, + { exemplo: "Sociologia", value: "14" } + ]; + + return ( + <List className={classes.root}> + {filtrosComponente.map(item => { + const labelId = `checkbox-list-label-${item.value}`; + + return ( + <ListItem + key={item.exemplo} + role={undefined} + dense + button + onClick={handleToggle(item.value)} + > + <ListItemIcon> + <Checkbox + edge="start" + checked={checked.indexOf(item.value) !== -1} + tabIndex={-1} + disableRipple + inputProps={{ "aria-labelledby": labelId }} + /> + </ListItemIcon> + <ListItemText id={labelId} primary={item.exemplo} /> + <ListItemSecondaryAction> + <IconButton edge="end" aria-label="comments"></IconButton> + </ListItemSecondaryAction> + </ListItem> + ); + })} + </List> + ); +} diff --git a/src/Components/SearchExpansionPanel/SearchEPIdiomas.js b/src/Components/SearchExpansionPanel/SearchEPIdiomas.js new file mode 100644 index 0000000000000000000000000000000000000000..b32f032cbce2efcdb4c5e791582c0a3561683560 --- /dev/null +++ b/src/Components/SearchExpansionPanel/SearchEPIdiomas.js @@ -0,0 +1,90 @@ +import React from "react"; +import { makeStyles } from "@material-ui/core/styles"; +import List from "@material-ui/core/List"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemIcon from "@material-ui/core/ListItemIcon"; +import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; +import ListItemText from "@material-ui/core/ListItemText"; +import Checkbox from "@material-ui/core/Checkbox"; +import IconButton from "@material-ui/core/IconButton"; + +const useStyles = makeStyles(theme => ({ + root: { + width: "100%", + maxWidth: 360, + backgroundColor: theme.palette.background.paper, + color: "#666" + } +})); + +export default function SearchEPIdiomas(props) { + const classes = useStyles(); + const [checked, setChecked] = React.useState([0]); + + const handleToggle = value => () => { + const currentIndex = checked.indexOf(value); + const newChecked = [...checked]; + + if (currentIndex === -1) { + newChecked.push(value); + } else { + newChecked.splice(currentIndex, 1); + } + + setChecked(newChecked); + let filterString = ""; + + for(let i = 0; i < newChecked.length; i++){ + if(newChecked[i] !== 0){ + filterString = filterString + `&languages[]=${newChecked[i]}` + console.log(filterString) + } + } + props.onChange("LearningObject", filterString) + }; + const filtrosIdiomas = [ + { value: "5", exemplo: "Alemão" }, + { value: "3", exemplo: "Espanhol" }, + { value: "4", exemplo: "Francês" }, + { value: "2", exemplo: "Inglês" }, + { value: "6", exemplo: "Italiano" }, + { value: "9", exemplo: "Japonês" }, + { value: "19", exemplo: "LIBRAS" }, + { value: "7", exemplo: "Mandarim" }, + { value: "10", exemplo: "Outro" }, + { value: "1", exemplo: "Português" }, + { value: "8", exemplo: "Russo" } + ]; + + return ( + <List className={classes.root}> + {filtrosIdiomas.map(item => { + const labelId = `checkbox-list-label-${item.value}`; + + return ( + <ListItem + key={item.exemplo} + role={undefined} + dense + button + onClick={handleToggle(item.value)} + > + <ListItemIcon> + <Checkbox + edge="start" + checked={checked.indexOf(item.value) !== -1} + tabIndex={-1} + disableRipple + inputProps={{ "aria-labelledby": labelId }} + /> + </ListItemIcon> + <ListItemText id={labelId} primary={item.exemplo} /> + <ListItemSecondaryAction> + <IconButton edge="end" aria-label="comments"></IconButton> + </ListItemSecondaryAction> + </ListItem> + ); + })} + </List> + ); +} diff --git a/src/Components/SearchExpansionPanel/SearchEPKeyWord.js b/src/Components/SearchExpansionPanel/SearchEPKeyWord.js new file mode 100644 index 0000000000000000000000000000000000000000..101a0e0609fe318817ab8b76b5d964daef1deba8 --- /dev/null +++ b/src/Components/SearchExpansionPanel/SearchEPKeyWord.js @@ -0,0 +1,167 @@ +import React from "react"; +import { withStyles } from "@material-ui/core/styles"; +import MuiExpansionPanel from "@material-ui/core/ExpansionPanel"; +import MuiExpansionPanelSummary from "@material-ui/core/ExpansionPanelSummary"; +import MuiExpansionPanelDetails from "@material-ui/core/ExpansionPanelDetails"; +import Typography from "@material-ui/core/Typography"; +import ExpandMoreIcon from "@material-ui/icons/ExpandMore"; +import SearchList from "../SearchList"; + +const ExpansionPanel = withStyles({ + root: { + border: "1px solid rgba(0, 0, 0, .125)", + boxShadow: "none", + "&:not(:last-child)": { + borderBottom: 0 + }, + "&:before": { + display: "none" + }, + "&$expanded": { + margin: "auto" + } + }, + expanded: {} +})(MuiExpansionPanel); + +const ExpansionPanelSummary = withStyles({ + root: { + color: "#666", + marginBottom: -1, + minHeight: 56, + backgroundColor: "#fff", + + "&$expanded": { + minHeight: 56, + backgroundColor: "#fff" + } + }, + content: { + "&$expanded": { + margin: "12px 0" + } + }, + expanded: {} +})(MuiExpansionPanelSummary); + +const TesteTypography = withStyles({ + root: { + fontSize: "17px" + } +})(Typography); + +const ExpansionPanelDetails = withStyles(theme => ({ + root: { + padding: theme.spacing(2) + } +}))(MuiExpansionPanelDetails); + +export default function SearchExpansionPanels() { + return ( + <div> + <link + href="https://fonts.googleapis.com/css?family=Roboto:400,500&display=swap" + rel="stylesheet" + /> + + <ExpansionPanel square> + <ExpansionPanelSummary + aria-controls="panel1d-content" + id="panel1d-header" + > + <Typography + style={{ + fontSize: "18px", + textTransform: "uppercase", + fontWeight: "500" + }} + > + Filtros + </Typography> + </ExpansionPanelSummary> + </ExpansionPanel> + <ExpansionPanel square> + <ExpansionPanelSummary + expandIcon={<ExpandMoreIcon />} + aria-controls="panel2d-content" + id="panel2d-header" + > + <TesteTypography>Componentes Curriculares</TesteTypography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <Typography> + <SearchList /> + </Typography> + </ExpansionPanelDetails> + </ExpansionPanel> + <ExpansionPanel square> + <ExpansionPanelSummary + expandIcon={<ExpandMoreIcon />} + aria-controls="panel3d-content" + id="panel3d-header" + > + <Typography>Tipos de Recurso</Typography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <Typography> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse + malesuada lacus ex, sit amet blandit leo lobortis eget. Lorem ipsum + dolor sit amet, consectetur adipiscing elit. Suspendisse malesuada + lacus ex, sit amet blandit leo lobortis eget. + </Typography> + </ExpansionPanelDetails> + </ExpansionPanel> + <ExpansionPanel square> + <ExpansionPanelSummary + aria-controls="panel4d-content" + expandIcon={<ExpandMoreIcon />} + id="panel4d-header" + > + <Typography>Etapas de Ensino</Typography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <Typography> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse + malesuada lacus ex, sit amet blandit leo lobortis eget. Lorem ipsum + dolor sit amet, consectetur adipiscing elit. Suspendisse malesuada + lacus ex, sit amet blandit leo lobortis eget. + </Typography> + </ExpansionPanelDetails> + </ExpansionPanel> + <ExpansionPanel square> + <ExpansionPanelSummary + aria-controls="panel5d-content" + expandIcon={<ExpandMoreIcon />} + id="panel5d-header" + > + <Typography>Idiomas</Typography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <Typography> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse + malesuada lacus ex, sit amet blandit leo lobortis eget. Lorem ipsum + dolor sit amet, consectetur adipiscing elit. Suspendisse malesuada + lacus ex, sit amet blandit leo lobortis eget. + </Typography> + </ExpansionPanelDetails> + </ExpansionPanel> + <ExpansionPanel square> + <ExpansionPanelSummary + aria-controls="panel6d-content" + expandIcon={<ExpandMoreIcon />} + id="panel6d-header" + > + <Typography>Palavra-Chave</Typography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <Typography> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse + malesuada lacus ex, sit amet blandit leo lobortis eget. Lorem ipsum + dolor sit amet, consectetur adipiscing elit. Suspendisse malesuada + lacus ex, sit amet blandit leo lobortis eget. + </Typography> + </ExpansionPanelDetails> + </ExpansionPanel> + </div> + ); +} diff --git a/src/Components/SearchExpansionPanel/SearchEPTiposRec.js b/src/Components/SearchExpansionPanel/SearchEPTiposRec.js new file mode 100644 index 0000000000000000000000000000000000000000..8dc4fcf6782641ca5bee2916a75c75050f6f298c --- /dev/null +++ b/src/Components/SearchExpansionPanel/SearchEPTiposRec.js @@ -0,0 +1,95 @@ +import React from "react"; +import { makeStyles } from "@material-ui/core/styles"; +import List from "@material-ui/core/List"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemIcon from "@material-ui/core/ListItemIcon"; +import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; +import ListItemText from "@material-ui/core/ListItemText"; +import Checkbox from "@material-ui/core/Checkbox"; +import IconButton from "@material-ui/core/IconButton"; + +const useStyles = makeStyles(theme => ({ + root: { + width: "100%", + maxWidth: 360, + backgroundColor: theme.palette.background.paper, + color: "#666" + } +})); + +export default function SearchEPTiposRec(props) { + const classes = useStyles(); + const [checked, setChecked] = React.useState([0]); + + const handleToggle = value => () => { + const currentIndex = checked.indexOf(value); + const newChecked = [...checked]; + + if (currentIndex === -1) { + newChecked.push(value); + } else { + newChecked.splice(currentIndex, 1); + } + + let filterString = ""; + + setChecked(newChecked); + for(let i = 0; i < newChecked.length; i++){ + if(newChecked[i] !== 0){ + filterString = filterString + `&object_types[]=${newChecked[i]}` + console.log(filterString) + } + } + props.onChange("LearningObject", filterString) + }; + const filtrosTipos = [ + { value: "5", exemplo: "Animação" }, + { value: "20", exemplo: "Aplicativo móvel" }, + { value: "17", exemplo: "Apresentação" }, + { value: "7", exemplo: "Ãudio" }, + { value: "4", exemplo: "Experimento prático" }, + { value: "1", exemplo: "Imagem" }, + { value: "18", exemplo: "Infográfico" }, + { value: "19", exemplo: "Jogo" }, + { value: "21", exemplo: "Livro digital" }, + { value: "2", exemplo: "Mapa" }, + { value: "15", exemplo: "Outros" }, + { value: "3", exemplo: "Software Educacional" }, + { value: "6", exemplo: "Texto" }, + { value: "8", exemplo: "VÃdeo" }, + { value: "13", exemplo: "Website externo" }, + { value: "22", exemplo: "Plano de Aula" }, + ]; + + return ( + <List className={classes.root}> + {filtrosTipos.map(item => { + const labelId = `checkbox-list-label-${item.value}`; + + return ( + <ListItem + key={item.exemplo} + role={undefined} + dense + button + onClick={handleToggle(item.value)} + > + <ListItemIcon> + <Checkbox + edge="start" + checked={checked.indexOf(item.value) !== -1} + tabIndex={-1} + disableRipple + inputProps={{ "aria-labelledby": labelId }} + /> + </ListItemIcon> + <ListItemText id={labelId} primary={item.exemplo} /> + <ListItemSecondaryAction> + <IconButton edge="end" aria-label="comments"></IconButton> + </ListItemSecondaryAction> + </ListItem> + ); + })} + </List> + ); +} diff --git a/src/Components/SearchExpansionPanel/SearchExpansionPanel.js b/src/Components/SearchExpansionPanel/SearchExpansionPanel.js new file mode 100644 index 0000000000000000000000000000000000000000..7ebfc2c9e26e3ddb29e7445fe46f3df6bf090ce7 --- /dev/null +++ b/src/Components/SearchExpansionPanel/SearchExpansionPanel.js @@ -0,0 +1,215 @@ +import React, { useState } from "react"; +import { withStyles } from "@material-ui/core/styles"; +import MuiExpansionPanel from "@material-ui/core/Accordion"; +import MuiExpansionPanelSummary from "@material-ui/core/AccordionSummary"; +import MuiExpansionPanelDetails from "@material-ui/core/AccordionActions"; +import Typography from "@material-ui/core/Typography"; +import ExpandMoreIcon from "@material-ui/icons/ExpandMore"; +import SearchEPCompCurriculum from "./SearchEPCompCurriculum"; +import SearchEPTiposRec from "./SearchEPTiposRec"; +import SearchEPEtapasEns from "./SesrchEPEtapasEns"; +import SearchEPIdiomas from "./SearchEPIdiomas"; +import { TextField } from "@material-ui/core"; +import Grid from '@material-ui/core/Grid'; +import CircularProgress from '@material-ui/core/CircularProgress'; + +import './ExpansionPanel.css' + +const ExpansionPanel = withStyles({ + root: { + border: "1px solid rgba(0, 0, 0, .125)", + boxShadow: "none", + '.MuiButtonBase-root': { + paddingInline: "0 !important" + }, + "&:not(:last-child)": { + borderBottom: 0 + }, + "&:before": { + display: "none" + }, + "&$expanded": { + margin: "auto" + } + }, + expanded: {} +})(MuiExpansionPanel); + +const ExpansionPanelSummary = withStyles({ + root: { + color: "#666", + marginBottom: -1, + minHeight: 56, + backgroundColor: "#fff", + + + "&$expanded": { + minHeight: 56, + backgroundColor: "#fff" + } + }, + content: { + "&$expanded": { + margin: "12px 0" + } + }, + expanded: {} +})(MuiExpansionPanelSummary); + +const TesteTypography = withStyles({ + root: { + fontSize: "17px" + } +})(Typography); + +const ExpansionPanelDetails = withStyles(theme => ({ + root: { + // padding: theme.spacing(2) + } +}))(MuiExpansionPanelDetails); + +export default function SearchExpansionPanel(props) { + const [keyWords, setKeyWords] = useState(""); + const [errorInKeyWord, setErrorInKeyWord] = useState({ + message: "", + state: false + }) + + const onKeyPressed = (e) => { + if (e.key === "Enter") { + const filterString = "&tags[]=" + keyWords + if (keyWords.length === 0) { + setErrorInKeyWord({ + state: true, + message: "Preencha o campo" + }) + } + else + props.onChange("LearningObject", filterString) + } + } + + const HandleChangeText = (e) => { + if (errorInKeyWord.state) + setErrorInKeyWord({ + state: false, + message: "" + }) + setKeyWords(e.target.value); + } + + return ( + <div> + <link + href="https://fonts.googleapis.com/css?family=Roboto:400,500&display=swap" + rel="stylesheet" + /> + + <ExpansionPanel square> + <ExpansionPanelSummary + aria-controls="panel1d-content" + id="panel1d-header" + > + <Grid + container + direction="row" + justify="space-between" + > + <Grid item > + <Typography + style={{ + fontSize: "18px", + textTransform: "uppercase", + fontWeight: "500", + }} + > + Filtros + </Typography> + </Grid> + <Grid item> + { + props.onFiltering ? <CircularProgress size={24} color="secondary" /> : null + } + </Grid> + </Grid> + </ExpansionPanelSummary> + </ExpansionPanel> + + <ExpansionPanel square> + <ExpansionPanelSummary + expandIcon={<ExpandMoreIcon />} + + aria-controls="panel2d-content" + id="panel2d-header" + > + <TesteTypography>Componentes Curriculares</TesteTypography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <div> + <SearchEPCompCurriculum onChange={props.onChange} /> + </div> + </ExpansionPanelDetails> + </ExpansionPanel> + + <ExpansionPanel square> + <ExpansionPanelSummary + expandIcon={<ExpandMoreIcon />} + aria-controls="panel3d-content" + id="panel3d-header" + > + <Typography>Tipos de Recurso</Typography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <SearchEPTiposRec onChange={props.onChange} /> + </ExpansionPanelDetails> + </ExpansionPanel> + + <ExpansionPanel square> + <ExpansionPanelSummary + aria-controls="panel4d-content" + expandIcon={<ExpandMoreIcon />} + id="panel4d-header" + > + <Typography>Etapas de Ensino</Typography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <SearchEPEtapasEns onChange={props.onChange} /> + </ExpansionPanelDetails> + </ExpansionPanel> + + <ExpansionPanel square> + <ExpansionPanelSummary + aria-controls="panel5d-content" + expandIcon={<ExpandMoreIcon />} + id="panel5d-header" + > + <Typography>Idiomas</Typography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <SearchEPIdiomas onChange={props.onChange} /> + </ExpansionPanelDetails> + </ExpansionPanel> + + <ExpansionPanel square> + <ExpansionPanelSummary + aria-controls="panel6d-content" + expandIcon={<ExpandMoreIcon />} + id="panel6d-header" + > + <Typography>Palavra-Chave</Typography> + </ExpansionPanelSummary> + <ExpansionPanelDetails> + <TextField + label="Palavra chave + enter " + id="outlined-margin-dense" + variant="outlined" + onChange={e => HandleChangeText(e)} + onKeyDown={e => onKeyPressed(e)} + error={errorInKeyWord.state} + helperText={errorInKeyWord.state ? errorInKeyWord.message : ""} + /> + </ExpansionPanelDetails> + </ExpansionPanel> + </div> + ); +} diff --git a/src/Components/SearchExpansionPanel/SesrchEPEtapasEns.js b/src/Components/SearchExpansionPanel/SesrchEPEtapasEns.js new file mode 100644 index 0000000000000000000000000000000000000000..b08fdb680ae4e0e7be65c4c327adf8b34b96b39c --- /dev/null +++ b/src/Components/SearchExpansionPanel/SesrchEPEtapasEns.js @@ -0,0 +1,87 @@ +import React from "react"; +import { makeStyles } from "@material-ui/core/styles"; +import List from "@material-ui/core/List"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemIcon from "@material-ui/core/ListItemIcon"; +import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; +import ListItemText from "@material-ui/core/ListItemText"; +import Checkbox from "@material-ui/core/Checkbox"; +import IconButton from "@material-ui/core/IconButton"; + +const useStyles = makeStyles(theme => ({ + root: { + width: "100%", + maxWidth: 360, + backgroundColor: theme.palette.background.paper, + color: "#666" + } +})); + +export default function SearchEPEtapasEns(props) { + const classes = useStyles(); + const [checked, setChecked] = React.useState([0]); + + const handleToggle = value => () => { + const currentIndex = checked.indexOf(value); + const newChecked = [...checked]; + + if (currentIndex === -1) { + newChecked.push(value); + } else { + newChecked.splice(currentIndex, 1); + } + + setChecked(newChecked); + let filterString = ""; + + for(let i = 0; i < newChecked.length; i++){ + if(newChecked[i] !== 0){ + filterString = filterString + `&educational_stages[]=${newChecked[i]}` + } + } + if(filterString) + props.onChange("LearningObject", filterString) + else + props.onChange("LearningObject", "") + }; + const filtrosEtapas = [ + { value: "1", exemplo: "Educação Infantil" }, + { value: "2", exemplo: "Ensino Fundamental I (1º até o 5º ano )" }, + { value: "3", exemplo: "Ensino Fundamental II (do 6º até o 9º ano)" }, + { value: "4", exemplo: "Ensino Médio" }, + { value: "5", exemplo: "Ensino Superior" }, + { value: "6", exemplo: "Outros" } + ]; + + return ( + <List className={classes.root}> + {filtrosEtapas.map(item => { + const labelId = `checkbox-list-label-${item.value}`; + + return ( + <ListItem + key={item.exemplo} + role={undefined} + dense + button + onClick={handleToggle(item.value)} + > + <ListItemIcon> + <Checkbox + edge="start" + checked={checked.indexOf(item.value) !== -1} + tabIndex={-1} + disableRipple + inputProps={{ "aria-labelledby": labelId }} + /> + </ListItemIcon> + <ListItemText id={labelId} primary={item.exemplo} /> + <ListItemSecondaryAction> + <IconButton edge="end" aria-label="comments"></IconButton> + </ListItemSecondaryAction> + </ListItem> + ); + })} + </List> + ); +} diff --git a/src/Components/SearchList.js b/src/Components/SearchList.js new file mode 100644 index 0000000000000000000000000000000000000000..0f789ce11cbfdb21bb5a37df2379aff6d109e1b8 --- /dev/null +++ b/src/Components/SearchList.js @@ -0,0 +1,70 @@ +import React from "react"; +import { makeStyles } from "@material-ui/core/styles"; +import List from "@material-ui/core/List"; +import ListItem from "@material-ui/core/ListItem"; +import ListItemIcon from "@material-ui/core/ListItemIcon"; +import ListItemSecondaryAction from "@material-ui/core/ListItemSecondaryAction"; +import ListItemText from "@material-ui/core/ListItemText"; +import Checkbox from "@material-ui/core/Checkbox"; +import IconButton from "@material-ui/core/IconButton"; +import CommentIcon from "@material-ui/icons/Comment"; + +const useStyles = makeStyles(theme => ({ + root: { + width: "100%", + maxWidth: 360, + backgroundColor: theme.palette.background.paper + } +})); + +export default function SearchList() { + const classes = useStyles(); + const [checked, setChecked] = React.useState([0]); + + const handleToggle = value => () => { + const currentIndex = checked.indexOf(value); + const newChecked = [...checked]; + + if (currentIndex === -1) { + newChecked.push(value); + } else { + newChecked.splice(currentIndex, 1); + } + + setChecked(newChecked); + }; + + return ( + <List className={classes.root}> + {[0, 1, 2, 3].map(value => { + const labelId = `checkbox-list-label-${value}`; + + return ( + <ListItem + key={value} + role={undefined} + dense + button + onClick={handleToggle(value)} + > + <ListItemIcon> + <Checkbox + edge="start" + checked={checked.indexOf(value) !== -1} + tabIndex={-1} + disableRipple + inputProps={{ "aria-labelledby": labelId }} + /> + </ListItemIcon> + <ListItemText id={labelId} primary={`Line item ${value + 1}`} /> + <ListItemSecondaryAction> + <IconButton edge="end" aria-label="comments"> + <CommentIcon /> + </IconButton> + </ListItemSecondaryAction> + </ListItem> + ); + })} + </List> + ); +} diff --git a/src/Components/SearchSection.js b/src/Components/SearchSection.js index 989774625d87cef62831fdd74d93cf7c6f89da90..66380b80cb52a8eb34fd22066a5c2ebb62dc3b12 100644 --- a/src/Components/SearchSection.js +++ b/src/Components/SearchSection.js @@ -16,55 +16,62 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; +import React, {Component} from 'react'; import '../App.css'; import banner from '../img/bannerBusca.jpg'; // import SearchBar from './SearchBar'; import {Row} from 'react-grid-system'; import {MdInfoOutline} from "react-icons/md" import { FaRegPlayCircle} from "react-icons/fa"; +import ModalVideoApresentacao from "./ModalVideoApresentacao.js" -const bannerStyle={ - width: "100%", - backgroundImage: `url(${banner})`, - backgroundSize: "cover", - textAlign: "center" +const bannerStyle = { + width: "100%", + backgroundImage: `url(${banner})`, + backgroundSize: "cover", + textAlign: "center" } -const titleStyle={ - color: "white", - paddingTop: "5%" +const titleStyle = { + color: "white", + paddingTop: "5%", } -const buttonStyle={ - alignItems: "flex-start", - fontSize: "0.7em", - textAlign: "center", - cursor: "pointer", - borderTopLeftRadius: "15px", - borderTopRightRadius: "15px", - lineHeight: 1.42857143, - width: "20%", - marginTop: "1%", - color: "white", - padding: "1.2%", - borderWidth: "5%", - borderStyle: "none", - borderImage: "initial" +const buttonStyle = { + alignItems: "flex-start", + fontSize: "0.7em", + textAlign: "center", + cursor: "pointer", + borderTopLeftRadius: "15px", + borderTopRightRadius: "15px", + lineHeight: 1.42857143, + width: "20%", + marginTop: "1%", + color: "white", + padding: "1.2%", + borderWidth: "5%", + borderStyle: "none", + borderImage: "initial" } class SearchSection extends Component{ constructor(props){ super(props); this.state={ - color: "#ff7f00" + color: "#ff7f00", + modalOpen : false };} + toggleModal = () => { + this.setState({modalOpen : !this.state.modalOpen}) + } render(){ return( + <React.Fragment> + <ModalVideoApresentacao open={this.state.modalOpen} handleClose={this.toggleModal}/> <div style={bannerStyle}> <div style={titleStyle}> - <h2>Plataforma MEC de Recursos Educacionais Digitais</h2> - <h3 style={{fontWeight: "100"}}> + <h2 style={{color : "white"}}>Plataforma MEC de Recursos Educacionais Digitais</h2> + <h3 style={{fontWeight: "100", color: "white"}}> Encontre e compartilhe vÃdeos, animações e muitos outros Recursos </h3> </div> @@ -72,15 +79,18 @@ class SearchSection extends Component{ <SearchBar/> </Container> */} <div style={{paddingBottom: "100px", color: "white"}}> - <a href="#sobre"><MdInfoOutline size="30px"/>SOBRE A PLATAFORMA</a> - <a href="#apresentacao"> <FaRegPlayCircle size="25px"/>VÃDEO DE APRESENTAÇÃO</a> + <a href="sobre" style={{color:"#fff",textDecoration: "none", outline:"none", paddingRight : "10px"}}><MdInfoOutline size="24px" style={{verticalAlign: "middle", paddingRight : "5px"}} />SOBRE A PLATAFORMA</a> + <span onClick={this.toggleModal} style={{cursor : "pointer"}}> + <FaRegPlayCircle size="20px" style={{verticalAlign: "middle", paddingRight : "5px"}}/>VÃDEO DE APRESENTAÇÃO + </span> </div> - <Row justify="center"> - <button style={{...buttonStyle, ...{backgroundColor: "#ff7f00"}}} onClick={()=> {this.props.function("Recursos")}}>Recursos Educacionais Digitais</button> - <button style={{...buttonStyle, ...{backgroundColor: "#e81f4f"}}} onClick={()=> {this.props.function("Materiais")}}>Materiais de Formação</button> - <button style={{...buttonStyle, ...{backgroundColor: "#673ab7"}}} onClick={()=> {this.props.function("Colecoes")}}>Coleções dos Usuários</button> + <Row justify="center" style={{marginLeft:0, marginRight:0}}> + <button style={{...buttonStyle, ...{backgroundColor: "#ff7f00",fontSize:"1.14em", outline:"none"}}} onClick={()=> {this.props.function("Recursos")}}>Recursos Educacionais Digitais</button> + <button style={{...buttonStyle, ...{backgroundColor: "#e81f4f",fontSize:"1.14em", outline:"none"}}} onClick={()=> {this.props.function("Materiais")}}>Materiais de Formação</button> + <button style={{...buttonStyle, ...{backgroundColor: "#673ab7",fontSize:"1.14em", outline:"none"}}} onClick={()=> {this.props.function("Colecoes")}}>Coleções dos Usuários</button> </Row> </div> + </React.Fragment> ); } } diff --git a/src/Components/SearchSectionFunction.js b/src/Components/SearchSectionFunction.js new file mode 100644 index 0000000000000000000000000000000000000000..97d5a43977d986fa5e890ec2f102375008f64f29 --- /dev/null +++ b/src/Components/SearchSectionFunction.js @@ -0,0 +1,165 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react'; +import '../App.css'; +import styled from 'styled-components' +import banner from '../img/bannerBusca.jpg'; +import bannerMobile from '../img/banner-mobile.jpg' +// import SearchBar from './SearchBar'; +import {Row} from 'react-grid-system'; +import {MdInfoOutline} from "react-icons/md" +import { FaRegPlayCircle} from "react-icons/fa"; +import ModalVideoApresentacao from "./ModalVideoApresentacao.js" +import {Link} from 'react-router-dom' +import Grid from '@material-ui/core/Grid'; +import HomeScreenSearchBar from './HomeScreenSearchBar' + +export default function SearchSection (props) { + const [modalOpen, handleModal] = useState(false) + const toggleModal = () => {handleModal(!modalOpen)} + + const WIDTH = window.innerWidth; + return ( + <React.Fragment> + <ModalVideoApresentacao open={modalOpen} handleClose={toggleModal}/> + <Banner> + <StyledGrid container direction="row" justify="center"> + <Grid item style={{paddingRight : "15px", paddingLeft : "15px", paddingBottom : "120px"}}> + <div className="title"> + <h2> + Plataforma MEC de Recursos Educacionais Digitais + </h2> + <h3> + Encontre e compartilhe vÃdeos, animações e muitos outros Recursos + </h3> + </div> + <HomeScreenSearchBar/> + <div className="links"> + <Link to="/sobre"> + <MdInfoOutline size="24px" style={{verticalAlign: "middle", paddingRight : "5px"}}/> + {WIDTH <= 501 ? ("SOBRE") : ("SOBRE A PLATAFORMA")} + </Link> + <span onClick={toggleModal} style={{cursor : "pointer"}}> + <FaRegPlayCircle size="20px" style={{verticalAlign: "middle", paddingRight : "5px"}}/> + {WIDTH <= 501 ? ("VÃDEO") : ("VÃDEO DE APRESENTAÇÃO")} + </span> + </div> + </Grid> + </StyledGrid> + { + WIDTH > 501 && + <Row justify="center" style={{marginLeft:0, marginRight:0}}> + <button className="recurso" + onClick={() => {props.function("Recursos")}}> + Recursos Educacionais Digitais + </button> + + <button className="material-formacao" + onClick={() => {props.function("Materiais")}}> + Materiais de Formação + </button> + + <button className="colecao" + onClick={() => {props.function("Colecoes")}}> + Coleções dos Usuários + </button> + </Row> + } + </Banner> + </React.Fragment> + ) +} + +const StyledGrid = styled(Grid)` + margin-right : auto !important; + margin-left auto !important; + color : #fff !important; + text-align : center !important; +` + +const Banner = styled.div` + width : 100%; + @media screen and (max-width : 501px) { + background-image : url(${bannerMobile}); + } + @media screen and (min-width : 502px) { + background-image : url(${banner}); + } + background-size : cover; + text-align : center; + + .title { + color : white; + padding-top : 80px; + font-size : 22px; + + h2 { + margin-top : 0 !important; + margin-bottom : 10px !important; + } + + h3 { + font-weight : 100; + font-size : 24px; + margin : 0 !important; + } + } + + .links { + margin-top : 20px; + color : white; + display : flex; + justify-content : space-around; + + a { + color : #fff; + text-decoration : none !important; + outline : none; + padding-right : 10px; + } + } + + button { + align-items: flex-start; + font-size: 1.14em; + text-align: center; + cursor: pointer; + border-top-left-radius: 15px; + border-top-right-radius: 15px; + line-height: 1.42857143; + width: 25%; + margin-top: 1%; + color: white; + padding: 1.2%; + border-width: 5%; + border-style: none; + border-image: initial; + outline : none; + } + + .recurso { + background-color : #ff7f00; + } + .material-formacao { + background-color : #e81f4f; + } + .colecao { + background-color : #673ab7; + } +` diff --git a/src/Components/ShareModal.js b/src/Components/ShareModal.js new file mode 100644 index 0000000000000000000000000000000000000000..93eb4828efc78e5cf0b8216caa8297d3c5c4331c --- /dev/null +++ b/src/Components/ShareModal.js @@ -0,0 +1,247 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useRef} from 'react'; +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import {apiDomain} from '../env'; +import Grid from '@material-ui/core/Grid'; +import Facebook from '../img/facebook.svg' +import Twitter from '../img/twitter.svg' +import LinkIcon from '../img/link_icon.svg' +import CloseModalButton from './CloseModalButton.js' + +export default function ReportModal (props) { + const textAreaRef = useRef(props.link); + + const copyToClipboard = (e) => { + textAreaRef.current.select(); + document.execCommand('copy'); + // This is just personal preference. + // I prefer to not show the whole text area selected. + e.target.focus(); + }; + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <Container> + <Header> + <span style={{width:"32px"}}/> + <h2>Compartilhar este recurso</h2> + <CloseModalButton handleClose={props.handleClose}/> + </Header> + <Content style={{paddingTop : "0"}}> + <ResourceInfo> + <img src={apiDomain + props.thumb} alt="thumbnail recurso"/> + <div className="text"> + <strong>{props.title}</strong> + <span>{props.link}</span> + </div> + </ResourceInfo> + <ShareInfo> + <Grid container style={{paddingRight : "15px", paddingLeft : "15px"}}> + + {/*Share to facebook*/} + <Grid item xs={4}> + <StyledLink + href={"https://www.facebook.com/sharer/sharer.php?u=" + props.link} + rel="noreferrer" + target="_blank"> + <ShareButton> + <img src={Facebook} alt="facebook-logo"/> + <p>FACEBOOK</p> + </ShareButton> + </StyledLink> + </Grid> + + {/*Share to Twitter*/} + <Grid item xs={4}> + <StyledLink + href={"https://www.twitter.com/intent/tweet?url=" + props.link} + rel="noreferrer" + target="_blank"> + <ShareButton> + <img src={Twitter} alt="twitter-logo"/> + <p>TWITTER</p> + </ShareButton> + </StyledLink> + </Grid> + + {/*Get shareable link*/} + <Grid item xs={4}> + { + document.queryCommandSupported('copy') && + <ShareButton onClick={copyToClipboard}> + <img src={LinkIcon} alt="link-icon"/> + <p>COPIAR LINK</p> + <textarea ref={textAreaRef} value={props.link} readOnly style={{height: "0", position: "absolute",zIndex: "-1"}}/> + </ShareButton> + } + </Grid> + </Grid> + </ShareInfo> + </Content> + </Container> + </Fade> + </StyledModal> + ) +} + +const ShareButton = styled(Button)` + text-align :center; + margin : 0 !important; + min-height : 121px !important; + + .MuiButton-label { + display : flex !important; + flex-direction : column !important; + justify-content : center !important; + font-weight : 700 !important; + } + + img { + height : 75px; + width : 75px; + padding-top : 10px; + vertical-align : middle; + } + + p { + margin : 0 0 10px; + } +` + +const ShareInfo = styled.div` + padding-top : 20px; + color : #000; +` + +const ResourceInfo = styled.div` + margin-top : 0; + background-color : #f4f4f4; + overflow : hidden; + border-radius : 5px; + display : flex; + flex-direction : row; + align-items : center; + align-content : center; + max-wdith : 100%; + justify-content : space-between; + + .text { + max-height : 100%; + max-width : 66.66%; + display : flex; + flex-direction : column; + text-align : left; + padding-right : 10px; + } + + img { + object-fit : cover; + height : 115px; + max-width : 165px; + background-color : #e5e5e5; + float : left; + padding : 0; + + @media screen and (min-width : 600px) { + margin-right : 20px; + margin-bottom : 0; + } + @media screen and (max-width : 768px) { + width : 100%; + } + } + +` + +const Content = styled.div` + padding : 20px 30px; + overflow : visible; + +` + +const Header = styled.div` + display : flex; + flex-direction : row; + padding : 10px 26px 0 26px; + align-items : center; + justify-content : space-between; + height : 64px; + + h2 { + font-size : 26px; + font-weight : lighter; + color : #666 + } +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const Container = styled.div` + box-sizing : border-box; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); + background-color : white; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + padding : 10px; + border-radius : 4px; + + @media screen and (min-width : 700px) { + max-width : 600px; + } + + @media screen and (max-width : 699px) { + width : 100%; + height : 100%; + } +` +const StyledLink = styled.a` + text-decoration : none; +` \ No newline at end of file diff --git a/src/Components/ShinyProgressBar.js b/src/Components/ShinyProgressBar.js new file mode 100644 index 0000000000000000000000000000000000000000..f2d1cc03c8c2df869499dd72d3dda7078fe2f7de --- /dev/null +++ b/src/Components/ShinyProgressBar.js @@ -0,0 +1,55 @@ +import React, {Component} from 'react'; +import {Container} from 'react-grid-system'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import styled from 'styled-components' + + +export default function ShinyProgressBar(props) { + return ( + <ProgressBar> + <ShinyFiller percentage={props.percentage}/> + </ProgressBar> + ); +} + +const ShinyFiller = (props) => { + return ( + <StyledFiller style={{ width: `${props.percentage}%` }}> + <FillerShine/> + </StyledFiller> + ); +} + +const FillerShine = (props) => { + return <StyledShine/> +} + +const ProgressBar = styled.div` + background: #C4C4C4; + position: relative; + height: 30px; + width: 100%; + border-radius: 50px; + margin-left:20px; + margin-right:20px; +` + +const StyledFiller = styled.div` + background: #02A4B9; + height: 100%; + border-radius: 50px; + transition: width 1s ease-in; +` + +const StyledShine = styled.div` + position: relative; + top: 5px; + left: 15px; + background: #03C0CE; + height: 25%; + width: 95%; + border-radius: 50px; + transition: width 1s ease-in; + z-index: +1; +` \ No newline at end of file diff --git a/src/Components/SignUpContainer.js b/src/Components/SignUpContainer.js deleted file mode 100644 index f87f002efb76eb4ee4313705ab6f9e81003b4b9b..0000000000000000000000000000000000000000 --- a/src/Components/SignUpContainer.js +++ /dev/null @@ -1,300 +0,0 @@ -/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre -Departamento de Informatica - Universidade Federal do Parana - -This file is part of Plataforma Integrada MEC. - -Plataforma Integrada MEC is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Plataforma Integrada MEC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ - -import React, {Component} from "react"; -import GoogleLogin from 'react-google-login' -import { Button } from '@material-ui/core'; -//import FacebookLogin from 'react-facebook-login'; -import CloseIcon from '@material-ui/icons/Close'; -import styled from 'styled-components' -import {device} from './device.js' -import FormInput from "./FormInput.js" - -const responseGoogle = (response) => { - console.log(response); -} - -const responseFacebook = (response) => { - console.log(response); -} - -var Recaptcha = require('react-recaptcha') - -//alterar funcao do callback -var callback = function () { - console.log('Done!!!!'); -}; - -class SignUpContainer extends Component { - constructor (props) { - super(props); - - this.state = { - nomeCompleto: "", - email: "", - senha: "" - }; - }; - - switchModal = (e) => { - e.preventDefault() - this.props.handleClose() - this.props.openLogin() - }; - - handleChange = e => { - this.setState({[e.target.name]: e.target.value}) - }; - - onSubmit = (e) => { - //on submit we should prevent the page from refreshing - e.preventDefault(); //though this is arguable - - //pass user info to Store.js and clear all text fields - this.props.handleLoginInfo(this.state) - this.setState({ - nomeCompleto: "", - email: "", - senha: "" - }) - - } - - render () { - return ( - <ContainerStyled > - <DialogHeaderStyled> - <H2Styled> Cadastrar-se - <StyledCloseModalButton onClick={this.props.handleClose} > - <CloseIcon /> - </StyledCloseModalButton> - </H2Styled> - </DialogHeaderStyled> - - <div style={{paddingTop: "20px"}}> - <div style={{marginTop:"0"}}> - <StyledGoogleLoginButton - clientId="658977310896-knrl3gka66fldh83dao2rhgbblmd4un9.apps.googleusercontent.com" - - onSuccess={responseGoogle} - onFailure={responseGoogle} - cookiePolicy={'single_host_origin'} - > - <span style={{textTransform:"none", fontSize:"13px"}}>Usando o Google</span> - </StyledGoogleLoginButton> - </div> - </div> - - <H3Styled> - <RightSideStrikedH3/> - <span style={{verticalAlign:"middle"}}>ou</span> - <LeftSideStrikedH3/> - </H3Styled> - - <form ref="form" onSubmit={this.onSubmit}> - <FormInput - inputType={"text"} - name={"nomeCompleto"} - value={this.state.nomeCompleto} - placeholder={"Nome Completo *"} - handleChange={e => this.handleChange(e)} - /> - <br/> - <FormInput - inputType={"text"} - name={"email"} - value={this.state.email} - placeholder={"E-mail *"} - handleChange={e => this.handleChange(e)} - /> - <br/> - <FormInput - inputType={"password"} - name={"senha"} - value={this.state.senha} - placeholder={"Senha *"} - handleChange={e => this.handleChange(e)} - /> - <br/> - <StyledRecaptcha - sitekey="6LcyFr8UAAAAAOd0Po6rmZC1D_nYik8nLCAkNKsc" - render="explicit" - onloadCallback={callback} - /> - <ConfirmContainerStyled> - <StyledSignUpButton onClick={e => this.onSubmit(e)} variant="contained"> - <span - style={{paddingLeft:"16px", paddingRight:"16px", borderRadius:"3px", boxSizing:"border-box", - fontFamily:"Roboto, sans serif", fontWeight:"500", color:"#fff"}} - > - CADASTRAR - </span> - </StyledSignUpButton> - </ConfirmContainerStyled> - </form> - - <TermosDeUsoStyled> - <p>Ao se cadastrar, você está aceitando os Termos de Uso e de PolÃtica - de Privacidade. <a href="./">Ler Termos</a>.</p> - </TermosDeUsoStyled> - - <DialogFooterStyled> - <span style={{textAlign:"center", fontSize: "14px"}}>Já possui cadastro? <StyledAnchor href="" onClick={e => this.switchModal(e)}>ENTRAR</StyledAnchor></span> - </DialogFooterStyled> - </ContainerStyled> - ) - } -} - -export default SignUpContainer - -const ContainerStyled = styled.div` - box-sizing : border-box; - background-color : white; - max-width : none; - align : center; - padding-left : 25px; - padding-right:25px; - padding-bottom:10px; - border-radius: 4px; - @media ${device.mobileM} { - width : 100%; - height : 100%; - } -` - -const DialogHeaderStyled = styled.div` - text-align : center; - display : inline-flex; - justify-content : space-between; - padding : 10px 26px 0 26px; - height : 64px; -` - -const DialogFooterStyled = styled.div` - box-sizing : border-box; - font-family : 'Roboto', sans serif; - margin : 20px -20px; - padding-top : 20px; - border-top : 1px #e5e5e5 solid; - justify-content : center; - text-align : center; - line-height : 1.42857143 -` - -const StyledGoogleLoginButton = styled(GoogleLogin)` - background-color: fff; - border : 1px solid rgb(66, 133, 244); - box-shadow: 0 0 0 1px #4285f4 !important; - :hover { - background-color: #f4f4f4 !important; - } -` - -const TermosDeUsoStyled = styled.div` - font-family: 'Roboto', sans serif, 'Helvetica Neue', Helvetica, Arial, sans-serif; - color : #666; - font-size : 13px; - margin : 0 0 10px; - max-width : 350px; - margin-top : 10px; - text-align : start; -` - -const H2Styled = styled.h2` - align-self : center; - color : #666; - font-size : 26px; - font-weight : lighter; - justify-content: space-between; - font-family: 'Roboto', sans serif, 'Helvetica Neue', Helvetica, Arial, sans-serif !important; - padding: 10px 26px 0 26px; - text-align: center; - letter-spacing: .005em; -` - -const H3Styled = styled.h3` - overflow : hidden; - text-align : center; - font-size : 14px; - color : #666; - margin : 10px 0; -` -const RightSideStrikedH3 = styled.div` - display : inline-block; - border-bottom: 1px dotted #666; - vertical-align : middle; - font-weight : 500; - margin-right : 5px; - width : 45%; -` - -const LeftSideStrikedH3 = styled.div` - display : inline-block; - border-bottom: 1px dotted #666; - vertical-align : middle; - font-weight : 500; - margin-left : 5px; - width : 45%; -` - -const StyledAnchor = styled.a` - color : #00bcd4; - text-decoration : none; -` -const StyledCloseModalButton = styled(Button)` - display : inline-block; - position : relative; - float : right !important; - margin-right : -8px; - background : transparent; - min-width: 0 !important; - width : 40px; -` - -const ConfirmContainerStyled = styled.div` - display : flex; - margin-top : 10px; - align-items : center; - justify-content : center; - box-sizing : border-box; -` - -const StyledSignUpButton = styled(Button)` - background-color: #00bcd4 !important; - box-shadow : none !important; - outline: none !important; - border : 0 !important; - overflow : hidden !important; - width : 50% !important; - display : inline-block !important; - font-family : 'Roboto', sans serif !important; - font-size: 14px !important; - height : 36px !important; - align-items : center !important; - border-radius: 3px !important; - align-self : 50% !important; - :hover { - background-color : #00acc1 !important; - } -` - -const StyledRecaptcha = styled(Recaptcha)` - display : flex !important; - justify-content : center !important; -` diff --git a/src/Components/SignUpContainerFunction.js b/src/Components/SignUpContainerFunction.js new file mode 100644 index 0000000000000000000000000000000000000000..89343fe5ea8d726c1cdb503b68cb280e82b10c46 --- /dev/null +++ b/src/Components/SignUpContainerFunction.js @@ -0,0 +1,354 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from "react"; +import { Button } from '@material-ui/core'; +//import FacebookLogin from 'react-facebook-login'; +import CloseIcon from '@material-ui/icons/Close'; +import styled from 'styled-components' +import {device} from './device.js' +import FormInput from "./FormInput.js" +import {StyledCloseModalButton, DialogContentDiv, DialogHeaderStyled, SocialConnectDiv, H3Div} from './LoginContainerFunction.js' +import {apiUrl} from '../env.js' +import {GoogleLoginButton} from './LoginContainerFunction' +import ValidateUserInput from './HelperFunctions/FormValidationFunction.js' +import GoogleLogo from "../img/logo_google.svg" + +async function handleGoogleAttempt () { + console.log("handleGoogleAttempt") + let request_url = ( + `${apiUrl}/omniauth/google_oauth2?auth_origin_url=` + window.location.href + '&omniauth_window_type=sameWindow&resource_class=User' + ) + window.location.replace(request_url) +} +export default function SignUpContainer (props) { + const [formNome, setNome] = useState( + { + key : false, + value : "", + } + ) + + const [formEmail, setEmail] = useState( + { + key : false, + value : "", + } + ) + + const [formSenha, setSenha] = useState( + { + key : false, + value : "" + } + ) + + const [formConfirmation, setConfirmation] = useState( + { + key : false, + value : "" + } + ) + + const handleChange = (e, type, confirmation) => { + const userInput = e.target.value + const flag = ValidateUserInput(type, userInput, confirmation) + + if (type === 'username') { + setNome({...formNome, + key : flag, + value : userInput + }) + console.log(formNome) + } + else if(type === 'email') { + setEmail({...formEmail, + key : flag, + value : userInput + }) + console.log(formEmail) + } + else if(type === 'password') { + setSenha({...formSenha, + key : flag, + value : userInput + }) + console.log(formSenha) + } + else if(type === 'confirmation') { + setConfirmation({...formConfirmation, + key : flag, + value : userInput + }) + console.log(formConfirmation) + } + } + + const limpaCamposForm = () => { + setNome({...formNome, + key : false, + value : '' + }) + + setEmail({...formEmail, + key : false, + value : '' + }); + + setSenha({...formSenha, + key : false, + value : '' + }) + + setConfirmation({...formConfirmation, + key : false, + value : '' + }) + } + + const switchModal = (e) => { + e.preventDefault() + props.handleClose() + props.openLogin() + }; + + const onSubmit = (e) => { + e.preventDefault(); + const newLogin = {name : formNome.value, email : formEmail.value, password : formSenha.value, senha : formConfirmation.value} + + if (!(formNome.key || formEmail.key || formSenha.key || formConfirmation.key)) { + props.handleLoginInfo(newLogin) + limpaCamposForm() + } + } + + return ( + <ContainerStyled > + <DialogHeaderStyled> + <span style={{width:"32px"}}/> + <H2Styled> Cadastrar-se + </H2Styled> + <StyledCloseModalButton onClick={props.handleClose} > + <CloseIcon /> + </StyledCloseModalButton> + </DialogHeaderStyled> + + <DialogContentDiv> + <SocialConnectDiv> + <GoogleLoginButton onClick={handleGoogleAttempt}> + <img src={GoogleLogo} alt="google-logo" className="google-logo"/> + <span>Usando o Google</span> + </GoogleLoginButton> + </SocialConnectDiv> + + <H3Div> + <H3Styled> + <RightSideStrikedH3/> + <span style={{verticalAlign:"middle"}}>ou</span> + <LeftSideStrikedH3/> + </H3Styled> + </H3Div> + + <form onSubmit={onSubmit}> + <FormInput + inputType={"text"} + name={"name"} + value={formNome.value} + placeholder={"Nome Completo"} + handleChange={e => handleChange(e, 'username')} + required={true} + error={formNome.key} + /> + <br/> + <FormInput + inputType={"text"} + name={"email"} + value={formEmail.value} + placeholder={"E-mail"} + handleChange={e => handleChange(e, 'email')} + required={true} + error={formEmail.key} + help = {formEmail.key ? (formEmail.value.length === 0 ? "Faltou preencher seu e-mail." : <span>Insira um endereço de e-mail válido.<br/>Por exemplo: seunome@gmail.com, seunome@hotmail.com</span>) : ""} + /> + <br/> + <FormInput + inputType={"password"} + name={"password"} + value={formSenha.value} + placeholder={"Senha"} + handleChange={e => handleChange(e, 'password')} + required={true} + error={formSenha.key} + help = {formSenha.key ? (formSenha.value.length === 0 ? "Faltou digitar sua senha." : "A senha precisa ter no mÃnimo 8 caracteres.") : ""} + /> + <br/> + <FormInput + inputType={"password"} + name={"confirmation"} + value={formConfirmation.value} + placeholder={"Confirme a Senha"} + handleChange={e => handleChange(e, 'confirmation', formSenha.value)} + required={true} + error={formConfirmation.key} + help = {formConfirmation.key ? (formConfirmation.value.length === 0 ? "Faltou digitar sua senha." : (formConfirmation.value !== formSenha.value ? "As senhas precisam ser iguais" : "A senha precisa ter no mÃnimo 8 caracteres.")) : ""} + /> + <br/> + <ConfirmContainerStyled> + <StyledSignUpButton type="submit" variant="contained"> + <span + style={{paddingLeft:"16px", paddingRight:"16px", borderRadius:"3px", boxSizing:"border-box", + fontFamily:"Roboto, sans serif", fontWeight:"500", color:"#fff"}} + > + CADASTRAR + </span> + </StyledSignUpButton> + </ConfirmContainerStyled> + </form> + + <TermosDeUsoStyled> + <p>Ao se cadastrar, você está aceitando os Termos de Uso e de PolÃtica + de Privacidade. <a href="/termos">Ler Termos</a>.</p> + </TermosDeUsoStyled> + + <DialogFooterStyled> + <span style={{textAlign:"center", fontSize: "14px"}}>Já possui cadastro? <StyledAnchor href="" onClick={e => switchModal(e)}>ENTRAR</StyledAnchor></span> + </DialogFooterStyled> + </DialogContentDiv> + </ContainerStyled> + ) +} + +const ContainerStyled = styled.div` + box-sizing : border-box; + background-color : white; + max-width : none; + align : center; + display : flex; + flex-direction : column; + min-width : 450px; + + max-height : none; + position : relative; + padding : 10px; + @media ${device.mobileM} { + width : 100%; + min-width : unset; + height : 100%; + min-width : unset !important; + + } +` + +const DialogFooterStyled = styled.div` + box-sizing : border-box; + font-family : 'Roboto', sans serif; + margin : 20px -20px; + padding-top : 20px; + border-top : 1px #e5e5e5 solid; + justify-content : center; + text-align : center; + line-height : 1.42857143 +` + +const TermosDeUsoStyled = styled.div` + font-family: 'Roboto', sans serif, 'Helvetica Neue', Helvetica, Arial, sans-serif; + color : #666; + font-size : 13px; + margin : 0 0 10px; + max-width : 350px; + margin-top : 10px; + text-align : start; +` + +const H2Styled = styled.h2` + align-self : center; + color : #666; + font-size : 26px; + font-weight : lighter; + justify-content: space-between; + font-family: 'Roboto', sans serif, 'Helvetica Neue', Helvetica, Arial, sans-serif !important; + text-align: center; + letter-spacing: .005em; +` + +const H3Styled = styled.h3` + overflow : hidden; + text-align : center; + font-size : 14px; + color : #666; + margin : 10px 0; +` +const RightSideStrikedH3 = styled.div` + display : inline-block; + border-bottom: 1px dotted #666; + vertical-align : middle; + font-weight : 500; + margin-right : 5px; + width : 44%; +` + +const LeftSideStrikedH3 = styled.div` + display : inline-block; + border-bottom: 1px dotted #666; + vertical-align : middle; + font-weight : 500; + margin-left : 5px; + width : 44%; +` + +const StyledAnchor = styled.a` + color : #00bcd4; + text-decoration : none; +` +//const StyledCloseModalButton = styled(Button)` +// display : inline-block; +// position : relative; +// float : right !important; +// margin-right : -8px; +// background : transparent; +// min-width: 0 !important; +// width : 40px; +//` + +const ConfirmContainerStyled = styled.div` + display : flex; + margin-top : 10px; + align-items : center; + justify-content : center; + box-sizing : border-box; + font-size : 13px; +` + +const StyledSignUpButton = styled(Button)` + background-color: #00bcd4 !important; + box-shadow : none !important; + outline: none !important; + border : 0 !important; + overflow : hidden !important; + width : 50% !important; + display : inline-block !important; + font-family : 'Roboto', sans serif !important; + font-size: 14px !important; + height : 36px !important; + align-items : center !important; + border-radius: 3px !important; + align-self : 50% !important; + :hover { + background-color : #00acc1 !important; + } +` diff --git a/src/Components/SignUpModal.js b/src/Components/SignUpModal.js index c25758f49c33d287bd28a13f321bdd7eeaa8b673..e01678072f356a5f7aa4a76da8edfd3052e01167 100644 --- a/src/Components/SignUpModal.js +++ b/src/Components/SignUpModal.js @@ -16,89 +16,47 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ import React, {useContext} from 'react'; -import { makeStyles } from '@material-ui/styles'; -import { Button } from '@material-ui/core'; import Modal from '@material-ui/core/Modal'; import Backdrop from '@material-ui/core/Backdrop'; import Fade from '@material-ui/core/Fade'; import styled from 'styled-components' -import SignUpContainer from './SignUpContainer.js' +import SignUpContainer from './SignUpContainerFunction.js' import {Store} from '../Store.js' -import axios from 'axios' -import {apiUrl} from '../env'; - -const StyledModalSignUp = styled(Modal)` - .djXaxP{ - margin : 0 !important; - } - - display : flex; - align-items: center; - justify-content : center; - text-align : center; - padding : 10px !important; - border-radius : 4px; - -` - -const useStyles = makeStyles(theme => ({ - modal: { - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - textAlign: "center", - maxBlockSize: "350px", - width: '100%', - minBlockSize: "100px", - }, - paper: { - backgroundColor: "theme.palette.background.paper", - border: '2px solid #000', - boxShadow: " 0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12);", - align:"center", - }, -})); +import {authentication} from './HelperFunctions/getAxiosConfig' +//import {postRequest} from './HelperFunctions/getAxiosConfig' export default function SignUpModal (props) { const { state, dispatch } = useContext(Store) + function handleSuccess (data) { + dispatch ({ + type: 'USER_SIGNED_UP', + userLoggedIn: !state.userIsLoggedIn, + user: data.data + }) + props.handleClose() + } const handleLoginInfo = (newLogin) => { - - axios.post(`${apiUrl}/auth`, - { - name : newLogin.nomeCompleto, + const url = `/auth` + const payload = { + name : newLogin.name, email: newLogin.email, - password : newLogin.senha, - password_confirmation : newLogin.senha + password : newLogin.password, + password_confirmation : newLogin.senha //, + // terms_of_service : true, + // avatar: "" } - ).then( (response) => { - dispatch ( { - type: 'USER_SIGNED_UP', - userLoggedIn: !state.userIsLoggedIn, - login: { - username : newLogin.username, - email : newLogin.email, - accessToken : response.headers['access-token'], - client : response.headers.client - } - } - ) - props.handleClose() - }, (error) => { - console.log(':(') - } - ) + authentication(url, payload, handleSuccess, (error) => {console.log(error)}) + //postRequest(url, payload, handleSuccess, (error) => {console.log(error)}) } - //useEffect(()=>{console.log(state.loginInfo)},[state.loginInfo]) - return ( <StyledModalSignUp aria-labelledby="transition-modal-title" aria-describedby="transition-modal-description" open={props.open} - animation={true} - centered={true} + + centered="true" onClose={props.handleClose} closeAfterTransition BackdropComponent={Backdrop} @@ -116,3 +74,17 @@ export default function SignUpModal (props) { </StyledModalSignUp> ) } + +const StyledModalSignUp = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + border-radius : 4px; + +` diff --git a/src/Components/SnackbarComponent.js b/src/Components/SnackbarComponent.js new file mode 100644 index 0000000000000000000000000000000000000000..b0bd36a67d134d598e603d3d8c749763132579d7 --- /dev/null +++ b/src/Components/SnackbarComponent.js @@ -0,0 +1,33 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import Alert from '../Components/Alert.js'; +import Snackbar from '@material-ui/core/Snackbar'; + +export default function SnackbarComponent(props) { + return ( + <Snackbar open={props.snackbarOpen} autoHideDuration={3000} onClose={props.handleClose} + anchorOrigin={{ vertical: 'top', horizontal: 'right' }} + > + <Alert severity={props.severity} style={props.color ? { backgroundColor: props.color } : { backgroundColor: "#00acc1" }}> + {props.text} + </Alert> + </Snackbar> + ) +} diff --git a/src/Components/StatsBar.js b/src/Components/StatsBar.js index 0572d3f89199ec0096cfb582b681888cf02e9168..0cdde4942b065244271cb8e5c82f44e0e96d36d2 100644 --- a/src/Components/StatsBar.js +++ b/src/Components/StatsBar.js @@ -18,6 +18,8 @@ along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/> import React, {Component} from 'react'; import {Col,Row, Container} from 'react-grid-system'; +import { apiUrl } from "../env"; +import axios from "axios"; import mapaBrasil from '../img/mapa-brasil-line-icon.svg'; const brasilStyle={ backgroundColor: "#00bcd4", @@ -41,6 +43,21 @@ const statistcStyle={ }; class StatsBar extends Component{ + constructor(props){ + super(props) + this.state ={ + available_resources: 0, + month_publications:0, + month_downloads:0 + } + } + componentDidMount(){ + // https://api.portalmec.c3sl.ufpr.br/v1/statistics + axios.get(`${apiUrl}/statistics`).then((res) => { + this.setState({available_resources:res.data.count, month_publications:res.data.month_publications, month_downloads:res.data.month_downloads}) + }) + } + render(){ return( <div style={brasilStyle}> @@ -50,7 +67,7 @@ class StatsBar extends Component{ <img src={mapaBrasil} height="83px" alt="mapa do brasil"/> <span style={statistcStyle}> <span style={numberStyle}> - 31061 + {this.state.available_resources} </span> <span> Recursos disponÃveis @@ -62,13 +79,13 @@ class StatsBar extends Component{ ESSE MÊS: <span style={statistcStyle}> <span style={numberStyle}> - 10 + {this.state.month_downloads} </span> Baixados </span> <span style={statistcStyle}> <span style={numberStyle}> - 1 + {this.state.month_publications} </span> Publicados </span> diff --git a/src/Components/StatsBarFunction.js b/src/Components/StatsBarFunction.js new file mode 100644 index 0000000000000000000000000000000000000000..857c7393632a50ffdd3a8922044bbc4c14cb5efa --- /dev/null +++ b/src/Components/StatsBarFunction.js @@ -0,0 +1,137 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react'; +import styled from 'styled-components' +import { apiUrl } from "../env"; +import axios from "axios"; +import mapaBrasil from '../img/mapa-brasil-line-icon.svg'; +import Grid from '@material-ui/core/Grid'; + +export default function (props) { + const [available_resources, setAvailableResources] = useState(0) + const [month_publications, setMonthPublications] = useState(0) + const [month_downloads, setMonthDownloads] = useState(0) + + const WINDOW_WIDTH = window.innerWidth + + useEffect(() => { + axios.get(`${apiUrl}/statistics`) + .then( + (res) => { + setAvailableResources(res.data.count) + setMonthPublications(res.data.month_publications) + setMonthDownloads(res.data.month_downloads) + }) + }, []) + + return ( + <StatsTab> + <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300&display=swap" rel="stylesheet" /> + <Grid container direction={WINDOW_WIDTH <= 670 ? "column" : "row"} justify="center" alignItems="center" spacing={3}> + <Grid item> + <Grid container direction="row" alignItems="center" spacing={2}> + <Grid item> + <img src={mapaBrasil} height="83px" alt="mapa do brasil" /> + </Grid> + <Grid item> + <Grid container direction="column"> + <StyledGridNumbers item style={{ textAlign: "center" }}> + {available_resources} + </StyledGridNumbers> + <StyledGridLabels item> + Recursos disponÃveis + </StyledGridLabels> + </Grid> + </Grid> + </Grid> + </Grid> + <Grid item style={WINDOW_WIDTH <= 670 ? {width: "100%"} : null}> + <StyledDivider /> + </Grid> + <Grid item> + <Grid container direction="row" alignItems="center" spacing={2}> + <StyledGridLabels item> + ESSE MÊS: + </StyledGridLabels> + + <Grid item> + <Grid container direction="column"> + <StyledGridNumbers item> + {month_downloads} + </StyledGridNumbers> + <StyledGridLabels item> + Baixados + </StyledGridLabels> + </Grid> + </Grid> + + <Grid item> + <Grid container direction="column"> + <StyledGridNumbers item> + {month_publications} + </StyledGridNumbers> + <StyledGridLabels item> + Publicados + </StyledGridLabels> + </Grid> + </Grid> + </Grid> + </Grid> + </Grid> + </StatsTab> + ) + +} + +const StatsTab = styled.div` + padding : 20px 0; + color : #fff; + background-color : #00bcd4; + font-family: 'Roboto', sans-serif; +` +const StyledDivider = styled.div` + border-bottom: 1px dotted white; + width: 80%; + margin: 0 auto; + height: 1px; + @media screen and (min-width : 670px) { + border-right: 1px dotted white; + width: 1px; + height: 70.3px; + } +` +const StyledGridNumbers = styled(Grid)` + text-align: center; + font-weight: 700; + font-size: 26px; + > p{ + font-family: 'Roboto', sans-serif; + } + @media screen and (min-width : 406px) { + font-size: 3.571em; + } +` + +const StyledGridLabels = styled(Grid)` + font-size: 16px; + font-weight: 300; + @media screen and (min-width : 406px) { + font-size: 1.285em; + } +` \ No newline at end of file diff --git a/src/Components/Stepper.js b/src/Components/Stepper.js new file mode 100644 index 0000000000000000000000000000000000000000..b1315b9844bdd5726e5b7589c1adf6be80d87417 --- /dev/null +++ b/src/Components/Stepper.js @@ -0,0 +1,53 @@ +import React from 'react' +import styled from 'styled-components' + +export default function Stepper (props) { + + return ( + <div style={{display:"flex",justifyContent:"center", marginBottom:"50px"}}> + <FeedbackUpload> + { + props.items.map((item)=> + <div className={"page-selector " + (item.selected ? 'selected' : '')} > + {item.value} + </div> + ) + } + </FeedbackUpload> + </div> + ) +} + +const FeedbackUpload = styled.div` + width : 280px; + display : flex; + background :#e5e5e5; + flex-direction : row; + justify-content : space-between; + height : 50px; + align-items : center; + padding : 7px; + border-radius : 50px; + margin-top : 20px; + + .page-selector { + height : 36px; + width : 36px; + background : #fff; + border-radius : 50%; + color : #00bcd4; + line-height : 32px; + font-size : 20px; + font-weight : 500; + border: solid 3px #00bcd4; + text-align: center; + align-items : center; + vertical-align:middle; + } + + .selected { + background : #00bcd4; + color : #fff; + border-color : #00bcd4; + } +` diff --git a/src/Components/StoreGuide.js b/src/Components/StoreGuide.js new file mode 100644 index 0000000000000000000000000000000000000000..f3f22b5695349341eaab3a7bb80bd3c0a7875749 --- /dev/null +++ b/src/Components/StoreGuide.js @@ -0,0 +1,85 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React from 'react'; +import styled from 'styled-components'; +import Grid from '@material-ui/core/Grid'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; + +const StoreTitle = styled.h1` + margin-top: 0; +` + +const StoreTopic = styled.h2` + padding-top: 0.5em; + font-size: 1em; + font-weight: 100; +` + +const StoreBody = styled.p` + font-size: 0.8em; +` +export default function ItemStoreContainer (props) { + return ( + <Grid item xs={10} sm={7}> + <Card> + <CardContent> + <StoreTitle> + Lojinha + </StoreTitle> + <StoreTopic> + O que são "gemas"? + </StoreTopic> + <StoreBody> + Gemas são moedas virtuais que você ganha usando a plataforma MEC RED (publicando recursos, avaliando recursos, criando conexões, etc) e pode usar para adquirir itens cosméticos para seu perfil, como insÃgnias e bordas de avatar. + </StoreBody> + <StoreTopic> + Posso usar dinheiro real para comprar gemas? + </StoreTopic> + <StoreBody> + <strong>Não.</strong> Gemas são adquiridas exclusivamente através do uso da plataforma. + </StoreBody> + <StoreTopic> + Qual a vantagem de usar itens? + </StoreTopic> + <StoreBody> + Os itens são uma maneira de mostrar quem você é, quais os seus interesses e quais foram suas contribuições mais importantes. Nenhum item oferece funcionalidade a mais, de maneira que novos usuários não sofram desvantagem. + </StoreBody> + <StoreTopic> + Como usar + </StoreTopic> + <StoreBody> + As seções da loja dividem os itens por <strong>categoria</strong>. + <ul> + <li> + Itens adquiridos <strong>somente por conquistas</strong> não aparecem + na loja (exceto pelos que você já tem); + </li> + <li> + Outros itens podem ser comprados (usando gemas), usados (usar uma borda de avatar, por exemplo) ou tirados (se estiverem sendo usados). + </li> + </ul> + </StoreBody> + <h4> + Boas compras! + </h4> + </CardContent> + </Card> + </Grid> + ) +} diff --git a/src/Components/TabPanels/Breadcrumbs.js b/src/Components/TabPanels/Breadcrumbs.js new file mode 100644 index 0000000000000000000000000000000000000000..1d208986d7bd89b210da95806d101796301a36d9 --- /dev/null +++ b/src/Components/TabPanels/Breadcrumbs.js @@ -0,0 +1,67 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + + +import React from 'react' +import styled from 'styled-components' +import Breadcrumbs from '@material-ui/core/Breadcrumbs'; +import {Link} from 'react-router-dom'; + +export default function CustomizedBreadcrumbs (props) { + + return ( + <BreadcrumbsDiv> + <StyledBreadcrumbs> + <Link to="/" style={{color:"#00bcd4", textDecoration:"none"}}> + Página Inicial + </Link> + { + props.values.map( (value, i) => + <span key={i}> + {value} + </span> + ) + } + {/*<span> + {props.currentPage} + </span> + <span> + {props.value} + </span> */} + </StyledBreadcrumbs> + </BreadcrumbsDiv> + ) +} + +const BreadcrumbsDiv = styled.div` + padding : 10px; + display : flex; + justify-content : center; + @media screen and (max-width: 768px) { + margin-left : 10px; + } + ` + +const StyledBreadcrumbs = styled(Breadcrumbs)` + display : flex; + justify-content : flex-start; + max-width : 1170px; + span { + color : #a5a5a5; + } +` diff --git a/src/Components/TabPanels/PanelComponents/ButtonsArea.js b/src/Components/TabPanels/PanelComponents/ButtonsArea.js new file mode 100644 index 0000000000000000000000000000000000000000..848001761ebc4f63beb1f5cc1c46a317dc8158ab --- /dev/null +++ b/src/Components/TabPanels/PanelComponents/ButtonsArea.js @@ -0,0 +1,159 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import styled from 'styled-components' +import { Carregados } from '../StyledComponents.js' +import Button from '@material-ui/core/Button'; + +export function ButtonsAreaRecurso(props) { + return ( + <Carregados> + <p style={{ margin: "0 0 10px", fontSize: "14px" }}> + {props.sliceLength} recursos carregados de {props.total} + </p> + + { + props.end ? + null : + <React.Fragment> + <ButtonMostrarMaisRecurso onClick={() => props.showMore(4)}> + <span style={{ color: "#fff", fontSize: "14px", fontWeight: "500" }}>MOSTRAR MAIS 4</span> + </ButtonMostrarMaisRecurso> + <ButtonMostrarTodos onClick={() => { props.showMore(20) }}> + <span style={{ color: "#666", fontSize: "14px", fontWeight: "500" }}>MOSTRAR MAIS 20</span> + </ButtonMostrarTodos> + </React.Fragment> + } + + </Carregados> + ) +} + +export function ButtonsAreaColecao(props) { + return ( + <Carregados> + <p style={{ margin: "0 0 10px", fontSize: "14px" }}> + {props.sliceLength} coleções carregadas de {props.total} + </p> + { + props.end ? + null + : + <React.Fragment> + <ButtonMostrarMaisColecao onClick={() => { props.showMore(4) }}> + <span style={{ color: "#fff", fontSize: "14px", fontWeight: "500" }}>MOSTRAR MAIS 4</span> + </ButtonMostrarMaisColecao> + + <ButtonMostrarTodos onClick={() => { props.showMore(20) }}> + <span style={{ color: "#666", fontSize: "14px", fontWeight: "500" }}>MOSTRAR MAIS 20</span> + </ButtonMostrarTodos> + </React.Fragment> + } + </Carregados> + ) +} + +export function ButtonsAreaRede(props) { + return ( + <Carregados> + <p style={{ margin: "0 0 10px", fontSize: "14px" }}> + {props.sliceLength} usuários carregados {props.total} + </p> + + { + props.end ? + null + : + <React.Fragment> + <ButtonMostrarMaisRede onClick={() => { props.showMore(4) }}> + <span style={{ color: "#fff", fontSize: "14px", fontWeight: "500" }}>MOSTRAR MAIS 4</span> + </ButtonMostrarMaisRede> + + <ButtonMostrarTodos onClick={() => { props.showMore(20) }}> + <span style={{ color: "#666", fontSize: "14px", fontWeight: "500" }}>MOSTRAR MAIS 20</span> + </ButtonMostrarTodos> + </React.Fragment> + } + + </Carregados> + ) +} + +const ButtonMostrarTodos = styled(Button)` + &:hover { + background-color : #d5d5d5 !important; + } + height : 36px !important; + padding-left : 16px !important; + padding-right : 16px !important; + font-weight : 500 !important; + border-radius : 3px !important; + color :#666 !important; + background-color: #e8e8e8 !important; + min-width : 88px !important; + height : 36px !important; +` + +const ButtonMostrarMaisRede = styled(Button)` + background-color : #00bcd4 !important; + font-size: 14px !important; + font-weight: 500 !important; + height: 36px !important; + border-radius: 3px !important; + padding-left: 16px !important; + padding-right: 16px !important; + box-shadow: 0 2px 5px 0 rgba(0,0,0,.26) !important; + outline : none !important; + min-width : 88px !important; + vertical-align : middle !important; + margin : 6px 8px !important; + text-decoration : none !important; +` + +export const ButtonMostrarMaisColecao = styled(Button)` + background-color : #503096 !important; + font-size: 14px !important; + font-weight: 500 !important; + height: 36px !important; + border-radius: 3px !important; + padding-left: 16px !important; + padding-right: 16px !important; + box-shadow: 0 2px 5px 0 rgba(0,0,0,.26) !important; + outline : none !important; + min-width : 88px !important; + vertical-align : middle !important; + margin : 6px 8px !important; + text-decoration : none !important; +` + +export const ButtonMostrarMaisRecurso = styled(Button)` + background-color : #ff7f00 !important; + font-size: 14px !important; + font-weight: 500 !important; + height: 36px !important; + border-radius: 3px !important; + padding-left: 16px !important; + padding-right: 16px !important; + box-shadow: 0 2px 5px 0 rgba(0,0,0,.26) !important; + outline : none !important; + min-width : 88px !important; + vertical-align : middle !important; + margin : 6px 8px !important; + text-decoration : none !important; +` diff --git a/src/Components/TabPanels/PanelComponents/NoContent.js b/src/Components/TabPanels/PanelComponents/NoContent.js new file mode 100644 index 0000000000000000000000000000000000000000..ef129ecef30c18abc9ab58d501330ab8b778678f --- /dev/null +++ b/src/Components/TabPanels/PanelComponents/NoContent.js @@ -0,0 +1,58 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import styled from 'styled-components' + +export default function NoContent (props) { + + return ( + <DivTextoNoPublications> + <InnerDiv> + <NoPubSpan>{props.text}</NoPubSpan> + </InnerDiv> + </DivTextoNoPublications> + ) +} + +const NoPubSpan = styled.span` + margin-top : 10px; + font-size : 24px; + font-family : Roboto; + font-weight : lighter; + white-space : break-spaces +` + +const InnerDiv = styled.div` + top : 50%; + position : relative; + transform : translateY(-50%); +` + +export const DivTextoNoPublications = styled.div` + height : 360px; + text-align : center; + padding-left : 15px; + padding-right : 15px; +` + +// {/*const DivConteudoNaoPublicado = styled.div` +// position : relative; +// top : 50%; +// transform : translateY(-50%); +// `*/} diff --git a/src/Components/TabPanels/PanelComponents/PanelTitle.js b/src/Components/TabPanels/PanelComponents/PanelTitle.js new file mode 100644 index 0000000000000000000000000000000000000000..ffe073623b4fa46f583ca4f513b9cb4c7f9c1565 --- /dev/null +++ b/src/Components/TabPanels/PanelComponents/PanelTitle.js @@ -0,0 +1,36 @@ +import React from 'react' +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; + +export default function PanelTitle (props) { + return ( + <Header container> + <Grid item xs={12}> + <p className="titulo">{props.title} <b style={{fontWeight:"500", fontSize : "20px"}}>({props.length})</b></p> + <hr/> + </Grid> + </Header> + ) +} + +const Header = styled(Grid)` + margin-bottom : 15px; + padding : 0; + + .titulo { + margin : 0; + font-style : normal; + color : #757575; + font-size : 1.857em; + padding-left : 15px; + padding-right : 15px; + margin-top : 10px; + margin-bottom : 5px; + } + + hr { + border : 0; + margin : 0 15px 0 15px; + border-top : 1px solid #757575; + } +` diff --git a/src/Components/TabPanels/PanelComponents/TemplateColecao.js b/src/Components/TabPanels/PanelComponents/TemplateColecao.js new file mode 100644 index 0000000000000000000000000000000000000000..7af99a6cf6e901be5a1c03276475edb85a4dc44e --- /dev/null +++ b/src/Components/TabPanels/PanelComponents/TemplateColecao.js @@ -0,0 +1,121 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import Grid from '@material-ui/core/Grid'; +import NoContent from './NoContent.js' +import CollectionCardFunction from '../../CollectionCardFunction.js' +import Title from './PanelTitle.js' +import { WhiteContainer, StyledGrid } from '../StyledComponents.js' +import { ButtonsAreaColecao } from './ButtonsArea' +import LoadingSpinner from '../../LoadingSpinner.js' + +export default function PanelTemplateColecao(props) { + const RenderFollowedColCard = (card, followerBoolean) => { + if (followerBoolean) { + return ( + <CollectionCardFunction + name={card.name} + collections={card.followable.collection_items} + rating={card.followable.review_average} + type={card.followable.object_type} + description={card.followable.description} + author={card.followable.owner.name} + authorID={card.followable.owner.id} + avatar={card.followable.owner.avatar} + thumbnails={card.followable.items_thumbnails} + likeCount={card.followable.likes_count} + liked={card.followable.liked} + followed={card.followable.followed} + privacy={card.followable.privacy} + id={card.followable.id} + tags={card.followable.tags} + /> + ) + } + else { + return ( + <CollectionCardFunction + name={card.name} + tags={card.tags} + rating={card.review_average} + id={card.id} + author={card.owner.name} + description={card.description} + thumbnails={card.items_thumbnails} + avatar={card.owner.avatar} + likeCount={card.likes_count} + followed={card.followed} + liked={card.liked} + collections={card.collection_items} + authorID={card.owner.id} + /> + ) + } + } + + return ( + <WhiteContainer> + <Title + title={props.title} + length={props.end} + /> + + { + props.error ? + <p + style={{ fontSize: "15px", fontWeight: "lighter", margin: "0 0 10px", display: "flex", justifyContent: "center", textAlign: "center" }} + > + Erro ao tentar obter os dados + </p> + : + props.length === 0 ? + ( + <NoContent text={props.noContentText} /> + ) + : + ( + <React.Fragment> + <StyledGrid container spacing={1} style={{ paddingLeft: "30px", paddingRight: "15px" }}> + { + props.sliceArr.map((card) => + <Grid item xs={12} sm={6} md={'auto'} lg={3} key={card.id}> + {RenderFollowedColCard(card, props.followed)} + </Grid> + ) + } + </StyledGrid> + { + props.loadingMore ? + <LoadingSpinner text={'Carregando Recursos...'} /> + : + <ButtonsAreaColecao + sliceLength={props.sliceArr.length} + length={props.length} + showMore={props.showMore} + total={props.end} + end={String(props.sliceArr.length) === props.end} + /> + } + </React.Fragment> + ) + } + + </WhiteContainer> + ) +} diff --git a/src/Components/TabPanels/PanelComponents/TemplateCuradoria.js b/src/Components/TabPanels/PanelComponents/TemplateCuradoria.js new file mode 100644 index 0000000000000000000000000000000000000000..4426a239ded8dc1c3d42925e8f83caa7c59598d7 --- /dev/null +++ b/src/Components/TabPanels/PanelComponents/TemplateCuradoria.js @@ -0,0 +1,98 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import Grid from '@material-ui/core/Grid'; +import NoContent from './NoContent.js' +import ResourceCardFunction from '../../ResourceCardFunction.js' +import Title from './PanelTitle.js' +import { WhiteContainer, StyledGrid } from '../StyledComponents.js' +import { ButtonsAreaRecurso } from './ButtonsArea' +import LoadingSpinner from '../../LoadingSpinner.js'; + +export default function Template(props) { + console.log(props.sliceArr); + return ( + <WhiteContainer> + <Title + title={props.titleText} + length={props.end} + /> + + { + props.error ? + <p + style={{ fontSize: "15px", fontWeight: "lighter", margin: "0 0 10px", display: "flex", justifyContent: "center", textAlign: "center" }} + > + Erro ao tentar obter os dados + </p> + : + props.length === 0 ? + ( + [ + <NoContent text={props.noContentText} /> + ] + ) + : + ( + [ + <React.Fragment> + <StyledGrid container spacing={1} justify="center" alignItems="center" style={{ paddingLeft: "30px", paddingRight: "15px" }}> + { + props.sliceArr.map((card) => + <Grid item xs={12} sm={6} md={'auto'} lg={3} key={card.id}> + <ResourceCardFunction + avatar={card.submitter.avatar} + id={card.learning_object.id} + thumbnail={card.learning_object.thumbnail} + type={card.learning_object.object_type ? card.learning_object.object_type : "Outros"} + title={card.learning_object.name} + published={false} + likeCount={card.learning_object.likes_count} + liked={card.learning_object.liked} + rating={card.learning_object.review_average} + author={card.submitter.name} + tags={card.learning_object.tags} + href={"/recurso/" + card.learning_object.id} + downloadableLink={card.default_attachment_location} + /> + </Grid> + ) + } + </StyledGrid> + { + props.loadingMore ? + <LoadingSpinner text="Carregando recurso..." /> + : + <ButtonsAreaRecurso + sliceLength={props.sliceArr.length} + length={props.length} + showMore={props.showMore} + end={String(props.sliceArr.length) === props.end} + total={props.end} + /> + } + + </React.Fragment> + ] + ) + } + + </WhiteContainer> + ) +} diff --git a/src/Components/TabPanels/PanelComponents/TemplateRecurso.js b/src/Components/TabPanels/PanelComponents/TemplateRecurso.js new file mode 100644 index 0000000000000000000000000000000000000000..6bf05604c0d56eef5e435c449b2b8cc103517572 --- /dev/null +++ b/src/Components/TabPanels/PanelComponents/TemplateRecurso.js @@ -0,0 +1,95 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import Grid from '@material-ui/core/Grid'; +import NoContent from './NoContent.js' +import ResourceCardFunction from '../../ResourceCardFunction.js' +import Title from './PanelTitle.js' +import { WhiteContainer, StyledGrid } from '../StyledComponents.js' +import { ButtonsAreaRecurso } from './ButtonsArea' +import LoadingSpinner from '../../LoadingSpinner.js' + +export default function Template(props) { + + return ( + <WhiteContainer> + <Title + title={props.titleText} + length={props.end} + /> + + { + props.error ? + <p + style={{ fontSize: "15px", fontWeight: "lighter", margin: "0 0 10px", display: "flex", justifyContent: "center", textAlign: "center" }} + > + Erro ao tentar obter os dados + </p> + : + props.length === 0 ? + ( + <NoContent text={props.noContentText} /> + ) + : + ( + <React.Fragment> + <StyledGrid container spacing={1} style={{ paddingLeft: "30px", paddingRight: "15px" }}> + { + props.slice.map((card) => + <Grid item xs={12} sm={6} md={'auto'} lg={3} key={card.id}> + <ResourceCardFunction + key={card.id} + avatar={card.publisher.avatar} + id={card.id} + thumbnail={card.thumbnail} + type={card.object_type ? card.object_type : "Outros"} + title={card.name} + published={card.state === "published" ? true : false} + likeCount={card.likes_count} + liked={card.liked} + rating={card.review_average} + author={card.publisher.name} + tags={card.tags} + href={"/recurso/" + card.id} + downloadableLink={card.default_attachment_location} + /> + </Grid> + ) + } + </StyledGrid> + { + props.loadingMore ? + <LoadingSpinner text={'Carregando Recursos...'} /> + : + <ButtonsAreaRecurso + sliceLength={props.slice.length} + length={props.length} + showMore={props.showMore} + total={props.end} + end={String(props.slice.length) === props.end} + /> + } + + </React.Fragment> + ) + } + + </WhiteContainer> + ) +} diff --git a/src/Components/TabPanels/PanelComponents/TemplateRede.js b/src/Components/TabPanels/PanelComponents/TemplateRede.js new file mode 100644 index 0000000000000000000000000000000000000000..c792b7d2de531c63ef2ec1b44b2f4a61b992b163 --- /dev/null +++ b/src/Components/TabPanels/PanelComponents/TemplateRede.js @@ -0,0 +1,107 @@ +import React from 'react' +import ContactCard from '../../ContactCard.js' +import { apiDomain } from '../../../env'; +import NoContent from './NoContent.js' +import { WhiteContainer, StyledGrid } from '../StyledComponents.js' +import Title from './PanelTitle.js' +import Grid from '@material-ui/core/Grid'; +import { ButtonsAreaRede } from './ButtonsArea' +import LoadingSpinner from '../../LoadingSpinner.js' + +export default function PanelTemplateRede(props) { + const RenderContactCard = (card, followerBoolean) => { + if (followerBoolean) { + return ( + <ContactCard + name={card.follower.name} + avatar={card.follower.avatar !== undefined && card.follower.avatar !== "" ? apiDomain + card.follower.avatar : null} + cover={card.follower.cover !== undefined && card.follower.cover !== "" ? apiDomain + card.follower.cover : null} + numCollections={card.follower.collections_count} + numLearningObjects={card.follower.learning_objects_count} + follow_count={card.follower.follows_count} + followed={card.follower.followed || null} + followerID={card.follower.id} + href={'/usuario-publico/' + card.follower.id} + /> + ) + } + else { + return ( + <ContactCard + name={card.followable.name ? card.followable.name : null} + avatar={card.followable.avatar !== undefined && card.followable.avatar !== "" ? apiDomain + '/' + card.followable.avatar : null} + cover={card.followable.cover !== undefined && card.followable.cover !== "" ? apiDomain + card.followable.cover : null} + numCollections={card.followable.collections_count} + numLearningObjects={card.followable.learning_objects_count} + follow_count={card.followable.follows_count} + followed={card.followable.followed || null} + followedID={card.followable.id} + href={'/usuario-publico/' + card.followable.id} + /> + ) + } + } + + return ( + <WhiteContainer> + + <Title + title={props.title} + length={props.end} + /> + + + {/*if length is 0, display "No Content" text */} + {/*otherwise, display either ContactCard and Buttons */} + { + props.error ? + <p + style={{ fontSize: "15px", fontWeight: "lighter", margin: "0 0 10px", display: "flex", justifyContent: "center", textAlign: "center" }} + > + Erro ao tentar obter os dados + </p> + : + props.length === 0 ? + ( + [ + <NoContent text={props.noContentText} /> + ] + ) + : + ( + [ + <React.Fragment> + <StyledGrid container spacing={1} style={{ paddingLeft: "30px", paddingRight: "15px" }}> + { + props.sliceArr.map((card) => + <> + { + card.follower && card.followable && + <Grid item xs={12} sm={6} md={'auto'} lg={3} key={card.id}> + {RenderContactCard(card, props.follower)} + </Grid> + } + </> + ) + } + </StyledGrid> + { + props.loadingMore ? + <LoadingSpinner text={'Carregando Recursos...'} /> + : + <ButtonsAreaRede + sliceLength={props.sliceArr.length} + length={props.length} + showMore={props.showMore} + total={props.end} + end={String(props.sliceArr.length) === props.end} + /> + } + </React.Fragment> + ] + ) + } + + </WhiteContainer> + ) +} diff --git a/src/Components/TabPanels/PublicUserPageTabs/LastCollections.js b/src/Components/TabPanels/PublicUserPageTabs/LastCollections.js new file mode 100644 index 0000000000000000000000000000000000000000..6e32577f77617b47bda1298c2a583ce7a50cf249 --- /dev/null +++ b/src/Components/TabPanels/PublicUserPageTabs/LastCollections.js @@ -0,0 +1,82 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import Grid from '@material-ui/core/Grid'; +import { HeaderGrid, StyledGrid } from '../StyledComponents.js' +import { NoContent } from './TabInicio.js' +import CollectionCardFunction from '../../CollectionCardFunction.js' +import NoCol from '../../../img/Pagina_vazia_colecao.png' + +export default function LastCols(props) { + return ( + <React.Fragment> + <HeaderGrid container> + <Grid item xs={12}> + <h3>Últimas alterações em coleções</h3> + </Grid> + </HeaderGrid> + + + { + props.count === 0 || props.collections.length === 0 ? + ( + [ + <Grid container> + <Grid item xs={12}> + <NoContent + image={NoCol} + text1={props.username + " ainda não disponibilizou nenhuma coleção."} + text2={"Quando disponibilizar, elas aparecerão aqui."} + /> + </Grid> + </Grid> + ] + ) + : + ( + [ + <StyledGrid container spacing={1} style={{ paddingLeft: "0.5em" }}> + { + props.collections.slice(0, 4).map((card) => + <Grid item container md={3} xs={12} key={card.id}> + <CollectionCardFunction + name={card.name} + tags={card.tags} + rating={card.review_average} + id={card.id} + author={card.owner.name} + description={card.description} + thumbnails={card.items_thumbnails} + avatar={card.owner.avatar} + likeCount={card.likes_count} + followed={card.followed} + liked={card.liked} + collections={card.collection_items} + authorID={card.owner.id} + /> + </Grid> + ) + } + </StyledGrid> + ] + ) + } + </React.Fragment> + ) +} diff --git a/src/Components/TabPanels/PublicUserPageTabs/LastLearnObj.js b/src/Components/TabPanels/PublicUserPageTabs/LastLearnObj.js new file mode 100644 index 0000000000000000000000000000000000000000..2a489ac6808bad38d577ef87125d56e60bcd4f7e --- /dev/null +++ b/src/Components/TabPanels/PublicUserPageTabs/LastLearnObj.js @@ -0,0 +1,82 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import Grid from '@material-ui/core/Grid'; +import ResourceCardFunction from '../../ResourceCardFunction.js' +import NoPub from '../../../img/Pagina_vazia_Sem_publicar.png' +import { HeaderGrid, StyledGrid } from '../StyledComponents.js' +import { NoContent } from './TabInicio.js' + +export default function LastLearnObjs(props) { + return ( + <React.Fragment> + <HeaderGrid container> + <Grid item xs={9}> + <h3>Últimos Recursos Publicados</h3> + </Grid> + </HeaderGrid> + + { + props.count === 0 ? + ( + [ + <Grid container> + <Grid item xs={12}> + <NoContent + image={NoPub} + text1={props.username + " ainda não disponibilizou nenhum recurso."} + text2={"Quando disponibilizar, eles aparecerão aqui."} + /> + </Grid> + </Grid> + ] + ) + : + ( + [ + <StyledGrid container spacing={1} style={{ paddingLeft: "30px", paddingRight: "15px" }}> + { + props.learningObjs.slice(0, 4).map((card) => + <Grid item xs={12} sm={6} md={'auto'} lg={3} key={card.id}> + <ResourceCardFunction + avatar={card.publisher.avatar} + id={card.id} + thumbnail={card.thumbnail} + type={card.object_type ? card.object_type : "Outros"} + title={card.name} + published={card.state === "published" ? true : false} + likeCount={card.likes_count} + liked={card.liked} + rating={card.review_average} + author={card.publisher.name} + tags={card.tags} + href={"/recurso/" + card.id} + downloadableLink={card.default_attachment_location} + + /> + </Grid> + ) + } + </StyledGrid> + ] + ) + } + </React.Fragment> + ) +} diff --git a/src/Components/TabPanels/PublicUserPageTabs/TabColecoes.js b/src/Components/TabPanels/PublicUserPageTabs/TabColecoes.js new file mode 100644 index 0000000000000000000000000000000000000000..4b46dc0700385baa2b787e847b8a671ed3f1f262 --- /dev/null +++ b/src/Components/TabPanels/PublicUserPageTabs/TabColecoes.js @@ -0,0 +1,120 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react' +import { fetchAllRequest, getRequest } from '../../HelperFunctions/getAxiosConfig' +import PanelTemplateColecao from '../PanelComponents/TemplateColecao.js' +import LoadingSpinner from '../../LoadingSpinner.js' + +export default function TabColecoes(props) { + const [loading, handleLoading] = useState(true) + + const [errorInUserColl, setErrorInUserColl] = useState(false) + + const [userCollections, setUserCollections] = useState([]) + + const [currLimitUserColl, setCurrLimitUserColl] = useState(4) + + const [loadingMoreUserColl, setLoadingMoreUserColl] = useState(false); + + const [endOfUserColl, setEndOfUserColl] = useState(false); + + function handleSuccess(responseArr, headersArr) { + setErrorInUserColl(responseArr[0].errors ? true : false) + + handleLoading(false) + setUserCollections(responseArr[0]) + + if (headersArr[0].has('X-Total-Count')) { + setEndOfUserColl(headersArr[0].get('X-Total-Count')); + } + } + + function handleError(error) { + handleLoading(false) + setErrorInUserColl(true) + } + + const getInfo = () => { + const urls = [ + `/users/${props.id}/collections?offset=0&limit=4`, + ] + fetchAllRequest(urls, handleSuccess, handleError) + } + + useEffect(() => { + handleLoading(true) + getInfo() + }, []) + + const showMoreUserCollections = (limite) => { + const limit = limite; + setLoadingMoreUserColl(true); + setCurrLimitUserColl(currLimitUserColl + limit) + const url = `/users/${props.id}/collections?offset=${currLimitUserColl}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreUserColl(false); + setEndOfUserColl(true) + setErrorInUserColl(true) + } + else if (data.length >= 1) { + let currData = [...userCollections]; + currData = [...currData.concat(data)]; + setLoadingMoreUserColl(false); + setUserCollections(currData); + } + else { + setLoadingMoreUserColl(false); + setEndOfUserColl(true) + } + }, + (error) => { + setLoadingMoreUserColl(false); + setEndOfUserColl(true) + setErrorInUserColl(true) + } + ) + } + + return ( + <> + { + loading ? + ( + <LoadingSpinner text={'CARREGANDO COLEÇÕES'} /> + ) + : + ( + <PanelTemplateColecao + title={"Coleções Públicas"} + length={userCollections.length} + noContentText={props.username + " não possui nenhuma coleção."} + sliceArr={userCollections} + showMore={showMoreUserCollections} + loadingMore={loadingMoreUserColl} + end={endOfUserColl} + followed={false} + error={errorInUserColl} + /> + ) + } + </> + ) +} diff --git a/src/Components/TabPanels/PublicUserPageTabs/TabInicio.js b/src/Components/TabPanels/PublicUserPageTabs/TabInicio.js new file mode 100644 index 0000000000000000000000000000000000000000..0663a44c4412e545429c7b560bf9eb2ca9e88126 --- /dev/null +++ b/src/Components/TabPanels/PublicUserPageTabs/TabInicio.js @@ -0,0 +1,119 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import styled from 'styled-components' +import UserDescription from './UserDescription.js' +import NoContentImage from '../../../img/img-16.png' +import Grid from '@material-ui/core/Grid'; +import LastLearnObjs from './LastLearnObj.js' +import LastCols from './LastCollections.js' +import {ContainerStyled} from '../StyledComponents.js' + +const NoContentContainer = styled.div` + height : 250px; + display : flex; + justify-content : center; + align-content : center; + text-align : center; + + h3 { + font-size : 24px; + font-weight : lighter; + margin-top : 20px; + margin-bottom : 10px; + } + + p { + font-size : 15px; + font-weight : lighter; + margin : 0 0 10px; + } +` +/*Displays given image and text saying user hasn't posted anything yet*/ +export function NoContent (props) { + return ( + <NoContentContainer> + <div style={{paddingTop : "1em"}}> + <img alt="" src={props.image} style={{width : "130px", verticalAlign : "middle", border : "0"}}/> + <h3> + {props.text1} + </h3> + <p> + {props.text2} + </p> + </div> + </NoContentContainer> + + ) +} + +export default function TabInicio (props) { + + return ( + <React.Fragment> + {/*display user description*/} + {props.user.description && + <UserDescription text={props.user.description}/> + } + { + props.user.learning_objects_count === 0 && props.user.collections_count === 0 ? + ( + [ + <ContainerStyled> + <Grid container> + <Grid item xs={12}> + <NoContent + image={NoContentImage} + text1={props.user.name + " ainda não disponibilizou nenhum recurso ou coleção."} + text2={"Quando disponibilizar, eles aparecerão aqui."} + /> + </Grid> + </Grid> + </ContainerStyled> + ] + ) + : + ( + [ + <React.Fragment> + <ContainerStyled style={{flexDirection : "column"}}> + <LastLearnObjs + count={props.user.learning_objects_count} + username={props.user.name} + learningObjs={props.learningObjs} + /> + </ContainerStyled> + + <ContainerStyled style={{flexDirection : "column", paddingTop : "1em"}}> + <LastCols + count={props.user.collections_count} + username={props.user.name} + collections={props.collections} + /> + </ContainerStyled> + </React.Fragment> + ] + ) + } + {/*display last published learning objects and last alterations in user collections*/} + + </React.Fragment> + + ) +} diff --git a/src/Components/TabPanels/PublicUserPageTabs/TabRecursos.js b/src/Components/TabPanels/PublicUserPageTabs/TabRecursos.js new file mode 100644 index 0000000000000000000000000000000000000000..bbce193bcde870391dda55ee9a67c79aacb768b4 --- /dev/null +++ b/src/Components/TabPanels/PublicUserPageTabs/TabRecursos.js @@ -0,0 +1,110 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react' +import { HeaderGrid, ContainerStyled, Carregados } from '../StyledComponents.js' +import Grid from '@material-ui/core/Grid'; +import ResourceCardFunction from '../../ResourceCardFunction.js' +import { ButtonMostrarMaisRecurso } from '../PanelComponents/ButtonsArea' +import { getRequest } from '../../HelperFunctions/getAxiosConfig' +import { StyledGrid } from '../StyledComponents' + +export default function TabRecursos(props) { + const [arr, setArr] = useState([]) + const [objsSlice, setSlice] = useState([]) + const handleSlice = (newArr) => { setSlice(newArr) } + + useEffect(() => { + setArr(props.learningObjs) + setSlice(props.learningObjs.slice(0, 4)) + }, []) + + function handleSuccess(data) { + setArr(data) + setSlice(data) + } + const showMore = (quantity) => { + var sliceLength = objsSlice.length + var newLength = sliceLength + quantity + + if (newLength > 12) { + const url = `/users/${props.id}/learning_objects?limit=${newLength}$offset=4` + getRequest(url, handleSuccess, (error) => { console.log(error) }) + } + else { + handleSlice(arr.slice(0, sliceLength + quantity)) + } + + } + + return ( + <ContainerStyled style={{ flexDirection: "column" }}> + + <HeaderGrid container> + <Grid item xs={12}> + <h3>Recursos Publicados <b style={{ fontWeight: "500" }}>({props.count})</b></h3> + </Grid> + </HeaderGrid> + + <StyledGrid container spacing={1} style={{ paddingLeft: "30px", paddingRight: "15px" }}> + { + objsSlice.map((card) => + <Grid item xs={12} sm={6} md={'auto'} lg={3} key={card.id}> + <ResourceCardFunction + avatar={card.publisher.avatar} + id={card.id} + thumbnail={card.thumbnail} + type={card.object_type ? card.object_type : "Outros"} + title={card.name} + published={card.state === "published" ? true : false} + likeCount={card.likes_count} + liked={card.liked} + rating={card.review_average} + author={card.publisher.name} + tags={card.tags} + href={"/recurso/" + card.id} + downloadableLink={card.default_attachment_location} + /> + </Grid> + ) + } + </StyledGrid> + + <Carregados> + <p style={{ margin: "0 0 10px", fontSize: "14px" }}> + Carregados {objsSlice.length} de {arr.length} + </p> + + { + props.count > 5 && + <React.Fragment> + <ButtonMostrarMaisRecurso onClick={() => { showMore(4) }}> + <span style={{ color: "#fff", fontSize: "14px", fontWeight: "500" }}>MOSTRAR MAIS 4</span> + </ButtonMostrarMaisRecurso> + + <ButtonMostrarMaisRecurso onClick={() => { showMore(20) }}> + <span style={{ color: "#fff", fontSize: "14px", fontWeight: "500" }}>MOSTRAR MAIS 20</span> + </ButtonMostrarMaisRecurso> + </React.Fragment> + } + + </Carregados> + + </ContainerStyled> + ) +} diff --git a/src/Components/TabPanels/PublicUserPageTabs/TabRede.js b/src/Components/TabPanels/PublicUserPageTabs/TabRede.js new file mode 100644 index 0000000000000000000000000000000000000000..6b8a8a8ee73eb0ede45b2b3ed40785697169cbac --- /dev/null +++ b/src/Components/TabPanels/PublicUserPageTabs/TabRede.js @@ -0,0 +1,175 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, useEffect} from 'react' +import PanelTemplateRede from '../PanelComponents/TemplateRede.js' +import { fetchAllRequest, getRequest } from '../../HelperFunctions/getAxiosConfig' +import LoadingSpinner from '../../LoadingSpinner.js' + +export default function TabRede (props) { + const [loading, handleLoading] = useState(true) + + const [errorInFollowing, setErrorInFollowing] = useState(false) + const [errorInFollowers, setErrorInFollowers] = useState(false) + + const [followingList, setFollowing] = useState([]) + const [currFollowingLimit, setCurrFollowingLimit] = useState(12) + const [loadingMoreFollowing, setLoadingFollowing] = useState(false) + const [endOfFollowing, setEndOfFollowing] = useState(false) + + const [followersList, setFollowers] = useState([]) + const [currFollowerLimit, setFollowersLimit] = useState(12) + const [loadingMoreFollowers, setLoadingMoreFollowers] = useState(false) + const [endOfFollowers, setEndOfFollowers] = useState(false) + + const showMoreFollowing = (limite) => { + setLoadingFollowing(true); + const limit = limite; + setCurrFollowingLimit(currFollowingLimit + limit) + const url = `/users/${props.id}/following/User?offset=${currFollowingLimit}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingFollowing(false); + setEndOfFollowing(true); + setErrorInFollowing(true); + } + else if (data.length >= 1) { + let currData = [...followingList]; + currData = [...currData.concat(data)]; + setLoadingFollowing(false); + setFollowing(currData); + } + else { + setLoadingFollowing(false); + setEndOfFollowing(true); + } + }, + (error) => { + setLoadingFollowing(false); + setEndOfFollowing(true); + setErrorInFollowing(true); + } + ) + } + + const showMoreFollowers = (limite) => { + setLoadingMoreFollowers(true); + const limit = limite; + setFollowersLimit(currFollowerLimit + limit) + const url = `/users/${props.id}/followers?offset=${currFollowerLimit}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreFollowers(false); + setEndOfFollowers(true); + setErrorInFollowers(true); + } + else { + if (data.length >= 1) { + let currData = [...followersList]; + currData = [...currData.concat(data)]; + setLoadingMoreFollowers(false); + setFollowers(currData); + } + else { + setLoadingMoreFollowers(false); + setEndOfFollowers(true) + } + } + }, + (error) => { + setLoadingMoreFollowers(false); + setEndOfFollowers(true); + setErrorInFollowers(true); + } + ) + } + + async function handleSuccess (responseArr, headersArr) { + setErrorInFollowing(responseArr[0].errors ? true : false) // prevent of crashing the portal, do not remove it + setErrorInFollowers(responseArr[1].errors ? true : false) // prevent of crashing the portal, do not remove it + setFollowers(responseArr[0]) + setFollowing(responseArr[1]) + + if (headersArr[1].has('X-Total-Count')) { + setEndOfFollowing(headersArr[1].get('X-Total-Count')); + } + if (headersArr[0].has('X-Total-Count')) { + setEndOfFollowers(headersArr[0].get('X-Total-Count')); + } + handleLoading(false) + } + + function handleErrors() { + setLoadingMoreFollowers(false); + setEndOfFollowers(true); + setErrorInFollowers(true); + } + + useEffect( () => { + handleLoading(true) + + const urls = [`/users/${props.id}/followers`, `/users/${props.id}/following/User`] + + fetchAllRequest(urls, handleSuccess, handleErrors) + }, []) + + return ( + <> + { + loading ? + ( + [ + <LoadingSpinner text={'CARREGANDO...'} /> + ] + ) + : + ( + [ + <React.Fragment> + <PanelTemplateRede + title={"Seguidores"} + length={followersList.length} + sliceArr={followersList} + showMore={showMoreFollowers} + follower={true} + end={endOfFollowers} + loadingMore={loadingMoreFollowers} + error={errorInFollowers} + noContentText={props.username + ' não possui nenhum seguidor'} + /> + + <PanelTemplateRede + title={"Seguindo"} + length={followingList.length} + sliceArr={followingList} + showMore={showMoreFollowing} + follower={false} + end={endOfFollowing} + loadingMore={loadingMoreFollowing} + error={errorInFollowing} + noContentText={props.username + ' não segue nenhum usuário'} + /> + </React.Fragment> + ] + ) + } + </> + ) +} diff --git a/src/Components/TabPanels/PublicUserPageTabs/UserDescription.js b/src/Components/TabPanels/PublicUserPageTabs/UserDescription.js new file mode 100644 index 0000000000000000000000000000000000000000..4fcc273f0a0b3e8ed984f1d831488d8002a978dd --- /dev/null +++ b/src/Components/TabPanels/PublicUserPageTabs/UserDescription.js @@ -0,0 +1,86 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import styled from 'styled-components' + +export default function UserDescription (props) { + return ( + <NoPadBox> + <ContainerDiv> + <DivSobre> + <h3>Sobre</h3> + <p>{props.text}</p> + </DivSobre> + </ContainerDiv> + </NoPadBox> + ) +} + +const DivSobre = styled.div` + position : relative; + min-height : 1px; + padding-left : 30px; + margin-bottom : 20px; + @media screen and (min-width: 992px) { + width : 66.66666667%; + float : left; + } + + h3 { + font-size : 24px; + margin-top : 20px; + margin-bottom : 10px; + font-family : inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; + } + + p { + margin : 0 0 10px; + } +` + +const ContainerDiv = styled.div` + @media screen and (min-width: 1200px) { + width : 1170px; + } + @media screen and (min-width: 992px) and (max-width : 1199px){ + width : 970px; + } + @media screen and (min-width: 768px) and (max-width : 991px) { + width : 750px; + } + +` + +const NoPadBox = styled.div` + display : flex; + flex-direction: column; + margin-right : auto; + margin-left : auto; + padding : 0; + background-color : #fff; + box-shadow : 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-bottom : 30px; + + @media screen and (min-width: 768px) { + width : max-content; + } +` diff --git a/src/Components/TabPanels/StyledComponents.js b/src/Components/TabPanels/StyledComponents.js new file mode 100644 index 0000000000000000000000000000000000000000..182fd013462a57191b7482f708e4379537c4255c --- /dev/null +++ b/src/Components/TabPanels/StyledComponents.js @@ -0,0 +1,252 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; +import Tabs from '@material-ui/core/Tabs'; +import { Container } from 'react-grid-system' + +// {/* COMPONENTS USED IN ALL TABS */} + +export const ContainerDivStyled = styled.div` + /*No portal atual: "container nopad box"*/ + margin-left : auto; + margin-right : auto; + margin-bottom: 30px; + background-color: #fff; + box-shadow : 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24) !important; + + height : auto; + display : flex; + @media screen and (min-width: 1200px) { + width : 1170px; + } + @media screen and (min-width: 992px) and (max-width : 1199px){ + width : 970px; + } + @media screen and (min-width: 768px) and (max-width : 991px) { + width : 750px; + } + + @media screen and (max-width: 768px) { + width : max-content; + } +` +export const DivContainerRecursosPublicados = styled.div` + /*No portal atual: "container-recursos-privados-dskt col-xs 12"*/ + position : relative; + min-height : 1px; + padding-right : 15px; + padding-left : 15px; +` + +export const WhiteContainer = styled.div` + padding-top : 1em; + display : flex; + flex-direction : column; + margin-left : auto; + margin-right : auto; + background-color : #fff; + box-shadow : 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-bottom : 30px; + + @media screen and (min-width: 1200px) { + width : 1170px; + } + @media screen and (min-width: 992px) and (max-width : 1199px){ + width : 970px; + } + @media screen and (min-width: 768px) and (max-width : 991px) { + width : 750px; + } + + @media screen and (max-width: 768px) { + width : auto; + } +` + +export const StyledGrid = styled(Grid)` + .MuiGrid-item { + @media screen and (max-width: 768px) { + display : flex; + justify-content : center; + } + } +` +export const Carregados = styled.div` + text-align : center; + position : relative; + margin-right : -15px; + margin-left : -15px; +` + +export const HeaderGrid = styled(Grid)` + border-bottom : 1px solid #d1d1d1; + padding-bottom : 15px; + margin-bottom : 10px; + + h3 { + font-size: 21px; + font-weight: lighter !important; + margin: 0; + @media screen and (max-width: 768px) { + padding-left : 5px; + } + } + + span { + color: #ff7f00 !important; + text-transform : uppercase; + font-weight : 700; + font-size : 15px; + @media screen and (max-width: 768px) { + padding-right : 5px; + } + } +` +export const ContainerStyled = styled.div` + padding : 0; + display : flex; + margin-left : auto; + margin-right : auto; + + @media screen and (min-width: 1200px) { + width : 1170px; + } + @media screen and (min-width: 992px) and (max-width : 1199px){ + width : 970px; + } + @media screen and (min-width: 768px) and (max-width : 991px) { + width : 750px; + } + + @media screen and (max-width: 768px) { + width : auto; + } + + .marginTop { + margin-top : 50px; + } +` + +/*User page and Public User page components: */ +export const HeaderContainer = styled.div` + background-color : #afeeee; + position : relative; +` + +export const UserProfileContainer = styled.div` + background-color : #fff; + box-shadow : 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-bottom : 30px; + margin-right : auto; + margin-left : auto; + display : flex; + flex-direction : column; + color : #666; + @media screen and (min-width: 1200px) { + width : 1170px; + } + @media screen and (min-width: 992px) and (max-width : 1199px){ + width : 970px; + } + @media screen and (min-width: 768px) and (max-width : 991px) { + width : 750px; + } +` + +export const CoverContainer = styled.div` + height : 230px; + position : relative; + @media screen and (max-width: 600px) { + height : 128px + } +` + +export const UserProfileInfoDiv = styled.div` + position : absolute; + bottom : 0; + left : 260px; + overflow : hidden; + margin-bottom : 20px; +` + +export const CheckTeacherDiv = styled.div` + padding-top : 10px; + padding-left : 250px; + margin-bottom : -10px; + display : absolute; + + p { + margin : 0 0 10px; + font-family: Roboto; + font-size: 15px; + line-height: 22px; + text-align: left; + + span { + padding-right : 5px; + + img { + display: inline; + height: 20px; + width: 22px; + } + } + } +` + +export const StyledTabs = styled(Tabs)` + .MuiTab-textColorPrimary.Mui-selected { + color : #00bcd4; + } + .PrivateTabIndicator-colorPrimary-4 { + background-color : #00bcd4 !important; + } +` + +export const RodapeDiv = styled.div` + display : flex; + flex-direction : row; + justify-content : flex-end; + padding-right : 15px; + + .report-button { + @media screen and (max-width: 768px) { + display : none; + } + } + +` + +export const NavBarContentContainer = styled(Container)` + background-color : transparent; + padding-bottom : 0; + overflow-x : hidden !important; + overflow-y : hiddden !important; + margin-right : 0 !important; +` + +export const BackgroundDiv = styled.div` + color : #666; + font-family : 'Roboto', sans serif; + font-size : 14px; + padding-bottom : 50px; + line-height : 20px; + background : #f4f4f4; +` diff --git a/src/Components/TabPanels/TabPanelStatusEConquistas.js b/src/Components/TabPanels/TabPanelStatusEConquistas.js new file mode 100644 index 0000000000000000000000000000000000000000..d9e0c20762cb1387ee0ab460f27fe5aeffd2dc07 --- /dev/null +++ b/src/Components/TabPanels/TabPanelStatusEConquistas.js @@ -0,0 +1,112 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + + +import React, {useContext, useState, useEffect} from 'react' +import { Store } from '../../Store.js' +import styled from 'styled-components' +import Paper from '@material-ui/core/Paper'; +import {ContainerDivStyled} from './StyledComponents.js' +import axios from 'axios' +import {apiUrl} from '../../env'; +import LevelDescriptionCard from '../LevelDescriptionCard.js' +import AchievementDescriptionCard from '../AchievementDescriptionCard.js' +import { Grid } from '@material-ui/core' + +export default function TabPanelStatusEConquistas (props) { + // eslint-disable-next-line + const [achievements, setAchievements] = useState([]); + // eslint-disable-next-line + const [level, setLevel] = useState(0); + // eslint-disable-next-line + const [xp, setXP] = useState(0); + // eslint-disable-next-line + const [coins, setCoins] = useState(0); + // eslint-disable-next-line + const [barSize, setBarSize] = useState(0); + // eslint-disable-next-line + const [xpToNextLevel, setXpToNextLevel] = useState(0); + const { state } = useContext(Store) + + useEffect(() => { + axios.all( + ['xp_to_next_lvl', 'percent_to_next_level', 'points', 'xp', 'get_level', + 'completed_achievements'].map((r) => { + return axios.get(apiUrl + '/' + r + '?id=' + state.currentUser.id); + })).then(axios.spread((xp_to_next_lvl, percent_to_next_level, points, + xp, level, completed_achievements) => { + this.setXpToNextLevel(xp_to_next_lvl); + this.setBarSize(100-percent_to_next_level); + this.setCoins(points); + this.setXP(xp); + this.setLevel(level); + this.setAchievements(completed_achievements); + })); + }, []) + + return ( + <div> + <ContainerDivStyled> + <Paper elevation={3}> + <LevelDescriptionCard + xp_to_next_lvl={xpToNextLevel} + bar_size={barSize} + coins={coins} + xp={xp} + level={level} + /> + </Paper> + </ContainerDivStyled> + <AchievementsContainer> + <AchievementsSectionTitle> + Conquistas + </AchievementsSectionTitle> + <AchievementsList> + <Grid container direction="row" justify="space-around" alignItems="center"> + {achievements.map( + (a) => { return ( + <Grid item xs={12} md={5}> + <AchievementDescriptionCard + name={a.title} + description={a.description} + src={a.imgsrc} + requirements={a.requirements} + /> + + </Grid> + )} + )} + </Grid> + </AchievementsList> + </AchievementsContainer> + </div> + ); +} + +const AchievementsSectionTitle = styled.h1` + font-weight: 400; +` +const AchievementsContainer = styled.div` + max-width : 1140px; + margin-left : auto; + margin-right : auto; + margin-bottom: 30px; + margin-top: 70px; +` +const AchievementsList = styled.div` +` diff --git a/src/Components/TabPanels/UserPageTabs/ContainerRedeVazia.js b/src/Components/TabPanels/UserPageTabs/ContainerRedeVazia.js new file mode 100644 index 0000000000000000000000000000000000000000..6d15099126be1f6637d77c754b1b21ddcb97284b --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/ContainerRedeVazia.js @@ -0,0 +1,87 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import styled from 'styled-components' +import NoRede1 from '../../../img/no-rede-1.png' +import NoRede2 from '../../../img/no-rede-2.png' +import NoRede3 from '../../../img/no-rede-3.png' +import TabRedeImgDiv from './TabRedeImgDiv.js' +import {WhiteContainer} from '../StyledComponents.js' +import Grid from '@material-ui/core/Grid'; + +export default function ContainerRedeVazia (props) { + return ( + <React.Fragment> + <WhiteContainer> + <RedeVaziaBoxContainer> + <StyledSpan>Você ainda não tem uma rede. + <br/> + Veja como começar: + </StyledSpan> + <StyledSpan> + <StyledHr/> + <Grid container style={{paddingLeft : "30px", paddingRight : "15px"}}> + <Grid item md={4} xs={12}> + <TabRedeImgDiv img={NoRede1} text={"Para encontrar um usuário especÃfico, você pode utilizar a barra de busca e selecionar a busca por \"pessoas\""}/> + </Grid> + + <Grid item md={4} xs={12}> + <TabRedeImgDiv img={NoRede2} text={"Você pode começar a seguir uma pessoa clicando no botão \"seguir\" no card (A) ou na página dela (B)"}/> + </Grid> + + <Grid item md={4} xs={12}> + <TabRedeImgDiv img={NoRede3} text={"Pronto! Agora você poderá acompanhar os novos recursos e coleções dessa pessoas na sua página, na aba \"Perfil e Atividades\""}/> + </Grid> + </Grid> + </StyledSpan> + </RedeVaziaBoxContainer> + </WhiteContainer> + </React.Fragment> + ) +} + +const StyledHr = styled.hr` + margin-top : 20px; + margin-bottom : 20px; + border : 0; + border-top: 1px solid #eee; +` + +const RedeVaziaBoxContainer = styled.div` + background-color : #fff; + padding: 30px; + padding-right: 30px; + padding-left: 30px; + margin-bottom: 30px; + text-align: center; + height: 100%; + padding-left: 0 !important; + padding-right: 0 !important; + margin-top: 20px; +} +` +const StyledSpan = styled.span` + font-weight : lighter; + margin-top: 0; + font-family: Roboto; + font-size: 24px; + p { + font-weight : normal; + } +` diff --git a/src/Components/TabPanels/UserPageTabs/ModalExcluirConta.js b/src/Components/TabPanels/UserPageTabs/ModalExcluirConta.js new file mode 100644 index 0000000000000000000000000000000000000000..1d4410498bd71d489e4d8ccd9a3284bb8f890662 --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/ModalExcluirConta.js @@ -0,0 +1,213 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useContext, useState} from 'react'; +import {Store} from '../../../Store.js' +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import CloseIcon from '@material-ui/icons/Close'; +import ExcluirAvatar from '../../../img/Excluir.png' +import GreyButton from '../../GreyButton' +import FormInput from '../../FormInput' +import {Link} from 'react-router-dom' +import SnackbarComponent from '../../SnackbarComponent.js' +import {deleteRequest} from '../../HelperFunctions/getAxiosConfig' + +function CloseModalButton (props) { + return ( + <StyledCloseModalButton onClick={props.handleClose}> + <CloseIcon/> + </StyledCloseModalButton> + ) +} + +export default function ModalExcluirConta (props) { + const {state, dispatch} = useContext(Store) + + const [formEmail, setEmail] = useState( + { + key : false, + value : "", + } + ) + const handleChange = (e) => { + const userInput = e.target.value + let flag = !(userInput === state.currentUser.email) + + setEmail({...formEmail, + key : flag, + value : userInput + }) + } + + const [snackbarOpen, toggleSnackbar] = useState(false) + + const deletedAccountText = `A conta ${state.currentUser.email} foi deletada com sucesso` + + function handleSuccess (data) { + toggleSnackbar(true) + dispatch({ + type: "USER_DELETED_ACCOUNT", + }); + props.handleClose() + } + const deleteAccount = () => { + const url = `/auth` + deleteRequest(url, handleSuccess, (error) => {console.log(error)}) + } + + return ( + <React.Fragment> + <SnackbarComponent snackbarOpen={snackbarOpen} severity={"info"} handleClose={() => {toggleSnackbar(false)}} text={deletedAccountText}/> + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + centered="true" + onClose={props.handleClose} + closeAfterTransition + BackdropComponent={Backdrop} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <Container> + <Header> + <span style={{width:"32px"}}/> + <h2>Excluir a Conta Definitivamente</h2> + <CloseModalButton handleClose={props.handleClose}/> + </Header> + <Content> + <div style={{display : "flex", flexDirection : "column", color : "#666", textAlign : "left"}}> + <div style={{display : "flex", flexDirection : "row", margin : "0 30px", justifyContent : "center", alignContent : "center"}}> + <div style={{height : "90px", position : "relative"}}> + <img src={ExcluirAvatar} alt="excluir-avatar" style={{height : "inherit", objectFit : "contain", verticalAlign : "middle"}}/> + </div> + <p style={{paddingLeft : "10px"}}>Você é muito importante para a rede, ficarÃamos felizes se você ficasse. Quer contar o que aconteceu? Talvez possamos ajudar. <StyledLink to="/contato">Entre em contato.</StyledLink></p> + </div> + <p style={{marginTop : "20px"}}> + Saiba que a exclusão da conta removerá o seu perfil permanentemente. Se você publicou algum recurso, ele ainda ficará disponÃvel para os usuários da plataforma. + </p> + <p style={{marginTop : "20px"}}> + É necessário que você digite seu e-mail para confirmar a exclusão: + </p> + <FormInput + inputType={"text"} + name={"email"} + value={formEmail.value} + placeholder={"Digite seu e-mail de cadastro"} + handleChange={e => handleChange(e)} + required={true} + error = {formEmail.key} + help = {formEmail.key ? ( formEmail.value.length === 0 ? "Faltou preencher seu e-mail." : "O e-mail deve ser o mesmo no qual você cadastrou esta conta") : ""} + /> + <div style={{display : "flex", flexDirection : "row", justifyContent : "space-evenly", paddingTop : "15px"}}> + <GreyButton callback={props.handleClose} text={"Cancelar"}/> + <RedButton disabled={formEmail.key} onClick = {() => {deleteAccount()}}>EXCLUIR PERMANENTEMENTE</RedButton> + </div> + </div> + </Content> + </Container> + </Fade> + </StyledModal> + </React.Fragment> + ) +} + +const RedButton = styled(Button)` + background-color : rgb(230,60,60) !important; + color : #fff !important; + font-weight : bolder; + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; +` + +const Content = styled.div` + padding : 20px 30px; + +` + +const Header = styled.div` + display : flex; + flex-direction : row; + padding : 10px 26px 0 26px; + align-items : center; + justify-content : space-between; + height : 64px; + + h2 { + font-size : 26px; + font-weight : lighter; + color : #666 + } +` + +const StyledCloseModalButton = styled(Button)` + display : inline-block; + position : relative; + float : right !important; + margin-right : -8px !important; + background : transparent !important; + min-width: 0 !important; + width : 40px; +` + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + text-align : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const Container = styled.div` + box-sizing : border-box; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); + background-color : white; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + padding : 10px; + border-radius : 4px; + + @media screen and (min-width : 700px) { + max-width : 600px; + max-height : 600px; + } + + @media screen and (max-width : 699px) { + overflow-y : scroll; + width : 100%; + height : 100%; + } +` +const StyledLink = styled(Link)` + text-decoration : none !important; + color : #00bcd4 !important; +` diff --git a/src/Components/TabPanels/UserPageTabs/PanelAtividades.js b/src/Components/TabPanels/UserPageTabs/PanelAtividades.js new file mode 100644 index 0000000000000000000000000000000000000000..5502843e9a2785185a4b7c6fa9a4a5ce9c7b8161 --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/PanelAtividades.js @@ -0,0 +1,347 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react' +import styled from 'styled-components' +import Paper from '@material-ui/core/Paper'; +import Button from '@material-ui/core/Button'; +import { apiDomain } from '../../../env'; +import Bolo from '../../../img/Bolo.png' +import LoadingSpinner from '../../LoadingSpinner.js' +import ActivityListItem from '../../ActivityListItem.js' +import List from '@material-ui/core/List'; +import { getRequest } from '../../HelperFunctions/getAxiosConfig.js' +import Grid from '@material-ui/core/Grid'; +import DefaultProfile from '../../../img/default_profile.png'; +import SnackBar from '../../SnackbarComponent' + + +export default function TabPanelAtividades(props) { + + const [loading, handleLoading] = useState(true) + const [loadingMore, handleLoadingMore] = useState(false); + const [notifications, setNotifications] = useState([]); + const [notificatonsLength, setLength] = useState(0); + const [totalResults, setTotalResults] = useState(0); + const [limit, setLimit] = useState(30); + const [error, setError] = useState(false) + const [snackInfo, setSnackInfo] = useState({ + open: false, + text: '', + severity: '', + color: '', + }) + + function handleCloseSnackBar() { + const info = { + open: false, + text: '', + severity: '', + color: '', + } + handleSnackInfo(info) + } + + function handleSnackInfo(info) { + setSnackInfo({ + ...info + }) + } + + const showMore = (offset) => { + handleLoadingMore(true); + const url = `/feed?offset=${limit}&limit=${offset}` + setLimit(limit + offset) + getRequest(url, handleSuccess, handleError) + } + + function handleError(error) { + const info = { + open: true, + text: 'Ocorreu um erro ao tentar carregar suas notificações!', + severity: 'error', + color: 'red', + } + handleSnackInfo(info) + handleLoadingMore(false) + handleLoading(false) + setError(true) + } + + function handleSuccess(data, header) { + if (header.has('X-Total-Count')) { + setTotalResults(header.get('X-Total-Count')); + } + if (data.errors) { + const info = { + open: true, + text: 'Ocorreu um erro ao tentar carregar suas notificações!', + severity: 'error', + color: 'red', + } + handleSnackInfo(info) + handleLoadingMore(false) + handleLoading(false) + setError(true) + } + else { + if (data.length >= 1) { + handleLoadingMore(false) + let currData = [...notifications] + currData = currData.concat(data) + setNotifications(currData) + setLength(currData.length) + handleLoading(false) + } + else { + const info = { + open: true, + text: 'Não há mais notificações para serem carregadas...', + severity: 'warning', + color: 'yellow' + } + handleSnackInfo(info) + handleLoadingMore(false) + handleLoading(false) + } + } + } + useEffect(() => { + const url = `/feed?offset=0&limit=30` + + getRequest(url, handleSuccess, handleError) + }, []) + + return ( + <MainContainerDesktop> + <SnackBar + snackbarOpen={snackInfo.open} + handleClose={handleCloseSnackBar} + severity={snackInfo.severity} + color={snackInfo.color} + text={snackInfo.text} + /> + <Paper elevation={3}> + <div> + <DivTitulo> + <InnerDivTitulo> + <TituloContent> + <p style={{ margin: "0 0 10px", marginBottom: "40px" }}>Todas Notificações</p> + </TituloContent> + </InnerDivTitulo> + </DivTitulo> + { + loading ? + ( + <LoadingSpinner text={'Carregando Atividades'} /> + ) + : + ( + [ + <div> + { + error ? + <p + style={{ fontSize: "15px", fontWeight: "lighter", margin: "0 0 10px", display: "flex", justifyContent: "center", textAlign: "center" }} + > + Erro ao tentar obter as notificações + </p> + : + notificatonsLength === 0 ? + ( + + <NoNotificationsDiv> + <div> + <div> + <H3Styled><img src={Bolo} alt='bolo' style={{ width: "23px" }} /> Você se cadastrou na Plataforma</H3Styled> + </div> + <p + style={{ fontSize: "15px", fontWeight: "lighter", margin: "0 0 10px", display: "flex", justifyContent: "center", textAlign: "center" }} + >Construa conosco a plataforma e amplie sua rede de conhecimento interagindo + <br /> + com pessoas envolvidas com experiências que ocorrem em todo o Brasil! + </p> + </div> + </NoNotificationsDiv> + + ) + : + ( + <> + <List height={400} width={300}> + { + notifications.map((notification, id) => + <ActivityListItem + key={id} + onMenuBar={false} + avatar={notification.owner.avatar ? apiDomain + notification.owner.avatar : DefaultProfile} + activity={notification.activity} + actionType={notification.trackable_type} + objectType={notification.recipient_type} + createdAt={notification.created_at} + ownerName={notification.owner.name} + ownerHref={'/usuario-publico/' + notification.owner.id} + recipientName={notification.recipient.name} + recipientHref={"/recurso/" + notification.recipient.id} + /> + ) + } + </List> + { + loadingMore ? + <LoadingSpinner text="Carregando mais atividades..." /> + : + <Grid container direction="row" alignItems="center" justify="flex-start"> + <Grid item xs={12} md={4}> + <LoadMoreButton onClick={() => { showMore(4) }}>CARREGAR MAIS 4</LoadMoreButton> + </Grid> + <Grid item xs={12} md={4}> + <LoadMoreButton onClick={() => { showMore(20) }}>CARREGAR MAIS 20</LoadMoreButton> + </Grid> + <Grid xs={12} md={4} item style={{ fontSize: "14px", color: "#666" }}> + <ShowData disabled={true}> + Mostrando {notificatonsLength} {notificatonsLength === 1 ? "Atividade " : "Atividades "} + de {totalResults} + </ShowData> + </Grid> + </Grid> + } + </> + ) + } + </div> + + ] + ) + } + </div> + </Paper> + </MainContainerDesktop> + ) +} + +const MainContainerDesktop = styled.div` + padding : 10px 0 8px 0; + margin-left : auto; + margin-right : auto; + + @media screen and (min-width: 1200px) { + width : 1170px; + } + @media screen and (min-width: 992px) and (max-width : 1199px){ + width : 970px; + } + @media screen and (min-width: 768px) and (max-width : 991px) { + width : 750px; + } +` + +const H3Styled = styled.h3` + font-size: 24px; + font-weight : lighter; + color : #00bcd4; + margin-top : 20px; + margin-bottom : 10px; + display : flex; + justify-content : center; + align-items : center; +` + +const NoNotificationsDiv = styled.div` + height : 250px; + display: flex; + align-items : center; + justify-content : center; +` + +const LoadMoreButton = styled(Button)` + outline : none !important; + display : block !important; + cusor : pointer !important; + min-height : 36px !important; + min-widht : 88px !important; + line-height: 36px !important; + vertical-align: middle !important; + border : 0 !important; + padding : 0 px !important; + margin : auto !important; + text-decoration : none !important; + font-weight : 500 !important; + overflow : hidden !important; + text-transform : uppercase !important; + font-size : 14px !important; + background : transparent !important; + color : #666 !important + &:hover { + background : rgba(158,158,158,0.2) !important + } +` + +const ShowData = styled(Button)` + outline : none !important; + display : block !important; + cusor : pointer !important; + min-height : 36px !important; + min-widht : 88px !important; + line-height: 36px !important; + vertical-align: middle !important; + border : 0 !important; + padding : 0 px !important; + margin : auto !important; + text-decoration : none !important; + font-weight : 500 !important; + overflow : hidden !important; + text-transform : none !important; + font-size : 14px !important; + background : transparent !important; + color : #666 !important + &:hover { + background : rgba(158,158,158,0.2) !important + } +` + +const TituloContent = styled.div` + display : block; + z-index : 1; + position : relative; + font-family: Roboto, sans-serif; + font-weight : ligther; +` + +const InnerDivTitulo = styled.div` + margin-top : 24px; + padding-top : 16px; + padding-left : 16px; + padding-right : 16px; + font-size: 30px; + font-weight: lighter; + color: #6e6e6e; + text-align: center; +` + + +const DivTitulo = styled.div` + display : flex; + justify-content : center; + font-size: 14px; + font-weight: 500; + letter-spacing: .01em; + line-height: 1.2em; + margin : 0; + border-bottom: 1px solid #eee; +` diff --git a/src/Components/TabPanels/UserPageTabs/PanelColecoes.js b/src/Components/TabPanels/UserPageTabs/PanelColecoes.js new file mode 100644 index 0000000000000000000000000000000000000000..eef4d1eaa7df0728081c75d13d87e15db0f199b7 --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/PanelColecoes.js @@ -0,0 +1,314 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react' +import Card from '@material-ui/core/Card'; +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; +import LoadingSpinner from '../../LoadingSpinner.js' +import PanelTemplateColecao from '../PanelComponents/TemplateColecao.js' +import PaginaVaziaColecao from '../../../img/Pagina_vazia_colecao.png' +import NoContent from '../PanelComponents/NoContent.js' +import { WhiteContainer, StyledGrid } from '../StyledComponents.js' +import CreateNewFolderIcon from '@material-ui/icons/CreateNewFolder'; +import Title from '../PanelComponents/PanelTitle.js' +import CollectionCardFunction from '../../CollectionCardFunction.js' +import { ButtonsAreaColecao } from '../PanelComponents/ButtonsArea' +import CriarColecaoModal from '../../CriarColecaoModal.js' +import { fetchAllRequest, getRequest } from '../../HelperFunctions/getAxiosConfig' + +export default function TabPanelColecoes(props) { + const [loading, handleLoading] = useState(true) + + const [errorInUserColl, setErrorInUserColl] = useState(false) + const [errorInFollowedColl, setErrorInFollowedColl] = useState(false) + + const [userCollections, setUserCollections] = useState([]) + const [followedCollections, setFollowedCollections] = useState([]) + + const [currLimitUserColl, setCurrLimitUserColl] = useState(4) + const [currLimitFollowedColl, setCurrLimitFollowedColl] = useState(4) + + const [loadingMoreUserColl, setLoadingMoreUserColl] = useState(false); + const [loadingMoreFollowedColl, setLoadingMoreFollowedColl] = useState(false); + + const [endOfUserColl, setEndOfUserColl] = useState(false); + const [endOfFollowedColl, setEndOfFollowedColl] = useState(false); + + const removeColl = (itemId) => { + let newSlice = userCollections.filter(item => item.id !== itemId); + setUserCollections(newSlice); + setEndOfUserColl(String(endOfUserColl - 1)) + }; + + function handleSuccess(responseArr, headersArr) { + setErrorInUserColl(responseArr[0].errors ? true : false) + setErrorInFollowedColl(responseArr[1].errors ? true : false) + + handleLoading(false) + setUserCollections(responseArr[0]) + setFollowedCollections(responseArr[1]) + + if (headersArr[0].has('X-Total-Count')) { + setEndOfUserColl(headersArr[0].get('X-Total-Count')); + } + if (headersArr[1].has('X-Total-Count')) { + setEndOfFollowedColl(headersArr[1].get('X-Total-Count')); + } + } + + function handleError(error) { + handleLoading(false) + setErrorInFollowedColl(true) + setErrorInUserColl(true) + } + + const getInfo = () => { + const urls = [ + `/users/${props.id}/collections?offset=0&limit=4`, + `/users/${props.id}/following/Collection?offset=0&limit=4` + ] + fetchAllRequest(urls, handleSuccess, handleError) + } + + useEffect(() => { + handleLoading(true) + getInfo() + }, []) + + const showMoreUserCollections = (limite) => { + const limit = limite; + setLoadingMoreUserColl(true); + setCurrLimitUserColl(currLimitUserColl + limit) + const url = `/users/${props.id}/collections?offset=${currLimitUserColl}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreUserColl(false); + setEndOfUserColl(true) + setErrorInUserColl(true) + } + else if (data.length >= 1) { + let currData = [...userCollections]; + currData = [...currData.concat(data)]; + setLoadingMoreUserColl(false); + setUserCollections(currData); + } + else { + setLoadingMoreUserColl(false); + setEndOfUserColl(true) + } + }, + (error) => { + setLoadingMoreUserColl(false); + setEndOfUserColl(true) + setErrorInUserColl(true) + } + ) + } + + const showMoreFollowedCollections = (limite) => { + const limit = limite; + setLoadingMoreFollowedColl(true); + setCurrLimitFollowedColl(currLimitFollowedColl + limit) + const url = `/users/${props.id}/following/Collection?offset=${currLimitFollowedColl}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreFollowedColl(false); + setEndOfFollowedColl(true) + setErrorInFollowedColl(true) + } + else if (data.length >= 1) { + let currData = [...followedCollections]; + currData = [...currData.concat(data)]; + setLoadingMoreFollowedColl(false); + setFollowedCollections(currData); + } + else { + setLoadingMoreFollowedColl(false); + setEndOfFollowedColl(true) + } + }, + (error) => { + setLoadingMoreFollowedColl(false); + setEndOfFollowedColl(true) + setErrorInFollowedColl(true) + } + ) + } + + return ( + <> + { + loading ? + ( + <LoadingSpinner text={'CARREGANDO COLEÇÕES'} /> + ) + : + ( + [ + <React.Fragment> + <Tentativa + title={"Minhas Coleções"} + length={userCollections.length} + noContentText={ + <div> + <img src={PaginaVaziaColecao} alt="PaginaVaziaColecao" style={{ height: "150px", width: "150px", verticalAlign: "middle", border: "0" }} /> + <br /> + <span style={{ fontFamily: "Roboto", fontWeight: "lighter", fontSize: "24px" }}> + Criamos a sua primeira Coleção! + </span> + <p style={{ fontFamily: "Roboto", fontSize: "16px", margin: "10px 0 0", fontWeight: "normal" }}> + Adicione nela recursos que você queira acessar mais tarde. + <br /> + Crie novas coleções clicando no cartão roxo "Criar Colecão". + </p> + </div> + } + sliceArr={userCollections} + showMore={showMoreUserCollections} + loadingMore={loadingMoreUserColl} + end={endOfUserColl} + callback={getInfo} + error={errorInUserColl} + removeColl={removeColl} + /> + + <PanelTemplateColecao + title={"Coleções que você segue"} + length={followedCollections.length} + noContentText={"Você ainda não segue nenhuma coleção."} + sliceArr={followedCollections} + showMore={showMoreFollowedCollections} + loadingMore={loadingMoreFollowedColl} + end={endOfFollowedColl} + followed={true} + error={errorInFollowedColl} + /> + </React.Fragment> + ] + ) + } + </> + ) +} + +function Tentativa(props) { + const [modalOpen, toggleModal] = useState(false) + const handleModal = () => { toggleModal(!modalOpen) }; + + if (props.error) + return ( + <WhiteContainer> + <Title + title={props.title} + length={props.length} + /> + <p + style={{ fontSize: "15px", fontWeight: "lighter", margin: "0 0 10px", display: "flex", justifyContent: "center", textAlign: "center" }} + > + Erro ao tentar obter os dados + </p> + </WhiteContainer> + ) + else + return ( + <WhiteContainer> + <CriarColecaoModal open={modalOpen} handleClose={() => { handleModal(); props.callback() }} /> + + <Title + title={props.title} + length={props.end} + /> + + <StyledGrid container spacing={1} style={{ paddingLeft: "30px", paddingRight: "15px" }}> + <Grid item xs={12} sm={6} md={'auto'} lg={3}> + <CardDiv onClick={() => { handleModal() }}> + <div style={{ backgroundColor: "#673ab7", display: "flex", height: "100%", width: "100%", justifyContent: "center", alignItems: "center", cursor: "pointer" }}> + <CreateNewFolderIcon style={{ color: "#fff", fontSize: "70px" }} /> + <p style={{ fontSize: "16px", margin: "0 0 10px", color: "#fff" }}> + CRIAR COLEÇÃO + </p> + </div> + </CardDiv> + </Grid> + + { + props.length === 0 ? + ( + [ + <Grid item lg={6} md={4} sm={6} xs={12}> + <NoContent text={props.noContentText} /> + </Grid> + ] + ) + : + ( + [ + <React.Fragment> + { + props.sliceArr.map((card) => + <Grid item xs={12} sm={6} md={'auto'} lg={3} key={card.id}> + <CollectionCardFunction + name={card.name} + tags={card.tags} + rating={card.review_average} + id={card.id} + author={card.owner.name} + description={card.description} + thumbnails={card.items_thumbnails} + avatar={card.owner.avatar} + likeCount={card.likes_count} + followed={card.followed} + liked={card.liked} + collections={card.collection_items} + authorID={card.owner.id} + removeColl={props.removeColl} + /> + </Grid> + ) + } + </React.Fragment> + ] + ) + } + </StyledGrid> + { + props.loadingMore ? + <LoadingSpinner text={'Carregando Recursos...'} /> + : + <ButtonsAreaColecao + sliceLength={props.sliceArr.length} + length={props.length} + showMore={props.showMore} + total={props.end} + end={String(props.sliceArr.length) === props.end} + /> + } + </WhiteContainer> + ) +} + +const CardDiv = styled(Card)` + margin-top : 10px; + margin-bottom : 10px; + height : 381px; + width : 272.5px; + ${'' /* float : left; */} +` diff --git a/src/Components/TabPanels/UserPageTabs/PanelCuradoria.js b/src/Components/TabPanels/UserPageTabs/PanelCuradoria.js new file mode 100644 index 0000000000000000000000000000000000000000..d9a3ac296fd3d2f0b6faa3c765bb701323c1f09c --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/PanelCuradoria.js @@ -0,0 +1,115 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react' +import LoadingSpinner from '../../LoadingSpinner.js' +import TemplateCuradoria from '../PanelComponents/TemplateCuradoria.js' +import { getRequest } from '../../HelperFunctions/getAxiosConfig' + +export default function TabPanelCuradoria(props) { + const [loading, handleLoading] = useState(true) + + const [errorCurating, setErrorCurating] = useState(false) + const [loadingMoreCurating, setLoadingMoreCurating] = useState(false) + const [currLimitCurating, setcurrLimitCurating] = useState(4); + const [endOfCurating, setEndofCurating] = useState(); + const [curating, setCurating] = useState([]); + + const showMoreCurating = (limite) => { + setLoadingMoreCurating(true); + const limit = limite; + setcurrLimitCurating(currLimitCurating + limit) + const url = `/users/${props.id}/submissions?offset=${currLimitCurating}&limit=${limit}&status=submitted`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreCurating(false); + setErrorCurating(true); + } + if (data.length >= 1) { + let currData = [...curating]; + currData = [...currData.concat(data)]; + setLoadingMoreCurating(false); + setCurating([...currData]); + } + else { + setLoadingMoreCurating(false); + setErrorCurating(true); + } + + }, + (error) => { + setLoadingMoreCurating(false); + setErrorCurating(true); + } + ) + } + + function handleSuccess(data, header) { + if (header.has('X-Total-Count')) { + setEndofCurating(header.get('X-Total-Count')); + } + + if (data.errors) { + setErrorCurating(true); + } + else + setCurating(data) + + handleLoading(false) + } + + function handleError() { + setErrorCurating(true); + handleLoading(false) + } + + useEffect(() => { + const url = `/users/${props.id}/submissions?offset=0&limit=4&status=submitted` + handleLoading(true) + getRequest(url, handleSuccess, handleError) + }, []) + + return ( + <React.Fragment> + { + loading ? + ( + <LoadingSpinner text={"Carregando Recursos"} /> + ) + : + ( + [ + <React.Fragment> + <TemplateCuradoria + length={curating.length} + titleText={curating.length === 1 ? "Recurso sendo avaliado pela curadoria" : "Recursos sendo avaliados pela curadoria"} + noContentText={"Você não tem nenhum recurso sendo avaliado pelos curadores."} + sliceArr={curating} + showMore={showMoreCurating} + loadingMore={loadingMoreCurating} + end={endOfCurating} + error={errorCurating} + /> + </React.Fragment> + ] + ) + } + </React.Fragment> + ) +} diff --git a/src/Components/TabPanels/UserPageTabs/PanelEditarPerfil.js b/src/Components/TabPanels/UserPageTabs/PanelEditarPerfil.js new file mode 100644 index 0000000000000000000000000000000000000000..ce5a319efaacbf631c7a3871c0ee8672a8f68db1 --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/PanelEditarPerfil.js @@ -0,0 +1,318 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useContext, useState } from 'react' +import styled from 'styled-components' +import { Store } from '../../../Store.js'; +import { Link } from 'react-router-dom' +import Button from '@material-ui/core/Button'; +import IconButton from '@material-ui/core/IconButton'; +import PhotoCamera from '@material-ui/icons/PhotoCamera'; +import Tooltip from '@material-ui/core/Tooltip'; +import FormInput from "../../FormInput.js" +import ValidateUserInput from '../../HelperFunctions/FormValidationFunction.js' +import { apiDomain } from '../../../env.js' +import ModalAlterarCover from '../../ModalAlterarCover/ModalAlterarCover.js' +import ModalAlterarAvatar from '../../ModalAlterarAvatar/ModalAlterarAvatar.js' +import Profile from '../../../img/default_profile0.png' + +export default function TabPanelEditarPerfil(props) { + // eslint-disable-next-line + const { state } = useContext(Store) + const [hoverAlterarFoto, handleAlterarFoto] = React.useState(false) + + const [formNome, setNome] = useState({ + key: state.currentUser.name ? false : true, + value: state.currentUser.name ? state.currentUser.name : "" + }) + + const [formAboutMe, setAboutMe] = useState({ + key: state.currentUser.description ? false : true, + value: state.currentUser.description ? state.currentUser.description : "" + }) + + const handleHoverAlterarFoto = () => { + handleAlterarFoto(!hoverAlterarFoto) + } + + const [tempCover, setTempCover] = useState('') + + const [open, toggleOpen] = useState(false) + const controlModal = () => { toggleOpen(!open) } + + const updateCover = (selectorFiles) => { + const objectURL = URL.createObjectURL(selectorFiles[0]) + setTempCover(objectURL) + controlModal() + } + + const handleChange = (e, type) => { + const userInput = e.target.value + const flag = ValidateUserInput(type, userInput) + + if (type === 'username') { + setNome({ + ...formNome, + key: flag, + value: userInput + }) + + } + else if (type === 'aboutMe') { + setAboutMe({ + ...formAboutMe, + key: flag, + value: userInput, + }) + + } + } + + const limpaCamposForm = () => { + setNome({ + ...formNome, + key: state.currentUser.name ? false : true, + value: state.currentUser.name ? state.currentUser.name : "" + }) + + setAboutMe({ + ...formAboutMe, + key: state.currentUser.description ? false : true, + value: state.currentUser.description ? state.currentUser.description : "" + }) + } + + const [alterarAvatatarOpen, toggleAlterarAvatar] = useState(false) + const controlModalAvatar = () => { toggleAlterarAvatar(!alterarAvatatarOpen) } + + const handleSubmit = (e) => { + e.preventDefault() + const info = { user: { name: formNome.value, description: formAboutMe.value, email: state.currentUser.email } } + const flagNome = formNome.key + const flagAboutMe = formAboutMe.key + + if (!(flagNome || flagAboutMe)) { + props.updateUserInfo(info) + limpaCamposForm() + } + } + + return ( + <React.Fragment> + <ModalAlterarCover + open={open} + handleClose={controlModal} + cover={tempCover} + id={state.currentUser.id} + /> + <ModalAlterarAvatar + open={alterarAvatatarOpen} + handleClose={controlModalAvatar} + userAvatar={state.currentUser.avatar} + id={state.currentUser.id} + /> + <div className="card-config"> + <h1 style={{ fontWeight: "300" }}>Editar Perfil </h1> + <div className='content-div'> + <div style={{ padding: "0", display: "flex", flexDirection: "column" }}> + <HeaderContainer> + <div style={{ position: "relative", height: "100%" }}> + <img src={state.currentUser.cover ? `${apiDomain}` + state.currentUser.cover : null} alt={state.currentUser.cover ? "user cover avatar" : ""} style={{ width: "100%", height: "100%", objectFit: "cover" }} /> + <input accept="image/*" style={{ display: "none" }} id="icon-button-file" type="file" onChange={(e) => updateCover(e.target.files)} /> + <label htmlFor="icon-button-file"> + <Tooltip title={<span style={{ fontSize: "14px", overflow: "hidden", transition: "all .5s ease" }}>ALTERAR CAPA</span>} placement="left"> + <IconButton style={{ position: "absolute", right: "0", top: "0", color: "#fff" }} color="primary" aria-label="upload picture" component="span"> + <PhotoCamera /> + </IconButton> + </Tooltip> + </label> + </div> + <ProfileAvatarDiv onMouseEnter={handleHoverAlterarFoto} onMouseLeave={handleHoverAlterarFoto}> + <img src={state.currentUser.avatar ? `${apiDomain}` + state.currentUser.avatar : Profile} alt="user avatar" /> + <ChangeAvatarDiv style={{ display: hoverAlterarFoto ? 'flex' : 'none' }}> + <span onClick={() => { controlModalAvatar() }}>Alterar Foto</span> + </ChangeAvatarDiv> + </ProfileAvatarDiv> + </HeaderContainer> + <br /> + </div> + + <div style={{ paddingTop: "90px" }}> + <div style={{ display: "flex", flexDirection: "row", justifyContent: "center" }}> + <form onSubmit={e => handleSubmit(e)}> + <FormInput + inputType={"text"} + name={"Nome Completo"} + value={formNome.value} + placeholder={"Nome Completo"} + handleChange={e => handleChange(e, 'username')} + required={true} + error={formNome.key} + /> + <FormInput + inputType={"text"} + name={"Sobre Mim"} + value={formAboutMe.value} + multi={true} + rows="3" + rowsMax="3" + error={formAboutMe.key} + placeholder={"Sobre mim (visÃvel no seu perfil público)"} + handleChange={e => handleChange(e, 'aboutMe')} + required={false} + help={formAboutMe.value.length + '/160'} + /> + </form> + </div> + <ButtonsDiv> + <Link to="perfil" ><ButtonCancelar ><span>CANCELAR</span></ButtonCancelar></Link> + <ButtonConfirmar onClick={e => handleSubmit(e)}><span>SALVAR ALTERAÇÕES</span></ButtonConfirmar> + </ButtonsDiv> + </div> + </div > + </div> + </React.Fragment> + ) +} + +const ButtonConfirmar = styled(Button)` + background-color : #00bcd4 !important; + color : #fff !important; + font-family : 'Roboto',sans-serif !important; + font-size : 14px !important; + font-weight : 500 !important; + padding-left : 16px !important; + padding-right : 16px !important; + outline : none !important; + margin : 6px 8px !important; + white-space : nowrap !important; + text-transform : uppercase !important; + font-weight : bold !important; + font-size : 14px !important; + font-style : inherit !important; + font-variant : inherit !important; + font-family : inherit !important; + text-decoration : none !important; + overflow : hidden !important; + display : inline-block !important; + position : relative !important; + cursor : pointer !important; + min-height : 36px !important; + min-width : 88px !important; + line-height : 36px !important; + vertical-align : middle !important; + align-items : center !important; + text-align : center !important; + border-radius : 3px !important; + box-sizing : border-box !important; + border : 0 !important; +` + +export const ButtonCancelar = styled(Button)` + height : 36px !important; + padding-left : 16px !important; + padding-right : 16px !important; + font-weight : bold !important; + border-radius : 3px !important; + outline : none !important; + text-transform : uppercase !important; + font-weight : 500 !important; + font-size : 14px !important; + font-style : inherit !important; + font-variant : inherit !important; + font-family : inherit !important; + text-decoration : none !important; + overflow : hidden !important; + display : inline-block !important; + position : relative !important; + cursor : pointer !important; + min-height : 36px !important; + min-width : 88px !important; + line-height : 36px !important; + vertical-align : middle !important; + align-items : center !important; + text-align : center !important; + border-radius : 3px !important; + box-sizing : border-box !important; + user-select : none !important; + border : 0 !important; + padding : 0 6px !important; + margin : 6px 8px !important; + :hover{ + background-color : #f1f1f1 !important; + } + +` + +const ButtonsDiv = styled.div` + text-align : right; + margin-top : 80px; +` + +const ChangeAvatarDiv = styled.div` + height : 40px; + position: absolute; + width : 100%; + bottom : 0; + display : flex; + background-color : #000; + color : #fff; + justify-content : center; +` + +const ProfileAvatarDiv = styled.div` + top: 70px; + left: 0; + right: 0; + bottom: -40px; + margin: auto; + border-radius : 100%; + position : absolute; + max-width : 100px; + max-height : 100px; + overflow : hidden; + border : 8px solid #fff; + outline : 0; + cursor : pointer; + z-index : 10; + background-color : #fff !important; + + @media screen and (max-width: 769px) { + max-width : 75px; + max-height : 75px; + position:absolute; + left:0; + right:0; + bottom : -40px; + margin-left:auto; + margin-right:auto; + } + img { + border:0; + vertical-align:middle; + width : 100%; + height : 100%; + } +` + +const HeaderContainer = styled.div` + background-color : #afeeee; + position : relative; + height : 150px; + border-radius : 8px; +` diff --git a/src/Components/TabPanels/UserPageTabs/PanelFavoritos.js b/src/Components/TabPanels/UserPageTabs/PanelFavoritos.js new file mode 100644 index 0000000000000000000000000000000000000000..8c9fff1ba0a9dce2b90cdd477ddc0decf8242c32 --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/PanelFavoritos.js @@ -0,0 +1,182 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react' +import LoadingSpinner from '../../LoadingSpinner.js' +import Template from '../PanelComponents/TemplateRecurso.js' +import PanelTemplateColecao from '../PanelComponents/TemplateColecao.js' +import { fetchAllRequest, getRequest } from '../../HelperFunctions/getAxiosConfig' + +export default function TabPanelFavoritos(props) { + const [loading, handleLoading] = useState(true) + + const [errorInLikedInLearnObj, setErrorInLikedInLearnObj] = useState(false) + const [errorInLikedInColl, setErrorInLikedInColl] = useState(false) + + const [likedLearnObjs, setlikedLearnObjs] = useState([]) + const [likedCollections, setlikedCollections] = useState([]) + const [currLimitLearnObjLiked, setCurrLimitLearnObjLiked] = useState(4); + const [currLimitCollLiked, setcurrLimitCollLiked] = useState(4); + + const [loadingMoreLearnObj, setLoadingMoreLearnObj] = useState(false) + const [loadingMoreColl, setLoadingMoreColl] = useState(false) + + const [endOfLearnObj, setEndofLearndObj] = useState(false) + const [endOfColl, setEndoffColl] = useState(false) + + + function handleSuccess(responseArr, headersArr) { + setErrorInLikedInLearnObj(responseArr[0].errors ? true : false) + setErrorInLikedInColl(responseArr[1].errors ? true : false) + + setlikedLearnObjs(responseArr[0]) + setlikedCollections(responseArr[1]) + + if (headersArr[0].has('X-Total-Count')) { + setEndofLearndObj(headersArr[0].get('X-Total-Count')); + } + if (headersArr[1].has('X-Total-Count')) { + setEndoffColl(headersArr[1].get('X-Total-Count')); + } + handleLoading(false) + } + + function handleError(error) { + handleLoading(false) + setErrorInLikedInLearnObj(true) + setErrorInLikedInColl(true) + } + + useEffect(() => { + handleLoading(true); + const urls = [ + `/users/${props.id}/learning_objects/liked?offset=0&limit=4`, + `/users/${props.id}/collections/liked?offset=0&limit=4` + ] + + fetchAllRequest(urls, handleSuccess, handleError) + + }, []) + + const showMoreLikedLearnObj = (limite) => { + setLoadingMoreLearnObj(true); + const limit = limite; + setCurrLimitLearnObjLiked(currLimitLearnObjLiked + limit) + const url = `/users/${props.id}/learning_objects/liked?offset=${currLimitLearnObjLiked}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreLearnObj(false); + setEndofLearndObj(true); + setErrorInLikedInLearnObj(true); + } + else if (data.length >= 1) { + let currData = [...likedLearnObjs]; + currData = [...currData.concat(data)]; + setLoadingMoreLearnObj(false); + setlikedLearnObjs(currData); + } + else { + setLoadingMoreLearnObj(false); + setEndofLearndObj(true) + } + }, + (error) => { + setLoadingMoreLearnObj(false); + setEndofLearndObj(true); + setErrorInLikedInLearnObj(true); + } + ) + } + + const showMoreLikedCollections = (limite) => { + const limit = limite; + setLoadingMoreColl(true); + setcurrLimitCollLiked(currLimitCollLiked + limit); + const url = `/users/${props.id}/collections/liked?offset=${currLimitCollLiked}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreColl(false); + setEndoffColl(true) + setErrorInLikedInColl(true) + } + if (data.length >= 1) { + let currData = [...likedCollections]; + currData = [...currData.concat(data)]; + setLoadingMoreColl(false); + setlikedCollections(currData); + } + else { + setLoadingMoreColl(false); + setEndoffColl(true) + } + }, + (error) => { + setLoadingMoreColl(false); + setEndoffColl(true) + setErrorInLikedInColl(true) + } + ) + } + + return ( + <> + { + loading ? + ( + <LoadingSpinner text={'CARREGANDO...'} /> + ) + : + ( + [ + <React.Fragment> + <Template + length={endOfLearnObj} + titleText={"Recursos Favoritados"} + noContentText={<p style={{ fontFamily: "Roboto", fontSize: "16px" }}>Quando você favorita um recurso ele aparece nesta seção. Além disso, você + <br /> + aumenta o prestÃgio dele na Plataforma. Para favoritar, basta clicar no Ãcone de + <br /> + coração que aparece nos Recursos. + </p>} + slice={likedLearnObjs} + showMore={showMoreLikedLearnObj} + loadingMore={loadingMoreLearnObj} + end={endOfLearnObj} + error={errorInLikedInLearnObj} + /> + + <PanelTemplateColecao + title={"Coleções favoritadas"} + length={endOfColl} + noContentText={"Você ainda não curtiu nenhuma coleção."} + sliceArr={likedCollections} + showMore={showMoreLikedCollections} + loadingMore={loadingMoreColl} + end={endOfColl} + followed={false} + error={errorInLikedInColl} + /> + </React.Fragment> + ] + ) + } + </> + ) +} diff --git a/src/Components/TabPanels/UserPageTabs/PanelGerenciarConta.js b/src/Components/TabPanels/UserPageTabs/PanelGerenciarConta.js new file mode 100644 index 0000000000000000000000000000000000000000..29edb847bc0aed30c5bef936117d0f95370d5958 --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/PanelGerenciarConta.js @@ -0,0 +1,216 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react' +import Paper from '@material-ui/core/Paper'; +import FormInput from "../../FormInput.js" +import {CompletarCadastroButton} from './PanelSolicitarContaProfessor.js' +import {ButtonCancelar} from './PanelEditarPerfil.js' +import ValidateUserInput from '../../HelperFunctions/FormValidationFunction.js' +import ModalExcluirConta from './ModalExcluirConta.js' + +export default function TabPanelGerenciarConta (props) { + const [senhaAtual, setSenhaAtual] = useState( + { + key : false, + value : localStorage.getItem("@portalmec/senha") || "" + }) + + const [novaSenha, setNovaSenha] = useState( + { + key : false, + value : "" + }) + + const [novaSenhaConfirmacao, setNovaSenhaConfirmacao] = useState( + { + key : false, + value : "" + }) + + const [novoEmail, setNovoEmail] = useState( + { + key : false, + value : "" + }) + + const handleChangeSenha = (e, type) => { + const userInput = e.target.value + const flag = (type === 'confirmacao' ? ValidateUserInput('confirmation', userInput, novaSenha.value) : ValidateUserInput('password', userInput)) + + if(type === 'senhaAtual') { + setSenhaAtual({...senhaAtual, + key : flag, + value : userInput + }) + } + else if(type === 'novaSenha') { + setNovaSenha({...novaSenha, + key : flag, + value : userInput + }) + } + else if (type === 'confirmacao'){ + setNovaSenhaConfirmacao({...novaSenhaConfirmacao, + key : flag, + value : userInput + }) + } + } + + const handleChangeEmail = (e) => { + const userInput = e.target.value + const flag = ValidateUserInput('email', userInput) + + setNovoEmail({...novoEmail, + key : flag, + value : userInput + }) + + } + + const limpaCamposForm = () => { + setSenhaAtual({...senhaAtual, + key : false, + value : '' + }) + + setNovaSenha({...novaSenha, + key : false, + value : '' + }) + + setNovaSenhaConfirmacao({...novaSenhaConfirmacao, + key : false, + value : '' + }) + } + + const onSubmit = (e, type) => { + e.preventDefault() + + if (type === 'senha'){ + if (!(senhaAtual.key || novaSenha.key || novaSenhaConfirmacao.key)) { + const info = {user : {password : novaSenha.value}} + props.updateUserPassword(info) + + limpaCamposForm() + } + } + else { + const info = {user : {email : novoEmail.value}} + + props.updateUserEmail(info) + + } + + } + + const [modalExcluir, setModalExcluir] = useState(false) + + return ( + <> + <Paper elevation={3} style= {{width:"100%"}}> + <div className='card-config'> + <div className='content-div'> + <h1>Gerenciar Conta</h1> + <div style={{display : "flex", flexDirection : "column"}}> + <form style={{margin : "0 0 20px 0"}} onSubmit={e => onSubmit(e, 'senha')}> + <h4 style={{display:"flex", justifyContent:"flex-start", fontSize:"18px"}}>Alterar Senha</h4> + <FormInput + inputType={"password"} + name={"Senha Atual"} + value={senhaAtual.value} + placeholder={"Senha atual"} + handleChange={e => handleChangeSenha(e, 'senhaAtual')} + required={true} + error={senhaAtual.key} + help={ senhaAtual.key ? "Faltou inserir sua senha atual" : ""} + /> + <FormInput + inputType={"password"} + name={"Nova senha"} + value={novaSenha.value} + placeholder={"Nova senha"} + handleChange={e => handleChangeSenha(e, 'novaSenha')} + required={true} + error={novaSenha.key} + help={ novaSenha.key ? (novaSenha.value.length === 0 ? "Faltou definir uma nova senha" : "A senha precisa ter no mÃnimo 8 caracteres.") : ""} + /> + <FormInput + inputType={"password"} + name={"Digite novamente a nova senha"} + value={novaSenhaConfirmacao.value} + placeholder={"Digite novamente a nova senha"} + handleChange={e => handleChangeSenha(e, 'confirmacao')} + required={true} + error={novaSenhaConfirmacao.key} + help={ novaSenhaConfirmacao.key ? "As senhas devem ser iguais" : ""} + /> + <div style={{display:"flex", flexDirection:"row", justifyContent:"space-evenly"}}> + <span style={{paddingTop:"0.7em"}}><a href="recuperar-senha" style={{textAlign: "flex-start", color:"#00bcd4"}}>Esqueceu a senha?</a></span> + <div style={{margin:"0"}}> + <ButtonCancelar onClick={limpaCamposForm}>Limpar Campos</ButtonCancelar> + <CompletarCadastroButton type="submit">Alterar Senha</CompletarCadastroButton> + </div> + </div> + </form> + </div> + </div> + </div> + </Paper> + <Paper elevation={3} style= {{width:"100%"}}> + <div className='card-config'> + <div className='content-div'> + <div style={{display : "flex", flexDirection : "column"}}> + <form onSubmit={(e) => onSubmit(e, 'email')}> + <h4 style={{display:"flex", justifyContent:"flex-start", fontSize:"18px"}}>Alterar e-mail</h4> + <FormInput + inputType={"text"} + name={"email"} + value={novoEmail.value} + placeholder={"E-mail"} + handleChange={e => handleChangeEmail(e)} + required={true} + error = {novoEmail.key} + /> + <div style={{margin:"0", display:"flex", justifyContent:"flex-start"}}> + <CompletarCadastroButton type="submit">SALVAR ALTERAÇÕES</CompletarCadastroButton> + </div> + </form> + </div> + </div> + </div> + </Paper> + <Paper elevation={3} style= {{width:"100%"}}> + <div className='card-config'> + <div className='content-div'> + <div> + <h4 style={{display:"flex", justifyContent:"flex-start", fontSize:"18px"}}>Conta</h4> + <span style={{margin:"0", display:"flex", justifyContent:"flex-start"}}>Antes de excluir a sua conta, saiba que ela será removida permanentemente.</span> + </div> + <div style={{margin:"0", display:"flex", justifyContent:"flex-start"}}> + <ModalExcluirConta open={modalExcluir} handleClose={() => {setModalExcluir(false)}}/> + <ButtonCancelar style={{color:'#eb4034'}} onClick={() => {setModalExcluir(true)}}>EXCLUIR CONTA</ButtonCancelar> + </div> + </div> + </div> + </Paper> + </> + ) +} diff --git a/src/Components/TabPanels/UserPageTabs/PanelMeusRecursos.js b/src/Components/TabPanels/UserPageTabs/PanelMeusRecursos.js new file mode 100644 index 0000000000000000000000000000000000000000..c6c3099a11ac3007bb63adc605896512d79caea1 --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/PanelMeusRecursos.js @@ -0,0 +1,228 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react' +import LoadingSpinner from '../../LoadingSpinner.js' +import Template from '../PanelComponents/TemplateRecurso.js' +import TemplateCuradoria from '../PanelComponents/TemplateCuradoria.js' +import { fetchAllRequest, getRequest } from '../../HelperFunctions/getAxiosConfig' + +export default function TabPanelAtividades(props) { + const [loading, handleLoading] = useState(true) + + const [errorInLearnObj, setErrorInLearnObj] = useState(false) + const [errorInDrafts, setErrorInDrafts] = useState(false) + const [errorInCurating, setErrorInCurating] = useState(false) + + const [loadingMoreLearnObj, setLoadingMoreLearnObj] = useState(false) + const [loadingMoreDrafts, setLoadingMoreDrafts] = useState(false) + const [loadingMoreCurating, setLoadingMoreCurating] = useState(false) + + const [currLimitLearnObj, setCurrLimitLearnObj] = useState(4); + const [currLimitDrafts, setcurrLimitDrafts] = useState(4); + const [currLimitCurating, setcurrLimitCurating] = useState(4); + + const [endOfLearnObj, setEndofLearndObj] = useState(0); + const [endOfDrafts, setEndofDrafts] = useState(0); + const [endOfCurating, setEndofCurating] = useState(0); + + const [learningObjects, setLearningObjects] = useState([]); + const [drafts, setDrafts] = useState([]); + const [curating, setCurating] = useState([]); + + function handleSuccess(responseArr, headersArr) { + setErrorInLearnObj(responseArr[0].errors ? true : false) + setErrorInDrafts(responseArr[1].errors ? true : false) + setErrorInCurating(responseArr[2].errors ? true : false) + + setLearningObjects(responseArr[0]) + if (headersArr[0].has('X-Total-Count')) { + setEndofLearndObj(headersArr[0].get('X-Total-Count')); + } + + setDrafts(responseArr[1]) + if (headersArr[1].has('X-Total-Count')) { + setEndofDrafts(headersArr[1].get('X-Total-Count')); + } + + setCurating(responseArr[2]) + if (headersArr[2].has('X-Total-Count')) { + setEndofCurating(headersArr[2].get('X-Total-Count')); + } + + handleLoading(false) + + } + + function handleError(error) { + handleLoading(false) + setErrorInCurating(true) + setErrorInDrafts(true) + setErrorInLearnObj(true) + } + + useEffect(() => { + const urls = [ + `/users/${props.id}/learning_objects?offset=0&limit=4`, + `/users/${props.id}/drafts?offset=0&limit=4`, + `/users/${props.id}/submissions?offset=0&limit=4&status=submitted` + ] + handleLoading(true); + fetchAllRequest(urls, handleSuccess, handleError) + }, []) + + const showMoreLearnObj = (limite) => { + setLoadingMoreLearnObj(true); + const limit = limite; + setCurrLimitLearnObj(currLimitLearnObj + limit) + const url = `/users/${props.id}/learning_objects?offset=${currLimitLearnObj}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreLearnObj(false); + setErrorInLearnObj(true) + } + else if (data.length >= 1) { + let currData = [...learningObjects]; + currData = [...currData.concat(data)]; + setLoadingMoreLearnObj(false); + setLearningObjects(currData); + } + else { + setLoadingMoreLearnObj(false); + setEndofLearndObj(true) + } + }, + (error) => { + setLoadingMoreLearnObj(false); + setErrorInLearnObj(true) + } + ) + } + + const showMoreDrafts = (limite) => { + setLoadingMoreDrafts(true); + console.log(limite); + const limit = limite; + setcurrLimitDrafts(currLimitDrafts + limit) + const url = `/users/${props.id}/drafts?offset=${currLimitDrafts}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreDrafts(false); + setErrorInDrafts(true) + } + else if (data.length >= 1) { + let currData = [...drafts]; + currData = [...currData.concat(data)]; + console.log('drafs: ', currData); + setLoadingMoreDrafts(false); + setDrafts([...currData]); + } + else { + setLoadingMoreDrafts(false); + setEndofDrafts(true); + } + }, + (error) => { + setLoadingMoreDrafts(false); + setErrorInDrafts(true) + } + ) + } + + const showMoreCurating = (limite) => { + setLoadingMoreCurating(true); + const limit = limite; + setcurrLimitCurating(currLimitCurating + limit) + const url = `/users/${props.id}/submissions?offset=${currLimitCurating}&limit=${limit}&status=submitted`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreCurating(false); + setErrorInCurating(true); + } + else if (data.length >= 1) { + let currData = [...curating]; + currData = [...currData.concat(data)]; + setLoadingMoreCurating(false); + setCurating([...currData]); + } + else { + setLoadingMoreCurating(false); + setEndofCurating(true); + } + + }, + (error) => { + setLoadingMoreCurating(false); + setErrorInCurating(true); + } + ) + } + + return ( + <> + { + loading ? + ( + <LoadingSpinner text={'Carregando Recursos'} /> + ) + : + ( + [ + <React.Fragment> + <Template + length={learningObjects.length} + titleText={learningObjects.length === 1 ? "Recurso Publicado" : "Recursos Publicados"} + noContentText={"Você ainda não publicou nenhum Recurso!"} + slice={learningObjects} + showMore={showMoreLearnObj} + loadingMore={loadingMoreLearnObj} + end={endOfLearnObj} + error={errorInLearnObj} + /> + + <Template + length={drafts.length} + titleText={drafts.length === 1 ? "Rascunho Publicado" : "Rascunhos Publicados"} + noContentText={"Você não tem nenhum recurso sendo editado."} + slice={drafts} + showMore={showMoreDrafts} + loadingMore={loadingMoreDrafts} + end={endOfDrafts} + error={errorInDrafts} + /> + + <TemplateCuradoria + length={curating.length} + titleText={curating.length === 1 ? "Recurso sendo avaliado pela curadoria" : "Recursos sendo avaliados pela curadoria"} + noContentText={"Você não tem nenhum recurso sendo avaliado pelos curadores."} + sliceArr={curating} + showMore={showMoreCurating} + loadingMore={loadingMoreCurating} + end={endOfCurating} + error={errorInCurating} + /> + </React.Fragment> + ] + ) + } + </> + ) +} diff --git a/src/Components/TabPanels/UserPageTabs/PanelRede.js b/src/Components/TabPanels/UserPageTabs/PanelRede.js new file mode 100644 index 0000000000000000000000000000000000000000..03f4083bb18f0ad729f2a6234ef16c455666cef8 --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/PanelRede.js @@ -0,0 +1,193 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react' +import LoadingSpinner from '../../LoadingSpinner.js' +import ContainerRedeVazia from './ContainerRedeVazia.js' +import PanelTemplateRede from '../PanelComponents/TemplateRede.js' +import { fetchAllRequest, getRequest } from '../../HelperFunctions/getAxiosConfig' + +export default function TabPanelRede(props) { + const [loading, handleLoading] = useState(true) + + const [errorInFollowing, setErrorInFollowing] = useState(false) + const [errorInFollowers, setErrorInFollowers] = useState(false) + + const [followingList, setFollowing] = useState([]) + const [currFollowingLimit, setCurrFollowingLimit] = useState(12) + const [loadingMoreFollowing, setLoadingFollowing] = useState(false) + const [endOfFollowing, setEndOfFollowing] = useState(false) + + const [followersList, setFollowers] = useState([]) + const [currFollowerLimit, setFollowersLimit] = useState(12) + const [loadingMoreFollowers, setLoadingMoreFollowers] = useState(false) + const [endOfFollowers, setEndOfFollowers] = useState(false) + + const showMoreFollowing = (limite) => { + setLoadingFollowing(true); + const limit = limite; + setCurrFollowingLimit(currFollowingLimit + limit) + const url = `/users/${props.id}/following/User?offset=${currFollowingLimit}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingFollowing(false); + setEndOfFollowing(true); + setErrorInFollowing(true); + } + else if (data.length >= 1) { + let currData = [...followingList]; + currData = [...currData.concat(data)]; + setLoadingFollowing(false); + setFollowing(currData); + } + else { + setLoadingFollowing(false); + setEndOfFollowing(true); + } + }, + (error) => { + setLoadingFollowing(false); + setEndOfFollowing(true); + setErrorInFollowing(true); + } + ) + } + + const showMoreFollowers = (limite) => { + setLoadingMoreFollowers(true); + const limit = limite; + setFollowersLimit(currFollowerLimit + limit) + const url = `/users/${props.id}/followers?offset=${currFollowerLimit}&limit=${limit}`; + getRequest(url, + (data) => { + if (data.errors) { + setLoadingMoreFollowers(false); + setEndOfFollowers(true); + setErrorInFollowers(true); + } + else { + if (data.length >= 1) { + let currData = [...followersList]; + currData = [...currData.concat(data)]; + setLoadingMoreFollowers(false); + setFollowers(currData); + } + else { + setLoadingMoreFollowers(false); + setEndOfFollowers(true) + } + } + }, + (error) => { + setLoadingMoreFollowers(false); + setEndOfFollowers(true); + setErrorInFollowers(true); + } + ) + } + + async function handleSuccess(responseArr, headersArr) { + setErrorInFollowing(responseArr[0].errors ? true : false) // prevent of crashing the portal, do not remove it + setErrorInFollowers(responseArr[1].errors ? true : false) // prevent of crashing the portal, do not remove it + setFollowing(responseArr[0]) + setFollowers(responseArr[1]) + if (headersArr[0].has('X-Total-Count')) { + setEndOfFollowing(headersArr[0].get('X-Total-Count')); + } + if (headersArr[1].has('X-Total-Count')) { + setEndOfFollowers(headersArr[1].get('X-Total-Count')); + } + handleLoading(false) + } + + function handleErrors() { + setLoadingMoreFollowers(false); + setEndOfFollowers(true); + setErrorInFollowers(true); + } + + useEffect(() => { + handleLoading(true) + const urls = [ + `/users/${props.id}/following/User`, + `/users/${props.id}/followers` + ] + + fetchAllRequest(urls, handleSuccess, handleErrors) + }, []) + + return ( + <> + { + loading ? + ( + [ + <LoadingSpinner text={'CARREGANDO...'} /> + ] + ) + : + ( + [ + <> + { + followingList.length === 0 && followersList.length === 0 ? + ( + [ + <> + <ContainerRedeVazia /> + </> + ] + ) + : + ( + <React.Fragment> + <PanelTemplateRede + title={followersList.length === 1 ? "Seguidor" : "Seguidores"} + length={followersList.length} + sliceArr={followersList} + showMore={showMoreFollowers} + follower={true} + loadingMore={loadingMoreFollowers} + end={endOfFollowers} + error={errorInFollowers} + noContentText={'Você não possui nenhum seguidor'} + /> + + <PanelTemplateRede + title={"Seguindo"} + length={followingList.length} + sliceArr={followingList} + showMore={showMoreFollowing} + follower={false} + loadingMore={loadingMoreFollowing} + end={endOfFollowing} + error={errorInFollowing} + noContentText={'Você ainda não segue nenhum usuário'} + /> + </React.Fragment> + + ) + } + </> + ] + ) + } + </> + ) +} diff --git a/src/Components/TabPanels/UserPageTabs/PanelSolicitarContaProfessor.js b/src/Components/TabPanels/UserPageTabs/PanelSolicitarContaProfessor.js new file mode 100644 index 0000000000000000000000000000000000000000..6a7aa88863a342036fab9e1474437c857e3e1d37 --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/PanelSolicitarContaProfessor.js @@ -0,0 +1,133 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useContext} from 'react' +import { Store } from '../../../Store.js'; +import styled from 'styled-components' +import Button from '@material-ui/core/Button'; +import {Link} from 'react-router-dom'; + +//3 casos + //Professor nao cadastrado (nao pediu OU submitter_request = rejected) + //Professor em análise (submitter_request = requested) + //Professor aceito (submitter_request = accepted) +export default function TabPanelSolicitarContaProfessor (props) { + // eslint-disable-next-line + const {state, dispatch} = useContext(Store) + + return ( + <div className='card-config'> + <div className='content-div'> + { + !state.currentUser.roles.some(role => role.name === "teacher") && ( state.currentUser.submitter_request === 'default' || state.currentUser.submitter_request === 'rejected' ) ? + ( + <div> + <ImageDiv/> + <StyledH2>Você é professor(a) da educação básica e gostaria de colaborar com a Plataforma?</StyledH2> + <StyledP>Ao ser identificado como professor(a), você poderá publicar e compartilhar recursos educacionais + digitais na plataforma com toda a comunidade escolar do paÃs. + </StyledP> + <div> + <Link to={{ + pathname: '/termos-publicar-recurso', + state: true + }}> + <CompletarCadastroButton > + SIM, COMPLETAR CADASTRO + </CompletarCadastroButton> + </Link> + </div> + </div> + ) + : + ( + <> + { + state.currentUser.submitter_request === 'requested' ? + ( + <h1>A sua conta de Professor foi solicitada</h1> + ) + : + ( + <h1>Você já possui uma conta de Professor</h1> + ) + } + </> + ) + } + </div> + </div> + ) +} + +export const CompletarCadastroButton = styled(Button)` + background-color : #00bcd4 !important; + color : #fff !important; + font-family : 'Roboto',sans-serif !important; + font-size : 14px !important; + font-weight : bold !important; + height : 36px !important; + border-radius : 3px !important; + padding-left : 16px !important; + padding-right : 16px !important; + outline : none !important; + margin : 6px 8px !important; + white-space : nowrap !important; + text-transform : uppercase !important; + font-weight : bold !important; + font-size : 14px !important; + font-style : inherit !important; + font-variant : inherit !important; + font-family : inherit !important; + text-decoration : none !important; + overflow : hidden !important; + display : inline-block !important; + position : relative !important; + cursor : pointer !important; + min-height : 36px !important; + min-width : 88px !important; + vertical-align : middle !important; + align-items : center !important; + text-align : center !important; + box-sizing : border-box !important; + border : 0 !important; +` + +const StyledP = styled.p` + font-size : 15px; + line-height : 22px; + text-align : left; + padding-bottom : 20px; +` + +const StyledH2 = styled.h2` + font-weight : 200; + font-size : 26px; + line-height : 36px; + text-align : left; + padding-bottom : 20px; +` + +const ImageDiv = styled.div` + background-image : url(https://plataformaintegrada.mec.gov.br/img/Publicar.png); + display : block; + height : 114px; + background-size : contain; + background-position : center center; + background-repeat : no-repeat; +` diff --git a/src/Components/TabPanels/UserPageTabs/TabRedeImgDiv.js b/src/Components/TabPanels/UserPageTabs/TabRedeImgDiv.js new file mode 100644 index 0000000000000000000000000000000000000000..13399e5ac70ba3b97a502dde8fdedeb418d738d6 --- /dev/null +++ b/src/Components/TabPanels/UserPageTabs/TabRedeImgDiv.js @@ -0,0 +1,28 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' + +export default function TabRedeImgDiv (props) { + return ( + <div> + <img src={props.img} alt={'no rede 1'} style={{width : "100%", verticalAlign : "middle", border : "0"}}/> + <p style={{fontSize : "14px", fontFamily : "Roboto", margin : "0 0 10px"}}>{props.text}</p> + </div> + ) +} diff --git a/src/Components/Table.js b/src/Components/Table.js new file mode 100644 index 0000000000000000000000000000000000000000..773a5fffb85387a8a4571b6e80b087c85104c944 --- /dev/null +++ b/src/Components/Table.js @@ -0,0 +1,81 @@ +import React from 'react'; +import { withStyles, makeStyles } from '@material-ui/core/styles'; +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableContainer from '@material-ui/core/TableContainer'; +import TableHead from '@material-ui/core/TableHead'; +import TableRow from '@material-ui/core/TableRow'; +import Paper from '@material-ui/core/Paper'; + +const StyledTableCell = withStyles(theme => ({ + head: { + backgroundColor: '#00bcd4', + color: '#ffffff', + fontFamily: 'Roboto', + fontStyle: 'normal', + fontWeight: 500, + fontSize: 15, + letterSpacing: .01 + }, + body: { + fontSize: 14, + }, +}))(TableCell); + +const StyledTableRow = withStyles(theme => ({ + root: { + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.background.default, + }, + }, +}))(TableRow); + + +const useStyles = makeStyles({ + table: { + minWidth: 970, + }, +}); + +export default function CustomizedTables(props) { + const classes = useStyles(); + + const onClick = (row) => { + const {city_name, id, name, state_name} = row + props.onClickTable(city_name, id, name, state_name) + } + + return ( + <> + <TableContainer component={Paper}> + <Table className={classes.table} aria-label="customized table"> + <TableHead> + <TableRow> + { + props.columns.map( (column)=> + <StyledTableCell align="left">{column}</StyledTableCell> + ) + } + </TableRow> + </TableHead> + <TableBody> + {props.rows.map(row => ( + <> + {console.log(row)} + <StyledTableRow onClick={() => onClick(row)} key={row.id}> + <StyledTableCell component="th" scope="row"> + {row.id} + </StyledTableCell> + <StyledTableCell align="left">{row.name}</StyledTableCell> + <StyledTableCell align="left">{row.state_name}</StyledTableCell> + <StyledTableCell align="left">{row.city_name}</StyledTableCell> + </StyledTableRow> + </> + ))} + </TableBody> + </Table> + </TableContainer> + </> + ); +} diff --git a/src/Components/TermsPageContent.js b/src/Components/TermsPageContent.js index 25b597cd86b1d2f5d62f3875c00966189b823731..918e040b626542c98ed6ecd83c739ac7d199ec0b 100644 --- a/src/Components/TermsPageContent.js +++ b/src/Components/TermsPageContent.js @@ -1,16 +1,6 @@ import React from 'react'; import Typography from '@material-ui/core/Typography'; import CardContent from '@material-ui/core/CardContent'; -import styled from 'styled-components' - -const h3Styled = styled.h3` - font-size: 24px; - align-self: center; -` - -const h4Styled = styled.h4` - font-size: 24px; -` export default function TermsPageContent () { return ( diff --git a/src/Components/TopicCard.js b/src/Components/TopicCard.js new file mode 100644 index 0000000000000000000000000000000000000000..1f3bb10faef2737441cea49be8b331a26edf8a21 --- /dev/null +++ b/src/Components/TopicCard.js @@ -0,0 +1,74 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import Card from '@material-ui/core/Card'; +import CardContent from '@material-ui/core/CardContent'; +import CardActions from '@material-ui/core/CardActions'; +import Typography from '@material-ui/core/Typography'; +import styled from 'styled-components'; +import Button from '@material-ui/core/Button'; +import { Link } from 'react-router-dom'; + +export default function MaterialCard(props) { + console.log(props); + const thumb = require(`../../public/${props.topic.img}`) + + return ( + <Card style={{ maxHeight: "100%", maxWidth: "300px" }}> + <img style={{ maxHeight: "100%", maxWidth: "100%" }} src={thumb} alt="thumbnail do recurso" /> + <CardContent style={{ height: "50px" }}> + <Title> + <BoldTitle> + {props.topic.pre_title} + </BoldTitle> + {props.topic.title} + </Title> + </CardContent> + <CardActions style={{ borderTop: "1px solid #e5e5e5", justifyContent: "center" }}> + <StyledLink to={"topico?colecao=" + props.colecao_id + "&topico=" + props.topic.id}> + <Button + color="secondary" + > + Ver módulo + </Button> + </StyledLink> + </CardActions> + </Card > + ) +} + +const Title = styled(Typography)` + font-weight: 500; + color: rgb(102, 102, 102); + font-size: 0.9em; + margin-left: 10px; + margin-right: 10px; + + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +` +const BoldTitle = styled.span` + font-weight: bold; +` +const StyledLink = styled(Link)` + text-decoration: none !important; + color: inherit !important; +` \ No newline at end of file diff --git a/src/Components/TopicFooter.js b/src/Components/TopicFooter.js new file mode 100644 index 0000000000000000000000000000000000000000..c6ce8ea42ddf97ec278bc6cd63e779b4cd28ec5e --- /dev/null +++ b/src/Components/TopicFooter.js @@ -0,0 +1,59 @@ +import React from 'react'; +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; + +export default function TopicFooter(props) { + return ( + <Container> + <Wrapper> + <Grid + container + direction="row" + justify="center" + alignItems="center" + > + <Grid item> + <FormationMaterialImage src={require(`../../public/${props.src}`)}/> + </Grid> + <Grid item> + <Text> + Este {props.topic_name} faz parte do Material de Formação: + <br /> + <strong>{props.colecao_name}</strong> + </Text> + </Grid> + </Grid> + </Wrapper> + </Container> + ); +} + +const Container=styled.div` + margin-top: 15px; + background-color: #e81f4f; + height: auto; + padding: 0; +` +const FormationMaterialImage=styled.img` + width: 300px; + margin-right: 20px; +` +const Text=styled.h2` + font-weight: 100; + text-align: center; + color: #fff; +` +const Wrapper=styled.div` + margin-right : auto; + margin-left : auto; + + @media screen and (max-width: 768px) { + width : 100% !important; + } + @media screen and (min-width: 992px) { + width : 770px; + } + @media screen and (min-width: 1200px) { + width : 970px !important; + } +` diff --git a/src/Components/TopicList.js b/src/Components/TopicList.js new file mode 100644 index 0000000000000000000000000000000000000000..e965adad1b530fbf96d090fa028b1fc83ebad01a --- /dev/null +++ b/src/Components/TopicList.js @@ -0,0 +1,81 @@ +import React, { useState } from 'react'; +import styled from 'styled-components' +import Grid from '@material-ui/core/Grid'; +import Fab from '@material-ui/core/Fab'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import ExpandLessIcon from '@material-ui/icons/ExpandLess'; +import TopicCard from './TopicCard.js'; + +export default function TopicList(props) { + const [expanded, setExpanded] = useState(false); + + const handleFabClick = () => { + setExpanded(!expanded); + } + + return ( + <Wrapper> + <Title>Módulos</Title> + <Grid + container + spacing={3} + justify="center" + alignItems="center" + > + {props.topicos.slice(0, (expanded ? -1 : 5)).map((t, index) => { + return ( + <Grid item key={index} md={3}> + <TopicCard topic={t} colecao_id={props.colecao_id} /> + </Grid> + ); + }) + } + </Grid> + {props.topicos.length > 5 ? + <Grid container + direction="column" + justify="flex-start" + alignItems="center" + > + <Grid item> + <Fab size="medium" color="secondary" aria-label="edit" onClick={handleFabClick}> + {expanded ? <ExpandLessIcon /> : <ExpandMoreIcon />} + </Fab> + </Grid> + <Grid item> + <FabText> + {expanded ? "VER MENOS" : "VER TODOS OS MÓDULOS"} + </FabText> + </Grid> + </Grid> + : <div></div> + } + </Wrapper> + ); +} + +const FabText = styled.span` + color: #666; + font-weight: 900; + line-height: 2em; +` +const Title = styled.h1` + font-weight: 100; + margin-left: 30px; + color: rgb(102, 102, 102); +` +const Wrapper = styled.div` + margin-right : auto; + margin-left : auto; + margin-bottom: 30px; + + @media screen and (max-width: 768px) { + width : 100% !important; + } + @media screen and (min-width: 992px) { + width : 770px; + } + @media screen and (min-width: 1200px) { + width : 970px !important; + } +` diff --git a/src/Components/UploadPageComponents/ButtonsDiv.js b/src/Components/UploadPageComponents/ButtonsDiv.js new file mode 100644 index 0000000000000000000000000000000000000000..8e4d194578dc53db54ff9934e9aef996e4582026 --- /dev/null +++ b/src/Components/UploadPageComponents/ButtonsDiv.js @@ -0,0 +1,78 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState } from 'react' +import ModalCancelar from './ModalCancelar.js' +import { GreyButton, OrangeButton } from './StyledComponents'; +import Grid from '@material-ui/core/Grid'; +import { Redirect } from 'react-router-dom' + +export default function ButtonsDiv(props) { + const [modalCancelar, toggleModalCancelar] = useState(false) + const [redirectTrue, toggleRedirect] = useState(false) + return ( + <> + <ModalCancelar + open={modalCancelar} + handleClose={() => { toggleModalCancelar(false) }} + draftID={props.draftID} + /> + + { + redirectTrue && + <Redirect to="/" /> + } + <Grid container justify="center" alignItems="center" spacing={3}> + + {/*botao excluir na pagina de editar*/} + <Grid item> + <GreyButton onClick={() => { toggleModalCancelar(true) }}> + <span className="button-text"> + CANCELAR + </span> + </GreyButton> + </Grid> + + { + props.onPartTwo && + <Grid item> + <GreyButton onClick={() => { props.stepperControl(-1) }}> + <span className="button-text"> + VOLTAR + </span> + </GreyButton> + </Grid> + } + + <Grid item> + <GreyButton onClick={() => { if (window.confirm('O seu recurso em edição foi salvo.')) toggleRedirect(true) }}> + <span className="button-text"> + CONTINUAR MAIS TARDE + </span> + </GreyButton> + </Grid> + + <Grid item> + <OrangeButton type="submit"> + SALVAR E AVANÇAR + </OrangeButton> + </Grid> + </Grid> + </> + ) +} diff --git a/src/Components/UploadPageComponents/ChooseLinkSection.js b/src/Components/UploadPageComponents/ChooseLinkSection.js new file mode 100644 index 0000000000000000000000000000000000000000..52a14ae21b18fb4c190effa4ba4d9ecfaca6d1f0 --- /dev/null +++ b/src/Components/UploadPageComponents/ChooseLinkSection.js @@ -0,0 +1,96 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react' +import UndoIcon from '@material-ui/icons/Undo'; +import {WrapperBox, StyledTextField, BlueButton, GrayButton} from './StyledComponents.js' + +export default function ChooseLink (props) { + const [linkSent, setLinkSent] = useState(false) + const [link, setLink] = useState({flag : false, value : ""}) + const handleLink = (e) => { + let userInput = e.target.value + const urlRegex = new RegExp( + // eslint-disable-next-line + "(?:(?:(?:https?|ftp):\/\/))(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,}))\.?)(?::\d{2,5})*(?:[/?#]\S*)?", "i" + ) + let flag = !(urlRegex.test(userInput)) + setLink({...link, + flag : flag, + value : userInput} + ) + } + + const handleSubmit = (e) => { + e.preventDefault() + console.log(link.flag) + if (!link.flag) { + props.submit(link.value) + setLinkSent(true) + } + } + + + return ( + <WrapperBox> + <div className="inner"> + <div className="upload-title"> Enviar Link</div> + + <div className="flex-column"> + <p>Insira o link da página do recurso abaixo:</p> + <form onSubmit={(e) => {handleSubmit(e)}}> + <StyledTextField + id = {"choose-link-form"} + label={"Exemplo: http://google.com"} + type = {"text"} + value = {link.value} + onChange = {e => {handleLink(e)}} + helperText = {link.flag ? "Faltou inserir um endereço eletrônico" : ""} + multiline={true} + rowsMax = {"10"} + rows={1} + error = {link.flag} + required = {true} + disabled={linkSent} + /> + + <div className="buttons-div"> + { + linkSent ? + ( + <BlueButton onClick={() => {setLinkSent(false)}}>Editar</BlueButton> + ) + : + ( + <> + <GrayButton onClick={() => {props.handleNextStage("default")}}> + <span className="button-text"> + <UndoIcon className="icon"/>Voltar + </span> + </GrayButton> + <BlueButton type="submit">SALVAR</BlueButton> + </> + ) + } + </div> + </form> + </div> + </div> + </WrapperBox> + ) +} diff --git a/src/Components/UploadPageComponents/FileToUpload.ts b/src/Components/UploadPageComponents/FileToUpload.ts new file mode 100644 index 0000000000000000000000000000000000000000..fddbf404078bdb1eed4d04a666955d63ccdbac87 --- /dev/null +++ b/src/Components/UploadPageComponents/FileToUpload.ts @@ -0,0 +1,106 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +export default class FileToUpload { + static chunkSize = 262144; + readonly request: XMLHttpRequest; + readonly uploadUrl: string; + readonly file: File; + readonly name: string; + readonly draftID: string; + readonly _chunkIdentifier: string; + private _chunkNumber: number; + currentChunkStartByte: number; + currentChunkFinalByte: number; + + constructor(file: File, name: string, draftID : string) { + this.request = new XMLHttpRequest(); + this.request.onreadystatechange = function(ev: Event) { + if(this.readyState === XMLHttpRequest.DONE){ + if (this.getResponseHeader('access-token') != null) { + console.log(this.getResponseHeader('access-token')) + sessionStorage.setItem('@portalmec/accessToken', this.getResponseHeader('access-token')!) + } + } + } + this.request.overrideMimeType('application/octet-stream'); + + this.file = file; + this.name = name; + this.draftID = draftID; + this.uploadUrl = 'https://api.portalmec.c3sl.ufpr.br/v1/learning_objects/' + draftID + '/chunk' + this._chunkIdentifier = draftID + '-' + this.name; + this._chunkNumber = 0; + + this.currentChunkStartByte = 0; + this.currentChunkFinalByte = FileToUpload.chunkSize > this.file.size ? this.file.size : FileToUpload.chunkSize; + } + + uploadFile() { + this.request.open('POST', this.uploadUrl, true); + + let chunk: Blob = this.file.slice(this.currentChunkStartByte, this.currentChunkFinalByte); // split the file according to the boundaries + + //set necessary headers + this.request.setRequestHeader('Content-Range', `bytes ${this.currentChunkStartByte}-${this.currentChunkFinalByte}/${this.file.size}`); + if (sessionStorage.getItem('@portalmec/uid') != undefined) { + this.request.setRequestHeader('uid', sessionStorage.getItem('@portalmec/uid')!) + } + if (sessionStorage.getItem('@portalmec/clientToken') != undefined) { + this.request.setRequestHeader('client', String(sessionStorage.getItem('@portalmec/clientToken'))) + } + if (sessionStorage.getItem('@portalmec/accessToken') != undefined) { + this.request.setRequestHeader('access-token', String(sessionStorage.getItem('@portalmec/accessToken'))) + } + + this.request.onload = () => { + const remainingBytes = this.file.size - this.currentChunkFinalByte; + + if(this.currentChunkFinalByte === this.file.size) { + alert('Yay, upload completed! Chao!'); + return('done'); + } else if (remainingBytes < FileToUpload.chunkSize) { + // if the remaining chunk is smaller than the chunk size we defined + this.currentChunkStartByte = this.currentChunkFinalByte; + this.currentChunkFinalByte = this.currentChunkStartByte + remainingBytes; + } + else { + // keep chunking + this.currentChunkStartByte = this.currentChunkFinalByte; + this.currentChunkFinalByte = this.currentChunkStartByte + FileToUpload.chunkSize; + } + + this._chunkNumber = this._chunkNumber + 1 + this.uploadFile(); + } + + //add attributes + const formData = new FormData(); + formData.append('_chunkFilename', this.file.name); + formData.append('_chunkIdentifier', this._chunkIdentifier); + formData.append('_totalChunks', String(Math.ceil(this.file.size/FileToUpload.chunkSize))); + formData.append('_chunkSize', String(FileToUpload.chunkSize)); + formData.append('_currentChunkSize', String(this.currentChunkFinalByte - this.currentChunkStartByte)); + formData.append('_chunkNumber', String(this._chunkNumber)); + formData.append('_totalSize', String(this.file.size)); + formData.append('file', chunk); + + this.request.send(formData);// send it now! + } + +} diff --git a/src/Components/UploadPageComponents/FileUploadStage.js b/src/Components/UploadPageComponents/FileUploadStage.js new file mode 100644 index 0000000000000000000000000000000000000000..880ff018ef65d34cdf952b8829dedfd819f647b6 --- /dev/null +++ b/src/Components/UploadPageComponents/FileUploadStage.js @@ -0,0 +1,65 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react' +import styled from 'styled-components' +import {WrapperBox} from './StyledComponents.js' +import DoneIcon from '@material-ui/icons/Done'; +import DeleteIcon from '@material-ui/icons/Delete'; +import {deleteRequest} from '../HelperFunctions/getAxiosConfig.js' + +export default function FileUploadStage (props) { + const [uploading, toggleUploading] = useState(true) + + function handleSuccess (data) { + props.handleNextStage("default") + } + const handleDelete = () => { + const url = `/learning_objects/${props.draftID}` + + deleteRequest(url, handleSuccess, (error) => {console.log(error)}) + } + + return ( + <WrapperBox> + <div className="inner"> + <div className="upload-title"> + {uploading ? 'Carregando arquivo' : 'O arquivo foi carregado'} + </div> + + <div className="uploading"> + <div className="upload-item"> + <div className="item-info"> + <div className="file-status"> + <DoneIcon className="icon icon-margin"/> {props.file.name} + </div> + <div className="remove-file" onClick={handleDelete}> + Excluir <DeleteIcon className="icon icon-remove"/> + </div> + </div> + </div> + <div className="warning"> + <span>Não se esqueça de preencher as</span> + <br/> + <span>informações sobre o recurso ao lado.</span> + </div> + </div> + </div> + </WrapperBox> + ) +} diff --git a/src/Components/UploadPageComponents/Forms/Autor.js b/src/Components/UploadPageComponents/Forms/Autor.js new file mode 100644 index 0000000000000000000000000000000000000000..30a3535b04fc2f2e4f0790227f4c9f61e8d40bb4 --- /dev/null +++ b/src/Components/UploadPageComponents/Forms/Autor.js @@ -0,0 +1,75 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, memo, useContext} from 'react' +import {Store} from '../../../Store.js' +import { withStyles } from '@material-ui/core/styles'; + +import FormControl from '@material-ui/core/FormControl'; +import { StyledFormLabel, OutroAutorTextField} from '../StyledComponents.js' +import RadioGroup from '@material-ui/core/RadioGroup'; +import Radio from '@material-ui/core/Radio'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; + +const BlueRadio = withStyles({ + root: { + color: '#666', + '&$checked': { + color: '#00bcd4', + }, + }, + checked: {}, +})((props) => <Radio color="default" {...props} />); + +function Autor (props) { + const {state} = useContext(Store) + const [authorValue, setAuthorValue] = useState(props.initialValue ? props.initialValue : -1) + const [outroAutor, setOutroAutor] = useState(props.initialOutroAutor ? props.initialOutroAutor : '') + + const getAuthor = () => { + return authorValue === "0" ? state.currentUser.name : outroAutor + } + + return ( + <FormControl required={true} style={{width : "100%"}} onBlur={() => {props.onBlurCallback("author", getAuthor(), props.draftID)}}> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + <b>Autor do recurso</b> + </StyledFormLabel> + <RadioGroup ara-label="Autor do Recurso" name="Autor do Recurso" value={authorValue} onChange={(e) => {setAuthorValue(e.target.value)}}> + <FormControlLabel value="0" control={<BlueRadio />} label="Sou o(a) autor(a) deste recurso"/> + <FormControlLabel value="1" control={<BlueRadio/>} + label={ + <div style={{display : "flex", alignItems : "center"}}> + Outro: + <OutroAutorTextField + id = {"outro-autor-form"} + placeholder={"Nome dos autores"} + type = {"text"} + value = {outroAutor} + onChange = {e => {setOutroAutor(e.target.value)}} + disabled = {authorValue === "0"} + style={{paddingLeft : "5px", width : "100%"}} + /> + </div>} + /> + </RadioGroup> + </FormControl> + ) +} + +export default memo(Autor) diff --git a/src/Components/UploadPageComponents/Forms/Idioma.js b/src/Components/UploadPageComponents/Forms/Idioma.js new file mode 100644 index 0000000000000000000000000000000000000000..7d033a44d9ef18c7ffdd55f5b7894176077d3e7d --- /dev/null +++ b/src/Components/UploadPageComponents/Forms/Idioma.js @@ -0,0 +1,63 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react' +import FormControl from '@material-ui/core/FormControl'; +import {StyledFormLabel} from '../StyledComponents.js' +import ListItemText from '@material-ui/core/ListItemText'; +import Checkbox from '@material-ui/core/Checkbox'; +import MenuItem from '@material-ui/core/MenuItem'; +import Select from '@material-ui/core/Select'; + +export default function Idioma (props) { + const [chosenLanguage, setChosenLanguage] = useState(props.initialValue ? props.initialValue : []) + const [ids, setIds] = useState(props.initialIDValues ? props.initialIDValues : []) + + const handleChangeLanguage = (event) => { + console.log(event.target.value) + let newLanguage = event.target.value.pop() + setChosenLanguage(chosenLanguage => [...chosenLanguage, newLanguage.name]); + setIds(ids => [...ids, newLanguage.id]) + }; + + + return ( + <FormControl required style={{minWidth : "30%"}}> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + <b>Idioma</b> + </StyledFormLabel> + <Select + value={chosenLanguage} + multiple + renderValue={(selected) => selected.join(', ')} + name="Idioma" + onChange={handleChangeLanguage} + onBlur={() => {props.onBlurCallback("language_ids", ids, props.draftID)}} + > + { + props.languages.map( language => + <MenuItem key={language.name} value={language}> + <Checkbox checked={chosenLanguage.indexOf(language.name) > -1} /> + <ListItemText primary={language.name} /> + </MenuItem> + ) + } + </Select> + </FormControl> + ) +} diff --git a/src/Components/UploadPageComponents/Forms/Keywords.js b/src/Components/UploadPageComponents/Forms/Keywords.js new file mode 100644 index 0000000000000000000000000000000000000000..34c7b8ec36103d4eb27f1fbba515f2cd686ffdad --- /dev/null +++ b/src/Components/UploadPageComponents/Forms/Keywords.js @@ -0,0 +1,87 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, memo} from 'react' +import FormControl from '@material-ui/core/FormControl'; +import {StyledTextField, StyledFormLabel} from '../StyledComponents.js' +import FormHelperText from '@material-ui/core/FormHelperText'; +import Chip from '@material-ui/core/Chip'; + +function Keywords (props) { + + const [keywords, setKeywords] = useState(props.initialValue ? props.initialValue : []) + const handleSetKeywords = (newKeyword) => {setKeywords(newKeyword)} + const deleteKeyword = (keywordToDelete) => { + setKeywords(keywords.filter((keyword) => keyword !== keywordToDelete)) + } + + const [keywordsBuffer, setKeywordsBuffer] = useState('') + + const handleKeywords = (event) => { + let userInput = event.target.value; + + if(userInput.indexOf(',') !== -1 ) { + if(userInput.length > 1) { + handleSetKeywords([...keywords, userInput.split(',')[0]]) + } + setKeywordsBuffer('') + } + else { + setKeywordsBuffer(userInput) + } + } + + + return ( + <React.Fragment> + <FormControl required={true} style={{width : "100%"}}> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + <b>Palavras-chave para buscar o Recurso</b> + <span style={{color : "#a5a5a5", paddingLeft : "10px"}}> + (Use vÃrgula ou enter para separar as palavras-chave)</span> + </StyledFormLabel> + <StyledTextField + id = {"text-form"} + placeholder={"Ex: Biomas, Geografia, ..."} + type = {"text"} + value={keywordsBuffer} + onChange={handleKeywords} + onKeyDown={(event) => { + if(event.keyCode === 13){ + handleSetKeywords([...keywords, keywordsBuffer]) + setKeywordsBuffer('')}} + } + fullWidth + onBlur={() => {props.onBlurCallback("tags", keywords, props.draftID)}} + /> + </FormControl> + { + keywords.length !== 0 && + <FormHelperText> + { + keywords.map( (keyword) => + <Chip label={keyword} key={keyword} onDelete={() => deleteKeyword(keyword)} /> + ) + } + </FormHelperText> + } + </React.Fragment> + ) +} + +export default memo(Keywords) diff --git a/src/Components/UploadPageComponents/Forms/NewTitle.js b/src/Components/UploadPageComponents/Forms/NewTitle.js new file mode 100644 index 0000000000000000000000000000000000000000..0a763dc0a08fd0d399f7daf3b127a9620d24965c --- /dev/null +++ b/src/Components/UploadPageComponents/Forms/NewTitle.js @@ -0,0 +1,62 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, memo} from 'react' +import FormControl from '@material-ui/core/FormControl'; +import {StyledTextField, StyledFormLabel} from '../StyledComponents.js' +import FormHelperText from '@material-ui/core/FormHelperText'; + + +function NewTitle (props) { + + const [objTitle, setFormValue] = useState({ + error : false, + value : props.initialValue ? props.initialValue : "" + }) + const handleChangeTitle = (e) => { + let userInput = e.target.value + let flag = (userInput.length > 100 || userInput.length === 0 ? true : false) + setFormValue({...objTitle, + error : flag, + value : userInput + }) + } + + return ( + <FormControl required={true} style={{width : "100%", height : "100px"}}> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + <b>TÃtulo do Recurso</b> + </StyledFormLabel> + <StyledTextField + id = {"title-form"} + placeholder={"Ex: Jogo Virtual sobre os Biomas do Brasil"} + type = {"text"} + value = {objTitle.value} + onChange = {e => {handleChangeTitle(e)}} + helperText = {objTitle.value.length + "/100"} + error = {objTitle.error} + fullWidth + onBlur={() => {props.onBlurCallback("name", objTitle.value, props.draftID)}} + /> + {objTitle.value.length === 0 && objTitle.error && + <FormHelperText style={{fontSize : "14px", position : "relative", top : "-26px"}}>Faltou definir um tÃtulo.</FormHelperText>} + </FormControl> + ) +} + +export default memo(NewTitle) diff --git a/src/Components/UploadPageComponents/Forms/SobreORecurso.js b/src/Components/UploadPageComponents/Forms/SobreORecurso.js new file mode 100644 index 0000000000000000000000000000000000000000..ff82f818fac17ad111411b65ba4505dd3215fcc9 --- /dev/null +++ b/src/Components/UploadPageComponents/Forms/SobreORecurso.js @@ -0,0 +1,48 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, memo} from 'react' +import FormControl from '@material-ui/core/FormControl'; +import {StyledTextField, StyledFormLabel} from '../StyledComponents.js' + +function SobreORecurso (props) { + const [objDescription, setDescription] = useState(props.initialValue ? props.initialValue : '') + const handleSetDescription = (event) => {setDescription(event.target.value)} + + + return ( + <FormControl style={{width : "100%"}}> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + <b>Descrição geral do Recurso</b> (Opcional) + </StyledFormLabel> + <StyledTextField + id = {"description-form"} + placeholder={"Quais assuntos são contemplados neste Recurso? Para quais objetivos este Recurso pode ser destinado?"} + type = {"text"} + value={objDescription} + onChange={handleSetDescription} + fullWidth + multiline + rows={5} + onBlur={() => {props.onBlurCallback("description", objDescription, props.draftID)}} + /> + </FormControl> + ) +} + +export default memo(SobreORecurso); diff --git a/src/Components/UploadPageComponents/Forms/TipoDeRecurso.js b/src/Components/UploadPageComponents/Forms/TipoDeRecurso.js new file mode 100644 index 0000000000000000000000000000000000000000..4e7a9f29ba8a55c6257cd1f03bb80e3821ab7aab --- /dev/null +++ b/src/Components/UploadPageComponents/Forms/TipoDeRecurso.js @@ -0,0 +1,50 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, memo} from 'react' +import FormControl from '@material-ui/core/FormControl'; +import {StyledRadio, StyledFormLabel} from '../StyledComponents.js' +import RadioGroup from '@material-ui/core/RadioGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; + + +function TipoDeRecurso (props) { + + const [objTypeValue, chooseObjType] = useState(props.initialValue ? props.initialValue : 0) + const handleChangeObjType = (event) => {chooseObjType(Number(event.target.value))} + + return ( + <FormControl required={true} style={{width : "100%"}} onBlur={() => {props.onBlurCallback("object_type_id", objTypeValue, props.draftID)}}> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + <b>Tipo de recurso</b> + </StyledFormLabel> + <RadioGroup aria-label="Tipo de Recurso" name="Tipo de Recurso" row value={objTypeValue} onChange={handleChangeObjType} style={{justifyContent : "center"}}> + { + props.objTypes.map( (type) => + <FormControlLabel key={type.id} value={type.id} + control={<StyledRadio label={type.name} checked={objTypeValue === type.id}/>} + /> + ) + + } + </RadioGroup> + </FormControl> + ) +} + +export default memo(TipoDeRecurso) diff --git a/src/Components/UploadPageComponents/GetIconByName.js b/src/Components/UploadPageComponents/GetIconByName.js new file mode 100644 index 0000000000000000000000000000000000000000..d3c40d376b0032dea30ee2f22e423b4f189c5f38 --- /dev/null +++ b/src/Components/UploadPageComponents/GetIconByName.js @@ -0,0 +1,132 @@ +import React from 'react' +import { ReactComponent as AplicativoMovelIcon } from '../../img/object_type_icons/object-type_aplicativo-movel.svg' +import { ReactComponent as ApresentacaoIcon } from '../../img/object_type_icons/object-type_apresentacao.svg' +import { ReactComponent as AudioIcon } from '../../img/object_type_icons/object-type_audio.svg' +import { ReactComponent as ImagemIcon } from '../../img/object_type_icons/object-type_imagem.svg' +import { ReactComponent as InfograficoIcon } from '../../img/object_type_icons/object-type_infografico.svg' +import { ReactComponent as JogoIcon } from '../../img/object_type_icons/object-type_jogo.svg' +import { ReactComponent as LivroDigitalIcon } from '../../img/object_type_icons/object-type_livro-digital.svg' +import { ReactComponent as MapaIcon } from '../../img/object_type_icons/object-type_mapa.svg' +import { ReactComponent as OutrosIcon } from '../../img/object_type_icons/object-type_outros.svg' +import { ReactComponent as SoftwareEducacionalIcon } from '../../img/object_type_icons/object-type_software-educacional.svg' +import { ReactComponent as TextoIcon } from '../../img/object_type_icons/object-type_texto.svg' +import { ReactComponent as VideoIcon } from '../../img/object_type_icons/object-type_video.svg' +import { ReactComponent as AnimacaoIcon } from '../../img/object_type_icons/object-type_animacao.svg' +import { ReactComponent as PlanoAulaIcon } from '../../img/object_type_icons/object-type_plano-de-aula.svg' + + +import { ReactComponent as Arte } from '../../img/subject_icons/subject_arte.svg' +import { ReactComponent as Biologia } from '../../img/subject_icons/subject_biologia.svg' +import { ReactComponent as CienciasNatureza } from '../../img/subject_icons/subject_ciencias-da-natureza.svg' +import { ReactComponent as DireitosHumanos } from '../../img/subject_icons/subject_direitos-humanos.svg' +import { ReactComponent as EducacaoAmbiental } from '../../img/subject_icons/subject_educacao-ambiental.svg' +import { ReactComponent as EducacaoCampo } from '../../img/subject_icons/subject_educacao-do-campo.svg' +import { ReactComponent as EducacaoEspecial } from '../../img/subject_icons/subject_educacao-especial.svg' +import { ReactComponent as EducacaoFisica } from '../../img/subject_icons/subject_educacao-fisica.svg' +import { ReactComponent as EducacaoIndigena } from '../../img/subject_icons/subject_educacao-indigena.svg' +import { ReactComponent as EducacaoQuilombola } from '../../img/subject_icons/subject_educacao-quilombola.svg' +import { ReactComponent as EducacaoSexual } from '../../img/subject_icons/subject_educacao-sexual.svg' +import { ReactComponent as EnsinoReligioso } from '../../img/subject_icons/subject_ensino-religioso.svg' +import { ReactComponent as Filosofia } from '../../img/subject_icons/subject_filosofia.svg' +import { ReactComponent as Fisica } from '../../img/subject_icons/subject_fisica.svg' +import { ReactComponent as Geografia } from '../../img/subject_icons/subject_geografia.svg' +import { ReactComponent as Historia } from '../../img/subject_icons/subject_historia.svg' +import { ReactComponent as Informatica } from '../../img/subject_icons/subject_informatica.svg' +import { ReactComponent as LinguaEspanhola } from '../../img/subject_icons/subject_lingua-espanhola.svg' +import { ReactComponent as LinguaInglesa } from '../../img/subject_icons/subject_lingua-inglesa.svg' +import { ReactComponent as LinguaPortuguesa } from '../../img/subject_icons/subject_lingua-portuguesa.svg' +import { ReactComponent as Matematica } from '../../img/subject_icons/subject_matematica.svg' +import { ReactComponent as OutrasLinguas } from '../../img/subject_icons/subject_outras-linguas.svg' +import { ReactComponent as Quimica } from '../../img/subject_icons/subject_quimica.svg' +import { ReactComponent as Sociologia } from '../../img/subject_icons/subject_sociologia.svg' +import { ReactComponent as Outros } from '../../img/subject_icons/subject_outros.svg' + + + +export function GetSubjectIconByName(subjName) { + switch (subjName) { + case "Arte": + return <Arte className="icon" /> + case "Biologia": + return <Biologia className="icon" /> + case "Ciências da Natureza": + return <CienciasNatureza className="icon" /> + case "Direitos Humanos": + return <DireitosHumanos className="icon" /> + case "Educação Ambiental": + return <EducacaoAmbiental className="icon" />; + case "Educação do Campo": + return <EducacaoCampo className="icon" />; + case "Educação Especial": + return <EducacaoEspecial className="icon" />; + case "Educação FÃsica": + return <EducacaoFisica className="icon" />; + case "Educação IndÃgena": + return <EducacaoIndigena className="icon" />; + case "Educação Quilombola": + return <EducacaoQuilombola className="icon" />; + case "Educação Sexual": + return <EducacaoSexual className="icon" />; + case "Ensino Religioso": + return <EnsinoReligioso className="icon" />; + case "Filosofia": + return <Filosofia className="icon" />;; + case "FÃsica": + return <Fisica className="icon" />; + case "Geografia": + return <Geografia className="icon" />; + case "História": + return <Historia className="icon" />; + case "Informática": + return <Informatica className="icon" />; + case "LÃngua Espanhola": + return <LinguaEspanhola className="icon" />; + case "LÃngua Inglesa": + return <LinguaInglesa className="icon" />; + case "LÃngua Portuguesa": + return <LinguaPortuguesa className="icon" />; + case "Matemática": + return <Matematica className="icon" />; + case "Outras LÃnguas": + return <OutrasLinguas className="icon" />; + case "QuÃmica": + return <Quimica className="icon" />; + case "Sociologia": + return <Sociologia className="icon" />; + default: + return <Outros className="icon" />; + } +} + +export default function GetIconByName(objName) { + switch (objName.toLowerCase()) { + case "imagem": + return <ImagemIcon className="icon" />; + case "mapa": + return <MapaIcon className="icon" />; + case "software educacional": + return <SoftwareEducacionalIcon className="icon" />; + case "plano de aula": + return <PlanoAulaIcon className="icon" />; + case "aplicativo móvel": + return <AplicativoMovelIcon className="icon" />; + case "apresentação": + return <ApresentacaoIcon className="icon" />; + case "áudio": + return <AudioIcon className="icon" />; + case "infográfico": + return <InfograficoIcon className="icon" />; + case "jogo": + return <JogoIcon className="icon" />; + case "livro digital": + return <LivroDigitalIcon className="icon" />; + case "texto": + return <TextoIcon className="icon" />; + case "vÃdeo": + return <VideoIcon className="icon" />; + case "animação": + return <AnimacaoIcon className="icon" />; + default: + return <OutrosIcon className="icon" />; + } +} diff --git a/src/Components/UploadPageComponents/ModalCancelar.js b/src/Components/UploadPageComponents/ModalCancelar.js new file mode 100644 index 0000000000000000000000000000000000000000..fcfbc9b273cb75e79e05910aed2946eba4a39eb6 --- /dev/null +++ b/src/Components/UploadPageComponents/ModalCancelar.js @@ -0,0 +1,159 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import { Button } from '@material-ui/core'; +import Modal from '@material-ui/core/Modal'; +import Backdrop from '@material-ui/core/Backdrop'; +import Fade from '@material-ui/core/Fade'; +import styled from 'styled-components' +import {Link} from 'react-router-dom' +import {deleteRequest} from '../HelperFunctions/getAxiosConfig.js' + +export default function ModalCancelar (props) { + + function handleSuccess (data) { + props.handleClose() + console.log('ir pra home') + + } + const handleDelete = () => { + // {/*delete the draft*/} + if (props.draftID) { + const url = `/learning_objects/${props.draftID}` + + deleteRequest(url, handleSuccess, (error) => {console.log(error)}) + } + } + + return ( + <StyledModal + aria-labelledby="transition-modal-title" + aria-describedby="transition-modal-description" + open={props.open} + centered="true" + closeAfterTransition + BackdropComponent={Backdrop} + onClose={props.handleClose} + BackdropProps={{ + timeout: 500, + }} + > + <Fade in={props.open}> + <Container> + <Content> + <h2>Tem certeza que deseja cancelar?</h2> + <p>Ao clicar no botão "OK", o seu recurso NÃO será salvo.</p> + </Content> + <ButtonsArea> + <StyledButton onClick={props.handleClose}>VOLTAR</StyledButton> + <Link to="/" style={{textDecoration : "none !important"}}> + <StyledButton onClick={handleDelete}>OK</StyledButton> + </Link> + </ButtonsArea> + </Container> + </Fade> + </StyledModal> + ) +} + +const ButtonsArea = styled.div` + display : flex; + align-items : center; + justify-content : flex-end; + padding-right : 8px; + padding-left : 16px; + min-height : 52px; +` + +const Content = styled.div` + padding : 24px; + overflow : visible; + max-width : 470px; + h2 { + margin-top : 0; + font-size : 20px; + font-weight : bold; + color : #666; + margin-bottom : 10px; + } + + p { + margin : 0 0 10px; + font-size : 14px; + color : #666; + } +` + + +const StyledModal = styled(Modal)` + .djXaxP{ + margin : 0 !important; + } + display : flex; + align-items: center; + justify-content : center; + padding : 10px !important; + max-width : none; + max-height : none; +` + +const Container = styled.div` + box-sizing : border-box; + background-color : white; + max-width : none; + align : center; + display : flex; + flex-direction : column; + min-width : 240px; + max-height : none; + position : relative; + border-radius : 4px; + box-shadow : 0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12); + + @media screen and (max-width : 599px) { + width : 100%; + height : 40%; + } +` +const StyledButton = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + max-height : 36px !important; + + background-color : transparent !important; + color : #00bcd4 !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; + + .button-text { + cursor : pointer; + line-height : 36px; + text-align : center; + color : currentColor; + white-space : nowrap; + text-transform : uppercase; + font-weight : 600 !important; + font-size : 14px; + font-style : inherit; + font-variant : inherit; + padding : 6px 16px !important; + } +` diff --git a/src/Components/UploadPageComponents/PartOne.js b/src/Components/UploadPageComponents/PartOne.js new file mode 100644 index 0000000000000000000000000000000000000000..fbb47cb5b0e325fa01cf5ba7666acd454a398134 --- /dev/null +++ b/src/Components/UploadPageComponents/PartOne.js @@ -0,0 +1,93 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, useEffect} from 'react' +import Grid from '@material-ui/core/Grid'; +import ButtonsDiv from './ButtonsDiv.js' +import SobreORecurso from './Forms/SobreORecurso.js' +import NewTitle from './Forms/NewTitle.js' +import Keywords from './Forms/Keywords.js' +import Autor from './Forms/Autor.js' +import TipoDeRecurso from './Forms/TipoDeRecurso.js' +import Idioma from './Forms/Idioma.js' +import {SendInfo} from './SendInfo.js' +import {getRequest} from '../HelperFunctions/getAxiosConfig.js' + +export default function PartOne (props) { + // {/*const [subjects, setSubjects] = useState([])*/} + const [languages, setLanguages] = useState([]) + const [objTypes, setObjTypes] = useState([]) + + function handleSuccessGetObjTypes (data) { + setObjTypes(data.sort((a, b) => (a.name) > (b.name) ? 1 : -1)) + } + useEffect( () => { + getRequest(`/object_types/`, handleSuccessGetObjTypes, (error) => {console.log(error)}) + + getRequest(`/languages/`, (data) => {setLanguages(data)}, (error) => {console.log(error)}) + }, []) + + const handleSubmit = () => { + props.stepperControl(1) + } + + return ( + <form onSubmit={handleSubmit}> + {/*------------------------------Titulo-----------------------------------------*/} + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <NewTitle draftID={props.draftID} onBlurCallback={SendInfo}/> + </Grid> + + {/*------------------------------Sobre------------------------------------------*/} + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <SobreORecurso draftID={props.draftID} onBlurCallback={SendInfo}/> + </Grid> + + {/*------------------------------Palavras-chave------------------------------------------*/} + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <Keywords draftID={props.draftID} onBlurCallback={SendInfo}/> + </Grid> + + {/*------------------------------Autor------------------------------------------*/} + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <Autor draftID={props.draftID} onBlurCallback={SendInfo}/> + </Grid> + + {/*------------------------------Tipo do Objeto------------------------------------------*/} + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <TipoDeRecurso objTypes={objTypes} draftID={props.draftID} onBlurCallback={SendInfo}/> + </Grid> + + {/*------------------------------Idioma------------------------------------------*/} + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <Idioma languages={languages} draftID={props.draftID} onBlurCallback={SendInfo}/> + </Grid> + + {/*------------------------------Botoes------------------------------------------*/} + <Grid item xs={12}> + <ButtonsDiv draftID={props.draftID} stepperControl={props.stepperControl}/> + </Grid> + + <Grid item xs={12} style={{marginTop : "20px"}}> + <span style={{marginTop : "20px", fontWeight : "200", color : "#a5a5a5", paddingLeft : "10px"}}> + * Campos obrigatórios + </span> + </Grid> + </form> + ) +} diff --git a/src/Components/UploadPageComponents/PartThree.js b/src/Components/UploadPageComponents/PartThree.js new file mode 100644 index 0000000000000000000000000000000000000000..b1eb3f564739b77c4c13ffb2e5e6a04a2699004d --- /dev/null +++ b/src/Components/UploadPageComponents/PartThree.js @@ -0,0 +1,488 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect, useContext } from 'react' +import { Store } from '../../Store.js' +import Grid from '@material-ui/core/Grid'; +import styled from 'styled-components' +import { apiDomain } from '../../env'; +import Stepper from './Stepper.js' +import Rating from '@material-ui/lab/Rating'; +import StarBorderIcon from '@material-ui/icons/StarBorder'; +import LoadingSpinner from '../LoadingSpinner.js' +import MoreIcon from '@material-ui/icons/More'; +import SdCardIcon from '@material-ui/icons/SdCard'; +import DateRangeIcon from '@material-ui/icons/DateRange'; +import UpdateIcon from '@material-ui/icons/Update'; +import TranslateIcon from '@material-ui/icons/Translate'; +import AssignmentIcon from '@material-ui/icons/Assignment'; +import { GrayButton, OrangeButton } from './StyledComponents'; +import ModalCancelar from './ModalCancelar.js' +import { getDefaultThumbnail } from '../HelperFunctions/getDefaultThumbnail' +import { getRequest } from '../HelperFunctions/getAxiosConfig.js' + +export default function PartThree(props) { + var moment = require('moment') + const { state } = useContext(Store) + const [loading, setLoading] = useState(false) + + const [draft, setDraft] = useState({}) + const [subjects, setSubjects] = useState('') + const [description, setDescription] = useState('') + const [author, setAuthor] = useState('') + + function handleSuccess(data) { + console.log(data.tags) + console.log(data.language) + console.log(data.subjects) + // console.log(data.tags) + + setDraft(data) + /*extract subjects*/ + setSubjects(data.subjects.map((subject)=>(subject.name)).join(', ')) + // setTags(data.tags.map(tag => tag.name)) + setDescription(data.description) + setAuthor(data.author) + setLoading(false) + } + + useEffect(() => { + setLoading(true) + if (state.currentUser.id !== "") { + const url = `/learning_objects/${props.draftID}` + + getRequest(url, handleSuccess, (error) => { console.log(error) }) + + } + }, [state.currentUser.id]) + + let windowWidth = window.innerWidth + const [modalCancelar, toggleModalCancelar] = useState(false) + + const checkAccessLevel = (levelToCheck) => { + if (state.currentUser.id !== '') { + return (checkUserRole(levelToCheck)) + } + } + + const checkUserRole = (userRole) => { + return (state.currentUser.roles.filter((role) => role.name === userRole).length > 0) + } + + return ( + <React.Fragment> + { + !loading ? + ( + <React.Fragment> + <ModalCancelar + open={modalCancelar} + handleClose={() => { toggleModalCancelar(false) }} + draftID={draft.id} + /> + <Grid container style={{ backgroundColor: "#f4f4f4" }}> + <Grid item xs={12}> + <StyledSessao1 className="page-content-preview"> + <div className="cabecalho"> + <div className="feedback-upload"> + <Stepper activeStep={props.activeStep} /> + <h2>Quase lá, agora só falta publicar!</h2> + <span className="subtitle">Veja abaixo como o seu Recurso vai aparecer na Plataforma:</span> + </div> + </div> + </StyledSessao1> + + <CaixaContainer> + <div> + <div className="cabecalho-objeto"> + <img alt="" className="img-objeto" + src={draft.thumbnail === null ? getDefaultThumbnail(draft.object_type) : apiDomain + draft.thumbnail} /> + <div className="texto-objeto"> + <h3>{draft.name}</h3> + <div className="rating-objeto"> + <Rating + name="customized-empty" + value={draft.score} + precision={0.5} + style={{ color: "#666" }} + emptyIcon={<StarBorderIcon fontSize="inherit" />} + /> + </div> + + <div className="relacionado"> + Relacionado com: {subjects} + </div> + + { + draft.tags && + <div className="tags-objeto"> + {draft.tags.map((tag) => { + return ( + <div className="tag" key={tag.name}>{tag.name}</div> + ) + })} + </div> + } + + </div> + </div> + + <div className="sobre-objeto"> + <Grid container> + <Grid item xs={windowWidth > 990 ? 7 : 12} className="left"> + <div className="titulo"> + Sobre o Recurso + </div> + <div className="sobre-conteudo"> + <p className="descricao">{description}</p> + { + author !== '' && + <p className="autor"> + <b>Autoria:</b> + <br /> + {author} + </p> + } + </div> + </Grid> + + <Grid item xs={windowWidth > 990 ? 4 : 12} className="right"> + <span className="meta-objeto"> + <MoreIcon /> <b>Tipo de mÃdia: </b>{draft.object_type} + </span> + + <span className="meta-objeto"> + <SdCardIcon /> <b>Tamanho: </b> + </span> + + <span className="meta-objeto"> + <DateRangeIcon /> <b>Enviado: </b> + {moment(draft.created_at).format("DD/MM/YYYY")} + </span> + + <span className="meta-objeto"> + <UpdateIcon /><b>Atualização: </b> + {moment(draft.updated_at).format("DD/MM/YYYY")} + </span> + + { draft.language && + draft.language.map((language => + <span className="meta-objeto" key={language.id}> + <TranslateIcon /><b>Idioma: </b>{language.name} + </span> + )) + } + + <span className="meta-objeto"> + <AssignmentIcon /><b>Licença: </b>{draft.license ? draft.license.name : ""} + </span> + </Grid> + </Grid> + </div> + </div> + </CaixaContainer> + <Sessao3> + <form> + <Grid container> + <Grid item xs={windowWidth > 990 ? 6 : 12} style={{ paddingRight: "15px", paddingLeft: "15px", textAlign: windowWidth > 990 ? 'right' : 'center' }}> + <span style={{ fontSize: "14px" }}> + Para segurança da plataforma <br /> marque que você não é um robô + </span> + </Grid> + + <Grid item xs={windowWidth > 990 ? 6 : 12} style={{ paddingRight: "15px", paddingLeft: "15px", textAlign: windowWidth > 990 ? 'left' : 'center' }}> + <span>Recaptcha</span> + </Grid> + <Grid item xs={12} style={{ paddingRight: "15px", paddingLeft: "15px", marginTop: "30px", textAlign: 'center' }}> + <GrayButton onClick={() => { props.stepperControl(-1) }}>VOLTAR</GrayButton> + <GrayButton onClick={() => { toggleModalCancelar(true) }}>CANCELAR</GrayButton> + { + checkAccessLevel("partner") ? + ( + <OrangeButton onClick={props.handlePost}>PUBLICAR RECURSO</OrangeButton> + ) + : + ( + <OrangeButton onClick={props.handleSubmit}>SUBMETER RECURSO</OrangeButton> + ) + + } + </Grid> + </Grid> + </form> + </Sessao3> + </Grid> + </Grid> + </React.Fragment> + ) + : + ( + <LoadingSpinner text="CARREGANDO" /> + ) + } + </React.Fragment> + ) +} + +const Sessao3 = styled.div` + position : relative; + top : -120px; + padding-right :15px; + padding-left :15px; + margin-right : auto; + margin-left : auto; + @media screen and (min-width: 768px) { + width : 750px; + } + @media screen and (min-width: 992px) { + width : 970px; + } + @media screen and (min-width: 1200px) { + width : 970px; + } + color : #666; + background-color : #f4f4f4; + +` + +const CaixaContainer = styled.div` + background-color : rgba(238,238,238,.5); + border-radius : 5px; + position : relative; + top : -145px; + padding : 10px; + + margin-right : auto; + margin-left : auto; + @media screen and (min-width: 768px) { + width : 750px; + } + @media screen and (min-width: 992px) { + width : 970px; + } + @media screen and (min-width: 1200px) { + width : 970px; + } + + + .cabecalho-objeto { + background-color:#fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 0; + margin-top: 30px; + margin-bottom: 30px; + position: relative; + min-height: 100px; + margin-top: 0; + margin-bottom: 10px; + color : #666; + + .img-objeto { + background-color:#e5e5e5; + height: 270px; + width: 400px; + float: left; + padding: 0; + } + + .texto-objeto { + padding: 20px 20px 0 20px; + height: content; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -ms-flex-line-pack: center; + align-content: center; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + + h3 { + font-size: 26px; + font-weight: 400; + margin: 0; + padding-bottom: 15px; + } + + .rating-objeto { + margin : 0; + display : inline-flex; + padding-bottom : 10px; + } + + .relacionado { + font-weight : 500; + font-size : 13px; + } + + .tags-objeto { + max-height: 54px; + font-size: .8em; + overflow: hidden; + clear: both; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + + .tag { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + margin-right: 3px; + background-color: #e5e5e5; + padding: 3px 7px; + border-radius: 15px; + line-height: 18px; + color: #666; + margin-bottom: 3px; + } + } + } + } + + .sobre-objeto { + margin-top : 0; + margin-bottom : 0; + min-height : 275px; + display : flex; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 0; + position: relative; + min-height: 500px; + + .left { + @media screen and (min-width : 990px) { + margin-left : 4% !important; + margin-top : 4% !important; + } + + @media screen and (max-width : 989px) { + margin : 0; + padding : 20px; + padding-bottom : 0; + } + + .titulo { + margin-top: 2% !important; + margin-bottom: 10px; + font-family: 'Roboto Light','Roboto Regular',Roboto; + font-weight: 300; + font-style: normal; + color:#666; + font-size: 1.857em; + } + + .sobre-conteudo { + flex : 1; + color : #666; + font-size : 14px !important; + + .descricao { + text-align: justify; + margin-bottom: 20px; + margin-top: 20px; + } + + .autor { + margin : 0 0 10px !important; + } + } + } + + .right { + margin-top : 4% !important; + border-left: 1px solid #e5e5e5; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + padding: 20px; + position : relative; + margin-bottom : 20px; + + .meta-objeto { + position: relative; + width: 100%; + font-size: 14px; + color: #666; + margin-bottom: 20px; + display : inline-block; + } + + .MuiSvgIcon-root { + vertical-align : middle !important; + margin-right : 15px !important; + } + } + } +} +` + +const StyledSessao1 = styled.div` + color : #fff; + background-color : #00bcd4; + float : none; + height : 300px; + text-align : center; + padding-top : 48px; + padding-bottom : 48px; + margin-bottom : 30px; + + .cabecalho { + display : flex; + flex-direction : column; + align-items : center; + margin-bottom : 30px; + + .feedback-upload { + display : flex; + flex-direction : column; + justify-content : center; + text-align : center + margin-top : 20px; + width : 55%; + } + + h2 { + margint-top : 0; + font-size : 26px; + font-weight : lighter; + margin-bottom : 10px; + } + + .subtitle { + font-size : 16px; + + } + } +` diff --git a/src/Components/UploadPageComponents/PartTwo.js b/src/Components/UploadPageComponents/PartTwo.js new file mode 100644 index 0000000000000000000000000000000000000000..221998c85f4e04e0a35204fcb89bd675b95b68f0 --- /dev/null +++ b/src/Components/UploadPageComponents/PartTwo.js @@ -0,0 +1,163 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, useEffect} from 'react' +import Grid from '@material-ui/core/Grid'; +import styled from 'styled-components' +import DragAndDropThumbnail from './PartTwoComponents/DragAndDropThumbnail' +import EducationalStage from './PartTwoComponents/EducationalStage' +import Licenca from './PartTwoComponents/Licenca' +import Checkbox from '@material-ui/core/Checkbox'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import FormControl from '@material-ui/core/FormControl'; +import {StyledFormLabel} from './StyledComponents.js' +import ButtonsDiv from './ButtonsDiv.js' +import SubjectsAndThemes from './PartTwoComponents/SubjectsAndThemes.js' +import {SendInfo} from './SendInfo.js' +import EditThumbnail from './PartTwoComponents/EditThumbnail.js' +import DisplayThumbnail from './PartTwoComponents/DisplayThumbnail.js' +import CustomCircularProgress from './PartTwoComponents/CustomCircularProgress'; +import {getRequest, putRequest} from '../HelperFunctions/getAxiosConfig.js' + +export function LoadingDiv () { + return ( + <div style={{width : "100%", display : "flex", alignItems : "center", justifyContent : "center", color : "#666"}}> + <CustomCircularProgress/> CARREGANDO IMAGEM + </div> + ) +} + +export default function PartTwo (props) { + const [eduStages, setEduStages] = useState([]) + const [subjects, setSubjects] = useState([]) + const [themes, setThemes] = useState([]) + + function handleSuccess (data) { + setSubjects(data.filter(subject => subject.theme === false).sort((a,b) => a.name > b.name ? 1 : -1)) + setThemes(data.filter(subject => subject.theme === true).sort((a,b) => a.name > b.name ? 1 : -1)) + } + + useEffect(() => { + getRequest(`/educational_stages/`, (data) => {setEduStages(data)}, (error) => {console.log(error)}) + + getRequest(`/subjects/`, handleSuccess, (error) => {console.log(error)}) + }, []) + + + /*------------------------Licenca------------------------*/ + + const [termsCheckbox, setChecked] = useState(false) + const toggleCheckbox = (event) => { + setChecked(event.target.checked) + } + + const [thumbnail, setThumbnail] = useState('') + const [tempUrl, setTempUrl] = useState('') + + const acceptFile = (file) => { + const objectURL = URL.createObjectURL(file) + console.log(file) + setTempUrl(objectURL) + setThumbnailStage('editing') + } + const updateThumb = (newThumbnail) => { + setThumbnail(newThumbnail) + console.log(thumbnail) + } + + const finalizeThumb = () => { + setThumbnailStage('uploading') + + const url = `/learning_objects/${props.draftID}` + + let fdThumb = new FormData() + fdThumb.set('learning_object[thumbnail]', thumbnail) + + putRequest(url, fdThumb, (data) => {setThumbnailStage('done')}, (error) => {console.log(error)}) + } + + const [thumbnailStage, setThumbnailStage] = useState('default') + + const chooseRenderStageThumbnail = () => { + switch(thumbnailStage) { + case 'uploading': + return (<LoadingDiv/>) + case 'done': + return (<DisplayThumbnail acceptFile={acceptFile} thumbnail={thumbnail}/>) + case 'editing': + return (<EditThumbnail finalizeThumb={finalizeThumb} tempImgURL={tempUrl} updateThumb={updateThumb}/>) + default : + return (<DragAndDropThumbnail acceptFile={acceptFile}/>) + + } + } + + const handleSubmit = () => { + props.stepperControl(1) + } + + return ( + <form style={{width : "100%"}} onSubmit={handleSubmit}> + <Grid item xs={12} style={{paddingBottom : "40px"}}> + {chooseRenderStageThumbnail()} + </Grid> + + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <EducationalStage draftID={props.draftID} eduStages={eduStages} onBlurCallback={SendInfo}/> + </Grid> + + <SubjectsAndThemes draftID={props.draftID} subjects={subjects} themes={themes} onUploadPage={true} onBlurCallback={SendInfo}/> + + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <Licenca draftID={props.draftID} onBlurCallback={SendInfo}/> + </Grid> + + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <StyledFormControl required > + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}} onClick={() => window.open("/termos/", "_blank")}> + <b>Confirme se você concorda com os <strong style={{color : "#ff7f00"}}>termos de uso e de propriedade intelectual</strong></b> + </StyledFormLabel> + <FormControlLabel label={<span className="label">Li e concordo com os termos de uso e de propriedade intelectual.</span>} control={<Checkbox checked={termsCheckbox} onChange={toggleCheckbox}/>} + /> + </StyledFormControl> + </Grid> + + <Grid item xs={12}> + <ButtonsDiv draftID={props.draftID} stepperControl={props.stepperControl} onPartTwo={true}/> + </Grid> + + <Grid item xs={12} style={{marginTop : "20px"}}> + <span style={{marginTop : "20px", fontWeight : "200", color : "#a5a5a5", paddingLeft : "10px"}}> + * Campos obrigatórios + </span> + </Grid> + </form> + ) +} + +const StyledFormControl = styled(FormControl)` + .MuiCheckbox-colorSecondary.Mui-checked { + color : #00bcd4 !important; + } + + .label { + font-size : 14px !important; + color : #666 !important; + font-weight : 200 !important; + } +` diff --git a/src/Components/UploadPageComponents/PartTwoComponents/CustomCircularProgress.js b/src/Components/UploadPageComponents/PartTwoComponents/CustomCircularProgress.js new file mode 100644 index 0000000000000000000000000000000000000000..2164091858560e3cb63f0c43099de40e2606b741 --- /dev/null +++ b/src/Components/UploadPageComponents/PartTwoComponents/CustomCircularProgress.js @@ -0,0 +1,35 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import CircularProgress from '@material-ui/core/CircularProgress'; + +const useStyles = makeStyles((theme) => ({ + root: { + color : "#666", + }, +})); + +export default function CustomCircularProgress () { + const classes = useStyles(); + + return ( + <CircularProgress className={classes.root}/> + ); +} diff --git a/src/Components/UploadPageComponents/PartTwoComponents/DisplayThumbnail.js b/src/Components/UploadPageComponents/PartTwoComponents/DisplayThumbnail.js new file mode 100644 index 0000000000000000000000000000000000000000..0c07e151670e4a256ed971abb978dad7b3107c5b --- /dev/null +++ b/src/Components/UploadPageComponents/PartTwoComponents/DisplayThumbnail.js @@ -0,0 +1,132 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import {StyledFormLabel} from '../StyledComponents.js' +import AddAPhotoIcon from '@material-ui/icons/AddAPhoto'; +import Grid from '@material-ui/core/Grid'; +import styled from 'styled-components' + +export default function DisplayThumbnail (props) { + let windowWidth = window.innerWidth + + const handleUpload = (e, selectorFiles) => { + e.preventDefault(); + props.acceptFile(selectorFiles[0]) + } + + return ( + <React.Fragment> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + { + props.onEditPage ? + ( + <b style={{fontWeight : "ligther"}}>Imagem ilustrativa do recurso</b> + ) + : + ( + <> + <b>Editando Imagem</b> + <span style={{color : "#a5a5a5"}}>(Deixe seu recurso completo, para que todos o entendam melhor.)</span> + </> + ) + } + </StyledFormLabel> + <ImagemCarregada container> + <Grid item xs={windowWidth > 990 ? 6 : 12}> + <div className="img-preview"> + <img alt="" src={props.thumbnail}/> + <div className="alterar-imagem"> + <input type="file" onChange = {(e) => handleUpload(e, e.target.files)} id="upload-file-thumbnail" style={{display : "none"}} + /> + <label htmlFor="upload-file-thumbnail" style={{height : "100%", width : "inherit", cursor : "pointer"}}> + <div className="interacoes"> + SUBSTITUIR <AddAPhotoIcon/> + </div> + </label> + <div className="interacoes" onClick={() => {props.handleDelete()}}> + DELETAR <AddAPhotoIcon/> + </div> + </div> + </div> + </Grid> + <Grid item xs={windowWidth > 990 ? 6 : 12}> + <div className="aviso-imagem-carregada"> + Sua imagem foi enviada, porém pode ser que demore alguns minutos até nosso servidor atualiza-la na página do recurso. + </div> + </Grid> + </ImagemCarregada> + </React.Fragment> + ) +} + +const ImagemCarregada = styled(Grid)` + .aviso-imagem-carregada { + color :#a5a5a5; + font-size : 12px; + font-weight : 500; + text-align : justify; + float : right; + margin-right : 20px; + + @media screen and (min-width : 990px) { + padding-top : 20px; + padding-left : 10px; + } + } + + .img-preview { + display : block; + max-height : 500px; + overflow : hidden; + border-radius : 10px; + position : relative; + + .alterar-imagem{ + position : absolute; + bottom : 0; + display : flex; + flex-direction : row; + width : 100%; + justify-content : flex-end; + background-color : rgba(0,0,0,.5); + + .interacoes { + cursor : pointer; + display : flex; + justify-content : flex-end; + align-items : flex-end; + height : 100%; + padding : 10px; + color : #fff; + font-size : 14px; + .MuiSvgIcon-root { + vertical-align : middle !important; + } + } + } + + img { + height : 100%; + width : 100%; + object-fit : cover; + border-radius : 10px; + border : 0; + } + } +` diff --git a/src/Components/UploadPageComponents/PartTwoComponents/DragAndDropThumbnail.js b/src/Components/UploadPageComponents/PartTwoComponents/DragAndDropThumbnail.js new file mode 100644 index 0000000000000000000000000000000000000000..59423e607f7d2395c498a12f7e2a2f6efc5e7e5a --- /dev/null +++ b/src/Components/UploadPageComponents/PartTwoComponents/DragAndDropThumbnail.js @@ -0,0 +1,105 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react' +import {DottedBox, BlueButton} from '../StyledComponents.js'; +import AddAPhotoIcon from '@material-ui/icons/AddAPhoto'; +import FormControl from '@material-ui/core/FormControl'; +import {StyledFormLabel} from '../StyledComponents.js' + +export default function DragAndDropThumbnail (props) { + const [dropDepth, setDropDepth] = useState(0) + // eslint-disable-next-line + const [inDropZone, toggleInDropZone] = useState(false) + + const handleDragEnter = e => { + e.preventDefault(); + e.stopPropagation(); + + setDropDepth(dropDepth + 1) + }; + + const handleDragLeave = e => { + e.preventDefault(); + e.stopPropagation(); + + setDropDepth(dropDepth - 1) + if (dropDepth > 0) + toggleInDropZone(true) + }; + + const handleDragOver = e => { + e.preventDefault(); + e.stopPropagation(); + e.dataTransfer.dropEffect = 'copy'; + toggleInDropZone(true) + }; + + const handleDrop = e => { + e.preventDefault(); + e.stopPropagation(); + let files = [...e.dataTransfer.files] + if (files && files.length > 0) { + props.acceptFile(files) + } + }; + + const handleUpload = (e, selectorFiles) => { + e.preventDefault(); + props.acceptFile(selectorFiles[0]) + } + return ( + <FormControl style={{width : "100%"}}> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + { + props.onEditPage ? + ( + <b style={{textAlign : "center", fontSize : "26px", fontWeight : "ligther"}}>Inserir Imagem Ilustrativa</b> + ) + : + ( + <> + <b>Imagem Ilustrativa do Recurso</b> <span style={{color : "#a5a5a5"}}>(Deixe seu recurso completo, para que todos o entendam melhor.)</span> + </> + ) + } + </StyledFormLabel> + <DottedBox + onDrop={e => handleDrop(e)} + onDragOver={e => handleDragOver(e)} + onDragEnter={e => handleDragEnter(e)} + onDragLeave={e => handleDragLeave(e)} + thumbnail + > + <AddAPhotoIcon className="icon"/> + <input + type="file" + onChange = {(e) => handleUpload(e, e.target.files)} + id="upload-file-thumbnail" + style={{display : "none"}} + /> + <BlueButton> + <label htmlFor="upload-file-thumbnail" style={{width : "inherit", cursor : "pointer"}}> + ESCOLHER IMAGEM + </label> + </BlueButton> + <span style={{marginTop : "6px"}}>Ou arrastar e soltar o arquivo aqui</span> + </DottedBox> + </FormControl> + ) +} diff --git a/src/Components/UploadPageComponents/PartTwoComponents/EditThumbnail.js b/src/Components/UploadPageComponents/PartTwoComponents/EditThumbnail.js new file mode 100644 index 0000000000000000000000000000000000000000..7cce6bf2058f9c6512430053e27d6ed04f479800 --- /dev/null +++ b/src/Components/UploadPageComponents/PartTwoComponents/EditThumbnail.js @@ -0,0 +1,55 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react' +import {StyledFormLabel} from '../StyledComponents.js' +import Cropper from '../../Cropper' +import { Button } from '@material-ui/core'; +import styled from 'styled-components' + +export default function EditThumbnail (props) { + const [crop] = useState({ + unit: "%" , + width : 100, + aspect: 9/3 + }); + return ( + <> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + <b>Editando Imagem</b> <span style={{color : "#a5a5a5"}}>(Deixe seu recurso completo, para que todos o entendam melhor.)</span> + </StyledFormLabel> + <div style={{display : "flex", alignItems : "center", flexDirection : "column"}}> + <div style={{maxWidth : "500px", maxHeight : "300px", padding : "20px"}}> + <Cropper src={props.tempImgURL} crop={crop} circularCrop={false} update={props.updateThumb}/> + </div> + <StyledButton onClick={() => {props.finalizeThumb()}}>SELECIONAR IMAGEM</StyledButton> + </div> + </> + + ) +} + +const StyledButton = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + background-color : #fff !important; + border : solid 1px #00bcd4 !important; + font-weight : 600 !important; + color : #00bcd4 !important; +` diff --git a/src/Components/UploadPageComponents/PartTwoComponents/EducationalStage.js b/src/Components/UploadPageComponents/PartTwoComponents/EducationalStage.js new file mode 100644 index 0000000000000000000000000000000000000000..96da308ae7eaf9c2eb942033bf707f567649e3ff --- /dev/null +++ b/src/Components/UploadPageComponents/PartTwoComponents/EducationalStage.js @@ -0,0 +1,63 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react' +import FormControl from '@material-ui/core/FormControl'; +import {StyledFormLabel} from '../StyledComponents.js' +import Checkbox from '@material-ui/core/Checkbox'; +import FormGroup from '@material-ui/core/FormGroup'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import styled from 'styled-components' + +export default function EducationalStage (props) { + + const [selected, setSelect] = useState(props.initialValue ? props.initialValue : []) + const handleSet = (event) => { + let newValue = event.target.value + + if(selected.indexOf(newValue) > - 1) { + setSelect(selected.filter(item => item !== newValue)) + } + else { + setSelect(selected => [...selected, event.target.value]) + } + } + + return ( + <FormControl required style={{minWidth : "30%"}}> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + <b>NÃvel de ensino</b> <span style={{color : "#a5a5a5"}}>(Selecione uma ou mais opções)</span> + </StyledFormLabel> + <StyledFormGroup onBlur={() => {props.onBlurCallback("educational_stages", selected, props.draftID)}}> + { + props.eduStages.map(stage => + <FormControlLabel key={stage.id} label={stage.name} + control={<Checkbox checked={selected.indexOf(String(stage.id)) > - 1} value={stage.id} onChange={handleSet}/>}/> + ) + } + </StyledFormGroup> + </FormControl> + + ) +} + +const StyledFormGroup = styled(FormGroup)` + .MuiCheckbox-colorSecondary.Mui-checked { + color : #00bcd4 !important; + } +` diff --git a/src/Components/UploadPageComponents/PartTwoComponents/Licenca.js b/src/Components/UploadPageComponents/PartTwoComponents/Licenca.js new file mode 100644 index 0000000000000000000000000000000000000000..9e8e059aed392a5791d6e11ee8e1b492803585eb --- /dev/null +++ b/src/Components/UploadPageComponents/PartTwoComponents/Licenca.js @@ -0,0 +1,87 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, memo} from 'react' +import styled from 'styled-components' +import FormControl from '@material-ui/core/FormControl'; +import {StyledFormLabel} from '../StyledComponents.js' +import RadioGroup from '@material-ui/core/RadioGroup'; +import Radio from '@material-ui/core/Radio'; +import FormControlLabel from '@material-ui/core/FormControlLabel'; + +function Licenca (props) { + + const options = [ + {name : "CC BY", description : "(Esta licença permite que outros distribuam, remixem, adaptem e criem a partir do seu trabalho, mesmo para fins comerciais, desde que lhe atribuam o devido crédito pela criação original)", id : 1}, + + {name : "CC BY-SA", description : "(Esta licença permite que outros remixem, adaptem e criem a partir do seu trabalho, mesmo para fins comerciais, desde que lhe atribuam o devido crédito e que licenciem as novas criações sob termos idênticos)", id : 2}, + + {name : "CC BY-NC", description : "(Esta licença permite que outros remixem, adaptem e criem a partir do seu trabalho para fins não comerciais e, embora os novos trabalhos tenham de lhe atribuir o devido crédito e não possam ser usados para fins comerciais, os usuários não têm de licenciar esses trabalhos derivados sob os mesmos termos)", id : 4}, + + {name : "CC BY-NC SA", description : "(Esta licença permite que outros remixem, adaptem e criem a partir do seu trabalho para fins não comerciais, desde que atribuam o devido crédito e que licenciem as novas criações sob termos idênticos)", id : 5}, + + {name : "CC BY-NC-ND 3.0 BR", description : "(Atribuição-NãoComercial-SemDerivações 3.0 Brasil. Esta licença permite compartilhar, copiar e redistribuir o material em qualquer suporte ou formato)", id : 12} + ] + + const [value, setValue] = useState(props.initialValue ? props.initialValue : -1) + const handleChange = (event) => {setValue(Number(event.target.value))} + + return ( + <FormControl required="true" style={{width : "100%"}}> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + <b>Licença do Uso do Conteúdo</b> <a href="https://br.creativecommons.org/licencas/" style={{color : "#ff7f00", textDecoration : "underline"}}>Saiba mais</a> + </StyledFormLabel> + <StyledRadioGroup aria-label="Tipo de Recurso" name="Tipo de Recurso" row value={value} onChange={handleChange} style={{justifyContent : "center"}} onBlur={() => {props.onBlurCallback("license_id", value, props.draftID)}}> + { + options.map( (option) => + <FormControlLabel key={option.id} value={option.id} + control={<Radio />} + label={ + <span className="title">{option.name} + <span className="parentese"> {option.description}</span> + </span> + } + /> + ) + + } + </StyledRadioGroup> + </FormControl> + ) +} + +export default memo(Licenca) + +const StyledRadioGroup = styled(RadioGroup)` + .MuiFormControlLabel-root { + display : block !important; + margin-bottom : 16px !important; + } + + .title { + font-size: 14px; + font-weight: 600; + color:#666; + padding-left: 2px; + } + .parentese { + font-weight: 200; + color:#a5a5a5; + padding-left: 10px; + } +` diff --git a/src/Components/UploadPageComponents/PartTwoComponents/SubjectsAndThemes.js b/src/Components/UploadPageComponents/PartTwoComponents/SubjectsAndThemes.js new file mode 100644 index 0000000000000000000000000000000000000000..326dec2320b864be6820e9ec1182db9aa2066688 --- /dev/null +++ b/src/Components/UploadPageComponents/PartTwoComponents/SubjectsAndThemes.js @@ -0,0 +1,137 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, memo} from 'react' +import { makeStyles } from '@material-ui/core/styles'; +import FormControl from '@material-ui/core/FormControl'; +import {ObjTypeBox, StyledFormLabel} from '../StyledComponents.js' +import FormGroup from '@material-ui/core/FormGroup'; +import {GetSubjectIconByName} from '../GetIconByName.js' +import FormControlLabel from '@material-ui/core/FormControlLabel'; +import Checkbox from '@material-ui/core/Checkbox'; +import Grid from '@material-ui/core/Grid'; + +const useStyles = makeStyles({ + root: { + '&:hover': { + backgroundColor: 'transparent', + }, +}}) + +function StyledCheckbox (props) { + const classes = useStyles(); + return ( + <Checkbox + className={classes.root} + disableRipple + checkedIcon = { + <ObjTypeBox checked> + <span> + {GetSubjectIconByName(props.label)} + <p>{props.label}</p> + </span> + </ObjTypeBox> + } + icon = { + <ObjTypeBox> + <span> + {GetSubjectIconByName(props.label)} + <p>{props.label}</p> + </span> + </ObjTypeBox> + } + {...props} + /> + ) +} + + +function SubjectsAndThemes (props) { + const [value, setValue] = useState(props.initialValue ? props.initialValue : []) + + const handleChange = (event) => { + const newValue = event.target.value + + if((value.indexOf(newValue) > -1)) { + setValue(value.filter(item => item !== newValue)) + } + else { + setValue(value => [...value, newValue]) + } + } + + return ( + <React.Fragment> + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <FormControl required style={{width : "100%"}}> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + <b>Componente curricular</b> <span>(Selecione uma ou mais opções)</span> + </StyledFormLabel> + <FormGroup row style={{justifyContent : "center"}} onBlur={() => {props.onBlurCallback("subjects", value, props.draftID)}}> + { + props.subjects.map( (subject) => + <> + <FormControlLabel key={subject.id} value={subject.id} + control={ + <StyledCheckbox + label={subject.name} + checked={value.indexOf(String(subject.id)) > -1} + onChange={handleChange} + />} + /> + </> + ) + + } + </FormGroup> + </FormControl> + </Grid> + + { + + props.onUploadPage && + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <FormControl style={{width : "100%"}}> + <StyledFormLabel component="legend" style={{fontSize : "14px", marginBottom : "10px"}}> + <b>Outras Temáticas</b> + </StyledFormLabel> + <FormGroup aria-label="Tipo de Recurso" name="Tipo de Recurso" row style={{justifyContent : "center"}} onBlur={() => {props.onBlurCallback("subjects", value, props.draftID)}}> + { + props.themes.map( (theme) => + <FormControlLabel key={theme.id} value={theme.id} + control={ + <StyledCheckbox + label={theme.name} + checked={value.indexOf(String(theme.id)) > -1} + onChange={handleChange} + + /> + } + /> + ) + + } + </FormGroup> + </FormControl> + </Grid> + } + </React.Fragment> + ) +} + +export default memo(SubjectsAndThemes) diff --git a/src/Components/UploadPageComponents/ReactFileToUpload.js b/src/Components/UploadPageComponents/ReactFileToUpload.js new file mode 100644 index 0000000000000000000000000000000000000000..ffbd6a452bddfe13eb14c996498ca17a897af2de --- /dev/null +++ b/src/Components/UploadPageComponents/ReactFileToUpload.js @@ -0,0 +1,113 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, useEffect} from 'react' +import CloudUploadIcon from '@material-ui/icons/CloudUpload'; +import {DottedBox, BlueButton} from './StyledComponents.js'; +import {getAxiosConfigFromJSON, updateHeaders} from '../HelperFunctions/getAxiosConfig.js' +import AddAPhotoIcon from '@material-ui/icons/AddAPhoto'; +import axios from 'axios' +import {apiUrl} from '../../env'; + +export default function ReactFileToUpload (props) { + const [fileToUpload, setFileToUpload] = useState(null); + const chunkSize = 262144 + const uploadUrl = `${apiUrl}/learning_objects/` + props.draftID + '/chunk' + const [fileName, setFileName] = useState(null) + const [fileSize, setFileSize] = useState(null) + const [fileDoneUploading, setFileDoneUploading] = useState(false) + + async function onFileChange (e) { + const files = e.target.files; + if(!files) return; + + let newFile = e.target.files[0] + console.log(newFile) + setFileToUpload(newFile); + setFileName(newFile.name) + setFileSize(newFile.size) + + let total = Math.ceil(newFile.size/chunkSize) + let currentChunkStartByte = 0; + let currentChunkFinalByte = chunkSize > newFile.size ? newFile.size : chunkSize; + let chunkIdentifier = props.draftID + '-' + newFile.name; + let remainingBytes = 0 + + for (var i = 0; i < total; i++) { + let chunk = newFile.slice(currentChunkStartByte, currentChunkFinalByte) + let config = getAxiosConfigFromJSON() + let formData = new FormData() + formData.append('_chunkFilename', newFile.name); + formData.append('_chunkIdentifier', chunkIdentifier); + formData.append('_totalChunks', total); + formData.append('_chunkSize', chunkSize); + formData.append('_currentChunkSize', chunk.size); + formData.append('_chunkNumber', i); + formData.append('_totalSize', newFile.size); + formData.append('file', chunk); + + try { + const response = await axios.post(uploadUrl, formData, config); + console.log(response) + if (response.headers['access-token']) { + updateHeaders(response.headers) + } + remainingBytes = newFile.size - currentChunkFinalByte; + if (currentChunkFinalByte === newFile.size) { + setFileDoneUploading(true) + } + else if (remainingBytes < chunkSize) { + currentChunkStartByte = currentChunkFinalByte; + currentChunkFinalByte = currentChunkStartByte + remainingBytes; + } + else { + currentChunkStartByte = currentChunkFinalByte; + currentChunkFinalByte = currentChunkStartByte + chunkSize; + } + } catch (error) { + console.log(error) + } + } + }; + + return ( + <div className="upload-container"> + <h2 className="upload-title">File Uploader</h2> + <div className="upload-form"> + <form id="file_upload"> + <DottedBox + > + <AddAPhotoIcon className="icon"/> + <input + type="file" + onChange = {onFileChange} + id="upload-file-thumbnail" + style={{display : "none"}} + /> + <BlueButton> + <label htmlFor="upload-file-thumbnail" style={{width : "inherit", cursor : "pointer"}}> + ESCOLHER IMAGEM + </label> + </BlueButton> + <span style={{marginTop : "6px"}}>Ou arrastar e soltar o arquivo aqui</span> + </DottedBox> + </form> + </div> + </div> + ) +} diff --git a/src/Components/UploadPageComponents/SendInfo.js b/src/Components/UploadPageComponents/SendInfo.js new file mode 100644 index 0000000000000000000000000000000000000000..ebcb1b95f377fe018e3a178716ff7d1621009dba --- /dev/null +++ b/src/Components/UploadPageComponents/SendInfo.js @@ -0,0 +1,41 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import {putRequest} from '../HelperFunctions/getAxiosConfig.js' + + +export function SendInfo (fieldName, payload, draftID) { + const key = fieldName + let value = payload + if (key === "tags") { + value = payload.map( (tag, index) => + index = { "name" : tag} + ) + } + + const putObject = { + "learning_object" : { + "id" : draftID + } + } + putObject.learning_object[key] = value + + const url = `/learning_objects/${draftID}` + + putRequest(url, putObject, (data) => {console.log(data)}, (error) => {console.log(error)}) +} diff --git a/src/Components/UploadPageComponents/Stepper.js b/src/Components/UploadPageComponents/Stepper.js new file mode 100644 index 0000000000000000000000000000000000000000..c1f9d40f55c2e4aafba0c44282ed441077853bf0 --- /dev/null +++ b/src/Components/UploadPageComponents/Stepper.js @@ -0,0 +1,177 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components' +import PropTypes from 'prop-types'; +import { makeStyles } from '@material-ui/core/styles'; +import clsx from 'clsx'; +import Stepper from '@material-ui/core/Stepper'; +import Step from '@material-ui/core/Step'; +import StepLabel from '@material-ui/core/StepLabel'; +import Check from '@material-ui/icons/Check'; + +const useColorlibStepIconStyles = makeStyles({ + root: { + backgroundColor: '#fff', + color: '#00bcd4', + width: 36, + height: 36, + display: 'flex', + border : 'solid 3px #00bcd4', + borderRadius: '50%', + justifyContent: 'center', + alignItems: 'center', + }, + active: { + backgroundColor : '#00bcd4', + color : '#fff', + }, + completed: { + backgroundColor : '#00bcd4', + color : '#fff', + }, +}); + +function ColorlibStepIcon(props) { + const classes = useColorlibStepIconStyles(); + const { active, completed } = props; + + const icons = { + 1: '1', + 2: '2', + 3: '3', + }; + + return ( + <div + className={clsx(classes.root, { + [classes.active]: active, + [classes.completed]: completed, + })} + > + {completed ? <Check className={classes.completed} /> : icons[String(props.icon)]} + </div> + ); +} + +ColorlibStepIcon.propTypes = { + /** + * Whether this step is active. + */ + active: PropTypes.bool, + /** + * Mark the step as completed. Is passed to child components. + */ + completed: PropTypes.bool, + /** + * The label displayed in the step icon. + */ + icon: PropTypes.node, +}; + +// const useStyles = makeStyles((theme) => ({ +// root: { +// width: '100%', +// }, +// button: { +// marginRight: theme.spacing(1), +// }, +// instructions: { +// marginTop: theme.spacing(1), +// marginBottom: theme.spacing(1), +// }, +// })); + +function getSteps() { + return ['Select campaign settings', 'Create an ad group', 'Create an ad']; +} + +// function getStepContent(step) { +// switch (step) { +// case 0: +// return 'Select campaign settings...'; +// case 1: +// return 'What is an ad group anyways?'; +// case 2: +// return 'This is the bit I really care about!'; +// default: +// return 'Unknown step'; +// } +// } + +export default function CustomizedSteppers(props) { + // const classes = useStyles(); + const steps = getSteps(); + +// {/* const handleNext = () => { +// setActiveStep((prevActiveStep) => prevActiveStep + 1); +// }; + +// const handleBack = () => { +// setActiveStep((prevActiveStep) => prevActiveStep - 1); +// }; + +// const handleReset = () => { +// setActiveStep(0); +// };*/} + + return ( + + <> + <StyledStepper style={{backgroundColor : "#e5e5e5", borderRadius : "50px", justifyContent : "space-between"}} activeStep={props.activeStep} connector={<></>}> + {steps.map((label) => ( + <Step key={label}> + <StepLabel StepIconComponent={ColorlibStepIcon}/> + </Step> + ))} + </StyledStepper> + {/*<div> + {activeStep === steps.length ? ( + <div> + <Button onClick={handleReset} className={classes.button}> + Reset + </Button> + </div> + ) : ( + <div> + <Typography className={classes.instructions}>{getStepContent(activeStep)}</Typography> + <div> + <Button disabled={activeStep === 0} onClick={handleBack} className={classes.button}> + Back + </Button> + <Button + variant="contained" + color="primary" + onClick={handleNext} + className={classes.button} + > + {activeStep === steps.length - 1 ? 'Finish' : 'Next'} + </Button> + </div> + </div> + )} + </div>*/} + </> + ); +} + +const StyledStepper = styled(Stepper)` + padding : 7px !important; + +` diff --git a/src/Components/UploadPageComponents/StyledComponents.js b/src/Components/UploadPageComponents/StyledComponents.js new file mode 100644 index 0000000000000000000000000000000000000000..3c157e6f38eceec0f2376bcba6a8328fb6b64abe --- /dev/null +++ b/src/Components/UploadPageComponents/StyledComponents.js @@ -0,0 +1,494 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react' +import styled from 'styled-components' +import { Button } from '@material-ui/core'; +import TextField from '@material-ui/core/TextField'; +import FormHelperText from '@material-ui/core/FormHelperText'; +import FormLabel from '@material-ui/core/FormLabel'; +import { makeStyles } from '@material-ui/core/styles'; +import Radio from '@material-ui/core/Radio'; +import GetIconByName from './GetIconByName.js' + +export const StyledFormHelperText = styled(FormHelperText)` + .MuiFormHelperText-root { + text-align : right !important; + } +` + +export const DottedBox = styled.div` + align-self : center; + /* width : ${props => props.thumbnail ? "100%" : "320px"}; */ + background-color : ${props => props.thumbnail ? "transparent" : "#f4f4f4"}; + border : ${props => props.thumbnail ? "2px dashed #a5a5a5" : "2px dashed #00bcd4"}; + align-items : center; + border-radius : 10px; + display : flex; + flex-direction : column; + padding : 20px 0; + color : ${props => props.thumbnail ? "#a5a5a5" : "$666"}; + + .icon { + font-size : 40px !important; + color : #00bcd4 !important; + margin-bottom : 10px !important; + vertical-align : middle !important; + font-weight : normal !important; + font-style : normal !important; + line-height : 1 !important; + letter-spacing : normal !important; + text-transform : none !important; + display : inline-block !important; + white-space : nowrap !important; + word-wrap : normal !important; + direction : ltr !important; + padding-right : 2px; + } +` + +export const BlueButton = styled(Button)` + &:hover { + background-color : #00acc1 !important; + } + color : #fff !important; + background-color : #00bcd4 !important; + height : 36px !important; + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + font-weight : 600 !important; + min-width : 88px !important; + align-self : center !important; + padding : 16px !important; +` + +export const GrayButton = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + height : 36px !important; + font-weight : 600 !important; + color : #666 !important; + background-color: transparent; + min-width : 88px !important; + height : 36px !important; + margin-left : 8px !important; + margin-right : 8px !important; + .icon { + vertical-align : middle !important; + font-weight : normal !important; + font-style : normal !important; + font-size : 24px !important; + line-height : 1 !important; + letter-spacing : normal !important; + text-transform : none !important; + display : inline-block !important; + white-space : nowrap !important; + word-wrap : normal !important; + direction : ltr !important; + padding-right : 2px; + color : inherit !important; + } + + .button-text { + cursor : pointer; + line-height : 36px; + text-align : center; + color : currentColor; + white-space : nowrap; + text-transform : uppercase; + font-weight : 600; + font-size : 14px; + font-style : inherit; + font-variant : inherit; + } +` + +export const WrapperBox = styled.div` + padding : 0; + margin-bottom : 15px; + display : block; + border-radius : 3px; + box-shadow : 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + background-color : #fff; + font-size : 14px; + + .inner { + display : block; + padding : 20px; + } + + .upload-title { + text-align : center; + font-size : 26px; + margin-bottom : 10px; + font-weight : lighter; + } + + .flex-column { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + + p { + margin : 0 0 10px; + } + + .buttons-div { + padding-top : 10px; + padding-left : 15px; + padding-right : 15px; + display: flex; + flex-direction : row; + justify-content : space-evenly; + text-align : center; + } + } + + .strike-box { + display : flex; + flex-direction : row; + justify-content : center; + + .strike { + border-bottom : solid 1px #e5e5e5; + display : inline-block; + vertical-align : middle; + width : 40%; + margin-bottom : 2em; + } + + h3 { + margin : 20px 0; + font-weight : 400; + overflow : hidden; + text-align : center; + font-size : 14px; + color : #666; + padding : 0 5px; + } + } + + .enviar-link-texto { + padding-left : 15px; + padding-right : 15px; + text-align : center; + font-size : 14px; + margin-bottom : 5px; + + img { + height : 35px; + vertical-align : middle; + } + } + + .uploading { + margin-top : 30px; + + .upload-item { + margin-bottom : 5px; + + .item-info { + display : flex; + flex-direction : row; + justify-content : space-between; + align-items : center; + padding : 5px 0; + font-size : 14px; + + .icon { + vertical-align : middle !important; + font-weight : normal !important; + font-style : normal !important; + font-size : 24px !important; + line-height : 1 !important; + letter-spacing : normal !important; + text-transform : none !important; + display : inline-block !important; + white-space : nowrap !important; + word-wrap : normal !important; + direction : ltr !important; + padding-right : 2px; + } + + .file-status { + .icon-margin { + color : #00bcd4; + margin-right : 5px; + } + .MuiLinearProgress-root { + width : 100% !important; + } + } + + .icon-remove { + color : #666; + font-size : 20px; + } + } + } + + .warning { + padding: 40px 0 20px 0; + margin-top: 40px; + border-top: solid 1px #f4f4f4; + text-align: center; + + span { + font-size : 16px; + font-weight : lighter; + } + } + } +` + +export const InfoBox = styled.div` + background-color : #fff; + padding : 30px; + box-shadow : 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-bottom : 30px; + border-radius : 3px; + + .cabecalho { + display : flex; + flex-direction : column; + align-items : center; + margin-bottom : 30px; + + h2 { + margin-top : 0; + font-size : 26px; + font-weight : lighter; + margin-bottom : 10px; + } + + .feedback-upload { + display : flex; + flex-direction : column; + justify-content : center; + text-align : center + margin-top : 20px; + width : 65%; + } + } +` +export const ObjTypeBox = styled.div` + height : 100px; + width : 100px; + border-radius : 10px; + background-color : ${props => props.checked ? "#00bcd4" : "#f4f4f4"}; + color : ${props => props.checked ? "#fff" : "#00bcd4"}; + + span { + padding-top : 5%; + display : flex; + flex-direction : column; + justify-content : center; + + .icon { + color : inherit; + align-self : center; + height : 48px; + width : 48px; + } + + p { + height : 28px; + font-size : 14px; + text-align : center; + line-height : 14px; + } + + svg path { + fill : ${props => props.checked ? "#fff" : "#00bcd4"}; + } + } +` + +export const OutroAutorTextField = styled(TextField)` + font-size : 14px; + width : 100% !important; + + .MuiFormControl-root { + margin : 18px 0 !important; + } + + .MuiFormHelperText-root { + text-align : left; + font-size : 14px !important ; + } + + label.Mui-focused { + color : #00bcd4; + } + + label.Mui-focused.Mui-error { + color : red; + } + + .MuiInput-underline::after { + border-bottom: 1px solid #00bcd4; + } + .MuiFormHelperText-root { + font-size : 12px !important; + text-align : right !important; + } +` + +export const StyledFormLabel = styled(FormLabel)` + b { + color : #666 !important; + } + span { + color : #a5a5a5; + } +` + +export const StyledTextField = styled(TextField)` + font-size : 14px; + width : 100% !important; + full-width : 100% !important; + + .MuiFormControl-root { + margin : 18px 0 !important; + } + + + .MuiFormHelperText-root { + text-align : left; + font-size : 14px !important ; + } + + label.Mui-focused { + color : #00bcd4; + } + + label.Mui-focused.Mui-error { + color : red; + } + + .MuiInput-underline::after { + border-bottom: 2px solid #00bcd4; + } + .MuiFormHelperText-root { + font-size : 12px !important; + text-align : right !important; + } +` + + const useStyles = makeStyles({ + root: { + '&:hover': { + backgroundColor: 'transparent', + }, + }}) + + export function StyledRadio (props) { + const classes = useStyles(); + return ( + <Radio + className={classes.root} + disableRipple + checkedIcon = { + <ObjTypeBox checked> + <span> + {GetIconByName(props.label)} + <p>{props.label}</p> + </span> + </ObjTypeBox> + } + icon = { + <ObjTypeBox> + <span> + {GetIconByName(props.label)} + <p>{props.label}</p> + </span> + </ObjTypeBox> + } + {...props} + /> + ) + } + + export const StyledDiv = styled.div` + display : flex; + margin-top : 30px; + justify-content : space-evenly; + ` + + export const OrangeButton = styled(Button)` + max-height : 36px !important; + color : rgba(255,255,255,0.87) !important; + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26) !important; + font-weight : 600 !important; + background-color : #ff7f00 !important; + margin-left : 8px !important; + margin-right : 8px !important; + ` + + export const GreyButton = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + max-height : 36px !important; + + background-color : transparent !important; + color : #666 !important; + text-decoration : none !important; + outline : none !important; + text-align : center !important; + + .button-text { + cursor : pointer; + line-height : 36px; + text-align : center; + color : currentColor; + white-space : nowrap; + text-transform : uppercase; + font-weight : 600 !important; + font-size : 14px; + font-style : inherit; + font-variant : inherit; + padding : 6px 16px !important; + } + ` + + export const Background = styled.div ` + padding-top : 40px; + background-color : #f4f4f4; + color : #666; + + .container { + padding : 0; + margin-right : auto; + margin-left : auto; + + @media screen and (min-width: 768px) { + width : 750px; + } + @media screen and (min-width: 992px) { + width : 970px; + } + @media screen and (min-width: 1200px) { + width : 1170px; + } + } + ` diff --git a/src/Components/UploadPageComponents/UploadFileWrapper.js b/src/Components/UploadPageComponents/UploadFileWrapper.js new file mode 100644 index 0000000000000000000000000000000000000000..b8919a54a0de3a1872de7c5258d32fdecfedc656 --- /dev/null +++ b/src/Components/UploadPageComponents/UploadFileWrapper.js @@ -0,0 +1,284 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react' +import LinkIcon from '../../img/link_icon.svg' +import ChooseLink from './ChooseLinkSection.js' +import {WrapperBox, BlueButton, GrayButton} from './StyledComponents.js'; +import {DottedBox} from './StyledComponents.js'; +import {getAxiosConfigFromJSON, updateHeaders, deleteRequest, putRequest} from '../HelperFunctions/getAxiosConfig.js' +import AttachFileIcon from '@material-ui/icons/AttachFile'; +import axios from 'axios' +import {apiUrl} from '../../env'; +import DoneIcon from '@material-ui/icons/Done'; +import DeleteIcon from '@material-ui/icons/Delete'; +import Alert from '../Alert.js'; +import Snackbar from '@material-ui/core/Snackbar'; + +export default function UploadFileWrapper (props) { + /*----------------------------------------------------------------- + - Wrapper for file upload box + - has three different stages: + - Default: prompts user to select a file or a link + - Choosing Link: displayed when the user selects "ENVIAR LINK"; renders "ChooseLinkSection.js" + - file selected: displayed when the user has chosen a file to upload. this section shows the upload progress and lets the user delete the current object and return to default stage + - error: displayed when an error occurs during the file upload. + + - Props used: + - submit : called when the user clicks "ENVIAR" inside ChooseLinkSection; renders the alert snackbar to let them know the link was submitted + */ + + const [stage, setStage] = useState(props.prevFile ? "fileSelected" : "default") + const handleNextStage = (newStage) => {setStage(newStage)} + + // eslint-disable-next-line + const [fileToUpload, setFileToUpload] = useState(null); + const chunkSize = 262144 + const uploadUrl = `${apiUrl}/learning_objects/` + props.draftID + '/chunk' + const [fileName, setFileName] = useState(props.prevFile ? props.prevFile.name : null) + const [fileDoneUploading, setFileDoneUploading] = useState(props.prevFile ? true : false) + const [uploadProgress, setProgress] = useState(0) + const [attachmentID, setAttachmentID] = useState(props.prevFile ? props.prevFile.id : null) + + async function onFileChange (file) { + if(!file) return; + + let newFile = file + console.log(newFile) + setFileToUpload(newFile); + setFileName(newFile.name) + + let total = Math.ceil(newFile.size/chunkSize) + let currentChunkStartByte = 0; + let currentChunkFinalByte = chunkSize > newFile.size ? newFile.size : chunkSize; + let chunkIdentifier = props.draftID + '-' + newFile.name; + let remainingBytes = 0 + handleNextStage("fileSelected") + for (var i = 0; i < total; i++) { + let chunk = newFile.slice(currentChunkStartByte, currentChunkFinalByte) + let config = getAxiosConfigFromJSON() + let formData = new FormData() + formData.append('_chunkFilename', newFile.name); + formData.append('_chunkIdentifier', chunkIdentifier); + formData.append('_totalChunks', total); + formData.append('_chunkSize', chunkSize); + formData.append('_currentChunkSize', chunk.size); + formData.append('_chunkNumber', i); + formData.append('_totalSize', newFile.size); + formData.append('file', chunk); + + try { + const response = await axios.post(uploadUrl, formData, config); + console.log(response) + if (response.headers['access-token']) { + updateHeaders(response.headers) + } + setProgress(Math.round((currentChunkFinalByte/newFile.size) * 100)) + remainingBytes = newFile.size - currentChunkFinalByte; + if (currentChunkFinalByte === newFile.size) { + setFileDoneUploading(true) + setAttachmentID(response.data.id) + } + else if (remainingBytes < chunkSize) { + currentChunkStartByte = currentChunkFinalByte; + currentChunkFinalByte = currentChunkStartByte + remainingBytes; + } + else { + currentChunkStartByte = currentChunkFinalByte; + currentChunkFinalByte = currentChunkStartByte + chunkSize; + } + } catch (error) { + console.log(error) + handleNextStage("error") + return; + } + } + }; + + const handleDelete = () => { + if (attachmentID != null) { + const url = `/learning_objects/${props.draftID}/attachment/${attachmentID}` + + deleteRequest(url, (data) => {handleNextStage("default")}, (error) => {console.log(error)}) + } + } + + const handleCancel = () => { + console.log('cancelar request') + } + + const handleDragOver = e => { + e.preventDefault(); + e.stopPropagation(); + e.dataTransfer.dropEffect = 'copy'; + }; + + const handleDrop = e => { + e.preventDefault(); + e.stopPropagation(); + let files = [...e.dataTransfer.files] + + console.log('files: ', files) + if (files && files.length > 0) { + onFileChange(files[0]) + } + }; + + const [snackbarOpen, toggleSnackbar] = useState(false) + + const handleChooseLink = (link) => { + const url = `/learning_objects/${props.draftID}` + + let payload = { + "learning_object" : { + "id" : props.draftID, + "link" : link + } + } + + putRequest(url, payload, (data) => {toggleSnackbar(true)}, (error) => {console.log(error)}) + } + + switch (stage) { + case "error": + return( + <WrapperBox> + <div className="inner"> + <div className="upload-title">Erro</div> + <span>Clique no botão para tentar novamente.</span> + <div className="flex-column"> + <div className="buttons-div"> + <GrayButton onClick={() => {handleNextStage("default")}}> + <span className="button-text"> + Voltar + </span> + </GrayButton> + </div> + </div> + </div> + </WrapperBox> + ) + case "fileSelected": + return( + <WrapperBox> + <div className="inner"> + <div className="upload-title"> + {fileDoneUploading ? 'O arquivo foi carregado' : 'Carregando arquivo'} + </div> + + <div className="uploading"> + <div className="upload-item"> + <div className="item-info"> + { + fileDoneUploading ? + ( + <React.Fragment> + <div className="file-status"> + <DoneIcon className="icon icon-margin"/> {fileName} + </div> + <GrayButton onClick={() => {handleDelete()}}> + Excluir <DeleteIcon className="icon icon-remove"/> + </GrayButton> + </React.Fragment> + ) + : + ( + <React.Fragment> + <div className="file-status"> + {uploadProgress}% {fileName} + </div> + <GrayButton onClick={() => {handleCancel()}}> + Cancelar <DeleteIcon className="icon icon-remove"/> + </GrayButton> + </React.Fragment> + ) + } + </div> + </div> + <div className="warning"> + <span>Não se esqueça de preencher as</span> + <br/> + <span>informações sobre o recurso ao lado.</span> + </div> + </div> + </div> + </WrapperBox> + ) + case "choosingLink": + return ( + <React.Fragment> + <Snackbar open={snackbarOpen} autoHideDuration={1000} onClose={() => {toggleSnackbar(false)}} + anchorOrigin = {{ vertical:'top', horizontal:'right' }} + > + <Alert severity="info" style={{backgroundColor:"#00acc1"}}> + Link salvo com sucesso! + </Alert> + </Snackbar> + <ChooseLink handleNextStage={handleNextStage} submit={handleChooseLink}/> + </React.Fragment> + ) + default: + return( + <WrapperBox> + <div className="inner"> + <div className="upload-title"> Enviar Recurso</div> + <div className="flex-column"> + + <div className="upload-container"> + <div className="upload-form"> + <form id="file_upload"> + <DottedBox + onDrop={e => handleDrop(e)} + onDragOver={e => handleDragOver(e)} + > + <AttachFileIcon className="icon"/> + <input + type="file" + onChange = {(e) => {onFileChange(e.target.files[0])}} + id="upload-file" + style={{display : "none"}} + /> + <BlueButton> + <label htmlFor="upload-file" style={{width : "inherit", cursor : "pointer"}}> + ESCOLHER ARQUIVO + </label> + </BlueButton> + <span style={{marginTop : "6px"}}>Ou arrastar e soltar o arquivo aqui</span> + </DottedBox> + </form> + </div> + </div> + + <div className="strike-box"> + <div className="strike"/><h3>ou</h3><div className="strike"/> + </div> + + <div className="enviar-link-texto"> + <img alt="" src={LinkIcon}/> + <br/> + <span>Enviar link de um recurso de outro site</span> + </div> + + <BlueButton onClick={ () => {handleNextStage("choosingLink")} }>ENVIAR LINK</BlueButton> + </div> + </div> + </WrapperBox> + ) + } + +} diff --git a/src/Components/UserCardGamified.js b/src/Components/UserCardGamified.js new file mode 100644 index 0000000000000000000000000000000000000000..a1cb24cacd862255d52b5be8d0acbcbb6bf9ed91 --- /dev/null +++ b/src/Components/UserCardGamified.js @@ -0,0 +1,37 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React from 'react'; +import Grid from '@material-ui/core/Grid'; +import Card from '@material-ui/core/Card'; +import CardActions from '@material-ui/core/CardActions'; +import CardContent from '@material-ui/core/CardContent'; + +export default function UserCardGamified (props) { + return ( + <Grid item xs={6} sm={3}> + <Card style={{backgroundColor:'pink'}}> + <CardContent> + Eu serei o card da pessoa + </CardContent> + <CardActions> + Learn more + </CardActions> + </Card> + </Grid> + ) +} diff --git a/src/Components/UserPageComponents/Avatar.js b/src/Components/UserPageComponents/Avatar.js new file mode 100644 index 0000000000000000000000000000000000000000..8c381f197741f833d9171c58b780ffb37bb8ad1b --- /dev/null +++ b/src/Components/UserPageComponents/Avatar.js @@ -0,0 +1,92 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, {useState, useContext, useEffect} from 'react'; +import styled from 'styled-components' +import { Store } from '../../Store.js'; +import { apiDomain} from '../../env'; +import noAvatar from "../../img/default_profile.png"; +import ModalAlterarAvatar from '../ModalAlterarAvatar/ModalAlterarAvatar.js' + +export default function ProfileAvatar (props) { + // eslint-disable-next-line + const {state, dispatch} = useContext(Store) + + const [currentAvatar, setAvatar] = useState(state.currentUser.avatar) + + const [hoverBool, toggleHover] = React.useState(false) + const handleToggleHover = () => {toggleHover(!hoverBool)} + + const [open, toggleOpen] = useState(false) + const controlModal = () => {toggleOpen(!open)} + + useEffect(() => {setAvatar(state.currentUser.avatar)}, [state.currentUser.avatar]) + + return ( + <> + <ModalAlterarAvatar + open={open} + handleClose={controlModal} + userAvatar={currentAvatar} + id={props.id} + /> + + <ProfileAvatarDiv onMouseEnter={handleToggleHover} onMouseLeave={handleToggleHover} onClick={controlModal}> + <img src={currentAvatar ? apiDomain + currentAvatar : noAvatar} alt = "user avatar" style={{height : "inherit", width : "inherit", border:"0", verticalAlign:"middle"}}/> + <ChangeAvatarDiv style={ {display : hoverBool ? 'flex' : 'none'}}> + <span>Alterar Foto</span> + </ChangeAvatarDiv> + </ProfileAvatarDiv> + + </> + ) +} + +const ProfileAvatarDiv = styled.div` + bottom : -55px; + left : 60px; + border-radius : 100%; + position : absolute; + width : 150px; + height : 150px; + overflow : hidden; + border : 8px solid #fff; + outline : 0; + cursor : pointer; + background-color : #a5a5a5; + @media screen and (max-width: 600px) { + height : 73px; + width : 73px; + position:absolute; + left:0; + right:0; + bottom : -40px; + margin-left:auto; + margin-right:auto; + } +` + +const ChangeAvatarDiv = styled.div` + height : 40px; + position: absolute; + width : 100%; + bottom : 0; + display : flex; + background-color : #000; + color : #fff; + justify-content : center; +` diff --git a/src/Components/UserPageComponents/Cover.js b/src/Components/UserPageComponents/Cover.js new file mode 100644 index 0000000000000000000000000000000000000000..339c36fd612cb3dc1a595c9a994a775af089c886 --- /dev/null +++ b/src/Components/UserPageComponents/Cover.js @@ -0,0 +1,79 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, {useState, useContext, useEffect} from 'react'; +import { Store } from '../../Store.js'; +import {apiDomain} from '../../env'; +import {CoverContainer} from '../TabPanels/StyledComponents.js' +import IconButton from '@material-ui/core/IconButton'; +import PhotoCamera from '@material-ui/icons/PhotoCamera'; +import Tooltip from '@material-ui/core/Tooltip'; +import ModalAlterarCover from '../ModalAlterarCover/ModalAlterarCover.js' + +export default function Cover (props) { + const {state} = useContext(Store) + + const WIDTH = window.innerWidth; + + const [currentCover, setCoverImg] = useState(state.currentUser.cover_file_name) + const [tempCover, setTempCover] = useState('') + + const [open, toggleOpen] = useState(false) + const controlModal = () => {toggleOpen(!open)} + + const updateCover = (selectorFiles) => { + const objectURL = URL.createObjectURL(selectorFiles[0]) + console.log(objectURL) + setTempCover(objectURL) + controlModal() + } + + useEffect( () => { + setCoverImg(state.currentUser.cover) + }, state.currentUser.cover) + return ( + <> + <ModalAlterarCover + open = {open} + handleClose={controlModal} + cover={tempCover} + id={props.id} + /> + <CoverContainer> + {currentCover && <img src={apiDomain + currentCover} alt = '' style= {{width:"100%", height:"100%", objectFit : "cover" }}/>} + <input accept="image/*" style = {{display:"none"}} id="choose-cover-file" type="file" onChange={(e) => updateCover(e.target.files)}/> + <label htmlFor="choose-cover-file"> + { + WIDTH >= 545 ? + <Tooltip title={<span style={{fontSize:"14px", overflow:"hidden", transition:"all .5s ease"}}>ALTERAR CAPA</span>} placement="left"> + <IconButton style={{position:"absolute",right:"0",bottom: "0",color:"#fff"}}color="primary" aria-label="upload picture" component="span"> + <PhotoCamera /> + </IconButton> + </Tooltip> + : + <Tooltip title={<span style={{fontSize:"14px", overflow:"hidden", transition:"all .5s ease"}}>ALTERAR CAPA</span>} placement="left"> + <IconButton style={{position:"absolute",left:"0",top: "0",color:"#fff"}}color="primary" aria-label="upload picture" component="span"> + <PhotoCamera /> + </IconButton> + </Tooltip> + } + + </label> + </CoverContainer> + </> + ) +} diff --git a/src/Components/UserPageComponents/EditProfileButton.js b/src/Components/UserPageComponents/EditProfileButton.js new file mode 100644 index 0000000000000000000000000000000000000000..beaa7137501ba03fc9de6f46d14391c6e7072f13 --- /dev/null +++ b/src/Components/UserPageComponents/EditProfileButton.js @@ -0,0 +1,74 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React from 'react'; +import { Store } from '../../Store.js'; +import styled from 'styled-components' +import {Link} from 'react-router-dom'; +import EditIcon from '@material-ui/icons/Edit'; +import Button from '@material-ui/core/Button'; + +export default function EditProfileButton () { + const {state} = React.useContext(Store) + + return ( + <EditProfileAnchor to="/editarperfil"> + <Button> + {state.windowSize.width >=900 ? + ( + <React.Fragment> + <EditIcon style={{marginRight:"5px", verticalAlign:"middle"}}/> <span>EDITAR PERFIL</span> + </React.Fragment> + ) + : + ( + <EditIcon style={{marginRight:"5px", verticalAlign:"middle"}}/> + ) + } + </Button> + </EditProfileAnchor> + ) +} + +const EditProfileAnchor = styled(Link)` + Button { + box-shadow : 0 2px 5px 0 rgba(0,0,0,.26); + background-color : #fafafa; + position : absolute; + right : 10px; + top : 10px; + margin-bottom : 20px; + color : #666; + padding : 0 10px; + text-decoration : none; + border-radius : 3px; + @media screen and (min-width: 800px) { + min-height : 36px; + min-width : 88px; + } + line-height : 36px; + border : 0; + display: inline-block; + text-align : center; + :hover{ + background-color : #fafafa; + } + @media screen and (max-width: 600px) { + max-width : 44px !important ; + } + } +` diff --git a/src/Components/UserPageComponents/SubmitterStatus.js b/src/Components/UserPageComponents/SubmitterStatus.js new file mode 100644 index 0000000000000000000000000000000000000000..1cb29365644038f8a8a9a115675ddf8f0af1ccfd --- /dev/null +++ b/src/Components/UserPageComponents/SubmitterStatus.js @@ -0,0 +1,60 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, {useContext} from 'react'; +import { Store } from '../../Store.js'; +import CheckDecagram from '../../img/check-decagram-gray.svg' +import {Link} from 'react-router-dom'; + +export default function SubmitterStatus (props) { + const {state} = useContext(Store) + + let text; + switch (state.currentUser.submitter_request) { + case 'requested': + text = "Verificando cadastro de professor(a)" + break; + case 'accepted': + text = "Professor(a)" + break; + default: + text = "Você é professor(a) e gostaria de publicar recursos?" + } + + return ( + <React.Fragment> + <p style={{fontSize:"15px", lineHeight:"22px", textAlign:"left", margin:"0 0 10px"}}> + <span style={{cursor:"pointer"}}> + <span style={{paddingRight:"5px"}}> + <img src={CheckDecagram} alt='check icon'/> + </span> + {text} + <Link to={{ + pathname: '/editarperfil', + tabValue: { + value: 1 + } + }}> + <span style={{color:"#00bcd4"}}> SAIBA MAIS</span> + </Link> + + </span> + </p> + </React.Fragment> + ) + +} diff --git a/src/Components/UserPageComponents/UserInfo.js b/src/Components/UserPageComponents/UserInfo.js new file mode 100644 index 0000000000000000000000000000000000000000..4782759f8f2e4eb70a86b03e13d8be603c035f6e --- /dev/null +++ b/src/Components/UserPageComponents/UserInfo.js @@ -0,0 +1,44 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, { useContext } from "react"; +import { Store } from "../../Store.js"; +import { UserProfileInfoDiv } from "../TabPanels/StyledComponents.js"; + +export default function UserInfo(props) { + const { state } = useContext(Store); + + const user = state.currentUser.name; + + return ( + <UserProfileInfoDiv> + <p + style={{ + fontSize: "28px", + color: "#fff", + paddingTop: "5px", + paddingBottom: "5px", + fontWeight: "500", + backgroundColor: "#77777796", + borderRadius: "5px", + }} + > + {user} + </p> + </UserProfileInfoDiv> + ); +} diff --git a/src/Pages/ProfilePage.js b/src/Components/VerticalRuler.js similarity index 80% rename from src/Pages/ProfilePage.js rename to src/Components/VerticalRuler.js index 6959ad9357650785a7088ddbb25ac0a0ac3bffe1..a84dc1381675d222245eb7097263f385e15c1b10 100644 --- a/src/Pages/ProfilePage.js +++ b/src/Components/VerticalRuler.js @@ -16,15 +16,16 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; +import React from 'react'; -class ProfilePage extends Component { - render() { - return ( - <h1> Página visulizar prefil de usuário</h1> - ); - } - } +export default function VerticalRuler(props) { + return ( + <div + style={{ + borderLeft: ''+props.width+'px solid '+props.color, + height:props.height + }}/> + ); +} -export default ProfilePage; diff --git a/src/Components/carousel.css b/src/Components/carousel.css index bc5772746539b88af1e010d0776362b508673e9f..9c7ea98633ce9e85948d544465255bcf47760ba9 100644 --- a/src/Components/carousel.css +++ b/src/Components/carousel.css @@ -21,15 +21,28 @@ along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/> } .carousel .control-arrow { background: orange !important; - position: relative !impontant; -} -.carousel.carousel-slider .control-arrow { - top: 40% !important; - bottom: 50% !important; - border-radius: 100% !important; - opacity: 0.8 !important; - padding: 12px !important; + /* position: relative !important; */ + + -webkit-box-shadow: 0 8px 17px 2px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); + box-shadow: 0 8px 17px 2px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2); + + + + } + .MuiPaper-elevation1-209{ box-shadow: none !important; } + + +.carousel.carousel-slider .control-arrow { + top: 35%!important; + bottom: 50%!important; + border-radius: 100%!important; + opacity: 1!important; + text-align: center; + vertical-align: middle; + height: 50px; + width: 50px; +} diff --git a/src/Components/maintenance.js b/src/Components/maintenance.js new file mode 100644 index 0000000000000000000000000000000000000000..f39358e42ef75e8ee1a1b4afbfb14abd44365340 --- /dev/null +++ b/src/Components/maintenance.js @@ -0,0 +1,19 @@ +import React from 'react' +import styled from 'styled-components' + +export default function Maintenance() { + return ( + <MaintenanceDiv> + Estamos em manuntenção. Em breve voltaremos! + </MaintenanceDiv> + ) +} + +const MaintenanceDiv = styled.div` + z-index: 1000; + position: fixed; + color:white; + background-color: red; + text-align: center; + width: 100%; +` \ No newline at end of file diff --git a/src/Components/menulist.js b/src/Components/menulist.js deleted file mode 100644 index cb0703899148dc5386135228a18356a8eb72b8d8..0000000000000000000000000000000000000000 --- a/src/Components/menulist.js +++ /dev/null @@ -1,103 +0,0 @@ -/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre -Departamento de Informatica - Universidade Federal do Parana - -This file is part of Plataforma Integrada MEC. - -Plataforma Integrada MEC is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -Plataforma Integrada MEC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ - -import React from 'react'; -import PropTypes from 'prop-types'; -import Button from '@material-ui/core/Button'; -import ClickAwayListener from '@material-ui/core/ClickAwayListener'; -import Grow from '@material-ui/core/Grow'; -import Paper from '@material-ui/core/Paper'; -import Popper from '@material-ui/core/Popper'; -import MenuItem from '@material-ui/core/MenuItem'; -import MenuList from '@material-ui/core/MenuList'; -import { withStyles } from '@material-ui/core/styles'; - -const styles = theme => ({ - root: { - display: 'flex', - }, - paper: { - marginRight: theme.spacing.unit * 2, - }, -}); - -class MenuListComposition extends React.Component { - state = { - open: false, - }; - - handleToggle = () => { - this.setState(state => ({ open: !state.open })); - }; - - handleClose = event => { - if (this.anchorEl.contains(event.target)) { - return; - } - - this.setState({ open: false }); - }; - - render() { - const { classes } = this.props; - const { open } = this.state; - - return ( - <div className={classes.root}> - - <div> - <Button - buttonRef={node => { - this.anchorEl = node; - }} - aria-owns={open ? 'menu-list-grow' : undefined} - aria-haspopup="true" - onClick={this.handleToggle} - > - {this.props.label} - </Button> - <Popper open={open} anchorEl={this.anchorEl} transition disablePortal> - {({ TransitionProps, placement }) => ( - <Grow - {...TransitionProps} - id="menu-list-grow" - style={{ transformOrigin: placement === 'bottom' ? 'center top' : 'center bottom' }} - > - <Paper> - <ClickAwayListener onClickAway={this.handleClose}> - <MenuList> - <MenuItem onClick={this.handleClose}>Profile</MenuItem> - <MenuItem onClick={this.handleClose}>My account</MenuItem> - <MenuItem onClick={this.handleClose}>Logout</MenuItem> - </MenuList> - </ClickAwayListener> - </Paper> - </Grow> - )} - </Popper> - </div> - </div> - ); - } -} - -MenuListComposition.propTypes = { - classes: PropTypes.object.isRequired, -}; - -export default withStyles(styles)(MenuListComposition); diff --git a/src/Pages/AboutPage.js b/src/Pages/AboutPage.js new file mode 100644 index 0000000000000000000000000000000000000000..98fdfd0596c3aa455cac4ee0b3769a7cdac3a1cd --- /dev/null +++ b/src/Pages/AboutPage.js @@ -0,0 +1,800 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect } from 'react'; +import Grid from '@material-ui/core/Grid'; +import styled from 'styled-components'; +import Modal from '../Components/ModalAbout'; +import AboutCarousel from "../Components/AboutCarousel"; +import AboutCarouselPartner from '../Components/AboutCarouselPartner'; + + +/*Importação de imagens para o componente*/ +import Agpl from "../img/sobre/agpl.svg"; +import Banner from "../img/sobre/banner-sobre-2.jpg"; +import Notebook from "../img/sobre/Imagem_Notebook.png"; +import Professores from "../img/sobre/professores.jpg"; +import Alunos from "../img/sobre/Alunos.png"; +import Gestores from "../img/sobre/Gestores.png"; +import Comunidade from "../img/sobre/comunidade.png"; + + +const Secao1 = styled.div` + height: 600px; + background-color: #333; +` + + +const Secao2 = styled.div` + color: #666; + text-align: center; + font-size: 14px; + line-height: 1.42857143; + + .container { + + height: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; + padding: 20px 0px; + + .container-secao { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + + + + .conteudo-secao { + h2 { + text-align: center; + font-family: Roboto, sans-serif; + font-size: 30px; + font-weight: 300; + margin: 0; + line-height: 1.1; + } + + img { + max-width: 250px; + } + + p { + margin: 0 0 10px; + } + + a { + + color: initial; + text-decoration:none; + } + + } + } + } + +` + +const Secao3 = styled.div` + padding: 30px 0; + background-color: #1ab9de; + color: #fff; + + .container { + + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; + padding-left: 20px; + + .container-secao { + padding-right: 15px; + padding-left: 15px; + display: flex; + flex-direction: column; + justify-content: center; + + + .conteudo-secao { + padding-right: 15px; + padding-left: 15px; + width: 100%; + + h2 { + font-family: Pompiere, cursive; + font-size: 46px; + font-weight: 500; + margin: 0; + line-height: 1.1; + } + + h3 { + font-family: Roboto, sans-serif; + font-size: 26px; + margin-top: 20px; + margin-bottom: 10px; + font-weight: 500; + line-height: 1.1; + + + } + + p { + font-size: 15px; + fornt-weight: 400; + margin: 0 0 10px; + ine-height: 1.42857143; + justify: left; + } + + img { + max-height: 400px; + } + + + } + } + } + + +` + +const Secao4 = styled.div` + height: 720px; + text-align: center; + color: #666; + + .container { + + height: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; + + .container-secao { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + + + .conteudo-secao { + + + h2 { + text-align: center; + font-family: Roboto, sans-serif; + font-size: 30px; + font-weight: 300; + margin: 0; + margin-bottom: 30px; + line-height: 1.1; + } + h3 { + font-size: 26px; + font-weight: 400; + padding-right: 0; + padding-left: 0; + margin: 0; + } + + button { + background-color: #00bcd4; + color: #fff; + font-family: Roboto,sans-serif; + font-size: 14px; + font-weight: 500; + height: 36px; + border-radius: 3px; + padding-left: 16px; + padding-right: 16px; + box-shadow: 0 2px 5px 0 rgba(0,0,0,.26); + display: inline-block; + position: relative; + cursor: pointer; + min-height: 36px; + min-width: 88px; + line-height: 36px; + vertical-align: middle; + -webkit-box-align: center; + outline: none; + text-align: center; + border: 0; + padding: 0 6px; + hite-space: nowrap; + text-decoration: none; + + + } + + p { + text-align: center; + margin: 0 0 10px; + font-size: 15px; + } + + .portais { + margin: 30px 0; + display: inline-block; + .itens { + + + display: table; + height: 120px; + list-style: none; + margin: 0 auto; + padding-left: 0; + padding-right: 0; + + li { + display: table-cell; + vertical-align: middle; + padding: 0 15px; + border-right: 1px solid #efefef; + } + + li:last-child { + border-right: none; + } + + } + + } + + } + } + } + + + +` + +const Secao5 = styled.div` + height: 370px; + background-image: url(${Banner}); + background-position: top center; + background-size: cover; + text-align: center; + + .container { + + height: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; + + .container-secao { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + + + .conteudo-secao { + + h2 { + text-align: center; + font-family: Pompiere,cursive; + font-size: 52px; + color:#fff; + font-weight: 500; + margin: 0; + line-height: 1.1; + } + + p { + color:#fff; + font-size: 15px; + margin: 0 0 10px; + } + } + } + } + + +` + +const Secao6 = styled.div` + height: 500px; + + + .container { + + height: 100%; + padding-top:50px + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; + + .container-secao { + height: 100%; + display: flex; + + justify-content: center; + + + .conteudo-secao { + + height: 100%; + width: 100%; + + h2 { + text-align: center; + font-family: Roboto, sans-serif; + font-size: 30px; + font-weight: 300; + margin-bottom:30px; + line-height: 1.1; + } + + img { + max-width: 250px; + } + + p { + margin: 0 0 10px; + } + + a { + + color: initial; + text-decoration:none; + } + + } + } + } + + +` + +const Secao7 = styled.div` + height: 100%; + background-color: #f4f4f4; + + .container { + + height: 100%; + margin-right: auto; + margin-left: auto; + + .container-secao { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + color: #666; + padding: 50px + + + .conteudo-secao { + + h2 { + text-align: center; + font-family: Roboto, sans-serif; + font-size: 30px; + font-weight: 300; + margin: 0; + margin-bottom: 10px; + line-height: 1.1; + } + + + p { + text-align: center; + margin: 0 0 10px; + font-size: 15px; + line-height: 1.42857143; + } + + .cabecalho { + margin-bottom: 30px; + } + + .card { + + height: 80%; + + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 40px 20px; + text-align: center; + + h3 { + font-weight: 400; + font-size: 24px; + margin-top: 20px; + margin-bottom: 10px; + line-height: 1.1; + } + + p { + line-height: 1.42857143; + text-align: center + font-size: 15px; + margin: 0 0 10px; + } + + img { + width: 114px; + } + + } + + + + } + } + } + +` + +const Secao8 = styled.div` + height: 230px; + + .container { + + height: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; + + .container-secao { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + + + .conteudo-secao { + align-itens: center; + + + + h2 { + text-align: center; + font-family: Roboto,sans-serif; + font-size: 26px; + color:#666; + font-weight: 300; + margin: 0; + line-height: 1.1; + } + + p { + color:#fff; + font-size: 15px; + margin: 0 0 10px; + } + + div { + display: flex; + justify-content: center; + margin-top: 30px + } + + button { + + background-color: #ed6f00; + font-family: Roboto,sans-serif; + font-size: 14px; + font-weight: 500; + height: 36px; + border-radius: 3px; + padding-left: 16px; + padding-right: 16px; + box-shadow: 0 2px 5px 0 rgba(0,0,0,.26); + cursor: pointer; + min-height: 36px; + min-width: 88px; + line-height: 36px; + vertical-align: middle; + align-items: center; + text-align: center; + border-radius: 3px; + user-select: none; + border: 0; + padding: 0 6px; + padding-right: 6px; + padding-left: 6px; + margin: 6px 8px; + font-weight: 500; + font-size: 14px; + overflow: hidden; + + + + a { + color: #fff; + text-decoration: none; + } + + } + + } + } + } + + + +` + + + + + + + + +export default function AboutPage(props) { + var pageWidth = window.innerWidth + const calculateMargin = ((pageWidth) => { + if (pageWidth > 700 && pageWidth <= 850) { + return "40%" + } + if (pageWidth > 850 && pageWidth <= 900) { + return "25%" + } + if (pageWidth > 900 && pageWidth < 1100) { + return "13%" + } + else { + return "0%" + } + }) + var marginSet = calculateMargin(pageWidth) + const styleIMGSec3 = { float: "right", width: "80%", maxWidth: 475, marginRight: 30, marginTop: marginSet } + + useEffect(() => { + window.scrollTo(0, 0) + }, []) + + return ( + <> + + <link href="https://fonts.googleapis.com/css?family=Pompiere|Roboto:300,400&display=swap" rel="stylesheet" /> + + <Secao1> + <iframe title="VÃdeo página sobre" src="https://player.vimeo.com/video/231609051" width="100%" height="100%" frameBorder="0" allow="autoplay; fullscreen" allowFullScreen></iframe> + + </Secao1> + + <Secao2> + <div className="container"> + <div className="container-secao"> + <div className="conteudo-secao"> + <h2>Um Pouco da História</h2> + <p style={{ marginLeft: 20, marginRight: 20, marginBottom: 40 }}> + A partir de uma iniciativa do Ministério da Educação, surge + em outubro de 2015 a proposta de reunir e disponibilizar, em um + único lugar, os Recursos Educacionais Digitais dos principais + portais do Brasil. Com o objetivo de melhorar a experiência de + busca desses Recursos, a Plataforma foi desenvolvida numa + parceria coletiva entre: Universidade Federal do Paraná (UFPR), Universidade Federal de Santa Catarina (UFSC) e professoras(es) + da Educação Básica de todo o Brasil. Assim, a Plataforma MEC + pretende se tornar uma referência em Recursos Educacionais + Digitais, como um ambiente de busca, interação e colaboração + entre professoras(es)!<br /><br />Faça parte deste espaço de + colaborativo você também! + </p> + <img src={Agpl} alt="agpl" /> + <p> + Este programa é software livre, sob os termos da + <a href="https://www.gnu.org/licenses/agpl-3.0.en.html" rel="noreferrer" target="_blank"> licença GNU/AGPL</a><br /> + Seu código fonte está disponÃvel no <a href="https://gitlab.c3sl.ufpr.br/portalmec/portalmec" rel="noreferrer" target="_blank">GitLab</a> + </p> + + + </div> + </div> + </div> + </Secao2> + + <Secao3> + <div className="container"> + <div className="container-secao"> + <div className="conteudo-secao"> + <Grid container spacing={0}> + <Grid item xs style={{ paddingRight: 20 }}> + <h2>O que nos faz diferentes?</h2> + <h3>Espaço construÃdo por e para professores</h3> + <p> + Procuramos constantemente compreender a sua realidade dentro e + fora da sala de aula, no intuito de adequar a qualidade da + plataforma à s suas necessidades de busca por Recursos Educacionais Digitais. + </p> + <h3>Ambiente de colaboração</h3> + <p> + A Plataforma é um espaço onde você pode colaborar ao publicar + seus recursos e compartilhar os de outros autores. Além disso, + pode contribuir relatando suas experiências de uso com os + Recursos disponÃveis. Participe desta rede colaborativa! + </p> + <h3>Todos os recursos em um só lugar</h3> + <p> + Aqui você consegue otimizar o seu tempo! A plataforma integra + os Recursos Educacionais Digitais dos principais portais abertos. + </p> + </Grid> + { + pageWidth >= 751 ? + <Grid item xs={6} style={{ position: "relative" }}> + <img src={Notebook} alt="Imagem Notebook" style={styleIMGSec3} /> + </Grid> + : + <div /> + } + + + </Grid> + + </div> + </div> + </div> + </Secao3> + + + + <Secao4> + <div className="container"> + <div className="container-secao" id="portaisparceiros"> + <div className="conteudo-secao" > + <div> + <h2>Portais Parceiros</h2> + <p>Aqui na Plataforma você encontra os Recursos Digitais dos principais portais do MEC e de vários outros parceiros.</p> + </div> + + <AboutCarouselPartner /> + + <div> + <h3>Você busca Recursos Educacionais Digitais em outros sites?</h3> + <p> + Você gostaria que a plataforma tivesse os recursos do site que + você acessa?<br />Deixe a sua sugestão pra que juntos possamos + avançar na integração dos mais variados recursos. + </p> + </div> + <div style={{ marginTop: "30px" }}> + <Modal /> + </div> + + </div> + </div> + </div> + </Secao4> + + <Secao5> + <div className="container"> + <div className="container-secao"> + <div className="conteudo-secao"> + <h2>AQUI VOCÊ É PROTAGONISTA</h2> + <br /> + <p> + Construa conosco a plataforma e amplie sua rede de conhecimento + interagindo com pessoas envolvidas com experiências que ocorrem em todo o Brasil! + </p> + </div> + </div> + </div> + </Secao5> + + <Secao6> + <div className="container"> + <div className="container-secao"> + <div className="conteudo-secao"> + <div> + <h2>Aqui você pode:</h2> + + </div> + <div> + <AboutCarousel /> + </div> + + </div> + </div> + </div> + </Secao6> + + <Secao7> + <div className="container"> + <div className="container-secao"> + <div className="conteudo-secao"> + <div className="cabecalho"> + <h2>A quem se destina?</h2> + <p>A plataforma é aberta e destina-se a todos e todas que se + interessam<br />pela relação entre a escola e a Cultura Digital:</p> + </div> + <div> + <Grid container spacing={3}> + <Grid item xs> + <div className="card"> + <img src={Professores} alt="" /> + <h3>Professores</h3> + <p> + Encontre recursos digitais que se encaixem aos objetivos + das suas aulas! Aproveite para seguir outros professores, + coleções e conhecer experiências de uso! + </p> + </div> + </Grid> + <Grid item xs> + <div className="card"> + <img src={Alunos} alt="" /> + <h3>Alunos</h3> + <p> + Você pode complementar os seus estudos com recursos + digitais que lhe interessem. Gostou de algum recurso? + Recomende ao seu professor ou professora. + </p> + </div> + </Grid> + <Grid item xs> + <div className="card"> + <img src={Gestores} alt="" /> + <h3>Gestores</h3> + <p> + Desenvolva junto com o coletivo da escola ações e projetos + pedagógicos com recursos digitais importantes para o seu contexto. + </p> + </div> + </Grid> + <Grid item xs> + <div className="card"> + <img src={Comunidade} alt="" /> + <h3>Comunidade Escolar</h3> + <p> + Encontre recursos digitais e materiais de formação que + contribuam para a aprendizagem e práticas educativas na + sua comunidade escolar. + </p> + </div> + </Grid> + </Grid> + + </div> + </div> + </div> + </div> + </Secao7> + + <Secao8> + <div className="container"> + <div className="container-secao"> + <div className="conteudo-secao"> + + <h2>Ficou alguma dúvida? Gostaria de fazer alguma sugestão ou crÃtica? Construa conosco.</h2> + <div> + <button><a href="contato">ENTRAR EM CONTATO</a></button> + </div> + + </div> + </div> + </div> + </Secao8> + </> + ); + +} diff --git a/src/Pages/Accessibility.js b/src/Pages/Accessibility.js new file mode 100644 index 0000000000000000000000000000000000000000..a2dbb7efc0d8250abaabc294032b0188242fae5c --- /dev/null +++ b/src/Pages/Accessibility.js @@ -0,0 +1,152 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React from 'react'; +import styled from 'styled-components' +import { Link } from "react-router-dom"; +import Breadcrumbs from "@material-ui/core/Breadcrumbs"; + + +const titulo ={ + fontFamily: "Roboto, sans-serif", + marginTop: "0", + fontSize: "26px", + fontWeight: "300", + marginBottom: "10px", + color: "#666" +} +const subtitulo ={ + fontFamily: "Roboto, sans-serif", + marginBottom: "20px", + marginTop: "0", + fontWeight: "500", + fontSize: "16px", + color: "#00bcd4" + +} + +const paper ={ + padding: "30px 30px 100px 30px", + backgroundColor: "#fff", + boxShadow: "0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)", + width:"1170px", + margin: "30px auto", + marginBottom:"0", + display: "flex", + flexDirection:"column", + boxSizing: "border-box" +} + +const paragrafo={ + textAlign: "left", + padding: "30px 0", + margin: "0", + fontFamily: "'Roboto Light','Roboto Regular',Roboto", + fontWeight: "300", + fontSize: "18px", + color: "#666", + display:"block" +} + +const azulzinho={ + textAlign: "right", + display:"block", + color: "#00bcd4", + fontSize: "16px" +} + +const atalhos = { + fontWeight: "400", + color: "#00bcd4" + +} + +const breadCrumbs={ + padding: "10px", + display: "flex", + margin: "0 auto", + width:"1170px" +} +const StyledBreadCrumbs = styled(Breadcrumbs)` + display: flex; + justify-content: flex-start; + max-width: 1170px; + span { + color: #a5a5a5; + font-size: 14px; + } + a { + color: #00bcd4; + text-decoration: none; + font-size: 14px; + } +`; + +export default function Acessibility (props) { + return ( + <div style={{padding:"0 0 30px 0",backgroundColor :"#f4f4f4"}}> + + <div style={breadCrumbs}> + <StyledBreadCrumbs> + <Link to="/">Página Inicial</Link> + <span>Acessibilidade</span> + + </StyledBreadCrumbs> + </div> + <link href="https://fonts.googleapis.com/css?family=Roboto:300;400;500&display=swap" rel="stylesheet"/> + <div style={paper}> + <h3 style={titulo}>Acessibilidade</h3> + <div style={{maxWidth:"660px",margin:"0 auto"}}> + <p style={paragrafo}> + Acessibilidade na web é possibilitar qualquer indivÃduo de usufruir de quaisquer + atividades ou conteúdos em sÃtios e serviços disponÃveis na web, com igualdade e + autonomia, independentemente de sua capacidade motora, visual, auditiva, + intelectual, cultural ou social + </p> + <span style={azulzinho}> + Cartilha Acessibilidade na Web - W3C Brasil, 2013 + </span> + <p style={paragrafo}> + Na Plataforma a acessibilidade foi baseada principalmente no Modelo de + Acessibilidade em Governo Eletrônico (e-MAG), o modelo pode ser acessado + <a + style={{textDecoration:"none", color:"#222"}} + target="_blank" + rel="noreferrer" + href="https://www.governoeletronico.gov.br/documentos-e-arquivos/e-MAG%20V3.pdf"> aqui</a>. + </p> + </div> + <div style={{color:"#666", fontSize:"14px"}}> + <h3 style={subtitulo}>Atalhos padrões da Plataforma</h3> + Teclando-se <strong style={atalhos}>Alt + 1</strong> em qualquer página da Plataforma, chega-se diretamente ao começo do conteúdo principal da página. + <br/><br/> + Teclando-se <strong style={atalhos}>Alt + 2</strong> em qualquer página da Plataforma, chega-se diretamente ao inÃcio do menu principal. + <br/><br/> + Teclando-se <strong style={atalhos}>Alt + 3</strong> em qualquer página da Plataforma, chega-se diretamente no campo de busca. + <br/><br/> + Teclando-se <strong style={atalhos}>Alt + 4</strong> em qualquer página da Plataforma, chega-se diretamente ao rodapé. + <br/><br/> + No caso do <strong style={atalhos}>Firefox</strong>, em vez de Alt + número, tecle simultaneamente <strong style={atalhos}>Alt + Shift + número</strong>. + <br/><br/> + Sendo <strong style={atalhos}>Firefox</strong> no <strong style={atalhos}>Mac OS</strong>, em vez de Alt + Shift + número, tecle simultaneamente <strong style={atalhos}>Ctrl + Alt + número</strong>. + <br/><br/> + No <strong style={atalhos}>Opera</strong>, as teclas são <strong style={atalhos}>Shift + Escape + número</strong>. Ao teclar apenas <strong style={atalhos}>Shift + Escape</strong>, o usuário encontrará uma janela com todas as alternativas de ACCESSKEY da página. + </div> + </div> + </div> + ); +} diff --git a/src/Pages/CollectionPage.js b/src/Pages/CollectionPage.js index 53f2351c0eade585a0709d459f9f940299b60bb5..3ccb5ab1929d32cc3be204d59fa939664b85596f 100644 --- a/src/Pages/CollectionPage.js +++ b/src/Pages/CollectionPage.js @@ -2,7 +2,6 @@ Departamento de Informatica - Universidade Federal do Parana This file is part of Plataforma Integrada MEC. - Plataforma Integrada MEC is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -16,15 +15,125 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; +import React, { useRef, useState, useEffect, useContext } from 'react'; +import { Grid } from '@material-ui/core'; +import CollectionAuthor from '../Components/CollectionAuthor.js'; +import VerticalRuler from '../Components/VerticalRuler.js'; +import CollectionDescription from '../Components/CollectionDescription.js'; +import ResourceList from '../Components/ResourceList.js'; +import CollectionCommentSection from '../Components/CollectionCommentSection.js'; +import { apiDomain } from '../env'; +import styled from 'styled-components'; +import DowloadButton from '../Components/CollectionDowloadButton.js'; +import Breadcrumbs from "@material-ui/core/Breadcrumbs"; +import { Link } from 'react-router-dom'; +import FollowCollectionButton from '../Components/FollowCollectionButton'; +import { Store } from '../Store.js' +import { getRequest } from '../Components/HelperFunctions/getAxiosConfig.js' + +export default function CollectionPage(props) { + const { state } = useContext(Store); + + const [collection, setCollection] = useState({ + name: '', + id: 0, + }); + const collection_id = props.match.params.id; + const comment_ref = useRef(null); + + useEffect(() => { + const url = `/collections/${collection_id}` + + getRequest(url, (data) => { setCollection(Object.assign({}, data)) }, (error) => { console.log(error) }) + }, []); + + const handleScrollToComments = () => { + comment_ref.current.scrollIntoView({ behavior: 'smooth' }) + } + return ( + <> + <BreadCrumbsDiv> + <StyledBreadCrumbs> + <Link to="/">Página Inicial</Link> + <span>Coleções</span> + </StyledBreadCrumbs> + </BreadCrumbsDiv> + <Grid container direction="row" justify="center" alignItems="center"> + <Grid item md={3}> + <CollectionAuthor + author_id={collection.owner ? collection.owner.id : 0} + name={collection.owner ? collection.owner.name : ""} + imgsrc={collection.owner ? apiDomain + collection.owner.avatar : ''} /> + </Grid> -class CollectionPage extends Component { - render() { - return ( - <h1> Página visulizar coleção</h1> - ); - } + <Grid item md={5}> + <CollectionDescription + scrollToComments={handleScrollToComments} + title={collection.name ? collection.name : ""} + collection_id={collection.id ? collection.id : 0} /> + </Grid> + + <Grid item md={3}> + <DowloadButton + id={collection.id ? collection.id : 0} + /> + <div style={{ height: 12 }}></div> + <FollowCollectionButton + user_id={state.currentUser.id} + collection_id={collection_id} /> + </Grid> + </Grid> + + <VerticalRuler width={1} height={100} color="rgb(238, 238, 238)" /> + + <Grid container justify="center" style={{ backgroundColor: '#f4f4f4' }}> + {/* <Grid item xs={1}/> */} + <Grid item xs={10}> + <ResourceList resources={ + collection.collection_items ? + collection.collection_items.map(i => { + return { + type: i.collectionable.object_type, + author: i.collectionable.author, + title: i.collectionable.name, + rating: i.collectionable.review_average, + likeCount: i.collectionable.likes_count, + liked: i.collectionable.liked, + avatar: i.collectionable.publisher.avatar, + thumbnail: i.collectionable.thumbnail, + tags: i.collectionable.tags.map(t => t), + id: i.collectionable.id, + downloadableLink: i.collectionable.default_attachment_location, + publisher: i.collectionable.publisher.name, + published: i.collectionable.state + } + }) + : [] + } /> + + </Grid> + <Grid container item xs={12} style={{ marginTop: 40, paddingBottom: 40 }} ref={comment_ref}> + <CollectionCommentSection id={collection_id} /> + </Grid> + </Grid> + </> + ); +} + +const StyledBreadCrumbs = styled(Breadcrumbs)` + display: flex; + justify-content: flex-start; + span { + color: #a5a5a5; + } + a { + color: #00bcd4; + text-decoration: none; } +`; -export default CollectionPage; +const BreadCrumbsDiv = styled.div` + padding: 10px; + display: flex; +`; diff --git a/src/Pages/Contact.js b/src/Pages/Contact.js new file mode 100644 index 0000000000000000000000000000000000000000..181e16d47158efdbdd9492fc29fe49b7d2df80de --- /dev/null +++ b/src/Pages/Contact.js @@ -0,0 +1,178 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect } from "react"; +import styled from "styled-components"; +import Banner1 from "../img/banner-sobre.jpg"; +import InputFormulario from "../Components/ContactForm.js"; + +const Secao1 = styled.div` + width: 100%; + background-image: url(${Banner1}); + background-size: cover; + background-position: bottom center; + height: 250px; + color: #fff; + line-height: 1.1; + text-align: center; + padding-top: 120px; + + h2 { + font-family: Pompiere, cursive; + font-size: 52px; + color: #fff; + margin: 0; + padding-left: 0; + padding-right: 0; + font-weight: 500; + } + + h3 { + margin-top: 20px; + margin-bottom: 10px; + font-family: Roboto, sans-serif; + font-size: 30px; + font-weight: lighter; + } +`; + +const Secao2 = styled.div` + height: 708px; + background-color: #f4f4f4; + display: flex; + justify-content: center; + align-items: center; +`; + +const Secao3 = styled.div` + height: 127px; + background-color: #f4f4f4; + color: #666; + line-height: 1.42857143; + font-size: 18px; + text-align: center; + padding-top: 70px; + + p { + margin: 0 0 10px 0; + } +`; + +const Formulario = styled.div` + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 40px; + height: 560px; + width: 480px; + color: #666; + + form .inputBlock { + margin-block: 22px; + + } + + form .inputBlock label { + font-size: 14px; + font-weight: bold; + display: block; + + } + + form .inputBlock input { + width: 100%; + height: 32px; + font-size: 14px; + border: 0; + border-bottom: 1px solid #eee; + + } + + form .inputBlock.Message input { + height: 131px; + } + + form buttom[type=submit] { + width: 100%; + border: 0; + margin-top: 30px; + background: #7d40e7 + border-radius: 2px; + padding: 15px 20px; + font-size: 16px; + font-weight: bold; + color: #fff; + cursor: pointer; + transition: background 0.5s; + + } + + form buttom[type=submit]:hover { + background: #6931ac + } + + + h2 { + font-size: 24px; + font-weight: lighter; + margin-bottom: 50px; + margin-top: 20px; + text-align: center; + + } +`; + +function Contact(props) { + + useEffect(() => { + window.scrollTo(0, 0) + }) + + return ( + <> + <link + href="https://fonts.googleapis.com/css?family=Kalam|Pompiere|Roboto:300,400&display=swap" + rel="stylesheet" + /> + <Secao1> + <h2>CONTATO</h2> + <h3>Quer enviar uma mensagem?</h3> + </Secao1> + + <Secao2> + <Formulario noValidate autoComplete="off"> + <h2> + Entre em contato para enviar dúvidas, + <br /> + sugestões ou crÃticas + </h2> + <InputFormulario /> + </Formulario> + </Secao2> + + <Secao3> + <span>MEC - Ministério da Educação </span> + <p> + Endereço: Esplanada dos Ministérios Bloco L - Ed.Sede e Anexos. CEP: + 70.047-900 - BrasÃlia/DF. Telefone: 0800 616161 + </p> + </Secao3> + </> + ); +} + +export default Contact; diff --git a/src/Pages/EditLearningObjectPage.js b/src/Pages/EditLearningObjectPage.js new file mode 100644 index 0000000000000000000000000000000000000000..5f8e84fd37ca9631c73f1ede50177413be608507 --- /dev/null +++ b/src/Pages/EditLearningObjectPage.js @@ -0,0 +1,377 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, useEffect, useContext} from 'react' +import {Store} from '../Store.js' +import axios from 'axios' +import {apiUrl, apiDomain} from '../env'; +import Grid from '@material-ui/core/Grid'; +import UploadFileWrapper from '../Components/UploadPageComponents/UploadFileWrapper.js' +import Alert from '../Components/Alert.js'; +import Snackbar from '@material-ui/core/Snackbar'; +import {GreyButton, OrangeButton, InfoBox} from '../Components/UploadPageComponents/StyledComponents.js' +import {Background} from '../Components/UploadPageComponents/StyledComponents' +import LoadingSpinner from '../Components/LoadingSpinner' +import NewTitle from '../Components/UploadPageComponents/Forms/NewTitle.js' +import SobreORecurso from '../Components/UploadPageComponents/Forms/SobreORecurso.js' +import Keywords from '../Components/UploadPageComponents/Forms/Keywords.js' +import Autor from '../Components/UploadPageComponents/Forms/Autor.js' +import TipoDeRecurso from '../Components/UploadPageComponents/Forms/TipoDeRecurso.js' +import Idioma from '../Components/UploadPageComponents/Forms/Idioma.js' +import EducationalStage from '../Components/UploadPageComponents/PartTwoComponents/EducationalStage.js' +import SubjectsAndThemes from '../Components/UploadPageComponents/PartTwoComponents/SubjectsAndThemes.js' +import Licenca from '../Components/UploadPageComponents/PartTwoComponents/Licenca.js' +import {LoadingDiv} from '../Components/UploadPageComponents/PartTwo.js' +import EditThumbnail from '../Components/UploadPageComponents/PartTwoComponents/EditThumbnail.js' +import DisplayThumbnail from '../Components/UploadPageComponents/PartTwoComponents/DisplayThumbnail.js' +import DragAndDropThumbnail from '../Components/UploadPageComponents/PartTwoComponents/DragAndDropThumbnail' +import {getRequest, deleteRequest, putRequest, postRequest} from '../Components/HelperFunctions/getAxiosConfig.js' + +export default function EditLearningObjectPage (props) { + const recursoId = props.match.params.recursoId + const {state} = useContext(Store) + const [learningObject, setLearningObject] = useState({}) + const [objTypes, setObjTypes] = useState([]) + const [languages, setLanguages] = useState([]) + const [eduStages, setEduStages] = useState([]) + const [subjects, setSubjects] = useState([]) + + function handleSuccessfulGet (data) { + setLearningObject(data) + if(data.thumbnail) { + setThumbnail(data.thumbnail) + setThumbnailStage('done') + } + setUpdatedInfo({...updatedInfo, 'id' : data.id}) + toggleLoading(false) + } + + useEffect( () => { + const url = `/learning_objects/${recursoId}` + getRequest(url, handleSuccessfulGet, (error) => {console.log(error)}) + + axios.get(`${apiUrl}/object_types/`).then( + (response) => { + setObjTypes(response.data.sort((a, b) => (a.name) > (b.name) ? 1 : -1)) + }, (error) => { + console.log(error) + } + ) + + axios.get(`${apiUrl}/languages/`).then( + (response) => { + setLanguages(response.data) + }, (error) => { + console.log(error) + } + ) + + axios.get(`${apiUrl}/educational_stages/`).then( + (response) => { + setEduStages(response.data) + }, + (error) => {console.log(error)} + ) + + axios.get(`${apiUrl}/subjects/`).then( + (response) => { + setSubjects(response.data.sort((a,b) => a.name > b.name ? 1 : -1)) + }, + (error) => {console.log(error)} + ) + }, []) + + const [loading, toggleLoading] = useState(true) + + const [updatedInfo, setUpdatedInfo] = useState({}) + + const onBlurCallback = (fieldName, payload) => { + const key = fieldName + let value = payload + if (key === "tags") { + value = payload.map( (tag, index) => + index = { "name" : tag} + ) + } + setUpdatedInfo({...updatedInfo, [fieldName] : value}) + } + + const [snackbarOpen, toggleSnackbar] = useState(false) + + function handleSuccessfulDelete (data) { + toggleSnackbar(true) + props.history.push("/") + } + + const handleDelete = () => { + const url = `/learning_objects/${learningObject.id}` + + deleteRequest(url, handleSuccessfulDelete, (error) => {console.log(error)}) + } + + const handleUpdateInfo = () => { + const url = `/learning_objects/${learningObject.id}` + let payload = { + "learning_object" : updatedInfo + } + + putRequest(url, payload, + (data) => {props.history.push( `/recurso/${learningObject.id}`)}, + (error) => {console.log(error)} + ) + } + + const handlePost = () => { + const url = `/learning_objects/${learningObject.id}/publish` + + let payload = { + "learning_object" : updatedInfo + } + + postRequest(url, payload, + (data) => {props.history.push( `/recurso/${learningObject.id}`)}, + (error) => {console.log(error)} + ) + + } + + const handleSubmit = () => { + if (state.currentUser.id !== "") { + const url = `/submissions/` + + let payload = { + "submission" : { + "learning_object_id" : learningObject.id + } + } + + postRequest(url, payload, + (data) => {props.history.push( `/recurso/${learningObject.id}`)}, + (error) => {console.log(error)} + ) + + } + } + + const checkAccessLevel = (levelToCheck) => { + if (state.currentUser.id !== '') { + return (checkUserRole(levelToCheck)) + } + } + + const checkUserRole = (userRole) => { + return (state.currentUser.roles.filter((role) => role.name === userRole).length > 0) + } + + const [thumbnailStage, setThumbnailStage] = useState('default') + + const [thumbnail, setThumbnail] = useState('') + const [tempUrl, setTempUrl] = useState('') + + const acceptFile = (file) => { + const objectURL = URL.createObjectURL(file) + console.log('acceptFile: ', file) + setTempUrl(objectURL) + setThumbnailStage('editing') + } + const updateThumb = (newThumbnail) => { + setThumbnail(newThumbnail) + console.log('updateThumb: ', thumbnail) + + } + + function handleFinalizeThumb (data) { + if(data.thumbnail) { + setThumbnail(data.thumbnail) + setThumbnailStage('done') + } + } + + const finalizeThumb = () => { + setThumbnailStage('uploading') + + const url = `/learning_objects/${learningObject.id}` + + let fdThumb = new FormData() + fdThumb.set('learning_object[thumbnail]', thumbnail) + + putRequest(url, fdThumb, handleFinalizeThumb, (error) => {setThumbnailStage('default')}) + } + + const handleDeleteThumbnail = () => { + const url = `/learning_objects/${learningObject.id}` + + let fdThumb = new FormData() + fdThumb.set('learning_object[thumbnail]', null) + + putRequest(url, fdThumb, (data) => {setThumbnailStage('default')}, (error) => {console.log(error)}) + } + + const chooseRenderStageThumbnail = () => { + switch(thumbnailStage) { + case 'uploading': + return (<LoadingDiv/>) + case 'done': + return (<DisplayThumbnail acceptFile={acceptFile} thumbnail={`${apiDomain}` + thumbnail} onEditPage={true} handleDelete={handleDeleteThumbnail}/>) + case 'editing': + return (<EditThumbnail finalizeThumb={finalizeThumb} tempImgURL={tempUrl} updateThumb={updateThumb}/>) + default : + return (<DragAndDropThumbnail acceptFile={acceptFile} onEditPage={true}/>) + + } + } + return ( + <React.Fragment> + <Snackbar open={snackbarOpen} autoHideDuration={1000} onClose={() => {toggleSnackbar(false)}} + anchorOrigin = {{ vertical:'top', horizontal:'right' }} + > + <Alert severity="info" style={{backgroundColor:"#00acc1"}}> + Recurso excluido com sucesso! + </Alert> + </Snackbar> + { + !loading ? + ( + <Background> + <div className="container"> + <Grid container spacing={2}> + <Grid item md={4} xs={12}> + <UploadFileWrapper draftID={recursoId} prevFile={learningObject.attachments ? learningObject.attachments[0] : null}/> + </Grid> + <Grid item md={8} xs={12}> + <InfoBox> + <form> + <div className="cabecalho"> + <h2>Editar Recurso</h2> + </div> + + <Grid item xs={12} style={{paddingBottom : "40px"}}> + {chooseRenderStageThumbnail()} + </Grid> + + <Grid container style={{paddingLeft : "15px", paddingRight : "15px"}}> + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <NewTitle draftID={learningObject.id} initialValue={learningObject.name} + onBlurCallback={onBlurCallback} + /> + </Grid> + + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <SobreORecurso draftID={learningObject.id} initialValue={learningObject.description} onBlurCallback={onBlurCallback}/> + </Grid> + + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <Keywords draftID={learningObject.id} initialValue={learningObject.tags.map((tag) => tag.name)} + onBlurCallback={onBlurCallback}/> + </Grid> + + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <Autor draftID={learningObject.id} + initialValue={ + learningObject.author === state.currentUser.name ? + 0 : 1 + } + initialOutroAutor={ + learningObject.author !== state.currentUser.name ? + learningObject.author : '' + } + onBlurCallback={onBlurCallback} + /> + </Grid> + + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <TipoDeRecurso objTypes={objTypes} draftID={learningObject.id} + initialValue={learningObject.object_type !== null ? objTypes.filter((type) => type.name === learningObject.object_type)[0].id : null} onBlurCallback={onBlurCallback} /> + </Grid> + + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <Idioma languages={languages} draftID={learningObject.id} initialValue={learningObject.language.map((language) => language.name)} initialIDValues={learningObject.language.map((language) => language.id)} + onBlurCallback={onBlurCallback} /> + </Grid> + + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <EducationalStage draftID={learningObject.id} eduStages={eduStages} initialValue={learningObject.educational_stages.map((stage) => String(stage.id))} onBlurCallback={onBlurCallback} + /> + </Grid> + + <SubjectsAndThemes draftId={learningObject.id} subjects={subjects} initialValue={learningObject.subjects.map(subject => String(subject.id))} onBlurCallback={onBlurCallback}/> + + <Grid item xs={12} style={{paddingBottom : "40px"}}> + <Licenca draftID={learningObject.id} initialValue={learningObject.license ? learningObject.license.id : null} onBlurCallback={onBlurCallback}/> + </Grid> + + <Grid item xs={12}> + <div style={{display : "flex", justifyContent : "center"}}> + <GreyButton onClick={handleDelete}> + <span className="button-text"> + EXCLUIR + </span> + </GreyButton> + + <GreyButton onClick={props.history.goBack}> + <span className="button-text"> + CANCELAR + </span> + </GreyButton> + + <OrangeButton onClick={() => {handleUpdateInfo()}}> + SALVAR ALTERAÇÕES + </OrangeButton> + + {/* + learningObject.state === "draft" && + <OrangeButton type="submit"> + PUBLICAR RECURSO + </OrangeButton> + */} + { + checkAccessLevel("partner") ? + ( + <OrangeButton onClick={() => {handleUpdateInfo(); handlePost()}}>PUBLICAR RECURSO</OrangeButton> + ) + : + ( + <OrangeButton onClick={() => {handleUpdateInfo(); handleSubmit()}}>SUBMETER RECURSO</OrangeButton> + ) + + } + </div> + </Grid> + + <Grid item xs={12} style={{marginTop : "20px"}}> + <span style={{marginTop : "20px", fontWeight : "200", color : "#a5a5a5", paddingLeft : "10px"}}> + * Campos obrigatórios + </span> + </Grid> + </Grid> + + </form> + </InfoBox> + </Grid> + </Grid> + </div> + </Background> + ) + : + ( + <LoadingSpinner text={"CARREGANDO"}/> + ) + } + </React.Fragment> + ) +} diff --git a/src/Pages/EditProfilePage.js b/src/Pages/EditProfilePage.js new file mode 100644 index 0000000000000000000000000000000000000000..0cf1e91667ca942dca98460c73cb6223519de77c --- /dev/null +++ b/src/Pages/EditProfilePage.js @@ -0,0 +1,246 @@ +import React, { useState, useContext } from 'react'; +import styled from 'styled-components' +import Tabs from '@material-ui/core/Tabs' +import Tab from '@material-ui/core/Tab'; +import Paper from '@material-ui/core/Paper'; +import TabPanelEditarPerfil from '../Components/TabPanels/UserPageTabs/PanelEditarPerfil.js' +import TabPanelSolicitarContaProfessor from '../Components/TabPanels/UserPageTabs/PanelSolicitarContaProfessor.js' +import TabPanelGerenciarConta from '../Components/TabPanels/UserPageTabs/PanelGerenciarConta.js' +import Snackbar from '@material-ui/core/Snackbar'; +import { Alert } from '../Components/LoginModal.js' +import Grid from '@material-ui/core/Grid' +import CustomizedBreadcrumbs from '../Components/TabPanels/Breadcrumbs.js' +import { putRequest } from '../Components/HelperFunctions/getAxiosConfig' +import { Store } from '../Store.js' + +export default function EditProfilePage(props) { + const { state, dispatch } = useContext(Store) + const id = state.currentUser.id + + // eslint-disable-next-line + const [tabs, setTabs] = useState([ + 'Editar Perfil', 'Solicitar conta de Professor', 'Gerenciar Conta' + ]) + const [tabValue, setTabValue] = useState(props.location.tabValue !== undefined ? props.location.tabValue.value : 0) + const handleChangeTab = (e, newValue) => { + setTabValue(newValue) + } + + const [snackbarOpened, handleSnackbar] = useState({ + open: false, + severity: "", + text: "" + }) + const handleCloseSnackbar = (event, reason) => { + if (reason === 'clickaway') { + return; + } + + handleSnackbar({ + open: false, + severity: "", + text: "" + }); + } + + const updateUserInfo = (newUserInfo) => { + const url = `/users/${id}` + + putRequest(url, newUserInfo, + (data) => { props.history.push('/perfil') }, + (error) => { + handleSnackbar({ + open: true, + severity: "error", + text: "Ocorreu um erro!" + }); + } + ) + } + + function handleSuccessUpdateEmail(data) { + let auth_headers = JSON.parse(sessionStorage.getItem('@portalmec/auth_headers')) + + auth_headers['uid'] = data.uid + + sessionStorage.setItem('@portalmec/auth_headers', JSON.stringify(auth_headers)) + + const target = state.currentUser + const source = { uid: data.uid } + + handleSnackbar({ + open: true, + severity: "success", + text: "O email foi atualizado com sucesso!" + }); + + dispatch({ + type: 'USER_UPDATED_EMAIL', + currUser: Object.assign(target, source) + }) + } + + const updateUserEmail = (newUserInfo) => { + const url = `/users/${id}` + + putRequest( + url, + newUserInfo, + handleSuccessUpdateEmail, + (error) => { + handleSnackbar({ + open: true, + severity: "error", + text: "Ocorreu um erro!" + }); + } + ) + } + + const updateUserPassword = (newUserInfo) => { + const url = `/users/${id}` + + putRequest(url, newUserInfo, + (data) => { + handleSnackbar({ + open: true, + severity: "success", + text: "A senha foi alterada com sucesso" + }); + }, + (error) => { + handleSnackbar({ + open: true, + severity: "error", + text: "Ocorreu um erro!" + }); + } + ) + } + + return ( + <div style={{ backgroundColor: "#f4f4f4", color: "#666" }}> + <Snackbar open={snackbarOpened.open} autoHideDuration={1000} onClose={handleCloseSnackbar} + anchorOrigin={{ vertical: 'top', horizontal: 'right' }} + > + <Alert severity={snackbarOpened.severity} >{snackbarOpened.text}</Alert> + </Snackbar> + + <CustomizedBreadcrumbs + values={["Minha área", "Configurações da Conta", tabs[tabValue]]} + /> + + <MainContainerDiv container spacing={3} justify="center" align="center"> + <Grid item xs={12} md={3} style={{ fontFamily: "Roboto" }} > + <Paper elevation={3}> + <ConfiguracoesMenu> + <h4 style={{ marginTop: "10px", fontFamily: "inherit", display: "flex", justifyContent: "center" }}> + Configurações da Conta + </h4> + <StyledTabs + orientation="vertical" + variant="fullWidth" + value={tabValue} + onChange={handleChangeTab} + TabIndicatorProps={{ style: { display: "none" } }} + > + <StyledTab label={tabs[0]} /> + <StyledTab label={tabs[1]} /> + <StyledTab label={tabs[2]} /> + </StyledTabs> + </ConfiguracoesMenu> + </Paper> + </Grid> + <TabContentDiv item xs={12} md={9}> + <Paper elevation={3} style={{ width: "100%" }}> + {tabValue === 0 && <TabPanelEditarPerfil updateUserInfo={updateUserInfo} />} + {tabValue === 1 && <TabPanelSolicitarContaProfessor />} + </Paper> + {tabValue === 2 && <TabPanelGerenciarConta updateUserEmail={updateUserEmail} + updateUserPassword={updateUserPassword} + />} + </TabContentDiv> + </MainContainerDiv> + </div> + ) +} + +const TabContentDiv = styled(Grid)` + + .card-config { + padding : 40px; + margin : 20px 0 20px 10px; + border-radius : 3px; + box-shadow : 0 0 5px 0rgba(0,0,0,.25); + background-color : #fff; + text-align : start; + margin-left : auto; + margin-right : auto; + display : flex; + flex-direction : column; + } + + .content-div { + display : flex; + flex-direction : column; + align-content : stretch; + align-items : stretch; + font-family : 'Roboto', sans serif !important; + font-size : 14px; + justify-content : center; + line-height : 20px; + text-align : center; + color : #666; + } + + .h2 { + margin-top : 20px; + margin-bottom : 10px; + } + + .p { + margin : 0 0 10px; + } + + .h1 { + font-size : 30px; + font-weight : 300; + margin-top : 0; + margin-bottom : 10px; + } + + .h4 { + font-size : 18px; + margin-top : 10px; + margin-bottom : 10px; + font-weight : 500; + line-height : 1.1; + } +` + +const StyledTabs = styled(Tabs)` + display : flex; + justify-content : center; + .Mui-selected { + background-color : #f4f4f4; + } +` + +const StyledTab = styled(Tab)` + &:hover { + background-color : #6666663d; + } +` + +const ConfiguracoesMenu = styled.div` + margin : 20px 0 20px 0; + border-radius : 3px; + padding : 20px 0; + background-color : #fff; +` + +const MainContainerDiv = styled(Grid)` + padding : 0; + width : 90%; + margin: 0 auto; +` diff --git a/src/Pages/FormationMaterialIframe.js b/src/Pages/FormationMaterialIframe.js new file mode 100644 index 0000000000000000000000000000000000000000..9f59d62f31a3715411690515a2e3dea43b9a6303 --- /dev/null +++ b/src/Pages/FormationMaterialIframe.js @@ -0,0 +1,61 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React from 'react'; +import styled from 'styled-components'; +import colecoes_obj from '../Components/FormationMaterialsResources/formationMaterials.js'; +import IframeOverlay from '../Components/IframeOverlay.js'; + +export default function FormationMaterialIframe(props) { + const colecao = props.location.pathname === "/colecao"; + const colecoes = colecoes_obj(); + + const colecao_id = Number( + colecao ? + props.location.search.split('=')[1] + : props.location.search.split('&')[0].split('=')[1] + ); + const topico_id = Number(colecao ? 0 : props.location.search.split('&')[1].split('=')[1]); + + const colecao_obj = ((id) => { + for (const c in colecoes) { + if (id === colecoes[c].id) + return colecoes[c]; + } + })(colecao_id); + + const topico_obj = ((id) => { + for (const t in colecao_obj.topics) { + if (id === colecao_obj.topics[t].id) + return colecao_obj.topics[t]; + } + })(topico_id); + + return ( + <div> + <StyledIframe src={topico_obj.url} + /> + <IframeOverlay tag={colecao_obj.tags[0].name}/> + </div> + ); +} + +const StyledIframe=styled.iframe` + width: 98.9vw; + height: 83.5vh; + min-height: 300px; +` diff --git a/src/Pages/FormationMaterialPage.js b/src/Pages/FormationMaterialPage.js new file mode 100644 index 0000000000000000000000000000000000000000..797074618d38f7d3282a57a2ed8d5641ae06e512 --- /dev/null +++ b/src/Pages/FormationMaterialPage.js @@ -0,0 +1,155 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useRef } from 'react'; +import styled from 'styled-components'; +import { Grid } from '@material-ui/core'; +import FormationMaterialHeader from '../Components/FormationMaterialHeader.js'; +import FormationMaterialDescription from '../Components/FormationMaterialDescription.js'; +import TopicList from '../Components/TopicList.js'; +import TopicFooter from '../Components/TopicFooter.js'; +import colecoes_obj from '../Components/FormationMaterialsResources/formationMaterials.js'; +import Breadcrumbs from "@material-ui/core/Breadcrumbs"; +import {Link} from "react-router-dom" + +export default function FormationMaterialPage(props) { + const colecao = props.location.pathname === "/colecao"; + const colecoes = colecoes_obj(); + + const colecao_id = Number( + colecao ? + props.location.search.split('=')[1] + : props.location.search.split('&')[0].split('=')[1] + ); + const topico_id = Number(colecao ? 0 : props.location.search.split('&')[1].split('=')[1]); + + const colecao_obj = ((id) => { + for (const c in colecoes) { + if (id === colecoes[c].id) + return colecoes[c]; + } + })(colecao_id); + + const topico_obj = ((id) => { + for (const t in colecao_obj.topics) { + if (id === colecao_obj.topics[t].id) + return colecao_obj.topics[t]; + } + })(topico_id); + + const topic_list_ref = useRef(null); + + const handleHeaderClick = () => { + if (colecao) + window.scrollTo(0, topic_list_ref.current.offsetTop); + } + + console.log(colecao_obj); + + return ( + <Background> + <BreadCrumbsDiv> + <StyledBreadCrumbs> + <Link to="/">Página Inicial</Link> + <span> + { + colecao ? "Material de formação" : "Tópicos" + } + </span> + </StyledBreadCrumbs> + </BreadCrumbsDiv> + <MainContainer> + <Grid container + direction="row" + justify="flex-start" + alignItems="center" + > + <Grid item xs={12}> + <FormationMaterialHeader + colecao={colecao} + colecao_obj={colecao_obj} + topico_obj={topico_obj} + handleClick={handleHeaderClick} + /> + </Grid> + <Grid item xs={12}> + <FormationMaterialDescription + colecao={colecao} + colecao_obj={colecao_obj} + topico_obj={topico_obj} + /> + </Grid> + <Grid item xs={12} ref={topic_list_ref}> + { + colecao ? + <TopicList + topicos={colecao_obj.topics} + colecao_id={colecao_id} + /> + : + <div></div> + } + </Grid> + </Grid> + </MainContainer> + {colecao ? + <div></div> + : + <TopicFooter + topic_name={colecao_obj.topic_name} + src={colecao_obj.img} + colecao_name={colecao_obj.name} /> + } + </Background> + ); +} + +const Background = styled.div` + background-color: #f4f4f4; +` +const MainContainer = styled.div` + margin-left: auto; + margin-right: auto; + padding : 0; + + @media screen and (min-width: 768px) { + width : 750px; + } + @media screen and (min-width: 992px) { + width : 970px; + } + @media screen and (min-width: 1200px) { + width : 1170px; + } +` +const StyledBreadCrumbs = styled(Breadcrumbs)` + display: flex; + justify-content: flex-start; + max-width: 1170px; + span { + color: #a5a5a5; + } + a { + color: #00bcd4; + text-decoration: none; + } +` + +const BreadCrumbsDiv = styled.div` + padding: 10px; + display: flex; +` diff --git a/src/Pages/HelpCenter.js b/src/Pages/HelpCenter.js new file mode 100644 index 0000000000000000000000000000000000000000..8b5ae50935da62fd6dc530bd1b82d50e6d4df6eb --- /dev/null +++ b/src/Pages/HelpCenter.js @@ -0,0 +1,433 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect } from 'react'; +import styled from 'styled-components'; +import Grid from '@material-ui/core/Grid'; +import { Link } from 'react-router-dom'; + + + + +import Banner3 from '../img/ajuda/Banner3.png'; +import CardPublicando from '../Components/HelpCenter/Cards/CardPublicando'; +import CardEncontrando from '../Components/HelpCenter/Cards/CardEncontrando'; +import CardParticipando from '../Components/HelpCenter/Cards/CardParticipando'; +import CardGerenciando from '../Components/HelpCenter/Cards/CardGerenciando'; + + + + +function HelpCenter(props) { + let windowWidth = window.innerWidth + + useEffect(() => { window.scrollTo(0, 0) }, []) + + return ( + <div style={{ backgroundColor: "#f4f4f4" }}> + <link href="https://fonts.googleapis.com/css?family=Pompiere|Roboto:300,400&display=swap" rel="stylesheet" /> + + <Secao1> + <div className="container"> + { + windowWidth > 420 ? + <img src={Banner3} alt="banner3" /> + : + <div /> + } + <div className="conteudo"> + <div className="title"> + <h2>OLÃ! COMO PODEMOS AJUDAR?</h2> + </div> + </div> + </div> + </Secao1> + + <Secao2> + <div className="container"> + <div className="container-secao"> + <div className="conteudo"> + <div className="cabecalho"> + <h2>Tópicos de Ajuda</h2> + </div> + <div> + <Grid container justify="center" style={{ margin: -8 }}> + <Grid item xs={12} md={5} style={{ padding: 8 }}> + <CardPublicando /> + </Grid> + <Grid item xs={12} md={5} style={{ padding: 8 }}> + <CardEncontrando /> + </Grid> + <Grid item xs={12} md={5} style={{ padding: 8 }}> + <CardParticipando /> + </Grid> + <Grid item xs={12} md={5} style={{ padding: 8 }}> + <CardGerenciando /> + </Grid> + </Grid> + </div> + </div> + </div> + </div> + + </Secao2> + <div style={{ width: "100%" }}> + <Secao3> + <Grid style={{ height: "100%" }} container justify="center"> + <Grid style={{ backgroundColor: "#333", paddingInline: "0" }} item xs={12} md={6}> + <iframe title="VÃdeo página ajuda" src="https://player.vimeo.com/video/231609051" width="100%" height="100%" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe> + </Grid> + <Grid item xs={12} md={6}> + <div> + <p className="titulo-sobre-ajuda">Plataforma MEC de Recursos Educacionais Digitais</p> + <p className="conteudo-sobre-ajuda"> + Construa conosco a plataforma e amplie sua rede de conhecimento + interagindo com pessoas envolvidas com experiências que ocorrem + em todo o Brasil! + </p> + </div> + <Grid container> + <Grid item xs={12} md={6}> + <p className="links"> + <br /> + <Link to={{ + pathname: 'plataforma-mec', + state: { value: '0' } + }}>O que é a Plataforma MEC</Link> + <br /> + <Link to={{ + pathname: 'plataforma-mec', + state: { value: '1' } + }}>Como foi construida a Plataforma<br />MEC?</Link> + <br /> + <Link to={{ + pathname: 'plataforma-mec', + state: { value: '3' } + }}>Quais são os Portais Parceiros?</Link> + </p> + </Grid> + <Grid item xs={12} md={6}> + <p className="links"> + <br /> + <Link to={{ + pathname: 'plataforma-mec', + state: { value: '2' } + }}>Entendendo as 3 áreas</Link> + <br /> + <Link to={{ + pathname: 'plataforma-mec', + state: { value: '4' } + }}>Tipos de recursos</Link> + <br /> + <Link to={{ + pathname: 'plataforma-mec', + state: { value: '5' } + }}>Softwares especÃficos</Link> + </p> + </Grid> + </Grid> + + </Grid> + </Grid> + </Secao3> + </div> + + <Secao4> + <div className="container"> + <div className="conteudo"> + <h2>Não encontrou o que você precisa?</h2> + <span>Entre em contato com a nossa Central de Ajuda</span> + <br /> + <button style={{ marginBottom: 50, marginTop: 20 }}><a href="contato">ENTRAR EM CONTATO</a></button> + + </div> + </div> + </Secao4> + + </div> + ); +} + +export default HelpCenter; + + +const Secao1 = styled.div` + background-color:#00bcd4; + text-align: center; + width: 100%; + .container { + height: 100%; + display: flex; + -webkit-box-pack: center; + justify-content: center; + -webkit-box-align: center; + align-items: center; + padding-left: 15px; + margin-right: auto; + margin-left: auto; + + img { + position: relative; + top: 41.6%; + max-width: 230px; + width: 90%; + float: left; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; + + } + + + .conteudo { + display: flex; + justify-content: center; + + .title { + + } + } + + h2 { + font-family: Pompiere,cursive; + font-size: 35px; + margin: 0; + margin-top: 45px; + color:#fff; + font-weight: 500; + line-height: 1.1; + } + + } +` + +const Secao2 = styled.div` + background-color:#f4f4f4; + text-align: center; + margin-bottom: 20px; + padding-bottom: 50px + width: 100%; + .container { + height: 100%; + margin-right: auto; + margin-left: auto; + + .container-secao { + height: 100%; + padding-top: 50px; + .conteudo { + width: 100%; + text-align: center; + .cabecalho { + margin-bottom: 50px; + text-align: center; + h2 { + font-size: 30px; + font-weight: lighter; + color:#666; + margin: 0; + } + } + .card-ajuda { + + height: 360px; + margin-bottom: 20px + + + .card { + height: 280px; + padding: 40px 0px; + text-align: center; + font-size: 14px; + background-color:#fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + + h3 { + font-size: 24px; + font-weight: 400; + color: #666; + margin-top: 20px; + margin-bottom: 10px; + line-height: 1.1; + } + + + a { + font-size: 15px; + color: #666; + text-decoration: none; + text-align: center; + + } + + img { + height: 62px ; + width: 62px ; + } + + } + + .card-rodape { + box-sizing: border-box; + + a { + border-radius: 0; + width: 240.5px; + font-size: 13px; + font-weight: 700; + color: #fff; + transition: .2s ease; + border: none; + height: 40px; + padding: 0 20px; + line-height: 40px; + background-color: #00bcd4; + touch-action: manipulation; + cursor: pointer; + text-decoration: none; + display: inline-block; + margin-bottom: 0; + text-align: center; + white-space: nowrap; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + user-select: none; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + + } + } + + } + } + } + } + + +` + +const Secao3 = styled.div` + padding: 0; + text-align: center; + background-color: #fff; + margin-inline: auto; + color: rgba(0,0,0,0.87); + width: 100%; + .links { + font-size: 15px; + font-weight: lighter; + text-align: center; + margin: 0 0 10px; + line-height: 1.42857143; + a { + color: #666; + text-decoration: none; + :hover { + color: #000; + } + } + } + + .titulo-sobre-ajuda { + font-family: Pompiere; + font-size: 30px; + margin-block: 40px + } + + .conteudo-sobre-ajuda { + font-size: 15px; + margin-bottom: 30px; + margin: 0 0 10px; + } + + + + +` + +const Secao4 = styled.div` + width: 100%; + .container { + height: 100%; + color: #a5a5a5; + margin-inline: auto; + display: flex; + flex-direction: column; + justify-content: center; + .conteudo { + width: 100%; + text-align: center; + + h2 { + font-size: 24px; + font-weight: lighter; + color:#666; + margin-top: 20px; + margin-bottom: 10px; + text-align: center; + } + + span { + font-size: 15px; + color:#777; + text-align: center; + + } + + button { + margin-top: 25px; + color: rgba(255,255,255,0.87); + background-color: rgb(255,127,0); + box-shadow: 0 2px 5px 0 rgba(0,0,0,.26); + outline: none;display: inline-block; + position: relative; + cursor: pointer; + min-height: 36px; + min-width: 88px; + line-height: 36px; + vertical-align: middle; + -webkit-box-align: center; + align-items: center; + text-align: center; + border-radius: 3px; + box-sizing: border-box; + user-select: none; + border: 0; + padding: 0 6px; + margin: 6px 8px; + white-space: nowrap; + text-transform: uppercase; + font-weight: 500; + font-size: 14px; + font-style: inherit; + font-variant: inherit; + font-family: inherit; + text-decoration: none; + overflow: hidden; + transition: box-shadow .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1); + letter-spacing: .01em; + a { + text-decoration: none; + color: #fff; + } + } + } + } + + +` diff --git a/src/Pages/Home.js b/src/Pages/Home.js index 2ad839baec1eabd782b36dfb2e523637b7d2ad27..9e1ed689888c44d5f3f7ad22d6896f239980ab8d 100755 --- a/src/Pages/Home.js +++ b/src/Pages/Home.js @@ -16,37 +16,37 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; +import React, { Component } from 'react'; import './Styles/Home.css'; import SearchSection from '../Components/SearchSection'; import SubPages from '../Components/AreasSubPages'; import StatsBar from '../Components/StatsBar'; import Funcionalities from '../Components/Funcionalities'; class App extends Component { - constructor(props){ - super(props); - this.state={ - bannerState: "Recursos" - }; - this.changeBanner = this.changeBanner.bind(this) - } - - changeBanner(parameter){ - this.setState({ - bannerState: parameter - }); - } + constructor(props) { + super(props); + this.state = { + bannerState: "Recursos" + }; + this.changeBanner = this.changeBanner.bind(this) + } + + changeBanner(parameter) { + this.setState({ + bannerState: parameter + }); + } render() { - return ( - <React.Fragment> - <SearchSection function={this.changeBanner} banner={this.state.bannerState}/> - <SubPages banner={this.state.bannerState}/> - <StatsBar/> - <Funcionalities/> - </React.Fragment> - ); + return ( + <React.Fragment> + <SearchSection function={this.changeBanner} banner={this.state.bannerState} /> + <SubPages banner={this.state.bannerState} /> + <StatsBar /> + <Funcionalities /> + </React.Fragment> + ); } - } +} export default App; diff --git a/src/Pages/HomeFunction.js b/src/Pages/HomeFunction.js new file mode 100644 index 0000000000000000000000000000000000000000..e2288df46a396c5ff799fadaef313c5554d8d941 --- /dev/null +++ b/src/Pages/HomeFunction.js @@ -0,0 +1,39 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState} from 'react'; +import './Styles/Home.css'; +import SearchSection from '../Components/SearchSectionFunction'; +import SubPages from '../Components/AreasSubPagesFunction'; +import StatsBar from '../Components/StatsBarFunction'; +import Funcionalities from '../Components/Funcionalities'; + +export default function App (props) { + const [bannerState, handleChangeBanner] = useState("Recursos") + + const changeBanner = (parameter) => {handleChangeBanner(parameter)} + + return ( + <React.Fragment> + <SearchSection function={changeBanner} banner={bannerState}/> + <SubPages banner={bannerState}/> + <StatsBar/> + <Funcionalities/> + </React.Fragment> + ) +} diff --git a/src/Pages/ItemStore.js b/src/Pages/ItemStore.js new file mode 100644 index 0000000000000000000000000000000000000000..45c3649d1a69a5535dcaee82960343f373527745 --- /dev/null +++ b/src/Pages/ItemStore.js @@ -0,0 +1,101 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React, {useState, useEffect} from 'react'; +import styled from 'styled-components'; +import axios from 'axios'; +import Grid from '@material-ui/core/Grid'; +import Container from '@material-ui/core/Container'; +import UserCardGamified from '../Components/UserCardGamified.js'; +import StoreGuide from '../Components/StoreGuide.js'; +import ItemCarousel from '../Components/ItemCarousel.js'; +import {apiUrl} from '../env'; + +const SectionTitle = styled.h3` + font-weight: 100; + margin-bottom: 0; +` + +const StoreDivider = styled.hr` + width: 50px; + margin-left: 0; +` + +const StoreSection = styled.div` + font-size: 1.5em; + margin-top: 60px; + margin-bottom: 20px; +` + +export default function ItemStoreContainer (props) { + const [avatar_frames, setAvatarFrames] = useState([]); + const [card_frames, setCardFrames] = useState([]); + const [cover_frames, setCoverFrames] = useState([]); + const [badges, setBadges] = useState([]); + + useEffect(() => { + axios.all( + ['avatar_frame', 'card_frame', 'cover_frame', 'badge'].map((r) => { + return axios.get(`${apiUrl}/user_items/index?item_type=${r}&unlock_rule=purchase`); + })).then(axios.spread((avatar, card, cover, badge) => { + setAvatarFrames(avatar); + setCardFrames(card); + setCoverFrames(cover); + setBadges(badge); + })); + }, []) + + return ( + <Container style={{paddingTop : "2em", backgroundColor : "#f4f4f4", width: '100%'}}> + <Grid container + direction="row" + justify="space-around" + alignItems="stretch" + style={{ + marginTop: '2em', + marginBottom: '2em', + }} + > + <UserCardGamified/> + <StoreGuide/> + </Grid> + <StoreSection> + <SectionTitle>Bordas de avatar</SectionTitle> + <StoreDivider/> + <ItemCarousel items={avatar_frames}/> + </StoreSection> + + <StoreSection> + <SectionTitle>InsÃgnias</SectionTitle> + <StoreDivider/> + <ItemCarousel items={badges}/> + </StoreSection> + + <StoreSection> + <SectionTitle>Bordas de card</SectionTitle> + <StoreDivider/> + <ItemCarousel items={card_frames}/> + </StoreSection> + + <StoreSection> + <SectionTitle>Bordas de capa de perfil</SectionTitle> + <StoreDivider/> + <ItemCarousel items={cover_frames}/> + </StoreSection> + </Container> + ) +} diff --git a/src/Pages/MaterialPage.js b/src/Pages/MaterialPage.js new file mode 100644 index 0000000000000000000000000000000000000000..9b243b8b8da922a631f9e774d6143a0fa09fa36b --- /dev/null +++ b/src/Pages/MaterialPage.js @@ -0,0 +1,145 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState } from "react"; +import { Col, Row, Container } from "react-grid-system"; +import { Carousel } from "react-responsive-carousel"; +import MaterialCard from "../Components/MaterialCard"; +import colecoes_obj from "../Components/FormationMaterialsResources/formationMaterials"; +import ExpandedMaterial from "../Components/ExpandedMaterials"; +import styled from "styled-components"; +import Breadcrumbs from "@material-ui/core/Breadcrumbs"; +import { Link } from "react-router-dom"; +const MateriaPage = () => { + const materials = colecoes_obj(); + + const [currMaterial, setCurrMaterial] = useState({ + open: false, + material: {}, + }); + + const HandleExpandMaterial = (id) => { + if (id !== currMaterial.material.id) + setCurrMaterial({ + open: true, + material: { ...materials[id] }, + }); + else + setCurrMaterial({ + open: false, + material: {}, + }); + }; + + return ( + <> + <link href="https://fonts.googleapis.com/css?family=Kalam|Pompiere|Roboto&display=swap" rel="stylesheet" /> + <BreadCrumbsDiv> + <StyledBreadCrumbs> + <Link to="/">Página Inicial</Link> + <span>Materias de Formação</span> + </StyledBreadCrumbs> + </BreadCrumbsDiv> + <StyledBox> + <StyledTitle> + Materias de formação + </StyledTitle> + </StyledBox> + <MainContainer> + <Container style={{ padding: "20px" }}> + <Carousel + style={{ padding: "20px" }} + showThumbs={false} + showStatus={false} + > + <Row> + {materials.map((material, index) => { + return ( + <Col md={3} key={index}> + <MaterialCard + name={material.name} + thumb={material.img} + score={material.score} + modules={material.topics} + handleExpand={HandleExpandMaterial} + id={index} + /> + </Col> + ); + })} + </Row> + </Carousel> + {currMaterial.open ? ( + <ExpandedMaterial material={currMaterial.material} /> + ) : null} + </Container> + </MainContainer> + </> + ); +}; + +export default MateriaPage; + +const MainContainer = styled.div` + margin-left: auto; + margin-right: auto; + padding: 0; + + @media screen and (min-width: 768px) { + width: 750px; + } + @media screen and (min-width: 992px) { + width: 970px; + } + @media screen and (min-width: 1200px) { + width: 1170px; + } +` + +const StyledBreadCrumbs = styled(Breadcrumbs)` + display: flex; + justify-content: flex-start; + max-width: 1170px; + span { + color: #a5a5a5; + } + a { + color: #00bcd4; + text-decoration: none; + } +` + +const BreadCrumbsDiv = styled.div` + padding: 10px; + display: flex; +` + +const StyledBox = styled.div` + background-color: #fff; + box-shadow: 1px 1px 3px rgba(0,0,0,.12), 1px 1px 2px rgba(0,0,0,.24); + padding: 30px; + margin-bottom: 30px; + text-align: center; +` +const StyledTitle = styled.span` + text-align: center; + color: #e81f4f; + font-size: 26px; + font-family: "Roboto", sans-serif; + font-weight: 100; +` \ No newline at end of file diff --git a/src/Pages/PageProfessor.js b/src/Pages/PageProfessor.js new file mode 100644 index 0000000000000000000000000000000000000000..96cd46bb141e537274c606200855b89428a8e54a --- /dev/null +++ b/src/Pages/PageProfessor.js @@ -0,0 +1,161 @@ +import React, {useState,useContext} from 'react' +import {Store} from '../Store.js' +import Paper from '@material-ui/core/Paper'; +import PartOne from '../Components/PageProfessorComponents/PartOne.js' +import PartTwo from '../Components/PageProfessorComponents/PartTwo.js' +import PartThree from '../Components/PageProfessorComponents/PartThree.js' +import SuccessfulRequest from '../Components/PageProfessorComponents/SuccessfulRequest.js' +import ModalConfirmarProfessor from '../Components/PageProfessorComponents/ModalConfirmarProfessor.js' +import {postRequest} from '../Components/HelperFunctions/getAxiosConfig' + +export default function PageProfessor (props) { + const {state} = useContext(Store) + const [modalOpen, toggleModal] = useState(false) + const handleModal = () => { + toggleModal(!modalOpen) ; + } + + const redirect = () => { + props.history.push('/termos-publicar-recurso') + } + + const [registerInformation, setRegisterInformation] = useState( + { + teacher_cpf: '', + school_phone: '', + school_name: '', + school_city : '', + school_uf : { + abbreviation : '', + name : '' + }, + inep_code: '' + } + ) + + const [stepper, handleStepper] = useState( + [ {value : '1', selected : true}, {value : '2', selected : false}, {value : '3', selected : false}, {value : '4', selected : false}] + ) + const toggleStepper = (selected1, selected2, selected3, selected4) => { + handleStepper( + [ + {value : '1', selected : selected1}, + {value : '2', selected : selected2}, + {value : '3', selected : selected3}, + {value : '4', selected : selected4} + ] + ) + } + + const handleBuscarParteUm = (ufAbbreviation, ufName, nomeMunicipio, inep) => { + setRegisterInformation({...registerInformation, + school_uf : { + abbreviation: (ufAbbreviation ? ufAbbreviation : ''), + name : (ufName ? ufName : '') + }, + school_city : (nomeMunicipio ? nomeMunicipio : ''), + inep_code : (inep ? inep : '') + }) + toggleStepper(false, true, false, false) + } + + const handleBuscarParteDois = (city_name, inep, school_name, state_name) => { + const uf_abbreviation = registerInformation.school_uf.abbreviation + const prev_state_name = registerInformation.school_uf.name + const prev_city_name = registerInformation.school_city.name + + setRegisterInformation({...registerInformation, + school_uf : { + abbreviation : uf_abbreviation, + name: (state_name ? state_name : prev_state_name) + }, + school_city :(city_name ? city_name : prev_city_name), + school_name: (school_name ? school_name : ''), + inep_code : (inep ? inep : '') + }) + toggleStepper(false, false, true, false) + } + + const handleParteTres = (phone, cpf) => { + setRegisterInformation({...registerInformation, + teacher_cpf: (cpf ? cpf : ''), + school_phone: (phone ? phone : ''), + }) + handleModal(); + } + + const handleCancelar = () => { + props.history.push('/perfil/atualizacoes') + } + + function handleSuccessfulSubmit (data) { + toggleModal() + toggleStepper(false, false, false, true) + } + + const handleFinalSubmit = () => { + const url = `/users/teacher_request` + + const payload = { + city : registerInformation.school_city.name, + cpf : registerInformation.teacher_cpf, + inep_id : registerInformation.inep_code, + phone : registerInformation.school_phone, + school : registerInformation.school_name, + uf : registerInformation.school_uf.name + } + + postRequest(url, payload, handleSuccessfulSubmit, (error) =>{console.log(error)}) + } + + return ( + <> + { + state.userAgreedToPublicationTerms? + ( + <> + <ModalConfirmarProfessor open={modalOpen} handleClose={handleModal} + info={registerInformation} confirmar = {() => {handleFinalSubmit()}} + cancelar = {() => {toggleModal()}} + /> + <div style={{backgroundColor:"#f4f4f4", color:"#666"}}> + <div style={{display: "flex", justifyContent:"center", paddingTop:"5vh", paddingBottom:"5vh"}}> + <Paper elevation={3} style= {{width:"max-content"}}> + <div style={{paddingRight:"15px", paddingLeft:"15px"}}> + {stepper[0].selected && + <PartOne stepper={stepper} handleBuscar={handleBuscarParteUm} + handleCancelar={handleCancelar} + /> + } + {stepper[1].selected && + <PartTwo stepper={stepper} + info={registerInformation} goBack={toggleStepper} + handleCancelar={handleCancelar} handleBuscar={handleBuscarParteDois} + /> + } + {stepper[2].selected && + <PartThree stepper={stepper} goBack={toggleStepper} + handleCancelar={handleCancelar} info={registerInformation} + handleSubmit={handleParteTres} + /> + } + { + stepper[3].selected && + <SuccessfulRequest email={state.currentUser.email} history={props.history}/> + } + </div> + </Paper> + </div> + </div> + </> + ) + : + ( + <> + {redirect()} + </> + ) + } + </> + ) +} diff --git a/src/Pages/PasswordRecoveryPage.js b/src/Pages/PasswordRecoveryPage.js new file mode 100644 index 0000000000000000000000000000000000000000..010a164ba112a342e7e01e14fc2c5ba2bc38a1ff --- /dev/null +++ b/src/Pages/PasswordRecoveryPage.js @@ -0,0 +1,103 @@ +import React, {useState} from 'react' +import {BackgroundDiv} from '../Components/TabPanels/StyledComponents.js' +import Paper from '@material-ui/core/Paper'; +import styled from 'styled-components' +import ValidateUserInput from '../Components/HelperFunctions/FormValidationFunction.js' +import Default from '../Components/PasswordRecoveryComponents/Default.js' +import Success from '../Components/PasswordRecoveryComponents/Success.js' +import CaseError from '../Components/PasswordRecoveryComponents/Error.js' +import CustomizedBreadcrumbs from '../Components/TabPanels/Breadcrumbs.js' +import {postRequest} from '../Components/HelperFunctions/getAxiosConfig' + +export default function PasswordRecoveryPage (props) { + + const [formEmail, setEmail] = useState( + { + key : false, + value : "" + + } + ) + + const handleChange = (e) => { + const userInput = e.target.value + const flag = ValidateUserInput('email', userInput) + + setEmail({...formEmail, + key : flag, + value : userInput + }) + } + + const [aux, setCase] = useState('default') + const handleChangeSwitch = (value) => { + console.log(value) + if (value !== "success") { + setEmail({key : false, value : ""}) + } + setCase(value) + }; + + function handleSuccessfulSubmit (data) { + handleChangeSwitch((data.success ? "success" : "error")) + } + const onSubmit = (e) => { + e.stopPropagation() + + const url = `/auth/password` + + const payload = { + "email" : formEmail.value, + "redirect_url" : "https://plataformaintegrada.mec.gov.br/recuperar-senha#/alterar-senha" + } + + postRequest(url, payload, handleSuccessfulSubmit, (error) => {console.log(error)}) + + } + + + const components = { + default : <Default handleChange={handleChange} onSubmit={onSubmit} value={formEmail.value} error={formEmail.key}/>, + success : <Success email={formEmail.value} changeSwitch={handleChangeSwitch}/>, + error : <CaseError handleChange={handleChange} onSubmit={onSubmit} value={formEmail.value} error={formEmail.key}/> + } + + const switchFunction = (value) => { + switch(value) { + case 'success': + return components.success; + case 'error': + return components.error; + default: + return components.default + + } + } + + return ( + <> + <BackgroundDiv> + <div style={{minWidth:"1170px"}}> + <CustomizedBreadcrumbs + values={["Recuperar senha"]} + /> + </div> + + <div style={{justifyContent:"center", textAlign:"center", maxWidth:"600px", margin:"auto"}}> + <Paper elevation={3}> + <CardDiv> + {switchFunction(aux)} + </CardDiv> + </Paper> + </div> + </BackgroundDiv> + </> + ) +} + +const CardDiv = styled.div` + background-color : #fff; + box-shadow : 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding : 30px 60px; + margin : 50px 0; +` diff --git a/src/Pages/PublicUserPage.js b/src/Pages/PublicUserPage.js new file mode 100644 index 0000000000000000000000000000000000000000..070d3cb4f7e265299ddf3efe5dfbad3124f57cbe --- /dev/null +++ b/src/Pages/PublicUserPage.js @@ -0,0 +1,294 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useEffect, useState, useContext } from 'react' +import { Store } from '../Store' +import styled from 'styled-components' +import { apiDomain } from '../env'; +import CustomizedBreadcrumbs from '../Components/TabPanels/Breadcrumbs.js' +import Grid from '@material-ui/core/Grid'; +import FollowButton from '../Components/ContactButtons/FollowButton.js' +import FollowingButton from '../Components/ContactButtons/FollowingButton.js' +import FollowersCountButton from '../Components/ContactButtons/FollowersCountButton.js' +import noAvatar from "../img/default_profile.png"; +import Tab from '@material-ui/core/Tab'; +import TabInicio from '../Components/TabPanels/PublicUserPageTabs/TabInicio.js' +import TabRecursos from '../Components/TabPanels/PublicUserPageTabs/TabRecursos.js' +import TabColecoes from '../Components/TabPanels/PublicUserPageTabs/TabColecoes.js' +import TabRede from '../Components/TabPanels/PublicUserPageTabs/TabRede.js' +import CheckDecagram from '../img/check-decagram-blue.svg' +import ReportButton from '../Components/ReportButton.js' +import { HeaderContainer, UserProfileContainer, CoverContainer, UserProfileInfoDiv, StyledTabs, CheckTeacherDiv, RodapeDiv, NavBarContentContainer, BackgroundDiv } from '../Components/TabPanels/StyledComponents.js' +import { fetchAllRequest } from '../Components/HelperFunctions/getAxiosConfig' +import Typography from '@material-ui/core/Typography'; +import CircularProgress from '@material-ui/core/CircularProgress'; + +function RenderFollowContainer(props) { + const { state } = useContext(Store) + const [followed, setFollowed] = useState(props.followed) + const toggleFollowed = () => { setFollowed(!followed) } + + return ( + <FollowContainer> + <> + { + (props.id !== state.currentUser.id) && + followed ? + ( + <FollowingButton followedID={props.id} toggleFollowed={toggleFollowed} /> + ) + : + ( + <FollowButton followerID={props.id} toggleFollowed={toggleFollowed} /> + ) + } + <FollowersCountButton followCount={props.followCount} /> + </> + </FollowContainer> + ) +} + +const RenderProfileAvatar = (userAvatar) => { + return ( + <ProfileAvatarDiv> + <img src={userAvatar ? apiDomain + userAvatar : noAvatar} alt="user avatar" style={{ height: "inherit", width: "inherit", border: "0", verticalAlign: "middle" }} /> + </ProfileAvatarDiv> + ) +} + +const RenderUserProfileInfo = (userName) => { + return ( + <UserProfileInfoDiv> + <p + style={{ fontSize: "28px", color: "#fff", marginBottom: "2px", fontWeight: "500", borderRadius: "5px", textShadow: "0 1px 2px rgba(0,0,0,.45)" }} + > + {userName} + </p> + </UserProfileInfoDiv> + ) +} + +const RenderCheckTeacher = (submitter_request) => { + if (submitter_request === "accepted") { + return ( + <CheckTeacherDiv> + <p> + <span> + <img alt="" src={CheckDecagram} /> + </span> + Professor(a) + </p> + </CheckTeacherDiv> + ) + } +} + +export default function PublicUserPage(props) { + /*currentUser info variables--------------------------------------*/ + const { state } = useContext(Store) + /*user info variables--------------------------------------*/ + const WIDTH = window.innerWidth; + const [id, setId] = useState(props.match.params.userId) + + const [loading, setLoading] = useState(false); + + const [userData, setUserData] = useState({}) + const fillUserInfo = (data) => { + setUserData(data) + } + /*---------------------------------------------------------*/ + const [following, setFollowing] = useState([]); + const fillFollowing = (data) => { + setFollowing(data); + } + + /*content control variables--------------------------------*/ + // eslint-disable-next-line + const [tabs, setTabs] = useState([ + 'InÃcio', 'Recursos', 'Coleções', 'Rede' + ]) + const [tabValue, setTabValue] = useState(0); + const handleChangeTab = (event, newValue) => { + setTabValue(newValue) + } + /*---------------------------------------------------------*/ + + /*content variables--------------------------------*/ + const [learningObjArr, setLearningObjects] = useState([]) + const handleLearningObjects = (data) => { setLearningObjects(data) } + const [collectionsArr, setCollections] = useState([]) + const handleCollections = (data) => { setCollections(data) } + /*---------------------------------------------------------*/ + + function handleSuccess(responseArr) { + fillUserInfo(responseArr[0]) + + handleLearningObjects(responseArr[1]) + + handleCollections(responseArr[2]) + + fillFollowing(responseArr[3]); + setLoading(false); + } + + /*Component Will Mount*/ + useEffect(() => { + const id = props.match.params.userId + setId(id) + const urls = [`/users/${id}`, `/users/${id}/learning_objects`, `/users/${id}/collections`, `/users/${id}/following/User`] + setLoading(true); + fetchAllRequest(urls, handleSuccess, (error) => { console.log(error) }) + }, [state.currentUser.id, props.match.params.userId]) + /*---------------------------------------------------------*/ + + return ( + <React.Fragment> + <link href="https://fonts.googleapis.com/css?family=Roboto:100,400,500&display=swap" rel="stylesheet" /> + <BackgroundDiv> + <CustomizedBreadcrumbs + values={["Usuário Público", tabs[tabValue]]} + /> + <Grid container spacing={2}> + <Grid item xs={12}> + <div style={{ padding: "10px 0 8px 0" }}> + <UserProfileContainer> + <HeaderContainer> + <> + {!loading && <RenderFollowContainer followed={userData.followed} id={id} followCount={userData.follows_count} />} + {RenderProfileAvatar(userData.avatar ? userData.avatar : undefined)} + <CoverContainer> + {userData.cover && <img src={apiDomain + userData.cover} alt='' style={{ width: "100%", height: "100%", objectFit: "cover" }} />} + </CoverContainer> + { + WIDTH <= 501 ? null : RenderUserProfileInfo(userData.name) + } + </> + </HeaderContainer> + { + WIDTH <= 501 ? + <Grid style={{ marginTop: '4em' }} container justify="center" alignItems="center" direction="column"> + <Grid item> + <Typography variant="h4" gutterBottom style={{ textAlign: "center" }}> + { + userData.name + } + </Typography> + </Grid> + <Grid style={{ marginTop: '0.5em', marginBottom: '0.5em', borderTop: "0.5px solid #DCDCDC", borderBottom: "0.5px solid #DCDCDC" }} container spacing={4} justify="center" alignItems="center" direction="row"> + <Grid item> + <Typography variant="h6" > + { + loading ? + <CircularProgress size={20} /> : + `${userData.follows_count} seguidores` + } + </Typography> + </Grid> + <Grid item> + <Typography variant="h6" > + { + loading ? + <CircularProgress size={20} /> : + following ? + `${following.length} seguindo` : + "0 seguindo" + } + </Typography> + </Grid> + </Grid> + </Grid> + : + RenderCheckTeacher(userData.submitter_request)} + <RodapeDiv> + <NavBarContentContainer> + <StyledTabs + value={tabValue} + onChange={handleChangeTab} + indicatorColor="primary" + textColor="primary" + variant="fullwidth" + scrollButtons="desktop" + TabIndicatorProps={{ style: { background: "#00bcd4" } }} + > + { + tabs.map((tab) => + <Tab label={tab} key={tab} + disabled={(tab === "Recursos" && learningObjArr.length === 0) || (tab === "Coleções" && collectionsArr.length === 0) || (tab === "Rede" && state.currentUser.id === '')} + /> + ) + } + </StyledTabs> + </NavBarContentContainer> + <ReportButton className="report-button" complainableId={userData.id} complainableType={"User"} /> + </RodapeDiv> + </UserProfileContainer> + </div> + </Grid> + + { + !loading && + <Grid item xs={12}> + {tabValue === 0 && + <TabInicio id={id} user={userData} learningObjs={learningObjArr} collections={collectionsArr} />} + {tabValue === 1 && + <TabRecursos count={userData.learning_objects_count} learningObjs={learningObjArr} id={id} />} + {tabValue === 2 && + <TabColecoes id={id} username={userData.name} />} + {tabValue === 3 && + <TabRede id={id} username={userData.name} />} + </Grid> + } + </Grid> + </BackgroundDiv> + </React.Fragment> + ) +} + + +const ProfileAvatarDiv = styled.div` + overflow : hidden; + border-radius : 100%; + bottom : -10px; + left : 20px; + z-index : 10; + box-sizing : content-box; + position : absolute; + width : 150px; + height : 150px; + border : 4px solid #fff; + outline : 0; + background-color : #fff; + @media screen and (max-width: 501px) { + height : 73px; + width : 73px; + position:absolute; + left:0; + right:0; + bottom : -40px; + margin-left:auto; + margin-right:auto; + } +` + + +const FollowContainer = styled.div` + padding : 4px 10px; + right : 0; + position : absolute; + z-index : 1; +` \ No newline at end of file diff --git a/src/Pages/PublicationPermissionsPage.js b/src/Pages/PublicationPermissionsPage.js index 3dd4036cc1786176d9d3bfb0eb71722caab1281b..d7dcb6ac34900cb4155629e3382997be37650f10 100644 --- a/src/Pages/PublicationPermissionsPage.js +++ b/src/Pages/PublicationPermissionsPage.js @@ -15,142 +15,190 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {useState, useContext} from 'react'; -import Card from '@material-ui/core/Card'; -import CardActions from '@material-ui/core/CardActions'; -import { Button } from '@material-ui/core'; -import LabeledCheckbox from "../Components/Checkbox.js" -import styled from 'styled-components' -import {device} from '../Components/device.js' -import { Store } from '../Store.js'; -import IllegalContentModal from '../Components/IllegalContentModal.js' -import PublicationPermissionsContent from '../Components/PublicationPermissionsContent.js' +import React, { useState, useContext } from "react"; +import Card from "@material-ui/core/Card"; +import CardActions from "@material-ui/core/CardActions"; +import { Button } from "@material-ui/core"; +import LabeledCheckbox from "../Components/Checkbox.js"; +import styled from "styled-components"; +import { device } from "../Components/device.js"; +import { Store } from "../Store.js"; +import IllegalContentModal from "../Components/IllegalContentModal.js"; +import PublicationPermissionsContent from "../Components/PublicationPermissionsContent.js"; const CardStyled = styled(Card)` - box-sizing : border-box; - background-color : white; - max-width: 1700px; - padding-top: 52px; - margin-left:7em; - @media ${device.mobileM} { - width : 100%; - height : 100%; - } - ` + box-sizing: border-box; + background-color: white; + max-width: 1700px; + padding-top: 52px; + @media ${device.mobileM} { + width: 100%; + height: 100%; + } +`; const Styledspan = styled.span` - font-family: 'Roboto', sans serif; - font-style: normal; - font-weight: 500; - line-height: 22px; - font-size: 15px; - letter-spacing: .01em; -` - -const Styledhr = styled.hr` - color: #dadada; -` - -export default function PermissionsContainer (props) { - const {state, dispatch} = useContext(Store) - const [unavailableCheckbox, setCheckboxAvailability] = useState(true); - const [unavailableButton, setButtonAvailability] = useState(true); - const [radios, setRadioValues] = useState({ - radio1 : '', - radio2 : '' , - radio3 : '' - } - ) - const [modalOpen, setModalOpen] = useState(false) - - const closeModal = () => { - setModalOpen(false) - props.history.push('/termos-publicar-recurso') - window.scrollTo(0, 0) - } - - const handleChecked = e => { - setButtonAvailability(!unavailableButton); - } - - const handleRadios = (e) => { - let temp = radios - temp[e.target.name] = e.target.value - - setRadioValues(temp) - - - setCheckboxAvailability(!(radios.radio1 && radios.radio2 && radios.radio3)) - - } - - const handleAgreement = () => { - - if(radios.radio1 == 'Sim' || radios.radio2 == 'Sim' || radios.radio3 == 'Sim'){ - setModalOpen(true) + font-family: "Roboto", sans serif; + font-style: normal; + font-weight: 500; + line-height: 22px; + font-size: 15px; + letter-spacing: 0.01em; +`; + +const Background = styled.div` + padding-top : 40px; + background-color : #f4f4f4; + color : #666; + padding-bottom : 40px; + + .container { + padding : 0; + margin-right : auto; + margin-left : auto; + + @media screen and (min-width: 768px) { + width : 750px; } - else{ - dispatch( { - type: 'USER_AGREED_TO_PUBLICATION_PERMISSIONS', - userAgreement: true - }) - - props.history.push('/upload') + @media screen and (min-width: 992px) { + width : 970px; + } + @media screen and (min-width: 1200px) { + width : 1170px; } } +` - const redirect = () => { - props.history.push('/termos-publicar-recurso') +export default function PermissionsContainer(props) { + const { state, dispatch } = useContext(Store); + const [unavailableCheckbox, setCheckboxAvailability] = useState(true); + const [unavailableButton, setButtonAvailability] = useState(true); + const [radios, setRadioValues] = useState({ + radio1: "", + radio2: "", + radio3: "" + }); + const [modalOpen, setModalOpen] = useState(false); + + const closeModal = () => { + setModalOpen(false); + props.history.push("/termos-publicar-recurso"); + window.scrollTo(0, 0); + }; + + const handleChecked = e => { + setButtonAvailability(!unavailableButton); + }; + + const handleRadios = e => { + let temp = radios; + temp[e.target.name] = e.target.value; + + setRadioValues(temp); + + setCheckboxAvailability(!(radios.radio1 && radios.radio2 && radios.radio3)); + }; + + const handleAgreement = () => { + if ( + radios.radio1 === "Sim" || + radios.radio2 === "Sim" || + radios.radio3 === "Sim" + ) { + setModalOpen(true); + } else { + dispatch({ + type: "USER_AGREED_TO_PUBLICATION_PERMISSIONS", + userAgreement: true + }); + + props.history.push("/upload"); } - - return ( - <> - { - state.userAgreedToPublicationTerms ? - ( - [ - <> - <IllegalContentModal open={modalOpen} handleClose={closeModal} disableBackdropClick={true}/> - <div style={{paddingTop:"5vh", paddingBottom:"5vh", backgroundColor :"#f4f4f4"}}> - <div style={{}}> + }; + + const redirect = () => { + props.history.push("/termos-publicar-recurso"); + }; + + const redirectToHome = () => { + props.history.push("/"); + }; + return ( + <> + {state.userAgreedToPublicationTerms ? ( + [ + <> + <IllegalContentModal + open={modalOpen} + handleClose={closeModal} + disableBackdropClick={true} + /> + <Background + > + <div className="container"> <CardStyled variant="outlined"> - <PublicationPermissionsContent handleRadios={handleRadios} /> - <Styledhr/> - <CardActions style={{justifyContent:"center", padding:"25px"}}> - <div> - <div style={{fontSize:"14px"}}> - <LabeledCheckbox disabledCheckbox = {unavailableCheckbox} - label={<Styledspan>Li e permito a publicação do meu recurso na Plataforma Integrada de RED do MEC, assim como atesto que o meu recurso atende aos critérios especificados acima.</Styledspan>} - handleChange={handleChecked} - /> - <div style={{justifyContent:"center",display:"flex"}}> - <Button disabled={unavailableButton} - style={unavailableButton ? {backgroundColor:"#e9e9e9"} : {backgroundColor:"#00bcd4"}} - onClick={handleAgreement} - > - <Styledspan style = {unavailableButton ? {color:"#666666"} : {color:"#ffffff"}}>Continuar </Styledspan> - </Button> - <Button style={{marginLeft:"45px", backgroundColor:"#e9e9e9"}}> - <Styledspan style={{color:"rgb(102, 102, 102)"}}>Cancelar</Styledspan> - </Button> - </div> - </div> + <PublicationPermissionsContent handleRadios={handleRadios} /> + <CardActions + style={{ justifyContent: "center", padding: "25px", borderTop : "2px solide #dadada" }} + > + <div> + <div style={{ fontSize: "14px" }}> + <LabeledCheckbox + disabledCheckbox={unavailableCheckbox} + label={ + <Styledspan> + Li e permito a publicação do meu recurso na + Plataforma Integrada de RED do MEC, assim como + atesto que o meu recurso atende aos critérios + especificados acima. + </Styledspan> + } + handleChange={handleChecked} + /> + <div + style={{ justifyContent: "center", display: "flex" }} + > + <Button + disabled={unavailableButton} + style={ + unavailableButton + ? { backgroundColor: "#e9e9e9" } + : { backgroundColor: "#00bcd4" } + } + onClick={handleAgreement} + > + <Styledspan + style={ + unavailableButton + ? { color: "#666666", fontWeight : "600" } + : { color: "#ffffff", fontWeight : "600" } + } + > + Continuar{" "} + </Styledspan> + </Button> + <Button + style={{ + marginLeft: "45px", + backgroundColor: "#e9e9e9", + }} + > + <Styledspan style={{ color: "rgb(102, 102, 102)" , fontWeight : "600 !important"}} onClick={() => {redirectToHome()}}> + Cancelar + </Styledspan> + </Button> </div> - </CardActions> + </div> + </div> + </CardActions> </CardStyled> - </div> - </div> - </> - ] - ) - : - ( - <> - {redirect()} - </> - ) - } - </> - - ) + </div> + </Background> + </> + ] + ) : ( + <>{redirect()}</> + )} + </> + ); } diff --git a/src/Pages/ResourcePage.js b/src/Pages/ResourcePage.js index 53569b8c10016a945537bfbfb5053fa31c7420cd..ff63e4f479a36799c3d8240d5a3afa3e5905eb2c 100644 --- a/src/Pages/ResourcePage.js +++ b/src/Pages/ResourcePage.js @@ -16,16 +16,371 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; -import AboutResource from '../Components/AboutResource' +import React, { useEffect, useState, useContext } from "react"; +import { Store } from "../Store.js"; +import styled from "styled-components"; +import { apiDomain } from "../env"; +import Grid from "@material-ui/core/Grid"; +import TextoObjeto from "../Components/ResourcePageComponents/TextoObjeto.js"; +import Footer from "../Components/ResourcePageComponents/Footer.js"; +import Sobre from "../Components/ResourcePageComponents/Sobre.js"; +import CommentsArea from "../Components/ResourcePageComponents/CommentsArea.js"; +import noAvatar from "../img/default_profile.png"; +import Snackbar from "@material-ui/core/Snackbar"; +import Alert from "../Components/Alert.js"; +import VideoPlayer from "../Components/ResourcePageComponents/VideoPlayer.js"; +import LoadingSpinner from "../Components/LoadingSpinner.js"; +import { makeStyles } from "@material-ui/core/styles"; +import AppBar from "@material-ui/core/AppBar"; +import ButtonAvaliarRecurso from "../Components/ButtonAvaliarRecurso"; +import ModalAvaliarRecurso from "../Components/ModalAvaliarRecurso"; +import ModalConfirmarCuradoria from "../Components/ModalConfirmarCuradoria"; +import { getRequest } from "../Components/HelperFunctions/getAxiosConfig"; -class ResourcePage extends Component { +function urlVerify(url) { + return url + ? url.indexOf("youtu") !== -1 || url.indexOf("vimeo") !== -1 + : false; +} - render() { - return ( - <AboutResource/> - ); +export default function LearningObjectPage(props) { + const { state } = useContext(Store); + const id = props.match.params.recursoId; + const [carregando, toggle] = useState(true); + const [recurso, setRecurso] = useState({}); + + function handleSuccessfulGet(data) { + setRecurso(data); + toggle(false); + } + useEffect(() => { + const url = `/learning_objects/${id}`; + + getRequest( + url, + handleSuccessfulGet, + (error) => { + toggle(false); + handleSnackbar(7) + } + ); + }, []); + + const [snackbarOpen, toggleSnackbar] = useState(false); + const handleSnackbar = (index) => { + setIndex(index); + toggleSnackbar(true); + }; + const snackbarText = [ + "Baixando o Recurso... Lembre-se de relatar sua experiência após o uso do Recurso!", + "Seu comentário foi publicado com sucesso!", + "Comentário editado com sucesso.", + "Comentário deletado com sucesso.", + "O Recurso foi guardado na coleção!", + "O recurso foi aprovado com sucesso!", + "Erro ao aprovar o recurso!", + "Erro ao carregar a página", + "Erro ao fazer o dowload do recurso", + ]; + const [snackbarIndex, setIndex] = useState(0); + const classes = useStyles(); + const [modalCuradoriaOpen, toggleModalCuradoria] = useState(false); + const handleModalCuradoria = (value) => { + toggleModalCuradoria(value); + }; + + const checkAccessLevel = (levelToCheck) => { + if (state.currentUser.id !== "") { + return checkUserRole(levelToCheck); + } else { + return false; } + }; + + const checkUserRole = (userRole) => { + return ( + state.currentUser.roles.filter((role) => role.name === userRole).length > + 0 + ); + }; + + const [modalConfirmarCuradoriaOpen, toggleModalConfirmarCuradoria] = useState( + false + ); + const handleModalConfirmarCuradoria = (value) => { + toggleModalConfirmarCuradoria(value); + }; + const [reportCriteria, setReportCriteria] = useState([]); + const [justificativa, setJustificativa] = useState(""); + const [submissionAccepted, setSubmissionAccepted] = useState(""); + + const handleConfirm = (criteria, justification, accepted) => { + setReportCriteria(criteria); + setJustificativa(justification); + setSubmissionAccepted(accepted); + handleModalCuradoria(false); + handleModalConfirmarCuradoria(true); + }; + + const finalizeCuratorshipFlow = () => { + handleSnackbar(5); + handleModalConfirmarCuradoria(false); + const url = `/learning_objects/${id}`; + getRequest( + url, + (data) => { + setRecurso(data); + }, + (error) => { + handleSnackbar(7) + } + ); + }; + + return ( + <React.Fragment> + <Snackbar + open={snackbarOpen} + autoHideDuration={6000} + onClose={toggleSnackbar} + anchorOrigin={{ vertical: "top", horizontal: "right" }} + > + <Alert severity="info" + style={{ backgroundColor: "#00acc1" }}> + {snackbarText[snackbarIndex]} + </Alert> + </Snackbar> + + <ModalAvaliarRecurso + open={modalCuradoriaOpen} + handleClose={() => { + handleModalCuradoria(false); + }} + title={recurso.name} + confirm={handleConfirm} + setCriteria={setReportCriteria} + /> + <ModalConfirmarCuradoria + aceito={submissionAccepted} + reportCriteria={reportCriteria} + justificativa={justificativa} + open={modalConfirmarCuradoriaOpen} + handleClose={() => { + handleModalConfirmarCuradoria(false); + }} + cancel={() => { + handleModalCuradoria(true); + }} + recursoId={recurso.submission_id} + finalizeCuratorshipFlow={finalizeCuratorshipFlow} + handleErrorAprove={() => { + handleSnackbar(6) + }} + /> + <Background> + {carregando ? ( + <LoadingSpinner text={"Carregando Recurso"} /> + ) : ( + <> + <Grid container spacing={2}> + {recurso.object_type === "VÃdeo" && !recurso.link ? ( + <Grid item xs={12}> + <Card> + <VideoPlayer + link={recurso.link} + urlVerified={false} + videoUrl={recurso.default_attachment_location} + /> + </Card> + </Grid> + ) : ( + urlVerify(recurso.link) && ( + <Grid item xs={12}> + <Card> + <VideoPlayer link={recurso.link} urlVerified={true} /> + </Card> + </Grid> + ) + )} + + <Grid item xs={12}> + <Card> + <div> + {recurso.thumbnail && ( + <img alt="" src={apiDomain + recurso.thumbnail} /> + )} + + <TextoObjeto + name={recurso.name} + rating={recurso.review_average} + recursoId={id} + likesCount={recurso.likes_count} + likedBool={recurso.liked} + objType={recurso.object_type} + subjects={recurso.subjects} + educationalStages={recurso.educational_stages} + viewCount={recurso.views_count} + downloadCount={recurso.downloads_count} + id={recurso.publisher ? recurso.publisher.id : undefined} + stateRecurso={recurso.state} + attachments={recurso.attachments} + audioUrl={recurso.default_attachment_location} + /> + </div> + + <Footer + recursoId={id} + downloadableLink={recurso.default_attachment_location} + handleSnackbar={handleSnackbar} + link={recurso.link} + title={recurso.name} + thumb={recurso.thumbnail} + currPageLink={window.location.href} + complained={recurso.complained} + /> + </Card> + </Grid> + + <Grid item xs={12}> + <Card> + {/*todo: change render method on additional item info*/} + <Sobre + avatar={ + recurso.publisher + ? recurso.publisher.avatar + ? apiDomain + recurso.publisher.avatar + : noAvatar + : noAvatar + } + publisher={ + recurso.publisher ? recurso.publisher.name : undefined + } + id={recurso.publisher ? recurso.publisher.id : undefined} + description={recurso.description} + author={recurso.author} + tags={recurso.tags} + attachments={recurso.attachments} + language={recurso.language} + mimeType={recurso.default_mime_type} + createdAt={recurso.created_at} + updatedAt={recurso.updated_at} + license={recurso.license} + followed={recurso.publisher.followed} + /> + </Card> + </Grid> + + {recurso.state !== "submitted" && ( + <Grid item xs={12}> + <Card> + {/*adicionar funcionalidade ao botao de entrar*/} + <CommentsArea + recursoId={id} + handleSnackbar={handleSnackbar} + objType={recurso.object_type} + recurso={true} + /> + </Card> + </Grid> + )} + </Grid> + + {recurso.state === "submitted" && checkAccessLevel("curator") && ( + <AppBar + position="fixed" + color="primary" + className={classes.appBar} + > + <StyledAppBarContainer> + <div className="container"> + <div className="botoes"> + <ButtonAvaliarRecurso + callback={() => { + handleModalCuradoria(true); + }} + /> + </div> + </div> + </StyledAppBarContainer> + </AppBar> + )} + </> + )} + </Background> + </React.Fragment> + ); +} + +const useStyles = makeStyles((theme) => ({ + appBar: { + top: "auto", + bottom: 0, + height: "100px", + backgroundColor: "#fff", + boxShadow: "0 1px 3px rgba(0,0,0,.52),0 1px 2px rgba(0,0,0,.24)", + }, +})); + +const StyledAppBarContainer = styled.div` + .container { + display : flex; + flex-direction : row; + justify-content : flex-start + margin-right : auto; + margin-left : auto; + @media screen and (min-width: 1200px) { + width : 1170px; + } + @media screen and (min-width: 992px) and (max-width : 1199px){ + width : 970px; + } + @media screen and (min-width: 768px) and (max-width : 991px) { + width : 750px; + } + + .botoes { + margin-top : 2em; + display : flex; + align-items : center; + } + } +`; + +const Background = styled.div` + background-color: #f4f4f4; + color: #666; + font-family: "Roboto", sans serif; + padding-top: 30px; +`; + +const Card = styled.div` + background-color: #fff; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + margin-bottom: 30px; + margin-right: auto; + margin-left: auto; + display: flex; + flex-direction: column; + @media screen and (min-width: 1200px) { + width: 1170px; + } + @media screen and (min-width: 992px) and (max-width: 1199px) { + width: 970px; + } + @media screen and (min-width: 768px) and (max-width: 991px) { + width: 750px; } -export default ResourcePage; + img { + background-color: #e5e5e5; + height: 270px; + width: 400px; + float: left; + padding: 0; + object-fit: cover; + @media screen and (max-width: 768px) { + height: auto; + width: 100%; + } + } +`; diff --git a/src/Pages/Search.js b/src/Pages/Search.js index e514d0e5dc4a2be864a773f0e4c456e082b907f2..db1c0201834e8a4b54f7ac4f3313425255cf436e 100644 --- a/src/Pages/Search.js +++ b/src/Pages/Search.js @@ -16,79 +16,461 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, { useEffect, useState, useContext } from 'react'; -import axios from 'axios'; +import React, { useEffect, useState, useContext } from "react"; +import { apiDomain } from '../env'; +import { Link, useHistory } from "react-router-dom"; +import styled from "styled-components"; +import Paper from "@material-ui/core/Paper"; +import LoadingSpinner from '../Components/LoadingSpinner'; +import Breadcrumbs from "@material-ui/core/Breadcrumbs"; +import "./Styles/Home.css"; +import { Store } from "../Store"; +import { Grid } from "@material-ui/core"; +import Dropdown from "react-dropdown"; +import "react-dropdown/style.css"; +import SearchExpansionPanel from "../Components/SearchExpansionPanel/SearchExpansionPanel"; +import ResourceCardFunction from "../Components/ResourceCardFunction"; +import CollectionCardFunction from "../Components/CollectionCardFunction"; +import ContactCard from "../Components/ContactCard"; +import CircularProgress from '@material-ui/core/CircularProgress'; +import { getRequest } from '../Components/HelperFunctions/getAxiosConfig' +import ColecaoVazia from '../img/Pagina_vazia_colecao.png' +import RecursoVazio from '../img/Pagina_vazia_Sem_publicar.png' -// import ResourceCard from '../Components/ResourceCard' -// import CollectionCard from '../Components/CollectionCard' -// import UserCard from '../Components/UserCard' -import {apiUrl} from '../env'; -import './Styles/Home.css'; -import { Store } from '../Store'; +let order = "review_average"; +let currFilter = ""; +let currOption; -export default function Search(props){ +export default function Search(props) { + const history = useHistory() - const { state, dispatch } = useContext(Store) - const [ results, setResults ] = useState([]) - const [ page, ] = useState(0) - const [ resultsPerPage, ] = useState(12) - const [ order, ] = useState('score') + const { state, dispatch } = useContext(Store); + const [resultsResource, setResultsResource] = useState([]); + const [resultsCollection, setResultsCollection] = useState([]); + const [resultsUser, setResultsUser] = useState([]); + const [currOrder, setCurrOrder] = useState(order); + const [page] = useState(0); + const [isloading, setIsLoading] = useState(false); + const [loadingMoreData, setLoadingMoreData] = useState(false); + const [isFiltering, setIsFiltering] = useState(false); + const [resultsPerPage, setResultsPerPage] = useState(12); + const [showingResults, setShowingResults] = useState(0); + const [totalResults, setTotalResults] = useState(0); + const [options] = React.useState([ + { label: "Recursos", value: "LearningObject" }, + { label: "Coleções", value: "Collection" }, + { label: "Usuários", value: "User" }, + ]); + const [ordenar] = useState([ + { label: "Mais Estrelas", value: "review_average" }, + { label: "Mais Relevante", value: "score" }, + { label: "Mais Baixados", value: "downloads" }, + { label: "Mais Favoritados", value: "likes" }, + { label: "Mais Recentes", value: "publicationdesc" }, + { label: "Ordem Alfabética", value: "title" }, + ]); - useEffect(()=>{ + const [option, setOption] = useState( + new URLSearchParams(window.location.search).get("search_class") + ); + const [optionResult, setOptionResult] = useState(option); + currOption = option; + + function handleSuccessfulGet(data, headers) { + if (currOption === "LearningObject") setResultsResource(data); + else if (currOption === "Collection") setResultsCollection(data); + else if (currOption === "User") setResultsUser(data); dispatch({ - type: 'HANDLE_SEARCH_BAR', - opened: true - }) + type: "SAVE_SEARCH", + newSearch: { + query: state.search.query, + class: currOption, + }, + }); + if (headers.has('X-Total-Count')) { + setTotalResults(headers.get('X-Total-Count')); + } + setShowingResults(data.length) + setIsLoading(false); + setIsFiltering(false); + setLoadingMoreData(false); + } + + const collectStuff = (tipoBusca, filtro) => { + + const urlParams = new URLSearchParams(window.location.search); + const query = urlParams.get("query"); + const searchClass = urlParams.get("search_class"); + + if (!loadingMoreData) // this line prevents resetting filter when loading more data + currFilter = filtro; + if (filtro) + setIsFiltering(true); + const url = `/search?page=${page}&results_per_page=${resultsPerPage}&order=${order}&query=${query}${currFilter ? currFilter : ""}&search_class=${searchClass}` + getRequest(url, handleSuccessfulGet, (error) => { console.log(error) }) + }; + + useEffect(() => { + setIsLoading(true) - const urlParams = new URLSearchParams(window.location.search) - const query = urlParams.get('query') - const searchClass = urlParams.get('search_class') + const urlParams = new URLSearchParams(window.location.search); + const query = urlParams.get("query"); + const searchClass = urlParams.get("search_class"); - if(state.search.query !== query || state.search.class !== searchClass){ + if (state.search.query !== query || state.search.class !== searchClass) { dispatch({ - type: 'SAVE_SEARCH', + type: "SAVE_SEARCH", newSearch: { query: query, - class: searchClass - } - }) + class: searchClass, + }, + }); + state.search.query = query + state.search.class = searchClass } + currOption = searchClass + setOption(searchClass) + setOptionResult(searchClass) + collectStuff(searchClass) - return () => dispatch({ - type: 'HANDLE_SEARCH_BAR', - opened: false - }) - },[]) - - useEffect(()=>{ - axios.get(`${apiUrl}/search?page=${page}&results_per_page=${resultsPerPage}&order=${order}&query=${state.search.query}&search_class=${state.search.class}`) - .then( res => { - setResults(res.data) - }) - - },[state.search]) + return () => + dispatch({ + type: "HANDLE_SEARCH_BAR", + opened: false, + }); + }, [window.history.state === null ? true : window.history.state.key, state.currentUser.id]) + useEffect(() => { + setIsLoading(true); + collectStuff(option); + }, [resultsPerPage]); return ( - <React.Fragment> - <h1>Search for {state.search.query!=='*'?state.search.query:'all'} in {state.search.class}</h1> - { - state.search.class === 'LearningObject' && - <ul> - {results.map((res)=><li key={res.id}> {res.name} </li>)} - </ul> - } - {state.search.class === 'Collection' && - <ul> - {results.map((res)=><li key={res.id}> {res.name} </li>)} - </ul> - } - {state.search.class === 'User' && - <ul> - {results.map((res)=><li key={res.id}> {res.name} </li>)} - </ul> - } - </React.Fragment> - ) + <div style={{ backgroundColor: "#f4f4f4" }}> + <Principal> + <BreadCrumbsDiv style={{ margin: "15px 2%", }}> + <StyledBreadCrumbs> + <Link to="/">Página Inicial</Link> + <span>Busca</span> + </StyledBreadCrumbs> + </BreadCrumbsDiv> + + <div style={{ margin: "15px 2%", }}> + <HeaderFilters elevation={4} square> + <Grid container spacing={0} style={{ height: "100%" }}> + <Grid item xs style={{ display: "flex", flexDirection: "column", justifyContent: "center", paddingLeft: 20 }}> + <div style={{ marginRight: 5, marginTop: 15 }}> + <div className="textInfo"> + <span style={{ fontWeight: "bold" }}> + MOSTRAR + </span> + </div> + <Dropdown options={options} value={optionResult} + onChange={(e) => { + setIsLoading(true); + currOption = e.value; + history.push(`/busca?query=${state.search.query}&search_class=${currOption}`) + setOption(currOption); + // collectStuff(currOption, ""); + }} + placeholder="Selecione um tipo" + /> + </div> + </Grid> + + { + optionResult === "User" ? null : + <Grid item xs style={{ display: "flex", flexDirection: "column", justifyContent: "center", paddingRight: 20, }}> + <div style={{ marginLeft: 5, marginTop: 15 }}> + <div className="textInfo"> + <span style={{ fontWeight: "bold" }}> + ORDENAR POR + </span> + </div> + <Dropdown options={ordenar} value={currOrder} onChange={(e) => { + order = e.value; + setCurrOrder(e.label) + collectStuff(optionResult, currFilter); + }} + placeholder="Selecione uma opção" + /> + </div> + </Grid> + } + <Grid item xs={12}> + <div style={{ display: "flex", flexDirection: "column", justifyContent: "center" }}> + <div style={{ textAlign: "center", paddingTop: 10, fontWeight: "bolder" }}> + Exibindo {showingResults === 0 ? 0 : showingResults} resultados de {totalResults} encontrados + </div> + </div> + </Grid> + </Grid> + </HeaderFilters> + + { + isloading ? <LoadingSpinner text="Carregando..." /> : + optionResult === "Collection" ? ( + resultsCollection.length >= 1 ? + <GridBuscaCollection container direction="row" spacing={2}> + <Grid item xs> + <Grid container justify="center" alignItems="center" spacing={2}> + {resultsCollection.map((card) => ( + <Grid container item xs justify="center" alignItems="center" key={card.id}> + <CollectionCardFunction + name={card.name} + tags={card.tags} + rating={card.review_average} + id={card.id} + author={card.owner ? card.owner.name : ""} + description={card.description} + thumbnails={card.items_thumbnails} + avatar={card.owner ? card.owner.avatar : ""} + likeCount={card.likes_count} + followed={card.followed} + liked={card.liked} + collections={card.collection_items} + authorID={card.owner.id} + /> + + </Grid> + ))} + </Grid> + <div style={{ display: "flex", flexDirection: "row", justifyContent: "center", }}> + <button + style={{ + height: 36, backgroundColor: "#ff7f00", marginBottom: 50, marginTop: 50, fontSize: 14, + color: "white", borderRadius: 4, border: "none", + }} + onClick={() => { + setLoadingMoreData(true); + setResultsPerPage(resultsPerPage + 12) + }} + > + { + loadingMoreData ? <CircularProgress size={24} color="inherit" /> : "Carregar mais 12" + } + </button> + </div> + </Grid> + </GridBuscaCollection> : + <Grid container direction="row" justify="center" alignItems="center"> + <Grid item> + <img src={ColecaoVazia} alt="coleção vazia" /> + </Grid> + </Grid> + + ) : + + optionResult === "LearningObject" ? ( + resultsResource.length >= 1 ? + <GridBuscaResource container spacing={2}> + <Grid item xs={12} md={2}> + <Grid container > + <Grid item xs={12}> + <Paper elevation={4} square> + <SearchExpansionPanel onChange={collectStuff} onFiltering={isFiltering} /> + </Paper> + </Grid> + </Grid> + </Grid> + <Grid item xs> + <Grid container justify="center" spacing={3} alignItems="center" > + {resultsResource.map((card) => ( + <Grid container justify="center" alignItems="center" item xs={12} sm={6} md={4} lg={3} key={card.id}> + <ResourceCardFunction + avatar={card.publisher ? card.publisher.avatar : ""} + id={card.id} + thumbnail={card.thumbnail} + type={card.object_type ? card.object_type : "Outros"} + title={card.name} + published={card.state === "published" ? true : false} + likeCount={card.likes_count} + liked={card.liked} + rating={card.review_average} + author={card.author} + tags={card.educational_stages} + href={"/recurso/" + card.id} + downloadableLink={card.default_attachment_location} + /> + </Grid> + ))} + </Grid> + <div + style={{ + display: "flex", + flexDirection: "row", + justifyContent: "center", + }} + > + <button + style={{ + height: 36, + backgroundColor: "#ff7f00", + marginBottom: 50, + marginTop: 50, + fontSize: 14, + color: "white", + borderRadius: 4, + border: "none", + }} + onClick={() => { + setLoadingMoreData(true); + setResultsPerPage(resultsPerPage + 12) + // collectStuff("LearningObject", ""); + }} + > + { + loadingMoreData ? <CircularProgress size={24} color="inherit" /> : "Carregar mais 12" + } + </button> + </div> + </Grid> + </GridBuscaResource> + + : + + <GridBuscaResource container spacing={2}> + <Grid item xs={12} md={2}> + <Grid container > + <Grid item xs={12}> + <Paper elevation={4} square> + <SearchExpansionPanel onChange={collectStuff} onFiltering={isFiltering} /> + </Paper> + </Grid> + </Grid> + </Grid> + <Grid item xs={12} md={10}> + <Grid container direction="row" justify="center" alignItems="center" style={{ height: "100%", width: "100%" }}> + <Grid> + <img src={RecursoVazio} alt="coleção vazia" /> + </Grid> + </Grid> + </Grid> + </GridBuscaResource> + ) : + optionResult === "User" && ( + <GridBuscaUser container spacing={2}> + <Grid item xs > + <Grid container spacing={2} justify="center" alignItems="center"> + {resultsUser.map((card) => ( + <Grid container justify="center" alignItems="center" item xs key={card.id}> + <ContactCard + name={card.name} + avatar={card.avatar ? apiDomain + card.avatar : null} + cover={card.cover ? apiDomain + card.cover : null} + numCollections={card.collections_count} + numLearningObjects={card.learning_objects_count} + follow_count={card.follows_count} + followed={card.followed || null} + followerID={card.id} + href={'/usuario-publico/' + card.id} + /> + </Grid> + ))} + </Grid> + <div + style={{ + display: "flex", + flexDirection: "row", + justifyContent: "center", + }} + > + <button + style={{ + height: 36, + backgroundColor: "#ff7f00", + marginBottom: 50, + marginTop: 50, + fontSize: 14, + color: "white", + borderRadius: 4, + border: "none", + }} + onClick={() => { + setLoadingMoreData(true); + setResultsPerPage(resultsPerPage + 12) + // collectStuff("User", ""); + }} + > + { + loadingMoreData ? <CircularProgress color="inherit" size={24} /> : "Carregar mais 12" + } + </button> + </div> + </Grid> + </GridBuscaUser> + ) + } + </div> + </Principal> + </div> + ); } + +const GridBuscaCollection = styled(Grid)` + color: #666; + ${'' /* background-color: green; */} + + h4 { + padding: 0 15px; + font-size: 18px; + margin-block: 10px; + text-transform: uppercase; + } +`; +const GridBuscaResource = styled(Grid)` + color: #666; + ${'' /* background-color: red; */} + + h4 { + padding: 0 15px; + font-size: 18px; + margin-block: 10px; + text-transform: uppercase; + } +`; +const GridBuscaUser = styled(Grid)` + color: #666; + ${'' /* background-color: blue; */} + + h4 { + padding: 0 15px; + font-size: 18px; + margin-block: 10px; + text-transform: uppercase; + } +`; + +const HeaderFilters = styled(Paper)` + height: 150px; + text-align: center; + background-color: #fff; + margin-bottom: 30px; + color: #666; + .textInfo{ + text-align: start; + } +`; + +const StyledBreadCrumbs = styled(Breadcrumbs)` + display: flex; + justify-content: flex-start; + max-width: 1170px; + span { + color: #a5a5a5; + } + a { + color: #00bcd4; + text-decoration: none; + } +`; + +const BreadCrumbsDiv = styled.div` + padding: 10px; + display: flex; +`; + +const Principal = styled.div` + margin-inline: auto; +`; diff --git a/src/Pages/SiteMap.js b/src/Pages/SiteMap.js new file mode 100644 index 0000000000000000000000000000000000000000..492d885c0013422940f28347fed261584f82977d --- /dev/null +++ b/src/Pages/SiteMap.js @@ -0,0 +1,188 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ +import React from 'react'; +import styled from 'styled-components' +import { Link } from "react-router-dom"; +import Breadcrumbs from "@material-ui/core/Breadcrumbs"; + + +const titulo ={ + fontFamily: "Roboto, sans-serif", + marginTop: "0", + fontSize: "26px", + fontWeight: "300", + marginBottom: "10px", + color: "#666" +} +const subtitulo ={ + fontFamily: "Roboto, sans-serif", + marginTop: "40px", + fontWeight:"500", + fontSize:"16px", + color: "#00bcd4" + +} +const item={ + fontFamily: "Roboto, sans-serif", + textDecoration: "none", + display:"block", + fontSize:"15px", + color: "#333", + fontWeight:"300", + paddingBottom: "5px" +} +const linha={ + margin: "15px 0", + borderTop: "2px solid #00bcd4", + borderBottom:"none" +} + +const paper ={ + padding: "30px 30px 100px 30px", + backgroundColor: "#fff", + boxShadow: "0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)", + maxWidth:"1170px", + margin: "30px auto", + marginBottom:"0", + display: "flex", + flexDirection:"column", + boxSizing: "border-box" +} + +const cards={ + display:"flex", + flexDirection:"row" +} + +const card = { + padding:"0 15px", + width:"25%" +} + +const breadCrumbs={ + padding: "10px", + display: "flex", + margin: "0 auto", + width:"1170px" +} +const StyledBreadCrumbs = styled(Breadcrumbs)` + display: flex; + justify-content: flex-start; + max-width: 1170px; + span { + color: #a5a5a5; + font-size: 14px; + } + a { + color: #00bcd4; + text-decoration: none; + font-size: 14px; + } +`; + +export default function SiteMap (props) { + return ( + <div style={{ padding:"0 0 30px 0",backgroundColor :"#f4f4f4"}}> + + <div style={breadCrumbs}> + <StyledBreadCrumbs> + <Link to="/">Página Inicial</Link> + <span>Mapa do site</span> + + </StyledBreadCrumbs> + </div> + <link href="https://fonts.googleapis.com/css?family=Roboto:300;500&display=swap" rel="stylesheet"/> + <div style={paper}> + <h3 style={titulo}>Mapa do site</h3> + <div style={cards}> + <div style={card}> + <h3 style={subtitulo}>Sobre</h3> + <hr style={linha} /> + <a style={item} href="sobre">Sobre a Plataforma</a> + <a style={item} href="sobre#portaisparceiros">Portais Parceiros</a> + <a style={item} href="termos">Termos de Uso</a> + <a style={item} href="contato">Contato</a> + </div> + <div style={card}> + <h3 style={subtitulo}>Ajuda</h3> + <hr style={linha} /> + <a style={item} href="ajuda">Central de Ajuda</a> + <Link + style={item} + to={{ + pathname: "plataforma-mec", + + state: { value: "0" } + }} + > O que é a Plataforma MEC</Link> + <Link + style={item} + to={{ + pathname: "publicando-recurso", + state: { value: "0" } + }} + > Publicando Recurso + </Link> + + <Link + style={item} + to={{ + pathname: "encontrando-recurso", + state: { value: "0" } + }} + > Encontrando Recurso + </Link> + <Link + style={item} + to={{ + pathname: "/participando-da-rede", + + state: { value: "0" } + }} + > Participando da Rede + </Link> + <Link + style={item} + to={{ + pathname: "gerenciando-conta", + + state: { value: "0" } + }} + > Gerenciando a conta + </Link> + </div> + + <div style={card}> + <h3 style={subtitulo}>Acessibilidade</h3> + <hr style={linha} /> + <a style={item} href="acessibilidade">Acessibilidade</a> + </div> + <div style={card}> + <h3 style={subtitulo}>Ãrea do Usuário</h3> + <hr style={linha} /> + <a style={item} href="/perfil">Perfil e Atividades</a> + <a style={item} href="perfil">Recursos Publicados</a> + <a style={item} href="/perfil">Favoritos</a> + <a style={item} href="perfil">Coleções</a> + <a style={item} href="/perfil">Rede</a> + </div> + </div> + </div> + </div> + ); +} diff --git a/src/Pages/TabsHelp/TabManageAc.js b/src/Pages/TabsHelp/TabManageAc.js new file mode 100644 index 0000000000000000000000000000000000000000..a8280274999063167a3fe55b5eb46891df5e7e37 --- /dev/null +++ b/src/Pages/TabsHelp/TabManageAc.js @@ -0,0 +1,291 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from "react"; +import styled from "styled-components"; +import Tabs from "@material-ui/core/Tabs"; +import Tab from "@material-ui/core/Tab"; +import Breadcrumbs from "@material-ui/core/Breadcrumbs"; +import Grid from "@material-ui/core/Grid"; +import GerenciandoConta from "../../img/ajuda/Gerenciando_a_conta.png"; +import Why from "../../Components/HelpCenter/TabsManageAc/Why"; +import HowToDo from "../../Components/HelpCenter/TabsManageAc/HowToDo"; +import HowToChange from "../../Components/HelpCenter/TabsManageAc/HowToChange"; +import HowToAccess from "../../Components/HelpCenter/TabsManageAc/HowToAccess"; +import Forget from "../../Components/HelpCenter/TabsManageAc/Forget"; +import CardParticipando from "../../Components/HelpCenter/Cards/CardParticipando"; +import CardEncontrando from "../../Components/HelpCenter/Cards/CardEncontrando"; +import CardPublicando from "../../Components/HelpCenter/Cards/CardPublicando"; +import { Link } from "react-router-dom"; + +export default function TabManageAc(props) { + const tabs = [ + "Por que me cadastrar?", + "Como fazer meu cadastro?", + "Como alterar minha senha?", + "Como acessar a conta?", + "Esqueci minha senha. O que fazer?", + "Gerenciando a Conta" + ]; + + const [tabValue, setTabValue] = useState(props.location.state === "undefined" ? 0 : props.location.state); + + const handleChangeTab = (e, newValue) => { + setTabValue(newValue); + }; + + useEffect(() => { window.scrollTo(0, 0) }, []) + + return ( + <div style={{ backgroundColor: "#f4f4f4" }}> + <link + href="https://fonts.googleapis.com/css?family=Pompiere|Roboto:500,400&display=swap" + rel="stylesheet" + /> + + <Secao> + <BreadCrumbsDiv> + <StyledBreadCrumbs> + <Link to="/">Página Inicial</Link> + <Link to="ajuda">Ajuda</Link> + + <span>{tabs[5]}</span> + </StyledBreadCrumbs> + </BreadCrumbsDiv> + <Grid container justify="center"> + <Grid item xs={12} md={10} > + <Principal> + <Menu> + <div className="fixo"> + <img src={GerenciandoConta} alt="Gerenciando a conta" /> + <span>{tabs[5]}</span> + </div> + <TabsStyled orientation="vertical" + variant="scrollable" + value={tabValue} + onChange={handleChangeTab} + TabIndicatorProps={{ style: { display: "none" } }} + > + <TabStyled label={tabs[0]}></TabStyled> + <TabStyled label={tabs[1]}></TabStyled> + <TabStyled label={tabs[2]}></TabStyled> + <TabStyled label={tabs[3]}></TabStyled> + <TabStyled label={tabs[4]}></TabStyled> + </TabsStyled> + <br /> + <div className="voltarInicio"> + <a href="ajuda">VOLTAR AO ÃNICIO</a> + </div> + </Menu> + + {tabValue === 0 && <Why title={tabs[0]} />} + {tabValue === 1 && <HowToDo title={tabs[1]} />} + {tabValue === 2 && <HowToChange title={tabs[2]} />} + {tabValue === 3 && <HowToAccess title={tabs[3]} />} + {tabValue === 4 && <Forget title={tabs[4]} />} + <div className="resultadosProcura"> + <span>Não era bem o que você procurava?</span> + <div className="subtitulo"> + <span>Você pode navegar pelos tópicos de ajuda ou entrar em <a href="contato">Contato</a>.</span> + </div> + </div> + + </Principal> + </Grid> + </Grid> + + + <Grid style={{ marginBottom: "50px" }} container justify={"center"}> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardPublicando /> + </Grid> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardEncontrando /> + </Grid> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardParticipando /> + </Grid> + </Grid> + </Secao> + </div> + ); +} + +const StyledBreadCrumbs = styled(Breadcrumbs)` + display : flex; + justify-content : flex-start; + span { + color : #a5a5a5; + } + a { + color: #00bcd4; + text-decoration: none; + } + +` + +const BreadCrumbsDiv = styled.div` + + padding : 10px; + display : flex; +` + + +const Principal = styled.div` + .fixo { + + height: 40px; + text-align: center; + background-color: #fff; + padding: 30px; + margin-bottom: 30px; + color: #666; + + + img { + height: 50px; + width: 50px; + margin-right: 40px; + vertical-align: middle; + + } + + span { + font-size: 20px; + vertical-align: ; + } + + + + } + .resultadosProcura { + text-align: center; + margin-block: 30px; + padding-inline: 15px; + color: #666; + span { + font-size: 24px; + } + .subtitulo { + margin-top: 10px; + + span { + font-size: 15px + } + + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + + } + } + +` + +const TabsStyled = styled(Tabs)` + + .Mui-selected { + background-color: #e7e4e4; + } + + .MuiTab-root{ + text-transform: none !important; + max-width:100% + } + text-align: center; + width:100% + +` + +const TabStyled = styled(Tab)` + + padding: 4px 15px !important; + font-weight: 500; + font-size: 14px !important; + border-radius: 4px !important; + text-align: center; + + + + + + &:hover { + background-color: #e7e4e4; + } +` + + +const Menu = styled.div` + width: auto; + background-color: #fff; + color: #666; + padding-block: 10px; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-bottom:30px + + + h4 { + padding-inline: 15px; + font-size: 18px; + margin-block: 10px; + font-weight: 500; + line-height: 1.1; + } + + .voltarInicio { + padding: 4px 15px; + font-size: 15px; + text-align: center; + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + } + + hr { + border: 0; + border-top: 1px solid #ccc; + margin-top: 20px; + margin-bottom: 20px; + } + + .procurava { + padding: 4px 15px; + font-size: 15px; + text-align: center; + + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + + } + +` + +const Secao = styled.div` + margin-inline: auto; + +` diff --git a/src/Pages/TabsHelp/TabNetPart.js b/src/Pages/TabsHelp/TabNetPart.js new file mode 100644 index 0000000000000000000000000000000000000000..c08e3ea1197c5a44ea33931e49c13079df6e57f5 --- /dev/null +++ b/src/Pages/TabsHelp/TabNetPart.js @@ -0,0 +1,292 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react'; +import styled from 'styled-components'; +import Tabs from '@material-ui/core/Tabs' +import Tab from '@material-ui/core/Tab'; +import Breadcrumbs from '@material-ui/core/Breadcrumbs'; +import Grid from '@material-ui/core/Grid'; +import ParticipandoRede from '../../img/ajuda/Participando_da_rede.png'; +import How from '../../Components/HelpCenter/TabsNetPart/How' +import What from '../../Components/HelpCenter/TabsNetPart/What' +import CardEncontrando from '../../Components/HelpCenter/Cards/CardEncontrando'; +import CardPublicando from '../../Components/HelpCenter/Cards/CardPublicando'; +import CardGerenciando from '../../Components/HelpCenter/Cards/CardGerenciando'; +import { Link } from 'react-router-dom'; + + + + + + + +export default function TabNetPart(props) { + const tabs = [ + 'Como comentar ou avaliar um recurso?', + 'Que tipo de comentário posso fazer sobre o recurso?', + 'Participando da Rede' + ] + + const [tabValue, setTabValue] = useState(props.location.state === "undefined" ? 0 : props.location.state); + + const handleChangeTab = (e, newValue) => { + setTabValue(newValue) + } + + useEffect(() => { window.scrollTo(0, 0) }, []) + + return ( + <div style={{ backgroundColor: "#f4f4f4" }}> + <link href="https://fonts.googleapis.com/css?family=Pompiere|Roboto:500,400&display=swap" rel="stylesheet" /> + + <Secao> + <BreadCrumbsDiv> + <StyledBreadCrumbs> + <Link to="/" > + Página Inicial + </Link> + <Link to="ajuda" > + Ajuda + </Link> + + <span> + {tabs[2]} + </span> + + + </StyledBreadCrumbs> + + </BreadCrumbsDiv> + <Grid container justify="center"> + <Grid item xs={12} md={10} > + <Principal> + <Menu> + <div className="fixo"> + <img src={ParticipandoRede} alt="Participando da Rede" /> + <span>{tabs[2]}</span> + </div> + <TabsStyled orientation="vertical" + variant="scrollable" + value={tabValue} + onChange={handleChangeTab} + TabIndicatorProps={{ style: { display: "none" } }} + > + <TabStyled label={tabs[0]}></TabStyled> + <TabStyled label={tabs[1]}></TabStyled> + </TabsStyled> + <br /> + <div className="voltarInicio"> + <a href="ajuda">VOLTAR AO ÃNICIO</a> + </div> + </Menu> + + {tabValue === 0 && <How title={tabs[0]} />} + {tabValue === 1 && <What title={tabs[1]} />} + <div className="resultadosProcura"> + <span>Não era bem o que você procurava?</span> + <div className="subtitulo"> + <span>Você pode navegar pelos tópicos de ajuda ou entrar em <a href="contato">Contato</a>.</span> + </div> + </div> + + </Principal> + </Grid> + </Grid> + + + <Grid style={{ paddingBottom: "50px" }} container justify={"center"}> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardPublicando /> + </Grid> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardEncontrando /> + </Grid> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardGerenciando /> + </Grid> + </Grid> + + + </Secao> + </div> + ); +} +const StyledBreadCrumbs = styled(Breadcrumbs)` + display : flex; + justify-content : flex-start; + span { + color : #a5a5a5; + } + a { + color: #00bcd4; + text-decoration: none; + } + +` + +const BreadCrumbsDiv = styled.div` + + padding : 10px; + display : flex; +` + + +const Principal = styled.div` + .fixo { + + height: 40px; + text-align: center; + background-color: #fff; + padding: 30px; + margin-bottom: 30px; + color: #666; + + + img { + height: 50px; + width: 50px; + margin-right: 40px; + vertical-align: middle; + + } + + span { + font-size: 20px; + vertical-align: ; + } + + + + } + .resultadosProcura { + text-align: center; + margin-block: 30px; + padding-inline: 15px; + color: #666; + span { + font-size: 24px; + } + .subtitulo { + margin-top: 10px; + + span { + font-size: 15px + } + + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + + } + } + +` + +const TabsStyled = styled(Tabs)` + + .Mui-selected { + background-color: #e7e4e4; + } + + .MuiTab-root{ + text-transform: none !important; + max-width:100% + } + text-align: center; + width:100% + +` + +const TabStyled = styled(Tab)` + + padding: 4px 15px !important; + font-weight: 500; + font-size: 14px !important; + border-radius: 4px !important; + text-align: center; + + + + + + &:hover { + background-color: #e7e4e4; + } +` + + +const Menu = styled.div` + width: auto; + background-color: #fff; + color: #666; + padding-block: 10px; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-bottom:30px + + + h4 { + padding-inline: 15px; + font-size: 18px; + margin-block: 10px; + font-weight: 500; + line-height: 1.1; + } + + .voltarInicio { + padding: 4px 15px; + font-size: 15px; + text-align: center; + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + } + + hr { + border: 0; + border-top: 1px solid #ccc; + margin-top: 20px; + margin-bottom: 20px; + } + + .procurava { + padding: 4px 15px; + font-size: 15px; + text-align: center; + + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + + } + +` + +const Secao = styled.div` + margin-inline: auto; + +` diff --git a/src/Pages/TabsHelp/TabPlataformaMEC.js b/src/Pages/TabsHelp/TabPlataformaMEC.js new file mode 100644 index 0000000000000000000000000000000000000000..c704d98fed23e0a02df21be202f1233284067c9e --- /dev/null +++ b/src/Pages/TabsHelp/TabPlataformaMEC.js @@ -0,0 +1,278 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState } from 'react'; +import styled from 'styled-components'; +import Tabs from '@material-ui/core/Tabs' +import Tab from '@material-ui/core/Tab'; +import Breadcrumbs from '@material-ui/core/Breadcrumbs'; +import Grid from '@material-ui/core/Grid'; +import CardEncontrando from '../../Components/HelpCenter/Cards/CardEncontrando'; +import CardParticipando from '../../Components/HelpCenter/Cards/CardParticipando'; +import CardGerenciando from '../../Components/HelpCenter/Cards/CardGerenciando'; +import What from '../../Components/HelpCenter/TabsPlataformaMEC/What'; +import Understand from '../../Components/HelpCenter/TabsPlataformaMEC/Understand'; +import Which from '../../Components/HelpCenter/TabsPlataformaMEC/Which'; +import Types from '../../Components/HelpCenter/TabsPlataformaMEC/Types'; +import Software from '../../Components/HelpCenter/TabsPlataformaMEC/Software'; +import How from '../../Components/HelpCenter/TabsPlataformaMEC/How'; +import { Link } from 'react-router-dom'; + + + + + + + +export default function TabPlataformaMEC (props) { + const tabs= [ + 'O que é a plataforma MEC?', + 'Como foi construÃda a Plataforma MEC?', + 'Entendendo as 3 áreas da Plataforma', + 'Quais são os Portais Parceiros?', + 'Tipos de recursos', + 'Softwares especÃficos', + 'Plataforma MEC' + ] + + const [tabValue, setTabValue] = useState( + Number(props.location.state.value) || 0); + + const handleChangeTab = (e, newValue) => { + setTabValue(newValue) +} + + + + return( + <div style={{backgroundColor:"#f4f4f4"}}> + <link href="https://fonts.googleapis.com/css?family=Pompiere|Roboto:500,400&display=swap" rel="stylesheet"/> + + <Secao> + <BreadCrumbsDiv> + <StyledBreadCrumbs> + <Link to="/" > + Página Inicial + </Link> + <Link to="ajuda" > + Ajuda + </Link> + + <span> + {tabs[6]} + </span> + + </StyledBreadCrumbs> + + </BreadCrumbsDiv> + <Grid container spacing={4}> + <Grid item xs={3}> + <Menu> + <h4>{tabs[6]}</h4> + <TabsStyled orientation = "vertical" + variant = "scrollable" + value = {tabValue} + onChange = {handleChangeTab} + TabIndicatorProps = {{style:{display: "none"}}} + > + <TabStyled label={tabs[0]}></TabStyled> + <TabStyled label={tabs[1]}></TabStyled> + <TabStyled label={tabs[2]}></TabStyled> + <TabStyled label={tabs[3]}></TabStyled> + <TabStyled label={tabs[4]}></TabStyled> + <TabStyled label={tabs[5]}></TabStyled> + </TabsStyled> + <br/> + <div className="voltarInicio"> + <a href="ajuda">VOLTAR AO ÃNICIO</a> + </div> + <hr/> + <div className="procurava"> + Não encontrou o que procurava? Entre em + <a href="contato"> contato</a> + </div> + </Menu> + </Grid> + + <Grid item xs={9}> + <Principal> + {tabValue === 0 && <What title={tabs[0]}/>} + {tabValue === 1 && <How title={tabs[1]}/>} + {tabValue === 2 && <Understand title={tabs[2]}/>} + {tabValue === 3 && <Which title={tabs[3]}/>} + {tabValue === 4 && <Types title={tabs[4]}/>} + {tabValue === 5 && <Software title={tabs[5]}/>} + + <Grid style={{marginBlock:"50px"}} container spacing={2}> + <Grid item xs={4}> + <CardEncontrando/> + </Grid> + <Grid item xs={4}> + <CardParticipando/> + </Grid> + <Grid item xs={4}> + <CardGerenciando/> + </Grid> + + </Grid> + + </Principal> + </Grid> + </Grid> + + + </Secao> + </div> + ); +} + +const StyledBreadCrumbs = styled(Breadcrumbs)` + display : flex; + justify-content : flex-start; + max-width : 1170px; + span { + color : #a5a5a5; + } + a { + color: #00bcd4; + text-decoration: none; + } + +` + +const BreadCrumbsDiv = styled.div` + + padding : 10px; + display : flex; +` + +const Principal = styled.div` + .fixo { + + height: 40px; + text-align: center; + background-color: #fff; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + padding: 30px; + margin-bottom: 30px; + color: #666; + + + img { + height: 50px; + width: 50px; + margin-right: 40px; + vertical-align: middle; + + } + + span { + font-size: 20px; + vertical-align: ; + } + + + + } + +` + +const TabsStyled = styled(Tabs)` + + .Mui-selected { + background-color: #e7e4e4; + } + + .MuiTab-root{ + text-transform: none !important; + } + +` + +const TabStyled = styled(Tab)` + + padding: 4px 15px !important; + font-weight: 500; + font-size: 14px !important; + border-radius: 4px !important; + + + + + + &:hover { + background-color: #e7e4e4; + } +` + + +const Menu = styled.div` + width: auto; + background-color: #fff; + color: #666; + padding-block: 10px; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + + h4 { + padding-inline: 15px; + font-size: 18px; + margin-block: 10px; + font-weight: 500; + line-height: 1.1; + } + + .voltarInicio { + padding: 4px 15px; + font-size: 15px; + text-align: center; + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + } + + hr { + border: 0; + border-top: 1px solid #ccc; + margin-top: 20px; + margin-bottom: 20px; + } + + .procurava { + padding: 4px 15px; + font-size: 15px; + text-align: center; + + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + + } + +` + +const Secao = styled.div` + width: 1138px; + margin-inline: auto; + +` diff --git a/src/Pages/TabsHelp/TabResourseFind.js b/src/Pages/TabsHelp/TabResourseFind.js new file mode 100644 index 0000000000000000000000000000000000000000..3ea892563437144c7f79a1c482c16f475e21bde8 --- /dev/null +++ b/src/Pages/TabsHelp/TabResourseFind.js @@ -0,0 +1,295 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react'; +import styled from 'styled-components'; +import Tabs from '@material-ui/core/Tabs' +import Tab from '@material-ui/core/Tab'; +import Breadcrumbs from '@material-ui/core/Breadcrumbs'; +import Grid from '@material-ui/core/Grid'; +import EncontrandoRecurso from '../../img/ajuda/Encontrando_recursos.png'; +import HowToDo from '../../Components/HelpCenter/TabsResourseFind/HowToDo' +import HowToRank from '../../Components/HelpCenter/TabsResourseFind/HowToRank' +import HowToFilter from '../../Components/HelpCenter/TabsResourseFind/HowToFilter'; +import CardPublicando from '../../Components/HelpCenter/Cards/CardPublicando'; +import CardParticipando from '../../Components/HelpCenter/Cards/CardParticipando'; +import CardGerenciando from '../../Components/HelpCenter/Cards/CardGerenciando'; +import { Link } from 'react-router-dom'; + + + + + + + +export default function TabResourseFind(props) { + const tabs = [ + 'Como fazer uma busca?', + 'Como filtrar os resultados?', + 'Como os recursos são ranqueados?', + 'Encontrando Recursos' + ] + + const [tabValue, setTabValue] = useState(props.location.state === "undefined" ? 0 : props.location.state); + + const handleChangeTab = (e, newValue) => { + setTabValue(newValue) + } + + useEffect(() => { window.scrollTo(0, 0) }, []) + + return ( + <div style={{ backgroundColor: "#f4f4f4" }}> + <link href="https://fonts.googleapis.com/css?family=Pompiere|Roboto:500,400&display=swap" rel="stylesheet" /> + + <Secao> + <BreadCrumbsDiv> + <StyledBreadCrumbs> + <Link to="/" > + Página Inicial + </Link> + <Link to="ajuda" > + Ajuda + </Link> + + <span> + {tabs[3]} + </span> + + </StyledBreadCrumbs> + + </BreadCrumbsDiv> + <Grid container justify="center"> + <Grid item xs={12} md={10} > + <Principal> + <Menu> + <div className="fixo"> + <img src={EncontrandoRecurso} alt="Encontrando Recursos" /> + <span>{tabs[3]}</span> + </div> + <TabsStyled orientation="vertical" + variant="scrollable" + value={tabValue} + onChange={handleChangeTab} + TabIndicatorProps={{ style: { display: "none" } }} + > + <TabStyled label={tabs[0]}></TabStyled> + <TabStyled label={tabs[1]}></TabStyled> + <TabStyled label={tabs[2]}></TabStyled> + </TabsStyled> + <br /> + <div className="voltarInicio"> + <a href="ajuda">VOLTAR AO ÃNICIO</a> + </div> + </Menu> + + {tabValue === 0 && <HowToDo title={tabs[0]} />} + {tabValue === 1 && <HowToFilter title={tabs[1]} />} + {tabValue === 2 && <HowToRank title={tabs[2]} />} + <div className="resultadosProcura"> + <span>Não era bem o que você procurava?</span> + <div className="subtitulo"> + <span>Você pode navegar pelos tópicos de ajuda ou entrar em <a href="contato">Contato</a>.</span> + </div> + </div> + + + </Principal> + </Grid> + </Grid> + <Grid style={{ paddingBottom: "50px" }} container justify={"center"}> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardPublicando /> + </Grid> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardParticipando /> + </Grid> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardGerenciando /> + </Grid> + </Grid> + + + </Secao> + </div> + ); +} + +const StyledBreadCrumbs = styled(Breadcrumbs)` + display : flex; + justify-content : flex-start; + span { + color : #a5a5a5; + } + a { + color: #00bcd4; + text-decoration: none; + } + +` + +const BreadCrumbsDiv = styled.div` + + padding : 10px; + display : flex; +` + + +const Principal = styled.div` + .fixo { + + height: 40px; + text-align: center; + background-color: #fff; + padding: 30px; + margin-bottom: 30px; + color: #666; + + + img { + height: 50px; + width: 50px; + margin-right: 40px; + vertical-align: middle; + + } + + span { + font-size: 20px; + vertical-align: ; + } + + + + } + .resultadosProcura { + text-align: center; + margin-block: 30px; + padding-inline: 15px; + color: #666; + span { + font-size: 24px; + } + .subtitulo { + margin-top: 10px; + + span { + font-size: 15px + } + + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + + } + } + +` + +const TabsStyled = styled(Tabs)` + + .Mui-selected { + background-color: #e7e4e4; + } + + .MuiTab-root{ + text-transform: none !important; + max-width:100% + } + text-align: center; + width:100% + +` + +const TabStyled = styled(Tab)` + + padding: 4px 15px !important; + font-weight: 500; + font-size: 14px !important; + border-radius: 4px !important; + text-align: center; + + + + + + &:hover { + background-color: #e7e4e4; + } +` + + +const Menu = styled.div` + width: auto; + background-color: #fff; + color: #666; + padding-block: 10px; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-bottom:30px + + + h4 { + padding-inline: 15px; + font-size: 18px; + margin-block: 10px; + font-weight: 500; + line-height: 1.1; + } + + .voltarInicio { + padding: 4px 15px; + font-size: 15px; + text-align: center; + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + } + + hr { + border: 0; + border-top: 1px solid #ccc; + margin-top: 20px; + margin-bottom: 20px; + } + + .procurava { + padding: 4px 15px; + font-size: 15px; + text-align: center; + + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + + } + +` + +const Secao = styled.div` + margin-inline: auto; + +` diff --git a/src/Pages/TabsHelp/TabResoursePub.js b/src/Pages/TabsHelp/TabResoursePub.js new file mode 100644 index 0000000000000000000000000000000000000000..514362aa97d6a8f88a9653fb5dff007ccd51fb59 --- /dev/null +++ b/src/Pages/TabsHelp/TabResoursePub.js @@ -0,0 +1,289 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, { useState, useEffect } from 'react'; +import styled from 'styled-components'; +import Tabs from '@material-ui/core/Tabs' +import Tab from '@material-ui/core/Tab'; +import Breadcrumbs from '@material-ui/core/Breadcrumbs'; +import Grid from '@material-ui/core/Grid'; +import PublicandoRecursos from '../../img/ajuda/Publicando_recursos.png'; +import Why from '../../Components/HelpCenter/TabsResoursePub/Why' +import How from '../../Components/HelpCenter/TabsResoursePub/How' +import Which from '../../Components/HelpCenter/TabsResoursePub/Which' +import CardEncontrando from '../../Components/HelpCenter/Cards/CardEncontrando'; +import CardParticipando from '../../Components/HelpCenter/Cards/CardParticipando'; +import CardGerenciando from '../../Components/HelpCenter/Cards/CardGerenciando'; +import { Link } from 'react-router-dom'; + +export default function TabResoursePub(props) { + + console.log(props) + + const tabs = [ + 'Por que enviar um recurso?', + 'Como publicar um recurso?', + 'Quais tipos de recursos e formatos de arquivo a plataforma aceita?', + 'Publicando Recursos' + ] + + const [tabValue, setTabValue] = useState(props.location.state === "undefined" ? 0 : props.location.state); + + const handleChangeTab = (e, newValue) => { + setTabValue(newValue) + } + + useEffect(() => { window.scrollTo(0, 0) }, []) + + return ( + <div style={{ backgroundColor: "#f4f4f4" }}> + <link href="https://fonts.googleapis.com/css?family=Pompiere|Roboto:500,400&display=swap" rel="stylesheet" /> + + <Secao> + <BreadCrumbsDiv> + <StyledBreadCrumbs> + <Link to="/" > + Página Inicial + </Link> + <Link to="ajuda" > + Ajuda + </Link> + <span> + {tabs[3]} + </span> + </StyledBreadCrumbs> + + </BreadCrumbsDiv> + <Grid container justify="center"> + <Grid item xs={12} md={10} > + <Principal> + <Menu> + <div className="fixo"> + <img src={PublicandoRecursos} alt="Publicando Recursos" /> + <span>{tabs[3]}</span> + </div> + <TabsStyled orientation="vertical" + variant="scrollable" + value={tabValue} + onChange={handleChangeTab} + TabIndicatorProps={{ style: { display: "none" } }} + > + <TabStyled label={tabs[0]}></TabStyled> + <TabStyled label={tabs[1]}></TabStyled> + <TabStyled label={tabs[2]}></TabStyled> + </TabsStyled> + <br /> + <div className="voltarInicio"> + <a href="ajuda">VOLTAR AO ÃNICIO</a> + </div> + </Menu> + + {tabValue === 0 && <Why title={tabs[0]} />} + {tabValue === 1 && <How title={tabs[1]} />} + {tabValue === 2 && <Which title={tabs[2]} />} + <div className="resultadosProcura"> + <span>Não era bem o que você procurava?</span> + <div className="subtitulo"> + <span>Você pode navegar pelos tópicos de ajuda ou entrar em <a href="contato">Contato</a>.</span> + </div> + </div> + + </Principal> + </Grid> + </Grid> + <Grid style={{ paddingBottom: "50px" }} container justify={"center"}> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardEncontrando /> + </Grid> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardParticipando /> + </Grid> + <Grid item xs={12} md={3} style={{ margin: 5 }}> + <CardGerenciando /> + </Grid> + + </Grid> + + + </Secao> + </div> + ); +} +const StyledBreadCrumbs = styled(Breadcrumbs)` + display : flex; + justify-content : flex-start; + span { + color : #a5a5a5; + } + a { + color: #00bcd4; + text-decoration: none; + } + +` + +const BreadCrumbsDiv = styled.div` + + padding : 10px; + display : flex; +` + + +const Principal = styled.div` + .fixo { + + height: 40px; + text-align: center; + background-color: #fff; + padding: 30px; + margin-bottom: 30px; + color: #666; + + + img { + height: 50px; + width: 50px; + margin-right: 40px; + vertical-align: middle; + + } + + span { + font-size: 20px; + vertical-align: ; + } + + + + } + .resultadosProcura { + text-align: center; + margin-block: 30px; + padding-inline: 15px; + color: #666; + span { + font-size: 24px; + } + .subtitulo { + margin-top: 10px; + + span { + font-size: 15px + } + + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + + } + } + +` + +const TabsStyled = styled(Tabs)` + + .Mui-selected { + background-color: #e7e4e4; + } + + .MuiTab-root{ + text-transform: none !important; + max-width:100% + } + text-align: center; + width:100% + +` + +const TabStyled = styled(Tab)` + + padding: 4px 15px !important; + font-weight: 500; + font-size: 14px !important; + border-radius: 4px !important; + text-align: center; + + + + + + &:hover { + background-color: #e7e4e4; + } +` + + +const Menu = styled.div` + width: auto; + background-color: #fff; + color: #666; + padding-block: 10px; + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + margin-bottom:30px + + + h4 { + padding-inline: 15px; + font-size: 18px; + margin-block: 10px; + font-weight: 500; + line-height: 1.1; + } + + .voltarInicio { + padding: 4px 15px; + font-size: 15px; + text-align: center; + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + } + + hr { + border: 0; + border-top: 1px solid #ccc; + margin-top: 20px; + margin-bottom: 20px; + } + + .procurava { + padding: 4px 15px; + font-size: 15px; + text-align: center; + + a { + font-size: 15px; + padding: 0; + color:#00bcd4; + text-decoration: none; + } + + } + +` + +const Secao = styled.div` + margin-inline: auto; + +` diff --git a/src/Pages/TermsPage.js b/src/Pages/TermsPage.js index 65081cf7990a3c41dc15591dcefe2f3c44c546e4..aaa58528781f305e067490c2ba119a5bd76dd9ce 100644 --- a/src/Pages/TermsPage.js +++ b/src/Pages/TermsPage.js @@ -21,16 +21,16 @@ import {device} from '../Components/device.js' import { Store } from '../Store.js'; import { Button } from '@material-ui/core'; import Card from '@material-ui/core/Card'; -import CardActions from '@material-ui/core/CardActions'; import LabeledCheckbox from "../Components/Checkbox.js" import TermsPageContent from '../Components/TermsPageContent.js' - +import AppBar from '@material-ui/core/AppBar'; +import { makeStyles } from '@material-ui/core/styles'; +import {Link} from 'react-router-dom' const CardStyled = styled(Card)` box-sizing : border-box; background-color : white; max-width: 1700px; padding-top: 52px; - margin-left:7em; @media ${device.mobileM} { width : 100%; height : 100%; @@ -55,14 +55,36 @@ const StyledSpanContinuar = styled.span` color: #fff; ` -const Styledhr = styled.hr` - color: #dadada; +const Background = styled.div` + padding-top : 40px; + background-color : #f4f4f4; + color : #666; + padding-bottom : 40px; + + .container { + padding : 0; + margin-right : auto; + margin-left : auto; + + @media screen and (min-width: 768px) { + width : 750px; + } + @media screen and (min-width: 992px) { + width : 970px; + } + @media screen and (min-width: 1200px) { + width : 1170px; + } + } ` export default function TermsContainer (props) { + // eslint-disable-next-line const {state, dispatch} = useContext(Store) + // eslint-disable-next-line const [checked, setChecked] = useState(false); const [unavailableButton, setButtonAvailability] = useState(true); + const classes = useStyles() const handleChecked = e => { setChecked(e.target.checked); @@ -76,41 +98,144 @@ export default function TermsContainer (props) { userAgreement: true }) - props.history.push('/permission') - - window.scrollTo(0, 0) + if (props.location.state) { + props.history.push('/professor') + }else { + props.history.push('/permission') + window.scrollTo(0, 0) + } } return ( - <div style={{paddingTop:"5vh", paddingBottom:"5vh", backgroundColor :"#f4f4f4"}}> - <div> - <CardStyled variant="outlined"> - <TermsPageContent/> - <Styledhr/> - <CardActions style={{justifyContent:"center", padding:"25px"}}> - <div> + <Background> + <div className="container"> + <CardStyled variant="outlined"> + <TermsPageContent/> + </CardStyled> + </div> + <AppBar position="fixed" color="primary" className={classes.appBar}> + <StyledAppBarContainer> + <div className="container"> <div style={{fontSize:"14px"}}> - <LabeledCheckbox label={<Styledspan>Li e concordo com os termos de uso da Plataforma Integrada de RED do MEC</Styledspan>} handleChange={handleChecked}/> - <div style={{marginLeft:"1em", paddingLeft:"16px", color:"#a0a0a0", justifyContent:"center",display:"flex"}}> - <Button disabled = {unavailableButton} - style={ unavailableButton ? {backgroundColor:"#e9e9e9"} : {backgroundColor:"#00bcd4"}} - onClick={handleAgreement} - > - <StyledSpanContinuar style={unavailableButton ? {color:"#666666"} : {}}> + <LabeledCheckbox label={<Styledspan style={{color : "#666", fontWeight : "600"}}>Li e concordo com os termos de uso da Plataforma Integrada de RED do MEC</Styledspan>} handleChange={handleChecked}/> + </div> + <div className="botoes"> + <Button disabled = {unavailableButton} + style={ unavailableButton ? {backgroundColor:"#e9e9e9"} : {backgroundColor:"#00bcd4"}} + onClick={handleAgreement} + > + <StyledSpanContinuar style={unavailableButton ? {color:"#666666"} : {}}> Continuar - </StyledSpanContinuar> - </Button> - <Button style={{marginLeft:"45px", backgroundColor:"#e9e9e9"}}> - <Styledspan style={{color:"rgb(102, 102, 102)"}}> - Cancelar - </Styledspan> - </Button> - </div> + </StyledSpanContinuar> + </Button> + <Link to="/"> + <GrayButton> + Cancelar + </GrayButton> + </Link> </div> </div> - </CardActions> - </CardStyled> - </div> - </div> + </StyledAppBarContainer> + </AppBar> + </Background> ) } + +const GrayButton = styled(Button)` + &:hover { + background-color : rgba(158,158,158,0.2) !important; + } + height : 36px !important; + font-weight : 600 !important; + color : #666 !important; + background-color: transparent; + min-width : 88px !important; + height : 36px !important; + margin-left : 8px !important; + margin-right : 8px !important; + + .button-text { + cursor : pointer; + line-height : 22px; + text-align : center; + color : currentColor; + white-space : nowrap; + text-transform : uppercase; + font-weight : 600; + font-size : 15px; + font-style : inherit; + font-variant : inherit; + font-family: 'Roboto', sans serif; + letter-spacing: .01em; + } +` + +const useStyles = makeStyles((theme) => ({ + appBar: { + top: 'auto', + bottom: 0, + height : '100px', + backgroundColor : '#fff', + boxShadow : '0 1px 3px rgba(0,0,0,.52),0 1px 2px rgba(0,0,0,.24)' + }, +})); + + +const StyledAppBarContainer = styled.div` + .container { + display : flex; + flex-direction : column; + justify-content : flex-start + margin-right : auto; + margin-left : auto; + padding-top : 5px; + + @media screen and (min-width: 1200px) { + width : 1170px; + } + @media screen and (min-width: 992px) and (max-width : 1199px){ + width : 970px; + } + @media screen and (min-width: 768px) and (max-width : 991px) { + width : 750px; + padding : 0 1em 1em 1em; + } + + .botoes { + display : flex; + align-items : center; + @media screen and (max-width: 768px) { + justify-content : center !important; + } + } + + .MuiFormControlLabel-root { + @media screen and (max-width: 768px) { + margin-left : 0 !important; + } + } + } +` + +// {/*<CardActions style={{justifyContent:"center", padding:"25px", borderTop : "2px solid #dadada"}}> +// <div> +// <div style={{fontSize:"14px"}}> +// <LabeledCheckbox label={<Styledspan>Li e concordo com os termos de uso da Plataforma Integrada de RED do MEC</Styledspan>} handleChange={handleChecked}/> +// <div style={{marginLeft:"1em", paddingLeft:"16px", color:"#a0a0a0", justifyContent:"center",display:"flex"}}> +// <Button disabled = {unavailableButton} +// style={ unavailableButton ? {backgroundColor:"#e9e9e9"} : {backgroundColor:"#00bcd4"}} +// onClick={handleAgreement} +// > +// <StyledSpanContinuar style={unavailableButton ? {color:"#666666"} : {}}> +// Continuar +// </StyledSpanContinuar> +// </Button> +// <Button style={{marginLeft:"45px", backgroundColor:"#e9e9e9"}}> +// <Styledspan style={{color:"rgb(102, 102, 102)"}}> +// Cancelar +// </Styledspan> +// </Button> +// </div> +// </div> +// </div> +// </CardActions>*/} diff --git a/src/Pages/Teste.js b/src/Pages/Teste.js index 38f6b4023ae3c9d8978f40b06474c06cc0a4215d..0652c42d9da86c1950f9dbdaae7f08fb4f40e772 100644 --- a/src/Pages/Teste.js +++ b/src/Pages/Teste.js @@ -16,661 +16,120 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; -import styled from 'styled-components'; -import Grid from '@material-ui/core/Grid'; -/*Importação de imagens para o componente*/ -import Handshake from "../img/termos/handshake.svg" -import Pessoa from "../img/termos/Pessoa.svg" -import Email from "../img/termos/Email.svg" -import Seguranca from "../img/termos/Seguranca.svg" -import Aberto from "../img/termos/Aberto.png"; -import Fechado from "../img/termos/Fechado.png"; -import Arrow_down from "../img/termos/Arrow_down.svg"; -import Arrow_double from "../img/termos/Arrow_double.svg"; -import Arrow_O from "../img/termos/Arrow_O que é a plataforma.png"; -import Arrow_O_1 from "../img/termos/Arrow_O que é a plataforma-1.png"; - - -const Slide = styled.div` - -position: absolute; -height: 500px; -width: 1366px; - -h2{ - font-family: "Pompiere", regular; - font-size: 44px; - line-height: 120%; - color: #FFFFFF; -} - -h3{ - font-family: "Roboto", regular; - font-size: 27px; - line-height: 120%; - color: #FFFFFF; -} - -p{ - font-family: "Roboto", regular; - font-size: 20px; - line-height: 120%; - color: #FFFFFF; - text-align: left; -} - -.container{ - position: absolute; - height: auto; - width: auto; - margin: 70px 180px 90px; -} - - -.tmpl1{ - background-color: #00BCD4; - height: inherit; - width: inherit; - display: flex; - align-items: center; - - - .box-text{ - position: relative; - float: left; - padding-right: 10px; - padding-left: 10px; - } - - .box-image{ - position: relative; - float: right; - } -} - -.tmpl2{ - height: inherit; - width: inherit; - display: flex; - align-items: center; - background-color: #673AB7; - - .title{ - padding-bottom: 50px; - } - - .images{ - position: relative; - display: table-row; - } - - .arrow{ - display: table-row; - position: absolute; - margin-left: 15px; - margin-top: -15px; - } - - .circle{ - display: table-row; - position: absolute; - margin-top: -100px; - margin-left: 755px; - } - - .box-text{ - p{ - font-size: 18px; - line-height: 25px; - } - - position: relative; - - } - - -} - -.tmpl3{ - height: inherit; - width: inherit; - display: flex; - align-items: center; - background-color: #E81F4F; - - .title{ - position: relative; - padding-left: 10px; - h3{ - line-height: 40px; - } - } - - .box-text1{ - .text{ - padding-top: 20px; - } - - .content{ - display: table-row; - - p{ - display: table-cell; - font-size: 18px; - line-height: 25px; - vertical-align: middle; - } - - img{ - position: relative; - left: 0; - margin-right: 20px; - display: table-cell; - vertical-align: middle; - margin: 10px 20px 10px -10px; - } - } - - } - - .box-text2{ - top: -50px; - .content{ - p{ - padding-bottom: 20px; - } - - img{ - margin-left: -65px; - margin-top: 25px; - } - - .twoArrow{ - margin-top: -5px; - } - } - - - } - - - -} - -.tmpl4{ - height: inherit; - width: inherit; - display: flex; - align-items: center; - background-color: #FF7F00; - - h2{ - padding-bottom: 20px; - } - - p{ - font-size: 20px; - line-height: 25px; - vertical-align: middle; - } - - .box-images{ - height: inherit; - display: table-row; - padding-top: 50px; - } - - img{ - display: table-cell; - vertical-align: middle; - top: 40px; - } - - -} - -.tmpl5{ - height: inherit; - width: inherit; - display: flex; - align-items: center; - background-color: #1AB9DE; - - .title{ - display: table-row; - align-items: center; - - img{ - display: table-cell; - margin-right: 30px; - } - - h2{ - display: table-cell; - text-align: center; - vertical-align: middle; - } - } - - .box-text { - margin-top: 20px; - p{ - font-size: 17px; - font-weight: 15px; - } - } - -} - -.tmpl6{ - height: inherit; - width: inherit; - display: flex; - align-items: center; - background-color: #673AB7; - - .box-text-1{ - h3{ - margin-bottom: 20px; - font-size: 27px; - } - p{ - margin-bottom: 20px; - font-size: 18px; - } - - - .licences{ - padding: 35px 150px 50px 35px; - margin-top: 50pz; - background-image: url("../../img/termos/Entenda.svg"); - background-repeat: no-repeat; - background-size: cover; - p::before{ - content: url(../../img/termos/V.svg); - } - p{ - padding-left: 20px; - font-family: "Kalam", regular; - font-size: 24px; - white-space: nowrap; - } - .row{ - padding-bottom: 5px; - } - } - } - - - .box-text-2{ - background-image: url("../../img/termos/OrthogonalLineUp.png"),url("../../img/termos/OrthogonalLineDown.png"); - background-repeat: no-repeat; - background-position: left top, right bottom; - padding-top: 30px; - padding-left: 50px; - p{ - font-size: 15px; - padding-bottom: 15px; - } - - .licenses_type{ - margin-left: -20px; - font-size: 22px; - font-weight: bold; - text-align: right; - white-space: nowrap; - } - } - -} - -.tmpl7{ - height: inherit; - width: inherit; - display: flex; - align-items: center; - background-color: #E81F4F; - - .title{ - h2{ - font-family: Roboto; - font-size: 44px; - } - } - - .box-text{ - margin-top: 20px; - p{ - line-height: 20px; - font-family: "Roboto"; - font-size: 18px; - } - } - - .rodape{ - margin-top: 40px; - p{ - line-height: 20px; - font-family: "Pompiere", regular; - font-size: 28px; - text-align: center; - } - span{ - text-decoration: underline; - font-family: "Pompiere", regular; - line-height: 20px; - font-size: 28px; - cursor: pointer; - } - } -} - -` - - - - -const Slide1 = styled.div` - - background:#00BCD4; - height:500px; - width:1366px; - -` - - - -const Slide3 = styled.div` - - background:#e81f4f; - height:500px; - width:1366px; - - - .tmpl3{ - height: inherit; - width: inherit; - display: flex; - align-items: center; - background-color: #E81F4F; - - .title{ - position: relative; - padding-left: 10px; - h3{ - line-height: 40px; - } - } - - .box-text1{ - .text{ - padding-top: 20px; - } - - .content{ - display: table-row; - - p{ - display: table-cell; - font-size: 18px; - line-height: 25px; - vertical-align: middle; - } - - img{ - position: relative; - left: 0; - margin-right: 20px; - display: table-cell; - vertical-align: middle; - margin: 10px 20px 10px -10px; - } - } - - } - - .box-text2{ - top: -50px; - .content{ - p{ - padding-bottom: 20px; - } - - img{ - margin-left: -65px; - margin-top: 25px; - } - - .twoArrow{ - margin-top: -5px; - } - } - } - } -` - - -const Slide4 = styled.div` - - - background:#ff7f00; - height:500px; - width:1366px; - - position: absolute; - height: 500px; - width: 1366px; - - .container{ - position: absolute; - height: auto; - width: auto; - margin: 70px 180px 90px; - } - .tmpl4{ - height: inherit; - width: inherit; - display: flex; - align-items: center; - background-color: #FF7F00; - - h2{ - padding-bottom: 20px; - font-family: Pompiere,regular; - font-size: 44px; - line-height: 120%; - color:#fff; - margin-top: 20px; - margin-bottom: 10px - } - - p{ - font-size: 20px; - line-height: 25px; - vertical-align: middle; - font-size: 20px; - font-family: Roboto,regular; - color:#fff; - margin: 0 0 10px; - text-align: left; - line-height: 25px; - padding-right: 10px; - } - - .box-images{ - height: inherit; - display: table-row; - padding-top: 50px; - } - - img{ - display: table-cell; - vertical-align: middle; - top: 40px; - } - - - } - +import React, { Component } from 'react' +import Dropdown from 'react-dropdown' + +class ObjectArrayExample extends Component { + constructor (props) { + super(props) + this.state = { + selected: { value: 'two', label: 'Two'} + } + this._onSelect = this._onSelect.bind(this) + } + + _onSelect (option) { + console.log('You selected ', option.label) + this.setState({selected: option}) + } + + render () { + const { toggleClassName, togglePlaholderClassName, toggleMenuClassName, toggleOptionsClassName } = this.state + + const options = [ + { value: 'one', label: 'One' }, + { value: 'two', label: 'Two', className: toggleOptionsClassName && 'my-custom-class' }, + { + type: 'group', name: 'group1', items: [ + { value: 'three', label: 'Three', className: toggleOptionsClassName && 'my-custom-class' }, + { value: 'four', label: 'Four' } + ] + }, + { + type: 'group', name: 'group2', items: [ + { value: 'five', label: 'Five' }, + { value: 'six', label: 'Six' } + ] + } + ] + + + const defaultOption = this.state.selected + const placeHolderValue = typeof this.state.selected === 'string' ? this.state.selected : this.state.selected.label + + return ( + <section> + <h3>Object Array and Custom ClassNames Example </h3> + <div className="buttons"> + <button onClick={() => this.setState({ toggleClassName: !toggleClassName })}> + Toggle dropdown custom class + </button> + <button onClick={() => this.setState({ togglePlaholderClassName: !togglePlaholderClassName })}> + Toggle placeholder custom class + </button> + <button onClick={() => this.setState({ toggleMenuClassName: !toggleMenuClassName })}> + Toggle menu custom class + </button> + <button onClick={() => this.setState({ toggleOptionsClassName: !toggleOptionsClassName })}> + Toggle options custom class + </button> + </div> + <Dropdown + options={options} + onChange={this._onSelect} + value={defaultOption} + placeholder="Select an option" + className={ toggleClassName ? 'my-custom-class' : '' } + placeholderClassName={ togglePlaholderClassName ? 'my-custom-class' : '' } + menuClassName={ toggleMenuClassName ? 'my-custom-class' : '' } + /> + <div className='result'> + You selected + <strong> {placeHolderValue} </strong> + </div> + <section> + <h4>Options: </h4> + <div className='code'> + <pre> + {` +const options = [ + { value: 'one', label: 'One' }, + { value: 'two', label: 'Two'${toggleOptionsClassName ? ', classNames \'my-custom-class\'' : ''} }, + { + type: 'group', name: 'group1', items: [ + { value: 'three', label: 'Three' }, + { value: 'four', label: 'Four'${toggleOptionsClassName ? ', className: \'my-custom-class\'' : ''} } + ] + }, + { + type: 'group', name: 'group2', items: [ + { value: 'five', label: 'Five' }, + { value: 'six', label: 'Six' } + ] + } +] +`} + </pre> + </div> + <h4>Usage with custom classeNames: </h4> + <div className='code'> + <pre>{ ` - - - - -class Teste extends Component { - render() { - return ( - <div> - <link href="https://fonts.googleapis.com/css?family=Kalam|Pompiere|Roboto&display=swap" rel="stylesheet"/> - - <Slide> - <div class="tmpl1"> - <div class="container"> - <Grid container spacing={0}> - <Grid item xs={6} > - <div class="box-text"> - <p>A Plataforma Integrada MEC RED é parte do Compromisso 6 do 3º Plano de Ação da Parceria para Governo Aberto (OGP-Brasil), que tem por objetivo “incorporar na polÃtica educacional o potencial da cultura digital, de modo a fomentar a autonomia para uso, reuso e adaptação de recursos educacionais digitais, valorizando a pluralidade e a diversidade da educação brasileiraâ€.</p> - </div> - </Grid> - <Grid item xs={6}> - <div class="box-image"> - <img src={Handshake} alt="handshake"/> - </div> - </Grid> - </Grid> - </div> - </div> - </Slide> - - <Slide> - <div class="tmpl2"> - <div class="container"> - <div class="title"> - <h2>O que é a Plataforma Integrada MEC RED e como ela está organizada?</h2> - <div class="images"> - <div class="arrow"> - <img src={Arrow_O} alt="Arrow_O"/> - </div> - <div class="circle"> - <img src={Arrow_O_1} alt="Arrow_O_1"/> - </div> - </div> - </div> - <div class="box-text col-md-6"> - <p>Uma plataforma interativa, colaborativa e criada em software livre, que disponibiliza conteúdos do acervo do MEC e indica conteúdos de parceiros com o objetivo de formar uma rede ativa de educadores interessados em usar, criar e compartilhar recursos educacionais digitais.</p> - </div> - <div class="box-text col-md-6"> - <p><strong>Repositório</strong> de recursos educacionais digitais que permite aos usuários cadastrados a publicação de seus materiais e <strong>Referatório</strong> que aponta links para conteúdos em sites externos.</p> - </div> - </div> - </div> - </Slide> - - <Slide3> - <div class="tmpl3"> - <div class="container"> - <div class="title"> - <h3>As recursos educacionais disponibilizados<br/> podem ser de dois tipos:</h3> - </div> - <Grid container spacing={5}> - - - <Grid class="text" item md={8}> - <div class="content"> - <img src={Aberto} alt="Aberto "/> - <p><strong>Abertos</strong>: recursos sem nenhuma restrição de acesso e<br/> com flexibilidade quanto ao uso ou reuso.</p> - </div> - <div class="content"> - <img src={Fechado} alt="Fechado"/> - <p><strong>Fechados</strong>: recursos com alguma restrição de acesso, uso<br/> ou reuso, como aqueles que, para acesso, há demanda de<br/> cadastro ou que têm licenças restritivas.</p> - </div> - </Grid> - - - - <Grid item md={4}> - <div class="content"> - <img src={Arrow_down}/> - <p>Como repositório, a Plataforma hospeda somente Recursos Educacionais Abertos (REA). Todo conteúdo inserido por usuários deve ser aberto.</p> - </div> - <div class="content"> - <img class="twoArrow" src={Arrow_double}/> - <p>Como referatório, a Plataforma aponta links para parceiros, e<br/> esses recursos podem ser abertos ou fechados.</p> - </div> - </Grid> - - - </Grid> - </div> - </div> - </Slide3> - - <Slide> - <div class="tmpl4"> - <div class="container"> - <Grid container spacing={5}> - <Grid item xs={6}> - <h2>Como se cadastrar?</h2> - <div> - <p>Para criar uma conta, o usuário deverá clicar no botão “Cadastre-se†na página inicial da Plataforma e fazer um cadastro utilizando um endereço de e-mail e criando uma senha.</p> - </div> - </Grid> - <Grid item xs={2} style={{alignSelf:"center"}}> <img src={Pessoa} alt="Pessoa" /> </Grid> - <Grid item xs={2} style={{alignSelf:"center"}}> <img src={Email} alt="Email" /> </Grid> - <Grid item xs={2} style={{alignSelf:"center"}}> <img src={Seguranca} alt="Seguranca" /> </Grid> - </Grid> - </div> - </div> - </Slide> - - <div style={{background:"#00BCD4", height:"500px", width:"1366px"}}> - <h2>O que publicar?</h2> - - <p>Conteúdos de cunho educacional e pertinentes ao assunto no qual estão inseridos, de autoria do usuário, de autoria coletiva (com consentimento dos demais autores) ou que estejam no domÃnio público. </p> - - <h2>O que não publicar?</h2> - - <p>Materiais ofensivos, pornográficos, relacionados a atividades ilegais, que invadam a privacidade de terceiros, que violem a legislação de Direito Autoral ou os Direitos Humanos. Propagandas, conteúdos com vÃrus, spam ou comentários abusivos.</p> - </div> - - <div style={{background:"#673ab7", height:"500px", width:"1366px"}}> - <h3>Direitos do autor e licenças de uso</h3> - - <p>Ao inserir um novo material de sua autoria no Repositório, o usuário deverá escolher um dos tipos de licença aberta disponÃveis na Plataforma:</p> - - <p>CC-BY</p> - - <p>CC-BY-SA</p> - - <p>CC-BY-NC</p> - - <p>CC-BY-NC-SA</p> - - <p>CC-BY</p> - - <p> significa que o autor permite que distribuam, remixem, adaptem e criem a partir do seu trabalho, desde que lhe atribuam o devido crédito pela criação original</p> - - <p>NC</p> - - <p> indica que as criações elaboradas a partir do trabalho do autor podem ser utilizadas somente para fins não comerciais (se não houver esta especificação, o novo recurso poderá ser utilizado para fins comerciais)</p> - - <p>SA</p> - - <p> quer dizer que as novas criações devem ser licenciadas sob termos idênticos aos do trabalho original</p> - </div> - - <div style={{background:"#e81f4f", height:"500px", width:"1366px"}}> - <h2>Respeitamos<br/> a sua privacidade</h2> - - <p>Além de solicitar alguns dados pessoais para o cadastro, a Plataforma coleta, de forma automática, os dados não pessoais relativos à interação dos usuários no sistema. Esses dados nunca serão fornecidos para fins comerciais, assim como nunca serão compartilhados quaisquer dados pessoais que possam identificar o usuário.</p> - <p>Os dados anônimos poderão ser utilizados para fins de melhoria da plataforma, transparência e para o uso em pesquisas.</p> - - <p>Dúvidas? Leia a Ãntegra dos <span ng-click="hide()">Termos de Uso</span> ou fale conosco por meio do <span ui-sref="contato">formulário de contato</span>.</p> - </div> +<Dropdown + options={options} + value={defaultOption} + placeholder="Select an option" + className=${ toggleClassName ? '"my-custom-class"' : '""' } + placeholderClassName=${ togglePlaholderClassName ? '"my-custom-class"' : '""' } + menuClassName=${ toggleMenuClassName ? '"my-custom-class"' : '""' } +/> +`} + </pre> </div> - ); - } + </section> + </section> + ) } +} -export default Teste; +export default ObjectArrayExample \ No newline at end of file diff --git a/src/Pages/UploadPage.js b/src/Pages/UploadPage.js new file mode 100644 index 0000000000000000000000000000000000000000..848b3b5b76edf5f975011b676dcfc021bbcd701e --- /dev/null +++ b/src/Pages/UploadPage.js @@ -0,0 +1,161 @@ +/*Copyright (C) 2019 Centro de Computacao Cientifica e Software Livre +Departamento de Informatica - Universidade Federal do Parana + +This file is part of Plataforma Integrada MEC. + +Plataforma Integrada MEC is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Plataforma Integrada MEC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ + +import React, {useState, useEffect, useContext} from 'react' +import Grid from '@material-ui/core/Grid'; +import UploadFileWrapper from '../Components/UploadPageComponents/UploadFileWrapper.js' +import {Store} from '../Store.js' +import {InfoBox} from '../Components/UploadPageComponents/StyledComponents.js' +import Stepper from '../Components/UploadPageComponents/Stepper.js' +import {postRequest} from '../Components/HelperFunctions/getAxiosConfig.js' +import PartOne from '../Components/UploadPageComponents/PartOne.js' +import PartTwo from '../Components/UploadPageComponents/PartTwo.js' +import PartThree from '../Components/UploadPageComponents/PartThree.js' +import ModalLearningObjectPublished from '../Components/ModalLearningObjectPublished.js' +import {Background} from '../Components/UploadPageComponents/StyledComponents' +import LoadingSpinner from '../Components/LoadingSpinner.js' +import {Redirect} from 'react-router-dom' + +export default function UploadPage (props) { + const {state} = useContext(Store) + + // {/*Object : link or file uploaded*/} + // eslint-disable-next-line + const [object, setObject] = useState() + + const [loading, toggleLoading] = useState(true) + const [draft, setDraft] = useState({}) + function handleSuccessfulGet (data) { + setDraft(data) + toggleLoading(false) + } + useEffect( () => { + if (state.currentUser.id !== "") { + + const url = `/learning_objects/` + + let payload = {} + + postRequest(url, payload, handleSuccessfulGet, (error) => {console.log(error)}) + + } + }, []) + + const [activeStep, setActiveStep] = React.useState(0); + const stepperControl=(increment)=>{setActiveStep(activeStep + increment)} + + const [objectSubmitted, toggleModal] = useState(false) + const handleModal = (value) => {toggleModal(value)} + + const handlePost = () => { + if (state.currentUser.id !== "") { + const url = `/learning_objects/${draft.id}/publish` + + let payload = {} + + postRequest(url, payload, + (data) => {handleModal(true)}, + (error) => {console.log(error)} + ) + + } + } + + const handleSubmit = () => { + if (state.currentUser.id !== "") { + const url = `/submissions/` + + let payload = { + "submission" : { + "learning_object_id" : draft.id + } + } + + postRequest(url, payload, + (data) => {handleModal(true)}, + (error) => {console.log(error)} + ) + + } + } + + return ( + <React.Fragment> + { + state.currentUser.id === '' && + <Redirect to="/"/> + } + { + loading === true ? + ( + <LoadingSpinner text={"CARREGANDO..."}/> + ) + : + ( + <> + <ModalLearningObjectPublished + open={objectSubmitted} + handleClose={() => {toggleModal(false); props.history.push('/')}} + draftID={draft.id} + /> + { + activeStep === 2 ? + ( + <PartThree draftID={draft.id} stepperControl={stepperControl} activeStep={activeStep} handlePost={handlePost} handleSubmit={handleSubmit}/> + ) + : + ( + <Background> + <div className="container"> + <Grid container spacing={2}> + <Grid item md={4} xs={12}> + <UploadFileWrapper draftID={draft.id}/> + </Grid> + <Grid item md={8} xs={12}> + <InfoBox> + <div className="cabecalho"> + <h2>Informações sobre o Recurso</h2> + <div className="feedback-upload"> + <Stepper activeStep={activeStep}/> + </div> + </div> + { + activeStep === 0 && + <Grid container style={{paddingLeft : "15px", paddingRight : "15px"}}> + <PartOne draftID={draft.id} stepperControl={stepperControl}/> + </Grid> + } + { + activeStep === 1 && + <Grid container style={{paddingLeft : "15px", paddingRight : "15px"}}> + <PartTwo draftID={draft.id} stepperControl={stepperControl}/> + </Grid> + } + </InfoBox> + </Grid> + </Grid> + </div> + </Background> + ) + } + </> + ) + } + </React.Fragment> +) +} diff --git a/src/Pages/UserPage.js b/src/Pages/UserPage.js index 8e5da3b43aafa195457578183449ca4f6f51ee76..2688500eeb48d71df1f3fc1469d744a41d4b71e6 100644 --- a/src/Pages/UserPage.js +++ b/src/Pages/UserPage.js @@ -16,32 +16,243 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React from 'react'; -import styled from 'styled-components' +import React, { useState, useContext, useEffect } from "react"; +import styled from "styled-components"; +import CustomizedBreadcrumbs from "../Components/TabPanels/Breadcrumbs.js"; +import { Store } from "../Store.js"; +import Tab from "@material-ui/core/Tab"; +import ModalAlterarAvatar from "../Components/ModalAlterarAvatar/ModalAlterarAvatar"; +import TabPanelAtividades from "../Components/TabPanels/UserPageTabs/PanelAtividades.js"; +import TabPanelMeusRecursos from "../Components/TabPanels/UserPageTabs/PanelMeusRecursos.js"; +import TabPanelFavoritos from "../Components/TabPanels/UserPageTabs/PanelFavoritos.js"; +import TabPanelColecoes from "../Components/TabPanels/UserPageTabs/PanelColecoes.js"; +import TabPanelRede from "../Components/TabPanels/UserPageTabs/PanelRede.js"; +import TabPanelCuradoria from "../Components/TabPanels/UserPageTabs/PanelCuradoria.js"; +import Grid from "@material-ui/core/Grid"; +import { + HeaderContainer, + UserProfileContainer, + CheckTeacherDiv, + StyledTabs, + RodapeDiv, + NavBarContentContainer, + BackgroundDiv, +} from "../Components/TabPanels/StyledComponents.js"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import Cover from "../Components/UserPageComponents/Cover.js"; +import ProfileAvatar from "../Components/UserPageComponents/Avatar.js"; +import UserInfo from "../Components/UserPageComponents/UserInfo.js"; +import EditProfileButton from "../Components/UserPageComponents/EditProfileButton.js"; +import SubmitterStatus from "../Components/UserPageComponents/SubmitterStatus.js"; +import { getRequest } from "../Components/HelperFunctions/getAxiosConfig.js"; +import Typography from "@material-ui/core/Typography"; +export default function UserPage(props) { + const { state, dispatch } = useContext(Store); + const id = state.currentUser.id; -const maindDiv = styled.div` - background-color : #f4f4f4; - color : #666; - font-size : 14px; - line-height : 20px; -` -const breadcrumbsDiv = styled.div` - display : flex; - justify:content : center; - padding: 10px; -` + const [follows, setFollows] = useState(0); + const [following, setFollowing] = useState(0); + const [loading, setLoading] = useState(false); + const [tabValue, setTabValue] = useState(Number(props.location.state) || 0); + const [tabs, setTabs] = useState([ + "Atividades", + "Meus Recursos", + "Favoritos", + "Coleções", + "Rede", + ]); + const handleChangeTab = (event, newValue) => { + setTabValue(newValue); + }; + + function handleSuccessfulGet(data) { + console.log(data); + dispatch({ + type: "GET_USER", + user: data, + }); + + setFollows(data.follows_count); + + if (data.role_ids.includes(4)) { + setTabs([ + "Atividades", + "Meus Recursos", + "Favoritos", + "Coleções", + "Rede", + "Curadoria", + ]); + } + } + + function handleSuccesGetFollowing(data) { + setFollowing(data.length); + setLoading(false); + } + + useEffect(() => { + if (id !== "") { + const url = `/users/${id}`; + const url2 = `/users/${id}/following/User`; + setLoading(true); + getRequest(url, handleSuccessfulGet, (error) => { + console.log(error); + }); + getRequest(url2, handleSuccesGetFollowing, (error) => { + console.log(error); + }); + } + }, []); + + useEffect(() => { + setTabValue(Number(props.location.state) || 0) + }, [window.history.state.key]) + + const redirect = () => { + props.history.push("/"); + }; -export default function UserPage (props){ + const [modalOpen, toggleModal] = useState(false); + const WIDTH = window.innerWidth; - return ( - <mainDiv> - <breadcrumbsDiv> - <ol style={{listStyle:"none"}}> - <li><a href="/"><span>Página Principal</span> </a> </li>/<li><span>Minha área</span></li>/<li><span>Atividades</span></li> - </ol> - </breadcrumbsDiv> - </mainDiv> - ); + return ( + <div> + <link + href="https://fonts.googleapis.com/css?family=Roboto:100,400,500&display=swap" + rel="stylesheet" + /> + { + state.userIsLoggedIn ? ( + [ + <React.Fragment> + <ModalAlterarAvatar + open={modalOpen} + handleClose={() => { + toggleModal(false); + }} + userAvatar={state.currentUser.avatar} + /> + <BackgroundDiv> + <CustomizedBreadcrumbs values={["Minha área", tabs[tabValue]]} /> + <Grid container spacing={2}> + <Grid item xs={12}> + <div style={{ padding: "10px 0 8px 0" }}> + <UserProfileContainer> + <HeaderContainer> + <Cover id={id} /> + <ProfileAvatar id={id} /> + {WIDTH <= 600 ? null : <UserInfo />} + <EditProfileButton /> + </HeaderContainer> + {WIDTH <= 600 ? ( + <Grid + style={{ marginTop: "4em" }} + container + justify="center" + alignItems="center" + direction="column" + > + <Grid item> + <Typography + variant="h4" + gutterBottom + style={{ textAlign: "center" }} + > + {state.currentUser.name} + </Typography> + </Grid> + <Grid + style={{ + marginTop: "0.5em", + marginBottom: "0.5em", + borderTop: "0.5px solid #eee", + borderBottom: "0.5px solid #eee", + }} + container + spacing={4} + justify="center" + alignItems="center" + direction="row" + > + <Grid item> + <Typography variant="h6" onClick={(e) => { handleChangeTab(e, 4) }}> + {loading ? ( + <CircularProgress size={20} /> + ) : ( + `${follows} seguidores` + )} + </Typography> + </Grid> + <Grid item> + <Typography variant="h6" onClick={(e) => { handleChangeTab(e, 4) }}> + {loading ? ( + <CircularProgress size={20} /> + ) : ( + `${following} seguindo` + )} + </Typography> + </Grid> + </Grid> + </Grid> + ) : ( + <CheckTeacherDiv> + <SubmitterStatus /> + </CheckTeacherDiv> + )} + <RodapeDiv> + <NavBarContentContainer> + <StyledTabs + value={tabValue} + onChange={handleChangeTab} + indicatorColor="primary" + textColor="primary" + variant="scrollable" + scrollButtons="on" + TabIndicatorProps={{ + style: { background: "#00bcd4" }, + }} + > + {tabs.map((tab) => ( + <StyledTab label={tab} key={tab} /> + ))} + </StyledTabs> + </NavBarContentContainer> + </RodapeDiv> + </UserProfileContainer> + </div> + </Grid> + <Grid item xs={12}> + {tabValue === 0 && <TabPanelAtividades id={id} />} + {tabValue === 1 && <TabPanelMeusRecursos id={id} />} + {tabValue === 2 && <TabPanelFavoritos id={id} />} + {tabValue === 3 && <TabPanelColecoes id={id} />} + {tabValue === 4 && <TabPanelRede id={id} />} + {tabValue === 5 && <TabPanelCuradoria id={id} />} + </Grid> + </Grid> + </BackgroundDiv> + </React.Fragment> + ] + ) + : + ( + <> + {redirect()} + </> + ) + } + </div> + ) +} + +const StyledTab = styled(Tab)` + .Mui-selected { + border-bottom-color: #00bcd4 !important; + } + .MuiTab-wrapper { + border-bottom-color: #00bcd4 !important; } +` diff --git a/src/Pages/UserTerms.js b/src/Pages/UserTerms.js index 411fdd623c1f375c51d1107ec011ccf5f92211d0..e6c2e7cb6e9cb8f8583fd3b1d5c34a93c17332ac 100644 --- a/src/Pages/UserTerms.js +++ b/src/Pages/UserTerms.js @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/>.*/ -import React, {Component} from 'react'; +import React, { useEffect } from 'react'; import SimpleExpansionPanels from '../Components/ExpansionPanels' import Grid from '@material-ui/core/Grid'; import Modal from '../Components/Modal' @@ -32,7 +32,7 @@ import Linha from "../img/termos/linha.svg"; -const BannerStyle=styled.div` +const BannerStyle = styled.div` width: 100%; background-image: url(${Banner1}); background-size: cover; @@ -42,31 +42,13 @@ const BannerStyle=styled.div` verticalAlign: "middle" ` -const center={ - width: "100%", - textAlign: "center" -} -const container={ - paddingInline: "15px", - paddingBlock: "20px", - marginInline: "auto", - textAlign:"center", - width:"750px" - -} -const secao2={ - height: "100%", - alignItems: "center", - paddingBlock: "30px" -} - - const AColorido = styled.a` color: #00BCD4; text-decoration:none; ` + const ImagemSeçao2 = styled.div` font-family: Roboto, sans-serif; @@ -107,6 +89,7 @@ const ImagemSeçao2 = styled.div` } } ` + const Secao3 = styled.div` background-color: #FF7F00; @media (min-width: 1000px) { @@ -203,99 +186,98 @@ const Secao4 = styled.div` ` -class UserTerms extends Component { - render() { +export default function UserTerms() { + useEffect(() => { + window.scrollTo(0, 0) + }, []) + return ( + <div style={{ color: "rgba(0,0,0,0.87" }} > - return ( - <div style={{color:"rgba(0,0,0,0.87"}} > - <link href="https://fonts.googleapis.com/css?family=Kalam|Pompiere|Roboto&display=swap" rel="stylesheet"/> - <BannerStyle> - <h2 style={{width: "100%",textAlign: "center",marginTop:"0px", paddingTop:"6rem",marginBottom:"16px",fontSize:"52px",fontFamily: "'Pompiere', cursive",color:"#fff",fontWeight:"500"}}>TERMOS DE USO</h2> - <Modal/> - </BannerStyle> + <BannerStyle> + <h2 style={{ width: "100%", textAlign: "center", marginTop: "0px", paddingTop: "6rem", marginBottom: "16px", fontSize: "52px", fontFamily: "'Pompiere', cursive", color: "#fff", fontWeight: "500" }}>TERMOS DE USO</h2> + <Modal /> + </BannerStyle> - <ImagemSeçao2> - <Grid container spacing={3}> - <Grid item xs={12} md={1}></Grid> - <Grid item xs={12} md={10}> - <div> - <h3><strong style={{fontWeight:"700"}}>Plataforma Integrada de Recursos Educacionais Digitais,</strong><br/>uma iniciativa do Ministério da Educação!</h3> + <ImagemSeçao2> + <Grid container > + <Grid item xs={12} md={1}></Grid> + <Grid item xs={12} md={10}> + <div> + <h3><strong style={{ fontWeight: "700" }}>Plataforma Integrada de Recursos Educacionais Digitais,</strong><br />uma iniciativa do Ministério da Educação!</h3> - <p>A <strong>Plataforma Integrada de RED do MEC</strong> é parte do processo de implementação do Compromisso 6 do <AColorido href="http://www.governoaberto.cgu.gov.br/noticias/2017/3o-plano-de-acao-nacional-na-parceria-para-governo-aberto" target="_blank">3º Plano de Ação da Parceria Governo Aberto</AColorido> (OGP-Brasil), que tem por objetivo “incorporar na polÃtica educacional o potencial da cultura digital, de modo a fomentar a autonomia para uso, reuso e adaptação de recursos educacionais digitais, valorizando a pluralidade e a diversidade da educação brasileiraâ€. + <p>A <strong>Plataforma Integrada de RED do MEC</strong> é parte do processo de implementação do Compromisso 6 do <AColorido href="http://www.governoaberto.cgu.gov.br/noticias/2017/3o-plano-de-acao-nacional-na-parceria-para-governo-aberto" target="_blank">3º Plano de Ação da Parceria Governo Aberto</AColorido> (OGP-Brasil), que tem por objetivo “incorporar na polÃtica educacional o potencial da cultura digital, de modo a fomentar a autonomia para uso, reuso e adaptação de recursos educacionais digitais, valorizando a pluralidade e a diversidade da educação brasileiraâ€. </p> - <p>Seguindo o compromisso, a <strong>Plataforma Integrada de RED do MEC</strong> visa fortalecer a distribuição de recursos educacionais digitais para o ensino básico brasileiro. Há preferência pela disponibilização de Recursos Educacionais Abertos (REA), ou seja, recursos que “se situem no domiÌnio puÌblico ou que tenham sido divulgados sob licença aberta que permita acesso, uso, adaptação e redistribuição gratuita por terceiros, mediante nenhuma restrição ou poucas restrições.†<AColorido href="http://www.unesco.org/new/fileadmin/MULTIMEDIA/HQ/CI/CI/pdf/Events/Portuguese_Paris_OER_Declaration.pdf" target="_blank">(Declaração REA de Paris, 2012)</AColorido>. + <p>Seguindo o compromisso, a <strong>Plataforma Integrada de RED do MEC</strong> visa fortalecer a distribuição de recursos educacionais digitais para o ensino básico brasileiro. Há preferência pela disponibilização de Recursos Educacionais Abertos (REA), ou seja, recursos que “se situem no domiÌnio puÌblico ou que tenham sido divulgados sob licença aberta que permita acesso, uso, adaptação e redistribuição gratuita por terceiros, mediante nenhuma restrição ou poucas restrições.†<AColorido href="http://www.unesco.org/new/fileadmin/MULTIMEDIA/HQ/CI/CI/pdf/Events/Portuguese_Paris_OER_Declaration.pdf" target="_blank">(Declaração REA de Paris, 2012)</AColorido>. </p> - </div> - </Grid> - <Grid item xs={12} md={1}></Grid> - </Grid> - </ImagemSeçao2> - - <Secao3 > - <Grid container spacing ={3}> - <h3>Para melhor compreensão, podemos dividir os recursos em dois tipos:</h3> - <Grid item xs={12} md={1} ></Grid> - <Grid item xs={12} md={5} > - <div class="caixa aberto"> - <div class ="texto"> - <span>Abertos</span> - <p>De acordo com a Declaração de Paris, são recursos que, no mÃnimo, têm uma licença de uso mais flexÃvel, que garante livre redistribuição. Adicionalmente, um recurso aberto deve utilizar um formato aberto, um formato de arquivo que permite a fácil edição por terceiros. Nenhum controle sobre o acesso (como cadastro e senha) deve existir para acesso a recursos abertos. Em sua maioria, são recursos gratuitos.</p> - </div> - </div> - </Grid> - - <Grid item xs={12} md={5}> - <div class="caixa fechado"> - <div class ="texto"> - <span>Fechados</span> - <p>São recursos que criam restrições no seu acesso, uso ou reuso. Como exemplo, podemos mencionar recursos que só são acessÃveis mediante cadastro ou que têm licenças restritivas (como “todos os direitos reservadosâ€, o sÃmbolo ©). Podem ser gratuitos ou pagos.</p> - </div> - </div> - </Grid> - <Grid item xs={12} md={1} ></Grid> - </Grid> - </Secao3> - - - - - <Grid container spacing={3}> - <Grid item xs={12} md={1}></Grid> - <Grid item xs={12} md={10}> - <Secao4> - <div class="texto" style={{paddingTop:"70px"}}> - <p>O <a href="http://www.planalto.gov.br/ccivil_03/_ato2011-2014/2014/lei/l13005.htm" target="_blank">Plano Nacional de Educação</a> (2014-2024) enfatiza nas metas 5 e 7 a importância dos recursos educacionais abertos para fomentar a qualidade da educação baÌsica. A <a href="http://portal.mec.gov.br/index.php?option=com_docman&view=download&alias=35541-res-cne-ces-001-14032016-pdf&category_slug=marco-2016-pdf&Itemid=30192" target="_blank">Resolução CNE/CES nº 1</a>, de 11 de março de 2016, também destaca a importância dos recursos educacionais abertos para as instituições de educação superior e para as atividades de educação a distância.</p> - </div> - <div class="titulo"> - <h3>TERMOS DE USO</h3> - <p>InÃcio da vigência: agosto de 2017</p> - </div> - <div class="texto" style={{paddingBottom:"40px"}}> - <p>Aqui estão os “Termos de Uso†da <strong>Plataforma Integrada de RED do MEC</strong>, isto é, as regras de funcionamento da Plataforma e seus serviços, e o que se espera de seus usuários. Por “usuárioâ€, entende-se qualquer pessoa que acesse o domÃnio portal.mec.gov.br, tanto para pesquisa (acesso) como para a inclusão de dados e informações (participação) mediante cadastro.</p> - <p>Fazem parte dos Termos de Uso as polÃticas de responsabilidade, de privacidade e confidencialidade, a licença de uso do conteúdo e as informações sobre como reportar violações.</p> - <p>Ao utilizar a <strong>Plataforma Integrada de RED do MEC</strong>, o usuário aceita todas as condições aqui estabelecidas. O uso da <strong>Plataforma Integrada de RED do MEC</strong> implica aceite das condições aqui elencadas.</p> - <p>Por “serviçoâ€, entende-se qualquer funcionalidade ou ferramenta que permita a interatividade com o usuário, como, por exemplo, usuário subir um recurso, postar um comentário, criar uma coleção ou enviar uma mensagem.</p> - <p>A aceitação destes "Termos de Uso" é indispensável à utilização da <strong>Plataforma Integrada de RED do MEC</strong>. Todos os usuários deverão ler, certificar-se de tê-los entendido e aceitar todas as condições neles estabelecidas. Dessa forma, deve ficar claro que a utilização desta "<strong>Plataforma Integrada de RED do MEC</strong>" implica aceitação completa deste documento intitulado Termos de Uso. Caso tenha dúvidas sobre os termos, utilize o formulário disponÃvel em “Contato†para saná-las.</p> - </div> - </Secao4> - </Grid> - <Grid item xs={12} md={1}></Grid> + </div> + </Grid> + <Grid item xs={12} md={1}></Grid> + </Grid> + </ImagemSeçao2> + + <Secao3 > + <Grid container > + <h3>Para melhor compreensão, podemos dividir os recursos em dois tipos:</h3> + <Grid item xs={12} md={1} ></Grid> + <Grid item xs={12} md={5} > + <div class="caixa aberto"> + <div class="texto"> + <span>Abertos</span> + <p>De acordo com a Declaração de Paris, são recursos que, no mÃnimo, têm uma licença de uso mais flexÃvel, que garante livre redistribuição. Adicionalmente, um recurso aberto deve utilizar um formato aberto, um formato de arquivo que permite a fácil edição por terceiros. Nenhum controle sobre o acesso (como cadastro e senha) deve existir para acesso a recursos abertos. Em sua maioria, são recursos gratuitos.</p> + </div> + </div> </Grid> - - <Grid container spacing={3}> - <Grid item xs={12} md={1}></Grid> - <Grid item xs={12} md={10}> - <div style={{ marginBottom:"50px",paddingTop: "20px"}}> - <SimpleExpansionPanels/> + <Grid item xs={12} md={5}> + <div class="caixa fechado"> + <div class="texto"> + <span>Fechados</span> + <p>São recursos que criam restrições no seu acesso, uso ou reuso. Como exemplo, podemos mencionar recursos que só são acessÃveis mediante cadastro ou que têm licenças restritivas (como “todos os direitos reservadosâ€, o sÃmbolo ©). Podem ser gratuitos ou pagos.</p> </div> - </Grid> - <Grid item xs={12} md={1}></Grid> - </Grid> - </div> - ); - } - } + </div> + </Grid> + <Grid item xs={12} md={1} ></Grid> + </Grid> + </Secao3> + + + + + <Grid container > + <Grid item xs={12} md={1}></Grid> + <Grid item xs={12} md={10}> + <Secao4> + <div class="texto" style={{ paddingTop: "70px" }}> + <p>O <a href="http://www.planalto.gov.br/ccivil_03/_ato2011-2014/2014/lei/l13005.htm" rel="noreferrer" target="_blank">Plano Nacional de Educação</a> (2014-2024) enfatiza nas metas 5 e 7 a importância dos recursos educacionais abertos para fomentar a qualidade da educação baÌsica. A <a href="http://portal.mec.gov.br/index.php?option=com_docman&view=download&alias=35541-res-cne-ces-001-14032016-pdf&category_slug=marco-2016-pdf&Itemid=30192" rel="noreferrer" target="_blank">Resolução CNE/CES nº 1</a>, de 11 de março de 2016, também destaca a importância dos recursos educacionais abertos para as instituições de educação superior e para as atividades de educação a distância.</p> + </div> + <div class="titulo"> + <h3>TERMOS DE USO</h3> + <p>InÃcio da vigência: agosto de 2017</p> + </div> + <div class="texto" style={{ paddingBottom: "40px" }}> + <p>Aqui estão os “Termos de Uso†da <strong>Plataforma Integrada de RED do MEC</strong>, isto é, as regras de funcionamento da Plataforma e seus serviços, e o que se espera de seus usuários. Por “usuárioâ€, entende-se qualquer pessoa que acesse o domÃnio portal.mec.gov.br, tanto para pesquisa (acesso) como para a inclusão de dados e informações (participação) mediante cadastro.</p> + <p>Fazem parte dos Termos de Uso as polÃticas de responsabilidade, de privacidade e confidencialidade, a licença de uso do conteúdo e as informações sobre como reportar violações.</p> + <p>Ao utilizar a <strong>Plataforma Integrada de RED do MEC</strong>, o usuário aceita todas as condições aqui estabelecidas. O uso da <strong>Plataforma Integrada de RED do MEC</strong> implica aceite das condições aqui elencadas.</p> + <p>Por “serviçoâ€, entende-se qualquer funcionalidade ou ferramenta que permita a interatividade com o usuário, como, por exemplo, usuário subir um recurso, postar um comentário, criar uma coleção ou enviar uma mensagem.</p> + <p>A aceitação destes "Termos de Uso" é indispensável à utilização da <strong>Plataforma Integrada de RED do MEC</strong>. Todos os usuários deverão ler, certificar-se de tê-los entendido e aceitar todas as condições neles estabelecidas. Dessa forma, deve ficar claro que a utilização desta "<strong>Plataforma Integrada de RED do MEC</strong>" implica aceitação completa deste documento intitulado Termos de Uso. Caso tenha dúvidas sobre os termos, utilize o formulário disponÃvel em “Contato†para saná-las.</p> + </div> + </Secao4> + </Grid> + <Grid item xs={12} md={1}></Grid> + </Grid> + + + <Grid container > + <Grid item xs={12} md={1}></Grid> + <Grid item xs={12} md={10}> + <div style={{ marginBottom: "50px", paddingTop: "20px" }}> + <SimpleExpansionPanels /> + </div> + </Grid> + <Grid item xs={12} md={1}></Grid> + </Grid> + </div> + ); +} -export default UserTerms; diff --git a/src/Store.js b/src/Store.js index c2e0f669847b6a71faf2f77f73dd079e27a8ab24..2cf8d373cb9b4f3f88c18bfd71199b893af0886d 100644 --- a/src/Store.js +++ b/src/Store.js @@ -22,7 +22,7 @@ export const Store = React.createContext() const initialState = { searchOpen: false, - userIsLoggedIn : true, + userIsLoggedIn : false, userAgreedToPublicationTerms: false, userAgreedToPublicationPermissions: false, modalColaborarPlataformaOpen : false, @@ -34,14 +34,23 @@ const initialState = { width: 0, height: 0 }, - loginInfo: { - username : 'Horstmann', + currentUser: { + askTeacherQuestion : false, + id : '', + name : '', email : '', - accessToken : '', - client : '' + avatar : '', + cover : '', + uid : '', + follows_count : 0, + collections_count : 0, + submitter_request : 'default', + roles : [] } } + + function reducer(state, action) { switch (action.type){ case 'SAVE_SEARCH': @@ -60,22 +69,47 @@ function reducer(state, action) { windowSize: action.innerWindow } case 'USER_LOGGED_IN': + if (action.login.avatar_file_name) { + Object.defineProperty(action.login, 'avatar', + Object.getOwnPropertyDescriptor(action.login, 'avatar_file_name')); + delete action.login['avatar_file_name']; + } + if (action.login.cover_file_name) { + Object.defineProperty(action.login, 'cover', + Object.getOwnPropertyDescriptor(action.login, 'cover_file_name')); + delete action.login['cover_file_name']; + } return { ...state, userIsLoggedIn:action.userLoggedIn, - loginInfo:action.login + currentUser:action.login } case 'USER_SIGNED_UP': return { ...state, userIsLoggedIn:action.userLoggedIn, - loginInfo:action.login + currentUser:action.user } case 'USER_LOGGED_OUT': + sessionStorage.clear() return { ...state, userIsLoggedIn:action.userLoggedOut, - loginInfo:action.login + currentUser:{ + askTeacherQuestion : false, + id : '', + name : '', + email : '', + avatar_file_name : '', + cover_file_name : '', + uid : '', + follows_count : 0, + collections_count : 0, + submitter_request : 'default', + roles : [] + }, + userAgreedToPublicationTerms: false, + userAgreedToPublicationPermissions: false } case 'USER_AGREED_TO_PUBLICATION_TERMS': return { @@ -87,17 +121,61 @@ function reducer(state, action) { ...state, userAgreedToPublicationPermissions : action.userAgreement } + case 'USER_ACCESSED_USER_PAGE': + return { + ...state, + currentUser : action.set + } + case 'USER_CHANGED_COVER': + return { + ...state, + currentUser : action.currUser + } + case 'USER_DELETED_ACCOUNT': + localStorage.clear() + return { + ...state, + userIsLoggedIn:false, + currentUser: { + askTeacherQuestion : false, + id : '', + name : '', + email : '', + avatar_file_name : '', + cover_file_name : '', + uid : '', + follows_count : 0, + collections_count : 0, + submitter_request : 'default', + roles : [] + }, + } + case 'TOGGLE_MODAL_COLABORAR_PLATAFORMA': + return { + ...state, + modalColaborarPlataformaOpen : action.modalColaborarPlataformaOpen + } + case 'GET_USER': + return { + ...state, + currentUser:action.user + } + case 'USER_UPDATED_EMAIL': + return { + ...state, + currentUser : action.currUser + } default: return state } } export function StoreProvider(props) { - const [state, dispatch] = React.useReducer(reducer, initialState); - const value = { state, dispatch }; - return ( - <Store.Provider value={value}> - {props.children} - </Store.Provider> - ) + const [state, dispatch] = React.useReducer(reducer, initialState); + const value = { state, dispatch }; + return ( + <Store.Provider value={value}> + {props.children} + </Store.Provider> + ) } diff --git a/src/env.js b/src/env.js index f3072030af819b06ffeee3edf0daa783c35c524e..b7359157e1c0e9d260976bbe2b2545a2e0ca51b0 100644 --- a/src/env.js +++ b/src/env.js @@ -21,5 +21,11 @@ var apiDomain = 'https://api.portalmec.c3sl.ufpr.br', apiVersion = 'v1', apiUrl = apiDomain + '/' + apiVersion; +var simcaqAPIDomain = 'https://www.simcaq.c3sl.ufpr.br/api', + apiSimcaqVersion = 'v1', + simcaqAPIurl = simcaqAPIDomain + '/' + apiSimcaqVersion + + export {apiUrl}; export {apiDomain}; +export {simcaqAPIurl} diff --git a/src/img/Bolo.png b/src/img/Bolo.png new file mode 100644 index 0000000000000000000000000000000000000000..509d2acae8705430a4707bb88fc07bd04ae33999 Binary files /dev/null and b/src/img/Bolo.png differ diff --git a/src/img/Excluir.png b/src/img/Excluir.png new file mode 100644 index 0000000000000000000000000000000000000000..fd6fb1bd51208e07d3565f89b5e517f8e1386145 Binary files /dev/null and b/src/img/Excluir.png differ diff --git a/src/img/Pagina_vazia_Sem_publicar.png b/src/img/Pagina_vazia_Sem_publicar.png new file mode 100644 index 0000000000000000000000000000000000000000..34c77b8a07af865b2e1d53c058acccab5d311f8e Binary files /dev/null and b/src/img/Pagina_vazia_Sem_publicar.png differ diff --git a/src/img/Pagina_vazia_colecao.png b/src/img/Pagina_vazia_colecao.png new file mode 100644 index 0000000000000000000000000000000000000000..0dbf187a01d49f7df1d69780d18ceaf38f3c4efa Binary files /dev/null and b/src/img/Pagina_vazia_colecao.png differ diff --git a/src/img/ajuda/Banner3.png b/src/img/ajuda/Banner3.png new file mode 100644 index 0000000000000000000000000000000000000000..f8ef4e07a32fb559bc56fa6fb708c996136d0277 Binary files /dev/null and b/src/img/ajuda/Banner3.png differ diff --git a/src/img/ajuda/Encontrando_recursos.png b/src/img/ajuda/Encontrando_recursos.png new file mode 100644 index 0000000000000000000000000000000000000000..29945370b3a73a2443a72a83933bf7c07507652f Binary files /dev/null and b/src/img/ajuda/Encontrando_recursos.png differ diff --git a/src/img/ajuda/Gerenciando_a_conta.png b/src/img/ajuda/Gerenciando_a_conta.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b1f2ea797f367a58d3f7bf86d9ff949303aef2 Binary files /dev/null and b/src/img/ajuda/Gerenciando_a_conta.png differ diff --git a/src/img/ajuda/Participando_da_rede.png b/src/img/ajuda/Participando_da_rede.png new file mode 100644 index 0000000000000000000000000000000000000000..747d8e7b8d0363044694dbe1a074a2edaa79a85e Binary files /dev/null and b/src/img/ajuda/Participando_da_rede.png differ diff --git a/src/img/ajuda/Publicando_recursos.png b/src/img/ajuda/Publicando_recursos.png new file mode 100644 index 0000000000000000000000000000000000000000..ea861e1461d148656d459e6421e782b032ab94aa Binary files /dev/null and b/src/img/ajuda/Publicando_recursos.png differ diff --git a/src/img/ajuda/busca_img.jpg b/src/img/ajuda/busca_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..14b104c1d681312d31aadfa88e1b137392379715 Binary files /dev/null and b/src/img/ajuda/busca_img.jpg differ diff --git a/src/img/ajuda/filtros_img.jpg b/src/img/ajuda/filtros_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c729375e0e3047e589821308c7c9952f7df83737 Binary files /dev/null and b/src/img/ajuda/filtros_img.jpg differ diff --git a/src/img/ajuda/login_img.jpg b/src/img/ajuda/login_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..700149684a857b2069cb2f10a7d7cf162412cbe1 Binary files /dev/null and b/src/img/ajuda/login_img.jpg differ diff --git a/src/img/ajuda/recuperarsenha_img.jpg b/src/img/ajuda/recuperarsenha_img.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b0dce269aa9827be92471994f0f76cba73de1fca Binary files /dev/null and b/src/img/ajuda/recuperarsenha_img.jpg differ diff --git a/src/img/banner-mobile.jpg b/src/img/banner-mobile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d44ce9b0fc82df45cd1e9b9a069c6b309392defc Binary files /dev/null and b/src/img/banner-mobile.jpg differ diff --git a/src/img/banner-sobre.jpg b/src/img/banner-sobre.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fa5d39fcdde21ae4740e41723f6be0322ef9add0 Binary files /dev/null and b/src/img/banner-sobre.jpg differ diff --git a/src/img/carousel/Icone_Ativado_dot1.png b/src/img/carousel/Icone_Ativado_dot1.png new file mode 100644 index 0000000000000000000000000000000000000000..d4615fc12547fede8d2968ebde275750ff99d327 Binary files /dev/null and b/src/img/carousel/Icone_Ativado_dot1.png differ diff --git a/src/img/carousel/Icone_Ativado_dot2.png b/src/img/carousel/Icone_Ativado_dot2.png new file mode 100644 index 0000000000000000000000000000000000000000..d6a38a6f2356075498bec8855f55f725750fc02a Binary files /dev/null and b/src/img/carousel/Icone_Ativado_dot2.png differ diff --git a/src/img/carousel/Icone_Ativado_dot3.png b/src/img/carousel/Icone_Ativado_dot3.png new file mode 100644 index 0000000000000000000000000000000000000000..a88dcacc3c8c127de87556bc60e2f6f1853a27a8 Binary files /dev/null and b/src/img/carousel/Icone_Ativado_dot3.png differ diff --git a/src/img/carousel/Icone_Ativado_dot4.png b/src/img/carousel/Icone_Ativado_dot4.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b4dae4b8b5c2ca1af0beddbb027110417cbadf Binary files /dev/null and b/src/img/carousel/Icone_Ativado_dot4.png differ diff --git a/src/img/carousel/Icone_Ativado_dot5.png b/src/img/carousel/Icone_Ativado_dot5.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b16457cb8ae81959b4804f8242753e039bd1f2 Binary files /dev/null and b/src/img/carousel/Icone_Ativado_dot5.png differ diff --git a/src/img/carousel/Icone_Desativado_dot1.png b/src/img/carousel/Icone_Desativado_dot1.png new file mode 100644 index 0000000000000000000000000000000000000000..768dca2e0d2a5bfeab3879dda87b08616129e426 Binary files /dev/null and b/src/img/carousel/Icone_Desativado_dot1.png differ diff --git a/src/img/carousel/Icone_Desativado_dot2.png b/src/img/carousel/Icone_Desativado_dot2.png new file mode 100644 index 0000000000000000000000000000000000000000..95c279a584949313ece18c94bfe4d37ea0099645 Binary files /dev/null and b/src/img/carousel/Icone_Desativado_dot2.png differ diff --git a/src/img/carousel/Icone_Desativado_dot3.png b/src/img/carousel/Icone_Desativado_dot3.png new file mode 100644 index 0000000000000000000000000000000000000000..e051bf78d5aa4d47815667171787ba73b8f8f0ee Binary files /dev/null and b/src/img/carousel/Icone_Desativado_dot3.png differ diff --git a/src/img/carousel/Icone_Desativado_dot4.png b/src/img/carousel/Icone_Desativado_dot4.png new file mode 100644 index 0000000000000000000000000000000000000000..87566bfa863f13c8fa5ea8eed1d0cc3a45a2e1cc Binary files /dev/null and b/src/img/carousel/Icone_Desativado_dot4.png differ diff --git a/src/img/carousel/Icone_Desativado_dot5.png b/src/img/carousel/Icone_Desativado_dot5.png new file mode 100644 index 0000000000000000000000000000000000000000..2dcb41a558c605c47816f75dd4955791aa890167 Binary files /dev/null and b/src/img/carousel/Icone_Desativado_dot5.png differ diff --git a/src/img/carousel/Icone_Grande (1).png b/src/img/carousel/Icone_Grande (1).png new file mode 100644 index 0000000000000000000000000000000000000000..ae07f5fd18dcd423d6c5fd687696912bd298e79d Binary files /dev/null and b/src/img/carousel/Icone_Grande (1).png differ diff --git a/src/img/carousel/Icone_Grande (2).png b/src/img/carousel/Icone_Grande (2).png new file mode 100644 index 0000000000000000000000000000000000000000..406ad3590086d9624d1f9d91f2c045e93eb36574 Binary files /dev/null and b/src/img/carousel/Icone_Grande (2).png differ diff --git a/src/img/carousel/Icone_Grande (3).png b/src/img/carousel/Icone_Grande (3).png new file mode 100644 index 0000000000000000000000000000000000000000..ba51d785fcaba6bf066520351a11b15c9028edc4 Binary files /dev/null and b/src/img/carousel/Icone_Grande (3).png differ diff --git a/src/img/carousel/Icone_Grande (4).png b/src/img/carousel/Icone_Grande (4).png new file mode 100644 index 0000000000000000000000000000000000000000..caff1e53e7c8f4fb0723d3e1700dc4935e9535e4 Binary files /dev/null and b/src/img/carousel/Icone_Grande (4).png differ diff --git a/src/img/carousel/Icone_Grande (5).png b/src/img/carousel/Icone_Grande (5).png new file mode 100644 index 0000000000000000000000000000000000000000..5ee6025af4e2b756aec222582594e4e190e052dd Binary files /dev/null and b/src/img/carousel/Icone_Grande (5).png differ diff --git a/src/img/cc_license.png b/src/img/cc_license.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb047a53b1ae83749aabc59ba93fbe4646d23f3 Binary files /dev/null and b/src/img/cc_license.png differ diff --git a/src/img/check-decagram-blue.svg b/src/img/check-decagram-blue.svg new file mode 100644 index 0000000000000000000000000000000000000000..15efed94c3126ed6e595231196466d12419253a9 --- /dev/null +++ b/src/img/check-decagram-blue.svg @@ -0,0 +1,3 @@ +<svg width="22" height="21" viewBox="0 0 22 21" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M22 10.46L19.56 7.68L19.9 4L16.29 3.18L14.4 0L11 1.46L7.6 0L5.71 3.18L2.1 3.99L2.44 7.67L0 10.46L2.44 13.24L2.1 16.93L5.71 17.75L7.6 20.93L11 19.46L14.4 20.92L16.29 17.74L19.9 16.92L19.56 13.24L22 10.46ZM9 15.46L5 11.46L6.41 10.05L9 12.63L15.59 6.04L17 7.46L9 15.46Z" fill="#00BCD4"/> +</svg> diff --git a/src/img/check-decagram-gray.svg b/src/img/check-decagram-gray.svg new file mode 100644 index 0000000000000000000000000000000000000000..a2415acd16d87f63695aa51800458ade254c530c --- /dev/null +++ b/src/img/check-decagram-gray.svg @@ -0,0 +1,3 @@ +<svg width="22" height="21" viewBox="0 0 22 21" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M22 10.46L19.56 7.68L19.9 4L16.29 3.18L14.4 0L11 1.46L7.6 0L5.71 3.18L2.1 3.99L2.44 7.67L0 10.46L2.44 13.24L2.1 16.93L5.71 17.75L7.6 20.93L11 19.46L14.4 20.92L16.29 17.74L19.9 16.92L19.56 13.24L22 10.46ZM9 15.46L5 11.46L6.41 10.05L9 12.63L15.59 6.04L17 7.46L9 15.46Z" fill="#D1D1D1"/> +</svg> diff --git a/src/img/comentarios.png b/src/img/comentarios.png new file mode 100644 index 0000000000000000000000000000000000000000..8427d16029a99af4896d1d1ea0b16c7a76f88450 Binary files /dev/null and b/src/img/comentarios.png differ diff --git a/src/img/ecd.png b/src/img/ecd.png new file mode 100644 index 0000000000000000000000000000000000000000..46b6ccc37527909668b77dbcb1cfcd2b9eedf7c1 Binary files /dev/null and b/src/img/ecd.png differ diff --git a/src/img/facebook.svg b/src/img/facebook.svg new file mode 100644 index 0000000000000000000000000000000000000000..9f26683d6c6e48183deb7869d12add3da9324834 --- /dev/null +++ b/src/img/facebook.svg @@ -0,0 +1,4 @@ +<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M25 50C38.8071 50 50 38.8071 50 25C50 11.1929 38.8071 0 25 0C11.1929 0 0 11.1929 0 25C0 38.8071 11.1929 50 25 50Z" fill="#3B5998"/> +<path d="M31.2852 25.9792H26.8242V42.322H20.0655V25.9792H16.8511V20.2357H20.0655V16.519C20.0655 13.8611 21.3281 9.69922 26.8844 9.69922L31.8908 9.72016V15.2952H28.2583C27.6625 15.2952 26.8247 15.5929 26.8247 16.8608V20.241H31.8757L31.2852 25.9792Z" fill="white"/> +</svg> diff --git a/src/img/gamification/gem.svg b/src/img/gamification/gem.svg new file mode 100644 index 0000000000000000000000000000000000000000..4f083b2c9fc2fa8603aadfd86afbfdddc50458f8 --- /dev/null +++ b/src/img/gamification/gem.svg @@ -0,0 +1,17 @@ +<svg width="203" height="307" viewBox="0 0 203 307" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M51.5765 127.504L2.37646 102.604L51.5765 127.504Z" fill="#CA1818"/> +<path d="M51.7765 127.504L101.076 1.80389L2.37646 102.604L51.7765 127.504Z" fill="#CA1818"/> +<path d="M51.7766 129.304C51.3766 129.304 50.8766 129.204 50.4766 129.004L1.0766 104.104C0.576595 103.804 0.176595 103.404 0.0765953 102.904C-0.0234047 102.404 0.0765953 101.904 0.476595 101.504L99.1766 0.703867C99.8766 0.00386721 101.077 -0.196133 102.077 0.203867C103.077 0.603867 103.577 1.50387 103.277 2.30387L54.0766 128.004C53.8766 128.504 53.3766 129.004 52.6766 129.204C52.3766 129.304 52.0766 129.304 51.7766 129.304ZM5.7766 102.204L50.5766 124.704L95.0766 10.9039L5.7766 102.204Z" fill="white"/> +<path d="M150.277 127.504L199.777 102.604L101.077 1.80389L150.277 127.504Z" fill="#CA1818"/> +<path d="M150.276 129.304C149.976 129.304 149.776 129.304 149.476 129.204C148.776 129.004 148.277 128.604 148.076 128.004L98.8765 2.30387C98.5765 1.50387 99.0765 0.603867 100.077 0.203867C101.077 -0.196133 102.277 0.00386721 102.977 0.703867L201.677 101.504C202.077 101.904 202.176 102.404 202.076 102.904C201.977 103.404 201.576 103.804 201.076 104.104L151.576 129.004C151.176 129.204 150.676 129.304 150.276 129.304ZM107.077 10.8039L151.576 124.704L196.377 102.104L107.077 10.8039Z" fill="white"/> +<path d="M150.276 127.504L101.076 304.304L199.776 102.604L150.276 127.504Z" fill="#CA1818"/> +<path d="M101.076 306.104C100.876 306.104 100.676 306.104 100.376 306.004C99.1763 305.704 98.4763 304.804 98.7763 303.904L147.976 127.104C148.076 126.604 148.476 126.204 148.976 126.004L198.476 101.104C199.276 100.704 200.376 100.704 201.176 101.204C201.976 101.704 202.276 102.504 201.876 103.204L103.176 304.904C102.876 305.604 101.976 306.104 101.076 306.104ZM152.376 128.604L109.876 281.304L195.076 107.104L152.376 128.604Z" fill="white"/> +<path d="M51.7765 127.504L2.37646 102.604L101.076 304.304L51.7765 127.504Z" fill="#CA1818"/> +<path d="M101.076 306.104C100.176 306.104 99.2764 305.704 98.8764 304.904L0.176405 103.204C-0.223595 102.504 0.0764047 101.704 0.876405 101.204C1.6764 100.704 2.7764 100.704 3.5764 101.104L53.0764 126.004C53.5764 126.304 53.9764 126.704 54.0764 127.104L103.376 303.904C103.676 304.804 102.876 305.704 101.776 306.004C101.476 306.104 101.276 306.104 101.076 306.104ZM7.0764 107.104L92.2764 281.304L49.7764 128.604L7.0764 107.104Z" fill="white"/> +<path d="M51.7764 127.504H150.276L101.076 1.80383L51.7764 127.504Z" fill="#CA1818"/> +<path d="M150.276 129.304H51.7764C51.0764 129.304 50.3764 129.004 49.8764 128.604C49.4764 128.204 49.2764 127.604 49.4764 127.004L98.7764 1.30385C99.0764 0.503845 99.9764 0.00384521 101.076 0.00384521C102.176 0.00384521 102.976 0.503845 103.276 1.30385L152.476 127.004C152.676 127.504 152.576 128.104 152.076 128.604C151.676 129.004 150.976 129.304 150.276 129.304ZM54.9764 125.704H147.176L101.076 8.00385L54.9764 125.704Z" fill="white"/> +<path d="M51.8764 127.504L51.7764 127.804H101.076H150.376L150.276 127.504H101.076H51.8764Z" fill="#CA1818"/> +<path d="M150.276 127.504H51.7764L101.076 304.304L150.276 127.504Z" fill="#CA1818"/> +<path d="M101.076 306.104C99.9764 306.104 99.0763 305.504 98.7763 304.704L49.5764 127.904C49.4764 127.404 49.5764 126.804 50.0764 126.404C50.4764 126.004 51.1764 125.704 51.8764 125.704H150.276C150.976 125.704 151.676 125.904 152.076 126.404C152.476 126.804 152.676 127.404 152.576 127.904L103.376 304.704C103.076 305.504 102.176 306.104 101.076 306.104ZM54.6763 129.304L101.076 295.804L147.376 129.304H54.6763Z" fill="white"/> +</svg> + diff --git a/src/img/horstmann.jpg b/src/img/horstmann.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4e7e494f1615ddd3e2a650a2fc7099c8e4b3c1a Binary files /dev/null and b/src/img/horstmann.jpg differ diff --git a/src/img/how_to_reg-24px.png b/src/img/how_to_reg-24px.png new file mode 100644 index 0000000000000000000000000000000000000000..f378a7cef66b68d45211178a21847bb0ee1ec38c Binary files /dev/null and b/src/img/how_to_reg-24px.png differ diff --git a/src/img/img-16.png b/src/img/img-16.png new file mode 100644 index 0000000000000000000000000000000000000000..bae9507a3fbf5d58f54c77bcd76241a086c43a12 Binary files /dev/null and b/src/img/img-16.png differ diff --git a/src/img/link_icon.svg b/src/img/link_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..5f2d96763de83f27ecc3a3774c1570813419e7d9 --- /dev/null +++ b/src/img/link_icon.svg @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 50 50" style="enable-background:new 0 0 50 50;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#F4F4F4;} + .st1{fill:none;} + .st2{fill:#1BB8D1;} + .st3{opacity:0.2;fill:#5E5E5E;} + .st4{fill:#3D3D3D;} + .st5{fill:none;stroke:#879AA2;stroke-miterlimit:10;stroke-dasharray:3;} + .st6{fill:none;stroke:#F07D1A;stroke-miterlimit:10;} + .st7{fill:none;stroke:#B5B4B4;stroke-width:0.5;stroke-miterlimit:10;} + .st8{fill:#F07D1A;} + .st9{fill:#FFFFFF;} + .st10{fill:#CBD4D7;stroke:#B5B4B4;stroke-width:0.5;stroke-miterlimit:10;} + .st11{fill:#1DB8D1;} + .st12{fill:#879AA2;} + .st13{fill:none;stroke:#879AA2;stroke-miterlimit:10;} + .st14{fill:none;stroke:#879AA2;stroke-miterlimit:10;stroke-dasharray:2.9932,2.9932;} + .st15{fill:none;stroke:#879AA2;stroke-miterlimit:10;stroke-dasharray:2.9723,2.9723;} + .st16{fill:#FCD7B2;} + .st17{fill:none;stroke:#F07D1A;stroke-width:5;stroke-miterlimit:10;} + .st18{fill:#5E5E5E;} + .st19{fill:none;stroke:#879AA2;stroke-width:1.5;stroke-miterlimit:10;} + .st20{fill:none;stroke:#879AA2;stroke-width:2;stroke-miterlimit:10;} + .st21{fill:none;stroke:#5E5E5E;stroke-width:3;stroke-miterlimit:10;} + .st22{fill:none;stroke:#879AA2;stroke-width:0.5;stroke-miterlimit:10;} + .st23{fill:#EEF0F2;} + .st24{fill:#EEF0F2;stroke:#879AA2;stroke-width:0.5;stroke-miterlimit:10;} + .st25{fill:none;stroke:#CBD4D7;stroke-miterlimit:10;} + .st26{fill:#B6DFE9;} + .st27{fill:none;stroke:#879AA2;stroke-miterlimit:10;stroke-dasharray:3.0202,3.0202;} + .st28{fill:none;stroke:#879AA2;stroke-miterlimit:10;stroke-dasharray:2.9409,2.9409;} + .st29{fill:#CBD4D7;} + .st30{fill:none;stroke:#B5B4B4;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:10;} + .st31{fill:#525252;} + .st32{fill:none;stroke:#1BB8D1;stroke-miterlimit:10;} + .st33{fill:#B53F8F;} + .st34{fill:none;stroke:#B53F8F;stroke-width:2;stroke-miterlimit:10;} + .st35{fill:none;stroke:#CBD4D7;stroke-width:1.4;stroke-miterlimit:10;} + .st36{fill:none;stroke:#1BB8D1;stroke-miterlimit:10;stroke-dasharray:3;} + .st37{fill:#D9D9D9;} + .st38{fill:none;stroke:#CBD4D7;stroke-width:1.8;stroke-miterlimit:10;} + .st39{fill:#FBFBFB;} + .st40{fill:#F07E1B;} + .st41{fill:#EEF0F1;} + .st42{fill:none;stroke:#F07E1B;stroke-width:1.5;stroke-miterlimit:10;} + .st43{fill:none;stroke:#E6007E;stroke-miterlimit:10;} + .st44{opacity:0.4;fill:#05080A;} + .st45{opacity:0.6;fill:#05080A;} + .st46{display:none;} + .st47{fill:none;stroke:#E6007E;stroke-width:3;stroke-miterlimit:10;} + .st48{fill:none;stroke:#E31E17;stroke-miterlimit:10;} + .st49{display:inline;fill:none;stroke:#010202;stroke-linecap:round;stroke-miterlimit:10;} + .st50{display:inline;fill:none;stroke:#C11718;stroke-width:1.6;stroke-miterlimit:10;} +</style> +<g id="BG_1_"> +</g> +<g id="BG"> +</g> +<g id="Cards"> +</g> +<g id="Camada_11"> +</g> +<g id="Elementos"> + <g id="ic_x5F_inbox"> + </g> + <g> + <g> + <g> + <path class="st29" d="M12.3,50c-2.8,0-5.4-1.1-7.4-3.1l-1.8-1.8c-2-2-3.1-4.6-3.1-7.4c0-2.8,1.1-5.4,3.1-7.4l11.8-11.8 + c2-2,4.6-3.1,7.4-3.1c2.8,0,5.4,1.1,7.4,3.1l1.8,1.8l-2,2l-1.8-1.8c-1.4-1.4-3.3-2.2-5.4-2.2c-2,0-3.9,0.8-5.4,2.2L5.1,32.4 + c-1.4,1.4-2.2,3.3-2.2,5.4c0,2,0.8,3.9,2.2,5.4l1.8,1.8c1.4,1.4,3.3,2.2,5.4,2.2c2,0,3.9-0.8,5.4-2.2l8.2-8.2l2,2l-8.2,8.2 + C17.7,48.9,15,50,12.3,50z"/> + </g> + </g> + <g> + <g> + <path class="st29" d="M27.7,34.5c-2.8,0-5.4-1.1-7.4-3.1l2-2c1.4,1.4,3.3,2.2,5.4,2.2c2,0,3.9-0.8,5.4-2.2l11.8-11.8 + c1.4-1.4,2.2-3.3,2.2-5.4s-0.8-3.9-2.2-5.4L43.1,5c-3-3-7.8-3-10.7,0l-8.2,8.2l-2-2L30.4,3C34.4-1,41.1-1,45.1,3l1.8,1.8 + c2,2,3.1,4.6,3.1,7.4c0,2.8-1.1,5.4-3.1,7.4L35.1,31.5C33.1,33.4,30.5,34.5,27.7,34.5z"/> + </g> + </g> + </g> +</g> +<g id="Camada_7"> +</g> +<g id="Guides2" class="st46"> +</g> +<g id="Especificações"> +</g> +<g id="Guides" class="st46"> +</g> +</svg> diff --git a/src/img/loading_busca.gif b/src/img/loading_busca.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ce6d59693025fbd428c063f7f565a858c20d4db Binary files /dev/null and b/src/img/loading_busca.gif differ diff --git a/src/img/logo_google.svg b/src/img/logo_google.svg new file mode 100644 index 0000000000000000000000000000000000000000..a939ddc19ab24537dcd45e107724c7f55431a89a --- /dev/null +++ b/src/img/logo_google.svg @@ -0,0 +1 @@ +<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18"><defs><style>.cls-1{fill:#4285f4;}.cls-2{fill:#34a853;}.cls-3{fill:#fbbc05;}.cls-4{fill:#ea4335;}.cls-5{fill:none;}</style></defs><title>btn_google_dark_normal_ios</title><g id="Google-Button"><g id="btn_google_dark_normal" data-name="btn google dark normal"><g id="logo_googleg_48dp" data-name="logo googleg 48dp"><path id="Shape" class="cls-1" d="M18.64,10.2a10.341,10.341,0,0,0-.164-1.841H10v3.481h4.844a4.14,4.14,0,0,1-1.8,2.716V16.82h2.909A8.777,8.777,0,0,0,18.64,10.2h0Z" transform="translate(-1 -1)"/><path id="Shape-2" data-name="Shape" class="cls-2" d="M10,19a8.592,8.592,0,0,0,5.956-2.18l-2.909-2.258A5.43,5.43,0,0,1,4.964,11.71H1.957v2.332A9,9,0,0,0,10,19h0Z" transform="translate(-1 -1)"/><path id="Shape-3" data-name="Shape" class="cls-3" d="M4.964,11.71a5.321,5.321,0,0,1,0-3.42V5.958H1.957a9.011,9.011,0,0,0,0,8.084L4.964,11.71h0Z" transform="translate(-1 -1)"/><path id="Shape-4" data-name="Shape" class="cls-4" d="M10,4.58a4.862,4.862,0,0,1,3.44,1.346l2.581-2.581A8.649,8.649,0,0,0,10,1,9,9,0,0,0,1.957,5.958L4.964,8.29A5.364,5.364,0,0,1,10,4.58h0Z" transform="translate(-1 -1)"/><path id="Shape-5" data-name="Shape" class="cls-5" d="M1,1H19V19H1V1Z" transform="translate(-1 -1)"/></g></g></g></svg> \ No newline at end of file diff --git a/src/img/logo_parceiros/ENEF_AEF.png b/src/img/logo_parceiros/ENEF_AEF.png new file mode 100644 index 0000000000000000000000000000000000000000..fddea853a3a12fbca00a872ca14e09406e3d5cc0 Binary files /dev/null and b/src/img/logo_parceiros/ENEF_AEF.png differ diff --git a/src/img/logo_parceiros/educagital.png b/src/img/logo_parceiros/educagital.png new file mode 100644 index 0000000000000000000000000000000000000000..833769267d9b581976f035747ec11af63ed7f075 Binary files /dev/null and b/src/img/logo_parceiros/educagital.png differ diff --git a/src/img/logo_parceiros/fundacao-lemann.png b/src/img/logo_parceiros/fundacao-lemann.png new file mode 100644 index 0000000000000000000000000000000000000000..a44b6149f67898d3646da16c6fb33e9af126c7cf Binary files /dev/null and b/src/img/logo_parceiros/fundacao-lemann.png differ diff --git a/src/img/logo_parceiros/futura.png b/src/img/logo_parceiros/futura.png new file mode 100644 index 0000000000000000000000000000000000000000..72e0fd5b66df75353a3468f58e142b82d2a4e85a Binary files /dev/null and b/src/img/logo_parceiros/futura.png differ diff --git a/src/img/logo_parceiros/ic_bioe.png b/src/img/logo_parceiros/ic_bioe.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc47c707ab283e3965d1a38cc203455e441645d Binary files /dev/null and b/src/img/logo_parceiros/ic_bioe.png differ diff --git a/src/img/logo_parceiros/ic_default.png b/src/img/logo_parceiros/ic_default.png new file mode 100644 index 0000000000000000000000000000000000000000..3829583aa25b35d1c8eaf94ada77dd7013f8132b Binary files /dev/null and b/src/img/logo_parceiros/ic_default.png differ diff --git a/src/img/logo_parceiros/ic_diaadia.png b/src/img/logo_parceiros/ic_diaadia.png new file mode 100644 index 0000000000000000000000000000000000000000..9ee86dee5a83c880699d529310cc2011e6bf838f Binary files /dev/null and b/src/img/logo_parceiros/ic_diaadia.png differ diff --git a/src/img/logo_parceiros/ic_dominiopublico.png b/src/img/logo_parceiros/ic_dominiopublico.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd2832af0396b94880172914e0a500ba20b6fc7 Binary files /dev/null and b/src/img/logo_parceiros/ic_dominiopublico.png differ diff --git a/src/img/logo_parceiros/ic_escoladigital.png b/src/img/logo_parceiros/ic_escoladigital.png new file mode 100644 index 0000000000000000000000000000000000000000..ce05b1f8d10ea8815b3931991db4d9197c9c5ed6 Binary files /dev/null and b/src/img/logo_parceiros/ic_escoladigital.png differ diff --git a/src/img/logo_parceiros/ic_nute.png b/src/img/logo_parceiros/ic_nute.png new file mode 100644 index 0000000000000000000000000000000000000000..40eb4474b28fbc62eb9756f704c63c5ad47bc597 Binary files /dev/null and b/src/img/logo_parceiros/ic_nute.png differ diff --git a/src/img/logo_parceiros/ic_peninsula.png b/src/img/logo_parceiros/ic_peninsula.png new file mode 100644 index 0000000000000000000000000000000000000000..b425b05142256d7857b2cbb82b324dbd146cbad2 Binary files /dev/null and b/src/img/logo_parceiros/ic_peninsula.png differ diff --git a/src/img/logo_parceiros/ic_phet.png b/src/img/logo_parceiros/ic_phet.png new file mode 100644 index 0000000000000000000000000000000000000000..5758157be9a5b4a451e8681e79654f775f55c703 Binary files /dev/null and b/src/img/logo_parceiros/ic_phet.png differ diff --git a/src/img/logo_parceiros/ic_portaldoprofessor.png b/src/img/logo_parceiros/ic_portaldoprofessor.png new file mode 100644 index 0000000000000000000000000000000000000000..df0eccf7c3bff1016f8033ddfa38430ba146005d Binary files /dev/null and b/src/img/logo_parceiros/ic_portaldoprofessor.png differ diff --git a/src/img/logo_parceiros/ic_tvescola.png b/src/img/logo_parceiros/ic_tvescola.png new file mode 100644 index 0000000000000000000000000000000000000000..e8488a8ff8f22c1ac419317e369176f12ef80fb2 Binary files /dev/null and b/src/img/logo_parceiros/ic_tvescola.png differ diff --git a/src/img/logo_parceiros/icones.ai b/src/img/logo_parceiros/icones.ai new file mode 100644 index 0000000000000000000000000000000000000000..d54d2505ea8b5adaf80471bffef6a0f6e3e205ad --- /dev/null +++ b/src/img/logo_parceiros/icones.ai @@ -0,0 +1,1042 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 22 0 R 37 0 R 60 0 R 74 0 R 89 0 R 107 0 R 125 0 R 141 0 R 157 0 R 173 0 R 189 0 R]/Order 190 0 R/RBGroups[]>>/OCGs[5 0 R 22 0 R 37 0 R 60 0 R 74 0 R 89 0 R 107 0 R 125 0 R 141 0 R 157 0 R 173 0 R 189 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 27416/Subtype/XML/Type/Metadata>>stream +<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c111 79.158366, 2015/09/25-01:12:00 "> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" + xmlns:stMfs="http://ns.adobe.com/xap/1.0/sType/ManifestItem#" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/" + xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/" + xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"> + <xmpMM:DocumentID>xmp.did:748fc865-cf1b-6d40-a0f1-1f75821450ff</xmpMM:DocumentID> + <xmpMM:InstanceID>uuid:4bb38d49-3b0c-4af7-9e9d-adca1199c051</xmpMM:InstanceID> + <xmpMM:OriginalDocumentID>xmp.did:748fc865-cf1b-6d40-a0f1-1f75821450ff</xmpMM:OriginalDocumentID> + <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> + <xmpMM:DerivedFrom rdf:parseType="Resource"/> + <xmpMM:History> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:748fc865-cf1b-6d40-a0f1-1f75821450ff</stEvt:instanceID> + <stEvt:when>2016-10-06T17:18:17-03:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CC 2015 (Windows)</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + </rdf:Seq> + </xmpMM:History> + <xmpMM:Manifest> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <stMfs:linkForm>EmbedByReference</stMfs:linkForm> + <stMfs:reference rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\google2-01.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </stMfs:reference> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stMfs:linkForm>EmbedByReference</stMfs:linkForm> + <stMfs:reference rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\banco_objetos.jpg</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </stMfs:reference> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stMfs:linkForm>EmbedByReference</stMfs:linkForm> + <stMfs:reference rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\dominio.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </stMfs:reference> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stMfs:linkForm>EmbedByReference</stMfs:linkForm> + <stMfs:reference rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\logo_1__2_.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </stMfs:reference> + </rdf:li> + </rdf:Seq> + </xmpMM:Manifest> + <xmpMM:Ingredients> + <rdf:Bag> + <rdf:li rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\google2-01.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\banco_objetos.jpg</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\dominio.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <stRef:filePath>C:\Users\Quintas\Desktop\logo_1__2_.png</stRef:filePath> + <stRef:documentID>0</stRef:documentID> + <stRef:instanceID>0</stRef:instanceID> + </rdf:li> + </rdf:Bag> + </xmpMM:Ingredients> + <dc:format>application/pdf</dc:format> + <xmp:CreatorTool>Adobe Illustrator CC 2015 (Windows)</xmp:CreatorTool> + <xmp:CreateDate>2016-10-06T17:18:17-03:00</xmp:CreateDate> + <xmp:MetadataDate>2016-10-13T19:27:22-03:00</xmp:MetadataDate> + <xmp:ModifyDate>2016-10-13T19:27:22-03:00</xmp:ModifyDate> + <xmp:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xmpGImg:width>256</xmpGImg:width> + <xmpGImg:height>256</xmpGImg:height> + <xmpGImg:format>JPEG</xmpGImg:format> + <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq
7FXYq7FXYq7FXYq7FXYq7FXYqtkkSNC7mijqcVJY9qH5g+V7H+9uXY+CROfDxA8cujgkXAzdp4cf
M/YUiufzi0NGpBDPIPH01H65Fy0aSTr5+0OEcrPw/akl1+cmrl6WVrb8T09ZHr2/llywaQdXEn7R
H+GPzH/Hm4fzR87zCsdjYsP9WQfrmxOmh3lgO29UeUYfj/OVm/MTz+BX9HWNOvRv+q+D8vj7z+Pg
2DtbWfzIfj/OWL+a3meFx9dsrVV/a9NXJp9M3zx/LRPItg7ayj6o/L/pJM7b849JbiLi3mQ7c2WN
eNe9P3hOQOkLbD2gxfxAj4ftZBY/mH5Wvf7q5df9aJx4+APhlUsEg7DF2ngycj9hZFHIkiB0NVPQ
9Om3fKXYArsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirTuqIzsaKoJY+w3xU
lhPmb8zNO071ILP9/crVT9pKEch+1GR1GZOPTk83T63tjHisDeX48nmV5rfmLzDcqksvryb8E4xJ
2BO4CfyZmiEYB5bLrc+pNX9yfaR+VerXVHuz6C+FEfx/lkHhlU9SByczT9hZJ7y2+X62Zab+Vfl6
3FbpPrTfOWPx/lkPjmPLUyPJ3WHsLDH6vV8x+lklnoOk2QpbQemB/lufH+Zj45SZk83Z49Jjh9I+
9GiCIdF/E5G2/hDfpp4YFpabeE9V/E4bXhCFvNE0y8jMdzD6iHqOTjsR+yR44RMjk1T08JcwxfUv
yp8v3A/0Nfqh+cknh/NJl8dVIc3VZuwsMvp9PzP6WOSeVfOXl1mm0qfmm1RxgFe3+7Gf+c5d4sJ8
3A/KarTbwNj/ADf033pxoX5oQSTC11aP6vL3epfsW6Rx06Uyuem6hzNL21GR4Z+k/P7gz6CeKeJZ
Ym5RtWhoR0NO+YpFO9BtfgS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYql+ua3ZaRYyXV0
3EKDwWjHkwUsB8IaleOThAyNBp1GeOKJlJ415r8+ajrUjW8Z9Oz5HjH8LV+0AalFb7LZscWAR36v
G9odrzykxjtH+3yV/Kn5eX+rGO5uP3VoxBr8LVB4ns6t9lsGXOI7BGg7InmqUto/2eb1/SdC03S4
fSs4vTHf4mPcn9ot/NmvlMy5vY6fSwxCohH5ByHYq7FXYq7FXYq7FXYq7FUm13yppOsRFbmP95+z
JyfbcV2Vl/lyyGUx5OFqtBjzD1Df4/rYFLp/mPyVP9Ytm9fTR/eLSJOooN2Mj/bkzK4o5Pe6Mwz6
I2PVj+A/WeZeiaFrtlrNktzbNUbBxRtm4hiPiC/zZiTgYmi9Fp9RHLHiimWQb3Yq7FXYq7FXYq7F
XYq7FXYq7FXYq7FXYq7FUn81eYYND0p7uTd2qkQ33cozL0Vv5e+WYsfEacXWaqOGBkXhHmLzDdat
dy3d03wAsUWg2XkzAfCq1pyzaY4CIoPC6rVT1OT3nb5/DvYffa4/rAQGio1SfGhPiMtp6nsnsMQA
nk+r+w9C9+/Knz3Y6zo9vpzvxvbSJIuFGNVjSNK1CKv2m8c1eowmJt384U9BzGa0Pe6haWcRluZP
TQdTRj3A7A+OVZc0YC5Fsx4ZTNRDFNS/MrToSVtV9bwarL4dmjzS5+3ccdo7/P8AU7jB2JOX1bfj
3sav/wAydVkRuH7oAfa+Bv1x5q8nbeWe0dvl+p2mLsXHHnv8/wBbGb38ztRUlWveRFfh9JR49/Ty
UDrMm97f5rlR7PwD+H7T+tLW/NPVlaqS9O/FP4x5kx0uo6z+wMjosP8AN+0oi2/OLXImHOXko7cY
x+qLL449SP4/si1T7Nwnp9p/WyTSfzwBKrdrQbVNfl/LDlw1OohzHF8g4WXsSB+k/j5vRNH88aJq
YAjl4yN0TjIele5Rf5cy8PaWOZrkfj+p0ufs3Lj3rb4frT8Go2zYOvbxVpgGWhFQcUEPONa8tX3l
u/OtaN/c1rcRfD9jkZX+KRnPRANhmZDIJjhLzmo0c9LPxcX09R9p533Mw8ra/FremC5TZ0PpyjfZ
wisw3Vf5u2Y+XHwmnc6LVDPDiH4KcZW5bsVdirsVdirsVdirsVdirsVdirsVdiqG1LULbT7Ka7uH
VIoULksadO335KMSTQa82WOOJlLkHg/nbzbPrWoSu7BbKFmEQ+EgqrOVbkFU/ZbNphxCI83hdfrJ
6rLwx3F7fM197zvV9U9djFEaxg7kd+o8MvAeo7F7I8Eccx6v7PNKsk9Gi9MuL63vYZ7IH6xE6tHx
UNurAjYgjqBlWbJCESZkAMo4zPYC3tkf5v3iaUiXpWC835EvGx+3UfCsdPs0zi9b2jKRrADId/8A
aPe7XS9i73P8faxVvMtxrN3z3lUfamoFH2dtuK/y0zndZgmBxZT6u7b9Dv8AFijAVFMoNI1m7iL2
FjLdU/kU06/zUp2OY+l0OTMfSDTHNqseP6pAJRe/l5+Zd+xrpEix/wApktx4eLKe2dXpezRiGw3/
AB5uKe1dP/O+/wDUgZPyn/MJBVtGkP8AqyQt+pzmb4cu5A7U05/i+9A3P5f+dbYEy6LdgDqViZx9
618MHAe5tjrsB5Tj80oudN1G1JW5tZYSOokRlpT5j2yJDkRyRlyIKGxZK9teXFu3KJuP0A/rB8cp
y4IzFSCXoXlL82r3TmWK8asG/wDKP5j+zGT1OY0YZcP0eod2zrtV2djy+R/Hm9n0Hzt5e1mNTbXs
Xqmv7rlvsT/MFrstc2WHWwnsfTLuLzGo7Py4uYNd6fVGZjgtOiupRhVWBBHscUEWw3UdJvtB1T9L
aXG0trK3+mwKASFZzJI9WLt0UCij5ZkxmJCi6bLglp8niYxcT9Q+0nqyjTNTtdQtkmgcEkD1E3DK
1ASpBAO1fDKJRILtcOaOSNhF5FtdirsVdirsVdirsVdirsVdirsVdiryP8z/ADe9zMdKs5FNsNpi
jfaDCNx9liDvXqMz9NircvI9udocR8OJ26/Ye95/F5V8x68y22m27BGIDTukvpivwmrIrfzA5kyy
xjzbuwNAP72Xw+w9yf2X/OPGutGGu7y2DEA0jlk2qB/NBlJ1o6PYeKEPr35HXGlWMt3JqNsiRqzU
kmILcVLUFYVqTxynJ2lGAs/j7W3AJZJCIDDbSD0ZPqunwm6vCePNF9TeoX4SnxfapTOf1GTJqpWb
EO7f7RuORep0+lhgjcqtC6hp2uRTcLq2nRz3lSQdgf2hmyw6GGOPFKgHFy9qcR4cf4+RZLAING03
nLTn36VPxe/H+bONnGWu1HDDl+z49zsDk8HHcjv+1n35efm55a9AWF5H9Sn7zcYooju77s0tem3T
rnb4uyxgjUfx9jyGqnLLLiL1e0vbO7j9S2mSZP5o2Vh1I/ZJ8MiQQ4VK+BVrIjgq6hlPUEVGKQUo
1Tyh5d1JGW4sYOTVq4ii5b17lT45ExBb8eryQ5E/MvNfN35HI6y3WiSBXHJvQkNAR8TUVYoevQDK
pYe53Ol7araf4+ZeN3ljeWUxhuoXhkHVXVlPQHowHjmOQ9FCYkLBtQxZpjpOuX+mXCzW0rIVr0Zh
1BH7JX+bMfNpxPcbHvYyiJCju+gPy/8AzIsdbiW2uXEd2K05FRXd2/akZjRVyzS6og8GTn+O95Xt
Hsw4/VD6f7PJnubN0q10R0ZHHJWBDAitQdsUEWKLE54bjy/ra3Mbf7i7tgsiEn4JJJORIA4IAETM
gHjjXV1RidPlsf3cvvJ+XJlkMqSxJLGao6hlI3qCKjpmOQ7WJsWF2KXYq7FXYq7FXYq7FXYq7FXY
qkPnLzDHomkSXFf3xp6ailT8ag0HJT0bLcOPiLg9oasYMZl1/aHhOnwTalqttbuzSSXMscZYkk/E
QvU16DNpI0HgMUTlyAHnIh9A+X9GtdL0y3t4o1V1jQSOFAJYIoJJAWteOamczIvo2mxDHjjEdAPu
Rt3cw2ttLcTMEjhRndmIAooJO5p4ZWTQtyYRMiAHhnm7zDrPnTX/AND6QJDZrL6TOnqFKCRoyxMb
SLTjIN6ZgSickt+T1Olww02Pjl9X7Ph3PQPJH5Y6VoVvHNdRpcX5AZ3cI4DEITxLRqwoy7ZlwxgO
n1vaU8pobR/HmgPzJk0eiWkNpAbk15yLGnIU9NhuN+maTtvtAxj4cTuf2Hvc3sbSWeOXL+0JFqH5
QXut6PFNFcejdfF+7kdlj+2BuBEzfZXM3sDTjTx4pD1H9rX2nr+OfCPpH7PN5br3kPzPoch+s2kh
UdJY45SvQftMi/zUzrYZoydcJAo7yh+ZnmDy9eRF55Li0VgZYZWkf4firRfURa/F3yOTBGQRKAL3
nyl+Zvl3zBAnGdbe6IAaGZokblRa0X1HNKvTNdkwSi0SgQy9WVlDKQVO4I3BrlDBvFXYqwjzz+We
meYLZpLeNLe+FODqEQHdAeREbt9lNsrnjt2Wi7RliO+8fx5vnTVNJvtMumtbyJopVpUMrL1Ab9oK
ejZikU9fiyxmLCDwNqN0rVbvTbpLi2kZHWtOJYdQR2K/zZTlxCY82MoiQovqLyb5ntde0qKeN1Mw
RRKgIJrwUtsGc9XzM02fjjvzDxGu0hwzI6J/mS4SXeYdPS+0m5hI+MRuYiOofgwUjY775OEqLTnx
DJExKR+Qtb+sQz6VMWNzYSPCC5/YhCR9zXr7ZZmh173G0cyLxy5x+4bMtyhz3Yq7FXYq7FXYq7FX
Yq7FXYq8W/NLW3vdYFrHLytrf7KK1ftpGx5AEjqNs2WmhQt4rt7VGeTgB2j+kBLPy8s/rHmuwJFV
ik5H6FZh2P8ALk85qBcTsjHxaiPkXvgoBTwzVPoDzf8AM3zBeXMsPlrSiWubxljmKciVSUyQtX02
JABI6rmNklxHhDuuztOIg5Z8h+wp55E8jWPl/T43ZA9/KqvPKwUsGZU5ANwRvtJXfLYQoOJrdbLL
L+iyW9uktbWW4kICxIzmu32QT3p4Y5cghEyPQOHigZyER1eUaJb3HmTzCJJ6tH/uw7kD90QOvP8A
kzitJCWrz2eX7Pj3PY6qcdLgoc/2/DveuRoqKFUBVHQDbO4AA2DxhJPNQvtMsL6P07u3jnXwkRX7
g/tA+GSEiOSgvLfPH5IaddW8t5olYbpFLC3+FY2ICgAJFCSdlP05mYtURsW2OXveM32l+YvLd+RI
k9pLG20qiWMHix6MQh6pmcJRmG4EFn/kf87tRsDFZayPrFrVVE3xPIPsLu0koFKAnpmNl0oO4a5Y
u57boXmbR9btUnsbiOTkATGHQuKgHcKzfzDMCeMxO7QYkJrkEOxV5v8Amx5Ai1XT21GyiH12GlVR
RV+TRp+yjMaKp75VkhbuOy9cccuGX0/2vnogg0IofDMV61rFLO/yr84z6LrcdvK/+iXBWNlYmg5y
Riu7Kv2Vyn6J8Q+Lr+0dKMuM94/UX0fbXEdxBHNGQUkUOpFDswqOmbSMrFvFyiYmiqEAih6HrhYv
HrzUm8s/mosLMy22qUfiDRa3F4RyIqg6J75nRjx4/d+pwtTDhlHIPKJ+96/FIskSSKaq6hlI8CK5
glzAbFrsUuxV2KuxV2KuxV2KuxVDajdraWclwxACU3PTdgPEeOGIsteWfDG3zfe3k15cvczU9SSn
KlabAL3J8M3MRQp80y5TORkeZZl+U0IbXi5H2KEfTHJmNqj6Xc9gRvNf45F69qd4tnp9xcsR+6id
wPEqpanUeGarNk4IGXcHu8OPjmI95YZ5L0E3uqXXmK+UtJLLILUOK0jZ0mQrzBpSppRsx9KLHGeu
7stfn4IjFHpz+0M8zMdQwX8xvMBigGnQNRn3kIO/Eh0ING/hnOdua3hj4Y6/tD0HYujs8Z/HIq/5
caSLawa7daSTU6j+RpF8B45Z2FpuGHEeZ/a19tajinwjkP2MzzfujdirsVSXzB5P0LXbd4r62Qs4
I9YJGZBUMKhmVt/iJyyGSUeTISIeHeefyY1LSZJbrSQ11Z/EwT4pJAPjbpHEq/ZUZn4tUDsW+OS2
G6N5m8xeWr4G2llheFvjt5GlVCVYVDIGT+ShzIljjMMzEF7r5D/ODTNahittSZLW/oqsSUjRmoim
nOVmNWY5rs2mMeXJx5Y6ekZita10V1KuAVPUHfFINPmL8y/LI0PzBIkScbeTj6YpQfDHGT0VR1bM
PJGi9r2dqfFx78/2liGQdgvhleKVJUNGRgykbbg17YJCwgh9KflR5j/S3lyOORwZrYLEQTVqRxRi
u7MerZbpZ2CO54/tbT+Hkscj+ss3zLdU8L/PsNb+ZdNvoyUkSGBQ67EUlmaoIp4eObHR/SQjLj48
Uh5H7nrHkW+a+8naPcsSzvaxhmJqSUXgSTU9eOYWYVMtWn/uwD02+WyeZW3OxV2KuxV2KuxV2Kux
Vhf5r3gi8sS2x63PGn+wljbwzJ0o9Vum7dyVpyO/9YeJ5snhGf8A5ROP0xIvc0/4hLmJquT0Ps+f
3h/HQsz8/wB6qW9taHpLMlfkwdfDOV7YzcMYx75D9L6X2RiuUpdwP6GR6OirpNkq/ZWCID6EGbTT
f3cf6o+51uoP7yX9Y/e1q96llptxcsaenG7L7lVLU6HwwanKMeMyPQH7l0+I5JiPeQ8TvruTUNUk
mff1pTxG3RnJA6Dxzz7NlOXISep/S95ixjHjAHQfoe4afai2tI4R0Sv4sT7+Oeh4cfBEB4HNPikS
iMta3Yq7FXYq7FWJ+dfy70bzLbOZU4XgU+nNVzQ0enwh0X7T1y7FmMGcZkPnfzl5H1XyzfOk61t+
R9KWqCo5MF+EO56JXfNniyiYciMgWT+Qvzh1HRylnqbevZCvE0VOP22/YiZjVmGVZtMJbhjPHb6A
0jWLDVrRbqyk9SJq70ZehK/tBT1U5rZRINFxyKedfnvpay6LDegfFBy5H/XkhUd/4Zj5hs7vsTLU
zHv/AGvA8xnqmV+QvIt35pviit6drHvJLQN9lkBHHmh6Pk4QtwNdrRgj5vW/LPlW38l+YIbaGf1h
eRqrfAVoZZFU9Wk/33mLOfhakD+dED5l0+bOdVgJIrhP3D4d70jNs6B4L/zkTOv6ZsoP2vq8Un0c
5xmx0Q2Lfh5M2/I67abyZbxE7QqQo+c0vt7ZRqx6nBx7ZJx7j99l6JmK3uxV2KuxV2KuxV2KuxV5
f+dNy4/RkCmin1/UHj/dEZnaMc3lvaSZAgO/i/3ry/M15RmP5XXHpeZoY/8AfrUH0Ryf1zH1I9Lu
uw51nA7/ANRZF+ZF4x1OCP8A32FYfQ8g8M8+7dyfvAPxzL7J2Jj/AHZP46M38rXqXWhWjg/3UUcb
fNY1r2HjnQ9n5RPDE9wA+wOh1+IwzSHeT95YV+YvmD15f0dEfgjNX2/aBdD1X+Oc/wBua3iPhjp+
0O97G0fCOM/jkWJaJF6usWMf89xEv3uBmk0kbyxH9Ife7nVSrFI/0T9z3jPSHz12KuxV2KuxV2Ku
xVB6rpVlqllJaXaepDKrKwqw+0pX9kqejZKMiDYSDT5o8/8A5a6h5YlMy/vbE/Zk+FegQHb1Hb7T
5tcOcTcmE7SXyv5w1jy7diexkov7cfFDy+FgN2V6U5nLMmMSG7KUQXq3mX8xtI80/l/qEdfTv09G
kXxt1uVP2uCL9lK5p9VgMYuR2ZEx1Efj9xeMZrXsn1D+WehppXle1AFHnRJm37vDHXu38uZmMUHi
O0c3HlPl+spJ5t1Gvm+zof7oxJ/wMze2ct2ln/wqPlX+6Luez8P+DS87/wByHoNtKDZRTMdjGrk/
7GudTiNxB8nmsgqRHm+ZPzh1kan5wnINVtQ1uPlHPL7L/Nm600ai34xQZx/zjxOfT1GLt+5/XOco
1o5OrqtRPz4fue1Zr3KdirsVdirsVdirsVdiryD84XJ1S1XsvqU+lIs2Gk5F5D2jPqj8f968+zLe
aTjyddC2806ZKTQfWEU/7M8Pf+bK8wuJc3s6fDqIH+kyr8wZfU1tSOhhBH0yPnmPbh/f/D9JfeOx
P7i/xyCV2HmDUrK1ktoJOMcoYMKKftAL3U+GYOHW5McTGJ2Puc7Lo4ZJCRG4S53aR2djVmJLH3O5
zFJJNlyQKFBN/KKcvMFl/kyxN90i5ndmC88fePvDhdomsMvcfuL2zPQXhHYq6uKuxV2KuxV2KuxV
RurWC6t2gnXnE9OS1I6EEbgg9RhBpXzr+Zv5XTaC7X9gvLTzTkKgcf7tB9uR2NWc9s2eDUcWx5uT
CdvOIv7wf59sGuP7o/jq7Ps4fvh8fuKNt2jEymQ0Tep38PbOfhEyNB6bLLhjb6u0zzBo9zoYnsJ/
Uhhgop4utOEYP7ag9CMy8944knoHg4xMp13l5ZfXn1rzGZj0Nzsfb1SfAeOefZsvHqL/AKX6Xt8W
PgwV/R/Qn/n78xrHRvLcenWz89QntxGUow4q8TpWpjZTRl8c9H7PwmUIk8qH6HjMkLyS95+989XV
xJcXEs8hq8rs7H3Y1PSnjm6Apm9i/wCceGpc6gvj6P6p8wtbyDqsn+MH8dHuea5yHYq7FXYq7FXY
q7FXYq8i/OOJl1K0cjZ/UofkkQzYaTkXkfaQeqHx/wB688zLeZXQyNHKki/aRgwPuDXEhlE0bZJf
6omopayAjnDbxwv81qT2HjnmvtHglHPdbH9cn3D2R10MulEQfVH9EYoTOeerdiqc+UJFTzDZ1NOU
saj6ZFzP7MlWePvH3hwe0ReGXuP3F7ZtnoLwjsVdirsVdirsVdirsVdiqncW8VxC0Mo5RtTkKkdD
XthBpXzV+ZnkOPy3qgktyPqs32F7jgkYPV3bq+T1Wo4oV1eg7GHFInu/awadqLTxyHZ+K533ftdl
2pmAx8Pf+xOvKFlcNeG4oViVacqbEhlNPuzE9pu0I48Xhg+qX3ESDgdl6YynxHkP2Mr1GURWUzk0
ojb/AOxJzhNDjM80QP5w+96DUS4YH3F5vcv6lxI9a8mY/ea569gjw44juAeMyG5E+allzB7R/wA4
8ofXv2/4w/qnzB1vIOomb1B8v1Pcs1zlOxV2KuxV2KuxV2KuxV5p+dFnI8Om3KAcIfX9U71+IxKv
bM3RnmHmfaPETGMu6/t4XlWZzyLsVV7WcxyAE/CdvxGaTtzs/wDMYiR9Ud/kD5PUey3bB0moAkfR
I18zHfmO5NAQQCOhzzGcDEkHmH3HFkE4iUdwRbsi2IzR5xBqtnMTQRzxsf8AYuDl+lnw5YnukPva
NTHixyHeD9z3kUOekvnrsVdirsVdirsVdirsVdirjir53/OjWxfeYfqsTckg6gGv24om7E+GYuU2
Xrux8PDjs9f1lg+seWtW08QPcQsFuOfpni/7FK9VHjm20cowx2fxu67XZvFyUPxszDS7FLO0jiAo
1By+fEA9h4Z5l2jrDnymR5Wa+Zek02EY4AJd5svRBYemD8ch4kd6MrDxzbezOkOTPxdI7/EGLh9q
ZuHHXU/qLBs9KeXdir3v/nH3TZY9Mub1qcJvT4UrX4HmU12/jmu1ktwHURH+EZD/AFfuev5guU7F
XYq7FXYq7FXYq7FWJ/mdYNdeVbl442kmi4emqjkfimjrsAT0GX6aVTdV2ziM9PKue33h4Xm0eAdi
rsSLSDRtHWVzWkbHfsfuGcL7Q9jkE5YDbr9p6B9U9kPaMSAwZTv0v/NiBvL9CNzjn0gLkYq4YdVI
I+jEGigiw9w8vammoabFOrVY8uW9f2mHifDPRdFnGXGD+ObwOswHHkITPMtxXYq7FXYq7FXYq7FX
Yqgda1S30vTZr24YLFFxqagfaYL3Kjq3jgJptw4zOQiHzNoVje+bvNiK4LG4r6r/ABELwhPGpIkp
X08w4jiL2eecdPi9363qf5jyaLM1tZwRRs9rz+ILGQPU9NuozUdr9qGMfDgefP7D0LrOydESfEn+
OYYa7qiFm2Cgk/RnKwiZEAdXoyaFsB8x6ibu+YA1SOqjw+Fm9z456f2BoPAwAn6pb/MB5TtHUeJk
8h+1Kc3zr3Yq+n/yY017PyRYytT/AEmPmKeBkkYdh/Nmp1Urm6zHH1Sl3n7iQzvMZudirsVdirsV
dirsVdiqjeWy3Ns8DAFXpUHpsQffwwg0WE4cQp8239jNY3clrNT1I6cqVp8Shh1A8c3MZWLfM8+I
45mJ5hD4Wp2KtqSpBGxGQyYxOJieRbcOaWOYnE0QUxtboOArH4v9r3zzztrsSWGRnAXD7uZ6B9h9
mfaeOpgMWQ1kG3v+kdZEkklE5zT27Nfy98xi0uDY3L0hk+wxOw4h2PVgBUnwzoOxNdwS4Jcj+0ui
7Y0XHHjjzH7HqANRXOweTdirsVdirsVdirsVdirx/wDO7zeEgXRbaTd6+uFPgYpV+y36xlGaXR6D
sbSb8Z/HMJF5CEXl/SpNQKg6jcU9EMAePB3Rv5HFUfsc1Gt7QGGND6vx5uzz4Tnnw/wBTmnlnkMk
rF3PVmJJ2FO+cfOZkbLtIwERQY55n1hbe3NvE3759moeikMOxB6jOm9neyjlyeJIekfeOE9zq+0t
YIR4RzP7WFMxZixNSTUnPRYxAFB5om2skhEadaSXl/b2sQrJPIka1rSrsFHQHxwE0GrNKoH3Prny
bpx03yppNk324bWIP/rFQzdh3PhmlyyuRLh4hUQnOVtjsVdirsVdirsVdirsVdirxz82NCe01VL+
KICC6rVkXZfTSNPioABUnbfNjpZ2KeN7f0vDMTA2l+igx3yj5e/TmsQWjlltyw9Zl2YLRm2JVh+z
3y3Lk4RbrOz9H4+QRPLq9C1D8ntIMBNlcTicD4RK6ca0PXjFXrTMSOrPV6LL7O469JN+df8AEsA1
7yZrOkOxlhaSFa/vUV2WgrvyKKOi5lwzRk89quzcuE7ix8f1JECytUbEYcmKOSJjIWC4uDPPFMSi
akEfbXgYBX2Pj/tnOE7Y9nzjJni3j3fM9A+rezntdHKBizmpcr/0o5mXvRscjxuHQlWHQg0Ph2zl
ATE2HvyBIPU/JvnGK+iFreOqXC9GYgA1Lt1ZiTQDOy7L7UGQcMz6v7fN5PtLs04zxR+n+zyZhm9d
I7FXYq7FXYq7FUq8x6/Z6Hpkl7dOAqUotVBNXVdgzL/N45GUqDfp8EssuEPm101HzDqb6hqJYB6c
h8XZOHw8+f8AIO+c/ru0xDlvL8eb3WHAMceEMkLEgL0UdFHQV9s5TJllM2S3RiByTHQ9CvNWulhh
Q8DXlJRuI2JG4Dfy5kaTRzzSoOPqtXHDGywX8z9Oi0/zRNbxV4LyArTtNIOwHhnq3Z+COPEIx/Gw
ePlmlkPEWI5nMXYqz38nvKzaz5ohnlST6tYlbgSqPgMkU0R4MxVh0bpmNqcnDFxNSbqL6cRFRFRd
lUAAewzUsQG8VdirsVdirsVdirsVdirsVS7X9Gt9Y0uaxnFUl413I+y6t2K/y+OThPhNuPqtPHNA
wPIvM/y3X9G+aJNPlNXJUA+NYnbtX+bxzN1G8beX7Hj4WoMDz/YXrua97Ba6K6lWFVIoR7HFBFvO
PPf5eRyiXUdPWj0aSVKk1Pxuxq7/AC7Y/mp4t+cXV6vsTFnBMdp/E/prm8rngkhlaOQUdSQRsdwa
ds2en1MM0bi8brdDk00+GY+79vcrW940ezbr/n7Zo+1OwIZvVDaX9nm9T2D7XZdMeDJ6ofAVz7ok
8ymMUoYckOcDqdLPBKpCi+s6LX4tVDixmx8f0gdzNfLHn6e0At7795F2fZafaPRUJ6kZtuz+2ZQ9
M9x/b3BwNd2QJ+qGx/Hm9G0/VLPUIvUtn5r32YdyP2gPDOrwaiGUXEvM5sEsZqQReXNLsVdiqB1P
WbDToy9zJxIFQKMa7E/sg+GY+fVQxC5FyMGmnlNRDxvzVrDa9fiaUfuY/wC6Tw5KobcBT1XOP13a
08u0dh+PJ7HQ6EYY+aWUGad2DJfLPk661WQSy/Bbd22NftDoGU9Vzbdn9lyzGztH+3zdVru0o4RQ
+r8eT1ew061sIFgt04Itdqk9ST3J8c7TDgjjjUeTyGbNLIbk+W/zRvBdecb5gfhSSVfunk9h45vt
OKiG6A2Yll7JWtLWa7u4bWBeU07rHGtQKs5CgVJA6nATTGcuEW+rvy90B9I8s2MU4pdNBEZB/KTE
gK7MwNCvXNPmnxSLhR33PVk2UsnYq7FXYq7FXYq7FXYq7FXYq7FWF+c9IW0vYPM0CVlspFkuN+qV
jQ9SR9gHouZOGdjh73Tdo6cRkM45xNn7B93kyjSdQh1HToLuI1WVEY9diyhqbgeOUSjRp2eDMMkB
IdQjMi3OIBFD0xVifmzyLZatG80Q4XVCQfiNTRj3dR1bMHLpjGXiYzUvv69W+Rhmh4eUXH7unR41
qmjXmmzGK4Tiw91PYHsT45s9F2pHKeGXpn3c/wBFcnh+1vZ/Jphxx9WPv2Hd5k8ygo5GQ1U0OZup
0mPNHhmLDqdF2hl00+PGaPw/SD3o6G+U7Pt7/wC0M4ntH2anDfHuP7O+T6f2P7bY8npzek9+57+6
PuTGzvri1lSe2fhIpqrUB3+TA5zMZTxS22kHuv3eaHfEsjtPzC1yFQsjerTvSNfDwTNlj7bzR57/
AC/U6/J2Pily2+f60U35m6oVoIqHx5J/1Ty49v5O77v1NQ7Dx9/3/rS298869cgqJvTRtivGM7Gv
fgPHMXL2vnn1r5fqcrF2Vhh0+/8AWkU08szl5G5MxqTQDc79s1spmRsuwjARFBVsdPur6YQ2yc3P
aoHYn9ojwyeHDLIaiN2GXNHGLkXofl38vIYCJtQ/eMK/u91/mHVH+WdToexIx3yb/jyLzWs7ZMto
bfjzDOERUAVRQDtnQgU6Em0FrepwaVpk19O3GKHjyahP2nCjoGPVvDJwjZpQLfHeoXb3l9cXT/an
keQ/N2LeA8c3kRQpzAoDCpL238jvJP7s63dwcXLUgl51qlIZVHFX+ncZr9Xl6BwZ5OOVDkHtgAAo
OgzAS7FXYq7FXYq7FXYq7FXYq7FXYq7FVO5t47i3lgkFY5VKON+jCh6Uwg0xnESBB6sGjW58p6ww
PxaVdSEnoOBkfr/uxzRI8yTWQebpAJaTJ/tcj95+J5BnNvcRXEEc0R5RyqHQ7ioYVHXMYindwkJA
EciqYGTsVQepaVZajD6N1HzX5sO4P7JHhlObBHIKk24s0ocnnfmD8pyay6a+/wDvun+qOryfPL9N
lnj2JsOh7S7Hx5vVD0y+J7u8vOtS0m+02cw3kfpyDtyVuwP7JPjm3hMSGzxefTzxGpBQhneI/Cdu
4zC13ZuPUxqQ3+P63Y9ldtZ9HMGB9PUbfpB70bFfRtQNsf8AP2zitd7N5cdmHqHwH3yfTey/bXBl
qOX0y+J7u6KKUhhVdxnO5MUoGiN3ssOeGSIlE2C0jq9wlum80hConSpY0G/TrlmLS5Mh9IZzmIiz
yZzoP5dXE6Rz3zemrBW9OgOxoeqv883el7Bkd5/j5F0Wq7aiLEPx9j0Ow02zsIhHbR8E8Kse5P7R
PjnT4cEMYqIp5vLnlkNyKKy5qWu6opZjRR3xV88fm/8AmIutTnS7F62SfbNPtVEUg+0isKMp75s9
Nh4dy5GOFPL1RnYKu5OwGZjOcxEWeT078rvy4k1K/hvr1P3UZWVEqOitGwaqyA9CdqZi6jNwig6m
er8eXDD6X0Na20dtbxwRiiRKqL16KAO9fDNWTbkxjQpVwMnYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
VC+soby2kt5hVHBHfuCOxHjhiaLDJjE4kFh4e+8qXlHHqaPK+7fCPT5N9qg9SRuMceZG0x5uo9Wl
l/tZ+z7zyDMLK9try3juLd+cUihlahGzAEbEA9DmOQQadvjyCYsclfAzdtirsVQeqaTY6lB6N2nN
O27DuD+yV/lyUZGPJpz6eGUVIPMfNH5WT28clzpZ9RUUsYtl2AX9p5PmczcWpvYvLa7sIxBlj3/H
mXn1xaz20rRTLwdSQwqDQg07V8MywbednAxNFu3vLm3Dei/DkCDsDsfmMhkwxnzDfptZkwm4Gvkn
HlHzJDoV5Jcm39WaVizycyv2mVjtxYdVzGOij0egj7VZ5REZ7ge7/iXo9h+bOiTAC6X6udqmsj+H
8seVy0sujmYu38Uvq2+f6k+g87+V5xWK95f88ph+tMqOGQ6OfHtPBLlL7D+pVuPN3l+3iMst1xRa
VPpyHqadlwDFItv53F3/AGF4x+Yf5k6rrqvp+lR8LI05PVDypwcbSRqwoynvmfg04juVPaemhvKX
2S/U87g8vzsayniPDY/qbMq3A1HtLjH0C/n/AMS9H8gflr+kJVnljpa7cmr1FUPQSBvsnMbNn4fe
6/BHNrZXk/u/h+ijyL3LS9MtdNsorS2XjFGqr1JrxULX4ix6LmtlIk2XpMOGOOIjHkEVkW12KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVp40kQo6hkYUZSKgg7dDigi+bGtR8ry28/17R3+ryK/qzQK
SiOASzALGu5Ow3OXRyXsXXZdEYnix7Hn+KdZebhFP9U1W3ltpB0ndPTiIBC/akbr1PyxOLqE49dR
4cgMT38h9rI4poZV5ROsi+KkEfhlRDsBIHkvwJdirsVQd/pGnX8ZS6t45ainJkVj37sD45KMyOTT
l08MgqQBYTrv5T2Vzzk05/RlNSEYqqV3PRIyepGZMNURzdHquwIy3gaP47gwHWPI3mDS2f1YGljW
v7yJJGWgr3KL/LmXDNGTz2o7LzYjuL91/qSBgVYqwow2IOxBGWuBKJHNrFi7FUVp2mX2oz+jaQvK
/cqrMBsTvxB8MjKQHNuw6eeQ1EW9L8p/laIh9Y1gI5PSIb0pyG6yR/I5h5dT/Nep7P7CEfVl3/B7
w9JjjjjQJGoRFFFVRQADboMwnpAANguxS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FU
Jf6TYX8TR3MKPyBHMqpYVBFQSDvvkoyI5NWXDGYqQYvc+XPMmnO82kXpljFOEFxLKw8D8MajxJy4
ZInmHWy0mbGbxyvykT+hSTz3rVjJJHrGj3LcaUls7aQxmor9qRx4jD4IPIrHtGcTWSEveI7faUVb
fmh5YmUF5TB7StEh/wCTmROnkHKx9oYZcpD5j9aIP5jeUQKnUIR85of+a8j4Eu5y4zieRCCu/wA2
vJluCfriSkdo5IG8f+LB4ZIaeZ6NggSxrVf+cgvL8AZLG2uJZRXizJG0ddx1WavWmWx0curMYiwL
zF+dHmPVw8UcccMLVACCVDQ8hvSVhWjZkw0sYpOKFepiMWqarLcGQqzl2qwIcjc18cyKDp9fodJI
EkxifLhHezew8r6/eyrHFYTqHrSRopAgoCdyFPhlUssR1eKxdn5pmhE/I/qZxoX5Rzlo5dTlUL8X
OONjXuBs8XyzFnqu53ml9nzsch+X7Q9A0ny1oulJxtLWNW7y8Iw569WVV/mzElklLm9Fg0ePEPSB
8gmmQcl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqctvbzCksSSA9Q6hv
14QWMog8wkl95F8rXacW063h94oYVPb/ACD4ZYM0h1cWWgwnlED3AfqSS8/J7ytPC6J6iM3Rh6Ip
Q+0WWDVSaT2bHpKY+P7Ekk/IfRiTxlanuyV/5M5Z+cKBosg5ZJ/6YtJ+QmjV+OVqd6Mn/VHH84WY
0mX/AFSf+mKa2H5KeUreLjIrysTy5MIWPQbVMQ22yEtXItkdIa3nM/5yeaf+XXlGy+zp8M3vNDC3
h/kDwyuWeZ6shpIdRxe/dkMVtbwikUSRgdkUL+rKiXIEAOQVMDJ2KuxV2KuxV2KuxV2KuxV2KuxV
2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2
KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K
uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku
xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux
V2KuxV2KuxV2KuxV2Kv/2Q==</xmpGImg:image> + </rdf:li> + </rdf:Alt> + </xmp:Thumbnails> + <xmpTPg:NPages>1</xmpTPg:NPages> + <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency> + <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> + <xmpTPg:MaxPageSize rdf:parseType="Resource"> + <stDim:w>48.000000</stDim:w> + <stDim:h>48.000000</stDim:h> + <stDim:unit>Pixels</stDim:unit> + </xmpTPg:MaxPageSize> + <xmpTPg:PlateNames> + <rdf:Seq> + <rdf:li>Cyan</rdf:li> + <rdf:li>Magenta</rdf:li> + <rdf:li>Yellow</rdf:li> + <rdf:li>Black</rdf:li> + </rdf:Seq> + </xmpTPg:PlateNames> + <xmpTPg:SwatchGroups> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Default Swatch Group</xmpG:groupName> + <xmpG:groupType>0</xmpG:groupType> + </rdf:li> + </rdf:Seq> + </xmpTPg:SwatchGroups> + <illustrator:Type>Document</illustrator:Type> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?> +endstream endobj 3 0 obj <</Count 1/Kids[7 0 R]/Type/Pages>> endobj 7 0 obj <</ArtBox[0.0 0.0 48.0 48.0]/BleedBox[0.0 0.0 48.0 48.0]/Contents 191 0 R/Group 40 0 R/LastModified(D:20161013192721-02'00')/MediaBox[0.0 0.0 48.0 48.0]/Parent 3 0 R/PieceInfo<</Illustrator 192 0 R>>/Resources<</ExtGState<</GS0 193 0 R>>/ProcSet[/PDF/ImageC]/Properties<</MC0 189 0 R>>/XObject<</Im0 194 0 R/Im1 195 0 R>>>>/Thumb 196 0 R/TrimBox[0.0 0.0 48.0 48.0]/Type/Page>> endobj 191 0 obj <</Filter/FlateDecode/Length 1243>>stream +H‰lWIŽ7¼×+øæ0™L.WÃÁ|ð–|è±!ùÿ€#VõȺYÌ}!ëå·×ôòñµ¤Ÿ>¼¦£äÞF¯ˆþö‘¾}9^~ù½¤/ÿ%•Ô¦þûóø||}Oø#ý RmœW£QOúzŒ< ¦åJK,EÉu@Íýíxùõ¤ÿŸT?45ýKõMd²(qÉÜZK½dhXÊ«/ÞŽq–ÉX?Ž[]y–ŠõÕ¼–ªãÍÆŽ ÷ã¤ÄóqQdÁÜž¶´Û¨à¡´5m|‡{ý8¨«'!ôlY†Šû± ñ|œ„08Äû3M@o‡ä!dk*!€‘¬zÁíß&œî„‰Î’„ÍÜr®îgD7‘¡•™å¤¨R˺ðv卵þ]7ø”©AÛ5±áëuöÉꂺV$-”UÖâB]ü Þ®ŠôÍ)œø]ÞÔÌ}¢àjÍ,µ>×?½œ(ó´ØP²âäzº¬Ž"kÒÇ!CH@ÐÚJ!Øzé+$&·²7QžMJh/)xt‚…“3œ¥C$õ\à Ìo™W -é,RÀe$~®uÁ˺ÁàMòÞŽ;\Ö¨š Ú<,�³´-½]›=[P Ws¡zExxÄ4|@ÎøÚ~|œ«ì°¡ÔL[AÂì@:jˆ¶$çñè<‡ñnµwÕ +&Û(Å2aós±Œ¼¦DµÌL:B“®ê€þ]0'¬«š×A šªóñŽB5—¥XÛµ8ÿ‚=àCáä¶÷.˜Ê— ª&ã5‚ŠhÎxª©! +Ä´µèZmF੽’K£Ø@ÅÞukèŠx‡adY›{tÎna#7ewE”Ÿ$ððŸ›ÑåUGt¶@Ÿˆd³ ¯µà6tLg0a-Ofª].|ò96‡-ï`yç4J¹®g§Q¡:¨¶´“Ïu9{Ï]› +xY#÷,•7j2L”>N¤¬ñ¾ªë"XMtkW“6foWiaGZi± Ñتí"—˜FiÁíx<a³’ý|Øç#›ùÛUø´¡¶Œ¹Ýd] ®=�xwÕã‚Ús.dÈÏvŽ,;AæÔ·8Ö߃gÒHYéÏ ®’¡RY£H&ƒMW›KTl‹Á9ÇV7V¯1ÐZÌLÖ>¯FX¥É¹h¼ô&&Š–TÛõl†à˜Ñµ©’�vBŒpÀ /[NèÞë>íb9çQ9¢§/³ÛïVå3Q'ÒŽ€qy‰z®‘'DOAi;%(¥Ù=]@ï °z´’Ѧˆ4xÙ€|„:TÿêtFÃ+«ÌN\×àÀ"_…ÚCZï¾U3iƒO•èéÑìµéy@\4eCëhøiSQNˆ+©Xë’å >ãŒÆ¡Óí:«Ké׺§Äó¨±òŽöã0cŠ.œ¸G‰v÷3²DÚn׎#5iuz"Yïv(«fï¬1`@u¸�±Ewþµ{£i{-»{—Ù¿k8Xƒ:r¯ñÜÅ‚1‡w.LÕŽÛ©*«M»“_76¸x4ÜDZ›~ÛÂN»ƒi(îŠsò@ý#ü#áçøRùO€�êµjÖ +endstream endobj 40 0 obj <</CS/DeviceRGB/I false/K false/S/Transparency>> endobj 196 0 obj <</BitsPerComponent 8/ColorSpace 197 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 6/Length 54/Width 6>>stream +8;Xp,*=NntbilQcrP\BEq:Dh)?b\efqXp)5l`h#3lMpqi!97E),l~> +endstream endobj 197 0 obj [/Indexed/DeviceRGB 255 198 0 R] endobj 198 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 +VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< +PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 194 0 obj <</BitsPerComponent 8/ColorSpace/DeviceRGB/DecodeParms<</BitsPerComponent 4/Colors 3/Columns 630>>/Filter/FlateDecode/Height 201/Intent/RelativeColorimetric/Length 30600/Name/X/Subtype/Image/Type/XObject/Width 630>>stream +H‰ì×gsɆá_|Ò¯½ö®½É9GåÊ9€’@H€„È”³sÎÞýpºçíº‡¬ã$\OÕUOÍLÍ÷»^{k§>J‡ÌvP-…4}¢f¦ýã´åj4Ø?[Vƒ¢5Ÿz¦©ˆ:“Æ–ƒ`ÿ·Ö6¶Ô64P“«¾…T+š«ëíŠ:UL}³Ê®¨³WÖÙªèO]e-WQÃÖ&«¨ÉÕDÊeÕÖʪó¹S©¸]Ù`‚Ô“[&åÂÍò:E™â†ÉºëYµù\»ÍÔX¸%\U]¹ÉT+nTÉ.›UÊ.]ÏqT0 W®–W¸óù\.;grIqöÒrÆäâÓ²·ÉŸ†ó²[œS½õûY±š›ä7ÃÙ_O§¸ëYr'Í®‘_Ȇ«äçß…ä7ÃrœüJ.ÿDN)ŽéŽžºÄcNrGO^<ú÷cÖæÈϲ‹GN\8râ<ó_Å…ŽŸÿáø9æ?†ŸÈYòoÉ¿˜cg¸£gþ©úÇÑÓÜŠ•õÍÒ³¶¹ü l˜dde#³úŬ¬“tkù,‘å’*,³ªH¯&³V +X\*bA–Ê+‘Z¶’I$¹x1±EkÑYÚ,a!’H‡µÕ-E)m…p|)¤â_bKó1¾¡X*KêRóÑd0’d›Yd‚‘Å9m s\r.¼h2’-À¼™?h’ >2'3&³$6ò¢^Ö”ÁÇy|Q·Æã‹÷ŒµÉé°lÂÊš)¯ÞÐø3opy˜ ·0æž“N*F&f%fXã—Í:]§Ë/sŒ1Ǩß1êc†4ƒÌˆa†Vô3N®O˜&½ŽC\÷·‡›êäº ÄÃt‘~Og–›éе÷M*z'Û„ ¡‡kÕ´0Ýã²æ.—ÌÞi#¶®©c”4¶«ÚFHC+WÏ s-B¡™8»³¶ÙYcwÔÚl«‰m¨º‰«²éØs#3ÈTê*˜®¼a€”ÕkêúU}wj¹ÛBïÒs³Zq£Št“ë•Üû¿þ.9o?óþ¯Ïî÷Áðöý‡7ò®ˆ×Ÿèí{æUQoÞYzI^”E½z+{nxù¦€g/ +yúâÍ“ç¯-=ÎçÙ+æQaO_=T¼ž¼|`òø…ì¾¥G/î™=W<|~7׃çûÂ3ÙÞý§f÷¸]ÕÎ]ÃÙöþc³=nKµ¹÷hc÷ÑfŽ‡d}›[˵õ€Yͱ²y_¶¼¡[¿ÇdLÖî’´jiuß$µ¢YÞ#IÕbfW¶Þ‘%KB<µ-‹%·dÑE²iYØ…†u&×ÅÖȼ&5¬’¹ˆb6¼B*hYæ›f‚MšLÏqÞYÙ +âO·?Éù’“’‰™EÕÂÄ47®syI‚ŒM £aÄ×ÄÈð$çÔ9&¢Šñr‘ð 4ýÌhˆé3ŒÌ3½Ã† Óãœ#Ý×54K:uƒ¦}@hðsýÓÊôq-½BsÏ4±ws6C—WÖÔÉíݽ_rvÛ¿÷ìÔÞݶ?Ñ®°Uľ¥ÍƒÙØ.lÏd}‹ì°¶YĪÉÆŽ¥•|Ö·ÉrA™µ\[LzUµ²)[Ê#µœkC–ÌXX4¤×eK¹ÖH"•7$±äªÙâ +ÍYPD–™Hb9, ÅsÄ2Ì|,mŒ*æ"d‰Ì†MR$RøçM’>fds‹º2=«ð ¯?ÁvJåñÇen7鋹}1Û™˜{šïätT6á5D˜qÔàÒŒyÂ[wÈdt’Éš'êñ q +sŒÃ%f™ÁÑ\f`DèöËúœ\/çãB¦{hƤkpšt’ƒ—tôs횶¾)³^ÓÊôp-=n¡›kÖÙ»[פÐÉL4uqÒÈ´s †6âªo긱º2Z«©iv®Z®¶ Uœ³²I¨häʈC7T^Ï•i¾N¾jÝ +¶ìs9x÷Ë—¿²#‹ãž¥Ü&¦3Ÿ|õÜ) _1ó¦S/¦IÞz®m‘LAæ’r›Œ¹žË²TV]—™š)ÑjYRÍ*‰'³¤€*rK*Ò™#¬Æ4’È0áx&$™åˆ¦5KA•S5©Ö% „’„5Tf”TJê"§ÇtÚDÄ4AxI%Ù˜úã$'©1ÙäŒàž‰2RR#2£¤ãSaâ"ª:ʪÓz:o22ÁI1 ç¸Ê5GôªÎ’œ¤L1Õù‰žTŸLJê7$ä&U„Õ()é7L‘ö>ŽzÚJ1•õ¸ …µ¹{ÒÄÞ¥`U•éau íBiê[ÇHi%µ-#„·•çu˜©6Øœ¤JSisT6q‚ÒVž×AR¦ùæ¹DaQØÿ§°ì·(¬Ud¿“ÂZDV6}˜ +»`YXïá(ìXÁÂŽ”ta +Ö"²‡¯°5y +«Ý°(, +‹Â¢°(, +‹Â¢°(, +‹Â¢°(, +‹Â +(, +‹Â¢°(, +‹Â¢°(, +‹Â¢°_¨°…EaQX…EaQX¶ °(, +‹Â¢°¥RXÊ+ +[*PX…EašóŠÂ¢°(, +û¹òŠÂ¢°(, +‹Â¢°(, +‹Â¢°(, +‹Âb(, +‹Â¢°¥UØ1öpVä…EaQX…EaQX…EaQX…EaQØÒ¢°ù +kW…EaQX…EaQX…EaQX…EaQX…EaQX…EaQX…EaQX…EaQXÖª°¦¼¢°(, +‹Â¢°(, +‹Â–…EaQX…=´…-CaQX…EaQX…EaQX…EaQX…EaQXöë6ˆÂ¢°(, +‹Â–ha7QØC]XÜ°(, +‹Â¢°(, +‹Â¢°(l)@aQX…EaQX…EaQØ/ZX9¯(, +‹Â¨°”W…EaQX…Eaqâ°(, +‹Â¢°(, +ûÍs‰Â¢°(, +‹Â¢°(ì!¢°(, +‹Â¢°(, +‹Â¢°(, +‹Â¢°¥…EaQX…EaQX…Ea-óŠÂ¢°(, +{¡°–…-–W…EaQX…EaQX…EaQX…EaQØ藺¦¼¢°(, +‹Â¢°(, +‹Â¢°(, +‹Â¢°(, +‹Â~Ï…íGaQX…EaK²°"¯(, +‹Â¢°(, +‹Â¢°(ìa+¬Y…EaQX…Eaqâ°(, +‹Âþý:júÌã�ÎìlÇmÕz®Š Øé?ÐN÷˜ýmgº;ëzpŸ¢rÔ£¶×ŠœÚz`=Q$$ÜÈ ƒ„#„„#!B$$á]»³º³;⾓¯Æ.A¤”~™÷|'ùæyžoxx^χ¶š–v^„5 0xœÞr$ƒ–ë‚O +K +ûSÛC +K +K +»„…5›FLÚN6…‰væ¨ PÞðð®ó+,ÑXoA|Ægƒ,),),),),)ì¢Ö4d~ØÓÚÎŒfùúçÿmGþö¿ ü}'Ë7 &2JÝ&×¼°zx:ðRIn@©R·+:ÅͲ¦æ–&i‹°®‘+ò"ÛpùB4@J•ª§D¼êÌã˜3[a-1Iag%l—ºˆ}ußka»ñšˆ¾o%¬õæbÖŽWRØÅ&,Á+)ì¢Ö8(¡gPVP~³Š¶Þ‘¶ÑiA³a|øéÄXïHYö!}ƒSCJšaôñÜ„íךšeU^aqin>‹ž‘ÍÈÌÉÈʵ&3;oÒ¼l™K´/xPTÁæÔŠ¤r¥ªVêƒo(,dïí×££¸¹EÞÑE +;£°¸9¯r¥º¥]Ù$mklj54‹›…õ’jn-‡+¬âðKË«JÊÙHE·š'ÄýA¨AR'–Š¥mÒ¶Ž6¥š +ÏAX±T.‰ñÄÖ5),),)ì’Ö04ÒÁåÓ7»Ð·¤oùh!⼶љºv#eùZʲUÔk_wÞ[ è©«K…õ›œÓ\è[mù£;n•s¸†á‡³3Ù,k‘3+'?;·`ÎAw„§€UTZQÕ(‘¶ %í$¼öhû+«jÐRçä1em +t!…JXÜlïèfWóŠJÊY…¥ùÌ"L–`â)ˆXëÒ¼J.Þâ4•Ï,ÄBa©8<¨Û +=ÍÕ.Ò¥QXE—–+¨Ç ™–3Xe5Ÿ––vÉk}Ìܾ޽SR%ü¢,_“êà@{5ëÏŸW†¨‰•$%w02•™Y–d+Ò ×oÖ_½Æ9v¼Ì/�Íèk7¥88¤ýz¥ÜÍ[ÍC½Sg78ÝüôwÌÖàÈ謄5˜†ªkøØ!§¡»·5³Ò\âÊÖwvkôÆ¡i„ëÑØÚ—ù Þ¡1)ì¤Âv¨z‹K+‰éµœ‹æ|4z/1ZIåm«B…ªvaå½’üdÛþ‘Ô‰[À.),)ì’Ö–×%/¬apXÓÚžîòñ;*i›¶PÌ•éêºMyŸý±!&VSÉíÑüËhúÏ“Çž½˜âç¿ÿ~úlôš¡±A*“ÝJ,÷ñg¸|ŒÚ–òþj\iŽ[ÞŦ;o»ç¼-Ôݳ®± “3«¶©¹5,vHÔ#ˆ§¸R¨ô»÷R*1¾¶}íÚ`÷FIÛÐ$…˜–bÖ^Xn ¸´Â"Åë.W®^Sõh§Aö—+¬¥€-`ÙΘÝAˆXbEÆ-ÇL'%\æƒHÜÞ©Q¨´S«ÔÛÌð¬ø‹—8¼zàK +;aù¤°¤°‹GØá‡íE¥éÐj~kC'šæð«¼?üIQ•Ï|:<bÕsŒÈØ�ûüùØä{ÕÌÖݱ`LNgpŽŸÈýô÷©xʼŸ 27:ܾó|Lœ¦O§7¾¡°²üÚº”4Úµë7ãâ.ž +?sô؉ àÀÀ}î‡—§§·›«ûÙ³‘¯Ù¥1üüö…ùêhÄ™³ß}ùƤä{)¸ŸWð�ûݾ ÄË+«»5}¨X' +Ë**±zÁÓYùü¯x7‘ÂN¬a•ÝÚ +v €Ã<c¶‰ §gdcòï§Rï§Po''&ÝMLJ¾t÷¼bbÑ�ל܂|f!Ñq"¸X”´856·)&”±fa»Æ›ÇDû#G¾>!mëBRXRXRØŸµ°ò’òôÍ[çKX”–”VS?\_îíÛÇå=ÑÆÆ^ª:%¦ožWÜþïé³'ºuiY… uå:ʲUfjçéWÈÜäüån· ÐrÅ€ièÍ…ÕLÚ~}tt¬››‡————7<%Tµ¼5ÇÛÛw¾=wÞ*,êÙ={öúøø¡ vuuÇÜ =pâ›°KW°KÛíÞØ‹ËP™Ú!‹·|a¶h¢¼ÂÎÙ#ÏGGHa' +Ûe)c,N5ñ¾?ýcÇ¿9|ø«‡‡"þþ{pLJJ¾O¬–ãÊÕöí:tèÈ×G‡Ÿ>#02²'y±‚x[Ív¨ú&Ô°½MRyFVñÇ�©qºÂãú’'ãSRØ%)¬=¯¤°‹NØÒÅ&,ÍÉ%í½•9Ÿ|&N¸ö£No-WçÖ)*\âçéÈC#³lÏ^ªÃ +êš oÿ‹@Ø#®î»Ü<šše³1˜†êÄÇPº…œ +À¦};)™FÏÈ+`±9Üj._"miWvñjED¥i.3éYØQOŸ>SÁ®ÎÉ+¸{/åò•„ˆˆ³µ;vìòôò>>&%†í×Ù¢’²Þ~½-²xé×UÕðiéiTzTt,FÆ W~0 ÏUX{d—’°ˆJ£k”´¸ººyyzãœãííc9yº»y¸îvÃqhïÞýHPPèa¯&\Gc|º{—+Ennîh€ã°S§¯ßH¤Ñ3m×ÁɇÍá·+{l…E]}\A=þÐåVâÿ€@Œå"ÉjØRXRXRØ¥%,l¥,_Kû`M}lü“Ã;„u²Ô>{üO£TVî·'ÕÁ²r¾Ò[ +»s·›xöÂ"ÆÁa…²K"kíèêÖôéŒC#†ÁaC!zL»i#Â"؇±-Ÿ‹ŒÂ°†¡´ï×;U=²Vy}£„UXwÁËË'0p?ê&¢8µ"+¬kD/Û2o\XXøþ _?__0QZÁÖgV«3ŽÉãøÆ?°Ó4¶š;ga;Õý]š”T&ÙÛÛ÷Øñ“ñ¾¿{Ÿ’Ëd×8<‘@$Ô‰ùÂFæƒbbæ!,õó¸}ç>‡'ddæÞ¸uç\dLpÈž^îîž7$ä‹K—°Êhl[Ì¢½µ’%„E”jÝí;)ÁÁ¡A÷蘸ßfåu +a[Ç5P±eW&W“Â’Â’Âþ|…¥nØLwrFÇ<}´À¶Nt?O´}¨ºãVs=ûSkŽÁI‰–¨+í‚%R«°¬"ûmd”V7𲽃 /F�ÇæáQ¸Æ*,>v*°Z‘Mgd±9\|Ik «T©+«jhôŒØ¸‹Ø¨AFJ*µG«ëÓ§Œövª{[åQC›“Ï,DÍÅÈÈ6'+oyQ›¢-RXâ£ve·DÖÎáÕ–”±sXŒÌ"˜ +fa‰@ÔØ®TMŠì› Û×ÙU÷ê{ûˆ¦ÏУèîÕ«4zÛ¾ÊnmqY%±jÿg¿ÎcšLó8€»l6ûÇÆÌl¼fg'ëdœ¿&³ÙÌf’ì&3*åPä]VÔUnäðAE@9-Ж +½¸ïA)Ж´”¶”«(N²;ÉÎfÌŽî·¼ðòZÑ ˜—üÒ´oßçíï}ò|Þ/!,ž^ŠKDzÓ¸Î�âdžŒãzÓ$ܬmlcp¯Ä'zyy{{ûfe3Éõ²&Y.¿[*Wióª‡kZ1ÃÉ7oœ�ÐÁ!á½2ÍòÂö«Ú»zëÚ$åÕè +KÆáñQÄÌ44wt÷*m¥…¥…¥…ÝÂ:îÎûù¯Š?üx¬£“0n]lµ) û㜒+*®È³ìŽk/ìBUm…홶t1aQ#”2[Æ,uzc!‡w û'¦®Ä'ôÉÈ$[U[ÏåÍ;»BçexEŒY´z�I*±1ãâèl_„ìÒ~Ų«+,ÎÁ¯@üšúf¸¿N4FíŠlœ@á…È®\Xji+•ÖPVYc#,/ÀeÕ:#QpSÃÉø‰Q�Ú~_š“W€ÅMHL*ˆÉž±.]=2•ÖC•ƒÆö.)L$.›—_PUÓô W‰ãàuQajÈkÄ9Õõøç!f`©™ˆÊ»z¨ÈÒÂÒ®PØZØõ–í°‹µyËÃĤ§ÿþÞŠÚ3»àu¶æ¡ºöÞgŸ³~±Ù®„´ÀÄW–tvbjº§OV"ócA^FfNâµë‹xE"¯\VQÝ'WŽNL-më$âm׃^ÕEwé…›6Pk‡g]Eaq‚jP_ßÔZÈ)æñ_Þš ÕÙŸPXT}c+oæÙfa©ju†±>…æÆÔ´;Äc^Ùœ+ß$¨u#Î6¶Ü'™p«ëZH^ +^{åÚªÚ&ÄUë´¬`É„â ++¬sÈÒÂÒÂÒÂÚ¹°¬-ìM¿ÔŠÄH‹v]—rö‰ÑÄ?~a¶Ða·½;aP ’{àÊ…%jÜò¸»§Ë»Gl×E\¾ŸB¥ÁX\A0j®%%ž4-‘aqV×6€0ꞌkb, +±‹(¼'¿ÅÆ~'#kÈ0b4/cÿa]*HRaëÂÆø”ÆXf~qÔ²zÂÖ5¼š°D!Õªt¦ÊÚÆâ{B¢Ut!.¯²¶©uVXÜ 3íéq¤¢ºqÑ«ÐX£«¨¬ŠWü’%£Î@ÏÎeËTZXZØ7OØü7NXÖ¯·•þñOÓ*ÝE×ÅŠ³â¼üd‡…Ûv¾Â"ɪ‡vHòÜ=D´Š+ˆË*Iao$§89974·-Œ±¸ÎàATVÉ¥ìÕبKJE¹yìô;™.~q.8ìì¹ø«‰èDZ +:õ.²Â‚Wiÿ�:¡òŠ{Á‘¬fÊí´Ø¸‹Á!áÁhìlÈ”4B|›Ç*ôô<‚ç ƒy®„E)µ&õÐHyU-¹4‰×®GÇ\”«ô6ÂBC§ƒŒÔô,·éµë¡W°™¼æ0Y˜ +bf°dÁ!a7o¥’kÊ.äzyÍÍçÈTô°¯.l-,-ìš Ëz{÷Ý÷ (ŸÛmt]PÏf˜-‰Ã¶:p·8n|a!‹(Âzyy'&ݘ|4=26Q]×0/ìÍgg×úÆaéÕ<.š³˜Vùì¢è˜þþÇÝÝ=òpsswu=Ä`¸;v¼°IWH{î\h`àÉ>¹r™ûz‚×~¹ +“áGK…’ŒÌœ°ðHoo_tu軵17<<€´M +ëï�e�¨ý k„°umäð[·ÓþÖÖ)EŒ%…%VÁp¾–i#ìÀ ±[:€o©3ƒY9!¡~~Ç0'óKæäIœIëããy>öAŸº_IKKk§Â²ÞÞ*øìóMˆWj˜íé—ÿä“œm;–Gv]„}aåJ g.TâÍQoß°°Ëã'VakÛô‚°³éURAM¯r-)ÙÅÅ ¶ìÒG¼¼CBï|“p#9%%5CÉ°ç‚Caîý=ËÄØ×{e/¤W¼/âGFEã.<fsqv…&‘Ññ ×’®ßL¿›I¸O‹®Â#¢Ôº!ãèj"1WE¼at…ÂÖ7µ“YÝØ°ª¶Y3d¦ ++•ácb/½ ¬ÆÐÕóBzµÎ—u>ÆÅÕÍcnÉ||ýã.}5>áúí´j†õõõ‰è–*iaiaiaíSXÖ–íÜÝï=^"½>·Ë?¤W›&ÅŒ»Ø»–Av]„‘FóØJ„—Ò~•<lÀe)aš[©ÂèòÊ*¯BqyLììÒžžG°Q#ݼ•ÖÙÝ3 Ò"TNLMë†M%BÉÂœèz ý …×è6éuúÌY@†Æp#`"¿€ÓÙ-U¨Ñјy|ª_¡&æ"ìùÍЛšžÌ˜•›¯[±°•5³KÃ/ÝÍÈÞÿÕ._8¨](llÜeRX…Æ •iJ…eÔ™ÁùÁ!aîî˜×£^>ÙLv}3æf@®VéÌݽ¶Â†Ft÷Ò¾©ÂvÑÂnhaÙÛvïûø[îù¼êtC…Lfžüåæ2ÅbÉ¿¾ûΦa|,‰þâ蘽óÝ¥]ka…’“A§ýý†Mæ•;6ù¨±¹LCìƒáâç`™þv¡°'g„!d€mli'u&ÒktL`Å^íá~8éÆM½qtÜ2=2f1NÍ“¥Öêï Ä«*¬Vo’”WQ),â:Å@¿«€32þÈ8jÅ8È`FŸÒ>ź‹ŸËÊÉ;|Ø+#‹¹BaU:SyUÝüÒ$§<ÈÈÌÎ{‰°êa¨Ü&½þ=ˆ˜<›eå²åjƒræ|¹J/SÉTúÖ·´°´°´°CØ{r7m®¬^ŠWƒÁøÅÞî°ÝÁÑaÓÏ6ÙÏ“É´‰±øøÃOÏ…‡;9:íس(²k/ì©Óÿ€+Eb„½úvêä»ÐÐðE3,ƒáÌã—Âb B5ˆ-—üiìçq.éõË/¿âpù°Õhž k „š]=TDðzæÌY4†‚8u-³°Ggk}„m™6›‰I[©°:S¿R+”T÷X"_‰Oprr~©°Cs[7oî["½†„†»»{zxxzyyóe°U®–¶PZXZXZØ $ìŽ=¬Í[úÒÒ¼>[\ض¶¶½|ðÑï?úôŸ^¸x9=#ënföºWjúÝƦ–E¶X¦þz`¿ï{¿]¯«Tk_öÔJ…5[ÇBObl‰Pu>{rBbÒä£éå…ÅX›œxýÆ-WH8†#SOfrëÄZ +:õF4C6†ŠŒŠvss¯˜–¦ÖNÓ˜eÞÖõ¶¡¹ûZÂ"ÀvõÈÈÄÒ`œ\¾pP?º”°àµW¦ÁS—,"âüÌÌxúøøÕ4´©t#V[‰¢…¥…¥…Ýh²Þz§lÿÁ§ßÿçÙb–�«½£ãÃ}û~·woàÉ ‘¤ˆ=ö¥‡Ò¾¥zEom}'þ7ïÿýz j*=ã�îôCgÚé‡v¶ÝQ×êzÇÕnÛ™~Þý¶v•[.à $‚ ŠˆÊÍ+*ÈE®"á&„î$D!$!÷€ˆX§;ÕÝÎ궅þ“#‡cHbt‹sfžq˜ä=ïyÎûÆ÷wþEkAXµÖð~ÂÂÊnIy £8œ�g×’Òr´jGX\«Tiù¥äÁ›Ë-ðöößþ}'>±€uÁ„Õ>ÆPm'%߀øà”�5lÉëb‹ËÛ:%ï)¬Ú(lí$¯Íãò|}9nnŒúF‘B=jSX¥¾uæŽæ•à¥Ë‚ڻ׫²¦fy¥…¥…¥…]nÂæ¯^Ë[µö;~Ú¯Ta7mÞW>s/záì•öö[íyjjúÕ«Ÿ,ÖŸœn®]Ï[pa5z#Ž¾w ÿJûÈF)©é»wïuqq“ôÝǵv„Åå]bò¸Æ6 a±<˜Lvꌉ§ÿ\,ahMmÃLL«ä— d«ïÔMZáu1„UjÞWX•aP¡-¯¨.){½/€+ïëë×Ú!‘«Œ¶„•wî+C@yè+Ãd²JË«åªÑ7x¥…¥…¥…]nÂæýìW½ ×m¥×¹ÂFEÇ.a‰¶Áç[7oÙZøæ³/5a#ˆÔÆšEm?ƒ‘éð;Ž w4ø¸|Dí;öx²±©…<®‹ø¥îîLðŠ”j½al¾°åLXxWU]KöîуÁ¼ž”ŠaÖy%…ZâÂ*ÔÆ!…¶¾QH}·‰ˆŒÂ3†Šè ±),Êâm +{Š¿’(Sk +û€––ö}…áu!„å~ºZð·o_þëùÇ*ìóç/,柶mK[·‘·$……Q3vKúÝȧÃ:'$&™1b¥gd3Û–úüÂ….ή=Ò¾ÑñI[¼Â+Õd·ó+,¬L©+Dcx¨Óá‘hùnDcx‹°†G=’~’¼¥&¬\e)uâÞXmlÁ¬wEî6.-#G©£v„%ߦ—±2A]’‡C +½%¯ofXQ‡„|›¢…¥…¥…]‚Âæ¬X1RZ6m—×å+,Ñy||üªÍ›ŽlqâSq„õ9D +;XÇŸŒO<U€LPSÇ7'5*¯™Y9û÷`³=qÎ÷HzÇ&&Á«ãÂ&§¤9;»?yö^QP¾³GJ6€?Ž›Oaå*]¥à)왳ѻv¹¤gfÇ'5¶x5‹ÞjëIG ¬÷‚›™«Ö?²¶bpßÀpíÝ&&•ÄU¸üDh‹å±k—scsÁ¨ƒÂFž‰vÞår=9]¡³`)¢pëYaŠðS¡…¥…¥…]:Âr?YYëÆøÏËWSSï"lÌ2V¯7üvå§ùã—¹¿_Ï[<aŽíÛç¥3ÂÕ§ ÖeŠ&a+Iœ½ä1K|L½‘áé¹'¼««{JjÚÄÓg¯v„”m³'9¶‰s8�´á+»vbH>B½;Ú>u:iq^„%ª¦®ä €Ç?pà ¸w@g·%¬é*ýX´¿hÆ}\ÈÍ/ôññ[0a³sòöìÙwéò5™R;#,†åIÿ`M鉨‡KPágÀ+“ÉFŸ*ýøBgGXÙˆ¡ª¦ž\< V¦µCŠ�kSXÓÚ–öžâ™ ‰˜¯ßñZXZXZØ¥!ìšÏ¹¿øµ²¢òÖBØÈ3QËHX¼<üøãËoþúͶۣ7m)Z³8ÂbÅN„žrscôö?è‘öÝŠZÑ<ŸrH’¶¢.\¼Œ³¼â’Óá*s¾UX㣉a…ŠWTBø…ÅÍGÇ'QÆGO¨E|Ò-îÃùL•‚Só(¬nôqG·”j%Š:TZ£~t!×¢0Db�¹€¦*¯,ä—;½0Âæóø†çÎ_VêˆÉï?”ÃÊêڻťs_ŠpaTLƒÁb³=±}õ-r•ñ-Â*õ¢v1ueò¸¼–¶žAµLi„³ +ÝCùëTè0Ûý‡ÊFa»ÅÏÆ$¬Ï!ZXZX…%x¥…ýpÂr·Z°Óù§ï˜za·:9âÆçE·ÕAaÍ5œ’òÙ¦ {¿ø"ßñk—W…¥¶J"±Î ä€ôÌ쀀@$ ðêîÎŒŠŽ˜äÕŽ°Ð1¶IØJœ¸#¶¬±©¥SŒTHT{—óàŽs›°g£bç7ÃĪšº¹UU×66‹Ú»$]â^sõµ´v",–ヂLX¼=v5!©Kr÷^KY…€V÷.—Ëóó;Ln\IY•R3&Sêì‹oAaum9'ñ#AU +jëš…] XÔÞ#ê76· îܵÚ�ö—Ãñ§…¥…uXX:Ã~XaoøùÃŒ,GìrÍ‹D·nþzÇŽ¬ux",Jg{#‚Ù(¬·«°¤y܈È(d6˃ÅòpqvMLJQªµ¼Ú1V¥5jê,îBË&Ü‹Ë^—5å‰Â´.Å#õHçMX$ÓA9ì¶ÖX9ñÖA–ÆpyhhXèÉ'¬±KÜ_Rv›ìWTbêÇFKØ;°‹å:wþ¢——76…›•“§Ôšx%…ÚvP®Å�éÀ01›õ-›];+Srâäñ“TaûiaiaiaCØüÏÖñ>Yùê‡;`?a +ÅW_µþË?$lØT¸PÂ>žü‡}aq2£p†gdÞÈ>€•ÍöD:zôX³¨müÉ3ÌcÁ«…° ‰ÉTa‰;¬PÝHË4Ú·«YF“òæèôº± +Á¥ø«û÷{·utÏ—°(ýècakGöÍ\´íÈ»ÇÜÆðÃC€=ú@¦ü@ÂvKÞèÁFŸ&[Í{wåj¢÷A_l¶áÎôãø×7Š”šQ’W”Li@}CX·YaQ²Cmƒ03ûÖ;U[¬Lȉ0ÿÀîÞÁ™†–ö#–àu9 +›÷Ëß´‡Güï¿&>za§¦¦_¼øžÅbmܱ=p‹ß¼ ,¦ohB‡„§Haå•Õ8cqÞ¦¤¦GÇÄ9UYæÜŠhÃd²sr¹r¥b"Îå3‹Ú:‹ø¥˜³]¸ïêâF…¿y…Å8r³næšîhÎYDÔ2µT! v36îBBBz#š<2î5‹ÐÃ| «…‰ZãÕk‰‘QùE¸¯ÆðV Oy6+û2>„)AÁœÃâÞLøA„•Ü'3¬UîÑÆíªš‚Ââó.1˜llvm×NçËW;Åý$¯aõÒþ¡B~ ñR„gwscP…Tèî©._IˆŠ‰ËåòY™|?"ò,P&¶åïÄËë`§ø-,-,-ìb +‹�»jíh{Ç´cv¹Kô¸i›ÓÎíÛ‹JX”alÈfdÝ„t×’âã¯ÅÄž9qÒÇ×~yÌÀŠÐÊfy ·æÜâÊG4ðqt|ÒÌ«ua5zc“°s^ONÝ»w?¢¿¤Œ*,‘d‘°pøc@Tt\rJÚÍ[Ü[¹ù9”JÏÈÐÁÇBöìÙ‡608îÜE|q–í± +Tß©›Ga5ú1|¨Té¯^»Ž·Ç¬§edåPÃè35-3&ö<ò §ç“½ïÿì×{PSWpfÿØÙîììÔº+ *ZÄý£]ûÇζU# ˆŠVå¡E@PEm} ""ï‡<Ã#Þ/’„„„$„ÇPw;;mµu•ÙormPP‘Ã|î=÷Üù'÷æs»÷ TŒ¹ëççyº»ïmhš#aÙ\a½˜¢ðÅKQ.¯4‰Éi˜êÅ//ùøøíÚåF˜£þ¸„„E0Êk½Êîž>-¯Za`Š2Ÿn†Ã>Gu…åhåzÃOÖ¸ðÈ3Q¸Þ¸‰+sãn¡C‡}Õ+³ÓyÏž½X49€É@ùÚmDX",Ö€Â&-6ÎýקÿýŸÑ…$ìåË——[˜¸ÎZo5,Ò?8ÜÁáÚmÛngGX0up؉`ƒF³ßºu›ûž½À—Y^Õ-”¨†F ã/¶þº°²2… +î¨ivr¡(Të +‹sÑRZVxì“O>Ãw/¾º!©«›»›&ض·wÀLÐŽ`¨ÍŸm 8 ý1±šFÌêõ +K!+–*ðÁyxxmÞ¼‹ƒKÀd¨Y¹ív‡ºÛA³Ç|Î_ŒF7ÀÑöíónní˜a5Q´sºãâ“¢Î]8!9y64,„í÷>ˆ÷"L‹ƒ`Ùmm·ŠŒÊ/,å +{(]E2]^u…E„’þË_]ÇYêwª§"Ïé +K!ÛÑÕ“’žíé¹VÆŽ¦^·q+ãøbev8àåêd„eªî×7³g*¬.¯DX",ö…MøãŸk‚¦_À¾ÂæçÓMÌLÿf³îºÙŠ} ‹Ð‹ƒŽõôò:v<"âô•+Wsréíì.ªÞÔÔãlTX ²C¹ù°6…„œDO]^u+YjnaÝŽÿ"8äÐ!ß½{½ðE¯bu\w{zîóõ={'¾…Õ”+«ë0Oß#¨›¤ +Õd¼ÎZX +Y©\gË*jðvtìÔ³îîÚ‰/¯ýG†…E$$¥±\•–‘}ØÇ£–`—âõµ‹"T(QàŸ8GÇç–AvîÃz ëí}0èxpBrzs[§@,‡|”®àuJaái}kÿþƒ¸L”±f5O(ÓVl7zÊ€#£´:ê|´Àq°NŒ‹feðqãÈÇ÷è‰ÐðÛq‰ž¨ïN|2ôõóÏÈ.dóz;¸b",–k(aãŒÄ¹ùMX«ý½¿.¶¶Ywf…eª…¥•Ê•B‰T$‘ +Ž™|häáàð·C#mX_"¬Ùþ!L¾¦îD¦˜LX³ýƒ#òþ!6‡ÿ ©µ¢ª¶¢º¦Øåð„8â1ˆL¡Â”„bOУP OÁë««uV¦À…AÃoÚؘ³¢šYQƒ”WÕ54µrù"t@Ä2%$•);yB®�›Z^çBX ÉæŠnÅÆ{øÜËËÖ¯ÐpT PµQ^ßØ +=E½Êî9æHå¥Â"¼±¥#4µtjyÕ–ÃW‡r¶»GÉ披Ze5ôâ2zq9~—WÔ4âCãŠú¸BY'_Âæ‰9ÝÒféÈÀ+–K„5 °wŒ~øöáèöûïøÝÞYc³î¸åÊ4= K %íSBXlôS-ê£ýêLiëTÂj餀ž‚W*U}JtÆ)ÃÚ`·O9¨9ªÒ‰º3ÊÌ9V1:ËUè¤Ò‹ÈUêCR…XSPKi;§ÂRÈ"%{¾8Êpå-‚C(Hµ¶N_X®�£IQðb[ËëDa_-艀cä—³(XµQ“ÊC‹„âõ¶žK„Â&-Yšiùþ“GGG°¸Ø|dni¾jµïª÷ÓM–éAXµr%Š±"³°¸´ª¦^$–>çõ5 ;ýPhN]^U[Uúv²hxõtbæBXgµ2*ã`©°TtyLXT² ¦cÂwêØŠh´Ã+–K„5”°‰Z\á¹ïé“ÿ=[`Â>zôxÃÆ +?ðX½:ÙT5lŸRUPT’ž™q?ÁFVn~Dy}5,vN…Õ…Uoªaå÷¶sD,¶ ³»ƒÛ3ÆÙñÂJZÙüf÷—Åi%Âa‰°6á÷‹šÏDMßÖÂ6ÌoaúéçNN–kV»¬^“0÷Âöcd¨ª;[ìVÕÖãY",v¬°]iW·¬¹•SRVWÀÈÊ¡gçÒŠ™um8ôÜÙçÂJ°ÛÞ%*¯ªG7<™ÙèÙÔÊ¡%ÂDX&vÁ{Ïè·ü¬lˆ9caçy ûó“'ÞX¬ZõéÚµw–®H_<çÂÖ64Žö~v^ÜÝ„ë7na‰°ã„…¡í]B³2ó~N†&Ô=Cm—”7³º:º„ÜžŽ.˜(¨¬mÌÎ-Ðv£zâkiçY",–ka㌄ŌYÛÉá|øÑGV+WÎSaŸ>}±ÜÊòŸk×ÆêEغ†¦‰ÂÞOܼyk«£`˜K„¥ÂöÕ5¶ææeŒ½atõDèE%%ÌÊ"F9j[õ¥Ã«¶½ˆ aÕu.–K„Õ¯°IKÌR›(êêg!¬@(ÜôñÇ–VVóQX +Ù«W¯-3_ñ÷¬cÌÌ3%콤-[l“RÒ†Fˆ°DXí-lݺu²dŒ-o'†z…»ý5êÜN",–«oa—¦üÅTYß0aÂlÚ4…Å%dee›˜-]om}c™!…µµµ‹¾tepø!–K…QZùR^§“û9ù±wâ·mÛά¬çð%DX",VÿÂ*Þ.a[¦-,“Yfljbacsu¹…¡„MHJuvÞuéòWDX"ìa™•n•Y<Ù¹ôГ۷ӮݸG„%ÂaçK ÛÝ-Ø°qã›&ljúýé×°¥¥LSc‹õÖÅÅ•K„Õí-íܬ\zVN>ˆ¤ŸHÕ¤Ó|pká¬k×oººî¶ßápõú-",–«waÍ’ß3–×ÖÏBØAöî¢Ež^xðQ<B·×•1+^3²ròèEýªé\%¬±©±Õz›³æ–™DX"ì›!¬Y¡¬¾‰u:2*<"24,ÂûÀç€ò°_ÜÝÜ3S׳8 +šñº°ËÕÍÙyf_TRÉáKˆ°DX"¬>…M6YvÏÈHÄ(™©°”P &&&%5•ÕÎneµEb¡°çÕ#‰ûä +…²_¡˜YäråwßýwttZ×B »ÄÄØÊÆ&ØŠK„}s„íHÙ<ñ™¨‹[·ØÚÛ;:::9:îÜnGCBÃÂï%$çä€QJ[m¨š7%-óü…h//oœåìä‚ÓOEžcu +:yb",–«waÓGŸ…°RàìéÓgÚ]ƒÿL“×qž˜‡ÂbL"ìÛ*,Gƒl'_ŸêpÌ×ÏÿdxdjzNCs{ø鳨gýüü/_ù:!)%)%INMOLJ½s;øD¨‡‡§““aqké6 ¯lîx^‰°DX"ì\›ðλ-¾9¯ó=óWXL¦O©Kû¤r%†¥¨ýUFµgaç°²üÿ³_ï±M]wÀó×öÏÔMÝþÈB”×Æ›&mê„N…†4e”ŠŠ˜ +]WÐD„ ¼_k $BâgÇvìÄÎÓ±?âë÷ûÛyºu…I¥C[º¯}Iæø'q ¬7úɺ9÷Üs~çØ:Ÿû³û¬Î�Ââ˜l>ƒÕ‹vfïÞ?lÚ˜»eËÖ;v¾½³pçÎßoË/ «Ýüü‚¼¼m[·¼Q|ì#._¬3»µ&x¥„}Ñ…È+%ì‹!ì—ÓÅ…»ÿý¯'ÿIºúûÿˆTX¥ÑêlNC]=¯KÞãîóÇ4NÏáò"\ÞÈ>36¢Ùí9 »;0ÛÂFß5ÛûR.l0ÌU-Âhóªs]ƒ¨èHÉž={Á+~BÛQÛîÚ·ï½²s—Ei¯Þ®·x£‘”°!^)a)a)aS(lUú\ÎúŸ?yüÕ(%ìt…íövx$"ÐH>Žë™éÕ0Á&ã^-£IܼÁ+T¨4Lv=:Ü«¡ƒcÖ0saqMÚñmNÑl3„…Åîv¸}}!¯1 nê„ þ‹Ü¾|šnKX˜lîP‡¶)ÖêÄSA²ÍvÖhëÕšzu&|ª \˜u&TEt#Á aƒj²f‡ßdï“õüF Y_]Ëb°¢VT¬¸[qAò: a¡3ZÂû¨u;%,%lbai”°…ET¤¥=~øä<wõž±°MMÍ3¶?Ôîõ,6G·RÝÚ.m–´5ð…¨1…MI[G—\a0[]^jÏ +ë¶9Ü°°†‚Ð-á%*®Á+ 1Ù¼0[dÂ’ ÍduÈzT¢æ—L xx ¥®ž‡å7KÚ€Çêtº}$Í)–¼kwÁ;ŠÐ·Kå"1™ID`ÿ›ÄmD¢È‰°¤˜@P5IÚ¤\¾kdÕq#ÖÎzºv‘¤U*Wz³Óhs›ƒÔzS"¬ÁâÁ'at¨µ–N¹ªIÒÁå‹Øõ<6‡‡à4‚ÁÔ¯›[¥ + 8Ž#›¼°½CIXd +-á%<¡˜×(ˆZš[»ºZ…ƬÒÂY;%,%,%lRÂÎ˸•–6 ïþzv„ýú9Fâ?:ñ“ùó§',¶Ñß?@èPç-JEˆ^]"ÈÜÂ5Tâ76Eà8Õ¶Sa4©giéð^Érysá_ä‰Â“D6IaÑý\¡æò„5´ kŒÈ„œ%tV ‰€GíÒî^ÓzüƒÓ–¬UÕ„¾SÖÃklÂD<b·ÿ—ÕÓV-à a1‰ìT…ET¬*ÂXahøŒÑ_{ðK§1qviRc´„9; aV/¡·wuk *}š‹\iì4Byò…b8K"›Œ°°UEXZ;ºwpŠˆí þ˜™L6W$îè”jS©µQÂRÂRÂN*låw^Ò\¸4ÂbÌ/¿|üðá£ç_|ñðóÏÿh×ë ¯þæÕœ9Y«VMEX²nUõjQ¬á@’çÈ>~#“ÌÙ]Þ؃³8|ppÿ?öŒ"ºÁˆÓeç?.=íòúúCÉ‹q0©T®@UHâ2é2£WM¾ ¨T†i‹nøTôê¸c»=¥4ÈÎ]Ý* ›¼°¸‹OÞ,‰ñ³©.|ìgáqH¢Ñ[Hd§$¬ÁêÑèí-í2ìhÀ)¯ö¨ @vRa5§\©gsx ^!Ƈ -ªE¦Ô«BÈRÂRÂRÂ&öÎÓ…o¦\XøÙg;pàÀºŸ®]»nÝÊÕkV®y¦ñÊšµ™ÙÙiñþ~ðRVÎòìÕ«rV½ryA&-9a±{6‡«YÒFV¦Ó8x§',êÓ–vit‹É[Ûwl×-èI +Ëdq¢…½v½üõ×·vu+àubaCEî€Z£#k·™¯”¤VÖ£ö†’¥«Öh6·Ìh·CS-N‡'Œ°¸…ÎâÖÎII20;«ŽK¬@6Ia !^e +ä¡r¤3§™ò¯ã +‚šœ „Õ\í]*úØIr#Š’v¹˜6JXJØHX’×g&lUú\Ö/~ùÐM)²V¥R/^²xyÎòe+r~••» cӳ܌…›3…Gnæ¢ß-ÌÜ“‘ùNFæžÌ¬½K²?^˜…M¨MŸ\XT¯“%TÔ¤àà ö,„‰+,@´9ܨG¢çÅÑýщҼ¼|b4ÛÆ…åpù1WEeÕ† ›ZÛ¥þû yr÷DÍ-ô3~Ú#½É7“¶GE¤d·13dœÝíO,,ÚÕ„‘äpá¤G|¡8„©wRaÑ®39Eâ¶)‘/à{-ƒ£ÑÛt¦Ø¢zí”kB§>ƒÍ勺Õ&åd¿íÂ’¼RÂRÂ’Â?ôc_‡4µe,F3M?[¿>{åŠüeËsÐæe|¢v<æ"ÜÃ$!ìàðHRªº†>¦)ìÑcLJ +ÛPÇ,`ïTÝÛµëmÛÞ|oÿûýCH^ñH_-,æÊÍ}†Æè‰Ëkÿ°Åîæò…ÑÓ¥$ªªiZˆâL ,n9<~“ª°ö¿–ß,9~2°¶¯ÝJ =uoPQCg[¾ÄÂm^aæòR¶ÿLv}IÉ_îÜ¥cºhaÁ«L©ŸÉk^Ø^‡¬WIØ)a)a)ac;/ãöw¿¯<{n4u¼’Âz½}6n\”“³qvíØ\ßÌH,,Zz =còÃ<<&í\]C÷Ý}~xhøÁßã ëõ„ÍÑg ?yòT~~Á–-o4ŠÄÁ‘qaQF÷Ça›»ióÝêÚx¢zu¸}uõüÄç-æÅPˆèñ V[×®—Ÿ>sΊ'¬»¯ßâp#ÿI‰‰™FÌmGËÍO+7mÌíêV;<˜ÂÚ]þn%1éT¼I'];î)>Æâð'";AX´¨4&VwRïâ¥sÞÒSgvíÞÓ«³FgT kç44&˜.™Ÿ1ùxGWïX%K ûÎ+%ìl[•>µzÝ“Ç_Ž¦¬ŒÅPýs÷îÝ™K—æ-]F›Uaç,¸;gþÔbb> „Å¿=ª^:£..¯¡ãŽÍi� +8ÉËoVܸYQ~ãôƒÜÄïù‹Wúóý8¢€µ»¼1¹ÁÉVX¸+//¿èÈQ‡»Ç…mëèŠ~„Åi@ {ùʵá1…u{"IÚ°œÿX×ÕkŸ”½päȱ¢¢£d€œä/_û´â6ƒìóqlÎŽ;ÅAdcñjuxêy‚Ä9¸TÞ©¾xù꙳狋KÆÓ(>ZRqûnĆ“¾¶ù·ŸÜ¨põ Dkwù4:sâRŽœôVeÕ…KWO9{øp19ãᢣ%ÇO «×ˑΈz÷ /;wáÀûRkÍ&›7ZX4ö¨tÌ„¼’û‹›·*/\ºRzªlü+8\T|âä©è} +{ºìÍü¨Ukr…ó +p%m²Z:3Þzñy¿ç·0lp]‰¨ æÜÜÚ¥Ô’•l$¯”°”°ßfaiiLfž©-c:”¹dɯrrfIت9óoïåêÿ²_§OmÜgÀó¶ÓÉÔui‰íØÍøÊ? n§NÚc$Â&`îÓŒoƒÁÜØsâˆÓ€q1÷}‰C ]HHHBÂØÉ›¾¨S_ý¢ Š¢Ýe\¬ÎtRyža@ÖþŽÝçóûîÜ]±{_ÅÇŸ¼míÙW¶u[ÅΗD'¬Î°"’ÈÐaèúQUumvNþ7‘ÑÁ ÏÛÛååuÊß?ðô™sIÉ©å•Õ54ƒ(´hÃÊSJaµË+C£”ónÖ}Ë ¶¹µ _#x%„£¶áÁÉ“_'$&éOɼjtƪ«Ì½U\RÍýü==½ÜÜØÀÅre2X..L—ã>Äƃ‚BââÉCaœ=Nœð,*-SëŒéU¦lmk§åÕdk——u/',쌯¯?†Z_†“Éb0X_}é”–~‡î ¬³³KZÆ]¥f™,¬XªlyØN÷ˆ‰—•uÊÇÏ<)“¹¾w&¦öð8‰§~&'·€ü¬qóoÆÝb³O€!±Lm%,‘^±ì Ö€ª¬ª£!¡á˜Ó¹¹º¯íË`ºº¸0Øl¼iVSÿ ,ûDë£.…°àu”/¬kh&p$¿]9yx{×ÞdoŸÀÀ«×b+¹<^ÅáÁ\X|gïðø´]X»°va…-}ÿ7ýÑçm.lrrÊÞýû;:òvÚ^Ø2lá×ÛÆÓ3tCÆq¾q|â-ëÉäÔ4§ìÞ‡ªõ;@),xU©µZÚ6è{HsÁht…^wü8ãرãHj®,74|''g´ß/—–UR"‹nõ::{ô†'ddAgËÿ“€«ÎED¢Õû©4Zs€E!öNÎÌÁ}r“÷ò>…”·¼b-¬Zk*É—˜çBëFJug{`F"l ¬@Òk×c“’Ó`JQ '-ãNBbrTTöîãã†L'=ã.4D”+5V¼ÊÔMÍ´é·ÿ•š–é}Êw›mºÛ¸±-4ìô¥+דR3ïf#s•UpÉצgd‘…•+—úG7Ø;B\ø鳘…Ÿôf<ìÊÈÉ/ÎÊÎK¼zíFÜ™³XÎKµ¦¤ù“qꚢÏ_<æäéÄr¥°b™)½ÖÓ¦WâþãV›pw—x +Ȇ‡Ÿ½~#>.þö½û÷óŠh3,IØ)¡¢½»šênã’ìû¹nî {m¿–³óq§¯œ0|¯Ùð¬¯;z†€¬]X»°ï.lÙÏHزwÕýã?– ¯m‡,„åVW´{÷AGÇ<$GÛ +»kO™Ãvi}ã›Mýûþå«p/¯KíÁª*è„5®ŒŒñ){>Ï”§boÞBÓ#:~‡æå>î잙Ή%‚9ªñAKFæ]„ÇÔôL«le*¯ ð©—ôÀÑ’Wü)U¨êƒÆZœ,-‡b ¦¨¸tyeÕÌ+‘aÂyòD&†„„ž<#gØΞ~ÊbÍ`+88ŒØ#~"@a/=}ƒØ#–§PiÖ%ÜI3³b˜EÙ‡q*Àš‘•KË–ÂâÂöŽî x…€ÈhòX°Ã/ø³²ºvx§‰y¡D!Q,*µj±«wÀ +Ž „•-`Á¸Ãº™Ö;)¦¶šqXQiùàŸ?#š›Wˆ¤*™R+Q@L¥@$çψG&fZÚ[†s||ý¡s[{e†ÅÓsR}zÅýÇ).((Ô}ýþã]Š¹p™ËkìâLÌN +$“³R¡tqF¤¨[{UÞJ؉™yÄ]Ê[_P|Êǘ+$ôtÉt´³o,ë~APpž Þ=Ê7Ù\}Cü±)kdÿ…µâÕ.¬]Øÿž°øóË’ºzÆX54<¼mûv›¼w¥M…ålÝÖîíûêÅ‹M ^¿~óüù÷þâ‹ÝŸñ>xC#ì’Þ€èA×ú®^½ÄŠVÏbºÆ\¸ÔÑÝ‹¼ixò—ë+æÆÕgˆ™”Q”èiˆ]gV8¬,�¡°É)éh€žž^S‚9èf%¬p^VGŠQø$""*00ØJXØ9±”DL›0Ño±ÈN¹P,Õž`–Å%=Q*n½ôDitƾîz0Äà˜8¢*ªj@¡™W|¿£«—ŽW\˜“Wèë@hbãwöÂS˜VëðQrÕþ$6V¡†Èt‡¨¸ødRìúܹÈú¦‡2å’\¥Ãå…5/_D%j^Ž?ñáÚ54µšŸÆ©ox�˜p}|üºûGͼ66·Ñ½c¨Ô´Lwö bã8ÎeÜÉîêË—„Rõì¼rV¼ /ÀÖѨ%?tJañåÇÝÖçójƒÙîxL—._ŸžŸ.ðg哳òi¡?³s‹CBÃ>²ØN,Cc³VÈÚ…µû-,ÌrØþÐ…õâŸÏ„Õjuïoù„½¼ÿÓª]¶¶è½÷Ô;6wÀUÏž}ëðÁ‡ÿrä³ü?án³8Ή$•\eÏO¼ŒÆKðZRZ&_PAReʘC£tâøúú×ðêõÆUKaQÝ4ý?&æÚþØ8…J¯Y +‘+›Z¬ú6–ýMd4 1¬~k)ì’~¥½³‡<VRZîçHÄFÑÓ?HÌeAê¥Tÿ¤@'ÄÖ°b¯ç×Þ +lpdBµžaÁ뚎W´ñܼB‚x{ò¤g[{'Sjôð”\ÿ‘°°sb9¥ø0%5ƒxÄnnî ‰)SBÄU£‹–eÖ’Ú¡´º¦žXFyeõ•«7°x{åZ,¢®HºHjÛÚ»èx5½f)ÄL÷?êQGT“¨&X"Q&ao/ì䬬±ù!ÕÉíAJj:æÂR/\¼:8&0¥]©¹øíê¾IÉi ÛØüh„/”Ø…µkÖ\…`«£ËV1öõeo¶:8ptÿô�—4Ýæìow4þáO¯^®i¹9a»ºº?ܱã£#ãÐábª‹ŸÝ}îÔ7s¦ôŠ¶YUÍ[}öŽÞV¢àõðØ#p<4ô4ÔFº´äl5·>"uÂFŒÐ kë »F·l%¬B¥!_ˆ~x3.áoýråéw–V"SR$ê›BCÃÝMq&:ú‚€é”¶R +‹Á§¢ àPD_"2¬¬ì\auÁD0¾6'–ÂJe°à¬{9„˸<2òüð&âê»+W.õöS- +‹9ŒÄÑ¢ ˆ³ ÆUKd^)…EI•Z^C3nn Éh6†b¸0;{†æåšõ�»882YU]KùJ n'¥bv\Žkão%ÁV¡tñ[ßAØi¡bpt +{$ﺼ‚„/cÒžœ)|ÔRØugåȧ÷rŠ’SÒè_ÅåU×6Û…µ…°cva6Â"ƶºº¿ü×ÆØß=ú»#G|²™°»öp~±EÞܲé“�.ÌÈÌÜ»oßÏC¬Úµ‡,¬Z«omk§ìüQQ1hž..ÌòŠ*Þhªx%„˜œ¡K+ø<2ê<Êh!,8”äŒN˜›_qì°Z,ÕJX”Rý7ûuÔä™ÇÜ?ö˜Ù÷h[;‹nUª+rØÙiwgvfgvÇ])Š„U¤‹"ëxÑ**÷}„pV¹ ‚BBBî„H�©ý«×v»ãî^‰˜÷…ºçu~“AyÞ÷}ž'¯¿ÏómhbS ïìì"Cî˜"„ŸœîâpÉÊ`ð¤"y…‡Ÿ‘â’ex%‹Â%Íì6__?"¡0© ”Õz¿ƒr[°Ìbf©/ÁÜéè3b\¨T.aëê2lumùép*òTôÜÑ‚q(5-°J•ãó¼®TX”X>–œ–5ÇëüÚ9 +©¥J‘Wá°¼¦Ž"HH¸‘H¤Wwwä”Là8,ѼÀ«ÂÞÐ]QEñCL¬šÁðÈÊ-UƒWJayB|Ê‘g™¥wn%¦±&ö¼ˆYZßÜÁ´°´°´°F¼˜¿Ú¨¨«·VŒÅ}NEEmݱÃÕnwÍ›,«Ø ›Ü=¾ùü‹§°cçÎÝŽŽ±ÛÞ*ûi†ˆ2•šÜ~Ñ7rònE~d:{îüÌì¤Wðºayá2Â"$†œ!€Õ(ìˆD^FJ—袗.ÇCØ“aD€%‹Ë›Ù÷ÉÂ&§¤;;¿'‰+!¬f\ßÒÚF^fIiEpð ¯9a=¹¼~#Í…IäêÚú¦òÊ»-÷ÚÕ:½Zg˜ãuþ·Cbʇ •øû¼^‰ÿX¢Ð¼ZKXð:8,%ë€]ÊÈ̈ñ치Q™f¯æ«Ð"ÉvqøŬ +&«’ÃÈTÏxEʵmÝäƒ 1ôÌlH^ñ ^Gå:ð*U[EØay]£éé‹Ø¥P¬:"2šÃˆäËK”@¤¨kjÏ/(^*É&%§÷ðļ´°´°´°ÏüzíÚ¿ìýæ‹/Wí—‰eiié›·nýënûì-["ìíuë5µ–Ø©©é÷\\~ggçä蘲e[© …°b©Ý‰Ü¯®'ÜDÏ÷óèíãvçyµPX(z2<(ø„D¦4 +;a˜éŠÈ�Ý©<uÚí {NnþRÂâZö½v²°©é™È°<Á !,2¦\¥kl!ÌÌÊA{G€ÊÍ»½Àëj„EáB<H‹'NL¶…mi5¤±ÛŸ<<=½Ž'b/Á«…íë¤|tLì%¤NO¯<èäÈÕ‹x5/âp‰T¥Cá±LcvX¢^já…Å,?ÿcX»»#)%°¼ZKXЉW¨òŠ3^l›[ÀDÎ%x]VX) +Ȳۺ)ßjÜ3¿ (¿°Œ?¨ …}É…ç•v%„ fdY%Æâ&lvë†×ýŽ½Cêo·Y.,�¶;çnþtõÂòøü=o¿mçàðÖü&…‘ȨNÝ™³Ü܉‰Éú…ôj¡°x +«¬28øCdF‰\µXØž¾~rÌÁø —8½¸YÂfdå<èÞÜÚ4 aGeª;è·/ŽD£>w>ý6äDèÐð(†Y"¬±^àu\?4"%Ÿaˆy^¾òƒq憆†ÄA96a]aj]w/ßd‹ˆï" OONËÄ°y5[X¨º¸Œ¶‹Ã£°˜�Þ,ÄÇ^¼"’<çÕZÂÍòJÓc†¥¤f`Õ‡{÷ðDÆ�û¢�hG¯‚j9 ÿ_ZÛ{úd´°´°´°D17ÙTÚïy"•[Ž,î •ÊÞy÷Ý›7_ûÅ«Ì/úÉÏWY?^_¸îg¬M6vëS&F o³yó.GÇ»ì*Ì,""ÊÕÕ©¥ujfÖZÂ2Yå¾¾~Á!šdØ®î^2È ÀÛÛG$–L¦)…Óé›Zî‘ùÈÎÉGm¹÷\X±TAf¶"Cedæ`¼ZYXN/Ÿòü� ±@SíìæÎ¥WðºÂ>ìê!d–”8lokÛC…fb-„E5±ÛÈ/¾ˆ[‰)°ÕÓÓ+"âto¿hD:fäՊ–UP›p3 ßø¹óq"‰ÆÈëJ„íÀ§¬¦¾™rEññ×Ò2ò0€––ÖXEë_m9ìýï/¿²Ä2£hb±8)5--—šÖ·êJIëOKŸXâþÓ§ÿýöÛÿÄÆÅm·µÝáän»£Ì¬[]}ùQ84Œ4OØþ%…-b–¢¯†…Ejuz£°“Sï·?¤ÖÏ/ 22J*ÇSÂNN©4ãõ-dasòn£Ùâ†ÇÂ*)… <Œerù˜ÉZ‹j¹×NÞL2:úvÃÃÃqr\?óŒ×5¶ƒJØâ’2wwÆÉ°…zBªÔZ]X±ll@$®m ;%¬ò //XÏö.®X®]ÌëZ{ãf¶¨ °T(VBØNŽ€òÝÎ/(:êãÛÃ÷öKiaiaÿÂæÿ„E®ûé`F–å1–@ÖŠ,™ „ýúëíýÛÞ]»í¶99%¾¹½t~±+öníÕø÷ýÝÙ0ýx1¯ß),¦hDB),žéæƈŠŠž™ýŒàu9aY|àñÒ¥FK),®•ÊU”=üvQ‰/@_^X4êSQÑö»Žéô¸áZ1kêÉ3DóöÜùX‰BMŒ\#a»8\ +æJ+¼úÄ]¼‚‘k$,_(®"íùÜk–I-Ò³òÄŠq‘Dý=ëⲿ¾©c–°(ZSgc‰WŽÁð`·s¸-,-,-¬±˜ðº®³Ë*Èþ@ +káóû_ÙðŠƒ“ãì³·le-!,üªo2éhD™Ùyû÷»ê& “†i³„•‘y%8;sö„MNIŸšùÔ(ìÄÔã™`QùIMYy„M¸qS3>±”°Â¡ÊxXXTòþû~™¹“S³„°2åå2Ñíýýán@v-„…†dÙñ/·’R<<1‡v÷jt†ç¼®LXTk[¹Ï“…•«Æ¹¼Šo¤ªútô™‹—®ªÖLØ^þÙ¸ùSÍ?Ákxxo@<,Õ˜+lÿÊ„É(ß œ»öísnní\°\¤¾±•RX<=;É*haiaiaWñkoTîùýç3_d±˜˜Û·l휽vÙ-¬ÔDX€¨Ð74³)2«Hõ‡°“æ +¡=0 ðàA÷²òJÃôìsa 3.Ÿ$ì\+ ½ž°´°úéŽÎnò…˜<«¬200øƤÉéO!, +ð5³ÛÈË,-¯ + +:aa†]t¡^=®7 /-öâeð©œ~ו +Uhš)ú<¥°BÑ(~EÞ¥¬ì¼«]Wi-vT¡+B[’°å$aïÖÔvwgddåÖañ×Þ~QÕŠC‹©°"yu]#%²8¹5²;¬.ìáÃÞ×’ùƒJZXZXZXSd¹±úOþêÉg/²X‡Óãàè`ï`¿ÛÉñÂö·Êv€,¬aföA'9BÎ)€–u§ºvjfÖ,ay!¹¡fdå9rtÿ~Wáà0T],¬`p˜vpIÂĸ¸Kª±q²°¸P¡Ö’§=WÏÜÁüÇ'§ añC‡KÉq~Aq/O ÓO¯NXŒK•8}z¹|¡\¥]ŒìÿØ/× &¯4ŽwöÓîÌvvfYwÛî¨íV¨•à§ýº_º«Õ*w´õBÕZ[¨t¨õ¶³º^AQ" ×� !$BHÈ…\IÈ•$„›º3;c»³ºvuÿÉ©iLÞ¼„§:›ÌÞyó¾ç=çyÎ9óüÎ4¤4\'ÿvfÆ÷ZÚ;'&g( KƒW›Ë«Ò(ÙNØq›mcuQ.Jù•«³Íþ7¦à +M߀’«tF³#˜°r¥.|PöÓœýï®ß SêÄÀ.°½ýbÊ\Bõð›(VG‹ºú–Q£}¡„Å_‰LÛܺ ~ÂÖdff=~R¡öÇ'l{Œ°Ïa}{¥ï¾ÿº÷ðE†,ðzïþýôŒô„·Ö$1þ˜XµlE]d‹«Fo¬or±ô2ÚDIXïÌœÅîlë (æ(A‡KKËؽ{¯Ý b΋ûq›3Üè+úÅ…cãVÄ@ø®“'RÖ¯Üܼ¢¯ƒw®ÉW“ÕÎq¢ö6ð@Z.ˆ°à#Ž`("!‚µ‚,ˆÙÉæ†[¤Š$2‡gzA„E\YœÈ„ÝBX«Ã#”RÎ>áôðf»ÙîYaÑÆlsó¾}âO7üþA“Í ¬R3Fyº8_|1+kë˜Å¥'xš°Z“C¦Ò#æðD ;j°‰¤ŠHÛ£±©M:¢Ï…¢$,îk‡O5ó¬+×’“S~yH#lŒ°1ÂFPÕK?åfdÝ»ûÍ +Yàõþýçåå-_±<1‰±:‰qìõß×/ý!ÁpÂQV!”²ëµõªQí4ZÒ–tb²ØšÛXáõ‡á‚‚ÂääÔ²ò +ù¯DÀVGW7%2˜×ë†G”VÇ„Ãíqº'á[f«B¥¢Á+Þ~öyAá—Ef«“pòLßêá÷S~…¡ë›€¡1ÐÑ×~È‚ÂèÐêpJeè08r@¼·o�ä%„jE’áðAQ“«™µý" i añ +-µF3›Û —UÌZPæìù!V?fƒ(—¦ñfKS+K"SÌŽq»Ü¤',a«Zgâpù OžX0‡ +µoAXŸ?³wrz(—qŽ¨ z³SOlì|„EWT>Šo)³ðöd¨‡7Û©Ž"÷d3««[$UÊTcK$ÂúÿZÄÚ.NocÅÌã qèБ”äÔ'Ï)41ÂÆa›ÿïës²¿øq²^4È>òÿÊÊÊââ‰ñkÛB²£$¬wvN2$äïXl£ÉB¦Ôû˜È?hfÖuÂãKQg"U3<aQ�ý¢©™[î' O*Ñ–ÝÍcsyìnb# ¨xù…99ûµzS€°¸ÑÇ)Pà�4ERýظkrš´ yh±»†äJØÕ›ÍaÜhhYdÁDµÖé�ƒ+—קPë�P´„ìÐĤ=ÄÕúam²:ÅR9"Œ”;!ìaa dEb +ÐVê`sE¹Þd'œ5Û\Áòa×÷l5„’–6Š0@åÕjtê·±.á`ÄAÁD._8¢6ú9;¡79Ò¼O¾¿JÍX_èŸ1êÜÑÛ™³Å[¶¼LØQ£½G êMǵÅæ DbÙ¨Jçãl@ *„‰LÓÍ6·FÜÞØo;vìJMM+¾x>7FØac„¥QõK?ëNIûöö²õîÝoŠŠŠ–üz‰¯IŒ¬·V×,]Q agæ.¥‹$UÈèâôŒjõ@-ì¤Õî—cÂlµ«µú~ª( I'ùù÷í˱؜“S³á„5[(’4ŸD3JpÅ;rì/N£syg a!·wvD¥¥ ýã-òE1çp{ÅRÙˆJ£ÖÔ½J£–+ûÄ0>8D¢<>¬«¿¹nÝzØ[§gÚY——ÇÒÐôÖÑÅôJ|#*Õ:ѨnhDÕ'w²¹ˆŠþh¡™57>ø`[8a‰º{øóæŽ`ZY]ÀÙ€xxxdT¦Ô@C#j°’Ó#À;U'ÔFòô™s»²w›¬ßÛXãøDSsÄ# É7ìž`°_4,VKej ‘\'Ü^ak['¥_z}¾¤tëÖ»vÌA냬ÁÖÉáÑëßWØÀ͸iëàtuó9=}<˜Ít°y˜UòŠfèÓgÎãô¸yÓæöN¾\=#lŒ°1ÂÒ‹ùr\×ÆÍÿp8}}ø\s–XW»Ý±}ÇŽUñ«“«Ö&¥¬^}õw+ëÂò¢$,„{…JƒN_~Qm`'‚Ÿš×Nvï'Ÿš-öpÂB“Ós€©·O/a߶m»\1ê"¬ßÉÎö +„QÆLˆ9HÌ[ê/•Ulܸéry¥{jŽÖ`²ÒŸ@Ã…Œå 7¶¶®a׮ݔ„…ÕƱdÑ$¦D:Ç*oxwã€ø{‹+,mÃ|Ëú˜qòEî,L8{£¡%„°r•±µ½+Êt–k‰æDç›óÙïÉÈÈÂ~"e*sŒ°1ÂÆ;¯®ÿò75/ÇY[Ûÿó໇ϥ™%lu»=¥¥¥¿}íUàuMcucg|BÍÒåáx¥!,4=w[ Í[Rj'_Ñ6Öéö©-¨ÛHæΞ+Ù²åý!™2Œ°3&‹ãZuÍÓBYoëê}õ6--£è«Ãžé[ ¬}bÒáö*TZ¼}ƒDÎÉÙôø_ž™pÈ +„â«×˜˜ŸE}^.«HNNMIImeq6â÷‹eYég¾òóÃ?ª½Ñ¤"¬_öA©ºòZõ¢gA‘WNN^FzfzzfYsdô #lŒ°1ÂÒ¨æÕe5q¯H}ýàÛ>?föÑãßÌÌlqqÉ;zgÅÊo3ã×&%2Eo¼Y³l%^é ë™s¸<î³(€ó–@Ö`² åÓ“µô|ñÅ´´tñ<„°žˆ¥ò¯½ÙÔºˆUaCù33·$'§”]¹êò{XÖY——ÓÃ'ÍžÅÁô8°°hbr6œ°>ÙÝå•Ugη´u,b$è Û¹3;+këÆ ï ‚~ëׄqÜYŬ}XžüÚº¸È+•LÉLX•Îª6ØË®T—\¸ÔÚÞ¹XY#ÌvaaÜkfFVvöž>ш\mŽ6FØa ×–WÿäçoÄÛØœïîÝô£šYÖ;wþ.“ɳ?ÎŽ[·òõ• kÞNHbüqÍšýoÆ3ÁPÚdiá‰Fg¨¨¬Zt + }öyÁ'´„…¦foóø}Å%¥M-¬hb@JR4µ²ÊÊ+×ýy}߀Ø35BXÈ;s{`p('7¯ôR9!ãS–wÔÛªêš={÷ÁË äîÙ³Ïh¶9ÜSÁ„5['Nœb^¯C̋”ð° assèÆ,‡‡’°Ð¥²Êü‚BfMÝÓSÄp¾ä"ÎPZjúá#ÇΩ€…Æ,Bñð©ÓgÞ¢p–bÅ[Ú¯×ÖÃÃ_¸¬1ÚC «·ázêÌ…ÜܼòŠkˆáiVœÌüå² +�Ë•åKœÅéSh¬²ÿ²_fAM¥Y÷aªæ¥gìj«Ë ÜEìé©y˜ª©é™ª¶Y‘}GÖ°%²i«ì »Dö@ØAe±£laaM„¶ìªž—ž§žùß|1"‹íÌC7©S©ä»÷~gùnßù÷I· »MØmÂnYÌîÑ)üýÎï<}dOÄs?ÿ¿ôìV}är…@ °¶±Ñ?¬ôäqã3‡ÏÿÅÈ(øèqÁÁÃ¥:zï“®›$,lqéûÊÛ5QÑq5uõÐ6àCëA´£âÒ +7wO/Ÿõ +WÎ'%§Ç…¢(²›–añví]DZ]½‰;µ&þâÛþèñš„…)T‹âgý¶¶öð%*.«V绥ÆKÀŠ Ë+«#£cœ\ÐiW&ƒÕÔü`V¹@áõ5aa³Ïç{Ä}<^pb%!?LE’ö§¢¢RÄ©:—”»¸ºc’y60¼&aÇÕ›˜-•ZYÙÄÄ&znuÌ ¹ã NùÖÖ¶P¯L&›ëø¤W2*“¯&,lyU‡‡Wn^AÍÖKå› æ«w@ +@êÛ+×",lïàDRŠ€Ã±ÍÎͧÂØJâšã•ñ/…ÚØØ‘ãf³9¹ÂÒgƒÀë/ ìÈ6a· û›%,e:z…Ÿ~ž»cG’m°»ç‡ÿE¨÷¿ë«W?çäæ~ñåüô`ë1CƒÆgþjtÚî¤Aœþ‘r½Í°u“„þ^,¿¬¼]íîî‘–.@c¡p¹Q"ZMïVV|#1eµLCSJNICûõòö•Ê¦Ö!,¬jaIXXÄ`°œBî$%§ÝdBlR&ÈLMˈŠŠ âƒhÛ&&¥j1Þã’h4saAñÜÂòš„…Á×´\™~ó‹ÅñöæâtñuÙG:-\FWG„ê6-c}�‘–‡Ê…å¼®",NG¤“~þ¬l¢câsò„udŠØÐ#eµÓì\app<úrÊÊ«ÈãøÆVá—¯¢ ®n»zz'gçÖ$,ì´b¾íQàHg0/_¹š•“:¯>µµá®v„ƒÎŠp¦8P¤lɹ�‡!¡—‡Ç§¥“ +-¼ŽŒÏÀdÓsMÍm¶¶=¼“Sfì³ùÜ©©IT’ž‘é爯]ÔÆ-\Bå±þ>ÂÈ+îµtòø¡x»0ŠÄÄÄ#ñ¢’r¼¢$*M0ê¿Ä{ÕíZaaq† ó2åP)[³YLM÷;û†¦^· »MØßaGïíýH„ÕØ®=©;w%:: +E¢¹ÅÅÕóÄíÏoéÔ•Ïâ⋦{÷âããOèêë0:}ü¬ñ‘³ÆçN +=z,]ïp±®^Ƀ/Ûã½aaP²%¥ålŽ¥¯¯?pY^q?‘]ZZ‰šê‹Ë¢cãý‚ eÐùíìbãnT«e&îINI·wpâ°-}|ýÊùõ K «œ_limãúú;gB£YXX0èt&º"14RÆa1Ù¸ŠÖŠ&IÚ#i‰hÝ\¿�<…Æ»aåÊyÅܬ¥µÝÛ‡kfFsvvÅ„—•‡Mum=ÉQ“NN^Aü¤pø¥Ú,Û’ÒL6¿Õ/}£^ß!,Q²c²i ùÜ×ßXZ^ðññ »Œ)"7¿°²ªFËcu]}íÈUAfNDTÌ¥àP8…z‚GpÉ`aŠKHÄ,„�n¢ª¸Ü�éÄìû4¬Æ€àÁÄ,“Åf2YnîaaWJJ+ÖÄ¢*-«º•™Ê`¼!‰Ãt&"ŠJ%£“Àë¨lvMªm¶«§? €obbjoïÈåú£b)©7E%Dœ¾Iüuµ…E)i7¯] + +⻹]$IÁy®RÓx÷@mõ"+%M08:½&a‰ ŒL‹ûÆjï6{yùž71ÅàÙ°ð+( ÅÐRs§†ù¢A6*Ï¿"“òâx§Ó‚ÌüŽîþ§2 ^Ý„Õ‚ì6aë„]~)½ßZ´ÿ`ÑþJX]ýbhÆÏödýîÛ;lþù ¶P2§RýøZØnéóÓOÿ~±´$—Ë%’¡††F¿/ÿü§]ŸïÒ=x@ïè}CƒSFF_>mehräX¾®¾Z´êoR´jG¾ï€§cC d¥²ÉˆÈh€spt ‹ˆˆŽ‹O ÷bbã¯^‹ðåú£á£á ߢÿà›nÁÀ¢ 3ÛÎÞÀâP‹˜øÍiP¦‹K/•ëâUc*œàÒ÷ÝOžææÀ¬——DÌÛÛÁ`15=£®¾qF17<*£šci¨òôò¡"¡3+ªj×',10}qùU󃶘؄mff:åÈÝÁÑÉÙÅ2gWdA5pYðmÕ78¢œ_ÒÆë;„…Í(TÏU/G¤P£”TÏ šÂÑÉeÅ£‹‚¡<Rt宩ƒÉöôô\Æd3ááß"`R»ºú&HT +¯ë–ˆÙ)¹ +8ÎÎ+ÀVTV¿+'±ÌÙ“H{%ƒ‰£â‡—K§eÓʱ 9ðºa‡¥3£2ùø”²µ½;:&ÁÝÝÓÂœnaA§¦&{¢ÖëT›ÊÁBš~þ<QIe—xÐÉÙïÉwº¹y´wŠ×'lŸd¢hrpd·5?|{׈ÍÍÍqäLÔ–2u<êAŽÃ~»ò¬¬qZFÎcñv÷¯Æ믛°Ûv›°o"N‘eßKØZéê—êèeíÕ ßù™ÕÞ}_›žwòôŒŠ‹ËÉϯohèxÔ)—+Tªy-›˜˜ìèxÔÕõ¸¨¨('77&&&(ˆÇ±´üÛWß»÷]½“Ç>tÖØÀøŒ‰¡¡ïñq‡Ž +*þ`Õ9‡Ž93ØaûÖ',5TÎÍ??gÑÿMMiæj9©Q”Lu„¡ó˜›ÓÍLiA¼K5uwG¥²¥—¯êî6à6´P܉KÐ_“3rØÍvBgåJÕØøÄÀЈÆÆ'gfqyé%�ªÆñ2¤««;€ekç`©nÈvvO{Á² KŒÜÙ-î½s·ñ۫׬l2ØgNQ€ÁP§LedÁÀ¢‰Éyw7›™>•‘gÎ-¼®EØS¨ª}’ÑÖö®¬œ|/˜A§ +õÆ#c…¹tªæt33~òÖûâ^ 0 +ë—ŒÅ'$ßœ3¹xÑl…› ,ìØÄlãw-P‘ïªWBX-ŽŽ.()Ò§©Ç~p(DkKûãþáqÙÌœ†–8ëìî«®kŠ‹Ovs÷À¶ê·ëM©ñR¡ê‚S¯–•µ-’™-llnë~*™PHÆfZÚºyüPªhf4\½w¿îVãuMÂë•Èpu`dª³g ®¡%#3ëtÁÒ +u¦¸¿ÊÌiæL&Ë/€—’–Y×ð�I÷ M=÷Kµðú_öë5(ªóŽãø»¾èL;M;c¢r ÚÔéL;™É$Ž3¾NUX@±F/ML2ŽiccÕ4kÐÆhbƒUX. +ËmYAŠ€H/€,ì.{–]a½�Þ/Í›þÏyvg{‘«,üf¾³sxžg–7ûáa!ì,ÖárÞ¾{ñ³=Y?úéd+:›¶ o~ÔÉ—ç=gÞ–Wæ)—†‡ÿ:<,,lÞÏÂçÿ$|þK’~>'*r΂ÈWFωY8?6fñ¢Øß¾öËe¿zíí%K—,ù`ÑbšUÿM|«xU£rÃÇ«Xî¼È”·–%®^C__MÍ-A…¥zíN:Fó¬ÝÙ¾ª&3+çŸûRwîúìÓ;wü}E4û¤=v¾ú9èè¿Å®µõ9HF#×Y¬)Í9™Ww©¾Ï5À¯÷:F%,‹nrŠ±c]=vצïàÿ ý…HÛÚºú€¬\Xk7_W3ý +úc&óÅïëÏ”Ÿ-,.IWfÏÈTkJËÎT\k¸ÁYºm<îN:Oïb¶ŽJX³°Ð'éq¶ôzC§'²KO—kˆ]r³Oä•ž®¨¨¬&‹ÂIz%X9k¯Éb£8k¥ÛN‹]E3騄5uÚÎVÖ¨ +Š}òÊ„Í9‘GCå¶?Ñ”•_kÒѸj²Òo±ÌÝz®«Ý›×ç–ÕFΚºô\·³Ñó…ºkšÒ³E%g”ÙyGÒÒ¤ÏÍW¨ËÎVÕ5j tŒÎ´:ƒ¥EO¨™p$d[7Û:º(zÐÑz÷ü²št&þd]H×ZÈÍsÕ—+kê+«ùÎU××^j¢uRµ±…kК®7wÐèJÇ ,„åÂÒ—¼¥µ½ð¥Ù?~éDXÔä9+jóâŽED¹05:fïÂWwÇÄ~»x‹¬E‹·¿º(%&voLìþ蘃bŽD.T +oW{VõÃkDFTÌ; +D’7o~¯Moìu¸‚ ++ÍΨu tÞìæ,]f+¥Dª£P„U›@)Úu/ŽIX1‘Ô‘‘‰ô©ÎWמ8©ª8WÕ¤Õ‘yõ-¬P/‹¾î.›ÝÅp§÷ÊT³°²:…kùËy1BvýØÝG»œÕ&Æx•ÔÍòâ5˜°t@§çŠKJŠÔ2UÅh÷Ðá#4QþëàaRÕHªšn²ÚÅÆ$¬NLÏ×f¤{º(šOÛ…ˆT^Uþ@gK»Yë]s›WZ>n²´îiWÇñ˜º3Ñ¢0±Ê‚°v¶Ë#Û?Øe4•ßñó—óæF4SPÞ¼•PþÜà©<‡ó&éÃÌ ÏŠˆþê7¯¯OHJþ#}U¦gdú` +ËbnJ“©¤I–QØcw±ˆBZ§°>óë„k¶ÚX\°&JØÆæ6bTÊk~¡:3ûä±ãÊ£ÇÒÓ•YÄ놛WJÞ“²¯ÕÐiàº&IX1Q½j7³Û<AŠѬ*ddAXa}æ¸e2™w½³~ûoîys鞥ËfQo-Ûý»ßøörú†LZ½&>N±nÝŸŒ\çx„W“)ìÈ lPaš[eªò‹~ýMJÊ>²5í?é”23'íèñ¬œÜ:ƒ›¬ÂBXŠÂòÈövtZ÷¦H^»îqŠŠÄYÕÊø„+âÖ¬Yûeêþv£ÉîðÍ+„}Âj[Å%¥Ra)2—O}Êý $litz³8ÆBXa!¬Y×@¯ÝyõZC‘Z£ÌÌÎÌÊ™ì”Aʦ15e(³ +ŠÔ—¯^'ãüN¯vö Ë=uº<¿P-CÖgtìlUÉÒa§·°-ÂN±°”ÝÙOÎ:û§&GÐ\SÝSŸs ×á +Ä+„•Â^ojQ?°…E%ëÖ¿›zà CÂBXa_T½A³;§ ¤BØÙ-,«²ú"h±Æ7¬ÅJ)Ûà B‘˜˜¸ª©Eoຠ,„³°ŒWa!,„ñÂÒLz,=3C™_¨..)-RŸb±çܼÂteöß>Ý™”´zÕªdzÕ¶™ ,„…°ÂBXTØŽN[ÍÅúw7lÚºuÛç_ìý2õÀ>¡Ï÷¤ìرó£¶&¯Y›˜D¶._¾òзßqÖ^½È+„…°ÂBXaýD)±5uW¶}üI\œ"ne¼B‘˜Dу">!^hÓ¦÷²N¨ÈP:a!ìŒÖ‹W;Í‚°6„„eÈ6·vkNøêÐ_þº}ãÆ?oØ°ùý-îþLJ¿ý®¨¤ìÒ•&ÎÚÇx…° ¬›Wa!,„…°¡&¬7¯A…¥Œfº¤GX!C,a‹.´Ñ.³ÂBXa!,„…°£ÖÓM¡ág)¬ÂBØé#l„…°6$…n…ÕCXa!,„…°ÂBXa§EÂBXa!,„…°ÂBX¢Âºy…°ÂBXjÂŽàÂBXa!,„…°ÂBXa!,„…°vÆ +Ëx…°ÂBXrÂzx…°ÂBXa!,„…°ÂBXIÂBXa_tvF +‹ÂBØq{ÂBXa!,„…°ÂNÛ ,„…°ÂBXa!,„…°ÂŠ¼BØi„…°ÂBXa!,„…°ÂBX*AXa!,„…°“"¬À+„…°/JØ`¼BXaý ++ò +a!ìôÂBXa!,„…°ÂBXaCKXÆ+„…°/JØÑñ +a!,„…°Â†BÂBXa!,„…°ÂBXa!l¨a!ìÌÖ'¯ÂBXa!,„…°ÂBXa!,„«°„…°vl¦eAXa!,„…°ÂBXa!,„…°ÂBXa!,„…°¡„…°S,¬¯ÂBXaCGØñò +a!,„…°ÂBXa!,„…°vºa!,„…°ÂN °n^!,„…°ÂBX‹ÂBXa!,„…°¡„…°6D…õð +a!,„¦AXëOXß¼BXa!,„…°ÂBXa!,„…°ÂÎDa¥¼BXa!,„…°ÂBXa!,„…°ÂBØé„…°ÂÎva^!,„…°ÂBXa!lHa!,„…°ÂBXa!,„…°³UØï!ìx4ÕºälB½€ö�ùƒoõðñÏg2ƒ&Ó_þèì O1ÑéASš_:-Ý,S°¼1íbÉéänÊ2øi„žVi2@‡%óêSÒVC'K§÷ʨ<™¤ZÍÞÉ$½ÑjjjÒyÕØâ¶ƒÕ 5Jc’Š•ôj“žºÒ(I*v¹¡Ï#é%Yض²˜¤bÞ^ÑÕy{*Ú"íÂe1mÇÓfYLÒ꺬*1&©PåŦÊZwR¥«q'ñ´ª¨ö®ê:ËCê5ÖRå’zºÂ’¨Z/ÍCêewÿuç!õ’,·¤be¬:Va)ŸHj¾S>M-KBêiþHuÃ:Lj•»B¾l1ÑV·§žT•,¥ê%õTJjúÉŠtª¬å,§åGݹU=šu†JóôäÙ¡Õгèéÿ?}6ÑÉïmO¨§þz4λ{¸¡'>{@=ò¼>G÷>¹ÿÈ´ûð±´{¬Ô¿î>ºsè®ÿh÷¶¬{FvëÞCßÝu7x'PÔí’î³úeÝ’çôsàžww¥9ú}×ç»#×yÛ+‡»žÿ³/<m%A�Ç?ñµÜRè½7÷nƒÁ¦¸à†{ï½cCÊÕ|ˆÛõì[¿}~g@wR餟þšÑhX÷ŸÁ»O1>}Vïߢnïÿ@ºÈÖèÿÚ¬Vï7¾æ-§û+ÒÕùê¬Zû_µ5Ðü*¬rãƒ@©~ÏW¤jD¡vGå«}F¥Ÿ#zùJ5W&²¥[¾L‘ê"iP R ßIrðœë$²ídnH<ÛŽ ϶@,ȦšÑt3’¢ œÄB ª‚q"�b5àU±hõ†Ç©°Ê¾0æåxB ÜAÂ�Åk?( ÎÂÁ±ûòoØ< {ÜÄ%ç•AÎÁuXT +±8“vFÙAâÔ†™9'Wqp|‰ÄLà‚Šã9a°bzKèÎ-8 ñiÌ ØéÝ}KúwíÛ¯¥Ï×z’î8í±×GéôæÃnG5¨öcÕÇkuÍnèŒQEãTêâÊõ¶¸h•Æ*VÅTZ¡&£,./ÔàË•Äe‹ .)Ôy"ÍJRåKf* ‘aÄÓe©ˆ +$‰H²ÈHÂqN¢Š³b…À@Ë#h>�ˆäÑ!$çgý‘pö†åCB ¼AQià 0Ü~$E¹n$×ê5ð%Œ„Ówz”ÃâwÌáŽÛ96ˆÙ\QÔ+äš/zéÄ.ˆuî`Ù‘°•Ym„±z…Ár< +�óÀÉâç;>7„3qŒŸáñòéOgÀ«3{Ù 4'¬cP›•éš02”àäS舜Ò9d:;"Z»T3¨Ö&Õ`Α;T_¸<Pò]ì+°=ήü|Àº#clKlI½éô`æÓ=•ñÚÀœ<Îñ( ¥ÿèê!Ó*í”ã¡“BmC>JeT¨Œ¨2†A¦Ò3”â¤*K?¤ÔK:ÔQ…þHŽ¯Gr-8䓉;jþɾ„±'Q‹;*°+pHì*…†¶ö•[CŠ16÷ä"v‰ ÙºÀ6"¥ÖDH¨Õ›ÔÑ +µÁXƱubIÜÁâk•±°ºæVöçø–÷À,µÄ˜YÜ¥fwß#|;à5Ï·ývŽxƒm ÍbÓB›Ó3›¨¯Áµ^½'¦À;j¼oÁÚê c’X˜œÆ&¦W&^cχ–‘_^˜ZB~f=›Z|öû‰zÀ¬&ç‘ï‘ ÆwsÄsÆß�\wÁ +endstream endobj 195 0 obj <</BitsPerComponent 8/ColorSpace/DeviceRGB/DecodeParms<</BitsPerComponent 4/Colors 3/Columns 126>>/Filter/FlateDecode/Height 110/Intent/RelativeColorimetric/Length 10226/Name/X/Subtype/Image/Type/XObject/Width 126>>stream +H‰ìW‹WSGþO* ˆ²•ãúÀòy +ˆ«¬¶>VDDí]¥¢+¸€U«‡UK[«TP$7ï„ Ï„ÈÛ�H„„ä&¹¹¹a' ¹Ä ž£U£[¾3gÎܹÉß|óÍ7¿™™YÀ°€,`XÀþo¡GLRµ¶{RÕ,WÜõždÔm{HÛTF\YNð©$x уLò€Hž$âÒJ‚_yU@q[íµö¦@Ô¢˜�ÿVi´ÄÝSù4�HdzÅùÂd*gMÉ‹@°1Lt‹µÇñÊöÖ‹HXõ˜1¿oi«èh~.SÃFwOîc„ÅbšPÿ,xšQß´™ÂX^Eœå"9S½”m Ñ·r¸ê2O²Û…ù]]y¢Ú„gš'ø»éÜh"}}%´”0·Ë ÄP +=µ®þjc{ÿ˜ÒÝsý(€Y,° }2<–A¯ 3–Cζ…äM>§Q6²Y[š‹Ÿõó +±V+…áq½AeD¦“ÖdÒ›ÍÔ>¢CL2 Æu°T«ÔjŠÿŠº÷qj×Òh¾4Š7ò!‘6Pé‡<ÞÀø±ÃÜM€{ Òû‡v‘ÙV}ÎÚ…µñ9º…Wmg»K£6þi~L&T©®uuïihâ°Á‚z‰ñú£¾ÉÔô_Šÿ)Ø@ì<À©]ZEÀ½Ú‹LÚÄeg´ +JŸ=U«˜ßù¸0Š>V(®õõînlð¡@ˈ¤dVÍŽµþ/q�o9Ì©[M¦Î‹dÒF(¼M¥š4½×�ÀÀ0$Mi¬ú_A$íç=æ?¶¼çqÝ°©°¾€ÿäsˆìåй•Á«¾ñ¬_n0˜?ìÄÁújL&®\ôïG§®„ ìºæg“Sï{Ý?0&”%–ìdp“æRÁàjvaO÷ NëÞØ€Kàó}(äp•+…&÷†ô®€ æ+MÂ�2 ·_:5퉀7>þuþ*€0ú¦5ùÝ]«Yô Ú•6‘\£swP“Óð~“/ r\yHgÐ~+Þ¿Ÿ¿)´(ÊSŒsÙ¾drzM½lúS%ߌY#òÌj’ýRc½®ºU–—÷ÈŒ¾yÞb6Yô*‹z›èÇdæçõæn2*|€¶–¢m¥hG…¹Ÿ…0y¦°LË-ˆnæVHâ”°ÝA ¥2:'”¨ùÓË9kÅ#±Tî0ÞU!y¿ïßyåܾÛý¢á™y¬à©…ņÙ6¢Ãd"S'„Ôß0B'w·Ã×7ê.yÃy‹¬åâgº‹‹49žªs‹•g—(³½§òWk‹·Ê¿Fع¦Ö{æ¡:L#sù¸Kc>”rK,^ÇfÆ°8Àö‘·Ð‰ûP'‰¤1m´µíQY%ÿLú1=¦ðØÖË·rªä£*0õWò€™1å Òô«±ò°¾$¾ì§ËóÐ9± x–døõî_+LlnÙÒ” + +h<Ù,LÞ^dú«¯Eî‰ðŠÌ£Ô83o}]À{ô(J‘JýYŒH‡> ùTÎi…«".~T•xüfÚÖ¢£1…€yP¿|ãl…L2aÁ\&ŽYØ,iÖW¦mÃ…ËgÙÎ[ØÖ^ðP[2˜¾²%)„·%²:,šË +Šcmuk›hm€WÕá1µ‘QàÇCßlPmÒßÿíe€MdÁÌ8ÏxÌówŠaÕò±°jn�¡C>lLjš¯Šºf¯HiYY% ÝNxzt(GA±=æ,yÚ,ÖóRĦå¦. +|o.ßÓJµCá Öþà1~Ú§#ecÍæ(+ÃVnÃq €6ÓVìö~¼Æ¢&"êéÞ@iæ +ío)h'Œt‰ÜEØÖ,–Ɖ‰~mV[»ñãöíÏݽ€p«à!¢Où£¸“·ÇÙ©ž-Ñsu֗Ť;üñáqc'ÝP‘ª+øàY™½D“ãç}fçØøà‘•c6³pzItìL~ß¹ÓVƒ…í }·A_qófâ �ùõŠ(^Mqw ûxO[ò ÄšÉ@ÖrqaKö/© —_à<Úu r¿¸ *<¤½ºÞ*ì/ëÜ»X·&×ÓÎüt®gïµ6©ÇáÆ´³ú"ÛxÛ¾N«0ûŠiÿ{p?*²ó«õškáHÝu‹~Êe +Îæo Ÿ¯÷g2Êú>N»oÿª¡Á‘·ïÚ½ý¨Ãjœ•OÄ槤=;½Zu~‰ô_¾à äÚ¬[r̸º•ùùTIy¥œW¯uÁÃRýØ8(ðˆTÝݧhh®¢ôþt[q†ÿÅÁšøÝœÍI¸àqñÛLɱ@ÛÆ?;8îqìæÑÌUðûÍ£Bàü3.9Ջ䃽A•I×±¬ç#n`öµ�÷ŽcM-vÎA½²¤üà?~´1ü"ó¶G`û§ãsH™8»tøøŠ¶€p@-(¡iGйÕä—ÌЂ¡Î§!NŽÅ†¨¦&íâ_ÿh;•S—|ˆ–ètàÆáž?×i««Ã£{öù«ŠÂMݸ/¼,ÛÁÇÙNÉ€8³u`Jã&Ž_³v<Í!ÉÖSu{zqzì‹ÞSˆç6çÏrŽÄŽd®�Æ‹°: =(þ^èޒ؃=ßúÁëò¼ô„lzlfÞ©ç2´K~‚L©•C÷5§d‡&ιS ®y‡Ù^qBc[wMä#eö´sþ÷ñ!”FcV‡0»µÝ`Bß5…o‰ª¾AOÒì ø|HÞÔÄËGc³v_Ïzp§€RvYz…~;—PøMiá}©k¬‡f•ŠŠäüˆ“§¢/”ØÌõ‚ïÍò¿{ºHÔЧō£²½~OšË)0Ûp>‚âšÂ9›A©E^ÿåQŽär+†Þ"ªwà3»Û“PVÿ^‘yú^UIthÂE¡@<få°ìb°à´¬xÎŽC%ÉçN&€Ppig¦ø»UÀÞeç}J9jß#7¿¯êï赆ù)ßKï¼3/îÓ´vàNoÛ^‡íÌå¢øBؽ¨.:Brb•¾®ØŽË(.F×®Rf¶º•ªwOå›�sI(²§î€ö%é[RÍPߘٌ¹Ø&�*Ë®¥5Ƈùr#wtäÈÛºzZ‡h÷nŸ/çœH²ùÌ"èpRFÌÒ6ÎÃb6àÜkñAp‰g~„à€n>r +˜3pÎí™öT?Ðqù +ÜZ1t|±8cKõ_5ŠáÄWùWYþOt´ÛiuN÷é3?ŒãqÇQ$ ¨ƒ´8í2Œ¢‚ŠJ«•f‘}QhteÔ°4û.H@0ÙS•ª"s«*)*UQq¼ç:áñê¾[ß»ï»ßÅ°(™<BÚ‚â_SáËß«—Q’)/ïWÚ“]áOL36–.ñÙ_Z³}ïÐÝGˆJm_IL«ÛëÔ‘+AF\\æΑCÁ‚øˆƒÙ¥wë•ãSüöÓÆ«¿ìy²ã¸®§¿å\„økYÅ×!SkÝ7]ú é¬vYÊŸíï”[J*Do¾šÎÓ¿"k¥ +«ä#:Ú]jÂbœ,È’ìØ&rójØ8Y׈#ÈÌ×á(’@v¬ñ+ÍùâbiÔ‘[!Û’8øŸØšóµB™Agfó?Gü0“Nè¢T·]ŠßJA-˜©³ŒÚ§èHâµq2Ù}ëâC˜ß¨Ki>V×øµÒþåÄ{ì$Õ¬xZÚ¡b/`bžj5îÚ)rón8av^C`ò|Àܽžš6ª`ÒlB¤â®Œð'g¾%€’£±Ô ñt^ûËAÿu Úo ‹¬ÚàC'y%¯£î«ëÕw~%ªÙüÀ¾²æAÏÛE÷ºú>*€1Œ N7Ižþ ebcVZ'Gd‡B=•ƒˆ™§×šaKžŸ)êæk«ñ¾*¶Œ4êÍMÕ7¯„þ3•£NáDî§Vùãn›“ùÙó`ÆáÑקÃ!:óEl©ï�š‹¶_ÖéDYœ×Ù¿µ*CXÜ“3MRò9´àöR1Áxù’â”Þ„wû¦QópvzÕ†M§¦:º§�ÏX_fšâV _48¯1¥Ô¿®íN9ûþ1¯„ËYÂ;uiþaOã„Z&oø×½œ2ŸÖÿëÏ7x¼ Ý„©®ìEÜMX›œ'{7ÿÝÄ$3°‹¾//{61Á-p®iÕûî‘ì‚l‡pmÎ5—›37’Ÿø>Ü8[ºÂg"f´¡\|;Ä'‰&šÿ{'DÉ}õ¼ÓH‘›Ûm³ä?€¯xZý|‹ðJ;çÍ—@¼Ù]™s’@-œRËø‘T¶í=”!•™ÿÕÛ)½Ÿ¤ð‚Zq§VË x¦ëâñVec³Ó·Û«8†åá~È#¾8aÖÓ¦y¯«xÐ}4—bþ8šöá Çqëªp cÃpñ|B«Õv9nFá¬ØóŸR›Ž#ȼŒÒR›sTÌïÑÉc»ÓÖ$ÜíÒ~. 󶼾&Û)ä‹ö¿l‚þÎ)BU‰IvíȹOðØÞ”ð=‰|ô¬·ræÅÙë&yMpb¨{ì~Jå¿kþù-0§ºà•VÍ¥,›«#Ðõ¼ðÞÃ'yKó‹7{(ÒÏbÚI—á†ú¥m;q3»û#°ûC1üBK‹ƒäíÏЙÞje/ÃõÊþóûZÎ^2sYˆ4C +R ¿Øü»;a˜˜�àͤ·È%}ñ!÷‚=ãÙàŸÞ™rãrÁH¿« dmOZ–3Ôο)ðe{½Mí5ü�ègÄ¡ì_ö¤üõÆ+AÌ?þO¶nõÔ²¢"ºieŠltW'‡+uy!þ*i'`$ÛŸ�·CÇ + o•\‡Âÿ´9ŒÞËŠbϤáûoBµµ3CùW?~¥ÓiÙÏ郘ßPzêý+yC2Cø4Û{‰7ÿô6-7Nq¾Žþ~>ÿˆ nCDní°ëZ¼°V>ª˜‘ñÔø¶´$¹·Ç©sÁQuêöÁëi¸áDFèß!÷ƒ’4F.2§Â‡%6gpø›Î¦ œìT܉/ûÕ7ÍŽ¼YC¶%æD—ô·bÖY›«^ß›]FåZG»Ö‹/uÚ<E¿K91BØq{pÆÕúf—Ь8qU&g0§©z¨Ì~6òÖ¡&MÒ&}ÿ�ß(¬½Ð”ô#™ð‘‹àbîÚÊüvÌCz7ŠÚ/ý;‹ÝöÄGæ¼(~ ¥ÿ:íYQVõB°[D÷³|yI]‰÷FUñ N<ôó^R9lt`WRHuýGvum:]^@S]Õ�ø+Ÿ–fØXh*¹0uÝ—‘‘ì'¡Ÿ@$•$Œ˜o¬5ñÀ=ü”fk9\|á -Õø°-;üOíHÉK.WŽOÁíàx†§ah¤ñÀ1;Ȭ„¯d~õßcW¼øßw-ôgÜêä{o5º/†:i:=Õ·ÛyžÊyyÚ£Òrg§¹(”Ÿ¥0ƒu MWÿÙN"Ÿ¶ +ë¹Ä“ýŠËI—ó¤ì¯GѲ3–y‚mw[Ì(÷Ôp\~!Zä6£m*Yö…—ó‰0X0ínUtòwÿ=ª˜>_Áé̲þáy£ø)VÜÿ†ÍðÔ)-/ÞècÖ ½bcÚ´ò;Tû…Czª1F-2g{šþ²9fl®`wb~‚”™…ǽٲçœÿõâ[µ:ãgðö«6ø°…%M2Ðj)J+:¬3ž@j¯ó·K>ó€¾\þûÒnt÷ÌÅO±8i+Í0lü— +‹ãº»˜xI¶1æ;Dx’ÿ:ÖWeŠYj¤Ä$äÑ觾Dœª mÑšPßT6ø!Û’²~+é{Ç>©Éº¦êM;èj¬ú³î˜½9Eòÿ J˜þ“¹£÷ߤ=nMˆ‘·P’}²ßÃuçòj?‚mr§Ú%Ì‚V]”¶äùÙœYqÚðÞ|{»1r±‘¦šè¥hm²mJwÚwj‡môhΖúÞÈ÷ì´O=Aÿ‡È¬+k5ê-ô»@õÏÜ}Y+ ~Ó¡S&ŸÝ3ÃÝ$¯§z½).´Œs·Ü':–[X秗9rž…|IqÐk© +AÈ0uï,T5§¯™¶hgÁ«$Ãÿ'’j�ùÈŦ«Ë°ž +¶tù…3wšÁ¡ì¦œ{8Ã<ä8î•—R1öæ=”]«Þ�ÄB1¼€^Uÿðy“÷Gí-¡ƒo1_[õ?cïØ,î‚K´%–ö¼!9oTk˜5”Ï3eV:Û©QRäÛP7`ÐCTøD)K@6§I?âCu¸B½*M2¤ž„±ßÊ>þ.s€ùÁBàrÁĨp‘sÔ^s©äÄ'…Þo®éFLÈsÏŸ’‡Q¿'PÓÚÁ¼ŽŠMÉ6%|Éò·pd÷S*À O»Ý‘ÛÒÌÊ´!µÖöŒ°¡ŸnϪ¤j¬ÁGe¦k#™<æ[´:ÂF‹1³žz±‹IzʶšgCl œë§ŒÅ¹µ'}’Ù´ìwnwzAÖ‹jO¶’o=eÕé™×’tSìrR�ק2ÇG”1Á·)?±ôQºŸÏnQª¾Ð'H¬<§ÀwàÿMiIáè((fhHM‰?PØ.2g¸aÝO Í0Zv–î›È„´—Wsƺ9°š;ÿðÛþb˜†n >êaç|n±Âõ;ªÆë™û®·¥3/ZtH~�6ú?ÞËÄ«‰,ãÿ +‚ £¶N÷8=:Új‚ .ˆ¶Úî ˆí6 +HXˆ¨´Èf(YØdhTDPQ6}•-{*a^åÕò*©„D`î©Sç¥êUêÕW·¾û»e!ÀóÁq¹L!¸_yÆùºÆá¹oÏ'TƒªÆDY[ ó<¶ä6Ô‹•JüÛŒ°²C…¼’`>5&c÷ª4“ÞwaU̘zÊ:f½–œ˜ªº”nu½ðWÀ=m‘oëBüOÛ*]N~j§.ĺ_K6ÃT‘?¹ª Ö¦ÚÏAÇ’¨oºÓÙ»•ƒƒß¬áÈoiGLžÏt{þ¶Ê +Pd±OOE¨¥@K§÷ôAiæ!}y‹êføðr® ¥ +:–H‰vÖŽS`»:<ÈüÒýÞƒ]CðV ÃoRA="•�äÖýy0òLêZðœ}ï–÷÷Ïf…BH){X!É9۱̼Æ>‘:›‰håÍH“!ô?e¹§Xy’:ÈzJ_…îµfj½;¥k¨n»¼ÿÍoËU <Þ=iÜ&ÖÎ÷š{2/¹@‘t¤WšãA%’¨àÊ»gÍ!)Ùí ¶ÊõôΣò¤· CÜsuo•eø:9„à:™Oxð|Yž§=µ„Õ=ømŸ�uUcÍgÿƒñ WC6_,´u† _lëtÁ.* ÈóÑ¥à‰ð%dæ,(>ãFx;©6îWö„Ï;M(éíû†%ElÏ£gMYIOcÀ�M†Ó©®1vÚjàOÐê“ÅÀ‘i6Ù WXô*ê,¦ÄªžÔû¼sc“7VØÌõû€í“Âr+|ìD/»¶èѱ}‘é<G}ÞáBbyÿ€©’•=DÂÓ<I7S`o] L*OG-ÅeçPèΞöÒ{çiF†T"’UýÐÉë ‰”77zU=5”èï0lE¹å@ MâÁãðx’$‰nv—“ž ÍÓRFt²¹òwä%~ºý3šä(OŠPå6ÿU3½£ÖqVßÖÌzJ÷B°›©r?”/´u Ø�óÙÛ!¢ÄË_'ÉÀíþ+Ã\Ïk©lÜM÷jçç{'¦X܆ù,<¾“|b,ÌBÄ„&µðæú +5¦˜FÜðuSX L`½ük}Óó_=JlAΧnøíœ]T2ÊÍ·çÊßèäá,xaíïÛBt‘†Ú¯OÀzCªÄhi¼ä1õçoS½ZD®™¡6‡ày|̵VuéíèY}—0Ý#pÜ-(.ßê|X}ì¦ÓÞö@ÃóÛ®•{ÛO†˜S0ÉYXxj;Â3ˆø¤ò?Å>h7QQc,vQ^ÒÀR²óÐoÁ’Ÿ™èÒžá0šÃö#¬°ÖRSî>+ž× L"ý›P²/¯‚{8Ð7âöŸê»º”²J°_³¸±×[×dÐœ_›œ=0)žÛ¢q±ª†ÄH&X +xèW`ÃϪ¼±Ýd8ðC0‡YÈËæàIÃÌ©ËüZ§X瀘jï¬vÿçÉuN¯ÎeD �I^qño¸ø/ȽT¶|ºüýé´È¨òžšÁ)‡ÈÀÚ·2¥rnTf‹„úfDp=ÕV³íÉàvr—“x‰rŽuPú`ŸZ6¥¥¤îMM¥÷K�~\¥¨xñtËnðO·¸vñ +;[ú8'Sx»¦8 ¤á$ÿèدðs ÔÖ›#®1ÑM&èhzTv÷ió$±çÑß‚æ”5?;<éäH˜¥ˆT›I˜ø&‰_õ¼ÑÕgFõáñ31©¬9:ÖÖg{OH‡†U˜êù½ûCAK˜y²àKÀŠ ~h»J°%òÓÕ=.õc«IJšƒ©9Ÿòyá9BjLzŽf¼:÷~fÜŽ‰Ps’$iç!^×ZQõH?}«K9¬„‰þ”Wl?�1¾%.TMôNýéJ#b ÿù;}C‘œ§Å§ª_RuWÿüHN„X¡\•Ã×6ƘáBë³Êb7‹ òÚðá+�{iÆÕØ—©ÒHPg½Pk�£=ýq ŽñŽåö{¦:ºÔ’¯òâËâK„$qŸi¾´:d×E 6*8´w*çÁ8 ðÙ”L>]g‰Í-ÃÑz-óç9gÞhŽúÌ"Äs ÛG/W6ñÕ*ŒU1Ö"k’5±ž•OTñ†VÓ‹‰'µ÷Ä1«DË ¶Ê:¾ÏÇ!œµ{¢ÞÅñ]×ýJ_|³¤ÆGÕà n8h’HªÔF}¢Oêä.£žCg>xLiÖaµt.IxFóï)(…µµÂùÀÈ«7ÊöJÉÑ2$Ò,òÝùÿÇ9Pì4긿^;¿åFÿ¤h_ Í3”ÚÔO¤±µäz¤]m‰\5…X 4œsÂ,”ïéóp]Ç6üƘ’d`¨ÖÇwøuNa1Ò–—’¸µÄJ(�æ˜ /Ý}ž0sý°{¿¤¾ ¡Í_D661‘’Ù̲m@üSiW>D}² ™üf’øuªá6“|cFtÔš�*…òKŽ°|ë |åîÃyÉÒÔâÐ…ZÐ5lI’¤AÙí¹'vDÇ—ÔªæºËÓeÝhßÄZ[uª�Ï’Ÿ{,=¸ƒ€|2ùa¦…YÈ„çÔâ}2RÁÊöò\눸»·Æë½tƒsãE/QÊ.qø":Õ!€…-úË×á‚S°^ÍžßèfU[Ïhj\€fÍíÅs‚'©VÈû®¸pMYÉâ!«ò`¾… ˆl%b‹^®¨NP+¤únjR3Å*ëx˜Sú³žðŽcÑ€ì"Ê؉ÁBÉÃýÁñ3úžó‘{¼ãDâY.̤¸þú=–<›ahs£H©§ÆärAO[Õ‹•Å…,¦$à9dÝ*½ùËx˜ñ¼Ððqñ—)^ßW+eð¬`£ºÕA驘lkjçZºÎ±jÛÆÑ d‰7C•—¦¹ª¾vþ¬ôqŠ¦IÒž¶Ty`5…u³O “¼èE<Úؼ¬ú"¡k—Ë3¿tîYeSOt¸´ñ6dßM¿ã:jA¶-sŠoü]Ù«V)Ñ{Pž5XK€bJôþjDÙz‡7»m‡.Ù |EÛ»$y+Öß�&g¼ôÝ£¥3ÙIq©7rèÈí–‘±YkirÜzßÝØKÌÇJ•Jk¦VwˆD‰ŸÛþQ$d*o?ä¦Å&í‹°AYü¸58êè·iýx£o¦Z¥êæþ×Áµé·Žú[AÙñ„çÐÊKï9aÏáü’¬ê³.1:öŽ¾¼ŸÊxöþÿœð0z§D‹óp=W<èì˜fê@åV7Ôw¸$ÛZÀOo)/ëdÚÕwÑ?Njè‚îbbV)þŠV‹†u„•<§u2\‹0Çšê¼Nvx®œ6G*;YkÂÌ¥é®Xï[ê[ËO}vÆù:ÌmOÚð¹hõ8ûeCÏм©k(ÀS¥·¶áæ'nS“LO@ž}b¨íÞ“x»œ&ÿãúÛ>NÌücç@¸5$jªÒɲªúëÕ˜\ë¯kÐO•Ôyï§Þ[>Ã~‹5©ŽÔtÈðV²</Õxõ?*L•q«„’Z“Þ´à0Û=œ¢Ò+êæ\RãcX,ñª©1òꥦë4µrðCmQ¸{Zà^–V«»</#0ŧŽL~¨ ÈFIâ/Šš ‹Z2Ð@é[žZ6©l-§œ¼fAB#ƒÛÁÇ%/ýûUâÕÔ•‡ÿZ àxëR§S<Ó3Óñ83Ök- 8*X(„SgÔÊéÔºT‘°e±ìȲEÉB¾$„°²¿¬ç†„LjÔezò{Þyy¹÷¾û¾û»ßïûÝ„5‹è©Ô +mÑ-¢‹È;TOg¾ÊŸS¨½Èäk fÌöáºPc_‰g*V�‡â¦ï +Š.h(³§Ý5òƒÉõÇñ¹µùŸ«îú£Í0<úʈW*¿Ãk�L:óX³�a?Ò:²Ìålî«YÑ+,žX¸Ÿ\îjÝ‘vñ‹ìίO™—�–Ìâ7Q*''A’uªÝÈ/´1óû‹Â.Vݶ?ÅAyvëâ+nð²Bå÷ÞC§µ¥C¸OŒÏ1–.¬š³Òe‚V,¦ØÄ(ÒŠQf†U³1Û؉pÑ¥ïX-NýÖëk& +³Ó€†—&¬cŠ\x…E²¥×D Z±“>µÁøÖGáŲ2†É<ÒùKÛ“} Ê,hUTEåþ{°H! ¥–M…4”fÇñÑ8i2¸I€ŠHIÆŽ{¦nœ‰WJ�³ÀH½m¨a¼Z“®;¥5»î·6<Ъ`ݸƒæ¥»ô¡QAe÷];Òð$Q¾õ¤nÍSâ�2éöà ì¨Ænù·É>¼È×´~O+ü,¹<u¹e8G ˆÜV›SŠ;#¾ÿ{g‰¶W^~(ñÓ¡ú¡½Xð³ —±í†EÂ[1=Æø øjÖð®´Ÿ;›[ÇÛ:_&œ94²·¥™:7·É!ÖhÓ+Mü–ÙŠ¨‡…Qûˆ•Ž¯•ÿ]¤šÈêtRÞ±å{Úuhß‹tkÑ ½À7V|av¬èU/72B/o<%ÖèˆL˜d/qæ5�é»ÆåýíYGLfqñáhêTœ»\sÇÊ?b;Qæ?¬6·{x2}—-ÿêPÒmsAˆ¶¬Ñn{þŽ.ë}}ÕióØcÐëq]’Åla¶$Í°Tš¸í9Üe½Á»¤ySJu,ƒyŽÁªÕ›qÚèÌ+gÜŠ†Ö§ˆò“‘ÌÚNò£èª;?D +0{]ÔÆAŽì§#k·þQŒÍ½¼råÀ´¹WŒ²ŽéˆÔŸ=ÿàîSö¨lÙ[Dmú—b™Ý‰l¶ÒhôTþ á`@ £”Œ½à¤Ñ?l|ä(>ëú^ƒÉ/<?–ñæî»Zòm´¿£¸¬mø—™ßjuA+0úEžÞ>7-Ëû® x¤}}sêëü+íôŽiÉVÐå]°æ¥ñ,ÖnÖlÞÀ^¢¯ŽÒëZžLBÛÙÜ„–}D…@ü\_|õáNöŸ–îÿN•¾Sso‡üFˆ0aÿhJ¤‚I…!•ë¾{Z‰|Q…»IH>–‰®•W}ûÁ›¥±tü¨ðM‘÷kÁ•.%²9©¼ÞrùßÃÑ�6‰2+9ÍdìjyŒx»ó\kï5’ÂWÒKó ŸŸïý>M=!òô"×u‘YË\Ç#Únó# ™fŸHÁ…”? +"“ÉÂI/³³Å�‘ŸÂæ|ÛÛÓ霾ú•„üÈ—@º2ы݉|$þך?…´¯ª*¼ (“Å¢.Ì‹µZxCÂm0›-‚þiìuü¥#ˆ¶œ‰Æþ#µx~u�‘Š”ö©/pñÆÑ·(Kéæ|Ig,ÝW|“ÀÃ"¦`büÏOŸ8qî´AM”Pj[X×óÄ.èÿ\*t°»·˜M–îöÁ;_•^:š–=üíO¡9•!åu"˜*’Á ‹7ë·!fÔšÿðzO<}Ö+—'ìIiÑ@G?üÏAˆÿ¿wvØõß%ø‘D쿺 PªPj;82ɼž†süガ‘Ñx|Û¡ÌÊÙ•»‹ñAu„Àb�‰h·²R2‡;,ÝF…êëAc0a‡G?ik8.”ÜøáÍX ô¿‹z}‘p"ª›±§µypO²îK· ±¬¨'Ræà°ÒoofnK®qzR8Bé6ò¼’«ùú¯Ó‘%3ßôòöµµ¸UžunÝΑ:qbÒd·ŽŠ·‚I…ê +›‹åóËÀpþÒán÷Hn4pä²ÛÃCûÛ[ݳ¦}4(Î=ciÌá¥ÿ{…Ù�Ä ÑenÏáVj£X¼ ƒ,.ÚŽÀ)xêcƒÎl®Oÿ“Å(<âüíÊï¤6ÈÏÕk‹Ý(šs«¾yÛ�¨h½P”ÔͺHcÔ +E"¥zc¸óN�G‰&•^§±Ô’¬Åΰ[²ÒL$•ðÇç5:o~Þ¶‡\oÀö'³8§ººÒ8}s‹–M˜p§èžÈ8‘J;sRñqq¸ã—?ÄV[îV‚N3è¹ýÃÀzmrO{Pè %Ã| ?¡Í-áÍO²ŸsEK +µÞL&“¶ÀN©=ÃZ``Ȥ3È¥ª^º�ŸO½_z-2/åx¦½,:‚‰;™ùY2î]2 q8r,›•Ó7$ÕBoñ«·ŒfS2ãö(Áõ„¿–5¤T·áÚØMŒV¯p¸Šß?5>0 JαÞÉÆÞÆŸiei?&”ª§'}šn#ÜÖ?Å$ÅÄDdŸ¼T�dÇŸL +!’±£côÙyÈô‹“ûo ¸—!ý |¹dT°§TOØ]‚Í®<t·üÄÏ^-½Ts!ïËSÙ ê!¦:ÉJuFìɬgrN_Ìû¦ðàÍÒ?ü·zw ¡d„Ï[’IuÛbÖ4�A bU]Ó³XÞP +½ûÓI©¨{¿¿·¨öƒ‚Àês«>Ê©´5 éûó«ÿÝNK¡ÒRŸ2qœÁÎ)ɤ7Z,>º%€JH”êáysz®ubêñø$Y Wpß5) zF¡ÖMo{™>øàƒ>øàƒ>øðæð?�˜> +endstream endobj 189 0 obj <</Intent 199 0 R/Name(Layer 1)/Type/OCG/Usage 200 0 R>> endobj 199 0 obj [/View/Design] endobj 200 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 193 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 192 0 obj <</LastModified(D:20161013192721-02'00')/Private 201 0 R>> endobj 201 0 obj <</AIMetaData 202 0 R/AIPrivateData1 203 0 R/AIPrivateData2 204 0 R/ContainerVersion 11/CreatorVersion 19/NumBlock 2/RoundtripStreamType 1/RoundtripVersion 17>> endobj 202 0 obj <</Length 1437>>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 17.0 +%%AI8_CreatorVersion: 19.2.0 +%%For: (Quintas) () +%%Title: (icones.ai) +%%CreationDate: 10/13/2016 7:27 PM +%%Canvassize: 16383 +%%BoundingBox: 25 25 75 75 +%%HiResBoundingBox: 25.9999999999973 25.9999999935353 74.0000000000036 74.0000000000009 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%%DocumentFiles:C:\Users\Quintas\Desktop\google2-01.png +%%+C:\Users\Quintas\Desktop\banco_objetos.jpg +%%+C:\Users\Quintas\Desktop\dominio.png +%%+C:\Users\Quintas\Desktop\logo_1__2_.png +%AI5_FileFormat 13.0 +%AI12_BuildNumber: 111 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Registration]) +%AI3_Cropmarks: 26 26 74 74 +%AI3_TemplateBox: 49.5 50.5 49.5 50.5 +%AI3_TileBox: -256 -346 356 446 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI17_Begin_Content_if_version_gt:17 1 +%AI9_OpenToView: -663 289 1 1103 725 18 0 0 182 216 0 0 0 1 1 0 1 1 0 1 +%AI17_Alternate_Content +%AI9_OpenToView: -663 289 1 1103 725 18 0 0 182 216 0 0 0 1 1 0 1 1 0 1 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 203 0 obj <</Length 12101>>stream +%%BoundingBox: 25 25 75 75 +%%HiResBoundingBox: 25.9999999999973 25.9999999935353 74.0000000000036 74.0000000000009 +%AI7_Thumbnail: 128 128 8 +%%BeginData: 11916 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDD8FF +%A8AFFD0484608460FD0684A9A8FD6AFFA9AF84846060353C1336133C131A +%133C1336133C3560608484AFA8FD60FFA8AF8460353C13131319133B133C +%35605984608460846060353C1335133C133C3584A8FD5CFFA8843C3C133C +%133C353C3C6084AFAFFFAFFD07FFAFFFAFFFAFAF603C353C356060AFFD57 +%FFA9AF353C133C133C35606084A8FD15FFAFAF6060353C136084AFFD53FF +%A984353C133C1360608BA8FD1BFFAFAF8460353C6084AFFD50FF84601335 +%133C358484FD21FFA884353C356084FD4DFFAF5A3C353C356084FD27FFA8 +%60353C60FD4AFFA884353B133C3560A8FD29FFAF84353C35A8FD47FFA860 +%353C133C3B8BAFFD2CFFAF603C35AFFD45FF8460133B133C60AFA8FD2FFF +%843C3584A8FD42FF843C133C133C53A9FD12FFCFCFCACFC9CAC9CFC9CFCA +%FFCFFD13FFAF60358BFD41FF603C133C13352F537DFD0DFFCACFC9C9A0C2 +%C1C198C1BAC198C199C199C2C2C9C9CFFD10FFA8601384A8FD3EFF603C13 +%3C133653534C77A2FD0BFFC9C8FD04C1BAC1BBBB99BB9999939A939993BB +%99C2C1C9CAFD0FFFAF603584AFFD3CFF8435133C133528534C4D4C777EFD +%07FFC9C299C198C198C198BB93996F936F946F946F946F936F946F9999C1 +%A0CACAFD0DFFA8601384FD3BFFAF60133C353653774D534D774D777EFFFF +%FFCFCFC2C1BAC1C1C1BAC1BB99939A939A6F9A939A6F9A939A6F9A939A6F +%9A939999C8C9FD0DFFAF8B3CAFFD39FFA860133C1335534D4C534C4D4C53 +%4C537DFFC9C299C198C198C1BAC198996F946F946F936F946F946F946F94 +%6F946F946F946F9393C1C2CACFFD0BFFA8843CAFFD38FF60133C19365377 +%4D534C774D534C534D77A0C1C1C199BCBBC1BAC1999A6F9A949A6F9A9394 +%6F946F946F9493946F9A93946F9A939493BBC1C9CFFD0BFFAF603CFD36FF +%CB84133B13354C4D4C534C4D4C534C4D4C76999993996F9398C198C2A1CA +%A8CAA8FFA8FFA8CAA8CAA1A19A9A6F946F936F946F946F946F946F9993C2 +%A0FD0BFFA88460AFFD34FFAF3B3C133C53774D534D534C774D534CA099BB +%939A709A99C1C1C8CAFD0FFFA8CA9B9A6F94939A6F9A939A6F9A939493C1 +%C2FD0CFF8B60FD33FFAF353C13352F4D4C534D7753774C534C9999996F94 +%6F77709F98C1A0FD13FFA8A16F946F946F946F946F946F946F99C2CFFD0A +%FFAF6060FD32FF603C133C355377A8A8A9A8CBA8A97D9A999A6F9A70534C +%A0C1C1757777A9FD13FFCA9A9493946F9A93946F9A93946FBBC2CFFD0AFF +%A86084FD30FF843C133B137EA2FD07FFCAC293936F9B77774D7698C19953 +%284D4D7EA2FD13FF9A9A6F946F946F946F946F946F999FCFFD0AFF8460A8 +%FD2EFFAF60133C1360A9FD07FFCFC3939494C3CAFFA9A899C199764D774D +%534D787EFD13FFA19A6F9A939A6F9A939A6F9A9399C2FD0BFF608BFD2EFF +%84133C133C84FD07FFCAC3939370CACBFFFFFFC9C198C277534C534C4D4C +%5353A8FD12FFA19A6F946F946F946F946F946F99A7FD0AFF8435AFFD2DFF +%3C3C133C60FD08FFCA93949ACAFD04FFCAC2BAC2CAFFA27E4D534D534C53 +%53A2A8FD11FFA89A6F9A93946F9A93946F9A93C2CAFD09FFA96060FD2CFF +%843C133B1384FD07FFCA939376CAFD04FFCFC998C1C9FFFFFFA8A877774C +%4D4C4D4C777DFD11FFA19A6F946F946F946F946F9493C3CAFD09FF7D5A84 +%FD2AFFAF60353C133C84FD07FFA0949AFD06FFCFC1C1C1FD07FFA87E4D53 +%4D534C7777A8FD10FFA19A939A6F9A939A6F9A939499CFFD09FFA9598BFD +%2AFF84133C133B13AFFD06FFA19A9ACAFD06FFC2C198C9FD08FFA8A85353 +%4C4D4C534D7EA8FD0FFF9A946F946F946F946F946F939AFD09FFA85335FD +%2AFF603C133C353CAFFD05FFCA9A94CAFD06FFCAC1BAC2CAFD0BFF7D774D +%534C534D777EFD0FFF9A9A93946F9A93946F9A6F9AA1FD09FF7D5384FD28 +%FF843C133B133C3BFD05FFCAC36FA2FD07FFC998C1C2FD0DFF7E7E4C4D4C +%534C4D53A8A9FD0CFFA26F946F946F946F946F946F9AA8FD08FFA2285AA8 +%FD27FF8B353C133C3560FD05FFCF9AA1FD08FFC1C1C1CFFD0EFFCBA85353 +%4D534D5353A2A8FD0BFFCAA1939A6F9A939A6F9A939493C9FD08FFA2532F +%AFFD27FF353C133C133C60FD05FFA09AA8FD07FFC9C198C8CFFD10FFA97D +%774C4D4C534C777EFD0BFFA19A6F946F946F946F946F939ACFFD07FFA84C +%2F5AFD26FFA83C133C353C138BFD04FFCAC2A1FD07FFCAC2BAC1C9FD13FF +%A27E4D534C534C777DFD0BFF9A9A93946F9A93946F9A6F9AA1FD07FFA877 +%2984FD25FFA884133B133C133C60FD04FFC9A0FD07FFCAC998C19FCFFD14 +%FFA8A253534C534C4D53A8FD09FFA16F946F946F946F946F946FA0A8FD06 +%FFA84D4D59FD26FF353C133C353C35AFFFFFFFCFC1CAFD07FFCAC1C1C1C9 +%FD18FFA27E4D534D534DA2A8FD07FFCA9B939A6F9A939A6F9A939493CAFD +%06FFA8774C59AFFD24FFA83C133C133C133C84FFFFFFC9C2C9FD07FFC2C0 +%98C1C9FD19FFA87E4D4D4C534C77A2FD07FF9A946F946F946F946F9A9BA0 +%A0FD06FFA84D4D53A8FD24FFAF133C353C133C358BFFFFFFC8C1CFFD06FF +%C9C1BAC1C1FD1BFFCBA853534C534D777EFD06FFC46F9A93946F9A93A1A8 +%FFC9C8CAFD05FFA8774C5384FD24FF603B133C133B133C60FFFFCF9FC1A7 +%FD05FFCAC298C198C1CAFD1BFFA8A8534D4C534C5377A9FD04FFA1946F94 +%6F946F9AA8FFFFCA9FC9FD05FFA84C4D4C84FD24FF60133C353C133C3584 +%FFFFCAC2BACFFD05FFCAFD04C1C2FD1FFF7D534D534D7777A8FD04FF949A +%939A6F9AA1FFFFFFC9C1C9FD05FF7E534D5335FD24FF353B133C133C133C +%60FFFFCAC1C0C3FD04FFCFC1C198C1BAC8FD20FF53534C4D4C534D7EA8FF +%CA9A6F946F939ACBFFFFFFC9BAC8CAFFFFFFA87E4C4D4C59A8FD22FFAF3C +%133C133C353C1360AFFFC9C1BAC9CFFFFFFFC2C1C0C1BAC1C8FD21FF7D77 +%4D534C534D7EA8FF9A946F9A6FA1FD04FFC2C1C2FD04FFA953534D532FAF +%FD22FFAF133C133B133C133B35FFFFC998C19FCAFFFFC9C198C198C198C9 +%FD22FF7D534C4D4C534C53779A6F946F93A1FFFFFFCAC298C2CAFFFFFF7E +%534C534C5984FD22FFA83C353C133C353C133CAFFFC2C1C0C1C2FFCAC2BA +%C1C1C1BAC1C9FD23FFA8774D774D534D77709A6F9A94CBFFFFFFCFC1C1C1 +%CFFFFFA87E4C774D532FAFFD22FFA8133C133C133C133C13AFCFC898C1BA +%C19FC1BAC198C1BAC198CAFD24FFA2774C534C534C946F946F9ACAFFFFFF +%C2C198C2CAFFA8A24C4D4C534C5384FD22FF843C133C353C133C353C84FF +%C2C1BAC1C1C1BAC1C1C1BAC1BAC1C9FD25FFA8774C534D776F9A939476FF +%FFFFCAC8BAC1C1CFFFA84D534D534C5353AFFD22FFA8133B133C133B133C +%1360A8C898C198C198C198C198C198C199CAFD26FFA2774C534C946F946F +%7053A8A8C999C198C1A17E4C4D4C534C4D4C5384FD22FF843C133C353C13 +%3C353C3CAFC2C1BAC1C1C1BAC1C1C1BAC1BAC1CAFD27FFA8784D776F9A93 +%9A4C774D779AC1C1C199774D534D774D534D5353AFFD22FFAF133B133C13 +%3C133C133C60C8BAC198C1BAC198C1BAC198C1C1CAFD28FF7E7770946F94 +%704D4C5370C198C1BA994C534C534C534C4D4C5984FD22FF843C133C133C +%353C133C1360A0C1C0C1BAC1C1C1BAC1C1C1BAC1C9FD29FF7E9B6F946F76 +%4D534D9AC0C1BAC199774D534D534C774D532FAFFD22FFAF133C133B133C +%133B133C137C98C198C198C198C198C198C198C9FD29FFCA76946F704C53 +%4C7698C198C1989A4C4D4C534C4D4C534C3584FD22FFAF3C133C133C353C +%133C353C35A0C0C1BAC1C1C1BAC1C1C1BAC1C9FD29FFA89A939A70774D77 +%99C1C1C1C0C176534D774D534D774D5335FD24FF133C133C133C133C133C +%133C58C1BAC198C1BAC198C1BAC198C9FD29FFA16F946F704C5376C198C1 +%BAC199774D534C534C534C534C35A8FD23FF60133C353C133C353C133C13 +%3C7BC1C0C1BAC1C1C1BAC1C1C1C2FD29FF9B946F9A77534CA0C0C1BAC1C0 +%9A4D534D534C774D534C535AFD24FF603B133C133B133C133B133C133599 +%C198C198C198C198C198C2CAFD27FFA89A6F949BA84D7698C198C198C14C +%4D4C534C4D4C534C4D4C84FD24FFAF353C353C133C353C133C353C13839F +%C1BAC1C1C1BAFD04C1FD28FFCA949494FFFFA299C1C1C1BAC199774D774D +%534D774D534D5384FD24FFA83C133C133C133C133C133C133C357C98C198 +%C1BAC198C1BAC1C9FD27FF9A946F9BCBFFA0C198C1BAC198764D4D4C534C +%534C534C4D28AFFD25FF353C133C353C133C353C133C353C35A0C0C1BAC1 +%C1C1BAC1C1C9CFFD25FFCA9A6F9AA8FFC9C1C0C1BAC1C09A4C534D534C53 +%4D534C774D59AFFD24FFA860133B133C133B133C133B133C131A349FBAC1 +%98C198C198C19FCAFD24FFA8A16F9376FFCAC298C198C198C1704D4C534C +%4D4C534C4D4C4D53FD26FF843C133C353C133C353C133C353C133C59C1BA +%C1C1C1BAC1C1C1C9FD25FF9A9493CACFC8BAC1C1C1BAC199774D774D534D +%774D534D774D7EFD26FFAF133B133C133C133C133C133C133C133C589FBA +%C1BAC198C1BAC1CAFD23FF9B946F9BA8C9BAC198C1BAC199774D534C534C +%534C534C534C5359FD26FFAF60353C133C353C133C353C133C353C133C58 +%9FBAC1C1C1BAC1C0C8FD22FFCA9A6F9AA1C9BAC1C1C1BAC1BB764D534D53 +%4C774D534C774D5353AFFD27FF843C133B133C133B133C133B133C133B13 +%3C589FBAC198C198C198C9CFFD1FFFA8A16F9476C39FC198C198C1989A4C +%4D4C534C4D4C534C4D4C53287EA8FD28FF3C3C133C353C133C133C133C35 +%3C133C133C58C1C0C1BAFD04C1CFFD1FFFCA9A9493C2C1C1BAC1C1C1BAC2 +%77534D774D534D774D534D774D537EFD29FF60133B133C1360848B603C13 +%3C133C133C133C349FBAC198C1BAC19FCFFD1EFF9A946F9998C1BAC198C1 +%BAC1A1774C534C534C534C534C534C5353A8FD29FF843C133C1360AFFFFF +%FFAF843B3C133C133C133C35A0C1C1BAC1C0C1C2FD1DFFA1946FBBC1C1BA +%C1C1C1BAC1C9FF77534D534C774D534C534D53287EFD2BFF353C133C60FD +%06FFAF60601335133C133C357C98C198C198C1A0CFFD1AFFA29A939998C1 +%98C198C198C1A0FFA8774C534C4D4C534C4D4C534C5384FD2CFF353C35AF +%FD09FF84353C353C133C355F9FC1C1C1BAC1C1C9CFFD17FFCAC299C1C0C1 +%C1C1BAC1C1C8CAFFFFFF77534D534D774D534D774D7EA8FD2DFF85133C84 +%FD09FFCFA8583B133C133C13357BC1BAC198C1BAC2CAFD15FFCAC298C1BA +%C198C1BAC198C8CAFFFFFFA8774C534C534C534C534C4D53AFFD2DFFAF60 +%3584FD0BFFCA7C5F353C133C133B58A0C1C1BAC1C1C2C9FD13FFCAC8BBC1 +%BAC1C1C1BAC1C1C9CAFD04FFA953534C774D534C774D532884FD2FFF843C +%35FD0CFFC97B59133C133C1335347C98C198C198C19FC9CAFD0DFFCACFC2 +%C198C198C198C198C19FC9CAFD05FF7D534C4D4C534C4D4C53287EA8FD30 +%FF603CA8FD0CFFCFC27C353C353C133C355F9FC1C1C1BAC1C1C2C9FD09FF +%CFFFC9C8C1C1BAC1C1C1BAC1C1C1C2FD08FFA24D534D774D534D774D7EA8 +%FD31FFAF3584FD0EFFC2A0343C133C133C1335589F98C198C1BAC199C8C2 +%FD05C9A0C2C1C198C1BAC198C1BAC198C2C9FD09FF534D4C534C534C534C +%7784FD33FFAF3CAFFD0EFFC9A0583C133C133C133C357C9FC1BAC1C0C1BA +%C1C1C1BAC1C1C1BAC1C0C1BAC1C1C1BAC1C1C9CAFD09FFA8774C534D534C +%774D5359FD34FFA96060FD0FFFC9A07B3B133B133C133C13597BC198C198 +%C198C198C198C198C198C198C198C198C19FCACAFD09FFA87E4C4D4C534C +%4D4C5353A9FD35FFA86060FD10FFCAA083353C353C133C353C59A09FC1BA +%C1C1C1BAC1C1C1BAC1C1C1BAC1C1C8C9FD0CFFA953534D774D534D5359AF +%FD37FF846084FD11FFA783353C133C133C133C137C7BC198C1BAC198C1BA +%C198C1BAC19FC9CFFD0CFFA853534C534C534C5353AFFD39FF846084FD11 +%FFCFAE5F60353C133C353C135F58A099C1C0C1BAC1C1C198C2C9CFFD0EFF +%77534C774D534C535984AFFD3AFF606084FD13FF8460353B133C133C133C +%3559759F99C198BB99C3A8FD0FFF77534C4D4C534C2F3584A8FD3CFF8460 +%84FD14FFAF603C353C133C353C133C35847DA19ACAFD10FF77774D534D53 +%53591360AFFD3EFF846084FD14FFAF8460133B133C133C133C1335355A84 +%AFA8FD0BFFCBA9774D4C534C532F363584A8FD40FF846084FD15FFAF8B3C +%3C133C353C133C133C133C3C6060AFAFFD08FFA8FD04532F5A353C358BFD +%43FF846060FD16FFAF603C133C1335133C133B133C133C133C3560608460 +%8460602F351336133513193584A8FD44FFAF8B608BAFFD15FFAFAF606035 +%3C133C133C353C133C353C133C353C353C353C133C353C133C60AFFD48FF +%AF5984A8FD17FFA8843B3C1313133C133C133C133C133C133C133C133C13 +%3C133C84FD4CFF848460AFFD18FF84843C3C133C353C133C353C133C353C +%133C353C356084FD4EFF84845984A8FD18FFAF8460353C133B133C133B13 +%3C133513133584A8FD51FFAF608484AFFD18FF7E7E3536133C353C133C13 +%3C356084FD56FF84605A6084AFFD11FFCBA2A277774C532F35133C131313 +%3C3584A8FD58FFA8AF6060356084A9A8FFFFFFCBFFFFFFA8FFA8A87EA277 +%774C534D534C77533C133C3C6084FD5EFFA88435603535355A597E597E77 +%7753774C4D284D4C4D285328532835356060AFAFFD62FFAF8B6060355A35 +%5A2F2F2F532F532F532F2F2F5A595A598484FD6AFFA8AF84AF8484606059 +%6059605984608484AFA8AFFD75FFAFFFAFFDFCFFFDFCFFFDFCFFFDFCFFFD +%FCFFFDFCFFFDFCFFFDFCFFFDDDFFFF +%%EndData + +endstream endobj 204 0 obj <</Length 47758>>stream +%AI12_CompressedDataxœÜ}g{Â8³èýü>Oþ$$t°éBÇô@€@ +Õ”PL0l9îo¿’ÜeÏÝsv÷ÍXž‘F£iš‘îÍ–;=¡F¤ÛïÁL7ÿ¹¿ÏîÈážÚÅLègSiµ:ÐûüÉÖ´›ð°ƒÒ¥HŸmÙ!wô‚ÚÄLxÔãcžð}ÛËa±Ùi»Éf‡?¶û ~^Œ© I{†;¼žîÁCóâ~¯ÃC¦pÌ65j¨ÍpóǦÿ[„ü?ü1C6“Åf–¡þŠ™|Aø_þŸM’–5ðD…Â~ñþ ø×x0áHö…€sÔø°&7ûÆŽ“4¥VÔŽŽ™²7¦ÚpžM]rµ¢þ4eVÃñRü±X‘t,û|¥Å>Yê|æHz¹§¶Ÿ3ŠšHŸÃ=Û;èTm;nÆTŸý{ŠöülušO¨õb³ ôᮨÕÇû}_Ÿm›.û°ß`B×ý ÷£ùM—p_?sX¬&χõˆsã8úÝßG$y¥-�Yàgô{¸_ZƒŸZä~fP±I³üŠþµ}4ÉÙ1`Œ/;yGm×ÃݼíÁÿÂðû°M®·+ÀBh²QOÐÄÀþ׌5qû‚!“Û™üàC bLþ± ÿŒ™ž³²„Hïö-†cþ²š‡¹{Ý,ö s¨(C‰5!Wà ±" qá/Û¢=ÜÍÈ=`_juØ£eá±�jW‡“ã€x¸Ÿ¤Ú�\›=èu1íÿÁ,ÇþlÃÃl»h¿¾%7mªƒ†ä…�ÿG¢�/Žc€óÁÒÁ#LO">“,>®w¸ð—C˜^íÉÝšCzuùÍ¤Ï +r"ÁDX ŽaÈG ÀZõÝ"Æ2Ü/ìßÂ>S„ùƒˆí‰0‹Ç£>,ê‹ý…!<Á>#¿°Ô³¾Ãà'Î×ÏÖD«óÔZp$`èYj F2N.X"`]²O…/è�qز¤a8ðkcVõ®ßgæY¤ßXÀÃÂŽ:lK›)uó#Ý;äHpÀÔSH“ñk´RMíÝp`€ï| ²·v€9r +D…‰y^f~Íoþ WÔ–~gÚØX 7à =àV€'C0N$lHîßÀ³±u}åþßPŸ�ïmYP/PYÿ4ˆAU]lŽ@ ߆»ýŸÔn 'LPÑò/RbkIîÇs9Lö׳¡6†û9ÐyäfBóT`¾ +t†³ÆüfdäÙájµ˜í†ÛùblÊìôÜÔ¦¨]á9Iü=‚ošY¸Lw›ú†Ï1V¶!ìÌ;ÿblü[J˜ÀÃÿIX8Âä'À *‹P³MëÏ!`øêbdˆ[¯GÔjA¯yèâ_`Ù,Æ+²õ7½' IµÖuN‰FÒG<ØŸO¢Ò?NÛt±™�8ÃbO +k“Zo¡ùmj͇[QˆkÙ@‘ªi,·Û€.c”"ꣳøá2c©}1=ªï�6»ÞC“¦°ñ‚¿ {í&Û!¨–%Ýù†¦&AµÂgÀ²ò¡ÿ ½Ša&Ñ¿×ï”yÍäýßÀ×¹ù·²¡þÜ o¦Ë†Ú˜xØnò>פɚ¤‘*äÛx9ÖnäOøZv4½‰iÂülGcð²m�Üäí,èÅhÅ�U�ÒÚì$ ™!½‹ °g¿£–¤©>Ò$0—p-GJÔäe( }*Ž6 DÆ´ÉO§Èó"§¶ò!,«úŽm ;˜[Œ¡‹0ÜýmŠŠRÀmS€±'lý°§ˆ¼æ ]8I3_í¥>Jóæ?˜ÇðaXq<‚…‚pŒžh$ä…"A`Òñ0ü#˜Ø¹ˆÏç‡æqÈû©ˆbx4„E`ñaô‹/Àñp(Ƃ༧FÖÂLïÃoeðéÇ„GM¦5ÕL_˜irž6!ÁÿOààÉ©éÑtó“M44(0!°6¸]K†àù£ QÎô^öBÑ8ÛÀï˜�™fŒW´AÁ‰;‰ó4'–ðáó›údÂÌ%D#̤"I•(ŠS”‡¤N/í#+ïzCö"xgŒM4&„æ À;ù¿È1ò½™‡Ä±,û�¿«ý—X˜µëíJf˜©ÎЗóuqÓûþ‚–Y8ˆÇ2‚Eü°:Ð +GC_0èžc @¿`>ü‘P �k)À|Ñ`4âó‡xJ¨/#åU„3sÎøPâq"A„¿HŒëëƒÆpœY’lctíÑÉ#BˆšïÿgA*jŒÁÿ2BŸùž¦¼ª�¨d’ Ã49SWâó±"!¨ÿÃý€ÉUÃÀvšZå†{À]÷}/÷äAøU´¶Ðïµê35!U?šlWÐÀ ŒÁÝbtØ“4Z4 qz·þ·‚¹Q»ñ|±šìÈ Û +hÖ ÿþÙÿ½%ÙǶ‡ Ýÿc¸£EšTÜöáêÀ7†h•† %Øvlohé×ÿñ¤æi„J+j¼$'†ÈÄ5uý+8Z -ÜÈ Ï´Èý3Š›_“).' +®Mc¤X¦7´2ŒÌôÿwF8](Äþ0.`ÛÃÃqŽCÿâïeÑ=„¶Ô¡`çÔÿŽuÓ‚žæ¿«?ÿ»–2=ýó_Àßÿ$9½ZŒÿ÷ˆqàŒxü, Eƒx8ä7y›äp¥1ü?“ýÜÐü³-ÿR<öDpô¯øWá°î0çäb67$rø¦ÿŠâ~0á@8„aÁ`0àÓè_ÆÖò¿ex˜‡™F<ŒEáˆîðþ64¼¿ÿ-Ãã[ªãQ{`‰TÉéžÙî74¼ã—þ5F’¦-ê°“([éj‚õ‹CÙx.øLò‘õ<åS•q†¸ù¿b` +%Ü£ì .q¤”34Ìã—þ7ô¥Æ~7ÜÐÛ!€86&¥/ü[8Cg”‹ÍžÜ†cƒqqóÿ!#ÜP5¸9òêQú¿b”¶;ýcDšOíúß6Vý¢Ý ƒ+4þ×èo}õôßëŸK%ý¿¢KÔv¿X/þíÏü«:\þE?Öä~8î‡WèLôâÎÜMØ#C+RÔý +ýA¶éR&Ž¨ánbC©dÂMÂêÕm:Û‘ü¸t„! ú�¾-·ÆTÀìm¹Õ.ḩ±#ir÷ij“íQ¾Øp´X-öœöçì2˜‚žÞ‘C&gEÉV’YO‰N³½f·E‘þ|9ô9t jòû&Ê+—¸-\WØ\ŽÚ&k2“Ç!0Áí‰×Íb&Œ›D6œsé& À|zy“\µ©&ƒ—éHƒ¢p`豓ÿ(ßðkøs=Fä†ñQ#'‹ÃÚ$äÀM¿Í‰Ò MlŽ5¹cæso:ˆqÆT#鹩9¤Bae“ûŠ“¼R?ì·‡½ÞKÏzÇý«7³ÌnP[˜‚èRä˜�ðöN�Ê0ÑpµàT\˜S¾“íÂ#gjzKíåﮇ4Ç)þ7°íp"Ò§é’)}ØSü9·èMË 5^R€&3&¥RÞ6jÚ·`6èÅú°Šˆäe± �-&&Z@ô|õ…ï“,|ÕvÚ£X€îI�ŠD{{FQ‹”ncAð‰O‹x3eW‹©M™¸• £(YÖ3ôÛâØ%ÏžòVE˜®OmŠâÐœ_µu–\Ä’1¨Õ0K6"ÖRnH¬(jÇ%È1Rm‹â2ÛáX¶PÚ«6nò¤F¢\£eF`_ȇ4šÄ“©3.Igý¾p(¬5º«ÛTÔß@0Vë/j+épã*Õ|xPuúà8óíumð½&ä"É‹˜JÏ`Ïæø‘2“7o‡+AF}¦H€Ùj½µò…£VDuÊ`XÔ@[±@^-"À+Nof+ýÖˆ4òæêüƒš3{P…œ¨¹À?jTGÍD¼£Åg¨˜wlLѦÈÜ[¦KÄaµât[ˆžª),™³Õ"WÅá¼^‚†RŽ+wµ¶U +ðT×’Öâm¸ïQ+HóiÊ«þáf¿0=9¤b¢†@q` ’D¶ÞQ¦p�ÁÃè;.ý6_ŒçC‹Rn?Jšæ×#rrÔ”×’¶0ŸØ4´ C•Û5rl +VˆÄ~=ž³#;5‡}¸`eCåTlת¦Ìp¼„ +~31e•µ)ßô•&MLõXš½wä~(CgÞ„…G]µ3&( D‰rSÁïT¦†ÒX¸wà ²–ÁWK›ñê0!M﵆Ú2�¥Ž2sfòó/eòŠ[Õ†ce[BÜèm±™PÒrʈšH9DJ˜ÉÖa4¥V°X‚ø³Ø…gG.mm’:“‡Úþ}ÌGtò$Óß‚[%0—˜Am m"Ó'†ŽLpïqöÁ©È‚ç¾è翱÷h“È4Ù˜ÆqŽ=ñE\Î8ê4:Ã? ·¨" ©Tç5µyÐy-̽æ;éµÈ‘cä-n¢ß’Ìyè$TEÑ©÷Æ ;é5\…»t^óñ–:%‡“;l7BŸMx%CÎ^;ñ°QL àZRŸä\1¶¢h‘¾ÑvÒêÛýßÐS¢yE† +ÍÚpÍiA½g +Vq2|E臦-Ù5SmÞνÁä‰ûÐ9°÷`ZVÆß`ýÔ=ÿŽ&}Q1‚d»öQ±¥ü¡8 +#n £rþ¯-µÛC_\P÷¸Š5¸åâ…Ôänsò˜JòÆúùc +fþeÚ‘30Ùü+˜(h$~g‡Â0î?Pý½i4\‰<Ìärñ) g©IÂÀË$ò;ÃÍ‚ž +ˆ}'M¯•Ô£*d+ˆ-ä°…£6R›ÚŠQ÷ù”Ì! +û$n,k¢"AÂÑ Î ‰úü¦ˆëƒ~#ê \ú†œeQh·´™µÈ1µÑõõd/‹Í"àç Ãb;CHk¸çˆ™4XCí=žF—rèl†â!óS8ŒóóŽò¨ÈN¸E–xjÀR¦É=¤Ý„²_ð�a{¡öMfZÕÆé?çæÃ+ì“z¨‘g´Ø¯‡P”…°™þŠÛogë¥hrBM§&¥J°PTÚ£ÓzŽÚã +Ý‘‚?Ð$Úø•’’r;Ù^€Ð˜ZHD ©r„‘Þ¯<$à‚ƒ£�¾Ç¾ Ú3òÒv²WãýÚNŒƒg’ô…W”&}»Ý±í´¦4b;ÀM0îSœbÐPœåŽª6“$‰*óh…<KÏ +¬$c-÷ÔV¿‡LÓ¿F?™ÆnÕ!=|K4£Š=Ë)¥ÞJŸP0J\×�'ow4Û¨ÚƒÑh…Å„¤³Ò.Ž¼%Z#6Q&j‰â_FiF`›øštbŽÇ¾Úyà’ÔiÔ2°òöpOMk@°)oŽàáo¿ù›ï&`þÂã¶å-§À|œS»ÿâBÌ*Ͷìv«&c Ä363²¸:$‘“7£aŸ‡¦Ûð‘Òãíjü·†|b7´&[ƒF{`aðÛyê£ü¦Ám ƒm¨5�¤ÆÈ UkÊaØŒæKÑõ…lÏnÑb1òX{x‚×/¨ªÐ‡!n™ ÒPÕzÆ;j«×fîb3¥ôÚíDeÞºxadx4ÜÑZS*µ8t•Ž¤õ^<.½ÆbÕcÀTõÄ@k‘ +Ôo,î‰ÒÊšnöžÉJG"2¶»)u‘·£Ëï?+Í †û¹Òèh2Z@ËVkÒiφœ E)9*ÆG»(ª ^Úè@[ác„á¨,ù@Cz>œ;R‹Z°¹‡®ÿôO ‡"<Y³°’6økë‘ü˜^Ðlwä� \¥¦3%_A©!«26Ë”2{p:M +ÔÆ +·þÐΟDì+µ¤¶c-‰ƒZÐZÓZL–hA¶ˆÝþœ/ö$¿På7É@éX2»ÉŽ6 wP³éa3Öb0¦„â™LGÙ —†› Ÿv$l5Óõ@Æk±Yf£›…Œ©”φðh(äöy²Ûdoowb£Riv@#è‰ÜtåF\ o¼þ{©AXQKj?'%Qh”^™Ò\{“Ê6vPU6‘«¹cN’ô°:¤÷\¶_Ë!IoÎPºd*ì†h^š†› ›ï¦™áƼ…Ž–„§ôÁ·P6äÑ[R\¸)ßhŽŒyÍ6q>Ù†"®¦ÅT¡ÉKj¯-QÒ ¤V¢ 4¯�fÄÁ„‚´T¬ˆ£¼"Jãʲáݦ4¼+o[gS Zª‰’fmAˆ†…íy¦ “¨çeNh5e$—µËCÕúÄb&É8µ`k=r10 Ò‹i¬O0i;Š1’Œ…(§™^¨MIŒìjÅ%Òšb½)nfZZQYǃ¦—‹-pJ7ZR¶Û‘ðüh’Ú ;þjMa¨MˆÞpǹÁ‹‡%‘ejO–TGy`sêÏâbBÊÙæ¨Ýf(·Àj¨‘»è± žÒm"°z³lûëgº 0©h1Bz4rDÅ?ÛÚ®†¤mSǾçsÉD@ðjL1ך�æÁD:mØ>غµ¢\ÈcÕïtUðw´ú̯D=F™A‰ÿ§Ú¶½[¬a½|§Y½¿ñÒ\F/î Z`k.ÜÍ-¦öHZ<¤˜&6k¢¹½Ð?çäÆD3»ÚÃøŽ4|LCþÌž‚›#ødgJìÙ#àR`SÓȵ1�Ÿ Ô¸<s!Aä2dü«ÐwÓž‚ Ƥi”óдþ ÓÇ[f¿&ÌÓð¬Ò!Ü_Ï¡€¢�†Á¶ô<€ÞQSý‚66KxúžG{qL@w‹ŽŸÂÍP?bÐj +š/iG+¸>´w`ØBî¯Îr”§ciASˆ¤e[ßÒâÛTÞ@R·ç‡õh3\¬Œ0;ZD9@sæXœÊ‚ß›TvUÞ;²ç|>%wUåm”¸Q¼cÒ{W”()îò ¯½†¢‰€×Dè¼ï”V©ÏÄnø÷4•¾v"I¥/ŸDQøê镽u +=á«'³Fm¨ñ|GIE¢4‰ +_Ö KÀ^eêhŠfïJQ:ŽZ`V®¦ÞH½h"¯0ÑÎ:™fŽô¯êU_Ìènöª¾Ú<»·‚݃+®¸…mt´‹nÄžaÜ™öqÿé‘L¸õ\$‘‰§4^Q&r·å�ŒT±©¬ƒ¹I*„ÔL¸7€Q5÷Þè‹:‘Ea±1A™ôxG†{æÒV,›•’�iTlM)îEV™lØKx¿,`r±…-¢wt¼*…ן '%p/3lXB·ì°?<3[¼yÞË¥ èÉbº0š’Áaþ[¾úNÒF„¿Dvqž1ž³Ã-SB¼ 5ãô'¤üiñÊJx ¸Ú )# ²¼7Êu., .OÜTG´$Ù&ø ¸ÃH1íä61Ñ”x3αN·²¥R$˜#áÌ¢§dýáÃ{²>ß]eÿCÝIí +ëyl¶1— ³ËfÍ.†Úz-æCw±Ôk!Q$cÕOk-µ;ŒÃDÞW‹ÜãÀ†Ñ¹ŸÜÌ…YRßG*îÚÒ)ºâó4©Çªyǵ*ï3³âK5ìâ)1Îy<Öٮ꤆sÄ},Ü+ìs?_™@ÏíJ¯©*.µösg"tw rË[æge}hrS¬<R„f G§áÎËÇgºõtÔ±ŠÛžRñ%ñ•ŠÑžµ3çº?¶Âd +Ð zÀ¹é×[8³JÞcÓÌ|Ÿ‡{¸„"ƒ‡Ü¯þ¦âIëtšÎ~Ͼ)ðéá7Wš”ÌwäÇ’n¹ï6L'Þ‡“@ý±9ÇùqðÅ–úñô½ÿÁ™yv œ©¬õ•È’G¢S¾›?ŽÇÃ%ü´pæ§Õ9ƒÇ¼ÃðnaÄßåIfuŸ´ºwÎÏCºÚzø…°§Ësx±_è±ó•JoÆÖµó©öè ¯?Ÿá°—žúÓ»q w.c8rœ+Ó@¹°•¿ù±Il‘õÁ$ãµ'›ÛEfVáÆšC·zŸÊ–âwoyW44Ï•>Bw‰p–úvÆ;“˜ot÷…à&6÷`H‰ãNËGè-ô²¤Jd–ö›eÐΤŠá_wµœw ÌÎÞ¢ Áß +jÐ`£ÛR�}q&ˆ8û)þ–¯0í³®ü€æëúJ€ƒß1g"‘wùrÉÙèí)þ8ùyþF³É÷À«g‚Ð*Sæ»ð%t·=5a+2€~š3¹>"7PÉ@¨ú§Û¹gnêüæ‡C«%½¾D÷ï¯éz6ÓÈM[‹ßÔïW^:– tÛ}† ½Ð¤—ïãÎN&𞮹Ÿ·~vñò>N×÷3";uà€†‰A8ÜœPÂHëw]I׫Ž +‘³O*u8Z3K�²À~ëyq&;Ã_fH‰Pd˜zlïoÓíòþp<8qE”à&ã}gæ@µÀ +ªgag¾7¹Ÿùñd#>S~ÄñAœÈq¸œ*ú-Ÿ/)qÅ“ËMÃ>É9}@t‚£“ª\-¤ûeñMܹ}¶iÅ“ÆâížÏnùŽ3=‘R$thFIÂö°µgç¡æ2ï¬z_Á:èRHØ´òȨ)°ºÖ`pwöìlž§Ãã×f:Üó½Éç¡Q\u$Àoy·kUš–è’¬dšt»6qa“ˆæ2ÕîR©¿¨©¨]¡ž‚Å“÷a¾B vÌ>ûao¬‰\°çs& +x¶½040®ñ”Èç‚áLÈ]ï ÙãÁ‹Âšó¶ŽÌÏ~²Î¬6*Ýž¿[�ŒŠ“°Í»¨gñछӹ¼öõ 9«sVtÚsSk1úKÍ‘˜ï¼9‰0T¾Ú~"5{z‡ò~æoé×û1-m÷n¶?V‘Ÿ•;Ž¤› ¡UÆ♥m» âÜ&õ½¦c(&Ð-"Ñc£CÞöôû&hÙSÈж}x:H¶ŽDÎÇ=ò{|Ìà‡ÕGº5(gÙ§Ñô /f= É äAõ!ƒ÷ýtëÐOQc(ÓÀ/ëÔn{`¦L¼P½Ýx²žÝ„ÕáVÞ¤°Šm&¬‚OÒ̧r÷) +>½'ÀoÔø7|–Ao@4â¦CöÍŠm–åÞüŸìÑóû:‡Ä@Û ]² >ýä˜&lã-‹†ï l%„Ьsr¢îóo”—“Û¦O°w +èBÃŒ„ݲgZÌo,44.„¾.§ßi9Öjœ¥€ÇŒæ#)z½¼¯ÇA«×$øó‘Sá·}§8BÆ_DD`HÚ³>sP¾Óq!él)Ïï©“!› Ï\àèºÊ¶ÿHp¤’P„i'|e˜±D}Ü µÑ™4æ’}*ù +yÍ +{hðFÏ\Kà—cz¡½˜á"bp6V¤+bѨY +D“¼Ä"äaH»#ZÌ€?¬ƒõ=Á¬aʤSË‚dÚb(-veÂ×à:³*ÂõÃÎ lp*¹u™QýœˆÓøÙ^bÖã,{3¢iaÌ iˆÝªsŸÐà@˜±Z?¥6¡#ÝîT6DÊJ¶0õ‰õG4½ÚsV%µnŒ0;<Paä(á,�·Ø3¹eêíîu–]|÷Sùñò÷Ñm"#¸o¨»;b[Äù†ÜèI=ÔÕÜÌmO26a£dÿ”žÄÃîR«-šš½\¥ò›)Ó'ÓÍM®žj}ïFи]¥Ö¸¹±glÕ»%ê½µ�Gµ³Í]mo&äò¹E®%žÍr¤#_L.d@•Q6¬uö©‹¼;±eüWè�GW5e̶#�ïðš›òÖšŸiØ1h@[>Ø»Äy1๠êBçŀ癃<£ºáàÇZâ!/&²òìŠì<¼Þ/Y³é½œA®@*Ôÿ:ÇùÛœÇUüÌU2!+À`e^RŽÌËý×™ÊX¹€‡H%vU÷'BO®ô +”ƒŽ$;éM1ÜYUÛéúk°=X¦ +=Qó9’&B!¿ +™Uhö|€FpŽ»JÖs…å= ÖÙK†?Æà“k_ØÞŽ¢QçcàY +·ªâÃĬ°)¤[«”¼>ûÅÇÍdÝ—z5GYw¶í ½–à€¯·¼ËÎ?Í1Ðã~Ÿc/°J̲æŽJcàJú ß™¥ïÉ,<ày‹MÖ+NUYâI‡2D<ÿéá¡„‰ï/Ç‘ßàòôÝG׆¿\ïG$<®–3/TÃgﮟٮº÷é—çVºä܃·?Kfê/£VÝzVºNîd¨¹å)Ã~mÔ� Ï™Dj·›¿bµ·$Âðˆ%ÐÌbÓh¶$^ßfŠ™À!ƒá®WÚ,™‡ïtô±âæ´¿žEšñÖò®Ôî¶\$vW�ˆ®7à�¹& ®šÑ·›çp¬þT|ô½I½½8bsgk´aô±»HV…:Šî\yç°œvÌ7æ|‚iʯd 4cËØJ? •ˆb6z+Ù/Ä)µ—±¨'po‘šfô"„Âî`Tä³2¢"¸/f ̹eìÇÙÊ +5‰áó3”öncŸ®tñ 3—O•çIn²Žº8´Ýw>‰å²Å;F9¹)sÂØhÛÛS0FH–Tņ7³ò4q�´µA¶@Ãà|~|åûß÷ û3sê7ómãUØœç> ƒC–{@Œh ê Y~äí-¤– ’ßÈÅgUxu ¨ð[mÛ’ês¦i8îÏ“ùïú¨,–G({¦öü؉}¦¶è…oÆ>`ñûïRñäëC®´^|d‚wOúÅј¥›m'×Í}á+œYâ“Ø€aÌ“7Wú¨: ÒDM€¬Ž·”ºi?XZDÿî¡››’eV‹+W¶ÙmÈä¤�2/f÷KÀÑÛÇ©¥5WÀ�jµIçŽÐT¬ïà|mû™ïTDzßó¨«`šgæоJ@§0l{Ü’gV3Vú(ÄY¼ÊEqÝÚÏt[X_jÀÖs¥‰\·èPœ¤]Ð Ð<~QŸZ:Žðóø±.kòH~Û—(î{ž=.ò.ª‡1ÄÓ ñUXïVØî‡6G¼tGÝR›3æM2ô^È>g;Iƒ°{;ó0©›`¦S¿"³‘…y�…ßà“hÿDa<`¡VB¡'â·ÏªAÁ@f'òûÎœ›¶Tvqk þÔÓ›D‰Rb$47÷êÔxM½xºËWR™Ø,gû·¥vîèJèT:ü5yÎM£o¾Gîd$þì¬m`|wÓÔ¼î€D“²oE¡¯ŸB÷A·’%«$žB~%.‰.Óùv:m"{²Ÿ›¾ÐPI3RƒíoñŽÈ¦¿fD65k-Ox)õ.ÓÊMÒŽŸT§]ñÜ^Ô —ïnS±7r–Šlw}ÊT@“÷Ùh¾�/5æFÇÊØR(ñª¶v&Â…"Ô7¿½Ç.?[~ 5ó4ñ¿�ùyHu¦íƒx"T>ä<͉;{þYŠ,wð§º%6Yvë†_·¿i܊Ȭ>”Luå“ߎÜd@L‘bý+~ÓtÎ5"òq»åþpd÷7³®'‚ÇLórÔÙ²‡¨GÜ„^àØpmonÚÞ›®EK±D +÷„¹’ÚÝ}ïsSjçQàÛ(У3;Üz'²Ó¤_XFœ-†0ß2¦ayÿY`¾àrž+$îI`wDCLävÜéÑ<ÜGÂVš¼AôJ‹÷ÿ†ŽÄÁ)øˆü6‘ßa³G‚»Ç7`,~Òu<ãÞxr™Š'¶wâEÉYGàÓÄ+"$F»z¡Äk Ÿº+/Pdà +hP+ÔÕoÂ×VTR·Du“7�µÛcW —5nÕ0ÝFšJOm*h�õ+56`Ta³XÍ麵ý`6´d%ÜÏÎÚàãöØ,çö&ù’Ä`–wwÁ\ª¸ýå»(hè…n*tS+´ýșΧr¯,"PC_™U8eAž»!‚;aÇŠŽfÌ=ïø±Šcµ¢Ë¬VÛÌÏqšH•ò#,nÛ÷,Èó ½’pOãnö`é&UÝç\õß g@-|·%ú¡yÈoC_ÀÓ1ïˆ|¤Y”[ ¿Åf¹ÓÓõÃðîB‚‰¤`Ô€üÎ{ЄC4†Æã[ÞY·: ¿ÝZí5°+€šð(¡hxìo©øŠ°‹ t9´–ú„kù7ûœ‚q&è^T”PtÂQ=Ù^ì]èÁ<{w±8kërˆþÊ3´J…ßgùt¤@ïáFº›°•Ý,þº¦ÉØÃŒºi£Nü®‘y‰$trLJEç!mg" ÄoïeXF …=NäN.ˆ)GÎ+zƒßcFœ£¿x´ŒñA¤f€Ù[‡öDŸCÈ3F”€^B ðЛ)ñZºåJ¹™964ˆGóãÃm?q{n¡©’1ÐO2XN&¡ÎëW'Nf‹ÙùÇäº`·©ø‹ÿ;W©Äoù}gùkÐN#†ùÔã×+°HÃ/NÌçú¡ß[5<ݦ›«à›D$ßS´ýý6W)û÷ße¶JÒ•KhôÂíþfšfŸr³`è6î:|.B‰_G¸IŽ_"NŒY¦äe/¦8ñÄÊ4šõ9ΧTø6‡’@O¾²áÖ„ŠCS}kùvÑØd2nÇ|CG#³rãíÂ{ï}æfŸâL“çïÑ|æ0ƒÃŠœ'÷ÆÕ ÉO8†®gfdêu¿Ùµ¥7£ÍË9 ÈoßiEQÞ†nصß@Ãî=q/á)Ëioéök¸-/ºLýTÁà×o’0'¤ôà è¬-F§±øóVHEôÊXãíœcáÇ]ÝJ&q• ¼‡ Zµ¼¤F}n‚XÓ/l¬Ì8]¯á¾ë¬)á“ôéåè +òãqøFý@×›ÿ¹'òQj‘ÿ~Ÿ¿Ùãî*´„^ë?¬°©ŸªÀ ûþ‘ÊCö`¦f·/›ҋ9ìò0ö°j„pµ¥—ww#³LàÍï±ÀâÛ5K·s´#ô[&Ÿ€mÞW—"ä¡8žàºÅ–O¹¯E÷NÄn< äþ´VƒáÉÎSw®´Ê¾ÉÌ�Ì÷òyGØ*™œ›FÏE‰H ‰ ‡x±€>j0?j烂˜” îAc¢8A‘n.˜Ò‹¢ðò¤ýØDŸ‰å‡ƒWz“47ˆíËÅg®lžbB9àýïÇR½ØÅÞ_G`4$ÁÚŽ€áX¹QÆ`€Úv€áSçÅî¾e-£}g¾æŒ‚ÕçtµÔ¦óãD€z}ØZ¢¯ùKtö=iз"Œé{¾Óíùx{ù7|¹œ4·.‡.‘×D¶†µÃj¿Ø®È´¬êðQ¡¦ :"éR´ŸßL¸*dýŠãý9[l`a%÷ðæ?(Rü“rJŸ3„ÉÎÈ‹y5·39ßûá'_ þóó^øOèÁ£?ÙÞg€IQXïšOCè$ø§>çS347ÛýÅ'³Ûk…Q³3±Œ›íϽ¨Ù5_€gƒ©Çì<ÄZfWí=gvc5æ}êÚþ 9k Ð>h±`nHÖ &â�F]÷Pˆ1”ð+öI˜þ²Û%žFi×ö¹œªDéD¤óT/ÐÉï>{X®GtÛÄSúiŒ“cƒyëä«3ÑýòaåF3‹A¯o`.Öq—uÞQí @c 3»]Ò|Èj‡Zº×c›…£Ü×R VʻLjØW=GE-w¼[^c“‡nŽÇ +£ìd<uU3ýÌ|b'£JïvÜó¾/Ãò&p +vŸÃ€Ç_œ‰‚ùAˆÇKG +¾Cw0bX °b±pé÷Ý—=Wü3-ÂàÀËÎ^àÖs€×ð ìo]„õë˜ZR¬qðÅ¿Ü©aì¾~÷¯*X³£Psèö)b¥#o8t×U†[DïÓKe¬ñÛÚj¡¶JXw‡ÇbYšŸV˜ +Ë#Æ,WÁº³D§Qe¬î'F´3/Šc½%¶ðœæûú¢ÖT.V¸£ªªXåj ¦Fá×ÝçØW†Xí+“Ø+ùöÍÜ[Á›êhjc–‹µaµÊ*ÐV+X_£¼+Ü*Þ}uFM±k¬|̼ŠX¿ÝígU¬aï´e°¢u#šZ³}GÇœ´2ÖFø;ð>¯º”°ÒÖDWÁ„.¡Ýš!Êà t»Åž±Þ³°¥¹öÕ•°bÄ×!`…s#Úû妖UÃ:Ä +®AGkK[I[¸«„ÎÍþΕdwÝ6ÙâI>ž>¬ùÏ%!ÁÚ‹cÕ°‡XGX‹$Å-Ù0”iòáV?zC¬¡»ðrB|«aÍa5ÇWT +@Cß–~c©ŸÝs!–cm=ZýªX+dË©`ýpc¾ýaå$´x¸•"ùüѳ۱v¬›™*ÖÖüe0RŠÔZࣀu*Û¸2‘«þûW"Rƺ-ߪbíô·{„ Qn{KVrÊXk‰|ÿûåëKëW}YR +%4DüÓ N"F°/zåVÆúü³]×£¿"Ö~ɽAX‘¾9îî¾å4«`í¾bùź¬ˆ5òì¾5§¾Üy€5ö+`Eñ'(¡ýpŸîÈo—-{¯:t ¬>kÂV”ŽµŠ ±4Äê:Ò<ýŸß¼Üoà Ýäáiw¤ò¨‡'ë>é”Õ”¿Ášéâ%©PtíèׄbõX!VB•ÜÜp³{Vçcñ6Ä`Mâ·L.º¶çÂê·Ä²)VËn7Aw"ÆäÃÝ¥IŠcã²Y.ƒ?±‹5öâ‘Qø–"mFß‘Ã~Hnr‹¯ßTLÖ@xÚ}Á×µ§s`ÞTŸÂuãHçT€yxpfY‹ü!ò§¡ÞçzN/#ò§›ùí;·<•„¥Ø§ê럣9P:~[eOEDÝ¥}½±êëUç&éS:ªOUŸ4õÛñ¨¨Ò R|(Æ_iæéÔú•½þê\<þ°OñÛ˜üé¨ÜÚðDShÐÉ99ûSáéÛýÈkVú™‹=ÉžJˆ6¸ÿ[T_ÿÙ7¶Eէˎ/ó¢ú Y/‰Ä·ZЉ—Ç êÓ²/xW}:ÞŒZU ¢=˜JŸµ×òéÚˆT}Zö%oq ¢¥Í>‹=¦òz°ˆåŸÜ¨c¶GÙSgû…N²O³ž¸ì)@Óiµs‡%É™ÊJO“½T]ü4àj²N¡ßòâ̺YlbýÈ +6ôà~…ü7Öy#úA çÍ··@Ï8kv—£]àÿ´áü0»rÍ,üóÄ^Ô‚^C¢ÓYc„ ‹pØÌpBtwë³>5ܬrÀïÅ +#qç·"?“q†€ó&ZUÞZdcžæû9CŒ5óNÿwñ4²9w›‡þ["ºÅXqßìEkèîîu»úØbÄnO+PI?¸*VŒ˜>·T±4P‹Ž•‡èNÄX-‹kä9Óa<<Ü Xé»9Ùä±úCKˆœøµ¬ùáV¬ö®*V@á'Ÿ*VÈеˆ]‹o¬Ý/õ±Þt@jH#×B+t-æÊXãf*VdªU«êp‘¢Š)mɼ’Q?úÄÎôÖ²½ÉÚ@Sû÷a½Ñmºûýο×eí¸`Š¤ipÎr+:2`àŸi§(\$¬àm ÔÅÝÄaÇÊ™‡VŠ“Лp·Ë%üIlm“6€ +Ò5±µÇ·<H‚‘ˆ-?¨‰há#„Ø0QûÅ +›˜5|ÏþqÕ(2®9BwÀàž¶LIÄ ÀŒwNæîù?M™ãÁ†¾ê|ûDS»A9Éuúµ¾>@‹õààÄx¬pÑ°ñ�ã¶2Š©•ƒ÷÷èäÌ7±ƒ Ô§e´¤Ú'Ɔ>X×\>k+ áY4Þ÷uÈTd„?¢:üÃöqÝ_P\@>H«ÙÀÑÝ9lÝ¢&¢`Šâ4Þñ#t¨ŽÚįÚsÈÍÀ4RJŒªE/1(ñhh¸#óCèA3Âónôœes6>õWTkF¨,¦Þ%+H€^¾L/Z>“^R)d—I!€ôè;/_ÿ¹3’ÿ,íÄ4äzÌd§‰ÈøÀ"eò}çy +«tÇ•w1Xò1qZÅåÙu›er\oy¢¨£âàºòåÉÏÈ)ƒó';íš•Vt6U:“sÙð<°,pÄóy€¦«¤•¦ì¤!Aoñ]Ô ^Ê„ÍÀþ�:øžS–3]×Z¬E´Q%£Ör˜*m¼sÊùÄqÏÐ(z¤Lf\ 1hÒè86†„êêC2í”8¼}?hÎæîzÅ]ðχ“ߨàBªRö�bÒ–¯hÏ*ûL©ý>f0B(9;íZý…ï–¨o`4û‚bÇ…6ÌŠÙì_½G֙ƴ8§eRÐVzh4*‚舵—ZÕHÐ6%eánÐØ8{MM¥8É +„,@šeÆLS6ª&©Ô>VS€}¡ïÉëbní“eíYo²ÝÑêg0ÝR·õøé34‡Q‹l%khhy’9ÜÜCÙf±½ +õÅÁ*iµ¹#Åïâž«íäœH4ƒïD¢õwW#šTºN´˜ÝáÝ‘w»O(Ê#Nb9Oñ›j2-ó>7°¾ÑŠW^žûäíõ–gæý×bÔæ8ÝV P¯TO"ÐQwº(:x!4¯©Õ FACCÙh,ê‹#=Aû7F½@õžèÈ8‘ZgôMO�È\w§ŠaÌûC‰_oMÉdvG…ðxS�éû¢GQ|*AÆÏkSä؈œ|ÀD4þ‰~•HÓ˜nqæˆ1¯Y½Owºqâàko`áqœÖÔ¥SDâù¸�¤õLÂQýØz8Ò72æU³ôJp[ñÍè™p·ê4æöxþ‹.|¨¸î0fóEÏýW£—òJ?Šr¢—ÚbWåvÝ(.v¿%ºôJ{Y¾ØݸãX”B00ïí¥A‡²,Ë°€´G†}ŽuYjÜ«Xµ¦#5ðŠõâÁ!Ë&öRÓõšµ!I¼|jjù¸„¸€V,0ïï’!±]>R´g‰Öe¸ÇÜU"ŒLéÒF/:( +œÛluB…H$$! ©™: 3[îÌ`$þ¨ofWdf¶Òº1@¾Ø˽vwdz‘±l”U£?ù¶ê³…½XAD“ªÆ³g×$šî"®)ÄSÙaèmE®Ï’YªÕ£ƒš¢ ùz<SˆmÊ‘òS¦¾™¨#Õ|ªmÌÌ…û]V”"øMÎÇN¡Á+<”Q¶‡T¥oÉ·2ÏVï-„æJQZÐ1µ%xŠ„†‹Ç臌_¥s'O[ `|Eêiúe’§�R[ŠJPJÐ¥û +b6¯ó4]¨M²Ë¨nrÚç€u.›ÔÍ¢lZíí 0'Ë¢,Ù3ÕÏ‘ï ¡ù<'îªRó‡t j˜Ñ¦¹¦t£—ö#éF/"7ê"ó"h“úÕ¦&ëâjšyï¯K7Qð@»št{•I·ó(Ð>Iº©J0yWn� +’n8M¾tcÌA]@WØÅE€4v”\¿äU\AÒISò³Eœ&ÞT¶]Ø<2.×xDGQuø›ÂVîY]pKÝ<â-6å]Ü,Xñum1itg‚ê˜ å°ù³BB…(VØ8K<nanàäÉr¦ÎʱÕ/â´�égUÈ (%À @*ž÷‰ÝáršT7‹5íu94ݸ—<?MK?‚:åúüæ6°‚${ÒêúqxÛTÍ90]ÏúSRŽŠœfD?¾ä€Kƒâ©ýü=Óú—͇æb@2ëÿ<µ†�bý«©5èbëBQUŽÌÞIúñóWk=*+G™‹+×ýã]gøÛɉ†jF³¼„ÔÕñ÷a¢²Æ´ˆ©©bˆ×Ò»ê"<iãëüýt#X#üðnhâˆh†»¾ +fÓ£j+¥Á)Çî²€¤¯1¶0 FÝ2ÈÊ‹L®¦²7r<dš*ëQïôInœ/ó>9hd©¦¤ÆI;¦¾ƒ€¨©˜§Ê2#úŠ©½šÁí½Êoy¬T¯LD‹C«m,H'´oÄ`@©{ÒÝ£\,U¶0Ô'[Hó:OJ‹\"XÛ(:ì$°ù>zfvo^úfWç;ov§ýß°ˆ/R9Ÿv-Jð¿F9Ÿv-ŸLØœ_Χ]ËÇ·——ói×òÝHKÏ/çӮ廑•.ž]Χ]ËÐ\§œO»–ïFVºxv9Ÿv-\7W)çÓ®åc¤ÀÊùŽÛ‰kùXÇãòr>íìã}Ï3Ëùd Ð2®³ÉÁLBÛ9–|ê•HÈi«5#ÝRî“vr°…ÜAº-BžßzR@J¼!™“Ûƺ¤Rs€?rÈ-I*Y@JTnø3S”KܾUÈc{ÙT¤¡êÙ¹W©fy‰ý‡1fxtŸ>B!ü +»“º4 ¯Ù'¯|cålÂëºtÖvýž¡â=ŽiùDe¾ÍË3¹Ïˆv]{Qª•¡Õün6 6nΟ™_"“]÷ÝIAye2ç—('\ê•Ýœ_¢äFÁ²»K#[°PΫåœ@õü¹—Â3´Š£’×.Ó÷y¶²´„~¼é3òýê±»A1$nD•Å§9ÇGS:ò«çiò9PFë^‡·5ÅHí@›j€ÐK#ÓÀ@ MhD,°ŒleðúëÕÊq€-&cèSëѸƓ‚vB³b0E½¦ð §8O©)i×ßÜIb\ê5r·r)`¼Ôñ¸Oó;µ>¥„ˆ4›2¢7:™÷§¤%L +Ò¨§‚Imxw²šE«óhz.J¤¤5 é•èèvLØ^…Ðt’ùO¦¬bçB¢é®žD4½Ó4;ƧŒðå;™÷®[šGUÔ.ß1jæB}ÃG‹õ—½Ješ^Ýs`†ŒåN'¾oþ¨.r6W½x5pV”ùƒJ¹¼?¨ +COP( ›YQï(aºO-ÙW¬èÏt3ꨩJXl§'ôHªêä)ùžêÑ+×UÝÓ‘ 0$Ý/‰h”ÄhÁ¼¼*½rûS<dõZ#%Ò«1´N ”n,HV–¥²‹ëû¢÷ª:þ$;„¾ºvÒÚÿ))}¹fŒT§Ä‚dF¸$V°y¯Ã2¿åÙœÐ-iŸ|FûÄ!µJáNŠÞhû®D*ýZ\nI£7žãèͺ¬½Qà4•èMù’è lðŠå:Ñ¿%ý|QÑ›òU’“�Ûê¹èò»ñz8ƒÑ´<µêá.ŽÞÀ:¸€nØÎmôªƒnþc°@J×Þ)‰*7üáY|il²½Ç¤†tE¯4V×¾aÌð'_wÚ×åˆmE5ü#*¾0æÕ�¥c¨˜UþQQÒ`p1ÛŃ,aV +œÃ¨É×{õX”ŒKQ¢²z‰Ÿz2„á!¡]©Éqf‰Ÿ~B nŠ"¤Í%Ŭ7ª¢9Õó“ç6ä²ÌhÀÏ·.45ŸzežØ¿1I~nežân,§»neÞ¥œf°2Ï@Ç5*óІäqqÞÉ°š•y²ÜA}@çåæÞ•.žY¥®Ô'Á¿ÔW«Ì“æœ\'b´2ïÆÈ™)—WæÉæ†+λvež Wœwá¾,¨»Bá?Ôw'í.1hÔÂœÚUR/aÓ¡¤þö™l~U‚K7½´lØìqÎÅy¥òëR“:{œ ¡Zîè:e|z„’w}Òùªh• 8´j�íôkë¯ã(¿ÚúëÒõo®ÇŽ¶Ÿ}Þ¥[PuÉn¯, ¡]+º»ãù¦:¤yà +¦zö*G#(î+¸¸Î2â…. #Iÿz§ódµÏ;6jøó pÙÒV6ÆÚv×qÈ–À»Ý¢ã[X0bx ÕdÚy'«€êßÞ\Hvx;R,Ü.’}»R‘ìçï5Šd!”«Éºµ«ÉB@—ÉB(GE²j]ë—‘½)+Ë_B þº)Lüzt+¬Çwa0c©½åÉÕZ÷å)ÎÍõ‹ò[@ÏÁ¿¨(ï˜hÿHQžßóEy¼èÔìÖÅEy’$T—wzQž‹‘Ù&‚ÕWêFãi§ßgr.d+§—ø©ûM²anT6} 4CçŒiærQuíò&K´î±Ý(ý TKg䄸;nßSE]Œh= ÓtE—ñ¤?UÏð1œî*,cxžK%3…tƒh¢>/¬:Ã~înrÈQKê›h'ù”woÍíd¸‹®€Ïõò»Tºj—³Ï8›Íx+ðÚ…Ö–SN÷«£È-¢’…iÀÅÍê—ÙE^b 1¿Ê‹ýœãzM·a Î÷q3¥V�÷®u…ÞÄ+K¸”•Ýµ3êÅ~ð&ò¡Öv±_Áa•_ðsÒ<VyÙ¼›¿ðQV‡v+òµÊîp*VgüqV캻û >Õ‹ýºZpkb?ªÝVÅ +Ð<TÉùDØÔ*l|yWÇšþ(XoŽî)´lü}5¬/GÖ-‹}bÙ=¦ÄÊM |V ´»A·cÛLS6S )X©Ü +&+¹‚Õ: .%Ní5xÏss”œßx äܺÓËÐyõ¢�‹æ^¿ºe¤O +'×kftw½ž’a,ö¤åÝ:óz½# Ù°šå1›³I¥‰i<Ï&gඉé©}Þ%7ëÉ@ Ê[6gí§æ\´‚F(šnéÜ® Û'ÖÈš´©Ñ'¥€ó™ë¦@ê\Æ$Ë«åÖÍû”º(6n¯Tاd‰ó¦úõ +û”âc7èº÷«öIÇVõ‰öÖ®Uا”UÂï{*˪s +û”ªú Ñ®\Øwv¸û´Â>%_NÆÐ×(ìãT¸ªOW+ìSÚç‘›+ö)y×H]·°Ou÷º…}JU}Œ·vÕÂ>%“‡‰Ù\µ°Oi†UãçöÉÓ³aUßνQgöÉ·|ÙÐеû”æðF~póå…}Â¥(^³°O Ô Wïy½Â>›Å×(ìSªê»ÑtÅ“ˆf´°ÏÑ..ìSªê«µ+ö)UõÅ://ìS X¹JaŸRUŸRÅÊ……}Jvµº‹{vaŸ�@ØGˆvµÂ>¥YRÉ°O©ªOß÷T¥ˆáúÕü‹ +ûdC::Áÿ¤Â>iŸô|Äå"Y©¨°wûS:éÌ) 7ª¤w§áŠ°_yöƒÎºÅO‰-O19Þâgè®Ý[üŒ’jï]ŸÄzç‘*·×µ6ä‡�i\owtgïé}BËÓÀ~FëMUîê'ø&•{ªe}R6%ÍôŒû#¦…ªË”ÄË´Ìeò[¢[yb“†- 6;ùò?e¢Éïÿ;?ƒ½üOL´³³õ/ÿ3å(_|ù"šîýkúÔî5ž}Ñ墌.ûÿŒ—J©\þ'¦Ën9ýò?¨=õïÿ÷W÷ò?ÃgÛm+—Wy&_ñ{™¾9;ͱb´¸éæ?úù¶rqúÿ <‰üõÉ~yMŸfz£ÁìnTÓwA]ÓPVzo8‰Z«ØQ9-D¬=Õ;rÉ'%©)$\B*Â1XÒTÜY¥)#l] M;olèÐXù7gªé\HrJª€f(÷ÙXª€f$‰\;§IÁëbžu§$©tq¡/‚"ÖÊ¢Ó õÓî¼Ò=œÌ’Wömça€ßn®w¼!€¦Zír#÷4RðúkD°‰cKòËOÄm¤¦ØÙT3+}cw{þ°.ðÂÃø¬ëÆÈu>¶zé<RhUí‚ŒS.wÏ6œõn6”÷7gbžTB¡ž> +]¼OŒ®Æ»Â1 ]Ÿeh]@Òõ¨‘ºãŠ^Å)%Na1ŠÑt®´îý»9«Þóä{ÿ†Ö¸úï:%M(-Aëê?ƒëQçÞ?ƒ¦ú¥÷þ ¾§ÊÕ§.#å{ÿDœv + S=nS]zõŸrÀóÔ{ÿ¤Âæ$hòj_{ÿ´ÒyVû¾H2"Ó>/6~Dœ ]«Ú÷óWæ{Ëö=Vûâ·§Ý/¯„õŽµ+Í(ž+dt!@Fœ,ˆFÐåþªÉKtUk©ôJà-‚š™§WßÇl®£õ³)VLËr Ç÷Ó©ŽÂvÒÊ´oU3ó´B*80Rõ˜ëI©;”bäGB4£g¸ChF–§F¬SJ´òf¾'cužPK¥"Äú;íB*±ãa¬Rô¬B*±L“ +G?¢2²s,F´ìîJ©|ÈXFY8ª+'ÖÝvµw|n˜[~ÖÝvÏ<UK1ª¡]é2Ì2BìFº@Ы½$D94ënR;4ênõON‚ݺÂe˜l¸ÎD5Œ*e¦p6!¬½+>µsK<›ñ–ßrwd¹•K:[í'jàO…SgøþIL|ÖÄmŽQD0",8jMRøœlŠ±J*óè»N·!ŽlI¯¦‹e?ºJ•y7Lm”zIàî0ˆáªX1s¨U!†î,á¦ýKââJëÆ>µ +·~u¬…»Þ«V€†¹š®4òÌÔ®¦³kÔÈ5‚ê•y´5ü°gwûeE—v[òc¥R#g×¼†o¨X…‰Æ¹¦V^xxÎ Ô*óúX–tÝÈïÿ{¹ë©`%¥žr¬M%¬L:bãJG•ÈX>ÿJH§ÖŸºøOlIèÁñäUjwÔ.Jšú³˜ØÀKhçŒQû<+¡¹Òã§n@žÁï÷((Ó¬†Åk>K¤†, kÐ.ÝNÊ”y£}Û“v}ÕQ0EþˆEsBâ–zŸ²ê‰s7ü©½†ê«è3ó×-›£8ð ‰[2R ªÞ@Â¥©ZzyÆËãŒ&n©òÁP§“j˜«”rÀÎËB€§ä€1ÑAÕn)§Þ§£Ý¨j%5rÀN\7”Fá,Û£<Ü£ÃL@W©èÊ_'6ÍÌMÉÀ¾£ÎÅuÚ±0>ÁßÈ^`דb£ê#+›+„¥¿ó²ÃwΊ§~èr<-ýï1¾Q;9ÉXI¢ÑÓuoøãÛ•is‘W#gèœA×ÙH*ŠÂN-ºÙï*]×ô¤‡Ä™1d¥=Xû§a0 +{§ž—$ ¿~2–‘<@|IÝ»ú£¡“,$u‰zöœúË`&Uƪ©¢"9Ëùžš{*êuvZǽ1Õ%ÝR/¦O{¹* êÒr¥ÚR…[d[x'Ô%ê_�&ÅF ´ i_m¬c7¨HBS¹ úŒaÊö=/$šn5ÑIDÓÙ=‘hºwBŸ0ÌjàShGU̪ïé ²úæÜ’D5Ë]-öÌ’DI'4êySý¼’D£õˆŠqhã%‰*|pT¨dužP’¨çsç£T«ÓJÖ#'ÀœT’h”¤ríybI¢"—(Ô#êxÒz%‰§xÒg•$¦˜îKñ²B)§ýc—j2´NñØ —Þh˜qÅË +Ñh®tQ©Æe…’m¢î²ÂcOú¹¬ÐhØîÂË +Å¡¡ð²B^ý³—PFIÒ°«QwœjuÆ…‡ÆOµºèÂC¾ìOñ¶CYfÊùjÇ_oÔ˱O»ðPmp¶+ä@• &hèjeüÂCíÀ›+œj….<¼J½ç¥e¢åyÙ…‡2k^vÛápÛâÀª·ÞœXPvfN¤Bê¼UÇÞv(˜gU:„]'ÖyÒ…‡Ú·Þ¹’ÂÈ…‡ÚªŸkðÂC#õžW¸ð#rÅÎCŸ{á¡öm‡jvÚÉž^w¥b|ñm‡:{Æ/<¼”Ó^xhìžÂ‹+òµo;XÀ ót Ô“¾àÂC™$WÝô:õÂCí<ºå»"N¿ðP»:†ÛŠPŽÁ^x¨¥À +í²ÅÔ<¾íPunD[=†.<£9¾íP+f£™â-¿ððüò¸«Õ›"íyµ’ÛO’ZžxOá¹J¡È7ŽYàÌÏÙú>ãÂC5(^ÂÓ/<Ô¾íð†9 +ìòuý›ë\xxByÜÕÖãÑm‡Fdš¡Ï7ÕOºðPû¶CѾçE€t–‘!×È…‡Æï)¼èÂCŠâq…Ç…1g^x¨íCEÕϽðPÛíVJ‰žsá¡â¨ùÛ5\ÜÓ.<Ô6~nþc¸:XûÂCÃÇM]vá¡P©T,©žá¡6¥<›³.<T†Â…¯/Éè’\xx'ꈣê]x¨]ª/ÛŠ8ÿÂCí0/l.½ðPVÆ&sÆdjíüµ½{ñÜ\tᡶw/^ž]x(#šÑ„ËS/<4à{^ãÂCCe¥—_x¨}Û!Bsš·2 0W¸ðPY(p{4ˆÓ®qá¡öŽK´Ë/<ä;¦Ï<˲QºðP{gBìFOèåEºìm‡Æò:]¨Q¤‹Âv'žìâUÐ=-]Q½‘Ü¥ž‰~Sß•äûK£Šu”®bÈ"„¼O[ñu§Œ)Çâ²ÉÔÚÀC ´Á¼u2ÄSõYâ°VéÝÎGÏÍ@Í”ÍÎgæ}_†™&°ªËl©%J̶1{ÇÛ€7/‰ÕWZ6¯›{m·f~3Xqöœ¾û=dBæÏáÄ> R–Èã!ÿP«ÿ6ƒ¿ËîG8è Œ#5âÝSñìÌÁj!0È4—¯ÉI«z›·ÉçàoÇFN-oi{ ÷sÛnV–±U—SdÒ¶ùí‡ïw©MèÙüöœ´Zü¶Bè~úQ*Ùó»�õIÆÐü¢RÓÄk»Õ1{œß)³oöÛqÆýÖFd*Œ˜ŽËX!ôÐÜíQÛŽŽ¼•è»ïÐ ¡ƒ£_—Øv>yÝo5zËàýxwô'oà‹Þ)‹I½ëc¯Ú¦Ç/[¸TØ2™l;2oX¼w¤SÕ²½EÀ€÷»ßbÖëÜ6´’»N¯°lv^âÁ˜ÁíÕ»ÕÄ<åe®\Õ|pmÏ0!®¶A’æ4Ñnßcr~kPRk~+[F`p¬¨xC3ÚSt(qJÄH„\ ßÑý¢Ù¯Bó=ôœÜ¦¼ûx9å¥'DônÙÈ¿¥ü߀r›DaÕyÿLCæ#l:¿\æŠQî\†ame÷;õX5ïиÒkªJ§+oo}g¾ó^„ŸÀ€+,%v1±¸D°»C®æÝÛ`rCÏ{ÒÞ ÇÊHho·¡˜3 Kx¾†¨ÈžÒ|}r¡¯@}ìÀ׬‡{ðy_-à1gÎu lÅR wYç}ÔOf4»øYt?äÆPqŠTcþ[üà;Lò¼âÛìLŒ=+d~aeóCüÛ«mÄzv‰Ìþ]ýˆ-)j^t~ø�Ghž¨%^L6á//bࣙÒ÷ÅÅ4[Â1V’¹™,ƒÝO8lâ…•Sk|œ,Aʽàì/¯({ñfüÒÜ «ž‘¦²øìî�ô Ú"ÚøìÉÔ#Dó·Ï›™•gæH7ÆÓj®R2·¶ä7²Bh_êârK!㳉ø™ •àASÝþR}âAf‚û†…,|õ"³të`Yä{“Ç…lìû:|§²‹¡Ç¼Ýo?Çdí€hè¹d˜ç—7777¾ÜKjÅ7/·�Þ�ðѼ®î gáàRüäç?�ùÇu|í¹™¯ý1šýžW¨ô +ö0POÄs0wÁõ¨ç?È--ùñò7Šy—?An4=ööQÌn‰`¾Uë>ïŠÚÁúÆ:Y¹ÂÀÆîÎ2Cþ°ÁB6¼—~y¬þ{Òõüé¾Ùà'œÿäCí�¶im€?zôB:ÝlαD¾Ö‰°Zv¿bä(‚\êñ[âñÑ·ô”4:¼g”:kd€Áç̳† 'yÙ£Kš“akìòòo™ßŽœ3Ä9!ºM‚µrî0lÔÁƒ'˜8FD-ÍIö«|WLüZÖUùé +줕׬ü=f–øð¶lGËkÒù…üíd†ôú¤áS/bP€òè'ø%¼C¢•^£i‰èlpèý²³L¹Q<Ìvš«Ã +g²Ž3†ôô5ö!;0ƒO¿SŸr€ ¼õ*ÈY'#b¹UõÅŠóDÖ »hó}Ñ#èßdV·B*eË„;Åì`™ž�_u›a—b!f‡TC PgÈkÌð¬ÎV$΀L ²â|…AH Q½¹rœÂ� :»`÷[giø«þÉ甕¹gžP‰"k³ykç4±Á·™íϽ¨Ù9ö¤àŸŒÙå#ž™¯öøsÌìê|—Ìn¯µiv¾Ü>À§-³;íOÀ?³«ö^4Ûw;—ÙeX¡ÅØ;ìL¬‘l<9¡~fï³Î¿¼q‰Ä^*?䗩ͯwêX›ÝtûñÇ–+}„Ê@ +ÚnSñ$ááMˆ_.Ð…ì ïüžrIÝÃX³âa¾ÿ¦¨â®Kô]Å»t}¯¦Û¹€%7}¡›œF›¿¬9lr¿ÉívO½;dcørãzò<Ô/¹éÃö.æÏæF`èã>\7úcæ¼Ù€ÜQ„¼w›ÌQìyµ \‚n~ÿÉ/ŒÎm2õFê‹ÈƒƒSQFµQß·c‹±³¢sÜw¤?çýœ§9Øe§O›‘áU©îOïÌ9!Kõ¿Ó¯}G^溲¢³Pq"ÑÉžòAô‚%ìÏDü‘Ð]¬ÚLÅòä"³´Ù^òÅÆOý¦½é\i½ ‰Ü +Ï0{kpQr Ñš{¸<ž@1½>sº•Ð§y2öÂ8>‰Ãƒù¤¡sqh££×º»1Û«ÆGÆГ‰ÁaúóÝò•©ë]ÜìúÝV¡LBg»¸wP’³»Í.{ +H^GÆevGÜßfûbDíæ徎ÁöIØ-‹$`Œø5ms–ý‰,È/O{‡Lu*O%¢¿o›óƒP}nxÙŸ/l®'çDvšQr0d·˜×´:™h‹cFåAœ<Óª£ælhV°u,¹“–Ñ5Ð\,å ˆx$:OÕ짫u„üŒÌŽ9K>àx°ÙYä>iÀ�tÌ +ì–±^lÀA4š–˜h}]ÎirCî³E®•ä†2¥�Z6ãÁ|À»ë>§][,•¿<¹¤3XN»¨˜5×#ö_ébh𜚶·ùÝר\¾-ÈLyw{KfðìkÑ»`Bâ>f WÆØu|Ö¤£ ‹±qç¢yÑ9_¤á<ÈpØCwtÞ¹èÍÓíÎÛî‘Œî–`üæyø·Ø¬4ùáÐêÉ÷&·sD}Ñ<ÜS_Yh6ø€Ç‹—$£6ŠÚb¶Åï'@çLAöûÓ˜A?³±€•ñ›/çñÄ߀€ÿÂSåeó¬¬e¡jT1h.3) U7’’ßB·!‰ƒ²íDvÕ‰47JpdÙœoM^Õ€º\Þ ‚²+Ú“ y¢¡Ñ•P3}™ª9Áa‡!²† oQÈëÂÙ“Ê4=êËñœ>jTs¢–Ag™–¹åöÔ”SƌРǹ’ã,ûjÔ¢@™„RàO<ÇÝ3ú»÷q Q +U ˆZÕ”wŸ¬¤‹ÁWP?øŠ±*ËÝMBØ?£o4D´: ˆß“}Z™ì…&ljâ÷ÔÌÜH±o³ÙÌÒºùÌyÂVZ¦mµUí³¾9Ru7â¢%ãä>aÀ@Øl-\ZÂ?¸‘é åÝwd¥B8ÿcÅ’ƒ–M®PxZãÿ=iºO²¬ÑNU¹§s:“–p°™*j4šK–¸1žãv£ëìÌ”ip0Üñ8e¹È”dšÑ™>a‘Àih¹ÈS(Ygp{¯+ÎY“f¿¢7]¹¦ŸÍΞ-ev®„ÙÕŸ”áW«Ù5ÿù‚!¿g¸íòc0e¶¦¸%“‡Mýfw9Ú½v°ß#¸^ ^ÉäAD»nDãZ{gøô’=‚ÝÙs=éó"JCg=iC¶æNç\´5‚ÿäÈíyŒâi +æö•¨”7,.G-b|Äi—zÿdäVß¿câi`iÙŠgÆÓ6ÛÑNÞ‘¿BDoaÁ—Qrd˜ÌûÓ}«-»0Ø*(løtDg|zcSFÞ‡û3[ÜJî³óð©¹Â—¿N6w0¸~ûh?´`ÎCŒMZ=Õî�hBɦã3Ý~ýù6dá¡ODß>=º˜`9Uå¹›ÿ¨²}šè/W"½þXçè€â$hóÓ—W;üõÈ*òÿ©ÙçÛvö¶‰þ™ÙGS²þÑÙç/Øøgg_”výOÎ>'þáÙçlèxöÑÔC}óÏξ²¾¹æì³Vÿ>é¼áŠýTò³ø:˜:.º¤D4»Daá[ñk˨e"i ¾jPîdÚÒüm¤ôœOü„3šÇb\H·Æ+o‚n…j-Û„®¢Ÿï~C‡cp/‡q5~EÖéCÏWýf~ê®yö•QkÂuGhâ»â0òC"ä0ü¥F‹ÀHš l;&o›è[}öu&ŒX NÚðÂ÷ƒÌ`G?Ãit°¿-o0ÿ/ÈgNŽ<(8jtñ¹‘#õæ"Þ�<LZB°A_|Ä¥3òûqÝ”\Ä©õÇÕë3ìç-|ЕÞe“ÌÍ»™òæ™Üþ]¦ûÁ/Ϲmdi~âÃÛ@Vx$å¡8¢Ì«™¡f€þxàÖºó*zÇØ#1Ž|G‡”_D‡û¸yÀÑ!àˆ�»³PŒnbˆ£[â˶>Åt8|Ôy:Ènár tP%‚?õb³±D&ër%Ž=E‚…ÁjOË1äDHâeš]{…'BñËsûóÊè–T™9Ûáåp}É2ƒï€‹‰0®×Ô˜ÁÊG9˜žûf/Ê¥CÌ‘*�hÁ`.Yº èªÁ²9geÀÔâ‚Ó@'X) CÌ™g „9|›WÒg + ÑN°ëFÃo‰.½—°–Œ7™˜Íi0lbÞäÖ¹ö"—+‚šMÌžÆ`È�ˆyóLaccnâ9î„[ˆ#P61{ªÂwBNM7eS*u +“±å†ƒáSS`ÏÓù›ÉRÙNbO¥¼©D ^ +hªA=±b®5â¯×ÛHÛÙĈv†ïl÷ëˆÓì†8Mc\v%)ÈršQÚØÕ8M‡UÅœf8í¼µoW•‚RNÓ†!â´S×-ËivÓΈ§}Ê8McíÛ (i³5÷ùÂðÑßR�™’>Gˆ9ÞTíÜ#Ð쇒 <©2%}ÎÚwáM(ÁDJZ.Äç*iä‘‘?$4L‹.§qõÏîr´·Szp¥hvÕí.äbÂ~¾²èኰ«¡#·sŸŠ K¯Aý–”áCËúÖƒUÀºA¦~1óÞGu¤n®2«ªbk®Š|Vцj0aõ=,â,:dŠßºÐnØb?Ø_ÛUöM/ïÐ|Š+—ßÕ/lb³Å¸1‡ð�ÏÇâ܃D#<óY“Õ÷ŒðˆˆjULx «œBObÔ…”5¾a +ʾÅØ„[ - áëüVõ²uk…:™Ü –ýz/®œî£,€FÖ ›¸XÏ°Qr<¤„qëUj…îƒ_›E8ø3_߸@2�Gƒ©Aµxìl=q·„f Éâ\fÝ#©Šx$¿íÓì<DÔ3«È]D亣ù…QšüØ î˜�²éU‚wqÏùŠ‰â3¯O±lúõáq‡+Ût;½yƒ<õe>0fð±}üÎ×v¶ýB¥ªx’GU?iC É<Àk5™rlxn—ù4¼í <HõªDçÙdzþ" +¯�†Š—Ð'v~G³ Z7lÈmùêÒ3±¢�xÚÆ|Z²Olw–Cß�ÿ ++$¹g³�_†*Ä�Fþä+QäÂv=wÎ;Œ?Äfë+Ï~Žâ-…÷öÀ%æ{”Ž8f3åþËÊEAÏÓæSþ³ìd>‰z¾ŸùÑo\…¨¸;¡Þº¸ÊMïé6¼¤+ïÜý +ÁòbCŒêXÜ? ¢K¦ô:ÿIfÄa» +A™ÜAåZÐ+‚2™÷ʵ W,e…b-èA™Ðr-è… ÔÿMÜü'‚|¦ˆüñ6+rWß-f‹ ,žÇ›ÿxÓ%ÝL(bG’mò¯}ŽÖäfoŠ™¼éV¶TŠs䘚&›ÞæùÙÍ +V”ˆO5‘D™úõÜ4ZXïšOÃÜë&äIvñ U“BCÅ™XÆ™J)×|1‡¹ ³ókÁZ¨œÙÕ|0z«x„•HDõBë^Ü= ¨ð››8¥iŒÈòN<Ò®ís9U‰Ò‰H1þæ!¨^ “ß}ö°\趉§ôÓ˜UužXûåÃÊ&<™;èõ ÌÅ:䞎‰0QNø)µÚ‘7“÷S¨L;5}m?£¤}T«-/ÔæKÁEù,oH¤ÙD¬,RurÃ.¥÷¥Û×/N\¨fÑR_ô±5Ão@¨Ý"!låŽüº³2‹‡g]ß ˆˆ¾ÆœÌYÖ§æ/Z§Ì×/šdÁàKÝ+pÎø•"î§ÛÄSˆÏ‰peïùC(*âC(\¯8o{U<⳧©hA +Ü–Ò\„æÙή¶ê-ÂƳø„·‡?1áY|ÂFaƒ'<ó¦Ø3ÆQQU}ð+ŸE¾ïyà/N¦Õh‹ÃØß‹›_-´% ó°g]„²Ðï[Úáãb}õ±G_ô>pΪ à΂·ÖZÂxk› >{(ÆÓ¦íQ=6AÌ–²3Ž¤h“ßÀ� ½×ÉÃÃxÓpïw¾>îB‰×Às:ü5±±gmôZf–»‚¶Læ³&Kþ˜—øü‹â´}ßø{_®Wbä0,ïbîÜêÕÇ~:||3‰Ñyû°Ï~òÍ `~²g]ôRdσ"ß¾þªÊâëšdˆf`ŸóÇ\øÄÇ\<N~ø‘U!ŒfðfÎ8\„Õ¹Âù"üùù"þûC‰×W_^fÅ?ø^¬ðød?冼÷åçˆæè¬ÓòÕ³í/"·º§›íOk~äN!“0Ž.‰bM†ý6ÄXPR)=3ëA~t°Ï GÅ¾ê” ÑŒ}µk�é*fò˜§xt8»=ke43g+Ú¹%Þ Ø¼/œöMÃ!wqÛx`lOÌæ¡9“ÅÃ}™¹ PHt2/:jÿI0^'o—:ã¤ÁcÎàM6d0ByÔc|6…Cç™Ñ1h2ò6±Oü +¢–‘³Hœ�»e; ¼8ƾaÄy¢äÅ‚£JR±¼ÇêÚf1Ö(IÔqÁùb&ˆ± +On„@°ÂIf¬K07#S‘tâÔËŠSÖx"áºaœªBS¨&ó8Z)‡‘©Ä"æèôRѾ¼Mz—ãõ§t6o³é[~“±s´Ké£í’ìóƒk‘—Ápf-ɼ°_å³E»~Ù†êím"Yà6T)‡lC•¾%þ_{ïýUõ½ÞŸyž{ÿ¤‡Ó=$ôл @ $”`¯ €QD,€ˆ¤PC)¡„ÞKè½Bz›pßµÏÌ™3sfBB¢ŸïlÆqrfÍ.k¯õ®²÷Ù§£eS;s‰ëÊÍ}ê4¨W¨YGtCËXn‚ùL:mÙŒ�€‡³Þ”fÉ8q’]#±a׌¹&2ßÞ ‹÷â~å–žšXöOºQ]电<Ëx´höf€µÌ&±å]ËôJ+[×27 ¸ŒWŽ5<Ÿ´¾g¤ü‰µ&æÔŽi<d’8ÜͶÄìfBØ#ßr3ÁXb¶òçð¡q=ËZfÛ°‰qÖµL¨§¿…m4㳶x-³N®|oór¬é–µ°Ý¨¡…‘l)Ú[šÜ’VfÊ®ãù4¶Þ€ò‚uX%"Z ™²4£QÓÊv¢™·z¾P!åEmv»ß:šWv \å÷L4â+$›{ÚêhÚ¨âzî]AcŸ +j³»D+VG€MÓ¦ê(ïŒ4m毃i^’aí‡o!嘑çì�iZYÑjʬÀ½Ãýùuðåàf@M7<›¦‚»å5žM®Û©[˜W[Í{èêÅŠ-{¹è:Ž¼é|¥$€¤•5®æ/�@¾’Öܯ T@Ü›û•–*·î7Q)±HZs®² @å–´æBe:aHZsñùj×YjÝ=¬‰QǤ6²èÕ á9�ä¶7e1C(Ç;ÑÌÛH¿ÈŒ!å4SÖŒåqyü˜Y÷âFšD‰µÝdv”5mÙ¦OtÇ~m[¼ÑaBQÑ=:‡EŽî:–¥†„™-š¸Žtê-‹ÂÈi¬šÓy¹ñ@ožÎkFÒ~èmRu§óºr~èmRu§ó²fÐ[…§ó’!t@ožÎëΪ—÷4Ý<·v²ª¬²Óyi4èÂÓy ¦ù? ·IÕÎkî5ªXZ¸¢§ó²Ñ8 · +Oçud¿a¾ï³ŸÃ�ŒÖƒÅSs9¹±›‘}'¸HèX@dI =ežnÜðßf"í?!عS'zûoƒãB\K,íê¼éZI c©™^MÙÚwóèAñ!F¶/ºi‹&¿Åz-;tõ,ç×®ey@…Øv@nîÅS×}Ñß•0h£6²ìñ0@´Më&îNwsBÓþ|ˆ`暧±.oÚ€6œ™>ô3Å<ÿ¶±9BÊŽ uçÚ×èáSø³‹AB)Õ±µÝ‡ðÉxÉ<•{àÌ|b†Ò¹)´æ9¬CìHëz'.×Ç¥¾QñS&0yXû¨Ñѱ‘ïG£y‡ñÃ?zWu/hA–ñ‡LW#à7dÔ¾‘#"–~J®ä°æ¡“âãGÄGÇÅFNzßÑ‚]Ô=¢—pG‡ñ›aøMKGCôŒr|Õˆ-¸ãÍÛÇÅÅÐW};ttxoBܤx‡Ñ΀èÉÑÃc¢ýâa}û–ã^„ĉaµkqŽPzô.u˜Þq!ªv)î‹œ£'ÞB8N‘]dA]tp!¢¨jº¬jœÆñª*Ì Ñ5IäEU%ãuW]âyU‘TNÖ4AÂNDYp_F«‘ÔŒÁ\4ú>ýÕŸÆâÚ»žstwy“sŒ¬/ûÔ®¥Š!º.QCº*`"dêAæyYãí4’€Vy´¦Ê2A8ž“UÔdtB”BxEtYuN—EƒEUYä%É!(!‚$é’‚ñʺª8ÂÐŽDm󸦉ª¤1"N’9^Ñy×Y-à†)K²Ê)V,¡a^’y¢@§8‘ç•ç9£ +ÈñšHu Y Ññ— S5I1ˆdI8IçEÝ¡ a^0ÕNáê¿€607¼è·!Wÿ9Ô! +‚¨Ùûëº ò˜~Ie÷\ãÐà®Eã̱s#Œ†Ð=o²¨k~¦ÈFáb‚,¨`'˜aiHU1Óš›—²Â‰²ânÈÓ_’LÞ=%Š.SCšâ0Ç,éªJµ°IÅ%AtÛÎ9—l¨Ð^“‘Ú±M€!b$`J\qØ&ÑFa“OC*¦I§vlåé®"bº‡[(uQÔSÜ#ëd :"˜²+tDò0Nâ•“PG˜[‡xNÓMÔ óŠ¢‰ +šƒ5É"VMô çª*šå†œÆS‚ ´!‘DÓ‚" &†,¡N¨¦šÓŒk�§zÇÿÍnÚ(Rɘ¤È¼ÎF"k!‚ (PbUëeƒˆhdÿT"Rж€ ”Tô€ ¨Ÿ“ÑŠCÖC ªœ&2 ,Hxü˜WuU—ˆ8Èóà††Yfó "÷¸Î‰K‡Â±j%MŸ [ +æFÂÔ2©˜U‡Â‡ˆº$haJž(8AÒÐY ¦€B&é$i¢¬q2k‡Çä QÒ-T,ѯ R’*’L£sÔ®(I¯“Lc¼ ÐôR‘5˜ˆº ñTTóàz ]gÚ&CFx‰Óu½¾iTd5êBTpFêø±Ñ +ÄRxL¸,9$=DÖ!o2tD•Ý5hŠÎó2±•”M#¡Œº¤AE9ÉE¤*& +%;$ŒN&(rp’$"jU2`‡Ä…"X€âc2ØpxMÆœœ¦R;¢¹% àµkÈ’€˜CÔBDÂ׊ªãQ4ž„F”� ªCTC¨]jE‘Èc�†4Ř mlvD9DÅa6tQ‘IÙ¡«èFÄ«d zàE”ó…_“FB9Eh5(ÐÿtNÁ¬0ÆÁ~ÉÔ0ƒ)É:Y‡2hÄoš1ЦœÊ«‚ªÁñ.�ðdš2L•KTå[ +\1Ré5FŒÞÉUá] )<Pˆ`†&Và�’T^�Y5P$Â$㔉ƒ(ƒÂÕ™]Ô! €~ÉÔ5h©ìnG }ƒz(D¢…h4[!1ØÀŸEW¡CÐS¢€ðàO|¯C@�¸¦ñÀ¢€\�rEf¬5fº[ŠYƒ; }Qh¨ÐaŽ xÓ‰‚°@“QÔ³ +k©â'$ì€4hÔŒçTWC� Nq¢áɼ¢P5F[£Ð<™øh qÚ,Â1tV“‹Q ›B…‡5àØ9HkGAg$ý€Ðë„o4ø¬ç‰wTدB1e +Ò/ƒQŠN“¦ +0>¬�€d`ºBÒgAFÏ1Íœd4¤Âµ`’9`HvÞ¡1y„ªL*")€bŽdŠSÒ�/ „°Ñ*ñ$^0Fd^ $%Á’aFÈRí�x6¯:©q‚fx4 0Oº*“»5Saõ4†¤˜pˆO¬s@Ý%²ñpÞ µ<}¯ËЕL=p}ñch+œ\‚¦¼P Z‚ÇéA0#è?s%¢�2�75�=,?ù:2Ø,’\êð©@�àDÀbT‘é�Œ<à(Ì‹Ñ +áƒÎ3˜àÈŸ"xb˜MàæŠL&fÀ!Á¥ÅÜÂ9‡Ã¡‰@Y• �TÌ�¶€´@Jèˆ;èÔAc¨(Éà"O˜ÂCÔ$†L0s +p|0;�ÆAŒzÇÌ@é`2Zå¡–ïBlŠ ú�‰p’Q‰p„$èšC"€Ó�c£Á\ +D Ó4¡&MkH+!ph�×À[FA=Ç�´²a€H¹áŒ#8™~"¨$8£AâÊP7Á7ŒPb=ÁsE‡a”xgàˆae²§p# ‚ÕÉô“¥ãÐ`È]ÁÄ0K"éº9ÁUÒ!(h:À•<žÔ’У¹ +Ãt‰\`ÔÙÕ@n̆Aþ(a>¡Là>Ø'’âÂÉBxôá9£!ø€kTCŽ).OU'ýá Óuè)O¨®ŒdÃv‚Uà)Þ t˜°¶@"ß„´[&Œ9#“Â\à¹í˜nÖr•!ú0è ñ܆S¥“d )€hš1¨2qˆi3ôT@g6ÃEÑ&Þ?Q�q`˜¡O02‰‚ þ�°šÄ|3h*j€‰2SÇ:§’°Á†@¦ /¦á ¬C€–¢R˜¤`ê¨]ø\Ä8 „$°™WˆIðµ0) +cHÖÝç‰äYqd»uÄ·äÌKq[ ;€˜ƒ£8„j÷‚鋨34cÐŒ–üIª $Z*L,à“Ï@„úK<swñ`öÀXL’‚ˆ“‚“¹Ä ³áɈrÈ-‚}*¨®#´yà:³$`8'.9þ”IUW3äâ'øGAC†™„™fàÕ¦ÙÀXLÒL¢sE¡á +C 1w +yäÕi`,||Ö0í†`ΨZôƒù¾ÐN&„W46_bè)¤@& � '÷`a¸äp7a§aÁH‰ìL�`#Ö]Í€eì¡.€5h0z‘\f˜…µ#b*�*¸�L%ä„öÃo¸`ÀÌ“&A©!~Ÿ@_h°ªãyS)ý!‘ƒ¬Ž†gö™ÐÈ%Õ@UÂ4ÑHKnBßÈíÓ¹×0:Ò#²%Er!Ð4ažÑù€ +pÝÕ\ž¬@z ‘<™øI´k(‘aƒE&KHžK‘a›à‘a™i¤Ùœ+^sáÔ(<)~aBq ŽH^7Äí‘w�Ö»A¡‘å‡C ‰Ìw¥óar$C°©ŒN%` ŽdÉOáÈ]I¥1eIiþÀ$L>Ϻÿ@Ð’;¯’ÃF *!T‚<n9ú…nQ‚Gt!6y«hŠüp;4àÆNÇbRHoÒ0‘µ£°/E,ƒ)s�¾1—‚T ˜I¥ô™ 0ü ‰²&å‰ûÐÌ°jØT¸MpýŠ´`Œù¹N2l*‚|ˆ +�sM ¾$³P4ÅH9@urì)÷"3°š€ Ì%e:DŠ›‰�> †éçɆ Co`Ä8 +PHXð)SçÀg·‡�Ì…ìC+¡f2Ѩ”Á ¼äIbͤ;"9,"£Ð(¨Ô(dƒ×B€o�Ô£– +Äe€RvwP‡ D¢Ç˜MFP$܇(@žˆûˆÒ%VƒBFÞM!˜#Bpd@¥e… ¶àª6@!®é†ððWxŠêx2ªA[àæ¬À•Bð#“7«‚«»èé‡J¹øÊý€{Pp…Q@QàÆK2§º£r!l—(ž7F-€ <=ñŠ +…lÁx`!<Ð="Ï($ +e²«:óû4ŠrÁ8€Û ’µd}•áC’Â:¢#˜\ò$Œj ب³¯0Ü'Á’Èò$$ƒ ï™d['+&Q*C%ü‚D˜ ‘Ë cÞ)KÊ|L)ì%j%,UÈ'ƒ©È(˜�WîͬÑ,3E¹&#òÈÓ Éu±N!„ƒG¿RɹeÁ#úM-ÃäÁøë0%ÂNú/a6–â=‚ò¸TH…ÿI†7¯ÓÄÂ…ðˆ¢»žåÜÐ39˜:H:<8‘ÒŒ,¤¸Èà5„…"{•ò àœ«‰ ¾¬;;H&}ÕÜD”¯‘)'*Òá!ÔY^ÁÕhyS:8áÉ@ …<ƒqF÷N§¸ÏÔVrF�6¡·D…i„Î2#ÊÑ�H*КÀ±†8Òf + &ਔ1…á¢pŒì‰N�dH¼ªÈÂ_™ì¥Héb"‚s"PÌJAÏÀ= ¿ó-±T¹êÐ,J{0…N^7àž2ä9ÁeØ@*áA²†r%4ž¤C$k ÃÍ%_I ˆƒQPX¡R¢M1RHpä)-°S x9 À-æiä±´1ÔÖl‡¤˜¦„ò_å÷(•#Bg4Uvu—å☄ӌ°†l/åË]C†3þÉFÃhEf" ¯Stµ£Pnf+Ša† Q.…'wŠzB†>pYf$ñƒ—§‘€ê—áúH”ýY|¬Ð„â/–û1fˆ¾°LPY<”D-Prî@{ðžŽ@ŠÄòø¢Ë“Èél„¹¶I&,AAÁ9&Uu<ÓÏNæ\ÕP²A§l8кH^ü_²³ŠA¦ñ”“#]¤ä©H#�Üëä +‰Uj.S’ÓhˆÜdüEé\ç°\¡†XŽ£@f®Åü +œ=ÐRv!PpÌ‚0"ÐÈ$i$†@ÖÅÖ”¦‡bCaeÃk‘(Ñ�:‰rx”†ºÃM`©úÏÖà›ð$„Fcú KFq¥F†Ò•û%Çœ…€(J'¹$%o˜j¤˜é”ƃ¯ª³D¢sx¡ÌÛÓÏOepåØÃÙDq³Þ%¶TC!5B( +¹±”õ&Í w ì!œeÞ?OŽG™:¨)õñfI§”´-CJ¡äÔªl*ó½ÈrÐÒ –§Ÿb”²è2Âù’)tJoÂMbæ]¥š„IÔ7™tœÖ( Ϭ²DIpÔ-Sþ™Ü5Bw¸¸¨]dQüHª½ÕÍ8²À2è37€Äè+z,«,6…Ð#Î#›ï R@*ˆìoZáÃP’ÛP^„ZP’Y—W«ÁIÈ2¯€”ó"E"GXfÑ'RæŠUª“÷©Ò1!%sKøÉ�÷àJY_•a!ˆP œc‹±ê.RÒ sÉ hµV$™^(€©ãÒZ|.•—Xú–M ¼@ˆùx¦ÃXCP›hÁpY&V…V˜y•É&PCxŒ0ÖH&×…¬y@tcùL +¥b*h®‰P""*³cÌÅ£uJøê$à*³¥H–õ%çR%¥aXˆ?g)¦ÁÔbž)}“M‰6x5À-Õ°V”DÁ¯$²$ät3»Ž C¨ øÀ&€G0#Ä‘¬ |V•Â¸xºÎ\L(~Bž¦Fc +V HÔhÔb+q`¯JÓHž¼J+l1–gžP2¾Q–—(ž'O«Š‘ÊpÌp*äÄÄ`(dEcºîJt"܈µUâU–›ÔXÈ-ò,LW)lgpSH¹0§Ï¬ [ZÁ‘ƒsh@"@qå½ (.%R("aÁ‹DëÃ�1UeÕÂ6Sòƒ2T)”SÝR(´|èøÔ¸íZým—píUÐ 9 ´S!„üR(™N9mÊ‚ÃÑ¡õd‰"l *tº ±$åìÁÙAè€OÔ?yÙlaQf›ÌeCÚî`na`WÙ2bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'Bp'ÂÿîNÞ:ÁX<¤l…ܱ½Ä;ò™i}H`k‚Ìë€\À9eç Àç-Û è´ÎºrsöHî%p¶¬Læ‹pSPì—#Øeü ‚ýÌüàpTÀC+|/4ŒŒnÑ¢OÔˆøÈØÑ1QÍûÇFÓ³úÆOŠŽí`_GD¿ÕwL䄨-:GÆŽŒ‰šÔ#r|”ë +[ºWÒɶ;š÷‰ŠŒqx7Ô¢EXTl|Ô¤Á®Zv‰}'2&z¤ÿX~Ö'nJìH|Ñï}êçú9¨‘¸I±Q“úDŽŒž2¹E¡¢?7š+×S¾r?ww˜[&CU®±Bå},ñ¥Ž‰1îÝèÉQ•a¼P¡.¹�±ëo#îÓ{JäÈI‘±ñÏ©:ÔÐ F¯Ò?ÑÀè‘ñc*ÔGάÒÔXX˜ÿ?î=zL|eXÈUæÇîIniƒ^‘“"ÇOðµ÷5žÓxzÅDŽ CÁëwŒŽ‰b-8øÚµ†p!íƒh9™Ù.G3ûåf"œ×¶¼¤Ã £ôìy%ˆè%¾éð</…N» ‘ØŽJ9ȼ†°0‡2Y°øÇÕ®Õ0¬ÅСý'GMš<thï)ѱñ‘ø5y\|Ü„¡CcâFÇ ã‡ †…LˆÝˆ”ªß%vDÌ”‘Q4ˆø±ñ[÷OÝ¿ôþaíZŸ¸Ñ!v¤› ~QšòìGnƲïnÁè9*îÀ/Æ#`p±ïˆÈf›–r&°sF+]4=ðgZôuÍ™ïåf0!Š‘YsIøx&¼&Jµ×h1¶\S22n|tlt\çÃò«ŠL†€hýg�î2\9D•œÆ6¶Ð"ÄŽ´J†ø&±+p)â‚Œ"È#Ÿ‚£U0ÁpqÉ}t«ô"ehd—¯`ýü¯óŽ¶RÈA¿!è7ý†²ü^ +äÿ~`0ˆ“e¶jζnÒÎ* +µ%Jͱ+<ìH;ÐT]V\›9^¦ƒJ¡¯ægë¦ÿÍœ*Ûº¨²T] +¾<_×lÈ¥Jli>ˆ™AÌb¦_ÌCÄ€úñ¿€”/äëOôÜxÃë´Ë€vÓ&IòS9‘¶) +ù𧲖D‰mI ý‚q›jZêÞ8O™/¯ãCE™&+*ÐŽ(Oa‹<¥êE³èv¢?Dݤ›…mþÆ_Å5œ:£4=ïêO Äó…óÉÍÛç07íÕí´ê¥rU ô´ªk†ÿaÄ/G~F5ŽöQ‘%N3sj¾—›Ñ%!‚@«£t›¥æ4Zb¤Û0i©FñNÕÈôFƒr¥j†GÆŽˆ7|lT|Üä±*’°±ý¶üi›æí£?ü=YjÛk×¢gÃÈŽ:ÕoØ^n¤tn*uÜdr‹~¼4¨ñ¤ázÔ›-†*ƒ¹‰µ¯µÕrtw¡U»É&¼&vÛjŠ4alødqd›ˆ¡á!}FÅ7éX?²Mx·vcß–5iÕ1|äx½5š¡+ýCû h«4™Ü²É¸NC'†‡†u8®Y¨6|Âè&í´U›´k0*´ÛÀèaBøëá±tx<'†6®.¾Þªsæ\ç7ës£Zôo%†ŠÍ:6ïÞ5¶-?2œë<¬ëÐ&Œ„ŪߤUô”ôǘÃ_Ö²c‡øÉhKS;¾Û¦WèØúmzvìÞe×¼~ØN-bNl×kD×\îÒõ6åš·i¡Òo•ŽîØ®UdhhÇ:áãÆ×SúwVXÍh†U®ÄGtŒè0¼_7µ}L»‘]k×¢cH|Ƕ£bLúãÍdKxóaßjß»o[MÚ#¤aǺýÇ‹Ä%¾Ý¤ÎbËNC÷ê@‡×Ë4š q4KÇu +‹–Zöí_B=ð·÷›Ã'kqœ<|ÌÛíZj1"´{HW!¼á¨.Ûk_·wó1Q_Ô“ˆvã½FLssDê0||»Î†·«¯·7 œíSgRÇz£èæcâê6&D‡÷3+¾† UÞèÙ¹cxŒP‡žˆÝ_Ô£Õà°1ò[où|K"@ÖÎ9ÌèÙ ÃðæCê…öì6¹[h1ãp£Âú·âº6«µz½™Í7åG‡ó\–*ÃFŽí†·a–qµ4~ÍÍëÞCµ¦ƒë)ñ ùnÒ”&£:áõµlÞ½_ý¡|Óã;q£ÆÔ oS§IçaÔ>Õ¸w\§É1 ‡…öÝ)ÜS¥6ixÏÐè·‡¿Þihá±Jü„ˆˆðní{ð4šoŽ¸nÃêÖí44bxc†76jl£6ЂþMH"z{u•nró¶:.j\XGNÕ¾½ÙVk‹é šï04¬»µ[c&«i»V‡v i0š“ÛtnÙžSÇj%µí0â5¥©g¾¤6ü°¨¼õ¸Ž u¥Q‡fMGI®JŽ¬ëhhË”Võô~ñ#=êì=ç•zcêù¿¬«¼”f¿ùm¿ê›)s4¾J\MÍ~k¡Ë•o¿RL+¿TÓÜø¶ÿ’E šå œ£©¬Tžiå’ƒêœåå4SæhªE*2šJÈA1íyrPís£Ô¬T‹Tx4/&UÉ´2äàåÌR³"PÕrðb£©°T9ÓüËÁË›jtÑÊ7šª‘ƒJ0"rP=sc“ƒPÏuÕ«D*Ë´rÊA5ÎMÝŸV£®zeå J˜ö|9¨î¹©û/ðÓjÔU¯„TÓÊ”ƒ—27uÿ~Zºê/&UÌ´@rðR禂)ŪŸ›uÕ+,Õ17~äàå«guÊA¹FSÃ)ÕòËAµÍ·ÔBW“”45œR-—TïܘrP“Fºêå ‚£©á”êóäà%Ì ÉAûiU*/2šN©–!/qnªdɱRL«*9xa¦ÕôÒ·_9xÙêY½rPžÑTTŽi5½ôí+5‚ÐÕ&åMåä +˜VÓKß9¨9#]rP±Ñ¼°TÓjzéÛƒöÓªX^`4/"UÊ´š^ú¦fªykÚóGSurÜ¢X ¦·(·(V¯·(¾€·(Öˆ”K‚[_ÆÜ·(·(¾·(VÇÜ·(·(V‰·(VÓjzé;¸E1¸E±2rÜ¢XµsSÓKßå’ƒ-¤‰ÞTÕ‹˜ØnÇí;¥^hÓ½¤‰RÜ'mj'F„vá;a¤cP÷^ŽðÈøH÷I¶“*v¬¥æ0O¢|ŸNÂÿGÖ®¥˜‡]:zVlj—œW«tr¥â>ñRqÌ&†èºÏ?ªè²ñ³1µk ¬ñã~Ê>`,xÄOðĶÿƱ>Õq:¶ê£¼ÿƒ'ù4Ô=¢—pGGC|ê>ŒÖÈa`87 „Xw ¸²<ì>ß<§iôøczæ =íL7O ò¹ÜLä5DUVuN§æª¢Ó³69^yÝë” zl™Æž4UžS‚FÇÅ·B3Ž¯à™ÎÞ?¬È±Î:ºÌó*/ñ2=ö…xöœší~ð<çzx=ýÓ8z)=ú‘=B×z =ï“rM” ãõDU¡§ "³—î'γƒôèL=ÞzAeW¯Sõ˜¥”zš°DÏd§çB;zD$=‡DRyž”G¢§g‡Éª p¼Èk¢"…žœGO•¥ç[Ó“Øé‰ðt°*=úc§ ‡H +ÆÅK¢JÊ CC¾D=.F„æf„mDôl$]TUázb©ÃÖ_Q¡cßy•<žgO‰õµ Œ=1NˆTz– jv¢öÈgz,†ÆdzŽ¥/‘(ÐÃK%z& .šlï®Â6jôÆFdã_„"Û4Øúk›JÛ°maåt¦#n§Õ»„Ùµ1§-„ΑT1I¦¾ÙˆèÄN6~Ž“é±{äÍÉvzž´†òv +bh#ò'†6"�LÏòQdŽN¿tغËK†h(º¤êô|)ßAûøa´/ y§Bˆ¬xN´Ñh²ÂøöÔFàO�mDþÐFd›�[om“ø\yñÃâò¼gúxùÖŽæ=ââa¯ã&DÔ´êw? °£;%z¸³¨Ñ£ÛÊçׇŸ3%>@‡žëØó\=NfG¯ÂWÈÍï7i|dÌ‹yù/Øo¾’¿·øù<=;œž™¬ÒãÏÊåó¿`£¢ÙdrÅ€Fåb€˜Á. ô@Ë€P¨|DÀž7«Ä kŽRµ¢„Îq +ýƒ—uÎ.X¥[¦‡ÚU$zð´§ÒÃÃÊwè0Ÿ«Äo«æ„|ß, ¹Ÿo…³@Ê0M¢Àëô€gÕmàñžËˆÐm<‘¹aXé±™‚b!ƒ 'ªÇ™Û£§rËôÔg™FOîv{‡øGE§Ö»z*4G°¶P�Ó4?ì鯢ñxN4e’ÁË‘9ÞmÊ ~2†_0ƇLÓéiðn§L¡|óšäðô™:É˦c'ò˜àðž)$y}¯éŠñ,\/Fò +=ÙÙJFÏŽ4úãvËT"Ùl+™@£s»vøGOàã-=– Y)TEP¼†.ÀÞ=²’I§Z) .“\sf%9„dÖQ4‹+IO®¦Ç4[e„Dmº’eHëQlÍæÓ‚68hƒƒ68hƒ_® æ Ccãb¯z„ЃJUE–xMt™r=@eŠÔYãUžev ‚ÂñσKÏgVz«ô„wz~‚çÑ ”ô¡gŽ*ž\DÚö~nÏfãµþ¡ Ög~)”X`ë(²•HíD~ˆ,UƒHcQ´¹rùkîß±6|ŠipænÆj*\¤àªM…Vm„ªZµñûNεúͳÏÃuÏ!åçÙp [ò¿¸^¢Ýó%ƒˆDôÿED¯æçRËœþÿ4†›Ù3Ïâ-åÌhå˜7׶,œ+µk¤¿j×jõNôˆ¨>Ú;õ¨]ksÑEEuJ0)œl®¡+’ ¢ÄñŠ&sô(3A¯¨·éœ®Òyñ;YWD8ù¸âx“.)ÒŽ§Acª¼jú©Q½ñ®9D—aáŒezZ¨¯_Ÿšöµp(š¦Ô®5¨KgÁ,ÁR³åØÏÏv~êy]ýÛëÛ'W=_[ð+ã…+¬”ܸŸýõïzá'ö®åfoÿãê¢wÌ{`t‹ÍxáþÄE|U®Ñ-kûìÓÿÇóB'eÝ0ÏW_¿êõø`ý!^nΦžº÷jÏ +½ðŸq%ýt)®Ã6cP~_«çìè¦ÿ¿^ßÞ=öF‡¡M{koã2_˜ÊDѧÿ›âª{tåZ¹f°ŒÑYÅÒ.œÝÓÉræ*ãeêzëÓÿ ·íX}íÂѼ’—^Ÿ>îä½Èè|ÄÒG8+2:µ +TÐOŸžO¶×@.Éð¡ÈTxtv±ôÎjúéÓsŒÅNæ#ºei_ ÑYÅò{ÎóZm£ÚûLœ_2À©Ù[þÉÊU,!Ö? ÃW £3íZÙ“‚ …Z_L¼yežƒ®X§ŸŸ1k^Õ£ó1p˜£òüª¬âwt¿÷ôU4«šÂYîÑ=ê—1࿯¼?·›}ñQºªF‘ÿÄ?HÚ…³*ìÜ°—7:ôÐ.–F±çqtV±4Fa»pþçFçcæ¬qÄbŠ}Ìýù*VÀ©vT±ŠßŒÿÏ—Ø:ølŸ÷�£{1‹�óç—ìØ?÷@i}•wt‹šûKW½?$®†Ñ2Ó¾Ö<€Ñ÷3º@biá¬j{WNO¬œS\Öèìbi«pVõèì^´½çv/:uà +Î.–FñÎò.sÒürf~žvÒ¢BÑ0(¼ì;¢²²FgK£”!œU½~ÐgWù£W<àÐÊF¨Î*Ê<ܸ˜eQý¾~ùâdYC4:ô¿ŒH8«4k4wÜÁ2Æ…á—¥nf“üs;ßW ±4 +¦Õþ¼Üiñé+~X¡~boŠ¶zþYë0!´À™Ô·Ê›ñ–`ù×”úõ;ÄŽ¤U¯Úµu®mÞEê^ýëhïxÀKª")Š"˪hîy)ç¤ý-@Þàð®Sc³¿ká®j"£ ‰‚,È +Ýn*蜢ªœ¤ª"Ûo¨‰t»«*™'^TŽ—uUàEU’éŠ÷†Cvªk«¡qªƒ¶…ÊŠ¦lÛ³ÆIÿíý†Á})Á})Á})Á†ÿ]*^G°{²¹™în’ÁdQR8¶«œãY—8pÍk¢d\Ñt]`7 (ºJ[=lÎ…hV”çh§¹ð{ä\òˆÌŽªë’¦Êªª8d)DÔèd‰çu‘c·„‹´ó]Щƒhg#Š`Dt‹”DÖIVd;ÈÑ5fÏxüƒÙ]×8:Bèø ÝSŒË’"ª²¨ ²(ó¶Ñ]†Ó¨ZXl0Ë·Y *McP :l·Q·ôkª¦ˆ¼¤Kº¦Iv"j^á$Ž‰ÎëŠ"Pð*§êšÂËF[>ÝõCá=Î0Ö‘"ÑéJ¯q„æêH’8Ž×$Y7nƒãà(0ˆ' +UE'ïÁè.ñMÓá/@üA˜K> W¼¦Ò +öJ"ØÉøKe `¢½!=DÑè^>SeÐ~‘GÇé¦|º·ÝN!CæŒMÕyLž ³¾Dݾ®ñ$¬B~éâÁ<Ýuþ„žÀK¤˚)|ž¼‡±ãØÍ— Uà‘ÑÜ@,DðGO%ðtGˆ!`Êáf¢ªˆš.û!2&S!‰¢ÌÁ9ì4îÙ„8qqY‘4<W Üðý(8…:éžOÁ*7n™¶À†Òm:´Ä*6:ÍK“y¸¾œê™Su‘nîä+tU1pØl£s³`…7×üQ_è„æ‘W8À“½-%z¥s¨I¤£H,4I02DCöK@rÃó2GbÏŽ1ˆè¾Jº3c’tàÅ¡BHžw=A½à)‡÷3AÏ•CpŒT—î; Ó0f%ÈÄøÞ‰©Sô•S1g2ÝL+H~!œR“é8MÓt¿Ló¯p‚¢jÀ IVíD Ð{:÷GÓeBSÙ?áµV‚Lb¶¨ùÔñŸª¨®Þ؈�ŽtϯŒ±È¢ÃÖ_`1×d +è8löQPoÀ@Ì¿ + !AìDŒHSìð˜#;‘BV6CbÇjŠ½¿þ(¼‡Mé؈htX€ ¨L+ýÉ–¢s’ÀÁ=r÷X¨òì{GE„ë„ UrØíKAœ‘B€(ð(8ÚV +ѲE0":’R.«tÐÞ.p(€ 3–TF–‡ø£û§�oáäˆOwD»:ãC¤„¨äÏèÀ¾èîŒ/´ &NÕt “i… fY„)D%§y„ ]¶Ú—‚z£Á§¡à£ªÛ‰¡„`P˜aÞO[@|„„H"ì¥F–¬S94ÌAçD¿&I¢áÂ"ìC„¢Nˆ¯@&DwolDþª2)§$;ìýÕCdQÄܢ˘LÀ²mؾ~ÅÆ—ÈŸØØš²M%(€#˜H6‚WýR�ËÉ—ÕYNïؓ%‚ˆ¨¦)~ņ€ƒàšš’%É.5¦é-‚¤ +v©±QrÚ‚½™K¢vÀOMVtÞKOàŒÙíö<o'… s�\˜\¨¿A”Ę5“à—Ò ’p +ÔÒÕo"·s ÷H§SÒ\½±1HÈ€ÚÂO4„ˆ>dU0ý\ºoÒÄú+Å™‡± ?ÞFaœ >‰;˜V ¡(‚Á½£9¢ÛÕO[ +Ì +ÜZIÕUÝOýPxÛè7‘Á@à >yÀ®Þ؈0P_L–DgX…¦ªÌ{R$Ï\ÌÀȬ»ðÐ! +tdôàKæÏÂûÐD0dŸàƒ°×£rt‰«ã©d“Ø5ùTð€t\br¡ú‰²"Ü—½2{³¾.ÃóÝÃza'¦z +Q�ˆª ±€á…€x¡úqjV4JƒêìˆY\óMsšIPvÔ»=Û+*³ˆLwtƒdQȦðh:ñF«*;bDðE`4 Ñ<Mð<± +‹iÐâ +D%úøÇËšÌa¨@«“Öè"u&¦@lžN]cÍ�_ÐoTkÀ0a€N' š2j1 ,á*TݤŽA«$(È}†cÍ“t0:8A£cÃ%HÖáA?‹1 +N‚¾™1–uÊ+#ð4ôq šÐØùªaú0E³"rÆj�7øf<¼j×hj$QçDg`cÌ~`"Df¡pܶúžóŠª»(&ìÆ£Ø)¨X>B¢™ÁìDŒqYOD$ª*ùiKg‹ì¤4'¹]> =`±¨_ +:WŽî‘T`$Wo|ˆ `†€¨1‡¤¸z" 1Nk:³Í'‰ +”[€Éa âçHD`EE(ô’nÂ?ÌŠãùr[IU„ÛÆÓI30xˆ’xB˜k‘:ÄSŠ)†H +öB,t]“TÃú#"é…M4™´JÇGÓ 0<ÝU88ˆË:£@Ø�® +¼B¾°‚xÏÛB³ÅÙœOÞDŒ3ªQöA`JfohÉ–U +Laüô×…÷°©7¾DþÒZþˆ¼³F¶þÚ2O¶aûËráz_3x¨Û‰"‘¢3NLï§-‘rÃl™Ž<•\š‹� #ÌÑL¯&ðìŒ!ƒˆ¬‡KPÅz'‚Ž…ÄJìì@ÆLóK+) +‹<èH(È8¯RˆT¤Â6±ü�ƒ1‰"BòãæƉ”Ç#û§BsäU¢ô³Ù8äHŠ¬±–ÁY8ð i½Š(xøõP}ŒA6à1ŽF7ñ!úàíÔ“i~ªäºˆðˆ:±O4Â:ø©pÞi,»¡C?ã!ÔÏW¹Êê´¯æC%“B9ü-*ˆ¹`×[ +n[ÇQ8O¬f _òYªž2Ñn�Cà¡SªZ‡Açp!$Q"É|JóýÀt(4BŒýhlqU¤‘OEYˆÉœ:|\‚£ñ:"3Ç‹–ð@Ítü/L§ÀÐëç¬ÅB¥®‰‘°‡Ñ€S,ª3}a]E["Yv:(¬ÀB‘1ÅðO¬§¾ÀbâŠí``ΓÑ'_ÃðO4xÒ)ˆ¡a¨0bùCä&q2*Ïh0?иfº„EI¢ô‹qGƒ�“®èYÅðþˆ¡Œ*wëŸ=òóÙó¼åo®ìTnõ¼BÇ,—³ƒËÙÁåìàrvp9û…–³+uÖ‚¨ˆpTUZoUh€á¶í*üL•¢u^h-4Ç›8E¸š–ã*S³®Ýÿþ™ +üO)x¨B°K°K°K°K°ü¯—¼Â¢Û™Ùg=>xïÁò“ç§lÙÓûÏMV%p¬oð×ú: ëI ŽäDGRbÄ„×ÿZòǺ–«z¯Ù»ñŸÅi'=xˆßÞxü4;¿°¦‡òß(`xÚõ;«Ï§Ï8r|ðÆíҚĺë×3'ø¾[_tÅýû¶nÂzáÏ„>I[?;ttͅ˯ÝÉÌ-¨éÁýKiiéÕ‡™?¦¿ï@ø†-Ö%¸x˜”heõëÉIú¦ÍÝ·ï±/5>íðÇÇŽÏ8sfú‰“_=þþ´ »÷Ù¼£KÂfí¯¤××{&¢Ñú„Ð ›GïÙ7ÿ±‹wýÜü°8KKs‹Šß¸;~ó?-7oi””dr»î†Äú’šnÚÐb[ÊÈC]º¸ûÁƒôììÛ¹¹÷óòfeå•”ä— ’œÂ¢§ù…róïçäÞÎι’úàÁ÷'ÏFnÿGÞ´©ñ¦ õ““$&ê7Ú²k×å› .q:kš5Sn?ÉN¸xuPò6’O\Ї¦›7vܵÓàö™§™•æO‘Óyüñãgξ™šÚfû6Lh„„ë7¯½pùú“¬ÿSü’›Ÿpáʈíÿ¼¾n½‰Õu“[íØ6þHÚŠkWOefB˜«¼ÝÜââ½,¸p~ÈþÔ’&$Nùû—ç2óþO˜�`˘í{Ä䳘œØb{ +$üèãÇ + +�AÕÚ¨ÀõÜܤ۷ÞØ¿òß,!qø®½»/Ý(ævkª@©äæÍÚ}¸iRr]·œ7ؘÜa×Îo/]¼—Ÿ_òrŽù}ZT´ãÞ=ÈÈæ\RÒÇ{^zô¤ºçý%—ü¢â”ôë¶ìx-Ñã +¶Ý¹mö¹³Wr²k¶o€5à[ÏÝ»lH[¿qÇõ[¹E5Û¥ª*…Å%óo™¼É„—Æ›7FNÛuÿþK–ó@ݸõtÆÙ3bÊf}æyGOÞ{šSÓªly”•ûþî“Ü!O"¿eÓÒËéªÏ+Z²‹‹w=¸ßvǶÆÉÉãþÞw'ë¿ÊügiÚÍ{¶ît$ºÂ|D£Â«¦O_[R\q¿¥¤¨4ïqiæMçËÎ;'J®í+9›\||uñ‘ÅGWŸXSr1Åy3ÍyïŒ3ãriÖ½ÒÂœg/4³‰wŽÙ²1tã–Ó3ŠKþ{>ç?é7»mL1¦þšuí¦ÿ:|À¼O"—\<yã™+¦kQÊŠësaŽóÎÉ¢ÓI…û¾-Hšÿ[ßÜ…-rfÖÏþ*½¾|%çËWŸ~^çñ'¯e|T/ããúOfˆÙ‹:æÿñvᶩEG–—\Ýã|zǧrŸö’QXøCzººmk×”í€ý“š+{ÒovÚ´ÕL³€í?ø)ªÏ×ãºÎŽí>÷‡Ï×Ý»õCÈg‰3ãJáeÉû©Kîܜ鎷ÁçëãCΗn™Ö·í¡Þíô +Å÷o{|p+|u3^É\Ð)ÿ÷¡…»æ”Ü:RZ\ðÌ6¿>0¯äo¸}[IÙÒiûöÍ—¯ÿWάüÂΦ´'%¼¶v]¯¸ÅÑÝçÄt Îã=®ÇÜo?ZsçúÃR§ÏÀ¥…¹%×æý5²;»‘‹ÛÓ_·³§9RïÊ8îPŸv»:vÚÙ¾ËövÝRÚD¤´éî~Ñçé¾ÚÖõŸNA|u¢ž9§UÞïoŸß%*u–˜|6ûl׸b§sç½»íwîh¹yKNáÀÛ)(.™òŒ;s˜ØpÕ_`»Áðq]fáƒûóó‘?:˜ž—ëEgÖ½¢3r—¿™3£±Ú-áxÏþÂqÿ½'Þhñwxgâ0ñŽÀŸ·²—qѸn¾›ñw‡Î§Þj};¾YöÏoŸN@[hЧç>‚M]*-ÝÿðaÏÝÿ|pôXÁ¿sÐÛÏž§”K6øcmÄ”%czÌ1Xízuñ¼0tQâ/»ï߸_pzsþšÑ9³š€Ï×{úyÝÜé¯üŒ_Ëíížb²×ÊäÖn&[™ß†]·^d“o¶¼ó¡ž·flqú®gná/£€ùû>è¼ëïEgÏý‹3<ÉW®“'Ã’¯[ßñ㥣{Îõâyß)˜:pÚÉÙ£²çk$Øï6<ý– +è~:µŽÁù¬©uΙ¨G˜À²Õàª7·ÍÏÆtXfÁõÕVãçm#vwîtz˜ötAXáž…¥y¾'þYÁß(`þî÷•[V]¸üï„ûCwïKM5—*ZÏþÍÀö7ÔX%Nè6cÑÑ—ÞZïö¤Æ0”;t_ ªçg5¸÷íèëüuo×¾Ç'ÏäÞ¸w÷>^¹7ogž½ð õÐuγ$müû»Žü»Çíá}L7…Ÿ’[ð™ñ[Ûˆ½ÝÂoŹ+‡—Ü:äæãSy3º±ñÎm5eKʵ›5ÀÙ2âŽØ‡ÌUî§?FöûšqØ›óìOÀþ{=>_=⇽~#®ÙÑÁp°eS›žú·‡œÈÏnÏ°ÔYlµ†&sJÅé,|üäQÚ±ôe+¾óùžÁ£¶µïe1¸&æ{.²÷a]ÎE*ç„ÝRŠxÁŸ·c¶oç§ËéñG\~ò´†xì§;KgŸ8e®Áªö·h\7olé:Ûôm>éõÑö±ÝnÆ7°ìê@H²¹Må¡oýÔmä¹É +>gzݼõãYwŸÙ¬žOÓ>þIá“ÌŒ#'®þ¾ö`ô”m¡½<èÔÚ”y7±¯¶‡v;Ò¿ÍÃém¬2ÜN{ýfœ8þñ‘cùEÿ–£#×]¸R'ÑòMLh7ý—ѽæÆt›ýÁE?Xýˬ «n]1oó’©ëgO\1uЗûLJ]-‘ÑlC¬XÓnðŒSÞé2mÕˆ!SëCàÏ üöÞœ“©M·³BÅYTœ{ëÎÍÄÍûÞŒö±®VëÐ&â@Ïö>oU˜¶¢´ø9Ëå·rs;íØñ×å«/¦ª.À™A©{Ý˦ â¯kâß[¾î§¿o_}è#¡ž’Œw¾Œ�¼�iSÚõØÞÔOƒ?™ÒŠ0kæ€øôÀûOóFŒ¡#‹?[wñÄõ¼ì|»Ëç7æ}æEYÙ—Yµ«÷[nØñø¢æDX´§K‡ë„¼=?v|Zñºc3â¥Íx\õ¬¬HAgf?i¸î`{½¤Äɉ_½p·¤Äé›(Å÷Òï,ˆÞߣ=Æ»£SÿŸÏºwô̹#W7ýžºäÓ?¶OèÃpæÕ¤1}Æwýjœ 8.Úþ;Ý)”@|¶ÿi\>8ö€ÏÖÖ´ßj¸úÝÁWëî{ºv¸'KxÆ\ý@äO?zbZÚ±ÂjX5+9ñ £~’'å®lÞ|é¡K¬6?¾}ûÇOS{wÅHÿé3ìÊò?¹¶�R2NíÉø²1ÜÈôOÔ{êã˜3mÔÒ Ë÷>¼óÄ~>³Ù_ëu²À%%OÏ_:öþ4/æ·¶_·›º»sÇÛŸu*8³Ý¯)7ë<u÷aפ-)WkÌÏÁìO=zܳxœ8íô)¿¾3?çþºSûöJiÛ}ßÐ1÷÷ì/)(ðŒ®¤°`ÍHŠXç4Î9¼fWbÚô±?Oì5χÿz~뻓f?ͳâ¿óc^ôâžÓYð0ãäg³RÚõd¬ŽðØYÓÛgp”Ú=üþü!…7üÄü\XTüÍ?‡c÷ì¯)±?xïu‹Q£MNgz&fŸŸìOÙ?°_JÛûGNȾ|Í›ÆY|b xž;£NAòäÒœG¸˜—[¶ëì÷Ÿ®}oð·0Ìeiæ,}¿òÔÁËÄÿ +&²�ûÇ?ür[ûÞ†oµEa†Á=Ô·]Æoï8³ªí=|¹Û¯ +Î^¬Pª¤;ñÒ,û»†ìß÷¸°Ðì›IYtÿúÑèQ°§iq"2¯4ÎÇ×òWÊîÈûV/¹¸ÍêFædåØ~ú‡©ë¦ôÿÆÇ;ÅŒüþÍV€¿‘ê/ù×Qr®Ý<ÿ):cH~ŠÕÕw3ÁÅÉ·Ú<MùÑççÖÏ™²?œ½öÝiÙ/{÷àÁ[÷,»ì(c°àÂù›ö•æ][úݶö=Œ™üäô¹RoàLÑÁ%¹³‘À¯)-ð]“u:OfÙ}nÁ{«}˜Û}îç#LþmOvfnù»]ZâÌ8zbß›cÝðá%ùîÈwgû.W§t(~äÿ4{†^Îåßli=å®ÛwËßz•”1ûR=lONh¶yãŽ{÷| œ³äñ¾”½†¦¾i/uº|³”Ü9‘·$œþë’kû‰+†YW¸oó‰™ãØ{ž'íÉÎÓÇþrhç™>Vl@þÁü[›¶ïì:ÈÊpwzÇL EìêØùá²IÎÂ|SkÖ“ºõä°ÑßOK;š÷«O²¥î³ +|Äî]g23}ºœ9ûÉ»»zy¸ÿ°×Ø]†µ¨pËG,3öJþêH–”õuNLz£<~ðt˪ý3Æýâ•ë2ÓñóWÉé§o{çrñ¡ÖÉÏg{<Wn3‚½Ì)ˆ81²{NÚ†gÞ½2?ßL¿ûÆ–s—_x’YY†–»¬¼˜nJ»±üyð�â;¯>Jù3uàÀôe¿;mhŒÏÛŒ8?£Nñ…ž¶›¤&%Î+çnÿ¾`뻃¾õÁŸ/Æ,Û¾îPf†Ÿm$ö)xz!ýïCí Ÿbñùwuìrë»÷Š3ý<ˆUA §ZØkÂKOž«�ï*Q +‹K>>vÌ ò®÷)ÇŽfy-Ü”d=¼ôÑÛÇÞû,ïŽ/ +Qq¬g¤‚ó~êìÌ.ó©.ÞµåfåŸH½8gâŠñݼ’ÿñý,þ|ÝõKþZô.pkÏ/üÑ›ÕÞŸóë‘{ê{Œ÷i£—¾5t¶xÕËIÝŸËxR?!Á\þ00gÆÙ3>X‘½g噉C¥yž«kñŧÖÛ)'9£NQê"Ÿ„Ésùf´UTX¼s]Ú§‘?ÀÚZ³sðü·ÿuèéãÃí÷‰ƒÌÏ0={‡Œñd2[»3ÿžT÷];ÝXøaIΟџ¿ûhÍ؈Ùí§ý²ûZ9ž,Sé²ùæ-ë–H¼êmHšá¼WäRR˜ñMŸË‹–ä{€fÏYwVG“Ìùò•¼…jɵÔgÞ̱7Èot–8/Ÿ¹õÛœïXh.¸ÀøNìõõ²I—NÝ,. +ìee™µQÆÖÖî0¶uw»«srd·‚[þ`·lf2Zì3þû¯ööKP…¥¨ÄùÕÑÞ·lPµ$ý’•óEW<ž×!ëRº½x8ŧÖçÎãrØ2+¦À™y«lÛj~öÛ%\‡xïO9õÙˆaolÄœ/Ç,û;ñHI‰oƬùÖÆmG¼‘⽌峤›Ú#üQâbŸþï+æmFCÃΛ¸}ouoOxZXØp5.¯†vëmÚ°ôrú3�æ&}üdÑ�Ó´¾;³îü5ʵafækEÿÌ1—?ÌÑYß}¾²Ï‘ñ'Bª;×ÂÃ1ÜN“ÿ“û.X9óÃ;Oœ,‰çSö•ëû‡ÇZ–tMž{Ð~{hÄí©ÝícA®!²×m¶>ÅÇÕ»b’þ4Ë™4o¢I09ogÎÃüßúå%L±K)®ŸMÎýêucSAîBµøBŠ_~Zâ÷¢ßëäöo91#æWÂÁýGôð®sùy…¾³VRrâã)m-Ic‹…ý»ûÃ>Áý‹n±·þÓôDc~#â—l¼tÍ·7UZ/]µ"¼‘=h¸1yqº'ƒQxaWΖ…[?¶vÕõ¡¸“xÏ¡}¯ä-íâ||ÝNVÆ•gr’æg„]p;—L[×ãk«ÛóþE‰?ï~ú8Û§žË¿þA™‹ci€B[¶=} +º¼õ +v/²77ÿÝU†r y{áâsçËÍÅ)³ÓŽ»î³ð¿nrâìsgÍþ¤.͙٠y’ýçÅ·åά›ÃœI¼ +þn]‰¨Âòè^fÂÏÿLà•ð™ØkÞ_$\¿x×:S÷÷ØÞ¡ŸOö�Ÿ/ý¸ÜYì +NÖD!á š:úIäFÍczÎyâT µ|A½Ñ{R½Í«k +>>yÂHÚ”çn› +‘Î_9è™Oæ6ûAÞ¯lùÀšuwÏ�Ò½Ú-‡·c-ÆøœÇö^ø2úgë0üÿO‡/Ù³ñxNV¾ñ[@ýŽÎ|²FOνåÚYê,n’zf\¶6ŠÉEø`VÞö—µOó«ë®Ÿ’ÒÒ:îí4^œOJŒ9’öˆ¥ÜOïæ3š÷]ËÒüLgŠŠR¿ÏÓ„ œÿòÕܯêÓv;uŸR†‡S¶˜á[˜Ýï¯ö Ë9ÄuŸ»rÁ–ÛWÀìeeSÇ’=ØÖûêÊ¿JÜyWgæmŒ%ï[½øÒk‹‡we‹®åƒöóWÞ̬®»02ó-†Õ+{0`ßžôì,ôªäÞùÜ#(8Ç•\Ùc² äÖQĪ®M’Ó]Ûiœýä·Ë`æs _‚{73Àg89Ö'ã#æÌ›òûáÎäìì6Øš=Ø;tÌãã§ÍŸ—\Þ•;_ÈÛ¬øèJ³ZLÙï¶ pÞ¨¶Ã´_Î=ª®ÅÙ+™æò“Oö íŽmi´”Próhî·ÉgÖ+Ü>í™áŒå=.HžxÉuïP¥×ìF¥Ey8V…•g=ÉIüe÷¤Þó°?¾Ûì÷ßønÝoï6ÄêÉÿhzÑÓ,óçE©ßåÎjHðÞoÌ +ï\8sü¯¬×zMç–{p1¥’%íÖ=‹œ[³ ¯mHZó&<f¤¹_‡0Þ¾’÷}Ûâs›œ¯n|/ǽ=Õò€£ïÛ”Á«²{âƒ?öpÀNŒËˆ¶Àêq]fó🖺’Ûõ5³;:¼±nƒç‡ùO•Jt»pûÆn´Â‚¢¤_wOèɶr1´ØGLYràáÃàjyÊöôæ6›o™øÙ©“¹ÅŤ›_ÕÛ ƒ½yË�>2Æ&ÕW˜WùJþ¯½ýr¬<öÔïg¿¿õr8Kœ¶yB]Ê3t5¾ËWÚô6³»ŒÈºtÅüaÉÍÃyK:¢R¸õX+xgÒ.>ò'Ÿ‹=&ý°û¾Ÿ¬f•” ®ø9íÁ?Ýwï‚‘-¹´#Ç +)¤{Þ=óW¿Hn|+{FÊ_ŒŸC\R}>Ò“g˜ÔùËmz™ÙƒmCcïßx`4 /:òì‘›óÃs»yùþì Ë}÷Îu™Õsâ;ïV×úT²Éyïì;õ6$|ô°äüf7Ÿ_Éñpþ7ȼâ¾á•‚ucýú“æE¿_ +£¬ï>”>sW\Trê@ú‡C¿wíçéô)8oftž8môÒ„¥»àå?º¿vŒçßsö‹1˼ØîÞÎo¾u»9ïÆköÀ4¸ñÇŽ_ÜÎî8p1Ü&ù.Ì¡\ÙúqeðÓ‡±ö‹/¦æ¯NºüÑ[‹!«_txwS›ž†ÀoiÓãÎS NÂóü㽩Og6rKΫ[&ra»¹/º‹ë3Þ{LZ’rûÎt©<eóÅkþ޳ߦÅö”[§7à `îu#]`΂ñ'Ã@l)ãʳçeʘAëKŠKR·žüèïç‡Ç‚ᆅ]Ýî À¾›±³vÅuÎqß½òdÚkŒ|õ;Ú¶#ïÝÞùqçÝ +¬ïT¨ì¾zË%ðÞÙ7ì$4ؘüÓÎßhóÌt+™7Ýøûü•ƒ«©Ÿå,ùy…[ÿ<ð{ó>ˆoÂb(÷ȼÄzühj}-ï}ÖðÇ·¢Œçö$¯Îþ´÷Áƒjêê©{lÒî{ÎRŸõ?^ú¶½UÈþdŽ•óK:Õ–zk‹>×ýâ¶ØïWöâ-ûÞ£ÔÑñÆ®§ä6½?îô±!ϱݾJ‰‰ ~º}à+q3Lñá¶å5+ü³ŸÓªÍŸ¿ý4ÛÚxkAÓ¤¿¾_:êÉOZÌ”sŸ+pûtY vù”òÖ2üþüñÉ3{‡Œ1ngø-tX|ç/NÎ4ñÖ'M¬w&žx§åäî_Ø]ó½ÝÌßN>¬®£ò‹K<|öÊ!XùŸØëy'ç*9î>{qûK—?OŸg5p>ñs¶Ésùè'e€¿ýŠñùfÒ#i¨_>>¶ËWàá”îÓvÆvÉú¢Žé$d}éØ4¶—ÅŸñºÃà|ë+Ó3ªkû:ûçf°žìUê%®ýãè',WàAWNÞ2_Õ§í|h½Š3%yùç,IiKæ5)là—Ý>6p㻡cï|ÚØ„J¼2§Õ?8Ö2V™o¹tͽ¬ +ìv«hy7õy¯«—ciÙ‡€?&þ¹{~¨ùòU× h3êîœñ¬þdÙ>§Ýç÷ùÊ/ Jö•kFO&²mƒñŸ¯š“Oò“ÞzWwßlî’–KŠã»z˜l弑ˆÛmögiGŠ«q³Ù’“g½Ó•þ¬-{ \5ëÚ¬fn÷Òêç¼b^Ì_ù†Ï^Ê*ñÞŸkèºÓyo×¾úCàwtp#aÓµw¾Œ^–0¦_ö——Kó¥Ë“ÿcäW’ǵ±ÐWø‡˜7÷ô¿ UUÙ}óŽ¯?iM[оAâš™?E?šQ/ÇÍm[VáÕ¼ÅíJn±óç¹|äÞ”Ÿ²$¿àìÜïÛºgð¨ü%ν?ÿúàóFÞròêõC>ïû5\uù––?Œþî·óÕ»£û~^¾kqÄ<O2ÉDKö’}VÖýºú»>O§×q{’äqMĬ´ÍÉé +ùE‰ò89~=LëŸù÷îêõ¦áÆ_øni)éÜÎþe@Ž¹|Àú ùOÓwbÄt‹Ì[òœnkÛùƒŸÜ¨ÞMŹEÅüÚD_Àñúì…BíÖ,Ù¾ ƒ±ÞmúÆÖ¼eþª7O®?׫,§£î÷‡>ŒreÅ_Æf]f_½Qš÷¸pˇ¹_Õ³x’„3gßS¾è÷.%–»xIû8æãóÇ›öT÷Fz'lpÁp|¦ Éüz®žvŽdf,=˜c ýÜfÅg¼·c~l… Éï·…™OSi› AÍ™™Jr³ŠÒ~ÎÇç¸\W÷2¦Öÿ3ê¸n3ýFOæ\Dõûúƒmû^˜¥å/©÷ï×Iôò$·Wéëê»L@ԊϯÍjjÉÛXëWóÿŒ4Wl«¤<üomÜfØÖ]=ß|tðHñ•Ýy5¯Ìëäñ)ÞïùY�¶{\AQß®H«^ój”»Y9MsÉüžÒlþi lë%³üÓ³ùlït¥k‰jFÝâãÂp;b—!ü奼{Òâ>`§Oô8=c^þ…ýyßµt/–½bêãé¯Oï?Å\àôÔtùà§;O_Ò „³OŸ ”=ôóÇ.ÿäÜÑ+¥àþWò·u>L¯n<×uô!0>8‹Š¯¯MÞÙu ݃Ù?òþú¥ù¿õ1–̬¯Œ©õÜžd™lï2kTŸ¹‹SÒ^ÚixÛ¯Ý,#{àÇÏgdõ×\1õªËÉw¿!i3ê$Ç—æ> +ÄF³øõíËsŸ+¹7oŠyÖžB{ž~7&gY¿Ü™¯YÖ˜6ãµ&v{§ÇÔ€<·øóCßþ&5ýelá6 +‚µAûöڳͷlj±=åõÉ~9OÇ÷%ó;^«$Ækn³¢KJ‹ò5Z¡`Êoq–”\ý}±—ow·ˆ'sCi)Á’%`y¿]5uñsq†d¾Û챋ïåTcÒÀ^¾>|š=h¸1yúÙÓ9,|~RX˜tëÖ Ô}Ü–M~@))¡ÛŸ·}Ó1“ò™–21¿iÑá_Í37ü:6>Ånì.½Y²Ò¯ìè<`[ÛˆÔîaŸ‡X“&çó—p>¾šôËî¸s=ž¤ÏY1î fÓ±‹•‰ +Lôk `sêõœk2W_¿6tjÃ<EÜòºæ‡ßÈœ^׶¸Wiçŧ֕:½ epÞoñkŠ²sN|úÕövt¬Êƒ÷Zü+KL½´kÉÝS Þ²jÿÄ^ó|ølϼ=üÛ|O…z eá‰ÓÚ�^æ?Wl»W¨¤´ôjNΗÓåÍÉÞœ§—´nù‚%#î|ÕÐêËÑð¿kA®N`ØyVñìÂ䛉›þî6àÌ05ã£ú9_º}Ú/=œÏÿ¹GÉÕ½}ÊŸ&¹÷á[àÝ7{°jω—,ðF¹ÃíOÙ¼q嵫ϼù`~.,)9öàNdÊšIk½œÏ¤„Æ F/ÿôø\-˽!ÇŇy|Ñ?sKsڑįçùÌ&á>fæ©3Çb¢¯Žã²¦ÖÉõ¨sØ͉ù+”Ü>jêÚ†ßöLèùõ8× T³¼eÞÅü¿Öì?u«º–ÿÊ.ÕŠ‹éÄ@vçB©{ÈËØŸ>HÿyëâÎk—xûÿÄÿ6ý¸zQß{3µié +ÖŒpÞ=YZRèS•WÊ‘=(¼}éö¸‡¼îÊN{¯Åç~U¿`}Œ3ó–Y³Ä¹jaŠ'3Câí›=ÓcΊ]Ç5úÊÃܼ˜C‡ê$Ó³üßC½1¡´øþ¹´Í3G/ÿ¬QŸ>¡n³õ«>[wÌ-üî”Ú+y?v,:´ŒÝHå, €0e±½ ‹vì¯x+kZ]·Óè/ÇnûÜ™ýÀZUÖ“œ%S×Û@Þ+zzcô¢;O²µûrʪsél/ñÞôlWO³¢<¼±á£ï—¼ÝbíÏžÄ2{½žøWÕþXÔ×Ût#ðܦù+>ù½šA)Ê->·©`]´OZÀZsÞ¢ÖÅÇV•ægútøÆ¥{_ÅþfwÝÍ׈þóv¸üâ,«¢‚nÇ8ôú†¤W¯;=w„ß¼Çy©‹Ž/é9bå4~ï…‰kÆ,ÿôÈ×z†‘Ø7Ó›³^Ï[ZøÏì’›iΧwˆ]Eytàž³„np+),-ÌEÍΧ·Kn,Ü5;oq;¶+Ïá‚/ÏfZVáìFtOâÃKÖ³]Pã,=°í”a^ÇÙÜH¼¢»ÏY·ýXÖK?âÃo¹ü8sxjj·]ñ4®”í‚QŶ<Y9dÁQak¿–´Îµj±vÙœŸF|²}0fÖÍ[Ò¡ !¦p猢ý‹‹Ž,GP”ú}á¶iEAŒYLêñ”¬ÛhÙÏ_#Û¿ØX³›ì§y?•lwÝÍ×ê„çü‹JµéÚº‰ ÓNžtz£±_þ°ï|p>{Ë'{~èûÛ ÿòY窟¸¶çó—-~ãÆWM}!ÚyùfûùÁ+žxanÓŸ²s¹}o4ËÅ“7Þ¸0¦«u§·çõÖÐkŽ¼¤SÊYŠJœsOá7oÚv§¼{IÚò3‹Îo¾½|È/?Ö¯°'|š%¬ôû¬„o»?žñš%Ûóªyj±tçX „uà7.ï_œ¾³4ŸîõÜ¥g?L]È°Fœ?{sjÍç·�úÞM;Òñï‡=* Ñû-À¢£¿_XþÖ¤U_ÿ=yfóßó›v¹:«™aIfÃ2±ÅºÎNŸ¿É_9¸øÜFóþ”gÀvZn91ÇLx˜eÒ>gÚãj»’åZfVÔ¾Ô·öíKÏÊ*§mµ¼ÎÌ›OÒ–¯ÝòM¿u&ò›©6öø¿Ä?#W~ñë÷ƒŒ„›7ÚxÁ‘K;¾nžÿçpÃ{ynÏá´g¦Ž²Ü`Yã:ì›é;ž¶Û ª¤{ð0*uÿ¸ƒ3…?Öâå!†É¼uîò¡™{“•ä?}³mnü°jö¢†›#f›b°"Ï—¯>ùôõœµ“‹Ïo!/¨ÔÏ)—öÖï\ôíGkL7_c#f÷»hJÊÞ×_^*ø…Ë»÷Ç80%ípNqqî¥õÝšœ¹9G¡’=6mðÍ6»å¿õ_?½óË”CóZ=üªáÓY²g4Èø´Iz´t6nГÔmμ§öyÔ“ŒO¾ŽŽj±ÄJã˜ßöù²¨]{WŸõstÆ¿³¤Ý8îà¡Ž½——çWò%X¬•ÀMJº}kpê¾f›7z–`¼Ónõ’lüý‡=k“—-Z×wØÑOff]º¨!{?2÷n<úæýÕÖ$ðØn0¦ózÅ-nòÛŸõÓ¯V1wª¹@òãzïð‘;Þ§l=+G²ÅüÌ¿•—ûó•Ë÷íão'›ñª“” ¬\9àû%sØvïîœg™7JqqÉ…ã×¾¿Ú< +ØòFäÂÎü$-ú½îúõRþ…Η§{ð(nÿ¡‘{=çXú”²™o–"§óJvö÷—.¶Ý±=ðj#½êoHÒ·mí¹ûŸq‡Ó@ÿÏýû7órý.’•ìO9ùÅèeã#æŒé9gHäÂ.ïý¨Ï_Ñä·5¯±'xÚ·oïêºûæ%”›YÙ9ÚkÇßG32 +KJ!µXn½þßÉ˃üwÚµÓ…ÿ~¶wº.Öa³�2 •¾-*{äðg§Nοpþ›‹¾>svÌêæ®h1oEóŸV×_³îµµëëÏg¯ØCi§ïÿ‹Õ+ÙEOŸ ÝšòËÅôŒ‚²N×/þ <ÈÏ_’~iÈ~ËjcR`Eðl>ô»5Â÷zݤ„¹'Ogä•7;÷//ÅNgÊ[ï:wèÐ…'™~%ß,Ïå)KßÊÍM¼usâÑ#ÂÖÍ~‘Çwk„ïŒø!´oïúKW‹þƒO¬+»\}òtÊÁ´…çÏÿváRNÅ·šû£ŒÂ‚C¦>%¥lñÏm+«½vúRFíI=]m·ÛüÊúKW&¥î²e[ò÷róJlØnCˆÆ(¹ÅÅkn\ó@*,,Þ“ðl{öÙÿéq“bL¾rݾŽü¿W€¢¥_‰Ù`Äž}¤_¹’™U¶Xç} +TiÏýûïï9ØârQÌ Ÿ~PˆØþúú„¥ç/ÞÍ~©fj¼dä,<~:öÀ¡~»wÏ<tìÄ%åpÂ}¬”y…gÒ®$,Û5ÿƒÕ£F-î1éeáʺë×û… Áûö.8~®W9çô¯<É/Xzú<ðGß´yÀ¦íóþI»òðIV~a^AQQQ±yÔ¡QLlÁu8ä…Ey¹÷ŸÝ{aõ¢m_ŒYöî oãz¸’�EGõ™Û;v±û±n$ÿu“£˜ìÔýœ¼2zõ§—¤Þº»øü.!éõ¿ÖµÿymÜï[o=¸aß™GÓO¿vþøµ‹'®#ä<wôê‰ý—v'MþuÏÏ3“¿Œþ™m›å³o\×ÙÑt†gŸñßvê$&4YŸ¸ðì¹½·ï¾ÌCËÿ+Âý8/ÿdÆã¥g/pkëÿµ®ùÒÕú¼¦ÿÖë³_†¾³ì혆¿ýíÈ~óuB¤}WH#æDõùúí7æñmω?„}¾Lþî÷æ«Ö-=sþÈÃG÷sóþmÏ¿þ–R–1È,,Ü}ýöÂ#§âöîkÏÞá»ö6Y¾&äçÕü’?ÄïW«ê‚•ÚüÆ.-ú=>eOܶ=ìH]|èä®k·æåSà\ÓÃù¯ Ä̬Ów¥^¿³åÒµ¯&^¸‚w|Þ}õôÍ'Y¹ÿ…GèK°K°K°K°K°TU©_¿CìÈðÈøÈÚµu®]«~hy®ô‰œ5©v¸4¬yè¤øðèñÑq±‘“Þw´ k\ˆ$«ª¦ò¯q +¯«Žæ}¢"c _:ðGÏIÑ££cq±ïˆÈ˜¨FŽ¦ôÖôV»–îhØÈ1h`íZýµàKÑÞÓ½ˆÈ÷£&5k†õ{EŽŽê7)2:†º;zrä;QŽÈØظøÈø¨ øÊ1zRÔäø¸IQŽÉcâÞ¥+ô#ó~ÏŽµkýÿ¹:Ž +endstream endobj 5 0 obj <</Intent 15 0 R/Name(Layer 1)/Type/OCG/Usage 16 0 R>> endobj 22 0 obj <</Intent 30 0 R/Name(Layer 1)/Type/OCG/Usage 31 0 R>> endobj 37 0 obj <</Intent 53 0 R/Name(Layer 1)/Type/OCG/Usage 54 0 R>> endobj 60 0 obj <</Intent 67 0 R/Name(Layer 1)/Type/OCG/Usage 68 0 R>> endobj 74 0 obj <</Intent 82 0 R/Name(Layer 1)/Type/OCG/Usage 83 0 R>> endobj 89 0 obj <</Intent 100 0 R/Name(Layer 1)/Type/OCG/Usage 101 0 R>> endobj 107 0 obj <</Intent 118 0 R/Name(Layer 1)/Type/OCG/Usage 119 0 R>> endobj 125 0 obj <</Intent 134 0 R/Name(Layer 1)/Type/OCG/Usage 135 0 R>> endobj 141 0 obj <</Intent 150 0 R/Name(Layer 1)/Type/OCG/Usage 151 0 R>> endobj 157 0 obj <</Intent 166 0 R/Name(Layer 1)/Type/OCG/Usage 167 0 R>> endobj 173 0 obj <</Intent 182 0 R/Name(Layer 1)/Type/OCG/Usage 183 0 R>> endobj 182 0 obj [/View/Design] endobj 183 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 166 0 obj [/View/Design] endobj 167 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 150 0 obj [/View/Design] endobj 151 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 134 0 obj [/View/Design] endobj 135 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 118 0 obj [/View/Design] endobj 119 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 100 0 obj [/View/Design] endobj 101 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 82 0 obj [/View/Design] endobj 83 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 67 0 obj [/View/Design] endobj 68 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 53 0 obj [/View/Design] endobj 54 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 30 0 obj [/View/Design] endobj 31 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 15 0 obj [/View/Design] endobj 16 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 19.2)/Subtype/Artwork>>>> endobj 190 0 obj [189 0 R] endobj 205 0 obj <</CreationDate(D:20161006171817-03'00')/Creator(Adobe Illustrator CC 2015 \(Windows\))/ModDate(D:20161013192722-03'00')>> endobj xref +0 206 +0000000004 65535 f +0000000016 00000 n +0000000312 00000 n +0000027806 00000 n +0000000006 00000 f +0000133736 00000 n +0000000008 00000 f +0000027857 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000017 00000 f +0000135705 00000 n +0000135736 00000 n +0000000018 00000 f +0000000019 00000 f +0000000020 00000 f +0000000021 00000 f +0000000023 00000 f +0000133806 00000 n +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000032 00000 f +0000135589 00000 n +0000135620 00000 n +0000000033 00000 f +0000000034 00000 f +0000000035 00000 f +0000000036 00000 f +0000000038 00000 f +0000133877 00000 n +0000000039 00000 f +0000000041 00000 f +0000029564 00000 n +0000000042 00000 f +0000000043 00000 f +0000000044 00000 f +0000000045 00000 f +0000000046 00000 f +0000000047 00000 f +0000000048 00000 f +0000000049 00000 f +0000000050 00000 f +0000000051 00000 f +0000000052 00000 f +0000000055 00000 f +0000135473 00000 n +0000135504 00000 n +0000000056 00000 f +0000000057 00000 f +0000000058 00000 f +0000000059 00000 f +0000000061 00000 f +0000133948 00000 n +0000000062 00000 f +0000000063 00000 f +0000000064 00000 f +0000000065 00000 f +0000000066 00000 f +0000000069 00000 f +0000135357 00000 n +0000135388 00000 n +0000000070 00000 f +0000000071 00000 f +0000000072 00000 f +0000000073 00000 f +0000000075 00000 f +0000134019 00000 n +0000000076 00000 f +0000000077 00000 f +0000000078 00000 f +0000000079 00000 f +0000000080 00000 f +0000000081 00000 f +0000000084 00000 f +0000135241 00000 n +0000135272 00000 n +0000000085 00000 f +0000000086 00000 f +0000000087 00000 f +0000000088 00000 f +0000000090 00000 f +0000134090 00000 n +0000000091 00000 f +0000000092 00000 f +0000000093 00000 f +0000000094 00000 f +0000000095 00000 f +0000000096 00000 f +0000000097 00000 f +0000000098 00000 f +0000000099 00000 f +0000000102 00000 f +0000135123 00000 n +0000135155 00000 n +0000000103 00000 f +0000000104 00000 f +0000000105 00000 f +0000000106 00000 f +0000000108 00000 f +0000134163 00000 n +0000000109 00000 f +0000000110 00000 f +0000000111 00000 f +0000000112 00000 f +0000000113 00000 f +0000000114 00000 f +0000000115 00000 f +0000000116 00000 f +0000000117 00000 f +0000000120 00000 f +0000135005 00000 n +0000135037 00000 n +0000000121 00000 f +0000000122 00000 f +0000000123 00000 f +0000000124 00000 f +0000000126 00000 f +0000134237 00000 n +0000000127 00000 f +0000000128 00000 f +0000000129 00000 f +0000000130 00000 f +0000000131 00000 f +0000000132 00000 f +0000000133 00000 f +0000000136 00000 f +0000134887 00000 n +0000134919 00000 n +0000000137 00000 f +0000000138 00000 f +0000000139 00000 f +0000000140 00000 f +0000000142 00000 f +0000134311 00000 n +0000000143 00000 f +0000000144 00000 f +0000000145 00000 f +0000000146 00000 f +0000000147 00000 f +0000000148 00000 f +0000000149 00000 f +0000000152 00000 f +0000134769 00000 n +0000134801 00000 n +0000000153 00000 f +0000000154 00000 f +0000000155 00000 f +0000000156 00000 f +0000000158 00000 f +0000134385 00000 n +0000000159 00000 f +0000000160 00000 f +0000000161 00000 f +0000000162 00000 f +0000000163 00000 f +0000000164 00000 f +0000000165 00000 f +0000000168 00000 f +0000134651 00000 n +0000134683 00000 n +0000000169 00000 f +0000000170 00000 f +0000000171 00000 f +0000000172 00000 f +0000000000 00000 f +0000134459 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000134533 00000 n +0000134565 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000071719 00000 n +0000135821 00000 n +0000028249 00000 n +0000072025 00000 n +0000071911 00000 n +0000030389 00000 n +0000061241 00000 n +0000029629 00000 n +0000029824 00000 n +0000029874 00000 n +0000071793 00000 n +0000071825 00000 n +0000072101 00000 n +0000072279 00000 n +0000073769 00000 n +0000085924 00000 n +0000135848 00000 n +trailer +<</Size 206/Root 1 0 R/Info 205 0 R/ID[<BF7041612CDA1248B542725B4EEBD5CC><FF417A6C0FF3E24A8349DD3D60C319D6>]>> +startxref +135988 +%%EOF diff --git a/src/img/logo_parceiros/impa.png b/src/img/logo_parceiros/impa.png new file mode 100644 index 0000000000000000000000000000000000000000..61120632bbbf8c020c19ccfedd42d35b73918943 Binary files /dev/null and b/src/img/logo_parceiros/impa.png differ diff --git a/src/img/logo_parceiros/impulsiona.png b/src/img/logo_parceiros/impulsiona.png new file mode 100644 index 0000000000000000000000000000000000000000..384bd3f78c67b8fed0ec910e12de43da22d8a388 Binary files /dev/null and b/src/img/logo_parceiros/impulsiona.png differ diff --git a/src/img/logo_parceiros/inst-peninsula.png b/src/img/logo_parceiros/inst-peninsula.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7d0f234870b25cb10c7539bde06ddd68aa630a Binary files /dev/null and b/src/img/logo_parceiros/inst-peninsula.png differ diff --git a/src/img/logo_parceiros/instituto-crescer.png b/src/img/logo_parceiros/instituto-crescer.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9157077120ecf1e3517775383b360b12dec54a Binary files /dev/null and b/src/img/logo_parceiros/instituto-crescer.png differ diff --git a/src/img/logo_parceiros/logo_bioe.png b/src/img/logo_parceiros/logo_bioe.png new file mode 100644 index 0000000000000000000000000000000000000000..2b050782ab8ad609b68262c8220ba7ce550f846c Binary files /dev/null and b/src/img/logo_parceiros/logo_bioe.png differ diff --git a/src/img/logo_parceiros/logo_dominiopublico.png b/src/img/logo_parceiros/logo_dominiopublico.png new file mode 100644 index 0000000000000000000000000000000000000000..16c0737187890f5e9da4cdd8556a1b286faa3216 Binary files /dev/null and b/src/img/logo_parceiros/logo_dominiopublico.png differ diff --git a/src/img/logo_parceiros/logo_escoladigital.png b/src/img/logo_parceiros/logo_escoladigital.png new file mode 100644 index 0000000000000000000000000000000000000000..c1ed98e0fc0d8ba0bef95c6727297fe7427db2c9 Binary files /dev/null and b/src/img/logo_parceiros/logo_escoladigital.png differ diff --git a/src/img/logo_parceiros/logo_portaldoprofessor.png b/src/img/logo_parceiros/logo_portaldoprofessor.png new file mode 100644 index 0000000000000000000000000000000000000000..deb2ce6448dc5b36a04d05bd0e6ebd296379263a Binary files /dev/null and b/src/img/logo_parceiros/logo_portaldoprofessor.png differ diff --git a/src/img/logo_parceiros/logo_tvescola.png b/src/img/logo_parceiros/logo_tvescola.png new file mode 100644 index 0000000000000000000000000000000000000000..9067cbc112ec0b710ac2726f15ce59a62921ff60 Binary files /dev/null and b/src/img/logo_parceiros/logo_tvescola.png differ diff --git a/src/img/logo_parceiros/redeescola.png b/src/img/logo_parceiros/redeescola.png new file mode 100644 index 0000000000000000000000000000000000000000..724433f94fbfa77f051d44521c990dc2f0ed89d6 Binary files /dev/null and b/src/img/logo_parceiros/redeescola.png differ diff --git a/src/img/logo_parceiros/safer.png b/src/img/logo_parceiros/safer.png new file mode 100644 index 0000000000000000000000000000000000000000..9aa865ea9e622a8b69ab6fc2a327c5a6cd5d9a25 Binary files /dev/null and b/src/img/logo_parceiros/safer.png differ diff --git a/src/img/logo_parceiros/telefonica.png b/src/img/logo_parceiros/telefonica.png new file mode 100644 index 0000000000000000000000000000000000000000..8507326e4de2df2eabab084b0d3f236cf1b560e4 Binary files /dev/null and b/src/img/logo_parceiros/telefonica.png differ diff --git a/src/img/no-rede-1.png b/src/img/no-rede-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7d4510823fa703462511b4b7f8f6643a2e72639f Binary files /dev/null and b/src/img/no-rede-1.png differ diff --git a/src/img/no-rede-2.png b/src/img/no-rede-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c94c169f7caecd6763d628b87e752a45b1cd1d79 Binary files /dev/null and b/src/img/no-rede-2.png differ diff --git a/src/img/no-rede-3.png b/src/img/no-rede-3.png new file mode 100644 index 0000000000000000000000000000000000000000..58b934c3bc3ee2dfa597b5386d66434973fca2cf Binary files /dev/null and b/src/img/no-rede-3.png differ diff --git a/src/img/object_type_icons/object-type_animacao.svg b/src/img/object_type_icons/object-type_animacao.svg new file mode 100644 index 0000000000000000000000000000000000000000..bcf7537f396b2e27b76fdde7792cd2fd0993ff24 --- /dev/null +++ b/src/img/object_type_icons/object-type_animacao.svg @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <rect x="2.8" y="38.6" class="st1" width="15.5" height="1.5"/> + <polygon class="st1" points="17.5,23.3 2.8,23.3 2.8,24.8 17.5,24.8 17.5,31.8 19,31.8 19,16.3 17.5,16.3 "/> + <polygon class="st1" points="24.2,31.6 22.7,31.6 22.7,47.1 24.2,47.1 24.2,40.1 49.2,40.1 49.2,38.6 24.2,38.6 "/> + <polygon class="st1" points="34.5,7.8 34.5,0.8 33,0.8 33,16.3 34.5,16.3 34.5,9.3 49.2,9.3 49.2,7.8 "/> + <rect x="23.5" y="23.3" class="st1" width="25.7" height="1.5"/> + <rect x="2.8" y="7.8" class="st1" width="25.7" height="1.5"/> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_aplicativo-movel.svg b/src/img/object_type_icons/object-type_aplicativo-movel.svg new file mode 100644 index 0000000000000000000000000000000000000000..2b6a3c2f802bf7eb3e1844c53ba9f3a0cf2c5be0 --- /dev/null +++ b/src/img/object_type_icons/object-type_aplicativo-movel.svg @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M34.4,2.4H17.6c-2.6,0-4.8,2.1-4.8,4.8v33.6c0,2.6,2.1,4.8,4.8,4.8h16.9c2.6,0,4.8-2.1,4.8-4.8V7.2 + C39.2,4.5,37.1,2.4,34.4,2.4z M14.3,8.3h23.4v29.6H14.3V8.3z M17.6,3.9h16.9c1.8,0,3.3,1.5,3.3,3.3v0.1H14.3V7.2 + C14.3,5.4,15.8,3.9,17.6,3.9z M34.4,44H17.6c-1.8,0-3.3-1.5-3.3-3.3v-1.9h23.4v1.9C37.7,42.5,36.2,44,34.4,44z"/> + <path class="st1" d="M28.4,40.4h-4.7c-0.6,0-1,0.4-1,1s0.4,1,1,1h4.7c0.6,0,1-0.4,1-1S28.9,40.4,28.4,40.4z"/> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_apresentacao.svg b/src/img/object_type_icons/object-type_apresentacao.svg new file mode 100644 index 0000000000000000000000000000000000000000..7dc07625646842e55faea44dccffe6d9237e661d --- /dev/null +++ b/src/img/object_type_icons/object-type_apresentacao.svg @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M49.3,5.1h-2.3c-0.1,0-0.2,0-0.3,0H41h-9.7C31,2.6,28.7,0.5,26,0.5c-2.7,0-5,2-5.3,4.6H7.3h-2 + c-0.1,0-0.2,0-0.3,0H2.8C2.3,5.1,2,5.5,2,5.9v0c0,0.4,0.3,0.8,0.8,0.8h1.6v29.5c0,0.4,0.3,0.8,0.8,0.8h12.4l-2.8,9.5 + c0,0.1,0,0.1,0,0.2c0,0.3,0.2,0.6,0.5,0.7c0.4,0.1,0.8-0.1,0.9-0.5l3-9.9h14l3,9.9c0.1,0.3,0.4,0.5,0.7,0.5c0.1,0,0.1,0,0.2,0 + c0.3-0.1,0.5-0.4,0.5-0.7c0-0.1,0-0.1,0-0.2l-2.8-9.5h12.4c0.4,0,0.8-0.3,0.8-0.8V6.7h1.6c0.4,0,0.8-0.4,0.8-0.8S49.7,5.1,49.3,5.1 + z M26,2c1.9,0,3.5,1.4,3.8,3.1h-7.6C22.5,3.4,24.1,2,26,2z M46.2,35.4H33.6H5.8V6.7h1.5h14h9.3H41h5.2V35.4z"/> + <path class="st1" d="M9.2,10.6v20.9c0,0.3,0.2,0.5,0.5,0.5h32.6c0.3,0,0.5-0.2,0.5-0.5V10.6c0-0.3-0.2-0.5-0.5-0.5H9.7 + C9.4,10.1,9.2,10.3,9.2,10.6z M10.2,11.1h31.6V31H10.2V11.1z"/> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_audio.svg b/src/img/object_type_icons/object-type_audio.svg new file mode 100644 index 0000000000000000000000000000000000000000..c7905aececcf6588df174d6e92c322d8ffe515fd --- /dev/null +++ b/src/img/object_type_icons/object-type_audio.svg @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M42.6,9.4c-3.3-4.1-7.7-6.8-12.9-8c-0.4-0.1-0.8,0.1-0.9,0.5c-0.1,0.4,0.1,0.8,0.5,0.9c4.9,1.2,9,3.7,12.1,7.5 + c3.1,3.8,4.7,8.4,4.8,13.6c-0.1,5.3-1.7,9.9-4.8,13.7c-3.1,3.8-7.2,6.3-12.1,7.5c-0.4,0.1-0.6,0.5-0.5,0.9c0.1,0.3,0.4,0.6,0.7,0.6 + c0.1,0,0.1,0,0.2,0c5.2-1.3,9.5-4,12.9-8c3.3-4.1,5.1-9,5.2-14.6C47.7,18.3,46,13.4,42.6,9.4z"/> + <path class="st1" d="M29.2,33.2c-0.4,0.2-0.5,0.6-0.4,1c0.1,0.3,0.4,0.4,0.7,0.4c0.1,0,0.2,0,0.3-0.1c2-0.9,3.6-2.3,4.8-4.2 + c1.2-1.9,1.8-4,1.8-6.4s-0.6-4.6-1.8-6.4c-1.2-1.9-2.8-3.3-4.8-4.3c-0.4-0.2-0.8,0-1,0.3c-0.2,0.4,0,0.8,0.3,1 + c1.7,0.9,3.2,2.1,4.2,3.8c1,1.6,1.6,3.5,1.6,5.6s-0.5,4-1.6,5.6C32.4,31.2,31,32.4,29.2,33.2z"/> + <path class="st1" d="M24.8,3.2c-0.3-0.1-0.6-0.1-0.8,0.2L11.8,15.6H5c-0.4,0-0.8,0.3-0.8,0.8v15c0,0.4,0.3,0.8,0.8,0.8h6.6L24,44.5 + c0.1,0.1,0.3,0.2,0.5,0.2c0.1,0,0.2,0,0.3-0.1c0.3-0.1,0.5-0.4,0.5-0.7V3.9C25.3,3.6,25.1,3.3,24.8,3.2z M5.7,17.1H8V21 + c0,0.3,0.2,0.5,0.5,0.5S9,21.3,9,21v-3.9h2.3v13.5H9v-3.9c0-0.3-0.2-0.5-0.5-0.5S8,26.4,8,26.7v3.9H5.7V17.1z M23.8,42.2l-11-11 + V16.8l11-11V42.2z"/> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_imagem.svg b/src/img/object_type_icons/object-type_imagem.svg new file mode 100644 index 0000000000000000000000000000000000000000..c6cc9fa5b8312e4843289c51d4e3b6af95ee1e5b --- /dev/null +++ b/src/img/object_type_icons/object-type_imagem.svg @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M47.5,2.3c-1.1-1.1-2.5-1.6-4.1-1.6H8.5c-1.6,0-3,0.6-4.1,1.7C3.3,3.5,2.8,4.9,2.8,6.5v34.9 + c0,1.6,0.6,3,1.7,4.1c1.1,1.1,2.5,1.7,4.1,1.7h35c1.6,0,2.9-0.6,4-1.7c1.1-1.1,1.7-2.5,1.7-4.1V6.5C49.3,4.8,48.6,3.4,47.5,2.3z + M47.6,41.3c0,1.2-0.4,2.2-1.2,3c-0.8,0.8-1.8,1.2-3,1.2H8.5c-1.2,0-2.2-0.4-3-1.2s-1.2-1.8-1.2-3V6.4c0-1.2,0.4-2.2,1.2-3 + s1.8-1.2,3-1.2h34.8c1.3,0,2.3,0.4,3.1,1.2c0.8,0.8,1.2,1.8,1.2,3.1V41.3z"/> + <path class="st1" d="M23.5,34l-6.3-7.5L7,39.7h38l-12.8-17L23.5,34z M10.1,38.2l7.2-9.3l6.3,7.5l8.6-11.2l9.8,13H10.1z"/> + <path class="st1" d="M37.8,36c0.1,0.1,0.2,0.2,0.4,0.2c0.1,0,0.2,0,0.3-0.1c0.2-0.2,0.3-0.5,0.1-0.7l-5.3-6.7 + c-0.2-0.2-0.5-0.3-0.7-0.1c-0.2,0.2-0.3,0.5-0.1,0.7L37.8,36z"/> + <path class="st1" d="M13.6,20.2c2.3,0,4.3-1.9,4.3-4.3s-1.9-4.3-4.3-4.3S9.4,13.7,9.4,16S11.3,20.2,13.6,20.2z M13.6,13.2 + c1.5,0,2.8,1.2,2.8,2.8s-1.2,2.8-2.8,2.8s-2.8-1.2-2.8-2.8S12.1,13.2,13.6,13.2z"/> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_infografico.svg b/src/img/object_type_icons/object-type_infografico.svg new file mode 100644 index 0000000000000000000000000000000000000000..b17502d0cc1b45ac62b4d5193f272452e66bc99e --- /dev/null +++ b/src/img/object_type_icons/object-type_infografico.svg @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 72 47.7" style="enable-background:new 0 0.1 72 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.2" class="st0" width="71.9" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <rect x="46.1" y="36.3" class="st1" width="24.1" height="1"/> + <rect x="46.1" y="29" class="st1" width="24.1" height="1"/> + <rect x="46.1" y="21.7" class="st1" width="24.1" height="1"/> + <rect x="46.1" y="14.4" class="st1" width="24.1" height="1"/> + <path class="st1" d="M23.4,20.8c0.1,0,0.2,0,0.3-0.1l13.9-8c0.1-0.1,0.2-0.2,0.2-0.3s0-0.3-0.1-0.4c-3.2-4.8-8.5-7.9-14.3-8.2 + c-0.1,0-0.3,0-0.4,0.1c-0.1,0.1-0.2,0.2-0.2,0.4v16c0,0.2,0.1,0.3,0.3,0.4C23.2,20.8,23.3,20.8,23.4,20.8z M23.9,4.8 + c5.1,0.4,9.8,3.1,12.7,7.3l-12.7,7.3V4.8z"/> + <path class="st1" d="M36.3,17c-0.2-0.1-0.4,0-0.6,0.1L20.4,26l0,0l-0.3,0.2v-18c0-0.2-0.1-0.4-0.2-0.5c-0.1-0.1-0.4-0.2-0.6-0.2 + C9.5,7.9,1.8,16,1.8,25.8c0,10.2,8.3,18.5,18.5,18.5S38.7,36,38.7,25.8c0-2.9-0.7-5.7-2-8.4C36.6,17.2,36.5,17.1,36.3,17z + M20.3,42.7c-9.4,0-17-7.6-17-17c0-8.7,6.6-16,15.3-16.9v18.5c0,0.3,0.1,0.5,0.4,0.6c0.2,0.1,0.5,0.1,0.8,0l1.4-0.8h0l14.6-8.4 + c1,2.2,1.5,4.5,1.5,7C37.2,35.1,29.6,42.7,20.3,42.7z"/> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_jogo.svg b/src/img/object_type_icons/object-type_jogo.svg new file mode 100644 index 0000000000000000000000000000000000000000..5f924ad9d8ea29e38cc7ac447a328d1defe7788f --- /dev/null +++ b/src/img/object_type_icons/object-type_jogo.svg @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M34.2,28.5c-2.1,0-3.9,1.7-3.9,3.9c0,2.1,1.7,3.9,3.9,3.9s3.9-1.7,3.9-3.9C38.1,30.2,36.3,28.5,34.2,28.5z + M34.2,34.7c-1.3,0-2.4-1.1-2.4-2.4c0-1.3,1.1-2.4,2.4-2.4s2.4,1.1,2.4,2.4C36.6,33.6,35.5,34.7,34.2,34.7z"/> + <path class="st1" d="M40.4,22.3c-2.1,0-3.9,1.7-3.9,3.9s1.7,3.9,3.9,3.9c2.1,0,3.9-1.7,3.9-3.9S42.5,22.3,40.4,22.3z M40.4,28.5 + c-1.3,0-2.4-1.1-2.4-2.4s1.1-2.4,2.4-2.4c1.3,0,2.4,1.1,2.4,2.4S41.7,28.5,40.4,28.5z"/> + <path class="st1" d="M19.6,26.5h-3.1v-3.1c0-0.4-0.3-0.8-0.8-0.8h-3.9c-0.4,0-0.8,0.3-0.8,0.8v3.1H7.9c-0.4,0-0.8,0.3-0.8,0.8v3.9 + c0,0.4,0.3,0.8,0.8,0.8H11v3.1c0,0.4,0.3,0.8,0.8,0.8h3.9c0.4,0,0.8-0.3,0.8-0.8v-3.1h3.1c0.4,0,0.8-0.3,0.8-0.8v-3.9 + C20.3,26.8,20,26.5,19.6,26.5z M18.8,30.4h-3.1c-0.4,0-0.8,0.3-0.8,0.8v3.1h-2.4v-3.1c0-0.4-0.3-0.8-0.8-0.8H8.6V28h3.1 + c0.4,0,0.8-0.3,0.8-0.8v-3.1h2.4v3.1c0,0.4,0.3,0.8,0.8,0.8h3.1V30.4z"/> + <path class="st1" d="M37.3,14.9H14.7c-7.9,0-14.3,6.4-14.3,14.3c0,7.9,6.4,14.3,14.3,14.3c4,0,7.7-1.6,10.4-4.5h1.7 + c2.7,2.9,6.5,4.5,10.4,4.5c7.9,0,14.3-6.4,14.3-14.3C51.6,21.3,45.2,14.9,37.3,14.9z M37.3,42c-3.6,0-7.1-1.6-9.5-4.3 + c-0.1-0.2-0.3-0.3-0.6-0.3h-2.4c-0.2,0-0.4,0.1-0.6,0.3c-2.4,2.7-5.9,4.3-9.5,4.3C7.6,42,1.9,36.3,1.9,29.2 + c0-7.1,5.8-12.8,12.8-12.8h22.6c7.1,0,12.8,5.8,12.8,12.8C50.1,36.3,44.4,42,37.3,42z"/> + <path class="st1" d="M34.8,10.9c9.8,0,9.9-6.4,9.9-6.5h-1.5c0,0-0.1,5-8.4,5c-9.7,0-9.8,4.5-9.8,4.7l1.5,0 + C26.4,14,26.7,10.9,34.8,10.9z"/> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_livro-digital.svg b/src/img/object_type_icons/object-type_livro-digital.svg new file mode 100644 index 0000000000000000000000000000000000000000..b3cafb622f6598da72fe44f7a9c2e54ff9399386 --- /dev/null +++ b/src/img/object_type_icons/object-type_livro-digital.svg @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M10.8,38.2h30.3V5.9H10.8V38.2z M12.3,7.4h27.3v29.3H12.3V7.4z"/> + <path class="st1" d="M39.5,0.1H12.5C9.5,0.1,7,2.6,7,5.7v36.5c0,3.1,2.5,5.6,5.6,5.6h26.9c3.1,0,5.6-2.5,5.6-5.6V5.7 + C45,2.6,42.5,0.1,39.5,0.1z M43.5,42.2c0,2.2-1.8,4.1-4.1,4.1H12.5c-2.2,0-4.1-1.8-4.1-4.1V5.7c0-2.2,1.8-4.1,4.1-4.1h26.9 + c2.2,0,4.1,1.8,4.1,4.1V42.2z"/> + <rect x="17.3" y="30.4" class="st1" width="19" height="1"/> + <rect x="17.3" y="24.6" class="st1" width="19" height="1"/> + <rect x="17.3" y="18.9" class="st1" width="19" height="1"/> + <rect x="21.5" y="13.1" class="st1" width="14.7" height="1"/> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_mapa.svg b/src/img/object_type_icons/object-type_mapa.svg new file mode 100644 index 0000000000000000000000000000000000000000..ba45576f7b2add93bfff978bee58313eeee391ce --- /dev/null +++ b/src/img/object_type_icons/object-type_mapa.svg @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M49.2,6.3L33.7,3.7c-0.1,0-0.2,0-0.2,0c0,0,0,0-0.1,0c-0.1,0-0.1,0-0.2,0L18.4,7.3c0,0,0,0-0.1,0 + c-0.1,0-0.1,0-0.2,0L3.1,3.7c-0.2-0.1-0.5,0-0.6,0.1C2.3,4,2.2,4.2,2.2,4.4v7.9c0,0,0,0,0,0s0,0,0,0v26.8c0,0.3,0.2,0.6,0.5,0.7 + l15.5,4.3c0.1,0,0.3,0,0.4,0L34,40.1l14.8,4.1c0.1,0,0.1,0,0.2,0c0.2,0,0.3-0.1,0.5-0.2c0.2-0.1,0.3-0.4,0.3-0.6V7.1 + C49.8,6.7,49.5,6.4,49.2,6.3z M3.7,5.4l13.8,3.3v27.2c0,0.4,0.3,0.8,0.8,0.8s0.8-0.3,0.8-0.8V8.6l13.7-3.3v33.5l-13.7,3.7v-3.2 + c0-0.4-0.3-0.8-0.8-0.8s-0.8,0.3-0.8,0.8v3.1L3.7,38.6V5.4z M48.3,42.5l-14.1-3.9c0,0,0,0,0,0V5.3l14.1,2.4V42.5z"/> + <path class="st1" d="M41.9,38.6l3.6,1c0,0,0.1,0,0.1,0c0.1,0,0.2,0,0.3-0.1c0,0,0,0,0,0c0.1-0.1,0.1-0.1,0.2-0.2c0,0,0,0,0,0 + c0,0,0,0,0-0.1c0,0,0,0,0-0.1v-3.3c0-0.3-0.2-0.5-0.5-0.5s-0.5,0.2-0.5,0.5v2.6l-2.9-0.8c-0.3-0.1-0.5,0.1-0.6,0.3 + C41.5,38.3,41.7,38.5,41.9,38.6z"/> + <path class="st1" d="M9.4,8.4L6.2,7.7c0,0,0,0-0.1,0c0,0,0,0-0.1,0c0,0,0,0,0,0c0,0-0.1,0-0.1,0c0,0-0.1,0-0.1,0c0,0,0,0-0.1,0 + c0,0-0.1,0-0.1,0.1c0,0,0,0,0,0.1c0,0,0,0.1,0,0.1c0,0,0,0,0,0c0,0,0,0,0,0.1c0,0,0,0,0,0.1v3.2c0,0.3,0.2,0.5,0.5,0.5 + s0.5-0.2,0.5-0.5V8.8l2.5,0.6c0,0,0.1,0,0.1,0c0.2,0,0.4-0.2,0.5-0.4C9.8,8.8,9.6,8.5,9.4,8.4z"/> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_outros.svg b/src/img/object_type_icons/object-type_outros.svg new file mode 100644 index 0000000000000000000000000000000000000000..85949020fad02fc7e0744b0f5b51adf77dd726a2 --- /dev/null +++ b/src/img/object_type_icons/object-type_outros.svg @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g id="Camada_6_7_"> + <g> + <g> + <g> + <g> + <path class="st1" d="M16.9,24c0-1.5,1-2.5,2.4-2.5s2.3,1,2.3,2.5c0,1.4-0.9,2.5-2.4,2.5C17.9,26.4,16.9,25.4,16.9,24z"/> + </g> + <g> + <path class="st1" d="M26.6,24c0-1.5,1-2.5,2.4-2.5s2.3,1,2.3,2.5c0,1.4-0.9,2.5-2.4,2.5C27.6,26.4,26.6,25.4,26.6,24z"/> + </g> + <g> + <path class="st1" d="M36.3,24c0-1.5,1-2.5,2.4-2.5s2.3,1,2.3,2.5c0,1.4-0.9,2.5-2.4,2.5C37.3,26.4,36.3,25.4,36.3,24z"/> + </g> + </g> + <g> + <path class="st1" d="M46.8,43.5H15.7c-1.8-0.1-3.1-0.8-4.1-2.2L0.1,24L11.6,6.6c0.9-1.4,2.2-2.1,3.9-2.2h31.3 + c1.4,0,2.5,0.5,3.5,1.4l0,0c1,1,1.5,2.2,1.5,3.6v29.1c0,1.4-0.5,2.6-1.4,3.5C49.4,43,48.2,43.5,46.8,43.5z M1.9,24l11,16.5 + c0.7,1,1.7,1.5,2.9,1.5h31c1,0,1.8-0.3,2.5-1s1-1.5,1-2.5V9.4c0-1-0.3-1.8-1-2.5l0,0c-0.7-0.6-1.5-1-2.5-1H15.5 + c-1.1,0.1-2,0.6-2.7,1.6L1.9,24z"/> + </g> + </g> + </g> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_plano-de-aula.svg b/src/img/object_type_icons/object-type_plano-de-aula.svg new file mode 100644 index 0000000000000000000000000000000000000000..c015b3d4a95589081c61f9b91bfd89448237fe82 --- /dev/null +++ b/src/img/object_type_icons/object-type_plano-de-aula.svg @@ -0,0 +1,2 @@ + +<svg id="svg" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="52" height="47.7" viewBox="0, 0, 400,645.1612903225806"><g id="svgg"><path id="path0" d="M254.902 4.047 C 254.188 4.253,253.330 4.840,252.995 5.351 C 252.453 6.178,251.976 6.307,248.659 6.525 C 244.626 6.790,243.357 7.139,241.200 8.579 C 240.277 9.195,238.915 9.603,237.200 9.778 C 233.485 10.157,231.875 10.656,230.850 11.747 C 230.173 12.467,229.344 12.769,227.476 12.976 C 223.669 13.398,221.751 13.988,220.763 15.039 C 220.200 15.639,219.410 16.000,218.663 16.000 C 215.632 16.000,212.214 16.915,211.204 17.996 C 210.346 18.915,209.742 19.120,207.197 19.358 C 203.299 19.722,201.811 20.219,201.024 21.420 C 200.506 22.211,200.046 22.400,198.645 22.400 C 195.076 22.400,192.686 23.120,191.320 24.607 C 190.115 25.919,189.892 26.000,187.484 26.000 C 184.513 26.000,181.784 26.730,179.997 28.002 C 179.175 28.587,177.808 29.006,176.068 29.206 C 172.970 29.562,171.349 30.126,170.123 31.275 C 169.480 31.877,168.414 32.181,166.123 32.415 C 162.550 32.780,161.145 33.239,159.587 34.550 C 158.752 35.252,157.800 35.534,155.663 35.713 C 152.720 35.960,151.711 36.328,149.941 37.799 C 149.114 38.486,148.179 38.728,145.691 38.899 C 142.301 39.131,141.132 39.554,139.719 41.061 C 139.010 41.817,138.424 42.000,136.719 42.002 C 133.779 42.005,131.794 42.637,130.379 44.021 C 129.305 45.071,128.900 45.200,126.684 45.200 C 123.380 45.200,121.679 45.735,120.347 47.194 C 119.335 48.302,119.031 48.400,116.610 48.400 C 113.600 48.400,111.792 49.036,110.503 50.548 C 109.709 51.479,109.313 51.600,107.075 51.600 C 104.044 51.600,101.072 52.419,99.266 53.751 C 98.374 54.410,97.136 54.820,95.471 55.008 C 92.737 55.318,90.862 55.978,89.361 57.159 C 88.718 57.665,87.424 58.032,85.684 58.201 C 82.193 58.540,80.432 59.085,79.200 60.208 C 78.473 60.870,77.490 61.192,75.600 61.387 C 72.182 61.739,70.421 62.296,69.200 63.408 C 68.475 64.068,67.485 64.394,65.600 64.591 C 61.669 65.003,60.070 65.521,59.353 66.616 C 58.901 67.306,58.343 67.600,57.487 67.600 C 54.432 67.600,51.017 68.511,50.003 69.597 C 49.117 70.546,48.571 70.717,45.608 70.975 C 41.993 71.290,40.282 71.925,39.598 73.204 C 39.273 73.810,38.759 74.000,37.441 74.000 C 34.061 74.000,31.468 74.714,30.400 75.939 C 29.494 76.978,29.079 77.112,26.000 77.358 C 21.545 77.714,20.023 78.151,18.199 79.601 C 17.065 80.502,16.273 80.800,15.016 80.800 C 10.744 80.800,7.608 83.155,6.790 86.977 C 6.481 88.419,6.392 154.291,6.480 316.200 C 6.612 560.097,6.480 545.647,8.595 547.033 C 9.340 547.522,9.612 548.158,9.831 549.930 C 10.065 551.826,10.346 552.422,11.531 553.544 C 12.312 554.284,13.345 555.724,13.826 556.744 C 15.254 559.773,22.480 566.531,25.000 567.193 C 26.100 567.483,27.360 568.041,27.800 568.435 C 29.514 569.968,32.093 570.782,35.262 570.791 C 38.170 570.800,38.409 570.870,40.000 572.200 C 40.922 572.970,41.704 573.612,41.738 573.626 C 41.772 573.641,44.094 573.801,46.899 573.983 C 51.909 574.307,52.018 574.334,53.159 575.556 C 53.798 576.240,54.384 576.810,54.460 576.822 C 54.537 576.835,56.445 576.983,58.699 577.152 C 62.052 577.403,62.962 577.612,63.699 578.303 C 65.134 579.647,66.714 580.080,71.221 580.366 C 74.735 580.588,75.661 580.789,76.750 581.564 C 78.603 582.884,81.297 583.600,84.409 583.600 C 86.771 583.600,87.265 583.739,88.563 584.771 C 90.339 586.182,92.967 586.800,97.189 586.800 C 99.998 586.800,100.472 586.913,101.576 587.841 C 103.289 589.283,105.971 590.000,109.650 590.000 C 112.561 590.000,112.866 590.083,114.163 591.221 C 115.949 592.790,117.273 593.153,122.343 593.469 C 125.954 593.694,126.595 593.844,127.343 594.641 C 128.616 595.998,129.956 596.359,134.827 596.655 C 138.529 596.880,139.301 597.041,139.631 597.657 C 140.384 599.064,142.212 599.597,147.217 599.866 C 151.666 600.105,152.113 600.201,152.659 601.033 C 153.454 602.248,154.922 602.704,159.100 603.037 C 161.922 603.262,162.816 603.496,163.718 604.247 C 165.174 605.460,166.956 605.908,171.600 606.228 C 174.628 606.436,175.684 606.679,176.800 607.422 C 178.905 608.825,179.918 609.103,184.033 609.411 C 187.132 609.642,187.977 609.852,188.800 610.592 C 190.247 611.894,191.900 612.331,196.509 612.632 C 199.997 612.859,200.747 613.033,201.600 613.815 C 202.901 615.006,204.915 615.511,209.692 615.845 C 213.157 616.087,213.651 616.218,214.189 617.039 C 214.992 618.265,216.925 618.759,222.132 619.069 C 225.994 619.298,226.526 619.421,227.038 620.201 C 227.964 621.615,229.529 622.082,234.234 622.349 C 238.509 622.591,238.721 622.647,240.148 623.900 C 241.921 625.458,240.854 625.191,246.899 625.583 C 251.909 625.907,252.018 625.934,253.159 627.156 C 253.798 627.840,254.384 628.410,254.460 628.422 C 254.537 628.435,256.445 628.583,258.699 628.752 C 262.052 629.003,262.962 629.212,263.699 629.903 C 265.134 631.247,266.714 631.680,271.221 631.966 C 274.735 632.188,275.661 632.389,276.750 633.164 C 278.603 634.484,281.297 635.200,284.409 635.200 C 286.774 635.200,287.264 635.339,288.571 636.377 C 290.376 637.812,292.559 638.263,299.175 638.570 C 303.234 638.759,304.302 638.937,304.975 639.541 C 307.639 641.930,313.532 642.096,315.021 639.824 C 315.558 639.004,316.071 638.845,318.920 638.613 C 325.032 638.116,329.931 634.970,332.048 630.184 C 332.480 629.209,333.201 628.214,333.650 627.973 C 335.612 626.923,335.738 625.809,335.977 607.400 L 336.200 590.200 344.395 590.344 C 352.284 590.483,352.621 590.522,353.423 591.387 C 356.107 594.283,376.637 594.293,379.601 591.399 C 380.606 590.418,381.399 590.000,382.257 590.000 C 384.249 590.000,385.982 589.196,386.611 587.979 C 386.933 587.355,387.691 586.608,388.295 586.319 C 388.899 586.029,389.631 585.296,389.922 584.689 C 390.213 584.082,390.914 583.282,391.480 582.911 C 392.657 582.140,393.600 580.163,393.600 578.468 C 393.600 577.786,394.089 576.695,394.790 575.813 C 395.444 574.989,396.119 573.660,396.290 572.858 C 396.699 570.934,396.693 145.040,396.284 143.112 C 396.110 142.293,395.505 141.073,394.939 140.400 C 394.141 139.452,393.834 138.506,393.575 136.201 C 393.211 132.949,392.858 132.062,391.141 130.086 C 390.514 129.363,390.000 128.583,390.000 128.353 C 390.000 127.761,381.732 119.600,381.132 119.600 C 380.860 119.600,380.060 119.040,379.354 118.356 C 378.037 117.079,374.770 116.019,372.109 116.006 C 371.201 116.002,370.636 115.722,370.204 115.062 C 369.068 113.328,367.871 113.090,359.269 112.888 C 351.405 112.704,351.109 112.668,350.269 111.771 C 349.069 110.492,347.552 110.000,344.809 110.000 L 342.470 110.000 342.307 86.100 C 342.131 60.219,342.120 60.096,339.957 58.978 C 339.280 58.628,338.800 58.055,338.800 57.598 C 338.800 56.083,337.514 53.630,336.192 52.621 C 335.456 52.060,334.739 51.238,334.599 50.796 C 334.297 49.844,332.757 48.978,330.672 48.587 C 329.594 48.385,329.010 47.993,328.598 47.196 C 327.975 45.992,326.228 45.200,324.195 45.200 C 323.370 45.200,322.370 44.771,321.401 44.001 C 319.007 42.098,317.560 41.901,307.406 42.090 C 297.873 42.269,296.641 42.466,294.905 44.091 C 294.076 44.868,293.531 44.932,287.505 44.965 L 281.000 45.000 280.800 32.000 C 280.592 18.457,280.469 17.530,278.823 17.007 C 278.301 16.842,277.833 16.032,277.401 14.544 C 277.037 13.292,276.326 11.952,275.767 11.464 C 275.223 10.989,274.088 9.907,273.244 9.060 C 271.665 7.475,268.671 6.421,265.709 6.406 C 264.789 6.402,264.236 6.122,263.783 5.430 C 262.666 3.725,258.346 3.052,254.902 4.047 M259.863 20.700 C 260.617 21.305,261.992 22.462,262.917 23.271 L 264.600 24.742 264.600 36.471 L 264.600 48.200 258.000 48.432 C 251.296 48.667,249.644 48.994,247.449 50.525 C 246.410 51.249,245.377 51.356,236.849 51.623 C 226.417 51.950,225.926 52.027,224.200 53.603 L 223.000 54.700 213.400 54.946 C 203.361 55.203,201.508 55.469,199.200 56.987 C 197.870 57.863,197.329 57.921,188.326 58.154 C 178.514 58.409,177.186 58.621,175.744 60.158 C 174.912 61.045,174.608 61.078,165.344 61.318 C 155.372 61.575,153.650 61.854,152.658 63.368 C 152.072 64.261,151.896 64.280,141.931 64.521 C 131.254 64.779,129.235 65.077,127.578 66.637 C 126.572 67.586,126.446 67.599,119.178 67.564 C 113.882 67.538,112.166 67.422,113.098 67.153 C 113.812 66.947,114.687 66.333,115.044 65.789 C 115.499 65.094,116.056 64.800,116.913 64.800 C 120.049 64.800,123.381 63.891,124.453 62.743 C 125.319 61.816,125.858 61.600,127.306 61.600 C 130.813 61.600,133.324 60.896,134.429 59.604 C 135.258 58.634,135.772 58.400,137.075 58.400 C 140.499 58.400,142.938 57.680,144.091 56.329 C 145.131 55.112,145.358 55.039,148.891 54.782 C 152.879 54.493,154.498 54.017,155.872 52.730 C 156.472 52.168,157.594 51.816,159.472 51.600 C 162.600 51.241,164.245 50.679,165.437 49.563 C 166.040 48.998,167.238 48.669,169.716 48.387 C 173.693 47.935,174.862 47.556,176.486 46.189 C 177.334 45.475,178.136 45.200,179.367 45.200 C 181.721 45.200,184.548 44.283,186.024 43.041 C 187.007 42.214,187.687 42.000,189.331 41.998 C 192.223 41.995,194.213 41.356,195.621 39.979 C 196.644 38.979,197.145 38.800,198.914 38.798 C 201.744 38.795,203.617 38.217,205.407 36.794 C 206.722 35.750,207.231 35.600,209.468 35.600 C 212.404 35.600,214.216 34.954,215.497 33.452 C 216.297 32.515,216.680 32.400,219.010 32.400 C 221.957 32.400,223.999 31.708,224.916 30.398 C 225.451 29.635,226.055 29.471,229.269 29.217 C 233.133 28.912,235.142 28.284,236.718 26.888 C 237.315 26.359,238.506 25.974,240.118 25.788 C 243.024 25.452,244.096 25.093,246.000 23.818 C 246.969 23.169,248.262 22.797,250.200 22.611 C 253.935 22.253,255.789 21.676,256.855 20.541 C 257.975 19.350,258.192 19.361,259.863 20.700 M317.133 59.594 C 317.618 60.251,318.507 60.908,319.108 61.055 C 319.709 61.201,321.412 62.390,322.894 63.697 C 325.570 66.056,325.716 66.310,326.560 70.069 C 326.692 70.657,327.250 71.673,327.800 72.327 L 328.800 73.515 328.800 91.558 L 328.800 109.600 322.054 109.600 C 315.793 109.600,315.231 109.539,314.233 108.755 C 311.930 106.943,310.314 106.769,293.413 106.514 L 277.426 106.273 276.201 104.974 C 274.601 103.277,274.524 103.270,256.432 103.056 C 242.099 102.887,241.437 102.846,240.832 102.087 C 239.393 100.281,238.979 100.234,222.080 99.962 C 206.539 99.711,205.929 99.673,205.080 98.878 C 203.259 97.172,202.407 97.079,185.869 96.787 C 170.631 96.517,169.890 96.469,168.821 95.679 C 166.409 93.896,164.326 93.678,147.627 93.467 C 132.551 93.276,131.826 93.232,131.227 92.480 C 129.794 90.682,129.369 90.634,112.480 90.362 C 96.939 90.111,96.329 90.073,95.480 89.278 C 94.996 88.824,94.060 88.226,93.400 87.949 C 92.309 87.490,92.635 87.419,97.000 87.164 C 102.043 86.869,103.644 86.467,105.059 85.142 C 105.849 84.402,106.598 84.323,114.459 84.152 C 125.749 83.905,126.291 83.827,127.799 82.229 L 129.021 80.933 139.210 80.666 C 149.940 80.386,151.975 80.095,153.600 78.613 C 154.560 77.737,154.958 77.691,163.600 77.460 C 173.253 77.202,174.998 76.927,176.269 75.465 C 177.069 74.544,177.258 74.523,186.642 74.283 C 196.575 74.030,199.255 73.621,201.562 72.005 C 202.466 71.372,203.791 71.249,211.800 71.050 C 221.633 70.806,223.662 70.488,224.608 69.044 C 225.198 68.143,225.374 68.123,234.904 67.869 C 245.037 67.600,246.889 67.333,249.200 65.813 C 250.530 64.938,251.072 64.879,260.000 64.649 C 270.069 64.389,272.067 64.081,273.008 62.643 C 273.599 61.742,273.771 61.722,283.170 61.483 C 293.296 61.225,295.084 60.911,295.982 59.234 C 296.416 58.423,296.703 58.400,306.339 58.400 L 316.250 58.400 317.133 59.594 M27.167 101.112 C 28.192 102.399,29.387 102.807,33.153 103.154 C 35.848 103.403,37.020 103.703,37.985 104.389 C 39.843 105.713,42.532 106.400,45.850 106.400 C 48.546 106.400,48.866 106.491,49.979 107.579 C 51.485 109.052,53.196 109.545,57.932 109.869 C 61.219 110.094,61.734 110.233,62.258 111.032 C 63.056 112.250,64.528 112.706,68.700 113.029 C 71.132 113.217,72.444 113.509,73.000 113.989 C 74.406 115.200,77.030 115.958,80.806 116.243 C 83.912 116.478,84.613 116.663,85.340 117.438 C 86.616 118.799,87.953 119.159,92.827 119.455 C 96.615 119.685,97.296 119.832,97.651 120.495 C 98.280 121.671,100.278 122.317,104.222 122.622 C 106.844 122.825,108.015 123.095,108.605 123.630 C 110.031 124.925,112.234 125.572,116.154 125.848 C 119.555 126.087,120.052 126.220,120.589 127.039 C 121.378 128.244,123.260 128.729,128.393 129.050 C 132.387 129.300,132.651 129.371,133.600 130.469 C 134.647 131.681,137.390 132.393,141.030 132.398 C 142.223 132.399,142.898 132.653,143.545 133.341 C 144.738 134.611,146.628 135.108,151.517 135.439 C 154.933 135.669,155.702 135.842,156.029 136.454 C 156.780 137.858,158.816 138.502,163.530 138.825 C 167.562 139.102,168.151 139.237,168.693 140.011 C 169.615 141.328,171.664 142.000,174.756 142.000 C 177.132 142.000,177.710 142.144,178.714 142.989 C 180.489 144.482,181.796 144.846,186.546 145.168 C 190.244 145.418,190.990 145.585,191.546 146.284 C 192.613 147.625,193.819 148.025,197.825 148.363 C 200.919 148.624,201.799 148.847,202.564 149.566 C 203.895 150.817,206.848 151.600,210.233 151.600 C 212.740 151.600,213.300 151.736,214.314 152.589 C 216.119 154.108,217.437 154.476,222.141 154.773 C 225.862 155.008,226.575 155.166,227.141 155.877 C 228.193 157.200,229.362 157.604,233.153 157.954 C 235.848 158.203,237.020 158.503,237.985 159.189 C 239.842 160.512,242.531 161.200,245.843 161.200 C 248.530 161.200,248.848 161.291,249.880 162.351 C 251.371 163.884,252.962 164.354,257.698 164.665 C 261.227 164.896,261.728 165.024,262.258 165.832 C 263.056 167.050,264.528 167.506,268.700 167.829 C 271.132 168.017,272.444 168.309,273.000 168.789 C 274.418 170.011,277.159 170.806,280.865 171.069 C 283.926 171.286,284.617 171.467,285.342 172.240 C 286.601 173.583,287.907 173.943,292.622 174.248 C 296.415 174.493,296.923 174.616,297.450 175.420 C 298.128 176.455,299.447 177.036,302.000 177.426 C 303.097 177.593,304.289 178.128,305.053 178.797 C 305.742 179.400,307.002 180.019,307.853 180.172 C 308.738 180.331,309.914 180.949,310.600 181.615 C 311.260 182.256,312.906 183.843,314.258 185.143 C 315.610 186.442,316.832 187.871,316.974 188.317 C 317.115 188.763,317.658 189.408,318.180 189.750 C 318.993 190.283,319.170 190.820,319.414 193.486 C 319.724 196.869,320.364 198.538,321.604 199.202 C 322.397 199.627,322.400 200.396,322.400 406.292 L 322.400 612.956 321.394 614.006 C 320.724 614.706,320.199 615.962,319.819 617.775 C 319.169 620.885,318.261 622.075,316.030 622.744 C 315.182 622.998,314.194 623.654,313.835 624.203 C 312.930 625.583,306.322 625.749,305.605 624.409 C 304.873 623.042,303.545 622.669,298.434 622.393 C 294.244 622.166,293.368 622.005,292.829 621.362 C 291.430 619.695,290.718 619.436,286.861 619.192 C 283.556 618.982,282.776 618.792,281.445 617.874 C 279.462 616.506,277.848 616.082,273.392 615.758 C 270.746 615.565,269.588 615.304,268.995 614.767 C 267.577 613.484,265.412 612.844,261.558 612.569 C 258.425 612.345,257.634 612.148,256.800 611.385 C 255.486 610.182,253.465 609.684,248.600 609.363 C 245.141 609.135,244.461 608.969,243.570 608.142 C 242.184 606.854,240.535 606.422,235.858 606.125 C 232.451 605.908,231.799 605.750,231.058 604.960 C 229.771 603.587,228.399 603.226,223.381 602.940 C 219.203 602.701,218.761 602.600,218.210 601.759 C 217.411 600.540,215.459 600.027,210.469 599.726 C 206.759 599.501,206.276 599.383,205.742 598.568 C 204.882 597.256,203.259 596.829,198.035 596.541 C 193.562 596.294,193.365 596.245,192.400 595.130 C 191.332 593.896,188.600 593.207,184.754 593.202 C 183.508 593.201,182.573 592.936,181.877 592.389 C 180.081 590.976,178.315 590.484,174.000 590.192 C 170.368 589.947,169.664 589.782,168.794 588.970 C 167.264 587.541,164.664 586.800,161.180 586.800 C 158.404 586.800,157.925 586.686,156.824 585.759 C 155.088 584.298,152.419 583.600,148.567 583.600 C 145.635 583.600,145.129 583.488,144.086 582.611 C 142.281 581.092,140.963 580.724,136.259 580.427 C 132.538 580.192,131.825 580.034,131.259 579.323 C 130.115 577.884,128.789 577.504,123.940 577.228 C 119.955 577.001,119.080 576.830,118.311 576.130 C 116.667 574.632,115.500 574.292,110.914 573.978 C 106.543 573.678,106.343 573.623,105.231 572.433 C 104.597 571.755,104.016 571.186,103.940 571.170 C 103.863 571.153,101.492 571.002,98.671 570.834 C 93.784 570.543,93.493 570.477,92.531 569.439 C 91.151 567.951,90.032 567.600,86.668 567.600 C 84.506 567.600,83.440 567.399,82.394 566.793 C 79.378 565.045,78.110 564.682,74.106 564.419 C 70.700 564.196,69.858 564.006,69.100 563.294 C 67.608 561.893,65.534 561.253,61.558 560.969 C 58.425 560.745,57.634 560.548,56.800 559.785 C 55.486 558.582,53.465 558.084,48.600 557.763 C 45.141 557.535,44.461 557.369,43.570 556.542 C 42.373 555.430,41.075 555.003,37.688 554.610 C 35.726 554.382,35.120 554.137,34.614 553.365 C 34.268 552.837,33.313 552.124,32.492 551.781 C 30.799 551.074,28.800 549.311,28.800 548.525 C 28.800 548.236,28.107 547.324,27.261 546.500 C 26.414 545.675,25.499 544.320,25.226 543.490 C 24.954 542.659,24.252 541.410,23.666 540.713 L 22.600 539.447 22.496 320.223 C 22.438 199.651,22.486 100.752,22.603 100.449 C 22.926 99.607,26.366 100.107,27.167 101.112 M133.994 107.933 C 135.615 109.554,135.587 109.551,152.800 109.841 C 168.099 110.099,168.207 110.107,169.200 111.013 C 170.975 112.632,172.707 112.803,190.133 113.072 L 206.867 113.330 207.460 114.235 C 208.542 115.887,209.888 116.031,226.543 116.285 C 242.483 116.528,242.486 116.528,243.343 117.441 C 244.931 119.134,245.940 119.242,262.393 119.476 C 278.144 119.699,278.204 119.703,279.200 120.613 C 280.968 122.227,282.740 122.413,298.600 122.656 C 313.610 122.887,313.818 122.901,315.200 123.812 C 317.691 125.452,319.227 125.605,335.933 125.872 L 352.067 126.130 352.666 127.045 C 353.488 128.299,355.043 128.700,360.320 129.018 C 364.449 129.267,364.893 129.370,365.447 130.215 C 366.087 131.192,367.897 132.000,369.444 132.000 C 370.256 132.000,371.703 133.114,374.284 135.724 C 374.678 136.122,375.585 137.035,376.300 137.752 C 377.015 138.470,377.601 139.224,377.602 139.428 C 377.610 140.704,378.623 143.045,379.532 143.888 L 380.600 144.877 380.695 356.339 C 380.778 541.201,380.717 567.926,380.206 568.800 C 379.884 569.350,379.203 570.629,378.693 571.642 C 378.182 572.655,376.872 574.340,375.782 575.387 L 373.800 577.290 362.400 577.039 C 351.923 576.808,350.951 576.727,350.400 576.041 C 349.179 574.520,347.937 574.232,341.900 574.071 L 336.000 573.913 336.000 391.370 C 336.000 212.615,336.016 208.820,336.758 208.423 C 338.961 207.244,338.989 200.548,336.801 198.200 C 336.192 197.546,336.008 196.487,335.795 192.400 C 335.523 187.201,334.813 184.039,333.713 183.131 C 333.360 182.839,332.670 181.696,332.181 180.592 C 331.692 179.488,330.865 178.356,330.345 178.077 C 329.824 177.799,329.064 176.765,328.657 175.780 C 327.838 173.800,325.656 171.764,323.952 171.389 C 323.270 171.240,322.541 170.627,322.045 169.786 C 321.592 169.018,320.792 168.313,320.207 168.166 C 319.638 168.023,318.911 167.402,318.593 166.786 C 318.009 165.656,316.819 165.105,313.905 164.616 C 312.988 164.463,312.241 164.050,311.973 163.549 C 311.356 162.396,309.462 161.711,305.993 161.386 C 303.612 161.162,302.786 160.905,301.954 160.130 C 300.495 158.769,297.614 158.000,293.974 158.000 C 291.019 158.000,290.798 157.935,289.200 156.600 C 288.278 155.830,287.496 155.191,287.462 155.181 C 287.428 155.170,285.647 155.020,283.505 154.847 C 280.719 154.622,279.393 154.337,278.850 153.845 C 277.404 152.537,274.140 151.600,271.026 151.600 C 268.501 151.600,267.894 151.461,266.931 150.659 C 264.916 148.984,263.890 148.678,259.323 148.395 C 254.953 148.125,254.798 148.082,253.655 146.858 C 253.008 146.166,252.416 145.590,252.340 145.578 C 252.263 145.565,250.360 145.417,248.110 145.249 C 245.114 145.025,243.816 144.757,243.255 144.250 C 241.794 142.928,238.545 142.000,235.377 142.000 C 232.730 142.000,232.254 141.885,231.481 141.061 C 229.990 139.471,228.896 139.144,223.920 138.794 C 219.647 138.495,219.048 138.361,218.505 137.586 C 217.581 136.266,215.531 135.600,212.394 135.600 C 209.864 135.600,209.460 135.490,208.606 134.568 C 207.346 133.210,204.753 132.469,200.111 132.143 C 196.872 131.915,196.192 131.742,195.459 130.961 C 194.193 129.611,192.889 129.256,188.109 128.957 C 184.006 128.700,183.752 128.632,182.800 127.531 C 181.753 126.319,179.010 125.607,175.370 125.602 C 174.168 125.601,173.502 125.348,172.837 124.639 C 171.705 123.435,169.395 122.844,164.580 122.528 C 161.229 122.308,160.747 122.178,160.208 121.356 C 159.490 120.260,157.685 119.717,153.600 119.366 C 151.436 119.180,150.210 118.849,149.200 118.177 C 147.094 116.775,146.081 116.496,141.967 116.189 C 138.868 115.958,138.023 115.748,137.200 115.008 C 135.762 113.715,134.111 113.272,129.562 112.958 C 125.981 112.712,125.476 112.582,124.944 111.771 C 124.146 110.552,122.681 110.096,118.500 109.763 C 115.678 109.538,114.784 109.304,113.882 108.553 C 113.267 108.040,112.097 107.450,111.282 107.241 C 110.467 107.032,109.440 106.763,109.000 106.643 C 108.560 106.524,113.741 106.502,120.514 106.596 L 132.828 106.766 133.994 107.933 M47.728 461.845 C 44.169 463.601,44.144 472.019,47.694 473.695 C 48.504 474.078,49.358 474.749,49.593 475.186 C 50.320 476.546,51.623 476.919,56.693 477.221 C 61.506 477.507,61.619 477.536,62.759 478.756 C 63.398 479.440,63.984 480.008,64.060 480.017 C 64.137 480.027,66.055 480.189,68.323 480.376 C 71.109 480.607,72.671 480.921,73.138 481.344 C 74.534 482.607,77.053 483.315,81.094 483.581 C 84.500 483.804,85.342 483.994,86.100 484.706 C 87.592 486.107,89.666 486.747,93.642 487.031 C 96.775 487.255,97.566 487.452,98.400 488.215 C 99.690 489.396,101.699 489.903,106.400 490.233 C 109.575 490.456,110.365 490.650,111.200 491.413 C 112.517 492.615,114.581 493.140,119.200 493.448 C 122.407 493.662,123.156 493.845,124.000 494.625 C 125.508 496.019,126.800 496.362,131.651 496.656 C 135.560 496.894,136.185 497.033,136.942 497.840 C 138.217 499.199,139.555 499.559,144.440 499.855 C 148.443 500.099,148.919 500.210,149.458 501.032 C 150.320 502.348,152.026 502.803,157.132 503.080 C 161.261 503.304,161.717 503.407,162.258 504.233 C 163.056 505.450,164.529 505.906,168.700 506.229 C 171.132 506.417,172.444 506.709,173.000 507.189 C 174.448 508.436,177.049 509.153,181.159 509.436 C 184.617 509.674,185.370 509.854,186.305 510.666 C 187.806 511.969,190.819 512.800,194.042 512.800 C 196.360 512.800,196.912 512.945,197.970 513.837 C 199.620 515.225,202.702 515.989,206.669 515.995 C 209.559 515.999,210.075 516.115,211.114 516.989 C 212.893 518.486,214.221 518.868,218.694 519.172 C 222.022 519.398,222.958 519.604,223.694 520.275 C 225.350 521.784,226.503 522.101,231.311 522.375 C 235.473 522.612,236.165 522.752,236.740 523.476 C 237.867 524.894,239.116 525.257,244.048 525.603 C 248.676 525.928,248.856 525.976,249.971 527.169 C 250.604 527.846,251.184 528.412,251.260 528.426 C 251.337 528.441,253.694 528.601,256.499 528.783 C 261.509 529.107,261.618 529.134,262.759 530.356 C 263.398 531.040,263.984 531.608,264.060 531.617 C 264.137 531.627,266.004 531.785,268.209 531.967 C 271.495 532.240,272.485 532.482,273.704 533.309 C 275.870 534.779,278.718 535.334,282.952 535.113 C 289.172 534.787,290.203 533.662,290.196 527.200 C 290.190 521.101,289.026 519.851,282.769 519.220 C 280.564 518.998,279.312 518.649,278.409 518.006 C 276.559 516.689,273.866 516.000,270.567 516.000 C 268.021 516.000,267.508 515.871,266.424 514.959 C 264.688 513.498,262.019 512.800,258.167 512.800 C 255.235 512.800,254.729 512.688,253.686 511.811 C 251.912 510.318,250.604 509.954,245.871 509.633 C 241.848 509.361,241.480 509.265,240.671 508.283 C 239.451 506.802,238.220 506.452,233.149 506.144 C 229.240 505.906,228.615 505.767,227.858 504.960 C 226.583 503.601,225.245 503.241,220.360 502.945 C 216.357 502.701,215.881 502.590,215.342 501.768 C 214.486 500.461,212.782 500.002,207.800 499.735 C 203.603 499.510,203.341 499.444,202.124 498.295 C 200.954 497.190,200.483 497.051,196.440 496.621 C 193.428 496.301,191.800 495.943,191.301 495.491 C 189.947 494.266,187.791 493.662,183.786 493.387 C 180.518 493.163,179.541 492.940,178.365 492.148 C 176.474 490.874,175.182 490.535,170.939 490.195 C 168.040 489.964,167.219 489.746,166.400 488.991 C 165.112 487.804,163.109 487.298,158.400 486.967 C 155.220 486.744,154.437 486.551,153.600 485.785 C 152.297 484.592,150.284 484.088,145.469 483.752 C 142.030 483.512,141.466 483.368,140.964 482.600 C 140.029 481.174,138.472 480.724,133.460 480.431 C 129.332 480.189,128.634 480.046,128.060 479.324 C 126.925 477.896,125.640 477.525,120.760 477.213 C 116.133 476.918,115.998 476.882,114.852 475.655 C 114.207 474.965,113.616 474.388,113.540 474.374 C 113.463 474.359,111.098 474.198,108.285 474.016 C 103.542 473.709,103.103 473.612,102.235 472.675 C 101.077 471.427,98.941 470.805,95.794 470.802 C 94.110 470.801,92.969 470.557,91.994 469.993 C 88.988 468.251,87.706 467.882,83.773 467.624 C 80.470 467.407,79.513 467.192,78.444 466.432 C 76.560 465.090,73.885 464.400,70.567 464.400 C 68.021 464.400,67.508 464.271,66.424 463.359 C 63.843 461.187,51.147 460.159,47.728 461.845 M49.600 483.844 C 46.100 484.519,45.197 485.885,45.206 490.487 C 45.213 493.967,45.726 495.135,47.716 496.200 C 48.539 496.640,49.484 497.398,49.818 497.884 C 50.622 499.058,52.546 499.552,57.532 499.866 C 61.235 500.098,61.726 500.220,62.258 501.033 C 63.130 502.364,64.845 502.811,70.119 503.082 C 74.136 503.288,74.897 503.433,75.231 504.058 C 75.898 505.304,77.710 505.936,81.429 506.217 C 84.202 506.427,85.313 506.696,86.400 507.421 C 88.546 508.853,89.615 509.137,94.004 509.439 C 96.329 509.599,98.273 509.930,98.556 510.213 C 100.018 511.675,102.683 512.534,106.468 512.765 C 109.772 512.966,110.480 513.135,111.320 513.925 C 112.738 515.257,115.641 516.000,119.433 516.000 C 122.365 516.000,122.871 516.112,123.914 516.989 C 125.689 518.482,126.996 518.846,131.746 519.168 C 135.444 519.418,136.190 519.585,136.746 520.284 C 137.885 521.716,139.217 522.096,144.060 522.372 C 148.045 522.599,148.920 522.770,149.689 523.470 C 151.333 524.968,152.500 525.308,157.086 525.622 C 161.457 525.922,161.657 525.977,162.769 527.167 C 163.403 527.845,163.984 528.412,164.060 528.426 C 164.137 528.441,166.511 528.602,169.335 528.785 C 174.107 529.093,174.547 529.191,175.565 530.166 C 176.933 531.477,178.711 532.000,181.804 532.000 C 183.493 532.000,184.629 532.241,185.606 532.807 C 188.612 534.549,189.894 534.918,193.827 535.176 C 197.130 535.393,198.087 535.608,199.156 536.368 C 201.044 537.713,203.717 538.400,207.060 538.400 C 209.793 538.400,210.065 538.479,211.028 539.560 C 212.282 540.968,214.156 541.482,219.366 541.849 C 222.394 542.061,223.438 542.289,223.962 542.852 C 225.053 544.023,227.711 544.743,232.037 545.041 C 235.531 545.282,236.195 545.444,236.939 546.237 C 238.230 547.613,239.599 547.974,244.619 548.260 C 248.797 548.499,249.239 548.600,249.790 549.441 C 250.580 550.647,252.500 551.149,257.532 551.466 C 261.235 551.698,261.726 551.820,262.258 552.633 C 263.130 553.964,264.845 554.411,270.119 554.682 C 274.136 554.888,274.897 555.033,275.231 555.658 C 276.009 557.111,277.920 557.690,281.968 557.699 C 288.881 557.713,290.200 556.448,290.200 549.800 C 290.200 543.524,289.171 542.347,283.193 541.786 C 280.883 541.569,279.972 541.296,279.200 540.587 C 277.911 539.404,275.904 538.897,271.200 538.567 C 267.939 538.338,267.252 538.163,266.356 537.329 C 264.990 536.058,261.708 535.211,258.131 535.205 C 255.710 535.201,255.085 535.053,254.131 534.259 C 252.066 532.542,251.079 532.260,246.265 532.012 C 242.104 531.798,241.450 531.667,240.865 530.931 C 239.729 529.501,238.431 529.116,233.781 528.831 C 229.468 528.568,229.224 528.504,227.828 527.278 C 226.083 525.746,227.145 526.008,221.101 525.617 C 216.091 525.293,215.982 525.266,214.841 524.044 C 214.202 523.360,213.616 522.792,213.540 522.783 C 213.463 522.773,211.541 522.611,209.269 522.423 C 205.973 522.150,204.962 521.916,204.269 521.267 C 202.867 519.954,201.260 519.518,196.779 519.234 C 193.265 519.012,192.339 518.811,191.250 518.036 C 189.397 516.716,186.703 516.000,183.591 516.000 C 181.229 516.000,180.735 515.861,179.437 514.829 C 177.661 513.418,175.033 512.800,170.811 512.800 C 168.002 512.800,167.528 512.687,166.424 511.759 C 164.706 510.313,162.027 509.600,158.314 509.600 C 155.311 509.600,155.101 509.541,154.053 508.394 C 152.647 506.855,151.231 506.465,145.866 506.139 C 142.040 505.906,141.413 505.764,140.658 504.960 C 139.384 503.602,138.045 503.241,133.173 502.945 C 129.385 502.715,128.704 502.568,128.349 501.905 C 127.659 500.616,125.388 499.981,120.542 499.721 C 116.337 499.496,115.884 499.395,115.342 498.567 C 114.546 497.352,113.078 496.896,108.900 496.563 C 106.078 496.338,105.184 496.104,104.282 495.353 C 102.826 494.140,101.044 493.692,96.400 493.372 C 93.372 493.164,92.316 492.921,91.200 492.178 C 89.095 490.775,88.082 490.497,83.967 490.189 C 80.829 489.955,80.033 489.754,79.200 488.988 C 77.911 487.804,75.906 487.297,71.200 486.967 C 68.025 486.744,67.235 486.550,66.400 485.787 C 64.692 484.228,54.015 482.993,49.600 483.844 M49.400 506.242 C 46.002 507.104,45.200 508.356,45.200 512.800 C 45.200 516.542,45.898 518.172,47.764 518.788 C 48.557 519.050,49.390 519.608,49.615 520.028 C 50.400 521.495,52.391 522.123,57.086 522.384 C 60.857 522.594,61.717 522.766,62.486 523.467 C 64.134 524.969,65.297 525.307,69.887 525.622 C 74.174 525.917,74.494 526.000,75.823 527.167 C 77.511 528.649,76.498 528.399,82.314 528.767 C 86.888 529.056,87.306 529.152,88.345 530.147 C 89.733 531.477,91.500 532.000,94.604 532.000 C 96.293 532.000,97.429 532.241,98.406 532.807 C 101.431 534.560,102.689 534.914,106.919 535.202 C 110.571 535.451,111.383 535.632,112.171 536.373 C 113.502 537.623,116.458 538.400,119.883 538.400 C 122.520 538.400,122.938 538.507,123.763 539.398 C 125.103 540.843,127.445 541.527,132.098 541.831 C 135.557 542.057,136.357 542.239,137.200 542.995 C 138.658 544.301,140.351 544.746,145.021 545.048 C 148.772 545.290,149.244 545.408,149.788 546.239 C 150.591 547.463,152.524 547.959,157.694 548.266 C 161.587 548.498,162.044 548.607,162.590 549.441 C 163.392 550.665,165.327 551.159,170.519 551.468 C 174.137 551.683,174.902 551.843,175.231 552.458 C 175.983 553.863,177.813 554.397,182.805 554.665 C 186.921 554.886,187.697 555.034,188.031 555.658 C 188.698 556.904,190.510 557.536,194.229 557.817 C 197.048 558.030,198.102 558.290,199.235 559.053 C 201.174 560.358,202.556 560.705,207.118 561.034 C 210.349 561.267,211.188 561.471,212.118 562.247 C 213.529 563.423,215.312 563.899,219.600 564.244 C 222.521 564.479,223.179 564.673,224.268 565.619 C 225.792 566.942,228.557 567.600,232.589 567.600 C 235.143 567.600,235.696 567.733,236.714 568.589 C 238.486 570.080,239.796 570.446,244.498 570.765 C 248.015 571.003,248.959 571.205,249.698 571.878 C 251.359 573.392,252.574 573.738,257.086 573.987 C 260.859 574.194,261.716 574.366,262.486 575.067 C 264.134 576.569,265.297 576.907,269.887 577.222 C 274.149 577.515,274.500 577.605,275.792 578.740 C 277.392 580.144,279.632 580.603,283.408 580.300 C 288.864 579.862,290.543 577.686,290.276 571.400 C 290.048 566.025,288.976 564.922,283.512 564.443 C 280.938 564.218,280.239 563.998,279.312 563.121 C 277.912 561.797,276.022 561.298,271.108 560.955 C 267.643 560.713,267.149 560.582,266.611 559.761 C 265.809 558.537,263.876 558.041,258.706 557.734 C 254.813 557.502,254.356 557.393,253.810 556.559 C 253.015 555.346,251.109 554.861,245.881 554.541 C 242.266 554.320,241.499 554.158,241.169 553.543 C 240.417 552.137,238.588 551.603,233.595 551.335 C 229.385 551.108,228.708 550.976,228.348 550.304 C 227.721 549.132,225.726 548.484,221.778 548.169 C 218.878 547.939,217.988 547.708,217.082 546.953 C 215.632 545.745,213.860 545.296,209.200 544.958 C 206.056 544.730,205.207 544.522,204.282 543.752 C 202.854 542.564,201.083 542.107,196.600 541.772 C 193.670 541.553,192.814 541.336,192.000 540.606 C 190.551 539.306,188.897 538.869,184.291 538.568 C 180.716 538.335,180.068 538.179,179.156 537.329 C 177.791 536.059,174.508 535.211,170.931 535.205 C 168.510 535.201,167.885 535.053,166.931 534.259 C 164.900 532.570,163.861 532.264,159.314 532.013 C 155.541 531.806,154.684 531.634,153.914 530.933 C 152.242 529.409,151.036 529.062,146.550 528.815 C 142.264 528.579,142.046 528.523,140.636 527.285 C 138.879 525.743,139.899 526.001,134.125 525.635 C 129.419 525.337,129.200 525.283,127.811 524.063 C 127.020 523.368,126.333 522.792,126.286 522.783 C 126.239 522.773,124.341 522.611,122.069 522.423 C 118.773 522.150,117.762 521.916,117.069 521.267 C 115.677 519.963,114.080 519.530,109.481 519.207 C 105.837 518.951,105.016 518.766,104.229 518.027 C 102.907 516.786,99.947 516.000,96.591 516.000 C 94.008 516.000,93.558 515.879,92.237 514.829 C 90.489 513.440,87.839 512.800,83.835 512.800 C 81.203 512.800,80.762 512.683,79.437 511.629 C 77.679 510.232,75.037 509.600,70.958 509.600 C 68.128 509.600,67.891 509.530,66.853 508.394 C 66.247 507.730,65.132 506.996,64.376 506.763 C 62.929 506.316,50.774 505.893,49.400 506.242 " stroke="none" fill="currentColor" fill-rule="evenodd"></path></g></svg> \ No newline at end of file diff --git a/src/img/object_type_icons/object-type_software-educacional.svg b/src/img/object_type_icons/object-type_software-educacional.svg new file mode 100644 index 0000000000000000000000000000000000000000..1ad8125b78cc70a19aacbe0a8e32f145b2e1e635 --- /dev/null +++ b/src/img/object_type_icons/object-type_software-educacional.svg @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 60 60" style="enable-background:new 0 0 60 60;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD5;} +</style> +<rect class="st0" d="M0,0h60v60H0V0z"/> +<g> + <path class="st1" d="M48.7,10.6H11.3c-2.6,0-4.7,2.1-4.7,4.7v24.9c0,2.6,2.1,4.7,4.7,4.7h18.4v2.6h-8c-0.6,0-1,0.4-1,1s0.4,1,1,1 + h16.6c0.6,0,1-0.4,1-1s-0.4-1-1-1h-8v-2.6h18.4c2.6,0,4.7-2.1,4.7-4.7V15.3C53.4,12.7,51.3,10.6,48.7,10.6z M52.4,40.2 + c0,2-1.6,3.7-3.7,3.7H11.3c-2,0-3.7-1.6-3.7-3.7V15.3c0-2,1.6-3.7,3.7-3.7h37.4c2,0,3.7,1.6,3.7,3.7V40.2z"/> + <path class="st1" d="M46.4,14.8H13.6c-1.6,0-2.8,1.3-2.8,2.9v20.2c0,1.6,1.3,2.9,2.8,2.9h32.7c1.6,0,2.9-1.3,2.9-2.9V17.6 + C49.2,16,47.9,14.8,46.4,14.8z M48.2,37.8c0,1-0.8,1.9-1.9,1.9H13.6c-1,0-1.8-0.8-1.8-1.9V17.6c0-1,0.8-1.9,1.8-1.9h32.7 + c1,0,1.9,0.8,1.9,1.9V37.8z"/> + <path class="st1" d="M34.4,21.4c-0.2-0.2-0.5-0.2-0.7,0l-1.4,1.4c-0.2,0.2-0.2,0.5,0,0.7l4.2,4.2L32.2,32c-0.2,0.2-0.2,0.5,0,0.7 + l1.4,1.4c0.1,0.1,0.2,0.1,0.4,0.1s0.3,0,0.4-0.1l6-6c0.2-0.2,0.2-0.5,0-0.7L34.4,21.4z M34,33l-0.7-0.7l4.2-4.2 + c0.2-0.2,0.2-0.5,0-0.7l-4.2-4.2l0.7-0.7l5.3,5.3L34,33z"/> + <path class="st1" d="M27.9,23.1c0-0.1-0.1-0.3-0.1-0.4l-1.4-1.4c-0.2-0.2-0.5-0.2-0.7,0l-6,6c-0.2,0.2-0.2,0.5,0,0.7l6,6 + c0.1,0.1,0.2,0.1,0.4,0.1s0.3,0,0.4-0.1l1.4-1.4c0.1-0.1,0.1-0.2,0.1-0.4s-0.1-0.3-0.1-0.4l-4.2-4.2l4.2-4.2 + C27.8,23.4,27.9,23.3,27.9,23.1z M22.4,27.4c-0.1,0.1-0.1,0.2-0.1,0.4s0.1,0.3,0.1,0.4l4.2,4.2L26,33l-5.3-5.3l5.3-5.3l0.7,0.7 + L22.4,27.4z"/> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_texto.svg b/src/img/object_type_icons/object-type_texto.svg new file mode 100644 index 0000000000000000000000000000000000000000..13a99e1f67ba0484d5a463b6259a173d9930ce93 --- /dev/null +++ b/src/img/object_type_icons/object-type_texto.svg @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <rect x="15.6" y="32.1" class="st1" width="21.3" height="1"/> + <rect x="15.6" y="25.9" class="st1" width="21.3" height="1"/> + <rect x="15.6" y="19.7" class="st1" width="21.3" height="1"/> + <rect x="15.6" y="13.5" class="st1" width="9.8" height="1"/> + <path class="st1" d="M41.8,12.2L31.2,1.7c-0.1-0.1-0.3-0.2-0.5-0.2h-16c-2.6,0-4.7,2.1-4.7,4.7v35.5c0,2.6,2.1,4.7,4.7,4.7h22.7 + c2.6,0,4.7-2.1,4.7-4.7V12.8C42,12.6,41.9,12.4,41.8,12.2z M40.5,13.1v0.2h-7c-1.9,0-3.4-1.5-3.4-3.4V3h0.3L40.5,13.1z M37.3,44.9 + H14.7c-1.7,0-3.2-1.4-3.2-3.2V6.2c0-1.7,1.4-3.2,3.2-3.2h14.5v6.9c0,2.4,2,4.4,4.4,4.4h7v27.4C40.5,43.5,39.1,44.9,37.3,44.9z"/> +</g> +</svg> diff --git a/src/img/object_type_icons/object-type_video.svg b/src/img/object_type_icons/object-type_video.svg new file mode 100644 index 0000000000000000000000000000000000000000..1879fd2889832593b8c4d571676eef7ab3613676 --- /dev/null +++ b/src/img/object_type_icons/object-type_video.svg @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M34,19.4l-13.7-7.8c-0.2-0.1-0.5-0.1-0.7,0c-0.2,0.1-0.4,0.4-0.4,0.6v15.6c0,0.3,0.1,0.5,0.4,0.6 + c0.1,0.1,0.2,0.1,0.4,0.1c0.1,0,0.3,0,0.4-0.1L34,20.7c0.2-0.1,0.4-0.4,0.4-0.7S34.3,19.5,34,19.4z M20.7,26.5v-13L32.2,20 + L20.7,26.5z"/> + <path class="st1" d="M42.1,40.5c-1.2,0-2.2,0.9-2.5,2H0.4v1h39.3c0.2,1.2,1.3,2,2.5,2s2.2-0.9,2.5-2h7v-1h-7 + C44.4,41.3,43.4,40.5,42.1,40.5z M42.1,44.5c-0.8,0-1.5-0.7-1.5-1.5s0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5S43,44.5,42.1,44.5z"/> + <path class="st1" d="M46.1,2.4H5.9C2.7,2.4,0.1,5,0.1,8.1v23.8c0,3.2,2.6,5.8,5.8,5.8h40.3c3.2,0,5.8-2.6,5.8-5.8V8.1 + C51.9,5,49.3,2.4,46.1,2.4z M50.4,31.9c0,2.3-1.9,4.3-4.3,4.3H5.9c-2.3,0-4.3-1.9-4.3-4.3V8.1c0-2.3,1.9-4.3,4.3-4.3h40.3 + c2.3,0,4.3,1.9,4.3,4.3V31.9z"/> + <path class="st1" d="M3.5,9.2v0.5h1V9.2c0-1.4,1.1-2.5,2.5-2.5h0.5v-1H7C5.1,5.7,3.5,7.3,3.5,9.2z"/> + <path class="st1" d="M47.5,30.8c0,1.4-1.1,2.5-2.5,2.5h-0.5v1H45c1.9,0,3.5-1.6,3.5-3.5v-0.5h-1V30.8z"/> +</g> +</svg> diff --git a/src/img/sobre/Alunos.png b/src/img/sobre/Alunos.png new file mode 100644 index 0000000000000000000000000000000000000000..d9cc74ac056abd4caba2c7993b9f33cf80752081 Binary files /dev/null and b/src/img/sobre/Alunos.png differ diff --git a/src/img/sobre/Gestores.png b/src/img/sobre/Gestores.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f928d813ae2ae3a26175f0bd85ab3080ff0f20 Binary files /dev/null and b/src/img/sobre/Gestores.png differ diff --git a/src/img/sobre/Imagem_Notebook.png b/src/img/sobre/Imagem_Notebook.png new file mode 100644 index 0000000000000000000000000000000000000000..c81ae5dcb49cbf094683bbccb9b93ef6b49e9bab Binary files /dev/null and b/src/img/sobre/Imagem_Notebook.png differ diff --git a/src/img/sobre/agpl.svg b/src/img/sobre/agpl.svg new file mode 100644 index 0000000000000000000000000000000000000000..51d7c5add46d8b62434ea8eb2be889901413e48d --- /dev/null +++ b/src/img/sobre/agpl.svg @@ -0,0 +1,269 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="580" + height="240" + id="svg1341" + sodipodi:version="0.32" + inkscape:version="0.91 r13725" + sodipodi:docname="agpl.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + version="1.0"> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="0.71481481" + inkscape:cx="140.51211" + inkscape:cy="-29.176071" + inkscape:document-units="px" + inkscape:current-layer="layer1" + inkscape:window-width="1920" + inkscape:window-height="1027" + inkscape:window-x="0" + inkscape:window-y="0" + showguides="true" + inkscape:guide-bbox="true" + width="18in" + height="12in" + units="px" + showborder="true" + showgrid="false" + inkscape:window-maximized="1"> + <sodipodi:guide + orientation="horizontal" + position="1885.3861" + id="guide2344" /> + <sodipodi:guide + orientation="horizontal" + position="2033.8652" + id="guide2346" /> + <sodipodi:guide + orientation="vertical" + position="-820.12302" + id="guide3321" /> + <sodipodi:guide + orientation="vertical" + position="-118.58401" + id="guide3323" /> + <sodipodi:guide + orientation="horizontal" + position="965.80899" + id="guide5223" /> + <sodipodi:guide + orientation="horizontal" + position="830.01431" + id="guide5235" /> + </sodipodi:namedview> + <defs + id="defs1343" /> + <metadata + id="metadata1346"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + id="layer1" + inkscape:groupmode="layer" + transform="translate(0,-839.99996)"> + <g + id="g2694" + transform="matrix(1.7332024,0,0,1.7332024,-58.651483,-335.25677)"> + <path + d="m 225.50908,761.79412 c 0,0 -0.007,0 -0.007,0 -0.61733,0 -1.1624,0.20365 -1.67471,0.61745 -0.38093,0.30204 -0.6437,0.70934 -0.85386,1.16252 0,0 0.0263,0 0.0263,0 0.21015,-0.45318 0.47293,-0.86048 0.84723,-1.16252 0.51231,-0.4138 1.05738,-0.61082 1.6617,-0.61745 z" + id="path3550" + style="fill:#bd0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter" + inkscape:connector-curvature="0" /> + <path + d="m 225.52872,761.79412 c -0.007,0 -0.0131,0 -0.0196,0 0.63708,0.007 1.05739,0.2234 1.3398,0.68971 0.12477,0.19702 0.1904,0.49256 0.1904,0.86686 0,0.0658 -0.0131,0.15114 -0.0196,0.2234 0,0 0.0262,0 0.0262,0 0,-0.0723 0.0131,-0.15764 0.0131,-0.2234 0,-0.3743 -0.0591,-0.66984 -0.1839,-0.86686 -0.28241,-0.47293 -0.70933,-0.68971 -1.34641,-0.68971 z" + id="path3554" + style="fill:#bd0000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter" + inkscape:connector-curvature="0" /> + <g + transform="matrix(0.385154,0,0,0.385154,330.53849,1073.2023)" + id="g3556" + style="fill:#663366;fill-opacity:1"> + <g + transform="matrix(1.705222,0,0,1.705222,-769.6823,-728.9956)" + id="g3558" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="m 0,36 c 0,0 7.46,0 7.46,0 0,0 3.35,-14 3.35,-14 0,0 12.12,0 12.12,0 0,0 1.56,-6 1.56,-6 0,0 -12.17,0 -12.17,0 0,0 2.02,-9 2.02,-9 0,0 12.95,0 12.95,0 0,0 1.56,-7 1.56,-7 C 28.85,0 8.4,0 8.4,0 8.4,0 0,36 0,36 Z" + id="path3560" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-725.4318,-711.9434)" + id="g3562" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="m 7.51,26 c 0,0 2.24,-9.4 2.24,-9.4 1.18,-5.09 3.67,-9.6 8.38,-9.6 0.42,0 0.83,0.21 1.14,0.26 0,0 1.82,-7.21 1.82,-7.21 -0.42,0 -0.88,-0.05 -1.4,-0.05 -3.47,0 -6.38,2.44 -8.32,5.94 0,0 -0.2,0 -0.2,0 C 11.46,4.23 11.71,2.61 11.9,1 11.9,1 5.47,1 5.47,1 5.1,3.08 4.53,7.15 3.66,10.82 3.66,10.82 0,26 0,26 c 0,0 7.51,0 7.51,0 z" + id="path3564" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-690.253,-711.9434)" + id="g3566" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="M 20.06,19.25 C 17.99,20.26 15.63,20 12.88,20 10.71,20 9.03,19.62 8.11,18.88 7.63,18.07 7.43,16.81 7.47,16 17.6,16.27 23.99,13.93 24.31,7.53 24.55,2.7 21.02,0 15.89,0 6.73,0 0.73,8.08 0.34,15.86 0,22.65 3.52,26 10.78,26 c 2.79,0 6.49,-0.32 9.52,-1.23 0,0 -0.24,-5.52 -0.24,-5.52 z M 17.32,7.53 C 17.2,9.91 14.26,10.05 8.47,10 9.1,7.91 11.22,6 14.69,6 c 1.71,0 2.69,0.65 2.63,1.53 z" + id="path3568" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-645.0305,-711.9434)" + id="g3570" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="M 20.05,19.25 C 17.98,20.26 15.62,20 12.88,20 10.7,20 9.03,19.62 8.11,18.88 7.63,18.07 7.42,16.81 7.46,16 17.6,16.27 23.98,13.93 24.31,7.53 24.55,2.7 21.02,0 15.89,0 6.72,0 0.72,8.08 0.33,15.86 0,22.65 3.52,26 10.77,26 c 2.8,0 6.5,-0.32 9.53,-1.23 0,0 -0.25,-5.52 -0.25,-5.52 z M 17.32,7.53 C 17.2,9.91 14.26,10.05 8.46,10 9.1,7.91 11.21,6 14.68,6 c 1.71,0 2.7,0.65 2.64,1.53 z" + id="path3572" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-583.796,-711.9434)" + id="g3574" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="M 22.74,26 C 22.8,22.83 23.56,17.85 24.35,14.58 24.35,14.58 27.56,1 27.56,1 25.52,0.31 22.34,0 19.28,0 6.86,0 0.7,9.2 0.27,17.82 0,23.23 2.93,26 7.49,26 c 2.95,0 6.28,-1.43 8.87,-5.73 0,0 0.11,0 0.11,0 -0.2,2.07 -0.44,4.08 -0.57,5.73 0,0 6.84,0 6.84,0 z M 17.61,11.72 C 16.15,18.08 13.17,20 10.95,20 8.88,20 7.98,18.53 8.1,16.39 8.34,11.56 12.16,6 16.98,6 c 0.78,0 1.39,-0.14 1.96,-0.28 0,0 -1.33,6 -1.33,6 z" + id="path3576" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-536.6807,-711.9434)" + id="g3578" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="m 0,24.82 c 1.44,1.12 4.46,1.13 7.61,1.18 6.73,0.05 11.81,-2.89 12.11,-8.29 0.17,-3.6 -2.62,-5.73 -5.35,-7.16 C 12.4,9.6 11.41,8.69 11.46,7.63 11.53,6.2 12.87,6 14.84,6 c 2.22,0 4,0.27 5.02,0.47 0,0 2.02,-5.42 2.02,-5.42 C 20.73,0.36 18.43,0 15.48,0 8.95,0 4.17,3.45 3.9,8.69 c -0.16,3.24 2.17,5.42 4.99,6.9 2.28,1.17 3.06,2.07 3,3.34 C 11.82,20.21 10.68,20 8.61,20 6.18,20 3.49,19.68 2.07,19.46 2.07,19.46 0,24.82 0,24.82 Z" + id="path3580" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-481.3463,-730.7008)" + id="g3582" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="m 7.45,37 c 0,0 6.05,-25 6.05,-25 0,0 -7.41,0 -7.41,0 0,0 -6.09,25 -6.09,25 0,0 7.45,0 7.45,0 z M 10.92,9 C 13.46,9 15.72,6.9 15.86,3.3 15.98,0.86 14.4,0 12.07,0 9.64,0 7.42,1.58 7.29,3.94 7.17,6.32 8.75,9 10.92,9 Z" + id="path3584" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-456.9787,-710.7668)" + id="g3586" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="m 7.46,25.31 c 0,0 2.64,-11.26 2.64,-11.26 1.37,-5.73 4.32,-7.74 6.75,-7.74 1.92,0 2.48,0.82 2.39,2.01 -0.05,0.96 -0.2,1.97 -0.4,2.87 0,0 -3.36,14.12 -3.36,14.12 0,0 7.46,0 7.46,0 0,0 3.54,-14.81 3.54,-14.81 C 26.75,9.22 27.05,7.31 27.11,6.15 27.33,1.64 25.08,0 20.94,0 c -3.32,0 -6.55,1.54 -9.1,4.88 0,0 -0.1,0 -0.1,0 0,0 0.68,-4.57 0.68,-4.57 0,0 -6.58,0 -6.58,0 C 5.41,2.45 4.86,5.04 4.08,8.06 4.08,8.06 0,25.31 0,25.31 c 0,0 7.46,0 7.46,0 z" + id="path3588" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-389.5201,-728.9956)" + id="g3590" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="m 0,36 c 0,0 7.46,0 7.46,0 0,0 3.36,-14 3.36,-14 0,0 12.11,0 12.11,0 0,0 1.56,-6 1.56,-6 0,0 -12.17,0 -12.17,0 0,0 2.02,-9 2.02,-9 0,0 12.95,0 12.95,0 0,0 1.56,-7 1.56,-7 C 28.85,0 8.4,0 8.4,0 8.4,0 0,36 0,36 Z" + id="path3592" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-345.2696,-711.9434)" + id="g3594" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="m 7.51,26 c 0,0 2.24,-9.4 2.24,-9.4 1.18,-5.09 3.67,-9.6 8.38,-9.6 0.42,0 0.83,0.21 1.14,0.26 0,0 1.82,-7.21 1.82,-7.21 -0.42,0 -0.88,-0.05 -1.4,-0.05 -3.47,0 -6.38,2.44 -8.32,5.94 0,0 -0.2,0 -0.2,0 C 11.46,4.23 11.71,2.61 11.9,1 11.9,1 5.47,1 5.47,1 5.11,3.08 4.53,7.15 3.66,10.82 3.66,10.82 0,26 0,26 c 0,0 7.51,0 7.51,0 z" + id="path3596" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-310.0908,-711.9434)" + id="g3598" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="M 20.06,19.25 C 17.99,20.26 15.63,20 12.88,20 10.71,20 9.03,19.62 8.11,18.88 7.63,18.07 7.43,16.81 7.47,16 17.6,16.27 23.99,13.93 24.31,7.53 24.55,2.7 21.02,0 15.89,0 6.73,0 0.73,8.08 0.34,15.86 0,22.65 3.53,26 10.78,26 c 2.79,0 6.5,-0.32 9.52,-1.23 0,0 -0.24,-5.52 -0.24,-5.52 z M 17.32,7.53 C 17.2,9.91 14.26,10.05 8.47,10 9.1,7.91 11.22,6 14.69,6 c 1.71,0 2.69,0.65 2.63,1.53 z" + id="path3600" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-264.8684,-711.9434)" + id="g3602" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="M 20.05,19.25 C 17.98,20.26 15.62,20 12.88,20 10.7,20 9.03,19.62 8.11,18.88 7.63,18.07 7.42,16.81 7.46,16 17.6,16.27 23.98,13.93 24.31,7.53 24.55,2.7 21.02,0 15.89,0 6.72,0 0.72,8.08 0.33,15.86 0,22.65 3.52,26 10.77,26 c 2.8,0 6.5,-0.32 9.53,-1.23 0,0 -0.25,-5.52 -0.25,-5.52 z M 17.32,7.53 C 17.2,9.91 14.26,10.05 8.46,10 9.1,7.91 11.21,6 14.68,6 c 1.71,0 2.7,0.65 2.64,1.53 z" + id="path3604" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-219.8846,-730.7008)" + id="g3606" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="M 23.31,0 C 23.31,0 20.5,11.36 20.5,11.36 19.48,10.94 18.15,11 17.11,11 7.53,11 0.75,19.2 0.3,28.08 0,34.34 3.34,37 7.64,37 c 3.01,0 6.18,-1.33 8.58,-4.77 0,0 0.1,0 0.1,0 0,0 -0.57,4.77 -0.57,4.77 0,0 6.78,0 6.78,0 0.31,-3 0.96,-6.57 1.69,-9.83 0,0 6.49,-27.17 6.49,-27.17 0,0 -7.4,0 -7.4,0 z M 17.47,24.42 C 16.3,29.35 13.54,31 11.36,31 9.19,31 7.98,29.49 8.13,26.8 8.38,21.82 11.8,17 16.25,17 c 1.25,0 2.32,0.19 2.91,0.47 0,0 -1.69,6.95 -1.69,6.95 z" + id="path3608" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-169.2225,-711.9434)" + id="g3610" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="M 10.61,26 C 19.31,26 26.02,19.41 26.49,10.44 26.78,4.5 23.08,0 16.25,0 7.23,0 0.76,7.3 0.31,16.12 0,22.54 4.14,26 10.61,26 Z m 1.17,-6 C 9.24,20 7.84,18.38 7.99,15.96 8.19,11.93 10.68,6 14.97,6 c 2.96,0 3.87,2.27 3.75,4.5 -0.22,4.4 -2.9,9.5 -6.94,9.5 z" + id="path3612" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + <g + transform="matrix(1.705222,0,0,1.705222,-120.5213,-711.9434)" + id="g3614" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter"> + <path + d="M 7.2,26 C 7.2,26 9.9,14.58 9.9,14.58 11.03,9.49 13.85,6 16.38,6 c 1.82,0 2.32,1.33 2.23,3.07 -0.05,0.9 -0.25,1.91 -0.46,2.91 0,0 -3.34,14.02 -3.34,14.02 0,0 7.2,0 7.2,0 0,0 2.7,-11.47 2.7,-11.47 C 25.95,9.28 28.61,6 31.09,6 c 1.71,0 2.42,1.22 2.34,2.96 -0.05,1.01 -0.26,2.12 -0.52,3.13 0,0 -3.24,13.91 -3.24,13.91 0,0 7.25,0 7.25,0 0,0 3.49,-14.81 3.49,-14.81 0.27,-1.33 0.58,-3.4 0.63,-4.46 C 41.26,2.33 39.11,0 35.23,0 31.91,0 28.68,1.5 26.23,4.66 26.14,2.38 24.51,0 20.47,0 17.2,0 14.08,1.48 11.58,4.83 c 0,0 -0.1,0 -0.1,0 0,0 0.67,-3.83 0.67,-3.83 0,0 -6.42,0 -6.42,0 C 5.31,3.14 4.8,5.73 4.02,8.75 4.02,8.75 0,26 0,26 c 0,0 7.2,0 7.2,0 z" + id="path3616" + style="fill:#663366;fill-opacity:1" + inkscape:connector-curvature="0" /> + </g> + </g> + <path + id="path3618" + sodipodi:nodetypes="cccccssccccscccsccc" + d="m 242.27371,772.00406 c 0.26666,0.68537 0.5332,1.3697 0.81093,2.03897 0.42773,0.90933 0.922,1.77974 1.51639,2.59227 3.21051,4.36413 8.58716,6.75366 15.41353,7.34862 0,0 7.34302,0 7.34302,0 2.32173,-0.18116 4.75464,-0.51882 7.27636,-1.01207 4.34906,-0.85043 8.95929,-2.15678 13.74726,-3.90261 3.62705,-1.32245 7.3541,-2.88712 11.13662,-4.70567 8.23729,-3.94873 16.74671,-9.04148 25.09506,-15.18751 2.74946,-2.02242 5.38772,-4.09758 7.92063,-6.20767 2.32173,-1.93179 4.54905,-3.89371 6.67649,-5.8772 5.93759,-5.72219 10.42009,-11.53376 12.95848,-16.63667 2.64386,-5.31398 3.17158,-9.85744 1.00533,-12.71967 -1.32747,-1.7569 -3.54931,-2.69843 -6.40983,-2.91999 12.88633,-9.6692 20.3959,-21.3985 17.70204,-28.79369 -0.85545,-2.36008 -2.73838,-4.12086 -5.43784,-5.09458 -1.19973,-0.43149 -2.54946,-0.70488 -4.02144,-0.82931 0,0 -3.96585,0 -3.96585,0 -5.53772,0.39942 -13.59076,2.38234 -20.42273,5.73052" + style="fill:#ffffff;fill-opacity:0;fill-rule:evenodd;stroke:#663266;stroke-width:3.28386545;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1" + inkscape:connector-curvature="0" /> + <path + d="m 62.777261,682.66638 c 0,0 -22.84339,99.66531 -22.84339,99.66531 0.0066,0 60.091419,0 60.104559,0 26.42484,0 105.67884,0 105.67884,0 1.2e-4,0 54.96371,0 54.96371,0 -6.54796,-0.57145 -11.71765,-2.87011 -14.79791,-7.06027 -0.57133,-0.77509 -1.04346,-1.60999 -1.45715,-2.48348 -0.26277,-0.64359 -0.5098,-1.293 -0.75945,-1.94971 -0.65682,-2.08863 -0.91869,-4.40613 -0.80043,-6.87568 0.32842,-6.883 3.5581,-15.07028 9.15381,-23.64386 5.94375,-9.11134 14.55819,-18.66102 25.22417,-27.52283 2.39067,-1.98475 4.86262,-3.94473 7.45021,-5.84947 3.19852,-2.35311 6.4217,-4.52039 9.64637,-6.54715 11.881,-7.48001 23.73254,-12.71397 34.23437,-15.37255 -10.03552,3.27397 -21.3098,8.83212 -32.4487,16.39877 -0.40067,0.27054 -0.79632,0.5477 -1.19049,0.82098 -6.18016,4.28216 -11.77917,8.82996 -16.66554,13.42273 -15.72323,14.78398 -24.0338,30.10322 -20.25732,39.07804 0.26928,0.61733 0.59027,1.20681 0.96458,1.76513 4.05888,5.97 14.11814,7.00193 26.86612,3.7969 0.86698,-0.21666 1.73396,-0.4622 2.62708,-0.71835 4.07201,-1.17554 8.39527,-2.76338 12.8482,-4.72051 1.07052,-0.47293 2.15256,-0.95887 3.24282,-1.4778 0.11164,-0.0525 0.21666,-0.10502 0.3283,-0.16415 14.05501,-6.98345 24.85648,-15.01891 27.19453,-19.84684 0.51232,-1.05019 0.63548,-1.94559 0.28732,-2.64763 -1.66821,-3.38242 -13.34145,-1.09733 -27.48185,5.02838 -1.13615,0.49267 -2.28554,0.99951 -3.44806,1.53933 0.94574,-0.87805 1.93019,-1.75953 2.93495,-2.62708 1.60257,-1.38055 3.26176,-2.73051 5.02848,-4.0638 2.76498,-2.09376 5.56032,-3.98662 8.31229,-5.66465 12.88587,-9.72159 19.40027,-18.91764 18.04072,-22.33031 -0.25615,-0.64301 -0.80122,-1.08524 -1.64195,-1.35464 -2.68621,-0.85442 -7.58902,0.16541 -13.5459,2.60665 -4.91274,2.01501 -10.55524,5.00338 -16.27572,8.72277 0,0 -0.77988,0.51312 -0.77988,0.51312 0,0 -0.14372,0.0821 -0.14372,0.0821 0,0 -2.75013,1.82665 -2.75013,1.82665 0,0 1.58031,-2.89385 1.58031,-2.89385 2.34467,-4.2921 6.16384,-8.77026 10.91882,-12.93028 3.48744,-3.04157 7.47167,-5.90734 11.76034,-8.41491 1.6222,-0.94974 3.24201,-1.83178 4.86422,-2.62708 1.6617,-0.81184 3.32409,-1.53328 4.9463,-2.17561 4.71308,-1.86387 9.89054,-4.21767 13.81404,-4.52565 -0.3573,0 -11.69996,1.22131 -11.69996,1.22131 0,0 -37.14877,0 -37.14877,0 0,0 -163.80326,0 -163.80326,0 0,0 -73.075879,0 -73.075879,0 z m 177.933719,0.14371 c -0.64359,9.82331 1.26103,24.21153 5.58258,40.18623 0.76846,2.84249 1.60497,5.73531 2.52446,8.66124 0.57144,1.80679 1.16092,3.58527 1.76512,5.33624 -0.35467,0.52145 -0.71173,1.03969 -1.04677,1.55988 -5.39206,8.26343 -8.54378,16.07287 -9.3385,22.86386 -2.27904,-7.63171 -3.99473,-15.99091 -4.96685,-24.85477 -0.27579,-2.53965 -0.49165,-5.05098 -0.63616,-7.53229 -1.06401,-18.02383 1.28888,-34.36245 6.11612,-46.22039 z m -107.60809,12.78645 c 0.12294,-0.003 0.24417,0 0.3694,0 0,0 24.28013,0 24.28013,0 2.07539,0 3.68036,0.38903 4.82313,1.16994 1.13615,0.78548 1.56228,1.80154 1.29299,3.03757 0,0 -2.89385,13.07388 -2.89385,13.07388 0,0 -8.55862,0 -8.55862,0 0,0 2.81178,-12.72492 2.81178,-12.72492 0,0 -21.42715,0 -21.42715,0 0,0 -7.73764,34.97305 -7.73764,34.97305 0,0 -2.79135,12.6635 -2.79135,12.6635 0,0 21.40671,0 21.40671,0 0,0 0.0206,-0.0821 0.0206,-0.0821 0,0 4.28958,-19.37493 4.28958,-19.37493 0,0 -10.05685,0 -10.05685,0 0,0 0.96469,-4.37155 0.96469,-4.37155 0,-1.1e-4 18.61537,0 18.61537,0 0,-1.1e-4 -5.33624,24.1774 -5.33624,24.1774 -0.0723,0.34417 -0.19874,0.65592 -0.36951,0.9647 -0.44006,0.80122 -1.20761,1.4875 -2.27812,2.05244 -1.48431,0.78148 -3.26085,1.16982 -5.33636,1.16982 0,0 -24.25947,0 -24.25947,0 -2.07539,0 -3.68036,-0.38834 -4.82324,-1.16982 -1.13615,-0.7816 -1.56884,-1.77974 -1.29299,-3.01714 0,0 10.69314,-48.33436 10.69314,-48.33436 0.27579,-1.23603 1.13615,-2.25209 2.62696,-3.03757 0.0526,-0.0283 0.11176,-0.0347 0.16427,-0.0615 1.3608,-0.6816 2.95778,-1.0648 4.80269,-1.10841 z m 38.05183,0 c -1.2e-4,0 30.5604,0 30.5604,0 2.04913,0 3.65981,0.38903 4.8027,1.16994 1.14927,0.78548 1.58933,1.80154 1.31354,3.03757 0,0 -5.70575,25.77837 -5.70575,25.77837 -0.26928,1.22816 -1.15019,2.23018 -2.64763,3.01703 -1.49744,0.78947 -3.26005,1.19037 -5.31581,1.19037 0,0 -22.20714,0 -22.20714,0 0,0 -4.28947,19.35427 -4.28947,19.35427 0,0 -0.69781,3.18128 -0.69781,3.18128 0,0 -8.37392,0 -8.37392,0 0,0 0.63628,-2.87342 0.63628,-2.87342 0,0 11.92461,-53.85541 11.92461,-53.85541 z m 42.21812,0 c 0,0 8.37381,0 8.37381,0 0,0 -9.48211,42.83397 -9.48211,42.83397 0,0 -2.07299,9.35905 -2.07299,9.35905 0,0 20.03165,0 20.03165,0 0.21015,1.53614 0.45557,3.045 0.71835,4.53581 0,0 -30.12948,0 -30.12948,0 0,0 2.38074,-10.75466 2.38074,-10.75466 0,0 10.18003,-45.97417 10.18003,-45.97417 z m -34.84999,4.55647 c 0,0 -5.56214,25.08045 -5.56214,25.08045 0,0 20.87316,0 20.87316,0 0,0 5.54149,-25.08045 5.54149,-25.08045 0,0 -20.85251,0 -20.85251,0 z m -44.50903,59.19428 c 0.082,-0.003 0.16381,0 0.24634,0 0.972,0 1.82094,0.17065 2.50391,0.49256 0.72909,0.34154 1.25042,0.84883 1.53934,1.51879 0.28241,0.6502 0.35626,1.38819 0.20524,2.19604 0,0 -0.0615,0.30787 -0.0615,0.30787 0,0 -2.40129,0 -2.40129,0 -1.1e-4,0 0.0204,-0.28732 0.0204,-0.28732 0.0621,-0.56448 -0.008,-1.0083 -0.22567,-1.31354 -0.0284,-0.0382 -0.0696,-0.0888 -0.10274,-0.12317 -0.0541,-0.0554 -0.1355,-0.11849 -0.20513,-0.16415 -0.33606,-0.21175 -0.86161,-0.32841 -1.53933,-0.32841 -0.89986,0 -1.57221,0.15673 -2.0319,0.47201 -0.44667,0.30867 -0.72908,0.65352 -0.82098,1.06732 -0.092,0.4203 0.059,0.64119 0.16415,0.75933 0.003,0.003 0.0166,0.0169 0.0205,0.0205 0.1331,0.11335 0.59519,0.37933 2.0319,0.71836 1.30041,0.31528 2.16157,0.59849 2.64763,0.84152 0.73559,0.3743 1.2495,0.85956 1.51878,1.45714 0.26929,0.5912 0.32842,1.28318 0.16415,2.0319 -0.16415,0.72909 -0.53605,1.40144 -1.08775,2.0319 -0.54507,0.63046 -1.23877,1.12964 -2.07299,1.4778 -0.82748,0.34154 -1.73544,0.53355 -2.66806,0.53355 -1.18227,0 -2.13132,-0.17888 -2.87342,-0.53355 -0.77498,-0.36779 -1.33409,-0.94825 -1.66239,-1.70359 -0.31529,-0.73548 -0.38263,-1.5705 -0.20536,-2.48337 0,0 0.0616,-0.28732 0.0616,-0.28732 0,0 2.36031,0 2.36031,0 0,0 -0.0205,0.28732 -0.0205,0.28732 -0.0591,0.54507 -8e-4,0.98513 0.1436,1.31354 0.13801,0.31529 0.40067,0.57635 0.82098,0.77988 0.44667,0.21678 1.00487,0.32842 1.64195,0.32842 0.57144,0 1.09357,-0.096 1.55988,-0.26677 0.45969,-0.16427 0.82509,-0.38093 1.08775,-0.65683 0.25616,-0.27579 0.40638,-0.56733 0.47202,-0.88251 0.0657,-0.28241 0.0501,-0.52133 -0.0615,-0.71835 -0.12477,-0.21015 -0.37191,-0.39656 -0.75945,-0.55409 0,-1.2e-4 -2.01135,-0.5953 -2.01135,-0.5953 -1.12302,-0.28241 -1.87916,-0.5517 -2.31921,-0.82098 -0.5977,-0.35456 -1.02862,-0.80945 -1.25202,-1.35452 -0.22328,-0.53857 -0.24702,-1.13547 -0.10251,-1.78567 0.15103,-0.69621 0.48675,-1.35863 1.00568,-1.94971 0.52544,-0.5977 1.2035,-1.06652 2.01135,-1.37518 0.71424,-0.2678 1.46582,-0.42488 2.25757,-0.45147 z m 21.55043,0.041 c 0.1299,-0.01 0.25205,0 0.38994,0 0,0 1.47769,0.16415 1.47769,0.16415 0,0 0.49257,0.0411 0.49257,0.0411 1.1e-4,0 -0.71825,1.82665 -0.71825,1.82665 0,0 -0.14371,0.28732 -0.14371,0.28732 0,0 -1.12885,-0.10262 -1.12885,-0.10262 -0.33332,0 -0.57817,0.0515 -0.7389,0.16427 -0.0106,0.008 -0.0312,0.0324 -0.041,0.041 -0.0216,0.0189 -0.0578,0.0518 -0.0821,0.0822 -0.0989,0.12957 -0.21917,0.36118 -0.30787,0.77989 0,0 -0.0427,0.17727 -0.0821,0.32841 0.51881,0 1.76501,0 1.76501,0 0,0 -0.45147,2.0319 -0.45147,2.0319 0,0 -1.2906,0 -1.72403,0 -0.13139,0.59107 -1.74458,7.8196 -1.74458,7.8196 0,0 -2.38086,0 -2.38086,0 0,0 1.54755,-6.94612 1.74458,-7.8196 -0.40067,0 -1.37507,0 -1.37507,0 0,0 0.45147,-2.0319 0.45147,-2.0319 0,0 0.98022,0 1.35464,0 0.0656,-0.28241 0.16414,-0.63628 0.16414,-0.63628 0.14452,-0.65683 0.29554,-1.12884 0.49257,-1.45726 0.2694,-0.45318 0.64941,-0.83239 1.12884,-1.10829 0.39497,-0.22945 0.89438,-0.36666 1.45726,-0.41049 z m 5.6852,0.10262 c 0,0 -0.62235,2.80036 -0.77988,3.5097 0.45969,0 1.53922,0 1.53922,0 0,0 -0.45147,2.0319 -0.45147,2.0319 0,0 -1.13216,0 -1.53934,0 -0.12476,0.5647 -1.10829,4.9463 -1.10829,4.9463 0,0 -0.0821,0.52623 -0.0821,0.67726 1.2e-4,0.005 -4.5e-4,0.0168 0,0.0205 3.4e-4,0.002 -4.5e-4,0.0192 0,0.0205 5.7e-4,10e-4 0.0196,-8e-4 0.0204,0 0,0 0.24633,0.0204 0.24633,0.0204 0,0 1.12885,-0.0821 1.12885,-0.0821 0,0 -0.12317,1.82665 -0.12317,1.82665 0,0 0.0205,0.32841 0.0205,0.32841 0,0 -1.62141,0.1847 -1.62141,0.1847 -0.64359,0 -1.11572,-0.10502 -1.45726,-0.32841 -0.36117,-0.23641 -0.57133,-0.54998 -0.65671,-0.94404 -0.0131,-0.0723 -0.0411,-0.17739 -0.0411,-0.32841 0,-0.29554 0.0558,-0.79552 0.24634,-1.6625 0,0 0.86276,-3.86506 1.04666,-4.67941 -0.30867,0 -1.12873,0 -1.12873,0 0,0 0.45147,-2.0319 0.45147,-2.0319 0,0 0.80043,0 1.12884,0 0.10513,-0.47293 0.47202,-2.09354 0.47202,-2.09354 0,0 1.90884,-1.00567 1.90884,-1.00567 0,0 0.77988,-0.41049 0.77988,-0.41049 z m -75.631539,0.0821 c 0,0 9.23587,0 9.23587,0 0,0 -0.5131,2.29879 -0.5131,2.29879 0,0 -6.16135,0 -6.75245,0 -0.10506,0.46631 -0.52622,2.35449 -0.67728,3.03757 0.85381,0 5.84937,0 5.84937,0 0,0 -0.51311,2.29867 -0.51311,2.29867 0,0 -5.25827,0 -5.84937,0 -0.12479,0.57144 -1.25198,5.6441 -1.25198,5.6441 0,0 -2.48343,0 -2.48343,0 0,0 2.95548,-13.27913 2.95548,-13.27913 z m 12.37608,3.24293 c 0.09266,-0.0114 0.19392,0 0.28731,0 0.5911,0 1.13707,0.17979 1.66248,0.5541 0,0 0.328389,0.22579 0.328389,0.22579 0,0 -1.272509,2.09342 -1.272509,2.09342 0,0 -0.34892,-0.24634 -0.34892,-0.24634 -0.25612,-0.16415 -0.53196,-0.24622 -0.82095,-0.24622 -0.24958,0 -0.4819,0.0887 -0.71834,0.24622 -0.24958,0.16427 -0.45811,0.38184 -0.61571,0.67738 -0.27585,0.50569 -0.47783,1.07211 -0.61575,1.68293 0,0 -1.10832,5.04892 -1.10832,5.04892 0,0 -2.38079,0 -2.38079,0 0,0 2.19611,-9.8515 2.19611,-9.8515 0,0 2.2166,0 2.2166,0 0,0 -0.07638,0.29874 -0.10264,0.41038 0.10511,-0.0788 0.21591,-0.1871 0.30789,-0.24623 0.3181,-0.18983 0.65411,-0.30832 0.98515,-0.34885 z m 7.060299,0 c 0.14335,-0.0109 0.28446,0 0.43102,0 1.3398,0 2.35368,0.46951 3.01703,1.39562 0.41377,0.59758 0.63628,1.33649 0.63628,2.21659 0,0.48595 -0.0599,1.00899 -0.18472,1.58032 0,0 -0.18472,0.71835 -0.18472,0.71835 0,0 -6.02097,0 -6.6909,0 -0.0131,0.1379 -0.0205,0.28572 -0.0205,0.41049 0,0.51231 0.10511,0.91538 0.32838,1.21092 0.10612,0.14451 0.22914,0.27465 0.36944,0.36939 0.26454,0.1726 0.60601,0.26689 1.00572,0.26689 0.48599,0 0.9129,-0.1339 1.31353,-0.38994 0.38091,-0.24303 0.74543,-0.63137 1.06726,-1.16994 0,0 2.54499,0 2.54499,0 0,0 -0.22574,0.49256 -0.22574,0.49256 -0.48603,0.98524 -1.16417,1.7536 -2.01139,2.29879 -0.84722,0.54507 -1.85948,0.84141 -2.97601,0.84141 -1.45145,0 -2.53185,-0.46951 -3.20175,-1.39562 -0.663349,-0.90636 -0.806199,-2.15917 -0.451559,-3.73538 0.354699,-1.60257 1.062339,-2.88324 2.093469,-3.77647 0.92422,-0.80135 1.97295,-1.24585 3.14021,-1.33398 z m 10.69313,0 c 0.14326,-0.0109 0.28446,0 0.43092,0 1.33991,0 2.3538,0.46951 3.01714,1.39562 0.41379,0.59758 0.63616,1.33649 0.63616,2.21659 0,0.47944 -0.0599,0.99495 -0.1847,1.55977 0,0 -0.18469,0.7389 -0.18469,0.7389 0,0 -6.02097,0 -6.69087,0 -0.007,0.092 -0.014,0.17488 -0.0205,0.26677 -0.005,0.0345 0.002,0.0869 0,0.12317 -1.9e-4,0.006 0,0.0148 0,0.0205 0,0.0985 0.0139,0.19543 0.0205,0.28732 0.0328,0.37442 0.13054,0.68719 0.30786,0.9236 0.0338,0.046 0.0655,0.10274 0.1026,0.14372 0.30081,0.32179 0.72656,0.49256 1.27251,0.49256 0.48602,0 0.91945,-0.1339 1.3135,-0.38994 0.38104,-0.24303 0.74552,-0.63137 1.06732,-1.16994 0,0 2.56544,0 2.56544,0 0,0 -0.24623,0.49256 -0.24623,0.49256 -0.48606,0.98524 -1.16412,1.7536 -2.01135,2.29879 -0.84723,0.54507 -1.85953,0.84141 -2.976,0.84141 -1.45149,0 -2.53189,-0.46951 -3.20178,-1.39562 -0.43346,-0.59108 -0.63624,-1.34391 -0.63624,-2.23714 0,-0.1379 0.007,-0.28652 0.0205,-0.43104 0.0263,-0.34142 0.0788,-0.68628 0.16419,-1.0672 0.35465,-1.59595 1.0418,-2.88324 2.07293,-3.77647 0.92419,-0.80135 1.99344,-1.24585 3.16076,-1.33398 z m 29.12369,0 c 0.14669,-0.0113 0.28161,0 0.43104,0 1.36616,0 2.41613,0.46209 3.0991,1.37507 0.67657,0.91287 0.84072,2.14434 0.49267,3.69429 -0.26928,1.20852 -0.65842,2.18463 -1.19048,2.89397 -0.53195,0.70933 -1.21001,1.28888 -2.01135,1.68293 -0.79461,0.39405 -1.63614,0.59519 -2.48337,0.59519 -1.39242,0 -2.42925,-0.47613 -3.09921,-1.39562 -0.43343,-0.58457 -0.65671,-1.33728 -0.65671,-2.23714 0,-0.48594 0.0533,-1.00236 0.18469,-1.58031 0.39405,-1.76022 1.19859,-3.10081 2.38075,-3.96117 0.86778,-0.62647 1.82619,-0.98833 2.85287,-1.06721 z m 36.06102,0 c 0.17317,-0.0107 0.33344,0 0.51311,0 0.82749,0 1.47769,0.0837 1.97026,0.28732 0.52544,0.21016 0.89814,0.50729 1.10829,0.86196 0.20365,0.33492 0.30787,0.74632 0.30787,1.25201 0,0 -0.24622,1.49824 -0.24622,1.49824 0,0 -0.45159,2.0319 -0.45159,2.0319 -0.38754,1.73385 -0.47281,2.38405 -0.49256,2.62708 -0.0197,0.32841 0.0106,0.6485 0.10262,0.94415 0,0 0.16415,0.53354 0.16415,0.53354 0,0 -2.42184,0 -2.42184,0 0,0 -0.10262,-0.30786 -0.10262,-0.30786 -0.0394,-0.14441 -0.0279,-0.3283 -0.041,-0.49257 -0.4598,0.28241 -0.92029,0.53286 -1.33409,0.67726 -0.61082,0.21027 -1.24459,0.32842 -1.88829,0.32842 -1.1164,0 -1.9432,-0.29063 -2.44239,-0.86196 -0.38081,-0.42031 -0.55409,-0.93422 -0.55409,-1.51879 0,-0.22328 0.0296,-0.45478 0.0821,-0.6978 0.11164,-0.49919 0.31449,-0.96139 0.63628,-1.37519 0.31528,-0.40718 0.68799,-0.7421 1.10829,-0.98513 0.40718,-0.24302 0.86116,-0.41539 1.33409,-0.53365 0,0 1.45726,-0.24623 1.45726,-0.24623 1.12302,-0.13139 1.96124,-0.29474 2.56544,-0.47213 0.0131,-0.0656 0.0411,-0.1436 0.0411,-0.1436 0.0952,-0.42259 0.0833,-0.74027 -0.0205,-0.90305 -0.008,-0.0105 -0.0324,-0.0321 -0.0411,-0.0411 -0.0221,-0.0236 -0.0562,-0.0607 -0.0821,-0.0821 -0.24702,-0.19543 -0.66824,-0.28732 -1.23147,-0.28732 -0.63708,0 -1.10829,0.10422 -1.43659,0.30786 -0.32191,0.20354 -0.61985,0.57624 -0.88262,1.1083 0,0 -2.48337,0 -2.48337,0 0,0 0.22568,-0.49256 0.22568,-0.49256 0.29554,-0.68308 0.64781,-1.24962 1.08786,-1.68305 0.44006,-0.43343 1.03444,-0.76927 1.72403,-1.00568 0.52841,-0.17442 1.10556,-0.29017 1.72403,-0.3283 z m 10.40571,0 c 0.0927,-0.0114 0.19394,0 0.28732,0 0.5977,0 1.15761,0.17979 1.68305,0.5541 0,0 0.30786,0.22579 0.30786,0.22579 0,0 -1.27256,2.09342 -1.27256,2.09342 0,0 -0.34884,-0.24634 -0.34884,-0.24634 -0.25616,-0.16415 -0.51814,-0.24622 -0.80043,-0.24622 -0.24965,0 -0.49599,0.0887 -0.73891,0.24622 -0.24965,0.16427 -0.43103,0.38184 -0.59518,0.67738 -0.26929,0.50569 -0.47784,1.07211 -0.61574,1.68293 0,0 -1.12884,5.04892 -1.12884,5.04892 0,0 -2.38086,0 -2.38086,0 0,0 2.19616,-9.8515 2.19616,-9.8515 0,0 2.2166,0 2.2166,0 0,0 -0.0558,0.29874 -0.0821,0.41038 0.10502,-0.0788 0.20936,-0.1871 0.30787,-0.24623 0.313,-0.18983 0.63377,-0.30832 0.96458,-0.34885 z m 7.03983,0 c 0.14315,-0.0109 0.28447,0 0.43093,0 1.33991,0 2.36031,0.46951 3.01713,1.39562 0.42031,0.59758 0.63617,1.33649 0.63617,2.21659 0,0.48595 -0.0804,1.00899 -0.20524,1.58032 0,0 -0.16415,0.71835 -0.16415,0.71835 0,0 -6.02754,0 -6.69088,0 -0.0131,0.1379 -0.0411,0.28572 -0.0411,0.41049 0,0.51231 0.11175,0.91538 0.32841,1.21092 0.0338,0.046 0.086,0.10274 0.12317,0.14372 0.0216,0.0229 0.0594,0.0607 0.0821,0.0821 0.2936,0.26689 0.69325,0.41049 1.19038,0.41049 0.48605,0 0.91298,-0.1339 1.31354,-0.38994 0.38104,-0.24303 0.7389,-0.63137 1.06731,-1.16994 0,0 2.56556,0 2.56556,0 0,0 -0.24634,0.49256 -0.24634,0.49256 -0.48606,0.98524 -1.17074,1.7536 -2.01135,2.29879 -0.85385,0.54507 -1.85291,0.84141 -2.97604,0.84141 -1.45144,0 -2.51134,-0.46951 -3.18118,-1.39562 -0.66333,-0.90636 -0.82017,-2.15917 -0.47213,-3.73538 0.35467,-1.60257 1.04186,-2.88324 2.07299,-3.77647 0.93,-0.80135 1.99457,-1.24585 3.16074,-1.33398 z m -35.93785,0.1847 c 0,0 2.44239,0 2.44239,0 0,0 0.30124,5.84604 0.30786,5.93143 0.0985,-0.20936 0.175,-0.38549 0.1847,-0.41049 0,0 2.68872,-5.52094 2.68872,-5.52094 0,0 2.23714,0 2.23714,0 0,0 0.20525,5.77538 0.20525,5.80826 0.0656,-0.11815 3.058,-5.80826 3.058,-5.80826 0,0 2.42184,0 2.42184,0 0,0 -5.33624,9.8515 -5.33624,9.8515 0,0 -2.19604,0 -2.19604,0 0,0 -0.21267,-5.34194 -0.2258,-5.6441 -0.90636,1.85872 -2.75025,5.6441 -2.75025,5.6441 0,0 -2.25769,0 -2.25769,0 0,0 -0.77988,-9.8515 -0.77988,-9.8515 z m -57.34448,1.86763 c -0.56575,0.0239 -1.07959,0.22785 -1.55984,0.61574 -0.38091,0.30216 -0.63789,0.71675 -0.84148,1.16982 0,1.2e-4 4.04324,0 4.04324,0 0.007,-0.0721 0.0205,-0.16004 0.0205,-0.22568 0,-0.37441 -0.0665,-0.66504 -0.18472,-0.86207 -0.28894,-0.47281 -0.7175,-0.69781 -1.35459,-0.69781 -0.0382,0 -0.0854,-0.002 -0.12313,0 z m 10.69306,0 c -0.56574,0.0239 -1.07953,0.22785 -1.55983,0.61574 -0.38091,0.30216 -0.6313,0.71675 -0.84148,1.16982 0,1.2e-4 4.04326,0 4.04326,0 0.007,-0.0721 0.0206,-0.16004 0.0206,-0.22568 0,-0.37441 -0.0599,-0.66504 -0.1847,-0.86207 -0.0574,-0.096 -0.13504,-0.19154 -0.20524,-0.26677 -0.27431,-0.28332 -0.65169,-0.43104 -1.14939,-0.43104 -0.0382,0 -0.0854,-0.002 -0.12317,0 z m 82.71244,0 c -0.58183,0.0179 -1.12519,0.21495 -1.62152,0.61574 -0.3743,0.30216 -0.63126,0.71675 -0.84141,1.16982 0,1.2e-4 4.0227,0 4.0227,0 0.007,-0.0721 0.0206,-0.16004 0.0206,-0.22568 0,-0.37441 -0.0599,-0.66504 -0.1847,-0.86207 -0.28241,-0.46631 -0.71756,-0.69119 -1.35464,-0.69781 -0.0188,2.3e-4 -0.0223,-5.7e-4 -0.041,0 z m -53.77333,0.0411 c -0.54291,0.0644 -1.0478,0.3122 -1.51879,0.73879 -0.56482,0.51231 -0.97451,1.31685 -1.21092,2.38085 -0.0985,0.44656 -0.14371,0.8284 -0.14371,1.16983 0,0.46631 0.0895,0.8325 0.26688,1.10829 0.0471,0.0709 0.10982,0.14566 0.16415,0.20525 0.292,0.31003 0.69964,0.47213 1.21092,0.47213 0.66334,0 1.24791,-0.24714 1.80611,-0.75945 0.56482,-0.51882 0.96789,-1.33158 1.21092,-2.42184 0.22328,-0.99825 0.19211,-1.74366 -0.12317,-2.21659 -0.30205,-0.45969 -0.74381,-0.67726 -1.35453,-0.67726 -0.10364,0 -0.20729,-0.012 -0.30786,0 z m 37.08713,3.59166 c -0.5582,0.15114 -1.18387,0.2783 -2.01135,0.39006 -0.61733,0.0919 -1.05739,0.1888 -1.31354,0.28731 -0.22328,0.0919 -0.40307,0.21918 -0.55421,0.38995 -0.1444,0.16415 -0.24131,0.33651 -0.28732,0.53365 -0.0131,0.0788 -0.0205,0.16004 -0.0205,0.22568 0,0.005 -1.2e-4,0.0153 0,0.0205 6.8e-4,0.0156 -0.002,0.0465 0,0.0616 0.004,0.0297 0.0124,0.0748 0.0205,0.10251 0.003,0.009 0.0171,0.0322 0.0205,0.0411 0.007,0.0177 0.0116,0.0448 0.0206,0.0616 0.009,0.0166 0.03,0.0455 0.041,0.0615 0.0172,0.0236 0.0406,0.0599 0.0616,0.0821 0.16415,0.1839 0.49176,0.26677 0.96458,0.26677 0.51893,0 1.018,-0.0985 1.4778,-0.3283 0.45319,-0.22339 0.81847,-0.55672 1.08775,-0.94415 0.19703,-0.27579 0.35467,-0.70032 0.49257,-1.25201 z m -125.364659,-16.45612 55.082599,-56.87199 8.99518,0 -13.2998,56.87199 -7.398629,0 3.776339,-16.37106 -23.091518,0 -15.692032,16.37106 -8.372139,0 m 29.675679,-22.22896 18.88598,0 3.48449,-14.27618 c 1.40629,-5.66388 2.75996,-10.38381 4.06102,-14.1598 -2.60007,3.25873 -6.04001,7.1252 -10.31982,11.59939 L 86.12566,729.8159" + style="fill:#663366;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + id="path3552" + inkscape:connector-curvature="0" /> + </g> + </g> +</svg> diff --git a/src/img/sobre/banner-sobre-2.jpg b/src/img/sobre/banner-sobre-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a74f516751a9346aca166456f0c92c4ab0e1e186 Binary files /dev/null and b/src/img/sobre/banner-sobre-2.jpg differ diff --git a/src/img/sobre/comunidade.png b/src/img/sobre/comunidade.png new file mode 100644 index 0000000000000000000000000000000000000000..56528fcec577d446b75ddf5296bf66126eaa1bd9 Binary files /dev/null and b/src/img/sobre/comunidade.png differ diff --git a/src/img/sobre/professores.jpg b/src/img/sobre/professores.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d12b3e804f5756f9f44f501110d99d07d98ed6e Binary files /dev/null and b/src/img/sobre/professores.jpg differ diff --git a/src/img/subject_icons/subject_arte.svg b/src/img/subject_icons/subject_arte.svg new file mode 100644 index 0000000000000000000000000000000000000000..7997b02f718543c77a1862441ac98a7dd4e6e4fe --- /dev/null +++ b/src/img/subject_icons/subject_arte.svg @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M51,11.7c-1.7-2.2-4.5-3.6-7.2-3.6c-3.1,0-5.7,1.9-6.8,4.5c-0.6-1.8-1.6-3.4-2.9-4.7 + C26.8,0.7,14.3,1.4,6.2,9.5c-8.1,8.1-8.1,21.3,0,29.4c4,4,9.4,6.1,14.7,6.1c5.3,0,10.6-2,14.7-6.1c0.7-0.7,1.2-1.8,1.2-2.9 + c0-1.1-0.4-2.1-1.2-2.9C34.8,32.4,34,32,32.9,32c-0.7-0.1-1.3-0.3-1.7-0.7l10.2-10.2c0.2,0,0.5,0.1,0.7,0.1c3.2,0,5.7-2.6,5.7-5.7 + c0-1.8,1.7-2.6,2.6-2.6h1.5L51,11.7z M32.7,33.4l0.1-0.7L32.7,33.4l0.1,0c0.7,0,1.2,0.2,1.7,0.7c0.5,0.5,0.7,1.2,0.7,1.9 + s-0.3,1.4-0.7,1.9c-7.6,7.6-19.8,7.6-27.4,0c-7.6-7.6-7.6-19.8,0-27.4c4.1-4.1,9.3-6.2,14.4-6.2c4.3,0,8.4,1.5,11.5,4.6 + c1.9,1.9,3,4.3,3.1,6.9L18.6,33.3c-1.5,1.5-1.6,4-0.2,5.5c0.7,0.7,1.6,1.1,2.6,1.1c0,0,0.1,0,0.1,0c1,0,2-0.5,2.7-1.2l6.3-6.3 + C31,33,31.9,33.2,32.7,33.4z M22.9,37.5c-0.5,0.5-1.1,0.7-1.7,0.8c-0.6,0-1.2-0.2-1.6-0.6c-0.9-0.9-0.8-2.4,0.2-3.3l16.9-16.9 + c0.3,0.8,0.7,1.6,1.3,2.2c0.5,0.5,1.1,0.9,1.7,1.2L22.9,37.5z M46.3,15.5c0,2.3-1.9,4.2-4.2,4.2c-1.1,0-2.2-0.4-3-1.2 + c-0.8-0.8-1.2-1.9-1.2-3c0-3.2,2.6-5.9,5.9-5.9c1.9,0,3.8,0.8,5.2,2.1C47.6,12.3,46.3,13.5,46.3,15.5z"/> + <path class="st1" d="M28.2,29.1l-4,4c-0.2,0.2-0.2,0.5,0,0.7c0.1,0.1,0.2,0.1,0.4,0.1s0.3,0,0.4-0.1l4-4c0.2-0.2,0.2-0.5,0-0.7 + S28.4,28.9,28.2,29.1z"/> + <path class="st1" d="M40.3,12.3c-0.2,0.2-0.1,0.5,0.1,0.7c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.3-0.1,0.4-0.2c1.8-2.3,4.2-1.1,4.3-1.1 + c0.3,0.1,0.5,0,0.7-0.2c0.1-0.2,0-0.5-0.2-0.7C44.7,10.4,42.2,9.9,40.3,12.3z"/> + <path class="st1" d="M7.1,27.8C6.4,28.5,6,29.5,6,30.5c0,1,0.4,2,1.1,2.7c0.7,0.7,1.7,1.1,2.7,1.1s2-0.4,2.7-1.1 + c0.7-0.7,1.1-1.7,1.1-2.7c0-1-0.4-2-1.1-2.7C11.1,26.3,8.6,26.3,7.1,27.8z M11.9,32.5c-1,1-3,1-4,0C7.3,32,7,31.3,7,30.5 + c0-0.8,0.3-1.5,0.8-2s1.2-0.8,2-0.8s1.5,0.3,2,0.8s0.8,1.2,0.8,2C12.7,31.3,12.4,32,11.9,32.5z"/> + <path class="st1" d="M11,22.2c0.7-0.7,1.1-1.7,1.1-2.7c0-1-0.4-2-1.1-2.7s-1.7-1.1-2.7-1.1c-1,0-2,0.4-2.7,1.1 + c-1.4,1.4-1.4,4,0,5.4c0.7,0.7,1.7,1.1,2.7,1.1C9.3,23.3,10.3,22.9,11,22.2z M6.3,17.5c0.5-0.5,1.2-0.8,2-0.8s1.5,0.3,2,0.8 + s0.8,1.2,0.8,2c0,0.8-0.3,1.5-0.8,2c-1,1-3,1-4,0C5.2,20.4,5.2,18.5,6.3,17.5z"/> + <path class="st1" d="M18.9,8.9c-0.7-0.7-1.7-1.1-2.7-1.1c-1,0-2,0.4-2.7,1.1c-0.7,0.7-1.1,1.7-1.1,2.7c0,1,0.4,2,1.1,2.7 + s1.7,1.1,2.7,1.1c1,0,2-0.4,2.7-1.1C20.3,12.9,20.3,10.3,18.9,8.9z M14.2,13.6c-0.5-0.5-0.8-1.2-0.8-2c0-0.8,0.3-1.5,0.8-2 + s1.2-0.8,2-0.8c0.8,0,1.5,0.3,2,0.8c1.1,1.1,1.1,3,0,4C17.2,14.6,15.2,14.6,14.2,13.6z"/> + <path class="st1" d="M27.2,17c1,0,2-0.4,2.7-1.1c0.7-0.7,1.1-1.7,1.1-2.7c0-1-0.4-2-1.1-2.7c-1.4-1.4-4-1.4-5.4,0 + c-0.7,0.7-1.1,1.7-1.1,2.7c0,1,0.4,2,1.1,2.7C25.2,16.6,26.2,17,27.2,17z M25.2,11.1c0.5-0.5,1.3-0.8,2-0.8s1.5,0.3,2,0.8 + c0.5,0.5,0.8,1.2,0.8,2c0,0.8-0.3,1.5-0.8,2c-1.1,1.1-3,1.1-4,0c-0.5-0.5-0.8-1.2-0.8-2C24.4,12.4,24.7,11.7,25.2,11.1z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_biologia.svg b/src/img/subject_icons/subject_biologia.svg new file mode 100644 index 0000000000000000000000000000000000000000..fafea9451e9525bdade258aa8f5bfaaaf47c436f --- /dev/null +++ b/src/img/subject_icons/subject_biologia.svg @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M39.7,1.8v3.8c0,1.5-0.3,2.9-0.9,4.3H17.7c-0.4,0-0.8,0.3-0.8,0.8s0.3,0.8,0.8,0.8H38 + c-0.6,0.9-1.3,1.9-2.2,2.9c-2.5,2.7-6.1,5.3-9.6,7.7c-3.6,2.5-7.3,5.2-10.2,8.3c-3.4,3.7-5.2,7.7-5.2,11.9v3.8h1.5v-3.8 + c0-1.7,0.3-3.3,0.9-4.9h21.1c0.4,0,0.8-0.3,0.8-0.8s-0.3-0.8-0.8-0.8H14c0.8-1.5,1.8-3,3.2-4.5c2.8-3,6.5-5.6,10-8.1 + c3.5-2.5,7.2-5.1,9.8-7.9c3-3.2,4.3-6.2,4.3-9.7V1.8H39.7z"/> + <path class="st1" d="M28.6,24c-0.2,0.2-0.4,0.3-0.6,0.5c-0.2,0.2-0.4,0.3-0.7,0.5c1.9,1.4,3.8,2.8,5.5,4.3h-8 + c-0.4,0-0.8,0.3-0.8,0.8s0.3,0.8,0.8,0.8h9.6c0.2,0.2,0.4,0.4,0.6,0.6c3.2,3.4,4.8,7.1,4.8,10.9v0.4H17.3c-0.4,0-0.8,0.3-0.8,0.8 + s0.3,0.8,0.8,0.8h22.4v1.9h1.5v-3.8c0-4.2-1.7-8.2-5.2-11.9C33.9,28,31.3,26,28.6,24z"/> + <path class="st1" d="M23.5,22.2c0.4-0.3,0.9-0.6,1.3-0.9c-1.5-1.1-3-2.1-4.4-3.2h6.9c0.4,0,0.8-0.3,0.8-0.8s-0.3-0.8-0.8-0.8h-8.7 + c0,0,0,0,0,0c-0.8-0.7-1.6-1.5-2.3-2.2c-2.7-2.9-3.9-5.6-3.9-8.7V4.9h22.4c0.4,0,0.8-0.3,0.8-0.8s-0.3-0.8-0.8-0.8H12.4V1.8h-1.5 + v3.8c0,3.5,1.3,6.5,4.3,9.7C17.4,17.7,20.4,20,23.5,22.2z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_ciencias-da-natureza.svg b/src/img/subject_icons/subject_ciencias-da-natureza.svg new file mode 100644 index 0000000000000000000000000000000000000000..8becb9f0186e736a9a091f433a8d0d18bc21496a --- /dev/null +++ b/src/img/subject_icons/subject_ciencias-da-natureza.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M24.8,21.8c0-1.6,0.5-3.3,1.4-4.9c2.4,3.1,5,4,6.9,4.2c2.5,0.3,5.2-0.7,6.9-2.4c3.2-3.3,5.6-17.1,5.7-17.6 + l0.2-1l-1,0.2c-0.6,0.1-13.6,2.2-17.5,6.2c-2.3,2.4-3.1,5.9-2,9.1c-1,1.5-1.6,3.1-1.9,4.7c-0.8-1.2-1.7-1.8-2.4-2.1 + c1.4-2.5,0.8-5.8-1.4-7.7C17.2,8.2,8.2,7.1,7.2,7l-1-0.1l0.2,1c0.1,0.4,2,9.3,5,11.9c1.2,1,2.7,1.5,4.1,1.5c1.7,0,3.5-0.7,4.7-2.1 + c0.9,0.3,3.2,1.6,3.1,6.5v4.4h-10c-1,0-1.9,0.5-2.4,1.2c-0.6,0.8-0.8,1.8-0.5,2.7l3.3,11.5c0.4,1.3,1.6,2.2,2.9,2.2h19.5 + c1.4,0,2.6-0.9,2.9-2.2L42.4,34c0.3-0.9,0.1-1.9-0.5-2.7c-0.6-0.8-1.5-1.2-2.4-1.2H24.8V21.8z M28.5,7.5c3-3,12.5-5,15.6-5.6 + c-0.8,4.4-2.9,13.5-5.1,15.8c-1.1,1.1-3.2,2.2-5.7,2c-1.7-0.2-4.2-1.1-6.4-4.4C25.9,12.6,26.5,9.5,28.5,7.5z M19.1,18.2 + c-1.7,2-4.8,2.2-6.8,0.5C10.4,17,8.8,11.6,8.1,8.6c3.2,0.4,9,1.4,10.6,2.8C20.7,13.1,20.9,16.2,19.1,18.2z M40.7,32.3 + c0.3,0.4,0.4,0.9,0.3,1.4l-2,6.9h-6.5c-0.3,0-0.5,0.2-0.5,0.5s0.2,0.5,0.5,0.5h6.2l-1,3.6c-0.2,0.7-0.8,1.1-1.5,1.1H16.6 + c-0.7,0-1.3-0.5-1.5-1.1l-3.3-11.5c-0.1-0.5,0-1,0.3-1.4c0.3-0.4,0.8-0.6,1.2-0.6h26.1C39.9,31.6,40.4,31.9,40.7,32.3z"/> + <path class="st1" d="M29.3,13.9c0,0,0.1,0,0.1,0c0.2,0,0.4-0.2,0.5-0.4c0-0.2,1.2-5,9.8-6.6c0.3,0,0.5-0.3,0.4-0.6 + c0-0.3-0.3-0.5-0.6-0.4c-9.4,1.7-10.6,7.1-10.6,7.4C28.8,13.6,29,13.8,29.3,13.9z"/> + <path class="st1" d="M11.8,11.3c-0.3,0-0.5,0.2-0.5,0.4c0,0.3,0.2,0.5,0.4,0.5c0,0,4.8,0.5,6,3.8c0.1,0.2,0.3,0.3,0.5,0.3 + c0.1,0,0.1,0,0.2,0c0.3-0.1,0.4-0.4,0.3-0.6C17.3,11.9,12,11.4,11.8,11.3z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_direitos-humanos.svg b/src/img/subject_icons/subject_direitos-humanos.svg new file mode 100644 index 0000000000000000000000000000000000000000..ddf087190b26830daadccbb88150ba73d06b7697 --- /dev/null +++ b/src/img/subject_icons/subject_direitos-humanos.svg @@ -0,0 +1,5 @@ +<svg width="56" height="57" viewBox="0 0 56 57" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M33.2472 21.7656C33.0162 21.7656 32.7971 21.8137 32.5901 21.8863V16.4266C32.5901 15.2757 31.6763 14.3397 30.5527 14.3397C30.3217 14.3397 30.1027 14.3877 29.8956 14.4603V14.3877C29.8956 13.2368 28.9744 12.3008 27.8435 12.3008C26.7116 12.3008 25.7913 13.2368 25.7913 14.3877V14.4603C25.5843 14.3877 25.3652 14.3397 25.1343 14.3397C24.0106 14.3397 23.0968 15.2757 23.0968 16.4266V17.2269C22.8898 17.1543 22.6708 17.1063 22.4398 17.1063C21.3161 17.1063 20.4023 18.0423 20.4023 19.1932V28.5251V31.1833C20.4023 32.8244 20.6131 34.6079 22.0919 35.607V44.7853H23.4723V35.6711L23.4677 34.7615L23.0895 34.5673C22.149 34.0819 21.7818 33.1336 21.7818 31.1824V28.5242V19.1923C21.7818 18.8209 22.0763 18.5192 22.4389 18.5192C22.8014 18.5192 23.0959 18.8209 23.0959 19.1923V23.1701V23.9138H24.4763V23.1701V19.1923V16.4257C24.4763 16.0543 24.7708 15.7527 25.1333 15.7527C25.4959 15.7527 25.7904 16.0543 25.7904 16.4257V22.4679V23.1654H27.1708V22.4679V16.4257V14.3868C27.1708 14.0154 27.4726 13.7138 27.8425 13.7138C28.2125 13.7138 28.5143 14.0154 28.5143 14.3868V16.4257V22.4679V24.1768H29.8947V22.4679V16.4257C29.8947 16.0543 30.1892 15.7527 30.5517 15.7527C30.9143 15.7527 31.2088 16.0543 31.2088 16.4257V23.8507V24.7528V26.3665C29.7392 26.5852 28.2668 27.6061 28.2668 30.8204H29.6471C29.6471 28.6835 30.3419 27.7315 31.899 27.7315H32.5892V24.7528V23.8507C32.5892 23.4793 32.8837 23.1777 33.2462 23.1777C33.6088 23.1777 33.9033 23.4793 33.9033 23.8507V28.5242V31.1824C33.9033 32.6236 33.1211 33.9207 31.8631 34.5683L31.4821 34.7634V44.7853H32.8625V35.6146C34.3662 34.672 35.2837 33.012 35.2837 31.1824V28.5242V23.8507C35.2846 22.7016 34.3708 21.7656 33.2472 21.7656Z" fill="#00BCD4"/> +<path d="M15.4014 23.1534C15.1704 23.1534 14.9532 23.2081 14.7554 23.3005V18.6638C14.7554 17.7796 14.0532 17.0604 13.19 17.0604C12.959 17.0604 12.7419 17.115 12.544 17.2074V16.9915C12.544 16.1074 11.8363 15.3872 10.9658 15.3872C10.0952 15.3872 9.38755 16.1064 9.38755 16.9915V17.2074C9.19062 17.115 8.97252 17.0613 8.74246 17.0613C7.87927 17.0613 7.1762 17.7805 7.1762 18.6647V19.4772C6.97926 19.3849 6.76117 19.3311 6.5311 19.3311C5.66791 19.3311 4.96484 20.0503 4.96484 20.9355V28.5942V30.7755C4.96484 32.1093 5.13693 33.56 6.35166 34.347V41.9398H7.2719L7.26914 33.7805L7.01699 33.6505C6.07742 33.1678 5.88509 32.1517 5.88509 30.7764V28.5952V20.9364C5.88509 20.5716 6.17497 20.2747 6.5311 20.2747C6.88724 20.2747 7.1762 20.5716 7.1762 20.9364V24.2007V24.8106H8.09644V24.2007V20.9364V18.6656C8.09644 18.3008 8.38632 18.0049 8.74246 18.0049C9.09859 18.0049 9.38755 18.3008 9.38755 18.6656V23.6238V24.196H10.3078V23.6238V18.6656V16.9934C10.3078 16.6286 10.6032 16.3317 10.9658 16.3317C11.3284 16.3317 11.6238 16.6286 11.6238 16.9934V18.6656V23.6238V25.0274H12.544V23.6238V18.6656C12.544 18.3008 12.8339 18.0049 13.19 18.0049C13.5461 18.0049 13.8351 18.3008 13.8351 18.6656V24.7597V25.4996V26.9202C12.6443 27.0672 11.4204 27.8562 11.4204 30.4795H12.3406C12.3406 28.6517 12.9434 27.8354 14.2952 27.8354H14.7554V25.4996V24.7597C14.7554 24.3949 15.0452 24.098 15.4014 24.098C15.7575 24.098 16.0465 24.3949 16.0465 24.7597V28.5942V30.7755C16.0465 31.999 15.382 33.1009 14.3136 33.6505L14.0606 33.7815L14.0596 41.9389H14.9799V34.3518C16.2121 33.6033 16.9667 32.2582 16.9667 30.7755V28.5942V24.7597C16.9676 23.8727 16.2646 23.1534 15.4014 23.1534Z" fill="#00BCD4"/> +<path d="M49.1495 23.1534C48.9185 23.1534 48.7014 23.2081 48.5044 23.2995V18.6627C48.5044 17.7786 47.8014 17.0593 46.9382 17.0593C46.7072 17.0593 46.49 17.114 46.2931 17.2055V16.9896C46.2931 16.1054 45.5845 15.3853 44.7149 15.3853C43.8452 15.3853 43.1366 16.1045 43.1366 16.9896V17.2055C42.9397 17.1131 42.7216 17.0593 42.4915 17.0593C41.6283 17.0593 40.9262 17.7786 40.9262 18.6627V19.4762C40.7283 19.3838 40.5112 19.3292 40.2802 19.3292C39.417 19.3292 38.7148 20.0484 38.7148 20.9335V28.5923V30.7735C38.7148 32.1073 38.8869 33.558 40.1017 34.3451L40.1026 41.9379H41.0228V34.4573L41.0182 33.7776L40.767 33.6485C39.8274 33.164 39.636 32.1488 39.636 30.7735V28.5923V20.9335C39.636 20.5687 39.925 20.2718 40.2811 20.2718C40.6372 20.2718 40.9271 20.5687 40.9271 20.9335V24.1978V24.8077H41.8474V24.1978V20.9335V18.6627C41.8474 18.2979 42.1363 18.002 42.4925 18.002C42.8486 18.002 43.1376 18.2979 43.1376 18.6627V23.6209V24.1931H44.0578V23.6209V18.6627V16.9905C44.0578 16.6257 44.3523 16.3288 44.7158 16.3288C45.0793 16.3288 45.3738 16.6257 45.3738 16.9905V18.6627V23.6209V25.0245H46.294V23.6209V18.6627C46.294 18.2979 46.583 18.002 46.9391 18.002C47.2952 18.002 47.5851 18.2979 47.5851 18.6627V24.7568V25.4967V26.9173C46.3943 27.0643 45.1704 27.8533 45.1704 30.4766H46.0906C46.0906 28.6488 46.6934 27.8325 48.0452 27.8325H48.5054V25.4967V24.7568C48.5054 24.392 48.7943 24.0951 49.1504 24.0951C49.5066 24.0951 49.7955 24.392 49.7955 24.7568V28.5913V30.7726C49.7955 31.9961 49.1311 33.098 48.0618 33.6476L47.8087 33.7786V41.936H48.729V34.3479C49.9621 33.6004 50.7158 32.2553 50.7158 30.7726V28.5913V24.7568C50.7149 23.8726 50.0136 23.1534 49.1495 23.1534Z" fill="#00BCD4"/> +</svg> diff --git a/src/img/subject_icons/subject_educacao-ambiental.svg b/src/img/subject_icons/subject_educacao-ambiental.svg new file mode 100644 index 0000000000000000000000000000000000000000..ac197ccef1494d2cadba5a6f191bfae05039e6bb --- /dev/null +++ b/src/img/subject_icons/subject_educacao-ambiental.svg @@ -0,0 +1,10 @@ +<svg width="56" height="57" viewBox="0 0 56 57" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M41.7444 39.3869C41.6523 39.4812 41.6523 39.5754 41.6523 39.6696C41.6523 39.7638 41.6523 39.9523 41.7444 40.0465C41.8364 40.1407 41.9284 40.1407 42.1125 40.1407C42.2965 40.1407 42.3885 40.1407 42.4806 40.0465C42.5726 39.9523 42.5726 39.8581 42.5726 39.6696C42.5726 39.4812 42.5726 39.3869 42.3885 39.3869C42.2965 39.1985 41.9284 39.1985 41.7444 39.3869Z" fill="#00BCD4"/> +<path d="M17.8156 42.5894C17.5395 42.5894 17.3555 42.7778 17.3555 43.0605V45.0392C17.3555 45.3219 17.5395 45.5103 17.8156 45.5103C18.0917 45.5103 18.2757 45.3219 18.2757 45.0392V43.0605C18.2757 42.7778 18.0917 42.5894 17.8156 42.5894Z" fill="#00BCD4"/> +<path d="M22.7878 14.4169C24.0761 14.5111 25.0884 15.4533 25.4565 16.7725C25.5485 16.9609 25.7326 17.1494 25.9166 17.1494H26.0087C26.2847 17.0552 26.3768 16.8667 26.3768 16.584C26.0087 14.888 24.6283 13.6631 22.9718 13.4746C22.6958 13.4746 22.5117 13.6631 22.5117 13.9457C22.5117 14.2284 22.5117 14.4169 22.7878 14.4169Z" fill="#00BCD4"/> +<path d="M28.125 23.0841C27.8489 22.9899 27.6648 23.1784 27.5728 23.3668C27.2047 24.4975 26.1924 25.2513 25.0881 25.1571C24.9041 25.1571 24.8121 25.2513 24.72 25.3456C24.628 25.4398 24.628 25.6282 24.72 25.8167C25.1802 26.8532 24.9041 28.0781 24.0759 28.8319C23.2476 29.5857 21.9593 29.6799 21.0391 29.1146C20.855 29.0203 20.5789 29.0203 20.3949 29.303C20.3029 29.4915 20.3029 29.7741 20.5789 29.9626C21.1311 30.3395 21.7753 30.5279 22.4194 30.5279C23.2476 30.5279 24.0759 30.2453 24.72 29.6799C25.7323 28.8319 26.1004 27.4185 25.8243 26.1936C27.1127 26.0051 28.125 25.0629 28.5851 23.7437C28.4931 23.3668 28.401 23.1784 28.125 23.0841Z" fill="#00BCD4"/> +<path d="M15.9772 10.7425C14.6889 11.1194 13.7686 12.0616 13.4925 13.3808C12.2962 13.0039 11.0079 13.3808 10.0876 14.323C8.98332 15.4537 8.79927 17.0556 9.53547 18.4689C9.62749 18.6574 9.81154 18.7516 9.90357 18.7516C9.99559 18.7516 10.0876 18.7516 10.0876 18.6574C10.2717 18.5632 10.3637 18.2805 10.2717 17.9978C9.71952 16.9613 9.90357 15.8306 10.7318 14.9826C11.468 14.1346 12.6643 13.9461 13.6766 14.5115C13.8606 14.6057 13.9527 14.6057 14.1367 14.5115C14.2287 14.4173 14.3208 14.323 14.3208 14.1346C14.4128 13.0039 15.149 12.0616 16.1612 11.7789C17.2655 11.4963 18.3698 11.9674 18.922 12.9096C19.014 13.0981 19.3821 13.1923 19.5662 13.0981C19.7502 13.0039 19.8422 12.627 19.7502 12.4385C18.922 10.9309 17.4496 10.3656 15.9772 10.7425Z" fill="#00BCD4"/> +<path d="M45.333 15.4529C47.7256 15.4529 49.6581 13.4742 49.6581 11.0243C49.6581 8.57444 47.7256 6.5957 45.333 6.5957C42.9403 6.5957 41.0078 8.57444 41.0078 11.0243C41.0078 13.4742 42.9403 15.4529 45.333 15.4529ZM45.333 7.53796C47.1735 7.53796 48.7379 9.04556 48.7379 11.0243C48.7379 13.003 47.1735 14.5106 45.333 14.5106C43.4925 14.5106 41.9281 13.003 41.9281 11.0243C41.9281 9.04556 43.4925 7.53796 45.333 7.53796Z" fill="#00BCD4"/> +<path d="M52.1418 49.4699H46.4363V43.8163C46.7123 43.9106 46.9884 43.9106 47.3565 43.9106C48.2768 43.9106 49.4731 43.6279 50.4853 42.6856C52.2338 40.8954 51.4976 38.0686 51.4976 37.9744L51.4056 37.6917L51.1295 37.5975C51.0375 37.5975 48.2767 36.8437 46.5283 38.634C46.1602 39.0109 45.8841 39.3878 45.7001 39.7647C45.516 39.3878 45.2399 39.0109 44.8718 38.634C43.1234 36.8437 40.3626 37.5975 40.2706 37.5975L39.9945 37.6917L39.9025 37.9744C39.9025 38.0686 39.1663 40.8954 40.9148 42.6856C41.927 43.7221 43.0313 44.0048 43.9516 44.0048C44.3197 44.0048 44.6878 44.0048 44.8718 43.9106V49.4699H43.4915H40.2706H31.6203C31.3442 49.4699 31.1602 49.6583 31.1602 49.941C31.1602 50.2237 31.3442 50.4121 31.6203 50.4121H40.2706H43.4915H52.1418C52.4179 50.4121 52.6019 50.2237 52.6019 49.941C52.6019 49.6583 52.4179 49.4699 52.1418 49.4699ZM47.1725 39.2935C48.2768 38.1628 50.0252 38.3513 50.6694 38.4455C50.7614 39.1051 50.9455 40.8954 49.8412 42.0261C48.9209 43.0625 47.7246 43.0625 46.8964 42.9683L49.0129 40.8011C49.197 40.6127 49.197 40.33 49.0129 40.1416C48.8289 39.9531 48.5528 39.9531 48.3688 40.1416L46.2522 42.3087C46.2522 42.2145 46.2522 42.0261 46.2522 41.9318C46.2522 41.8376 46.2522 41.8376 46.2522 41.7434C46.2522 40.9896 46.4363 40.0473 47.1725 39.2935ZM41.651 41.9318C40.5467 40.8011 40.7307 39.0109 40.8227 38.3513C41.4669 38.2571 43.2154 38.0686 44.3197 39.1993C45.0559 39.9531 45.2399 40.8954 45.332 41.5549C45.332 41.6492 45.332 41.7434 45.332 41.7434C45.332 41.8376 45.332 42.0261 45.332 42.1203L43.9516 40.7069C43.7675 40.5185 43.4915 40.5185 43.3074 40.7069C43.1234 40.8954 43.1234 41.178 43.3074 41.3665L44.6878 42.7799C43.8596 43.0625 42.6632 42.9683 41.651 41.9318Z" fill="#00BCD4"/> +<path d="M31.8962 25.8186C32.3563 24.4052 31.9882 22.8034 31.068 21.7669C32.0803 20.7305 32.6324 19.2229 32.2643 17.8095C31.8962 16.3019 30.8839 15.1712 29.5036 14.7C29.8717 13.2867 29.5956 11.779 28.5833 10.6483C27.571 9.51764 26.0987 9.14074 24.7183 9.42342C24.3502 8.01004 23.2459 6.78511 21.8655 6.40821C20.3931 6.0313 18.9207 6.40821 17.9085 7.44468C16.8962 6.40821 15.4238 5.93708 13.9514 6.31398C12.479 6.69088 11.4667 7.82159 11.0066 9.23497C9.62623 8.85806 8.15384 9.23497 7.04954 10.3657C6.03727 11.4964 5.66917 13.004 6.03727 14.4174C4.6569 14.7943 3.5526 15.925 3.1845 17.4326C2.81641 18.9402 3.27653 20.4478 4.2888 21.4843C3.27653 22.5207 2.90843 24.1226 3.36855 25.5359C3.82868 26.9493 4.93297 28.08 6.31334 28.3627C6.03727 29.7761 6.49739 31.2837 7.60169 32.3202C8.70599 33.3566 10.1784 33.6393 11.5588 33.2624C12.0189 34.6758 13.1232 35.7123 14.5956 35.995C14.6876 35.995 14.8716 35.995 14.9637 36.0892L14.5956 40.5178H12.571L9.99433 37.9737L9.44218 38.6333L11.3747 40.5178H8.61396V41.46H12.2949H14.5035L14.0434 49.4692H9.25813C8.98206 49.4692 8.79801 49.6576 8.79801 49.9403C8.79801 50.223 8.98206 50.4114 9.25813 50.4114H13.9514H21.6815H27.571C27.8471 50.4114 28.0312 50.223 28.0312 49.9403C28.0312 49.6576 27.8471 49.4692 27.571 49.4692H21.5894L20.4851 36.0892C21.8655 35.8065 22.9698 34.77 23.522 33.4509C24.9023 33.922 26.3747 33.6393 27.479 32.6028C28.5833 31.5664 29.0434 30.0588 28.8594 28.6454C30.2398 28.3627 31.4361 27.3262 31.8962 25.8186ZM14.9637 49.4692L16.068 36.0892C16.6201 35.995 17.0802 35.9007 17.6324 35.6181C18.2766 35.995 18.9207 36.1834 19.6569 36.1834L20.7612 49.4692H14.9637ZM30.6079 25.4417C30.2398 26.5724 29.2275 27.3262 28.0312 27.3262C28.0312 27.3262 28.0312 27.3262 27.9391 27.3262C27.6631 27.3262 27.479 27.4205 27.387 27.6089C27.295 27.7974 27.2029 28.08 27.295 28.2685C27.7551 29.3992 27.479 30.7183 26.5588 31.4721C25.6385 32.3202 24.3502 32.4144 23.3379 31.7548C23.1539 31.6606 22.8778 31.6606 22.6937 31.7548C22.5097 31.849 22.3256 32.0375 22.3256 32.3202C22.1416 33.5451 21.3134 34.4874 20.117 34.6758C19.3809 34.77 18.5526 34.5816 17.9085 34.1105C17.8164 34.0162 17.6324 33.922 17.4483 33.922C17.2643 33.922 17.1723 33.922 17.0802 34.0162C16.4361 34.4874 15.6999 34.6758 14.8716 34.4874C13.6753 34.2047 12.8471 33.2624 12.7551 32.0375C12.7551 31.7548 12.571 31.5664 12.387 31.4721C12.2029 31.3779 11.9269 31.3779 11.7428 31.4721C10.7305 32.1317 9.44218 31.9433 8.52194 31.0952C7.60169 30.2472 7.41764 28.9281 7.87776 27.8916C7.96979 27.7031 7.96979 27.4205 7.87776 27.232C7.78574 27.0436 7.50967 26.9493 7.32562 26.8551C6.1293 26.8551 5.11702 26.0071 4.74892 24.8764C4.38083 23.7457 4.84095 22.4265 5.85322 21.7669C6.03727 21.6727 6.1293 21.39 6.1293 21.2016C6.1293 20.9189 6.03727 20.7305 5.7612 20.6362C4.74892 19.9767 4.2888 18.7517 4.56488 17.621C4.84095 16.3961 5.85322 15.5481 7.04954 15.5481C7.32562 15.5481 7.50967 15.3596 7.60169 15.1712C7.69372 14.9827 7.69372 14.7 7.60169 14.5116C7.04954 13.4751 7.23359 12.156 8.06181 11.2137C8.89004 10.3657 10.1784 10.1772 11.2827 10.6483C11.4667 10.7426 11.7428 10.7426 11.9269 10.6483C12.1109 10.5541 12.2949 10.2714 12.2949 10.083C12.387 8.85806 13.1232 7.82159 14.3195 7.53891C15.5158 7.25623 16.7121 7.72736 17.3563 8.76384C17.4483 8.95229 17.7244 9.04651 17.9085 9.14074C18.0925 9.14074 18.3686 9.04652 18.4606 8.85806C19.1048 7.82159 20.3011 7.35046 21.4974 7.72736C22.6017 8.10426 23.4299 9.14074 23.4299 10.3657C23.4299 10.6483 23.522 10.8368 23.798 10.931C23.9821 11.0252 24.2582 11.0252 24.4422 10.931C25.5465 10.3657 26.7428 10.6483 27.571 11.4964C28.3993 12.3444 28.5833 13.6636 27.9391 14.7943C27.8471 14.9827 27.8471 15.2654 27.9391 15.4538C28.0312 15.6423 28.2152 15.8307 28.4913 15.8307C29.6876 15.925 30.6079 16.773 30.8839 17.9979C31.16 19.2228 30.6079 20.4478 29.5956 21.0131C29.4115 21.1074 29.2275 21.39 29.2275 21.5785C29.2275 21.7669 29.3195 22.0496 29.5036 22.1438C30.5158 22.9919 30.976 24.2168 30.6079 25.4417Z" fill="#00BCD4"/> +</svg> diff --git a/src/img/subject_icons/subject_educacao-do-campo.svg b/src/img/subject_icons/subject_educacao-do-campo.svg new file mode 100644 index 0000000000000000000000000000000000000000..3556cdb2cd89aafe9a10a6cedfd85e3076841712 --- /dev/null +++ b/src/img/subject_icons/subject_educacao-do-campo.svg @@ -0,0 +1,23 @@ +<svg width="53" height="57" viewBox="0 0 53 57" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M26.9067 34.1542C26.7879 33.6639 27.0849 33.1602 27.5602 33.0512C28.0354 32.9286 28.5225 33.235 28.6413 33.7252C28.7482 34.2154 28.4512 34.7192 27.976 34.8405C27.9035 34.8527 27.8334 34.8662 27.7609 34.8662C27.3701 34.865 27.0018 34.5831 26.9067 34.1542ZM23.9485 34.5341C23.4851 34.338 23.2713 33.7988 23.4495 33.3343C23.6396 32.8685 24.1623 32.6357 24.6138 32.8318C25.0771 33.0144 25.291 33.5549 25.1009 34.0206C24.9702 34.3883 24.6376 34.5966 24.2811 34.5966C24.1742 34.5941 24.0554 34.5709 23.9485 34.5341ZM30.162 32.7448C29.7818 32.4139 29.7343 31.8378 30.0551 31.4457C30.3758 31.0645 30.933 31.0155 31.3144 31.3354C31.6946 31.6663 31.7421 32.2411 31.4213 32.6345C31.2443 32.8551 30.9948 32.9654 30.7453 32.9654C30.5422 32.9641 30.3283 32.8918 30.162 32.7448ZM20.8477 31.8366C20.5863 31.4077 20.717 30.8439 21.1328 30.5755C21.5486 30.3046 22.107 30.4407 22.3684 30.8684C22.6179 31.2986 22.4991 31.8734 22.0714 32.1308C21.9288 32.2288 21.7625 32.2778 21.608 32.2778C21.311 32.279 21.014 32.1197 20.8477 31.8366ZM32.0035 29.6196C31.5045 29.5828 31.1374 29.1416 31.1718 28.6391C31.2075 28.1366 31.6471 27.7567 32.1353 27.7935C32.6224 27.8302 32.9907 28.2714 32.9539 28.7739C32.9195 29.2641 32.5274 29.6318 32.0629 29.6318C32.0391 29.6318 32.0142 29.6196 32.0035 29.6196ZM20.7051 28.7739C20.2061 28.7371 19.8378 28.2959 19.8735 27.7935C19.9091 27.291 20.3368 26.8988 20.8239 26.9356C21.311 26.9723 21.6912 27.4135 21.6556 27.916C21.6199 28.4062 21.2279 28.7739 20.7645 28.7739C20.7408 28.7739 20.717 28.7739 20.7051 28.7739ZM30.4816 25.6855C30.2202 25.2443 30.3521 24.6805 30.7786 24.4231C31.1956 24.1535 31.7421 24.2883 32.0023 24.7173C32.2518 25.1462 32.1211 25.7222 31.7053 25.9796C31.5627 26.0777 31.3964 26.1144 31.2419 26.1144C30.9461 26.1144 30.6491 25.9674 30.4816 25.6855ZM21.5011 25.2198C21.1209 24.8889 21.0734 24.3128 21.3942 23.9206C21.7031 23.5285 22.2615 23.4794 22.6416 23.8103C23.0218 24.129 23.0693 24.7173 22.7604 25.0972C22.5822 25.3178 22.3327 25.4281 22.0714 25.4281C21.8694 25.4281 21.6674 25.3546 21.5011 25.2198ZM28.2373 23.7123C27.7859 23.5162 27.5602 22.977 27.7502 22.5112C27.9403 22.0455 28.4643 21.8249 28.9145 22.0088C29.366 22.2049 29.5905 22.7441 29.4016 23.2098C29.2591 23.5652 28.9264 23.7858 28.5819 23.7858C28.4631 23.7858 28.3443 23.7613 28.2373 23.7123ZM24.1742 22.8176C24.0435 22.3274 24.3405 21.8249 24.8158 21.7024C24.8276 21.7024 24.8276 21.7024 24.8395 21.7024C24.8514 21.7024 24.8633 21.6901 24.887 21.6901C25.3623 21.5676 25.8375 21.8739 25.9563 22.3642C26.0751 22.8544 25.7781 23.3569 25.3029 23.4794C25.291 23.4794 25.2791 23.4794 25.2672 23.4917C25.2553 23.4917 25.2553 23.4917 25.2553 23.4917C25.1841 23.504 25.1128 23.5162 25.0415 23.5162C24.6376 23.5162 24.2693 23.2343 24.1742 22.8176Z" fill="#00BCD4"/> +<path d="M30.4481 17.4393L29.4906 17.1047L29.4656 16.5654C29.5892 15.6904 29.6521 14.7026 29.6521 13.6327C29.6521 12.2563 29.4134 10.6741 28.9405 8.93014L28.8633 8.64213L29.0355 8.40192C31.0731 5.56105 33.3577 3.54498 33.4539 3.46042L34.2166 2.79248L34.421 3.80113C34.4495 3.94329 35.1243 7.32097 35.0305 11.1031L35.0233 11.3788L34.819 11.5565C33.8032 12.4377 32.9644 13.3385 32.33 14.2332C31.6576 15.183 31.1028 16.1022 30.681 16.9638L30.4481 17.4393ZM30.163 8.89337C30.6133 10.6312 30.8402 12.2245 30.8402 13.6327C30.8402 13.8582 30.8378 14.08 30.8319 14.2969C31.003 14.0371 31.1824 13.7736 31.3701 13.5076C32.0164 12.5958 32.8492 11.6852 33.846 10.7979C33.8792 8.50977 33.6238 6.36502 33.4385 5.13087C32.6437 5.91646 31.3606 7.26336 30.163 8.89337Z" fill="#00BCD4"/> +<path d="M35.8619 21.9519L35.2773 21.1001L35.566 20.6491C36.166 20.0204 36.7814 19.2617 37.398 18.394C38.1869 17.28 38.9009 15.8571 39.5175 14.1621L39.6209 13.879L39.9012 13.7908C43.0805 12.8042 45.9353 12.5799 46.0565 12.5701L47.0533 12.4941L46.6399 13.4342C46.5828 13.5641 45.2106 16.6623 42.9925 19.6417L42.831 19.8586L42.566 19.8794C41.3162 19.9787 40.1887 20.1907 39.2145 20.5094C38.1287 20.8648 37.1545 21.268 36.3193 21.7092L35.8619 21.9519ZM40.5238 14.8791C39.8929 16.5532 39.1635 17.9773 38.3568 19.1171C38.2285 19.2985 38.0978 19.4762 37.9695 19.6502C38.257 19.5436 38.5528 19.4407 38.8557 19.3414C39.8466 19.0179 40.9729 18.796 42.2084 18.6808C43.5272 16.8707 44.5358 15.0102 45.0871 13.9121C44.0404 14.0531 42.3356 14.3398 40.5238 14.8791Z" fill="#00BCD4"/> +<path d="M44.4709 31.4509L44.2428 31.305C43.1795 30.6248 42.1495 30.1089 41.1812 29.7718C40.0977 29.3968 39.0795 29.1284 38.1564 28.9764L37.6562 28.8943V27.8501L38.1564 27.6614C39.0023 27.5192 39.9337 27.2815 40.9246 26.9579C42.1542 26.5559 43.4955 25.8745 44.9093 24.9333L45.1552 24.769L45.4308 24.8708C48.5222 26.0081 50.9113 27.5401 51.0111 27.6038L51.8606 28.1504L50.9885 28.6566C50.8721 28.724 48.117 30.3135 44.7263 31.37L44.4709 31.4509ZM40.6656 28.3195C40.959 28.409 41.2572 28.5058 41.559 28.61C42.5439 28.9519 43.5775 29.4581 44.6372 30.1174C46.6474 29.4679 48.4283 28.6259 49.4631 28.0965C48.5507 27.5805 47.0442 26.79 45.3049 26.127C43.8935 27.0437 42.5415 27.7153 41.2846 28.1259C41.0755 28.1945 40.8699 28.2595 40.6656 28.3195Z" fill="#00BCD4"/> +<path d="M46.7715 43.7097L45.7782 43.5859C45.6547 43.5712 42.7071 43.1999 39.4828 42.0723L39.2214 41.9816L39.1204 41.7169C38.6345 40.4435 38.0749 39.3418 37.4595 38.4397C36.8025 37.4813 36.136 36.6455 35.4755 35.9579L35.125 35.5927L35.7083 34.7422L36.2251 34.8954C36.9902 35.2949 37.8777 35.6712 38.8638 36.0143C40.0138 36.4139 41.3908 36.6737 42.9542 36.7889L43.2406 36.811L43.4033 37.0548C45.2816 39.8871 46.3556 42.6361 46.3996 42.7513L46.7715 43.7097ZM40.1231 41C42.0026 41.6372 43.7883 42.011 44.8682 42.2035C44.4203 41.212 43.635 39.6151 42.5812 37.9887C41.0344 37.8564 39.6574 37.5831 38.4848 37.1749C38.2781 37.1026 38.0749 37.0303 37.8765 36.9556C38.0619 37.2056 38.2472 37.4642 38.4302 37.7338C39.0574 38.6505 39.6265 39.7486 40.1231 41Z" fill="#00BCD4"/> +<path d="M33.7604 53.1654L33.0297 52.462C32.943 52.3798 30.8889 50.3932 28.9749 47.6344L28.8086 47.3967L28.8846 47.1148C29.2684 45.6796 29.4751 44.3524 29.4953 43.1721C29.5155 41.998 29.4549 40.9183 29.3171 39.9624L29.2422 39.4476L30.3091 39.1143L30.5313 39.564C30.9209 40.3558 31.4223 41.1977 32.0187 42.0703H32.0199C32.6757 43.03 33.562 44.0129 34.6562 44.9921L34.8665 45.1808L34.8605 45.4676C34.7869 49.0157 34.0431 52.0404 34.0111 52.169L33.7604 53.1654ZM30.1048 47.1552C31.2108 48.7142 32.3597 50.0157 33.0868 50.7915C33.3018 49.6701 33.6 47.7876 33.6642 45.7238C32.5949 44.7421 31.7146 43.7518 31.0481 42.775C30.9221 42.5924 30.7998 42.4086 30.6821 42.2272C30.6881 42.5422 30.6893 42.8645 30.6833 43.193C30.6631 44.3965 30.4683 45.7262 30.1048 47.1552Z" fill="#00BCD4"/> +<path d="M17.8503 52.8677L17.6625 51.8542C17.6412 51.7365 17.1339 48.952 17.1529 45.6099L17.1541 45.3109L17.3845 45.1283C18.6225 44.1466 19.624 43.1404 20.363 42.1354C21.0532 41.1966 21.6235 40.2885 22.0571 39.4343L22.2983 38.96L23.2488 39.3166L23.2654 39.8522C23.1276 40.7211 23.048 41.7077 23.0301 42.7837C23.0111 43.9076 23.1501 45.1773 23.4436 46.5597L23.5018 46.8343L23.3402 47.0585C21.2065 50.0158 18.727 52.1275 18.6225 52.2157L17.8503 52.8677ZM18.3409 45.9126C18.348 47.7976 18.5263 49.495 18.6653 50.5392C19.523 49.7254 20.9404 48.2853 22.227 46.5426C21.9538 45.1736 21.8243 43.9027 21.8433 42.7592C21.8469 42.5337 21.854 42.3119 21.8623 42.0937C21.6877 42.3523 21.5035 42.6122 21.311 42.8744C20.5554 43.9015 19.5575 44.9224 18.3409 45.9126Z" fill="#00BCD4"/> +<path d="M5.17578 42.9332L5.60467 42.0006C5.65457 41.8915 6.86044 39.2921 8.81715 36.5836L8.9918 36.3421L9.28406 36.3372C10.9188 36.3115 12.3659 36.108 13.5824 35.733C14.6742 35.3984 15.6556 35.0112 16.4979 34.5847L16.9589 34.353L17.5315 35.2122L17.2345 35.657C16.6238 36.2759 15.9954 37.0235 15.3645 37.8802C14.7087 38.7712 14.0945 39.8791 13.5385 41.1733L13.4304 41.4258L13.1761 41.5091C9.67493 42.6624 6.31512 42.8658 6.17374 42.8744L5.17578 42.9332ZM9.5977 37.5554C8.50351 39.1033 7.65881 40.6096 7.16577 41.552C8.36926 41.4123 10.4436 41.0949 12.5631 40.4233C13.1274 39.1499 13.7511 38.0469 14.4188 37.1387C14.5507 36.9598 14.6826 36.7846 14.8144 36.6142C14.5257 36.7159 14.2275 36.8127 13.9222 36.9071C12.6759 37.2919 11.223 37.5089 9.5977 37.5554Z" fill="#00BCD4"/> +<path d="M8.24143 31.0367L7.986 30.9497C4.46462 29.7498 1.59666 27.8404 1.47548 27.7595L0.636719 27.197L1.51706 26.7068C1.62518 26.6467 4.20919 25.2165 7.44543 24.2201L7.72225 24.1343L7.95867 24.3071C9.29285 25.2814 10.5771 25.9996 11.7771 26.4408C12.8511 26.8354 13.8645 27.121 14.7888 27.2913L15.2973 27.3845L15.2616 28.4275L14.7674 28.6052C13.9215 28.7326 12.9853 28.952 11.985 29.2596C10.8979 29.5942 9.7158 30.1469 8.4731 30.8994L8.24143 31.0367ZM3.0342 27.295C4.09751 27.9225 5.98294 28.9459 8.10718 29.6984C9.34631 28.9667 10.5356 28.4238 11.6452 28.0831C11.8543 28.0181 12.061 27.9581 12.2654 27.9017C11.9743 27.8073 11.6785 27.7056 11.3779 27.5953C10.1482 27.1431 8.84971 26.4322 7.51078 25.48C5.6491 26.0744 4.01197 26.8171 3.0342 27.295Z" fill="#00BCD4"/> +<path d="M17.3199 21.5625L16.8185 21.4044C16.0629 20.9914 15.1826 20.5992 14.1989 20.2376C13.056 19.8173 11.6874 19.5329 10.1322 19.3908L9.85776 19.365L9.69975 19.1334C7.58858 16.0486 6.39341 12.8303 6.34351 12.6955L5.98828 11.731L6.97911 11.8719C7.10861 11.8903 10.1916 12.3352 13.4861 13.5877L13.751 13.6894L13.8425 13.9652C14.3486 15.4873 14.9545 16.7913 15.6448 17.838C16.2887 18.8148 16.9421 19.6629 17.5872 20.3578L17.9424 20.7414L17.3199 21.5625ZM10.5148 18.1971C12.0568 18.3564 13.429 18.6542 14.5981 19.0832C14.8036 19.1591 15.0056 19.2364 15.2028 19.3136C15.0222 19.0599 14.8416 18.7976 14.6622 18.5255C13.9553 17.4531 13.334 16.1467 12.8124 14.6392C10.8605 13.9211 8.98454 13.4897 7.86659 13.2703C8.35725 14.4027 9.2673 16.3281 10.5148 18.1971Z" fill="#00BCD4"/> +<path d="M22.262 15.8418L21.7773 15.0096C21.6656 14.8184 21.5895 14.6971 21.5385 14.6199C21.4125 14.5807 21.2854 14.4949 21.1702 14.3453C20.3338 13.2583 19.3192 12.0033 18.1252 10.9493L17.9102 10.7593L17.9173 10.4664C18.0171 6.80563 18.8535 3.63876 18.8891 3.50639L19.1552 2.51123L19.8752 3.22819C19.9595 3.31275 21.9792 5.33617 23.848 8.12802L24.0096 8.36946L23.9288 8.65012C23.4334 10.3831 23.1827 11.969 23.1827 13.3612C23.1827 14.3821 22.8239 14.9704 22.7835 15.0341L22.262 15.8418ZM21.9816 13.4286C21.9852 13.4298 21.9887 13.4311 21.9923 13.4323C21.9923 13.409 21.9923 13.3845 21.9923 13.36C21.9923 11.9273 22.2335 10.3218 22.7087 8.58516C21.6299 7.00785 20.5025 5.68546 19.7885 4.89619C19.5449 6.06048 19.1968 8.04959 19.1137 10.2115C20.2328 11.2385 21.1844 12.3979 21.9816 13.4286Z" fill="#00BCD4"/> +<path d="M30.5465 17.457L29.8776 17.2364C27.7546 16.5379 25.4426 16.5084 23.2934 17.1617L22.8111 17.3087L22.5913 16.8418C22.4701 16.5844 22.3359 16.3185 22.1897 16.0452L22.1185 15.8148C22.0377 15.0537 21.9961 14.2277 21.9961 13.36C21.9961 11.8488 22.2634 10.1465 22.7909 8.30202C23.9302 4.31646 25.8775 1.01845 25.9594 0.87996L26.4822 0L26.9812 0.893441C27.0619 1.03928 28.983 4.50888 30.0903 8.59983C30.5916 10.4517 30.8459 12.1442 30.8459 13.6308C30.8459 14.7596 30.7782 15.8062 30.6475 16.7401L30.5465 17.457ZM26.4667 15.4643C27.511 15.4643 28.547 15.5991 29.5545 15.8662C29.6234 15.1762 29.6578 14.4274 29.6578 13.6333C29.6578 12.2569 29.419 10.6747 28.9462 8.93074C28.2167 6.23571 27.094 3.77231 26.4501 2.47198C25.7967 3.71961 24.6716 6.058 23.9302 8.65008C23.4348 10.383 23.1841 11.9689 23.1841 13.3612C23.1841 14.1382 23.2186 14.8784 23.2863 15.5611C23.3374 15.6591 23.3885 15.7559 23.4372 15.8528C24.4292 15.5942 25.4462 15.4643 26.4667 15.4643Z" fill="#00BCD4"/> +<path d="M35.9252 22.0267L35.5117 21.4421C34.1205 19.4726 32.203 18.0289 29.9671 17.2703L29.3125 17.0472L29.6226 16.4124C30.0717 15.4908 30.6609 14.5128 31.3738 13.509C32.064 12.5359 32.9669 11.564 34.0552 10.6191C37.4506 7.67407 41.5459 5.92641 41.7181 5.85287L42.6424 5.46191L42.5331 6.48649C42.5153 6.65317 42.0793 10.6203 40.6311 14.5949C39.9764 16.3928 39.2125 17.9149 38.3583 19.1185C37.7085 20.034 37.0538 20.8379 36.4147 21.5095L35.9252 22.0267ZM30.9995 16.3523C32.9693 17.1502 34.6908 18.4444 36.0357 20.1381C36.4859 19.6234 36.9433 19.04 37.3996 18.3966C38.1884 17.2825 38.9024 15.8597 39.519 14.1647C40.4719 11.5456 40.9768 8.87758 41.2013 7.43631C39.7959 8.12508 37.1073 9.57126 34.8191 11.5567C33.8033 12.4379 32.9646 13.3387 32.3301 14.2333C31.8157 14.9613 31.369 15.6721 30.9995 16.3523Z" fill="#00BCD4"/> +<path d="M37.6154 28.9753L37.6593 28.2179C37.6593 25.8133 36.937 23.4909 35.5695 21.5214L35.168 20.9429L35.781 20.6193C36.6756 20.1463 37.7104 19.7173 38.8592 19.3423C39.9214 18.9955 41.1391 18.7651 42.4804 18.6584C46.9712 18.3006 51.405 19.4183 51.5904 19.4661L52.561 19.7149L51.885 20.476C51.7722 20.6034 49.0717 23.6232 45.5539 25.9628C44.051 26.9629 42.6135 27.6909 41.284 28.126C40.2148 28.4765 39.224 28.7241 38.3412 28.8625L37.6154 28.9753ZM36.9287 21.4086C38.0632 23.2543 38.7131 25.3451 38.8295 27.5279C39.4758 27.3931 40.1792 27.2019 40.9253 26.958C42.1549 26.556 43.4962 25.8746 44.91 24.9334C47.2421 23.3818 49.2404 21.4785 50.2681 20.4318C48.7082 20.1254 45.6145 19.6401 42.5707 19.8828C41.3209 19.9821 40.1934 20.1941 39.2192 20.5127C38.3852 20.7823 37.6177 21.0838 36.9287 21.4086Z" fill="#00BCD4"/> +<path d="M44.8829 38.0807C44.2259 38.0807 43.5511 38.0587 42.8704 38.0097C41.2059 37.8871 39.7292 37.6064 38.4841 37.1726C37.4433 36.811 36.5036 36.4115 35.6886 35.9862L35.0625 35.6578L35.4795 35.0744C36.8767 33.1184 37.6287 30.7972 37.6536 28.3607L37.6608 27.6499L38.3415 27.7614C39.33 27.9244 40.4111 28.2075 41.5564 28.6046C42.6126 28.9723 43.7258 29.5275 44.8663 30.2579C48.6978 32.7078 51.6358 36.3098 51.7594 36.463L52.4009 37.2547L51.4196 37.4569C51.2723 37.49 48.3544 38.0807 44.8829 38.0807ZM36.841 35.1994C37.454 35.4862 38.13 35.7583 38.8619 36.0132C40.0119 36.4127 41.3889 36.6726 42.9523 36.7878C45.8191 36.9986 48.6585 36.664 50.1377 36.4385C49.0542 35.2399 46.8349 32.964 44.2378 31.3046C43.1745 30.6244 42.1445 30.1084 41.1762 29.7714C40.3458 29.4834 39.5533 29.2591 38.8132 29.101C38.6718 31.2849 37.9994 33.3684 36.841 35.1994Z" fill="#00BCD4"/> +<path d="M42.228 51.3172L41.3204 50.8833C41.154 50.8049 37.2002 48.893 33.8737 45.9136C32.7082 44.8682 31.7565 43.8118 31.0449 42.7725C30.4164 41.8533 29.8854 40.9599 29.4707 40.1155L29.1523 39.4708L29.8212 39.2539C32.0678 38.5247 34.0043 37.1091 35.4217 35.158L35.8363 34.5894L36.3199 35.0943C37.0256 35.8309 37.7348 36.7169 38.4286 37.7317C39.0999 38.7134 39.7046 39.9022 40.225 41.265C41.8526 45.5276 42.152 50.0965 42.1639 50.2877L42.228 51.3172ZM30.8536 40.1804C31.1839 40.7871 31.5736 41.4182 32.0167 42.0653C32.6737 43.025 33.56 44.0079 34.6542 44.9871C36.8984 46.9995 39.5062 48.5364 40.8736 49.2791C40.6895 47.6834 40.2167 44.5876 39.1201 41.7148C38.6342 40.4415 38.0746 39.3397 37.4592 38.4376C36.9543 37.7011 36.4446 37.038 35.9373 36.4596C34.571 38.1374 32.8341 39.4083 30.8536 40.1804Z" fill="#00BCD4"/> +<path d="M25.9698 56.4681L25.4863 55.5648C25.4863 55.5648 25.3057 55.2266 25.0229 54.6371C24.2946 53.1112 22.97 50.0681 22.2797 46.8216C21.9661 45.346 21.8176 43.9807 21.8378 42.7613C21.8568 41.6264 21.9411 40.581 22.0896 39.6532L22.2037 38.9399L22.8666 39.1716C25.0776 39.9474 27.5036 39.9829 29.73 39.2831L30.3893 39.076L30.4903 39.7782C30.6388 40.8016 30.7042 41.9499 30.6828 43.1914C30.6602 44.4758 30.4404 45.9049 30.0282 47.4405C29.2405 50.3721 27.9111 53.0585 27.1887 54.4005C26.7812 55.1542 26.508 55.5991 26.508 55.5991L25.9698 56.4681ZM23.1672 40.5491C23.0876 41.2367 23.0401 41.9843 23.027 42.7821C23.008 43.906 23.147 45.1756 23.4404 46.5581C24.0903 49.6147 25.3318 52.4984 26.0434 54.001C26.0779 53.9373 26.1135 53.8723 26.1504 53.8037C26.8466 52.5107 28.1285 49.9223 28.8841 47.112C29.2678 45.6769 29.4745 44.3496 29.4947 43.1694C29.5102 42.2686 29.4769 41.4229 29.3997 40.6459C27.361 41.1582 25.1928 41.1288 23.1672 40.5491Z" fill="#00BCD4"/> +<path d="M9.90625 50.7179L10.0334 49.6945C10.0583 49.5009 10.644 44.8989 12.4558 40.678C13.0486 39.2956 13.7104 38.1055 14.422 37.1386C15.0861 36.2353 15.7538 35.4424 16.4049 34.783L16.9051 34.2769L17.3078 34.8676C18.6681 36.8628 20.5595 38.3396 22.7811 39.1387L23.431 39.3716L23.1114 40.0015C22.6469 40.9158 22.041 41.8815 21.3115 42.8742C20.5084 43.9662 19.4308 45.0509 18.1097 46.0987C14.7654 48.7496 10.9981 50.2791 10.8389 50.3429L9.90625 50.7179ZM16.7601 36.1618C16.3003 36.6692 15.8334 37.2452 15.3665 37.88C14.7107 38.771 14.0965 39.8789 13.5405 41.1731C12.3121 44.0385 11.6598 47.1662 11.3806 48.7692C12.7077 48.1479 15.1729 46.8806 17.385 45.1268C18.623 44.1452 19.6245 43.139 20.3635 42.134V42.1328C20.8933 41.4146 21.3519 40.7123 21.7321 40.0383C19.7766 39.2049 18.0777 37.8813 16.7601 36.1618Z" fill="#00BCD4"/> +<path d="M8.9163 37.5657C4.92445 37.5657 1.3508 36.5963 1.19635 36.5546L0.230469 36.2887L0.919538 35.5411C1.04666 35.4026 4.07025 32.1389 7.87438 29.8373C9.19906 29.0358 10.4691 28.4438 11.6476 28.081C12.7038 27.7563 13.6958 27.5234 14.5987 27.3886L15.289 27.2856L15.2724 28.2367C15.2724 30.5898 15.9567 32.8546 17.2505 34.7874L17.6425 35.3732L17.0236 35.6869C16.123 36.1428 15.0799 36.5534 13.9251 36.9088C12.604 37.3157 11.05 37.5363 9.30598 37.5633C9.17411 37.5645 9.04461 37.5657 8.9163 37.5657ZM2.53529 35.6134C3.93124 35.9137 6.57109 36.3904 9.2846 36.3365C10.9194 36.3107 12.3664 36.1073 13.583 35.7323C14.4217 35.4749 15.194 35.1881 15.8878 34.8756C14.7853 33.0127 14.1699 30.9072 14.0915 28.7196C13.4321 28.8482 12.7264 29.0284 11.9862 29.2564C10.8992 29.5909 9.71705 30.1437 8.47435 30.8962C5.90341 32.449 3.65562 34.5128 2.53529 35.6134Z" fill="#00BCD4"/> +<path d="M15.2598 28.6191L14.5814 28.4941C13.5918 28.3127 12.5154 28.0088 11.3796 27.5921C10.0775 27.1129 8.69581 26.3432 7.27252 25.3039C3.89133 22.8307 1.41543 19.6859 1.31088 19.5523L0.683594 18.7496L1.6673 18.5645C1.84075 18.5327 5.95141 17.774 10.2343 18.1687C11.8893 18.3206 13.3553 18.627 14.5945 19.0817C15.6316 19.4629 16.5655 19.8796 17.3709 20.3196L17.9911 20.6578L17.5658 21.2326C16.1354 23.1641 15.3441 25.4706 15.2788 27.9071L15.2598 28.6191ZM2.9302 19.6099C3.8842 20.7032 5.73756 22.6788 7.95921 24.3051C9.29339 25.2794 10.5777 25.9976 11.7776 26.4376C12.6021 26.7403 13.3898 26.9793 14.1299 27.1509C14.307 24.9681 15.0162 22.8969 16.2043 21.088C15.5972 20.7902 14.9248 20.5046 14.1965 20.2374C13.0536 19.8171 11.6849 19.5327 10.1298 19.3906C7.26183 19.1258 4.41288 19.4114 2.9302 19.6099Z" fill="#00BCD4"/> +<path d="M17.2 21.7173L16.7248 21.205C16.0345 20.4611 15.3383 19.5603 14.6576 18.5271C13.9079 17.3886 13.2533 15.9877 12.7139 14.3626C11.3465 10.2496 11.1445 6.08145 11.1362 5.90619L11.0898 4.87549L11.9892 5.3265C12.1389 5.40248 15.7173 7.2102 18.8953 10.018C20.2533 11.2178 21.3403 12.4299 22.1245 13.6199C22.5343 14.2438 22.9038 14.859 23.2222 15.4522C23.3802 15.7463 23.524 16.0319 23.6547 16.3088L23.9612 16.9596L23.2887 17.1643C21.0338 17.8518 19.0747 19.2331 17.6217 21.1584L17.2 21.7173ZM12.4098 6.93813C12.5571 8.4321 12.9337 11.2436 13.839 13.9643C14.3451 15.4865 14.951 16.7905 15.6413 17.8371C16.1355 18.586 16.6345 19.26 17.1311 19.8458C18.5258 18.1913 20.2842 16.951 22.2753 16.2157C22.2456 16.1593 22.2159 16.1029 22.185 16.0453C21.8833 15.484 21.5328 14.9007 21.1431 14.3075C20.4184 13.2081 19.4014 12.0769 18.1231 10.9482C16.0155 9.08533 13.6762 7.65508 12.4098 6.93813Z" fill="#00BCD4"/> +</svg> diff --git a/src/img/subject_icons/subject_educacao-especial.svg b/src/img/subject_icons/subject_educacao-especial.svg new file mode 100644 index 0000000000000000000000000000000000000000..0751851245725cec37e928296c7c4460a9097331 --- /dev/null +++ b/src/img/subject_icons/subject_educacao-especial.svg @@ -0,0 +1,8 @@ +<svg width="56" height="57" viewBox="0 0 56 57" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M13.2161 24.6992C15.2407 24.6992 16.8971 23.0024 16.8971 20.9287C16.8971 18.8549 15.2407 17.1582 13.2161 17.1582C11.1916 17.1582 9.53516 18.8549 9.53516 20.9287C9.53516 23.0024 11.1916 24.6992 13.2161 24.6992ZM13.2161 18.6664C14.5045 18.6664 15.5168 19.7033 15.5168 21.0229C15.5168 22.3426 14.5045 23.3795 13.2161 23.3795C11.9278 23.3795 10.9155 22.3426 10.9155 21.0229C10.9155 19.7033 11.9278 18.6664 13.2161 18.6664Z" fill="#00BCD4"/> +<path d="M13.767 41.9472C13.2148 43.4554 11.8345 44.4923 10.27 44.4923C8.2455 44.4923 6.49704 42.7956 6.49704 40.6276C6.49704 39.0251 7.50931 37.5169 8.9817 37.0456L9.44183 36.8571V32.3325L8.6136 32.521C4.84059 33.2751 2.17188 36.6686 2.17188 40.6276C2.17188 45.1521 5.76084 48.9226 10.27 48.9226C14.1351 48.9226 17.448 46.0948 18.1842 42.3243L18.3682 41.4759H13.951L13.767 41.9472ZM14.8713 42.8899H16.5277C15.6075 45.6235 13.0308 47.5087 10.178 47.5087C6.49703 47.5087 3.46022 44.398 3.46022 40.6276C3.46022 37.7054 5.30071 35.0661 7.96943 34.1235V35.8202C6.22096 36.6686 5.02464 38.5538 5.02464 40.5333C5.02464 43.4554 7.32526 45.812 10.178 45.812C12.2026 45.9062 14.0431 44.6808 14.8713 42.8899Z" fill="#00BCD4"/> +<path d="M23.4309 30.8224C21.4984 30.8224 19.3818 29.7855 18.0014 28.2773L16.0689 26.1093C15.7928 25.8265 15.4247 25.5438 15.0566 25.261L14.9646 25.1667H14.8726C14.2284 24.8839 13.5842 24.6954 12.848 24.7897C11.0076 24.9782 9.53516 26.6749 9.53516 28.6544V37.6093C9.53516 39.683 11.1916 41.3798 13.2161 41.3798H19.9339V48.9207H24.2591V39.8716C24.2591 37.7978 22.6027 36.1011 20.5781 36.1011H16.8051V32.9904C18.8296 34.4044 21.4063 35.2527 23.5229 35.2527H24.2591V30.8224H23.4309C23.4309 30.8224 23.5229 30.8224 23.4309 30.8224ZM22.8787 33.8388C20.7622 33.6503 18.3695 32.6134 16.6211 31.1052L15.4247 30.1626V37.6093H20.5781C21.8665 37.6093 22.8787 38.6462 22.8787 39.9658V47.601H21.3143V40.0601H13.2161C11.9278 40.0601 10.9155 39.0232 10.9155 37.7035V28.7487C10.9155 27.5233 11.8358 26.3921 12.9401 26.2978C13.4002 26.2036 13.8603 26.3921 14.3204 26.5806L14.4125 26.6749H14.5045C14.6885 26.7692 14.8726 26.9577 15.0566 27.1462L16.9892 29.3142C18.4616 31.0109 20.6701 32.1421 22.7867 32.3306V33.8388H22.8787Z" fill="#00BCD4"/> +<path d="M39.3473 28.4677L43.1203 33.0866L46.8013 30.4472L40.3596 22.2464L39.6234 21.3981C39.1632 20.8325 38.7031 20.2669 38.243 19.7014C37.5068 18.853 36.5865 18.6645 35.7583 18.6645C35.6663 18.6645 35.6663 18.6645 35.5743 18.6645C37.5068 18.6645 39.1632 16.9678 39.1632 14.894C39.1632 12.8202 37.5068 11.1235 35.4823 11.1235C33.4577 11.1235 31.8013 12.8202 31.8013 14.894C31.8013 16.9678 33.3657 18.5702 35.3902 18.6645C33.6418 18.6645 32.3534 19.3243 31.7092 20.644L27.6602 28.2792L28.7645 35.8202L32.8135 34.312L32.0773 29.5989L33.2737 27.5251L33.4577 34.689L28.4884 48.2627L33.4577 49.7709L38.9792 35.0661L39.3473 28.4677ZM33.1816 14.894C33.1816 13.5743 34.1939 12.5375 35.4823 12.5375C36.7706 12.5375 37.7829 13.5743 37.7829 14.894C37.7829 16.2137 36.7706 17.2506 35.4823 17.2506C34.1939 17.2506 33.1816 16.2137 33.1816 14.894ZM37.6908 34.5948L32.6295 47.9799L30.3289 47.2258L34.8381 34.8775L34.47 22.6235L30.6049 29.2218L31.2491 33.2751L29.8687 33.7464L29.0405 28.3735L32.9056 21.2096C33.5497 19.9842 35.0221 19.9842 35.6663 19.9842C36.4945 19.9842 36.8626 20.1727 37.2307 20.5497C37.6908 21.1153 38.151 21.6809 38.6111 22.2464L44.7767 30.1644L43.3964 31.2013L37.8749 24.3202L36.7706 25.2628L38.0589 26.8653L37.6908 34.5948Z" fill="#00BCD4"/> +<path d="M37.2344 40.9087L40.4552 49.8636L44.5963 48.1669L39.535 34.9702L37.2344 40.9087ZM42.7559 47.3185L41.1914 47.9784L38.6147 40.9087L39.3509 38.835L42.7559 47.3185Z" fill="#00BCD4"/> +<path d="M53.9812 47.7915L45.5149 32.7096C45.3309 32.3325 44.8707 32.2383 44.5947 32.4268C44.2266 32.6153 44.1345 33.0866 44.3186 33.3694L52.8769 48.5456L53.0609 48.7341C53.153 48.8284 53.337 48.9226 53.5211 48.9226C53.7051 48.9226 53.8892 48.8284 53.9812 48.7341C54.2573 48.5456 54.2573 48.0743 53.9812 47.7915Z" fill="#00BCD4"/> +</svg> diff --git a/src/img/subject_icons/subject_educacao-fisica.svg b/src/img/subject_icons/subject_educacao-fisica.svg new file mode 100644 index 0000000000000000000000000000000000000000..5ef2e5bcb9b0bfdc4a88695334eb98d2d9637b84 --- /dev/null +++ b/src/img/subject_icons/subject_educacao-fisica.svg @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <g> + <path class="st1" d="M38.6,47.7h-5.3V36.6l-3.9-5.2l-3,8.5l-11,4.8l-3-4.3l9.3-5.5l4.9-19.2l-2.6,0.8v7.9h-5.3V12.2l12.1-3.8 + l1.2-0.2c1.5,0,2.9,0.8,3.7,2.1l4,6.7h8v5.3H36l-1.6-2.6l-1,4l5.2,9.5V47.7z M34.8,46.2h2.3V33.6l-5.3-9.7l2.1-8.1l3,5H46v-2.3 + h-7.3l-4.4-7.4c-0.5-0.9-1.4-1.4-2.4-1.4l-0.9,0.1L20,13.3V23h2.3v-7.5l6.3-2l-5.7,22.4l-8.4,5l1.4,2l9.3-4.1l3.7-10.5l5.9,7.9 + V46.2z M36.2,9.3c-2.5,0-4.5-2-4.5-4.5s2-4.5,4.5-4.5s4.5,2,4.5,4.5S38.7,9.3,36.2,9.3z M36.2,1.7c-1.7,0-3,1.3-3,3 + c0,1.7,1.3,3,3,3c1.7,0,3-1.3,3-3C39.2,3,37.9,1.7,36.2,1.7z"/> + </g> + <g> + <rect x="4.5" y="12.4" class="st1" width="10.6" height="1.5"/> + </g> + <g> + <rect x="6.6" y="20.9" class="st1" width="8.4" height="1.5"/> + </g> + <g> + <rect x="8.7" y="29.3" class="st1" width="10.6" height="1.5"/> + </g> +</g> +</svg> diff --git a/src/img/subject_icons/subject_educacao-indigena.svg b/src/img/subject_icons/subject_educacao-indigena.svg new file mode 100644 index 0000000000000000000000000000000000000000..d38c4c31fe4fbe96409459aa68c4c87696ed0a14 --- /dev/null +++ b/src/img/subject_icons/subject_educacao-indigena.svg @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="10 0.1 72 47.7" style="enable-background:new 10 0.1 72 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#29C3CE;} +</style> +<rect x="10" y="0.1" class="st0" width="72" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<path class="st1" d="M78.1,26.8c-0.2-0.2-0.4-0.3-0.7-0.3l-4-0.1c-0.3,0-0.5,0.1-0.7,0.3l-8.1,7.9c-0.2,0.2-0.3,0.4-0.3,0.7l-0.1,4 + c0,0.1,0,0.1,0,0.2l-0.7,0.7c-0.9-3.1-3-5.4-6.2-6.8l0.3-0.7c0.1,0,0.1,0,0.2,0l3.7-1.5c0.2-0.1,0.4-0.3,0.5-0.5l4.5-10.4 + c0.1-0.2,0.1-0.5,0-0.7L65,15.9c-0.2-0.5-0.8-0.7-1.3-0.5L60,16.9c-0.2,0.1-0.4,0.3-0.5,0.5L55,27.8c-0.1,0.2-0.1,0.5,0,0.7l1.5,3.7 + c0,0.1,0.1,0.1,0.1,0.2l-0.3,0.7c-2.7-1-6.1-1.6-10.2-1.6v-1.7c0.2-0.1,0.3-0.2,0.5-0.3l3.9-3.8c0.3-0.3,0.4-0.6,0.4-1l0.2-15.5 + c0-0.4-0.1-0.7-0.4-1l-3.8-3.9c-0.3-0.3-0.6-0.4-1-0.4s-0.7,0.1-1,0.4l-3.7,3.6c-0.3,0.3-0.4,0.6-0.4,1l-0.2,15.5 + c0,0.4,0.1,0.7,0.4,1l3.8,3.9c0.1,0.1,0.3,0.2,0.5,0.3v1.7c-4,0-7.4,0.6-10,1.6l-0.2-0.5c0-0.1,0.1-0.1,0.1-0.2l1.6-3.7 + c0.1-0.2,0.1-0.5,0-0.7l-4.2-10.5c-0.1-0.2-0.3-0.4-0.5-0.5l-3.7-1.6c-0.5-0.2-1.1,0-1.3,0.5l-1.6,3.7c-0.1,0.2-0.1,0.5,0,0.7 + l4.2,10.5c0.1,0.2,0.3,0.4,0.5,0.5l3.7,1.6c0.1,0,0.1,0,0.2,0l0.2,0.5C31,34.7,28.9,36.9,28,40l-0.4-0.4c0-0.1,0-0.1,0-0.2l0.1-4 + c0-0.3-0.1-0.5-0.3-0.7l-7.9-8.1c-0.2-0.2-0.4-0.3-0.7-0.3l-4-0.1c-0.2,0-0.5,0.1-0.7,0.3c-0.2,0.2-0.3,0.4-0.3,0.7l-0.1,4 + c0,0.3,0.1,0.5,0.3,0.7l7.9,8.1c0.2,0.2,0.4,0.3,0.7,0.3l4,0.1c0.1,0,0.1,0,0.2,0l0.9,0.9c-0.2,0.8-0.3,1.7-0.3,2.7h2 + c0-7.1,5.3-10.6,16.3-10.6S62.1,36.9,62.1,44h2c0-0.9-0.1-1.8-0.2-2.7l1.1-1.1c0.1,0,0.1,0,0.2,0l4,0.1c0.3,0,0.5-0.1,0.7-0.3 + l8.1-7.9c0.2-0.2,0.3-0.4,0.3-0.7l0.1-4C78.3,27.2,78.2,27,78.1,26.8z M14.7,31.4l0.1-4.1l4,0.1l4.9,5.1l-0.1,3.3l-3.1-3.2l-3.1-3.2 + c-0.2-0.2-0.5-0.2-0.7,0s-0.2,0.5,0,0.7l2.2,2.3l-3.3-0.1L14.7,31.4z M22.6,39.4l-6-6.1l3.3,0.1l3.8,4l2.1,2.2L22.6,39.4z + M26.6,38.8l-2-2.1l0.1-3.3l2,2L26.6,38.8z M26.4,19.7l1.5-3.6l3.7,1.6l0.5,1.3L32,19.1l-1.2,2.8l-1.2-3c-0.1-0.3-0.4-0.4-0.6-0.3 + c-0.3,0.1-0.4,0.4-0.3,0.6l3.3,8.3l-3-1.3L26.4,19.7z M30.6,30.3l-1-2.6l3,1.3l1,2.6L30.6,30.3z M33.4,28.3l-2-5.1l1.3-3l3.2,7.9 + l-1.4,3.1L33.4,28.3z M49.7,24.4l-3.4,3.3l0.1-4l3.4-3.3L49.7,24.4z M45.5,23.4l-0.1,4.3l-3.3-3.3l0.2-12l3.3,3.4L45.5,23.4z + M45.6,9.5l-0.1,4.8l-3.3-3.4V8.8l3.9-3.6l3.8,3.9L49.8,19l-3.4,3.2l0.2-12.7c0-0.3-0.2-0.5-0.5-0.5S45.6,9.2,45.6,9.5z M61.2,30.3 + l-3.1,1.2l1.1-2.6l3-1.2L61.2,30.3z M60.5,17.7l3.7-1.5l1.5,3.7l-2.8,6.5l-3,1.2l3.5-8.2c0.1-0.3,0-0.5-0.3-0.7 + c-0.3-0.1-0.5,0-0.7,0.3l-1.2,2.9l-1.2-3L60.5,17.7z M56,28l3.4-7.9l1.2,3l-3.4,7.8L56,28z M65.3,35.3l2-2l-0.1,3.3l-2,2L65.3,35.3z + M69.2,39.3h-3.3l6.2-6l3.3,0.1L69.2,39.3z M77.3,31.5l-1,0.9h-0.1h-3.1l2.3-2.2c0.2-0.2,0.2-0.5,0-0.7s-0.5-0.2-0.7,0l-6.4,6.2 + l0.1-3.3l5-4.9h4L77.3,31.5z"/> +</svg> diff --git a/src/img/subject_icons/subject_educacao-quilombola.svg b/src/img/subject_icons/subject_educacao-quilombola.svg new file mode 100644 index 0000000000000000000000000000000000000000..96bf2a8f4404a5fb11edc91dc4816c8605a2544d --- /dev/null +++ b/src/img/subject_icons/subject_educacao-quilombola.svg @@ -0,0 +1,16 @@ +<svg width="56" height="57" viewBox="0 0 56 57" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M27.5148 24.708C21.0731 24.708 16.0117 21.6917 16.0117 17.8269C16.0117 13.9622 21.0731 10.9458 27.5148 10.9458C29.1712 10.9458 30.7357 11.1343 32.2081 11.5114L31.84 12.9253C30.4596 12.5483 28.9872 12.3597 27.4228 12.3597C21.9013 12.3597 17.3001 14.8106 17.3001 17.8269C17.3001 20.8433 21.9933 23.2941 27.4228 23.2941C32.9443 23.2941 37.5455 20.8433 37.5455 17.8269C37.5455 16.6015 36.7173 15.5647 35.9811 14.9991L36.9013 13.8679C38.2817 14.9991 38.9259 16.413 38.9259 17.8269C39.0179 21.7859 33.9565 24.708 27.5148 24.708Z" fill="#00BCD4"/> +<path d="M27.6068 46.1051C22.8216 46.1051 19.1406 43.9371 19.1406 41.1092L16.0117 18.5806L17.3921 18.3921L20.521 41.1092C20.521 42.8059 23.4657 44.7854 27.6989 44.7854C31.6559 44.7854 34.8768 43.183 34.8768 41.1092L35.797 33.6625L37.8216 18.3921L39.202 18.5806L36.2571 41.2035C36.1651 43.9371 32.4841 46.1051 27.6068 46.1051Z" fill="#00BCD4"/> +<path d="M27.5164 47.897C21.6269 47.897 16.9336 45.1634 16.9336 41.77C16.9336 40.4503 17.6698 39.2249 19.0502 38.0938L19.6023 38.8478C18.7741 39.5077 17.8538 40.5446 17.8538 41.77C17.8538 44.5978 22.271 46.9544 27.5164 46.9544C32.7618 46.9544 37.179 44.5978 37.179 41.77C37.179 40.4503 36.2588 39.5077 35.4306 38.8478L35.9827 38.0938C37.3631 39.2249 38.0993 40.4503 38.0993 41.77C38.0993 45.1634 33.406 47.897 27.5164 47.897Z" fill="#00BCD4"/> +<path d="M27.5164 51.856C21.6269 51.856 16.9336 49.1224 16.9336 45.729H17.8538C17.8538 48.5569 22.271 50.9134 27.5164 50.9134C32.7618 50.9134 37.179 48.5569 37.179 45.729H38.0993C38.0993 49.1224 33.406 51.856 27.5164 51.856Z" fill="#00BCD4"/> +<path d="M38.096 41.8638H37.1758V45.7285H38.096V41.8638Z" fill="#00BCD4"/> +<path d="M27.8829 21.8798L27.0547 21.5028L34.6007 6.04385C35.4289 4.53566 37.1774 3.97007 38.5578 4.72416C39.2019 5.10121 39.7541 5.76107 40.0302 6.51516C40.3063 7.26926 40.2142 8.11761 39.8461 8.77744L34.0486 20.7487L33.2204 20.3716L39.0179 8.4004C39.294 7.92909 39.294 7.36351 39.1099 6.8922C38.9259 6.42089 38.5578 5.94957 38.0977 5.66678C37.6375 5.384 37.0854 5.38402 36.6253 5.57254C36.1652 5.76107 35.705 6.13809 35.4289 6.6094L27.8829 21.8798Z" fill="#00BCD4"/> +<path d="M32.9433 17.7331C32.8513 17.7331 32.7592 17.7331 32.7592 17.6388C32.5752 17.5446 32.4831 17.2618 32.5752 16.979L38.3727 5.00774C38.4648 4.81922 38.7408 4.72494 39.0169 4.8192C39.2009 4.91347 39.293 5.19626 39.201 5.47905L33.4034 17.4503C33.3114 17.6388 33.1273 17.7331 32.9433 17.7331Z" fill="#00BCD4"/> +<path d="M17.8538 41.7686H16.9336V45.7275H17.8538V41.7686Z" fill="#00BCD4"/> +<path d="M34.7882 27.0641C34.5122 27.0641 34.3281 26.8756 34.3281 26.5928V22.9166C34.3281 22.6338 34.5122 22.4453 34.7882 22.4453C35.0643 22.4453 35.2484 22.6338 35.2484 22.9166V26.5928C35.2484 26.8756 35.0643 27.0641 34.7882 27.0641Z" fill="#00BCD4"/> +<path d="M20.4289 27.0632C20.1528 27.0632 19.9688 26.8746 19.9688 26.5919V22.9156C19.9688 22.6329 20.1528 22.4443 20.4289 22.4443C20.7049 22.4443 20.889 22.6329 20.889 22.9156V26.5919C20.889 26.8746 20.7049 27.0632 20.4289 27.0632Z" fill="#00BCD4"/> +<path d="M27.5148 33.2861C27.2387 33.2861 27.0547 33.0976 27.0547 32.8148V24.1427C27.0547 23.8599 27.2387 23.6714 27.5148 23.6714C27.7909 23.6714 27.9749 23.8599 27.9749 24.1427V32.8148C27.9749 33.0976 27.7909 33.2861 27.5148 33.2861Z" fill="#00BCD4"/> +<path d="M27.5148 45.6339C27.2387 45.6339 27.0547 45.4453 27.0547 45.1626V39.9781C27.0547 39.6954 27.2387 39.5068 27.5148 39.5068C27.7909 39.5068 27.9749 39.6954 27.9749 39.9781V45.1626C27.9749 45.4453 27.7909 45.6339 27.5148 45.6339Z" fill="#00BCD4"/> +<path d="M31.4718 45.3519C31.1958 45.3519 31.0117 45.1634 31.0117 44.8806V36.6798C31.0117 36.397 31.1958 36.2085 31.4718 36.2085C31.7479 36.2085 31.932 36.397 31.932 36.6798V44.8806C31.932 45.1634 31.7479 45.3519 31.4718 45.3519Z" fill="#00BCD4"/> +<path d="M27.5145 22.1637C22.3611 22.1637 18.4961 19.9015 18.4961 17.922C18.4961 15.9425 22.3611 13.6802 27.5145 13.6802C28.7108 13.6802 29.9072 13.7745 30.9194 14.0572L30.7354 14.9999C29.7231 14.8113 28.6188 14.6228 27.5145 14.6228C22.5452 14.6228 19.4163 16.7908 19.4163 17.922C19.4163 19.0531 22.5452 21.2211 27.5145 21.2211C32.4838 21.2211 35.6127 19.0531 35.6127 17.922C35.6127 17.6392 35.4286 17.3564 35.1526 17.0736L35.7967 16.4138C36.2569 16.9794 36.5329 17.4507 36.5329 18.0162C36.5329 19.9015 32.6679 22.1637 27.5145 22.1637Z" fill="#00BCD4"/> +</svg> diff --git a/src/img/subject_icons/subject_educacao-sexual.svg b/src/img/subject_icons/subject_educacao-sexual.svg new file mode 100644 index 0000000000000000000000000000000000000000..3bbf3fd29279b0ea0c4cd40f607480cff8db48a6 --- /dev/null +++ b/src/img/subject_icons/subject_educacao-sexual.svg @@ -0,0 +1,7 @@ +<svg width="56" height="57" viewBox="0 0 56 57" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M37.0224 35.2511C36.7951 35.2511 36.5605 35.2313 36.323 35.1993L36.15 35.1701C35.9209 35.1295 35.7644 35.1003 35.6052 35.0607C35.5086 35.0372 35.4065 35.0079 35.3062 34.9797C35.1644 34.9382 35.0236 34.8939 34.8819 34.8458C34.7724 34.809 34.6629 34.7695 34.5525 34.728C34.419 34.6771 34.2865 34.6215 34.1522 34.564L34.074 34.531C33.9819 34.4923 33.8908 34.4537 33.7979 34.4113C33.7086 34.3707 33.6203 34.3255 33.531 34.2812L33.4399 34.235C33.1298 34.0813 32.8169 33.9154 32.5031 33.7345L32.3871 33.6704C32.2206 33.5723 32.0549 33.4686 31.8884 33.3649L31.7163 33.2603C30.6552 32.5826 29.5279 31.7465 28.3684 30.7756L28.2727 30.6926C28.0187 30.4768 27.8108 30.2986 27.6083 30.1223L25.1172 27.7978L26.9025 25.8438L27.1601 26.0182C27.5862 26.4348 28.0611 26.8854 28.569 27.3482L29.4939 28.1664C29.6512 28.3031 29.8104 28.4379 29.9715 28.5727C31.189 29.5992 32.3319 30.4485 33.369 31.097C33.9166 31.4354 34.4062 31.7059 34.8644 31.9209C35.0513 32.0085 35.1902 32.0688 35.3264 32.1235L35.3181 32.4855L35.4368 32.1669C35.5519 32.2112 35.666 32.2536 35.7782 32.2904L35.9006 32.3271C36.0562 32.3733 36.1371 32.3978 36.2154 32.4167C36.2835 32.4327 36.3497 32.444 36.4151 32.4553L36.5098 32.4742C36.5513 32.4827 36.5936 32.4921 36.6332 32.4959C36.9994 32.5439 37.3307 32.5222 37.6648 32.4902L37.87 32.4647C38.0089 32.4459 38.1506 32.4261 38.2905 32.3988C38.3697 32.3837 38.4451 32.3667 38.5215 32.3479C38.6513 32.3186 38.7783 32.2847 38.9043 32.2479L39.1307 32.1782C39.2595 32.1348 39.3865 32.0858 39.5135 32.0349L39.7086 31.9576C39.8881 31.8775 40.0638 31.7917 40.235 31.6975L40.4347 31.5768C40.5378 31.5146 40.6436 31.4514 40.7457 31.3826C40.8194 31.3327 40.8902 31.2808 40.962 31.228C41.0678 31.1498 41.146 31.0904 41.2243 31.0273C41.3062 30.9613 41.389 30.8906 41.47 30.8189L41.631 30.67C41.7654 30.5409 41.8399 30.4692 41.9108 30.3948L42.0516 30.2355C42.3488 29.8999 42.6157 29.5332 42.843 29.1486L42.924 29.0129C42.993 28.8894 43.0565 28.765 43.1172 28.6396L43.1918 28.4803C43.2497 28.3521 43.3059 28.2211 43.3574 28.0872L43.4089 27.9439C43.4605 27.8007 43.5102 27.6564 43.5516 27.5103C43.7365 26.8637 43.8304 26.2058 43.8304 25.5535C43.8304 21.7085 40.777 18.58 37.0233 18.58C36.1178 18.58 34.8893 19.0607 33.3718 20.008L33.1022 20.1768L32.9236 19.9091C32.5601 19.3652 32.1378 18.8496 31.6638 18.3764L31.3601 18.0728L31.7209 17.8428C33.796 16.5222 35.5795 15.852 37.0243 15.852C39.5678 15.852 42.0249 16.9247 43.8083 18.8053L47.7764 16.4666L45.4869 15.8643C45.1418 15.7728 44.8528 15.5504 44.6715 15.2365C44.4902 14.9226 44.4387 14.555 44.528 14.2024C44.7102 13.4747 45.4408 13.0345 46.1494 13.2202L51.7252 14.7105C51.7988 14.7378 51.8835 14.7793 51.9617 14.8293C52.0243 14.8698 52.0795 14.9094 52.1338 14.9584C52.2148 15.0291 52.2912 15.1168 52.3574 15.2148L52.4154 15.2893C52.5056 15.4476 52.5626 15.6249 52.5856 15.8153L52.5902 15.9171L52.258 15.9482L52.5902 15.9387L52.258 15.9482L52.593 15.9802V16.0632C52.5866 16.1669 52.5691 16.2734 52.5378 16.3771L51.0994 21.8895C50.9135 22.6012 50.1599 23.0423 49.4697 22.8557C49.1255 22.7614 48.8375 22.5361 48.6599 22.2204C48.4813 21.9046 48.4344 21.537 48.5255 21.1854L49.1458 18.8071L45.3902 21.0223C46.1154 22.4202 46.4982 23.9802 46.4982 25.5544C46.4982 26.2482 46.4181 26.9646 46.2617 27.6819C46.0915 28.4511 45.8273 29.2023 45.4758 29.914L45.4316 30.0064C45.3359 30.1959 45.2301 30.3806 45.1224 30.5625L45.0065 30.7577C44.9034 30.9236 44.7948 31.0857 44.6807 31.2459L44.5197 31.4656C44.4083 31.6136 44.2942 31.7597 44.1737 31.902L44.0062 32.0905C43.8525 32.2602 43.7319 32.3922 43.604 32.5185C43.5507 32.5713 43.4945 32.6222 43.4375 32.674L43.3684 32.7381C43.2157 32.8804 43.1025 32.987 42.9838 33.0859C42.9083 33.1472 42.8319 33.2047 42.7556 33.2622L42.6727 33.3235C42.4638 33.4828 42.2494 33.6355 42.0267 33.7769C41.8537 33.8881 41.7387 33.9616 41.6218 34.0304C41.5362 34.0785 41.4525 34.1219 41.3687 34.1652L41.2804 34.2105C41.135 34.2859 40.9914 34.3585 40.8433 34.4263C40.7421 34.4735 40.6381 34.5149 40.5359 34.5564C40.3372 34.6375 40.1807 34.6959 40.0206 34.7515C39.9046 34.7911 39.7868 34.8288 39.6672 34.8647C39.4988 34.9156 39.3295 34.9589 39.1565 35.0004L39.0672 35.0211C38.9825 35.0409 38.8988 35.0607 38.8132 35.0786C38.6191 35.1163 38.423 35.1446 38.2252 35.171L38.1341 35.1842C38.066 35.1946 37.9988 35.204 37.9298 35.2106C37.6307 35.2332 37.3289 35.2511 37.0224 35.2511ZM32.8316 33.1406C33.1325 33.315 33.4325 33.4743 33.7316 33.6223L33.8255 33.6694C33.9083 33.7109 33.9902 33.7524 34.073 33.7901C34.1586 33.8297 34.2442 33.8655 34.3279 33.9004L34.4098 33.9352C34.5359 33.989 34.6592 34.0408 34.7844 34.0889C34.8865 34.1275 34.9896 34.1633 35.0917 34.1982C35.2261 34.2444 35.3577 34.2849 35.4884 34.3236C35.5795 34.349 35.6715 34.3764 35.7626 34.3971C35.908 34.4339 36.0506 34.4593 36.1905 34.4848L36.4132 34.5244C36.9074 34.5885 37.3924 34.5724 37.8663 34.5253C37.9243 34.5197 37.9813 34.5112 38.0384 34.5036L38.1387 34.4886C38.3237 34.464 38.5068 34.4386 38.6871 34.4028C38.7645 34.3877 38.8399 34.3698 38.9163 34.3509L39.0074 34.3302C39.1657 34.2925 39.3249 34.251 39.4813 34.2039C39.5927 34.1718 39.7013 34.136 39.8089 34.0993C39.9571 34.0483 40.1025 33.9937 40.246 33.9352C40.3841 33.8787 40.4789 33.84 40.5718 33.7976C40.7089 33.7354 40.8442 33.6656 40.9776 33.5968L41.0687 33.5497C41.1451 33.5111 41.2215 33.4715 41.296 33.429C41.4019 33.3687 41.5077 33.2999 41.6135 33.232C41.8804 33.0614 42.081 32.92 42.2752 32.7711L42.3635 32.7061C42.4307 32.6552 42.4988 32.6052 42.5641 32.5515C42.6709 32.461 42.7749 32.3648 42.8798 32.2668L42.9957 32.1593C43.0454 32.115 43.0933 32.0707 43.1402 32.0236C43.2608 31.9048 43.3721 31.7832 43.4835 31.6588L43.6703 31.4477C43.7807 31.3166 43.8875 31.1809 43.9915 31.0423L44.1424 30.8359C44.2473 30.6889 44.3494 30.538 44.4451 30.3844L44.5206 30.2571C44.6531 30.0328 44.7507 29.8603 44.8418 29.684L45.1777 29.7547L44.8804 29.6011C45.2071 28.9384 45.4528 28.2409 45.6102 27.5283C45.7565 26.8599 45.8301 26.1944 45.8301 25.5487C45.8301 23.9812 45.4224 22.4287 44.6503 21.0591L44.4838 20.7631L50.2013 17.3913L49.1678 21.356C49.1218 21.5322 49.1458 21.7151 49.2341 21.8735C49.3224 22.0318 49.4669 22.144 49.639 22.1911C49.9832 22.2873 50.3605 22.0648 50.4543 21.7076L51.8945 16.1848C51.9139 16.1216 51.9221 16.0688 51.9249 16.0179L52.2543 15.9416L51.9221 15.9519L51.9212 15.9114C51.9102 15.7936 51.8817 15.705 51.8356 15.6249C51.7731 15.5466 51.7363 15.5042 51.6958 15.4674C51.6663 15.441 51.6378 15.4212 51.6074 15.4024C51.5697 15.3779 51.5264 15.3572 51.4813 15.3402L51.3884 15.2949L45.9819 13.8754C45.6249 13.7801 45.2623 14.0017 45.1712 14.3665C45.1261 14.5437 45.1519 14.7265 45.2421 14.884C45.3332 15.0414 45.4777 15.1526 45.6497 15.1978L49.5231 16.2178L43.6795 19.6621L43.4991 19.4613C41.8289 17.5987 39.4675 16.5298 37.0224 16.5298C35.7847 16.5298 34.2405 17.0897 32.4276 18.1954C32.7396 18.5328 33.0286 18.8882 33.2908 19.2568C34.7954 18.3519 36.0497 17.8937 37.0224 17.8937C41.1442 17.8937 44.4967 21.3286 44.4967 25.5497C44.4967 26.268 44.3936 26.99 44.1911 27.6979C44.1442 27.8591 44.0908 28.0156 44.0347 28.1721L43.9776 28.3304C43.9197 28.4803 43.8589 28.6236 43.7954 28.765L43.7126 28.9403C43.6473 29.0779 43.5773 29.2146 43.5019 29.3494L43.4347 29.4634C43.1632 29.9216 42.8715 30.3231 42.543 30.6926L42.3875 30.868C42.3092 30.9509 42.2283 31.0291 42.1482 31.1064L41.9053 31.3336C41.816 31.4118 41.7267 31.4873 41.6356 31.5608C41.5482 31.6305 41.4617 31.6984 41.3733 31.7625C41.2721 31.837 41.193 31.8963 41.1102 31.951C40.9988 32.0255 40.8847 32.0952 40.7687 32.165L40.5516 32.296C40.362 32.3997 40.1706 32.4949 39.9727 32.5826L39.8365 32.6382C39.6212 32.7249 39.4804 32.7786 39.3378 32.8267L39.1316 32.8899C38.9494 32.9436 38.8086 32.9813 38.6669 33.0134C38.5832 33.0331 38.4985 33.052 38.4138 33.069C38.262 33.0982 38.1065 33.1227 37.9491 33.1425L37.7255 33.1698C37.3464 33.2056 36.9644 33.2273 36.5503 33.1736C36.496 33.1661 36.439 33.1547 36.381 33.1434C36.2255 33.1152 36.1473 33.101 36.0663 33.0822C35.9752 33.0614 35.8822 33.0322 35.7893 33.0049L35.574 32.9408C35.4534 32.9012 35.3264 32.855 35.2013 32.805L35.0825 32.757C34.9362 32.6976 34.7881 32.6325 34.6381 32.5628C34.1098 32.3149 33.5835 32.0245 33.0249 31.6777C31.962 31.0141 30.7924 30.1468 29.5491 29.0996C29.3862 28.962 29.2243 28.8253 29.065 28.6867L28.1301 27.8582C27.7095 27.4764 27.3129 27.1031 26.9466 26.7496L26.0485 27.762L28.0408 29.603C28.2396 29.7773 28.4448 29.9527 28.6546 30.1289L28.7917 30.2468C29.9319 31.2016 31.0353 32.0198 32.0724 32.6797L32.1709 32.7419C32.3973 32.8823 32.5583 32.9832 32.7193 33.0765L32.6678 33.4366L32.8316 33.1406Z" fill="#00BCD4"/> +<path d="M11.3393 43.2623L11.3264 40.1526L8.13867 40.1687L8.12486 37.4398L11.3144 37.4238L11.3034 34.955C7.8037 34.0633 5.08069 31.1912 4.32792 27.5696C4.26167 27.252 4.22026 26.9645 4.18713 26.6741L4.16872 26.5535C4.13467 26.2226 4.11719 25.888 4.11719 25.5496C4.11719 20.2002 8.36597 15.8481 13.5884 15.8481C13.8101 15.8481 14.0356 15.8679 14.2629 15.8972L14.4267 15.9236C14.6375 15.9594 14.7967 15.9914 14.9559 16.031C15.035 16.0508 15.116 16.0706 15.1979 16.0932C15.3617 16.1394 15.5264 16.1931 15.6911 16.2516L15.8927 16.3213C16.1052 16.4024 16.3206 16.4948 16.535 16.5938C16.616 16.6315 16.6979 16.672 16.7798 16.7125C16.9648 16.8049 17.0853 16.8662 17.204 16.9303C17.32 16.9925 17.4368 17.0575 17.5528 17.1254C17.6577 17.1857 17.7617 17.2479 17.8666 17.312L17.9439 17.3592C18.0387 17.4167 18.1335 17.4742 18.2283 17.5345C20.6577 19.0983 22.9454 21.3936 24.4399 23.045L24.6571 23.2864L24.37 23.5795C24.001 23.9575 23.7295 24.2459 23.608 24.377L22.7991 25.2545L22.5571 24.9878C21.5568 23.884 18.9617 21.1523 16.4687 19.6299C16.3629 19.5649 16.2571 19.5017 16.1513 19.4424L16.0105 19.3651C15.8034 19.2529 15.658 19.1784 15.5126 19.1096C15.4215 19.0662 15.3322 19.0238 15.2439 18.9861L15.0286 18.8966C14.8951 18.8447 14.7617 18.7967 14.6301 18.7561L14.5151 18.7222C14.3835 18.6854 14.2555 18.6553 14.1295 18.6326L14.0062 18.6128C13.8635 18.5921 13.7227 18.5761 13.5884 18.5761C9.83468 18.5761 6.7813 21.7046 6.7813 25.5496C6.7813 25.8135 6.80063 26.0963 6.83928 26.4149L6.8586 26.5469C6.90738 26.8617 6.95339 27.0955 7.0132 27.3245L6.72425 27.5432L7.04449 27.449C7.20554 28.0211 7.43468 28.5688 7.72732 29.0769C8.95124 31.2015 11.1976 32.5212 13.5893 32.5212C14.3697 32.5212 15.3562 32.1573 16.5221 31.44L16.7807 31.2807L16.9611 31.5277C17.354 32.0678 17.8003 32.5683 18.2853 33.0142L18.6138 33.3158L18.2402 33.5571C16.6565 34.5752 15.2218 35.1388 13.9694 35.2341L13.9786 37.4115L17.1286 37.3964L17.1414 40.1253L13.9896 40.1413L14.0025 43.251L11.3393 43.2623ZM11.989 39.4683L12.0019 42.578L13.3335 42.5714L13.3206 39.4617L16.4715 39.4457L16.4651 38.0817L13.3151 38.0968L13.3003 34.5704L13.6316 34.5667C14.7433 34.5563 16.0482 34.1001 17.516 33.2112C17.193 32.8888 16.8902 32.5429 16.6095 32.179C15.4463 32.8605 14.4322 33.2055 13.5902 33.2055C10.9638 33.2055 8.49756 31.7567 7.15492 29.4237C6.83376 28.8676 6.58161 28.2662 6.40584 27.6375L6.38468 27.5526C6.30645 27.2501 6.25492 26.9918 6.21443 26.7307L6.18038 26.5007C6.13713 26.1538 6.11688 25.8427 6.11688 25.5496C6.11688 21.3285 9.46934 17.8936 13.5902 17.8936C13.7559 17.8936 13.927 17.9115 14.1019 17.936L14.2482 17.9606C14.3927 17.986 14.5417 18.0209 14.6927 18.0633L14.8252 18.1019C14.9715 18.1472 15.1197 18.2009 15.2697 18.2594L15.5052 18.3565C15.6019 18.3979 15.6994 18.4441 15.7979 18.4912C15.9516 18.5648 16.1071 18.644 16.2654 18.7297L16.4779 18.8466C16.5884 18.9088 16.7006 18.9758 16.8129 19.0446C19.1375 20.4642 21.4795 22.8188 22.8046 24.2582L23.1267 23.9085C23.2316 23.7954 23.4442 23.5691 23.7341 23.2703C22.2691 21.6726 20.1295 19.5639 17.8859 18.1199L17.5279 17.8993C17.4286 17.839 17.3292 17.7786 17.2289 17.7211C17.1175 17.658 17.0071 17.5958 16.8957 17.5354C16.7816 17.4742 16.6675 17.4167 16.5534 17.3592C16.4126 17.2875 16.3381 17.2508 16.2635 17.2159C16.062 17.1226 15.8614 17.0368 15.6617 16.9604L15.4749 16.8963C15.323 16.8426 15.1721 16.7936 15.0221 16.7502L14.8022 16.6937C14.6577 16.6569 14.5151 16.6286 14.3743 16.6051L14.1801 16.573C13.9822 16.5476 13.7844 16.5297 13.5902 16.5297C8.73499 16.5297 4.78437 20.5754 4.78437 25.5496C4.78437 25.8644 4.80093 26.1755 4.83222 26.4828L4.51842 26.6345L4.84878 26.5949C4.87915 26.8655 4.9178 27.1322 4.97118 27.3952C5.69633 30.8782 8.33652 33.5958 11.7065 34.3518L11.9669 34.4111L11.9825 38.1043L8.79388 38.1204L8.80032 39.4843L11.989 39.4683Z" fill="#00BCD4"/> +<path d="M21.3502 31.1494L21.1349 30.9957C20.5542 30.5829 20.0417 30.071 19.6137 29.4762L19.4297 29.2208L19.6643 29.0144C21.1404 27.6758 22.3855 26.2695 23.1944 25.325L23.8533 24.6123C23.972 24.4832 24.2417 24.1976 24.607 23.8234C25.4776 22.9326 26.8128 21.6289 28.3708 20.3244L28.5769 20.1519L28.7868 20.3187C29.3536 20.7712 29.8395 21.3075 30.2288 21.9127L30.3953 22.17L30.1616 22.3651C28.4886 23.7564 27.1193 25.1091 26.4521 25.7906L24.8812 27.559L24.8803 27.5571L23.7567 28.7928C23.5414 29.0191 23.3186 29.2519 23.0812 29.4923C22.6073 29.9721 22.092 30.4726 21.5453 30.9694L21.3502 31.1494ZM20.3352 29.316C20.6232 29.677 20.9472 29.9994 21.3033 30.2784C21.7312 29.8825 22.1711 29.4565 22.6119 29.0097C22.8484 28.7712 23.0674 28.5421 23.2782 28.3206L24.8039 26.6229L24.8104 26.6277L25.9708 25.3221C26.6251 24.6529 27.9153 23.3775 29.5018 22.039C29.2358 21.6695 28.9285 21.332 28.5834 21.0304C27.1312 22.2614 25.8981 23.4689 25.1039 24.2805C24.7193 24.6745 24.4542 24.9564 24.3374 25.0827L23.6867 25.7868C22.9101 26.6917 21.7229 28.0359 20.3352 29.316Z" fill="#00BCD4"/> +<path d="M24.8188 35.2517C19.5964 35.2517 15.3477 30.8996 15.3477 25.5502C15.3477 23.8177 15.8105 22.1059 16.6875 20.6015L16.8697 20.2876L17.1624 20.4959C17.6667 20.8541 18.2105 21.2811 18.7783 21.7637L18.99 21.9438L18.8566 22.1907C18.3035 23.2173 18.0109 24.3786 18.0109 25.5502C18.0109 29.3952 21.0642 32.5219 24.8179 32.5219C26.063 32.5219 27.2879 32.1655 28.3609 31.4916L28.5578 31.3671L28.74 31.5142C29.3096 31.9723 29.8756 32.4012 30.4231 32.7905L30.805 33.062L30.4314 33.3457C28.7879 34.5928 26.8461 35.2517 24.8188 35.2517ZM17.0796 21.2717C16.3811 22.5904 16.013 24.0618 16.013 25.5502C16.013 30.5226 19.9627 34.5683 24.8188 34.5683C26.5489 34.5683 28.2118 34.0527 29.6557 33.0705C29.2784 32.7943 28.8946 32.5011 28.509 32.1948C27.3799 32.8555 26.109 33.2043 24.8179 33.2043C20.6971 33.2043 17.3446 29.7694 17.3446 25.5493C17.3446 24.3578 17.6197 23.1748 18.1434 22.1116C17.7753 21.8052 17.4191 21.5234 17.0796 21.2717Z" fill="#00BCD4"/> +<path d="M32.9995 30.4492L32.694 30.2371C32.163 29.8695 31.6044 29.4548 31.0357 29.0023L30.8222 28.8317L30.9409 28.5828C31.3983 27.6204 31.6293 26.5996 31.6293 25.5476C31.6293 21.7026 28.5759 18.5741 24.8222 18.5741C23.6958 18.5741 22.5786 18.8635 21.5912 19.4121L21.3915 19.5233L21.2176 19.3725C20.6618 18.8899 20.1041 18.4421 19.5602 18.0406L19.1719 17.7531L19.5703 17.4797C21.1302 16.4108 22.9467 15.8452 24.8231 15.8452C30.0464 15.8452 34.2952 20.1973 34.2952 25.5467C34.2952 27.135 33.9078 28.7139 33.1753 30.1136L32.9995 30.4492ZM31.6541 28.63C32.0286 28.9241 32.3977 29.1993 32.7547 29.4548C33.3262 28.2407 33.6262 26.8984 33.6262 25.5495C33.6262 20.5762 29.6765 16.5296 24.8213 16.5296C23.2375 16.5296 21.6998 16.9632 20.3443 17.787C20.7179 18.0755 21.0961 18.3818 21.4753 18.7061C22.5096 18.1744 23.6608 17.8945 24.8213 17.8945C28.9421 17.8945 32.2955 21.3294 32.2955 25.5504C32.2955 26.6137 32.0793 27.6487 31.6541 28.63Z" fill="#00BCD4"/> +</svg> diff --git a/src/img/subject_icons/subject_ensino-religioso.svg b/src/img/subject_icons/subject_ensino-religioso.svg new file mode 100644 index 0000000000000000000000000000000000000000..cd6f311dd56667ef5af0da4628a890e4f1ac52b7 --- /dev/null +++ b/src/img/subject_icons/subject_ensino-religioso.svg @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M30.4,22.2h-8.9c-0.8,0-1.5,0.7-1.5,1.5v21.5c0,0.8,0.7,1.5,1.5,1.5h8.9c0.8,0,1.5-0.7,1.5-1.5V23.7 + C31.9,22.9,31.3,22.2,30.4,22.2z M21.6,45.2V23.7l5.7,0v7.9h1v-7.9l2.2,0l0,21.4L21.6,45.2z"/> + <rect x="23.8" y="31.6" class="st1" width="1" height="5.5"/> + <path class="st1" d="M26.2,20.2c1,0,2-0.4,2.8-1.2c1.5-1.5,1.5-4,0-5.6c-0.3-0.3-0.4-0.6-0.4-1.1c0-0.3,0.2-0.7,0.4-0.9l1.1-1.1 + l-1.5-0.2c-1.8-0.3-3.9,0.4-5.2,1.7c-2,2-2,5.1,0,7.1C24.1,19.8,25.1,20.2,26.2,20.2z M24.4,13c0.7-0.7,1.7-1.2,2.7-1.3 + c-0.1,0.2-0.1,0.4-0.1,0.6c-0.1,0.8,0.2,1.6,0.8,2.2c1,1,1,2.5,0,3.5c-1,1-2.5,1-3.5,0C23.1,16.6,23.1,14.3,24.4,13z"/> + <path class="st1" d="M26,7.1c0.3,0,0.5-0.2,0.5-0.5V1.7c0-0.3-0.2-0.5-0.5-0.5s-0.5,0.2-0.5,0.5v4.9C25.5,6.9,25.7,7.1,26,7.1z"/> + <path class="st1" d="M39.1,6.8c-0.2-0.2-0.5-0.2-0.7,0l-3.5,3.5c-0.2,0.2-0.2,0.5,0,0.7c0.1,0.1,0.2,0.1,0.4,0.1s0.3,0,0.4-0.1 + l3.5-3.5C39.3,7.3,39.3,7,39.1,6.8z"/> + <path class="st1" d="M41.9,18.3H37c-0.3,0-0.5,0.2-0.5,0.5s0.2,0.5,0.5,0.5h4.9c0.3,0,0.5-0.2,0.5-0.5S42.2,18.3,41.9,18.3z"/> + <path class="st1" d="M13.6,6.8c-0.2-0.2-0.5-0.2-0.7,0s-0.2,0.5,0,0.7l3.5,3.5c0.1,0.1,0.2,0.1,0.4,0.1s0.3,0,0.4-0.1 + c0.2-0.2,0.2-0.5,0-0.7L13.6,6.8z"/> + <path class="st1" d="M15,18.3h-4.9c-0.3,0-0.5,0.2-0.5,0.5s0.2,0.5,0.5,0.5H15c0.3,0,0.5-0.2,0.5-0.5S15.3,18.3,15,18.3z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_filosofia.svg b/src/img/subject_icons/subject_filosofia.svg new file mode 100644 index 0000000000000000000000000000000000000000..b5b68d299ce0684cb34edc168d48327fa7b26186 --- /dev/null +++ b/src/img/subject_icons/subject_filosofia.svg @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="-0.1" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M29,8.8c-1.9,0-3.5,0.5-4.7,1.6c-1.2,1.1-1.8,2.5-1.9,4.3c0,0.1,0.1,0.3,0.1,0.4s0.2,0.1,0.4,0.1h3.4 + c0.3,0,0.5-0.2,0.5-0.5c0-0.6,0.2-1.1,0.6-1.5c0.4-0.4,0.9-0.5,1.6-0.5c0.7,0,1.2,0.2,1.5,0.5c0.3,0.4,0.5,0.9,0.5,1.7 + c0,0.6-0.2,1.1-0.5,1.6c-0.2,0.2-0.6,0.7-1.7,1.8c-1,0.9-1.6,1.8-1.9,2.6c-0.3,0.8-0.5,1.9-0.5,3.2c0,0.2,0.1,0.3,0.2,0.4 + c-0.3,0.4-0.4,0.9-0.4,1.4c0,0.6,0.2,1.2,0.6,1.6c0.4,0.4,1,0.7,1.8,0.7c0.8,0,1.4-0.2,1.8-0.7c0.4-0.4,0.6-1,0.6-1.6 + c0-0.6-0.2-1.1-0.5-1.5c0.1-0.1,0.1-0.2,0.1-0.3c0-1.2,0.3-2.1,0.8-2.7l1.7-1.7c1.5-1.6,2.3-3.2,2.3-4.8c0-1.9-0.6-3.3-1.7-4.4 + C32.6,9.3,31,8.8,29,8.8z M29.7,26.8c-0.2,0.2-0.6,0.4-1.1,0.4c-0.5,0-0.8-0.1-1.1-0.4c-0.2-0.3-0.4-0.6-0.4-0.9 + c0-0.4,0.1-0.7,0.4-1c0.3-0.2,0.6-0.4,1.1-0.4c0.5,0,0.8,0.1,1.1,0.4c0.3,0.3,0.4,0.6,0.4,1C30.1,26.2,30,26.5,29.7,26.8z + M32.5,18.9l-1.7,1.7c-0.6,0.7-1,1.7-1.1,2.9h-1h-1.2c0-0.9,0.2-1.7,0.4-2.3c0.3-0.7,0.9-1.4,1.7-2.3c0.9-0.9,1.5-1.6,1.8-2 + c0.4-0.6,0.6-1.4,0.6-2.1c0-1-0.3-1.8-0.8-2.4c-0.5-0.6-1.3-0.8-2.3-0.8c-0.9,0-1.7,0.3-2.3,0.8c-0.5,0.4-0.8,1-0.9,1.7h-2.4 + c0.1-1.3,0.6-2.3,1.5-3.1c1-0.9,2.4-1.3,4.1-1.3c1.7,0,3.1,0.4,4.1,1.3c1,0.9,1.4,2,1.4,3.6C34.5,16.1,33.8,17.5,32.5,18.9z"/> + <path class="st1" d="M43.4,9.7c-1.8-3.9-5.8-7.4-10-8.6c-1.7-0.5-3.5-0.7-5.4-0.7c-9.1,0-16.6,7.4-16.7,16.5l-4,13.7 + c-0.1,0.2,0,0.5,0.1,0.7s0.4,0.3,0.6,0.3l3.3,0v4.1c0,3.6,2.9,6.6,6.6,6.6h6.9v4.5c0,0.4,0.3,0.8,0.8,0.8h13.9c0.1,0,0.1,0,0.2,0 + c0.7-0.2,0.7-0.4,0.6-5.1c0-0.3,0-0.6,0-0.7c0.1-3.2,0.3-7,1.1-10.6c0.3-1.4,0.7-2.9,1.1-4.3c0.6-2.1,1.2-4.2,1.6-6.4 + c0.3-1.8,0.5-3.3,0.5-4.7c0,0,0,0,0,0C44.6,13.4,44.2,11.5,43.4,9.7z M42.6,20.1c-0.4,2.1-1,4.2-1.6,6.3c-0.4,1.4-0.8,2.9-1.2,4.4 + c-0.9,3.7-1.1,7.6-1.2,10.9c0,0.1,0,0.4,0,0.7c0,0.7,0.1,2.6,0,3.6H26.3v-4.5c0-0.4-0.3-0.8-0.8-0.8h-7.6c-2.8,0-5.1-2.3-5.1-5.1 + v-4.8c0-0.4-0.3-0.8-0.8-0.8l-3,0l3.8-12.8c0-0.1,0-0.1,0-0.2C12.9,8.7,19.7,1.9,28,1.9c1.8,0,3.4,0.2,5,0.6c3.8,1,7.5,4.2,9.1,7.7 + c0.7,1.5,1,3.3,1,5.3C43.1,17,42.9,18.4,42.6,20.1z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_fisica.svg b/src/img/subject_icons/subject_fisica.svg new file mode 100644 index 0000000000000000000000000000000000000000..64108d2c4d32764735b8bb73bbc0729e078e7adc --- /dev/null +++ b/src/img/subject_icons/subject_fisica.svg @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M44,24c3.3-4,4.5-8,3-10.9c-1.7-3.2-6.3-4.4-12.1-3.7c-2-5.5-5.2-9-8.9-9c-3.6,0-6.8,3.5-8.9,9 + C11.3,8.6,6.7,9.8,5.1,13C3.5,16,4.7,20,8,24c-0.1,0.1-0.3,0.3-0.4,0.4c-3.1,4-4,7.7-2.6,10.5c1.4,2.6,4.6,3.9,8.9,3.9 + c1,0,2.1-0.1,3.2-0.2c2,5.5,5.2,9,8.9,9s6.8-3.5,8.9-9c1.1,0.1,2.2,0.2,3.2,0.2c4.3,0,7.5-1.3,8.9-3.9c1.4-2.8,0.5-6.5-2.6-10.5 + C44.2,24.3,44.1,24.1,44,24z M38.1,10.7c3.7,0,6.4,1,7.5,3.1c1.2,2.3,0.1,5.6-2.6,9.1c-1.7-1.9-3.8-3.7-6.2-5.4 + c-0.3-2.4-0.8-4.6-1.4-6.6C36.3,10.7,37.3,10.7,38.1,10.7z M30.5,32.6c-1.5,0.8-3,1.5-4.5,2c-1.5-0.6-3-1.3-4.5-2 + c-1.7-0.9-3.4-1.9-4.9-2.9c-0.2-1.8-0.3-3.7-0.3-5.7c0-2,0.1-3.9,0.3-5.7c1.5-1,3.2-2,4.9-2.9c1.5-0.8,3-1.5,4.5-2.1 + c1.5,0.6,3,1.3,4.5,2.1c1.7,0.9,3.4,1.9,4.9,2.9c0.2,1.8,0.3,3.7,0.3,5.7c0,1.9-0.1,3.8-0.3,5.7C33.9,30.7,32.2,31.6,30.5,32.6z + M35.1,31.6c-0.3,1.9-0.7,3.6-1.3,5.2c-1.8-0.3-3.8-0.8-5.7-1.5c1-0.5,2.1-0.9,3.1-1.5C32.5,33.2,33.8,32.4,35.1,31.6z M23.9,35.4 + c-2,0.7-3.9,1.2-5.7,1.5c-0.5-1.6-0.9-3.3-1.3-5.2c1.2,0.8,2.5,1.5,3.9,2.3C21.9,34.4,22.9,34.9,23.9,35.4z M15,28.4 + c-1.9-1.5-3.6-3-5-4.5c1.4-1.5,3.1-3.1,5-4.5c-0.1,1.5-0.2,3-0.2,4.5C14.8,25.5,14.9,27,15,28.4z M16.9,16.3 + c0.3-1.9,0.7-3.6,1.3-5.2c1.8,0.3,3.8,0.8,5.8,1.5c-1,0.5-2.1,0.9-3.1,1.5C19.5,14.7,18.2,15.5,16.9,16.3z M28.1,12.5 + c2-0.7,3.9-1.2,5.8-1.5c0.5,1.6,0.9,3.3,1.3,5.2c-1.2-0.8-2.5-1.6-3.9-2.3C30.1,13.5,29.1,13,28.1,12.5z M37,19.4 + c1.9,1.4,3.6,2.9,5,4.5c-1.4,1.5-3.1,3-5,4.5c0.1-1.4,0.2-2.9,0.2-4.5C37.2,22.4,37.1,20.9,37,19.4z M26,1.8c2.9,0,5.5,3,7.3,7.7 + C31,10,28.5,10.7,26,11.7c-2.5-1-5-1.7-7.3-2.1C20.5,4.9,23.1,1.8,26,1.8z M6.4,13.7c1.1-2.1,3.8-3.1,7.5-3.1 + c0.9,0,1.8,0.1,2.7,0.2c-0.6,2-1.1,4.2-1.4,6.6c-2.4,1.7-4.5,3.5-6.2,5.4C6.3,19.4,5.2,16,6.4,13.7z M6.4,34.2 + c-1.1-2.2-0.2-5.4,2.4-8.8C8.9,25.3,9,25.2,9,25.1c1.7,1.8,3.8,3.7,6.2,5.4c0.3,2.4,0.8,4.6,1.4,6.6C11.6,37.7,7.7,36.7,6.4,34.2z + M26,46.1c-2.9,0-5.5-3-7.3-7.8c2.3-0.4,4.8-1.1,7.3-2.1c2.5,1,5,1.7,7.3,2.1C31.5,43,28.9,46.1,26,46.1z M45.6,34.2 + c-1.3,2.5-5.2,3.5-10.2,2.9c0.6-2,1.1-4.2,1.4-6.6c2.4-1.7,4.5-3.5,6.2-5.4c0.1,0.1,0.1,0.1,0.2,0.2C45.9,28.8,46.7,32,45.6,34.2z" + /> + <path class="st1" d="M26,20.9c-1.7,0-3.1,1.4-3.1,3.1S24.3,27,26,27c1.7,0,3.1-1.4,3.1-3.1S27.7,20.9,26,20.9z M26,25.5 + c-0.9,0-1.6-0.7-1.6-1.6s0.7-1.6,1.6-1.6c0.9,0,1.6,0.7,1.6,1.6S26.9,25.5,26,25.5z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_geografia.svg b/src/img/subject_icons/subject_geografia.svg new file mode 100644 index 0000000000000000000000000000000000000000..c534fb98c5c84b68fee2bd24e115fe9ce032bd25 --- /dev/null +++ b/src/img/subject_icons/subject_geografia.svg @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M40.4,35.4c8.9-8.9,8.9-23.4,0-32.4c-0.3-0.3-0.8-0.3-1.1,0s-0.3,0.8,0,1.1c8.3,8.3,8.3,21.9,0,30.2 + c-8.3,8.3-21.9,8.3-30.2,0C8.8,34,8.3,34,8,34.3s-0.3,0.8,0,1.1c4.3,4.3,9.8,6.5,15.4,6.7v4.1h-6.6c-0.4,0-0.8,0.3-0.8,0.8 + s0.3,0.8,0.8,0.8h13.9c0.4,0,0.8-0.3,0.8-0.8s-0.3-0.8-0.8-0.8h-6.3v-4.1C30.2,42,36,39.8,40.4,35.4z"/> + <path class="st1" d="M24.1,38.6c5.1,0,9.9-2,13.6-5.6c3.6-3.6,5.6-8.4,5.6-13.6s-2-9.9-5.6-13.6C34,2.2,29.2,0.2,24.1,0.2 + c-5.1,0-9.9,2-13.6,5.6c-3.6,3.6-5.6,8.4-5.6,13.6s2,9.9,5.6,13.6C14.1,36.6,19,38.6,24.1,38.6z M11.8,24.9 + c0.8-1.8,1.9-3.7,3.3-5.6l9.2,9.2c-1.9,1.4-3.8,2.5-5.6,3.3c-3.2,1.3-5.7,1.4-6.9,0.1C10.5,30.6,10.5,28.1,11.8,24.9z M15.7,18.5 + c1-1.4,2.2-2.7,3.5-4c1.2-1.2,2.4-2.3,3.6-3.2l9.5,9.5c-1,1.2-2.1,2.4-3.2,3.6c-1.3,1.3-2.6,2.5-4,3.5L15.7,18.5z M24.1,37.1 + c-3.8,0-7.4-1.2-10.4-3.4c0.2,0,0.4,0,0.6,0c1.3,0,2.9-0.4,4.7-1.1c1.9-0.8,3.9-2,6-3.5l6.3,6.3C29.1,36.5,26.6,37.1,24.1,37.1z + M36.6,31.9c-1.3,1.3-2.7,2.3-4.3,3.2l-6.5-6.5c1.4-1.1,2.7-2.2,4-3.5c1.2-1.2,2.3-2.4,3.2-3.6l6.5,6.5 + C38.8,29.4,37.8,30.7,36.6,31.9z M38.5,9.2c2.1,3,3.3,6.5,3.3,10.2c0,2.7-0.6,5.2-1.7,7.6l-6.4-6.4C36.9,16.3,38.7,12.2,38.5,9.2z + M36.5,13.9c-0.8,1.9-2,4-3.5,6l-9.3-9.3C27.5,7.7,31.4,6,34,6c1.1,0,2,0.3,2.6,0.9C37.9,8.2,37.8,10.7,36.5,13.9z M24.1,1.7 + c3.8,0,7.3,1.2,10.3,3.4c-3-0.2-7.2,1.6-11.5,4.8l-6.5-6.5C18.8,2.3,21.4,1.7,24.1,1.7z M11.6,6.9c1.2-1.2,2.5-2.2,4-3l6.6,6.6 + c-1.2,1-2.4,2-3.6,3.2c-1.3,1.3-2.5,2.6-3.5,4l-6.6-6.6C9.2,9.6,10.3,8.2,11.6,6.9z M6.4,19.4c0-2.5,0.6-5,1.6-7.3l6.4,6.4 + c-1.5,2-2.7,4-3.5,6c-0.9,2.1-1.2,3.9-1.1,5.4C7.6,26.9,6.4,23.2,6.4,19.4z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_historia.svg b/src/img/subject_icons/subject_historia.svg new file mode 100644 index 0000000000000000000000000000000000000000..aebb7c1554610e623a6eace3ec2876ab158efb63 --- /dev/null +++ b/src/img/subject_icons/subject_historia.svg @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.3" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M32.1,22.4c5.2-3.5,8.1-8.4,8.1-13.7V4.2h2.7V0.5H9.2v3.7h2.5v4.5c0,5.3,2.9,10.1,8.1,13.7 + c0.4,0.3,0.7,1,0.7,1.8s-0.3,1.5-0.7,1.8c-5.2,3.5-8.1,8.4-8.1,13.7v4.5H9.2v3.7h33.7v-3.7h-2.7v-4.5c0-5.3-2.9-10.1-8.1-13.7 + c-0.4-0.3-0.7-1-0.7-1.8C31.4,23.3,31.6,22.6,32.1,22.4z M10.2,1.5h31.7v1.7H10.2V1.5z M38.8,4.2v4.5c0,0.4,0,0.8-0.1,1.2H13.1 + c0-0.4-0.1-0.8-0.1-1.2V4.2H38.8z M41.8,46.8H10.2v-1.7h31.7V46.8z M31.3,27.1c4.8,3.2,7.5,7.7,7.5,12.5v4.5H13.1v-4.5 + c0-4.8,2.7-9.3,7.5-12.5c0.8-0.6,1.3-1.7,1.3-3c0-1.3-0.5-2.4-1.3-3c-4-2.7-6.5-6.1-7.2-9.9h25.2c-0.8,3.8-3.3,7.3-7.2,9.9 + c-0.8,0.6-1.3,1.7-1.3,3C30,25.4,30.5,26.5,31.3,27.1z"/> + <path class="st1" d="M26,25.5c0.3,0,0.5-0.1,0.7-0.3c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7c-0.4-0.4-1-0.4-1.4,0 + C25.1,24,25,24.2,25,24.5c0,0.3,0.1,0.5,0.3,0.7C25.5,25.4,25.7,25.5,26,25.5z"/> + <path class="st1" d="M26,26.6c-0.6,0-1,0.5-1,1c0,0.6,0.4,1,1,1c0.5,0,1-0.4,1-1C27,27.1,26.6,26.6,26,26.6z"/> + <path class="st1" d="M26,29.8c-0.6,0-1,0.5-1,1s0.4,1,1,1c0.5,0,1-0.5,1-1S26.6,29.8,26,29.8z"/> + <path class="st1" d="M25.3,33.2c-0.2,0.2-0.3,0.5-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7c0.2,0.2,0.4,0.3,0.7,0.3c0.3,0,0.5-0.1,0.7-0.3 + c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7C26.3,32.9,25.7,32.9,25.3,33.2z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_informatica.svg b/src/img/subject_icons/subject_informatica.svg new file mode 100644 index 0000000000000000000000000000000000000000..56f8ecef80052fa44b5663a135bf28f6f0d90fb0 --- /dev/null +++ b/src/img/subject_icons/subject_informatica.svg @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 72 47.7" style="enable-background:new 0 0.1 72 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0.1" y="0.1" class="st0" width="71.9" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M64.1,40.7h-56c-0.6,0-1,0.4-1,1s0.4,1,1,1h56c0.6,0,1-0.4,1-1S64.6,40.7,64.1,40.7z"/> + <path class="st1" d="M20.2,37.1h32c3.2,0,5.8-2.6,5.8-5.8V11c0-3.2-2.6-5.8-5.8-5.8h-32c-3.2,0-5.8,2.6-5.8,5.8v20.3 + C14.4,34.5,17,37.1,20.2,37.1z M16,11c0-2.3,1.9-4.2,4.2-4.2h32c2.3,0,4.2,1.9,4.2,4.2v20.3c0,2.3-1.9,4.2-4.2,4.2h-32 + c-2.3,0-4.2-1.9-4.2-4.2V11z"/> + <path class="st1" d="M21.6,33.5h29.2c1.9,0,3.5-1.6,3.5-3.5V12.3c0-1.9-1.6-3.5-3.5-3.5H21.6c-1.9,0-3.5,1.6-3.5,3.5V30 + C18.1,31.9,19.7,33.5,21.6,33.5z M19.1,12.3c0-1.4,1.1-2.5,2.5-2.5h29.2c1.4,0,2.5,1.1,2.5,2.5V30c0,1.4-1.1,2.5-2.5,2.5H21.6 + c-1.4,0-2.5-1.1-2.5-2.5V12.3z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_lingua-espanhola.svg b/src/img/subject_icons/subject_lingua-espanhola.svg new file mode 100644 index 0000000000000000000000000000000000000000..f51271ae58130870c6544a98383e8c4bf47b55a0 --- /dev/null +++ b/src/img/subject_icons/subject_lingua-espanhola.svg @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M47,22.7c-0.3,0-0.5,0.2-0.5,0.5c0,5.6-2.2,11-6.1,15c-0.2,0.2-0.2,0.5,0,0.7c0.1,0.1,0.2,0.1,0.3,0.1 + c0.1,0,0.3-0.1,0.4-0.2c4.1-4.2,6.4-9.8,6.4-15.7C47.5,22.9,47.3,22.7,47,22.7z"/> + <path class="st1" d="M24.3,3.4c-10.9,0-19.8,8.9-19.8,19.8c0,4.1,1.2,8.1,3.6,11.4l0.1,0.1l-2.3,6.8l6.8-2.3l0.1,0.1 + c3.3,2.4,7.3,3.6,11.4,3.6c10.9,0,19.8-8.9,19.8-19.7S35.2,3.4,24.3,3.4z M24.3,41.4c-3.8,0-7.4-1.2-10.5-3.3L13,37.6l-4.7,1.6 + l1.6-4.7l-0.5-0.7C7.2,30.6,6,27,6,23.2C6,13.1,14.2,4.9,24.3,4.9c10.1,0,18.3,8.2,18.3,18.3S34.3,41.4,24.3,41.4z"/> + <polygon class="st1" points="17.4,23.5 12.7,23.5 12.7,19.5 11.5,19.5 11.5,28.7 12.7,28.7 12.7,24.5 17.4,24.5 17.4,28.7 + 18.6,28.7 18.6,19.5 17.4,19.5 "/> + <path class="st1" d="M23.4,21.7c-0.6,0-1.1,0.1-1.6,0.4c-0.5,0.3-0.8,0.7-1.1,1.2c-0.3,0.5-0.4,1.1-0.4,1.8v0.1 + c0,1.1,0.3,1.9,0.9,2.6c0.6,0.6,1.3,1,2.3,1c0.6,0,1.2-0.1,1.6-0.4c0.5-0.3,0.8-0.7,1.1-1.2s0.4-1.1,0.4-1.8v-0.1 + c0-1.1-0.3-1.9-0.9-2.6C25.1,22.1,24.3,21.7,23.4,21.7z M24.8,27.2c-0.4,0.5-0.8,0.7-1.4,0.7c-0.6,0-1.1-0.2-1.4-0.7 + c-0.4-0.5-0.5-1.1-0.5-1.8c0-0.9,0.2-1.5,0.5-2s0.8-0.7,1.4-0.7c0.6,0,1.1,0.2,1.4,0.7c0.4,0.5,0.5,1.1,0.5,1.8 + C25.3,26.1,25.2,26.7,24.8,27.2z"/> + <rect x="28.1" y="19" class="st1" width="1.2" height="9.8"/> + <path class="st1" d="M36.4,24c0-0.7-0.3-1.2-0.7-1.6c-0.4-0.4-1.1-0.6-1.9-0.6c-0.5,0-1,0.1-1.4,0.3s-0.7,0.4-1,0.8 + c-0.2,0.3-0.4,0.7-0.4,1h1.2c0-0.3,0.1-0.6,0.4-0.8s0.6-0.3,1.1-0.3c0.5,0,0.8,0.1,1.1,0.4c0.2,0.2,0.4,0.6,0.4,1v0.5H34 + c-1,0-1.8,0.2-2.3,0.6c-0.5,0.4-0.8,1-0.8,1.7c0,0.6,0.2,1.1,0.7,1.5s1,0.6,1.7,0.6c0.8,0,1.4-0.3,2-0.9c0,0.3,0.1,0.6,0.2,0.7h1.2 + v-0.1c-0.2-0.4-0.2-0.9-0.2-1.5V24z M35.2,26.8c-0.1,0.3-0.4,0.6-0.7,0.7s-0.7,0.3-1,0.3c-0.4,0-0.7-0.1-0.9-0.3s-0.4-0.5-0.4-0.9 + c0-0.8,0.7-1.3,2.2-1.3h0.9V26.8z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_lingua-inglesa.svg b/src/img/subject_icons/subject_lingua-inglesa.svg new file mode 100644 index 0000000000000000000000000000000000000000..4c548a0a704a200f408da9936844832cddfa72c5 --- /dev/null +++ b/src/img/subject_icons/subject_lingua-inglesa.svg @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M47,23.5c-0.3,0-0.5,0.2-0.5,0.5c0,5.6-2.2,11-6.1,15c-0.2,0.2-0.2,0.5,0,0.7c0.1,0.1,0.2,0.1,0.3,0.1 + c0.1,0,0.3-0.1,0.4-0.2c4.1-4.2,6.4-9.8,6.4-15.7C47.5,23.7,47.3,23.5,47,23.5z"/> + <path class="st1" d="M24.3,4.2c-10.9,0-19.8,8.9-19.8,19.8c0,4.1,1.2,8,3.6,11.4l0.1,0.1l-2.3,6.8l6.8-2.3l0.1,0.1 + c3.3,2.4,7.3,3.6,11.4,3.6c10.9,0,19.8-8.9,19.8-19.8C44,13.1,35.2,4.2,24.3,4.2z M24.3,42.2c-3.8,0-7.4-1.2-10.5-3.3L13,38.3 + l-4.7,1.6l1.6-4.7l-0.5-0.7C7.2,31.4,6,27.8,6,23.9C6,13.9,14.2,5.7,24.3,5.7c10.1,0,18.3,8.2,18.3,18.3 + C42.5,34,34.3,42.2,24.3,42.2z"/> + <polygon class="st1" points="25.1,24.3 20.5,24.3 20.5,20.3 19.2,20.3 19.2,29.5 20.5,29.5 20.5,25.3 25.1,25.3 25.1,29.5 + 26.4,29.5 26.4,20.3 25.1,20.3 "/> + <rect x="28.4" y="22.7" class="st1" width="1.2" height="6.9"/> + <path class="st1" d="M29,20.2c-0.2,0-0.4,0.1-0.5,0.2c-0.1,0.1-0.2,0.3-0.2,0.5c0,0.2,0.1,0.3,0.2,0.5c0.1,0.1,0.3,0.2,0.5,0.2 + s0.4-0.1,0.5-0.2c0.1-0.1,0.2-0.3,0.2-0.5c0-0.2-0.1-0.4-0.2-0.5C29.4,20.2,29.3,20.2,29,20.2z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_lingua-portuguesa.svg b/src/img/subject_icons/subject_lingua-portuguesa.svg new file mode 100644 index 0000000000000000000000000000000000000000..7baa394159bdfd0e1bc44ef46c0c7790f2eadd7f --- /dev/null +++ b/src/img/subject_icons/subject_lingua-portuguesa.svg @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M24.3,4.2c-10.9,0-19.8,8.9-19.8,19.8c0,4.1,1.2,8,3.6,11.4l0.1,0.1l-2.3,6.8l6.8-2.3l0.1,0.1 + c3.3,2.4,7.3,3.6,11.4,3.6c10.9,0,19.8-8.9,19.8-19.7C44,13.1,35.2,4.2,24.3,4.2z M24.3,42.2c-3.8,0-7.4-1.2-10.5-3.3L13,38.3 + l-4.7,1.6l1.6-4.7l-0.5-0.7C7.2,31.4,6,27.8,6,23.9C6,13.9,14.2,5.7,24.3,5.7c10.1,0,18.3,8.2,18.3,18.3 + C42.5,34,34.3,42.2,24.3,42.2z"/> + <path class="st1" d="M47,23.5c-0.3,0-0.5,0.2-0.5,0.5c0,5.6-2.2,11-6.1,15c-0.2,0.2-0.2,0.5,0,0.7c0.1,0.1,0.2,0.1,0.3,0.1 + c0.1,0,0.3-0.1,0.4-0.2c4.1-4.2,6.4-9.8,6.4-15.7C47.5,23.7,47.3,23.5,47,23.5z"/> + <path class="st1" d="M20.7,20.7c-0.6-0.4-1.2-0.5-2-0.5c-0.7,0-1.4,0.2-1.9,0.5c-0.6,0.4-1,0.9-1.3,1.6s-0.5,1.5-0.5,2.4v0.7 + c0,0.9,0.2,1.6,0.5,2.3c0.3,0.7,0.7,1.2,1.3,1.5s1.2,0.5,1.9,0.5c0.7,0,1.4-0.2,2-0.5s1-0.9,1.3-1.5s0.5-1.5,0.5-2.4v-0.6 + c0-0.9-0.2-1.7-0.5-2.4C21.7,21.6,21.3,21.1,20.7,20.7z M21.3,25.3c0,1.1-0.2,1.9-0.7,2.5s-1,0.9-1.8,0.9c-0.8,0-1.4-0.3-1.8-0.9 + c-0.4-0.6-0.7-1.4-0.7-2.5v-0.7c0-1,0.2-1.9,0.7-2.4c0.4-0.6,1-0.9,1.8-0.9c0.8,0,1.4,0.3,1.8,0.9s0.7,1.4,0.7,2.5V25.3z"/> + <rect x="24.3" y="19.8" class="st1" width="1.2" height="9.8"/> + <polygon class="st1" points="32.1,19.8 30.7,19.8 29.5,21.7 30.4,21.7 "/> + <path class="st1" d="M32.5,24.8c0-0.7-0.2-1.2-0.7-1.6c-0.4-0.4-1.1-0.6-1.9-0.6c-0.5,0-1,0.1-1.4,0.3c-0.4,0.2-0.7,0.4-1,0.8 + c-0.2,0.3-0.4,0.7-0.4,1h1.2c0-0.3,0.1-0.6,0.4-0.8c0.3-0.2,0.6-0.3,1.1-0.3c0.5,0,0.8,0.1,1.1,0.4c0.2,0.2,0.4,0.6,0.4,1v0.5h-1.1 + c-1,0-1.8,0.2-2.3,0.6s-0.8,1-0.8,1.7c0,0.6,0.2,1.1,0.7,1.5s1,0.6,1.7,0.6c0.8,0,1.4-0.3,2-0.9c0,0.3,0.1,0.6,0.2,0.7h1.2v-0.1 + c-0.2-0.4-0.2-0.9-0.2-1.5V24.8z M31.4,27.6c-0.1,0.3-0.4,0.6-0.7,0.7s-0.7,0.3-1,0.3c-0.4,0-0.7-0.1-0.9-0.3 + c-0.2-0.2-0.4-0.5-0.4-0.9c0-0.8,0.7-1.3,2.2-1.3h0.9V27.6z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_matematica.svg b/src/img/subject_icons/subject_matematica.svg new file mode 100644 index 0000000000000000000000000000000000000000..50eab67436599212349d46f8aa331441da6d0c7e --- /dev/null +++ b/src/img/subject_icons/subject_matematica.svg @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 72 47.7" style="enable-background:new 0 0.1 72 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M66.4,40.3h-0.7V6.6h-5.4v33.8h-0.7c-0.3,0-0.5,0.2-0.5,0.5s0.2,0.5,0.5,0.5h6.8c0.3,0,0.5-0.2,0.5-0.5 + S66.7,40.3,66.4,40.3z M64.7,39.7h-3.4V7.6h3.4V39.7z"/> + <path class="st1" d="M12.4,40.3h-0.7V6.6H6.3v33.8H5.5c-0.3,0-0.5,0.2-0.5,0.5s0.2,0.5,0.5,0.5h6.8c0.3,0,0.5-0.2,0.5-0.5 + S12.6,40.3,12.4,40.3z M10.6,39.7H7.3V7.6h3.4V39.7z"/> + <path class="st1" d="M9,27.5c0.3,0,0.5-0.2,0.5-0.5v-6.8c0-0.3-0.2-0.5-0.5-0.5s-0.5,0.2-0.5,0.5V27C8.5,27.3,8.7,27.5,9,27.5z"/> + <path class="st1" d="M63,27.5c0.3,0,0.5-0.2,0.5-0.5v-6.8c0-0.3-0.2-0.5-0.5-0.5s-0.5,0.2-0.5,0.5V27C62.5,27.3,62.7,27.5,63,27.5z + "/> + <path class="st1" d="M35.2,8.9c0-1.3-1-2.3-2.3-2.3h-0.3c-1.3,0-2.3,1-2.3,2.3v0.3h-1.6V8.9c0-1.3-1-2.3-2.3-2.3H26 + c-1.3,0-2.3,1-2.3,2.3v0.3h-1.6V8.9c0-1.3-1-2.3-2.3-2.3h-0.3c-1.3,0-2.3,1-2.3,2.3v0.3h-3v1.5h3V11c0,1.3,1,2.3,2.3,2.3h0.3 + c1.3,0,2.3-1,2.3-2.3v-0.3h1.6V11c0,1.3,1,2.3,2.3,2.3h0.3c1.3,0,2.3-1,2.3-2.3v-0.3h1.6V11c0,1.3,1,2.3,2.3,2.3h0.3 + c1.3,0,2.3-1,2.3-2.3v-0.3h22.6V9.2H35.2V8.9z M21.1,11c0,0.7-0.6,1.3-1.3,1.3h-0.3c-0.7,0-1.3-0.6-1.3-1.3V8.9 + c0-0.7,0.6-1.3,1.3-1.3h0.3c0.7,0,1.3,0.6,1.3,1.3V11z M27.7,11c0,0.7-0.6,1.3-1.3,1.3H26c-0.7,0-1.3-0.6-1.3-1.3V8.9 + c0-0.7,0.6-1.3,1.3-1.3h0.3c0.7,0,1.3,0.6,1.3,1.3V11z M34.2,11c0,0.7-0.6,1.3-1.3,1.3h-0.3c-0.7,0-1.3-0.6-1.3-1.3V8.9 + c0-0.7,0.6-1.3,1.3-1.3h0.3c0.7,0,1.3,0.6,1.3,1.3V11z"/> + <path class="st1" d="M41.7,22.5c0-1.3-1-2.3-2.3-2.3h-0.3c-1.3,0-2.3,1-2.3,2.3v0.3h-1.5v-0.3c0-1.3-1-2.3-2.3-2.3h-0.3 + c-1.3,0-2.3,1-2.3,2.3v0.3h-16v1.5h16v0.3c0,1.3,1,2.3,2.3,2.3h0.3c1.3,0,2.3-1,2.3-2.3v-0.3h1.5v0.3c0,1.3,1,2.3,2.3,2.3h0.3 + c1.3,0,2.3-1,2.3-2.3v-0.3h16v-1.5h-16V22.5z M34.2,24.7c0,0.7-0.6,1.3-1.3,1.3h-0.3c-0.7,0-1.3-0.6-1.3-1.3v-2.1 + c0-0.7,0.6-1.3,1.3-1.3h0.3c0.7,0,1.3,0.6,1.3,1.3V24.7z M40.7,24.7c0,0.7-0.6,1.3-1.3,1.3h-0.3c-0.7,0-1.3-0.6-1.3-1.3v-2.1 + c0-0.7,0.6-1.3,1.3-1.3h0.3c0.7,0,1.3,0.6,1.3,1.3V24.7z"/> + <path class="st1" d="M54.8,35.8c0-1.3-1-2.3-2.3-2.3h-0.3c-1.3,0-2.3,1-2.3,2.3v0.3h-1.5v-0.3c0-1.3-1-2.3-2.3-2.3h-0.3 + c-1.3,0-2.3,1-2.3,2.3v0.3h-1.6v-0.3c0-1.3-1-2.3-2.3-2.3h-0.3c-1.3,0-2.3,1-2.3,2.3v0.3H14.2v1.5h22.6v0.3c0,1.3,1,2.3,2.3,2.3 + h0.3c1.3,0,2.3-1,2.3-2.3v-0.3h1.6v0.3c0,1.3,1,2.3,2.3,2.3H46c1.3,0,2.3-1,2.3-2.3v-0.3h1.5v0.3c0,1.3,1,2.3,2.3,2.3h0.3 + c1.3,0,2.3-1,2.3-2.3v-0.3h3v-1.5h-3V35.8z M40.7,37.9c0,0.7-0.6,1.3-1.3,1.3h-0.3c-0.7,0-1.3-0.6-1.3-1.3v-2.1 + c0-0.7,0.6-1.3,1.3-1.3h0.3c0.7,0,1.3,0.6,1.3,1.3V37.9z M47.3,37.9c0,0.7-0.6,1.3-1.3,1.3h-0.3c-0.7,0-1.3-0.6-1.3-1.3v-2.1 + c0-0.7,0.6-1.3,1.3-1.3H46c0.7,0,1.3,0.6,1.3,1.3V37.9z M53.8,37.9c0,0.7-0.6,1.3-1.3,1.3h-0.3c-0.7,0-1.3-0.6-1.3-1.3v-2.1 + c0-0.7,0.6-1.3,1.3-1.3h0.3c0.7,0,1.3,0.6,1.3,1.3V37.9z"/> +</g> +<rect x="0" y="0.1" class="st0" width="72" height="47.7"/> +</svg> diff --git a/src/img/subject_icons/subject_outras-linguas.svg b/src/img/subject_icons/subject_outras-linguas.svg new file mode 100644 index 0000000000000000000000000000000000000000..a4a182af31c99ce417e64399d3f43203fe2a749a --- /dev/null +++ b/src/img/subject_icons/subject_outras-linguas.svg @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M47,23.5c-0.3,0-0.5,0.2-0.5,0.5c0,5.6-2.2,11-6.1,15c-0.2,0.2-0.2,0.5,0,0.7c0.1,0.1,0.2,0.1,0.3,0.1 + c0.1,0,0.3-0.1,0.4-0.2c4.1-4.2,6.4-9.8,6.4-15.7C47.5,23.7,47.3,23.5,47,23.5z"/> + <path class="st1" d="M24.3,4.2c-10.9,0-19.8,8.9-19.8,19.8c0,4.1,1.2,8,3.6,11.4l0.1,0.1l-2.3,6.8l6.8-2.3l0.1,0.1 + c3.3,2.4,7.3,3.6,11.4,3.6c10.9,0,19.8-8.9,19.8-19.8C44,13.1,35.2,4.2,24.3,4.2z M24.3,42.2c-3.8,0-7.4-1.2-10.5-3.3L13,38.3 + l-4.7,1.6l1.6-4.7l-0.5-0.7C7.2,31.4,6,27.8,6,23.9C6,13.9,14.2,5.7,24.3,5.7c10.1,0,18.3,8.2,18.3,18.3 + C42.5,34,34.3,42.2,24.3,42.2z"/> + <path class="st1" d="M19.6,24.2c-0.3,0-0.6,0.1-0.8,0.3s-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7s0.4,0.3,0.8,0.3s0.6-0.1,0.8-0.3 + s0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7S19.9,24.2,19.6,24.2z"/> + <path class="st1" d="M24.3,24.2c-0.3,0-0.6,0.1-0.8,0.3s-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7s0.4,0.3,0.8,0.3s0.6-0.1,0.8-0.3 + s0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7S24.7,24.2,24.3,24.2z"/> + <path class="st1" d="M29.1,24.2c-0.3,0-0.6,0.1-0.8,0.3s-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7s0.4,0.3,0.8,0.3s0.6-0.1,0.8-0.3 + s0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7S29.4,24.2,29.1,24.2z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_outros.svg b/src/img/subject_icons/subject_outros.svg new file mode 100644 index 0000000000000000000000000000000000000000..8d5fbc1f8b3a316296e0729114006e93f3d19dfe --- /dev/null +++ b/src/img/subject_icons/subject_outros.svg @@ -0,0 +1,6 @@ +<svg width="57" height="57" viewBox="0 0 57 57" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M49.7096 12.0677C48.8692 11.3192 47.9354 11.0386 47.0015 11.0386H18.7064C17.4925 11.1321 16.4653 11.6935 15.7182 12.8161L5.63281 28.1591L15.8116 43.5021C16.5586 44.6247 17.6792 45.1861 18.9866 45.1861H47.0015C48.1221 45.1861 48.9626 44.8119 49.7096 44.0634C50.4567 43.315 50.8302 42.3794 50.8302 41.3503V14.8743C50.9236 13.7517 50.5501 12.9097 49.7096 12.0677ZM49.5229 41.2568C49.5229 42.0052 49.3361 42.5665 48.8692 43.0343C48.4023 43.5021 47.842 43.6892 47.0949 43.6892H18.9866C18.1462 43.6892 17.3991 43.315 16.9322 42.6601L7.31371 28.0655L16.9322 13.5646C17.3991 12.8161 18.0528 12.4419 18.7998 12.4419H47.0015C47.6552 12.4419 48.2155 12.7226 48.7758 13.0968C49.2427 13.5646 49.4295 14.1259 49.4295 14.8743V41.2568H49.5229Z" fill="#00BCD4"/> +<path d="M25.5239 26.2886C24.9636 26.2886 24.4967 26.4757 24.1232 26.8499C23.843 27.1306 23.6562 27.5983 23.6562 28.0661C23.6562 28.5339 23.843 29.0017 24.1232 29.2823C24.4033 29.6565 24.8702 29.8437 25.5239 29.8437C26.0842 29.8437 26.5511 29.6565 26.9247 29.2823C27.2982 29.0017 27.3916 28.6274 27.3916 28.0661C27.3916 27.5983 27.2048 27.1306 26.9247 26.7563C26.6445 26.4757 26.1776 26.2886 25.5239 26.2886ZM26.271 28.721C26.0842 28.9081 25.8974 28.9081 25.5239 28.9081C25.1504 28.9081 24.9636 28.8146 24.8702 28.721C24.6835 28.5339 24.5901 28.3468 24.5901 28.0661C24.5901 27.7855 24.6835 27.5983 24.7768 27.4112C24.8702 27.2241 25.1504 27.1306 25.4305 27.1306C25.8041 27.1306 25.9908 27.2241 26.1776 27.4112C26.3644 27.5983 26.4577 27.7855 26.4577 28.0661C26.4577 28.3468 26.3644 28.5339 26.271 28.721Z" fill="#00BCD4"/> +<path d="M32.0591 26.2886C31.4988 26.2886 31.0319 26.4757 30.6583 26.8499C30.3782 27.2241 30.1914 27.5983 30.1914 28.1597C30.1914 28.6274 30.3782 29.0952 30.6583 29.3759C30.9385 29.7501 31.4054 29.9372 32.0591 29.9372C32.6194 29.9372 33.0863 29.7501 33.4598 29.3759C33.74 29.0017 33.9267 28.6274 33.9267 28.1597C33.9267 27.6919 33.74 27.2241 33.4598 26.8499C33.1797 26.4757 32.7127 26.2886 32.0591 26.2886ZM32.8061 28.721C32.6194 28.9081 32.4326 28.9081 32.0591 28.9081C31.6855 28.9081 31.4988 28.8146 31.4054 28.721C31.2186 28.5339 31.2186 28.3468 31.2186 28.0661C31.2186 27.7855 31.312 27.5983 31.4054 27.4112C31.5922 27.2241 31.7789 27.1306 32.0591 27.1306C32.4326 27.1306 32.6194 27.2241 32.8061 27.4112C32.9929 27.5983 33.0863 27.7855 33.0863 28.0661C33.0863 28.3468 32.9929 28.5339 32.8061 28.721Z" fill="#00BCD4"/> +<path d="M38.6919 26.2886C38.1316 26.2886 37.6647 26.4757 37.2911 26.8499C37.011 27.2241 36.8242 27.5983 36.8242 28.1597C36.8242 28.6274 37.011 29.0952 37.2911 29.3759C37.5713 29.7501 38.0382 29.9372 38.6919 29.9372C39.2522 29.9372 39.7191 29.7501 40.0926 29.3759C40.3728 29.0017 40.5595 28.6274 40.5595 28.1597C40.5595 27.6919 40.3728 27.2241 40.0926 26.8499C39.7191 26.4757 39.2522 26.2886 38.6919 26.2886ZM39.3456 28.721C39.1588 28.9081 38.972 28.9081 38.5985 28.9081C38.3183 28.9081 38.0382 28.8146 37.9448 28.721C37.7581 28.5339 37.758 28.3468 37.758 28.0661C37.758 27.7855 37.8514 27.5983 37.9448 27.4112C38.0382 27.2241 38.3183 27.1306 38.5985 27.1306C38.972 27.1306 39.1588 27.2241 39.3456 27.4112C39.5323 27.5983 39.6257 27.7855 39.6257 28.0661C39.6257 28.3468 39.5323 28.5339 39.3456 28.721Z" fill="#00BCD4"/> +</svg> diff --git a/src/img/subject_icons/subject_quimica.svg b/src/img/subject_icons/subject_quimica.svg new file mode 100644 index 0000000000000000000000000000000000000000..4f897aa786134c3703100c03174392f503a37758 --- /dev/null +++ b/src/img/subject_icons/subject_quimica.svg @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.1" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M26.5,30.6c0-1.6-1.1-2.8-2.8-2.8s-2.8,1.1-2.8,2.8c0,1.6,1.1,2.8,2.8,2.8S26.5,32.3,26.5,30.6z M23.7,32.4 + c-1.1,0-1.8-0.7-1.8-1.8s0.7-1.8,1.8-1.8s1.8,0.7,1.8,1.8S24.8,32.4,23.7,32.4z"/> + <path class="st1" d="M28.3,24.3c1.6,0,2.8-1.1,2.8-2.8s-1.1-2.8-2.8-2.8s-2.8,1.1-2.8,2.8S26.6,24.3,28.3,24.3z M28.3,19.7 + c1.1,0,1.8,0.7,1.8,1.8s-0.7,1.8-1.8,1.8s-1.8-0.7-1.8-1.8S27.2,19.7,28.3,19.7z"/> + <path class="st1" d="M32.2,36.1c-0.3,0-0.5,0.2-0.5,0.5c0,3.7-3,6.8-6.8,6.8c-0.3,0-0.5,0.2-0.5,0.5s0.2,0.5,0.5,0.5 + c4.3,0,7.8-3.5,7.8-7.8C32.7,36.3,32.4,36.1,32.2,36.1z"/> + <path class="st1" d="M38.2,0.6H13.8v5.5h2.4v31.4c0,5.4,4.4,9.9,9.9,9.9s9.9-4.4,9.9-9.9V6.1h2.4V0.6z M26,45.8 + c-4.6,0-8.4-3.8-8.4-8.4V12.9h16.7v24.6C34.4,42.1,30.6,45.8,26,45.8z M34.4,11.9H17.6V6.1h16.7V11.9z M37.2,5.1H14.8V1.6h22.4V5.1 + z"/> +</g> +</svg> diff --git a/src/img/subject_icons/subject_sociologia.svg b/src/img/subject_icons/subject_sociologia.svg new file mode 100644 index 0000000000000000000000000000000000000000..e2cdacd0addb9ea8255b3b768a7b1806037bbb6a --- /dev/null +++ b/src/img/subject_icons/subject_sociologia.svg @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Camada_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0.1 52 47.7" style="enable-background:new 0 0.1 52 47.7;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:none;} + .st1{fill:#00BCD4;} +</style> +<rect x="0" y="0.2" class="st0" width="52" height="47.7"/> +<g> + <g id="REA_Conteudo"> + <g id="Image"> + </g> + </g> + <g id="Content"> + </g> + <g id="Pesquisa"> + </g> + <g id="Print"> + </g> +</g> +<g> + <path class="st1" d="M48,8.3c1.7-1.7,1.7-4.6,0-6.3c-0.8-0.8-2-1.3-3.2-1.3s-2.3,0.5-3.2,1.3s-1.3,2-1.3,3.2c0,0.7,0.2,1.4,0.5,2 + C37,3.8,32,2.2,26.9,2.8l-0.9,0.1L27.5,8l0.6,0c1.2-0.1,2.4,0,3.5,0.3l-1.2,4.4l0.7,0.2c1.4,0.4,2.8,1.1,3.8,2.2 + c1.1,1.1,1.8,2.4,2.2,3.8l0.2,0.7l4.3-1.2c0.2,1.2,0.3,2.4,0.2,3.6l0,0.6L47,24l0.1-0.9c0.6-5.1-1-10.2-4.3-14.1 + c0.6,0.3,1.3,0.5,2,0.5C46,9.6,47.2,9.1,48,8.3z M42.7,3c0.6-0.6,1.3-0.9,2.1-0.9S46.4,2.4,47,3c1.2,1.2,1.2,3.1,0,4.2 + c-1.1,1.1-3.1,1.1-4.2,0c-0.6-0.6-0.9-1.3-0.9-2.1C41.9,4.3,42.2,3.6,42.7,3z M45.7,22.1l-2.3-0.6c0-1.4-0.1-2.8-0.5-4.2l-0.2-0.7 + l-4.4,1.2C37.9,16.3,37.1,15,36,14c-1.1-1.1-2.4-1.9-3.8-2.4l1.2-4.4L32.7,7c-1.3-0.4-2.7-0.5-4.1-0.5L28,4.2 + c4.8-0.2,9.4,1.5,12.8,4.9C44.2,12.5,46,17.3,45.7,22.1z"/> + <path class="st1" d="M18.1,28.2c-0.6-0.9-1.1-1.9-1.5-3l4.6-1.3L21,23.2c-0.8-2.8-0.1-5.9,2-8l0.5-0.5l-3.3-3.3 + c0.9-0.8,1.9-1.5,2.9-2l0.5-0.3l-1.4-5.2l-0.8,0.4c-4.7,2.1-8.2,6.1-9.8,10.9c0-0.7-0.2-1.4-0.6-2c-0.6-1-1.6-1.8-2.7-2.1 + c-2.4-0.6-4.8,0.8-5.5,3.2c-0.6,2.4,0.8,4.8,3.2,5.5c0.4,0.1,0.8,0.1,1.1,0.1c1.5,0,2.9-0.8,3.8-2.1c-0.9,4.9,0.3,9.9,3.2,14 + l0.5,0.7l3.8-3.8L18.1,28.2z M10,16.2c-0.4,1.6-2,2.6-3.6,2.1c-1.6-0.4-2.6-2-2.1-3.6c0.2-0.8,0.7-1.4,1.4-1.8 + c0.5-0.3,1-0.4,1.5-0.4c0.3,0,0.5,0,0.8,0.1c0.8,0.2,1.4,0.7,1.8,1.4C10.1,14.6,10.2,15.4,10,16.2z M14.8,30.2 + c-2.6-4-3.4-8.8-2.2-13.4C13.9,12.2,17,8.2,21.3,6l0.6,2.3c-1.2,0.7-2.3,1.5-3.3,2.6l-0.5,0.5l3.4,3.3c-1.9,2.3-2.6,5.3-2,8.2 + l-4.6,1.3l0.2,0.7c0.4,1.3,0.9,2.5,1.5,3.6L14.8,30.2z"/> + <path class="st1" d="M40.6,26.9c-0.5,1.1-1.2,2.1-2,2.9l-3.3-3.3l-0.5,0.5c-2.1,2-5.2,2.7-8,1.9L26,28.7l-1.3,4.7 + c-1.1-0.4-2.1-0.9-3-1.5l-0.5-0.3l-3.8,3.8l0.7,0.5c3.2,2.3,7,3.5,10.8,3.5c1.1,0,2.2-0.1,3.3-0.3c-1.6,1-2.4,3-2,4.9 + c0.3,1.2,1,2.1,2.1,2.7c0.7,0.4,1.5,0.6,2.3,0.6c0.4,0,0.8,0,1.1-0.1c2.4-0.6,3.8-3.1,3.2-5.5c-0.3-1.2-1-2.1-2.1-2.7 + c-0.6-0.4-1.3-0.5-2-0.6c4.8-1.6,8.8-5.2,10.9-9.8l0.4-0.8l-5.2-1.4L40.6,26.9z M37.4,42.2c0.4,1.6-0.5,3.2-2.1,3.6 + c-0.8,0.2-1.6,0.1-2.3-0.3s-1.2-1.1-1.4-1.8c-0.4-1.6,0.5-3.2,2.1-3.6C34,40,34.3,40,34.5,40c0.5,0,1,0.1,1.5,0.4 + C36.7,40.8,37.2,41.4,37.4,42.2z M43.9,28.8c-2.2,4.2-6.2,7.4-10.8,8.6c-4.6,1.2-9.5,0.4-13.5-2.2l1.7-1.7c1.1,0.7,2.4,1.2,3.6,1.6 + l0.7,0.2l1.3-4.8c2.9,0.6,5.9-0.1,8.2-1.9l3.3,3.4l0.5-0.5c1-1,1.9-2.1,2.6-3.3L43.9,28.8z"/> +</g> +</svg> diff --git a/src/img/twitter.svg b/src/img/twitter.svg new file mode 100644 index 0000000000000000000000000000000000000000..a8f67cc32a3ae9a5b6b6aeef9c9546a89137adf8 --- /dev/null +++ b/src/img/twitter.svg @@ -0,0 +1,4 @@ +<svg width="50" height="50" viewBox="0 0 50 50" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M25 50C38.8071 50 50 38.8071 50 25C50 11.1929 38.8071 0 25 0C11.1929 0 0 11.1929 0 25C0 38.8071 11.1929 50 25 50Z" fill="#55ACEE"/> +<path d="M40.3132 17.9663C39.2419 18.4414 38.0894 18.7627 36.8808 18.9062C38.1148 18.1668 39.0618 16.997 39.5088 15.6008C38.3542 16.2858 37.0747 16.7827 35.7141 17.0505C34.6241 15.8896 33.071 15.1641 31.3512 15.1641C28.0517 15.1641 25.3755 17.8402 25.3755 21.1398C25.3755 21.6081 25.4286 22.064 25.5311 22.5017C20.5648 22.2526 16.1613 19.8737 13.2138 16.2572C12.6995 17.1396 12.4045 18.1668 12.4045 19.2618C12.4045 21.3345 13.4602 23.1643 15.0628 24.2357C14.0837 24.2049 13.1616 23.9362 12.3564 23.4874C12.3559 23.5128 12.3559 23.5382 12.3559 23.5632C12.3559 26.4586 14.4166 28.8736 17.1497 29.4221C16.6488 29.5594 16.1199 29.632 15.5757 29.632C15.1898 29.632 14.8159 29.5951 14.4513 29.5255C15.2116 31.8991 17.418 33.6268 20.0335 33.6754C17.988 35.2784 15.4117 36.2334 12.6113 36.2334C12.13 36.2334 11.6531 36.2054 11.1865 36.1497C13.8297 37.8458 16.9715 38.8347 20.3459 38.8347C31.3374 38.8347 37.3483 29.7292 37.3483 21.8319C37.3483 21.5729 37.3425 21.3149 37.3309 21.0591C38.4994 20.2168 39.5124 19.1647 40.3132 17.9663Z" fill="#F1F2F2"/> +</svg> diff --git a/src/index.css b/src/index.css index 4e83f283d3889e3eed001d2fa220e4b5f0b009d9..954a9e8f75d3224cd71757bc80193fdaad5ac914 100755 --- a/src/index.css +++ b/src/index.css @@ -30,3 +30,7 @@ code { font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } + +a { + text-decoration: none; +} diff --git a/src/index.js b/src/index.js index 7759fd80d097363e57313a8bedfae2e84e0ce75f..032a5eeeccd2687e53c6e2e72097dae3ff7efa72 100755 --- a/src/index.js +++ b/src/index.js @@ -19,7 +19,6 @@ along with Plataforma Integrada MEC. If not, see <http://www.gnu.org/licenses/> import React from 'react'; import ReactDOM from 'react-dom'; import * as serviceWorker from './serviceWorker'; - import './index.css'; import App from './App.js' import { StoreProvider } from './Store'; @@ -27,7 +26,7 @@ import { StoreProvider } from './Store'; ReactDOM.render( <StoreProvider> - <App /> + <App /> </StoreProvider> , document.getElementById('root')); diff --git a/src/react-app-env.d.ts b/src/react-app-env.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..6431bc5fc6b2c932dfe5d0418fc667b86c18b9fc --- /dev/null +++ b/src/react-app-env.d.ts @@ -0,0 +1 @@ +/// <reference types="react-scripts" /> diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ce12e006e2adffd753e4462829f288ad87393ca0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "experimentalDecorators" : true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve" + }, + "include": [ + "src" + ] +}