├── .eslintrc.json
├── .github
└── workflows
│ └── linters.yaml
├── .gitignore
├── .hintrc
├── .stylelintrc.json
├── README.md
├── dist
├── index.html
└── main.js
├── package-lock.json
├── package.json
├── src
├── index.html
├── index.js
├── list.js
└── style.css
└── webpack.config.js
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "es6": true,
5 | "jest": true
6 | },
7 | "parser": "babel-eslint",
8 | "parserOptions": {
9 | "ecmaVersion": 2018,
10 | "sourceType": "module"
11 | },
12 | "extends": ["airbnb-base"],
13 | "rules": {
14 | "no-shadow": "off",
15 | "no-param-reassign": "off",
16 | "eol-last": "off",
17 | "import/extensions": [ 1, {
18 | "js": "always", "json": "always"
19 | }]
20 | },
21 | "ignorePatterns": [
22 | "dist/",
23 | "build/"
24 | ]
25 | }
--------------------------------------------------------------------------------
/.github/workflows/linters.yaml:
--------------------------------------------------------------------------------
1 | name: Linters
2 |
3 | on: pull_request
4 |
5 | env:
6 | FORCE_COLOR: 1
7 |
8 | jobs:
9 | lighthouse:
10 | name: Lighthouse
11 | runs-on: ubuntu-18.04
12 | steps:
13 | - uses: actions/checkout@v2
14 | - uses: actions/setup-node@v1
15 | with:
16 | node-version: "12.x"
17 | - name: Setup Lighthouse
18 | run: npm install -g @lhci/cli@0.7.x
19 | - name: Lighthouse Report
20 | run: lhci autorun --upload.target=temporary-public-storage --collect.staticDistDir=.
21 | webhint:
22 | name: Webhint
23 | runs-on: ubuntu-18.04
24 | steps:
25 | - uses: actions/checkout@v2
26 | - uses: actions/setup-node@v1
27 | with:
28 | node-version: "12.x"
29 | - name: Setup Webhint
30 | run: |
31 | npm install --save-dev hint@6.x
32 | [ -f .hintrc ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.hintrc
33 | - name: Webhint Report
34 | run: npx hint .
35 | stylelint:
36 | name: Stylelint
37 | runs-on: ubuntu-18.04
38 | steps:
39 | - uses: actions/checkout@v2
40 | - uses: actions/setup-node@v1
41 | with:
42 | node-version: "12.x"
43 | - name: Setup Stylelint
44 | run: |
45 | npm install --save-dev stylelint@13.x stylelint-scss@3.x stylelint-config-standard@21.x stylelint-csstree-validator@1.x
46 | [ -f .stylelintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.stylelintrc.json
47 | - name: Stylelint Report
48 | run: npx stylelint "**/*.{css,scss}"
49 | eslint:
50 | name: ESLint
51 | runs-on: ubuntu-18.04
52 | steps:
53 | - uses: actions/checkout@v2
54 | - uses: actions/setup-node@v1
55 | with:
56 | node-version: "12.x"
57 | - name: Setup ESLint
58 | run: |
59 | npm install --save-dev eslint@7.x eslint-config-airbnb-base@14.x eslint-plugin-import@2.x babel-eslint@10.x
60 | [ -f .eslintrc.json ] || wget https://raw.githubusercontent.com/microverseinc/linters-config/master/html-css-js/.eslintrc.json
61 | - name: ESLint Report
62 | run: npx eslint .
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/.hintrc:
--------------------------------------------------------------------------------
1 | {
2 | "connector": {
3 | "name": "local",
4 | "options": {
5 | "pattern": ["**", "!.git/**", "!node_modules/**"]
6 | }
7 | },
8 | "extends": ["development"],
9 | "formatters": ["stylish"],
10 | "hints": [
11 | "button-type",
12 | "disown-opener",
13 | "html-checker",
14 | "meta-charset-utf-8",
15 | "meta-viewport",
16 | "no-inline-styles:error"
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/.stylelintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": ["stylelint-config-standard"],
3 | "plugins": ["stylelint-scss", "stylelint-csstree-validator"],
4 | "rules": {
5 | "at-rule-no-unknown": null,
6 | "scss/at-rule-no-unknown": true,
7 | "csstree/validator": true
8 | },
9 | "ignoreFiles": ["build/**", "dist/**", "**/reset*.css", "**/bootstrap*.css", "**/*.js", "**/*.jsx"]
10 | }
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Todo-List
2 |
3 |
4 | > This is my approach to the To-Do List project from M2W2. This will be a web app where you can add and remove things you need to do.
5 |
6 | ## Live Demo
7 |
8 |
9 |
10 | ### Features implemented:
11 | * Dynamically loading the list
12 |
13 | ## Built With
14 | - HTML5
15 | - CSS3 (Flex and Media queries)
16 | - Bootstrap styling (A popular CSS Framework for developing responsive and mobile-first websites.)
17 | - Lighthouse (An open-source, automated tool for improving the quality of web pages. It has audits for performance, accessibility, progressive web apps, SEO and more).
18 | - Webhint (A customizable linting tool that helps you improve your site's accessibility, speed, cross-browser compatibility, and more by checking your code for best practices and common errors).
19 | - Stylelint (A mighty, modern linter that helps you avoid errors and enforce conventions in your styles).
20 | - ESlint (A mighty, modern linter that helps you avoid errors and enforce conventions in JavaScript codes)
21 |
22 | ## Getting started
23 |
24 | Installl dependencies : npm install
25 |
26 | To build the project run : npm run build
27 |
28 | To start the server, run : npm start
29 |
30 | ## Acknowledgement
31 |
32 | ---
33 |
34 | ## License
35 | All source code files are licensed under the permissive zlib license
36 | (http://opensource.org/licenses/Zlib) unless marked differently in a particular folder/file.
37 |
38 | ## Author
39 |
40 | 👤 **Adrian**
41 |
42 | - GitHub: [Adrian's Github](https://github.com/AdrianCSM)
43 | - Twitter: [Adrian's Twitter](https://twitter.com/CosminAdriannn)
44 | - LinkedIn: [Adrian's LinkedIn](https://www.linkedin.com/in/gheorghita-cosmin-adrian-b7781122a/)
--------------------------------------------------------------------------------
/dist/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | To-Do List
8 |
9 |
10 |
11 |
12 |
13 |
17 |
23 |
26 |
27 | Clear All Completed
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/dist/main.js:
--------------------------------------------------------------------------------
1 | /******/ (() => { // webpackBootstrap
2 | /******/ "use strict";
3 | /******/ var __webpack_modules__ = ({
4 |
5 | /***/ "./node_modules/css-loader/dist/cjs.js!./src/style.css":
6 | /*!*************************************************************!*\
7 | !*** ./node_modules/css-loader/dist/cjs.js!./src/style.css ***!
8 | \*************************************************************/
9 | /***/ ((module, __webpack_exports__, __webpack_require__) => {
10 |
11 | __webpack_require__.r(__webpack_exports__);
12 | /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
14 | /* harmony export */ });
15 | /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/sourceMaps.js */ "./node_modules/css-loader/dist/runtime/sourceMaps.js");
16 | /* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
17 | /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js");
18 | /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
19 | // Imports
20 |
21 |
22 | var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
23 | // Module
24 | ___CSS_LOADER_EXPORT___.push([module.id, "body {\r\n background: #f6f6f6;\r\n}\r\n\r\nbody * {\r\n color: rgb(84, 88, 98);\r\n font-family: 'Open Sans', 'Lucida Grande', tahoma, verdana, arial, sans-serif;\r\n}\r\n\r\nmain {\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 95vh;\r\n margin: 0 auto;\r\n}\r\n\r\n.todo-list {\r\n box-shadow: rgba(0, 0, 0, 0.15) 0 2px 8px 0;\r\n width: 500px;\r\n max-width: 100%;\r\n}\r\n\r\nform button .material-icons {\r\n font-size: 15px;\r\n}\r\n\r\n.todo-list .material-icons {\r\n transition: 0.6s;\r\n color: #9797a5;\r\n cursor: pointer;\r\n}\r\n\r\n.header .material-icons {\r\n font-size: 18px;\r\n}\r\n\r\n.todo-list .material-icons:hover {\r\n color: #333;\r\n}\r\n\r\n.todo-list .material-icons.move {\r\n cursor: move;\r\n}\r\n\r\n.header {\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.header,\r\nform,\r\nul {\r\n background: #fff;\r\n margin: 0;\r\n width: 100%;\r\n padding: 0;\r\n list-style-type: none;\r\n}\r\n\r\n.header,\r\nh2 {\r\n align-items: center;\r\n color: #545862;\r\n font-size: 18px;\r\n font-weight: 400;\r\n padding: 1rem;\r\n line-height: 20px;\r\n margin: 0;\r\n width: calc(100% - 2rem);\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\nform input {\r\n width: calc(100% - 25px);\r\n border: 0 solid transparent;\r\n outline: none;\r\n font-style: italic;\r\n line-height: 40px;\r\n height: 40px;\r\n font-size: 15px;\r\n}\r\n\r\nform {\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n width: calc(100% - 40px);\r\n padding: 10px 10px 10px 30px;\r\n}\r\n\r\nform button {\r\n background: #fff;\r\n border: 0 solid transparent;\r\n}\r\n\r\n.list-item {\r\n width: calc(100% - 40px);\r\n padding: 10px 10px 10px 30px;\r\n font-size: 1rem;\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n font-weight: 300;\r\n align-items: center;\r\n}\r\n\r\n.list-item p {\r\n width: calc(100% - 50px);\r\n border: 0 solid transparent;\r\n outline: none;\r\n height: 22px;\r\n line-height: 22px;\r\n padding: 0;\r\n margin: 0;\r\n padding-left: 20px;\r\n font-weight: 300;\r\n font-size: 15px;\r\n overflow-y: auto;\r\n background: #fff;\r\n}\r\n\r\n.list-item .material-icons.done {\r\n color: rgb(46, 138, 230);\r\n}\r\n\r\n.list-item p.completed {\r\n text-decoration-line: line-through;\r\n color: rgba(0, 0, 0, 0.45);\r\n}\r\n\r\n.list-item.editing {\r\n background-color: #fffeca;\r\n}\r\n\r\n.clear-completed {\r\n width: 100%;\r\n text-align: center;\r\n padding: 20px 6px;\r\n justify-content: center;\r\n}\r\n\r\n.clear-completed:hover {\r\n text-decoration: underline;\r\n cursor: pointer;\r\n}\r\n\r\n.d-flex {\r\n display: flex;\r\n}\r\n\r\n.cols {\r\n flex-direction: column;\r\n}\r\n\r\n.s-between {\r\n justify-content: space-between;\r\n}\r\n", "",{"version":3,"sources":["webpack://./src/style.css"],"names":[],"mappings":"AAAA;EACE,mBAAmB;AACrB;;AAEA;EACE,sBAAsB;EACtB,6EAA6E;AAC/E;;AAEA;EACE,uBAAuB;EACvB,mBAAmB;EACnB,gBAAgB;EAChB,cAAc;AAChB;;AAEA;EACE,2CAA2C;EAC3C,YAAY;EACZ,eAAe;AACjB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,gBAAgB;EAChB,cAAc;EACd,eAAe;AACjB;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,4CAA4C;AAC9C;;AAEA;;;EAGE,gBAAgB;EAChB,SAAS;EACT,WAAW;EACX,UAAU;EACV,qBAAqB;AACvB;;AAEA;;EAEE,mBAAmB;EACnB,cAAc;EACd,eAAe;EACf,gBAAgB;EAChB,aAAa;EACb,iBAAiB;EACjB,SAAS;EACT,wBAAwB;EACxB,uBAAuB;EACvB,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,wBAAwB;EACxB,2BAA2B;EAC3B,aAAa;EACb,kBAAkB;EAClB,iBAAiB;EACjB,YAAY;EACZ,eAAe;AACjB;;AAEA;EACE,4CAA4C;EAC5C,wBAAwB;EACxB,4BAA4B;AAC9B;;AAEA;EACE,gBAAgB;EAChB,2BAA2B;AAC7B;;AAEA;EACE,wBAAwB;EACxB,4BAA4B;EAC5B,eAAe;EACf,4CAA4C;EAC5C,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,wBAAwB;EACxB,2BAA2B;EAC3B,aAAa;EACb,YAAY;EACZ,iBAAiB;EACjB,UAAU;EACV,SAAS;EACT,kBAAkB;EAClB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,kCAAkC;EAClC,0BAA0B;AAC5B;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,WAAW;EACX,kBAAkB;EAClB,iBAAiB;EACjB,uBAAuB;AACzB;;AAEA;EACE,0BAA0B;EAC1B,eAAe;AACjB;;AAEA;EACE,aAAa;AACf;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,8BAA8B;AAChC","sourcesContent":["body {\r\n background: #f6f6f6;\r\n}\r\n\r\nbody * {\r\n color: rgb(84, 88, 98);\r\n font-family: 'Open Sans', 'Lucida Grande', tahoma, verdana, arial, sans-serif;\r\n}\r\n\r\nmain {\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 95vh;\r\n margin: 0 auto;\r\n}\r\n\r\n.todo-list {\r\n box-shadow: rgba(0, 0, 0, 0.15) 0 2px 8px 0;\r\n width: 500px;\r\n max-width: 100%;\r\n}\r\n\r\nform button .material-icons {\r\n font-size: 15px;\r\n}\r\n\r\n.todo-list .material-icons {\r\n transition: 0.6s;\r\n color: #9797a5;\r\n cursor: pointer;\r\n}\r\n\r\n.header .material-icons {\r\n font-size: 18px;\r\n}\r\n\r\n.todo-list .material-icons:hover {\r\n color: #333;\r\n}\r\n\r\n.todo-list .material-icons.move {\r\n cursor: move;\r\n}\r\n\r\n.header {\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.header,\r\nform,\r\nul {\r\n background: #fff;\r\n margin: 0;\r\n width: 100%;\r\n padding: 0;\r\n list-style-type: none;\r\n}\r\n\r\n.header,\r\nh2 {\r\n align-items: center;\r\n color: #545862;\r\n font-size: 18px;\r\n font-weight: 400;\r\n padding: 1rem;\r\n line-height: 20px;\r\n margin: 0;\r\n width: calc(100% - 2rem);\r\n text-overflow: ellipsis;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\nform input {\r\n width: calc(100% - 25px);\r\n border: 0 solid transparent;\r\n outline: none;\r\n font-style: italic;\r\n line-height: 40px;\r\n height: 40px;\r\n font-size: 15px;\r\n}\r\n\r\nform {\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n width: calc(100% - 40px);\r\n padding: 10px 10px 10px 30px;\r\n}\r\n\r\nform button {\r\n background: #fff;\r\n border: 0 solid transparent;\r\n}\r\n\r\n.list-item {\r\n width: calc(100% - 40px);\r\n padding: 10px 10px 10px 30px;\r\n font-size: 1rem;\r\n border-bottom: 1px solid rgba(0, 0, 0, 0.08);\r\n font-weight: 300;\r\n align-items: center;\r\n}\r\n\r\n.list-item p {\r\n width: calc(100% - 50px);\r\n border: 0 solid transparent;\r\n outline: none;\r\n height: 22px;\r\n line-height: 22px;\r\n padding: 0;\r\n margin: 0;\r\n padding-left: 20px;\r\n font-weight: 300;\r\n font-size: 15px;\r\n overflow-y: auto;\r\n background: #fff;\r\n}\r\n\r\n.list-item .material-icons.done {\r\n color: rgb(46, 138, 230);\r\n}\r\n\r\n.list-item p.completed {\r\n text-decoration-line: line-through;\r\n color: rgba(0, 0, 0, 0.45);\r\n}\r\n\r\n.list-item.editing {\r\n background-color: #fffeca;\r\n}\r\n\r\n.clear-completed {\r\n width: 100%;\r\n text-align: center;\r\n padding: 20px 6px;\r\n justify-content: center;\r\n}\r\n\r\n.clear-completed:hover {\r\n text-decoration: underline;\r\n cursor: pointer;\r\n}\r\n\r\n.d-flex {\r\n display: flex;\r\n}\r\n\r\n.cols {\r\n flex-direction: column;\r\n}\r\n\r\n.s-between {\r\n justify-content: space-between;\r\n}\r\n"],"sourceRoot":""}]);
25 | // Exports
26 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);
27 |
28 |
29 | /***/ }),
30 |
31 | /***/ "./node_modules/css-loader/dist/runtime/api.js":
32 | /*!*****************************************************!*\
33 | !*** ./node_modules/css-loader/dist/runtime/api.js ***!
34 | \*****************************************************/
35 | /***/ ((module) => {
36 |
37 |
38 |
39 | /*
40 | MIT License http://www.opensource.org/licenses/mit-license.php
41 | Author Tobias Koppers @sokra
42 | */
43 | module.exports = function (cssWithMappingToString) {
44 | var list = []; // return the list of modules as css string
45 |
46 | list.toString = function toString() {
47 | return this.map(function (item) {
48 | var content = "";
49 | var needLayer = typeof item[5] !== "undefined";
50 |
51 | if (item[4]) {
52 | content += "@supports (".concat(item[4], ") {");
53 | }
54 |
55 | if (item[2]) {
56 | content += "@media ".concat(item[2], " {");
57 | }
58 |
59 | if (needLayer) {
60 | content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {");
61 | }
62 |
63 | content += cssWithMappingToString(item);
64 |
65 | if (needLayer) {
66 | content += "}";
67 | }
68 |
69 | if (item[2]) {
70 | content += "}";
71 | }
72 |
73 | if (item[4]) {
74 | content += "}";
75 | }
76 |
77 | return content;
78 | }).join("");
79 | }; // import a list of modules into the list
80 |
81 |
82 | list.i = function i(modules, media, dedupe, supports, layer) {
83 | if (typeof modules === "string") {
84 | modules = [[null, modules, undefined]];
85 | }
86 |
87 | var alreadyImportedModules = {};
88 |
89 | if (dedupe) {
90 | for (var k = 0; k < this.length; k++) {
91 | var id = this[k][0];
92 |
93 | if (id != null) {
94 | alreadyImportedModules[id] = true;
95 | }
96 | }
97 | }
98 |
99 | for (var _k = 0; _k < modules.length; _k++) {
100 | var item = [].concat(modules[_k]);
101 |
102 | if (dedupe && alreadyImportedModules[item[0]]) {
103 | continue;
104 | }
105 |
106 | if (typeof layer !== "undefined") {
107 | if (typeof item[5] === "undefined") {
108 | item[5] = layer;
109 | } else {
110 | item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}");
111 | item[5] = layer;
112 | }
113 | }
114 |
115 | if (media) {
116 | if (!item[2]) {
117 | item[2] = media;
118 | } else {
119 | item[1] = "@media ".concat(item[2], " {").concat(item[1], "}");
120 | item[2] = media;
121 | }
122 | }
123 |
124 | if (supports) {
125 | if (!item[4]) {
126 | item[4] = "".concat(supports);
127 | } else {
128 | item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}");
129 | item[4] = supports;
130 | }
131 | }
132 |
133 | list.push(item);
134 | }
135 | };
136 |
137 | return list;
138 | };
139 |
140 | /***/ }),
141 |
142 | /***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js":
143 | /*!************************************************************!*\
144 | !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***!
145 | \************************************************************/
146 | /***/ ((module) => {
147 |
148 |
149 |
150 | module.exports = function (item) {
151 | var content = item[1];
152 | var cssMapping = item[3];
153 |
154 | if (!cssMapping) {
155 | return content;
156 | }
157 |
158 | if (typeof btoa === "function") {
159 | var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));
160 | var data = "sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(base64);
161 | var sourceMapping = "/*# ".concat(data, " */");
162 | var sourceURLs = cssMapping.sources.map(function (source) {
163 | return "/*# sourceURL=".concat(cssMapping.sourceRoot || "").concat(source, " */");
164 | });
165 | return [content].concat(sourceURLs).concat([sourceMapping]).join("\n");
166 | }
167 |
168 | return [content].join("\n");
169 | };
170 |
171 | /***/ }),
172 |
173 | /***/ "./src/style.css":
174 | /*!***********************!*\
175 | !*** ./src/style.css ***!
176 | \***********************/
177 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
178 |
179 | __webpack_require__.r(__webpack_exports__);
180 | /* harmony export */ __webpack_require__.d(__webpack_exports__, {
181 | /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
182 | /* harmony export */ });
183 | /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js");
184 | /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);
185 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleDomAPI.js */ "./node_modules/style-loader/dist/runtime/styleDomAPI.js");
186 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);
187 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertBySelector.js */ "./node_modules/style-loader/dist/runtime/insertBySelector.js");
188 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);
189 | /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js");
190 | /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);
191 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/insertStyleElement.js */ "./node_modules/style-loader/dist/runtime/insertStyleElement.js");
192 | /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);
193 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../node_modules/style-loader/dist/runtime/styleTagTransform.js */ "./node_modules/style-loader/dist/runtime/styleTagTransform.js");
194 | /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);
195 | /* harmony import */ var _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../node_modules/css-loader/dist/cjs.js!./style.css */ "./node_modules/css-loader/dist/cjs.js!./src/style.css");
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 | var options = {};
208 |
209 | options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
210 | options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
211 |
212 | options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
213 |
214 | options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
215 | options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
216 |
217 | var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"], options);
218 |
219 |
220 |
221 |
222 | /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"] && _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals ? _node_modules_css_loader_dist_cjs_js_style_css__WEBPACK_IMPORTED_MODULE_6__["default"].locals : undefined);
223 |
224 |
225 | /***/ }),
226 |
227 | /***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js":
228 | /*!****************************************************************************!*\
229 | !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
230 | \****************************************************************************/
231 | /***/ ((module) => {
232 |
233 |
234 |
235 | var stylesInDOM = [];
236 |
237 | function getIndexByIdentifier(identifier) {
238 | var result = -1;
239 |
240 | for (var i = 0; i < stylesInDOM.length; i++) {
241 | if (stylesInDOM[i].identifier === identifier) {
242 | result = i;
243 | break;
244 | }
245 | }
246 |
247 | return result;
248 | }
249 |
250 | function modulesToDom(list, options) {
251 | var idCountMap = {};
252 | var identifiers = [];
253 |
254 | for (var i = 0; i < list.length; i++) {
255 | var item = list[i];
256 | var id = options.base ? item[0] + options.base : item[0];
257 | var count = idCountMap[id] || 0;
258 | var identifier = "".concat(id, " ").concat(count);
259 | idCountMap[id] = count + 1;
260 | var indexByIdentifier = getIndexByIdentifier(identifier);
261 | var obj = {
262 | css: item[1],
263 | media: item[2],
264 | sourceMap: item[3],
265 | supports: item[4],
266 | layer: item[5]
267 | };
268 |
269 | if (indexByIdentifier !== -1) {
270 | stylesInDOM[indexByIdentifier].references++;
271 | stylesInDOM[indexByIdentifier].updater(obj);
272 | } else {
273 | var updater = addElementStyle(obj, options);
274 | options.byIndex = i;
275 | stylesInDOM.splice(i, 0, {
276 | identifier: identifier,
277 | updater: updater,
278 | references: 1
279 | });
280 | }
281 |
282 | identifiers.push(identifier);
283 | }
284 |
285 | return identifiers;
286 | }
287 |
288 | function addElementStyle(obj, options) {
289 | var api = options.domAPI(options);
290 | api.update(obj);
291 |
292 | var updater = function updater(newObj) {
293 | if (newObj) {
294 | if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {
295 | return;
296 | }
297 |
298 | api.update(obj = newObj);
299 | } else {
300 | api.remove();
301 | }
302 | };
303 |
304 | return updater;
305 | }
306 |
307 | module.exports = function (list, options) {
308 | options = options || {};
309 | list = list || [];
310 | var lastIdentifiers = modulesToDom(list, options);
311 | return function update(newList) {
312 | newList = newList || [];
313 |
314 | for (var i = 0; i < lastIdentifiers.length; i++) {
315 | var identifier = lastIdentifiers[i];
316 | var index = getIndexByIdentifier(identifier);
317 | stylesInDOM[index].references--;
318 | }
319 |
320 | var newLastIdentifiers = modulesToDom(newList, options);
321 |
322 | for (var _i = 0; _i < lastIdentifiers.length; _i++) {
323 | var _identifier = lastIdentifiers[_i];
324 |
325 | var _index = getIndexByIdentifier(_identifier);
326 |
327 | if (stylesInDOM[_index].references === 0) {
328 | stylesInDOM[_index].updater();
329 |
330 | stylesInDOM.splice(_index, 1);
331 | }
332 | }
333 |
334 | lastIdentifiers = newLastIdentifiers;
335 | };
336 | };
337 |
338 | /***/ }),
339 |
340 | /***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js":
341 | /*!********************************************************************!*\
342 | !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***!
343 | \********************************************************************/
344 | /***/ ((module) => {
345 |
346 |
347 |
348 | var memo = {};
349 | /* istanbul ignore next */
350 |
351 | function getTarget(target) {
352 | if (typeof memo[target] === "undefined") {
353 | var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself
354 |
355 | if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
356 | try {
357 | // This will throw an exception if access to iframe is blocked
358 | // due to cross-origin restrictions
359 | styleTarget = styleTarget.contentDocument.head;
360 | } catch (e) {
361 | // istanbul ignore next
362 | styleTarget = null;
363 | }
364 | }
365 |
366 | memo[target] = styleTarget;
367 | }
368 |
369 | return memo[target];
370 | }
371 | /* istanbul ignore next */
372 |
373 |
374 | function insertBySelector(insert, style) {
375 | var target = getTarget(insert);
376 |
377 | if (!target) {
378 | throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");
379 | }
380 |
381 | target.appendChild(style);
382 | }
383 |
384 | module.exports = insertBySelector;
385 |
386 | /***/ }),
387 |
388 | /***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js":
389 | /*!**********************************************************************!*\
390 | !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***!
391 | \**********************************************************************/
392 | /***/ ((module) => {
393 |
394 |
395 |
396 | /* istanbul ignore next */
397 | function insertStyleElement(options) {
398 | var element = document.createElement("style");
399 | options.setAttributes(element, options.attributes);
400 | options.insert(element, options.options);
401 | return element;
402 | }
403 |
404 | module.exports = insertStyleElement;
405 |
406 | /***/ }),
407 |
408 | /***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js":
409 | /*!**********************************************************************************!*\
410 | !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***!
411 | \**********************************************************************************/
412 | /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
413 |
414 |
415 |
416 | /* istanbul ignore next */
417 | function setAttributesWithoutAttributes(styleElement) {
418 | var nonce = true ? __webpack_require__.nc : 0;
419 |
420 | if (nonce) {
421 | styleElement.setAttribute("nonce", nonce);
422 | }
423 | }
424 |
425 | module.exports = setAttributesWithoutAttributes;
426 |
427 | /***/ }),
428 |
429 | /***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js":
430 | /*!***************************************************************!*\
431 | !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***!
432 | \***************************************************************/
433 | /***/ ((module) => {
434 |
435 |
436 |
437 | /* istanbul ignore next */
438 | function apply(styleElement, options, obj) {
439 | var css = "";
440 |
441 | if (obj.supports) {
442 | css += "@supports (".concat(obj.supports, ") {");
443 | }
444 |
445 | if (obj.media) {
446 | css += "@media ".concat(obj.media, " {");
447 | }
448 |
449 | var needLayer = typeof obj.layer !== "undefined";
450 |
451 | if (needLayer) {
452 | css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {");
453 | }
454 |
455 | css += obj.css;
456 |
457 | if (needLayer) {
458 | css += "}";
459 | }
460 |
461 | if (obj.media) {
462 | css += "}";
463 | }
464 |
465 | if (obj.supports) {
466 | css += "}";
467 | }
468 |
469 | var sourceMap = obj.sourceMap;
470 |
471 | if (sourceMap && typeof btoa !== "undefined") {
472 | css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */");
473 | } // For old IE
474 |
475 | /* istanbul ignore if */
476 |
477 |
478 | options.styleTagTransform(css, styleElement, options.options);
479 | }
480 |
481 | function removeStyleElement(styleElement) {
482 | // istanbul ignore if
483 | if (styleElement.parentNode === null) {
484 | return false;
485 | }
486 |
487 | styleElement.parentNode.removeChild(styleElement);
488 | }
489 | /* istanbul ignore next */
490 |
491 |
492 | function domAPI(options) {
493 | var styleElement = options.insertStyleElement(options);
494 | return {
495 | update: function update(obj) {
496 | apply(styleElement, options, obj);
497 | },
498 | remove: function remove() {
499 | removeStyleElement(styleElement);
500 | }
501 | };
502 | }
503 |
504 | module.exports = domAPI;
505 |
506 | /***/ }),
507 |
508 | /***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js":
509 | /*!*********************************************************************!*\
510 | !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***!
511 | \*********************************************************************/
512 | /***/ ((module) => {
513 |
514 |
515 |
516 | /* istanbul ignore next */
517 | function styleTagTransform(css, styleElement) {
518 | if (styleElement.styleSheet) {
519 | styleElement.styleSheet.cssText = css;
520 | } else {
521 | while (styleElement.firstChild) {
522 | styleElement.removeChild(styleElement.firstChild);
523 | }
524 |
525 | styleElement.appendChild(document.createTextNode(css));
526 | }
527 | }
528 |
529 | module.exports = styleTagTransform;
530 |
531 | /***/ }),
532 |
533 | /***/ "./src/list.js":
534 | /*!*********************!*\
535 | !*** ./src/list.js ***!
536 | \*********************/
537 | /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
538 |
539 | __webpack_require__.r(__webpack_exports__);
540 | /* harmony export */ __webpack_require__.d(__webpack_exports__, {
541 | /* harmony export */ "default": () => (/* binding */ List)
542 | /* harmony export */ });
543 | class List {
544 | constructor() {
545 | this.list = JSON.parse(localStorage.getItem('todo-list'));
546 | if (!this.list) {
547 | this.list = [];
548 | }
549 | this.display();
550 | }
551 |
552 | display() {
553 | this.saveData();
554 | const listSection = document.getElementById('list-items');
555 | listSection.innerHTML = '';
556 | this.list.forEach((activity) => {
557 | let activityItem = ` `;
558 | if (activity.completed) {
559 | activityItem += `
560 | done
561 |
562 |
563 | ${activity.description}
564 |
565 | `;
566 | } else {
567 | activityItem += `
568 |
569 | check_box_outline_blank
570 |
571 |
572 | ${activity.description}
573 |
`;
574 | }
575 | activityItem += `
576 |
577 | delete
578 |
579 |
580 | `;
581 | listSection.innerHTML += activityItem;
582 | });
583 | this.activityActions();
584 | }
585 |
586 | saveData() {
587 | for (let i = 0; i < this.list.length; i += 1) {
588 | this.list[i].index = i;
589 | }
590 | this.list.sort((a, b) => {
591 | if (a.index < b.index) {
592 | return -1;
593 | }
594 | if (a.index > b.index) {
595 | return 1;
596 | }
597 | return 0;
598 | });
599 | localStorage.setItem('todo-list', JSON.stringify(this.list));
600 | }
601 |
602 | addActivity(activity) {
603 | if (activity.length > 0) {
604 | const newActivity = {
605 | description: activity,
606 | completed: false,
607 | index: this.list.length,
608 | };
609 | this.list.push(newActivity);
610 | this.display();
611 | this.saveData();
612 | }
613 | }
614 |
615 | deleteAll() {
616 | localStorage.clear();
617 | this.list = [];
618 | this.display();
619 | }
620 |
621 | updateStatus(index) {
622 | if (this.list[index].completed === true) {
623 | this.list[index].completed = false;
624 | } else if (this.list[index].completed === false) {
625 | this.list[index].completed = true;
626 | }
627 | this.display();
628 | }
629 |
630 | deleteCompleted(index) {
631 | this.list.splice(index, 1);
632 | this.display();
633 | }
634 |
635 | clearCompleted() {
636 | this.list = this.list.filter((activity) => activity.completed === false);
637 | this.display();
638 | }
639 |
640 | editActivity(index, description) {
641 | this.list[index].description = description;
642 | this.saveData();
643 | }
644 |
645 | activityActions() {
646 | const checkbox = document.querySelectorAll('.update-status');
647 | if (checkbox !== null) {
648 | checkbox.forEach((box) => {
649 | box.addEventListener('click', () => {
650 | this.updateStatus(box.getAttribute('data'));
651 | });
652 | });
653 | }
654 |
655 | const deleteActivity = document.querySelectorAll('.delete-activity');
656 | deleteActivity.forEach((activity) => {
657 | activity.addEventListener('click', () => {
658 | this.deleteCompleted(activity.getAttribute('data'));
659 | });
660 | });
661 |
662 | const editedActivity = document.querySelectorAll('.activity');
663 | if (editedActivity) {
664 | editedActivity.forEach((activity) => {
665 | activity.addEventListener('input', (e) => {
666 | const description = e.target.innerText;
667 | const index = e.target.getAttribute('data');
668 | this.editActivity(index, description);
669 | });
670 | });
671 | }
672 | }
673 | }
674 |
675 |
676 | /***/ })
677 |
678 | /******/ });
679 | /************************************************************************/
680 | /******/ // The module cache
681 | /******/ var __webpack_module_cache__ = {};
682 | /******/
683 | /******/ // The require function
684 | /******/ function __webpack_require__(moduleId) {
685 | /******/ // Check if module is in cache
686 | /******/ var cachedModule = __webpack_module_cache__[moduleId];
687 | /******/ if (cachedModule !== undefined) {
688 | /******/ return cachedModule.exports;
689 | /******/ }
690 | /******/ // Create a new module (and put it into the cache)
691 | /******/ var module = __webpack_module_cache__[moduleId] = {
692 | /******/ id: moduleId,
693 | /******/ // no module.loaded needed
694 | /******/ exports: {}
695 | /******/ };
696 | /******/
697 | /******/ // Execute the module function
698 | /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
699 | /******/
700 | /******/ // Return the exports of the module
701 | /******/ return module.exports;
702 | /******/ }
703 | /******/
704 | /************************************************************************/
705 | /******/ /* webpack/runtime/compat get default export */
706 | /******/ (() => {
707 | /******/ // getDefaultExport function for compatibility with non-harmony modules
708 | /******/ __webpack_require__.n = (module) => {
709 | /******/ var getter = module && module.__esModule ?
710 | /******/ () => (module['default']) :
711 | /******/ () => (module);
712 | /******/ __webpack_require__.d(getter, { a: getter });
713 | /******/ return getter;
714 | /******/ };
715 | /******/ })();
716 | /******/
717 | /******/ /* webpack/runtime/define property getters */
718 | /******/ (() => {
719 | /******/ // define getter functions for harmony exports
720 | /******/ __webpack_require__.d = (exports, definition) => {
721 | /******/ for(var key in definition) {
722 | /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
723 | /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
724 | /******/ }
725 | /******/ }
726 | /******/ };
727 | /******/ })();
728 | /******/
729 | /******/ /* webpack/runtime/hasOwnProperty shorthand */
730 | /******/ (() => {
731 | /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
732 | /******/ })();
733 | /******/
734 | /******/ /* webpack/runtime/make namespace object */
735 | /******/ (() => {
736 | /******/ // define __esModule on exports
737 | /******/ __webpack_require__.r = (exports) => {
738 | /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
739 | /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
740 | /******/ }
741 | /******/ Object.defineProperty(exports, '__esModule', { value: true });
742 | /******/ };
743 | /******/ })();
744 | /******/
745 | /************************************************************************/
746 | var __webpack_exports__ = {};
747 | // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
748 | (() => {
749 | /*!**********************!*\
750 | !*** ./src/index.js ***!
751 | \**********************/
752 | __webpack_require__.r(__webpack_exports__);
753 | /* harmony import */ var _style_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style.css */ "./src/style.css");
754 | /* harmony import */ var _list_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./list.js */ "./src/list.js");
755 |
756 |
757 |
758 | const tasks = new _list_js__WEBPACK_IMPORTED_MODULE_1__["default"]();
759 |
760 | document.querySelector('#add-task').addEventListener('submit', (e) => {
761 | e.preventDefault();
762 | const activity = e.target.elements.activity.value;
763 | tasks.addActivity(activity);
764 | e.target.reset();
765 | });
766 |
767 | document.querySelector('#delete-all').addEventListener('click', () => {
768 | tasks.deleteAll();
769 | });
770 |
771 | document.querySelector('.clear-completed').addEventListener('click', () => {
772 | tasks.clearCompleted();
773 | });
774 | })();
775 |
776 | /******/ })()
777 | ;
778 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7Ozs7Ozs7VUNsSUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGlDQUFpQyxXQUFXO1dBQzVDO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7QUNOcUI7QUFDUTs7QUFFN0Isa0JBQWtCLGdEQUFJOztBQUV0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsQ0FBQyxFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL3NyYy9zdHlsZS5jc3MiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzIiwid2VicGFjazovL3RvLWRvLWxpc3QvLi9zcmMvc3R5bGUuY3NzPzcxNjMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly90by1kby1saXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcyIsIndlYnBhY2s6Ly90by1kby1saXN0Ly4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzIiwid2VicGFjazovL3RvLWRvLWxpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlRG9tQVBJLmpzIiwid2VicGFjazovL3RvLWRvLWxpc3QvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly90by1kby1saXN0Ly4vc3JjL2xpc3QuanMiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly90by1kby1saXN0L3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3RvLWRvLWxpc3Qvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3RvLWRvLWxpc3Qvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly90by1kby1saXN0L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vdG8tZG8tbGlzdC8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyBmcm9tIFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gZnJvbSBcIi4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX0FQSV9TT1VSQ0VNQVBfSU1QT1JUX19fKTtcbi8vIE1vZHVsZVxuX19fQ1NTX0xPQURFUl9FWFBPUlRfX18ucHVzaChbbW9kdWxlLmlkLCBcImJvZHkge1xcclxcbiAgYmFja2dyb3VuZDogI2Y2ZjZmNjtcXHJcXG59XFxyXFxuXFxyXFxuYm9keSAqIHtcXHJcXG4gIGNvbG9yOiByZ2IoODQsIDg4LCA5OCk7XFxyXFxuICBmb250LWZhbWlseTogJ09wZW4gU2FucycsICdMdWNpZGEgR3JhbmRlJywgdGFob21hLCB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjtcXHJcXG59XFxyXFxuXFxyXFxubWFpbiB7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBtaW4taGVpZ2h0OiA5NXZoO1xcclxcbiAgbWFyZ2luOiAwIGF1dG87XFxyXFxufVxcclxcblxcclxcbi50b2RvLWxpc3Qge1xcclxcbiAgYm94LXNoYWRvdzogcmdiYSgwLCAwLCAwLCAwLjE1KSAwIDJweCA4cHggMDtcXHJcXG4gIHdpZHRoOiA1MDBweDtcXHJcXG4gIG1heC13aWR0aDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuZm9ybSBidXR0b24gLm1hdGVyaWFsLWljb25zIHtcXHJcXG4gIGZvbnQtc2l6ZTogMTVweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tbGlzdCAubWF0ZXJpYWwtaWNvbnMge1xcclxcbiAgdHJhbnNpdGlvbjogMC42cztcXHJcXG4gIGNvbG9yOiAjOTc5N2E1O1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVhZGVyIC5tYXRlcmlhbC1pY29ucyB7XFxyXFxuICBmb250LXNpemU6IDE4cHg7XFxyXFxufVxcclxcblxcclxcbi50b2RvLWxpc3QgLm1hdGVyaWFsLWljb25zOmhvdmVyIHtcXHJcXG4gIGNvbG9yOiAjMzMzO1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1saXN0IC5tYXRlcmlhbC1pY29ucy5tb3ZlIHtcXHJcXG4gIGN1cnNvcjogbW92ZTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlYWRlciB7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA4KTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlYWRlcixcXHJcXG5mb3JtLFxcclxcbnVsIHtcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XFxyXFxufVxcclxcblxcclxcbi5oZWFkZXIsXFxyXFxuaDIge1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGNvbG9yOiAjNTQ1ODYyO1xcclxcbiAgZm9udC1zaXplOiAxOHB4O1xcclxcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXHJcXG4gIHBhZGRpbmc6IDFyZW07XFxyXFxuICBsaW5lLWhlaWdodDogMjBweDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSAycmVtKTtcXHJcXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xcclxcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxufVxcclxcblxcclxcbmZvcm0gaW5wdXQge1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDI1cHgpO1xcclxcbiAgYm9yZGVyOiAwIHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXHJcXG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xcclxcbiAgaGVpZ2h0OiA0MHB4O1xcclxcbiAgZm9udC1zaXplOiAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG5mb3JtIHtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDQwcHgpO1xcclxcbiAgcGFkZGluZzogMTBweCAxMHB4IDEwcHggMzBweDtcXHJcXG59XFxyXFxuXFxyXFxuZm9ybSBidXR0b24ge1xcclxcbiAgYmFja2dyb3VuZDogI2ZmZjtcXHJcXG4gIGJvcmRlcjogMCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG59XFxyXFxuXFxyXFxuLmxpc3QtaXRlbSB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gNDBweCk7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHggMTBweCAzMHB4O1xcclxcbiAgZm9udC1zaXplOiAxcmVtO1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4wOCk7XFxyXFxuICBmb250LXdlaWdodDogMzAwO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLmxpc3QtaXRlbSBwIHtcXHJcXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA1MHB4KTtcXHJcXG4gIGJvcmRlcjogMCBzb2xpZCB0cmFuc3BhcmVudDtcXHJcXG4gIG91dGxpbmU6IG5vbmU7XFxyXFxuICBoZWlnaHQ6IDIycHg7XFxyXFxuICBsaW5lLWhlaWdodDogMjJweDtcXHJcXG4gIHBhZGRpbmc6IDA7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBwYWRkaW5nLWxlZnQ6IDIwcHg7XFxyXFxuICBmb250LXdlaWdodDogMzAwO1xcclxcbiAgZm9udC1zaXplOiAxNXB4O1xcclxcbiAgb3ZlcmZsb3cteTogYXV0bztcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmY7XFxyXFxufVxcclxcblxcclxcbi5saXN0LWl0ZW0gLm1hdGVyaWFsLWljb25zLmRvbmUge1xcclxcbiAgY29sb3I6IHJnYig0NiwgMTM4LCAyMzApO1xcclxcbn1cXHJcXG5cXHJcXG4ubGlzdC1pdGVtIHAuY29tcGxldGVkIHtcXHJcXG4gIHRleHQtZGVjb3JhdGlvbi1saW5lOiBsaW5lLXRocm91Z2g7XFxyXFxuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjQ1KTtcXHJcXG59XFxyXFxuXFxyXFxuLmxpc3QtaXRlbS5lZGl0aW5nIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZlY2E7XFxyXFxufVxcclxcblxcclxcbi5jbGVhci1jb21wbGV0ZWQge1xcclxcbiAgd2lkdGg6IDEwMCU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBwYWRkaW5nOiAyMHB4IDZweDtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uY2xlYXItY29tcGxldGVkOmhvdmVyIHtcXHJcXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbn1cXHJcXG5cXHJcXG4uZC1mbGV4IHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxufVxcclxcblxcclxcbi5jb2xzIHtcXHJcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxufVxcclxcblxcclxcbi5zLWJldHdlZW4ge1xcclxcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcclxcbn1cXHJcXG5cIiwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvc3R5bGUuY3NzXCJdLFwibmFtZXNcIjpbXSxcIm1hcHBpbmdzXCI6XCJBQUFBO0VBQ0UsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0Usc0JBQXNCO0VBQ3RCLDZFQUE2RTtBQUMvRTs7QUFFQTtFQUNFLHVCQUF1QjtFQUN2QixtQkFBbUI7RUFDbkIsZ0JBQWdCO0VBQ2hCLGNBQWM7QUFDaEI7O0FBRUE7RUFDRSwyQ0FBMkM7RUFDM0MsWUFBWTtFQUNaLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLGNBQWM7RUFDZCxlQUFlO0FBQ2pCOztBQUVBO0VBQ0UsZUFBZTtBQUNqQjs7QUFFQTtFQUNFLFdBQVc7QUFDYjs7QUFFQTtFQUNFLFlBQVk7QUFDZDs7QUFFQTtFQUNFLDRDQUE0QztBQUM5Qzs7QUFFQTs7O0VBR0UsZ0JBQWdCO0VBQ2hCLFNBQVM7RUFDVCxXQUFXO0VBQ1gsVUFBVTtFQUNWLHFCQUFxQjtBQUN2Qjs7QUFFQTs7RUFFRSxtQkFBbUI7RUFDbkIsY0FBYztFQUNkLGVBQWU7RUFDZixnQkFBZ0I7RUFDaEIsYUFBYTtFQUNiLGlCQUFpQjtFQUNqQixTQUFTO0VBQ1Qsd0JBQXdCO0VBQ3hCLHVCQUF1QjtFQUN2QixnQkFBZ0I7RUFDaEIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0Usd0JBQXdCO0VBQ3hCLDJCQUEyQjtFQUMzQixhQUFhO0VBQ2Isa0JBQWtCO0VBQ2xCLGlCQUFpQjtFQUNqQixZQUFZO0VBQ1osZUFBZTtBQUNqQjs7QUFFQTtFQUNFLDRDQUE0QztFQUM1Qyx3QkFBd0I7RUFDeEIsNEJBQTRCO0FBQzlCOztBQUVBO0VBQ0UsZ0JBQWdCO0VBQ2hCLDJCQUEyQjtBQUM3Qjs7QUFFQTtFQUNFLHdCQUF3QjtFQUN4Qiw0QkFBNEI7RUFDNUIsZUFBZTtFQUNmLDRDQUE0QztFQUM1QyxnQkFBZ0I7RUFDaEIsbUJBQW1CO0FBQ3JCOztBQUVBO0VBQ0Usd0JBQXdCO0VBQ3hCLDJCQUEyQjtFQUMzQixhQUFhO0VBQ2IsWUFBWTtFQUNaLGlCQUFpQjtFQUNqQixVQUFVO0VBQ1YsU0FBUztFQUNULGtCQUFrQjtFQUNsQixnQkFBZ0I7RUFDaEIsZUFBZTtFQUNmLGdCQUFnQjtFQUNoQixnQkFBZ0I7QUFDbEI7O0FBRUE7RUFDRSx3QkFBd0I7QUFDMUI7O0FBRUE7RUFDRSxrQ0FBa0M7RUFDbEMsMEJBQTBCO0FBQzVCOztBQUVBO0VBQ0UseUJBQXlCO0FBQzNCOztBQUVBO0VBQ0UsV0FBVztFQUNYLGtCQUFrQjtFQUNsQixpQkFBaUI7RUFDakIsdUJBQXVCO0FBQ3pCOztBQUVBO0VBQ0UsMEJBQTBCO0VBQzFCLGVBQWU7QUFDakI7O0FBRUE7RUFDRSxhQUFhO0FBQ2Y7O0FBRUE7RUFDRSxzQkFBc0I7QUFDeEI7O0FBRUE7RUFDRSw4QkFBOEI7QUFDaENcIixcInNvdXJjZXNDb250ZW50XCI6W1wiYm9keSB7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZjZmNmY2O1xcclxcbn1cXHJcXG5cXHJcXG5ib2R5ICoge1xcclxcbiAgY29sb3I6IHJnYig4NCwgODgsIDk4KTtcXHJcXG4gIGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJywgJ0x1Y2lkYSBHcmFuZGUnLCB0YWhvbWEsIHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmO1xcclxcbn1cXHJcXG5cXHJcXG5tYWluIHtcXHJcXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIG1pbi1oZWlnaHQ6IDk1dmg7XFxyXFxuICBtYXJnaW46IDAgYXV0bztcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tbGlzdCB7XFxyXFxuICBib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMTUpIDAgMnB4IDhweCAwO1xcclxcbiAgd2lkdGg6IDUwMHB4O1xcclxcbiAgbWF4LXdpZHRoOiAxMDAlO1xcclxcbn1cXHJcXG5cXHJcXG5mb3JtIGJ1dHRvbiAubWF0ZXJpYWwtaWNvbnMge1xcclxcbiAgZm9udC1zaXplOiAxNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4udG9kby1saXN0IC5tYXRlcmlhbC1pY29ucyB7XFxyXFxuICB0cmFuc2l0aW9uOiAwLjZzO1xcclxcbiAgY29sb3I6ICM5Nzk3YTU7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5oZWFkZXIgLm1hdGVyaWFsLWljb25zIHtcXHJcXG4gIGZvbnQtc2l6ZTogMThweDtcXHJcXG59XFxyXFxuXFxyXFxuLnRvZG8tbGlzdCAubWF0ZXJpYWwtaWNvbnM6aG92ZXIge1xcclxcbiAgY29sb3I6ICMzMzM7XFxyXFxufVxcclxcblxcclxcbi50b2RvLWxpc3QgLm1hdGVyaWFsLWljb25zLm1vdmUge1xcclxcbiAgY3Vyc29yOiBtb3ZlO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVhZGVyIHtcXHJcXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMDgpO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVhZGVyLFxcclxcbmZvcm0sXFxyXFxudWwge1xcclxcbiAgYmFja2dyb3VuZDogI2ZmZjtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHdpZHRoOiAxMDAlO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlYWRlcixcXHJcXG5oMiB7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgY29sb3I6ICM1NDU4NjI7XFxyXFxuICBmb250LXNpemU6IDE4cHg7XFxyXFxuICBmb250LXdlaWdodDogNDAwO1xcclxcbiAgcGFkZGluZzogMXJlbTtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDJyZW0pO1xcclxcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG59XFxyXFxuXFxyXFxuZm9ybSBpbnB1dCB7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gMjVweCk7XFxyXFxuICBib3JkZXI6IDAgc29saWQgdHJhbnNwYXJlbnQ7XFxyXFxuICBvdXRsaW5lOiBub25lO1xcclxcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcclxcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XFxyXFxuICBoZWlnaHQ6IDQwcHg7XFxyXFxuICBmb250LXNpemU6IDE1cHg7XFxyXFxufVxcclxcblxcclxcbmZvcm0ge1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4wOCk7XFxyXFxuICB3aWR0aDogY2FsYygxMDAlIC0gNDBweCk7XFxyXFxuICBwYWRkaW5nOiAxMHB4IDEwcHggMTBweCAzMHB4O1xcclxcbn1cXHJcXG5cXHJcXG5mb3JtIGJ1dHRvbiB7XFxyXFxuICBiYWNrZ3JvdW5kOiAjZmZmO1xcclxcbiAgYm9yZGVyOiAwIHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbn1cXHJcXG5cXHJcXG4ubGlzdC1pdGVtIHtcXHJcXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA0MHB4KTtcXHJcXG4gIHBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDMwcHg7XFxyXFxuICBmb250LXNpemU6IDFyZW07XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA4KTtcXHJcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4ubGlzdC1pdGVtIHAge1xcclxcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDUwcHgpO1xcclxcbiAgYm9yZGVyOiAwIHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIGhlaWdodDogMjJweDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAyMnB4O1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHBhZGRpbmctbGVmdDogMjBweDtcXHJcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxyXFxuICBmb250LXNpemU6IDE1cHg7XFxyXFxuICBvdmVyZmxvdy15OiBhdXRvO1xcclxcbiAgYmFja2dyb3VuZDogI2ZmZjtcXHJcXG59XFxyXFxuXFxyXFxuLmxpc3QtaXRlbSAubWF0ZXJpYWwtaWNvbnMuZG9uZSB7XFxyXFxuICBjb2xvcjogcmdiKDQ2LCAxMzgsIDIzMCk7XFxyXFxufVxcclxcblxcclxcbi5saXN0LWl0ZW0gcC5jb21wbGV0ZWQge1xcclxcbiAgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IGxpbmUtdGhyb3VnaDtcXHJcXG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNDUpO1xcclxcbn1cXHJcXG5cXHJcXG4ubGlzdC1pdGVtLmVkaXRpbmcge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmVjYTtcXHJcXG59XFxyXFxuXFxyXFxuLmNsZWFyLWNvbXBsZXRlZCB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIHBhZGRpbmc6IDIwcHggNnB4O1xcclxcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5jbGVhci1jb21wbGV0ZWQ6aG92ZXIge1xcclxcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxufVxcclxcblxcclxcbi5kLWZsZXgge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbHMge1xcclxcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG59XFxyXFxuXFxyXFxuLnMtYmV0d2VlbiB7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxyXFxufVxcclxcblwiXSxcInNvdXJjZVJvb3RcIjpcIlwifV0pO1xuLy8gRXhwb3J0c1xuZXhwb3J0IGRlZmF1bHQgX19fQ1NTX0xPQURFUl9FWFBPUlRfX187XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTsgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcblxuICAgICAgaWYgKGl0ZW1bNF0pIHtcbiAgICAgICAgY29udGVudCArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KGl0ZW1bNF0sIFwiKSB7XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICBjb250ZW50ICs9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cblxuICAgICAgY29udGVudCArPSBjc3NXaXRoTWFwcGluZ1RvU3RyaW5nKGl0ZW0pO1xuXG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH0pLmpvaW4oXCJcIik7XG4gIH07IC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG5cblxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuXG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblxuICAgIGlmIChkZWR1cGUpIHtcbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdGhpcy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgaWQgPSB0aGlzW2tdWzBdO1xuXG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2sgPSAwOyBfayA8IG1vZHVsZXMubGVuZ3RoOyBfaysrKSB7XG4gICAgICB2YXIgaXRlbSA9IFtdLmNvbmNhdChtb2R1bGVzW19rXSk7XG5cbiAgICAgIGlmIChkZWR1cGUgJiYgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG1lZGlhKSB7XG4gICAgICAgIGlmICghaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN1cHBvcnRzKSB7XG4gICAgICAgIGlmICghaXRlbVs0XSkge1xuICAgICAgICAgIGl0ZW1bNF0gPSBcIlwiLmNvbmNhdChzdXBwb3J0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQoaXRlbVs0XSwgXCIpIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzRdID0gc3VwcG9ydHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbGlzdDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG5cbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShjc3NNYXBwaW5nKSkpKTtcbiAgICB2YXIgZGF0YSA9IFwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KGJhc2U2NCk7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSBcIi8qIyBcIi5jb25jYXQoZGF0YSwgXCIgKi9cIik7XG4gICAgdmFyIHNvdXJjZVVSTHMgPSBjc3NNYXBwaW5nLnNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIHJldHVybiBcIi8qIyBzb3VyY2VVUkw9XCIuY29uY2F0KGNzc01hcHBpbmcuc291cmNlUm9vdCB8fCBcIlwiKS5jb25jYXQoc291cmNlLCBcIiAqL1wiKTtcbiAgICB9KTtcbiAgICByZXR1cm4gW2NvbnRlbnRdLmNvbmNhdChzb3VyY2VVUkxzKS5jb25jYXQoW3NvdXJjZU1hcHBpbmddKS5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKFwiXFxuXCIpO1xufTsiLCJcbiAgICAgIGltcG9ydCBBUEkgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIjtcbiAgICAgIGltcG9ydCBkb21BUEkgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qc1wiO1xuICAgICAgaW1wb3J0IGluc2VydEZuIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qc1wiO1xuICAgICAgaW1wb3J0IHNldEF0dHJpYnV0ZXMgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRTdHlsZUVsZW1lbnQgZnJvbSBcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanNcIjtcbiAgICAgIGltcG9ydCBzdHlsZVRhZ1RyYW5zZm9ybUZuIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanNcIjtcbiAgICAgIGltcG9ydCBjb250ZW50LCAqIGFzIG5hbWVkRXhwb3J0IGZyb20gXCIhIS4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3R5bGUuY3NzXCI7XG4gICAgICBcbiAgICAgIFxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLnN0eWxlVGFnVHJhbnNmb3JtID0gc3R5bGVUYWdUcmFuc2Zvcm1Gbjtcbm9wdGlvbnMuc2V0QXR0cmlidXRlcyA9IHNldEF0dHJpYnV0ZXM7XG5cbiAgICAgIG9wdGlvbnMuaW5zZXJ0ID0gaW5zZXJ0Rm4uYmluZChudWxsLCBcImhlYWRcIik7XG4gICAgXG5vcHRpb25zLmRvbUFQSSA9IGRvbUFQSTtcbm9wdGlvbnMuaW5zZXJ0U3R5bGVFbGVtZW50ID0gaW5zZXJ0U3R5bGVFbGVtZW50O1xuXG52YXIgdXBkYXRlID0gQVBJKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxuZXhwb3J0ICogZnJvbSBcIiEhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zdHlsZS5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIHN0eWxlc0luRE9NID0gW107XG5cbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5ET00ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5ET01baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleEJ5SWRlbnRpZmllciA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXSxcbiAgICAgIHN1cHBvcnRzOiBpdGVtWzRdLFxuICAgICAgbGF5ZXI6IGl0ZW1bNV1cbiAgICB9O1xuXG4gICAgaWYgKGluZGV4QnlJZGVudGlmaWVyICE9PSAtMSkge1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnJlZmVyZW5jZXMrKztcbiAgICAgIHN0eWxlc0luRE9NW2luZGV4QnlJZGVudGlmaWVyXS51cGRhdGVyKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB1cGRhdGVyID0gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLmJ5SW5kZXggPSBpO1xuICAgICAgc3R5bGVzSW5ET00uc3BsaWNlKGksIDAsIHtcbiAgICAgICAgaWRlbnRpZmllcjogaWRlbnRpZmllcixcbiAgICAgICAgdXBkYXRlcjogdXBkYXRlcixcbiAgICAgICAgcmVmZXJlbmNlczogMVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIHJldHVybiBpZGVudGlmaWVycztcbn1cblxuZnVuY3Rpb24gYWRkRWxlbWVudFN0eWxlKG9iaiwgb3B0aW9ucykge1xuICB2YXIgYXBpID0gb3B0aW9ucy5kb21BUEkob3B0aW9ucyk7XG4gIGFwaS51cGRhdGUob2JqKTtcblxuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFwaS51cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBpLnJlbW92ZSgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gdXBkYXRlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW2ldO1xuICAgICAgdmFyIGluZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleF0ucmVmZXJlbmNlcy0tO1xuICAgIH1cblxuICAgIHZhciBuZXdMYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obmV3TGlzdCwgb3B0aW9ucyk7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcblxuICAgICAgdmFyIF9pbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKF9pZGVudGlmaWVyKTtcblxuICAgICAgaWYgKHN0eWxlc0luRE9NW19pbmRleF0ucmVmZXJlbmNlcyA9PT0gMCkge1xuICAgICAgICBzdHlsZXNJbkRPTVtfaW5kZXhdLnVwZGF0ZXIoKTtcblxuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsYXN0SWRlbnRpZmllcnMgPSBuZXdMYXN0SWRlbnRpZmllcnM7XG4gIH07XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7IC8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG5cbiAgICBpZiAod2luZG93LkhUTUxJRnJhbWVFbGVtZW50ICYmIHN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuICAgICAgICAvLyBkdWUgdG8gY3Jvc3Mtb3JpZ2luIHJlc3RyaWN0aW9uc1xuICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cblxuICByZXR1cm4gbWVtb1t0YXJnZXRdO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5cblxuZnVuY3Rpb24gaW5zZXJ0QnlTZWxlY3RvcihpbnNlcnQsIHN0eWxlKSB7XG4gIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoaW5zZXJ0KTtcblxuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cblxuICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGluc2VydEJ5U2VsZWN0b3I7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzKHN0eWxlRWxlbWVudCkge1xuICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09IFwidW5kZWZpbmVkXCIgPyBfX3dlYnBhY2tfbm9uY2VfXyA6IG51bGw7XG5cbiAgaWYgKG5vbmNlKSB7XG4gICAgc3R5bGVFbGVtZW50LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIG5vbmNlKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiLCJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcblxuICBpZiAob2JqLnN1cHBvcnRzKSB7XG4gICAgY3NzICs9IFwiQHN1cHBvcnRzIChcIi5jb25jYXQob2JqLnN1cHBvcnRzLCBcIikge1wiKTtcbiAgfVxuXG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJAbWVkaWEgXCIuY29uY2F0KG9iai5tZWRpYSwgXCIge1wiKTtcbiAgfVxuXG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuXG4gIGlmIChuZWVkTGF5ZXIpIHtcbiAgICBjc3MgKz0gXCJAbGF5ZXJcIi5jb25jYXQob2JqLmxheWVyLmxlbmd0aCA+IDAgPyBcIiBcIi5jb25jYXQob2JqLmxheWVyKSA6IFwiXCIsIFwiIHtcIik7XG4gIH1cblxuICBjc3MgKz0gb2JqLmNzcztcblxuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG5cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuXG4gIGlmIChvYmouc3VwcG9ydHMpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cblxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblxuICBpZiAoc291cmNlTWFwICYmIHR5cGVvZiBidG9hICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH0gLy8gRm9yIG9sZCBJRVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cblxuXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0eWxlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudCk7XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkb21BUEk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQpIHtcbiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoc3R5bGVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHN0eWxlRWxlbWVudC5yZW1vdmVDaGlsZChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc3R5bGVUYWdUcmFuc2Zvcm07IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlzdCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubGlzdCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RvZG8tbGlzdCcpKTtcbiAgICBpZiAoIXRoaXMubGlzdCkge1xuICAgICAgdGhpcy5saXN0ID0gW107XG4gICAgfVxuICAgIHRoaXMuZGlzcGxheSgpO1xuICB9XG5cbiAgZGlzcGxheSgpIHtcbiAgICB0aGlzLnNhdmVEYXRhKCk7XG4gICAgY29uc3QgbGlzdFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGlzdC1pdGVtcycpO1xuICAgIGxpc3RTZWN0aW9uLmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMubGlzdC5mb3JFYWNoKChhY3Rpdml0eSkgPT4ge1xuICAgICAgbGV0IGFjdGl2aXR5SXRlbSA9IGA8bGkgY2xhc3MgPSdkLWZsZXggcy1iZXR3ZWVuIGxpc3QtaXRlbScgaWQgPSdpdGVtLWRhdGEtJHthY3Rpdml0eS5pbmRleH0nPiBgO1xuICAgICAgaWYgKGFjdGl2aXR5LmNvbXBsZXRlZCkge1xuICAgICAgICBhY3Rpdml0eUl0ZW0gKz0gYDxzcGFuIGNsYXNzPSdtYXRlcmlhbC1pY29ucyBkb25lIHVwZGF0ZS1zdGF0dXMnIGRhdGE9JyR7YWN0aXZpdHkuaW5kZXh9Jz5cbiAgICAgICAgICAgICAgICBkb25lXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHAgY29udGVudGVkaXRhYmxlPSd0cnVlJyBjbGFzcz0nY29tcGxldGVkIGFjdGl2aXR5JyBkYXRhPScke2FjdGl2aXR5LmluZGV4fSc+XG4gICAgICAgICAgICAgICAgJHthY3Rpdml0eS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICBgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZpdHlJdGVtICs9IGBcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J21hdGVyaWFsLWljb25zICB1cGRhdGUtc3RhdHVzJyAgZGF0YT0nJHthY3Rpdml0eS5pbmRleH0nPlxuICAgICAgICAgICAgICAgIGNoZWNrX2JveF9vdXRsaW5lX2JsYW5rXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHAgY29udGVudGVkaXRhYmxlPSd0cnVlJyBjbGFzcz0nYWN0aXZpdHknIGRhdGE9JyR7YWN0aXZpdHkuaW5kZXh9Jz5cbiAgICAgICAgICAgICAgICAke2FjdGl2aXR5LmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICA8L3A+YDtcbiAgICAgIH1cbiAgICAgIGFjdGl2aXR5SXRlbSArPSBgXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz0nbWF0ZXJpYWwtaWNvbnMgZGVsZXRlLWFjdGl2aXR5JyBkYXRhPScke2FjdGl2aXR5LmluZGV4fSc+XG4gICAgICAgICAgICAgIGRlbGV0ZVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIGA7XG4gICAgICBsaXN0U2VjdGlvbi5pbm5lckhUTUwgKz0gYWN0aXZpdHlJdGVtO1xuICAgIH0pO1xuICAgIHRoaXMuYWN0aXZpdHlBY3Rpb25zKCk7XG4gIH1cblxuICBzYXZlRGF0YSgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGlzdC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdGhpcy5saXN0W2ldLmluZGV4ID0gaTtcbiAgICB9XG4gICAgdGhpcy5saXN0LnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmIChhLmluZGV4IDwgYi5pbmRleCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZiAoYS5pbmRleCA+IGIuaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgndG9kby1saXN0JywgSlNPTi5zdHJpbmdpZnkodGhpcy5saXN0KSk7XG4gIH1cblxuICBhZGRBY3Rpdml0eShhY3Rpdml0eSkge1xuICAgIGlmIChhY3Rpdml0eS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBuZXdBY3Rpdml0eSA9IHtcbiAgICAgICAgZGVzY3JpcHRpb246IGFjdGl2aXR5LFxuICAgICAgICBjb21wbGV0ZWQ6IGZhbHNlLFxuICAgICAgICBpbmRleDogdGhpcy5saXN0Lmxlbmd0aCxcbiAgICAgIH07XG4gICAgICB0aGlzLmxpc3QucHVzaChuZXdBY3Rpdml0eSk7XG4gICAgICB0aGlzLmRpc3BsYXkoKTtcbiAgICAgIHRoaXMuc2F2ZURhdGEoKTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVBbGwoKSB7XG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XG4gICAgdGhpcy5saXN0ID0gW107XG4gICAgdGhpcy5kaXNwbGF5KCk7XG4gIH1cblxuICB1cGRhdGVTdGF0dXMoaW5kZXgpIHtcbiAgICBpZiAodGhpcy5saXN0W2luZGV4XS5jb21wbGV0ZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMubGlzdFtpbmRleF0uY29tcGxldGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxpc3RbaW5kZXhdLmNvbXBsZXRlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubGlzdFtpbmRleF0uY29tcGxldGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5kaXNwbGF5KCk7XG4gIH1cblxuICBkZWxldGVDb21wbGV0ZWQoaW5kZXgpIHtcbiAgICB0aGlzLmxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLmRpc3BsYXkoKTtcbiAgfVxuXG4gIGNsZWFyQ29tcGxldGVkKCkge1xuICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5maWx0ZXIoKGFjdGl2aXR5KSA9PiBhY3Rpdml0eS5jb21wbGV0ZWQgPT09IGZhbHNlKTtcbiAgICB0aGlzLmRpc3BsYXkoKTtcbiAgfVxuXG4gIGVkaXRBY3Rpdml0eShpbmRleCwgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmxpc3RbaW5kZXhdLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgdGhpcy5zYXZlRGF0YSgpO1xuICB9XG5cbiAgYWN0aXZpdHlBY3Rpb25zKCkge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVwZGF0ZS1zdGF0dXMnKTtcbiAgICBpZiAoY2hlY2tib3ggIT09IG51bGwpIHtcbiAgICAgIGNoZWNrYm94LmZvckVhY2goKGJveCkgPT4ge1xuICAgICAgICBib3guYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoYm94LmdldEF0dHJpYnV0ZSgnZGF0YScpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxldGVBY3Rpdml0eSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZWxldGUtYWN0aXZpdHknKTtcbiAgICBkZWxldGVBY3Rpdml0eS5mb3JFYWNoKChhY3Rpdml0eSkgPT4ge1xuICAgICAgYWN0aXZpdHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGVsZXRlQ29tcGxldGVkKGFjdGl2aXR5LmdldEF0dHJpYnV0ZSgnZGF0YScpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZWRpdGVkQWN0aXZpdHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWN0aXZpdHknKTtcbiAgICBpZiAoZWRpdGVkQWN0aXZpdHkpIHtcbiAgICAgIGVkaXRlZEFjdGl2aXR5LmZvckVhY2goKGFjdGl2aXR5KSA9PiB7XG4gICAgICAgIGFjdGl2aXR5LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGUudGFyZ2V0LmlubmVyVGV4dDtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YScpO1xuICAgICAgICAgIHRoaXMuZWRpdEFjdGl2aXR5KGluZGV4LCBkZXNjcmlwdGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdGlkOiBtb2R1bGVJZCxcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0ICcuL3N0eWxlLmNzcyc7XG5pbXBvcnQgTGlzdCBmcm9tICcuL2xpc3QuanMnO1xuXG5jb25zdCB0YXNrcyA9IG5ldyBMaXN0KCk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhZGQtdGFzaycpLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChlKSA9PiB7XG4gIGUucHJldmVudERlZmF1bHQoKTtcbiAgY29uc3QgYWN0aXZpdHkgPSBlLnRhcmdldC5lbGVtZW50cy5hY3Rpdml0eS52YWx1ZTtcbiAgdGFza3MuYWRkQWN0aXZpdHkoYWN0aXZpdHkpO1xuICBlLnRhcmdldC5yZXNldCgpO1xufSk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNkZWxldGUtYWxsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gIHRhc2tzLmRlbGV0ZUFsbCgpO1xufSk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jbGVhci1jb21wbGV0ZWQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgdGFza3MuY2xlYXJDb21wbGV0ZWQoKTtcbn0pOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "to-do-list",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "dependencies": {
7 | "abab": "^2.0.5",
8 | "abbrev": "^1.1.1",
9 | "accepts": "^1.3.8",
10 | "acorn": "^8.7.0",
11 | "acorn-globals": "^6.0.0",
12 | "acorn-import-assertions": "^1.8.0",
13 | "acorn-jsx": "^5.3.2",
14 | "acorn-jsx-walk": "^2.0.0",
15 | "acorn-walk": "^8.2.0",
16 | "agent-base": "^6.0.2",
17 | "agentkeepalive": "^4.2.1",
18 | "aggregate-error": "^3.1.0",
19 | "ajv": "^6.12.6",
20 | "ajv-formats": "^2.1.1",
21 | "ajv-keywords": "^3.5.2",
22 | "ansi-align": "^3.0.1",
23 | "ansi-colors": "^4.1.1",
24 | "ansi-html-community": "^0.0.8",
25 | "ansi-regex": "^5.0.1",
26 | "ansi-styles": "^3.2.1",
27 | "anymatch": "^3.1.2",
28 | "aproba": "^2.0.0",
29 | "are-we-there-yet": "^2.0.0",
30 | "argparse": "^1.0.10",
31 | "array-flatten": "^2.1.2",
32 | "array-includes": "^3.1.4",
33 | "array-union": "^2.1.0",
34 | "array.prototype.flat": "^1.2.5",
35 | "arrify": "^1.0.1",
36 | "asn1": "^0.2.6",
37 | "assert-plus": "^1.0.0",
38 | "ast-types": "^0.13.4",
39 | "astral-regex": "^2.0.0",
40 | "async": "^2.6.3",
41 | "asynckit": "^0.4.0",
42 | "autoprefixer": "^9.8.8",
43 | "aws-sign2": "^0.7.0",
44 | "aws4": "^1.11.0",
45 | "axe-core": "^4.4.1",
46 | "bail": "^1.0.5",
47 | "balanced-match": "^1.0.2",
48 | "base64-js": "^1.5.1",
49 | "batch": "^0.6.1",
50 | "bcp47": "^1.1.2",
51 | "bcrypt-pbkdf": "^1.0.2",
52 | "binary-extensions": "^2.2.0",
53 | "bl": "^4.1.0",
54 | "body-parser": "^1.19.2",
55 | "bonjour": "^3.5.0",
56 | "boolbase": "^1.0.0",
57 | "boxen": "^5.1.2",
58 | "brace-expansion": "^1.1.11",
59 | "braces": "^3.0.2",
60 | "browser-process-hrtime": "^1.0.0",
61 | "browserslist": "^4.20.2",
62 | "buffer": "^5.7.1",
63 | "buffer-crc32": "^0.2.13",
64 | "buffer-from": "^1.1.2",
65 | "buffer-indexof": "^1.1.1",
66 | "builtins": "^1.0.3",
67 | "bytes": "^3.0.0",
68 | "cacache": "^16.0.3",
69 | "cacheable-lookup": "^5.0.4",
70 | "cacheable-request": "^7.0.2",
71 | "call-bind": "^1.0.2",
72 | "callsites": "^3.1.0",
73 | "camel-case": "^4.1.2",
74 | "camelcase": "^5.3.1",
75 | "camelcase-keys": "^6.2.2",
76 | "caniuse-lite": "^1.0.30001320",
77 | "canvas": "^2.9.1",
78 | "caseless": "^0.12.0",
79 | "chalk": "^2.4.2",
80 | "character-entities": "^1.2.4",
81 | "character-entities-legacy": "^1.1.4",
82 | "character-reference-invalid": "^1.1.4",
83 | "chokidar": "^3.5.3",
84 | "chownr": "^2.0.0",
85 | "chrome-trace-event": "^1.0.3",
86 | "ci-info": "^3.3.0",
87 | "clean-css": "^5.2.4",
88 | "clean-stack": "^2.2.0",
89 | "cli-boxes": "^2.2.1",
90 | "cli-cursor": "^3.1.0",
91 | "cli-spinners": "^2.6.1",
92 | "clone": "^1.0.4",
93 | "clone-deep": "^4.0.1",
94 | "clone-regexp": "^2.2.0",
95 | "clone-response": "^1.0.2",
96 | "cloudinary": "^1.29.0",
97 | "cloudinary-core": "^2.12.3",
98 | "color-convert": "^1.9.3",
99 | "color-name": "^1.1.3",
100 | "color-string": "^1.9.0",
101 | "color-support": "^1.1.3",
102 | "colorette": "^2.0.16",
103 | "combined-stream": "^1.0.8",
104 | "commander": "^2.20.3",
105 | "compressible": "^2.0.18",
106 | "compression": "^1.7.4",
107 | "concat-map": "^0.0.1",
108 | "configstore": "^5.0.1",
109 | "confusing-browser-globals": "^1.0.11",
110 | "connect-history-api-fallback": "^1.6.0",
111 | "console-control-strings": "^1.1.0",
112 | "content-disposition": "^0.5.4",
113 | "content-type": "^1.0.4",
114 | "convert-source-map": "^1.8.0",
115 | "cookie": "^0.4.2",
116 | "cookie-signature": "^1.0.6",
117 | "core-js": "^3.6.5",
118 | "core-util-is": "^1.0.3",
119 | "cosmiconfig": "^7.0.1",
120 | "cross-fetch": "^3.1.5",
121 | "cross-spawn": "^7.0.3",
122 | "crypto-random-string": "^2.0.0",
123 | "css-loader": "^6.7.1",
124 | "css-select": "^4.2.1",
125 | "css-tree": "^1.1.3",
126 | "css-what": "^5.1.0",
127 | "cssesc": "^3.0.0",
128 | "cssom": "^0.5.0",
129 | "cssstyle": "^2.3.0",
130 | "dashdash": "^1.14.1",
131 | "data-uri-to-buffer": "^3.0.1",
132 | "data-urls": "^3.0.1",
133 | "debug": "^2.6.9",
134 | "decamelize": "^1.2.0",
135 | "decamelize-keys": "^1.1.0",
136 | "decimal.js": "^10.3.1",
137 | "decompress-response": "^6.0.0",
138 | "deep-equal": "^1.1.1",
139 | "deep-extend": "^0.6.0",
140 | "deep-is": "^0.1.4",
141 | "default-gateway": "^6.0.3",
142 | "defaults": "^1.0.3",
143 | "defer-to-connect": "^2.0.1",
144 | "define-lazy-prop": "^2.0.0",
145 | "define-properties": "^1.1.3",
146 | "degenerator": "^3.0.2",
147 | "del": "^6.0.0",
148 | "delayed-stream": "^1.0.0",
149 | "delegates": "^1.0.0",
150 | "depd": "^1.1.2",
151 | "destroy": "^1.0.4",
152 | "detect-libc": "^1.0.3",
153 | "detect-node": "^2.1.0",
154 | "devtools-protocol": "^0.0.969999",
155 | "dir-glob": "^3.0.1",
156 | "dns-equal": "^1.0.0",
157 | "dns-packet": "^1.3.4",
158 | "dns-txt": "^2.0.2",
159 | "doctrine": "^3.0.0",
160 | "dom-converter": "^0.2.0",
161 | "dom-serializer": "^1.3.2",
162 | "domelementtype": "^2.2.0",
163 | "domexception": "^4.0.0",
164 | "domhandler": "^4.3.1",
165 | "domutils": "^2.8.0",
166 | "dot-case": "^3.0.4",
167 | "dot-prop": "^5.3.0",
168 | "duplexer3": "^0.1.4",
169 | "ecc-jsbn": "^0.1.2",
170 | "ee-first": "^1.1.1",
171 | "ejs": "^3.1.6",
172 | "electron-to-chromium": "^1.4.92",
173 | "emoji-regex": "^8.0.0",
174 | "encodeurl": "^1.0.2",
175 | "encoding": "^0.1.13",
176 | "end-of-stream": "^1.4.4",
177 | "enhanced-resolve": "^5.9.2",
178 | "enquirer": "^2.3.6",
179 | "entities": "^2.2.0",
180 | "envinfo": "^7.8.1",
181 | "err-code": "^2.0.3",
182 | "error-ex": "^1.3.2",
183 | "es-abstract": "^1.19.1",
184 | "es-module-lexer": "^0.9.3",
185 | "es-to-primitive": "^1.2.1",
186 | "escalade": "^3.1.1",
187 | "escape-goat": "^2.1.1",
188 | "escape-html": "^1.0.3",
189 | "escape-string-regexp": "^1.0.5",
190 | "escodegen": "^2.0.0",
191 | "eslint-import-resolver-node": "^0.3.6",
192 | "eslint-module-utils": "^2.7.3",
193 | "eslint-scope": "^5.1.1",
194 | "eslint-utils": "^2.1.0",
195 | "eslint-visitor-keys": "^1.3.0",
196 | "espree": "^7.3.1",
197 | "esprima": "^4.0.1",
198 | "esquery": "^1.4.0",
199 | "esrecurse": "^4.3.0",
200 | "estraverse": "^4.3.0",
201 | "esutils": "^2.0.3",
202 | "etag": "^1.8.1",
203 | "eventemitter2": "^6.4.5",
204 | "eventemitter3": "^4.0.7",
205 | "events": "^3.3.0",
206 | "execa": "^5.1.1",
207 | "execall": "^2.0.0",
208 | "express": "^4.17.3",
209 | "extend": "^3.0.2",
210 | "extract-zip": "^2.0.1",
211 | "extsprintf": "^1.3.0",
212 | "fast-deep-equal": "^3.1.3",
213 | "fast-glob": "^3.2.11",
214 | "fast-json-stable-stringify": "^2.1.0",
215 | "fast-levenshtein": "^2.0.6",
216 | "fast-xml-parser": "^3.21.1",
217 | "fastest-levenshtein": "^1.0.12",
218 | "fastq": "^1.13.0",
219 | "faye-websocket": "^0.11.4",
220 | "fd-slicer": "^1.1.0",
221 | "file-entry-cache": "^6.0.1",
222 | "file-type": "^16.5.3",
223 | "file-uri-to-path": "^2.0.0",
224 | "filelist": "^1.0.2",
225 | "fill-range": "^7.0.1",
226 | "finalhandler": "^1.1.2",
227 | "find-up": "^4.1.0",
228 | "flat-cache": "^3.0.4",
229 | "flatted": "^3.2.5",
230 | "follow-redirects": "^1.14.9",
231 | "forever-agent": "^0.6.1",
232 | "form-data": "^4.0.0",
233 | "forwarded": "^0.2.0",
234 | "fresh": "^0.5.2",
235 | "fs-constants": "^1.0.0",
236 | "fs-extra": "^10.0.1",
237 | "fs-minipass": "^2.1.0",
238 | "fs-monkey": "^1.0.3",
239 | "fs.realpath": "^1.0.0",
240 | "ftp": "^0.3.10",
241 | "function-bind": "^1.1.1",
242 | "functional-red-black-tree": "^1.0.1",
243 | "gauge": "^3.0.2",
244 | "gensync": "^1.0.0-beta.2",
245 | "get-intrinsic": "^1.1.1",
246 | "get-stdin": "^8.0.0",
247 | "get-stream": "^6.0.1",
248 | "get-symbol-description": "^1.0.0",
249 | "get-uri": "^3.0.2",
250 | "getpass": "^0.1.7",
251 | "glob": "^7.2.0",
252 | "glob-parent": "^5.1.2",
253 | "glob-to-regexp": "^0.4.1",
254 | "global-dirs": "^3.0.0",
255 | "global-modules": "^2.0.0",
256 | "global-prefix": "^3.0.0",
257 | "globals": "^11.12.0",
258 | "globby": "^11.1.0",
259 | "globjoin": "^0.1.4",
260 | "gonzales-pe": "^4.3.0",
261 | "got": "^11.8.3",
262 | "graceful-fs": "^4.2.9",
263 | "handle-thing": "^2.0.1",
264 | "har-schema": "^2.0.0",
265 | "har-validator": "^5.1.5",
266 | "hard-rejection": "^2.1.0",
267 | "has": "^1.0.3",
268 | "has-bigints": "^1.0.1",
269 | "has-flag": "^4.0.0",
270 | "has-symbols": "^1.0.3",
271 | "has-tostringtag": "^1.0.0",
272 | "has-unicode": "^2.0.1",
273 | "has-yarn": "^2.1.0",
274 | "he": "^1.2.0",
275 | "hosted-git-info": "^5.0.0",
276 | "hpack.js": "^2.1.6",
277 | "html-encoding-sniffer": "^3.0.0",
278 | "html-entities": "^2.3.2",
279 | "html-minifier-terser": "^6.1.0",
280 | "html-tags": "^3.1.0",
281 | "html-webpack-plugin": "^5.5.0",
282 | "htmlparser2": "^6.1.0",
283 | "http-cache-semantics": "^4.1.0",
284 | "http-deceiver": "^1.2.7",
285 | "http-errors": "^1.8.1",
286 | "http-parser-js": "^0.5.6",
287 | "http-proxy": "^1.18.1",
288 | "http-proxy-agent": "^5.0.0",
289 | "http-proxy-middleware": "^2.0.4",
290 | "http-signature": "^1.2.0",
291 | "http2-wrapper": "^1.0.3",
292 | "https-proxy-agent": "^5.0.0",
293 | "human-signals": "^2.1.0",
294 | "humanize-ms": "^1.2.1",
295 | "iconv-lite": "^0.4.24",
296 | "icss-utils": "^5.1.0",
297 | "ieee754": "^1.2.1",
298 | "ignore": "^5.2.0",
299 | "image-size": "^1.0.1",
300 | "import-fresh": "^3.3.0",
301 | "import-lazy": "^4.0.0",
302 | "import-local": "^3.1.0",
303 | "imurmurhash": "^0.1.4",
304 | "indent-string": "^4.0.0",
305 | "infer-owner": "^1.0.4",
306 | "inflight": "^1.0.6",
307 | "inherits": "^2.0.4",
308 | "ini": "^1.3.8",
309 | "internal-slot": "^1.0.3",
310 | "interpret": "^2.2.0",
311 | "invert-kv": "^3.0.1",
312 | "ip": "^1.1.5",
313 | "ipaddr.js": "^2.0.1",
314 | "is-alphabetical": "^1.0.4",
315 | "is-alphanumerical": "^1.0.4",
316 | "is-arguments": "^1.1.1",
317 | "is-arrayish": "^0.3.2",
318 | "is-bigint": "^1.0.4",
319 | "is-binary-path": "^2.1.0",
320 | "is-boolean-object": "^1.1.2",
321 | "is-buffer": "^2.0.5",
322 | "is-callable": "^1.2.4",
323 | "is-ci": "^3.0.1",
324 | "is-core-module": "^2.8.1",
325 | "is-date-object": "^1.0.5",
326 | "is-decimal": "^1.0.4",
327 | "is-docker": "^2.2.1",
328 | "is-extglob": "^2.1.1",
329 | "is-fullwidth-code-point": "^3.0.0",
330 | "is-glob": "^4.0.3",
331 | "is-hexadecimal": "^1.0.4",
332 | "is-installed-globally": "^0.4.0",
333 | "is-interactive": "^1.0.0",
334 | "is-lambda": "^1.0.1",
335 | "is-negative-zero": "^2.0.2",
336 | "is-npm": "^5.0.0",
337 | "is-number": "^7.0.0",
338 | "is-number-object": "^1.0.6",
339 | "is-obj": "^2.0.0",
340 | "is-path-cwd": "^2.2.0",
341 | "is-path-inside": "^3.0.3",
342 | "is-plain-obj": "^3.0.0",
343 | "is-plain-object": "^2.0.4",
344 | "is-potential-custom-element-name": "^1.0.1",
345 | "is-regex": "^1.1.4",
346 | "is-regexp": "^2.1.0",
347 | "is-shared-array-buffer": "^1.0.1",
348 | "is-stream": "^2.0.1",
349 | "is-string": "^1.0.7",
350 | "is-svg": "^4.3.2",
351 | "is-symbol": "^1.0.4",
352 | "is-typedarray": "^1.0.0",
353 | "is-unicode-supported": "^0.1.0",
354 | "is-weakref": "^1.0.2",
355 | "is-wsl": "^2.2.0",
356 | "is-yarn-global": "^0.3.0",
357 | "isarray": "^1.0.0",
358 | "isexe": "^2.0.0",
359 | "isobject": "^3.0.1",
360 | "isstream": "^0.1.2",
361 | "jake": "^10.8.4",
362 | "jest-worker": "^27.5.1",
363 | "js-library-detector": "^6.4.0",
364 | "js-tokens": "^4.0.0",
365 | "js-yaml": "^3.14.1",
366 | "jsbn": "^0.1.1",
367 | "jsdom": "^19.0.0",
368 | "jsesc": "^2.5.2",
369 | "json-buffer": "^3.0.1",
370 | "json-parse-better-errors": "^1.0.2",
371 | "json-parse-even-better-errors": "^2.3.1",
372 | "json-schema": "^0.4.0",
373 | "json-schema-traverse": "^0.4.1",
374 | "json-stable-stringify-without-jsonify": "^1.0.1",
375 | "json-stringify-safe": "^5.0.1",
376 | "json5": "^2.2.1",
377 | "jsonc-parser": "^3.0.0",
378 | "jsonfile": "^6.1.0",
379 | "jsonparse": "^1.3.1",
380 | "jsprim": "^1.4.2",
381 | "keyv": "^4.1.1",
382 | "kind-of": "^6.0.3",
383 | "known-css-properties": "^0.21.0",
384 | "latest-version": "^5.1.0",
385 | "lcid": "^3.1.1",
386 | "levn": "^0.4.1",
387 | "lines-and-columns": "^1.2.4",
388 | "loader-runner": "^4.2.0",
389 | "locate-path": "^5.0.0",
390 | "lockfile": "^1.0.4",
391 | "lodash": "^4.17.21",
392 | "lodash.merge": "^4.6.2",
393 | "lodash.truncate": "^4.4.2",
394 | "log-symbols": "^4.1.0",
395 | "longest-streak": "^2.0.4",
396 | "lower-case": "^2.0.2",
397 | "lowercase-keys": "^2.0.0",
398 | "lru-cache": "^6.0.0",
399 | "make-dir": "^3.1.0",
400 | "make-fetch-happen": "^10.0.6",
401 | "map-age-cleaner": "^0.1.3",
402 | "map-obj": "^4.3.0",
403 | "mathml-tag-names": "^2.1.3",
404 | "mdast-util-from-markdown": "^0.8.5",
405 | "mdast-util-to-markdown": "^0.6.5",
406 | "mdast-util-to-string": "^2.0.0",
407 | "mdn-data": "^2.0.27",
408 | "media-typer": "^0.3.0",
409 | "mem": "^5.1.1",
410 | "memfs": "^3.4.1",
411 | "meow": "^9.0.0",
412 | "merge-descriptors": "^1.0.1",
413 | "merge-stream": "^2.0.0",
414 | "merge2": "^1.4.1",
415 | "metaviewport-parser": "^0.2.0",
416 | "methods": "^1.1.2",
417 | "micromark": "^2.11.4",
418 | "micromatch": "^4.0.4",
419 | "mime": "^1.6.0",
420 | "mime-db": "^1.52.0",
421 | "mime-types": "^2.1.35",
422 | "mimic-fn": "^2.1.0",
423 | "mimic-response": "^1.0.1",
424 | "min-indent": "^1.0.1",
425 | "minimalistic-assert": "^1.0.1",
426 | "minimatch": "^3.1.2",
427 | "minimist": "^1.2.6",
428 | "minimist-options": "^4.1.0",
429 | "minipass": "^3.1.6",
430 | "minipass-collect": "^1.0.2",
431 | "minipass-fetch": "^2.0.3",
432 | "minipass-flush": "^1.0.5",
433 | "minipass-json-stream": "^1.0.1",
434 | "minipass-pipeline": "^1.2.4",
435 | "minipass-sized": "^1.0.3",
436 | "minizlib": "^2.1.2",
437 | "mkdirp": "^0.5.6",
438 | "mkdirp-classic": "^0.5.3",
439 | "ms": "^2.0.0",
440 | "multicast-dns": "^6.2.3",
441 | "multicast-dns-service-types": "^1.1.0",
442 | "mutationobserver-shim": "^0.3.7",
443 | "nan": "^2.15.0",
444 | "nanoid": "^3.3.1",
445 | "natural-compare": "^1.4.0",
446 | "negotiator": "^0.6.3",
447 | "neo-async": "^2.6.2",
448 | "netmask": "^2.0.2",
449 | "no-case": "^3.0.4",
450 | "node-fetch": "^2.6.7",
451 | "node-forge": "^1.3.0",
452 | "node-releases": "^2.0.2",
453 | "nopt": "^5.0.0",
454 | "normalize-package-data": "^3.0.3",
455 | "normalize-path": "^3.0.0",
456 | "normalize-range": "^0.1.2",
457 | "normalize-selector": "^0.2.0",
458 | "normalize-url": "^6.1.0",
459 | "npm-package-arg": "^9.0.1",
460 | "npm-registry-fetch": "^13.1.0",
461 | "npm-run-path": "^4.0.1",
462 | "npmlog": "^5.0.1",
463 | "nth-check": "^2.0.1",
464 | "num2fraction": "^1.2.2",
465 | "nwsapi": "^2.2.0",
466 | "oauth-sign": "^0.9.0",
467 | "object-assign": "^4.1.1",
468 | "object-inspect": "^1.12.0",
469 | "object-is": "^1.1.5",
470 | "object-keys": "^1.1.1",
471 | "object.assign": "^4.1.2",
472 | "object.entries": "^1.1.5",
473 | "object.values": "^1.1.5",
474 | "obuf": "^1.1.2",
475 | "on-finished": "^2.3.0",
476 | "on-headers": "^1.0.2",
477 | "once": "^1.4.0",
478 | "onetime": "^5.1.2",
479 | "open": "^8.4.0",
480 | "optionator": "^0.9.1",
481 | "ora": "^5.4.1",
482 | "os-locale": "^5.0.0",
483 | "p-cancelable": "^2.1.1",
484 | "p-defer": "^1.0.0",
485 | "p-is-promise": "^2.1.0",
486 | "p-limit": "^2.3.0",
487 | "p-locate": "^4.1.0",
488 | "p-map": "^4.0.0",
489 | "p-retry": "^4.6.1",
490 | "p-try": "^2.2.0",
491 | "pac-proxy-agent": "^5.0.0",
492 | "pac-resolver": "^5.0.0",
493 | "package-json": "^6.5.0",
494 | "param-case": "^3.0.4",
495 | "parent-module": "^1.0.1",
496 | "parse-entities": "^2.0.0",
497 | "parse-json": "^5.2.0",
498 | "parse5": "^6.0.1",
499 | "parse5-htmlparser2-tree-adapter": "^6.0.1",
500 | "parseurl": "^1.3.3",
501 | "pascal-case": "^3.1.2",
502 | "path-exists": "^4.0.0",
503 | "path-is-absolute": "^1.0.1",
504 | "path-key": "^3.1.1",
505 | "path-parse": "^1.0.7",
506 | "path-to-regexp": "^0.1.7",
507 | "path-type": "^4.0.0",
508 | "peek-readable": "^4.1.0",
509 | "pend": "^1.2.0",
510 | "performance-now": "^2.1.0",
511 | "picocolors": "^1.0.0",
512 | "picomatch": "^2.3.1",
513 | "pkg-dir": "^4.2.0",
514 | "portfinder": "^1.0.28",
515 | "postcss": "^8.4.12",
516 | "postcss-html": "^0.36.0",
517 | "postcss-less": "^5.0.0",
518 | "postcss-media-query-parser": "^0.2.3",
519 | "postcss-modules-extract-imports": "^3.0.0",
520 | "postcss-modules-local-by-default": "^4.0.0",
521 | "postcss-modules-scope": "^3.0.0",
522 | "postcss-modules-values": "^4.0.0",
523 | "postcss-resolve-nested-selector": "^0.1.1",
524 | "postcss-safe-parser": "^6.0.0",
525 | "postcss-sass": "^0.5.0",
526 | "postcss-scss": "^4.0.3",
527 | "postcss-selector-parser": "^6.0.9",
528 | "postcss-syntax": "^0.36.2",
529 | "postcss-value-parser": "^4.2.0",
530 | "prelude-ls": "^1.2.1",
531 | "prepend-http": "^2.0.0",
532 | "pretty-error": "^4.0.0",
533 | "proc-log": "^2.0.0",
534 | "process-nextick-args": "^2.0.1",
535 | "progress": "^2.0.3",
536 | "promise-inflight": "^1.0.1",
537 | "promise-retry": "^2.0.1",
538 | "proxy-addr": "^2.0.7",
539 | "proxy-agent": "^5.0.0",
540 | "proxy-from-env": "^1.1.0",
541 | "psl": "^1.8.0",
542 | "pump": "^3.0.0",
543 | "punycode": "^2.1.1",
544 | "pupa": "^2.1.1",
545 | "puppeteer-core": "^13.5.1",
546 | "q": "^1.5.1",
547 | "qs": "^6.9.7",
548 | "queue": "^6.0.2",
549 | "queue-microtask": "^1.2.3",
550 | "quick-lru": "^5.1.1",
551 | "randombytes": "^2.1.0",
552 | "range-parser": "^1.2.1",
553 | "raw-body": "^2.4.3",
554 | "rc": "^1.2.8",
555 | "read-pkg": "^5.2.0",
556 | "read-pkg-up": "^7.0.1",
557 | "readable-stream": "^3.6.0",
558 | "readable-web-to-node-stream": "^3.0.2",
559 | "readdirp": "^3.6.0",
560 | "rechoir": "^0.7.1",
561 | "redent": "^3.0.0",
562 | "regexp.prototype.flags": "^1.4.1",
563 | "regexpp": "^3.2.0",
564 | "registry-auth-token": "^4.2.1",
565 | "registry-url": "^5.1.0",
566 | "relateurl": "^0.2.7",
567 | "remark": "^13.0.0",
568 | "remark-parse": "^9.0.0",
569 | "remark-stringify": "^9.0.1",
570 | "renderkid": "^3.0.0",
571 | "repeat-string": "^1.6.1",
572 | "request": "^2.88.2",
573 | "require-from-string": "^2.0.2",
574 | "requires-port": "^1.0.0",
575 | "resolve": "^1.22.0",
576 | "resolve-alpn": "^1.2.1",
577 | "resolve-cwd": "^3.0.0",
578 | "resolve-from": "^5.0.0",
579 | "responselike": "^2.0.0",
580 | "restore-cursor": "^3.1.0",
581 | "retry": "^0.13.1",
582 | "reusify": "^1.0.4",
583 | "rimraf": "^3.0.2",
584 | "run-parallel": "^1.2.0",
585 | "safe-buffer": "^5.2.1",
586 | "safer-buffer": "^2.1.2",
587 | "saxes": "^5.0.1",
588 | "schema-utils": "^3.1.1",
589 | "select-hose": "^2.0.0",
590 | "selfsigned": "^2.0.0",
591 | "semver": "^7.3.5",
592 | "semver-diff": "^3.1.1",
593 | "send": "^0.17.2",
594 | "serialize-javascript": "^6.0.0",
595 | "serve-index": "^1.9.1",
596 | "serve-static": "^1.14.2",
597 | "set-blocking": "^2.0.0",
598 | "setimmediate": "^1.0.5",
599 | "setprototypeof": "^1.2.0",
600 | "shallow-clone": "^3.0.1",
601 | "shebang-command": "^2.0.0",
602 | "shebang-regex": "^3.0.0",
603 | "side-channel": "^1.0.4",
604 | "signal-exit": "^3.0.7",
605 | "simple-concat": "^1.0.1",
606 | "simple-get": "^3.1.1",
607 | "simple-swizzle": "^0.2.2",
608 | "slash": "^3.0.0",
609 | "slice-ansi": "^4.0.0",
610 | "smart-buffer": "^4.2.0",
611 | "sockjs": "^0.3.24",
612 | "socks": "^2.6.2",
613 | "socks-proxy-agent": "^6.1.1",
614 | "source-map": "^0.6.1",
615 | "source-map-js": "^1.0.2",
616 | "source-map-support": "^0.5.21",
617 | "spdx-correct": "^3.1.1",
618 | "spdx-exceptions": "^2.3.0",
619 | "spdx-expression-parse": "^3.0.1",
620 | "spdx-license-ids": "^3.0.11",
621 | "spdy": "^4.0.2",
622 | "spdy-transport": "^3.0.0",
623 | "specificity": "^0.4.1",
624 | "sprintf-js": "^1.0.3",
625 | "sshpk": "^1.17.0",
626 | "ssri": "^8.0.1",
627 | "statuses": "^1.5.0",
628 | "string_decoder": "^1.3.0",
629 | "string-width": "^4.2.3",
630 | "string.prototype.trimend": "^1.0.4",
631 | "string.prototype.trimstart": "^1.0.4",
632 | "strip-ansi": "^6.0.1",
633 | "strip-bom": "^3.0.0",
634 | "strip-final-newline": "^2.0.0",
635 | "strip-indent": "^3.0.0",
636 | "strip-json-comments": "^3.1.1",
637 | "strnum": "^1.0.5",
638 | "strtok3": "^6.3.0",
639 | "style-loader": "^3.3.1",
640 | "style-search": "^0.1.0",
641 | "stylelint-config-recommended": "^4.0.0",
642 | "sugarss": "^2.0.0",
643 | "supports-color": "^8.1.1",
644 | "supports-preserve-symlinks-flag": "^1.0.0",
645 | "svg-tags": "^1.0.0",
646 | "symbol-tree": "^3.2.4",
647 | "table": "^6.8.0",
648 | "tapable": "^2.2.1",
649 | "tar": "^6.1.11",
650 | "tar-fs": "^2.1.1",
651 | "tar-stream": "^2.2.0",
652 | "terser": "^5.12.1",
653 | "terser-webpack-plugin": "^5.3.1",
654 | "text-table": "^0.2.0",
655 | "through": "^2.3.8",
656 | "thunky": "^1.1.0",
657 | "to-fast-properties": "^2.0.0",
658 | "to-readable-stream": "^1.0.0",
659 | "to-regex-range": "^5.0.1",
660 | "toidentifier": "^1.0.1",
661 | "token-types": "^4.2.0",
662 | "tough-cookie": "^4.0.0",
663 | "tr46": "^3.0.0",
664 | "trim-newlines": "^3.0.1",
665 | "trough": "^1.0.5",
666 | "tsconfig-paths": "^3.14.1",
667 | "tslib": "^2.3.1",
668 | "tsutils": "^3.21.0",
669 | "tunnel-agent": "^0.6.0",
670 | "tweetnacl": "^0.14.5",
671 | "type-check": "^0.4.0",
672 | "type-fest": "^0.18.1",
673 | "type-is": "^1.6.18",
674 | "typedarray-to-buffer": "^3.1.5",
675 | "typescript": "^4.6.2",
676 | "unbox-primitive": "^1.0.1",
677 | "unbzip2-stream": "^1.4.3",
678 | "unified": "^9.2.2",
679 | "unique-filename": "^1.1.1",
680 | "unique-slug": "^2.0.2",
681 | "unique-string": "^2.0.0",
682 | "unist-util-find-all-after": "^3.0.2",
683 | "unist-util-is": "^4.1.0",
684 | "unist-util-stringify-position": "^2.0.3",
685 | "universalify": "^2.0.0",
686 | "unpipe": "^1.0.0",
687 | "update-notifier": "^5.1.0",
688 | "uri-js": "^4.4.1",
689 | "url-parse-lax": "^3.0.0",
690 | "util-deprecate": "^1.0.2",
691 | "utila": "^0.4.0",
692 | "utils-merge": "^1.0.1",
693 | "uuid": "^8.3.2",
694 | "v8-compile-cache": "^2.3.0",
695 | "validate-npm-package-license": "^3.0.4",
696 | "validate-npm-package-name": "^3.0.0",
697 | "vary": "^1.1.2",
698 | "verror": "^1.10.0",
699 | "vfile": "^4.2.1",
700 | "vfile-message": "^2.0.4",
701 | "vm2": "^3.9.9",
702 | "w3c-hr-time": "^1.0.2",
703 | "w3c-xmlserializer": "^3.0.0",
704 | "watchpack": "^2.3.1",
705 | "wbuf": "^1.7.3",
706 | "wcwidth": "^1.0.1",
707 | "webidl-conversions": "^7.0.0",
708 | "webpack": "^5.70.0",
709 | "webpack-dev-middleware": "^5.3.1",
710 | "webpack-dev-server": "^4.7.4",
711 | "webpack-merge": "^5.8.0",
712 | "webpack-sources": "^3.2.3",
713 | "websocket-driver": "^0.7.4",
714 | "websocket-extensions": "^0.1.4",
715 | "whatwg-encoding": "^2.0.0",
716 | "whatwg-mimetype": "^3.0.0",
717 | "whatwg-url": "^10.0.0",
718 | "which": "^2.0.2",
719 | "which-boxed-primitive": "^1.0.2",
720 | "wide-align": "^1.1.5",
721 | "widest-line": "^3.1.0",
722 | "wildcard": "^2.0.0",
723 | "word-wrap": "^1.2.3",
724 | "wrap-ansi": "^7.0.0",
725 | "wrappy": "^1.0.2",
726 | "write-file-atomic": "^3.0.3",
727 | "ws": "^8.5.0",
728 | "xdg-basedir": "^4.0.0",
729 | "xml-name-validator": "^4.0.0",
730 | "xmlchars": "^2.2.0",
731 | "xregexp": "^2.0.0",
732 | "yallist": "^4.0.0",
733 | "yaml": "^1.10.2",
734 | "yargs-parser": "^20.2.9",
735 | "yauzl": "^2.10.0",
736 | "zwitch": "^1.0.5"
737 | },
738 | "devDependencies": {
739 | "babel-eslint": "^10.1.0",
740 | "css-loader": "^6.7.1",
741 | "deploy-to-git": "^0.4.1",
742 | "eslint": "^7.32.0",
743 | "eslint-config-airbnb-base": "^14.2.1",
744 | "eslint-plugin-import": "^2.25.4",
745 | "gh-pages": "^3.2.3",
746 | "hint": "^6.1.10",
747 | "html-webpack-plugin": "^5.5.0",
748 | "style-loader": "^3.3.1",
749 | "stylelint": "^13.13.1",
750 | "stylelint-config-standard": "^21.0.0",
751 | "stylelint-csstree-validator": "^1.9.0",
752 | "stylelint-scss": "^3.21.0",
753 | "webpack": "^5.70.0",
754 | "webpack-cli": "^4.9.2",
755 | "webpack-dev-server": "^4.7.4"
756 | },
757 | "scripts": {
758 | "test": "echo \"Error: no test specified\" && exit 1",
759 | "build": "webpack",
760 | "start": "webpack serve --open",
761 | "deploy": "gh-pages -d dist"
762 | },
763 | "repository": {
764 | "type": "git",
765 | "url": "git+https://github.com/AdrianCSM/To-Do-List.git"
766 | },
767 | "keywords": [],
768 | "author": "",
769 | "license": "ISC",
770 | "bugs": {
771 | "url": "https://github.com/AdrianCSM/To-Do-List/issues"
772 | },
773 | "homepage": "https://github.com/AdrianCSM/To-Do-List"
774 | }
775 |
--------------------------------------------------------------------------------
/src/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | To-Do List
8 |
9 |
10 |
11 |
12 |
13 |
14 |
18 |
19 |
25 |
26 |
29 |
30 |
31 | Clear All Completed
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import './style.css';
2 | import List from './list.js';
3 |
4 | const tasks = new List();
5 |
6 | document.querySelector('#add-task').addEventListener('submit', (e) => {
7 | e.preventDefault();
8 | const activity = e.target.elements.activity.value;
9 | tasks.addActivity(activity);
10 | e.target.reset();
11 | });
12 |
13 | document.querySelector('#delete-all').addEventListener('click', () => {
14 | tasks.deleteAll();
15 | });
16 |
17 | document.querySelector('.clear-completed').addEventListener('click', () => {
18 | tasks.clearCompleted();
19 | });
--------------------------------------------------------------------------------
/src/list.js:
--------------------------------------------------------------------------------
1 | export default class List {
2 | constructor() {
3 | this.list = JSON.parse(localStorage.getItem('todo-list'));
4 | if (!this.list) {
5 | this.list = [];
6 | }
7 | this.display();
8 | }
9 |
10 | display() {
11 | this.saveData();
12 | const listSection = document.getElementById('list-items');
13 | listSection.innerHTML = '';
14 | this.list.forEach((activity) => {
15 | let activityItem = ` `;
16 | if (activity.completed) {
17 | activityItem += `
18 | done
19 |
20 |
21 | ${activity.description}
22 |
23 | `;
24 | } else {
25 | activityItem += `
26 |
27 | check_box_outline_blank
28 |
29 |
30 | ${activity.description}
31 |
`;
32 | }
33 | activityItem += `
34 |
35 | delete
36 |
37 |
38 | `;
39 | listSection.innerHTML += activityItem;
40 | });
41 | this.activityActions();
42 | }
43 |
44 | saveData() {
45 | for (let i = 0; i < this.list.length; i += 1) {
46 | this.list[i].index = i;
47 | }
48 | this.list.sort((a, b) => {
49 | if (a.index < b.index) {
50 | return -1;
51 | }
52 | if (a.index > b.index) {
53 | return 1;
54 | }
55 | return 0;
56 | });
57 | localStorage.setItem('todo-list', JSON.stringify(this.list));
58 | }
59 |
60 | addActivity(activity) {
61 | if (activity.length > 0) {
62 | const newActivity = {
63 | description: activity,
64 | completed: false,
65 | index: this.list.length,
66 | };
67 | this.list.push(newActivity);
68 | this.display();
69 | this.saveData();
70 | }
71 | }
72 |
73 | deleteAll() {
74 | localStorage.clear();
75 | this.list = [];
76 | this.display();
77 | }
78 |
79 | updateStatus(index) {
80 | if (this.list[index].completed === true) {
81 | this.list[index].completed = false;
82 | } else if (this.list[index].completed === false) {
83 | this.list[index].completed = true;
84 | }
85 | this.display();
86 | }
87 |
88 | deleteCompleted(index) {
89 | this.list.splice(index, 1);
90 | this.display();
91 | }
92 |
93 | clearCompleted() {
94 | this.list = this.list.filter((activity) => activity.completed === false);
95 | this.display();
96 | }
97 |
98 | editActivity(index, description) {
99 | this.list[index].description = description;
100 | this.saveData();
101 | }
102 |
103 | activityActions() {
104 | const checkbox = document.querySelectorAll('.update-status');
105 | if (checkbox !== null) {
106 | checkbox.forEach((box) => {
107 | box.addEventListener('click', () => {
108 | this.updateStatus(box.getAttribute('data'));
109 | });
110 | });
111 | }
112 |
113 | const deleteActivity = document.querySelectorAll('.delete-activity');
114 | deleteActivity.forEach((activity) => {
115 | activity.addEventListener('click', () => {
116 | this.deleteCompleted(activity.getAttribute('data'));
117 | });
118 | });
119 |
120 | const editedActivity = document.querySelectorAll('.activity');
121 | if (editedActivity) {
122 | editedActivity.forEach((activity) => {
123 | activity.addEventListener('input', (e) => {
124 | const description = e.target.innerText;
125 | const index = e.target.getAttribute('data');
126 | this.editActivity(index, description);
127 | });
128 | });
129 | }
130 | }
131 | }
132 |
--------------------------------------------------------------------------------
/src/style.css:
--------------------------------------------------------------------------------
1 | body {
2 | background: #f6f6f6;
3 | }
4 |
5 | body * {
6 | color: rgb(84, 88, 98);
7 | font-family: 'Open Sans', 'Lucida Grande', tahoma, verdana, arial, sans-serif;
8 | }
9 |
10 | main {
11 | justify-content: center;
12 | align-items: center;
13 | min-height: 95vh;
14 | margin: 0 auto;
15 | }
16 |
17 | .todo-list {
18 | box-shadow: rgba(0, 0, 0, 0.15) 0 2px 8px 0;
19 | width: 500px;
20 | max-width: 100%;
21 | }
22 |
23 | form button .material-icons {
24 | font-size: 15px;
25 | }
26 |
27 | .todo-list .material-icons {
28 | transition: 0.6s;
29 | color: #9797a5;
30 | cursor: pointer;
31 | }
32 |
33 | .header .material-icons {
34 | font-size: 18px;
35 | }
36 |
37 | .todo-list .material-icons:hover {
38 | color: #333;
39 | }
40 |
41 | .todo-list .material-icons.move {
42 | cursor: move;
43 | }
44 |
45 | .header {
46 | border-bottom: 1px solid rgba(0, 0, 0, 0.08);
47 | }
48 |
49 | .header,
50 | form,
51 | ul {
52 | background: #fff;
53 | margin: 0;
54 | width: 100%;
55 | padding: 0;
56 | list-style-type: none;
57 | }
58 |
59 | .header,
60 | h2 {
61 | align-items: center;
62 | color: #545862;
63 | font-size: 18px;
64 | font-weight: 400;
65 | padding: 1rem;
66 | line-height: 20px;
67 | margin: 0;
68 | width: calc(100% - 2rem);
69 | text-overflow: ellipsis;
70 | overflow: hidden;
71 | white-space: nowrap;
72 | }
73 |
74 | form input {
75 | width: calc(100% - 25px);
76 | border: 0 solid transparent;
77 | outline: none;
78 | font-style: italic;
79 | line-height: 40px;
80 | height: 40px;
81 | font-size: 15px;
82 | }
83 |
84 | form {
85 | border-bottom: 1px solid rgba(0, 0, 0, 0.08);
86 | width: calc(100% - 40px);
87 | padding: 10px 10px 10px 30px;
88 | }
89 |
90 | form button {
91 | background: #fff;
92 | border: 0 solid transparent;
93 | }
94 |
95 | .list-item {
96 | width: calc(100% - 40px);
97 | padding: 10px 10px 10px 30px;
98 | font-size: 1rem;
99 | border-bottom: 1px solid rgba(0, 0, 0, 0.08);
100 | font-weight: 300;
101 | align-items: center;
102 | }
103 |
104 | .list-item p {
105 | width: calc(100% - 50px);
106 | border: 0 solid transparent;
107 | outline: none;
108 | height: 22px;
109 | line-height: 22px;
110 | padding: 0;
111 | margin: 0;
112 | padding-left: 20px;
113 | font-weight: 300;
114 | font-size: 15px;
115 | overflow-y: auto;
116 | background: #fff;
117 | }
118 |
119 | .list-item .material-icons.done {
120 | color: rgb(46, 138, 230);
121 | }
122 |
123 | .list-item p.completed {
124 | text-decoration-line: line-through;
125 | color: rgba(0, 0, 0, 0.45);
126 | }
127 |
128 | .list-item.editing {
129 | background-color: #fffeca;
130 | }
131 |
132 | .clear-completed {
133 | width: 100%;
134 | text-align: center;
135 | padding: 20px 6px;
136 | justify-content: center;
137 | }
138 |
139 | .clear-completed:hover {
140 | text-decoration: underline;
141 | cursor: pointer;
142 | }
143 |
144 | .d-flex {
145 | display: flex;
146 | }
147 |
148 | .cols {
149 | flex-direction: column;
150 | }
151 |
152 | .s-between {
153 | justify-content: space-between;
154 | }
155 |
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const HtmlWebpackPlugin = require('html-webpack-plugin');
3 |
4 | module.exports = {
5 | mode: 'development',
6 | entry: './src/index.js',
7 | devtool: 'inline-source-map',
8 | devServer: {
9 | static: './dist',
10 | },
11 | output: {
12 | filename: 'main.js',
13 | path: path.resolve(__dirname, 'dist'),
14 | clean: true,
15 | },
16 |
17 | plugins: [
18 | new HtmlWebpackPlugin({
19 | template: './src/index.html',
20 | }),
21 | ],
22 | module: {
23 | rules: [
24 | {
25 | test: /\.css$/i,
26 | use: ['style-loader', 'css-loader'],
27 | },
28 | {
29 | test: /\.(png|svg|jpg|jpeg|gif)$/i,
30 | type: 'asset/resource',
31 | },
32 | ],
33 | },
34 | };
--------------------------------------------------------------------------------