From 1f6391055966d6222b2cd266418fefc019311a8c Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Sun, 18 Sep 2022 22:36:11 +0900 Subject: [PATCH 001/150] feat(write-function-returns-number-of-vowels-in-string): implement vowel --- ...eturns-the-number-of-vowels-in-a-string.js | 29 ++++++++++++++++ ...eturns-the-number-of-vowels-in-a-string.ts | 34 +++++++++++++++++++ tsconfig.json | 4 +-- 3 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 javascript-today-magazine/returns-the-number-of-vowels-in-a-string.js create mode 100644 javascript-today-magazine/returns-the-number-of-vowels-in-a-string.ts diff --git a/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.js b/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.js new file mode 100644 index 0000000..5afab6b --- /dev/null +++ b/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.js @@ -0,0 +1,29 @@ +/** + * Write a function that returns the number of vowels in a string. + * + * Another common interview question: Write a function that returns the number of vowels in a string. + * Here we have two solutions, + * one makes use of a regular expression, and + * another uses an iterative approach, a for-of loop. + * + * Used in a string. Vowels are the characters "a", "e", "i", "o" and "u" + */ +// Solution 1: using regular expression +// function vowelsHandleByReg(characters: string) { +// const matches = characters.match(/[aeiou]/gi); +// return matches ? matches.length : 0; +// } +// Solution 2: uses an iterative approach, a for-of loop. +function vowelsHandleByIterative(characters) { + var count = 0; + var checker = ["a", "e", "i", "0", "u"]; + for (var _i = 0, _a = characters.toLowerCase(); _i < _a.length; _i++) { + var char = _a[_i]; + if (checker.includes(char)) { + count++; + } + } + return count; +} +// console.log(vowelsHandleByReg("Wakidur")); +console.log(vowelsHandleByIterative("Munni")); diff --git a/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.ts b/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.ts new file mode 100644 index 0000000..9b8d10c --- /dev/null +++ b/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.ts @@ -0,0 +1,34 @@ +/** + * Write a function that returns the number of vowels in a string. + * + * Another common interview question: Write a function that returns the number of vowels in a string. + * Here we have two solutions, + * one makes use of a regular expression, and + * another uses an iterative approach, a for-of loop. + * + * Used in a string. Vowels are the characters "a", "e", "i", "o" and "u" + */ + +// Solution 1: using regular expression + +// function vowelsHandleByReg(characters: string) { +// const matches = characters.match(/[aeiou]/gi); +// return matches ? matches.length : 0; +// } + +// Solution 2: uses an iterative approach, a for-of loop. +function vowelsHandleByIterative(characters: string) { + let count: number = 0; + const checker: string[] = ["a", "e", "i", "0", "u"]; + + for (let char of characters.toLowerCase()) { + if (checker.includes(char)) { + count++; + } + } + return count; +} + + +// console.log(vowelsHandleByReg("Wakidur")); +console.log(vowelsHandleByIterative("Munni")); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 851b942..fb8f65b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,8 +11,8 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es5", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "target": "es6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": ["es2016.Array.Include", "es2016", "es6"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ From d409f9dacd2d2f1e893fe9ef721a4d670eca7fdd Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 19 Sep 2022 20:19:00 +0900 Subject: [PATCH 002/150] init --- javascript-today-magazine/reverse-a-string.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 javascript-today-magazine/reverse-a-string.ts diff --git a/javascript-today-magazine/reverse-a-string.ts b/javascript-today-magazine/reverse-a-string.ts new file mode 100644 index 0000000..f6356e7 --- /dev/null +++ b/javascript-today-magazine/reverse-a-string.ts @@ -0,0 +1,8 @@ +/** + * Reverse a string. It's a common interview question, and it's quite simple. + * However, if you really want to impress your interviewer, you'd be well-off to understand multiple solutions to the problem. + * Rather than using built-in methods like ".reverse()" (which is fine, but you may be asked to neglect using it), 👍 + * demonstrate your ability to solve it in different ways. + * + * Here are three solutions to reversing a string in JavaScript.👏 + */ \ No newline at end of file From 381da7fa18c1591c2bc03fbf1c8334b9a164aa13 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 20 Sep 2022 11:34:56 +0900 Subject: [PATCH 003/150] modify file --- javascript-today-magazine/note.txt | 2 +- javascript-today-magazine/reverse-a-string.ts | 34 ++++++++++++++++--- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/javascript-today-magazine/note.txt b/javascript-today-magazine/note.txt index 9538d93..5b08c7e 100644 --- a/javascript-today-magazine/note.txt +++ b/javascript-today-magazine/note.txt @@ -2,7 +2,7 @@ JavaScript Today Magazine short: JavaScriptTM [JavaScriptTM] Bubble Sort - +[DataStructuresAlgorithms] 17.09.2022: Some common algorithms implemented in JavaScript: Bubble Sort, Selection Sort, and Merge Sort. 1. Bubble Sort 2. Selection Sort diff --git a/javascript-today-magazine/reverse-a-string.ts b/javascript-today-magazine/reverse-a-string.ts index f6356e7..200c993 100644 --- a/javascript-today-magazine/reverse-a-string.ts +++ b/javascript-today-magazine/reverse-a-string.ts @@ -1,8 +1,34 @@ /** - * Reverse a string. It's a common interview question, and it's quite simple. - * However, if you really want to impress your interviewer, you'd be well-off to understand multiple solutions to the problem. + * Reverse a string. It's a common interview question, and it's quite simple. + * However, if you really want to impress your interviewer, you'd be well-off to understand multiple solutions to the problem. * Rather than using built-in methods like ".reverse()" (which is fine, but you may be asked to neglect using it), 👍 * demonstrate your ability to solve it in different ways. - * + * * Here are three solutions to reversing a string in JavaScript.👏 - */ \ No newline at end of file + * + * + * Directions + * Given a string, return a new string with the reversed order of characters + */ + +// Solution 1: + +function reverseStringSolutionOne(str: string) { + return str.split("").reverse().join(""); +} + +// Solution 2: + +function reverseStringSolutionTwo(str: string) { + let reversed: string = ""; + for (let character of str) { + reversed = character + reversed; + } + return reversed; +} + +// Solution 3: + +function reverseStringSolutionThree(str: string) { + return str.split("").reduce((rev, char) => char + rev, ""); +} From 2536b5608434b89cf42f85910788db651aeb96a9 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 22 Sep 2022 21:34:59 +0900 Subject: [PATCH 004/150] add string --- javascript-today-magazine/string-and-array-methods.ts | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 javascript-today-magazine/string-and-array-methods.ts diff --git a/javascript-today-magazine/string-and-array-methods.ts b/javascript-today-magazine/string-and-array-methods.ts new file mode 100644 index 0000000..0642fa7 --- /dev/null +++ b/javascript-today-magazine/string-and-array-methods.ts @@ -0,0 +1,3 @@ +// Array and String Methods +const str: string = 'Hello world'; +str.toLowerCase(); \ No newline at end of file From 485d42b390db790725d6fbdddc64da240d8d6d3e Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 26 Sep 2022 12:01:04 +0900 Subject: [PATCH 005/150] readme updated --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index d49efc4..1cb342b 100644 --- a/README.md +++ b/README.md @@ -1 +1,28 @@ # JavaScript Algorithms And Data Structures + +What you will learn in here. +Technical: + +1. Big O notation + +2. Data structures: + +* Arrays +* Hash Tables +* Singly Linked Lists +* Doubly Linked Lists +* Queues +* Stacks +* Trees (BST, AVL Trees, Red Black Trees, Binary Heaps) +* Tries +* Graphs + +3. Algorithms: + +* Recursion +* Sorting +* Searching +* Tree Traversal +* Breadth First Search +* Depth First Search +* Dynamic Programming \ No newline at end of file From 112714e6558934715daa10b813db35288f8417c5 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 26 Sep 2022 12:03:10 +0900 Subject: [PATCH 006/150] modify --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1cb342b..8132b18 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # JavaScript Algorithms And Data Structures - What you will learn in here. + Technical: 1. Big O notation From 5352dfdcda55b06ca2ec152fed19e1c9708ad4ef Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 26 Sep 2022 14:11:20 +0900 Subject: [PATCH 007/150] add o-n first --- section-big-o/o-n-001.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 section-big-o/o-n-001.js diff --git a/section-big-o/o-n-001.js b/section-big-o/o-n-001.js new file mode 100644 index 0000000..ba91b97 --- /dev/null +++ b/section-big-o/o-n-001.js @@ -0,0 +1,16 @@ +const fish = ['dory', 'bruce', 'marlin', 'O_n-001']; +const single = ['O_n-001']; +const everyone = ['dory', 'bruce', 'marlin', 'O_n-001', 'gill', 'bloat', 'nigel', 'squirt', 'darla', 'hank']; +const large = new Array(100000).fill('O_n-001'); + + +function findSpecificNameFromArray(array) { + for (let index = 0; index < array.length; index++) { + const element = array[index]; + if (element === 'O_n-001') { + console.log('Found O_n-001'); + } + } +} + +findSpecificNameFromArray(single); // O(n) ----> Linear Time \ No newline at end of file From 870aed12b5cf0f31939be55f7fb40a04523663ad Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 26 Sep 2022 14:12:32 +0900 Subject: [PATCH 008/150] dalate file --- section-big-o/sample-002.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 section-big-o/sample-002.js diff --git a/section-big-o/sample-002.js b/section-big-o/sample-002.js deleted file mode 100644 index 94037a3..0000000 --- a/section-big-o/sample-002.js +++ /dev/null @@ -1 +0,0 @@ -// Hello world \ No newline at end of file From b7e919f9589d10272113b7880c4fd7e9d78d602f Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 26 Sep 2022 16:19:24 +0900 Subject: [PATCH 009/150] update readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 8132b18..edd4cc6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # JavaScript Algorithms And Data Structures +## JavaScript based examples of many algorithms and data structures. +☝ Note that this repository is meant to be used for learning and researching purposes only. + What you will learn in here. Technical: From 8f94321d00498d4fe99108e714b551d2c45210d6 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 26 Sep 2022 17:00:15 +0900 Subject: [PATCH 010/150] big-o summery --- README.md | 52 ++++++++++++++++++++++++++++++ assets/Big-O-Complexity-Chart.png | Bin 0 -> 125274 bytes 2 files changed, 52 insertions(+) create mode 100644 assets/Big-O-Complexity-Chart.png diff --git a/README.md b/README.md index edd4cc6..bc39385 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,58 @@ ## JavaScript based examples of many algorithms and data structures. ☝ Note that this repository is meant to be used for learning and researching purposes only. +### Big O Notation + +*Big O notation* is used to classify algorithms according to how their running time or space requirements grow as the input size grows. +On the chart below it is showing the most common orders of growth of algorithms specified in Big O notation. + +![Big O graphs](./assets/Big-O-Complexity-Chart.png) + +Source: [Big O Cheat Sheet](http://bigocheatsheet.com/). + +Below is the list of some of the most used Big O notations and their performance comparisons against different sizes of the input data. + +| Big O Notation | Type | Computations for 10 elements | Computations for 100 elements | Computations for 1000 elements | +| -------------- | ----------- | ---------------------------- | ----------------------------- | ------------------------------- | +| **O(1)** | Constant | 1 | 1 | 1 | +| **O(log N)** | Logarithmic | 3 | 6 | 9 | +| **O(N)** | Linear | 10 | 100 | 1000 | +| **O(N log N)** | n log(n) | 30 | 600 | 9000 | +| **O(N^2)** | Quadratic | 100 | 10000 | 1000000 | +| **O(2^N)** | Exponential | 1024 | 1.26e+29 | 1.07e+301 | +| **O(N!)** | Factorial | 3628800 | 9.3e+157 | 4.02e+2567 | + +### Data Structure Operations Complexity + +| Data Structure | Access | Search | Insertion | Deletion | Comments | +| ----------------------- | :-------: | :-------: | :-------: | :-------: | :-------- | +| **Array** | 1 | n | n | n | | +| **Stack** | n | n | 1 | 1 | | +| **Queue** | n | n | 1 | 1 | | +| **Linked List** | n | n | 1 | n | | +| **Hash Table** | - | n | n | n | In case of perfect hash function costs would be O(1) | +| **Binary Search Tree** | n | n | n | n | In case of balanced tree costs would be O(log(n)) | +| **B-Tree** | log(n) | log(n) | log(n) | log(n) | | +| **Red-Black Tree** | log(n) | log(n) | log(n) | log(n) | | +| **AVL Tree** | log(n) | log(n) | log(n) | log(n) | | +| **Bloom Filter** | - | 1 | 1 | - | False positives are possible while searching | + +### Array Sorting Algorithms Complexity + +| Name | Best | Average | Worst | Memory | Stable | Comments | +| --------------------- | :-------------: | :-----------------: | :-----------------: | :-------: | :-------: | :-------- | +| **Bubble sort** | n | n2 | n2 | 1 | Yes | | +| **Insertion sort** | n | n2 | n2 | 1 | Yes | | +| **Selection sort** | n2 | n2 | n2 | 1 | No | | +| **Heap sort** | n log(n) | n log(n) | n log(n) | 1 | No | | +| **Merge sort** | n log(n) | n log(n) | n log(n) | n | Yes | | +| **Quick sort** | n log(n) | n log(n) | n2 | log(n) | No | Quicksort is usually done in-place with O(log(n)) stack space | +| **Shell sort** | n log(n) | depends on gap sequence | n (log(n))2 | 1 | No | | +| **Counting sort** | n + r | n + r | n + r | n + r | Yes | r - biggest number in array | +| **Radix sort** | n * k | n * k | n * k | n + k | Yes | k - length of longest key | + + + What you will learn in here. Technical: diff --git a/assets/Big-O-Complexity-Chart.png b/assets/Big-O-Complexity-Chart.png new file mode 100644 index 0000000000000000000000000000000000000000..991c2a6914af19ff358b4305a01b1a17e71e5045 GIT binary patch literal 125274 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 Date: Mon, 26 Sep 2022 17:21:35 +0900 Subject: [PATCH 011/150] readme change --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bc39385..2769917 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # JavaScript Algorithms And Data Structures +Many developers who are "self-educated", feel that one of the main disadvantages they face compared to college/university educated graduates in computer science is that they don't have knowledge about algorithms, data structures, and the notorious/famous Big-O Notation. Get on the same level as someone with a computer science degree by learning the fundamental building blocks of computer science, which will boost you during real-life problem solving. ## JavaScript based examples of many algorithms and data structures. -☝ Note that this repository is meant to be used for learning and researching purposes only. +*☝ Note that this repository is meant to be used for learning and researching purposes only. -### Big O Notation +## Big O Notation *Big O notation* is used to classify algorithms according to how their running time or space requirements grow as the input size grows. On the chart below it is showing the most common orders of growth of algorithms specified in Big O notation. @@ -52,7 +53,12 @@ Below is the list of some of the most used Big O notations and their performance | **Counting sort** | n + r | n + r | n + r | n + r | Yes | r - biggest number in array | | **Radix sort** | n * k | n * k | n * k | n + k | Yes | k - length of longest key | +## Data Structures +A data structure is a particular way of organizing and storing data in a computer so that it can +be accessed and modified efficiently. More exactly, a data structure is a collection of data +values, the relationships among them, and the functions or operations that can be applied to +the data. What you will learn in here. From 0ab405d61a1616415505984dcc23e2683897e23d Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 26 Sep 2022 17:52:35 +0900 Subject: [PATCH 012/150] modify readme file --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 2769917..71d34c3 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,14 @@ be accessed and modified efficiently. More exactly, a data structure is a collec values, the relationships among them, and the functions or operations that can be applied to the data. +-[ ] Queue +-[ ] Stack + +## Algorithms + +An algorithm is an unambiguous specification of how to solve a class of problems. It is +a set of rules that precisely define a sequence of operations. + What you will learn in here. Technical: From ae186ecf817538e85d975973254aee8bdd4c60a6 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 26 Sep 2022 17:53:37 +0900 Subject: [PATCH 013/150] remove star --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 71d34c3..d7dec02 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # JavaScript Algorithms And Data Structures Many developers who are "self-educated", feel that one of the main disadvantages they face compared to college/university educated graduates in computer science is that they don't have knowledge about algorithms, data structures, and the notorious/famous Big-O Notation. Get on the same level as someone with a computer science degree by learning the fundamental building blocks of computer science, which will boost you during real-life problem solving. ## JavaScript based examples of many algorithms and data structures. -*☝ Note that this repository is meant to be used for learning and researching purposes only. +☝ Note that this repository is meant to be used for learning and researching purposes only. ## Big O Notation From 820b2388f322e026109914768c680e94a6e297b0 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 26 Sep 2022 18:08:25 +0900 Subject: [PATCH 014/150] added data structure --- README.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d7dec02..1c0ab28 100644 --- a/README.md +++ b/README.md @@ -60,9 +60,21 @@ be accessed and modified efficiently. More exactly, a data structure is a collec values, the relationships among them, and the functions or operations that can be applied to the data. --[ ] Queue --[ ] Stack - +- ✅ done +- âŦœ Arrays +- âŦœ Hash Tables +- âŦœ Singly Linked Lists +- âŦœ Doubly Linked Lists +- âŦœ Queues +- âŦœ Stacks +- âŦœ Trees + - âŦœ BST + - âŦœ AVL + - âŦœ Trees + - âŦœ Red Black Trees, + - âŦœ Binary Heaps +- âŦœ Tries +- âŦœ Graphs ## Algorithms An algorithm is an unambiguous specification of how to solve a class of problems. It is From ed06610c0e7a17683d6949903096ffee5ee1efa6 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 26 Sep 2022 18:12:27 +0900 Subject: [PATCH 015/150] description added --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 2caf5e9..6c79809 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { "name": "npm", "version": "1.0.0", - "description": "", + "description": "JavaScript based examples of many algorithms and data structures. Note that this repository is meant to be used for learning and researching purposes only.", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "" }, "repository": { "type": "git", From c07d3d657ad501234d46709746cba87bb5a79557 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 26 Sep 2022 19:14:47 +0900 Subject: [PATCH 016/150] fix(queue-28): init file added --- data-structure/linked-list/LinkedList.js | 0 data-structure/linked-list/LinkedListNode.js | 1 + .../queue-data-structure.ts | 3 +-- utils/comparator.js | 25 +++++++++++++++++ utils/comparator.ts | 27 +++++++++++++++++++ 5 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 data-structure/linked-list/LinkedList.js create mode 100644 data-structure/linked-list/LinkedListNode.js create mode 100644 utils/comparator.js create mode 100644 utils/comparator.ts diff --git a/data-structure/linked-list/LinkedList.js b/data-structure/linked-list/LinkedList.js new file mode 100644 index 0000000..e69de29 diff --git a/data-structure/linked-list/LinkedListNode.js b/data-structure/linked-list/LinkedListNode.js new file mode 100644 index 0000000..b628d56 --- /dev/null +++ b/data-structure/linked-list/LinkedListNode.js @@ -0,0 +1 @@ +// Init \ No newline at end of file diff --git a/javascript-today-magazine/queue-data-structure.ts b/javascript-today-magazine/queue-data-structure.ts index 35626d0..073fde5 100644 --- a/javascript-today-magazine/queue-data-structure.ts +++ b/javascript-today-magazine/queue-data-structure.ts @@ -1,6 +1,5 @@ /** - * A Queue is a linear structure which follows a particular order in which the operations are performed. - * The order is First In First Out (FIFO). + * In computer science, a queue is a particular kind of abstract data type or collection in which the entities in the collection are kept in order and the principle (or only) operations on the collection are the addition of entities to the rear terminal position, known as enqueue, and removal of entities from the front terminal position, known as dequeue. This makes the queue a First-In-First-Out (FIFO) data structure. In a FIFO data structure, the first element added to the queue will be the first one to be removed. This is equivalent to the requirement that once a new element is added, all elements that were added before have to be removed before the new element can be removed. Often a peek or front operation is also entered, returning the value of the front element without dequeuing it. A queue is an example of a linear data structure, or more abstractly a sequential collection. * A good example of a queue would simply be a line at a grocery store. The customer in line (queue) first, will leave first. * * Here's a JavaScript implementation of a Queue data structure. đŸ”Ĩ diff --git a/utils/comparator.js b/utils/comparator.js new file mode 100644 index 0000000..b330916 --- /dev/null +++ b/utils/comparator.js @@ -0,0 +1,25 @@ +export default class Comparator { + /** + * Constructor. + * @param {function(a: *, b: *)} [compareFunction] - It may be custom compare function that, let's + * say may compare custom objects together. + */ + + constructor(compareFunction) { + this.compare = compareFunction || Comparator.defaultCompareFunction; + } + + /** + * Default comparison function. It just assumes that 'a' and 'b' are strings or numbers. + * @param {(string|number)} a + * @param {(string|number)} b + * @returns {number} + */ + static defaultCompareFunction(a, b) { + if (a === b) { + return 0; + } + + return a < b ? -1 : 1; + } +} diff --git a/utils/comparator.ts b/utils/comparator.ts new file mode 100644 index 0000000..9d928e9 --- /dev/null +++ b/utils/comparator.ts @@ -0,0 +1,27 @@ +export default class Comparator { + [x: string]: (a: any, b: any) => 0 | 1 | -1; + /** + * Constructor. + * @param {function(a: *, b: *)} [compareFunction] - It may be custom compare function that, let's + * say may compare custom objects together. + */ + + constructor(compareFunction: (a: any, b: any) => 0 | 1 | -1) { + this.compare = compareFunction || Comparator.defaultCompareFunction; + } + + /** + * Default comparison function. It just assumes that 'a' and 'b' are strings or numbers. + * @param {(string|number)} a + * @param {(string|number)} b + * @returns {number} + */ + static defaultCompareFunction(a: number, b: number) { + if (a === b) { + return 0; + } + + return a < b ? -1 : 1; + } + } + \ No newline at end of file From acb08e605b6f265f1d777cba8b221e544f68bd1e Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 27 Sep 2022 14:36:57 +0900 Subject: [PATCH 017/150] fix(queue-28): implement comparator class --- utils/comparator-original.js | 102 +++++++++++++++++++++++++++++++++++ utils/comparator.ts | 2 + 2 files changed, 104 insertions(+) create mode 100644 utils/comparator-original.js diff --git a/utils/comparator-original.js b/utils/comparator-original.js new file mode 100644 index 0000000..4664775 --- /dev/null +++ b/utils/comparator-original.js @@ -0,0 +1,102 @@ +export default class Comparator { + /** + * Constructor. + * @param {function(a: *, b: *)} [compareFunction] - It may be custom compare function that, let's + * say may compare custom objects together. + */ + + constructor(compareFunction) { + this.compare = compareFunction || Comparator.defaultCompareFunction; + } + + /** + * Default comparison function. It just assumes that 'a' and 'b' are strings or numbers. + * @param {(string|number)} a + * @param {(string|number)} b + * @returns {number} + */ + static defaultCompareFunction(a, b) { + if (a === b) { + return 0; + } + + return a < b ? -1 : 1; + } + + /** + * Checks if two variables are equal. + * @param {*} a + * @param {*} b + * @return {boolean} + */ + // Traditional function + equal(a, b) { + return this.compare(a, b) === 0; + } + // Arrow function + // equal = (a, b) => this.compare(a, b) === 0; + + /** + * Checks if variable "a" is less than "b" + * @param {*} a + * @param {*} b + * @returns {boolean} + */ + // Traditional function + lessThan(a, b) { + return this.compare(a, b) < 0; + } + // Arrow function + // lessThan = (a, b) => this.compare(a, b) < 0; + + /** + * Checks if variable "a" is greater than "b". + * @param {*} a + * @param {*} b + * @returns {boolean} + */ + // Traditional function + greaterThan(a, b) { + return this.compare(a, b) > 0; + } + // Arrow function + // greaterThan = (a, b) => this.compare(a, b) > 0; + + /** + * Checks if variable "a" is less than or equal to "b". + * @param {*} a + * @param {*} b + * @returns {boolean} + */ + // Traditional function + lessThanOrEqual(a, b) { + return this.lessThan(a, b) || this.equal(a, b); + } + // Arrow function + // lessThanOrEqual = (a, b) => this.lessThan(a, b) || this.equal(a, b); + + /** + * Checks if variable "a" is greater than or equal to "b"l + * @param {*} a + * @param {*} b + * @returns {boolean} + */ + // Traditional function + greaterThanOrEqual(a, b) { + return this.greaterThan(a, b) || this.equal(a, b); + } + + //Arrow Function + // greaterThanOrEqual = (a, b) => this.greaterThan(a, b) || this.equal(a, b); + + /** + * Reverses the comparison order. + */ + + reverse() { + const compareOriginal = this.compare; + this.compare = (a, b) => compareOriginal(b, a); + } +} + +const instanceA = new Comparator(); diff --git a/utils/comparator.ts b/utils/comparator.ts index 9d928e9..7512b68 100644 --- a/utils/comparator.ts +++ b/utils/comparator.ts @@ -23,5 +23,7 @@ export default class Comparator { return a < b ? -1 : 1; } + + } \ No newline at end of file From 2c9680c6b540b9a9b10a4ab0466c14a2f4fff79d Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 27 Sep 2022 14:37:27 +0900 Subject: [PATCH 018/150] fix(queue-28): file name change --- utils/comparator.js | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 utils/comparator.js diff --git a/utils/comparator.js b/utils/comparator.js deleted file mode 100644 index b330916..0000000 --- a/utils/comparator.js +++ /dev/null @@ -1,25 +0,0 @@ -export default class Comparator { - /** - * Constructor. - * @param {function(a: *, b: *)} [compareFunction] - It may be custom compare function that, let's - * say may compare custom objects together. - */ - - constructor(compareFunction) { - this.compare = compareFunction || Comparator.defaultCompareFunction; - } - - /** - * Default comparison function. It just assumes that 'a' and 'b' are strings or numbers. - * @param {(string|number)} a - * @param {(string|number)} b - * @returns {number} - */ - static defaultCompareFunction(a, b) { - if (a === b) { - return 0; - } - - return a < b ? -1 : 1; - } -} From 37f26e3c0c741ba0a6b91a9a196a238cba997404 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 27 Sep 2022 15:35:45 +0900 Subject: [PATCH 019/150] fix(queue-28): link list and linknode --- .vscode/settings.json | 16 ++++++ data-structure/linked-list/LinkedList.js | 0 data-structure/linked-list/LinkedListNode.js | 1 - .../linked-list/linked-list-node-original.js | 10 ++++ .../linked-list/linked-list-original.js | 53 +++++++++++++++++++ utils/comparator-original.js | 4 +- 6 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 data-structure/linked-list/LinkedList.js delete mode 100644 data-structure/linked-list/LinkedListNode.js create mode 100644 data-structure/linked-list/linked-list-node-original.js create mode 100644 data-structure/linked-list/linked-list-original.js diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..239c451 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,16 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", // Defines a default formatter which takes precedence over all other formatter settings. Must be the identifier of an extension contributing a formatter. + "[typescript]": { + "editor.formatOnSave": true, + "editor.formatOnPaste": true + }, + "[scss]": { + "editor.formatOnSave": true + }, + "[javascript]": { + "editor.formatOnSave": true + }, + "[json]": { + "editor.formatOnSave": true + }, +} \ No newline at end of file diff --git a/data-structure/linked-list/LinkedList.js b/data-structure/linked-list/LinkedList.js deleted file mode 100644 index e69de29..0000000 diff --git a/data-structure/linked-list/LinkedListNode.js b/data-structure/linked-list/LinkedListNode.js deleted file mode 100644 index b628d56..0000000 --- a/data-structure/linked-list/LinkedListNode.js +++ /dev/null @@ -1 +0,0 @@ -// Init \ No newline at end of file diff --git a/data-structure/linked-list/linked-list-node-original.js b/data-structure/linked-list/linked-list-node-original.js new file mode 100644 index 0000000..d136e86 --- /dev/null +++ b/data-structure/linked-list/linked-list-node-original.js @@ -0,0 +1,10 @@ +export default class LinkedListNode { + constructor(value, next = null) { + this.value = value; + this.next = next; + } + + toString(callback) { + return callback ? callback(this.value) : `${this.value}`; + } +} diff --git a/data-structure/linked-list/linked-list-original.js b/data-structure/linked-list/linked-list-original.js new file mode 100644 index 0000000..fcd47f6 --- /dev/null +++ b/data-structure/linked-list/linked-list-original.js @@ -0,0 +1,53 @@ +import LinkedListNode from "./linked-list-node-original"; +import Comparator from "../../utils/comparator-original"; + +export default class LinkedList { + /** + * @param {Function} [comparatorFunction] + */ + constructor(comparatorFunction) { + /** @var LinkedListNode */ + this.head = null; + /** @var LinkedListNode */ + this.tail = null; + this.compare = new Comparator(comparatorFunction); + } + + /** + * @param {*} value + * @returns {LinkedList} + */ + prepend(value) { + // Make new node to be a head. + const newNode = new LinkedListNode(value, this.head); + this.head = newNode; + + // If there is no tail yet let's make new node a tail. + if (!this.tail) { + this.tail = newNode; + } + return this; + } + + /** + * + * @param {*} value + * @returns {LinkedList} + */ + append(value) { + const newNode = new LinkedListNode(value); + + // If there is no head yet let's make new node a head. + if (!this.head) { + this.head = newNode; + this.tail = newNode; + return this; + } + + // Attach new node to the end of linked list. + this.tail.next = newNode; + this.tail = newNode; + + return this; + } +} diff --git a/utils/comparator-original.js b/utils/comparator-original.js index 4664775..5da535a 100644 --- a/utils/comparator-original.js +++ b/utils/comparator-original.js @@ -1,8 +1,8 @@ export default class Comparator { /** * Constructor. - * @param {function(a: *, b: *)} [compareFunction] - It may be custom compare function that, let's - * say may compare custom objects together. + * @param {function(a: *, b: *)} [compareFunction] - It may be custom compare function that, + * let's say may compare custom objects together. */ constructor(compareFunction) { From 2a54daecaaca808f499d9926e2372ac07291458e Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 27 Sep 2022 15:56:26 +0900 Subject: [PATCH 020/150] fix(queue-28): toString function added --- data-structure/queue/queue-original.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 data-structure/queue/queue-original.js diff --git a/data-structure/queue/queue-original.js b/data-structure/queue/queue-original.js new file mode 100644 index 0000000..d2fb2c1 --- /dev/null +++ b/data-structure/queue/queue-original.js @@ -0,0 +1,13 @@ +import LinkedList from "../linked-list/linked-list-original"; + +export default class Queue { + constructor() { + /** + * We're going to implement Queue based on LinkedList since the two + * structure are quite similar. Namely, they both operate mostly on + * the element at the beginning and the end. Compare enqueue/dequeue + * operations of Queue with append/deleteHead operations of LinkedList + */ + this.linkedList = new LinkedList(); + } +} From 10d632011ce7beeb605f6abafff8e26b25f9a868 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 27 Sep 2022 15:56:48 +0900 Subject: [PATCH 021/150] fix(queue-28): list modify --- .../linked-list/linked-list-original.js | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/data-structure/linked-list/linked-list-original.js b/data-structure/linked-list/linked-list-original.js index fcd47f6..fe59596 100644 --- a/data-structure/linked-list/linked-list-original.js +++ b/data-structure/linked-list/linked-list-original.js @@ -50,4 +50,28 @@ export default class LinkedList { return this; } + + /** + * @return {LinkedListNode[]} + */ + toArray() { + const nodes = []; + + let currentNode = this.head; + while (currentNode) { + nodes.push(currentNode); + currentNode = currentNode.next; + } + return nodes; + } + + /** + * @param {function} [callback] + * @returns {string} + */ + toString(callback) { + return this.toArray() + .map((node) => node.toString(callback)) + .toString(); + } } From 870eb44bdfedaffd63a011f016e96121c518edbc Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 27 Sep 2022 19:41:42 +0900 Subject: [PATCH 022/150] fix(queue-28): implement queue --- .../linked-list/linked-list-original.js | 20 ++++++++ data-structure/queue/queue-original.js | 48 +++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/data-structure/linked-list/linked-list-original.js b/data-structure/linked-list/linked-list-original.js index fe59596..7a7b4ad 100644 --- a/data-structure/linked-list/linked-list-original.js +++ b/data-structure/linked-list/linked-list-original.js @@ -51,6 +51,26 @@ export default class LinkedList { return this; } + /** + * + * @returns {LinkedListNode} + */ + deleteHead() { + if (!this.head) { + return null; + } + + const deletedHead = this.head; + if (this.head.next) { + this.head = this.head.next; + } else { + this.head = null; + this.tail = null; + } + + return deletedHead; + } + /** * @return {LinkedListNode[]} */ diff --git a/data-structure/queue/queue-original.js b/data-structure/queue/queue-original.js index d2fb2c1..f90f4de 100644 --- a/data-structure/queue/queue-original.js +++ b/data-structure/queue/queue-original.js @@ -10,4 +10,52 @@ export default class Queue { */ this.linkedList = new LinkedList(); } + + /** + * + * @returns {boolean} + */ + isEmpty() { + return !this.linkedList.head; + } + + /** + * Read the element at the front of the queue without removing it. + * @returns {*} + */ + peek() { + if (this.isEmpty()) { + return null; + } + + return this.linkedList.head.value; + } + + /** + * Add a new element to the end of the queue (the tail of the linked list). + * This element will be processed after all elements ahead of it. + * @param {*} value + */ + enqueue(value) { + this.linkedList.append(value); + } + + /** + * Remove the element at the front of the queue (the head of the linked list) + * If the queue is empty, return null. + * @returns {*} + */ + dequeue() { + const removedHead = this.linkedList.deleteHead(); + return removedHead ? removedHead.value : null; + } + + /** + * @param [callback] + * @returns {string} + */ + toString(callback) { + // Return string representation of the queue's linked list. + return this.linkedList.toString(callback); + } } From 851125090e886f64893b0318bb97770ff5d9def2 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 27 Sep 2022 20:49:03 +0900 Subject: [PATCH 023/150] fix(queue-28): test env sutap --- .babelrc | 0 babel.config.js | 6 + .../linked-list/linked-list-original.js | 4 +- data-structure/queue/queue-original.js | 9 +- jest.config.ts | 198 ++++++++++++++++++ package.json | 29 ++- sum.test.ts | 8 + sum.ts | 4 + 8 files changed, 249 insertions(+), 9 deletions(-) create mode 100644 .babelrc create mode 100644 babel.config.js create mode 100644 jest.config.ts create mode 100644 sum.test.ts create mode 100644 sum.ts diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..e69de29 diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..dd242dc --- /dev/null +++ b/babel.config.js @@ -0,0 +1,6 @@ +module.exports = { + presets: [ + ["@babel/preset-env", { targets: { node: "current" } }], + "@babel/preset-typescript", + ], +}; diff --git a/data-structure/linked-list/linked-list-original.js b/data-structure/linked-list/linked-list-original.js index 7a7b4ad..2fb1cab 100644 --- a/data-structure/linked-list/linked-list-original.js +++ b/data-structure/linked-list/linked-list-original.js @@ -1,5 +1,5 @@ -import LinkedListNode from "./linked-list-node-original"; -import Comparator from "../../utils/comparator-original"; +import LinkedListNode from "./linked-list-node-original.js"; +import Comparator from "../../utils/comparator-original.js"; export default class LinkedList { /** diff --git a/data-structure/queue/queue-original.js b/data-structure/queue/queue-original.js index f90f4de..c4730de 100644 --- a/data-structure/queue/queue-original.js +++ b/data-structure/queue/queue-original.js @@ -1,4 +1,4 @@ -import LinkedList from "../linked-list/linked-list-original"; +import LinkedList from "../linked-list/linked-list-original.js"; export default class Queue { constructor() { @@ -59,3 +59,10 @@ export default class Queue { return this.linkedList.toString(callback); } } + +const queue = new Queue(); + +queue.enqueue(1); +queue.enqueue(2); + +console.log(queue); diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 0000000..f347d94 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,198 @@ +/* + * For a detailed explanation regarding each configuration property and type check, visit: + * https://jestjs.io/docs/configuration + */ + +export default { + // All imported modules in your tests should be mocked automatically + // automock: false, + + // Stop running tests after `n` failures + bail: 0, + + // The directory where Jest should store its cached dependency information + // cacheDirectory: "/private/var/folders/dw/v_7vt0z10dvgztgqz5cx1h3r0000gp/T/jest_dy", + + // Automatically clear mock calls, instances, contexts and results before every test + clearMocks: true, + + // Indicates whether the coverage information should be collected while executing the test + collectCoverage: true, + + // An array of glob patterns indicating a set of files for which coverage information should be collected + // collectCoverageFrom: undefined, + + // The directory where Jest should output its coverage files + coverageDirectory: "./coverage/", + + // An array of regexp pattern strings used to skip coverage collection + coveragePathIgnorePatterns: ["/node_modules/"], + + // Indicates which provider should be used to instrument code for coverage + // coverageProvider: "babel", + + // A list of reporter names that Jest uses when writing coverage reports + // coverageReporters: [ + // "json", + // "text", + // "lcov", + // "clover" + // ], + + // An object that configures minimum threshold enforcement for coverage results + coverageThreshold: { + global: { + statements: 100, + branches: 95, + functions: 100, + lines: 100, + }, + }, + + // A path to a custom dependency extractor + // dependencyExtractor: undefined, + + // Make calling deprecated APIs throw helpful error messages + // errorOnDeprecated: false, + + // The default configuration for fake timers + // fakeTimers: { + // "enableGlobally": false + // }, + + // Force coverage collection from ignored files using an array of glob patterns + // forceCoverageMatch: [], + + // A path to a module which exports an async function that is triggered once before all test suites + // globalSetup: undefined, + + // A path to a module which exports an async function that is triggered once after all test suites + // globalTeardown: undefined, + + // A set of global variables that need to be available in all test environments + // globals: {}, + + // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. + // maxWorkers: "50%", + + // An array of directory names to be searched recursively up from the requiring module's location + // moduleDirectories: [ + // "node_modules" + // ], + + // An array of file extensions your modules use + // moduleFileExtensions: [ + // "js", + // "mjs", + // "cjs", + // "jsx", + // "ts", + // "tsx", + // "json", + // "node" + // ], + + // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module + // moduleNameMapper: {}, + + // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + // modulePathIgnorePatterns: [], + + // Activates notifications for test results + // notify: false, + + // An enum that specifies notification mode. Requires { notify: true } + // notifyMode: "failure-change", + + // A preset that is used as a base for Jest's configuration + // preset: undefined, + + // Run tests from one or more projects + // projects: undefined, + + // Use this configuration option to add custom reporters to Jest + // reporters: undefined, + + // Automatically reset mock state before every test + // resetMocks: false, + + // Reset the module registry before running each individual test + // resetModules: false, + + // A path to a custom resolver + // resolver: undefined, + + // Automatically restore mock state and implementation before every test + // restoreMocks: false, + + // The root directory that Jest should scan for tests and modules within + // rootDir: undefined, + + // A list of paths to directories that Jest should use to search for files in + // roots: [ + // "" + // ], + + // Allows you to use a custom runner instead of Jest's default test runner + // runner: "jest-runner", + + // The paths to modules that run some code to configure or set up the testing environment before each test + // setupFiles: [], + + // A list of paths to modules that run some code to configure or set up the testing framework before each test + // setupFilesAfterEnv: [], + + // The number of seconds after which a test is considered as slow and reported as such in the results. + // slowTestThreshold: 5, + + // A list of paths to snapshot serializer modules Jest should use for snapshot testing + // snapshotSerializers: [], + + // The test environment that will be used for testing + // testEnvironment: "jest-environment-node", + + // Options that will be passed to the testEnvironment + // testEnvironmentOptions: {}, + + // Adds a location field to test results + // testLocationInResults: false, + + // The glob patterns Jest uses to detect test files + // testMatch: [ + // "**/__tests__/**/*.[jt]s?(x)", + // "**/?(*.)+(spec|test).[tj]s?(x)" + // ], + + // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + testPathIgnorePatterns: ["/node_modules/", "/assets/"], + + // The regexp pattern or array of patterns that Jest uses to detect test files + testRegex: ["(/__tests__/.*|(\\.|/)(test|spec))\\.jsx?$"], + + // This option allows the use of a custom results processor + // testResultsProcessor: undefined, + + // This option allows use of a custom test runner + // testRunner: "jest-circus/runner", + + // A map from regular expressions to paths to transformers + // transform: undefined, + + // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + // transformIgnorePatterns: [ + // "/node_modules/", + // "\\.pnp\\.[^\\/]+$" + // ], + + // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + // unmockedModulePathPatterns: undefined, + + // Indicates whether each individual test should be reported during the run + verbose: false, + + // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + // watchPathIgnorePatterns: [], + + // Whether to use watchman for file crawling + // watchman: true, +}; diff --git a/package.json b/package.json index 6c79809..062348a 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,42 @@ { - "name": "npm", - "version": "1.0.0", - "description": "JavaScript based examples of many algorithms and data structures. Note that this repository is meant to be used for learning and researching purposes only.", + "name": "javascript-algorithms-and-data-structures", + "version": "0.0.1", + "description": "JavaScript based data-structures and Algorithms", "main": "index.js", "scripts": { - "test": "" + "test": "jest", + "coverage": "npm run test -- --coverage" }, "repository": { "type": "git", "url": "git+https://github.com/wakidurrahman/JavaScript-Algorithms-And-Data-Structures.git" }, "keywords": [ - "prictice" + "algorithms", + "data-structures", + "javascript", + "algorithm", + "javascript-algorithms" ], - "author": "wakidurrahman", + "author": "Wakidur Rahman", "license": "ISC", "bugs": { "url": "https://github.com/wakidurrahman/JavaScript-Algorithms-And-Data-Structures/issues" }, "homepage": "https://github.com/wakidurrahman/JavaScript-Algorithms-And-Data-Structures#readme", "devDependencies": { + "@babel/core": "^7.19.1", + "@babel/preset-env": "^7.19.1", + "@babel/preset-typescript": "^7.18.6", + "@types/jest": "^29.0.3", + "babel-jest": "^29.0.3", + "jest": "^29.0.3", + "ts-jest": "^29.0.2", + "ts-node": "^10.9.1", "typescript": "^4.8.3" + }, + "engines": { + "node": ">=16.13.2", + "npm": ">=8.1.2" } } diff --git a/sum.test.ts b/sum.test.ts new file mode 100644 index 0000000..1bca057 --- /dev/null +++ b/sum.test.ts @@ -0,0 +1,8 @@ +import { describe, expect, test } from "@jest/globals"; +import { sum } from "./sum"; + +describe("sum module", () => { + test("adds 1 + 2 to equal 3", () => { + expect(sum(1, 2)).toBe(3); + }); +}); diff --git a/sum.ts b/sum.ts new file mode 100644 index 0000000..6b764e0 --- /dev/null +++ b/sum.ts @@ -0,0 +1,4 @@ +function sum(a: any, b: any) { + return a + b; +} +module.exports = sum; From 48b3830a83d9ffa5ef5b3bffa63c88900203264b Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 28 Sep 2022 11:10:34 +0900 Subject: [PATCH 024/150] add test sample --- .babelrc | 4 ++ .node-version | 1 + jest.config.ts | 53 +++++++++---------- .../linked-list/linked-list-node-original.js | 0 .../linked-list/linked-list-original.js | 0 .../data-structure}/queue/queue-original.js | 0 .../javascript-today-magazine}/bubble-sort.js | 0 .../javascript-today-magazine}/bubble-sort.ts | 0 .../javascript-today-magazine}/merge-sort.js | 0 .../javascript-today-magazine}/merge-sort.ts | 0 .../javascript-today-magazine}/note.txt | 0 .../queue-data-structure.js | 0 .../queue-data-structure.ts | 0 ...eturns-the-number-of-vowels-in-a-string.js | 0 ...eturns-the-number-of-vowels-in-a-string.ts | 0 .../reverse-a-string.ts | 0 .../selection-sort.js | 0 .../selection-sort.ts | 0 .../stack-data-structure.js | 0 .../stack-data-structure.ts | 0 .../string-and-array-methods.ts | 0 .../calculates-the-sum-of-all-numbers.js | 0 .../problems}/how-do-you-reverse-a-string.js | 0 {section-big-o => src/section-big-o}/note.txt | 0 .../section-big-o}/o-n-001.js | 0 .../section-big-o}/sample-001.js | 0 src/sum.js | 4 ++ sum.test.ts => src/sum.test.js | 0 {utils => src/utils}/comparator-original.js | 0 {utils => src/utils}/comparator.ts | 0 sum.ts | 4 -- tsconfig.json | 41 ++++++++------ 32 files changed, 58 insertions(+), 49 deletions(-) create mode 100644 .node-version rename {data-structure => src/data-structure}/linked-list/linked-list-node-original.js (100%) rename {data-structure => src/data-structure}/linked-list/linked-list-original.js (100%) rename {data-structure => src/data-structure}/queue/queue-original.js (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/bubble-sort.js (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/bubble-sort.ts (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/merge-sort.js (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/merge-sort.ts (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/note.txt (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/queue-data-structure.js (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/queue-data-structure.ts (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/returns-the-number-of-vowels-in-a-string.js (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/returns-the-number-of-vowels-in-a-string.ts (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/reverse-a-string.ts (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/selection-sort.js (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/selection-sort.ts (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/stack-data-structure.js (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/stack-data-structure.ts (100%) rename {javascript-today-magazine => src/javascript-today-magazine}/string-and-array-methods.ts (100%) rename {problems => src/problems}/calculates-the-sum-of-all-numbers.js (100%) rename {problems => src/problems}/how-do-you-reverse-a-string.js (100%) rename {section-big-o => src/section-big-o}/note.txt (100%) rename {section-big-o => src/section-big-o}/o-n-001.js (100%) rename {section-big-o => src/section-big-o}/sample-001.js (100%) create mode 100644 src/sum.js rename sum.test.ts => src/sum.test.js (100%) rename {utils => src/utils}/comparator-original.js (100%) rename {utils => src/utils}/comparator.ts (100%) delete mode 100644 sum.ts diff --git a/.babelrc b/.babelrc index e69de29..3e53af2 100644 --- a/.babelrc +++ b/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["@babel/preset-env"] + } + \ No newline at end of file diff --git a/.node-version b/.node-version new file mode 100644 index 0000000..d7cb9ec --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +16.13.2 \ No newline at end of file diff --git a/jest.config.ts b/jest.config.ts index f347d94..6f27d85 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -2,7 +2,7 @@ * For a detailed explanation regarding each configuration property and type check, visit: * https://jestjs.io/docs/configuration */ - +const { resolve } = require("path"); export default { // All imported modules in your tests should be mocked automatically // automock: false, @@ -70,7 +70,10 @@ export default { // globalTeardown: undefined, // A set of global variables that need to be available in all test environments - // globals: {}, + globals: { + URL: "http://localhost:8080", + window: {}, + }, // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. // maxWorkers: "50%", @@ -81,16 +84,7 @@ export default { // ], // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], + moduleFileExtensions: ["js", "ts"], // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module // moduleNameMapper: {}, @@ -105,7 +99,7 @@ export default { // notifyMode: "failure-change", // A preset that is used as a base for Jest's configuration - // preset: undefined, + preset: "ts-jest", // Run tests from one or more projects // projects: undefined, @@ -126,12 +120,11 @@ export default { // restoreMocks: false, // The root directory that Jest should scan for tests and modules within - // rootDir: undefined, + + rootDir: resolve(__dirname, "."), // A list of paths to directories that Jest should use to search for files in - // roots: [ - // "" - // ], + roots: ["/src"], // Allows you to use a custom runner instead of Jest's default test runner // runner: "jest-runner", @@ -149,7 +142,7 @@ export default { // snapshotSerializers: [], // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", + testEnvironment: "jest-environment-node", // Options that will be passed to the testEnvironment // testEnvironmentOptions: {}, @@ -158,16 +151,13 @@ export default { // testLocationInResults: false, // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], + testMatch: ["**/__tests__/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[tj]s?(x)"], // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped testPathIgnorePatterns: ["/node_modules/", "/assets/"], // The regexp pattern or array of patterns that Jest uses to detect test files - testRegex: ["(/__tests__/.*|(\\.|/)(test|spec))\\.jsx?$"], + // testRegex: "\\.test.(js|jsx|ts|tsx)$", // This option allows the use of a custom results processor // testResultsProcessor: undefined, @@ -176,13 +166,20 @@ export default { // testRunner: "jest-circus/runner", // A map from regular expressions to paths to transformers - // transform: undefined, + transform: { + "^.+\\.(ts|tsx)?$": "ts-jest", + "^.+\\.[tj]sx?$": "babel-jest", + transform_regex: [ + "ts-jest", + { + tsconfig: "tsconfig.json", + babelrc: true, + }, + ], + }, // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], + transformIgnorePatterns: ["/node_modules/", "\\.pnp\\.[^\\/]+$"], // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them // unmockedModulePathPatterns: undefined, diff --git a/data-structure/linked-list/linked-list-node-original.js b/src/data-structure/linked-list/linked-list-node-original.js similarity index 100% rename from data-structure/linked-list/linked-list-node-original.js rename to src/data-structure/linked-list/linked-list-node-original.js diff --git a/data-structure/linked-list/linked-list-original.js b/src/data-structure/linked-list/linked-list-original.js similarity index 100% rename from data-structure/linked-list/linked-list-original.js rename to src/data-structure/linked-list/linked-list-original.js diff --git a/data-structure/queue/queue-original.js b/src/data-structure/queue/queue-original.js similarity index 100% rename from data-structure/queue/queue-original.js rename to src/data-structure/queue/queue-original.js diff --git a/javascript-today-magazine/bubble-sort.js b/src/javascript-today-magazine/bubble-sort.js similarity index 100% rename from javascript-today-magazine/bubble-sort.js rename to src/javascript-today-magazine/bubble-sort.js diff --git a/javascript-today-magazine/bubble-sort.ts b/src/javascript-today-magazine/bubble-sort.ts similarity index 100% rename from javascript-today-magazine/bubble-sort.ts rename to src/javascript-today-magazine/bubble-sort.ts diff --git a/javascript-today-magazine/merge-sort.js b/src/javascript-today-magazine/merge-sort.js similarity index 100% rename from javascript-today-magazine/merge-sort.js rename to src/javascript-today-magazine/merge-sort.js diff --git a/javascript-today-magazine/merge-sort.ts b/src/javascript-today-magazine/merge-sort.ts similarity index 100% rename from javascript-today-magazine/merge-sort.ts rename to src/javascript-today-magazine/merge-sort.ts diff --git a/javascript-today-magazine/note.txt b/src/javascript-today-magazine/note.txt similarity index 100% rename from javascript-today-magazine/note.txt rename to src/javascript-today-magazine/note.txt diff --git a/javascript-today-magazine/queue-data-structure.js b/src/javascript-today-magazine/queue-data-structure.js similarity index 100% rename from javascript-today-magazine/queue-data-structure.js rename to src/javascript-today-magazine/queue-data-structure.js diff --git a/javascript-today-magazine/queue-data-structure.ts b/src/javascript-today-magazine/queue-data-structure.ts similarity index 100% rename from javascript-today-magazine/queue-data-structure.ts rename to src/javascript-today-magazine/queue-data-structure.ts diff --git a/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.js b/src/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.js similarity index 100% rename from javascript-today-magazine/returns-the-number-of-vowels-in-a-string.js rename to src/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.js diff --git a/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.ts b/src/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.ts similarity index 100% rename from javascript-today-magazine/returns-the-number-of-vowels-in-a-string.ts rename to src/javascript-today-magazine/returns-the-number-of-vowels-in-a-string.ts diff --git a/javascript-today-magazine/reverse-a-string.ts b/src/javascript-today-magazine/reverse-a-string.ts similarity index 100% rename from javascript-today-magazine/reverse-a-string.ts rename to src/javascript-today-magazine/reverse-a-string.ts diff --git a/javascript-today-magazine/selection-sort.js b/src/javascript-today-magazine/selection-sort.js similarity index 100% rename from javascript-today-magazine/selection-sort.js rename to src/javascript-today-magazine/selection-sort.js diff --git a/javascript-today-magazine/selection-sort.ts b/src/javascript-today-magazine/selection-sort.ts similarity index 100% rename from javascript-today-magazine/selection-sort.ts rename to src/javascript-today-magazine/selection-sort.ts diff --git a/javascript-today-magazine/stack-data-structure.js b/src/javascript-today-magazine/stack-data-structure.js similarity index 100% rename from javascript-today-magazine/stack-data-structure.js rename to src/javascript-today-magazine/stack-data-structure.js diff --git a/javascript-today-magazine/stack-data-structure.ts b/src/javascript-today-magazine/stack-data-structure.ts similarity index 100% rename from javascript-today-magazine/stack-data-structure.ts rename to src/javascript-today-magazine/stack-data-structure.ts diff --git a/javascript-today-magazine/string-and-array-methods.ts b/src/javascript-today-magazine/string-and-array-methods.ts similarity index 100% rename from javascript-today-magazine/string-and-array-methods.ts rename to src/javascript-today-magazine/string-and-array-methods.ts diff --git a/problems/calculates-the-sum-of-all-numbers.js b/src/problems/calculates-the-sum-of-all-numbers.js similarity index 100% rename from problems/calculates-the-sum-of-all-numbers.js rename to src/problems/calculates-the-sum-of-all-numbers.js diff --git a/problems/how-do-you-reverse-a-string.js b/src/problems/how-do-you-reverse-a-string.js similarity index 100% rename from problems/how-do-you-reverse-a-string.js rename to src/problems/how-do-you-reverse-a-string.js diff --git a/section-big-o/note.txt b/src/section-big-o/note.txt similarity index 100% rename from section-big-o/note.txt rename to src/section-big-o/note.txt diff --git a/section-big-o/o-n-001.js b/src/section-big-o/o-n-001.js similarity index 100% rename from section-big-o/o-n-001.js rename to src/section-big-o/o-n-001.js diff --git a/section-big-o/sample-001.js b/src/section-big-o/sample-001.js similarity index 100% rename from section-big-o/sample-001.js rename to src/section-big-o/sample-001.js diff --git a/src/sum.js b/src/sum.js new file mode 100644 index 0000000..ad705b8 --- /dev/null +++ b/src/sum.js @@ -0,0 +1,4 @@ +export function sum(a, b) { + return a + b; +} +// module.exports = sum; diff --git a/sum.test.ts b/src/sum.test.js similarity index 100% rename from sum.test.ts rename to src/sum.test.js diff --git a/utils/comparator-original.js b/src/utils/comparator-original.js similarity index 100% rename from utils/comparator-original.js rename to src/utils/comparator-original.js diff --git a/utils/comparator.ts b/src/utils/comparator.ts similarity index 100% rename from utils/comparator.ts rename to src/utils/comparator.ts diff --git a/sum.ts b/sum.ts deleted file mode 100644 index 6b764e0..0000000 --- a/sum.ts +++ /dev/null @@ -1,4 +0,0 @@ -function sum(a: any, b: any) { - return a + b; -} -module.exports = sum; diff --git a/tsconfig.json b/tsconfig.json index fb8f65b..b11e861 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,8 +11,8 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - "lib": ["es2016.Array.Include", "es2016", "es6"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + "target": "es5", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": ["es2016.Array.Include", "es2016", "es6", "esnext"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ @@ -25,21 +25,21 @@ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + "module": "esnext", /* Specify what module code is generated. */ + "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + "baseUrl": "src", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ // "types": [], /* Specify type package names to be included without being referenced in a source file. */ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ + "resolveJsonModule": true, /* Enable importing .json files. */ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ @@ -47,14 +47,14 @@ // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ // "declarationMap": true, /* Create sourcemaps for d.ts files. */ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + "sourceMap": true, /* Create source map files for emitted JavaScript files. */ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ // "outDir": "./", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ + "removeComments": true, /* Disable emitting comments. */ + "noEmit": true, /* Disable emitting files from a compilation. */ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ @@ -69,15 +69,15 @@ // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ /* Type Checking */ "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ @@ -89,7 +89,7 @@ // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ @@ -97,7 +97,14 @@ // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": ["src"], + "exclude": ["node_modules", "assets",], + "ts-node": { + "compilerOptions": { + "module": "CommonJS" + } } } From 3d92699929de60a2708b6f2451b608eba3594a43 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 28 Sep 2022 11:57:32 +0900 Subject: [PATCH 025/150] code coverage add inside setup --- jest.config.ts | 17 +++++++++-------- package.json | 4 +++- src/data-structure/queue/note.txt | 1 + 3 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 src/data-structure/queue/note.txt diff --git a/jest.config.ts b/jest.config.ts index 6f27d85..ceaad3b 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -20,7 +20,7 @@ export default { collectCoverage: true, // An array of glob patterns indicating a set of files for which coverage information should be collected - // collectCoverageFrom: undefined, + collectCoverageFrom: ["**/*.{ts,js}"], // The directory where Jest should output its coverage files coverageDirectory: "./coverage/", @@ -32,12 +32,13 @@ export default { // coverageProvider: "babel", // A list of reporter names that Jest uses when writing coverage reports - // coverageReporters: [ - // "json", - // "text", - // "lcov", - // "clover" - // ], + coverageReporters: [ + "json", + "text", + "clover", + ["lcov", { projectRoot: "/" }], + "text-summary", + ], // An object that configures minimum threshold enforcement for coverage results coverageThreshold: { @@ -133,7 +134,7 @@ export default { // setupFiles: [], // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], + setupFilesAfterEnv: [], // The number of seconds after which a test is considered as slow and reported as such in the results. // slowTestThreshold: 5, diff --git a/package.json b/package.json index 062348a..c0e5f21 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,9 @@ "data-structures", "javascript", "algorithm", - "javascript-algorithms" + "javascript-algorithms", + "unit-test", + "coverage" ], "author": "Wakidur Rahman", "license": "ISC", diff --git a/src/data-structure/queue/note.txt b/src/data-structure/queue/note.txt new file mode 100644 index 0000000..f9fea22 --- /dev/null +++ b/src/data-structure/queue/note.txt @@ -0,0 +1 @@ +/** Queue **/ From 1692af8dc29a7767cc7f2b817615abec2e7c4a6c Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 3 Oct 2022 11:04:37 +0900 Subject: [PATCH 026/150] feat(queue-data-structure-unit-test-implementation): discription added to Queue --- jest.config.ts | 10 ++-------- src/data-structure/linked-list/linked-list-original.js | 1 + src/data-structure/queue/note.txt | 3 +++ src/data-structure/queue/queue.test.js | 0 src/utils/comparator-original.js | 2 +- 5 files changed, 7 insertions(+), 9 deletions(-) create mode 100644 src/data-structure/queue/queue.test.js diff --git a/jest.config.ts b/jest.config.ts index ceaad3b..0515f1f 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -20,7 +20,7 @@ export default { collectCoverage: true, // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: ["**/*.{ts,js}"], + // collectCoverageFrom: ["**/*.{ts,js}"], // The directory where Jest should output its coverage files coverageDirectory: "./coverage/", @@ -32,13 +32,7 @@ export default { // coverageProvider: "babel", // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: [ - "json", - "text", - "clover", - ["lcov", { projectRoot: "/" }], - "text-summary", - ], + coverageReporters: ["json", "text", "clover", "lcov", "text-summary"], // An object that configures minimum threshold enforcement for coverage results coverageThreshold: { diff --git a/src/data-structure/linked-list/linked-list-original.js b/src/data-structure/linked-list/linked-list-original.js index 2fb1cab..bb5cc38 100644 --- a/src/data-structure/linked-list/linked-list-original.js +++ b/src/data-structure/linked-list/linked-list-original.js @@ -10,6 +10,7 @@ export default class LinkedList { this.head = null; /** @var LinkedListNode */ this.tail = null; + this.compare = new Comparator(comparatorFunction); } diff --git a/src/data-structure/queue/note.txt b/src/data-structure/queue/note.txt index f9fea22..d3ddc8a 100644 --- a/src/data-structure/queue/note.txt +++ b/src/data-structure/queue/note.txt @@ -1 +1,4 @@ /** Queue **/ +A queue is a particular kind of abstract data type or collection in which the entities in the collection are kept in order. The principle operations on the collection are the addition of entities to the backside/ behind/ back/ rear terminal position, known as enqueue, and removal of entities from the front terminal position, known as dequeue.This makes the queue a First-In-First-Out (FIFO) data structure. +=> In a FIFO data structure, the first element added to the queue will be the first one to be removed. +=> This is equivalent to the requirement that once a new element is added all elements that were added before have to be removed before the new element can be removed. \ No newline at end of file diff --git a/src/data-structure/queue/queue.test.js b/src/data-structure/queue/queue.test.js new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/comparator-original.js b/src/utils/comparator-original.js index 5da535a..f514555 100644 --- a/src/utils/comparator-original.js +++ b/src/utils/comparator-original.js @@ -1,7 +1,7 @@ export default class Comparator { /** * Constructor. - * @param {function(a: *, b: *)} [compareFunction] - It may be custom compare function that, + * @param {function(a: *, b: *)} [compareFunction] - It may be custom compare function that, * let's say may compare custom objects together. */ From 6fdd3c12d92cd17c990d15a1301f6c9f70ddbf4e Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 16 Nov 2022 16:31:19 +0900 Subject: [PATCH 027/150] big o exercise 1 --- src/section-big-o/big-o-exercise-1.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/section-big-o/big-o-exercise-1.js diff --git a/src/section-big-o/big-o-exercise-1.js b/src/section-big-o/big-o-exercise-1.js new file mode 100644 index 0000000..e18ad60 --- /dev/null +++ b/src/section-big-o/big-o-exercise-1.js @@ -0,0 +1,23 @@ +// What is the Big O of the below function? (Hint, you may want to go line by line) + +function funChallenge(input) { + let a = 10; + a = 50 + 3; + + for (let i = 0; i < input.length; i++) { + printHello(); + console.log(a); + const stranger = true; + a++; // Number of Operations + } + console.log(a); + return a; +} + +function printHello() { + console.log("Hello World"); +} + +const inputArray = new Array(100).fill("a"); + +funChallenge(inputArray); From e973a92d46c5f7ea9ea38bd115f9fd5050331f3a Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 16 Nov 2022 18:02:19 +0900 Subject: [PATCH 028/150] big o calculation --- src/section-big-o/big-o-exercise-1.js | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/section-big-o/big-o-exercise-1.js b/src/section-big-o/big-o-exercise-1.js index e18ad60..662e020 100644 --- a/src/section-big-o/big-o-exercise-1.js +++ b/src/section-big-o/big-o-exercise-1.js @@ -1,19 +1,29 @@ // What is the Big O of the below function? (Hint, you may want to go line by line) function funChallenge(input) { - let a = 10; - a = 50 + 3; + let a = 10; // O(1) => 1 + a = 50 + 3; // O(1) => 2 for (let i = 0; i < input.length; i++) { - printHello(); + // O(n) /O(input) /O(x) => 1 + printHello(); // O(n) => 2 console.log(a); - const stranger = true; - a++; // Number of Operations + const stranger = true; // O(n) => 3 + a++; // Number of Operations O(n) => 4 } console.log(a); - return a; + return a; // O(1) => 3 } +// +/** + * Calculation + * 3 "O(1)" + * n + n + n + n "O(n)" + * 3 + 4n + * BIG O(3 + 4n) + */ + function printHello() { console.log("Hello World"); } From 5c405ae15062d843b082d77dabaeb3664b387ab5 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 16 Nov 2022 18:30:26 +0900 Subject: [PATCH 029/150] big o calculation 2 --- src/section-big-o/big-o-exercise-1.js | 7 +++--- src/section-big-o/big-o-exercise-2.js | 35 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 src/section-big-o/big-o-exercise-2.js diff --git a/src/section-big-o/big-o-exercise-1.js b/src/section-big-o/big-o-exercise-1.js index 662e020..084069e 100644 --- a/src/section-big-o/big-o-exercise-1.js +++ b/src/section-big-o/big-o-exercise-1.js @@ -1,6 +1,6 @@ // What is the Big O of the below function? (Hint, you may want to go line by line) -function funChallenge(input) { +function bigOCalculationChallengeOne(input) { let a = 10; // O(1) => 1 a = 50 + 3; // O(1) => 2 @@ -15,9 +15,8 @@ function funChallenge(input) { return a; // O(1) => 3 } -// /** - * Calculation + * BIG O Calculation * 3 "O(1)" * n + n + n + n "O(n)" * 3 + 4n @@ -30,4 +29,4 @@ function printHello() { const inputArray = new Array(100).fill("a"); -funChallenge(inputArray); +bigOCalculationChallengeOne(inputArray); diff --git a/src/section-big-o/big-o-exercise-2.js b/src/section-big-o/big-o-exercise-2.js new file mode 100644 index 0000000..dd28c05 --- /dev/null +++ b/src/section-big-o/big-o-exercise-2.js @@ -0,0 +1,35 @@ +// What is the Big O of the below function? +// Hint, you may want to go line by line + +function bigOCalculationChallengeTwo(limit) { + const a = 5; // O(1) + const b = 10; // O(1) + const c = 50; // O(1) + + for (let i = 0; i < limit; i++) { + // O(n) ***TODO:If we include for loop + let x = i + 1; // O(n) + let y = i + 1; // O(n) + let z = i + 1; // O(n) + } + + for (let j = 0; j < limit; j++) { + // O(n) ***TODO:If we include for loop + let p = j * 2; // O(n) + let q = j * 2; // O(n) + } + + const whoAmI = "I don't Know"; // O(1) +} + +/** + * BIG O Calculation + * 4 => "O(1)" + * n + n + n + n + n + n + n => "O(n)" + * 4 + 7n + * BIG O(4 + 7n) TODO: if we calculate for loop step + * n + n + n + n + n => "O(n)" + * BIG O(4 + 5n) TODO: no for loop + */ + +bigOCalculationChallengeTwo(12); From 76a4c04b9f635bb15bf453e07c43bef731a8ee93 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 16 Nov 2022 18:47:28 +0900 Subject: [PATCH 030/150] calcualte 2 --- src/section-big-o/big-o-exercise-2.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/section-big-o/big-o-exercise-2.js b/src/section-big-o/big-o-exercise-2.js index dd28c05..bc7713b 100644 --- a/src/section-big-o/big-o-exercise-2.js +++ b/src/section-big-o/big-o-exercise-2.js @@ -28,8 +28,10 @@ function bigOCalculationChallengeTwo(limit) { * n + n + n + n + n + n + n => "O(n)" * 4 + 7n * BIG O(4 + 7n) TODO: if we calculate for loop step + * O(4 + 7n) === O(n) equivalence to O(n) * n + n + n + n + n => "O(n)" * BIG O(4 + 5n) TODO: no for loop + * O(4 + 5n) === O(n) equivalence to O(n) */ bigOCalculationChallengeTwo(12); From 1da168fbcc5d605264d15f7c0054355ec744bebe Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 24 Nov 2022 10:52:17 +0900 Subject: [PATCH 031/150] calculation details --- src/section-big-o/big-o-exercise-2.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/section-big-o/big-o-exercise-2.js b/src/section-big-o/big-o-exercise-2.js index bc7713b..14787bb 100644 --- a/src/section-big-o/big-o-exercise-2.js +++ b/src/section-big-o/big-o-exercise-2.js @@ -24,9 +24,11 @@ function bigOCalculationChallengeTwo(limit) { /** * BIG O Calculation - * 4 => "O(1)" + * 4 => "O(1)" Four big O + * 7 => "O(n)" Seven big O n * n + n + n + n + n + n + n => "O(n)" * 4 + 7n + * * BIG O(4 + 7n) TODO: if we calculate for loop step * O(4 + 7n) === O(n) equivalence to O(n) * n + n + n + n + n => "O(n)" From 0609f53d1496b8d06c40b5bbc0f3c88694a29ca8 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 24 Nov 2022 11:39:53 +0900 Subject: [PATCH 032/150] rule 2 example implement. --- src/section-big-o/big-o-exercise-3.js | 41 +++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/section-big-o/big-o-exercise-3.js diff --git a/src/section-big-o/big-o-exercise-3.js b/src/section-big-o/big-o-exercise-3.js new file mode 100644 index 0000000..06c342f --- /dev/null +++ b/src/section-big-o/big-o-exercise-3.js @@ -0,0 +1,41 @@ +function bigOCalculationChallengeThree(items) { + console.log(items[0]); // O(1) + + const middleIndex = Math.floor(items.length / 2); + const index = 0; + + while (index < middleIndex) { + // O(n/2) + console.log(items[index]); + index++; + } + + for (let i = 0; i < 100; i++) { + // O(100) + console.log("hi"); + } +} + +/** + * O(1 + n/2 + 100 ) + * O(n/2 + 101) // Rule 2 : Drop constants + * O(n ) // Rule 2 : Drop constants + */ + +function compressBoxesTwice(boxes) { + boxes.forEach((element) => { + // O(n) + console.log(element); + }); + + boxes.forEach((element) => { + // O(n) + console.log(element); + }); +} + +/** + * O(n + n) + * O(n + n) // Drop the constants + * O(n) + */ From 8b95ed084eb2b53135d821fe41096d086ff92752 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 24 Nov 2022 11:53:31 +0900 Subject: [PATCH 033/150] rule 3 --- src/section-big-o/big-o-exercise-4.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/section-big-o/big-o-exercise-4.js diff --git a/src/section-big-o/big-o-exercise-4.js b/src/section-big-o/big-o-exercise-4.js new file mode 100644 index 0000000..3b39d5b --- /dev/null +++ b/src/section-big-o/big-o-exercise-4.js @@ -0,0 +1,19 @@ +// Rule 3: Different term for input +function compressBoxesTwice(boxes, items) { + // For boxes iteration + boxes.forEach((element) => { + // O(n) + console.log(element); + }); + + // For items iteration + items.forEach((element) => { + // O(n) + console.log(element); + }); +} + +/** + * O(n + n) + * O( a + b ) + */ From a4d9267250928dc9d814f3abd172dd9547a921d8 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 24 Nov 2022 12:14:34 +0900 Subject: [PATCH 034/150] logAllPairsOfBoxes --- src/section-big-o/big-o-exercise-5.js | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/section-big-o/big-o-exercise-5.js diff --git a/src/section-big-o/big-o-exercise-5.js b/src/section-big-o/big-o-exercise-5.js new file mode 100644 index 0000000..ffaa0ff --- /dev/null +++ b/src/section-big-o/big-o-exercise-5.js @@ -0,0 +1,29 @@ +// Log all Pairs of array + +const boxes = ["a", "b", "c", "d", "e", "f", "g"]; +function logAllPairsOfBoxes(boxes) { + for (let i = 0; i < boxes.length; i++) { + for (let j = 0; j < boxes.length; j++) { + console.log(boxes[i], boxes[j]); + } + } +} + +// Print boxes combinations. +logAllPairsOfBoxes(boxes); + +// Using ES5 syntax + +function logAllPairsOfBoxesEs5(boxes) { + boxes.forEach((firstBox) => { + boxes.forEach((secondBox) => { + console.log(firstBox, secondBox); + }); + }); +} + +/** + * O(n * n) + * O(n^2) + * O(n^2) is called Quadratic Time + */ From ad4d6182b4c213f674adcc888d8be9f17d9c1de2 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 24 Nov 2022 12:53:11 +0900 Subject: [PATCH 035/150] printAllNumbersThenAllPairSums --- src/section-big-o/big-o-exercise-6.js | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/section-big-o/big-o-exercise-6.js diff --git a/src/section-big-o/big-o-exercise-6.js b/src/section-big-o/big-o-exercise-6.js new file mode 100644 index 0000000..332c75e --- /dev/null +++ b/src/section-big-o/big-o-exercise-6.js @@ -0,0 +1,31 @@ +// Rule 4: Drop Non Dominant +function printAllNumbersThenAllPairSums(numbers) { + console.log("These are the numbers: "); + numbers.forEach((element) => { + console.log(element); + }); + + console.log("And these are their sums: "); + + numbers.forEach((firstNumber) => { + numbers.forEach((secondNumber) => { + console.log(firstNumber + secondNumber); + }); + }); +} + +// Number array +const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; +// Print output +printAllNumbersThenAllPairSums(numbers); + +/** + * O(n + n^2) + * O(n^2) Drop non dominants + * + * for example + * O(x^2+3x+100+x/2) + * O(x^5x+100+x/2) + * O(x^5x+100+x/2) + * O(n^2) + */ From cd9cedd5666bb01af47c02428c2932c327fd3a02 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 24 Nov 2022 13:51:03 +0900 Subject: [PATCH 036/150] Cheat Sheet --- src/section-big-o/big-o-cheat-sheet-01.txt | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/section-big-o/big-o-cheat-sheet-01.txt diff --git a/src/section-big-o/big-o-cheat-sheet-01.txt b/src/section-big-o/big-o-cheat-sheet-01.txt new file mode 100644 index 0000000..72b4fc3 --- /dev/null +++ b/src/section-big-o/big-o-cheat-sheet-01.txt @@ -0,0 +1,43 @@ +#Big O Cheat Sheet: +--------------------- + +-Big Os- + +1. O(1) Constant- no loops +2. O(log N) Logarithmic- usually searching algorithms have log n if they are sorted (Binary Search) +3. O(n) Linear- for loops, while loops through n items +4. O(n log(n)) Log Liniear- usually sorting operations +4. O(n^2) Quadratic- every element in a collection needs to be compared to ever other element. Two nested loops +6. O(2^n) Exponential- recursive algorithms that solves a problem of size N +7. O(n!) Factorial- you are adding a loop for every element + + +**Iterating through half a collection is still O(n) +**Two separate collections: O(a + b) +**Two separate collections: O(a * b) + + +-What can cause time in a function?- +------------------------------------ +1. Operations (+, -, *, /) +2. Comparisons (<, >, ==) +3. Looping (for, while) +4. Outside Function call (function()) + + +-Rule Book- +------------ + +Rule 1: Always worst Case +Rule 2: Remove Constants +Rule 3: Different inputs should have different variables. O(a+b). A and B arrays nested would be O(a*b) ++ for steps in order +* for nested steps +Rule 4: Drop Non-dominant terms + + +-What causes Space complexity?- +=> Variables +=> Data Structures +=> Function Call +=> Allocations \ No newline at end of file From 696e5375e79ee5986caec0359477675362f03398 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Fri, 25 Nov 2022 12:17:31 +0900 Subject: [PATCH 037/150] Space complexity --- src/section-big-o/space-complexity.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/section-big-o/space-complexity.js diff --git a/src/section-big-o/space-complexity.js b/src/section-big-o/space-complexity.js new file mode 100644 index 0000000..a4d7da2 --- /dev/null +++ b/src/section-big-o/space-complexity.js @@ -0,0 +1,19 @@ +// Space complexity O(1) +function boooo(n) { + for (let i = 0; i < n; i++) { + console.log("booooo"); + } +} + +boooo(8); // O(1) + +// Space complexity O(n) +function arrayOfHiNTimes(n) { + var hiArray = []; // declare memory + for (let i = 0; i < n; i++) { + hiArray[i] = "hi"; // assigned value inside memory + } + return hiArray; // Return array +} + +arrayOfHiNTimes(6); // O(n) memory use From 149cdd4706bbbac14ea06bd7c32627ba3cea6cee Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 28 Nov 2022 14:46:19 +0900 Subject: [PATCH 038/150] first case --- src/interview/interview-01.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/interview/interview-01.js diff --git a/src/interview/interview-01.js b/src/interview/interview-01.js new file mode 100644 index 0000000..4574c06 --- /dev/null +++ b/src/interview/interview-01.js @@ -0,0 +1,29 @@ +/** + * Given 2 arrays, + * create a function that let's a user know (true/false) whether these two arrays contain any common items. + * + * For example + * const array1 = ['a', 'b', 'c', 'd', 'f']; + * const array2 = ['z', 'y', 'x']; + * Should return true + * + * 2 parameters - arrays - no size limit + * return true or false + */ + +const array1 = ["a", "b", "c", "d"]; +const array2 = ["w", "x", "y", "z"]; + +function containsCommonItem(users, items) { + for (let i = 0; i < users.length; i++) { + for (let j = 0; j < items.length; j++) { + if (users[i] === items[j]) return true; + } + } + return false; +} + +// O(users * items) +// O(1) - Space complexity + +containsCommonItem(array1, array2); From 7027694529855d7471d7b40946cc443e4aab802d Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 28 Nov 2022 14:55:28 +0900 Subject: [PATCH 039/150] step two implement. --- src/interview/interview-01.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/interview/interview-01.js b/src/interview/interview-01.js index 4574c06..939e148 100644 --- a/src/interview/interview-01.js +++ b/src/interview/interview-01.js @@ -13,7 +13,7 @@ const array1 = ["a", "b", "c", "d"]; const array2 = ["w", "x", "y", "z"]; - +// Way 1: function containsCommonItem(users, items) { for (let i = 0; i < users.length; i++) { for (let j = 0; j < items.length; j++) { @@ -27,3 +27,28 @@ function containsCommonItem(users, items) { // O(1) - Space complexity containsCommonItem(array1, array2); + +// Way 2: + +function containsCommonItem2(users, items) { + // Loop through first array and create object where properties === items in the array + // Can we assume always 2 params? + + let map = {}; + for (let i = 0; i < users.length; i++) { + if (!map[users[i]]) { + const item = users[i]; + map[item] = true; + } + } + + // Loop through second array and check if item in second array exist on created object. + for (let j = 0; j < items.length; j++) { + if (map[items[j]]) return true; + } + return false; +} + +// O(a + b) +// O(users, items) +// O(users) - space complexity From 026d1daf4a179d4512a17e8fc63914ed2219b973 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 28 Nov 2022 14:56:14 +0900 Subject: [PATCH 040/150] step 3 implement --- src/interview/interview-01.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/interview/interview-01.js b/src/interview/interview-01.js index 939e148..636aaa0 100644 --- a/src/interview/interview-01.js +++ b/src/interview/interview-01.js @@ -52,3 +52,8 @@ function containsCommonItem2(users, items) { // O(a + b) // O(users, items) // O(users) - space complexity + +// Way 3 +function containsCommonItem3(arr1, arr2) { + return arr1.some((item) => arr2.includes(item)); +} From 874240bc8b8c6774c0ed1ac5290a686d90581597 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 28 Nov 2022 14:56:53 +0900 Subject: [PATCH 041/150] init all function --- src/interview/interview-01.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/interview/interview-01.js b/src/interview/interview-01.js index 636aaa0..ae4a83a 100644 --- a/src/interview/interview-01.js +++ b/src/interview/interview-01.js @@ -26,7 +26,7 @@ function containsCommonItem(users, items) { // O(users * items) // O(1) - Space complexity -containsCommonItem(array1, array2); +//containsCommonItem(array1, array2); // Way 2: @@ -57,3 +57,7 @@ function containsCommonItem2(users, items) { function containsCommonItem3(arr1, arr2) { return arr1.some((item) => arr2.includes(item)); } + +containsCommonItem(array1, array2); +containsCommonItem2(array1, array2); +containsCommonItem3(array1, array2); From 5ae1c3122a8d31d2b42ce385afa424098eb5c408 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 28 Nov 2022 15:25:53 +0900 Subject: [PATCH 042/150] Naive way --- src/interview/interview-02.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/interview/interview-02.js diff --git a/src/interview/interview-02.js b/src/interview/interview-02.js new file mode 100644 index 0000000..fe7d498 --- /dev/null +++ b/src/interview/interview-02.js @@ -0,0 +1,25 @@ +// Naive +function hasPairWithSum(arr, sum) { + const len = arr.length; + let count = 0; + + for (let i = 0; i < len - 1; i++) { + console.log("arr[i] ", arr[i]); + for (let j = i + 1; j < len; j++) { + console.log("arr[j] ", arr[j]); + if (arr[i] + arr[j] === sum) { + console.log("Sum ", arr[i] + arr[j]); + count = count + 1; // Match count. + console.log("count ", count); + // return true; + } + } + } + + return false; +} + +const array = [6, 4, 3, 2, 1, 7]; +const sum = 9; + +hasPairWithSum(array, sum); From 62baac713e0ad3b0075867282f3c445661666355 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 28 Nov 2022 15:59:22 +0900 Subject: [PATCH 043/150] second option added --- src/interview/interview-02.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/interview/interview-02.js b/src/interview/interview-02.js index fe7d498..bcec005 100644 --- a/src/interview/interview-02.js +++ b/src/interview/interview-02.js @@ -22,4 +22,25 @@ function hasPairWithSum(arr, sum) { const array = [6, 4, 3, 2, 1, 7]; const sum = 9; -hasPairWithSum(array, sum); +// hasPairWithSum(array, sum); + +// Better way + +function hasPairWithSum2(arr, sum) { + const setFun = new Set(); + console.log("setFun ", setFun); + const len = arr.length; + for (let i = 0; i < len; i++) { + console.log(`arr ${i} `, arr[i]); + console.log("setFun ", setFun); + if (setFun.has(arr[i])) { + console.log("setFun.has ", setFun.has(arr[i])); + // return true; + } + setFun.add(sum - arr[i]); + console.log("setFun.add ", setFun.add(sum - arr[i])); + } + return false; +} + +hasPairWithSum2(array, sum); From 4ee492e08a47b78e028e254f63d2bac7b548c1a2 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 28 Nov 2022 16:35:09 +0900 Subject: [PATCH 044/150] set apply --- src/interview/interview-02.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/interview/interview-02.js b/src/interview/interview-02.js index bcec005..df9d5d0 100644 --- a/src/interview/interview-02.js +++ b/src/interview/interview-02.js @@ -19,7 +19,7 @@ function hasPairWithSum(arr, sum) { return false; } -const array = [6, 4, 3, 2, 1, 7]; +const array = [6, 3, 3, 2, 1, 7]; const sum = 9; // hasPairWithSum(array, sum); @@ -43,4 +43,6 @@ function hasPairWithSum2(arr, sum) { return false; } -hasPairWithSum2(array, sum); +// hasPairWithSum2(array, sum); +hasPairWithSum2([1, 2, 3, 4, 5], sum); +hasPairWithSum([1, 2, 3, 4, 5], sum); From 61464d6fec680a76c223d852f2c020594cc6d59c Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 29 Nov 2022 12:56:08 +0900 Subject: [PATCH 045/150] Exercise for array . --- src/data-structure/array/exercise.js | 49 ++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/data-structure/array/exercise.js diff --git a/src/data-structure/array/exercise.js b/src/data-structure/array/exercise.js new file mode 100644 index 0000000..2752485 --- /dev/null +++ b/src/data-structure/array/exercise.js @@ -0,0 +1,49 @@ +// Reference type +// Context +// Scope +// Instantiation + +/** + * Reference type + * Context + * Scope + * Instantiation + */ + +// Reference +const object1 = { value: 10 }; +const object2 = object1; // Reference: Objects are called the reference types an javascript. +const object3 = { value: 15 }; + +// Context + +const object4 = { + a: function () { + console.log(this); + }, +}; + +// Instantiation + +class Player { + constructor(name, type) { + this.name = name; + this.type = type; + } + + introduce() { + console.log(`Hi I am ${this.name}, I'm a ${this.type}`); + } +} + +class Wizard extends Player { + constructor(name, type) { + super(name, type); + } + + play() { + console.log(`WEEEEE I'm a ${this.type}`); + } +} + +const wizardInit = new Wizard("Shelly", "Programmer"); // Instantiation. From a55c68ce5ffb0a4a7f35ec2b57c4f678adef7d1a Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 29 Nov 2022 15:51:04 +0900 Subject: [PATCH 046/150] array created --- .../data-structures/arrays/array-02.js | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/course-master-the-coding/data-structures/arrays/array-02.js diff --git a/src/course-master-the-coding/data-structures/arrays/array-02.js b/src/course-master-the-coding/data-structures/arrays/array-02.js new file mode 100644 index 0000000..ef9c357 --- /dev/null +++ b/src/course-master-the-coding/data-structures/arrays/array-02.js @@ -0,0 +1,59 @@ +/** + * DataStructure: Array Implementation + * Arrays in JavaScript are just objects with integer based keys that act like indexes, + */ + +class Array01 { + constructor() { + this.length = 0; // Declare length of the array + this.data = {}; // Store date inside array. + } + + // Get Method O(1) + get(index) { + return this.data[index]; + } + + // Push method O(1) + push(item) { + this.data[this.length] = item; // Insert item into last index. + this.length++; // Increment index. + return this.data; // return array + } + + // Pop method O(1) + pop() { + const lastItem = this.data[this.length - 1]; // last index + delete this.data[this.length - 1]; // delete last index + this.length--; // decrease length of the array. + return lastItem; // return last item + } + + // Delete method O(n) + deleteAtIndex(index) { + const item = this.data[index]; // track item specific index + this.shiftItems(index); // ShiftItem place. + return item; + } + + // Private function. + shiftItems(index) { + for (let i = index; i < this.length - 1; i++) { + this.data[i] = this.data[i + 1]; + } + console.log(this.data[this.length - 1]); + delete this.data[this.length - 1]; // delete last index of the array + this.length--; + } +} + +const myArray = new Array01(); +myArray.push("hi"); +myArray.push("you"); +myArray.push("!"); +myArray.pop(); +myArray.deleteAtIndex(0); +myArray.push("are"); +myArray.push("nice"); +myArray.shiftItems(0); +console.log(myArray); From 4ae4ffc77db90b1cb5fc9f0e56ba023cceec2ec2 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 29 Nov 2022 15:54:57 +0900 Subject: [PATCH 047/150] move --- .../data-structures/arrays}/exercise.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{data-structure/array => course-master-the-coding/data-structures/arrays}/exercise.js (100%) diff --git a/src/data-structure/array/exercise.js b/src/course-master-the-coding/data-structures/arrays/exercise.js similarity index 100% rename from src/data-structure/array/exercise.js rename to src/course-master-the-coding/data-structures/arrays/exercise.js From f8718b36b793aed303e5a3f00a4edea410213896 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 29 Nov 2022 16:57:46 +0900 Subject: [PATCH 048/150] Reverse string --- .../data-structures/arrays/array-03.js | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/course-master-the-coding/data-structures/arrays/array-03.js diff --git a/src/course-master-the-coding/data-structures/arrays/array-03.js b/src/course-master-the-coding/data-structures/arrays/array-03.js new file mode 100644 index 0000000..b3c5a7a --- /dev/null +++ b/src/course-master-the-coding/data-structures/arrays/array-03.js @@ -0,0 +1,37 @@ +/** + * Create a function that reverses a string + * 'Hello World' + * 'dlroW olleh' + * + */ + +function reverseSolution(text) { + // check for valid input + if (!text || text.length < 2 || typeof text !== 'string') + return 'Something is wrong here!'; + + const backWards = []; + const totalItems = text.length - 1; + for (let i = totalItems; i >= 0; i--) { + backWards.push(text[i]); + } + return backWards.join(''); // convert array to string +} + +function reverseSolution01(str) { + // check for valid input + if (!str || str.length < 2 || typeof str !== 'string') + return 'Something is wrong here!'; + return str.split('').reverse().join(''); +} + +// Arrow function +const reverseSolution02 = (str) => str.split('').reverse().join(''); + +// Arrow function and Spread (...) Operator +const reverseSolution03 = (str) => [...str].reverse().join(''); + +console.log(reverseSolution('Single to Double Quote automatic replace it')); +console.log(reverseSolution01('Single to Double Quote automatic replace it')); +console.log(reverseSolution02('Single to Double Quote automatic replace it')); +console.log(reverseSolution03('Single to Double Quote automatic replace it')); From 7e40458028ae9798b34c0586ef69cbef7e2332ac Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 29 Nov 2022 18:04:57 +0900 Subject: [PATCH 049/150] added all file --- .../arrays/mergeSortedArrays-array-4-org.js | 30 ++++++++++++++++ .../arrays/mergeSortedArrays-array-4.js | 34 +++++++++++++++++++ .../arrays/mergeSortedArrays-array-4.ts | 33 ++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4-org.js create mode 100644 src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4.js create mode 100644 src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4.ts diff --git a/src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4-org.js b/src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4-org.js new file mode 100644 index 0000000..9f3f17a --- /dev/null +++ b/src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4-org.js @@ -0,0 +1,30 @@ +function mergeSortedArrays(firstArray, secondArray) { + const mergedArray = []; // allocate empty array. + let firstArrayItem = firstArray[0]; // get Array firstArray Index 0 value + console.log(firstArrayItem); + let secondArrayItem = secondArray[0]; // Get Array Index 0 value. + console.log(secondArrayItem); + let i = 1; + let j = 1; + + // We should actually move these 2 if statements to line 2 so that we do the checks before we do assignments in line 3 and 4! + if (firstArray.length === 0) return secondArray; + if (secondArray.length === 0) return firstArray; + + while (firstArrayItem || secondArrayItem) { + console.log(firstArrayItem, secondArrayItem); + if (secondArrayItem === undefined || firstArrayItem < secondArrayItem) { + mergedArray.push(firstArrayItem); + firstArrayItem = firstArray[i]; + i++; + } else { + mergedArray.push(secondArrayItem); + secondArrayItem = secondArray[j]; + j++; + } + } + + return mergedArray; +} +// mergeSortedArrays([0, 3, 4, 31], [3, 4, 6, 30]); +console.log(mergeSortedArrays([0, 3, 4, 31], [3, 4, 6, 30])); diff --git a/src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4.js b/src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4.js new file mode 100644 index 0000000..08e4559 --- /dev/null +++ b/src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4.js @@ -0,0 +1,34 @@ +"use strict"; +exports.__esModule = true; +exports.mergeSortedArrays = void 0; +function mergeSortedArrays(firstArray, secondArray) { + var mergedArray = []; // allocate empty array. + var firstArrayItem = firstArray[0]; // get Array firstArray Index 0 value + console.log(firstArrayItem); + var secondArrayItem = secondArray[0]; // Get Array Index 0 value. + console.log(secondArrayItem); + var i = 1; + var j = 1; + // We should actually move these 2 if statements to line 2 so that we do the checks before we do assignments in line 3 and 4! + if (firstArray.length === 0) + return secondArray; + if (secondArray.length === 0) + return firstArray; + while (firstArrayItem || secondArrayItem) { + console.log(firstArrayItem, secondArrayItem); + if (secondArrayItem === undefined || firstArrayItem < secondArrayItem) { + mergedArray.push(firstArrayItem); + firstArrayItem = firstArray[i]; + i++; + } + else { + mergedArray.push(secondArrayItem); + secondArrayItem = secondArray[j]; + j++; + } + } + return mergedArray; +} +exports.mergeSortedArrays = mergeSortedArrays; +// mergeSortedArrays([0, 3, 4, 31], [3, 4, 6, 30]); +console.log(mergeSortedArrays([0, 3, 4, 31], [3, 4, 6, 30])); diff --git a/src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4.ts b/src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4.ts new file mode 100644 index 0000000..aa1c0de --- /dev/null +++ b/src/course-master-the-coding/data-structures/arrays/mergeSortedArrays-array-4.ts @@ -0,0 +1,33 @@ +export function mergeSortedArrays( + firstArray: number[], + secondArray: number[] +): number[] { + const mergedArray: number[] = []; // allocate empty array. + let firstArrayItem: number | undefined = firstArray[0]; // get Array firstArray Index 0 value + console.log(firstArrayItem); + let secondArrayItem: number | undefined = secondArray[0]; // Get Array Index 0 value. + console.log(secondArrayItem); + let i: number = 1; + let j: number = 1; + + // We should actually move these 2 if statements to line 2 so that we do the checks before we do assignments in line 3 and 4! + if (firstArray.length === 0) return secondArray; + if (secondArray.length === 0) return firstArray; + + while (firstArrayItem || secondArrayItem) { + console.log(firstArrayItem, secondArrayItem); + if (secondArrayItem === undefined || firstArrayItem < secondArrayItem) { + mergedArray.push(firstArrayItem); + firstArrayItem = firstArray[i]; + i++; + } else { + mergedArray.push(secondArrayItem); + secondArrayItem = secondArray[j]; + j++; + } + } + + return mergedArray; +} +// mergeSortedArrays([0, 3, 4, 31], [3, 4, 6, 30]); +console.log(mergeSortedArrays([0, 3, 4, 31], [3, 4, 6, 30])); From 79037ba884a13abd54ff9d071458276b87870938 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 30 Nov 2022 15:42:05 +0900 Subject: [PATCH 050/150] Package new file added --- package.json | 5 +- yarn.lock | 3155 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3159 insertions(+), 1 deletion(-) create mode 100644 yarn.lock diff --git a/package.json b/package.json index c0e5f21..768e15d 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,9 @@ "main": "index.js", "scripts": { "test": "jest", - "coverage": "npm run test -- --coverage" + "coverage": "npm run test -- --coverage", + "watch": "tsc -w", + "dev": "nodemon dist/index.js" }, "repository": { "type": "git", @@ -33,6 +35,7 @@ "@types/jest": "^29.0.3", "babel-jest": "^29.0.3", "jest": "^29.0.3", + "nodemon": "^2.0.20", "ts-jest": "^29.0.2", "ts-node": "^10.9.1", "typescript": "^4.8.3" diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..204090f --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3155 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" + integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.19.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" + integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.5" + "@babel/parser" "^7.20.5" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.20.5", "@babel/generator@^7.7.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" + integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== + dependencies: + "@babel/types" "^7.20.5" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== + dependencies: + "@babel/compat-data" "^7.20.0" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2", "@babel/helper-create-class-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06" + integrity sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-split-export-declaration" "^7.18.6" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" + integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.2.1" + +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== + dependencies: + "@babel/types" "^7.18.9" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" + +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" + integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.19.1" + "@babel/types" "^7.19.0" + +"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helper-wrap-function@^7.18.9": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" + integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@babel/helpers@^7.20.5": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" + integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.5" + "@babel/types" "^7.20.5" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" + integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" + integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + +"@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" + integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" + integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" + integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" + integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.1" + +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" + integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.20.0", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" + integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" + integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" + +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz#401215f9dc13dc5262940e2e527c9536b3d7f237" + integrity sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-classes@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" + integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" + integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" + integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-modules-amd@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" + integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== + dependencies: + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" + integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== + dependencies: + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-simple-access" "^7.19.4" + +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" + integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-validator-identifier" "^7.19.1" + +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" + integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.20.5" + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + +"@babel/plugin-transform-parameters@^7.20.1": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz#f8f9186c681d10c3de7620c916156d893c8a019e" + integrity sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" + integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-spread@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" + integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-typescript@^7.18.6": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" + integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" + +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.19.1": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" + +"@babel/runtime@^7.8.4": + version "7.20.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" + integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/template@^7.18.10", "@babel/template@^7.3.3": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.7.2": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" + integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.5" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.5" + "@babel/types" "^7.20.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" + integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.3.1.tgz#3e3f876e4e47616ea3b1464b9fbda981872e9583" + integrity sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg== + dependencies: + "@jest/types" "^29.3.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.3.1" + jest-util "^29.3.1" + slash "^3.0.0" + +"@jest/core@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.3.1.tgz#bff00f413ff0128f4debec1099ba7dcd649774a1" + integrity sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw== + dependencies: + "@jest/console" "^29.3.1" + "@jest/reporters" "^29.3.1" + "@jest/test-result" "^29.3.1" + "@jest/transform" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.2.0" + jest-config "^29.3.1" + jest-haste-map "^29.3.1" + jest-message-util "^29.3.1" + jest-regex-util "^29.2.0" + jest-resolve "^29.3.1" + jest-resolve-dependencies "^29.3.1" + jest-runner "^29.3.1" + jest-runtime "^29.3.1" + jest-snapshot "^29.3.1" + jest-util "^29.3.1" + jest-validate "^29.3.1" + jest-watcher "^29.3.1" + micromatch "^4.0.4" + pretty-format "^29.3.1" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" + integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== + dependencies: + "@jest/fake-timers" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/node" "*" + jest-mock "^29.3.1" + +"@jest/expect-utils@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" + integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== + dependencies: + jest-get-type "^29.2.0" + +"@jest/expect@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.3.1.tgz#456385b62894349c1d196f2d183e3716d4c6a6cd" + integrity sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg== + dependencies: + expect "^29.3.1" + jest-snapshot "^29.3.1" + +"@jest/fake-timers@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" + integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== + dependencies: + "@jest/types" "^29.3.1" + "@sinonjs/fake-timers" "^9.1.2" + "@types/node" "*" + jest-message-util "^29.3.1" + jest-mock "^29.3.1" + jest-util "^29.3.1" + +"@jest/globals@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.3.1.tgz#92be078228e82d629df40c3656d45328f134a0c6" + integrity sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q== + dependencies: + "@jest/environment" "^29.3.1" + "@jest/expect" "^29.3.1" + "@jest/types" "^29.3.1" + jest-mock "^29.3.1" + +"@jest/reporters@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.3.1.tgz#9a6d78c109608e677c25ddb34f907b90e07b4310" + integrity sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.3.1" + "@jest/test-result" "^29.3.1" + "@jest/transform" "^29.3.1" + "@jest/types" "^29.3.1" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.3.1" + jest-util "^29.3.1" + jest-worker "^29.3.1" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.0.0": + version "29.0.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" + integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/source-map@^29.2.0": + version "29.2.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" + integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.3.1.tgz#92cd5099aa94be947560a24610aa76606de78f50" + integrity sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw== + dependencies: + "@jest/console" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz#fa24b3b050f7a59d48f7ef9e0b782ab65123090d" + integrity sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA== + dependencies: + "@jest/test-result" "^29.3.1" + graceful-fs "^4.2.9" + jest-haste-map "^29.3.1" + slash "^3.0.0" + +"@jest/transform@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.3.1.tgz#1e6bd3da4af50b5c82a539b7b1f3770568d6e36d" + integrity sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.3.1" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.3.1" + jest-regex-util "^29.2.0" + jest-util "^29.3.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + +"@jest/types@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" + integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== + dependencies: + "@jest/schemas" "^29.0.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== + +"@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + +"@types/babel__core@^7.1.14": + version "7.1.20" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" + integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + dependencies: + "@babel/types" "^7.3.0" + +"@types/graceful-fs@^4.1.3": + version "4.1.5" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" + integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@^29.0.3": + version "29.2.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.3.tgz#f5fd88e43e5a9e4221ca361e23790d48fcf0a211" + integrity sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/node@*": + version "18.11.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" + integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== + +"@types/prettier@^2.1.5": + version "2.7.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" + integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.15" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.15.tgz#5b62c89fb049e2fc8378394a2861a593055f0866" + integrity sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg== + dependencies: + "@types/yargs-parser" "*" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +babel-jest@^29.0.3, babel-jest@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" + integrity sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA== + dependencies: + "@jest/transform" "^29.3.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.2.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" + integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" + integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== + dependencies: + babel-plugin-jest-hoist "^29.2.0" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.3, browserslist@^4.21.4: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001400: + version "1.0.30001435" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001435.tgz#502c93dbd2f493bee73a408fe98e98fb1dad10b2" + integrity sha512-kdCkUTjR+v4YAJelyiDTqiu82BDr4W4CP5sgTA0ZBmqn30XfS2ZghPLMowik9TPhS+psWJiUNxsqLyurDbmutA== + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chokidar@^3.5.2: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^3.2.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" + integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +core-js-compat@^3.25.1: + version "3.26.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" + integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== + dependencies: + browserslist "^4.21.4" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" + integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.0.0, expect@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" + integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== + dependencies: + "@jest/expect-utils" "^29.3.1" + jest-get-type "^29.2.0" + jest-matcher-utils "^29.3.1" + jest-message-util "^29.3.1" + jest-util "^29.3.1" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz#b6598daa9803ea6a4dce7968e20ab380ddbee289" + integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.3.1.tgz#177d07c5c0beae8ef2937a67de68f1e17bbf1b4a" + integrity sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg== + dependencies: + "@jest/environment" "^29.3.1" + "@jest/expect" "^29.3.1" + "@jest/test-result" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.3.1" + jest-matcher-utils "^29.3.1" + jest-message-util "^29.3.1" + jest-runtime "^29.3.1" + jest-snapshot "^29.3.1" + jest-util "^29.3.1" + p-limit "^3.1.0" + pretty-format "^29.3.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.3.1.tgz#e89dff427db3b1df50cea9a393ebd8640790416d" + integrity sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ== + dependencies: + "@jest/core" "^29.3.1" + "@jest/test-result" "^29.3.1" + "@jest/types" "^29.3.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.3.1" + jest-util "^29.3.1" + jest-validate "^29.3.1" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.3.1.tgz#0bc3dcb0959ff8662957f1259947aedaefb7f3c6" + integrity sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.3.1" + "@jest/types" "^29.3.1" + babel-jest "^29.3.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.3.1" + jest-environment-node "^29.3.1" + jest-get-type "^29.2.0" + jest-regex-util "^29.2.0" + jest-resolve "^29.3.1" + jest-runner "^29.3.1" + jest-util "^29.3.1" + jest-validate "^29.3.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.3.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" + integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" + +jest-docblock@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.2.0.tgz#307203e20b637d97cee04809efc1d43afc641e82" + integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.3.1.tgz#bc375c8734f1bb96625d83d1ca03ef508379e132" + integrity sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA== + dependencies: + "@jest/types" "^29.3.1" + chalk "^4.0.0" + jest-get-type "^29.2.0" + jest-util "^29.3.1" + pretty-format "^29.3.1" + +jest-environment-node@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" + integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== + dependencies: + "@jest/environment" "^29.3.1" + "@jest/fake-timers" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/node" "*" + jest-mock "^29.3.1" + jest-util "^29.3.1" + +jest-get-type@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" + integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== + +jest-haste-map@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.3.1.tgz#af83b4347f1dae5ee8c2fb57368dc0bb3e5af843" + integrity sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A== + dependencies: + "@jest/types" "^29.3.1" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.2.0" + jest-util "^29.3.1" + jest-worker "^29.3.1" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz#95336d020170671db0ee166b75cd8ef647265518" + integrity sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA== + dependencies: + jest-get-type "^29.2.0" + pretty-format "^29.3.1" + +jest-matcher-utils@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" + integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== + dependencies: + chalk "^4.0.0" + jest-diff "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" + +jest-message-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" + integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.3.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.3.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" + integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== + dependencies: + "@jest/types" "^29.3.1" + "@types/node" "*" + jest-util "^29.3.1" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" + integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== + +jest-resolve-dependencies@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz#a6a329708a128e68d67c49f38678a4a4a914c3bf" + integrity sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA== + dependencies: + jest-regex-util "^29.2.0" + jest-snapshot "^29.3.1" + +jest-resolve@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.3.1.tgz#9a4b6b65387a3141e4a40815535c7f196f1a68a7" + integrity sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.3.1" + jest-pnp-resolver "^1.2.2" + jest-util "^29.3.1" + jest-validate "^29.3.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.3.1.tgz#a92a879a47dd096fea46bb1517b0a99418ee9e2d" + integrity sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA== + dependencies: + "@jest/console" "^29.3.1" + "@jest/environment" "^29.3.1" + "@jest/test-result" "^29.3.1" + "@jest/transform" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.2.0" + jest-environment-node "^29.3.1" + jest-haste-map "^29.3.1" + jest-leak-detector "^29.3.1" + jest-message-util "^29.3.1" + jest-resolve "^29.3.1" + jest-runtime "^29.3.1" + jest-util "^29.3.1" + jest-watcher "^29.3.1" + jest-worker "^29.3.1" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.3.1.tgz#21efccb1a66911d6d8591276a6182f520b86737a" + integrity sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A== + dependencies: + "@jest/environment" "^29.3.1" + "@jest/fake-timers" "^29.3.1" + "@jest/globals" "^29.3.1" + "@jest/source-map" "^29.2.0" + "@jest/test-result" "^29.3.1" + "@jest/transform" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.3.1" + jest-message-util "^29.3.1" + jest-mock "^29.3.1" + jest-regex-util "^29.2.0" + jest-resolve "^29.3.1" + jest-snapshot "^29.3.1" + jest-util "^29.3.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.3.1.tgz#17bcef71a453adc059a18a32ccbd594b8cc4e45e" + integrity sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.3.1" + "@jest/transform" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.3.1" + graceful-fs "^4.2.9" + jest-diff "^29.3.1" + jest-get-type "^29.2.0" + jest-haste-map "^29.3.1" + jest-matcher-utils "^29.3.1" + jest-message-util "^29.3.1" + jest-util "^29.3.1" + natural-compare "^1.4.0" + pretty-format "^29.3.1" + semver "^7.3.5" + +jest-util@^29.0.0, jest-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" + integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== + dependencies: + "@jest/types" "^29.3.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.3.1.tgz#d56fefaa2e7d1fde3ecdc973c7f7f8f25eea704a" + integrity sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g== + dependencies: + "@jest/types" "^29.3.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.2.0" + leven "^3.1.0" + pretty-format "^29.3.1" + +jest-watcher@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.3.1.tgz#3341547e14fe3c0f79f9c3a4c62dbc3fc977fd4a" + integrity sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg== + dependencies: + "@jest/test-result" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.3.1" + string-length "^4.0.1" + +jest-worker@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" + integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== + dependencies: + "@types/node" "*" + jest-util "^29.3.1" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.0.3: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.3.1.tgz#c130c0d551ae6b5459b8963747fed392ddbde122" + integrity sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA== + dependencies: + "@jest/core" "^29.3.1" + "@jest/types" "^29.3.1" + import-local "^3.0.2" + jest-cli "^29.3.1" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x, make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +nodemon@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.20.tgz#e3537de768a492e8d74da5c5813cb0c7486fc701" + integrity sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw== + dependencies: + chokidar "^3.5.2" + debug "^3.2.7" + ignore-by-default "^1.0.1" + minimatch "^3.1.2" + pstree.remy "^1.1.8" + semver "^5.7.1" + simple-update-notifier "^1.0.7" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pretty-format@^29.0.0, pretty-format@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" + integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== + dependencies: + "@jest/schemas" "^29.0.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexpu-core@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" + integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsgen "^0.7.1" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsgen@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" + integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== + +resolve@^1.14.2, resolve@^1.20.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +semver@7.x, semver@^7.3.5: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@~7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-update-notifier@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz#67694c121de354af592b347cdba798463ed49c82" + integrity sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg== + dependencies: + semver "~7.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +ts-jest@^29.0.2: + version "29.0.3" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.3.tgz#63ea93c5401ab73595440733cefdba31fcf9cb77" + integrity sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.1" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typescript@^4.8.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" + integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@^21.0.1, yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.6.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 0ae8836edcbc8cfebe782f146dd6b52c3c5a777a Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 30 Nov 2022 15:42:46 +0900 Subject: [PATCH 051/150] update isolatedModules flag --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index b11e861..f1d39bd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -69,7 +69,7 @@ // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ /* Interop Constraints */ - "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + "isolatedModules": false, /* Ensure that each file can be safely transpiled without relying on other imports. */ "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ From 78b6b68df73b4597bc3163a7d042409125f975a1 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 30 Nov 2022 15:43:01 +0900 Subject: [PATCH 052/150] hash init --- .../hash-tables/hash-tables-01.js | 13 +++++++++++ .../hash-tables/hash-tables-01.ts | 23 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/course-master-the-coding/data-structures/hash-tables/hash-tables-01.js create mode 100644 src/course-master-the-coding/data-structures/hash-tables/hash-tables-01.ts diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-01.js b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-01.js new file mode 100644 index 0000000..b01c0ae --- /dev/null +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-01.js @@ -0,0 +1,13 @@ +var user = { + age: 34, + name: 'Hash Tables', + magic: true, + scream: function (message) { + console.log(message); + } +}; +user.age; +user.spell = 'Hello'; +user.scream('Hello World'); +// Map --> Gives you some order +// Set --> No duplicate keys. diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-01.ts b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-01.ts new file mode 100644 index 0000000..8eb0ccc --- /dev/null +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-01.ts @@ -0,0 +1,23 @@ +type userType = { + age: number; + name: string; + magic: boolean; + spell?: string; + scream: (message: string) => void; +}; + +const user: userType = { + age: 34, + name: 'Hash Tables', + magic: true, + scream: function (message) { + console.log(message); + }, +}; + +user.age; +user.spell = 'Hello'; +user.scream('Hello World'); + +// Map --> Gives you some order +// Set --> No duplicate keys. From c1e7aea76187003001db9ba6b01900d2e61bdce5 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 30 Nov 2022 15:51:20 +0900 Subject: [PATCH 053/150] pull request template added --- .github/pull_request_template.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..c4c8349 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,4 @@ +## What I have done + +- [ ] Demo +- [ ] Demo \ No newline at end of file From 74c18294dbb182f8aed2a8247b60857d1de965f0 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 30 Nov 2022 15:58:02 +0900 Subject: [PATCH 054/150] implement --- .../hash-tables/implementation-1.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/course-master-the-coding/data-structures/hash-tables/implementation-1.ts diff --git a/src/course-master-the-coding/data-structures/hash-tables/implementation-1.ts b/src/course-master-the-coding/data-structures/hash-tables/implementation-1.ts new file mode 100644 index 0000000..0898407 --- /dev/null +++ b/src/course-master-the-coding/data-structures/hash-tables/implementation-1.ts @@ -0,0 +1,20 @@ +class HashTable { + private data: number[]; + constructor(size: number) { + this.data = new Array(size); + } + + _hash(key: string) { + let hash = 0; + for (let i = 0; i < key.length; i++) { + hash = (hash + key.charCodeAt(i) * i) % this.data.length; + } + return hash; + } +} + +const myHashTable = new HashTable(50); +// myHashTable.set('grapes', 10000); +// myHashTable.get('grapes'); +// myHashTable.set('apples', 9); +// myHashTable.get('apples'); From af0f15929a00ebf7eb07c2dd18e19e6ca67921fa Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 1 Dec 2022 11:18:58 +0900 Subject: [PATCH 055/150] hash table implement --- .../hash-tables/hash-tables-03.js | 50 ++++++++++++++++++ .../hash-tables/hash-tables-03.ts | 52 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js create mode 100644 src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js new file mode 100644 index 0000000..f546ee1 --- /dev/null +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js @@ -0,0 +1,50 @@ +var HashTableMain = /** @class */ (function () { + function HashTableMain(size) { + this.data = []; + this.data = new Array(size); + } + HashTableMain.prototype.hash = function (key) { + var hash = 0; + for (var i = 0; i < key.length; i++) { + hash = (hash + key.charCodeAt(i) * i) % this.data.length; + } + return hash; + }; + /** + * set + */ + HashTableMain.prototype.set = function (key, value) { + var address = this.hash(key); + if (!this.data[address]) { + this.data[address] = []; + } + this.data[address].push([key, value]); + return this.data; + }; + /** + * Get + */ + HashTableMain.prototype.get = function (key) { + var getAddress = this.hash(key); + var currentBucket = this.data[getAddress]; + if (currentBucket) { + for (var i = 0; i < currentBucket.length; i++) { + if (currentBucket[i][0] === key) { + return currentBucket[i][1]; + } + } + } + return undefined; + }; + return HashTableMain; +})(); +// Example +var myHashTable01 = new HashTableMain(50); +myHashTable01.set('grapes', 10000); +myHashTable01.get('grapes'); +myHashTable01.set('apples', 9); +myHashTable01.get('apples'); +myHashTable01.set('banana', 'Nice foots'); +myHashTable01.get('banana'); + +console.log(myHashTable01.data); diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts new file mode 100644 index 0000000..bc0930a --- /dev/null +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts @@ -0,0 +1,52 @@ +class HashTableMain { + private data: [] | [string, number | string][][] = []; + constructor(size: number) { + this.data = new Array(size); + } + + private hash(key: string): number { + let hash: number = 0; + for (let i = 0; i < key.length; i++) { + hash = (hash + key.charCodeAt(i) * i) % this.data.length; + } + return hash; + } + + /** + * set + */ + public set(key: string, value: number | string) { + let address = this.hash(key); + if (!this.data[address]) { + this.data[address] = []; + } + this.data[address].push([key, value]); + return this.data; + } + + /** + * Get + */ + public get(key: string): undefined | string | number { + const getAddress = this.hash(key); + const currentBucket = this.data[getAddress]; + + if (currentBucket) { + for (let i = 0; i < currentBucket.length; i++) { + if (currentBucket[i][0] === key) { + return currentBucket[i][1]; + } + } + } + return undefined; + } +} + +// Example +const myHashTable01 = new HashTableMain(50); +myHashTable01.set('grapes', 10000); +myHashTable01.get('grapes'); +myHashTable01.set('apples', 9); +myHashTable01.get('apples'); +myHashTable01.set('banana', 'Nice foots'); +myHashTable01.get('banana'); From 95c2d318e6cdb256fb12ffd0f3be1d65cde3da7d Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 1 Dec 2022 11:29:27 +0900 Subject: [PATCH 056/150] keys function created --- .../hash-tables/hash-tables-03.ts | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts index bc0930a..7c0b48d 100644 --- a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts @@ -1,5 +1,5 @@ class HashTableMain { - private data: [] | [string, number | string][][] = []; + public data: [] | [string, number | string][][] = []; constructor(size: number) { this.data = new Array(size); } @@ -40,6 +40,23 @@ class HashTableMain { } return undefined; } + + /** + * keys + */ + public keys(): (number | string)[] { + const keysArray: (number | string)[] = []; + console.log(this.data.length); + for (let i = 0; i < this.data.length; i++) { + console.log(this.data[i]); + if (this.data[i]) { + console.log(this.data[i][0]); + console.log(this.data[i][0][0]); + keysArray.push(this.data[i][0][0]); + } + } + return keysArray; + } } // Example @@ -50,3 +67,5 @@ myHashTable01.set('apples', 9); myHashTable01.get('apples'); myHashTable01.set('banana', 'Nice foots'); myHashTable01.get('banana'); +myHashTable01.keys(); +console.log(myHashTable01.data); From 9f4efdc0cfb96dccdec80053f0302e30cfde158d Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 1 Dec 2022 11:42:25 +0900 Subject: [PATCH 057/150] updated hash table --- .../hash-tables/hash-tables-03.js | 92 +++++++++++-------- 1 file changed, 54 insertions(+), 38 deletions(-) diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js index f546ee1..5277fcb 100644 --- a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js @@ -1,43 +1,59 @@ var HashTableMain = /** @class */ (function () { - function HashTableMain(size) { - this.data = []; - this.data = new Array(size); - } - HashTableMain.prototype.hash = function (key) { - var hash = 0; - for (var i = 0; i < key.length; i++) { - hash = (hash + key.charCodeAt(i) * i) % this.data.length; + function HashTableMain(size) { + this.data = []; + this.data = new Array(size); } - return hash; - }; - /** - * set - */ - HashTableMain.prototype.set = function (key, value) { - var address = this.hash(key); - if (!this.data[address]) { - this.data[address] = []; - } - this.data[address].push([key, value]); - return this.data; - }; - /** - * Get - */ - HashTableMain.prototype.get = function (key) { - var getAddress = this.hash(key); - var currentBucket = this.data[getAddress]; - if (currentBucket) { - for (var i = 0; i < currentBucket.length; i++) { - if (currentBucket[i][0] === key) { - return currentBucket[i][1]; + HashTableMain.prototype.hash = function (key) { + var hash = 0; + for (var i = 0; i < key.length; i++) { + hash = (hash + key.charCodeAt(i) * i) % this.data.length; } - } - } - return undefined; - }; - return HashTableMain; -})(); + return hash; + }; + /** + * set + */ + HashTableMain.prototype.set = function (key, value) { + var address = this.hash(key); + if (!this.data[address]) { + this.data[address] = []; + } + this.data[address].push([key, value]); + return this.data; + }; + /** + * Get + */ + HashTableMain.prototype.get = function (key) { + var getAddress = this.hash(key); + var currentBucket = this.data[getAddress]; + if (currentBucket) { + for (var i = 0; i < currentBucket.length; i++) { + if (currentBucket[i][0] === key) { + return currentBucket[i][1]; + } + } + } + return undefined; + }; + /** + * keys + */ + HashTableMain.prototype.keys = function () { + var keysArray = []; + console.log(this.data.length); + for (var i = 0; i < this.data.length; i++) { + console.log(this.data[i]); + if (this.data[i]) { + console.log(this.data[i][0]); + console.log(this.data[i][0][0]); + keysArray.push(this.data[i][0][0]); + } + } + return keysArray; + }; + return HashTableMain; +}()); // Example var myHashTable01 = new HashTableMain(50); myHashTable01.set('grapes', 10000); @@ -46,5 +62,5 @@ myHashTable01.set('apples', 9); myHashTable01.get('apples'); myHashTable01.set('banana', 'Nice foots'); myHashTable01.get('banana'); - +myHashTable01.keys(); console.log(myHashTable01.data); From 82754ae756c2328649649537c1df137ba8b7a075 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 1 Dec 2022 11:54:35 +0900 Subject: [PATCH 058/150] updated both --- .../hash-tables/hash-tables-03.js | 45 +++++++++++++++++- .../hash-tables/hash-tables-03.ts | 46 ++++++++++++++++++- 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js index 5277fcb..6962d1e 100644 --- a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.js @@ -39,7 +39,7 @@ var HashTableMain = /** @class */ (function () { /** * keys */ - HashTableMain.prototype.keys = function () { + HashTableMain.prototype.keysOld = function () { var keysArray = []; console.log(this.data.length); for (var i = 0; i < this.data.length; i++) { @@ -52,6 +52,28 @@ var HashTableMain = /** @class */ (function () { } return keysArray; }; + HashTableMain.prototype.keys = function () { + if (!this.data.length) { + return undefined; + } + var result = []; + // loop through all the elements + for (var i = 0; i < this.data.length; i++) { + // if it's not an empty memory cell + if (this.data[i] && this.data[i].length) { + // but also loop through all the potential collisions + if (this.data.length > 1) { + for (var j = 0; j < this.data[i].length; j++) { + result.push(this.data[i][j][0]); + } + } + else { + result.push(this.data[i][0]); + } + } + } + return result; + }; return HashTableMain; }()); // Example @@ -64,3 +86,24 @@ myHashTable01.set('banana', 'Nice foots'); myHashTable01.get('banana'); myHashTable01.keys(); console.log(myHashTable01.data); +console.log(myHashTable01.keys()); +/** + * + * + * + [ + [ + [ 'a', 'Nice foots' ], + [ 'b', 'Nice foots' ], + [ 'c', 'Nice foots' ], + [ 'd', 'Nice foots' ], + [ 'e', 'Nice foots' ], + [ 'f', 'Nice foots' ], + [ 'g', 'Nice foots' ] + ], + <2 empty items>, + [ [ 'grapes', 10000 ], [ 'banana', 'Nice foots' ] ], + <5 empty items>, + [ [ 'apples', 9 ] ] +] + */ diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts index 7c0b48d..3bde124 100644 --- a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-03.ts @@ -44,7 +44,7 @@ class HashTableMain { /** * keys */ - public keys(): (number | string)[] { + public keysOld(): (number | string)[] { const keysArray: (number | string)[] = []; console.log(this.data.length); for (let i = 0; i < this.data.length; i++) { @@ -57,6 +57,28 @@ class HashTableMain { } return keysArray; } + + public keys(): undefined | (string | [string, string | number])[] { + if (!this.data.length) { + return undefined; + } + let result: (string | [string, string | number])[] = []; + // loop through all the elements + for (let i = 0; i < this.data.length; i++) { + // if it's not an empty memory cell + if (this.data[i] && this.data[i].length) { + // but also loop through all the potential collisions + if (this.data.length > 1) { + for (let j = 0; j < this.data[i].length; j++) { + result.push(this.data[i][j][0]); + } + } else { + result.push(this.data[i][0]); + } + } + } + return result; + } } // Example @@ -69,3 +91,25 @@ myHashTable01.set('banana', 'Nice foots'); myHashTable01.get('banana'); myHashTable01.keys(); console.log(myHashTable01.data); +console.log(myHashTable01.keys()); + +/** + * + * + * + [ + [ + [ 'a', 'Nice foots' ], + [ 'b', 'Nice foots' ], + [ 'c', 'Nice foots' ], + [ 'd', 'Nice foots' ], + [ 'e', 'Nice foots' ], + [ 'f', 'Nice foots' ], + [ 'g', 'Nice foots' ] + ], + <2 empty items>, + [ [ 'grapes', 10000 ], [ 'banana', 'Nice foots' ] ], + <5 empty items>, + [ [ 'apples', 9 ] ] +] + */ From d090cd64ccf33436022221106231e6c5ca5129fd Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Fri, 2 Dec 2022 15:22:19 +0900 Subject: [PATCH 059/150] hash table question 01 solution 01 implement. --- .../hash-tables/hash-tables-04.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts new file mode 100644 index 0000000..9b3bd83 --- /dev/null +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts @@ -0,0 +1,27 @@ +// Google Question +/** + * Given an array = [2, 5, 1, 2, 3, 5, 1, 2, 4]: It should return 2 + * + * Given an array = [2, 1, 1, 2, 3, 5, 1, 2, 4]: It should return 1 + * + * Given an array = [2, 3, 4, 5]: It should return undefined + * + */ + +// Solution 01: +function firstRecurringCharacter(array: number[]): number | undefined { + for (let i = 0; i < array.length; i++) { + const element = array[i]; + console.log('first : ', element); + for (let j = i + 1; j < array.length; j++) { + const element = array[j]; + console.log('Second : ', element); + if (array[i] === array[j]) { + console.log(array[i]); + return array[i]; + } + } + } + console.log('Nothing match : undefined'); + return undefined; +} From 36af05f06c230c9ad8509224f1837f8066369ed4 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Fri, 2 Dec 2022 15:32:57 +0900 Subject: [PATCH 060/150] covert js file --- .../hash-tables/hash-tables-04.js | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.js diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.js b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.js new file mode 100644 index 0000000..d4866c5 --- /dev/null +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.js @@ -0,0 +1,31 @@ +// Google Question +/** + * Given an array = [2, 5, 1, 2, 3, 5, 1, 2, 4]: It should return 2 + * + * Given an array = [2, 1, 1, 2, 3, 5, 1, 2, 4]: It should return 1 + * + * Given an array = [2, 3, 4, 5]: It should return undefined + * + */ +// Solution 01: +function firstRecurringCharacter(array) { + for (var i = 0; i < array.length; i++) { + var element = array[i]; + console.log('first : ', element); + for (var j = i + 1; j < array.length; j++) { + var element_1 = array[j]; + console.log('Second : ', element, element_1); + if (array[i] === array[j]) { + console.log(array[i]); + return array[i]; + } + } + } + console.log('Nothing match : undefined'); + return undefined; +} +var array01 = [2, 5, 1, 0, 3, 5, 1, 2, 4]; +var array02 = [2, 1, 1, 2, 3, 5, 1, 2, 4]; +var array03 = [2, 3, 4, 5]; +// Call function +firstRecurringCharacter(array01); From f4ba513c6cf4061bcc1fa037405345d6f4a96e55 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Fri, 2 Dec 2022 15:33:18 +0900 Subject: [PATCH 061/150] update function. --- .../data-structures/hash-tables/hash-tables-04.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts index 9b3bd83..f0f648e 100644 --- a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts @@ -25,3 +25,9 @@ function firstRecurringCharacter(array: number[]): number | undefined { console.log('Nothing match : undefined'); return undefined; } + +const array01 = [2, 5, 1, 2, 3, 5, 1, 2, 4]; +const array02 = [2, 1, 1, 2, 3, 5, 1, 2, 4]; +const array03 = [2, 3, 4, 5]; +// Call function +firstRecurringCharacter(array01); From d8cde61e543f20c259caa761b79d8ae529abf604 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Fri, 2 Dec 2022 15:55:07 +0900 Subject: [PATCH 062/150] update solution --- .../data-structures/hash-tables/hash-tables-04.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts index f0f648e..7592bf9 100644 --- a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts @@ -26,6 +26,20 @@ function firstRecurringCharacter(array: number[]): number | undefined { return undefined; } +// Solution 02: +function firstRecurringCharacter2(array: number[]): undefined | number { + let KeysMap: { [key: number]: number } = {}; + for (let i = 0; i < array.length; i++) { + const element = array[i]; + if (KeysMap[array[i]] !== undefined) { + return array[i]; + } else { + KeysMap[array[i]] = i; + } + } + return undefined; +} + const array01 = [2, 5, 1, 2, 3, 5, 1, 2, 4]; const array02 = [2, 1, 1, 2, 3, 5, 1, 2, 4]; const array03 = [2, 3, 4, 5]; From 1b6766fe234c2747eefd4575b1802c2bf3253e29 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Fri, 2 Dec 2022 18:09:50 +0900 Subject: [PATCH 063/150] added --- .../hash-tables/hash-tables-04.js | 26 ++++++++++++++++--- .../hash-tables/hash-tables-04.ts | 9 +++++-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.js b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.js index d4866c5..2e29935 100644 --- a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.js +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.js @@ -14,7 +14,7 @@ function firstRecurringCharacter(array) { console.log('first : ', element); for (var j = i + 1; j < array.length; j++) { var element_1 = array[j]; - console.log('Second : ', element, element_1); + console.log('Second : ', element_1); if (array[i] === array[j]) { console.log(array[i]); return array[i]; @@ -24,8 +24,28 @@ function firstRecurringCharacter(array) { console.log('Nothing match : undefined'); return undefined; } -var array01 = [2, 5, 1, 0, 3, 5, 1, 2, 4]; +// Solution 02: +function firstRecurringCharacter2(array) { + var KeysMap = {}; + for (var i = 0; i < array.length; i++) { + var element = array[i]; + console.log(element); + console.log(KeysMap); + if (KeysMap[array[i]] !== undefined) { + // if (KeysMap[array[i]] !== i) { + console.log(KeysMap[array[i]], i); + console.log(array[i]); + return array[i]; + } else { + KeysMap[array[i]] = i; + } + } + + return undefined; +} +var array01 = [2, 5, 1, 2, 3, 5, 1, 2, 4]; var array02 = [2, 1, 1, 2, 3, 5, 1, 2, 4]; var array03 = [2, 3, 4, 5]; // Call function -firstRecurringCharacter(array01); +// firstRecurringCharacter(array01); +firstRecurringCharacter2(array02); diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts index 7592bf9..bb8c37e 100644 --- a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts @@ -31,7 +31,11 @@ function firstRecurringCharacter2(array: number[]): undefined | number { let KeysMap: { [key: number]: number } = {}; for (let i = 0; i < array.length; i++) { const element = array[i]; - if (KeysMap[array[i]] !== undefined) { + console.log(element); + console.log(KeysMap); + // if (KeysMap[array[i]] !== undefined) { + if (KeysMap[array[i]] === i) { + console.log(KeysMap[array[i]], i); return array[i]; } else { KeysMap[array[i]] = i; @@ -44,4 +48,5 @@ const array01 = [2, 5, 1, 2, 3, 5, 1, 2, 4]; const array02 = [2, 1, 1, 2, 3, 5, 1, 2, 4]; const array03 = [2, 3, 4, 5]; // Call function -firstRecurringCharacter(array01); +// firstRecurringCharacter(array01); +firstRecurringCharacter2(array02); From 7678c7b5ed1a0bf01ee0712523f10b362328397b Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 5 Dec 2022 11:00:29 +0900 Subject: [PATCH 064/150] editorconfig added --- .editorconfig | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..5d47c21 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true From 534d0801ec3cc4bd2a679c0a3e170aae3f6d1a33 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 5 Dec 2022 11:00:48 +0900 Subject: [PATCH 065/150] prettierrc file added --- .prettierrc.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .prettierrc.js diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..e2b3323 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,11 @@ +module.exports = { + arrowParens: "avoid", + printWidth: 120, + singleQuote: true, + semi: true, + endOfLine: "lf", + tabWidth: 2, + arrowParens: "avoid", + bracketSpacing: true, + trailingComma: "es5", +}; From fcd28560581f1c233d9cc800d1aa81e7df0d74f2 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 5 Dec 2022 12:41:24 +0900 Subject: [PATCH 066/150] update hash --- .../hash-tables/hash-tables-04.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts index bb8c37e..85f3928 100644 --- a/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts +++ b/src/course-master-the-coding/data-structures/hash-tables/hash-tables-04.ts @@ -24,7 +24,7 @@ function firstRecurringCharacter(array: number[]): number | undefined { } console.log('Nothing match : undefined'); return undefined; -} +} // O(n^2) // Solution 02: function firstRecurringCharacter2(array: number[]): undefined | number { @@ -33,8 +33,7 @@ function firstRecurringCharacter2(array: number[]): undefined | number { const element = array[i]; console.log(element); console.log(KeysMap); - // if (KeysMap[array[i]] !== undefined) { - if (KeysMap[array[i]] === i) { + if (KeysMap[array[i]] !== undefined) { console.log(KeysMap[array[i]], i); return array[i]; } else { @@ -42,7 +41,18 @@ function firstRecurringCharacter2(array: number[]): undefined | number { } } return undefined; -} +} // O(n) + +// Solution 02: +const firstRecurringCharacter3 = (array: number[]): undefined | number => { + const set: Set = new Set(); + for (let i = 0; i < array.length; i++) { + if (set.has(array[i])) return array[i]; + + set.add(array[i]); + } + return undefined; +}; // O(n) const array01 = [2, 5, 1, 2, 3, 5, 1, 2, 4]; const array02 = [2, 1, 1, 2, 3, 5, 1, 2, 4]; From 5b7b72de212583be31746180ac9073d79ff09761 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 6 Dec 2022 15:26:10 +0900 Subject: [PATCH 067/150] Implement linked list --- .../linked-lists/linked-lists-01.ts | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/course-master-the-coding/data-structures/linked-lists/linked-lists-01.ts diff --git a/src/course-master-the-coding/data-structures/linked-lists/linked-lists-01.ts b/src/course-master-the-coding/data-structures/linked-lists/linked-lists-01.ts new file mode 100644 index 0000000..06374c1 --- /dev/null +++ b/src/course-master-the-coding/data-structures/linked-lists/linked-lists-01.ts @@ -0,0 +1,104 @@ +// add a method remove() to the linked list that deletes a node to the specified index. + +type Tail = { + value: string | number; + next: null; +}; + +type Head = { + value: string | number; + next: null; +}; + +class LinkedList { + head: { value: string | number; next: null }; + tail: { value: string | number; next: Tail | null }; + length: number; + constructor(value: any) { + this.head = { + value: value, + next: null, + }; + this.tail = this.head; + this.length = 1; + } + + append(value: number) { + const newNode = { + value: value, + next: null, + }; + this.tail.next = newNode; + this.tail = newNode; + this.length++; + return this; + } + + prepend(value: number) { + const newNode: any = { + value: value, + next: null, + }; + + newNode.next = this.head; + this.head = newNode; + this.length++; + return this; + } + + printList() { + const array: (string | number)[] = []; + let currentNode: any = this.head; + while (currentNode !== null) { + array.push(currentNode.value); + currentNode = currentNode.next; + } + return array; + } + + insert(index: number, value: number) { + //Check for proper parameters; + if (index >= this.length) { + console.log('yes'); + return this.append(value); + } + + const newNode: any = { + value: value, + next: null, + }; + const leader = this.traverseToIndex(index - 1); + const holdingPointer = leader.next; + leader.next = newNode; + newNode.next = holdingPointer; + this.length++; + return this.printList(); + } + traverseToIndex(index: number) { + //Check parameters + let counter = 0; + let currentNode: any = this.head; + while (counter !== index) { + currentNode = currentNode.next; + counter++; + } + return currentNode; + } + + remove(index: number) { + // Check Parameters + const leader = this.traverseToIndex(index - 1); + const unwantedNode = leader.next; + leader.next = unwantedNode.next; + this.length--; + return this.printList(); + } +} + +let myLinkedList = new LinkedList(10); +myLinkedList.append(5); +myLinkedList.append(16); +myLinkedList.prepend(1); +myLinkedList.insert(2, 99); +myLinkedList.insert(20, 88); +myLinkedList.remove(2); From 9e87ee8f7b84f2d7d713c8a8cfc44e6f0f5137dc Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 6 Dec 2022 16:03:28 +0900 Subject: [PATCH 068/150] big-O-complexities folder name change --- src/big-O-complexities/big-O-complexities-01.ts | 0 .../big-o-cheat-sheet-01.txt | 0 src/{section-big-o => big-O-complexities}/big-o-exercise-1.js | 0 src/{section-big-o => big-O-complexities}/big-o-exercise-2.js | 0 src/{section-big-o => big-O-complexities}/big-o-exercise-3.js | 0 src/{section-big-o => big-O-complexities}/big-o-exercise-4.js | 0 src/{section-big-o => big-O-complexities}/big-o-exercise-5.js | 0 src/{section-big-o => big-O-complexities}/big-o-exercise-6.js | 0 src/{section-big-o => big-O-complexities}/note.txt | 0 src/{section-big-o => big-O-complexities}/o-n-001.js | 0 src/{section-big-o => big-O-complexities}/sample-001.js | 0 src/{section-big-o => big-O-complexities}/space-complexity.js | 0 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/big-O-complexities/big-O-complexities-01.ts rename src/{section-big-o => big-O-complexities}/big-o-cheat-sheet-01.txt (100%) rename src/{section-big-o => big-O-complexities}/big-o-exercise-1.js (100%) rename src/{section-big-o => big-O-complexities}/big-o-exercise-2.js (100%) rename src/{section-big-o => big-O-complexities}/big-o-exercise-3.js (100%) rename src/{section-big-o => big-O-complexities}/big-o-exercise-4.js (100%) rename src/{section-big-o => big-O-complexities}/big-o-exercise-5.js (100%) rename src/{section-big-o => big-O-complexities}/big-o-exercise-6.js (100%) rename src/{section-big-o => big-O-complexities}/note.txt (100%) rename src/{section-big-o => big-O-complexities}/o-n-001.js (100%) rename src/{section-big-o => big-O-complexities}/sample-001.js (100%) rename src/{section-big-o => big-O-complexities}/space-complexity.js (100%) diff --git a/src/big-O-complexities/big-O-complexities-01.ts b/src/big-O-complexities/big-O-complexities-01.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/section-big-o/big-o-cheat-sheet-01.txt b/src/big-O-complexities/big-o-cheat-sheet-01.txt similarity index 100% rename from src/section-big-o/big-o-cheat-sheet-01.txt rename to src/big-O-complexities/big-o-cheat-sheet-01.txt diff --git a/src/section-big-o/big-o-exercise-1.js b/src/big-O-complexities/big-o-exercise-1.js similarity index 100% rename from src/section-big-o/big-o-exercise-1.js rename to src/big-O-complexities/big-o-exercise-1.js diff --git a/src/section-big-o/big-o-exercise-2.js b/src/big-O-complexities/big-o-exercise-2.js similarity index 100% rename from src/section-big-o/big-o-exercise-2.js rename to src/big-O-complexities/big-o-exercise-2.js diff --git a/src/section-big-o/big-o-exercise-3.js b/src/big-O-complexities/big-o-exercise-3.js similarity index 100% rename from src/section-big-o/big-o-exercise-3.js rename to src/big-O-complexities/big-o-exercise-3.js diff --git a/src/section-big-o/big-o-exercise-4.js b/src/big-O-complexities/big-o-exercise-4.js similarity index 100% rename from src/section-big-o/big-o-exercise-4.js rename to src/big-O-complexities/big-o-exercise-4.js diff --git a/src/section-big-o/big-o-exercise-5.js b/src/big-O-complexities/big-o-exercise-5.js similarity index 100% rename from src/section-big-o/big-o-exercise-5.js rename to src/big-O-complexities/big-o-exercise-5.js diff --git a/src/section-big-o/big-o-exercise-6.js b/src/big-O-complexities/big-o-exercise-6.js similarity index 100% rename from src/section-big-o/big-o-exercise-6.js rename to src/big-O-complexities/big-o-exercise-6.js diff --git a/src/section-big-o/note.txt b/src/big-O-complexities/note.txt similarity index 100% rename from src/section-big-o/note.txt rename to src/big-O-complexities/note.txt diff --git a/src/section-big-o/o-n-001.js b/src/big-O-complexities/o-n-001.js similarity index 100% rename from src/section-big-o/o-n-001.js rename to src/big-O-complexities/o-n-001.js diff --git a/src/section-big-o/sample-001.js b/src/big-O-complexities/sample-001.js similarity index 100% rename from src/section-big-o/sample-001.js rename to src/big-O-complexities/sample-001.js diff --git a/src/section-big-o/space-complexity.js b/src/big-O-complexities/space-complexity.js similarity index 100% rename from src/section-big-o/space-complexity.js rename to src/big-O-complexities/space-complexity.js From 99bb458df1853b64a5227c1d979107e1a25df7c9 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 6 Dec 2022 16:18:44 +0900 Subject: [PATCH 069/150] PrintLinerTime function implement. --- .../big-O-complexities-01.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/big-O-complexities/big-O-complexities-01.ts b/src/big-O-complexities/big-O-complexities-01.ts index e69de29..6c80e2f 100644 --- a/src/big-O-complexities/big-O-complexities-01.ts +++ b/src/big-O-complexities/big-O-complexities-01.ts @@ -0,0 +1,24 @@ +/** + * Big-O complexities + * + * O(1) is constant time. + * O(1) does not change with respect to input space. + * Hence, O(1) is referred to as being constant time. + * An example of an O(1) algorithm is accessing an item in the array by its index. + * + * O(n) is linear time. + * O(n) is linear time and applies to algorithms that must do n operations in the worst-case scenario. + * + * O(n2) is quadratic time, + * + * O(n3) is cubic time. + + + */ + +// O(n) algorithm is printing numbers from 0 to n-1 +function printLinerTime(n: number) { + for (let i = 0; i < n; i++) { + console.log(i); + } +} From 1f1503e9ccb775c33bc3455b9347d70a39ceec0b Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 6 Dec 2022 16:28:59 +0900 Subject: [PATCH 070/150] printQuadraticTime --- src/big-O-complexities/big-O-complexities-01.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/big-O-complexities/big-O-complexities-01.ts b/src/big-O-complexities/big-O-complexities-01.ts index 6c80e2f..b70d596 100644 --- a/src/big-O-complexities/big-O-complexities-01.ts +++ b/src/big-O-complexities/big-O-complexities-01.ts @@ -22,3 +22,19 @@ function printLinerTime(n: number) { console.log(i); } } + +console.log(printLinerTime(100)); + +// O(n2) is quadratic time, + +function printQuadraticTime(n: number) { + for (let i = 0; i < n; i++) { + // parent loop + for (let j = 0; j < n; j++) { + // children loop + console.log(i, j); + } + } +} + +console.log(printQuadraticTime(10)); From ee9488f7671255800581c737aaac2699a05f2cf5 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 6 Dec 2022 16:38:15 +0900 Subject: [PATCH 071/150] printQuadraticTime --- .../big-O-complexities-01.js | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/big-O-complexities/big-O-complexities-01.js diff --git a/src/big-O-complexities/big-O-complexities-01.js b/src/big-O-complexities/big-O-complexities-01.js new file mode 100644 index 0000000..1f5cb4c --- /dev/null +++ b/src/big-O-complexities/big-O-complexities-01.js @@ -0,0 +1,35 @@ +/** + * Big-O complexities + * + * O(1) is constant time. + * O(1) does not change with respect to input space. + * Hence, O(1) is referred to as being constant time. + * An example of an O(1) algorithm is accessing an item in the array by its index. + * + * O(n) is linear time. + * O(n) is linear time and applies to algorithms that must do n operations in the worst-case scenario. + * + * O(n2) is quadratic time, + * + * O(n3) is cubic time. + + + */ +// O(n) algorithm is printing numbers from 0 to n-1 +function printLinerTime(n) { + for (var i = 0; i < n; i++) { + console.log(i); + } +} +console.log(printLinerTime(100)); +// O(n2) is quadratic time, +function printQuadraticTime(n) { + for (var i = 0; i < n; i++) { + // parent loop + for (var j = 0; j < n; j++) { + // children loop + console.log(i, j); + } + } +} +console.log(printQuadraticTime(10)); From 646c812745a9e1d60534d8224e3f59915f4ad00f Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 6 Dec 2022 16:46:57 +0900 Subject: [PATCH 072/150] printCubicTime implement --- src/big-O-complexities/big-O-complexities-01.js | 14 +++++++++++++- src/big-O-complexities/big-O-complexities-01.ts | 16 +++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/big-O-complexities/big-O-complexities-01.js b/src/big-O-complexities/big-O-complexities-01.js index 1f5cb4c..9d3b3c8 100644 --- a/src/big-O-complexities/big-O-complexities-01.js +++ b/src/big-O-complexities/big-O-complexities-01.js @@ -31,5 +31,17 @@ function printQuadraticTime(n) { console.log(i, j); } } -} +} // console.log(printQuadraticTime(10)); +// O(n3) is cubic time +function printCubicTime(array) { + for (var i = 0; i < array.length; i++) { + for (var j = i; j < array.length; j++) { + for (var k = j; k < array.length; k++) { + console.log(array[i], array[j], array[k]); + } + } + } +} +var cubicTimeArray = ['a', 'b', 'c', 'd', 'e', 'f']; +console.log(printCubicTime(cubicTimeArray)); diff --git a/src/big-O-complexities/big-O-complexities-01.ts b/src/big-O-complexities/big-O-complexities-01.ts index b70d596..87f0d2d 100644 --- a/src/big-O-complexities/big-O-complexities-01.ts +++ b/src/big-O-complexities/big-O-complexities-01.ts @@ -35,6 +35,20 @@ function printQuadraticTime(n: number) { console.log(i, j); } } -} +} // console.log(printQuadraticTime(10)); + +// O(n3) is cubic time + +function printCubicTime(array: string[]) { + for (let i = 0; i < array.length; i++) { + for (let j = i; j < array.length; j++) { + for (let k = j; k < array.length; k++) { + console.log(array[i], array[j], array[k]); + } + } + } +} +const cubicTimeArray = ['a', 'b', 'c', 'd', 'e', 'f']; +console.log(printCubicTime(cubicTimeArray)); From 7bc4bb630d1fe7acd18503ac9edfb6adebd26922 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 6 Dec 2022 17:30:25 +0900 Subject: [PATCH 073/150] big o --- src/big-O-complexities/big-O-complexities-01.js | 13 +++++++++++++ src/big-O-complexities/big-O-complexities-01.ts | 16 ++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/big-O-complexities/big-O-complexities-01.js b/src/big-O-complexities/big-O-complexities-01.js index 9d3b3c8..de9d1f1 100644 --- a/src/big-O-complexities/big-O-complexities-01.js +++ b/src/big-O-complexities/big-O-complexities-01.js @@ -12,6 +12,9 @@ * O(n2) is quadratic time, * * O(n3) is cubic time. + * + * logarithmic time complexity + * is printing elements that are a power of 2 between 2 and n */ @@ -45,3 +48,13 @@ function printCubicTime(array) { } var cubicTimeArray = ['a', 'b', 'c', 'd', 'e', 'f']; console.log(printCubicTime(cubicTimeArray)); +/** + * The efficiency of logarithmic time complexities is apparent with large inputs such as a million items. + * Although n is a million, exampleLogarithmic will print only 19 items because log2(1,000,000) = 19.9315686. + */ +function printLogarithmic(n) { + for (var i = 2; i <= n; i = i * 2) { + console.log(i); + } +} +printLogarithmic(1000000); diff --git a/src/big-O-complexities/big-O-complexities-01.ts b/src/big-O-complexities/big-O-complexities-01.ts index 87f0d2d..a55f196 100644 --- a/src/big-O-complexities/big-O-complexities-01.ts +++ b/src/big-O-complexities/big-O-complexities-01.ts @@ -12,6 +12,9 @@ * O(n2) is quadratic time, * * O(n3) is cubic time. + * + * logarithmic time complexity + * is printing elements that are a power of 2 between 2 and n */ @@ -52,3 +55,16 @@ function printCubicTime(array: string[]) { } const cubicTimeArray = ['a', 'b', 'c', 'd', 'e', 'f']; console.log(printCubicTime(cubicTimeArray)); + +/** + * The efficiency of logarithmic time complexities is apparent with large inputs such as a million items. + * Although n is a million, exampleLogarithmic will print only 19 items because log2(1,000,000) = 19.9315686. + */ + +function printLogarithmic(n: number) { + for (let i = 2; i <= n; i = i * 2) { + console.log(i); + } +} + +printLogarithmic(1000000); From f7513093f6734cacf154f90099f89998e2b0bc41 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 7 Dec 2022 12:41:27 +0900 Subject: [PATCH 074/150] log --- src/big-O-complexities/big-O-complexities-01.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/big-O-complexities/big-O-complexities-01.ts b/src/big-O-complexities/big-O-complexities-01.ts index a55f196..8e08667 100644 --- a/src/big-O-complexities/big-O-complexities-01.ts +++ b/src/big-O-complexities/big-O-complexities-01.ts @@ -13,6 +13,7 @@ * * O(n3) is cubic time. * + * O(log(n)) * logarithmic time complexity * is printing elements that are a power of 2 between 2 and n @@ -57,6 +58,7 @@ const cubicTimeArray = ['a', 'b', 'c', 'd', 'e', 'f']; console.log(printCubicTime(cubicTimeArray)); /** + * O(log(n)) * The efficiency of logarithmic time complexities is apparent with large inputs such as a million items. * Although n is a million, exampleLogarithmic will print only 19 items because log2(1,000,000) = 19.9315686. */ From 5d8b148afcd553a6e5da849572b45e3474c88e5b Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 7 Dec 2022 14:49:30 +0900 Subject: [PATCH 075/150] Coefficient Rule explain --- src/big-O-complexities/big-o-rule.ts | 76 ++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/big-O-complexities/big-o-rule.ts diff --git a/src/big-O-complexities/big-o-rule.ts b/src/big-O-complexities/big-o-rule.ts new file mode 100644 index 0000000..86998be --- /dev/null +++ b/src/big-O-complexities/big-o-rule.ts @@ -0,0 +1,76 @@ +/** + * Big-O Rule + * + * 1. Coefficient rule + * 2. Sum rule + * 3. Product rule + * 4. Transitive rule + * 5. Polynomial rule + * 6. Log of a power rule + */ + +/** + * + * 1. Coefficient Rule. + * + * Coefficient simply requires you to ignore any non-input-size-related constants. + * Coefficients in Big-O are negligible with large input sizes. + * Any constants are negligible in Big-O notation. + */ + +// Coefficient Rule example 01 +function coefficientRuleOne(n: number) { + let count: number = 0; // O(1) + for (let i = 0; i < n; i++) { + // O(n) + count += 1; // O(n) + } + return count; // O(1) +} + +/** + * BIG O Calculation + * 1 + 1 ==> "O(1)" is 2 times + * n + n ==> "O(n)" is 2 times. + * 2*2n + * O(n) ==> Remove constants/ + */ + +function coefficientRuleOneTwo(limit: number) { + const a: number = 5; // O(1) + const b: number = 10; // O(1) + const c: number = 50; // O(1) + + for (let i = 0; i < limit; i++) { + // O(n) ***TODO:If we include for loop + let x = i + 1; // O(n) + let y = i + 1; // O(n) + let z = i + 1; // O(n) + } + + for (let j = 0; j < limit; j++) { + // O(n) ***TODO:If we include for loop + let p = j * 2; // O(n) + let q = j * 2; // O(n) + } + + const whoAmI = "I don't Know"; // O(1) +} + +/** + * BIG O Calculation + * 4 => "O(1)" Four big O + * 7 => "O(n)" Seven big O n + * n + n + n + n + n + n + n => "O(n)" + * 4 + 7n + * + * BIG O(4 + 7n) TODO: if we calculate for loop step + * O(4 + 7n) === O(n) equivalence to O(n) + * n + n + n + n + n => "O(n)" + * BIG O(4 + 5n) TODO: no for loop + * O(4 + 5n) === O(n) equivalence to O(n) + */ + +/** + * 2. Sum Rule + */ From a1707959117040ed8457d19c258efad4401ab778 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 7 Dec 2022 14:59:37 +0900 Subject: [PATCH 076/150] sumRule --- src/big-O-complexities/big-o-rule.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/big-O-complexities/big-o-rule.ts b/src/big-O-complexities/big-o-rule.ts index 86998be..54c7964 100644 --- a/src/big-O-complexities/big-o-rule.ts +++ b/src/big-O-complexities/big-o-rule.ts @@ -73,4 +73,31 @@ function coefficientRuleOneTwo(limit: number) { /** * 2. Sum Rule + * Imagine a master algorithm that involves two other algorithms. + * The Big-O notation of that master algorithm is simply the sum of the other two Big-O notations. + */ + +function sumRule(boxes: string[], items: number[]) { + // For boxes iteration + boxes.forEach(element => { + // O(n) + console.log(element); + }); + + // For items iteration + items.forEach(element => { + // O(n) + console.log(element); + }); +} + +/** + * BIG O Calculation + * O(n + n) + * O( a + b ) + */ + +/** + * Product Rule + * */ From 53325abed1aab205944483be331f6b675c04c5dd Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 7 Dec 2022 15:06:04 +0900 Subject: [PATCH 077/150] productRuleOne --- src/big-O-complexities/big-o-rule.ts | 32 ++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/big-O-complexities/big-o-rule.ts b/src/big-O-complexities/big-o-rule.ts index 54c7964..e5b3711 100644 --- a/src/big-O-complexities/big-o-rule.ts +++ b/src/big-O-complexities/big-o-rule.ts @@ -92,12 +92,40 @@ function sumRule(boxes: string[], items: number[]) { } /** - * BIG O Calculation + * BIG O Calculation * O(n + n) * O( a + b ) */ /** * Product Rule - * + * The product rule simply states how Big-Os can be multiplied. + */ + +function productRuleOne(boxes: string | number[]) { + for (let i = 0; i < boxes.length; i++) { + // O(n) + for (let j = 0; j < boxes.length; j++) { + // O(n) + console.log(boxes[i], boxes[j]); + } + } +} + +function productRuleTwo(n: number) { + var count = 0; + for (var i = 0; i < n; i++) { + count += 1; // O(n) + for (var i = 0; i < 5 * n; i++) { + count += 1; // O(n) + } + } + return count; +} + +/** + * BIG O Calculation + * O(n * n) + * O(n^2) + * O(n^2) is called Quadratic Time */ From f6c2be8814ee65a6f9316abce036b0bba5fbed98 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 7 Dec 2022 15:07:35 +0900 Subject: [PATCH 078/150] change variable name --- src/big-O-complexities/big-o-rule.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/big-O-complexities/big-o-rule.ts b/src/big-O-complexities/big-o-rule.ts index e5b3711..0309ddc 100644 --- a/src/big-O-complexities/big-o-rule.ts +++ b/src/big-O-complexities/big-o-rule.ts @@ -113,10 +113,10 @@ function productRuleOne(boxes: string | number[]) { } function productRuleTwo(n: number) { - var count = 0; - for (var i = 0; i < n; i++) { + let count = 0; + for (let i = 0; i < n; i++) { count += 1; // O(n) - for (var i = 0; i < 5 * n; i++) { + for (let j = 0; j < 5 * n; j++) { count += 1; // O(n) } } From 6104ebcb16d77784f86a41999b3ec01791aa115f Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 7 Dec 2022 15:24:35 +0900 Subject: [PATCH 079/150] polynomialRule --- src/big-O-complexities/big-o-rule.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/big-O-complexities/big-o-rule.ts b/src/big-O-complexities/big-o-rule.ts index 0309ddc..f848df7 100644 --- a/src/big-O-complexities/big-o-rule.ts +++ b/src/big-O-complexities/big-o-rule.ts @@ -1,4 +1,5 @@ /** + * Big-O is important for analyzing and comparing the efficiencies of algorithms. * Big-O Rule * * 1. Coefficient rule @@ -98,7 +99,7 @@ function sumRule(boxes: string[], items: number[]) { */ /** - * Product Rule + * 3. Product Rule * The product rule simply states how Big-Os can be multiplied. */ @@ -129,3 +130,20 @@ function productRuleTwo(n: number) { * O(n^2) * O(n^2) is called Quadratic Time */ + +/** + * 4. Polynomial Rule + * If f(n) is a polynomial of degree k, then f(n) is O(nˆk). + * The following code block has only one for loop with quadratic time complexity f(n) = nˆ2 because line 4 runs n*n iterations + */ + +function polynomialRule(n: number) { + let count = 0; + for (let i = 0; i < n * n; i++) { + count += 1; + } + return count; +} + +// O(n^2) +// O(n^n) From fe4d461876d286f9440a6377f7e0788dc8e35e9d Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 7 Dec 2022 15:52:36 +0900 Subject: [PATCH 080/150] example added --- src/big-O-complexities/big-o-rule.ts | 72 +++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/src/big-O-complexities/big-o-rule.ts b/src/big-O-complexities/big-o-rule.ts index f848df7..7171e6d 100644 --- a/src/big-O-complexities/big-o-rule.ts +++ b/src/big-O-complexities/big-o-rule.ts @@ -145,5 +145,75 @@ function polynomialRule(n: number) { return count; } -// O(n^2) // O(n^n) +// O(n^2) + +/** + * Exercises + * Calculate the time complexities for each of the exercise code + */ + +// Exercise 01 + +function exercisesOne(n: number) { + for (let i = 0; i < n * 1000; i++) { + // O(n) + for (let j = 0; j < n * 2; j++) { + // O(n) + console.log(i, j); + } + } +} // O(n^2) + +// Exercise 02 +function exercisesTwo(n: number) { + for (let i = 0; i < n; i++) { + // O(n) + for (let j = 0; j < n; j++) { + // O(n) + for (let k = 0; k < n; k++) { + // O(n) + for (let l = 0; l < 10; l++) { + // O(10) constant time iteration + console.log(i, j, k, l); + } + } + } + } +} + +// O(n^3*10) +// O(n^3) + +// Exercise 03 + +function exercisesThree(): void { + for (let i = 0; i < 1000; i++) { + // O(1000) constant time iteration + console.log('Hi'); + } // +} // O(1) + +// Exercise 04 +function exercisesFour(n: number): void { + for (let i = 0; i < n * 10; i++) { + // O(n * 10) + console.log('Hi'); + } // +} // O(n * 10) === O(n) remove constant. + +// Exercise 05 +function exercisesFive(n: number): void { + for (let i = 0; i < n; i * 2) { + // O(log2n) + console.log(i); + } // +} // O(log2n) log 2 base n. For a given n, this will operate only log2n times because i is incremented by multiplying by 2 + +// Exercise 06 +function exercisesSix(): void { + while (true) { + // O(∞) Infinite loop + console.log('hello'); + } +} // O(∞) From 071f1d8875c083d76d47fa601bd515809617a825 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Fri, 9 Dec 2022 12:20:35 +0900 Subject: [PATCH 081/150] implement isEquivalent object --- src/problems/is-equivalent-object.ts | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/problems/is-equivalent-object.ts diff --git a/src/problems/is-equivalent-object.ts b/src/problems/is-equivalent-object.ts new file mode 100644 index 0000000..8ad3f12 --- /dev/null +++ b/src/problems/is-equivalent-object.ts @@ -0,0 +1,25 @@ +// implementation of some property-based equality checking where each property of the object is compared. + +function isEquivalentObj(a: { [key: string]: number | string }, b: { [key: string]: number | string }) { + // Arrays of property names. + const aProps = Object.getOwnPropertyNames(a); + const bProps = Object.getOwnPropertyNames(b); + + // If their property lengths are different, they're different objects + if (aProps.length != bProps.length) { + return false; + } + + for (let i = 0; i < aProps.length; i++) { + let propName = aProps[i]; + // If the values of the property are different, not equal + if (a[propName] !== b[propName]) { + return false; + } + } + + // If everything matched, correct + return true; +} + +isEquivalentObj({ hi: 12 }, { hi: 12 }); // Return true. From 556762ba2ff849a5dc521a02643f1f33d46044e8 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Fri, 9 Dec 2022 18:40:46 +0900 Subject: [PATCH 082/150] update --- src/problems/is-equivalent-object.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/problems/is-equivalent-object.ts b/src/problems/is-equivalent-object.ts index 8ad3f12..4f9dd7a 100644 --- a/src/problems/is-equivalent-object.ts +++ b/src/problems/is-equivalent-object.ts @@ -21,5 +21,5 @@ function isEquivalentObj(a: { [key: string]: number | string }, b: { [key: strin // If everything matched, correct return true; } - +// However, this would still work for objects that have only a string or a number as the property. isEquivalentObj({ hi: 12 }, { hi: 12 }); // Return true. From 2ce0c447c1af58170c2ad94d11632fbf19cddb43 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Fri, 9 Dec 2022 19:33:11 +0900 Subject: [PATCH 083/150] prime --- src/problems/isPrime.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/problems/isPrime.ts diff --git a/src/problems/isPrime.ts b/src/problems/isPrime.ts new file mode 100644 index 0000000..e594983 --- /dev/null +++ b/src/problems/isPrime.ts @@ -0,0 +1,30 @@ +// A primality test can be done by iterating from 2 to n, checking whether modulus division (remainder) is equal to zero. +function isPrime(n: number) { + if (n <= 1) { + return false; + } + + // check from 2 to n - 1; + for (let i = 2; i < n; i++) { + if (n % i == 0) { + return false; + } + } + + return true; +} // Time complexity: O(n) + +function isPrime01(n: number) { + if (n <= 1) return false; + if (n <= 3) return true; + + // This is checked so that we can skip + // Middle five numbers in below loop + + if (n % 2 == 0 || n % 3 == 0) return false; + + for (let i = 5; i * i <= n; i = i + 6) { + if (n % i == 0 || n % (i + 2) == 0) return false; + } + return true; +} // O(sqrt(n)) From 6497fda196aebec5a32a4ff7f5b7706cbcdc8ff8 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 12 Dec 2022 11:18:10 +0900 Subject: [PATCH 084/150] Number Algorithms --- src/problems/isPrime-01.ts | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/problems/isPrime-01.ts diff --git a/src/problems/isPrime-01.ts b/src/problems/isPrime-01.ts new file mode 100644 index 0000000..bb76c49 --- /dev/null +++ b/src/problems/isPrime-01.ts @@ -0,0 +1,36 @@ +/** + * + * Number Algorithms + * One of the most discussed algorithms involving numbers is for testing whether a number is a prime number.. + * @returns + */ +// A primality test can be done by iterating from 2 to n, checking whether modulus division (remainder) is equal to zero. +function isPrimeOne(n: number) { + if (n <= 1) { + return false; + } + + // check from 2 to n - 1; + for (let i = 2; i < n; i++) { + if (n % i == 0) { + return false; + } + } + + return true; +} // Time complexity: O(n) + +function isPrimeTwo(n: number) { + if (n <= 1) return false; + if (n <= 3) return true; + + // This is checked so that we can skip + // Middle five numbers in below loop + + if (n % 2 == 0 || n % 3 == 0) return false; + + for (let i = 5; i * i <= n; i = i + 6) { + if (n % i == 0 || n % (i + 2) == 0) return false; + } + return true; +} // O(sqrt(n)) From ab0f414ff81e2dbd20a6dd00dfdcf0603a595700 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 12 Dec 2022 12:20:53 +0900 Subject: [PATCH 085/150] prime number --- src/problems/isPrime-01.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/problems/isPrime-01.ts b/src/problems/isPrime-01.ts index bb76c49..96a8cd8 100644 --- a/src/problems/isPrime-01.ts +++ b/src/problems/isPrime-01.ts @@ -4,7 +4,8 @@ * One of the most discussed algorithms involving numbers is for testing whether a number is a prime number.. * @returns */ -// A primality test can be done by iterating from 2 to n, checking whether modulus division (remainder) is equal to zero. +// Algorithm 01: A primality test can be done by iterating from 2 to n, checking whether modulus division (remainder) is equal to zero. +// 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97 function isPrimeOne(n: number) { if (n <= 1) { return false; From be6d35c25449a305c6f33e2caf520a49c0fa67e4 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 12 Dec 2022 15:19:36 +0900 Subject: [PATCH 086/150] primeFactors --- src/problems/isPrime-01.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/problems/isPrime-01.ts b/src/problems/isPrime-01.ts index 96a8cd8..89c9656 100644 --- a/src/problems/isPrime-01.ts +++ b/src/problems/isPrime-01.ts @@ -35,3 +35,25 @@ function isPrimeTwo(n: number) { } return true; } // O(sqrt(n)) + +function primeFactors(n: number) { + // Print the number of 2s that divide n + while (n % 2 == 0) { + console.log(2); + n = n / 2; + } + + // n must be odd at this point. So we can skip one element + // note i = i + 2; + for (let i = 3; i * i <= n; i = i + 2) { + // While i divides n, print i and divide n + while (n % i == 0) { + console.log(i); + n = n / i; + } + } + // This condition is to handle the case when n is a prime number greater than 2 + if (n > 2) { + console.log(n); + } +} // O(sqrt(n)) From 55e0299e2322c4069b23c730a0caf512c2e7b52f Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 12 Dec 2022 15:36:22 +0900 Subject: [PATCH 087/150] prime --- src/problems/isPrime-01.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/problems/isPrime-01.ts b/src/problems/isPrime-01.ts index 89c9656..d7ccc3e 100644 --- a/src/problems/isPrime-01.ts +++ b/src/problems/isPrime-01.ts @@ -57,3 +57,8 @@ function primeFactors(n: number) { console.log(n); } } // O(sqrt(n)) + +// Random Number Generator +Math.random() * 100; // floats between 0 and 100; +Math.random() * 25 + 5; // floats between 5 and 30 +Math.random() * 10 - 100; // floats between -100 and -90 From a3ed3231bbba93b83cb69d2025429fe5d6c41b45 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 12 Dec 2022 18:17:41 +0900 Subject: [PATCH 088/150] modularExponentiation method implement --- src/{problems => exercises/number}/isPrime-01.ts | 0 src/{problems => exercises/number}/isPrime.ts | 0 src/exercises/number/modularExponentiation.ts | 3 +++ 3 files changed, 3 insertions(+) rename src/{problems => exercises/number}/isPrime-01.ts (100%) rename src/{problems => exercises/number}/isPrime.ts (100%) create mode 100644 src/exercises/number/modularExponentiation.ts diff --git a/src/problems/isPrime-01.ts b/src/exercises/number/isPrime-01.ts similarity index 100% rename from src/problems/isPrime-01.ts rename to src/exercises/number/isPrime-01.ts diff --git a/src/problems/isPrime.ts b/src/exercises/number/isPrime.ts similarity index 100% rename from src/problems/isPrime.ts rename to src/exercises/number/isPrime.ts diff --git a/src/exercises/number/modularExponentiation.ts b/src/exercises/number/modularExponentiation.ts new file mode 100644 index 0000000..18d3d66 --- /dev/null +++ b/src/exercises/number/modularExponentiation.ts @@ -0,0 +1,3 @@ +function modularExponentiation(base: number, exponent: number, modulus: number): number { + return Math.pow(base, exponent) % modulus; +} From d734d1491240b9a0e955437eb5de3db6fb8535f3 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 12 Dec 2022 18:49:51 +0900 Subject: [PATCH 089/150] allPrimesLessThanN --- src/exercises/number/modularExponentiation.ts | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/exercises/number/modularExponentiation.ts b/src/exercises/number/modularExponentiation.ts index 18d3d66..f27e5e4 100644 --- a/src/exercises/number/modularExponentiation.ts +++ b/src/exercises/number/modularExponentiation.ts @@ -1,3 +1,59 @@ +/** + * 1. + * Given three numbers x, y, and p, compute (xˆy) % p. (This is modular exponentiation.) + * Here, x is the base, y is exponent, and p is the modulus. + * Modular exponentiation is a type of exponentiation performed over a modulus, + * which is useful in computer science and used in the field of public-key encryption algorithms + * + * @param base + * @param exponent + * @param modulus + * @returns + */ function modularExponentiation(base: number, exponent: number, modulus: number): number { return Math.pow(base, exponent) % modulus; } + +function modularExponentiation01(base: number, exponent: number, modulus: number): number { + if (modulus == 1) return 0; + + let value = 1; + + for (let i = 0; i < exponent; i++) { + value = (value * base) % modulus; + } + + return value; +} + +/** + * 2. + * Print all primes lass than n. + * + * Simply iterate from 0 to n and print any prime numbers where isPrime() evaluates to true. + * + */ + +function allPrimesLessThanN(n: number): void { + for (let i = 0; i < n; i++) { + if (isPrimeNumber(i)) { + console.log(i); + } + } +} // time complexity of O(n sqrt(n)) is run n times. + +function isPrimeNumber(number: number): boolean { + if (number <= 1) return false; + if (number <= 3) return true; + + // This is checked so that we can skip + // middle five number in below loop + + for (let i = 5; i * i < number; i = i + 6) { + if (number % i == 0 || number % (i + 2) == 0) { + return false; + } + } + + return true; +} // time complexity of O(sqrt(n)) is run n times. From 8a00dcab2f542d97d37c3cd8837fe0488490e589 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 13 Dec 2022 11:13:18 +0900 Subject: [PATCH 090/150] maxDivide --- src/exercises/number/modularExponentiation.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/exercises/number/modularExponentiation.ts b/src/exercises/number/modularExponentiation.ts index f27e5e4..21d80a9 100644 --- a/src/exercises/number/modularExponentiation.ts +++ b/src/exercises/number/modularExponentiation.ts @@ -57,3 +57,17 @@ function isPrimeNumber(number: number): boolean { return true; } // time complexity of O(sqrt(n)) is run n times. + +/** + * 3. + * + * Check for a set of prime factors. + * + */ + +function maxDivide(number: number, divisor: number) { + while (number % divisor == 0) { + number /= divisor; + } + return number; +} From e3c87b0e94c384d4a9eb0120826be62edeca8a6e Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 13 Dec 2022 15:23:25 +0900 Subject: [PATCH 091/150] arrayNUglyNumbers --- src/exercises/number/modularExponentiation.ts | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/exercises/number/modularExponentiation.ts b/src/exercises/number/modularExponentiation.ts index 21d80a9..a2cf8d4 100644 --- a/src/exercises/number/modularExponentiation.ts +++ b/src/exercises/number/modularExponentiation.ts @@ -63,11 +63,45 @@ function isPrimeNumber(number: number): boolean { * * Check for a set of prime factors. * + * The time complexity of maxDivide is a logarithmic function which depends on divisor and the number. + * When testing primes of 2, 3, and 5, the logarithmic of 2 (log2 (n)) yields the highest time complexity. */ -function maxDivide(number: number, divisor: number) { +function maxDivide(number: number, divisor: number): number { while (number % divisor == 0) { number /= divisor; } return number; -} +} // Time Complexity for maxDivide(number, divisor): O(logdivisor(number)) + +function isUgly(number: number): boolean { + number = maxDivide(number, 2); + number = maxDivide(number, 3); + number = maxDivide(number, 5); + + return number === 1; +} // Time Complexity for isUgly: O(log2(n)) + +/** + * Iterate this over n, and now the list of ugly numbers can be returned. + * @param n + * @returns + * + * The isUgly function is limited by the time complexity of maxDivide(number, 2). + * Hence, arrayNUglyNumbers has n times that time complexity. + */ + +function arrayNUglyNumbers(n: number): number[] { + let counter: number = 0; + let currentNumber: number = 1; + let uglyNumbers: number[] = []; + + while (counter != n) { + if (isUgly(currentNumber)) { + counter++; + uglyNumbers.push(currentNumber); + } + currentNumber++; + } + return uglyNumbers; +} // Time Complexity for arrayNUglyNumbers: O(n(log2(n))) From 2b175fed828fb84561e82362ae8d25e745ca6008 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 13 Dec 2022 18:51:50 +0900 Subject: [PATCH 092/150] string comparison. --- src/exercises/string/exercise-01.ts | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/exercises/string/exercise-01.ts diff --git a/src/exercises/string/exercise-01.ts b/src/exercises/string/exercise-01.ts new file mode 100644 index 0000000..f3c689d --- /dev/null +++ b/src/exercises/string/exercise-01.ts @@ -0,0 +1,2 @@ +let a = 'a'; +let b = 'b'; From 305e4e34c3dd2438c9fae20471f19f2b878a1d67 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 14 Dec 2022 11:15:41 +0900 Subject: [PATCH 093/150] JavaScript String Primitive --- src/exercises/string/exercise-01.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/exercises/string/exercise-01.ts b/src/exercises/string/exercise-01.ts index f3c689d..a2a32c6 100644 --- a/src/exercises/string/exercise-01.ts +++ b/src/exercises/string/exercise-01.ts @@ -1,2 +1,15 @@ -let a = 'a'; -let b = 'b'; +/** + * JavaScript String Primitive + * JavaScript's native String primitive comes with various common string functions. + * + * 1. String Access + * 2. String Comparison + * 3. String Search + * 4. String Decomposition + * 5. String Replace + */ + +// 1. String Access +'Hello world'.charAt(1); // returns 'e'; +'YouTube'.substring(1, 2); // returns 'o' : multiple-character access. +'YouTube'.substring(3, 7); // returns 'Tube' From e8125318319816dbf1f5431cd955388e32d8d0cc Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 14 Dec 2022 11:18:54 +0900 Subject: [PATCH 094/150] String Access --- src/exercises/string/exercise-01.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/exercises/string/exercise-01.ts b/src/exercises/string/exercise-01.ts index a2a32c6..f795d4a 100644 --- a/src/exercises/string/exercise-01.ts +++ b/src/exercises/string/exercise-01.ts @@ -13,3 +13,6 @@ 'Hello world'.charAt(1); // returns 'e'; 'YouTube'.substring(1, 2); // returns 'o' : multiple-character access. 'YouTube'.substring(3, 7); // returns 'Tube' +'YouTube'.substring(1); // returns 'ouTube' + +// 2. String Comparison From d1a04ac1c6a76e4b4aa343883c9ed06bfbada9fb Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 14 Dec 2022 11:30:23 +0900 Subject: [PATCH 095/150] String Comparison --- src/exercises/string/exercise-01.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/exercises/string/exercise-01.ts b/src/exercises/string/exercise-01.ts index f795d4a..a9645b6 100644 --- a/src/exercises/string/exercise-01.ts +++ b/src/exercises/string/exercise-01.ts @@ -16,3 +16,12 @@ 'YouTube'.substring(1); // returns 'ouTube' // 2. String Comparison +const a = 'a'; +const b = 'b'; + +console.log(a < b); // Prints true; + +const c = 'add'; +const d = 'ab'; + +console.log(a < b); // Prints 'false' From 118c216b747dd3668fc88a7a52987278fb57eb4f Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 14 Dec 2022 12:20:14 +0900 Subject: [PATCH 096/150] String Search --- src/exercises/string/exercise-01.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/exercises/string/exercise-01.ts b/src/exercises/string/exercise-01.ts index a9645b6..85f31ef 100644 --- a/src/exercises/string/exercise-01.ts +++ b/src/exercises/string/exercise-01.ts @@ -25,3 +25,30 @@ const c = 'add'; const d = 'ab'; console.log(a < b); // Prints 'false' + +// String Search + +'Red Dragon'.indexOf('Red'); // returns 0; +'Red Dragon'.indexOf('RedScale'); // returns -1 +'Red Dragon'.indexOf('Dragon', 0); // returns 4 + +function existsInString(stringValue: string, search: string) { + return stringValue.indexOf(search) !== -1; +} + +console.log(existsInString('red', 'r')); // prints 'true'; +console.log(existsInString('red', 'b')); // prints 'false'; + +const stringLong = 'He is my king from this day until his last day'; +let count = 0; +let pos = stringLong.indexOf('a'); + +while (pos !== -1) { + count++; + pos = stringLong.indexOf('a', pos + 1); +} + +console.log(count); + +'Red Dragon'.startsWith('Red'); // Returns true +'Red Dragon'.endsWith('Dragon'); // Returns true From 1b37294192431cdbbef321a7d5d6f5a54129ef29 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 15 Dec 2022 10:46:32 +0900 Subject: [PATCH 097/150] String Decomposition --- src/exercises/string/exercise-01.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/exercises/string/exercise-01.ts b/src/exercises/string/exercise-01.ts index 85f31ef..539a16a 100644 --- a/src/exercises/string/exercise-01.ts +++ b/src/exercises/string/exercise-01.ts @@ -26,7 +26,7 @@ const d = 'ab'; console.log(a < b); // Prints 'false' -// String Search +// 3. String Search 'Red Dragon'.indexOf('Red'); // returns 0; 'Red Dragon'.indexOf('RedScale'); // returns -1 @@ -52,3 +52,14 @@ console.log(count); 'Red Dragon'.startsWith('Red'); // Returns true 'Red Dragon'.endsWith('Dragon'); // Returns true + +// 04. String Decomposition +const commaString = 'chicken,noodle,soup,broth'; +commaString.split(','); // returns ["chicken", "noodle", "soup", "broth"] + +const onlyString = 'chicken'; +onlyString.split(''); + +// 05. String Replace +// .replace(string, replaceString) replaces a specified string within a string variable with another string. +'Wizard of Oz'.replace('Wizard', 'Witch'); // 'Witch of Oz'; From e2fa5b0e62b9ba1227d0f2fbf912c744fa595dea Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 15 Dec 2022 11:39:33 +0900 Subject: [PATCH 098/150] Regular Expressions --- .../regular-expressions-101.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/exercises/regular-expressions/regular-expressions-101.ts diff --git a/src/exercises/regular-expressions/regular-expressions-101.ts b/src/exercises/regular-expressions/regular-expressions-101.ts new file mode 100644 index 0000000..0f9dfe5 --- /dev/null +++ b/src/exercises/regular-expressions/regular-expressions-101.ts @@ -0,0 +1,20 @@ +/** + * Regular Expressions + * + * Regular expressions (regexes) are a set of characters that define a search pattern. + * + * The constructor for the RegExp object takes two parameters: + * the regular expression and the optional match settings, as shown here: + * + * i ==> Perform case-insensitive matching + * g ==> Perform a global match (find all matches rather than stopping after first match) + * m ==> Perform multiline matching + * + * RegExp has the following two functions: + * 1. search(): Tests for matches in a string. This returns the index of the match. + * 2. match(): Tests for matches. This returns all the matches. + * + * The JavaScript String object also has the following two regex-related functions that accept the RegExp object as an argument: + * 1. exec(): Tests for matches in a string. This returns the first match. + * 2. test(): Tests for matches in a string. This returns true or false. + */ From 65843e5b6b232bc1b419c7b19c504d3f3edc3cf4 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 15 Dec 2022 12:35:35 +0900 Subject: [PATCH 099/150] Query String --- .../regular-expressions-101.ts | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/exercises/regular-expressions/regular-expressions-101.ts b/src/exercises/regular-expressions/regular-expressions-101.ts index 0f9dfe5..74d1960 100644 --- a/src/exercises/regular-expressions/regular-expressions-101.ts +++ b/src/exercises/regular-expressions/regular-expressions-101.ts @@ -18,3 +18,44 @@ * 1. exec(): Tests for matches in a string. This returns the first match. * 2. test(): Tests for matches in a string. This returns true or false. */ + +// The following are five regexes that developers often use. + +// 1. Any Numeric Characters +const numeric = /\d+/; +numeric.test('123444'); // returns true +numeric.test('333ass'); // returns true +numeric.test('5asdasd'); // returns true +numeric.test('asdasd'); // returns false + +// 2. Only Numeric Characters +const onlyNumeric = /^\d+$/; +onlyNumeric.test('123'); // true +onlyNumeric.test('123a'); // false +onlyNumeric.test('a'); // false + +// 3. Floating Numeric Characters +const floatNumeric = /^[0-9]*.[0-9]*[1-9]+$/; + +floatNumeric.test('12'); // true +floatNumeric.test('1'); // false +floatNumeric.test('12.3'); // true + +// 4. Only Alpha Numeric Characters +const alphaNumeric = /[a-zA-Z0-9]/; +alphaNumeric.test('somethingELSE'); // true +alphaNumeric.test('hello'); // true +alphaNumeric.test('112a'); // true +alphaNumeric.test('112'); // true +alphaNumeric.test('^'); // false + +// 5. Query String + +const url = 'http://your.domain/product.aspx?category=4&product_id=2140&query=lcd+tv'; +let queryString = {}; +url.replace(new RegExp('([^?=&]+)(=([^&]*))?', 'g'), function ($0, $1, $2, $3) { + queryString[$1] = $3; +}); +console.log(queryString); + +// http://your.domain/product.aspx: undefined, category: '4', product_id: '2140', query: 'lcd+tv' From 6acaeab934fe5b7d2e9578db6f6916796ef0399e Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Fri, 16 Dec 2022 12:18:41 +0900 Subject: [PATCH 100/150] shortening --- src/exercises/string/shortening.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/exercises/string/shortening.ts diff --git a/src/exercises/string/shortening.ts b/src/exercises/string/shortening.ts new file mode 100644 index 0000000..0de4a29 --- /dev/null +++ b/src/exercises/string/shortening.ts @@ -0,0 +1,7 @@ +/** + * Have you ever wondered how URL-shortening sites such as Bit.ly work? A simplified URL compression algorithm follows a certain structure, + * + * For the shortening part, the following algorithm can be used. + * There are 62 possible letters and numbers, + * consisting of 26 lowercase letters, 26 uppercase letters, and 10 numbers (0 to 9). + */ From 44f4d73db3e8d61e707b1e285483cf714e85d5a4 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Fri, 16 Dec 2022 12:50:36 +0900 Subject: [PATCH 101/150] encodeId --- src/exercises/string/shortening.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/exercises/string/shortening.ts b/src/exercises/string/shortening.ts index 0de4a29..a95c269 100644 --- a/src/exercises/string/shortening.ts +++ b/src/exercises/string/shortening.ts @@ -5,3 +5,29 @@ * There are 62 possible letters and numbers, * consisting of 26 lowercase letters, 26 uppercase letters, and 10 numbers (0 to 9). */ + +const DICTIONARY = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.split(''); + +function encodeId(id: number) { + const base = DICTIONARY.length; + let encoded: string | number = ''; + + if (id === 0) { + return DICTIONARY[0]; + } + + while (id > 0) { + encoded += DICTIONARY[id % base]; + id = Math.floor(id / base); + } + + return reverseWord(encoded); +} + +function reverseWord(str: string) { + let reversed: string = ''; + for (let i = str.length - 1; i >= 0; i--) { + reversed += str.charAt(i); + } + return reversed; +} From 26925ed59ee45c68c74c3de3f7fd64d07d69794c Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Mon, 19 Dec 2022 11:30:42 +0900 Subject: [PATCH 102/150] encode decode --- src/exercises/string/shortening-by-decode-id.ts | 15 +++++++++++++++ .../{shortening.ts => shortening-by-encode-id.ts} | 0 2 files changed, 15 insertions(+) create mode 100644 src/exercises/string/shortening-by-decode-id.ts rename src/exercises/string/{shortening.ts => shortening-by-encode-id.ts} (100%) diff --git a/src/exercises/string/shortening-by-decode-id.ts b/src/exercises/string/shortening-by-decode-id.ts new file mode 100644 index 0000000..1cc3997 --- /dev/null +++ b/src/exercises/string/shortening-by-decode-id.ts @@ -0,0 +1,15 @@ +const DICTIONARY01 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'.split(''); + +function decodeId(id: string) { + const base: number = DICTIONARY01.length; + let decoded: string | number = 0; + + for (let i = 0; i < id.split('').length; i++) { + decoded = decoded * base + DICTIONARY01.indexOf(id.charAt(i)); + } + + return decoded; +} + +console.log(encodeId(11231230)); // prints 'VhU2' +console.log(decodeId('VhU2')); // prints '11231230' diff --git a/src/exercises/string/shortening.ts b/src/exercises/string/shortening-by-encode-id.ts similarity index 100% rename from src/exercises/string/shortening.ts rename to src/exercises/string/shortening-by-encode-id.ts From c84ab86a43e3af3888bcb9073dfd84cba483d469 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Thu, 22 Dec 2022 12:22:32 +0900 Subject: [PATCH 103/150] array first constent --- src/exercises/arrays/array-01.ts | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/exercises/arrays/array-01.ts diff --git a/src/exercises/arrays/array-01.ts b/src/exercises/arrays/array-01.ts new file mode 100644 index 0000000..439e354 --- /dev/null +++ b/src/exercises/arrays/array-01.ts @@ -0,0 +1 @@ +const arrayInit: number[] = [1, 2, 3, 4]; From bdaa1150593b2f8bb1bcb291dec29a0b0509c0e7 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 27 Dec 2022 12:19:48 +0900 Subject: [PATCH 104/150] array introduction --- src/exercises/arrays/array-01.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/exercises/arrays/array-01.ts b/src/exercises/arrays/array-01.ts index 439e354..f82835f 100644 --- a/src/exercises/arrays/array-01.ts +++ b/src/exercises/arrays/array-01.ts @@ -1 +1,2 @@ +// Introducing Arrays const arrayInit: number[] = [1, 2, 3, 4]; From cf8a4d82a88523010fd2b62f8db078c9ae014cd9 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 27 Dec 2022 12:42:21 +0900 Subject: [PATCH 105/150] insertion --- src/exercises/arrays/array-01.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/exercises/arrays/array-01.ts b/src/exercises/arrays/array-01.ts index f82835f..1e944f8 100644 --- a/src/exercises/arrays/array-01.ts +++ b/src/exercises/arrays/array-01.ts @@ -1,2 +1,8 @@ // Introducing Arrays const arrayInit: number[] = [1, 2, 3, 4]; + +// insertion +const array_insertion: number[] = [1, 2, 3, 4]; +array_insertion.push(5); +array_insertion.push(7); +array_insertion.push(2); From 57d054e2f3fb1ab732a3127dc5eebf2739ada53e Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Tue, 27 Dec 2022 12:50:50 +0900 Subject: [PATCH 106/150] Deletion --- src/exercises/arrays/array-01.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/exercises/arrays/array-01.ts b/src/exercises/arrays/array-01.ts index 1e944f8..d53af90 100644 --- a/src/exercises/arrays/array-01.ts +++ b/src/exercises/arrays/array-01.ts @@ -6,3 +6,13 @@ const array_insertion: number[] = [1, 2, 3, 4]; array_insertion.push(5); array_insertion.push(7); array_insertion.push(2); + +// Deletion +// This .pop() method removes the last-added element of the array. +const array_deletion: number[] = [1, 2, 3, 4]; +array_deletion.pop(); +array_deletion.pop(); + +// This .shift() method will remove the first element and return it. +array_deletion.shift(); +array_deletion.shift(); From 44a5a00f0455851288ae03a8b2b509b9024b8087 Mon Sep 17 00:00:00 2001 From: Wakidur Rahaman Date: Wed, 4 Jan 2023 11:14:38 +0900 Subject: [PATCH 107/150] access --- src/exercises/arrays/array-01.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/exercises/arrays/array-01.ts b/src/exercises/arrays/array-01.ts index d53af90..9d06da0 100644 --- a/src/exercises/arrays/array-01.ts +++ b/src/exercises/arrays/array-01.ts @@ -16,3 +16,8 @@ array_deletion.pop(); // This .shift() method will remove the first element and return it. array_deletion.shift(); array_deletion.shift(); + +// Access +const array_access = [1, 2, 3, 4]; +array_access[0]; +array_access[1]; From 731e4fc1f0f0fbe56c08966abef464d1d32eab5c Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 31 May 2023 16:20:47 +0900 Subject: [PATCH 108/150] feat: hackerrank problem --- .../problem-solving/algorithms-001-001.ts | 23 +++++++++++++++++++ src/hackerrank/simple-array-sum.ts | 17 ++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/hackerrank/problem-solving/algorithms-001-001.ts create mode 100644 src/hackerrank/simple-array-sum.ts diff --git a/src/hackerrank/problem-solving/algorithms-001-001.ts b/src/hackerrank/problem-solving/algorithms-001-001.ts new file mode 100644 index 0000000..e16feb7 --- /dev/null +++ b/src/hackerrank/problem-solving/algorithms-001-001.ts @@ -0,0 +1,23 @@ +//001. sum of two integers +function solveMeFirst(a: number, b: number) { + // Hint: Type return a+b below + return a + b; +} +// 002. Sum of an Array +// Calculate the Sum of an Array Using the reduce() Method in JavaScript +/* + * Complete the 'simpleArraySum' function below. + * + * The function is expected to return an INTEGER. + * The function accepts INTEGER_ARRAY ar as parameter. + */ + +function simpleArraySum(ar: number[]): number { + // Write your code here + // parameter 'ar' ar: an array of integers + const sum: number = ar.reduce((accumulator, currentValue) => { + return accumulator + currentValue; + }, 0); + // Return the sum of the array + return sum; +} diff --git a/src/hackerrank/simple-array-sum.ts b/src/hackerrank/simple-array-sum.ts new file mode 100644 index 0000000..d80ee28 --- /dev/null +++ b/src/hackerrank/simple-array-sum.ts @@ -0,0 +1,17 @@ +// Calculate the Sum of an Array Using the reduce() Method in JavaScript +/* + * Complete the 'simpleArraySum' function below. + * + * The function is expected to return an INTEGER. + * The function accepts INTEGER_ARRAY ar as parameter. + */ + +function SimpleArraySum(ar: number[]): number { + // Write your code here + // parameter 'ar' ar: an array of integers + const sum: number = ar.reduce((accumulator, currentValue) => { + return accumulator + currentValue; + }, 0); + // Return the sum of the array + return sum; +} From 06d21de5dcd7e03f43d42b27b587db0254b81d64 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 31 May 2023 18:36:44 +0900 Subject: [PATCH 109/150] feat: compareTripletsVariationOne --- .../problem-solving/algorithms-001-001.ts | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/hackerrank/problem-solving/algorithms-001-001.ts b/src/hackerrank/problem-solving/algorithms-001-001.ts index e16feb7..eae6702 100644 --- a/src/hackerrank/problem-solving/algorithms-001-001.ts +++ b/src/hackerrank/problem-solving/algorithms-001-001.ts @@ -21,3 +21,56 @@ function simpleArraySum(ar: number[]): number { // Return the sum of the array return sum; } + +// 003: compare the triplets + +/* + * Complete the 'compareTriplets' function below. + * + * The function is expected to return an INTEGER_ARRAY. + * The function accepts following parameters: + * 1. INTEGER_ARRAY a + * 2. INTEGER_ARRAY b + */ + +function compareTriplets(a: number[], b: number[]): number[] { + const score: number[] = []; + let pointOfAlice: number = 0; + let pointOfBob: number = 0; + // Alice and Bob + // input a = [1, 2, 3] , b = [3, 4, 1] + // comparison a[i] > b[i], a[i] < b[i] , a[i] == b[i] + // retrun array [1, 1] pointOfAlice and Bob score position + + for (let i = 0; i <= 2; i++) { + if (a[i] == b[i]) { + pointOfAlice; + pointOfBob; + } else if (a[i] > b[i]) { + pointOfAlice += 1; + } else if (a[i] < b[i]) { + pointOfBob += 1; + } + } + + return score.concat(pointOfAlice, pointOfBob); +} + +function compareTripletsVariationOne(a: number[], b: number[]): number[] { + let pointOfAlice: number = 0; + let pointOfBob: number = 0; + // Alice and Bob + // input a = [1, 2, 3] , b = [3, 4, 1] + // comparison a[i] > b[i], a[i] < b[i] , a[i] == b[i] + // retrun array [1, 1] pointOfAlice and Bob score position + + for (let i = 0; i < a.length; i++) { + if (a[i] > b[i]) { + pointOfAlice += 1; + } else if (a[i] < b[i]) { + pointOfBob += 1; + } + } + + return [pointOfAlice, pointOfBob]; +} From 19e6318e69a1febefb2cb49d9e739fd536fa4828 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Thu, 1 Jun 2023 17:12:23 +0900 Subject: [PATCH 110/150] docs: problem solving --- docs/problem-solving-in-programming.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 docs/problem-solving-in-programming.md diff --git a/docs/problem-solving-in-programming.md b/docs/problem-solving-in-programming.md new file mode 100644 index 0000000..7e82e83 --- /dev/null +++ b/docs/problem-solving-in-programming.md @@ -0,0 +1,13 @@ +# [An Ultimate Guide That Helps You To Develop and Improve Problem Solving in Programming](https://www.simplilearn.com/tutorials/programming-tutorial/problem-solving-in-programming) + +## Table of Contents + +- What is Problem Solving in Programming? +- How Does It Impact Your Career? +- Problem Solving Skills in Programming +- Steps Involved in Problem Solving +- Steps to Improve Problem Solving in Programming +- Benefits +- Conclusion + +Coding and Programming skills hold a significant and critical role in implementing and developing various technologies and software. These programming and coding skills are essential for every person to improve problem solving skills. From 253f7e7aad8d53521721797e84eb12a65b362e24 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Thu, 1 Jun 2023 21:07:07 +0900 Subject: [PATCH 111/150] feat: problem solve --- .../problem-solving/algorithms-001-003.ts | 76 +++++++++++++++++++ .../problem-solving/algorithms-004-010.js | 48 ++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 src/hackerrank/problem-solving/algorithms-001-003.ts create mode 100644 src/hackerrank/problem-solving/algorithms-004-010.js diff --git a/src/hackerrank/problem-solving/algorithms-001-003.ts b/src/hackerrank/problem-solving/algorithms-001-003.ts new file mode 100644 index 0000000..eae6702 --- /dev/null +++ b/src/hackerrank/problem-solving/algorithms-001-003.ts @@ -0,0 +1,76 @@ +//001. sum of two integers +function solveMeFirst(a: number, b: number) { + // Hint: Type return a+b below + return a + b; +} +// 002. Sum of an Array +// Calculate the Sum of an Array Using the reduce() Method in JavaScript +/* + * Complete the 'simpleArraySum' function below. + * + * The function is expected to return an INTEGER. + * The function accepts INTEGER_ARRAY ar as parameter. + */ + +function simpleArraySum(ar: number[]): number { + // Write your code here + // parameter 'ar' ar: an array of integers + const sum: number = ar.reduce((accumulator, currentValue) => { + return accumulator + currentValue; + }, 0); + // Return the sum of the array + return sum; +} + +// 003: compare the triplets + +/* + * Complete the 'compareTriplets' function below. + * + * The function is expected to return an INTEGER_ARRAY. + * The function accepts following parameters: + * 1. INTEGER_ARRAY a + * 2. INTEGER_ARRAY b + */ + +function compareTriplets(a: number[], b: number[]): number[] { + const score: number[] = []; + let pointOfAlice: number = 0; + let pointOfBob: number = 0; + // Alice and Bob + // input a = [1, 2, 3] , b = [3, 4, 1] + // comparison a[i] > b[i], a[i] < b[i] , a[i] == b[i] + // retrun array [1, 1] pointOfAlice and Bob score position + + for (let i = 0; i <= 2; i++) { + if (a[i] == b[i]) { + pointOfAlice; + pointOfBob; + } else if (a[i] > b[i]) { + pointOfAlice += 1; + } else if (a[i] < b[i]) { + pointOfBob += 1; + } + } + + return score.concat(pointOfAlice, pointOfBob); +} + +function compareTripletsVariationOne(a: number[], b: number[]): number[] { + let pointOfAlice: number = 0; + let pointOfBob: number = 0; + // Alice and Bob + // input a = [1, 2, 3] , b = [3, 4, 1] + // comparison a[i] > b[i], a[i] < b[i] , a[i] == b[i] + // retrun array [1, 1] pointOfAlice and Bob score position + + for (let i = 0; i < a.length; i++) { + if (a[i] > b[i]) { + pointOfAlice += 1; + } else if (a[i] < b[i]) { + pointOfBob += 1; + } + } + + return [pointOfAlice, pointOfBob]; +} diff --git a/src/hackerrank/problem-solving/algorithms-004-010.js b/src/hackerrank/problem-solving/algorithms-004-010.js new file mode 100644 index 0000000..03a134e --- /dev/null +++ b/src/hackerrank/problem-solving/algorithms-004-010.js @@ -0,0 +1,48 @@ +// 004. Sum of an Array + +/* + * Complete the 'aVeryBigSum' function below. + * + * The function is expected to return a LONG_INTEGER. + * The function accepts LONG_INTEGER_ARRAY ar as parameter. + */ + +function aVeryBigSum(ar) { + // Write your code here + const sum = ar.reduce((acct, curr) => { + return acct + curr; + }, 0); + return sum; +} + +// 004: + +function diagonalDifference(arr) { + const lengthOfArray = arr.length; // Length of the array + let leftToRight = 0; + let rightToLeft = 0; + + for (let i = 0; i < lengthOfArray; i++) { + for (let j = 0; j < lengthOfArray; j++) { + // Find The left-to-right diagonal + if (i === j) { + leftToRight += arr[i][j]; + } + // Find The right to left diagonal diagonal + if (i + j === lengthOfArray - 1) { + rightToLeft += arr[i][j]; + } + } + } + + // calculate the absolute difference between the sums of its diagonals. + return Math.abs(leftToRight - rightToLeft); +} + +const myArray = [ + [0, 1, 2, 3], + [4, 5, 6, 7], + [8, 9, 0, 0], + [4, 5, 6, 7], +]; +diagonalDifference(myArray); From 6efd4d38865a80c4e17e8290f552f7189d1087a6 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Thu, 1 Jun 2023 21:07:33 +0900 Subject: [PATCH 112/150] feat: renive --- .../problem-solving/algorithms-001-001.ts | 76 ------------------- 1 file changed, 76 deletions(-) delete mode 100644 src/hackerrank/problem-solving/algorithms-001-001.ts diff --git a/src/hackerrank/problem-solving/algorithms-001-001.ts b/src/hackerrank/problem-solving/algorithms-001-001.ts deleted file mode 100644 index eae6702..0000000 --- a/src/hackerrank/problem-solving/algorithms-001-001.ts +++ /dev/null @@ -1,76 +0,0 @@ -//001. sum of two integers -function solveMeFirst(a: number, b: number) { - // Hint: Type return a+b below - return a + b; -} -// 002. Sum of an Array -// Calculate the Sum of an Array Using the reduce() Method in JavaScript -/* - * Complete the 'simpleArraySum' function below. - * - * The function is expected to return an INTEGER. - * The function accepts INTEGER_ARRAY ar as parameter. - */ - -function simpleArraySum(ar: number[]): number { - // Write your code here - // parameter 'ar' ar: an array of integers - const sum: number = ar.reduce((accumulator, currentValue) => { - return accumulator + currentValue; - }, 0); - // Return the sum of the array - return sum; -} - -// 003: compare the triplets - -/* - * Complete the 'compareTriplets' function below. - * - * The function is expected to return an INTEGER_ARRAY. - * The function accepts following parameters: - * 1. INTEGER_ARRAY a - * 2. INTEGER_ARRAY b - */ - -function compareTriplets(a: number[], b: number[]): number[] { - const score: number[] = []; - let pointOfAlice: number = 0; - let pointOfBob: number = 0; - // Alice and Bob - // input a = [1, 2, 3] , b = [3, 4, 1] - // comparison a[i] > b[i], a[i] < b[i] , a[i] == b[i] - // retrun array [1, 1] pointOfAlice and Bob score position - - for (let i = 0; i <= 2; i++) { - if (a[i] == b[i]) { - pointOfAlice; - pointOfBob; - } else if (a[i] > b[i]) { - pointOfAlice += 1; - } else if (a[i] < b[i]) { - pointOfBob += 1; - } - } - - return score.concat(pointOfAlice, pointOfBob); -} - -function compareTripletsVariationOne(a: number[], b: number[]): number[] { - let pointOfAlice: number = 0; - let pointOfBob: number = 0; - // Alice and Bob - // input a = [1, 2, 3] , b = [3, 4, 1] - // comparison a[i] > b[i], a[i] < b[i] , a[i] == b[i] - // retrun array [1, 1] pointOfAlice and Bob score position - - for (let i = 0; i < a.length; i++) { - if (a[i] > b[i]) { - pointOfAlice += 1; - } else if (a[i] < b[i]) { - pointOfBob += 1; - } - } - - return [pointOfAlice, pointOfBob]; -} From dea58c1f35d434fdf92681ac24d3d80917186dfc Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Fri, 2 Jun 2023 11:44:59 +0900 Subject: [PATCH 113/150] feat: solve --- docs/problem-solving-in-programming.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/problem-solving-in-programming.md b/docs/problem-solving-in-programming.md index 7e82e83..6734af3 100644 --- a/docs/problem-solving-in-programming.md +++ b/docs/problem-solving-in-programming.md @@ -11,3 +11,16 @@ - Conclusion Coding and Programming skills hold a significant and critical role in implementing and developing various technologies and software. These programming and coding skills are essential for every person to improve problem solving skills. + + +### What is Problem Solving in Programming? + + Problem Solving is an essential skill that helps to solve problems in programming. There are specific steps to be carried out to solve problems in computer programming, and the success depends on how correctly and precisely we define a problem. This involves designing, identifying and implementing problems using certain steps to develop a computer. + +### How Does It Impact Your Career? + +Many companies look for candidates with excellent problem solving skills. +- These skills help people manage the work and make candidates put more effort into the work, which results in finding solutions for complex problems in unexpected situations. āĻāχ āĻĻāĻ•ā§āώāϤāĻžāϗ⧁āϞāĻŋ āϞ⧋āϕ⧇āĻĻ⧇āϰ āĻ•āĻžāϜ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻĒā§āϰāĻžāĻ°ā§āĻĨā§€āĻĻ⧇āϰ āĻ•āĻžāĻœā§‡ āφāϰāĻ“ āĻŦ⧇āĻļāĻŋ āĻĒāϰāĻŋāĻļā§āϰāĻŽ āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰ⧇, āϝāĻžāϰ āĻĢāϞ⧇ āĻ…āĻĒā§āϰāĻ¤ā§āϝāĻžāĻļāĻŋāϤ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋāϤ⧇ āϜāϟāĻŋāϞ āϏāĻŽāĻ¸ā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āϖ⧁āρāĻœā§‡ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤ + +- These skills also help to identify quick solutions when they arise and are identified. āĻāχ āĻĻāĻ•ā§āώāϤāĻžāϗ⧁āϞāĻŋ āϝāĻ–āύ āωāĻĻā§āĻ­ā§‚āϤ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧ āϤāĻ–āύ āĻĻā§āϰ⧁āϤ āϏāĻŽāĻžāϧāĻžāύāϗ⧁āϞāĻŋ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇āĻ“ āϏāĻšāĻžāϝāĻŧāϤāĻž āĻ•āϰ⧇⧎ +- People with great problem solving skills also possess more thinking and analytical skills, āĻŦāĻŋāϰāĻžāϟ/āĻŦ⧃āĻšā§Ž āϏāĻŽāĻ¸ā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ⧇āϰ āĻĻāĻ•ā§āώāϤāĻž āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻĻ⧇āϰ āφāϰāĻ“ āϚāĻŋāĻ¨ā§āϤāĻžāĻ­āĻžāĻŦāύāĻž āĻāĻŦāĻ‚ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖāĻžāĻ¤ā§āĻŽāĻ• āĻĻāĻ•ā§āώāϤāĻž āϰāϝāĻŧ⧇āϛ⧇, which makes them much more successful and confident in their career and able to work in any kind of environment. āϝāĻž āϤāĻžāĻĻ⧇āϰ āĻ•āĻ°ā§āĻŽāĻœā§€āĻŦāύ⧇ āĻ…āύ⧇āĻ• āĻŦ⧇āĻļāĻŋ āϏāĻĢāϞ āĻāĻŦāĻ‚ āφāĻ¤ā§āĻŽāĻŦāĻŋāĻļā§āĻŦāĻžāϏ⧀ āĻ•āϰ⧇ āϤ⧋āϞ⧇ āĻāĻŦāĻ‚ āϝ⧇ āϕ⧋āύ⧋ āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϝāĻŧāĨ¤ From 54946d682ad51f68c8fcf0dd1e8992ae505b3d32 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Fri, 2 Jun 2023 14:21:41 +0900 Subject: [PATCH 114/150] docs: steps involved --- docs/problem-solving-in-programming.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/problem-solving-in-programming.md b/docs/problem-solving-in-programming.md index 6734af3..b5528cd 100644 --- a/docs/problem-solving-in-programming.md +++ b/docs/problem-solving-in-programming.md @@ -24,3 +24,29 @@ Many companies look for candidates with excellent problem solving skills. - These skills also help to identify quick solutions when they arise and are identified. āĻāχ āĻĻāĻ•ā§āώāϤāĻžāϗ⧁āϞāĻŋ āϝāĻ–āύ āωāĻĻā§āĻ­ā§‚āϤ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧ āϤāĻ–āύ āĻĻā§āϰ⧁āϤ āϏāĻŽāĻžāϧāĻžāύāϗ⧁āϞāĻŋ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇āĻ“ āϏāĻšāĻžāϝāĻŧāϤāĻž āĻ•āϰ⧇⧎ - People with great problem solving skills also possess more thinking and analytical skills, āĻŦāĻŋāϰāĻžāϟ/āĻŦ⧃āĻšā§Ž āϏāĻŽāĻ¸ā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ⧇āϰ āĻĻāĻ•ā§āώāϤāĻž āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻĻ⧇āϰ āφāϰāĻ“ āϚāĻŋāĻ¨ā§āϤāĻžāĻ­āĻžāĻŦāύāĻž āĻāĻŦāĻ‚ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖāĻžāĻ¤ā§āĻŽāĻ• āĻĻāĻ•ā§āώāϤāĻž āϰāϝāĻŧ⧇āϛ⧇, which makes them much more successful and confident in their career and able to work in any kind of environment. āϝāĻž āϤāĻžāĻĻ⧇āϰ āĻ•āĻ°ā§āĻŽāĻœā§€āĻŦāύ⧇ āĻ…āύ⧇āĻ• āĻŦ⧇āĻļāĻŋ āϏāĻĢāϞ āĻāĻŦāĻ‚ āφāĻ¤ā§āĻŽāĻŦāĻŋāĻļā§āĻŦāĻžāϏ⧀ āĻ•āϰ⧇ āϤ⧋āϞ⧇ āĻāĻŦāĻ‚ āϝ⧇ āϕ⧋āύ⧋ āĻĒāϰāĻŋāĻŦ⧇āĻļ⧇ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϝāĻŧāĨ¤ + + +### Problem Solving Skills in Programming + +Solving a question that is related to computers is more complicated than finding the solutions for other questions. āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻļā§āύ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰāĻž āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĒā§āϰāĻļā§āύ⧇āϰ āϏāĻŽāĻžāϧāĻžāύ āĻ–ā§‹āρāϜāĻžāϰ āĻšā§‡āϝāĻŧ⧇ āφāϰāĻ“ āϜāϟāĻŋāϞāĨ¤ It requires excellent knowledge and much thinking power. āĻāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āϚāĻŽā§ŽāĻ•āĻžāϰ āĻœā§āĻžāĻžāύ āĻāĻŦāĻ‚ āĻ…āύ⧇āĻ• āϚāĻŋāĻ¨ā§āϤāĻžāĻļāĻ•ā§āϤāĻŋāĨ¤ Problem solving in programming skills is much needed for a person and holds a major advantage. āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāĻŋāĻ‚ āĻĻāĻ•ā§āώāϤāĻžāϝāĻŧ āϏāĻŽāĻ¸ā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ āĻāĻ•āϜāύ āĻŦā§āϝāĻ•ā§āϤāĻŋāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧇āĻ• āĻŦ⧇āĻļāĻŋ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻŦāĻĄāĻŧ āϏ⧁āĻŦāĻŋāϧāĻž āϰāĻžāϖ⧇āĨ¤ For every question, there are specific steps to be followed to get a perfect solution. āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒā§āϰāĻļā§āύ⧇āϰ āϜāĻ¨ā§āϝ, āĻāĻ•āϟāĻŋ āύāĻŋāϖ⧁āρāϤ āϏāĻŽāĻžāϧāĻžāύ āĻĒ⧇āϤ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ By using those steps, it is possible to find a solution quickly. āĻāχ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āĻĻā§āϰ⧁āϤ āϏāĻŽāĻžāϧāĻžāύ āϖ⧁āρāĻœā§‡ āĻĒāĻžāĻ“āϝāĻŧāĻž āϏāĻŽā§āĻ­āĻŦāĨ¤ + + +### Steps Involved in Problem Solving + +Before being ready to solve a problem, there are some steps and procedures to be followed to find the solution. + +Basically, they are divided into four categories: + +1. Analysing the problem. +2. Developing the algorithm. +3. Coding. +4. Testing and debugging. + +1. Analysing the problem. + Every +2. Developing the algorithm. +It is +3. Coding. +Once we + +4. Testing and debugging. From 0d5e1730d3b1ed5d78e88718f8482c5dfff147ad Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Fri, 2 Jun 2023 16:24:53 +0900 Subject: [PATCH 115/150] feat: plusMinus problem solved --- .../problem-solving/algorithms-004-010.js | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/hackerrank/problem-solving/algorithms-004-010.js b/src/hackerrank/problem-solving/algorithms-004-010.js index 03a134e..ec84fda 100644 --- a/src/hackerrank/problem-solving/algorithms-004-010.js +++ b/src/hackerrank/problem-solving/algorithms-004-010.js @@ -15,7 +15,7 @@ function aVeryBigSum(ar) { return sum; } -// 004: +// 004: Diagonal Difference function diagonalDifference(arr) { const lengthOfArray = arr.length; // Length of the array @@ -46,3 +46,32 @@ const myArray = [ [4, 5, 6, 7], ]; diagonalDifference(myArray); + +// 005: Given an array of integers, calculate the ratios of its elements that are positive, negative, and zero. Print the decimal value of each fraction on a new line with places after the decimal. +/* + * Complete the 'plusMinus' function below. + * + * The function accepts INTEGER_ARRAY arr as parameter. + */ + +function plusMinus(arr) { + const arrLength = arr.length; + let positiveCount = 0; + let negativeCount = 0; + let zeroCount = 0; + for (let i = 0; i < arrLength; i++) { + if (arr[i] === 0) { + zeroCount += 1; + } else if (arr[i] > 0) { + positiveCount += 1; + } else if (arr[i] < 0) { + negativeCount += 1; + } + } + const calculatePos = (positiveCount / arrLength).toFixed(6); + const calculateNeg = (negativeCount / arrLength).toFixed(6); + const calculateZero = (zeroCount / arrLength).toFixed(6); + console.log(calculatePos + '\n' + calculateNeg + '\n' + calculateZero); +} +arrayOfIntegers = [-4, 3, -9, 0, 4, 1]; +plusMinus(arrayOfIntegers); From 5ac0ff25b52cd0ae075f2163502ea3fc694ddbd1 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Fri, 2 Jun 2023 21:07:55 +0900 Subject: [PATCH 116/150] feat: sec --- src/hackerrank/problem-solving/algorithms-004-010.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hackerrank/problem-solving/algorithms-004-010.js b/src/hackerrank/problem-solving/algorithms-004-010.js index ec84fda..b48c409 100644 --- a/src/hackerrank/problem-solving/algorithms-004-010.js +++ b/src/hackerrank/problem-solving/algorithms-004-010.js @@ -75,3 +75,5 @@ function plusMinus(arr) { } arrayOfIntegers = [-4, 3, -9, 0, 4, 1]; plusMinus(arrayOfIntegers); + +// 006: From 33f0bf63ee1adeeffed8aea0b9878dba269564be Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Mon, 5 Jun 2023 14:06:17 +0900 Subject: [PATCH 117/150] docs: added --- docs/problem-solving-in-programming.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/problem-solving-in-programming.md b/docs/problem-solving-in-programming.md index b5528cd..39c2b3e 100644 --- a/docs/problem-solving-in-programming.md +++ b/docs/problem-solving-in-programming.md @@ -37,8 +37,10 @@ Before being ready to solve a problem, there are some steps and procedures to be Basically, they are divided into four categories: -1. Analysing the problem. -2. Developing the algorithm. +1. Analysing the problem: Every problem has a perfect solution; before we are ready to solve a problem, we must look over the question and understand it. When we know the question, it is easy to find the solution for it. If we are not ready with what we have to solve, then we end up with the question and cannot find the answer as expected. By analysing it, we can figure out the outputs and inputs to be carried out. Thus, when we analyse and are +ready with the list, it is easy and helps us find the solution easily. + +2. Developing the algorithm: It is required to decide a solution before writing a program. The procedure of representing the solution in a natural language called an algorithm. We must design, develop and decide the final approach after a number of trials and errors, before actually writing the final code on an algorithm before we write the code. It captures and refines all the aspects of the desired solution. 3. Coding. 4. Testing and debugging. From 2d2bda1004d6ec8b17ddbfa1bb532b5aa26bc78f Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Mon, 5 Jun 2023 15:58:57 +0900 Subject: [PATCH 118/150] feat: most frequent --- .../problem-solving/algorithms-004-010.js | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/hackerrank/problem-solving/algorithms-004-010.js b/src/hackerrank/problem-solving/algorithms-004-010.js index b48c409..de00fee 100644 --- a/src/hackerrank/problem-solving/algorithms-004-010.js +++ b/src/hackerrank/problem-solving/algorithms-004-010.js @@ -76,4 +76,34 @@ function plusMinus(arr) { arrayOfIntegers = [-4, 3, -9, 0, 4, 1]; plusMinus(arrayOfIntegers); -// 006: +// 006: Given an array of bird sightings where every element represents a bird type id, determine the id of the most frequently sighted type. If more than 1 type has been spotted that maximum amount, return the smallest of their ids. + +function migratoryBirds(arr) { + const arrayLength = arr.length; + let hashMap = {}; + + // determine the id of the most frequently sighted type + for (let i = 0; i < arrayLength; i++) { + let num = arr[i]; + if (!hashMap[num]) { + hashMap[num] = 1; + } else { + hashMap[num]++; + } + } + let freq = 0; + let freqNum = null; + // If more than 1 type has been spotted that maximum amount, + // return the smallest of their ids. + for (let num in hashMap) { + if (hashMap[num] > freq) { + freq = hashMap[num]; + freqNum = num; + } + } + return freqNum; +} + +const arrayOfBirdSightings = [1, 4, 4, 4, 5, 3]; + +migratoryBirds(arrayOfBirdSightings); From 4fc6f69d4ecb17e6b674a91d7e7b6126ab8c09ac Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Tue, 6 Jun 2023 16:08:42 +0900 Subject: [PATCH 119/150] feat: Staircase detail --- src/hackerrank/problem-solving/algorithms-004-010.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/hackerrank/problem-solving/algorithms-004-010.js b/src/hackerrank/problem-solving/algorithms-004-010.js index de00fee..bcd39d9 100644 --- a/src/hackerrank/problem-solving/algorithms-004-010.js +++ b/src/hackerrank/problem-solving/algorithms-004-010.js @@ -107,3 +107,15 @@ function migratoryBirds(arr) { const arrayOfBirdSightings = [1, 4, 4, 4, 5, 3]; migratoryBirds(arrayOfBirdSightings); + +// 007: Staircase detail + +function staircase(n) { + const line = Array(n + 1).fill(' '); + for (let i = n - 1; i >= 0; i--) { + line[i] = '#'; + console.log(line[i]); + } +} + +staircase(6); From f72967e538c494178ad992511c61f873709664aa Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Tue, 6 Jun 2023 16:27:47 +0900 Subject: [PATCH 120/150] feat: update --- .../problem-solving/algorithms-004-010.js | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/hackerrank/problem-solving/algorithms-004-010.js b/src/hackerrank/problem-solving/algorithms-004-010.js index bcd39d9..d1b899f 100644 --- a/src/hackerrank/problem-solving/algorithms-004-010.js +++ b/src/hackerrank/problem-solving/algorithms-004-010.js @@ -76,32 +76,40 @@ function plusMinus(arr) { arrayOfIntegers = [-4, 3, -9, 0, 4, 1]; plusMinus(arrayOfIntegers); -// 006: Given an array of bird sightings where every element represents a bird type id, determine the id of the most frequently sighted type. If more than 1 type has been spotted that maximum amount, return the smallest of their ids. - +/** + * 006: + * Given an array of bird sightings where every element represents a bird type id, + * determine the id of the most frequently sighted type. + * If more than 1 type has been spotted that maximum amount, return the smallest of their ids. + * @param {*} arr == [1, 4, 4, 4, 5, 3] + * @returns smallest of their ids. + */ function migratoryBirds(arr) { + // Array Length declaration const arrayLength = arr.length; + // Story hash map object where object will be store like [1, 4, 4, 4, 5, 3] => {1: 1, 3: 1, 4: 3, 5: 1} let hashMap = {}; // determine the id of the most frequently sighted type for (let i = 0; i < arrayLength; i++) { - let num = arr[i]; + let num = arr[i]; // array value if (!hashMap[num]) { - hashMap[num] = 1; + hashMap[num] = 1; // assign object key when object key is not available inside 'hashMap' } else { - hashMap[num]++; + hashMap[num]++; // Increment object key value when keys are the same; } } - let freq = 0; - let freqNum = null; + let freq = 0; // Store Key value + let freqNum = null; // Store Key // If more than 1 type has been spotted that maximum amount, // return the smallest of their ids. for (let num in hashMap) { if (hashMap[num] > freq) { - freq = hashMap[num]; - freqNum = num; + freq = hashMap[num]; // Assign key value + freqNum = num; // story key } } - return freqNum; + return freqNum; // return l } const arrayOfBirdSightings = [1, 4, 4, 4, 5, 3]; From 2619f733901c1467493df1ce31f8b768d158bc7b Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Tue, 6 Jun 2023 19:15:33 +0900 Subject: [PATCH 121/150] feat: implement --- .../problem-solving/algorithms-004-010.js | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/hackerrank/problem-solving/algorithms-004-010.js b/src/hackerrank/problem-solving/algorithms-004-010.js index d1b899f..32ed809 100644 --- a/src/hackerrank/problem-solving/algorithms-004-010.js +++ b/src/hackerrank/problem-solving/algorithms-004-010.js @@ -127,3 +127,41 @@ function staircase(n) { } staircase(6); + +/** + * Given five positive integers, + * find the minimum and maximum values that can be calculated by summing exactly four of the five integers. + * Then print the respective minimum and maximum values as a single line of two space-separated long integers. + * @param {*} arr = [1, 2, 3, 7, 5, 9]; + * Complete the 'miniMaxSum' function below. + * + * The function accepts INTEGER_ARRAY arr as parameter. + */ + +function miniMaxSum(arr) { + // Array Length + const arrayLength = arr.length; + // minimum sum + let minSum = 0; + // maximum sum + let maxSum = 0; + // sort an array of integers array. + arr.sort((a, b) => a - b); + + for (let i = 0; i < arrayLength; i++) { + // Iterate starting from the 0 index and finish before the last index + if (i < arrayLength - 1) { + minSum += arr[i]; + } + + // Iterate starting from the 1 index and finish the last index + if (i > 0 && i < arrayLength) { + maxSum += arr[i]; + } + } + + console.log(`${minSum} ${maxSum}`); +} + +const miniMaxSumArray = [1, 2, 3, 7, 5, 9]; +miniMaxSum(miniMaxSumArray); From 94d9dba6156caa1eba7c0a2b8aec1e1a17d32c34 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 7 Jun 2023 12:57:58 +0900 Subject: [PATCH 122/150] feat: updated --- .../problem-solving/algorithms-004-010.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/hackerrank/problem-solving/algorithms-004-010.js b/src/hackerrank/problem-solving/algorithms-004-010.js index 32ed809..1b56edb 100644 --- a/src/hackerrank/problem-solving/algorithms-004-010.js +++ b/src/hackerrank/problem-solving/algorithms-004-010.js @@ -129,6 +129,7 @@ function staircase(n) { staircase(6); /** + * 008 * Given five positive integers, * find the minimum and maximum values that can be calculated by summing exactly four of the five integers. * Then print the respective minimum and maximum values as a single line of two space-separated long integers. @@ -165,3 +166,19 @@ function miniMaxSum(arr) { const miniMaxSumArray = [1, 2, 3, 7, 5, 9]; miniMaxSum(miniMaxSumArray); + +/** + * 008 + * You are in charge of the cake for a child's birthday. + * You have decided the cake will have one candle for each year of their total age. + * They will only be able to blow out the tallest of the candles. + * Count how many candles are tallest. + * + * Complete the 'birthdayCakeCandles' function below. + * The function is expected to return an INTEGER. + * The function accepts INTEGER_ARRAY candles as parameter. + */ + +function birthdayCakeCandles(candles) { + // Write your code here +} From bff15f53f3ca527350e06df2167b74f8eb5ea8fa Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 7 Jun 2023 17:52:49 +0900 Subject: [PATCH 123/150] feat: implement --- .../problem-solving/algorithms-004-010.js | 66 ++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/src/hackerrank/problem-solving/algorithms-004-010.js b/src/hackerrank/problem-solving/algorithms-004-010.js index 1b56edb..1a85c96 100644 --- a/src/hackerrank/problem-solving/algorithms-004-010.js +++ b/src/hackerrank/problem-solving/algorithms-004-010.js @@ -168,7 +168,7 @@ const miniMaxSumArray = [1, 2, 3, 7, 5, 9]; miniMaxSum(miniMaxSumArray); /** - * 008 + * 009 * You are in charge of the cake for a child's birthday. * You have decided the cake will have one candle for each year of their total age. * They will only be able to blow out the tallest of the candles. @@ -180,5 +180,67 @@ miniMaxSum(miniMaxSumArray); */ function birthdayCakeCandles(candles) { - // Write your code here + // array length + const arrayLength = candles.length; + // tallest candle + const arrayMaxValue = Math.max(...candles); + // the number of candles that are tallest + let tallestCandles = 0; + for (let i = 0; i < arrayLength; i++) { + // check array max value and iterate value are same + if (candles[i] === arrayMaxValue) tallestCandles += 1; + } + // console.log(tallestCandles); + return tallestCandles; +} + +/** + * 010 + * Given a year, Y , find the date of the 256th day of that year according to the official Russian calendar during that year. + * Then print it in the format dd.mm.yyyy, where dd is the two-digit day, mm is the two-digit month, and yyyy is . + * + * Complete the 'dayOfProgrammer' function below. + * + * The function is expected to return a STRING + * + * The function accepts INTEGER year as parameter + */ + +function dayOfProgrammer(year) { + let day = 13; // by default + + // The transition from the Julian to Gregorian calendar system occurred in 1918 + if (year === 1918) { + day += 13; + } + // From 1700 to 1917, Russia's official calendar was the Julian calendar; + else if (year < 1918) { + /** + * In the Julian calendar, + * + * **leap years are divisible by 4 + */ + + if (year % 4 === 0) { + day = 12; + } else { + day = 13; + } + } + // since 1919 they used the Gregorian calendar system. + else if (year > 1918) { + /** + * in the Gregorian calendar, leap years are either of the following: + * ** Divisible by 400. + * ** Divisible by 4 and not divisible by 100. + */ + if ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0) { + day = 12; + } else { + day = 13; + } + } + + return `${day}.09.${year}`; } +dayOfProgrammer(1917); From 136c503d247e4654d7a620a4f4fd6f30d8ec97b3 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 7 Jun 2023 18:52:49 +0900 Subject: [PATCH 124/150] feat: problem solving --- src/hackerrank/problem-solving/algorithms-011-020.js | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/hackerrank/problem-solving/algorithms-011-020.js diff --git a/src/hackerrank/problem-solving/algorithms-011-020.js b/src/hackerrank/problem-solving/algorithms-011-020.js new file mode 100644 index 0000000..3a9204c --- /dev/null +++ b/src/hackerrank/problem-solving/algorithms-011-020.js @@ -0,0 +1,3 @@ +/** + * 011: + */ From 362aeb45dcb60464567e5fa0e0fe410f4d22356a Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Thu, 8 Jun 2023 18:04:07 +0900 Subject: [PATCH 125/150] feat: time conversion --- .../problem-solving/algorithms-011-020.js | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/hackerrank/problem-solving/algorithms-011-020.js b/src/hackerrank/problem-solving/algorithms-011-020.js index 3a9204c..2c167db 100644 --- a/src/hackerrank/problem-solving/algorithms-011-020.js +++ b/src/hackerrank/problem-solving/algorithms-011-020.js @@ -1,3 +1,31 @@ /** - * 011: + * 011: Given a time in 12-hour AM/PM format, convert it to military (24-hour) time. */ + +/* + * Complete the 'timeConversion' function below. + * + * The function is expected to return a STRING. + * The function accepts STRING s as parameter. + */ + +function timeConversion(s) { + // get time slice + // const [hours, minutes, modifier] = s.split(':'); + // console.log(hours,minutes,modifier) + const time = s.match(/(\d+):(\d+):(\d+)(\w+)/); + let hours = time[1]; + const minutes = time[2]; + const seconds = time[3]; + const modifier = time[4]; + + if (hours === '12') { + hours = '00'; + } + + if (modifier === 'PM') { + hours = parseInt(hours, 10) + 12; + } + + return `${hours}:${minutes}:${seconds}`; +} From ef1b98d94c5b8dc1497b05c6377b217ecc7fa9c9 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Mon, 12 Jun 2023 17:21:36 +0900 Subject: [PATCH 126/150] feat: grading --- src/hackerrank/problem-solving/algorithms-011-020.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hackerrank/problem-solving/algorithms-011-020.js b/src/hackerrank/problem-solving/algorithms-011-020.js index 2c167db..b00478d 100644 --- a/src/hackerrank/problem-solving/algorithms-011-020.js +++ b/src/hackerrank/problem-solving/algorithms-011-020.js @@ -29,3 +29,7 @@ function timeConversion(s) { return `${hours}:${minutes}:${seconds}`; } + +/** + * 012: grading + */ From 642f9d311615094ad80a9f96ebd311cd9effe341 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Tue, 13 Jun 2023 15:57:15 +0900 Subject: [PATCH 127/150] feat: grading --- .../problem-solving/algorithms-011-020.js | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/hackerrank/problem-solving/algorithms-011-020.js b/src/hackerrank/problem-solving/algorithms-011-020.js index b00478d..11c334b 100644 --- a/src/hackerrank/problem-solving/algorithms-011-020.js +++ b/src/hackerrank/problem-solving/algorithms-011-020.js @@ -31,5 +31,26 @@ function timeConversion(s) { } /** - * 012: grading + * 012: HackerLand University has the following grading policy: + * + * Every student receives a grade in the inclusive range from 0 to 100. + * Any grade less than 40 is a failing grade. + * + * Sam is a professor at the university and likes to round each student's grade according to these rules: + * If the difference between the grade and the next multiple of 5 is less than 3, round grade up to the next multiple of 5. + * If the value of grade is less than 38, no rounding occurs as the result will still be a failing grade. */ + +function gradingStudents(grades) { + let count = []; + for (let i = 0; i < grades.length; i++) { + if (grades[i] % 5 == 3 && grades[i] >= 38) { + count.push(grades[i] + 2); + } else if (grades[i] % 5 == 4 && grades[i] >= 38) { + count.push(grades[i] + 1); + } else { + count.push(grades[i]); + } + } + return count; +} From 5d0e476622d4e32d6145a408ea24eb7981263080 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Tue, 13 Jun 2023 17:13:58 +0900 Subject: [PATCH 128/150] feat: implement problem solving --- src/hackerrank/problem-solving/algorithms-011-020.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/hackerrank/problem-solving/algorithms-011-020.js b/src/hackerrank/problem-solving/algorithms-011-020.js index 11c334b..b4d87b8 100644 --- a/src/hackerrank/problem-solving/algorithms-011-020.js +++ b/src/hackerrank/problem-solving/algorithms-011-020.js @@ -54,3 +54,9 @@ function gradingStudents(grades) { } return count; } + +/** + * 013: HackerLand University has the following grading policy: + * + * + */ From e9552091f2662c920ed44594319575ca0bbb18ed Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 14 Jun 2023 16:12:48 +0900 Subject: [PATCH 129/150] feat: bubbleSortVariationNormal --- src/code-challenges/bubble-sort.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/code-challenges/bubble-sort.js diff --git a/src/code-challenges/bubble-sort.js b/src/code-challenges/bubble-sort.js new file mode 100644 index 0000000..9543620 --- /dev/null +++ b/src/code-challenges/bubble-sort.js @@ -0,0 +1,28 @@ +/** + * 001: Bubble Sort: is based on the idea of repeatedly comparing pairs of adjacent elements and + * then swapping their positions if they are in the wrong order. + * Bubble sort is a stable, in-place sort algorithm. + */ + +// Normal +function bubbleSortVariationNormal(arr) { + let swaps; + do { + swaps = false; + for (let i = 0; i < arr.length - 1; i++) { + const element = arr[i]; + console.log(element); + if (arr[i] > arr[i + 1]) { + // start with the first two elements and sort them in ascending order. (Compare the element to check which one is greater). + let temp = arr[i + 1]; // store second element for swap + arr[i + 1] = arr[i]; // Swap first element to second element + arr[i] = temp; // // Swap second element to first element + swaps = true; // true for loop continue until Compare not false condition + } + } + } while (swaps); + + return arr; +} + +bubbleSortVariationNormal([6, 5, 3, 1, 8, 7, 2, 4]); From 181e14b357a5f00495844bd7aa87a477833d4a48 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 14 Jun 2023 17:31:26 +0900 Subject: [PATCH 130/150] feat: variation Recursive --- src/code-challenges/bubble-sort.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/code-challenges/bubble-sort.js b/src/code-challenges/bubble-sort.js index 9543620..14abc64 100644 --- a/src/code-challenges/bubble-sort.js +++ b/src/code-challenges/bubble-sort.js @@ -26,3 +26,24 @@ function bubbleSortVariationNormal(arr) { } bubbleSortVariationNormal([6, 5, 3, 1, 8, 7, 2, 4]); + +// Recursively +const bubbleSortVariationRecursive = function (array, pointer = array.length - 1) { + // Base check + if (pointer === 0) { + return array; + } + + for (let i = 0; i < pointer; i++) { + if (array[i] > array[i + 1]) { + let temp = array[i + 1]; + array[i + 1] = array[i]; + array[i] = temp; + } + } + + // Recursive call on smaller portion of the array + return bubbleSortVariationRecursive(array, pointer - 1); +}; + +bubbleSortVariationRecursive([6, 5, 3, 1, 8, 7, 2, 4]); From a8e7286cfdd66c60a6c6bea4079079654e2f1b6b Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 14 Jun 2023 18:03:38 +0900 Subject: [PATCH 131/150] feat: refactor --- src/code-challenges/bubble-sort.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/code-challenges/bubble-sort.js b/src/code-challenges/bubble-sort.js index 14abc64..6cdd839 100644 --- a/src/code-challenges/bubble-sort.js +++ b/src/code-challenges/bubble-sort.js @@ -6,12 +6,11 @@ // Normal function bubbleSortVariationNormal(arr) { + const len = arr.length - 1; let swaps; do { swaps = false; - for (let i = 0; i < arr.length - 1; i++) { - const element = arr[i]; - console.log(element); + for (let i = 0; i < len; i++) { if (arr[i] > arr[i + 1]) { // start with the first two elements and sort them in ascending order. (Compare the element to check which one is greater). let temp = arr[i + 1]; // store second element for swap From 52b2f751b6232bff7f7d072f7b496028144929a0 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 14 Jun 2023 19:11:04 +0900 Subject: [PATCH 132/150] feat: implement --- src/code-challenges/bubble-sort.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/code-challenges/bubble-sort.js b/src/code-challenges/bubble-sort.js index 6cdd839..cb57c2c 100644 --- a/src/code-challenges/bubble-sort.js +++ b/src/code-challenges/bubble-sort.js @@ -46,3 +46,32 @@ const bubbleSortVariationRecursive = function (array, pointer = array.length - 1 }; bubbleSortVariationRecursive([6, 5, 3, 1, 8, 7, 2, 4]); + +/** + * Lucky Sevens + * 002: Write a function called lucky_sevens which takes an array of integers and returns true if any three consecutive elements sum to 7. + */ + +function luckySevensVariationOne(arrayOfIntegers) { + // Array length + const len = arrayOfIntegers.length; + // If array of length is less than 3 elements then this challenge is not possible. + if (len < 3) { + return 'Not possible'; + } + + // Because we know there are at least 3 elements we can + // Start the loop at the 3rd element in the array (i = 2); + // and check it along with the two previous elements (i - 1) and (i - 2) + + for (let i = 0; i < len; i++) { + if (arrayOfIntegers[i] + arrayOfIntegers[i - 1] + arrayOfIntegers[i - 2] === 7) { + return true; + } + } + + // if loop is finished and no elements summed to 7; + return false; +} + +luckySevensVariationOne([2, 1, 5, 1, 0]); From b7c7831ba4a76802cb19f584082e40dfc7d68bb7 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Thu, 15 Jun 2023 14:39:49 +0900 Subject: [PATCH 133/150] feat: implement --- src/code-challenges/bubble-sort.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/code-challenges/bubble-sort.js b/src/code-challenges/bubble-sort.js index cb57c2c..ad9f031 100644 --- a/src/code-challenges/bubble-sort.js +++ b/src/code-challenges/bubble-sort.js @@ -75,3 +75,25 @@ function luckySevensVariationOne(arrayOfIntegers) { } luckySevensVariationOne([2, 1, 5, 1, 0]); + +function luckySevensVariationTwo(array) { + const len = array.length; + + // Iterate through the array. + + for (let i = 0; i < len - 2; i++) { + let sum = array[i] + array[i + 1] + array[i + 2]; + + if (sum === 7) { + return true; // Found three consecutive elements that sum to 3; + } + } + + return false; // No three consecutive elements sum to 7; +} + +let numbersOfLuckySeven = [1, 2, 3, 4, 5, 6, 1]; +console.log(luckySevensVariationTwo(numbers)); // Output: true + +var numbers2OfLuckySeven = [1, 2, 3, 4, 5, 6, 2]; +console.log(luckySevensVariationTwo(numbers2OfLuckySeven)); // Output: false From a1863dcfba35fd275df7bc0b3f8ce3ac7d4416ed Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Thu, 15 Jun 2023 16:01:58 +0900 Subject: [PATCH 134/150] feat: simpleClockAngle --- src/code-challenges/code-challenges-003-010.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/code-challenges/code-challenges-003-010.js diff --git a/src/code-challenges/code-challenges-003-010.js b/src/code-challenges/code-challenges-003-010.js new file mode 100644 index 0000000..ba481a4 --- /dev/null +++ b/src/code-challenges/code-challenges-003-010.js @@ -0,0 +1,14 @@ +/** + * Q003: Simple clock angle + * Problem + * You will be given a number N that represents where the minute hand currently is on a clock. + * Your program should return the angle that is formed by the minute hand and the 12 o'clock mark on the clock. + */ + +function simpleClockAngle(number) { + // we got 6 because 360(degree)/60(minute) = 6; + // 360 represents the full number of a degrees in a circle and + // 60 is the number of minutes on a clock, so dividing these two numbers + // gives us the number of degrees for one minute + return 6 * number; +} From 64e11a1ffec29a5cdcb9b3a29aacbd886e390599 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Thu, 15 Jun 2023 18:01:27 +0900 Subject: [PATCH 135/150] feat: Sum of several arrays --- .../code-challenges-003-010.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/code-challenges/code-challenges-003-010.js b/src/code-challenges/code-challenges-003-010.js index ba481a4..0161f34 100644 --- a/src/code-challenges/code-challenges-003-010.js +++ b/src/code-challenges/code-challenges-003-010.js @@ -12,3 +12,33 @@ function simpleClockAngle(number) { // gives us the number of degrees for one minute return 6 * number; } + +/** + * Q004: Sum of several arrays + * Problem + * You will be given an array of several arrays that each contain integers and your goal is to write a function that will sum up all the numbers in all the arrays. + * For example, if the input is [[3, 2], [1], [4, 12]] then your program should output 22 because 3 + 2 + 1 + 4 + 12 = 22. Solve without and with reduce. + */ + +// Normal +function multiDimensionalSumOfSeveralArrayVariationNormal(array) { + // Store our final answer + let sum = 0; + // Loop through entire array. + for (let i = 0; i < array.length; i++) { + // Loop through each inner array. + for (let j = 0; j < array[i].length; j++) { + sum += array[i][j]; + } + } + + return sum; +} + +multiDimensionalSumOfSeveralArrayVariationNormal([[3, 2], [1], [4, 12]]); +// reduce + +function multiDimensionalSumOfSeveralArrayVariationReduce(array) { + return array.reduce((t, e) => t.concat(e)).reduce((t, e) => t + e); +} +multiDimensionalSumOfSeveralArrayVariationReduce([[3, 2], [1], [4, 12]]); From e38e0b9b9e16d32c49c67fb734741c04eb20782e Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Fri, 16 Jun 2023 16:53:45 +0900 Subject: [PATCH 136/150] feat: added --- src/code-challenges/code-challenges-003-010.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/code-challenges/code-challenges-003-010.js b/src/code-challenges/code-challenges-003-010.js index 0161f34..bcc82ed 100644 --- a/src/code-challenges/code-challenges-003-010.js +++ b/src/code-challenges/code-challenges-003-010.js @@ -42,3 +42,7 @@ function multiDimensionalSumOfSeveralArrayVariationReduce(array) { return array.reduce((t, e) => t.concat(e)).reduce((t, e) => t + e); } multiDimensionalSumOfSeveralArrayVariationReduce([[3, 2], [1], [4, 12]]); + +/** + * Q005: Test divisors of three + */ From a18e25b3fc35d45470390daad0c3e237ef33b743 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Tue, 20 Jun 2023 11:21:17 +0900 Subject: [PATCH 137/150] feat: code --- src/code-challenges/code-challenges-003-010.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/code-challenges/code-challenges-003-010.js b/src/code-challenges/code-challenges-003-010.js index bcc82ed..79571eb 100644 --- a/src/code-challenges/code-challenges-003-010.js +++ b/src/code-challenges/code-challenges-003-010.js @@ -45,4 +45,7 @@ multiDimensionalSumOfSeveralArrayVariationReduce([[3, 2], [1], [4, 12]]); /** * Q005: Test divisors of three + * You will be given 2 parameters: a low and high number. + * Your goal is to print all numbers between low and high, and for each of these numbers print whether or not the number is divisible by 3. + * If the number is divisible by 3, print the word "div3" directly after the number. */ From 946d7050ba6fd96ac9ebf40a437e0dae6a61b788 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Tue, 20 Jun 2023 14:58:48 +0900 Subject: [PATCH 138/150] docs: question and answer --- docs/interview-questions.md | 53 +++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 docs/interview-questions.md diff --git a/docs/interview-questions.md b/docs/interview-questions.md new file mode 100644 index 0000000..6e44193 --- /dev/null +++ b/docs/interview-questions.md @@ -0,0 +1,53 @@ +# Theoretical Questions + +`Q001:` What is typeof Operator? + +Answer: JavaScript provides a `typeof` operator that can examine a value tell you what type is is: + +``` + +let a; +typeof a; // 'undefined' + +a = "hello world"; +typeof a; // "string"; + + +a = 44; +typeof a; // "number" + +a = null; +typeof a; // 'object' + +a = true; +typeof a; // "boolean"; + +a = undefined; +typeof a; // "undefined"; + +a = { b: 'c'}; +typeof a; // "object" + + +``` + +`Q002:` What is the `object` type? + +Answer: The `object` type refers to a compound value where you can set properties(named locations) that each hold their own values of any type. + +``` +const obj = { + a: 'Hello World" , + b: 42, + c: true +}; + +obj.a; +obj.b; +obj.c; + +obj['a']; +obj['b']; +obj['c']; + +``` From 83e216f07ff417f83ffb84fe83a6c1b256bd6b50 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Tue, 20 Jun 2023 15:26:31 +0900 Subject: [PATCH 139/150] feat: update --- .../code-challenges-003-010.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/code-challenges/code-challenges-003-010.js b/src/code-challenges/code-challenges-003-010.js index 79571eb..895c66c 100644 --- a/src/code-challenges/code-challenges-003-010.js +++ b/src/code-challenges/code-challenges-003-010.js @@ -49,3 +49,22 @@ multiDimensionalSumOfSeveralArrayVariationReduce([[3, 2], [1], [4, 12]]); * Your goal is to print all numbers between low and high, and for each of these numbers print whether or not the number is divisible by 3. * If the number is divisible by 3, print the word "div3" directly after the number. */ + +function testDivisors(low, high) { + // we'll store all numbers and strings within an array + // instead of printing directly to the console. + let output = []; + + for (let i = low; i <= high; i++) { + // simply store the current number in the output array + output.push(i); + + // Check if the current number is evenly divisible by 3 + if (i % 3 === 0) output.push('div3'); + } + + // return all numbers and strings. + return output; +} + +testDivisors(2, 10); From b152ffb87efaed474246d4830cb28041fe20753c Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Tue, 20 Jun 2023 16:26:26 +0900 Subject: [PATCH 140/150] feat: oddBallSumVariationReduce --- .../code-challenges-003-010.js | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/code-challenges/code-challenges-003-010.js b/src/code-challenges/code-challenges-003-010.js index 895c66c..b0b9c74 100644 --- a/src/code-challenges/code-challenges-003-010.js +++ b/src/code-challenges/code-challenges-003-010.js @@ -68,3 +68,41 @@ function testDivisors(low, high) { } testDivisors(2, 10); + +/** + * Q006: Oddball sum + * Write a function called oddball_sum which takes in a list of numbers and returns the sum of all the odd elements. + * Try to solve with and without reduce function. + * + */ + +function oddBallSumVariationNormal(numbs) { + // Final count of all odd numbers added up + let finalCount = 0; + + // Loop through entire list + for (let i = 0; i < numbs.length; i++) { + // we divide by 2, and if there is a remainder then + // the number must be odd so we add it to finalCount. + + if (numbs[i] % 2 === 1) { + finalCount += numbs[i]; + } + } + + return finalCount; +} + +oddBallSumVariationNormal([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]); + +function oddBallSumVariationReduce(numbs) { + return numbs.reduce((total, item) => { + if (item % 2 === 1) { + return (total += item); + } + + return total; + }, 0); +} + +oddBallSumVariationReduce([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]); From 0f320f35f09395a5eba61d69510669d92a095046 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 21 Jun 2023 11:07:15 +0900 Subject: [PATCH 141/150] docs: updated --- docs/interview-questions.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/interview-questions.md b/docs/interview-questions.md index 6e44193..980ea6c 100644 --- a/docs/interview-questions.md +++ b/docs/interview-questions.md @@ -1,6 +1,6 @@ # Theoretical Questions -`Q001:` What is typeof Operator? +`Q001:` What is `typeof` Operator? Answer: JavaScript provides a `typeof` operator that can examine a value tell you what type is is: @@ -51,3 +51,4 @@ obj['b']; obj['c']; ``` + From c451e7df81af783c3b2d5759f38dacb91885b99b Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 21 Jun 2023 11:36:00 +0900 Subject: [PATCH 142/150] feat: explain arrays in javascript --- docs/interview-questions.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/interview-questions.md b/docs/interview-questions.md index 980ea6c..469ed17 100644 --- a/docs/interview-questions.md +++ b/docs/interview-questions.md @@ -52,3 +52,25 @@ obj['c']; ``` + +`Q003:` Explain `arrays` in JavaScript. + +Answer: An `array` is an object that holds values (of any type) not particularly in named properties/keys, but rather in numerically indexed positions: + +``` + +const arr = [ + 'hello world', + 42, + true +]; + +arr[0]; // 'hello world'; +arr[1]; // 42 +arr[3]; // true +arr.length? // 3 + + +typeof arr; // "object"; + +``` From 9473c04c5e451b9d39579bd3f874a5b2da7e15e6 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 21 Jun 2023 12:35:07 +0900 Subject: [PATCH 143/150] docs: scope --- docs/interview-questions.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/interview-questions.md b/docs/interview-questions.md index 469ed17..fd0bd12 100644 --- a/docs/interview-questions.md +++ b/docs/interview-questions.md @@ -52,7 +52,6 @@ obj['c']; ``` - `Q003:` Explain `arrays` in JavaScript. Answer: An `array` is an object that holds values (of any type) not particularly in named properties/keys, but rather in numerically indexed positions: @@ -74,3 +73,14 @@ arr.length? // 3 typeof arr; // "object"; ``` + +`Q004:` What is `scope` in JavaScript? + +Answer: In JavaScript, each function gets its own scope. Scope is basically a collection of variables as well as the rules for how those variables are accessed by name. Only code inside that function can access that function's scoped variables. + +1. A variable name has to be unique within the same scope. +2. A scope can be nested inside another scope. +3. If one scope is nested inside another, code inside the innermost scope can access variables from either scope. + + +`Q005:` What is `scope` in JavaScript? From bc851b94a00151a82785a6ddd8da0af346f8d37d Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 21 Jun 2023 12:59:08 +0900 Subject: [PATCH 144/150] docs: equality --- docs/interview-questions.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/docs/interview-questions.md b/docs/interview-questions.md index fd0bd12..a71cf96 100644 --- a/docs/interview-questions.md +++ b/docs/interview-questions.md @@ -83,4 +83,31 @@ Answer: In JavaScript, each function gets its own scope. Scope is basically a co 3. If one scope is nested inside another, code inside the innermost scope can access variables from either scope. -`Q005:` What is `scope` in JavaScript? +`Q005:` Explain `equality` in JavaScript. + +Answer: JavaScript has both strict and type converting comparisons: + +1. Strict comparison (`===`) checks for value quality without allowing coercion. + +`Q006:` Explain equality in JavaScript. + + +Answer: +`Q007:` Explain equality in JavaScript. + + +Answer: +`Q008:` Explain equality in JavaScript. + + +Answer: +`Q009:` Explain equality in JavaScript. + + +Answer: +`Q010:` Explain equality in JavaScript. + + +Answer: + + From 72c430eec947ccb04e65de1c9d9ff92c73535741 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Wed, 21 Jun 2023 18:39:31 +0900 Subject: [PATCH 145/150] feat: Sum of Array Plus One --- src/code-challenges/bubble-sort.js | 54 +----------- ...-003-010.js => code-challenges-002-010.js} | 86 +++++++++++++++++-- 2 files changed, 82 insertions(+), 58 deletions(-) rename src/code-challenges/{code-challenges-003-010.js => code-challenges-002-010.js} (53%) diff --git a/src/code-challenges/bubble-sort.js b/src/code-challenges/bubble-sort.js index ad9f031..bd5e388 100644 --- a/src/code-challenges/bubble-sort.js +++ b/src/code-challenges/bubble-sort.js @@ -1,5 +1,6 @@ /** - * 001: Bubble Sort: is based on the idea of repeatedly comparing pairs of adjacent elements and + * 001: Explain How Bubble Sort works + * Bubble Sort: is based on the idea of repeatedly comparing pairs of adjacent elements and * then swapping their positions if they are in the wrong order. * Bubble sort is a stable, in-place sort algorithm. */ @@ -46,54 +47,3 @@ const bubbleSortVariationRecursive = function (array, pointer = array.length - 1 }; bubbleSortVariationRecursive([6, 5, 3, 1, 8, 7, 2, 4]); - -/** - * Lucky Sevens - * 002: Write a function called lucky_sevens which takes an array of integers and returns true if any three consecutive elements sum to 7. - */ - -function luckySevensVariationOne(arrayOfIntegers) { - // Array length - const len = arrayOfIntegers.length; - // If array of length is less than 3 elements then this challenge is not possible. - if (len < 3) { - return 'Not possible'; - } - - // Because we know there are at least 3 elements we can - // Start the loop at the 3rd element in the array (i = 2); - // and check it along with the two previous elements (i - 1) and (i - 2) - - for (let i = 0; i < len; i++) { - if (arrayOfIntegers[i] + arrayOfIntegers[i - 1] + arrayOfIntegers[i - 2] === 7) { - return true; - } - } - - // if loop is finished and no elements summed to 7; - return false; -} - -luckySevensVariationOne([2, 1, 5, 1, 0]); - -function luckySevensVariationTwo(array) { - const len = array.length; - - // Iterate through the array. - - for (let i = 0; i < len - 2; i++) { - let sum = array[i] + array[i + 1] + array[i + 2]; - - if (sum === 7) { - return true; // Found three consecutive elements that sum to 3; - } - } - - return false; // No three consecutive elements sum to 7; -} - -let numbersOfLuckySeven = [1, 2, 3, 4, 5, 6, 1]; -console.log(luckySevensVariationTwo(numbers)); // Output: true - -var numbers2OfLuckySeven = [1, 2, 3, 4, 5, 6, 2]; -console.log(luckySevensVariationTwo(numbers2OfLuckySeven)); // Output: false diff --git a/src/code-challenges/code-challenges-003-010.js b/src/code-challenges/code-challenges-002-010.js similarity index 53% rename from src/code-challenges/code-challenges-003-010.js rename to src/code-challenges/code-challenges-002-010.js index b0b9c74..d6997a6 100644 --- a/src/code-challenges/code-challenges-003-010.js +++ b/src/code-challenges/code-challenges-002-010.js @@ -1,7 +1,57 @@ +/** + * 002: Lucky Sevens + * Problem: Write a function called lucky_sevens which takes an array of integers and returns true if any three consecutive elements sum to 7. + */ + +function luckySevensVariationOne(arrayOfIntegers) { + // Array length + const len = arrayOfIntegers.length; + // If array of length is less than 3 elements then this challenge is not possible. + if (len < 3) { + return 'Not possible'; + } + + // Because we know there are at least 3 elements we can + // Start the loop at the 3rd element in the array (i = 2); + // and check it along with the two previous elements (i - 1) and (i - 2) + + for (let i = 0; i < len; i++) { + if (arrayOfIntegers[i] + arrayOfIntegers[i - 1] + arrayOfIntegers[i - 2] === 7) { + return true; + } + } + + // if loop is finished and no elements summed to 7; + return false; +} + +luckySevensVariationOne([2, 1, 5, 1, 0]); + +function luckySevensVariationTwo(array) { + const len = array.length; + + // Iterate through the array. + + for (let i = 0; i < len - 2; i++) { + let sum = array[i] + array[i + 1] + array[i + 2]; + + if (sum === 7) { + return true; // Found three consecutive elements that sum to 3; + } + } + + return false; // No three consecutive elements sum to 7; +} + +let numbersOfLuckySeven = [1, 2, 3, 4, 5, 6, 1]; +console.log(luckySevensVariationTwo(numbers)); // Output: true + +var numbers2OfLuckySeven = [1, 2, 3, 4, 5, 6, 2]; +console.log(luckySevensVariationTwo(numbers2OfLuckySeven)); // Output: false + /** * Q003: Simple clock angle - * Problem - * You will be given a number N that represents where the minute hand currently is on a clock. + * Problem: You will be given a number N that represents where the minute hand currently is on a clock. * Your program should return the angle that is formed by the minute hand and the 12 o'clock mark on the clock. */ @@ -15,8 +65,7 @@ function simpleClockAngle(number) { /** * Q004: Sum of several arrays - * Problem - * You will be given an array of several arrays that each contain integers and your goal is to write a function that will sum up all the numbers in all the arrays. + * Problem: You will be given an array of several arrays that each contain integers and your goal is to write a function that will sum up all the numbers in all the arrays. * For example, if the input is [[3, 2], [1], [4, 12]] then your program should output 22 because 3 + 2 + 1 + 4 + 12 = 22. Solve without and with reduce. */ @@ -45,7 +94,7 @@ multiDimensionalSumOfSeveralArrayVariationReduce([[3, 2], [1], [4, 12]]); /** * Q005: Test divisors of three - * You will be given 2 parameters: a low and high number. + * Problem: You will be given 2 parameters: a low and high number. * Your goal is to print all numbers between low and high, and for each of these numbers print whether or not the number is divisible by 3. * If the number is divisible by 3, print the word "div3" directly after the number. */ @@ -71,7 +120,7 @@ testDivisors(2, 10); /** * Q006: Oddball sum - * Write a function called oddball_sum which takes in a list of numbers and returns the sum of all the odd elements. + * Problem: Write a function called oddball_sum which takes in a list of numbers and returns the sum of all the odd elements. * Try to solve with and without reduce function. * */ @@ -106,3 +155,28 @@ function oddBallSumVariationReduce(numbs) { } oddBallSumVariationReduce([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]); + +/** + * Q007: Sum of Array Plus One + * + * Problem: Write a function that takes an array of integers and returns the sum of the integers after adding 1 to each. + * + */ + +// ES5 method is nice and clean +exports.es5 = function (array) { + return array.reduce((memo, num) => { + return memo + num; + }, array.length); +}; + +// Without array.reduce method isn't much different +exports.iterative = function (array) { + let result = array.length; + + for (let i = 0; i < array.length; i++) { + result += array[i]; + } + + return result; +}; From b2e76f5e0ef25cbde3e25ba497c6c77d0fe3749e Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Thu, 22 Jun 2023 11:38:51 +0900 Subject: [PATCH 146/150] update --- src/code-challenges/code-challenges-002-010.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/code-challenges/code-challenges-002-010.js b/src/code-challenges/code-challenges-002-010.js index d6997a6..86f7525 100644 --- a/src/code-challenges/code-challenges-002-010.js +++ b/src/code-challenges/code-challenges-002-010.js @@ -180,3 +180,9 @@ exports.iterative = function (array) { return result; }; + +/** + * Q007: Sum of Array Plus One + * + + */ From 04d22ac7cf09ca39079fdb9730ffb6f4799629bd Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Fri, 23 Jun 2023 16:28:34 +0900 Subject: [PATCH 147/150] feat: added --- src/code-challenges/code-challenges-002-010.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/code-challenges/code-challenges-002-010.js b/src/code-challenges/code-challenges-002-010.js index 86f7525..9dc1867 100644 --- a/src/code-challenges/code-challenges-002-010.js +++ b/src/code-challenges/code-challenges-002-010.js @@ -182,7 +182,14 @@ exports.iterative = function (array) { }; /** - * Q007: Sum of Array Plus One - * - + * Q008: String Rotation + * Problem: Find out if a string is a rotation of another string. + * E.g. 'ABCD' is a rotation of 'BCDA' but not 'ACBD' */ + +// First make sure 'a' and 'b' are of the same length. +// Then check to see if 'b' is a substring of 'a' concatenated with 'a' + +module.exports = function (a, b) { + return a.length === b.length && (a + a).indexOf(b) > -1; +}; From 0692f23ceb38aa5ca39eb69810f5c3d5c900fcbf Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Fri, 23 Jun 2023 18:47:26 +0900 Subject: [PATCH 148/150] feat: fibonacci --- src/code-challenges/code-challenges-002-010.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/code-challenges/code-challenges-002-010.js b/src/code-challenges/code-challenges-002-010.js index 9dc1867..2ab5932 100644 --- a/src/code-challenges/code-challenges-002-010.js +++ b/src/code-challenges/code-challenges-002-010.js @@ -193,3 +193,18 @@ exports.iterative = function (array) { module.exports = function (a, b) { return a.length === b.length && (a + a).indexOf(b) > -1; }; + +/** + * Q009: Return the N-th value of the Fibonacci sequence. Solve in O(n) + */ + +// The easiest solution that comes to mind here is iteration. + +function fibonacciNumbers(n) { + let arr = [0, 1]; + + for (let i = 2; i < n + 1; i++) { + arr.push(arr[i - 2] + arr[i - 1]); + } + return arr[n]; +} From 8d20dd35e14000ff6a1e79827765c77211cb1503 Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Fri, 28 Jul 2023 18:29:40 +0900 Subject: [PATCH 149/150] feat: added --- src/interview/interview-01.js | 68 +++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/interview/interview-01.js b/src/interview/interview-01.js index ae4a83a..c1dbaaf 100644 --- a/src/interview/interview-01.js +++ b/src/interview/interview-01.js @@ -61,3 +61,71 @@ function containsCommonItem3(arr1, arr2) { containsCommonItem(array1, array2); containsCommonItem2(array1, array2); containsCommonItem3(array1, array2); + + +Std_arr.sort((a, b) => a.name.localeCompare(b.name)); + +function orderByName(users) { + // // Sort the array of objects based on the 'name' property + users.sort((a, b) => a.name.localeCompare(b.name)); +} + +orderByName([{name: "Charles"}, {name: "Alice"}, {name: "bob"}]) +# => [{name: "Alice"}, {name: "bob"}, {name: "Charles"}] + + + +const getReferrers = function (user_list) { + const users = JSON.parse(JSON.stringify(user_list)); + let referrerUsers = []; + for (i = 0; i < users.length; i++) { + users[i].referrer = users.find( (user) => { + if (user.id == users[i]["referrerId"]) { + return true; + } + }) + users[i].referrer = users[i].referrer && users[i].referrer.name || null; + referrerUsers.push(users[i]) + } + + return referrerUsers; +} + + + + +getReferrers([ + { id: 1, referrerId: 1, name: "Joe" }, + { id: 2, referrerId: 2, name: "Jane" }, + { id: 3, referrerId: null, name: "Liane" }, + { id: 4, referrerId: null, name: "Aane" }, +]) +Please write a program to build a list containing the numbers from 1 to 100, +except that multiples of 3 are replaced by "Fizz", +the multiples of 5 are removed, +and multiples of 15 are replaced by "FizzBuzz". + + +function listOfContainWithFizzBuzz() { + // Storage of list. + const lists = []; + + for (let i = 1; i <= 100; i++) { + if (i % 15 === 0) { // multiples of 15 are replaced by "FizzBuzz" + lists.push("FizzBuzz"); + } else if (i % 3 === 0) { // multiples of 3 are replaced by "Fizz" + lists.push("Fizz"); + } else if (i % 5 === 0) { // multiples of 5 are removed + continue; + } else { + lists.push(i); // Normal case without apply any logic. + } + } + + return lists; +} + +const result = buildList(); +console.log(result); + + From 21595ae7050b47212e56d799b8fc751706457c2d Mon Sep 17 00:00:00 2001 From: wakidurrahman Date: Tue, 1 Aug 2023 11:04:38 +0900 Subject: [PATCH 150/150] feat: update --- src/code-challenges/bubble-sort.js | 143 +++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) diff --git a/src/code-challenges/bubble-sort.js b/src/code-challenges/bubble-sort.js index bd5e388..b5cf6d2 100644 --- a/src/code-challenges/bubble-sort.js +++ b/src/code-challenges/bubble-sort.js @@ -47,3 +47,146 @@ const bubbleSortVariationRecursive = function (array, pointer = array.length - 1 }; bubbleSortVariationRecursive([6, 5, 3, 1, 8, 7, 2, 4]); + +// 01: Exercise +const bubbleSortExercise = array => { + let swaps; + do { + swaps = false; + for (let i = 0; i < array.length - 1; i++) { + if (array[i] > array[i + 1]) { + console.log('Swaps inner', swaps, array[i]); + let tempStore = array[i + 1]; + array[i + 1] = array[i]; + array[i] = tempStore; + swaps = true; + } + } + console.log('Swaps Outer', swaps); + } while (swaps); + + return array; +}; + +bubbleSortExercise([6, 5, 3, 1, 8, 7, 2, 4]); + +// 02: Write a function called lucky_sevens which takes an array of integers and returns true if any three consecutive elements sum to 7. + +function luckySevensExercise(array) { + if (array.length < 3) { + return 'This challenge is not possible'; + // console.log('This challenge is not possible'); + } + for (let i = 2; i < array.length; i++) { + const element = array[i]; + console.log(element); + if (array[i] + array[i - 1] + array[i - 2] === 7) { + return true; + } + } +} + +luckySevensExercise([2, 3, 4, 5, 6, 1, 2, 4, 5, 2, 1, 5]); + +// 03 + +function simpleClockAngleExercises(num) { + // total degrees 360 + // total minute 60 + // 60/360 = 6; + // any number multiple by 6 will return angle + return 6 * num; +} + +simpleClockAngleExercises(30); + +// 04; +function sumOfMultidimensionalArray(array) { + // Store sum + let sum = 0; + for (let i = 0; i < array.length; i++) { + for (let j = 0; j < array[i].length; j++) { + sum += array[i][j]; + } + } + return sum; +} + +sumOfMultidimensionalArray([[3, 2], [1], [4, 12]]); + +// using reduce + +function sumOfMultidimensionalArrayByReduce(array) { + return array.reduce((t, e) => t.concat(e)).reduce((t, e) => t + e); +} + +// 05; + +function divisorsOfThree(low, high) { + let output = []; + for (let i = low; index < high; i++) { + // simply store the current number in the store + output.push(i); + // check if the current number is evenly divisible by 3 + if (i % 3 === 0) output.push('div3'); + } + return output; +} + +function divisorsOfThree01(low, high) { + let result = []; + for (let i = low; i < high; i++) { + if (i % 3 === 0) { + result.push('div3'); + } else { + result.push(i); + } + } + return result; +} + +divisorsOfThree(2, 15); +divisorsOfThree01(2, 15); + +// 06; + +function oddBallSub(numbers) { + let result; + for (let i = 0; i < numbers.length; i++) { + // we divide by 2, and if there is a remainder then + // the number must be odd so we add it to final_count + if (numbers[i] % 2 === 1) { + result += numbers[i]; + } + } + return result; +} +function oddBallSub01(numbers) { + return numbers.reduce((total, item) => { + console.log('all', item); + if (item % 2 === 1) { + console.log(item); + return (total += item); + } + return total; + }, 0); +} + +oddBallSub01([8, 2, 3, 4, 5]); + +// 07 + +function plusOneSumExercises(array) { + return array.reduce((memo, num) => { + return memo + num; + }, array.length); +} +function plusOneSumExercises01(array) { + let result = array.length; // sum of all number for 1 plus for each number. + for (let i = 0; i < array.length; i++) { + result = array[i]; + } + return; +} + +// 08