math-exercises 3.0.215 → 3.0.216
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/exercises/math/arithmetic/whichDayInXDays.d.ts.map +1 -1
- package/lib/exercises/math/arithmetic/whichDayInXDays.js +2 -1
- package/lib/exercises/math/complex/unitRoots/giveOneSolutionToComplexPowNEqualsOne.js +1 -1
- package/lib/exercises/math/conversion/clock/index.d.ts +0 -1
- package/lib/exercises/math/conversion/clock/index.d.ts.map +1 -1
- package/lib/exercises/math/conversion/clock/index.js +1 -1
- package/lib/exercises/math/graphs/adjacentMatrixPath.d.ts +10 -0
- package/lib/exercises/math/graphs/adjacentMatrixPath.d.ts.map +1 -0
- package/lib/exercises/math/graphs/adjacentMatrixPath.js +89 -0
- package/lib/exercises/math/graphs/edgesNumberFromSummitsDegrees.d.ts +7 -0
- package/lib/exercises/math/graphs/edgesNumberFromSummitsDegrees.d.ts.map +1 -0
- package/lib/exercises/math/graphs/edgesNumberFromSummitsDegrees.js +98 -0
- package/lib/exercises/math/graphs/eulerianChainFromAdjacentMatrix.d.ts +8 -0
- package/lib/exercises/math/graphs/eulerianChainFromAdjacentMatrix.d.ts.map +1 -0
- package/lib/exercises/math/graphs/eulerianChainFromAdjacentMatrix.js +96 -0
- package/lib/exercises/math/graphs/graphsChainOrPathOfLengthN.d.ts +15 -0
- package/lib/exercises/math/graphs/graphsChainOrPathOfLengthN.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsChainOrPathOfLengthN.js +262 -0
- package/lib/exercises/math/graphs/graphsCheckIsConnectedUndirectedGraph.d.ts +11 -0
- package/lib/exercises/math/graphs/graphsCheckIsConnectedUndirectedGraph.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsCheckIsConnectedUndirectedGraph.js +178 -0
- package/lib/exercises/math/graphs/graphsCheckIsSameGraph.d.ts +19 -0
- package/lib/exercises/math/graphs/graphsCheckIsSameGraph.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsCheckIsSameGraph.js +301 -0
- package/lib/exercises/math/graphs/graphsCheckIsVerticesAdjacent.d.ts +16 -0
- package/lib/exercises/math/graphs/graphsCheckIsVerticesAdjacent.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsCheckIsVerticesAdjacent.js +207 -0
- package/lib/exercises/math/graphs/graphsDegreeOfVertex.d.ts +15 -0
- package/lib/exercises/math/graphs/graphsDegreeOfVertex.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsDegreeOfVertex.js +232 -0
- package/lib/exercises/math/graphs/graphsOrderOfGraph.d.ts +14 -0
- package/lib/exercises/math/graphs/graphsOrderOfGraph.d.ts.map +1 -0
- package/lib/exercises/math/graphs/graphsOrderOfGraph.js +222 -0
- package/lib/exercises/math/graphs/index.d.ts +10 -0
- package/lib/exercises/math/graphs/index.d.ts.map +1 -0
- package/lib/exercises/math/graphs/index.js +9 -0
- package/lib/exercises/math/index.d.ts +1 -0
- package/lib/exercises/math/index.d.ts.map +1 -1
- package/lib/exercises/math/index.js +1 -0
- package/lib/exercises/math/matrices/areMatricesInverse.d.ts +9 -0
- package/lib/exercises/math/matrices/areMatricesInverse.d.ts.map +1 -0
- package/lib/exercises/math/matrices/areMatricesInverse.js +106 -0
- package/lib/exercises/math/matrices/computeFixedMatrixInRecurrenceSequence.d.ts +9 -0
- package/lib/exercises/math/matrices/computeFixedMatrixInRecurrenceSequence.d.ts.map +1 -0
- package/lib/exercises/math/matrices/computeFixedMatrixInRecurrenceSequence.js +144 -0
- package/lib/exercises/math/matrices/findInversedMatrixFromSystem.d.ts +8 -0
- package/lib/exercises/math/matrices/findInversedMatrixFromSystem.d.ts.map +1 -0
- package/lib/exercises/math/matrices/findInversedMatrixFromSystem.js +148 -0
- package/lib/exercises/math/matrices/index.d.ts +12 -0
- package/lib/exercises/math/matrices/index.d.ts.map +1 -1
- package/lib/exercises/math/matrices/index.js +12 -0
- package/lib/exercises/math/matrices/isMatrixTransitionMatrix.d.ts +8 -0
- package/lib/exercises/math/matrices/isMatrixTransitionMatrix.d.ts.map +1 -0
- package/lib/exercises/math/matrices/isMatrixTransitionMatrix.js +132 -0
- package/lib/exercises/math/matrices/matrixBuildMatrixFromCoefficients.d.ts +8 -0
- package/lib/exercises/math/matrices/matrixBuildMatrixFromCoefficients.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixBuildMatrixFromCoefficients.js +152 -0
- package/lib/exercises/math/matrices/matrixCheckIsSymmetrical.d.ts +8 -0
- package/lib/exercises/math/matrices/matrixCheckIsSymmetrical.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixCheckIsSymmetrical.js +155 -0
- package/lib/exercises/math/matrices/matrixComputeDetOfMat2.d.ts +8 -0
- package/lib/exercises/math/matrices/matrixComputeDetOfMat2.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixComputeDetOfMat2.js +142 -0
- package/lib/exercises/math/matrices/matrixComputeInverseOfMat2.d.ts +8 -0
- package/lib/exercises/math/matrices/matrixComputeInverseOfMat2.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixComputeInverseOfMat2.js +237 -0
- package/lib/exercises/math/matrices/matrixComputeLinearCombination.d.ts +15 -0
- package/lib/exercises/math/matrices/matrixComputeLinearCombination.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixComputeLinearCombination.js +232 -0
- package/lib/exercises/math/matrices/matrixComputePower.d.ts +12 -0
- package/lib/exercises/math/matrices/matrixComputePower.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixComputePower.js +230 -0
- package/lib/exercises/math/matrices/matrixComputeProduct.d.ts +9 -0
- package/lib/exercises/math/matrices/matrixComputeProduct.d.ts.map +1 -0
- package/lib/exercises/math/matrices/matrixComputeProduct.js +178 -0
- package/lib/exercises/math/matrices/writeMatrixAssociatedToSystem.d.ts +8 -0
- package/lib/exercises/math/matrices/writeMatrixAssociatedToSystem.d.ts.map +1 -0
- package/lib/exercises/math/matrices/writeMatrixAssociatedToSystem.js +105 -0
- package/lib/exercises/vea/matrixVEA.d.ts +2 -0
- package/lib/exercises/vea/matrixVEA.d.ts.map +1 -0
- package/lib/exercises/vea/matrixVEA.js +1 -0
- package/lib/index.d.ts +86 -13
- package/lib/index.d.ts.map +1 -1
- package/lib/math/geometry/point.d.ts.map +1 -1
- package/lib/math/geometry/point.js +3 -1
- package/lib/math/graphs/graph.d.ts +43 -0
- package/lib/math/graphs/graph.d.ts.map +1 -0
- package/lib/math/graphs/graph.js +391 -0
- package/lib/math/matrices/matrix.d.ts +42 -3
- package/lib/math/matrices/matrix.d.ts.map +1 -1
- package/lib/math/matrices/matrix.js +173 -7
- package/lib/math/matrices/parseMatrix.d.ts +3 -0
- package/lib/math/matrices/parseMatrix.d.ts.map +1 -0
- package/lib/math/matrices/parseMatrix.js +22 -0
- package/lib/math/systems/generalSystem.d.ts +2 -0
- package/lib/math/systems/generalSystem.d.ts.map +1 -1
- package/lib/math/systems/generalSystem.js +5 -0
- package/lib/math/utils/graphs/graphRenderer.d.ts +25 -0
- package/lib/math/utils/graphs/graphRenderer.d.ts.map +1 -0
- package/lib/math/utils/graphs/graphRenderer.js +123 -0
- package/lib/playground.d.ts +6 -1
- package/lib/playground.d.ts.map +1 -1
- package/lib/playground.js +6 -5
- package/lib/tree/parsers/latexParser.d.ts +1 -1
- package/lib/tree/utilities/nodeSimplifier.d.ts +1 -1
- package/lib/types/keyIds.d.ts +2 -0
- package/lib/types/keyIds.d.ts.map +1 -1
- package/lib/utils/arrays/arrayChunks.d.ts +9 -0
- package/lib/utils/arrays/arrayChunks.d.ts.map +1 -0
- package/lib/utils/arrays/arrayChunks.js +34 -0
- package/lib/utils/strings/ordinalSuffixed.d.ts +2 -0
- package/lib/utils/strings/ordinalSuffixed.d.ts.map +1 -0
- package/lib/utils/strings/ordinalSuffixed.js +5 -0
- package/package.json +7 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { addValidProp, propWhile, shuffleProps, tryToAddWrongProp, } from "../../../exercises/exercise.js";
|
|
2
|
+
import { getDistinctQuestions } from "../../../exercises/utils/getDistinctQuestions.js";
|
|
3
|
+
import { Matrix, MatrixConstructor, } from "../../../math/matrices/matrix.js";
|
|
4
|
+
import { add } from "../../../tree/nodes/operators/addNode.js";
|
|
5
|
+
import { multiply } from "../../../tree/nodes/operators/multiplyNode.js";
|
|
6
|
+
import { parseAlgebraic } from "../../../tree/parsers/latexParser.js";
|
|
7
|
+
import { NodeComparator } from "../../../tree/utilities/nodeComparator.js";
|
|
8
|
+
import { handleVEAError } from "../../../utils/errors/handleVEAError.js";
|
|
9
|
+
import { alignTex } from "../../../utils/latex/alignTex.js";
|
|
10
|
+
const getHydrated = (identifiers) => {
|
|
11
|
+
const { matIdsA } = identifiers;
|
|
12
|
+
const [matA] = [matIdsA].map((matIds) => MatrixConstructor.fromIdentifiers(matIds));
|
|
13
|
+
return {
|
|
14
|
+
matA,
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
const getInstruction = (identifiers) => {
|
|
18
|
+
const { matA } = getHydrated(identifiers);
|
|
19
|
+
return `Soit :
|
|
20
|
+
|
|
21
|
+
$$
|
|
22
|
+
A = ${matA.toTex()}
|
|
23
|
+
$$
|
|
24
|
+
|
|
25
|
+
Calculer le déterminant de $A$.`;
|
|
26
|
+
};
|
|
27
|
+
const getAnswerNode = (identifiers) => {
|
|
28
|
+
const { matA } = getHydrated(identifiers);
|
|
29
|
+
return matA.determinant();
|
|
30
|
+
};
|
|
31
|
+
const getAnswer = (identifiers) => {
|
|
32
|
+
return getAnswerNode(identifiers)
|
|
33
|
+
.simplify({ towardsDistribute: true })
|
|
34
|
+
.toTex();
|
|
35
|
+
};
|
|
36
|
+
const getHint = () => {
|
|
37
|
+
const matA = new Matrix([
|
|
38
|
+
["a".toTree(), "b".toTree()],
|
|
39
|
+
["c".toTree(), "d".toTree()],
|
|
40
|
+
]);
|
|
41
|
+
return `Soient $A$ une matrice à $2$ lignes et $2$ colonnes à coefficients réels.
|
|
42
|
+
|
|
43
|
+
$$
|
|
44
|
+
A = ${matA.toTex()}
|
|
45
|
+
$$
|
|
46
|
+
|
|
47
|
+
$$
|
|
48
|
+
\\text{det}(A) = \\begin{vmatrix} a & b \\\\ c & d \\end{vmatrix} = ${matA
|
|
49
|
+
.determinant()
|
|
50
|
+
.toTex()}
|
|
51
|
+
$$
|
|
52
|
+
|
|
53
|
+
`;
|
|
54
|
+
};
|
|
55
|
+
const getCorrection = (identifiers) => {
|
|
56
|
+
const { matA } = getHydrated(identifiers);
|
|
57
|
+
return `${alignTex([
|
|
58
|
+
["\\text{det}(A)", "=", matA.toTex().replaceAll("pmatrix", "vmatrix")],
|
|
59
|
+
[
|
|
60
|
+
"",
|
|
61
|
+
"=",
|
|
62
|
+
matA
|
|
63
|
+
.determinant()
|
|
64
|
+
.toTex({ forceNoSimplification: true, forceTimesSign: true }),
|
|
65
|
+
],
|
|
66
|
+
["", "=", matA.determinant().simplify({ towardsDistribute: true }).toTex()],
|
|
67
|
+
])}`;
|
|
68
|
+
};
|
|
69
|
+
const getPropositions = (n, { answer, ...identifiers }) => {
|
|
70
|
+
const propositions = [];
|
|
71
|
+
addValidProp(propositions, answer);
|
|
72
|
+
const { matA } = getHydrated(identifiers);
|
|
73
|
+
//student ad-cb -> ad+cb
|
|
74
|
+
{
|
|
75
|
+
const [[a, b], [c, d]] = matA.elements;
|
|
76
|
+
const detWrong = add(multiply(a, d), multiply(b, c)).simplify({
|
|
77
|
+
towardsDistribute: true,
|
|
78
|
+
});
|
|
79
|
+
tryToAddWrongProp(propositions, detWrong.toTex());
|
|
80
|
+
}
|
|
81
|
+
//filler
|
|
82
|
+
{
|
|
83
|
+
propWhile(propositions, n, () => {
|
|
84
|
+
const identifiersWrong = createRandomIdentifiers();
|
|
85
|
+
tryToAddWrongProp(propositions, getAnswer(identifiersWrong));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return shuffleProps(propositions, n);
|
|
89
|
+
};
|
|
90
|
+
const getKeys = () => {
|
|
91
|
+
return [];
|
|
92
|
+
};
|
|
93
|
+
const isAnswerValid = (ans, { answer }) => {
|
|
94
|
+
try {
|
|
95
|
+
const nodeAns = parseAlgebraic(ans);
|
|
96
|
+
const nodeAnswer = parseAlgebraic(answer);
|
|
97
|
+
return (NodeComparator.isEqualViaSub(nodeAns, nodeAnswer) ||
|
|
98
|
+
NodeComparator.isEqualViaFrac(nodeAns, nodeAnswer));
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
handleVEAError(e);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const createRandomIdentifiers = () => {
|
|
106
|
+
const matA = MatrixConstructor.random(2, 2);
|
|
107
|
+
const identifiers = {
|
|
108
|
+
matIdsA: matA.toIdentifiers(),
|
|
109
|
+
};
|
|
110
|
+
return identifiers;
|
|
111
|
+
};
|
|
112
|
+
const getMatrixComputeDetOfMat2Question = () => {
|
|
113
|
+
const identifiers = createRandomIdentifiers();
|
|
114
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
115
|
+
};
|
|
116
|
+
const getQuestionFromIdentifiers = (identifiers, optsIn) => {
|
|
117
|
+
const question = {
|
|
118
|
+
answer: getAnswer(identifiers),
|
|
119
|
+
instruction: getInstruction(identifiers),
|
|
120
|
+
keys: getKeys(identifiers),
|
|
121
|
+
answerFormat: "tex",
|
|
122
|
+
identifiers,
|
|
123
|
+
hint: getHint(identifiers),
|
|
124
|
+
correction: getCorrection(identifiers),
|
|
125
|
+
options: optsIn,
|
|
126
|
+
};
|
|
127
|
+
return question;
|
|
128
|
+
};
|
|
129
|
+
export const matrixComputeDetOfMat2 = {
|
|
130
|
+
id: "matrixComputeDetOfMat2",
|
|
131
|
+
connector: "=",
|
|
132
|
+
label: "Calculer le déterminant d'une matrice carrée d'ordre $2$",
|
|
133
|
+
isSingleStep: true,
|
|
134
|
+
generator: (nb, opts) => getDistinctQuestions(() => getMatrixComputeDetOfMat2Question(opts), nb),
|
|
135
|
+
qcmTimer: 60,
|
|
136
|
+
freeTimer: 60,
|
|
137
|
+
getPropositions,
|
|
138
|
+
isAnswerValid,
|
|
139
|
+
subject: "Mathématiques",
|
|
140
|
+
getQuestionFromIdentifiers,
|
|
141
|
+
hasHintAndCorrection: true,
|
|
142
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Exercise } from "../../../exercises/exercise.js";
|
|
2
|
+
import { MatrixIdentifiers } from "../../../math/matrices/matrix.js";
|
|
3
|
+
type Identifiers = {
|
|
4
|
+
matIdsA: MatrixIdentifiers;
|
|
5
|
+
};
|
|
6
|
+
export declare const matrixComputeInverseOfMat2: Exercise<Identifiers>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=matrixComputeInverseOfMat2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrixComputeInverseOfMat2.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/matrices/matrixComputeInverseOfMat2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAgBT,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAGL,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;AAWvC,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,iBAAiB,CAAC;CAC5B,CAAC;AAwPF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,WAAW,CAc5D,CAAC"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { addValidProp, propWhile, shuffleProps, tryToAddWrongProp, } from "../../../exercises/exercise.js";
|
|
2
|
+
import { getDistinctQuestions } from "../../../exercises/utils/getDistinctQuestions.js";
|
|
3
|
+
import { Matrix, MatrixConstructor, } from "../../../math/matrices/matrix.js";
|
|
4
|
+
import { parseMatrix } from "../../../math/matrices/parseMatrix.js";
|
|
5
|
+
import { opposite } from "../../../tree/nodes/functions/oppositeNode.js";
|
|
6
|
+
import { add } from "../../../tree/nodes/operators/addNode.js";
|
|
7
|
+
import { frac } from "../../../tree/nodes/operators/fractionNode.js";
|
|
8
|
+
import { multiply } from "../../../tree/nodes/operators/multiplyNode.js";
|
|
9
|
+
import { NodeComparator } from "../../../tree/utilities/nodeComparator.js";
|
|
10
|
+
import { handleVEAError } from "../../../utils/errors/handleVEAError.js";
|
|
11
|
+
import { alignTex } from "../../../utils/latex/alignTex.js";
|
|
12
|
+
const getHydrated = (identifiers) => {
|
|
13
|
+
const { matIdsA } = identifiers;
|
|
14
|
+
const [matA] = [matIdsA].map((matIds) => MatrixConstructor.fromIdentifiers(matIds));
|
|
15
|
+
return {
|
|
16
|
+
matA,
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
const getInstruction = (identifiers) => {
|
|
20
|
+
const { matA } = getHydrated(identifiers);
|
|
21
|
+
return `Soit :
|
|
22
|
+
|
|
23
|
+
$$
|
|
24
|
+
A = ${matA.toTex()}
|
|
25
|
+
$$
|
|
26
|
+
|
|
27
|
+
Déterminer l'inverse de $A$.`;
|
|
28
|
+
};
|
|
29
|
+
const getAnswer = (identifiers) => {
|
|
30
|
+
const { matA } = getHydrated(identifiers);
|
|
31
|
+
const matInverse = matA.inverse();
|
|
32
|
+
return matInverse
|
|
33
|
+
? matInverse.simplify({ towardsDistribute: true }).toTex()
|
|
34
|
+
: "A\\text{ n'est pas inversible}";
|
|
35
|
+
};
|
|
36
|
+
const getHint = () => {
|
|
37
|
+
const matA = new Matrix([
|
|
38
|
+
["a".toTree(), "b".toTree()],
|
|
39
|
+
["c".toTree(), "d".toTree()],
|
|
40
|
+
]);
|
|
41
|
+
return `Soient $A$ une matrice à $2$ lignes et $2$ colonnes à coefficients réels.
|
|
42
|
+
|
|
43
|
+
$$
|
|
44
|
+
A = ${matA.toTex()}
|
|
45
|
+
$$
|
|
46
|
+
|
|
47
|
+
$$
|
|
48
|
+
\\text{det}(A) = \\begin{vmatrix} a & b \\\\ c & d \\end{vmatrix} = ${matA
|
|
49
|
+
.determinant()
|
|
50
|
+
.toTex()}
|
|
51
|
+
$$
|
|
52
|
+
|
|
53
|
+
Si $\\text{det}(A) \\neq 0$ alors $A$ est inversible et
|
|
54
|
+
|
|
55
|
+
$$
|
|
56
|
+
A^{-1} = \\frac{1}{\\text{det}(A)} \\begin{pmatrix} d & -b \\\\ -c & a \\end{pmatrix}
|
|
57
|
+
$$
|
|
58
|
+
|
|
59
|
+
Sinon, $A$ n'a pas d'inverse.
|
|
60
|
+
|
|
61
|
+
`;
|
|
62
|
+
};
|
|
63
|
+
const getCorrection = (identifiers) => {
|
|
64
|
+
const { matA } = getHydrated(identifiers);
|
|
65
|
+
const [[a, b], [c, d]] = matA.elements;
|
|
66
|
+
const nodeDet = matA.determinant();
|
|
67
|
+
const matAForFormula = new Matrix([
|
|
68
|
+
["a".toTree(), "b".toTree()],
|
|
69
|
+
["c".toTree(), "d".toTree()],
|
|
70
|
+
]);
|
|
71
|
+
return `On commence par calculer le déterminant de $A$ :
|
|
72
|
+
|
|
73
|
+
${alignTex([
|
|
74
|
+
["\\text{det}(A)", "=", matA.toTex().replaceAll("pmatrix", "vmatrix")],
|
|
75
|
+
[
|
|
76
|
+
"",
|
|
77
|
+
"=",
|
|
78
|
+
nodeDet.toTex({ forceNoSimplification: true, forceTimesSign: true }),
|
|
79
|
+
],
|
|
80
|
+
["", "=", nodeDet.simplify({ towardsDistribute: true }).toTex()],
|
|
81
|
+
])}
|
|
82
|
+
|
|
83
|
+
${(() => {
|
|
84
|
+
if (NodeComparator.isEqualViaSub(nodeDet, (0).toTree())) {
|
|
85
|
+
return `Le déterminant vaut $0$ : La matrice $A$ n'est donc pas inversible.`;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
return `Le déterminant n'est pas nul : La matrice $A$ est donc inversible.
|
|
89
|
+
|
|
90
|
+
Pour une matrice carrée d'ordre $2$, il existe une formule pour calculer l'inverse.
|
|
91
|
+
|
|
92
|
+
En posant:
|
|
93
|
+
|
|
94
|
+
$$
|
|
95
|
+
A = ${matAForFormula.toTex()}
|
|
96
|
+
$$
|
|
97
|
+
|
|
98
|
+
${alignTex([
|
|
99
|
+
[
|
|
100
|
+
"A^{-1}",
|
|
101
|
+
"=",
|
|
102
|
+
"\\frac{1}{\\text{det}(A)} \\begin{pmatrix} d & -b \\\\ -c & a \\end{pmatrix}",
|
|
103
|
+
],
|
|
104
|
+
])}
|
|
105
|
+
|
|
106
|
+
Ici, on a donc :
|
|
107
|
+
|
|
108
|
+
${alignTex([
|
|
109
|
+
[
|
|
110
|
+
"A^{-1}",
|
|
111
|
+
"=",
|
|
112
|
+
`\\frac{1}{${nodeDet
|
|
113
|
+
.simplify({
|
|
114
|
+
towardsDistribute: true,
|
|
115
|
+
})
|
|
116
|
+
.toTex()}} \\begin{pmatrix} ${d.toTex()} & ${opposite(b)
|
|
117
|
+
.simplify()
|
|
118
|
+
.toTex()} \\\\ ${opposite(c)
|
|
119
|
+
.simplify()
|
|
120
|
+
.toTex()} & ${a.toTex()} \\end{pmatrix}`,
|
|
121
|
+
],
|
|
122
|
+
["", "=", matA.inverse().simplify({ towardsDistribute: true }).toTex()],
|
|
123
|
+
])}
|
|
124
|
+
|
|
125
|
+
`;
|
|
126
|
+
}
|
|
127
|
+
})()}
|
|
128
|
+
|
|
129
|
+
`;
|
|
130
|
+
};
|
|
131
|
+
const getPropositions = (n, { answer, ...identifiers }) => {
|
|
132
|
+
const propositions = [];
|
|
133
|
+
addValidProp(propositions, answer);
|
|
134
|
+
//impossible
|
|
135
|
+
{
|
|
136
|
+
const texImpossible = "A\\text{ n'est pas inversible}";
|
|
137
|
+
tryToAddWrongProp(propositions, texImpossible);
|
|
138
|
+
}
|
|
139
|
+
const { matA } = getHydrated(identifiers);
|
|
140
|
+
//student A^{-1} -> tA
|
|
141
|
+
{
|
|
142
|
+
const matWrong = matA.transposed();
|
|
143
|
+
tryToAddWrongProp(propositions, matWrong.toTex());
|
|
144
|
+
}
|
|
145
|
+
//student ad-cb -> ad+cb
|
|
146
|
+
{
|
|
147
|
+
const [[a, b], [c, d]] = matA.elements;
|
|
148
|
+
const detWrong = add(multiply(a, d), multiply(b, c)).simplify({
|
|
149
|
+
towardsDistribute: true,
|
|
150
|
+
});
|
|
151
|
+
if (NodeComparator.isEqualViaSub(detWrong, (0).toTree())) {
|
|
152
|
+
//ignore
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
const matWrong = new Matrix([
|
|
156
|
+
[d, opposite(b)],
|
|
157
|
+
[opposite(c), a],
|
|
158
|
+
]).times(frac(1, detWrong));
|
|
159
|
+
tryToAddWrongProp(propositions, matWrong.simplify({ towardsDistribute: true }).toTex());
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//filler
|
|
163
|
+
{
|
|
164
|
+
propWhile(propositions, n, () => {
|
|
165
|
+
const identifiersWrong = createRandomIdentifiers();
|
|
166
|
+
tryToAddWrongProp(propositions, getAnswer(identifiersWrong));
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
return shuffleProps(propositions, n);
|
|
170
|
+
};
|
|
171
|
+
const getKeys = () => {
|
|
172
|
+
return [
|
|
173
|
+
{
|
|
174
|
+
id: "custom",
|
|
175
|
+
label: "A\\text{ n'est pas inversible}",
|
|
176
|
+
labelType: "tex",
|
|
177
|
+
mathfieldInstructions: {
|
|
178
|
+
content: "A\\text{ n'est pas inversible}",
|
|
179
|
+
method: "write",
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
];
|
|
183
|
+
};
|
|
184
|
+
const isAnswerValid = (ans, { answer }) => {
|
|
185
|
+
if (answer === "A\\text{ n'est pas inversible}") {
|
|
186
|
+
return ans === answer;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
try {
|
|
190
|
+
const matAns = parseMatrix(ans);
|
|
191
|
+
const matAnswer = parseMatrix(answer);
|
|
192
|
+
return matAns.equals(matAnswer);
|
|
193
|
+
}
|
|
194
|
+
catch (e) {
|
|
195
|
+
handleVEAError(e);
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
const createRandomIdentifiers = () => {
|
|
201
|
+
const matA = MatrixConstructor.random(2, 2);
|
|
202
|
+
const identifiers = {
|
|
203
|
+
matIdsA: matA.toIdentifiers(),
|
|
204
|
+
};
|
|
205
|
+
return identifiers;
|
|
206
|
+
};
|
|
207
|
+
const getMatrixComputeInverseOfMat2Question = () => {
|
|
208
|
+
const identifiers = createRandomIdentifiers();
|
|
209
|
+
return getQuestionFromIdentifiers(identifiers);
|
|
210
|
+
};
|
|
211
|
+
const getQuestionFromIdentifiers = (identifiers, optsIn) => {
|
|
212
|
+
const question = {
|
|
213
|
+
answer: getAnswer(identifiers),
|
|
214
|
+
instruction: getInstruction(identifiers),
|
|
215
|
+
keys: getKeys(identifiers),
|
|
216
|
+
answerFormat: "tex",
|
|
217
|
+
identifiers,
|
|
218
|
+
hint: getHint(identifiers),
|
|
219
|
+
correction: getCorrection(identifiers),
|
|
220
|
+
options: optsIn,
|
|
221
|
+
};
|
|
222
|
+
return question;
|
|
223
|
+
};
|
|
224
|
+
export const matrixComputeInverseOfMat2 = {
|
|
225
|
+
id: "matrixComputeInverseOfMat2",
|
|
226
|
+
connector: "=",
|
|
227
|
+
label: "Calculer l'inverse d'une matrice carrée d'ordre $2$",
|
|
228
|
+
isSingleStep: true,
|
|
229
|
+
generator: (nb, opts) => getDistinctQuestions(() => getMatrixComputeInverseOfMat2Question(opts), nb),
|
|
230
|
+
qcmTimer: 60,
|
|
231
|
+
freeTimer: 60,
|
|
232
|
+
getPropositions,
|
|
233
|
+
isAnswerValid,
|
|
234
|
+
subject: "Mathématiques",
|
|
235
|
+
getQuestionFromIdentifiers,
|
|
236
|
+
hasHintAndCorrection: true,
|
|
237
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Exercise } from "../../../exercises/exercise.js";
|
|
2
|
+
import { MatrixIdentifiers } from "../../../math/matrices/matrix.js";
|
|
3
|
+
import { NodeIdentifiers } from "../../../tree/nodes/nodeConstructor.js";
|
|
4
|
+
type Identifiers = {
|
|
5
|
+
matIdsA: MatrixIdentifiers;
|
|
6
|
+
matIdsB: MatrixIdentifiers;
|
|
7
|
+
nodeIdsKA: NodeIdentifiers;
|
|
8
|
+
nodeIdsKB: NodeIdentifiers;
|
|
9
|
+
};
|
|
10
|
+
type Options = {
|
|
11
|
+
typeLinComb: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const matrixComputeLinearCombination: Exercise<Identifiers, Options>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=matrixComputeLinearCombination.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrixComputeLinearCombination.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/matrices/matrixComputeLinearCombination.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAmBT,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAGL,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAEL,eAAe,EAChB,MAAM,qCAAqC,CAAC;AAU7C,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,SAAS,EAAE,eAAe,CAAC;CAC5B,CAAC;AA8PF,KAAK,OAAO,GAAG;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAgBF,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAkBzE,CAAC"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { GeneratorOptionTarget, GeneratorOptionType, addValidProp, propWhile, shuffleProps, tryToAddWrongProp, } from "../../../exercises/exercise.js";
|
|
2
|
+
import { getDistinctQuestions } from "../../../exercises/utils/getDistinctQuestions.js";
|
|
3
|
+
import { Matrix, MatrixConstructor, } from "../../../math/matrices/matrix.js";
|
|
4
|
+
import { parseMatrix } from "../../../math/matrices/parseMatrix.js";
|
|
5
|
+
import { NodeConstructor, } from "../../../tree/nodes/nodeConstructor.js";
|
|
6
|
+
import { add } from "../../../tree/nodes/operators/addNode.js";
|
|
7
|
+
import { multiply } from "../../../tree/nodes/operators/multiplyNode.js";
|
|
8
|
+
import { probaLawFlip } from "../../../utils/alea/probaLawFlip.js";
|
|
9
|
+
import { shuffle } from "../../../utils/alea/shuffle.js";
|
|
10
|
+
import { zip } from "../../../utils/arrays/arrayZip.js";
|
|
11
|
+
import { handleVEAError } from "../../../utils/errors/handleVEAError.js";
|
|
12
|
+
import { alignTex } from "../../../utils/latex/alignTex.js";
|
|
13
|
+
const getHydrated = (identifiers) => {
|
|
14
|
+
const { matIdsA, matIdsB, nodeIdsKA, nodeIdsKB } = identifiers;
|
|
15
|
+
const [matA, matB] = [matIdsA, matIdsB].map((matIds) => MatrixConstructor.fromIdentifiers(matIds));
|
|
16
|
+
const [nodeKA, nodeKB] = [nodeIdsKA, nodeIdsKB].map((nodeIds) => NodeConstructor.fromIdentifiers(nodeIds));
|
|
17
|
+
const nodeExprInstruction = add(multiply(nodeKA, "A".toTree()), multiply(nodeKB, "B".toTree()));
|
|
18
|
+
return {
|
|
19
|
+
matA,
|
|
20
|
+
matB,
|
|
21
|
+
nodeKA,
|
|
22
|
+
nodeKB,
|
|
23
|
+
nodeExprInstruction,
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
const getInstruction = (identifiers) => {
|
|
27
|
+
const { matA, matB, nodeExprInstruction } = getHydrated(identifiers);
|
|
28
|
+
return `Soient :
|
|
29
|
+
|
|
30
|
+
$$
|
|
31
|
+
A = ${matA.toTex()}
|
|
32
|
+
$$
|
|
33
|
+
|
|
34
|
+
$$
|
|
35
|
+
B = ${matB.toTex()}
|
|
36
|
+
$$
|
|
37
|
+
|
|
38
|
+
Calculer $${nodeExprInstruction.toTex()}$.`;
|
|
39
|
+
};
|
|
40
|
+
const getAnswer = (identifiers) => {
|
|
41
|
+
const { matA, matB, nodeKA, nodeKB } = getHydrated(identifiers);
|
|
42
|
+
const matLinComb = matA.times(nodeKA).add(matB.times(nodeKB));
|
|
43
|
+
const matLinCombSimplified = matLinComb.simplify({ towardsDistribute: true });
|
|
44
|
+
return matLinCombSimplified.toTex();
|
|
45
|
+
};
|
|
46
|
+
const getHint = (_identifiers, optsIn) => {
|
|
47
|
+
const opts = optsIn ?? optsDefault;
|
|
48
|
+
return `Soient $A$ et $B$ deux matrices à $2$ lignes et $2$ colonnes. Soit $k$ un nombre réel.
|
|
49
|
+
|
|
50
|
+
$$
|
|
51
|
+
A = \\begin{pmatrix} a & b \\\\ c & d \\end{pmatrix}
|
|
52
|
+
$$
|
|
53
|
+
|
|
54
|
+
$$
|
|
55
|
+
B = \\begin{pmatrix} r & s \\\\ t & u \\end{pmatrix}
|
|
56
|
+
$$
|
|
57
|
+
|
|
58
|
+
alors :
|
|
59
|
+
|
|
60
|
+
$$
|
|
61
|
+
A + B = \\begin{pmatrix} a+r & b+s \\\\ c+t & d+u \\end{pmatrix}
|
|
62
|
+
$$
|
|
63
|
+
|
|
64
|
+
${(() => {
|
|
65
|
+
switch (opts.typeLinComb) {
|
|
66
|
+
case "Combinaison linéaire":
|
|
67
|
+
return `
|
|
68
|
+
|
|
69
|
+
$$
|
|
70
|
+
kA = \\begin{pmatrix} ka & kb \\\\ kc & kd \\end{pmatrix}
|
|
71
|
+
$$
|
|
72
|
+
|
|
73
|
+
`;
|
|
74
|
+
default:
|
|
75
|
+
return "";
|
|
76
|
+
}
|
|
77
|
+
})()}`;
|
|
78
|
+
};
|
|
79
|
+
const getCorrection = (identifiers, optsIn) => {
|
|
80
|
+
const opts = optsIn ?? optsDefault;
|
|
81
|
+
const { matA, matB, nodeExprInstruction, nodeKA, nodeKB } = getHydrated(identifiers);
|
|
82
|
+
const matKAA = matA.times(nodeKA);
|
|
83
|
+
const matKBB = matB.times(nodeKB);
|
|
84
|
+
const matLinComb = matKAA.add(matKBB);
|
|
85
|
+
const [texKA, texKB] = [nodeKA, nodeKB]
|
|
86
|
+
.map((node) => node.toTex())
|
|
87
|
+
.map((str) => (str === "1" ? "" : str.startsWith("-") ? `(${str})` : str));
|
|
88
|
+
switch (opts.typeLinComb) {
|
|
89
|
+
case "Combinaison linéaire":
|
|
90
|
+
return `${alignTex([
|
|
91
|
+
["", nodeExprInstruction.toTex()],
|
|
92
|
+
["=", `${texKA} ${matA.toTex()} + ${texKB} ${matB.toTex()}`],
|
|
93
|
+
["=", `${matKAA.toTex()} + ${matKBB.toTex()}`],
|
|
94
|
+
["=", matLinComb.toTex()],
|
|
95
|
+
["=", matLinComb.simplify({ towardsDistribute: true }).toTex()],
|
|
96
|
+
])}`;
|
|
97
|
+
case "Somme simple":
|
|
98
|
+
return `${alignTex([
|
|
99
|
+
["", nodeExprInstruction.toTex()],
|
|
100
|
+
["=", `${matKAA.toTex()} + ${matKBB.toTex()}`],
|
|
101
|
+
["=", matLinComb.toTex()],
|
|
102
|
+
["=", matLinComb.simplify({ towardsDistribute: true }).toTex()],
|
|
103
|
+
])}`;
|
|
104
|
+
default:
|
|
105
|
+
throw new Error("Unsupported opts.typeLinComb: " + opts.typeLinComb);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
const getPropositions = (n, { answer, ...identifiers }, optsIn) => {
|
|
109
|
+
const opts = optsIn ?? optsDefault;
|
|
110
|
+
const propositions = [];
|
|
111
|
+
addValidProp(propositions, answer);
|
|
112
|
+
const { matA, matB, nodeKA, nodeKB } = getHydrated(identifiers);
|
|
113
|
+
const matKAA = matA.times(nodeKA);
|
|
114
|
+
const matKBB = matB.times(nodeKB);
|
|
115
|
+
//student: (kA A) * (kB B)
|
|
116
|
+
{
|
|
117
|
+
const matWrong = matKAA.matrixProduct(matKBB);
|
|
118
|
+
tryToAddWrongProp(propositions, matWrong.simplify({ towardsDistribute: true }).toTex());
|
|
119
|
+
}
|
|
120
|
+
//student: strange addition which resembles product
|
|
121
|
+
{
|
|
122
|
+
function matrixSumWrong(mat1, mat2) {
|
|
123
|
+
const mat2Transposed = mat2.transposed();
|
|
124
|
+
const arrElementSumWrong = mat1.elements.map((row) => mat2Transposed.elements.map((column) => zip(row, column).reduce((acc, [nodeAik, nodeBkj], i) => {
|
|
125
|
+
const nodeAikBkj = add(nodeAik, nodeBkj);
|
|
126
|
+
if (i === 0) {
|
|
127
|
+
return nodeAikBkj;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
return add(acc, nodeAikBkj);
|
|
131
|
+
}
|
|
132
|
+
}, (0).toTree())));
|
|
133
|
+
return new Matrix(arrElementSumWrong);
|
|
134
|
+
}
|
|
135
|
+
const matWrong = matrixSumWrong(matKAA, matKBB);
|
|
136
|
+
tryToAddWrongProp(propositions, matWrong.simplify({ towardsDistribute: true }).toTex());
|
|
137
|
+
}
|
|
138
|
+
//filler
|
|
139
|
+
{
|
|
140
|
+
propWhile(propositions, n, () => {
|
|
141
|
+
const identifiersWrong = createRandomIdentifiers(opts);
|
|
142
|
+
tryToAddWrongProp(propositions, getAnswer(identifiersWrong));
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return shuffleProps(propositions, n);
|
|
146
|
+
};
|
|
147
|
+
const getKeys = () => {
|
|
148
|
+
return ["mat-2-2"];
|
|
149
|
+
};
|
|
150
|
+
const isAnswerValid = (ans, { answer }) => {
|
|
151
|
+
try {
|
|
152
|
+
const matAns = parseMatrix(ans);
|
|
153
|
+
const matAnswer = parseMatrix(answer);
|
|
154
|
+
return matAns.equals(matAnswer);
|
|
155
|
+
}
|
|
156
|
+
catch (e) {
|
|
157
|
+
handleVEAError(e);
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
const createRandomIdentifiers = (opts) => {
|
|
162
|
+
const [nodeKA, nodeKB] = (() => {
|
|
163
|
+
switch (opts.typeLinComb) {
|
|
164
|
+
case "Somme simple":
|
|
165
|
+
return [(1).toTree(), (1).toTree()];
|
|
166
|
+
case "Combinaison linéaire":
|
|
167
|
+
return shuffle(probaLawFlip([
|
|
168
|
+
[[(1).toTree(), (2).toTree()], 0.35],
|
|
169
|
+
[[(1).toTree(), (3).toTree()], 0.25],
|
|
170
|
+
[[(1).toTree(), (-2).toTree()], 0.15],
|
|
171
|
+
[[(1).toTree(), (-1).toTree()], 0.15],
|
|
172
|
+
]));
|
|
173
|
+
default:
|
|
174
|
+
throw new Error("Unsupported opts.typeLinComb: " + opts.typeLinComb);
|
|
175
|
+
}
|
|
176
|
+
})();
|
|
177
|
+
const matA = MatrixConstructor.random(2, 2);
|
|
178
|
+
const matB = MatrixConstructor.random(2, 2);
|
|
179
|
+
const identifiers = {
|
|
180
|
+
matIdsA: matA.toIdentifiers(),
|
|
181
|
+
matIdsB: matB.toIdentifiers(),
|
|
182
|
+
nodeIdsKA: nodeKA.toIdentifiers(),
|
|
183
|
+
nodeIdsKB: nodeKB.toIdentifiers(),
|
|
184
|
+
};
|
|
185
|
+
return identifiers;
|
|
186
|
+
};
|
|
187
|
+
const getMatrixComputeLinearCombinationQuestion = (optsIn) => {
|
|
188
|
+
const opts = optsIn ?? optsDefault;
|
|
189
|
+
const identifiers = createRandomIdentifiers(opts);
|
|
190
|
+
return getQuestionFromIdentifiers(identifiers, opts);
|
|
191
|
+
};
|
|
192
|
+
const getQuestionFromIdentifiers = (identifiers, optsIn) => {
|
|
193
|
+
const question = {
|
|
194
|
+
answer: getAnswer(identifiers),
|
|
195
|
+
instruction: getInstruction(identifiers),
|
|
196
|
+
keys: getKeys(identifiers),
|
|
197
|
+
answerFormat: "tex",
|
|
198
|
+
identifiers,
|
|
199
|
+
hint: getHint(identifiers, optsIn),
|
|
200
|
+
correction: getCorrection(identifiers, optsIn),
|
|
201
|
+
options: optsIn,
|
|
202
|
+
};
|
|
203
|
+
return question;
|
|
204
|
+
};
|
|
205
|
+
const optsDefault = {
|
|
206
|
+
typeLinComb: "Combinaison linéaire",
|
|
207
|
+
};
|
|
208
|
+
const options = [
|
|
209
|
+
{
|
|
210
|
+
id: "typeLinComb",
|
|
211
|
+
label: "Type de combinaison linéaire",
|
|
212
|
+
target: GeneratorOptionTarget.generation,
|
|
213
|
+
type: GeneratorOptionType.select,
|
|
214
|
+
values: ["Somme simple", "Combinaison linéaire"],
|
|
215
|
+
defaultValue: optsDefault.typeLinComb,
|
|
216
|
+
},
|
|
217
|
+
];
|
|
218
|
+
export const matrixComputeLinearCombination = {
|
|
219
|
+
id: "matrixComputeLinearCombination",
|
|
220
|
+
connector: "=",
|
|
221
|
+
label: "Calculer une combinaison linéaire de deux matrices",
|
|
222
|
+
isSingleStep: true,
|
|
223
|
+
generator: (nb, opts) => getDistinctQuestions(() => getMatrixComputeLinearCombinationQuestion(opts), nb),
|
|
224
|
+
options,
|
|
225
|
+
qcmTimer: 60,
|
|
226
|
+
freeTimer: 60,
|
|
227
|
+
getPropositions,
|
|
228
|
+
isAnswerValid,
|
|
229
|
+
subject: "Mathématiques",
|
|
230
|
+
getQuestionFromIdentifiers,
|
|
231
|
+
hasHintAndCorrection: true,
|
|
232
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Exercise } from "../../../exercises/exercise.js";
|
|
2
|
+
import { MatrixIdentifiers } from "../../../math/matrices/matrix.js";
|
|
3
|
+
type Identifiers = {
|
|
4
|
+
matIdsA: MatrixIdentifiers;
|
|
5
|
+
exponent: number;
|
|
6
|
+
};
|
|
7
|
+
type Options = {
|
|
8
|
+
exponent: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const matrixComputePower: Exercise<Identifiers, Options>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=matrixComputePower.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrixComputePower.d.ts","sourceRoot":"","sources":["../../../../src/exercises/math/matrices/matrixComputePower.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAmBT,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAGL,iBAAiB,EAClB,MAAM,+BAA+B,CAAC;AAQvC,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AA4PF,KAAK,OAAO,GAAG;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAgBF,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAe7D,CAAC"}
|